Browse Source

Fix checking monotonicity on samples

tempestpy_adaptions
Jip Spel 5 years ago
parent
commit
f98250968c
  1. 19
      src/storm-pars/analysis/MonotonicityChecker.cpp

19
src/storm-pars/analysis/MonotonicityChecker.cpp

@ -550,12 +550,16 @@ namespace storm {
auto matrix = model->getTransitionMatrix();
std::set<typename utility::parametric::VariableType<ValueType>::type> variables = storm::models::sparse::getProbabilityParameters(*model);
// For each of the variables create a model in which we only change the value for this specific variable
for (auto itr = variables.begin(); itr != variables.end(); ++itr) {
double previous = -1;
bool monDecr = true;
bool monIncr = true;
// Check monotonicity in variable (*itr) by instantiating the model
// all other variables fixed on lb, only increasing (*itr)
for (auto i = 0; (monDecr || monIncr) && i < numberOfSamples; ++i) {
// Create valuation
auto valuation = storm::utility::parametric::Valuation<ValueType>();
for (auto itr2 = variables.begin(); itr2 != variables.end(); ++itr2) {
// Only change value for current variable
@ -563,19 +567,14 @@ namespace storm {
auto lb = region.getLowerBoundary(itr->name());
auto ub = region.getUpperBoundary(itr->name());
// Creates samples between lb and ub, that is: lb, lb + (ub-lb)/(#samples -1), lb + 2* (ub-lb)/(#samples -1), ..., ub
auto val =
std::pair<typename utility::parametric::VariableType<ValueType>::type, typename utility::parametric::CoefficientType<ValueType>::type>
(*itr,utility::convertNumber<typename utility::parametric::CoefficientType<ValueType>::type>(lb + i*(ub-lb)/(numberOfSamples-1)));
valuation.insert(val);
valuation[*itr2] = utility::convertNumber<typename utility::parametric::CoefficientType<ValueType>::type>(lb + i*(ub-lb)/(numberOfSamples-1));
} else {
auto lb = region.getLowerBoundary(itr->name());
auto val =
std::pair<typename utility::parametric::VariableType<ValueType>::type, typename utility::parametric::CoefficientType<ValueType>::type>
(*itr,utility::convertNumber<typename utility::parametric::CoefficientType<ValueType>::type>(lb));
valuation.insert(val);
valuation[*itr2] = utility::convertNumber<typename utility::parametric::CoefficientType<ValueType>::type>(lb);
}
}
// Instantiate model and get result
storm::models::sparse::Dtmc<double> sampleModel = instantiator.instantiate(valuation);
auto checker = storm::modelchecker::SparseDtmcPrctlModelChecker<storm::models::sparse::Dtmc<double>>(sampleModel);
std::unique_ptr<storm::modelchecker::CheckResult> checkResult;
@ -598,9 +597,11 @@ namespace storm {
std::vector<double> values = quantitativeResult.getValueVector();
auto initialStates = model->getInitialStates();
double initial = 0;
// Get total probability from initial states
for (auto j = initialStates.getNextSetIndex(0); j < model->getNumberOfStates(); j = initialStates.getNextSetIndex(j+1)) {
initial += values[j];
}
// Calculate difference with result for previous valuation
assert (initial >= 0-precision && initial <= 1+precision);
double diff = previous - initial;
assert (previous == -1 || diff >= -1-precision && diff <= 1 + precision);

Loading…
Cancel
Save