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
9#include "storm/api/builder.h"
10#include "storm/api/storm.h"
14#include "storm/utility/graph.h"
15
16class MonotonicityCheckerTest : public ::testing::Test {
17 protected:
18 void SetUp() override {
19#ifndef STORM_HAVE_Z3
20 GTEST_SKIP() << "Z3 not available.";
21#endif
22 }
23};
24
25TEST_F(MonotonicityCheckerTest, Simple1_larger_region) {
26 std::string programFile = STORM_TEST_RESOURCES_DIR "/pdtmc/simple1.pm";
27 std::string formulaAsString = "P=? [F s=3 ]";
28 std::string constantsAsString = "";
29
30 // model
32 program = storm::utility::prism::preprocess(program, constantsAsString);
33 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
35 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
36 storm::api::buildSparseModel<storm::RationalFunction>(program, formulas)->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
37 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> dtmc = model->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
39 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
40 model = simplifier.getSimplifiedModel();
41
42 // Create the region
43 auto modelParameters = storm::models::sparse::getProbabilityParameters(*model);
44 auto region = storm::api::parseRegion<storm::RationalFunction>("0.1<=p<=0.9", modelParameters);
45 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
46
47 // For order extender
51 phiStates = storm::storage::BitVector(model->getTransitionMatrix().getRowCount(), true);
53 psiStates = propositionalChecker.check(formula.getSubformula())->asExplicitQualitativeCheckResult().getTruthValuesVector();
54 // Get the maybeStates
55 std::pair<storm::storage::BitVector, storm::storage::BitVector> statesWithProbability01 =
56 storm::utility::graph::performProb01(model->getBackwardTransitions(), phiStates, psiStates);
57 storm::storage::BitVector topStates = statesWithProbability01.second;
58 storm::storage::BitVector bottomStates = statesWithProbability01.first;
59 // OrderExtender
60 storm::storage::SparseMatrix<storm::RationalFunction> matrix = model->getTransitionMatrix();
61 auto orderExtender = storm::analysis::OrderExtender<storm::RationalFunction, double>(topStates, bottomStates, matrix);
62 // Order
63 auto order = std::get<0>(orderExtender.toOrder(region, nullptr));
64 // monchecker
65 auto monChecker = new storm::analysis::MonotonicityChecker<storm::RationalFunction>(model->getTransitionMatrix());
66
67 // start testing
68 auto var = modelParameters.begin();
71}
72
73TEST_F(MonotonicityCheckerTest, Simple1_small_region) {
74 std::string programFile = STORM_TEST_RESOURCES_DIR "/pdtmc/simple1.pm";
75 std::string formulaAsString = "P=? [F s=3 ]";
76 std::string constantsAsString = "";
77
78 // model
80 program = storm::utility::prism::preprocess(program, constantsAsString);
81 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
83 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
84 storm::api::buildSparseModel<storm::RationalFunction>(program, formulas)->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
85 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> dtmc = model->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
87 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
88 model = simplifier.getSimplifiedModel();
89
90 // Create the region
91 auto modelParameters = storm::models::sparse::getProbabilityParameters(*model);
92 auto region = storm::api::parseRegion<storm::RationalFunction>("0.51<=p<=0.9", modelParameters);
93 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
94
95 // For order extender
99 phiStates = storm::storage::BitVector(model->getTransitionMatrix().getRowCount(), true);
101 psiStates = propositionalChecker.check(formula.getSubformula())->asExplicitQualitativeCheckResult().getTruthValuesVector();
102 // Get the maybeStates
103 std::pair<storm::storage::BitVector, storm::storage::BitVector> statesWithProbability01 =
104 storm::utility::graph::performProb01(model->getBackwardTransitions(), phiStates, psiStates);
105 storm::storage::BitVector topStates = statesWithProbability01.second;
106 storm::storage::BitVector bottomStates = statesWithProbability01.first;
107 // OrderExtender
108 storm::storage::SparseMatrix<storm::RationalFunction> matrix = model->getTransitionMatrix();
109 auto orderExtender = storm::analysis::OrderExtender<storm::RationalFunction, double>(topStates, bottomStates, matrix);
110 // Order
111 auto order = std::get<0>(orderExtender.toOrder(region, nullptr));
112 // monchecker
113 auto monChecker = new storm::analysis::MonotonicityChecker<storm::RationalFunction>(model->getTransitionMatrix());
114
115 // start testing
116 auto var = modelParameters.begin();
120}
121
123 std::string programFile = STORM_TEST_RESOURCES_DIR "/pdtmc/casestudy1.pm";
124 std::string formulaAsString = "P=? [F s=3 ]";
125 std::string constantsAsString = "";
126
127 // model
128 storm::prism::Program program = storm::api::parseProgram(programFile);
129 program = storm::utility::prism::preprocess(program, constantsAsString);
130 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
132 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
133 storm::api::buildSparseModel<storm::RationalFunction>(program, formulas)->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
134 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> dtmc = model->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
136 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
137 model = simplifier.getSimplifiedModel();
138
139 // Create the region
140 auto modelParameters = storm::models::sparse::getProbabilityParameters(*model);
141 auto region = storm::api::parseRegion<storm::RationalFunction>("0.1<=p<=0.9", modelParameters);
142 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
143
144 // For order extender
148 phiStates = storm::storage::BitVector(model->getTransitionMatrix().getRowCount(), true);
150 psiStates = propositionalChecker.check(formula.getSubformula())->asExplicitQualitativeCheckResult().getTruthValuesVector();
151 // Get the maybeStates
152 std::pair<storm::storage::BitVector, storm::storage::BitVector> statesWithProbability01 =
153 storm::utility::graph::performProb01(model->getBackwardTransitions(), phiStates, psiStates);
154 storm::storage::BitVector topStates = statesWithProbability01.second;
155 storm::storage::BitVector bottomStates = statesWithProbability01.first;
156 // OrderExtender
157 storm::storage::SparseMatrix<storm::RationalFunction> matrix = model->getTransitionMatrix();
158 auto orderExtender = storm::analysis::OrderExtender<storm::RationalFunction, double>(topStates, bottomStates, matrix);
159 // Order
160 auto res = orderExtender.extendOrder(nullptr, region);
161 auto order = std::get<0>(res);
162 ASSERT_TRUE(order->getDoneBuilding());
163
164 // monchecker
166
167 // start testing
168 auto var = modelParameters.begin();
169 for (uint_fast64_t i = 0; i < 3; i++) {
171 monChecker->checkLocalMonotonicity(order, i, *var, region));
172 }
173}
174
176 std::string programFile = STORM_TEST_RESOURCES_DIR "/pdtmc/casestudy2.pm";
177 std::string formulaAsString = "P=? [F s=4 ]";
178 std::string constantsAsString = "";
179
180 // model
181 storm::prism::Program program = storm::api::parseProgram(programFile);
182 program = storm::utility::prism::preprocess(program, constantsAsString);
183 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
185 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
186 storm::api::buildSparseModel<storm::RationalFunction>(program, formulas)->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
187 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> dtmc = model->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
189 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
190 model = simplifier.getSimplifiedModel();
191
192 // Create the region
193 auto modelParameters = storm::models::sparse::getProbabilityParameters(*model);
194 auto region = storm::api::parseRegion<storm::RationalFunction>("0.51<=p<=0.9", modelParameters);
195 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
196
197 // For order extender
201 phiStates = storm::storage::BitVector(model->getTransitionMatrix().getRowCount(), true);
203 psiStates = propositionalChecker.check(formula.getSubformula())->asExplicitQualitativeCheckResult().getTruthValuesVector();
204 // Get the maybeStates
205 std::pair<storm::storage::BitVector, storm::storage::BitVector> statesWithProbability01 =
206 storm::utility::graph::performProb01(model->getBackwardTransitions(), phiStates, psiStates);
207 storm::storage::BitVector topStates = statesWithProbability01.second;
208 storm::storage::BitVector bottomStates = statesWithProbability01.first;
209 // OrderExtender
210 storm::storage::SparseMatrix<storm::RationalFunction> matrix = model->getTransitionMatrix();
211 auto orderExtender = storm::analysis::OrderExtender<storm::RationalFunction, double>(topStates, bottomStates, matrix);
212 // Order
213 auto res = orderExtender.extendOrder(nullptr, region);
214 auto order = std::get<0>(res);
215 order->addRelation(1, 3);
216 order->addRelation(3, 2);
217
218 // monchecker
220
221 // start testing
222 auto var = modelParameters.begin();
223 for (uint_fast64_t i = 0; i < 3; i++) {
225 monChecker->checkLocalMonotonicity(order, i, *var, region));
226 }
227}
228
230 std::string programFile = STORM_TEST_RESOURCES_DIR "/pdtmc/casestudy3.pm";
231 std::string formulaAsString = "P=? [F s=3 ]";
232 std::string constantsAsString = "";
233
234 // model
235 storm::prism::Program program = storm::api::parseProgram(programFile);
236 program = storm::utility::prism::preprocess(program, constantsAsString);
237 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
239 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
240 storm::api::buildSparseModel<storm::RationalFunction>(program, formulas)->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
241 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> dtmc = model->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
243 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
244 model = simplifier.getSimplifiedModel();
245
246 // Create the region
247 auto modelParameters = storm::models::sparse::getProbabilityParameters(*model);
248 auto region = storm::api::parseRegion<storm::RationalFunction>("0.1<=p<=0.9", modelParameters);
249 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
250
251 // For order extender
255 phiStates = storm::storage::BitVector(model->getTransitionMatrix().getRowCount(), true);
257 psiStates = propositionalChecker.check(formula.getSubformula())->asExplicitQualitativeCheckResult().getTruthValuesVector();
258 // Get the maybeStates
259 std::pair<storm::storage::BitVector, storm::storage::BitVector> statesWithProbability01 =
260 storm::utility::graph::performProb01(model->getBackwardTransitions(), phiStates, psiStates);
261 storm::storage::BitVector topStates = statesWithProbability01.second;
262 storm::storage::BitVector bottomStates = statesWithProbability01.first;
263 // OrderExtender
264 storm::storage::SparseMatrix<storm::RationalFunction> matrix = model->getTransitionMatrix();
265 auto orderExtender = storm::analysis::OrderExtender<storm::RationalFunction, double>(topStates, bottomStates, matrix);
266 // Order
267 auto res = orderExtender.extendOrder(nullptr, region);
268 auto order = std::get<0>(res);
269 ASSERT_TRUE(order->getDoneBuilding());
270
271 // monchecker
273
274 // start testing
275 auto var = modelParameters.begin();
279
280 region = storm::api::parseRegion<storm::RationalFunction>("0.51<=p<=0.9", modelParameters);
284}
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:695
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:393
storm::prism::Program preprocess(storm::prism::Program const &program, std::map< storm::expressions::Variable, storm::expressions::Expression > const &constantDefinitions)
Definition prism.cpp:13