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.

363 lines
24 KiB

  1. #include "gtest/gtest.h"
  2. #include "storm-config.h"
  3. #ifdef STORM_HAVE_HYPRO
  4. #include "src/modelchecker/multiobjective/SparseMdpMultiObjectiveModelChecker.h"
  5. #include "src/modelchecker/results/ExplicitQuantitativeCheckResult.h"
  6. #include "src/modelchecker/results/ExplicitQualitativeCheckResult.h"
  7. #include "src/models/sparse/Mdp.h"
  8. #include "src/settings/modules/GeneralSettings.h"
  9. #include "src/settings/SettingsManager.h"
  10. #include "src/utility/storm.h"
  11. TEST(SparseMdpMultiObjectiveModelCheckerTest, probEqual1Objective) {
  12. std::string programFile = STORM_CPP_TESTS_BASE_PATH "/functional/modelchecker/multiobjective1.nm";
  13. std::string formulasAsString = "multi(Rmax=? [ F s=2 ], P>=1 [ s=0 U s=1 ]) ";
  14. formulasAsString += "; \n multi(Rmax=? [ F s=2 ], P>=1 [ F s=1 ]) ";
  15. // programm, model, formula
  16. storm::prism::Program program = storm::parseProgram(programFile);
  17. program.checkValidity();
  18. std::vector<std::shared_ptr<storm::logic::Formula const>> formulas = storm::parseFormulasForProgram(formulasAsString, program);
  19. storm::generator::NextStateGeneratorOptions options(formulas);
  20. std::shared_ptr<storm::models::sparse::Mdp<double>> mdp = storm::builder::ExplicitModelBuilder<double>(program, options).build()->as<storm::models::sparse::Mdp<double>>();
  21. uint_fast64_t const initState = *mdp->getInitialStates().begin();
  22. storm::modelchecker::SparseMdpMultiObjectiveModelChecker<storm::models::sparse::Mdp<double>> checker(*mdp);
  23. std::unique_ptr<storm::modelchecker::CheckResult> result = checker.check(storm::modelchecker::CheckTask<storm::logic::Formula>(*formulas[0], true));
  24. ASSERT_TRUE(result->isExplicitQuantitativeCheckResult());
  25. EXPECT_NEAR(7.647058824, result->asExplicitQuantitativeCheckResult<double>()[initState], storm::settings::getModule<storm::settings::modules::GeneralSettings>().getPrecision());
  26. result = checker.check(storm::modelchecker::CheckTask<storm::logic::Formula>(*formulas[1], true));
  27. ASSERT_TRUE(result->isExplicitQuantitativeCheckResult());
  28. EXPECT_NEAR(7.647058824, result->asExplicitQuantitativeCheckResult<double>()[initState], storm::settings::getModule<storm::settings::modules::GeneralSettings>().getPrecision());
  29. }
  30. TEST(SparseMdpMultiObjectiveModelCheckerTest, probEqual0Objective) {
  31. std::string programFile = STORM_CPP_TESTS_BASE_PATH "/functional/modelchecker/multiobjective1.nm";
  32. std::string formulasAsString = "multi(Rmax=? [ F s=2 ], P<=0 [ s=0 U s=1 ]) ";
  33. formulasAsString += "; \n multi(Rmax=? [ F s=2 ], P<=0 [ F s=1 ]) ";
  34. // programm, model, formula
  35. storm::prism::Program program = storm::parseProgram(programFile);
  36. program.checkValidity();
  37. std::vector<std::shared_ptr<storm::logic::Formula const>> formulas = storm::parseFormulasForProgram(formulasAsString, program);
  38. storm::generator::NextStateGeneratorOptions options(formulas);
  39. std::shared_ptr<storm::models::sparse::Mdp<double>> mdp = storm::builder::ExplicitModelBuilder<double>(program, options).build()->as<storm::models::sparse::Mdp<double>>();
  40. uint_fast64_t const initState = *mdp->getInitialStates().begin();
  41. storm::modelchecker::SparseMdpMultiObjectiveModelChecker<storm::models::sparse::Mdp<double>> checker(*mdp);
  42. std::unique_ptr<storm::modelchecker::CheckResult> result = checker.check(storm::modelchecker::CheckTask<storm::logic::Formula>(*formulas[0], true));
  43. ASSERT_TRUE(result->isExplicitQuantitativeCheckResult());
  44. EXPECT_NEAR(0.0, result->asExplicitQuantitativeCheckResult<double>()[initState], storm::settings::getModule<storm::settings::modules::GeneralSettings>().getPrecision());
  45. result = checker.check(storm::modelchecker::CheckTask<storm::logic::Formula>(*formulas[1], true));
  46. ASSERT_TRUE(result->isExplicitQuantitativeCheckResult());
  47. EXPECT_NEAR(0.0, result->asExplicitQuantitativeCheckResult<double>()[initState], storm::settings::getModule<storm::settings::modules::GeneralSettings>().getPrecision());
  48. }
  49. TEST(SparseMdpMultiObjectiveModelCheckerTest, preprocessorResultsTest) {
  50. std::string programFile = STORM_CPP_TESTS_BASE_PATH "/functional/modelchecker/multiobjective2.nm";
  51. std::string formulasAsString = "multi(Rmin=? [ F s=2 ], P>=1 [ s!=1 U s=2 ]) ";
  52. formulasAsString += "; \n multi(Rmax=? [ F s=2 ], P>=1 [ s!=1 U s=2 ]) ";
  53. formulasAsString += "; \n multi(R<=0 [ F s=2 ], P>=1 [ s!=1 U s=2 ]) ";
  54. formulasAsString += "; \n multi(R>0 [ F s=2 ], P>=1 [ s!=1 U s=2 ]) ";
  55. formulasAsString += "; \n multi(Rmin=? [ F s=2 ], P>=1 [ F s=1 ], P>=1 [F s=2]) ";
  56. formulasAsString += "; \n multi(Rmax=? [ F s=2 ], P>=1 [ F s=1 ], P>=1 [F s=2]) ";
  57. formulasAsString += "; \n multi(R>=300 [ F s=2 ], P>=1 [ F s=1 ], P>=1 [F s=2]) ";
  58. formulasAsString += "; \n multi(R<10 [ F s=2 ], P>=1 [ F s=1 ], P>=1 [F s=2]) ";
  59. formulasAsString += "; \n multi(Rmin=? [ C ]) ";
  60. formulasAsString += "; \n multi(Rmax=? [ C ]) ";
  61. formulasAsString += "; \n multi(R>1 [ C ]) ";
  62. formulasAsString += "; \n multi(R<1 [ C ]) ";
  63. // programm, model, formula
  64. storm::prism::Program program = storm::parseProgram(programFile);
  65. program.checkValidity();
  66. std::vector<std::shared_ptr<storm::logic::Formula const>> formulas = storm::parseFormulasForProgram(formulasAsString, program);
  67. storm::generator::NextStateGeneratorOptions options(formulas);
  68. std::shared_ptr<storm::models::sparse::Mdp<double>> mdp = storm::builder::ExplicitModelBuilder<double>(program, options).build()->as<storm::models::sparse::Mdp<double>>();
  69. uint_fast64_t const initState = *mdp->getInitialStates().begin();
  70. storm::modelchecker::SparseMdpMultiObjectiveModelChecker<storm::models::sparse::Mdp<double>> checker(*mdp);
  71. std::unique_ptr<storm::modelchecker::CheckResult> result = checker.check(storm::modelchecker::CheckTask<storm::logic::Formula>(*formulas[0], true));
  72. ASSERT_TRUE(result->isExplicitQuantitativeCheckResult());
  73. EXPECT_NEAR(0.0, result->asExplicitQuantitativeCheckResult<double>()[initState], storm::settings::getModule<storm::settings::modules::GeneralSettings>().getPrecision());
  74. result = checker.check(storm::modelchecker::CheckTask<storm::logic::Formula>(*formulas[1], true));
  75. ASSERT_TRUE(result->isExplicitQuantitativeCheckResult());
  76. EXPECT_NEAR(0.0, result->asExplicitQuantitativeCheckResult<double>()[initState], storm::settings::getModule<storm::settings::modules::GeneralSettings>().getPrecision());
  77. result = checker.check(storm::modelchecker::CheckTask<storm::logic::Formula>(*formulas[2], true));
  78. ASSERT_TRUE(result->isExplicitQualitativeCheckResult());
  79. EXPECT_TRUE(result->asExplicitQualitativeCheckResult()[initState]);
  80. result = checker.check(storm::modelchecker::CheckTask<storm::logic::Formula>(*formulas[3], true));
  81. ASSERT_TRUE(result->isExplicitQualitativeCheckResult());
  82. EXPECT_FALSE(result->asExplicitQualitativeCheckResult()[initState]);
  83. result = checker.check(storm::modelchecker::CheckTask<storm::logic::Formula>(*formulas[4], true));
  84. ASSERT_TRUE(result->isExplicitQuantitativeCheckResult());
  85. EXPECT_NEAR(10.0, result->asExplicitQuantitativeCheckResult<double>()[initState], storm::settings::getModule<storm::settings::modules::GeneralSettings>().getPrecision());
  86. result = checker.check(storm::modelchecker::CheckTask<storm::logic::Formula>(*formulas[5], true));
  87. ASSERT_TRUE(result->isExplicitQuantitativeCheckResult());
  88. EXPECT_EQ(storm::utility::infinity<double>(), result->asExplicitQuantitativeCheckResult<double>()[initState]);
  89. result = checker.check(storm::modelchecker::CheckTask<storm::logic::Formula>(*formulas[6], true));
  90. ASSERT_TRUE(result->isExplicitQualitativeCheckResult());
  91. EXPECT_TRUE(result->asExplicitQualitativeCheckResult()[initState]);
  92. result = checker.check(storm::modelchecker::CheckTask<storm::logic::Formula>(*formulas[7], true));
  93. ASSERT_TRUE(result->isExplicitQualitativeCheckResult());
  94. EXPECT_FALSE(result->asExplicitQualitativeCheckResult()[initState]);
  95. result = checker.check(storm::modelchecker::CheckTask<storm::logic::Formula>(*formulas[8], true));
  96. ASSERT_TRUE(result->isExplicitQuantitativeCheckResult());
  97. EXPECT_EQ(storm::utility::infinity<double>(), result->asExplicitQuantitativeCheckResult<double>()[initState]);
  98. result = checker.check(storm::modelchecker::CheckTask<storm::logic::Formula>(*formulas[9], true));
  99. ASSERT_TRUE(result->isExplicitQuantitativeCheckResult());
  100. EXPECT_EQ(storm::utility::infinity<double>(), result->asExplicitQuantitativeCheckResult<double>()[initState]);
  101. result = checker.check(storm::modelchecker::CheckTask<storm::logic::Formula>(*formulas[10], true));
  102. ASSERT_TRUE(result->isExplicitQualitativeCheckResult());
  103. EXPECT_TRUE(result->asExplicitQualitativeCheckResult()[initState]);
  104. result = checker.check(storm::modelchecker::CheckTask<storm::logic::Formula>(*formulas[11], true));
  105. ASSERT_TRUE(result->isExplicitQualitativeCheckResult());
  106. EXPECT_FALSE(result->asExplicitQualitativeCheckResult()[initState]);
  107. }
  108. TEST(SparseMdpMultiObjectiveModelCheckerTest, consensus) {
  109. std::string programFile = STORM_CPP_BASE_PATH "/examples/multiobjective/mdp/consensus/consensus2_3_2.nm";
  110. std::string formulasAsString = "multi(Pmax=? [ F \"one_proc_err\" ], P>=0.8916673903 [ G \"one_coin_ok\" ]) "; // numerical
  111. formulasAsString += "; \n multi(P>=0.1 [ F \"one_proc_err\" ], P>=0.8916673903 [ G \"one_coin_ok\" ])"; // achievability (true)
  112. formulasAsString += "; \n multi(P>=0.11 [ F \"one_proc_err\" ], P>=0.8916673903 [ G \"one_coin_ok\" ])"; // achievability (false)
  113. // programm, model, formula
  114. storm::prism::Program program = storm::parseProgram(programFile);
  115. program.checkValidity();
  116. std::vector<std::shared_ptr<storm::logic::Formula const>> formulas = storm::parseFormulasForProgram(formulasAsString, program);
  117. storm::generator::NextStateGeneratorOptions options(formulas);
  118. std::shared_ptr<storm::models::sparse::Mdp<double>> mdp = storm::builder::ExplicitModelBuilder<double>(program, options).build()->as<storm::models::sparse::Mdp<double>>();
  119. uint_fast64_t const initState = *mdp->getInitialStates().begin();
  120. storm::modelchecker::SparseMdpMultiObjectiveModelChecker<storm::models::sparse::Mdp<double>> checker(*mdp);
  121. std::unique_ptr<storm::modelchecker::CheckResult> result = checker.check(storm::modelchecker::CheckTask<storm::logic::Formula>(*formulas[0], true));
  122. ASSERT_TRUE(result->isExplicitQuantitativeCheckResult());
  123. EXPECT_NEAR(0.10833260970000025, result->asExplicitQuantitativeCheckResult<double>()[initState], storm::settings::getModule<storm::settings::modules::GeneralSettings>().getPrecision());
  124. result = checker.check(storm::modelchecker::CheckTask<storm::logic::Formula>(*formulas[1], true));
  125. ASSERT_TRUE(result->isExplicitQualitativeCheckResult());
  126. EXPECT_TRUE(result->asExplicitQualitativeCheckResult()[initState]);
  127. result = checker.check(storm::modelchecker::CheckTask<storm::logic::Formula>(*formulas[2], true));
  128. ASSERT_TRUE(result->isExplicitQualitativeCheckResult());
  129. EXPECT_FALSE(result->asExplicitQualitativeCheckResult()[initState]);
  130. }
  131. TEST(SparseMdpMultiObjectiveModelCheckerTest, zeroconf) {
  132. std::string programFile = STORM_CPP_BASE_PATH "/examples/multiobjective/mdp/zeroconf/zeroconf4.nm";
  133. std::string formulasAsString = "multi(Pmax=? [ F l=4 & ip=1 ] , P>=0.993141[ G (error=0) ]) "; // numerical
  134. formulasAsString += "; \n multi(P>=0.0003 [ F l=4 & ip=1 ] , P>=0.993141[ G (error=0) ])"; // achievability (true)
  135. formulasAsString += "; \n multi(P>=0.00031 [ F l=4 & ip=1 ] , P>=0.993141[ G (error=0) ])"; // achievability (false)
  136. // programm, model, formula
  137. storm::prism::Program program = storm::parseProgram(programFile);
  138. program.checkValidity();
  139. std::vector<std::shared_ptr<storm::logic::Formula const>> formulas = storm::parseFormulasForProgram(formulasAsString, program);
  140. storm::generator::NextStateGeneratorOptions options(formulas);
  141. std::shared_ptr<storm::models::sparse::Mdp<double>> mdp = storm::builder::ExplicitModelBuilder<double>(program, options).build()->as<storm::models::sparse::Mdp<double>>();
  142. uint_fast64_t const initState = *mdp->getInitialStates().begin();
  143. storm::modelchecker::SparseMdpMultiObjectiveModelChecker<storm::models::sparse::Mdp<double>> checker(*mdp);
  144. std::unique_ptr<storm::modelchecker::CheckResult> result = checker.check(storm::modelchecker::CheckTask<storm::logic::Formula>(*formulas[0], true));
  145. ASSERT_TRUE(result->isExplicitQuantitativeCheckResult());
  146. EXPECT_NEAR(0.0003075787401574803, result->asExplicitQuantitativeCheckResult<double>()[initState], storm::settings::getModule<storm::settings::modules::GeneralSettings>().getPrecision());
  147. result = checker.check(storm::modelchecker::CheckTask<storm::logic::Formula>(*formulas[1], true));
  148. ASSERT_TRUE(result->isExplicitQualitativeCheckResult());
  149. EXPECT_TRUE(result->asExplicitQualitativeCheckResult()[initState]);
  150. result = checker.check(storm::modelchecker::CheckTask<storm::logic::Formula>(*formulas[2], true));
  151. ASSERT_TRUE(result->isExplicitQualitativeCheckResult());
  152. EXPECT_FALSE(result->asExplicitQualitativeCheckResult()[initState]);
  153. }
  154. TEST(SparseMdpMultiObjectiveModelCheckerTest, zeroconfTb) {
  155. std::string programFile = STORM_CPP_BASE_PATH "/examples/multiobjective/mdp/zeroconf-tb/zeroconf-tb2_14.nm";
  156. std::string formulasAsString = " multi(Pmax=? [ F time_error=1 ] , P>=0.81[ G (error=0) ])"; // numerical
  157. formulasAsString += "; \n multi(P>=0.00000008 [ F time_error=1 ] , P>=0.81[ G (error=0) ])"; // achievability (true)
  158. formulasAsString += "; \n multi(P>=0.000000081 [ F time_error=1 ] , P>=0.81[ G (error=0) ])"; // achievability (false)
  159. // programm, model, formula
  160. storm::prism::Program program = storm::parseProgram(programFile);
  161. program.checkValidity();
  162. std::vector<std::shared_ptr<storm::logic::Formula const>> formulas = storm::parseFormulasForProgram(formulasAsString, program);
  163. storm::generator::NextStateGeneratorOptions options(formulas);
  164. std::shared_ptr<storm::models::sparse::Mdp<double>> mdp = storm::builder::ExplicitModelBuilder<double>(program, options).build()->as<storm::models::sparse::Mdp<double>>();
  165. uint_fast64_t const initState = *mdp->getInitialStates().begin();
  166. storm::modelchecker::SparseMdpMultiObjectiveModelChecker<storm::models::sparse::Mdp<double>> checker(*mdp);
  167. std::unique_ptr<storm::modelchecker::CheckResult> result = checker.check(storm::modelchecker::CheckTask<storm::logic::Formula>(*formulas[0], true));
  168. ASSERT_TRUE(result->isExplicitQuantitativeCheckResult());
  169. EXPECT_NEAR(8.059348391417451e-8, result->asExplicitQuantitativeCheckResult<double>()[initState], storm::settings::getModule<storm::settings::modules::GeneralSettings>().getPrecision());
  170. result = checker.check(storm::modelchecker::CheckTask<storm::logic::Formula>(*formulas[1], true));
  171. ASSERT_TRUE(result->isExplicitQualitativeCheckResult());
  172. EXPECT_TRUE(result->asExplicitQualitativeCheckResult()[initState]);
  173. result = checker.check(storm::modelchecker::CheckTask<storm::logic::Formula>(*formulas[2], true));
  174. ASSERT_TRUE(result->isExplicitQualitativeCheckResult());
  175. EXPECT_FALSE(result->asExplicitQualitativeCheckResult()[initState]);
  176. }
  177. TEST(SparseMdpMultiObjectiveModelCheckerTest, team3with2objectives) {
  178. std::string programFile = STORM_CPP_BASE_PATH "/examples/multiobjective/mdp/team/team2obj_3.nm";
  179. std::string formulasAsString = " multi(Pmax=? [ F task1_completed ], R{\"w_1_total\"}>=2.210204082 [ C ])"; // numerical
  180. formulasAsString += "; \n multi(P>=0.871 [ F task1_completed ], R{\"w_1_total\"}>=2.210204082 [ C ])"; // achievability (true)
  181. formulasAsString += "; \n multi(P>=0.872 [ F task1_completed ], R{\"w_1_total\"}>=2.210204082 [ C ])"; // achievability (false)
  182. // programm, model, formula
  183. storm::prism::Program program = storm::parseProgram(programFile);
  184. program.checkValidity();
  185. std::vector<std::shared_ptr<storm::logic::Formula const>> formulas = storm::parseFormulasForProgram(formulasAsString, program);
  186. storm::generator::NextStateGeneratorOptions options(formulas);
  187. std::shared_ptr<storm::models::sparse::Mdp<double>> mdp = storm::builder::ExplicitModelBuilder<double>(program, options).build()->as<storm::models::sparse::Mdp<double>>();
  188. uint_fast64_t const initState = *mdp->getInitialStates().begin();
  189. storm::modelchecker::SparseMdpMultiObjectiveModelChecker<storm::models::sparse::Mdp<double>> checker(*mdp);
  190. std::unique_ptr<storm::modelchecker::CheckResult> result = checker.check(storm::modelchecker::CheckTask<storm::logic::Formula>(*formulas[0], true));
  191. ASSERT_TRUE(result->isExplicitQuantitativeCheckResult());
  192. EXPECT_NEAR(0.8714285710612256, result->asExplicitQuantitativeCheckResult<double>()[initState], storm::settings::getModule<storm::settings::modules::GeneralSettings>().getPrecision());
  193. result = checker.check(storm::modelchecker::CheckTask<storm::logic::Formula>(*formulas[1], true));
  194. ASSERT_TRUE(result->isExplicitQualitativeCheckResult());
  195. EXPECT_TRUE(result->asExplicitQualitativeCheckResult()[initState]);
  196. result = checker.check(storm::modelchecker::CheckTask<storm::logic::Formula>(*formulas[2], true));
  197. ASSERT_TRUE(result->isExplicitQualitativeCheckResult());
  198. EXPECT_FALSE(result->asExplicitQualitativeCheckResult()[initState]);
  199. }
  200. TEST(SparseMdpMultiObjectiveModelCheckerTest, team3with3objectives) {
  201. std::string programFile = STORM_CPP_BASE_PATH "/examples/multiobjective/mdp/team/team3obj_3.nm";
  202. std::string formulasAsString = "multi(Pmax=? [ F task1_completed ], R{\"w_1_total\"}>=2.210204082 [ C ], P>=0.5 [ F task2_completed ])"; // numerical
  203. formulasAsString += "; \n multi(P>=0.744 [ F task1_completed ], R{\"w_1_total\"}>=2.210204082 [ C ], P>=0.5 [ F task2_completed ])"; // achievability (true)
  204. formulasAsString += "; \n multi(P>=0.745 [ F task1_completed ], R{\"w_1_total\"}>=2.210204082 [ C ], P>=0.5 [ F task2_completed ])"; // achievability (false)
  205. // programm, model, formula
  206. storm::prism::Program program = storm::parseProgram(programFile);
  207. program.checkValidity();
  208. std::vector<std::shared_ptr<storm::logic::Formula const>> formulas = storm::parseFormulasForProgram(formulasAsString, program);
  209. storm::generator::NextStateGeneratorOptions options(formulas);
  210. std::shared_ptr<storm::models::sparse::Mdp<double>> mdp = storm::builder::ExplicitModelBuilder<double>(program, options).build()->as<storm::models::sparse::Mdp<double>>();
  211. uint_fast64_t const initState = *mdp->getInitialStates().begin();
  212. storm::modelchecker::SparseMdpMultiObjectiveModelChecker<storm::models::sparse::Mdp<double>> checker(*mdp);
  213. std::unique_ptr<storm::modelchecker::CheckResult> result = checker.check(storm::modelchecker::CheckTask<storm::logic::Formula>(*formulas[0], true));
  214. ASSERT_TRUE(result->isExplicitQuantitativeCheckResult());
  215. EXPECT_NEAR(0.7448979591841851, result->asExplicitQuantitativeCheckResult<double>()[initState], storm::settings::getModule<storm::settings::modules::GeneralSettings>().getPrecision());
  216. result = checker.check(storm::modelchecker::CheckTask<storm::logic::Formula>(*formulas[1], true));
  217. ASSERT_TRUE(result->isExplicitQualitativeCheckResult());
  218. EXPECT_TRUE(result->asExplicitQualitativeCheckResult()[initState]);
  219. result = checker.check(storm::modelchecker::CheckTask<storm::logic::Formula>(*formulas[2], true));
  220. ASSERT_TRUE(result->isExplicitQualitativeCheckResult());
  221. EXPECT_FALSE(result->asExplicitQualitativeCheckResult()[initState]);
  222. }
  223. TEST(SparseMdpMultiObjectiveModelCheckerTest, scheduler) {
  224. std::string programFile = STORM_CPP_BASE_PATH "/examples/multiobjective/mdp/scheduler/scheduler05.nm";
  225. std::string formulasAsString = "multi(R{\"time\"}min=?[ F \"tasks_complete\" ], R{\"energy\"}<=1.45 [ F \"tasks_complete\" ]) "; // numerical
  226. formulasAsString += "; \n multi(R{\"time\"}<= 11.778[ F \"tasks_complete\" ], R{\"energy\"}<=1.45 [ F \"tasks_complete\" ]) "; // achievability (true)
  227. formulasAsString += "; \n multi(R{\"time\"}<= 11.777 [ F \"tasks_complete\" ], R{\"energy\"}<=1.45 [ F \"tasks_complete\" ]) "; // achievability (false)
  228. // programm, model, formula
  229. storm::prism::Program program = storm::parseProgram(programFile);
  230. program.checkValidity();
  231. std::vector<std::shared_ptr<storm::logic::Formula const>> formulas = storm::parseFormulasForProgram(formulasAsString, program);
  232. storm::generator::NextStateGeneratorOptions options(formulas);
  233. std::shared_ptr<storm::models::sparse::Mdp<double>> mdp = storm::builder::ExplicitModelBuilder<double>(program, options).build()->as<storm::models::sparse::Mdp<double>>();
  234. uint_fast64_t const initState = *mdp->getInitialStates().begin();
  235. storm::modelchecker::SparseMdpMultiObjectiveModelChecker<storm::models::sparse::Mdp<double>> checker(*mdp);
  236. std::unique_ptr<storm::modelchecker::CheckResult> result = checker.check(storm::modelchecker::CheckTask<storm::logic::Formula>(*formulas[0], true));
  237. ASSERT_TRUE(result->isExplicitQuantitativeCheckResult());
  238. EXPECT_NEAR(11.77777778, result->asExplicitQuantitativeCheckResult<double>()[initState], storm::settings::getModule<storm::settings::modules::GeneralSettings>().getPrecision());
  239. result = checker.check(storm::modelchecker::CheckTask<storm::logic::Formula>(*formulas[1], true));
  240. ASSERT_TRUE(result->isExplicitQualitativeCheckResult());
  241. EXPECT_TRUE(result->asExplicitQualitativeCheckResult()[initState]);
  242. result = checker.check(storm::modelchecker::CheckTask<storm::logic::Formula>(*formulas[2], true));
  243. ASSERT_TRUE(result->isExplicitQualitativeCheckResult());
  244. EXPECT_FALSE(result->asExplicitQualitativeCheckResult()[initState]);
  245. }
  246. TEST(SparseMdpMultiObjectiveModelCheckerTest, dpm) {
  247. std::string programFile = STORM_CPP_BASE_PATH "/examples/multiobjective/mdp/dpm/dpm100.nm";
  248. std::string formulasAsString = "multi(R{\"power\"}min=? [ C<=100 ], R{\"queue\"}<=70 [ C<=100 ])"; // numerical
  249. formulasAsString += "; \n multi(R{\"power\"}<=121.613 [ C<=100 ], R{\"queue\"}<=70 [ C<=100 ])"; // achievability (true)
  250. formulasAsString += "; \n multi(R{\"power\"}<=121.612 [ C<=100 ], R{\"queue\"}<=70 [ C<=100 ])"; // achievability (false)
  251. // programm, model, formula
  252. storm::prism::Program program = storm::parseProgram(programFile);
  253. program.checkValidity();
  254. std::vector<std::shared_ptr<storm::logic::Formula const>> formulas = storm::parseFormulasForProgram(formulasAsString, program);
  255. storm::generator::NextStateGeneratorOptions options(formulas);
  256. std::shared_ptr<storm::models::sparse::Mdp<double>> mdp = storm::builder::ExplicitModelBuilder<double>(program, options).build()->as<storm::models::sparse::Mdp<double>>();
  257. uint_fast64_t const initState = *mdp->getInitialStates().begin();
  258. storm::modelchecker::SparseMdpMultiObjectiveModelChecker<storm::models::sparse::Mdp<double>> checker(*mdp);
  259. std::unique_ptr<storm::modelchecker::CheckResult> result = checker.check(storm::modelchecker::CheckTask<storm::logic::Formula>(*formulas[0], true));
  260. ASSERT_TRUE(result->isExplicitQuantitativeCheckResult());
  261. EXPECT_NEAR(121.61288420945114, result->asExplicitQuantitativeCheckResult<double>()[initState], storm::settings::getModule<storm::settings::modules::GeneralSettings>().getPrecision());
  262. result = checker.check(storm::modelchecker::CheckTask<storm::logic::Formula>(*formulas[1], true));
  263. ASSERT_TRUE(result->isExplicitQualitativeCheckResult());
  264. EXPECT_TRUE(result->asExplicitQualitativeCheckResult()[initState]);
  265. result = checker.check(storm::modelchecker::CheckTask<storm::logic::Formula>(*formulas[2], true));
  266. ASSERT_TRUE(result->isExplicitQualitativeCheckResult());
  267. EXPECT_FALSE(result->asExplicitQualitativeCheckResult()[initState]);
  268. }
  269. #endif /* STORM_HAVE_HYPRO */