Storm
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
MonotonicityCheckerTest.cpp
Go to the documentation of this file.
1#include "storm-config.h"
2
5
9
11#include "storm/api/builder.h"
12#include "storm/api/storm.h"
17#include "storm/utility/graph.h"
18
19#include "test/storm_gtest.h"
20
21class MonotonicityCheckerTest : public ::testing::Test {
22 protected:
23 void SetUp() override {
24#ifndef STORM_HAVE_Z3
25 GTEST_SKIP() << "Z3 not available.";
26#endif
27 }
28};
29
30TEST_F(MonotonicityCheckerTest, Simple1_larger_region) {
31 std::string programFile = STORM_TEST_RESOURCES_DIR "/pdtmc/simple1.pm";
32 std::string formulaAsString = "P=? [F s=3 ]";
33 std::string constantsAsString = "";
34
35 // model
37 program = storm::utility::prism::preprocess(program, constantsAsString);
38 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
40 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
41 storm::api::buildSparseModel<storm::RationalFunction>(program, formulas)->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
42 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> dtmc = model->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
44 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
45 model = simplifier.getSimplifiedModel();
46
47 // Create the region
48 auto modelParameters = storm::models::sparse::getProbabilityParameters(*model);
49 auto region = storm::api::parseRegion<storm::RationalFunction>("0.1<=p<=0.9", modelParameters);
50 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
51
52 // For order extender
56 phiStates = storm::storage::BitVector(model->getTransitionMatrix().getRowCount(), true);
58 psiStates = propositionalChecker.check(formula.getSubformula())->asExplicitQualitativeCheckResult().getTruthValuesVector();
59 // Get the maybeStates
60 std::pair<storm::storage::BitVector, storm::storage::BitVector> statesWithProbability01 =
61 storm::utility::graph::performProb01(model->getBackwardTransitions(), phiStates, psiStates);
62 storm::storage::BitVector topStates = statesWithProbability01.second;
63 storm::storage::BitVector bottomStates = statesWithProbability01.first;
64 // OrderExtender
65 storm::storage::SparseMatrix<storm::RationalFunction> matrix = model->getTransitionMatrix();
66 auto orderExtender = storm::analysis::OrderExtender<storm::RationalFunction, double>(&topStates, &bottomStates, matrix);
67 // Order
68 auto order = std::get<0>(orderExtender.toOrder(region, nullptr));
69 // monchecker
70 auto monChecker = new storm::analysis::MonotonicityChecker<storm::RationalFunction>(model->getTransitionMatrix());
71
72 // start testing
73 auto var = modelParameters.begin();
76}
77
78TEST_F(MonotonicityCheckerTest, Simple1_small_region) {
79 std::string programFile = STORM_TEST_RESOURCES_DIR "/pdtmc/simple1.pm";
80 std::string formulaAsString = "P=? [F s=3 ]";
81 std::string constantsAsString = "";
82
83 // model
85 program = storm::utility::prism::preprocess(program, constantsAsString);
86 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
88 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
89 storm::api::buildSparseModel<storm::RationalFunction>(program, formulas)->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
90 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> dtmc = model->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
92 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
93 model = simplifier.getSimplifiedModel();
94
95 // Create the region
96 auto modelParameters = storm::models::sparse::getProbabilityParameters(*model);
97 auto region = storm::api::parseRegion<storm::RationalFunction>("0.51<=p<=0.9", modelParameters);
98 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
99
100 // For order extender
104 phiStates = storm::storage::BitVector(model->getTransitionMatrix().getRowCount(), true);
106 psiStates = propositionalChecker.check(formula.getSubformula())->asExplicitQualitativeCheckResult().getTruthValuesVector();
107 // Get the maybeStates
108 std::pair<storm::storage::BitVector, storm::storage::BitVector> statesWithProbability01 =
109 storm::utility::graph::performProb01(model->getBackwardTransitions(), phiStates, psiStates);
110 storm::storage::BitVector topStates = statesWithProbability01.second;
111 storm::storage::BitVector bottomStates = statesWithProbability01.first;
112 // OrderExtender
113 storm::storage::SparseMatrix<storm::RationalFunction> matrix = model->getTransitionMatrix();
114 auto orderExtender = storm::analysis::OrderExtender<storm::RationalFunction, double>(&topStates, &bottomStates, matrix);
115 // Order
116 auto order = std::get<0>(orderExtender.toOrder(region, nullptr));
117 // monchecker
118 auto monChecker = new storm::analysis::MonotonicityChecker<storm::RationalFunction>(model->getTransitionMatrix());
119
120 // start testing
121 auto var = modelParameters.begin();
125}
126
128 std::string programFile = STORM_TEST_RESOURCES_DIR "/pdtmc/casestudy1.pm";
129 std::string formulaAsString = "P=? [F s=3 ]";
130 std::string constantsAsString = "";
131
132 // model
133 storm::prism::Program program = storm::api::parseProgram(programFile);
134 program = storm::utility::prism::preprocess(program, constantsAsString);
135 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
137 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
138 storm::api::buildSparseModel<storm::RationalFunction>(program, formulas)->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
139 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> dtmc = model->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
141 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
142 model = simplifier.getSimplifiedModel();
143
144 // Create the region
145 auto modelParameters = storm::models::sparse::getProbabilityParameters(*model);
146 auto region = storm::api::parseRegion<storm::RationalFunction>("0.1<=p<=0.9", modelParameters);
147 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
148
149 // For order extender
153 phiStates = storm::storage::BitVector(model->getTransitionMatrix().getRowCount(), true);
155 psiStates = propositionalChecker.check(formula.getSubformula())->asExplicitQualitativeCheckResult().getTruthValuesVector();
156 // Get the maybeStates
157 std::pair<storm::storage::BitVector, storm::storage::BitVector> statesWithProbability01 =
158 storm::utility::graph::performProb01(model->getBackwardTransitions(), phiStates, psiStates);
159 storm::storage::BitVector topStates = statesWithProbability01.second;
160 storm::storage::BitVector bottomStates = statesWithProbability01.first;
161 // OrderExtender
162 storm::storage::SparseMatrix<storm::RationalFunction> matrix = model->getTransitionMatrix();
163 auto orderExtender = storm::analysis::OrderExtender<storm::RationalFunction, double>(&topStates, &bottomStates, matrix);
164 // Order
165 auto res = orderExtender.extendOrder(nullptr, region);
166 auto order = std::get<0>(res);
167 ASSERT_TRUE(order->getDoneBuilding());
168
169 // monchecker
171
172 // start testing
173 auto var = modelParameters.begin();
174 for (uint_fast64_t i = 0; i < 3; i++) {
176 monChecker->checkLocalMonotonicity(order, i, *var, region));
177 }
178}
179
181 std::string programFile = STORM_TEST_RESOURCES_DIR "/pdtmc/casestudy2.pm";
182 std::string formulaAsString = "P=? [F s=4 ]";
183 std::string constantsAsString = "";
184
185 // model
186 storm::prism::Program program = storm::api::parseProgram(programFile);
187 program = storm::utility::prism::preprocess(program, constantsAsString);
188 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
190 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
191 storm::api::buildSparseModel<storm::RationalFunction>(program, formulas)->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
192 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> dtmc = model->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
194 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
195 model = simplifier.getSimplifiedModel();
196
197 // Create the region
198 auto modelParameters = storm::models::sparse::getProbabilityParameters(*model);
199 auto region = storm::api::parseRegion<storm::RationalFunction>("0.51<=p<=0.9", modelParameters);
200 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
201
202 // For order extender
206 phiStates = storm::storage::BitVector(model->getTransitionMatrix().getRowCount(), true);
208 psiStates = propositionalChecker.check(formula.getSubformula())->asExplicitQualitativeCheckResult().getTruthValuesVector();
209 // Get the maybeStates
210 std::pair<storm::storage::BitVector, storm::storage::BitVector> statesWithProbability01 =
211 storm::utility::graph::performProb01(model->getBackwardTransitions(), phiStates, psiStates);
212 storm::storage::BitVector topStates = statesWithProbability01.second;
213 storm::storage::BitVector bottomStates = statesWithProbability01.first;
214 // OrderExtender
215 storm::storage::SparseMatrix<storm::RationalFunction> matrix = model->getTransitionMatrix();
216 auto orderExtender = storm::analysis::OrderExtender<storm::RationalFunction, double>(&topStates, &bottomStates, matrix);
217 // Order
218 auto res = orderExtender.extendOrder(nullptr, region);
219 auto order = std::get<0>(res);
220 order->addRelation(1, 3);
221 order->addRelation(3, 2);
222
223 // monchecker
225
226 // start testing
227 auto var = modelParameters.begin();
228 for (uint_fast64_t i = 0; i < 3; i++) {
230 monChecker->checkLocalMonotonicity(order, i, *var, region));
231 }
232}
233
235 std::string programFile = STORM_TEST_RESOURCES_DIR "/pdtmc/casestudy3.pm";
236 std::string formulaAsString = "P=? [F s=3 ]";
237 std::string constantsAsString = "";
238
239 // model
240 storm::prism::Program program = storm::api::parseProgram(programFile);
241 program = storm::utility::prism::preprocess(program, constantsAsString);
242 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
244 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
245 storm::api::buildSparseModel<storm::RationalFunction>(program, formulas)->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
246 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> dtmc = model->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
248 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
249 model = simplifier.getSimplifiedModel();
250
251 // Create the region
252 auto modelParameters = storm::models::sparse::getProbabilityParameters(*model);
253 auto region = storm::api::parseRegion<storm::RationalFunction>("0.1<=p<=0.9", modelParameters);
254 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
255
256 // For order extender
260 phiStates = storm::storage::BitVector(model->getTransitionMatrix().getRowCount(), true);
262 psiStates = propositionalChecker.check(formula.getSubformula())->asExplicitQualitativeCheckResult().getTruthValuesVector();
263 // Get the maybeStates
264 std::pair<storm::storage::BitVector, storm::storage::BitVector> statesWithProbability01 =
265 storm::utility::graph::performProb01(model->getBackwardTransitions(), phiStates, psiStates);
266 storm::storage::BitVector topStates = statesWithProbability01.second;
267 storm::storage::BitVector bottomStates = statesWithProbability01.first;
268 // OrderExtender
269 storm::storage::SparseMatrix<storm::RationalFunction> matrix = model->getTransitionMatrix();
270 auto orderExtender = storm::analysis::OrderExtender<storm::RationalFunction, double>(&topStates, &bottomStates, matrix);
271 // Order
272 auto res = orderExtender.extendOrder(nullptr, region);
273 auto order = std::get<0>(res);
274 ASSERT_TRUE(order->getDoneBuilding());
275
276 // monchecker
278
279 // start testing
280 auto var = modelParameters.begin();
284
285 region = storm::api::parseRegion<storm::RationalFunction>("0.51<=p<=0.9", modelParameters);
289}
TEST_F(MonotonicityCheckerTest, Simple1_larger_region)
Monotonicity checkLocalMonotonicity(std::shared_ptr< Order > const &order, uint_fast64_t state, VariableType const &var, storage::ParameterRegion< ValueType > const &region)
Checks for local monotonicity at the given state.
ProbabilityOperatorFormula & asProbabilityOperatorFormula()
Definition Formula.cpp:453
EventuallyFormula & asEventuallyFormula()
Definition Formula.cpp:333
Formula const & getSubformula() const
Formula const & getSubformula() const
virtual std::unique_ptr< CheckResult > check(Environment const &env, CheckTask< storm::logic::Formula, SolutionType > const &checkTask)
Checks the provided formula.
std::shared_ptr< ModelType > as()
Casts the model into the model type given by the template parameter.
Definition ModelBase.h:36
This class represents a discrete-time Markov chain.
Definition Dtmc.h:14
A bit vector that is internally represented as a vector of 64-bit values.
Definition BitVector.h:18
A class that holds a possibly non-square matrix in the compressed row storage format.
This class performs different steps to simplify the given (parametric) model.
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)
std::set< storm::RationalFunctionVariable > getProbabilityParameters(Model< storm::RationalFunction > const &model)
Get all probability parameters occurring on transitions.
Definition Model.cpp:703
std::pair< storm::storage::BitVector, storm::storage::BitVector > performProb01(storm::models::sparse::DeterministicModel< T > const &model, storm::storage::BitVector const &phiStates, storm::storage::BitVector const &psiStates)
Computes the sets of states that have probability 0 or 1, respectively, of satisfying phi until psi i...
Definition graph.cpp:400
storm::prism::Program preprocess(storm::prism::Program const &program, std::map< storm::expressions::Variable, storm::expressions::Expression > const &constantDefinitions)
Definition prism.cpp:19