Storm 1.11.1.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
MonotonicityCheckerTest.cpp
Go to the documentation of this file.
1#include "storm-config.h"
2#include "test/storm_gtest.h"
3
10#include "storm/api/builder.h"
11#include "storm/api/storm.h"
16#include "storm/utility/graph.h"
17
18class MonotonicityCheckerTest : public ::testing::Test {
19 protected:
20 void SetUp() override {
21#ifndef STORM_HAVE_Z3
22 GTEST_SKIP() << "Z3 not available.";
23#endif
24 }
25};
26
27TEST_F(MonotonicityCheckerTest, Simple1_larger_region) {
28 std::string programFile = STORM_TEST_RESOURCES_DIR "/pdtmc/simple1.pm";
29 std::string formulaAsString = "P=? [F s=3 ]";
30 std::string constantsAsString = "";
31
32 // model
34 program = storm::utility::prism::preprocess(program, constantsAsString);
35 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
37 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
38 storm::api::buildSparseModel<storm::RationalFunction>(program, formulas)->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
39 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> dtmc = model->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
41 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
42 model = simplifier.getSimplifiedModel();
43
44 // Create the region
45 auto modelParameters = storm::models::sparse::getProbabilityParameters(*model);
46 auto region = storm::api::parseRegion<storm::RationalFunction>("0.1<=p<=0.9", modelParameters);
47 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
48
49 // For order extender
53 phiStates = storm::storage::BitVector(model->getTransitionMatrix().getRowCount(), true);
55 psiStates = propositionalChecker.check(formula.getSubformula())->asExplicitQualitativeCheckResult().getTruthValuesVector();
56 // Get the maybeStates
57 std::pair<storm::storage::BitVector, storm::storage::BitVector> statesWithProbability01 =
58 storm::utility::graph::performProb01(model->getBackwardTransitions(), phiStates, psiStates);
59 storm::storage::BitVector topStates = statesWithProbability01.second;
60 storm::storage::BitVector bottomStates = statesWithProbability01.first;
61 // OrderExtender
62 storm::storage::SparseMatrix<storm::RationalFunction> matrix = model->getTransitionMatrix();
63 auto orderExtender = storm::analysis::OrderExtender<storm::RationalFunction, double>(topStates, bottomStates, matrix);
64 // Order
65 auto order = std::get<0>(orderExtender.toOrder(region, nullptr));
66 // monchecker
67 auto monChecker = new storm::analysis::MonotonicityChecker<storm::RationalFunction>(model->getTransitionMatrix());
68
69 // start testing
70 auto var = modelParameters.begin();
73}
74
75TEST_F(MonotonicityCheckerTest, Simple1_small_region) {
76 std::string programFile = STORM_TEST_RESOURCES_DIR "/pdtmc/simple1.pm";
77 std::string formulaAsString = "P=? [F s=3 ]";
78 std::string constantsAsString = "";
79
80 // model
82 program = storm::utility::prism::preprocess(program, constantsAsString);
83 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
85 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
86 storm::api::buildSparseModel<storm::RationalFunction>(program, formulas)->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
87 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> dtmc = model->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
89 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
90 model = simplifier.getSimplifiedModel();
91
92 // Create the region
93 auto modelParameters = storm::models::sparse::getProbabilityParameters(*model);
94 auto region = storm::api::parseRegion<storm::RationalFunction>("0.51<=p<=0.9", modelParameters);
95 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
96
97 // For order extender
101 phiStates = storm::storage::BitVector(model->getTransitionMatrix().getRowCount(), true);
103 psiStates = propositionalChecker.check(formula.getSubformula())->asExplicitQualitativeCheckResult().getTruthValuesVector();
104 // Get the maybeStates
105 std::pair<storm::storage::BitVector, storm::storage::BitVector> statesWithProbability01 =
106 storm::utility::graph::performProb01(model->getBackwardTransitions(), phiStates, psiStates);
107 storm::storage::BitVector topStates = statesWithProbability01.second;
108 storm::storage::BitVector bottomStates = statesWithProbability01.first;
109 // OrderExtender
110 storm::storage::SparseMatrix<storm::RationalFunction> matrix = model->getTransitionMatrix();
111 auto orderExtender = storm::analysis::OrderExtender<storm::RationalFunction, double>(topStates, bottomStates, matrix);
112 // Order
113 auto order = std::get<0>(orderExtender.toOrder(region, nullptr));
114 // monchecker
115 auto monChecker = new storm::analysis::MonotonicityChecker<storm::RationalFunction>(model->getTransitionMatrix());
116
117 // start testing
118 auto var = modelParameters.begin();
122}
123
125 std::string programFile = STORM_TEST_RESOURCES_DIR "/pdtmc/casestudy1.pm";
126 std::string formulaAsString = "P=? [F s=3 ]";
127 std::string constantsAsString = "";
128
129 // model
130 storm::prism::Program program = storm::api::parseProgram(programFile);
131 program = storm::utility::prism::preprocess(program, constantsAsString);
132 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
134 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
135 storm::api::buildSparseModel<storm::RationalFunction>(program, formulas)->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
136 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> dtmc = model->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
138 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
139 model = simplifier.getSimplifiedModel();
140
141 // Create the region
142 auto modelParameters = storm::models::sparse::getProbabilityParameters(*model);
143 auto region = storm::api::parseRegion<storm::RationalFunction>("0.1<=p<=0.9", modelParameters);
144 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
145
146 // For order extender
150 phiStates = storm::storage::BitVector(model->getTransitionMatrix().getRowCount(), true);
152 psiStates = propositionalChecker.check(formula.getSubformula())->asExplicitQualitativeCheckResult().getTruthValuesVector();
153 // Get the maybeStates
154 std::pair<storm::storage::BitVector, storm::storage::BitVector> statesWithProbability01 =
155 storm::utility::graph::performProb01(model->getBackwardTransitions(), phiStates, psiStates);
156 storm::storage::BitVector topStates = statesWithProbability01.second;
157 storm::storage::BitVector bottomStates = statesWithProbability01.first;
158 // OrderExtender
159 storm::storage::SparseMatrix<storm::RationalFunction> matrix = model->getTransitionMatrix();
160 auto orderExtender = storm::analysis::OrderExtender<storm::RationalFunction, double>(topStates, bottomStates, matrix);
161 // Order
162 auto res = orderExtender.extendOrder(nullptr, region);
163 auto order = std::get<0>(res);
164 ASSERT_TRUE(order->getDoneBuilding());
165
166 // monchecker
168
169 // start testing
170 auto var = modelParameters.begin();
171 for (uint_fast64_t i = 0; i < 3; i++) {
173 monChecker->checkLocalMonotonicity(order, i, *var, region));
174 }
175}
176
178 std::string programFile = STORM_TEST_RESOURCES_DIR "/pdtmc/casestudy2.pm";
179 std::string formulaAsString = "P=? [F s=4 ]";
180 std::string constantsAsString = "";
181
182 // model
183 storm::prism::Program program = storm::api::parseProgram(programFile);
184 program = storm::utility::prism::preprocess(program, constantsAsString);
185 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
187 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
188 storm::api::buildSparseModel<storm::RationalFunction>(program, formulas)->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
189 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> dtmc = model->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
191 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
192 model = simplifier.getSimplifiedModel();
193
194 // Create the region
195 auto modelParameters = storm::models::sparse::getProbabilityParameters(*model);
196 auto region = storm::api::parseRegion<storm::RationalFunction>("0.51<=p<=0.9", modelParameters);
197 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
198
199 // For order extender
203 phiStates = storm::storage::BitVector(model->getTransitionMatrix().getRowCount(), true);
205 psiStates = propositionalChecker.check(formula.getSubformula())->asExplicitQualitativeCheckResult().getTruthValuesVector();
206 // Get the maybeStates
207 std::pair<storm::storage::BitVector, storm::storage::BitVector> statesWithProbability01 =
208 storm::utility::graph::performProb01(model->getBackwardTransitions(), phiStates, psiStates);
209 storm::storage::BitVector topStates = statesWithProbability01.second;
210 storm::storage::BitVector bottomStates = statesWithProbability01.first;
211 // OrderExtender
212 storm::storage::SparseMatrix<storm::RationalFunction> matrix = model->getTransitionMatrix();
213 auto orderExtender = storm::analysis::OrderExtender<storm::RationalFunction, double>(topStates, bottomStates, matrix);
214 // Order
215 auto res = orderExtender.extendOrder(nullptr, region);
216 auto order = std::get<0>(res);
217 order->addRelation(1, 3);
218 order->addRelation(3, 2);
219
220 // monchecker
222
223 // start testing
224 auto var = modelParameters.begin();
225 for (uint_fast64_t i = 0; i < 3; i++) {
227 monChecker->checkLocalMonotonicity(order, i, *var, region));
228 }
229}
230
232 std::string programFile = STORM_TEST_RESOURCES_DIR "/pdtmc/casestudy3.pm";
233 std::string formulaAsString = "P=? [F s=3 ]";
234 std::string constantsAsString = "";
235
236 // model
237 storm::prism::Program program = storm::api::parseProgram(programFile);
238 program = storm::utility::prism::preprocess(program, constantsAsString);
239 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
241 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
242 storm::api::buildSparseModel<storm::RationalFunction>(program, formulas)->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
243 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> dtmc = model->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
245 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
246 model = simplifier.getSimplifiedModel();
247
248 // Create the region
249 auto modelParameters = storm::models::sparse::getProbabilityParameters(*model);
250 auto region = storm::api::parseRegion<storm::RationalFunction>("0.1<=p<=0.9", modelParameters);
251 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
252
253 // For order extender
257 phiStates = storm::storage::BitVector(model->getTransitionMatrix().getRowCount(), true);
259 psiStates = propositionalChecker.check(formula.getSubformula())->asExplicitQualitativeCheckResult().getTruthValuesVector();
260 // Get the maybeStates
261 std::pair<storm::storage::BitVector, storm::storage::BitVector> statesWithProbability01 =
262 storm::utility::graph::performProb01(model->getBackwardTransitions(), phiStates, psiStates);
263 storm::storage::BitVector topStates = statesWithProbability01.second;
264 storm::storage::BitVector bottomStates = statesWithProbability01.first;
265 // OrderExtender
266 storm::storage::SparseMatrix<storm::RationalFunction> matrix = model->getTransitionMatrix();
267 auto orderExtender = storm::analysis::OrderExtender<storm::RationalFunction, double>(topStates, bottomStates, matrix);
268 // Order
269 auto res = orderExtender.extendOrder(nullptr, region);
270 auto order = std::get<0>(res);
271 ASSERT_TRUE(order->getDoneBuilding());
272
273 // monchecker
275
276 // start testing
277 auto var = modelParameters.begin();
281
282 region = storm::api::parseRegion<storm::RationalFunction>("0.51<=p<=0.9", modelParameters);
286}
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:476
EventuallyFormula & asEventuallyFormula()
Definition Formula.cpp:341
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:37
This class represents a discrete-time Markov chain.
Definition Dtmc.h:13
A bit vector that is internally represented as a vector of 64-bit values.
Definition BitVector.h:16
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:693
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:399
storm::prism::Program preprocess(storm::prism::Program const &program, std::map< storm::expressions::Variable, storm::expressions::Expression > const &constantDefinitions)
Definition prism.cpp:19