// // Created by Jip Spel on 12.09.18. // #include "storm-pars/utility/ModelInstantiator.h" #include "storm/modelchecker/prctl/SparseDtmcPrctlModelChecker.h" #include "storm/exceptions/NotSupportedException.h" #include "AssumptionChecker.h" #include "storm/modelchecker/CheckTask.h" #include "storm/environment/Environment.h" #include "storm/modelchecker/results/CheckResult.h" #include "storm/modelchecker/results/ExplicitQuantitativeCheckResult.h" #include "storm/storage/expressions/SimpleValuation.h" #include "storm/storage/expressions/ExpressionManager.h" namespace storm { namespace analysis { template AssumptionChecker::AssumptionChecker(std::shared_ptr formula, std::shared_ptr> model, uint_fast64_t numberOfSamples) { this->formula = formula; auto instantiator = storm::utility::ModelInstantiator, storm::models::sparse::Dtmc>(*model.get()); auto matrix = model->getTransitionMatrix(); std::set variables = storm::models::sparse::getProbabilityParameters(*model); for (auto i = 0; i < numberOfSamples; ++i) { auto valuation = storm::utility::parametric::Valuation(); for (auto itr = variables.begin(); itr != variables.end(); ++itr) { auto val = std::pair((*itr), storm::utility::convertNumber(boost::lexical_cast((i+1)/(double (numberOfSamples + 1))))); valuation.insert(val); } storm::models::sparse::Dtmc sampleModel = instantiator.instantiate(valuation); auto checker = storm::modelchecker::SparseDtmcPrctlModelChecker>(sampleModel); std::unique_ptr checkResult; if (formula->isProbabilityOperatorFormula() && formula->asProbabilityOperatorFormula().getSubformula().isUntilFormula()) { const storm::modelchecker::CheckTask checkTask = storm::modelchecker::CheckTask( (*formula).asProbabilityOperatorFormula().getSubformula().asUntilFormula()); checkResult = checker.computeUntilProbabilities(Environment(), checkTask); } else if (formula->isProbabilityOperatorFormula() && formula->asProbabilityOperatorFormula().getSubformula().isEventuallyFormula()) { const storm::modelchecker::CheckTask checkTask = storm::modelchecker::CheckTask( (*formula).asProbabilityOperatorFormula().getSubformula().asEventuallyFormula()); checkResult = checker.computeReachabilityProbabilities(Environment(), checkTask); } else { STORM_LOG_THROW(false, storm::exceptions::NotSupportedException, "Expecting until or eventually formula"); } auto quantitativeResult = checkResult->asExplicitQuantitativeCheckResult(); std::vector values = quantitativeResult.getValueVector(); results.push_back(values); } // this->numberOfStates = model->getNumberOfStates(); // this->initialStates = model->getInitialStates(); } template bool AssumptionChecker::checkOnSamples(uint_fast64_t val1, uint_fast64_t val2) { bool result = true; for (auto itr = results.begin(); result && itr != results.end(); ++itr) { // TODO: als expressie auto values = (*itr); result &= (values[val1] >= values[val2]); } return result; } template bool AssumptionChecker::checkOnSamples(std::shared_ptr assumption) { bool result = true; std::set vars = std::set({}); assumption->gatherVariables(vars); for (auto itr = results.begin(); result && itr != results.end(); ++itr) { std::shared_ptr manager = assumption->getManager().getSharedPointer(); auto valuation = storm::expressions::SimpleValuation(manager); auto values = (*itr); for (auto var = vars.begin(); result && var != vars.end(); ++var) { storm::expressions::Variable par = *var; auto index = std::stoi(par.getName()); valuation.setRationalValue(par, values[index]); } result &= assumption->evaluateAsBool(&valuation); } return result; } template class AssumptionChecker; } }