Storm
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
LexicographicModelCheckingTest.cpp
Go to the documentation of this file.
1#include "storm-config.h"
2#include "test/storm_gtest.h"
3
5#include "storm/api/storm.h"
11
12TEST(LexicographicModelCheckingTest, prob_sched1) {
13#ifndef STORM_HAVE_Z3
14 GTEST_SKIP() << "Z3 not available.";
15#endif
16#ifndef STORM_HAVE_SPOT
17 GTEST_SKIP() << "Spot not available.";
18#endif
19 typedef double ValueType;
20 std::string formulasString = "multi(Pmax=? [GF y=2], Pmax=? [GF y=1], Pmax=? [GF y=3]);";
21 std::string pathToPrismFile = STORM_TEST_RESOURCES_DIR "/mdp/prob_sched.prism";
22 std::pair<std::shared_ptr<storm::models::sparse::Mdp<ValueType>>, std::vector<std::shared_ptr<storm::logic::Formula const>>> modelFormulas;
23 storm::prism::Program program = storm::api::parseProgram(pathToPrismFile);
24 program = storm::utility::prism::preprocess(program, "");
26 modelFormulas.first = storm::api::buildSparseModel<ValueType>(program, modelFormulas.second)->template as<storm::models::sparse::Mdp<ValueType>>();
27
28 auto mdp = std::move(modelFormulas.first);
29 std::vector<storm::modelchecker::CheckTask<storm::logic::MultiObjectiveFormula, ValueType>> tasks;
30 for (auto const& f : modelFormulas.second) {
31 tasks.emplace_back((*f).asMultiObjectiveFormula());
32 tasks.back().setProduceSchedulers(true);
33 }
34
37 {
38 tasks[0].setOnlyInitialStatesRelevant(true);
39 auto result = checker.checkLexObjectiveFormula(env, tasks[0]);
40 ASSERT_TRUE(result->isLexicographicCheckResult());
41 auto& lexResult = result->asLexicographicCheckResult<double>().getInitialStateValue();
42 EXPECT_NEAR(1.0, lexResult[0], storm::utility::convertNumber<ValueType>(env.solver().minMax().getPrecision()));
43 EXPECT_NEAR(0.5, lexResult[1], storm::utility::convertNumber<ValueType>(env.solver().minMax().getPrecision()));
44 EXPECT_NEAR(0, lexResult[2], storm::utility::convertNumber<ValueType>(env.solver().minMax().getPrecision()));
45 }
46}
47
48TEST(LexicographicModelCheckingTest, prob_sched2) {
49#ifndef STORM_HAVE_Z3
50 GTEST_SKIP() << "Z3 not available.";
51#endif
52#ifndef STORM_HAVE_SPOT
53 GTEST_SKIP() << "Spot not available.";
54#endif
55 typedef double ValueType;
56 std::string formulasString = "multi(Pmax=? [GF y=1], Pmax=? [GF y=2], Pmax=? [GF y=3]);";
57 std::string pathToPrismFile = STORM_TEST_RESOURCES_DIR "/mdp/prob_sched.prism";
58 std::pair<std::shared_ptr<storm::models::sparse::Mdp<ValueType>>, std::vector<std::shared_ptr<storm::logic::Formula const>>> modelFormulas;
59 storm::prism::Program program = storm::api::parseProgram(pathToPrismFile);
60 program = storm::utility::prism::preprocess(program, "");
62 modelFormulas.first = storm::api::buildSparseModel<ValueType>(program, modelFormulas.second)->template as<storm::models::sparse::Mdp<ValueType>>();
63
64 auto mdp = std::move(modelFormulas.first);
65 std::vector<storm::modelchecker::CheckTask<storm::logic::MultiObjectiveFormula, ValueType>> tasks;
66 for (auto const& f : modelFormulas.second) {
67 tasks.emplace_back((*f).asMultiObjectiveFormula());
68 tasks.back().setProduceSchedulers(true);
69 }
70
73 {
74 tasks[0].setOnlyInitialStatesRelevant(true);
75 auto result = checker.checkLexObjectiveFormula(env, tasks[0]);
76 ASSERT_TRUE(result->isLexicographicCheckResult());
77 auto const& lexResult = result->asLexicographicCheckResult<double>().getInitialStateValue();
78 EXPECT_NEAR(0.5, lexResult[0], storm::utility::convertNumber<ValueType>(env.solver().minMax().getPrecision()));
79 EXPECT_NEAR(1, lexResult[1], storm::utility::convertNumber<ValueType>(env.solver().minMax().getPrecision()));
80 EXPECT_NEAR(0, lexResult[2], storm::utility::convertNumber<ValueType>(env.solver().minMax().getPrecision()));
81 }
82}
TEST(LexicographicModelCheckingTest, prob_sched1)
SolverEnvironment & solver()
storm::RationalNumber const & getPrecision() const
MinMaxSolverEnvironment & minMax()
virtual std::unique_ptr< CheckResult > checkLexObjectiveFormula(Environment const &env, CheckTask< storm::logic::MultiObjectiveFormula, SolutionType > const &checkTask) override
std::vector< storm::jani::Property > parsePropertiesForPrismProgram(std::string const &inputString, storm::prism::Program const &program, boost::optional< std::set< std::string > > const &propertyFilter)
storm::prism::Program parseProgram(std::string const &filename, bool prismCompatibility, bool simplify)
std::vector< std::shared_ptr< storm::logic::Formula const > > extractFormulasFromProperties(std::vector< storm::jani::Property > const &properties)
storm::prism::Program preprocess(storm::prism::Program const &program, std::map< storm::expressions::Variable, storm::expressions::Expression > const &constantDefinitions)
Definition prism.cpp:19