diff --git a/src/pomdp/qualitative_analysis.cpp b/src/pomdp/qualitative_analysis.cpp index 5710581..e5070b5 100644 --- a/src/pomdp/qualitative_analysis.cpp +++ b/src/pomdp/qualitative_analysis.cpp @@ -15,19 +15,28 @@ std::shared_ptr> creat // After preprocessing, this might be done cheaper. storm::storage::BitVector targetStates = qualitativeAnalysis.analyseProb1(formula.asProbabilityOperatorFormula()); storm::storage::BitVector surelyNotAlmostSurelyReachTarget = qualitativeAnalysis.analyseProbSmaller1(formula.asProbabilityOperatorFormula()); - storm::expressions::ExpressionManager expressionManager; std::shared_ptr smtSolverFactory = std::make_shared(); - return std::make_shared>(pomdp, targetStates, surelyNotAlmostSurelyReachTarget, smtSolverFactory, options); +} +template +SparsePomdp preparePOMDPForQualitativeSearch(SparsePomdp const& origPomdp, storm::logic::Formula const& formula) { + SparsePomdp pomdp = SparsePomdp(origPomdp); + storm::analysis::QualitativeAnalysisOnGraphs qualitativeAnalysis(pomdp); + // After preprocessing, this might be done cheaper. + storm::storage::BitVector surelyNotAlmostSurelyReachTarget = qualitativeAnalysis.analyseProbSmaller1(formula.asProbabilityOperatorFormula()); + pomdp.getTransitionMatrix().makeRowGroupsAbsorbing(surelyNotAlmostSurelyReachTarget); + return pomdp; } template void define_qualitative_policy_search(py::module& m, std::string const& vtSuffix) { m.def(("create_iterative_qualitative_search_solver_" + vtSuffix).c_str(), &createWinningRegionSolver, "Create solver " ,py::arg("pomdp"), py::arg("formula"), py::arg("options")); + m.def(("prepare_pomdp_for_qualitative_search_" +vtSuffix).c_str(), &preparePOMDPForQualitativeSearch, "Preprocess POMDP", py::arg("pomdp"), py::arg("formula")); py::class_, std::shared_ptr>> mssq(m, ("IterativeQualitativeSearchSolver" + vtSuffix).c_str(), "Solver for POMDPs that solves qualitative queries"); mssq.def("compute_winning_region", &storm::pomdp::MemlessStrategySearchQualitative::computeWinningRegion, py::arg("lookahead")); + mssq.def("compute_winning_policy_for_initial_states", &storm::pomdp::MemlessStrategySearchQualitative::analyzeForInitialStates, py::arg("lookahead")); mssq.def_property_readonly("last_winning_region", &storm::pomdp::MemlessStrategySearchQualitative::getLastWinningRegion, "get the last computed winning region"); py::class_> wrqi(m, ("BeliefSupportWinningRegionQueryInterface" + vtSuffix).c_str());