32 EXPECT_TRUE(constFunctionRes.first);
33 EXPECT_TRUE(constFunctionRes.second);
38 EXPECT_TRUE(constFunctionRes.first);
39 EXPECT_FALSE(constFunctionRes.second);
44 EXPECT_FALSE(constFunctionRes.first);
45 EXPECT_TRUE(constFunctionRes.second);
47 std::shared_ptr<storm::RawPolynomialCache> cache = std::make_shared<storm::RawPolynomialCache>();
48 carl::StringParser parser;
49 parser.setVariables({
"p",
"q"});
55 auto varsP = functionP.gatherVariables();
56 auto varsQ = functionQ.gatherVariables();
59 for (
auto var : varsP) {
61 storm::utility::convertNumber<typename storm::storage::ParameterRegion<storm::RationalFunction>::CoefficientType>(0 + 0.000001);
63 storm::utility::convertNumber<typename storm::storage::ParameterRegion<storm::RationalFunction>::CoefficientType>(1 - 0.000001);
64 lowerBoundaries2.emplace(std::make_pair(var, lb));
65 upperBoundaries2.emplace(std::make_pair(var, ub));
67 for (
auto var : varsQ) {
69 storm::utility::convertNumber<typename storm::storage::ParameterRegion<storm::RationalFunction>::CoefficientType>(0 + 0.000001);
71 storm::utility::convertNumber<typename storm::storage::ParameterRegion<storm::RationalFunction>::CoefficientType>(1 - 0.000001);
72 lowerBoundaries2.emplace(std::make_pair(var, lb));
73 upperBoundaries2.emplace(std::make_pair(var, ub));
78 auto function = functionP;
80 EXPECT_TRUE(functionRes.first);
81 EXPECT_FALSE(functionRes.second);
86 EXPECT_TRUE(functionDecrRes.first);
87 EXPECT_FALSE(functionDecrRes.second);
92 EXPECT_FALSE(functionNonMonotonicRes.first);
93 EXPECT_FALSE(functionNonMonotonicRes.second);
98 EXPECT_FALSE(functionDecrRes.first);
99 EXPECT_TRUE(functionDecrRes.second);
102 function = functionP * functionQ;
104 EXPECT_TRUE(functionRes.first);
105 EXPECT_FALSE(functionRes.second);
109 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/brp16_2.pm";
110 std::string formulaAsString =
"P=? [true U s=4 & i=N ]";
111 std::string constantsAsString =
"";
116 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
118 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
121 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
122 model = simplifier.getSimplifiedModel();
126 if (storm::settings::getModule<storm::settings::modules::BisimulationSettings>().isWeakBisimulationSet()) {
130 model = storm::api::performBisimulationMinimization<storm::RationalFunction>(model, formulas, bisimType)
132 ASSERT_EQ(99ul, model->getNumberOfStates());
133 ASSERT_EQ(195ul, model->getNumberOfTransitions());
137 auto region = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=pL<=0.9, 0.1<=pK<=0.9", modelParameters);
138 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
145 EXPECT_EQ(1ul, result.size());
148 auto order = result.begin()->first;
149 auto monotonicityResult = result.begin()->second.first;
150 EXPECT_TRUE(monotonicityResult->isDone());
151 EXPECT_TRUE(monotonicityResult->existsMonotonicity());
152 EXPECT_TRUE(monotonicityResult->isAllMonotonicity());
153 auto assumptions = result.begin()->second.second;
154 EXPECT_EQ(0ul, assumptions.size());
157 auto monRes = monotonicityResult->getMonotonicityResult();
158 for (
auto entry : monRes) {
164 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/brp16_2.pm";
165 std::string formulaAsString =
"P=? [true U s=4 & i=N ]";
166 std::string constantsAsString =
"";
171 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
173 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
176 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
177 model = simplifier.getSimplifiedModel();
181 if (storm::settings::getModule<storm::settings::modules::BisimulationSettings>().isWeakBisimulationSet()) {
185 model = storm::api::performBisimulationMinimization<storm::RationalFunction>(model, formulas, bisimType)
187 ASSERT_EQ(99ul, model->getNumberOfStates());
188 ASSERT_EQ(195ul, model->getNumberOfTransitions());
192 auto region = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=pL<=0.9, 0.1<=pK<=0.9", modelParameters);
193 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
200 EXPECT_EQ(1ul, result.size());
203 auto order = result.begin()->first;
204 auto monotonicityResult = result.begin()->second.first;
205 EXPECT_TRUE(monotonicityResult->isDone());
206 EXPECT_TRUE(monotonicityResult->existsMonotonicity());
207 EXPECT_TRUE(monotonicityResult->isAllMonotonicity());
208 auto assumptions = result.begin()->second.second;
209 EXPECT_EQ(0ul, assumptions.size());
212 auto monRes = monotonicityResult->getMonotonicityResult();
213 for (
auto entry : monRes) {
219 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/zeroconf4.pm";
220 std::string formulaAsString =
"P > 0.5 [ F s=5 ]";
221 std::string constantsAsString =
"n = 4";
226 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
228 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
231 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
232 model = simplifier.getSimplifiedModel();
235 if (storm::settings::getModule<storm::settings::modules::BisimulationSettings>().isWeakBisimulationSet()) {
239 model = storm::api::performBisimulationMinimization<storm::RationalFunction>(model, formulas, bisimType)
241 ASSERT_EQ(7ul, model->getNumberOfStates());
242 ASSERT_EQ(12ul, model->getNumberOfTransitions());
246 auto region = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=pL<=0.9, 0.1<=pK<=0.9", modelParameters);
247 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
252 auto result = MonotonicityHelper.checkMonotonicityInBuild(std::cout,
false);
253 EXPECT_EQ(1ul, result.size());
256 auto order = result.begin()->first;
257 auto monotonicityResult = result.begin()->second.first;
258 EXPECT_TRUE(monotonicityResult->isDone());
259 EXPECT_TRUE(monotonicityResult->existsMonotonicity());
260 EXPECT_TRUE(monotonicityResult->isAllMonotonicity());
262 auto assumptions = result.begin()->second.second;
263 EXPECT_EQ(0ul, assumptions.size());
266 auto monRes = monotonicityResult->getMonotonicityResult();
267 for (
auto entry : monRes) {
273 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/simple1.pm";
274 std::string formulaAsString =
"P > 0.5 [ F s=3 ]";
275 std::string constantsAsString =
"";
280 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
282 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
285 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
286 model = simplifier.getSimplifiedModel();
287 ASSERT_EQ(5ul, model->getNumberOfStates());
288 ASSERT_EQ(8ul, model->getNumberOfTransitions());
292 auto region = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=p<=0.49", modelParameters);
293 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
299 auto result = MonotonicityHelper.checkMonotonicityInBuild(std::cout,
false);
300 EXPECT_EQ(1ul, result.size());
303 auto order = result.begin()->first;
304 auto monotonicityResult = result.begin()->second.first;
305 EXPECT_TRUE(monotonicityResult->isDone());
306 EXPECT_FALSE(monotonicityResult->existsMonotonicity());
307 EXPECT_FALSE(monotonicityResult->isAllMonotonicity());
308 auto assumptions = result.begin()->second.second;
309 EXPECT_EQ(0ul, assumptions.size());
312 auto monRes = monotonicityResult->getMonotonicityResult();
313 for (
auto entry : monRes) {
319 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/casestudy1.pm";
320 std::string formulaAsString =
"P > 0.5 [ F s=3 ]";
321 std::string constantsAsString =
"";
326 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
328 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
331 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
332 model = simplifier.getSimplifiedModel();
336 auto region = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=p<=0.9", modelParameters);
337 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
339 ASSERT_EQ(5ul, model->getNumberOfStates());
340 ASSERT_EQ(8ul, model->getNumberOfTransitions());
343 auto result = MonotonicityHelper.checkMonotonicityInBuild(std::cout,
false);
344 ASSERT_EQ(1ul, result.size());
346 auto order = result.begin()->first;
347 auto monotonicityResult = result.begin()->second.first;
348 EXPECT_TRUE(monotonicityResult->isDone());
349 EXPECT_TRUE(monotonicityResult->existsMonotonicity());
350 EXPECT_TRUE(monotonicityResult->isAllMonotonicity());
351 auto assumptions = result.begin()->second.second;
352 EXPECT_EQ(0ul, assumptions.size());
354 auto monRes = monotonicityResult->getMonotonicityResult();
355 for (
auto entry : monRes) {
361 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/casestudy2.pm";
362 std::string formulaAsString =
"P > 0.5 [ F s=4 ]";
363 std::string constantsAsString =
"";
368 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
370 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
373 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
374 model = simplifier.getSimplifiedModel();
378 auto region = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=p<=0.9", modelParameters);
379 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
381 ASSERT_EQ(6ul, model->getNumberOfStates());
382 ASSERT_EQ(12ul, model->getNumberOfTransitions());
388 auto result = monotonicityHelper.checkMonotonicityInBuild(std::cout,
false);
389 EXPECT_EQ(1ul, result.size());
390 EXPECT_FALSE(result.begin()->first->getDoneBuilding());
394 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/casestudy3.pm";
395 std::string formulaAsString =
"P > 0.5 [ F s=3 ]";
396 std::string constantsAsString =
"";
401 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
403 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
406 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
407 model = simplifier.getSimplifiedModel();
411 auto region = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=p<=0.9", modelParameters);
412 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
414 ASSERT_EQ(5ul, model->getNumberOfStates());
415 ASSERT_EQ(8ul, model->getNumberOfTransitions());
418 auto result = MonotonicityHelper.checkMonotonicityInBuild(std::cout,
false);
420 ASSERT_EQ(1ul, result.size());
421 auto order = result.begin()->first;
423 auto monotonicityResult = result.begin()->second.first;
424 EXPECT_TRUE(monotonicityResult->isDone());
425 EXPECT_FALSE(monotonicityResult->existsMonotonicity());
426 EXPECT_FALSE(monotonicityResult->isAllMonotonicity());
427 auto assumptions = result.begin()->second.second;
428 EXPECT_EQ(0ul, assumptions.size());
430 auto monRes = monotonicityResult->getMonotonicityResult();
431 for (
auto entry : monRes) {
437 std::string programFile = STORM_TEST_RESOURCES_DIR
"/pdtmc/casestudy3.pm";
438 std::string formulaAsString =
"P > 0.5 [ F s=3 ]";
439 std::string constantsAsString =
"";
444 std::vector<std::shared_ptr<const storm::logic::Formula>> formulas =
446 std::shared_ptr<storm::models::sparse::Dtmc<storm::RationalFunction>> model =
449 ASSERT_TRUE(simplifier.simplify(*(formulas[0])));
450 model = simplifier.getSimplifiedModel();
454 auto region = storm::api::parseRegion<storm::RationalFunction>(
"0.1<=p<=0.49", modelParameters);
455 std::vector<storm::storage::ParameterRegion<storm::RationalFunction>> regions = {region};
457 ASSERT_EQ(5ul, model->getNumberOfStates());
458 ASSERT_EQ(8ul, model->getNumberOfTransitions());
461 auto result = MonotonicityHelper.checkMonotonicityInBuild(std::cout,
false);
463 ASSERT_EQ(1ul, result.size());
464 auto order = result.begin()->first;
466 auto monotonicityResult = result.begin()->second.first;
467 EXPECT_TRUE(monotonicityResult->isDone());
468 EXPECT_TRUE(monotonicityResult->existsMonotonicity());
469 EXPECT_TRUE(monotonicityResult->isAllMonotonicity());
470 auto assumptions = result.begin()->second.second;
471 EXPECT_EQ(0ul, assumptions.size());
473 auto monRes = monotonicityResult->getMonotonicityResult();
474 for (
auto entry : monRes) {
std::map< std::shared_ptr< Order >, std::pair< std::shared_ptr< MonotonicityResult< VariableType > >, std::vector< std::shared_ptr< expressions::BinaryRelationExpression > > > > checkMonotonicityInBuild(std::ostream &outfile, bool usePLA=false, std::string dotOutfileName="dotOutput")
Builds Reachability Orders for the given model and simultaneously uses them to check for Monotonicity...