#include "PermissiveSchedulers.h" #include "src/models/sparse/StandardRewardModel.h" #include "../utility/solver.h" #include "../utility/graph.h" #include "../modelchecker/propositional/SparsePropositionalModelChecker.h" #include "../modelchecker/results/ExplicitQualitativeCheckResult.h" #include "MILPPermissiveSchedulers.h" #include "SmtBasedPermissiveSchedulers.h" #include "src/exceptions/NotImplementedException.h" #include "src/utility/macros.h" namespace storm { namespace ps { template boost::optional> computePermissiveSchedulerViaMILP(storm::models::sparse::Mdp const& mdp, storm::logic::ProbabilityOperatorFormula const& safeProp) { storm::modelchecker::SparsePropositionalModelChecker> propMC(mdp); assert(safeProp.getSubformula().isEventuallyFormula()); auto backwardTransitions = mdp.getBackwardTransitions(); storm::storage::BitVector goalstates = propMC.check(safeProp.getSubformula().asEventuallyFormula().getSubformula())->asExplicitQualitativeCheckResult().getTruthValuesVector(); goalstates = storm::utility::graph::performProb1A(mdp, backwardTransitions, storm::storage::BitVector(goalstates.size(), true), goalstates); storm::storage::BitVector sinkstates = storm::utility::graph::performProb0A(mdp,backwardTransitions, storm::storage::BitVector(goalstates.size(), true), goalstates); auto solver = storm::utility::solver::getLpSolver("Gurobi", storm::solver::LpSolverTypeSelection::Gurobi); MilpPermissiveSchedulerComputation> comp(*solver, mdp, goalstates, sinkstates); STORM_LOG_THROW(!storm::logic::isStrict(safeProp.getComparisonType()), storm::exceptions::NotImplementedException, "Strict bounds are not supported"); comp.calculatePermissiveScheduler(storm::logic::isLowerBound(safeProp.getComparisonType()), safeProp.getThresholdAs()); //comp.dumpLpToFile("milpdump.lp"); std::cout << "Found Solution: " << (comp.foundSolution() ? "yes" : "no") << std::endl; if(comp.foundSolution()) { return boost::optional>(comp.getScheduler()); } else { return boost::optional>(); } } template boost::optional> computePermissiveSchedulerViaMC(std::shared_ptr> mdp, storm::logic::ProbabilityOperatorFormula const& safeProp) { } template boost::optional> computePermissiveSchedulerViaSMT(storm::models::sparse::Mdp const& mdp, storm::logic::ProbabilityOperatorFormula const& safeProp) { storm::modelchecker::SparsePropositionalModelChecker> propMC(mdp); assert(safeProp.getSubformula().isEventuallyFormula()); auto backwardTransitions = mdp.getBackwardTransitions(); storm::storage::BitVector goalstates = propMC.check(safeProp.getSubformula().asEventuallyFormula().getSubformula())->asExplicitQualitativeCheckResult().getTruthValuesVector(); goalstates = storm::utility::graph::performProb1A(mdp, backwardTransitions, storm::storage::BitVector(goalstates.size(), true), goalstates); storm::storage::BitVector sinkstates = storm::utility::graph::performProb0A(mdp, backwardTransitions, storm::storage::BitVector(goalstates.size(), true), goalstates); std::shared_ptr expressionManager = std::make_shared(); auto solver = storm::utility::solver::getSmtSolver(*expressionManager); SmtPermissiveSchedulerComputation> comp(*solver, mdp, goalstates, sinkstates); STORM_LOG_THROW(!storm::logic::isStrict(safeProp.getComparisonType()), storm::exceptions::NotImplementedException, "Strict bounds are not supported"); comp.calculatePermissiveScheduler(storm::logic::isLowerBound(safeProp.getComparisonType()), safeProp.getThresholdAs()); if(comp.foundSolution()) { return boost::optional>(comp.getScheduler()); } else { return boost::optional>(); } return boost::none; } template boost::optional> computePermissiveSchedulerViaMILP(storm::models::sparse::Mdp const& mdp, storm::logic::ProbabilityOperatorFormula const& safeProp); template boost::optional> computePermissiveSchedulerViaSMT(storm::models::sparse::Mdp const& mdp, storm::logic::ProbabilityOperatorFormula const& safeProp); } }