1#include "storm-config.h"
18void graphalgorithm_test(std::string
const& path, std::string
const& constants, std::string formulaString) {
22 std::shared_ptr<storm::models::sparse::Pomdp<double>> pomdp =
31 pomdp->getTransitionMatrix().makeRowGroupsAbsorbing(surelyNotAlmostSurelyReachTarget);
35void oneshot_test(std::string
const& path, std::string
const& constants, std::string formulaString, uint64_t lookahead) {
39 std::shared_ptr<storm::models::sparse::Pomdp<double>> pomdp =
48 pomdp->getTransitionMatrix().makeRowGroupsAbsorbing(surelyNotAlmostSurelyReachTarget);
50 std::shared_ptr<storm::utility::solver::SmtSolverFactory> smtSolverFactory = std::make_shared<storm::utility::solver::Z3SmtSolverFactory>();
55void iterativesearch_test(std::string
const& path, std::string
const& constants, std::string formulaString,
bool wr) {
59 std::shared_ptr<storm::models::sparse::Pomdp<double>> pomdp =
68 pomdp->getTransitionMatrix().makeRowGroupsAbsorbing(surelyNotAlmostSurelyReachTarget);
71 std::shared_ptr<storm::utility::solver::SmtSolverFactory> smtSolverFactory = std::make_shared<storm::utility::solver::Z3SmtSolverFactory>();
73 uint64_t lookahead = pomdp->getNumberOfStates();
82void symbolicbelsup_test(std::string
const& path, std::string
const& constants, std::string formulaString,
bool wr) {
86 std::shared_ptr<storm::models::sparse::Pomdp<double>> pomdp =
95 pomdp->getTransitionMatrix().makeRowGroupsAbsorbing(surelyNotAlmostSurelyReachTarget);
99 janicreator.
generate(targetStates, surelyNotAlmostSurelyReachTarget);
100 bool initialOnly = !wr;
108 GTEST_SKIP() <<
"Z3 not available.";
117 std::unique_ptr<storm::solver::SmtSolver> create(storm::expressions::ExpressionManager& manager)
const override {
118 ADD_FAILURE() <<
"Policy search must pass its environment to the SMT factory.";
119 return Z3SmtSolverFactory::create(manager);
122 std::unique_ptr<storm::solver::SmtSolver> create(storm::Environment
const& env, storm::expressions::ExpressionManager& manager)
const override {
124 return Z3SmtSolverFactory::create(env, manager);
127 mutable storm::Environment
const* environment =
nullptr;
138 auto sinkStates = qualitativeAnalysis.
analyseProbSmaller1(formula->asProbabilityOperatorFormula());
139 pomdp->getTransitionMatrix().makeRowGroupsAbsorbing(sinkStates);
140 auto targetStates = qualitativeAnalysis.
analyseProb1(formula->asProbabilityOperatorFormula());
145 for (
bool iterative : {
false,
true}) {
146 SCOPED_TRACE(iterative ?
"iterative" :
"one-shot");
147 auto recordingFactory = std::make_shared<RecordingSmtSolverFactory>();
148 std::shared_ptr<storm::utility::solver::SmtSolverFactory> factory = recordingFactory;
156 EXPECT_EQ(recordingFactory->environment, &env);
161 graphalgorithm_test(STORM_TEST_RESOURCES_DIR
"/pomdp/simple.prism",
"slippery=0.4",
"Pmax=? [F \"goal\" ]");
162 graphalgorithm_test(STORM_TEST_RESOURCES_DIR
"/pomdp/simple.prism",
"slippery=0.0",
"Pmax=? [F \"goal\" ]");
166 graphalgorithm_test(STORM_TEST_RESOURCES_DIR
"/pomdp/maze2.prism",
"sl=0.4",
"Pmax=? [F \"goal\" ]");
167 graphalgorithm_test(STORM_TEST_RESOURCES_DIR
"/pomdp/maze2.prism",
"sl=0.0",
"Pmax=? [F \"goal\" ]");
168 graphalgorithm_test(STORM_TEST_RESOURCES_DIR
"/pomdp/maze2.prism",
"sl=0.4",
"Pmax=? [!\"bad\" U \"goal\" ]");
169 graphalgorithm_test(STORM_TEST_RESOURCES_DIR
"/pomdp/maze2.prism",
"sl=0.0",
"Pmax=? [!\"bad\" U \"goal\"]");
173 oneshot_test(STORM_TEST_RESOURCES_DIR
"/pomdp/simple.prism",
"slippery=0.4",
"Pmax=? [F \"goal\" ]", 5);
174 oneshot_test(STORM_TEST_RESOURCES_DIR
"/pomdp/simple.prism",
"slippery=0.0",
"Pmax=? [F \"goal\" ]", 5);
178 oneshot_test(STORM_TEST_RESOURCES_DIR
"/pomdp/maze2.prism",
"sl=0.4",
"Pmax=? [F \"goal\" ]", 5);
179 oneshot_test(STORM_TEST_RESOURCES_DIR
"/pomdp/maze2.prism",
"sl=0.0",
"Pmax=? [F \"goal\" ]", 5);
180 oneshot_test(STORM_TEST_RESOURCES_DIR
"/pomdp/maze2.prism",
"sl=0.4",
"Pmax=? [F \"goal\" ]", 30);
181 oneshot_test(STORM_TEST_RESOURCES_DIR
"/pomdp/maze2.prism",
"sl=0.0",
"Pmax=? [F \"goal\" ]", 30);
182 oneshot_test(STORM_TEST_RESOURCES_DIR
"/pomdp/maze2.prism",
"sl=0.4",
"Pmax=? [!\"bad\" U \"goal\" ]", 5);
183 oneshot_test(STORM_TEST_RESOURCES_DIR
"/pomdp/maze2.prism",
"sl=0.0",
"Pmax=? [!\"bad\" U \"goal\"]", 5);
187 iterativesearch_test(STORM_TEST_RESOURCES_DIR
"/pomdp/simple.prism",
"slippery=0.4",
"Pmax=? [F \"goal\" ]",
false);
188 iterativesearch_test(STORM_TEST_RESOURCES_DIR
"/pomdp/simple.prism",
"slippery=0.0",
"Pmax=? [F \"goal\" ]",
false);
190 iterativesearch_test(STORM_TEST_RESOURCES_DIR
"/pomdp/simple.prism",
"slippery=0.4",
"Pmax=? [F \"goal\" ]",
true);
191 iterativesearch_test(STORM_TEST_RESOURCES_DIR
"/pomdp/simple.prism",
"slippery=0.0",
"Pmax=? [F \"goal\" ]",
true);
195 iterativesearch_test(STORM_TEST_RESOURCES_DIR
"/pomdp/maze2.prism",
"sl=0.4",
"Pmax=? [F \"goal\" ]",
false);
196 iterativesearch_test(STORM_TEST_RESOURCES_DIR
"/pomdp/maze2.prism",
"sl=0.0",
"Pmax=? [F \"goal\" ]",
false);
197 iterativesearch_test(STORM_TEST_RESOURCES_DIR
"/pomdp/maze2.prism",
"sl=0.4",
"Pmax=? [!\"bad\" U \"goal\" ]",
false);
198 iterativesearch_test(STORM_TEST_RESOURCES_DIR
"/pomdp/maze2.prism",
"sl=0.0",
"Pmax=? [!\"bad\" U \"goal\"]",
false);
200 iterativesearch_test(STORM_TEST_RESOURCES_DIR
"/pomdp/maze2.prism",
"sl=0.4",
"Pmax=? [F \"goal\" ]",
true);
201 iterativesearch_test(STORM_TEST_RESOURCES_DIR
"/pomdp/maze2.prism",
"sl=0.0",
"Pmax=? [F \"goal\" ]",
true);
202 iterativesearch_test(STORM_TEST_RESOURCES_DIR
"/pomdp/maze2.prism",
"sl=0.4",
"Pmax=? [!\"bad\" U \"goal\" ]",
true);
203 iterativesearch_test(STORM_TEST_RESOURCES_DIR
"/pomdp/maze2.prism",
"sl=0.0",
"Pmax=? [!\"bad\" U \"goal\"]",
true);
207#ifdef STORM_HAVE_SYLVAN
208 symbolicbelsup_test(STORM_TEST_RESOURCES_DIR
"/pomdp/simple.prism",
"slippery=0.4",
"Pmax=? [F \"goal\" ]",
false);
209 symbolicbelsup_test(STORM_TEST_RESOURCES_DIR
"/pomdp/simple.prism",
"slippery=0.0",
"Pmax=? [F \"goal\" ]",
false);
211 symbolicbelsup_test(STORM_TEST_RESOURCES_DIR
"/pomdp/simple.prism",
"slippery=0.4",
"Pmax=? [F \"goal\" ]",
true);
212 symbolicbelsup_test(STORM_TEST_RESOURCES_DIR
"/pomdp/simple.prism",
"slippery=0.0",
"Pmax=? [F \"goal\" ]",
true);
214 GTEST_SKIP() <<
"Library Sylvan not available.";
219#ifdef STORM_HAVE_SYLVAN
220 symbolicbelsup_test(STORM_TEST_RESOURCES_DIR
"/pomdp/maze2.prism",
"sl=0.4",
"Pmax=? [F \"goal\" ]",
false);
221 symbolicbelsup_test(STORM_TEST_RESOURCES_DIR
"/pomdp/maze2.prism",
"sl=0.0",
"Pmax=? [F \"goal\" ]",
false);
222 symbolicbelsup_test(STORM_TEST_RESOURCES_DIR
"/pomdp/maze2.prism",
"sl=0.4",
"Pmax=? [!\"bad\" U \"goal\" ]",
false);
223 symbolicbelsup_test(STORM_TEST_RESOURCES_DIR
"/pomdp/maze2.prism",
"sl=0.0",
"Pmax=? [!\"bad\" U \"goal\"]",
false);
225 symbolicbelsup_test(STORM_TEST_RESOURCES_DIR
"/pomdp/maze2.prism",
"sl=0.4",
"Pmax=? [F \"goal\" ]",
true);
226 symbolicbelsup_test(STORM_TEST_RESOURCES_DIR
"/pomdp/maze2.prism",
"sl=0.0",
"Pmax=? [F \"goal\" ]",
true);
227 symbolicbelsup_test(STORM_TEST_RESOURCES_DIR
"/pomdp/maze2.prism",
"sl=0.4",
"Pmax=? [!\"bad\" U \"goal\" ]",
true);
228 symbolicbelsup_test(STORM_TEST_RESOURCES_DIR
"/pomdp/maze2.prism",
"sl=0.0",
"Pmax=? [!\"bad\" U \"goal\"]",
true);
230 GTEST_SKIP() <<
"Library Sylvan not available.";
void oneshot_test(std::string const &path, std::string const &constants, std::string formulaString, uint64_t lookahead)
void symbolicbelsup_test(std::string const &path, std::string const &constants, std::string formulaString, bool wr)
TEST_F(QualitativeAnalysis, PolicySearchUsesEnvironment)
void graphalgorithm_test(std::string const &path, std::string const &constants, std::string formulaString)
void iterativesearch_test(std::string const &path, std::string const &constants, std::string formulaString, bool wr)
SolverEnvironment & solver()
void setSmtSolverType(storm::solver::SmtSolverType const &value, bool isSetFromDefault=false)
storm::storage::BitVector analyseProbSmaller1(storm::logic::ProbabilityOperatorFormula const &formula) const
storm::storage::BitVector analyseProb1(storm::logic::ProbabilityOperatorFormula const &formula) const
This class represents a partially observable Markov decision process.
static storm::prism::Program parse(std::string const &filename, bool prismCompatability=false)
Parses the given file into the PRISM storage classes assuming it complies with the PRISM syntax.
bool analyzeForInitialStates(uint64_t k)
void computeWinningRegion(uint64_t k)
bool analyzeForInitialStates(uint64_t k)
Check if you can find a memoryless policy from the initial states.
void generate(storm::storage::BitVector const &targetStates, storm::storage::BitVector const &badStates)
void verifySymbolic(storm::Environment const &env, bool onlyInitial=true)
Program preprocess(std::map< storm::expressions::Variable, storm::expressions::Expression > const &constantDefinitions) const
Preprocesses the program by defining the given constant definitions, substituting constants and formu...
A bit vector that is internally represented as a vector of 64-bit values.
std::vector< storm::jani::Property > parsePropertiesForPrismProgram(std::string const &inputString, storm::prism::Program const &program, boost::optional< std::set< std::string > > const &propertyFilter)
std::shared_ptr< storm::models::sparse::Model< ValueType > > buildSparseModel(storm::storage::SymbolicModelDescription const &model, storm::builder::BuilderOptions const &options, typename storm::builder::ExplicitModelBuilder< ValueType >::Options const &explorationOptions=typename storm::builder::ExplicitModelBuilder< ValueType >::Options())
FormulaInformation getFormulaInformation(PomdpType const &pomdp, storm::logic::ProbabilityOperatorFormula const &formula)