Storm 1.14.0.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
AssumptionCheckerTest.cpp
Go to the documentation of this file.
1#include "storm-config.h"
2#include "test/storm_gtest.h"
3
17#include "storm/api/builder.h"
23#include "storm/utility/graph.h"
24
25class AssumptionCheckerTest : public ::testing::Test {
26 protected:
27 void SetUp() override {
28#ifndef STORM_HAVE_Z3
29 GTEST_SKIP() << "Z3 not available.";
30#endif
31 }
32};
33
34TEST_F(AssumptionCheckerTest, Brp_no_bisimulation) {
35 std::string programFile = STORM_TEST_RESOURCES_DIR "/pdtmc/brp16_2.pm";
36 std::string formulaAsString = "P=? [F s=4 & i=N ]";
37 std::string constantsAsString = ""; // e.g. pL=0.9,TOACK=0.5
38
39 // Program and formula
41 program = program.preprocess(constantsAsString);
42 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
44 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
46 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> dtmc = model->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
48 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
49 model = simplifier.getSimplifiedModel();
50
52
53 ASSERT_EQ(193ul, dtmc->getNumberOfStates());
54 ASSERT_EQ(383ul, dtmc->getNumberOfTransitions());
55
56 // Create the region
58 auto region = storm::api::parseRegion<storm::RationalFunction>("0.00001 <= pK <= 0.00001, 0.00001 <= pL <= 0.99999", vars);
59
62 above.set(0);
64 below.set(1);
65
67 options.forceTopologicalSort();
68 auto decomposition = storm::storage::StronglyConnectedComponentDecomposition<storm::RationalFunction>(model->getTransitionMatrix(), options);
69
70 auto statesSorted = storm::utility::graph::getTopologicalSort(model->getTransitionMatrix());
71 auto dummyOrder = std::shared_ptr<storm::analysis::Order>(new storm::analysis::Order(above, below, 193, decomposition, statesSorted));
72
74 EXPECT_EQ(storm::analysis::AssumptionStatus::UNKNOWN, checker.validateAssumption(assumption, dummyOrder, region));
75
77 EXPECT_EQ(storm::analysis::AssumptionStatus::UNKNOWN, checker.validateAssumption(assumption, dummyOrder, region));
78
80 EXPECT_EQ(storm::analysis::AssumptionStatus::UNKNOWN, checker.validateAssumption(assumption, dummyOrder, region));
81
82 checker.initializeCheckingOnSamples(storm::Environment(), formulas[0], dtmc, region, 3);
84 EXPECT_EQ(storm::analysis::AssumptionStatus::UNKNOWN, checker.validateAssumption(assumption, dummyOrder, region));
85
87 EXPECT_EQ(storm::analysis::AssumptionStatus::INVALID, checker.validateAssumption(assumption, dummyOrder, region));
88
90 EXPECT_EQ(storm::analysis::AssumptionStatus::INVALID, checker.validateAssumption(assumption, dummyOrder, region));
91}
92
94 std::string programFile = STORM_TEST_RESOURCES_DIR "/pdtmc/simple1.pm";
95 std::string formulaAsString = "P=? [F s=3]";
96 std::string constantsAsString = ""; // e.g. pL=0.9,TOACK=0.5
97
98 // Program and formula
100 program = program.preprocess(constantsAsString);
101 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
103 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
105 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> dtmc = model->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
107 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
108 model = simplifier.getSimplifiedModel();
110
111 ASSERT_EQ(5ul, dtmc->getNumberOfStates());
112 ASSERT_EQ(8ul, dtmc->getNumberOfTransitions());
113
114 // Create the region
116 auto region = storm::api::parseRegion<storm::RationalFunction>("0.00001 <= p <= 0.99999", vars);
117
119
121 options.forceTopologicalSort();
122 auto decomposition = storm::storage::StronglyConnectedComponentDecomposition<storm::RationalFunction>(model->getTransitionMatrix(), options);
123
125 above.set(3);
127 below.set(4);
128 auto statesSorted = storm::utility::graph::getTopologicalSort(model->getTransitionMatrix());
129 auto order = std::shared_ptr<storm::analysis::Order>(new storm::analysis::Order(above, below, 5, decomposition, statesSorted));
130
131 // Validating
133 EXPECT_EQ(storm::analysis::AssumptionStatus::INVALID, checker.validateAssumption(assumption, order, region));
134
136 EXPECT_EQ(storm::analysis::AssumptionStatus::INVALID, checker.validateAssumption(assumption, order, region));
137
139 EXPECT_EQ(storm::analysis::AssumptionStatus::INVALID, checker.validateAssumption(assumption, order, region));
140
141 region = storm::api::parseRegion<storm::RationalFunction>("0.51 <= p <= 0.99", vars);
143 EXPECT_EQ(storm::analysis::AssumptionStatus::VALID, checker.validateAssumption(assumption, order, region));
144
146 EXPECT_EQ(storm::analysis::AssumptionStatus::INVALID, checker.validateAssumption(assumption, order, region));
147
149 EXPECT_EQ(storm::analysis::AssumptionStatus::INVALID, checker.validateAssumption(assumption, order, region));
150}
151
153 std::string programFile = STORM_TEST_RESOURCES_DIR "/pdtmc/casestudy1.pm";
154 std::string formulaAsString = "P=? [F s=3]";
155 std::string constantsAsString = ""; // e.g. pL=0.9,TOACK=0.5
156
157 // Program and formula
158 storm::prism::Program program = storm::api::parseProgram(programFile);
159 program = program.preprocess(constantsAsString);
160 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
162 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
164 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> dtmc = model->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
166 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
167 model = simplifier.getSimplifiedModel();
169
170 ASSERT_EQ(5ul, dtmc->getNumberOfStates());
171 ASSERT_EQ(8ul, dtmc->getNumberOfTransitions());
172
173 // Create the region
175 auto region = storm::api::parseRegion<storm::RationalFunction>("0.00001 <= p <= 0.99999", vars);
176
178
180 above.set(3);
182 below.set(4);
183
185 options.forceTopologicalSort();
186 auto decomposition = storm::storage::StronglyConnectedComponentDecomposition<storm::RationalFunction>(model->getTransitionMatrix(), options);
187 auto statesSorted = storm::utility::graph::getTopologicalSort(model->getTransitionMatrix());
188 auto order = std::shared_ptr<storm::analysis::Order>(new storm::analysis::Order(above, below, 5, decomposition, statesSorted));
189
190 // Validating
192 EXPECT_EQ(storm::analysis::AssumptionStatus::VALID, checker.validateAssumption(assumption, order, region));
193
195 EXPECT_EQ(storm::analysis::AssumptionStatus::INVALID, checker.validateAssumption(assumption, order, region));
196
198 EXPECT_EQ(storm::analysis::AssumptionStatus::INVALID, checker.validateAssumption(assumption, order, region));
199
200 checker.initializeCheckingOnSamples(storm::Environment(), formulas[0], dtmc, region, 3);
202 EXPECT_EQ(storm::analysis::AssumptionStatus::VALID, checker.validateAssumption(assumption, order, region));
203
205 EXPECT_EQ(storm::analysis::AssumptionStatus::INVALID, checker.validateAssumption(assumption, order, region));
206
208 EXPECT_EQ(storm::analysis::AssumptionStatus::INVALID, checker.validateAssumption(assumption, order, region));
209}
210
212 std::string programFile = STORM_TEST_RESOURCES_DIR "/pdtmc/casestudy2.pm";
213 std::string formulaAsString = "P=? [F s=4]";
214 std::string constantsAsString = ""; // e.g. pL=0.9,TOACK=0.5
215
216 // Program and formula
217 storm::prism::Program program = storm::api::parseProgram(programFile);
218 program = program.preprocess(constantsAsString);
219 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
221 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
223 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> dtmc = model->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
225 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
226 model = simplifier.getSimplifiedModel();
228
229 ASSERT_EQ(6ul, dtmc->getNumberOfStates());
230 ASSERT_EQ(12ul, dtmc->getNumberOfTransitions());
231
232 // Create the region
234 auto region = storm::api::parseRegion<storm::RationalFunction>("0.00001 <= p <= 0.99999", vars);
235
237
239 above.set(4);
241 below.set(5);
242
244 options.forceTopologicalSort();
245 auto decomposition = storm::storage::StronglyConnectedComponentDecomposition<storm::RationalFunction>(model->getTransitionMatrix(), options);
246 auto statesSorted = storm::utility::graph::getTopologicalSort(model->getTransitionMatrix());
247 auto order = std::shared_ptr<storm::analysis::Order>(new storm::analysis::Order(above, below, 6, decomposition, statesSorted));
248 order->add(3);
249
250 // Checking on samples and validate
252 EXPECT_EQ(storm::analysis::AssumptionStatus::VALID, checker.validateAssumption(assumption, order, region));
253
255 EXPECT_EQ(storm::analysis::AssumptionStatus::INVALID, checker.validateAssumption(assumption, order, region));
256
258 EXPECT_EQ(storm::analysis::AssumptionStatus::INVALID, checker.validateAssumption(assumption, order, region));
259}
260
262 std::string programFile = STORM_TEST_RESOURCES_DIR "/pdtmc/casestudy3.pm";
263 std::string formulaAsString = "P=? [F s=3]";
264 std::string constantsAsString = ""; // e.g. pL=0.9,TOACK=0.5
265
266 // Program and formula
267 storm::prism::Program program = storm::api::parseProgram(programFile);
268 program = program.preprocess(constantsAsString);
269 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
271 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
273 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> dtmc = model->as<storm::models::sparse::Dtmc<storm::RationalFunction>>();
275 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
276 model = simplifier.getSimplifiedModel();
278
279 ASSERT_EQ(5ul, dtmc->getNumberOfStates());
280 ASSERT_EQ(8ul, dtmc->getNumberOfTransitions());
281
282 // Create the region
284 auto region = storm::api::parseRegion<storm::RationalFunction>("0.00001 <= p <= 0.4", vars);
285
287
288 // Order
290 above.set(3);
292 below.set(4);
294 options.forceTopologicalSort();
295 auto decomposition = storm::storage::StronglyConnectedComponentDecomposition<storm::RationalFunction>(model->getTransitionMatrix(), options);
296 auto statesSorted = storm::utility::graph::getTopologicalSort(model->getTransitionMatrix());
297 auto order = std::shared_ptr<storm::analysis::Order>(new storm::analysis::Order(above, below, 5, decomposition, statesSorted));
298
300 EXPECT_EQ(storm::analysis::AssumptionStatus::VALID, checker.validateAssumption(assumption, order, region));
301
303 EXPECT_EQ(storm::analysis::AssumptionStatus::INVALID, checker.validateAssumption(assumption, order, region));
304
306 EXPECT_EQ(storm::analysis::AssumptionStatus::INVALID, checker.validateAssumption(assumption, order, region));
307
308 checker.initializeCheckingOnSamples(storm::Environment(), formulas[0], dtmc, region, 3);
309
311 EXPECT_EQ(storm::analysis::AssumptionStatus::VALID, checker.validateAssumption(assumption, order, region));
312
314 EXPECT_EQ(storm::analysis::AssumptionStatus::INVALID, checker.validateAssumption(assumption, order, region));
315
317 EXPECT_EQ(storm::analysis::AssumptionStatus::INVALID, checker.validateAssumption(assumption, order, region));
318}
TEST_F(AssumptionCheckerTest, Brp_no_bisimulation)
std::shared_ptr< ModelType > as()
Casts the model into the model type given by the template parameter.
Definition ModelBase.h:38
This class represents a discrete-time Markov chain.
Definition Dtmc.h:16
storm::storage::SparseMatrix< ValueType > const & getTransitionMatrix() const
Retrieves the matrix representing the transitions of the model.
Definition Model.cpp:226
virtual uint_fast64_t getNumberOfTransitions() const override
Returns the number of (non-zero) transitions of the model.
Definition Model.cpp:196
virtual uint_fast64_t getNumberOfStates() const override
Returns the number of states of the model.
Definition Model.cpp:191
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...
Definition Program.cpp:1170
A bit vector that is internally represented as a vector of 64-bit values.
Definition BitVector.h:16
void set(uint64_t index, bool value=true)
Sets the given truth value at the given index.
This class represents the decomposition of a graph-like structure into its strongly connected compone...
This class performs different steps to simplify the given (parametric) model.
storm::storage::ParameterRegion< ValueType > parseRegion(std::string const &inputString, std::set< typename storm::storage::ParameterRegion< ValueType >::VariableType > const &consideredVariables)
Definition region.h:134
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::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())
Definition builder.h:117
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:732
std::vector< uint_fast64_t > getTopologicalSort(storm::storage::SparseMatrix< T > const &matrix, std::vector< uint64_t > const &firstStates)
Performs a topological sort of the states of the system according to the given transitions.
Definition graph.cpp:1883
A candidate relation between two states of a reachability order: either state1 > state2 (Greater) or ...
Definition Assumption.h:20
StronglyConnectedComponentDecompositionOptions & forceTopologicalSort(bool value=true)
Enforces that the returned SCCs are sorted in a topological order.