1#include "storm-config.h"
24#ifndef STORM_HAVE_CUDD
25 GTEST_SKIP() <<
"Library CUDD not available.";
35#ifndef STORM_HAVE_SYLVAN
36 GTEST_SKIP() <<
"Library Sylvan not available.";
43template<
typename TestType>
44class DdJaniModelBuilderTest :
public ::testing::Test {
46 void SetUp()
override {
47 TestType::checkLibraryAvailable();
50 storm::jani::Model getJaniModelFromPrism(std::string
const& pathInTestResourcesDir,
bool prismCompatability =
false) {
51 storm::storage::SymbolicModelDescription modelDescription =
55 EXPECT_TRUE(unsupportedFeatures.empty()) <<
"Model '" << pathInTestResourcesDir <<
"' uses unsupported feature(s) " << unsupportedFeatures.
toString();
68 auto janiModel = this->getJaniModelFromPrism(
"/dtmc/die.pm");
71 std::shared_ptr<storm::models::symbolic::Model<DdType>> model = builder.
build(env, janiModel);
72 EXPECT_EQ(13ul, model->getNumberOfStates());
73 EXPECT_EQ(20ul, model->getNumberOfTransitions());
75 janiModel = this->getJaniModelFromPrism(
"/dtmc/brp-16-2.pm");
76 model = builder.
build(env, janiModel);
77 EXPECT_EQ(677ul, model->getNumberOfStates());
78 EXPECT_EQ(867ul, model->getNumberOfTransitions());
80 janiModel = this->getJaniModelFromPrism(
"/dtmc/crowds-5-5.pm");
81 model = builder.
build(env, janiModel);
82 EXPECT_EQ(8607ul, model->getNumberOfStates());
83 EXPECT_EQ(15113ul, model->getNumberOfTransitions());
85 janiModel = this->getJaniModelFromPrism(
"/dtmc/leader-3-5.pm");
86 model = builder.
build(env, janiModel);
87 EXPECT_EQ(273ul, model->getNumberOfStates());
88 EXPECT_EQ(397ul, model->getNumberOfTransitions());
90 janiModel = this->getJaniModelFromPrism(
"/dtmc/nand-5-2.pm");
91 model = builder.
build(env, janiModel);
92 EXPECT_EQ(1728ul, model->getNumberOfStates());
93 EXPECT_EQ(2505ul, model->getNumberOfTransitions());
99 auto janiModel = this->getJaniModelFromPrism(
"/ctmc/cluster2.sm",
true);
101 std::shared_ptr<storm::models::symbolic::Model<DdType>> model = builder.
build(env, janiModel);
102 EXPECT_EQ(276ul, model->getNumberOfStates());
103 EXPECT_EQ(1120ul, model->getNumberOfTransitions());
105 janiModel = this->getJaniModelFromPrism(
"/ctmc/embedded2.sm",
true);
106 model = builder.
build(env, janiModel);
107 EXPECT_EQ(3478ul, model->getNumberOfStates());
108 EXPECT_EQ(14639ul, model->getNumberOfTransitions());
110 janiModel = this->getJaniModelFromPrism(
"/ctmc/polling2.sm",
true);
111 model = builder.
build(env, janiModel);
112 EXPECT_EQ(12ul, model->getNumberOfStates());
113 EXPECT_EQ(22ul, model->getNumberOfTransitions());
115 janiModel = this->getJaniModelFromPrism(
"/ctmc/fms2.sm",
true);
116 model = builder.
build(env, janiModel);
117 EXPECT_EQ(810ul, model->getNumberOfStates());
118 EXPECT_EQ(3699ul, model->getNumberOfTransitions());
120 janiModel = this->getJaniModelFromPrism(
"/ctmc/tandem5.sm",
true);
121 model = builder.
build(env, janiModel);
122 EXPECT_EQ(66ul, model->getNumberOfStates());
123 EXPECT_EQ(189ul, model->getNumberOfTransitions());
129 auto janiModel = this->getJaniModelFromPrism(
"/mdp/two_dice.nm");
131 std::shared_ptr<storm::models::symbolic::Model<DdType>> model = builder.
build(env, janiModel);
134 std::shared_ptr<storm::models::symbolic::Mdp<DdType>> mdp = model->template as<storm::models::symbolic::Mdp<DdType>>();
136 EXPECT_EQ(169ul, mdp->getNumberOfStates());
137 EXPECT_EQ(436ul, mdp->getNumberOfTransitions());
138 EXPECT_EQ(254ul, mdp->getNumberOfChoices());
140 janiModel = this->getJaniModelFromPrism(
"/mdp/leader3.nm");
141 model = builder.
build(env, janiModel);
144 mdp = model->template as<storm::models::symbolic::Mdp<DdType>>();
146 EXPECT_EQ(364ul, mdp->getNumberOfStates());
147 EXPECT_EQ(654ul, mdp->getNumberOfTransitions());
148 EXPECT_EQ(573ul, mdp->getNumberOfChoices());
150 janiModel = this->getJaniModelFromPrism(
"/mdp/coin2-2.nm");
151 model = builder.
build(env, janiModel);
154 mdp = model->template as<storm::models::symbolic::Mdp<DdType>>();
156 EXPECT_EQ(272ul, mdp->getNumberOfStates());
157 EXPECT_EQ(492ul, mdp->getNumberOfTransitions());
158 EXPECT_EQ(400ul, mdp->getNumberOfChoices());
160 janiModel = this->getJaniModelFromPrism(
"/mdp/csma2-2.nm");
161 model = builder.
build(env, janiModel);
164 mdp = model->template as<storm::models::symbolic::Mdp<DdType>>();
166 EXPECT_EQ(1038ul, mdp->getNumberOfStates());
167 EXPECT_EQ(1282ul, mdp->getNumberOfTransitions());
168 EXPECT_EQ(1054ul, mdp->getNumberOfChoices());
170 janiModel = this->getJaniModelFromPrism(
"/mdp/firewire3-0.5.nm");
171 model = builder.
build(env, janiModel);
174 mdp = model->template as<storm::models::symbolic::Mdp<DdType>>();
176 EXPECT_EQ(4093ul, mdp->getNumberOfStates());
177 EXPECT_EQ(5585ul, mdp->getNumberOfTransitions());
178 EXPECT_EQ(5519ul, mdp->getNumberOfChoices());
180 janiModel = this->getJaniModelFromPrism(
"/mdp/wlan0-2-2.nm");
181 model = builder.
build(env, janiModel);
184 mdp = model->template as<storm::models::symbolic::Mdp<DdType>>();
186 EXPECT_EQ(37ul, mdp->getNumberOfStates());
187 EXPECT_EQ(59ul, mdp->getNumberOfTransitions());
188 EXPECT_EQ(59ul, mdp->getNumberOfChoices());
190 janiModel = this->getJaniModelFromPrism(
"/mdp/sync.nm");
191 model = builder.
build(env, janiModel);
194 mdp = model->template as<storm::models::symbolic::Mdp<DdType>>();
196 EXPECT_EQ(5ul, mdp->getNumberOfStates());
197 EXPECT_EQ(24ul, mdp->getNumberOfTransitions());
198 EXPECT_EQ(12ul, mdp->getNumberOfChoices());
201TYPED_TEST(DdJaniModelBuilderTest, SynchronizationVectors) {
204 auto janiModel = this->getJaniModelFromPrism(
"/mdp/SmallPrismTest.nm");
209 std::shared_ptr<storm::models::symbolic::Model<DdType>> model = builder.
build(env, janiModel);
210 EXPECT_EQ(7ul, model->getNumberOfStates());
211 EXPECT_EQ(10ul, model->getNumberOfTransitions());
214 std::vector<std::shared_ptr<storm::jani::Composition>> automataCompositions;
215 automataCompositions.push_back(std::make_shared<storm::jani::AutomatonComposition>(
"one"));
216 automataCompositions.push_back(std::make_shared<storm::jani::AutomatonComposition>(
"two"));
217 automataCompositions.push_back(std::make_shared<storm::jani::AutomatonComposition>(
"three"));
220 std::vector<storm::jani::SynchronizationVector> synchronizationVectors;
222 std::vector<std::string> inputVector;
223 inputVector.push_back(
"a");
226 synchronizationVectors.emplace_back(inputVector);
228 inputVector.push_back(
"c");
231 synchronizationVectors.emplace_back(inputVector);
233 inputVector.push_back(
"d");
236 synchronizationVectors.emplace_back(inputVector);
239 inputVector.push_back(
"b");
241 synchronizationVectors.emplace_back(inputVector);
244 inputVector.push_back(
"c");
246 synchronizationVectors.emplace_back(inputVector);
250 inputVector.push_back(
"c");
251 synchronizationVectors.emplace_back(inputVector);
254 std::shared_ptr<storm::jani::Composition> newComposition = std::make_shared<storm::jani::ParallelComposition>(automataCompositions, synchronizationVectors);
255 janiModel.setSystemComposition(newComposition);
256 model = builder.
build(env, janiModel);
257 EXPECT_EQ(24ul, model->getNumberOfStates());
258 EXPECT_EQ(48ul, model->getNumberOfTransitions());
261 synchronizationVectors.clear();
263 inputVector.push_back(
"a");
264 inputVector.push_back(
"b");
265 inputVector.push_back(
"c");
266 synchronizationVectors.emplace_back(inputVector,
"d");
268 inputVector.push_back(
"c");
271 synchronizationVectors.emplace_back(inputVector);
273 inputVector.push_back(
"d");
276 synchronizationVectors.emplace_back(inputVector);
279 inputVector.push_back(
"c");
281 synchronizationVectors.emplace_back(inputVector);
283 newComposition = std::make_shared<storm::jani::ParallelComposition>(automataCompositions, synchronizationVectors);
284 janiModel.setSystemComposition(newComposition);
285 model = builder.
build(env, janiModel);
286 EXPECT_EQ(7ul, model->getNumberOfStates());
287 EXPECT_EQ(10ul, model->getNumberOfTransitions());
289 synchronizationVectors.clear();
291 inputVector.push_back(
"a");
292 inputVector.push_back(
"b");
293 inputVector.push_back(
"c");
294 synchronizationVectors.emplace_back(inputVector,
"d");
296 inputVector.push_back(
"c");
297 inputVector.push_back(
"c");
298 inputVector.push_back(
"a");
299 synchronizationVectors.emplace_back(inputVector,
"d");
301 inputVector.push_back(
"d");
304 synchronizationVectors.emplace_back(inputVector);
305 newComposition = std::make_shared<storm::jani::ParallelComposition>(automataCompositions, synchronizationVectors);
306 janiModel.setSystemComposition(newComposition);
307 model = builder.
build(env, janiModel);
308 EXPECT_EQ(3ul, model->getNumberOfStates());
309 EXPECT_EQ(3ul, model->getNumberOfTransitions());
311 synchronizationVectors.clear();
313 inputVector.push_back(
"a");
314 inputVector.push_back(
"b");
315 inputVector.push_back(
"c");
316 synchronizationVectors.emplace_back(inputVector,
"d");
318 inputVector.push_back(
"c");
319 inputVector.push_back(
"c");
320 inputVector.push_back(
"a");
321 synchronizationVectors.emplace_back(inputVector,
"d");
323 inputVector.push_back(
"d");
326 synchronizationVectors.emplace_back(inputVector);
328 inputVector.push_back(
"d");
329 inputVector.push_back(
"c");
331 synchronizationVectors.emplace_back(inputVector,
"b");
332 newComposition = std::make_shared<storm::jani::ParallelComposition>(automataCompositions, synchronizationVectors);
333 janiModel.setSystemComposition(newComposition);
334 model = builder.
build(env, janiModel);
335 EXPECT_EQ(4ul, model->getNumberOfStates());
336 EXPECT_EQ(5ul, model->getNumberOfTransitions());
339TYPED_TEST(DdJaniModelBuilderTest, Composition) {
342 auto janiModel = this->getJaniModelFromPrism(
"/mdp/system_composition.nm");
346 storm::exceptions::WrongFormatException);
348 janiModel = this->getJaniModelFromPrism(
"/mdp/system_composition2.nm");
350 storm::exceptions::WrongFormatException);
353TYPED_TEST(DdJaniModelBuilderTest, InputEnabling) {
356 auto janiModel = this->getJaniModelFromPrism(
"/mdp/SmallPrismTest2.nm");
361 std::vector<std::shared_ptr<storm::jani::Composition>> automataCompositions;
362 automataCompositions.push_back(std::make_shared<storm::jani::AutomatonComposition>(
"one"));
363 automataCompositions.push_back(std::make_shared<storm::jani::AutomatonComposition>(
"two"));
364 automataCompositions.push_back(std::make_shared<storm::jani::AutomatonComposition>(
"three", std::set<std::string>{
"a"}));
367 std::vector<storm::jani::SynchronizationVector> synchronizationVectors;
368 std::vector<std::string> inputVector;
369 inputVector.push_back(
"a");
370 inputVector.push_back(
"b");
371 inputVector.push_back(
"c");
372 synchronizationVectors.emplace_back(inputVector,
"d");
374 inputVector.push_back(
"c");
375 inputVector.push_back(
"c");
376 inputVector.push_back(
"a");
377 synchronizationVectors.emplace_back(inputVector,
"d");
379 inputVector.push_back(
"d");
382 synchronizationVectors.emplace_back(inputVector);
384 std::shared_ptr<storm::jani::Composition> newComposition = std::make_shared<storm::jani::ParallelComposition>(automataCompositions, synchronizationVectors);
385 janiModel.setSystemComposition(newComposition);
386 std::shared_ptr<storm::models::symbolic::Model<DdType>> model = builder.
build(env, janiModel);
387 EXPECT_EQ(4ul, model->getNumberOfStates());
388 EXPECT_EQ(5ul, model->getNumberOfTransitions());
storm::models::sparse::Dtmc< double > Dtmc
storm::models::sparse::Mdp< double > Mdp
static void checkLibraryAvailable()
static const storm::dd::DdType DdType
static const storm::dd::DdType DdType
static void checkLibraryAvailable()
std::shared_ptr< storm::models::symbolic::Model< Type, ValueType > > build(storm::Environment const &env, storm::jani::Model const &model, Options const &options=Options())
Translates the given program into a symbolic model (i.e.
static storm::jani::ModelFeatures getSupportedJaniFeatures()
Returns the jani features with which this builder can deal natively.
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.
static const std::string NO_ACTION_INPUT
Base class for all symbolic models.
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.
SymbolicModelDescription toJani(bool makeVariablesGlobal=true) const
storm::jani::Model const & asJaniModel() const
SymbolicModelDescription preprocess(std::string const &constantDefinitionString="") const
TYPED_TEST(GraphTestAR, SymbolicProb01StochasticGameDieSmall)
TYPED_TEST_SUITE(GraphTestAR, TestingTypes,)
::testing::Types< Cudd, Sylvan > TestingTypes
#define STORM_SILENT_EXPECT_THROW(statement, expected_exception)