Browse Source

Refactor StateValues getBitSetFromCloseValue/getBDDFromCloseValue to use Accuracy objects.

accumulation-v4.7
Dave Parker 5 years ago
parent
commit
dd563f254e
  1. 27
      prism/src/explicit/StateValues.java
  2. 15
      prism/src/prism/StateValues.java

27
prism/src/explicit/StateValues.java

@ -48,6 +48,7 @@ import prism.PrismException;
import prism.PrismLangException;
import prism.PrismLog;
import prism.PrismUtils;
import prism.ResultTesting;
import prism.StateVector;
/**
@ -320,24 +321,46 @@ public class StateValues implements StateVector
return sol;
}
/**
* Generate BitSet for states whose value is close to 'value'
* (if present, accuracy info used to determine closeness)
* The type of 'value' is assumed to match that of the vector.
*/
public BitSet getBitSetFromCloseValue(Object value) throws PrismException
{
Accuracy accuracy = ResultTesting.getTestingAccuracy(getAccuracy());
return getBitSetFromCloseValue(value, accuracy);
}
/**
* Generate BitSet for states whose value is close to 'value'
* (within either absolute or relative error 'epsilon')
* The type of 'value' is assumed to match that of the vector.
*/
public BitSet getBitSetFromCloseValue(Object value, double epsilon, boolean abs) throws PrismException
{
Accuracy accuracy = new Accuracy(Accuracy.AccuracyLevel.BOUNDED, epsilon, abs);
return getBitSetFromCloseValue(value, accuracy);
}
/**
* Generate BitSet for states whose value is close to 'value'
* (use the passed in level of accuracy to determine closeness)
* The type of 'value' is assumed to match that of the vector.
*/
public BitSet getBitSetFromCloseValue(Object value, Accuracy accuracy) throws PrismException
{
BitSet sol = new BitSet();
if (type instanceof TypeInt) {
int valueI = ((Integer) value).intValue();
for (int i = 0; i < size; i++) {
sol.set(i, PrismUtils.doublesAreClose(valuesI[i], valueI, epsilon, abs));
sol.set(i, PrismUtils.measureSupNormAbs(valuesI[i], valueI) <= accuracy.getAbsoluteErrorBound(valuesI[i]));
}
} else if (type instanceof TypeDouble) {
double valueD = ((Double) value).doubleValue();
for (int i = 0; i < size; i++) {
sol.set(i, PrismUtils.doublesAreClose(valuesD[i], valueD, epsilon, abs));
sol.set(i, PrismUtils.measureSupNormAbs(valuesD[i], valueD) <= accuracy.getAbsoluteErrorBound(valuesD[i]));
}
} else {
throw new PrismException("Can't getBitSetFromCloseValue for a vector of type " + type);

15
prism/src/prism/StateValues.java

@ -31,6 +31,7 @@ import java.io.File;
import jdd.JDDNode;
import jdd.JDDVars;
import parser.ast.RelOp;
import prism.Accuracy.AccuracyType;
/**
* Interface for classes for state-indexed vectors of (integer or double) values
@ -195,6 +196,20 @@ public interface StateValues extends StateVector
*/
JDDNode getBDDFromInterval(double lo, double hi);
/**
* Generate BDD for states whose value is close to 'value'
* (if present, accuracy info used to determine closeness)
* <br>[ REFS: <i>result</i> ]
* @param val the value
* @param epsilon the error bound
* @param abs true for absolute error calculation
*/
default JDDNode getBDDFromCloseValue(double val)
{
Accuracy accuracy = ResultTesting.getTestingAccuracy(getAccuracy());
return getBDDFromCloseValue(val, accuracy.getErrorBound(), accuracy.getType() == AccuracyType.ABSOLUTE);
}
/**
* Generate BDD for states whose value is close to 'value'
* (within either absolute or relative error 'epsilon')

Loading…
Cancel
Save