Storm 1.11.1.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
ExplicitJaniModelBuilderTest.cpp
Go to the documentation of this file.
1#include "storm-config.h"
2#include "test/storm_gtest.h"
3
6#include "storm/api/storm.h"
14#include "storm/utility/cli.h"
15
16namespace {
17
18storm::jani::Model getJaniModelFromPrism(std::string const& pathInTestResourcesDir, bool prismCompatability = false) {
20 storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/" + pathInTestResourcesDir, prismCompatability);
21 auto m = modelDescription.toJani().preprocess().asJaniModel();
23 EXPECT_TRUE(unsupportedFeatures.empty()) << "Model '" << pathInTestResourcesDir << "' uses unsupported feature(s) " << unsupportedFeatures.toString();
24 return m;
25}
26
27class ExplicitJaniModelBuilderTest : public ::testing::Test {
28 protected:
29 void SetUp() override {
30#ifndef STORM_HAVE_Z3
31 GTEST_SKIP() << "Z3 not available.";
32#endif
33 }
34};
35
36TEST_F(ExplicitJaniModelBuilderTest, Dtmc) {
37 auto janiModel = getJaniModelFromPrism("/dtmc/die.pm");
38
39 std::shared_ptr<storm::models::sparse::Model<double>> model = storm::builder::ExplicitModelBuilder<double>(janiModel).build();
40 EXPECT_EQ(13ul, model->getNumberOfStates());
41 EXPECT_EQ(20ul, model->getNumberOfTransitions());
42
43 janiModel = storm::api::parseJaniModel(STORM_TEST_RESOURCES_DIR "/dtmc/die_array.jani").first;
45 EXPECT_EQ(13ul, model->getNumberOfStates());
46 EXPECT_EQ(20ul, model->getNumberOfTransitions());
47
48 janiModel = storm::api::parseJaniModel(STORM_TEST_RESOURCES_DIR "/dtmc/die_array_nested.jani").first;
50 EXPECT_EQ(13ul, model->getNumberOfStates());
51 EXPECT_EQ(20ul, model->getNumberOfTransitions());
52
53 janiModel = getJaniModelFromPrism("/dtmc/brp-16-2.pm");
55 EXPECT_EQ(677ul, model->getNumberOfStates());
56 EXPECT_EQ(867ul, model->getNumberOfTransitions());
57
58 janiModel = getJaniModelFromPrism("/dtmc/crowds-5-5.pm");
60 EXPECT_EQ(8607ul, model->getNumberOfStates());
61 EXPECT_EQ(15113ul, model->getNumberOfTransitions());
62
63 janiModel = getJaniModelFromPrism("/dtmc/leader-3-5.pm");
65 EXPECT_EQ(273ul, model->getNumberOfStates());
66 EXPECT_EQ(397ul, model->getNumberOfTransitions());
67
68 janiModel = getJaniModelFromPrism("/dtmc/nand-5-2.pm");
70 EXPECT_EQ(1728ul, model->getNumberOfStates());
71 EXPECT_EQ(2505ul, model->getNumberOfTransitions());
72
73 janiModel = storm::api::parseJaniModel(STORM_TEST_RESOURCES_DIR "/dtmc/test_trigonometry.jani").first;
74 auto constants = storm::utility::cli::parseConstantDefinitionString(janiModel.getManager(), "step_size_rad=0.523599"); // step_size = 30 deg
75 janiModel = janiModel.defineUndefinedConstants(constants);
77 EXPECT_EQ(5ul, model->getNumberOfStates());
78 EXPECT_EQ(5ul, model->getNumberOfTransitions());
79}
80
81TEST_F(ExplicitJaniModelBuilderTest, pdtmc) {
82 auto janiModel = getJaniModelFromPrism("/pdtmc/parametric_die.pm");
83 std::shared_ptr<storm::models::sparse::Model<storm::RationalFunction>> model =
85 EXPECT_EQ(13ul, model->getNumberOfStates());
86 EXPECT_EQ(20ul, model->getNumberOfTransitions());
87
88 janiModel = storm::api::parseJaniModel(STORM_TEST_RESOURCES_DIR "/pdtmc/die_array_nested.jani").first;
89 janiModel.substituteConstantsFunctionsTranscendentals();
91 EXPECT_EQ(13ul, model->getNumberOfStates());
92 EXPECT_EQ(20ul, model->getNumberOfTransitions());
93
94 janiModel = getJaniModelFromPrism("/pdtmc/brp16_2.pm");
96 EXPECT_EQ(677ul, model->getNumberOfStates());
97 EXPECT_EQ(867ul, model->getNumberOfTransitions());
98}
99
100TEST_F(ExplicitJaniModelBuilderTest, Ctmc) {
101 auto janiModel = getJaniModelFromPrism("/ctmc/cluster2.sm", true);
102
103 std::shared_ptr<storm::models::sparse::Model<double>> model = storm::builder::ExplicitModelBuilder<double>(janiModel).build();
104 EXPECT_EQ(276ul, model->getNumberOfStates());
105 EXPECT_EQ(1120ul, model->getNumberOfTransitions());
106
107 janiModel = getJaniModelFromPrism("/ctmc/embedded2.sm", true);
109 EXPECT_EQ(3478ul, model->getNumberOfStates());
110 EXPECT_EQ(14639ul, model->getNumberOfTransitions());
111
112 janiModel = getJaniModelFromPrism("/ctmc/polling2.sm", true);
114 EXPECT_EQ(12ul, model->getNumberOfStates());
115 EXPECT_EQ(22ul, model->getNumberOfTransitions());
116
117 janiModel = getJaniModelFromPrism("/ctmc/fms2.sm", true);
119 EXPECT_EQ(810ul, model->getNumberOfStates());
120 EXPECT_EQ(3699ul, model->getNumberOfTransitions());
121
122 janiModel = getJaniModelFromPrism("/ctmc/tandem5.sm", true);
124 EXPECT_EQ(66ul, model->getNumberOfStates());
125 EXPECT_EQ(189ul, model->getNumberOfTransitions());
126}
127
128TEST_F(ExplicitJaniModelBuilderTest, Mdp) {
129 auto janiModel = getJaniModelFromPrism("/mdp/two_dice.nm");
130
131 std::shared_ptr<storm::models::sparse::Model<double>> model = storm::builder::ExplicitModelBuilder<double>(janiModel).build();
132 EXPECT_EQ(169ul, model->getNumberOfStates());
133 EXPECT_EQ(436ul, model->getNumberOfTransitions());
134
135 janiModel = getJaniModelFromPrism("/mdp/leader3.nm");
137 EXPECT_EQ(364ul, model->getNumberOfStates());
138 EXPECT_EQ(654ul, model->getNumberOfTransitions());
139
140 janiModel = getJaniModelFromPrism("/mdp/coin2-2.nm");
142 EXPECT_EQ(272ul, model->getNumberOfStates());
143 EXPECT_EQ(492ul, model->getNumberOfTransitions());
144
145 janiModel = getJaniModelFromPrism("/mdp/csma2-2.nm");
147 EXPECT_EQ(1038ul, model->getNumberOfStates());
148 EXPECT_EQ(1282ul, model->getNumberOfTransitions());
149
150 janiModel = getJaniModelFromPrism("/mdp/firewire3-0.5.nm");
152 EXPECT_EQ(4093ul, model->getNumberOfStates());
153 EXPECT_EQ(5585ul, model->getNumberOfTransitions());
154
155 janiModel = getJaniModelFromPrism("/mdp/wlan0-2-2.nm");
157 EXPECT_EQ(37ul, model->getNumberOfStates());
158 EXPECT_EQ(59ul, model->getNumberOfTransitions());
159
160 janiModel = getJaniModelFromPrism("/mdp/sync.nm");
162 EXPECT_EQ(5ul, model->getNumberOfStates());
163 EXPECT_EQ(24ul, model->getNumberOfTransitions());
164 EXPECT_EQ(12ul, model->getNumberOfChoices());
165
166 janiModel = storm::api::parseJaniModel(STORM_TEST_RESOURCES_DIR "/mdp/tiny_rewards.jani").first;
168 options.setBuildChoiceLabels();
169 model = storm::builder::ExplicitModelBuilder<double>(janiModel, options).build();
170 EXPECT_EQ(2ul, model->getChoiceLabeling().getNumberOfLabels());
171
172 janiModel = storm::api::parseJaniModel(STORM_TEST_RESOURCES_DIR "/mdp/tiny_rewards4.jani").first;
173 options.setBuildChoiceLabels();
174 model = storm::builder::ExplicitModelBuilder<double>(janiModel, options).build();
175 EXPECT_EQ(2ul, model->getChoiceLabeling().getNumberOfLabels());
176}
177
178TEST_F(ExplicitJaniModelBuilderTest, Ma) {
179 auto janiModel = getJaniModelFromPrism("/ma/simple.ma");
180
181 std::shared_ptr<storm::models::sparse::Model<double>> model = storm::builder::ExplicitModelBuilder<double>(janiModel).build();
182 EXPECT_EQ(5ul, model->getNumberOfStates());
183 EXPECT_EQ(8ul, model->getNumberOfTransitions());
184 ASSERT_TRUE(model->isOfType(storm::models::ModelType::MarkovAutomaton));
186
187 janiModel = getJaniModelFromPrism("/ma/hybrid_states.ma");
189 EXPECT_EQ(5ul, model->getNumberOfStates());
190 EXPECT_EQ(13ul, model->getNumberOfTransitions());
191 ASSERT_TRUE(model->isOfType(storm::models::ModelType::MarkovAutomaton));
193
194 janiModel = getJaniModelFromPrism("/ma/stream2.ma");
196 EXPECT_EQ(12ul, model->getNumberOfStates());
197 EXPECT_EQ(14ul, model->getNumberOfTransitions());
198 ASSERT_TRUE(model->isOfType(storm::models::ModelType::MarkovAutomaton));
200
201 janiModel = storm::api::parseJaniModel(STORM_TEST_RESOURCES_DIR "/ma/ftwc.jani").first;
202 auto constants = storm::utility::cli::parseConstantDefinitionString(janiModel.getManager(), "N=2,TIME_BOUND=1");
203 janiModel = janiModel.defineUndefinedConstants(constants);
205 EXPECT_EQ(1536ul, model->getNumberOfStates());
206 EXPECT_EQ(6448ul, model->getNumberOfTransitions());
207 ASSERT_TRUE(model->isOfType(storm::models::ModelType::MarkovAutomaton));
209}
210
211TEST_F(ExplicitJaniModelBuilderTest, FailComposition) {
212 auto janiModel = getJaniModelFromPrism("/mdp/system_composition.nm");
213
214 STORM_SILENT_ASSERT_THROW(storm::builder::ExplicitModelBuilder<double>(janiModel).build(), storm::exceptions::WrongFormatException);
215}
216
217TEST_F(ExplicitJaniModelBuilderTest, unassignedVariables) {
218 storm::jani::Model janiModel = storm::api::parseJaniModel(STORM_TEST_RESOURCES_DIR "/mdp/unassigned-variables.jani").first;
219 std::shared_ptr<storm::models::sparse::Model<double>> model = storm::builder::ExplicitModelBuilder<double>(janiModel).build();
220 EXPECT_EQ(25ul, model->getNumberOfStates());
221 EXPECT_EQ(81ul, model->getNumberOfTransitions());
222}
223
224TEST_F(ExplicitJaniModelBuilderTest, enumerateInitial) {
225 storm::jani::Model janiModel = storm::api::parseJaniModel(STORM_TEST_RESOURCES_DIR "/mdp/enumerate_init.jani").first;
226 std::shared_ptr<storm::models::sparse::Model<double>> model = storm::builder::ExplicitModelBuilder<double>(janiModel).build();
227 EXPECT_EQ(94ul, model->getNumberOfStates());
228 EXPECT_EQ(145ul, model->getNumberOfTransitions());
229 EXPECT_EQ(72ul, model->getInitialStates().getNumberOfSetBits());
230}
231} // namespace
TEST_F(AssumptionCheckerTest, Brp_no_bisimulation)
BuilderOptions & setBuildChoiceLabels(bool newValue=true)
Should the choice labels be built?
std::shared_ptr< storm::models::sparse::Model< ValueType, RewardModelType > > build()
Convert the program given at construction time to an abstract model.
std::string toString() const
ModelFeatures restrictToFeatures(ModelFeatures const &modelFeatures)
Attempts to eliminate all features of this model that are not in the given set of features.
Definition Model.cpp:1243
This class represents a discrete-time Markov chain.
Definition Dtmc.h:13
This class represents a Markov automaton.
storm::storage::BitVector const & getMarkovianStates() const
Retrieves the set of Markovian states of the model.
This class represents a (discrete-time) Markov decision process.
Definition Mdp.h:13
static storm::prism::Program parse(std::string const &filename, bool prismCompatability=false)
Parses the given file into the PRISM storage classes assuming it complies with the PRISM syntax.
uint64_t getNumberOfSetBits() const
Returns the number of bits that are set to true in this bit vector.
SymbolicModelDescription toJani(bool makeVariablesGlobal=true) const
storm::jani::Model const & asJaniModel() const
SymbolicModelDescription preprocess(std::string const &constantDefinitionString="") const
std::pair< storm::jani::Model, std::vector< storm::jani::Property > > parseJaniModel(std::string const &filename, boost::optional< std::vector< std::string > > const &propertyFilter)
std::map< storm::expressions::Variable, storm::expressions::Expression > parseConstantDefinitionString(storm::expressions::ExpressionManager const &manager, std::string const &constantDefinitionString)
Definition cli.cpp:20
#define STORM_SILENT_ASSERT_THROW(statement, expected_exception)
Definition storm_gtest.h:26