322 lines
18 KiB

  1. #include "gtest/gtest.h"
  2. #include "storm-config.h"
  3. #include "src/settings/SettingMemento.h"
  4. #include "src/settings/SettingsManager.h"
  5. #include "src/settings/modules/IOSettings.h"
  6. #include "src/models/symbolic/Dtmc.h"
  7. #include "src/models/symbolic/Ctmc.h"
  8. #include "src/models/symbolic/Mdp.h"
  9. #include "src/models/symbolic/StandardRewardModel.h"
  10. #include "src/parser/PrismParser.h"
  11. #include "src/builder/DdPrismModelBuilder.h"
  12. TEST(DdPrismModelBuilderTest_Sylvan, Dtmc) {
  13. storm::prism::Program program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/die.pm");
  14. auto t1 = std::chrono::high_resolution_clock::now();
  15. std::shared_ptr<storm::models::symbolic::Model<storm::dd::DdType::Sylvan>> model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::Sylvan>().translateProgram(program);
  16. auto t2 = std::chrono::high_resolution_clock::now();
  17. std::cout << "die: " << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() << std::endl;
  18. EXPECT_EQ(13ul, model->getNumberOfStates());
  19. EXPECT_EQ(20ul, model->getNumberOfTransitions());
  20. program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/brp-16-2.pm");
  21. t1 = std::chrono::high_resolution_clock::now();
  22. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::Sylvan>().translateProgram(program);
  23. t2 = std::chrono::high_resolution_clock::now();
  24. std::cout << "brp: " << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() << std::endl;
  25. EXPECT_EQ(677ul, model->getNumberOfStates());
  26. EXPECT_EQ(867ul, model->getNumberOfTransitions());
  27. program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/crowds-5-5.pm");
  28. t1 = std::chrono::high_resolution_clock::now();
  29. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::Sylvan>().translateProgram(program);
  30. t2 = std::chrono::high_resolution_clock::now();
  31. std::cout << "crowds: " << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() << std::endl;
  32. EXPECT_EQ(8607ul, model->getNumberOfStates());
  33. EXPECT_EQ(15113ul, model->getNumberOfTransitions());
  34. program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/leader-3-5.pm");
  35. t1 = std::chrono::high_resolution_clock::now();
  36. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::Sylvan>().translateProgram(program);
  37. t2 = std::chrono::high_resolution_clock::now();
  38. std::cout << "lead: " << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() << std::endl;
  39. EXPECT_EQ(273ul, model->getNumberOfStates());
  40. EXPECT_EQ(397ul, model->getNumberOfTransitions());
  41. program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/nand-5-2.pm");
  42. t1 = std::chrono::high_resolution_clock::now();
  43. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::Sylvan>().translateProgram(program);
  44. t2 = std::chrono::high_resolution_clock::now();
  45. std::cout << "nand: " << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() << std::endl;
  46. EXPECT_EQ(1728ul, model->getNumberOfStates());
  47. EXPECT_EQ(2505ul, model->getNumberOfTransitions());
  48. }
  49. TEST(DdPrismModelBuilderTest_Cudd, Dtmc) {
  50. storm::prism::Program program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/die.pm");
  51. std::shared_ptr<storm::models::symbolic::Model<storm::dd::DdType::CUDD>> model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::CUDD>().translateProgram(program);
  52. EXPECT_EQ(13ul, model->getNumberOfStates());
  53. EXPECT_EQ(20ul, model->getNumberOfTransitions());
  54. // program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/brp-2-2.pm");
  55. // model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::CUDD>().translateProgram(program);
  56. //
  57. // exit(-1);
  58. program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/brp-16-2.pm");
  59. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::CUDD>().translateProgram(program);
  60. EXPECT_EQ(677ul, model->getNumberOfStates());
  61. EXPECT_EQ(867ul, model->getNumberOfTransitions());
  62. program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/crowds-5-5.pm");
  63. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::CUDD>().translateProgram(program);
  64. EXPECT_EQ(8607ul, model->getNumberOfStates());
  65. EXPECT_EQ(15113ul, model->getNumberOfTransitions());
  66. program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/leader-3-5.pm");
  67. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::CUDD>().translateProgram(program);
  68. EXPECT_EQ(273ul, model->getNumberOfStates());
  69. EXPECT_EQ(397ul, model->getNumberOfTransitions());
  70. program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/nand-5-2.pm");
  71. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::CUDD>().translateProgram(program);
  72. EXPECT_EQ(1728ul, model->getNumberOfStates());
  73. EXPECT_EQ(2505ul, model->getNumberOfTransitions());
  74. }
  75. TEST(DdPrismModelBuilderTest_Sylvan, Ctmc) {
  76. // Set the PRISM compatibility mode temporarily. It is set to its old value once the returned object is destructed.
  77. std::unique_ptr<storm::settings::SettingMemento> enablePrismCompatibility = storm::settings::mutableIOSettings().overridePrismCompatibilityMode(true);
  78. storm::prism::Program program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/cluster2.sm");
  79. std::shared_ptr<storm::models::symbolic::Model<storm::dd::DdType::Sylvan>> model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::Sylvan>().translateProgram(program);
  80. EXPECT_EQ(276ul, model->getNumberOfStates());
  81. EXPECT_EQ(1120ul, model->getNumberOfTransitions());
  82. program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/embedded2.sm");
  83. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::Sylvan>().translateProgram(program);
  84. EXPECT_EQ(3478ul, model->getNumberOfStates());
  85. EXPECT_EQ(14639ul, model->getNumberOfTransitions());
  86. program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/polling2.sm");
  87. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::Sylvan>().translateProgram(program);
  88. EXPECT_EQ(12ul, model->getNumberOfStates());
  89. EXPECT_EQ(22ul, model->getNumberOfTransitions());
  90. program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/fms2.sm");
  91. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::Sylvan>().translateProgram(program);
  92. EXPECT_EQ(810ul, model->getNumberOfStates());
  93. EXPECT_EQ(3699ul, model->getNumberOfTransitions());
  94. program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/tandem5.sm");
  95. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::Sylvan>().translateProgram(program);
  96. EXPECT_EQ(66ul, model->getNumberOfStates());
  97. EXPECT_EQ(189ul, model->getNumberOfTransitions());
  98. }
  99. TEST(DdPrismModelBuilderTest_Cudd, Ctmc) {
  100. // Set the PRISM compatibility mode temporarily. It is set to its old value once the returned object is destructed.
  101. std::unique_ptr<storm::settings::SettingMemento> enablePrismCompatibility = storm::settings::mutableIOSettings().overridePrismCompatibilityMode(true);
  102. storm::prism::Program program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/cluster2.sm");
  103. std::shared_ptr<storm::models::symbolic::Model<storm::dd::DdType::CUDD>> model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::CUDD>().translateProgram(program);
  104. EXPECT_EQ(276ul, model->getNumberOfStates());
  105. EXPECT_EQ(1120ul, model->getNumberOfTransitions());
  106. program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/embedded2.sm");
  107. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::CUDD>().translateProgram(program);
  108. EXPECT_EQ(3478ul, model->getNumberOfStates());
  109. EXPECT_EQ(14639ul, model->getNumberOfTransitions());
  110. program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/polling2.sm");
  111. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::CUDD>().translateProgram(program);
  112. EXPECT_EQ(12ul, model->getNumberOfStates());
  113. EXPECT_EQ(22ul, model->getNumberOfTransitions());
  114. program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/fms2.sm");
  115. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::CUDD>().translateProgram(program);
  116. EXPECT_EQ(810ul, model->getNumberOfStates());
  117. EXPECT_EQ(3699ul, model->getNumberOfTransitions());
  118. program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/tandem5.sm");
  119. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::CUDD>().translateProgram(program);
  120. EXPECT_EQ(66ul, model->getNumberOfStates());
  121. EXPECT_EQ(189ul, model->getNumberOfTransitions());
  122. }
  123. TEST(DdPrismModelBuilderTest_Sylvan, Mdp) {
  124. storm::prism::Program program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/two_dice.nm");
  125. std::shared_ptr<storm::models::symbolic::Model<storm::dd::DdType::Sylvan>> model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::Sylvan>().translateProgram(program);
  126. EXPECT_TRUE(model->getType() == storm::models::ModelType::Mdp);
  127. std::shared_ptr<storm::models::symbolic::Mdp<storm::dd::DdType::Sylvan>> mdp = model->as<storm::models::symbolic::Mdp<storm::dd::DdType::Sylvan>>();
  128. EXPECT_EQ(169ul, mdp->getNumberOfStates());
  129. EXPECT_EQ(436ul, mdp->getNumberOfTransitions());
  130. EXPECT_EQ(254ul, mdp->getNumberOfChoices());
  131. program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/leader3.nm");
  132. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::Sylvan>().translateProgram(program);
  133. EXPECT_TRUE(model->getType() == storm::models::ModelType::Mdp);
  134. mdp = model->as<storm::models::symbolic::Mdp<storm::dd::DdType::Sylvan>>();
  135. EXPECT_EQ(364ul, mdp->getNumberOfStates());
  136. EXPECT_EQ(654ul, mdp->getNumberOfTransitions());
  137. EXPECT_EQ(573ul, mdp->getNumberOfChoices());
  138. program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/coin2-2.nm");
  139. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::Sylvan>().translateProgram(program);
  140. EXPECT_TRUE(model->getType() == storm::models::ModelType::Mdp);
  141. mdp = model->as<storm::models::symbolic::Mdp<storm::dd::DdType::Sylvan>>();
  142. EXPECT_EQ(272ul, mdp->getNumberOfStates());
  143. EXPECT_EQ(492ul, mdp->getNumberOfTransitions());
  144. EXPECT_EQ(400ul, mdp->getNumberOfChoices());
  145. program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/csma2-2.nm");
  146. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::Sylvan>().translateProgram(program);
  147. EXPECT_TRUE(model->getType() == storm::models::ModelType::Mdp);
  148. mdp = model->as<storm::models::symbolic::Mdp<storm::dd::DdType::Sylvan>>();
  149. EXPECT_EQ(1038ul, mdp->getNumberOfStates());
  150. EXPECT_EQ(1282ul, mdp->getNumberOfTransitions());
  151. EXPECT_EQ(1054ul, mdp->getNumberOfChoices());
  152. program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/firewire3-0.5.nm");
  153. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::Sylvan>().translateProgram(program);
  154. EXPECT_TRUE(model->getType() == storm::models::ModelType::Mdp);
  155. mdp = model->as<storm::models::symbolic::Mdp<storm::dd::DdType::Sylvan>>();
  156. EXPECT_EQ(4093ul, mdp->getNumberOfStates());
  157. EXPECT_EQ(5585ul, mdp->getNumberOfTransitions());
  158. EXPECT_EQ(5519ul, mdp->getNumberOfChoices());
  159. program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/wlan0-2-2.nm");
  160. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::Sylvan>().translateProgram(program);
  161. EXPECT_TRUE(model->getType() == storm::models::ModelType::Mdp);
  162. mdp = model->as<storm::models::symbolic::Mdp<storm::dd::DdType::Sylvan>>();
  163. EXPECT_EQ(37ul, mdp->getNumberOfStates());
  164. EXPECT_EQ(59ul, mdp->getNumberOfTransitions());
  165. EXPECT_EQ(59ul, mdp->getNumberOfChoices());
  166. }
  167. TEST(DdPrismModelBuilderTest_Cudd, Mdp) {
  168. storm::prism::Program program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/two_dice.nm");
  169. std::shared_ptr<storm::models::symbolic::Model<storm::dd::DdType::CUDD>> model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::CUDD>().translateProgram(program);
  170. EXPECT_TRUE(model->getType() == storm::models::ModelType::Mdp);
  171. std::shared_ptr<storm::models::symbolic::Mdp<storm::dd::DdType::CUDD>> mdp = model->as<storm::models::symbolic::Mdp<storm::dd::DdType::CUDD>>();
  172. EXPECT_EQ(169ul, mdp->getNumberOfStates());
  173. EXPECT_EQ(436ul, mdp->getNumberOfTransitions());
  174. EXPECT_EQ(254ul, mdp->getNumberOfChoices());
  175. program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/leader3.nm");
  176. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::CUDD>().translateProgram(program);
  177. EXPECT_TRUE(model->getType() == storm::models::ModelType::Mdp);
  178. mdp = model->as<storm::models::symbolic::Mdp<storm::dd::DdType::CUDD>>();
  179. EXPECT_EQ(364ul, mdp->getNumberOfStates());
  180. EXPECT_EQ(654ul, mdp->getNumberOfTransitions());
  181. EXPECT_EQ(573ul, mdp->getNumberOfChoices());
  182. program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/coin2-2.nm");
  183. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::CUDD>().translateProgram(program);
  184. EXPECT_TRUE(model->getType() == storm::models::ModelType::Mdp);
  185. mdp = model->as<storm::models::symbolic::Mdp<storm::dd::DdType::CUDD>>();
  186. EXPECT_EQ(272ul, mdp->getNumberOfStates());
  187. EXPECT_EQ(492ul, mdp->getNumberOfTransitions());
  188. EXPECT_EQ(400ul, mdp->getNumberOfChoices());
  189. program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/csma2-2.nm");
  190. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::CUDD>().translateProgram(program);
  191. EXPECT_TRUE(model->getType() == storm::models::ModelType::Mdp);
  192. mdp = model->as<storm::models::symbolic::Mdp<storm::dd::DdType::CUDD>>();
  193. EXPECT_EQ(1038ul, mdp->getNumberOfStates());
  194. EXPECT_EQ(1282ul, mdp->getNumberOfTransitions());
  195. EXPECT_EQ(1054ul, mdp->getNumberOfChoices());
  196. program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/firewire3-0.5.nm");
  197. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::CUDD>().translateProgram(program);
  198. EXPECT_TRUE(model->getType() == storm::models::ModelType::Mdp);
  199. mdp = model->as<storm::models::symbolic::Mdp<storm::dd::DdType::CUDD>>();
  200. EXPECT_EQ(4093ul, mdp->getNumberOfStates());
  201. EXPECT_EQ(5585ul, mdp->getNumberOfTransitions());
  202. EXPECT_EQ(5519ul, mdp->getNumberOfChoices());
  203. program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/wlan0-2-2.nm");
  204. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::CUDD>().translateProgram(program);
  205. EXPECT_TRUE(model->getType() == storm::models::ModelType::Mdp);
  206. mdp = model->as<storm::models::symbolic::Mdp<storm::dd::DdType::CUDD>>();
  207. EXPECT_EQ(37ul, mdp->getNumberOfStates());
  208. EXPECT_EQ(59ul, mdp->getNumberOfTransitions());
  209. EXPECT_EQ(59ul, mdp->getNumberOfChoices());
  210. }
  211. TEST(DdPrismModelBuilderTest_Sylvan, Composition) {
  212. storm::prism::Program program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/system_composition.nm");
  213. std::shared_ptr<storm::models::symbolic::Model<storm::dd::DdType::Sylvan>> model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::Sylvan>().translateProgram(program);
  214. EXPECT_TRUE(model->getType() == storm::models::ModelType::Mdp);
  215. std::shared_ptr<storm::models::symbolic::Mdp<storm::dd::DdType::Sylvan>> mdp = model->as<storm::models::symbolic::Mdp<storm::dd::DdType::Sylvan>>();
  216. EXPECT_EQ(21ul, mdp->getNumberOfStates());
  217. EXPECT_EQ(61ul, mdp->getNumberOfTransitions());
  218. EXPECT_EQ(61ul, mdp->getNumberOfChoices());
  219. program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/system_composition2.nm");
  220. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::Sylvan>().translateProgram(program);
  221. EXPECT_TRUE(model->getType() == storm::models::ModelType::Mdp);
  222. mdp = model->as<storm::models::symbolic::Mdp<storm::dd::DdType::Sylvan>>();
  223. EXPECT_EQ(8ul, mdp->getNumberOfStates());
  224. EXPECT_EQ(21ul, mdp->getNumberOfTransitions());
  225. EXPECT_EQ(21ul, mdp->getNumberOfChoices());
  226. }
  227. TEST(DdPrismModelBuilderTest_Cudd, Composition) {
  228. storm::prism::Program program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/system_composition.nm");
  229. std::shared_ptr<storm::models::symbolic::Model<storm::dd::DdType::CUDD>> model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::CUDD>().translateProgram(program);
  230. EXPECT_TRUE(model->getType() == storm::models::ModelType::Mdp);
  231. std::shared_ptr<storm::models::symbolic::Mdp<storm::dd::DdType::CUDD>> mdp = model->as<storm::models::symbolic::Mdp<storm::dd::DdType::CUDD>>();
  232. EXPECT_EQ(21ul, mdp->getNumberOfStates());
  233. EXPECT_EQ(61ul, mdp->getNumberOfTransitions());
  234. EXPECT_EQ(61ul, mdp->getNumberOfChoices());
  235. program = storm::parser::PrismParser::parse(STORM_CPP_TESTS_BASE_PATH "/functional/builder/system_composition2.nm");
  236. model = storm::builder::DdPrismModelBuilder<storm::dd::DdType::CUDD>().translateProgram(program);
  237. EXPECT_TRUE(model->getType() == storm::models::ModelType::Mdp);
  238. mdp = model->as<storm::models::symbolic::Mdp<storm::dd::DdType::CUDD>>();
  239. EXPECT_EQ(8ul, mdp->getNumberOfStates());
  240. EXPECT_EQ(21ul, mdp->getNumberOfTransitions());
  241. EXPECT_EQ(21ul, mdp->getNumberOfChoices());
  242. }