You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

216 lines
9.1 KiB

  1. #include "gtest/gtest.h"
  2. #include "storm-config.h"
  3. #include "src/utility/Settings.h"
  4. #include "src/modelchecker/GmmxxMdpPrctlModelChecker.h"
  5. #include "src/parser/AutoParser.h"
  6. TEST(GmmxxMdpPrctModelCheckerTest, AsynchronousLeader) {
  7. storm::settings::Settings* s = storm::settings::instance();
  8. storm::parser::AutoParser<double> parser(STORM_CPP_BASE_PATH "/examples/mdp/asynchronous_leader/leader7.tra", STORM_CPP_BASE_PATH "/examples/mdp/asynchronous_leader/leader7.lab", "", STORM_CPP_BASE_PATH "/examples/mdp/asynchronous_leader/leader7.trans.rew");
  9. ASSERT_EQ(parser.getType(), storm::models::MDP);
  10. std::shared_ptr<storm::models::Mdp<double>> mdp = parser.getModel<storm::models::Mdp<double>>();
  11. ASSERT_EQ(mdp->getNumberOfStates(), 3172u);
  12. ASSERT_EQ(mdp->getNumberOfTransitions(), 7144u);
  13. storm::modelchecker::GmmxxMdpPrctlModelChecker<double> mc(*mdp);
  14. storm::property::prctl::Ap<double>* apFormula = new storm::property::prctl::Ap<double>("elected");
  15. storm::property::prctl::Eventually<double>* eventuallyFormula = new storm::property::prctl::Eventually<double>(apFormula);
  16. storm::property::prctl::ProbabilisticNoBoundOperator<double>* probFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(eventuallyFormula, true);
  17. std::vector<double>* result = mc.checkNoBoundOperator(*probFormula);
  18. ASSERT_NE(nullptr, result);
  19. ASSERT_LT(std::abs((*result)[0] - 1), s->get<double>("precision"));
  20. delete probFormula;
  21. delete result;
  22. apFormula = new storm::property::prctl::Ap<double>("elected");
  23. eventuallyFormula = new storm::property::prctl::Eventually<double>(apFormula);
  24. probFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(eventuallyFormula, false);
  25. result = mc.checkNoBoundOperator(*probFormula);
  26. ASSERT_NE(nullptr, result);
  27. ASSERT_LT(std::abs((*result)[0] - 1), s->get<double>("precision"));
  28. delete probFormula;
  29. delete result;
  30. apFormula = new storm::property::prctl::Ap<double>("elected");
  31. storm::property::prctl::BoundedEventually<double>* boundedEventuallyFormula = new storm::property::prctl::BoundedEventually<double>(apFormula, 25);
  32. probFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(boundedEventuallyFormula, true);
  33. result = mc.checkNoBoundOperator(*probFormula);
  34. ASSERT_NE(nullptr, result);
  35. ASSERT_LT(std::abs((*result)[0] - 0.0625), s->get<double>("precision"));
  36. delete probFormula;
  37. delete result;
  38. apFormula = new storm::property::prctl::Ap<double>("elected");
  39. boundedEventuallyFormula = new storm::property::prctl::BoundedEventually<double>(apFormula, 25);
  40. probFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(boundedEventuallyFormula, false);
  41. result = mc.checkNoBoundOperator(*probFormula);
  42. ASSERT_NE(nullptr, result);
  43. ASSERT_LT(std::abs((*result)[0] - 0.0625), s->get<double>("precision"));
  44. delete probFormula;
  45. delete result;
  46. apFormula = new storm::property::prctl::Ap<double>("elected");
  47. storm::property::prctl::ReachabilityReward<double>* reachabilityRewardFormula = new storm::property::prctl::ReachabilityReward<double>(apFormula);
  48. storm::property::prctl::RewardNoBoundOperator<double>* rewardFormula = new storm::property::prctl::RewardNoBoundOperator<double>(reachabilityRewardFormula, true);
  49. result = mc.checkNoBoundOperator(*rewardFormula);
  50. ASSERT_LT(std::abs((*result)[0] - 4.28568908480604982), s->get<double>("precision"));
  51. delete rewardFormula;
  52. delete result;
  53. apFormula = new storm::property::prctl::Ap<double>("elected");
  54. reachabilityRewardFormula = new storm::property::prctl::ReachabilityReward<double>(apFormula);
  55. rewardFormula = new storm::property::prctl::RewardNoBoundOperator<double>(reachabilityRewardFormula, false);
  56. result = mc.checkNoBoundOperator(*rewardFormula);;
  57. ASSERT_NE(nullptr, result);
  58. ASSERT_LT(std::abs((*result)[0] - 4.2856904354441400784), s->get<double>("precision"));
  59. delete rewardFormula;
  60. delete result;
  61. }
  62. TEST(GmmxxMdpPrctModelCheckerTest, Consensus) {
  63. storm::settings::Settings* s = storm::settings::instance();
  64. storm::parser::AutoParser<double> parser(STORM_CPP_BASE_PATH "/examples/mdp/consensus/coin6_6.tra", STORM_CPP_BASE_PATH "/examples/mdp/consensus/coin6_6.lab", STORM_CPP_BASE_PATH "/examples/mdp/consensus/coin6_6.steps.state.rew", "");
  65. ASSERT_EQ(parser.getType(), storm::models::MDP);
  66. std::shared_ptr<storm::models::Mdp<double>> mdp = parser.getModel<storm::models::Mdp<double>>();
  67. storm::modelchecker::GmmxxMdpPrctlModelChecker<double> mc(*mdp);
  68. storm::property::prctl::Ap<double>* apFormula = new storm::property::prctl::Ap<double>("finished");
  69. storm::property::prctl::Eventually<double>* eventuallyFormula = new storm::property::prctl::Eventually<double>(apFormula);
  70. storm::property::prctl::ProbabilisticNoBoundOperator<double>* probFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(eventuallyFormula, true);
  71. std::vector<double>* result = mc.checkNoBoundOperator(*probFormula);
  72. ASSERT_NE(nullptr, result);
  73. ASSERT_LT(std::abs((*result)[0] - 1), s->get<double>("precision"));
  74. delete probFormula;
  75. delete result;
  76. apFormula = new storm::property::prctl::Ap<double>("finished");
  77. storm::property::prctl::Ap<double>* apFormula2 = new storm::property::prctl::Ap<double>("all_coins_equal_0");
  78. storm::property::prctl::And<double>* andFormula = new storm::property::prctl::And<double>(apFormula, apFormula2);
  79. eventuallyFormula = new storm::property::prctl::Eventually<double>(andFormula);
  80. probFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(eventuallyFormula, true);
  81. result = mc.checkNoBoundOperator(*probFormula);
  82. ASSERT_NE(nullptr, result);
  83. ASSERT_LT(std::abs((*result)[0] - 1), s->get<double>("precision"));
  84. delete probFormula;
  85. delete result;
  86. apFormula = new storm::property::prctl::Ap<double>("finished");
  87. apFormula2 = new storm::property::prctl::Ap<double>("all_coins_equal_1");
  88. andFormula = new storm::property::prctl::And<double>(apFormula, apFormula2);
  89. eventuallyFormula = new storm::property::prctl::Eventually<double>(andFormula);
  90. probFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(eventuallyFormula, true);
  91. result = mc.checkNoBoundOperator(*probFormula);
  92. ASSERT_NE(nullptr, result);
  93. ASSERT_LT(std::abs((*result)[0] - 1), s->get<double>("precision"));
  94. delete probFormula;
  95. delete result;
  96. apFormula = new storm::property::prctl::Ap<double>("finished");
  97. apFormula2 = new storm::property::prctl::Ap<double>("agree");
  98. storm::property::prctl::Not<double>* notFormula = new storm::property::prctl::Not<double>(apFormula2);
  99. andFormula = new storm::property::prctl::And<double>(apFormula, notFormula);
  100. eventuallyFormula = new storm::property::prctl::Eventually<double>(andFormula);
  101. probFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(eventuallyFormula, true);
  102. result = mc.checkNoBoundOperator(*probFormula);
  103. ASSERT_NE(nullptr, result);
  104. ASSERT_LT(std::abs((*result)[0] - 1), s->get<double>("precision"));
  105. delete probFormula;
  106. delete result;
  107. apFormula = new storm::property::prctl::Ap<double>("finished");
  108. storm::property::prctl::BoundedEventually<double>* boundedEventuallyFormula = new storm::property::prctl::BoundedEventually<double>(apFormula, 50);
  109. probFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(boundedEventuallyFormula, true);
  110. result = mc.checkNoBoundOperator(*probFormula);
  111. ASSERT_NE(nullptr, result);
  112. ASSERT_LT(std::abs((*result)[0] - 0.0625), s->get<double>("precision"));
  113. delete probFormula;
  114. delete result;
  115. apFormula = new storm::property::prctl::Ap<double>("finished");
  116. boundedEventuallyFormula = new storm::property::prctl::BoundedEventually<double>(apFormula, 50);
  117. probFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(boundedEventuallyFormula, false);
  118. result = mc.checkNoBoundOperator(*probFormula);
  119. ASSERT_NE(nullptr, result);
  120. ASSERT_LT(std::abs((*result)[0] - 0.0625), s->get<double>("precision"));
  121. delete probFormula;
  122. delete result;
  123. apFormula = new storm::property::prctl::Ap<double>("finished");
  124. storm::property::prctl::ReachabilityReward<double>* reachabilityRewardFormula = new storm::property::prctl::ReachabilityReward<double>(apFormula);
  125. storm::property::prctl::RewardNoBoundOperator<double>* rewardFormula = new storm::property::prctl::RewardNoBoundOperator<double>(reachabilityRewardFormula, true);
  126. result = mc.checkNoBoundOperator(*rewardFormula);
  127. ASSERT_LT(std::abs((*result)[0] - 4.28568908480604982), s->get<double>("precision"));
  128. delete rewardFormula;
  129. delete result;
  130. apFormula = new storm::property::prctl::Ap<double>("finished");
  131. reachabilityRewardFormula = new storm::property::prctl::ReachabilityReward<double>(apFormula);
  132. rewardFormula = new storm::property::prctl::RewardNoBoundOperator<double>(reachabilityRewardFormula, false);
  133. result = mc.checkNoBoundOperator(*rewardFormula);;
  134. ASSERT_NE(nullptr, result);
  135. ASSERT_LT(std::abs((*result)[0] - 4.2856904354441400784), s->get<double>("precision"));
  136. delete rewardFormula;
  137. delete result;
  138. }