|
|
@ -8,6 +8,8 @@ |
|
|
|
#include "storm-pomdp/analysis/FormulaInformation.h"
|
|
|
|
#include "storm-pomdp/analysis/QualitativeAnalysisOnGraphs.h"
|
|
|
|
#include "storm-pomdp/analysis/OneShotPolicySearch.h"
|
|
|
|
#include "storm-pomdp/analysis/IterativePolicySearch.h"
|
|
|
|
|
|
|
|
#include "storm-pomdp/transformer/MakePOMDPCanonic.h"
|
|
|
|
|
|
|
|
void graphalgorithm_test(std::string const& path, std::string const& constants, std::string formulaString) { |
|
|
@ -50,6 +52,38 @@ void oneshot_test(std::string const& path, std::string const& constants, std::st |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void iterativesearch_test(std::string const& path, std::string const& constants, std::string formulaString, bool wr) { |
|
|
|
storm::prism::Program program = storm::parser::PrismParser::parse(path); |
|
|
|
program = storm::utility::prism::preprocess(program, constants); |
|
|
|
std::shared_ptr<storm::logic::Formula const> formula = storm::api::parsePropertiesForPrismProgram(formulaString, program).front().getRawFormula(); |
|
|
|
std::shared_ptr<storm::models::sparse::Pomdp<double>> pomdp = storm::api::buildSparseModel<double>(program, {formula})->as<storm::models::sparse::Pomdp<double>>(); |
|
|
|
storm::transformer::MakePOMDPCanonic<double> makeCanonic(*pomdp); |
|
|
|
pomdp = makeCanonic.transform(); |
|
|
|
|
|
|
|
// Run graph algorithm
|
|
|
|
auto formulaInfo = storm::pomdp::analysis::getFormulaInformation(*pomdp, *formula); |
|
|
|
storm::analysis::QualitativeAnalysisOnGraphs<double> qualitativeAnalysis(*pomdp); |
|
|
|
storm::storage::BitVector surelyNotAlmostSurelyReachTarget = qualitativeAnalysis.analyseProbSmaller1( |
|
|
|
formula->asProbabilityOperatorFormula()); |
|
|
|
pomdp->getTransitionMatrix().makeRowGroupsAbsorbing(surelyNotAlmostSurelyReachTarget); |
|
|
|
storm::storage::BitVector targetStates = qualitativeAnalysis.analyseProb1(formula->asProbabilityOperatorFormula()); |
|
|
|
|
|
|
|
std::shared_ptr<storm::utility::solver::SmtSolverFactory> smtSolverFactory = std::make_shared<storm::utility::solver::Z3SmtSolverFactory>(); |
|
|
|
storm::pomdp::MemlessSearchOptions options; |
|
|
|
uint64_t lookahead = pomdp->getNumberOfStates(); |
|
|
|
storm::pomdp::IterativePolicySearch<double> search(*pomdp, targetStates, |
|
|
|
surelyNotAlmostSurelyReachTarget, |
|
|
|
smtSolverFactory, options); |
|
|
|
if (wr) { |
|
|
|
search.computeWinningRegion(lookahead); |
|
|
|
} else { |
|
|
|
search.analyzeForInitialStates(lookahead); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TEST(QualitativeAnalysis, GraphAlgorithm_Simple) { |
|
|
|
graphalgorithm_test(STORM_TEST_RESOURCES_DIR "/pomdp/simple.prism", "slippery=0.4", "Pmax=? [F \"goal\" ]"); |
|
|
|
graphalgorithm_test(STORM_TEST_RESOURCES_DIR "/pomdp/simple.prism", "slippery=0.0", "Pmax=? [F \"goal\" ]"); |
|
|
@ -75,4 +109,25 @@ TEST(QualitativeAnalysis, OneShots_Maze) { |
|
|
|
oneshot_test(STORM_TEST_RESOURCES_DIR "/pomdp/maze2.prism", "sl=0.0", "Pmax=? [F \"goal\" ]", 30); |
|
|
|
oneshot_test(STORM_TEST_RESOURCES_DIR "/pomdp/maze2.prism", "sl=0.4", "Pmax=? [!\"bad\" U \"goal\" ]", 5); |
|
|
|
oneshot_test(STORM_TEST_RESOURCES_DIR "/pomdp/maze2.prism", "sl=0.0", "Pmax=? [!\"bad\" U \"goal\"]", 5); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
TEST(QualitativeAnalysis, Iterative_Simple) { |
|
|
|
iterativesearch_test(STORM_TEST_RESOURCES_DIR "/pomdp/simple.prism", "slippery=0.4", "Pmax=? [F \"goal\" ]", false); |
|
|
|
iterativesearch_test(STORM_TEST_RESOURCES_DIR "/pomdp/simple.prism", "slippery=0.0", "Pmax=? [F \"goal\" ]", false); |
|
|
|
|
|
|
|
iterativesearch_test(STORM_TEST_RESOURCES_DIR "/pomdp/simple.prism", "slippery=0.4", "Pmax=? [F \"goal\" ]", true); |
|
|
|
iterativesearch_test(STORM_TEST_RESOURCES_DIR "/pomdp/simple.prism", "slippery=0.0", "Pmax=? [F \"goal\" ]", true); |
|
|
|
} |
|
|
|
|
|
|
|
TEST(QualitativeAnalysis, Iterative_Maze) { |
|
|
|
iterativesearch_test(STORM_TEST_RESOURCES_DIR "/pomdp/maze2.prism", "sl=0.4", "Pmax=? [F \"goal\" ]", false); |
|
|
|
iterativesearch_test(STORM_TEST_RESOURCES_DIR "/pomdp/maze2.prism", "sl=0.0", "Pmax=? [F \"goal\" ]", false); |
|
|
|
iterativesearch_test(STORM_TEST_RESOURCES_DIR "/pomdp/maze2.prism", "sl=0.4", "Pmax=? [!\"bad\" U \"goal\" ]", false); |
|
|
|
iterativesearch_test(STORM_TEST_RESOURCES_DIR "/pomdp/maze2.prism", "sl=0.0", "Pmax=? [!\"bad\" U \"goal\"]", false); |
|
|
|
|
|
|
|
iterativesearch_test(STORM_TEST_RESOURCES_DIR "/pomdp/maze2.prism", "sl=0.4", "Pmax=? [F \"goal\" ]", true); |
|
|
|
iterativesearch_test(STORM_TEST_RESOURCES_DIR "/pomdp/maze2.prism", "sl=0.0", "Pmax=? [F \"goal\" ]", true); |
|
|
|
iterativesearch_test(STORM_TEST_RESOURCES_DIR "/pomdp/maze2.prism", "sl=0.4", "Pmax=? [!\"bad\" U \"goal\" ]", true); |
|
|
|
iterativesearch_test(STORM_TEST_RESOURCES_DIR "/pomdp/maze2.prism", "sl=0.0", "Pmax=? [!\"bad\" U \"goal\"]", true); |
|
|
|
} |