Skip to content
Snippets Groups Projects
Commit ce928ed7 authored by Long Bui's avatar Long Bui
Browse files

implement untested variance calculation for RandomVariables

parent 9ce35f2f
No related branches found
No related tags found
1 merge request!1Randomvarhelper
......@@ -16,6 +16,7 @@ import tools.descartes.dml.mm.applicationlevel.functions.IntSampleList;
import tools.descartes.dml.mm.applicationlevel.functions.NormalDistribution;
import tools.descartes.dml.mm.applicationlevel.functions.ProbabilityFunction;
import tools.descartes.dml.mm.applicationlevel.functions.ProbabilityMassFunction;
import tools.descartes.dml.mm.applicationlevel.functions.ReplayFile;
import tools.descartes.dml.mm.applicationlevel.functions.SampleList;
/**
......@@ -45,11 +46,125 @@ public class RandomVariableHelper {
return _getNumericalMean((BoxedPDF) probfn);
if (probfn instanceof ProbabilityMassFunction)
return _getNumericalMean((ProbabilityMassFunction) probfn);
if (probfn instanceof ReplayFile)
return _getNumericalMean((ReplayFile) probfn);
return _getNumericalMean(probfn);
}
public static Double getNumericalVariance(ProbabilityFunction probfn) {
if (probfn instanceof IntLiteral)
return _getNumericalVariance((IntLiteral) probfn);
if (probfn instanceof DoubleLiteral)
return _getNumericalVariance((DoubleLiteral) probfn);
if (probfn instanceof BooleanLiteral)
return _getNumericalVariance((BooleanLiteral) probfn);
if (probfn instanceof ExponentialDistribution)
return _getNumericalVariance((ExponentialDistribution) probfn);
if (probfn instanceof NormalDistribution)
return _getNumericalVariance((NormalDistribution) probfn);
if (probfn instanceof BoxedPDF)
return _getNumericalVariance((BoxedPDF) probfn);
if (probfn instanceof ProbabilityMassFunction)
return _getNumericalVariance((ProbabilityMassFunction) probfn);
if (probfn instanceof ReplayFile)
return _getNumericalVariance((ReplayFile) probfn);
return _getNumericalVariance(probfn);
}
private static Double _getNumericalVariance(EnumSampleList enumSl) {
throw new UnsupportedOperationException("Enums do not have a numerical variance.");
}
private static Double _getNumericalVariance(DoubleSampleList doubleSl) {
double[] singletons = new double[doubleSl.getItems().size()];
double[] probabilities = new double[doubleSl.getItems().size()];
for (int i = 0; i < doubleSl.getItems().size(); i++) {
singletons[i] = doubleSl.getItems().get(i).getValue().doubleValue();
probabilities[i] = doubleSl.getItems().get(i).getProbability().doubleValue();
}
EnumeratedRealDistribution dist = new EnumeratedRealDistribution(singletons, probabilities);
return dist.getNumericalVariance();
}
private static Double _getNumericalVariance(BoolSampleList boolSl) {
throw new UnsupportedOperationException("Booleans do not have a numerical variance.");
}
private static Double _getNumericalVariance(IntSampleList intSl) {
int[] singletons = new int[intSl.getItems().size()];
double[] probabilities = new double[intSl.getItems().size()];
for (int i = 0; i < intSl.getItems().size(); i++) {
singletons[i] = intSl.getItems().get(i).getValue().intValue();
probabilities[i] = intSl.getItems().get(i).getProbability().doubleValue();
}
EnumeratedIntegerDistribution dist = new EnumeratedIntegerDistribution(singletons, probabilities);
return dist.getNumericalVariance();
}
private static Double _getNumericalVariance(SampleList sl) {
if (sl instanceof IntSampleList)
return _getNumericalVariance((IntSampleList) sl);
else if (sl instanceof BoolSampleList)
return _getNumericalVariance((BoolSampleList) sl);
else if (sl instanceof DoubleSampleList)
return _getNumericalVariance((DoubleSampleList) sl);
else if (sl instanceof EnumSampleList)
return _getNumericalVariance((EnumSampleList) sl);
throw new IllegalStateException("Unknown type of SampleList: " + sl.getClass().getName());
}
private static Double _getNumericalVariance(ProbabilityMassFunction pmf) {
return _getNumericalVariance(pmf.getSamples());
}
private static Double _getNumericalVariance(BoxedPDF bpdf) {
double lastValue = 0;
double meanSquaredSamples = 0.0;
double numericalMean = _getNumericalMean(bpdf);
for (ContinuousSample cs : bpdf.getSample()) {
meanSquaredSamples += cs.getProbability().doubleValue()
* Math.pow((lastValue + (cs.getValue().doubleValue() - lastValue) / 2), 2);
lastValue = cs.getValue().doubleValue();
}
return meanSquaredSamples - Math.pow(numericalMean, 2);
}
private static Double _getNumericalVariance(NormalDistribution nd) {
return Math.pow(nd.getSigma().doubleValue(), 2);
}
private static Double _getNumericalVariance(ExponentialDistribution expd) {
double rate = expd.getRate().doubleValue();
if (rate > 0) {
return 1 / Math.pow(rate, 2);
}
throw new IllegalArgumentException("ExponentialDistribution rate must be greater than 0.");
}
private static Double _getNumericalVariance(BooleanLiteral l) {
return 0.0;
}
private static Double _getNumericalVariance(DoubleLiteral l) {
return 0.0;
}
private static Double _getNumericalVariance(IntLiteral l) {
return 0.0;
}
private static Double _getNumericalVariance(ProbabilityFunction probfn) {
throw new IllegalStateException("Unknown type of ProbabilityFunction: " + probfn.getClass().getName());
}
private static Double _getNumericalMean(ReplayFile replay) {
double sum = 0;
throw new UnsupportedOperationException("File Path: " + replay.getFilepath());
}
private static Double _getNumericalMean(ProbabilityMassFunction pmf) {
return RandomVariableHelper._getNumericalMean(pmf.getSamples());
return _getNumericalMean(pmf.getSamples());
}
private static Double _getNumericalMean(IntSampleList intsl) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment