1#include "storm-config.h"
22class DoubleViEnvironment {
33class DoubleSoundViEnvironment {
45class DoublePIEnvironment {
56class RationalPIEnvironment {
75template<
typename TestType>
76class SchedulerGenerationMdpPrctlModelCheckerTest :
public ::testing::Test {
78 typedef typename TestType::ValueType
ValueType;
79 SchedulerGenerationMdpPrctlModelCheckerTest() : _environment(TestType::createEnvironment()) {}
81 void SetUp()
override {
83 GTEST_SKIP() <<
"Z3 not available.";
91 std::pair<std::shared_ptr<storm::models::sparse::Mdp<ValueType>>, std::vector<std::shared_ptr<storm::logic::Formula const>>> buildModelFormulas(
92 std::string
const& pathToPrismFile, std::string
const& formulasAsString, std::string
const& constantDefinitionString =
"")
const {
93 std::pair<std::shared_ptr<storm::models::sparse::Mdp<ValueType>>, std::vector<std::shared_ptr<storm::logic::Formula const>>> result;
97 result.first = storm::api::buildSparseModel<ValueType>(program, result.second)->template as<storm::models::sparse::Mdp<ValueType>>();
101 std::vector<storm::modelchecker::CheckTask<storm::logic::Formula, ValueType>> getTasks(
102 std::vector<std::shared_ptr<storm::logic::Formula const>>
const& formulas)
const {
103 std::vector<storm::modelchecker::CheckTask<storm::logic::Formula, ValueType>> result;
104 for (
auto const& f : formulas) {
105 result.emplace_back(*f);
106 result.back().setProduceSchedulers(
true);
112 return storm::utility::convertNumber<ValueType>(input);
119typedef ::testing::Types<DoubleViEnvironment, DoubleSoundViEnvironment, DoublePIEnvironment, RationalPIEnvironment
126TYPED_TEST(SchedulerGenerationMdpPrctlModelCheckerTest, reachability) {
127 typedef typename TestFixture::ValueType
ValueType;
129 std::string formulasString =
"Pmin=? [F \"target\"]; Pmax=? [F \"target\"];";
130 auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/mdp/scheduler_generation.nm", formulasString);
131 auto mdp = std::move(modelFormulas.first);
132 auto tasks = this->getTasks(modelFormulas.second);
133 EXPECT_EQ(4ull, mdp->getNumberOfStates());
134 EXPECT_EQ(11ull, mdp->getNumberOfTransitions());
136 EXPECT_EQ(7ull, mdp->getNumberOfChoices());
140 auto result = checker.check(this->env(), tasks[0]);
141 ASSERT_TRUE(result->isExplicitQuantitativeCheckResult());
142 ASSERT_TRUE(result->template asExplicitQuantitativeCheckResult<ValueType>().hasScheduler());
144 EXPECT_EQ(0ull, scheduler.
getChoice(0).getDeterministicChoice());
145 EXPECT_EQ(1ull, scheduler.
getChoice(1).getDeterministicChoice());
146 EXPECT_EQ(0ull, scheduler.
getChoice(2).getDeterministicChoice());
147 EXPECT_EQ(0ull, scheduler.
getChoice(3).getDeterministicChoice());
149 result = checker.check(tasks[1]);
150 ASSERT_TRUE(result->isExplicitQuantitativeCheckResult());
151 ASSERT_TRUE(result->template asExplicitQuantitativeCheckResult<ValueType>().hasScheduler());
153 EXPECT_EQ(1ull, scheduler2.
getChoice(0).getDeterministicChoice());
154 EXPECT_EQ(2ull, scheduler2.
getChoice(1).getDeterministicChoice());
155 EXPECT_EQ(0ull, scheduler2.
getChoice(2).getDeterministicChoice());
156 EXPECT_EQ(0ull, scheduler2.
getChoice(3).getDeterministicChoice());
159TYPED_TEST(SchedulerGenerationMdpPrctlModelCheckerTest, total_reward) {
160 typedef typename TestFixture::ValueType
ValueType;
162 std::string formulasString =
"Rmin=? [ C ];";
164 auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/mdp/tiny_rewards.nm", formulasString);
165 auto mdp = std::move(modelFormulas.first);
166 auto tasks = this->getTasks(modelFormulas.second);
167 EXPECT_EQ(3ul, mdp->getNumberOfStates());
168 EXPECT_EQ(4ul, mdp->getNumberOfTransitions());
169 EXPECT_EQ(4ul, mdp->getNumberOfChoices());
174 auto result = checker.check(this->env(), tasks[0]);
175 ASSERT_TRUE(result->isExplicitQuantitativeCheckResult());
176 EXPECT_NEAR(this->
parseNumber(
"0"), result->template asExplicitQuantitativeCheckResult<ValueType>()[*mdp->getInitialStates().begin()],
177 storm::utility::convertNumber<ValueType>(this->env().solver().minMax().getPrecision()));
178 ASSERT_TRUE(result->template asExplicitQuantitativeCheckResult<ValueType>().hasScheduler());
184 auto inducedModel = mdp->applyScheduler(scheduler);
186 auto const& inducedDtmc = inducedModel->template as<storm::models::sparse::Dtmc<ValueType>>();
187 EXPECT_EQ(inducedDtmc->getNumberOfChoices(), inducedDtmc->getNumberOfStates());
189 auto inducedResult = inducedChecker.check(this->env(), tasks[0]);
190 ASSERT_TRUE(inducedResult->isExplicitQuantitativeCheckResult());
191 EXPECT_NEAR(this->
parseNumber(
"0"), inducedResult->template asExplicitQuantitativeCheckResult<ValueType>()[*mdp->getInitialStates().begin()],
192 storm::utility::convertNumber<ValueType>(this->env().solver().minMax().getPrecision()));
196TYPED_TEST(SchedulerGenerationMdpPrctlModelCheckerTest, reach_reward) {
198 typedef typename TestFixture::ValueType
ValueType;
200 std::string formulasString =
"Rmax=? [ F \"goal\" ];";
202 auto [mdp, formulas] = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/mdp/tiny_rewards2.nm", formulasString);
203 auto tasks = this->getTasks(formulas);
204 EXPECT_EQ(4ul, mdp->getNumberOfStates());
205 EXPECT_EQ(7ul, mdp->getNumberOfChoices());
206 EXPECT_EQ(12ul, mdp->getNumberOfTransitions());
211 auto result = checker.check(this->env(), tasks[0]);
212 ASSERT_TRUE(result->isExplicitQuantitativeCheckResult());
213 ASSERT_TRUE(
storm::utility::isInfinity(result->template asExplicitQuantitativeCheckResult<ValueType>()[*mdp->getInitialStates().begin()]));
214 ASSERT_TRUE(result->template asExplicitQuantitativeCheckResult<ValueType>().hasScheduler());
220 auto inducedModel = mdp->applyScheduler(scheduler);
222 auto const& inducedDtmc = inducedModel->template as<storm::models::sparse::Dtmc<ValueType>>();
223 EXPECT_EQ(inducedDtmc->getNumberOfChoices(), inducedDtmc->getNumberOfStates());
225 auto inducedResult = inducedChecker.check(this->env(), tasks[0]);
226 ASSERT_TRUE(inducedResult->isExplicitQuantitativeCheckResult());
227 EXPECT_TRUE(
storm::utility::isInfinity(inducedResult->template asExplicitQuantitativeCheckResult<ValueType>()[*mdp->getInitialStates().begin()]));
231TYPED_TEST(SchedulerGenerationMdpPrctlModelCheckerTest, reach_reward2) {
233 typedef typename TestFixture::ValueType
ValueType;
235 std::string formulasString =
"Rmax=? [ F \"goal\" ];";
237 auto [mdp, formulas] = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/mdp/tiny_rewards3.nm", formulasString);
238 auto tasks = this->getTasks(formulas);
239 EXPECT_EQ(4ul, mdp->getNumberOfStates());
240 EXPECT_EQ(5ul, mdp->getNumberOfChoices());
241 EXPECT_EQ(6ul, mdp->getNumberOfTransitions());
246 auto result = checker.check(this->env(), tasks[0]);
247 ASSERT_TRUE(result->isExplicitQuantitativeCheckResult());
248 ASSERT_TRUE(
storm::utility::isInfinity(result->template asExplicitQuantitativeCheckResult<ValueType>()[*mdp->getInitialStates().begin()]));
249 ASSERT_TRUE(result->template asExplicitQuantitativeCheckResult<ValueType>().hasScheduler());
255 auto inducedModel = mdp->applyScheduler(scheduler);
257 auto const& inducedDtmc = inducedModel->template as<storm::models::sparse::Dtmc<ValueType>>();
258 EXPECT_EQ(inducedDtmc->getNumberOfChoices(), inducedDtmc->getNumberOfStates());
260 auto inducedResult = inducedChecker.check(this->env(), tasks[0]);
261 ASSERT_TRUE(inducedResult->isExplicitQuantitativeCheckResult());
262 EXPECT_TRUE(
storm::utility::isInfinity(inducedResult->template asExplicitQuantitativeCheckResult<ValueType>()[*mdp->getInitialStates().begin()]));
266TYPED_TEST(SchedulerGenerationMdpPrctlModelCheckerTest, lra) {
267 typedef typename TestFixture::ValueType
ValueType;
269 std::string formulasString =
"R{\"grants\"}max=? [ MP ]; R{\"grants\"}min=? [ MP ];";
271 auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/mdp/cs_nfail3.nm", formulasString);
272 auto mdp = std::move(modelFormulas.first);
273 auto tasks = this->getTasks(modelFormulas.second);
274 EXPECT_EQ(184ul, mdp->getNumberOfStates());
275 EXPECT_EQ(541ul, mdp->getNumberOfTransitions());
276 EXPECT_EQ(439ul, mdp->getNumberOfChoices());
280 if (!std::is_same<ValueType, double>::value) {
281 GTEST_SKIP() <<
"Lra scheduler extraction not supported for LP based method";
284 auto result = checker.check(this->env(), tasks[0]);
285 ASSERT_TRUE(result->isExplicitQuantitativeCheckResult());
286 EXPECT_NEAR(this->
parseNumber(
"333/1000"), result->template asExplicitQuantitativeCheckResult<ValueType>()[*mdp->getInitialStates().begin()],
287 storm::utility::convertNumber<ValueType>(this->env().solver().lra().getPrecision()));
288 ASSERT_TRUE(result->template asExplicitQuantitativeCheckResult<ValueType>().hasScheduler());
294 auto inducedModel = mdp->applyScheduler(scheduler);
296 auto const& inducedMdp = inducedModel->template as<storm::models::sparse::Dtmc<ValueType>>();
297 EXPECT_EQ(inducedMdp->getNumberOfChoices(), inducedMdp->getNumberOfStates());
299 auto inducedResult = inducedChecker.check(this->env(), tasks[0]);
300 ASSERT_TRUE(inducedResult->isExplicitQuantitativeCheckResult());
301 EXPECT_NEAR(this->
parseNumber(
"333/1000"), inducedResult->template asExplicitQuantitativeCheckResult<ValueType>()[*mdp->getInitialStates().begin()],
302 storm::utility::convertNumber<ValueType>(this->env().solver().lra().getPrecision()));
305 auto result = checker.check(this->env(), tasks[1]);
306 ASSERT_TRUE(result->isExplicitQuantitativeCheckResult());
307 EXPECT_NEAR(this->
parseNumber(
"0"), result->template asExplicitQuantitativeCheckResult<ValueType>()[*mdp->getInitialStates().begin()],
308 storm::utility::convertNumber<ValueType>(this->env().solver().lra().getPrecision()));
309 ASSERT_TRUE(result->template asExplicitQuantitativeCheckResult<ValueType>().hasScheduler());
314 auto inducedModel = mdp->applyScheduler(scheduler);
316 auto const& inducedMdp = inducedModel->template as<storm::models::sparse::Dtmc<ValueType>>();
317 EXPECT_EQ(inducedMdp->getNumberOfChoices(), inducedMdp->getNumberOfStates());
319 auto inducedResult = inducedChecker.check(this->env(), tasks[1]);
320 ASSERT_TRUE(inducedResult->isExplicitQuantitativeCheckResult());
321 EXPECT_NEAR(this->
parseNumber(
"0"), inducedResult->template asExplicitQuantitativeCheckResult<ValueType>()[*mdp->getInitialStates().begin()],
322 storm::utility::convertNumber<ValueType>(this->env().solver().lra().getPrecision()));
326TYPED_TEST(SchedulerGenerationMdpPrctlModelCheckerTest, ltl) {
327 typedef typename TestFixture::ValueType
ValueType;
329#ifdef STORM_HAVE_LTL_MODELCHECKING_SUPPORT
330 std::string formulasString =
"Pmax=? [X X s=0]; Pmin=? [G F \"target\"]; Pmax=? [(G F s>2) & (F G !(s=3))];";
331 auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/mdp/scheduler_generation.nm", formulasString);
332 auto mdp = std::move(modelFormulas.first);
333 auto tasks = this->getTasks(modelFormulas.second);
334 EXPECT_EQ(4ull, mdp->getNumberOfStates());
335 EXPECT_EQ(11ull, mdp->getNumberOfTransitions());
337 EXPECT_EQ(7ull, mdp->getNumberOfChoices());
342 tasks[0].setOnlyInitialStatesRelevant(
true);
343 auto result = checker.check(this->env(), tasks[0]);
344 ASSERT_TRUE(result->isExplicitQuantitativeCheckResult());
345 EXPECT_NEAR(this->
parseNumber(
"81/100"), result->template asExplicitQuantitativeCheckResult<ValueType>()[*mdp->getInitialStates().begin()],
346 storm::utility::convertNumber<ValueType>(this->env().solver().minMax().getPrecision()));
347 ASSERT_TRUE(result->template asExplicitQuantitativeCheckResult<ValueType>().hasScheduler());
353 auto inducedModel = mdp->applyScheduler(scheduler);
356 auto const& inducedMdp = inducedModel->template as<storm::models::sparse::Mdp<ValueType>>();
357 EXPECT_EQ(inducedMdp->getNumberOfChoices(), inducedMdp->getNumberOfStates());
360 auto inducedResult = inducedChecker.check(this->env(), tasks[0]);
361 ASSERT_TRUE(inducedResult->isExplicitQuantitativeCheckResult());
363 inducedResult->template asExplicitQuantitativeCheckResult<ValueType>()[*inducedMdp->getInitialStates().begin()],
364 storm::utility::convertNumber<ValueType>(this->env().solver().minMax().getPrecision()));
367 tasks[1].setOnlyInitialStatesRelevant(
true);
368 auto result = checker.check(this->env(), tasks[1]);
369 ASSERT_TRUE(result->isExplicitQuantitativeCheckResult());
370 EXPECT_NEAR(this->
parseNumber(
"1/2"), result->template asExplicitQuantitativeCheckResult<ValueType>()[*mdp->getInitialStates().begin()],
371 storm::utility::convertNumber<ValueType>(this->env().solver().minMax().getPrecision()));
372 ASSERT_TRUE(result->template asExplicitQuantitativeCheckResult<ValueType>().hasScheduler());
378 auto inducedModel = mdp->applyScheduler(scheduler);
381 auto const& inducedMdp = inducedModel->template as<storm::models::sparse::Mdp<ValueType>>();
382 EXPECT_EQ(inducedMdp->getNumberOfChoices(), inducedMdp->getNumberOfStates());
385 auto inducedResult = inducedChecker.check(this->env(), tasks[1]);
386 ASSERT_TRUE(inducedResult->isExplicitQuantitativeCheckResult());
388 EXPECT_NEAR(this->
parseNumber(
"1/2"), inducedResult->template asExplicitQuantitativeCheckResult<ValueType>()[*inducedMdp->getInitialStates().begin()],
389 storm::utility::convertNumber<ValueType>(this->env().solver().minMax().getPrecision()));
392 tasks[2].setOnlyInitialStatesRelevant(
false);
393 auto result = checker.check(this->env(), tasks[2]);
394 ASSERT_TRUE(result->isExplicitQuantitativeCheckResult());
395 EXPECT_NEAR(this->
parseNumber(
"1/2"), result->template asExplicitQuantitativeCheckResult<ValueType>()[*mdp->getInitialStates().begin()],
396 storm::utility::convertNumber<ValueType>(this->env().solver().minMax().getPrecision()));
397 ASSERT_TRUE(result->template asExplicitQuantitativeCheckResult<ValueType>().hasScheduler());
403 auto inducedModel = mdp->applyScheduler(scheduler);
406 auto const& inducedMdp = inducedModel->template as<storm::models::sparse::Mdp<ValueType>>();
407 EXPECT_EQ(inducedMdp->getNumberOfChoices(), inducedMdp->getNumberOfStates());
410 auto inducedResult = inducedChecker.check(this->env(), tasks[2]);
411 ASSERT_TRUE(inducedResult->isExplicitQuantitativeCheckResult());
413 auto test = inducedResult->template asExplicitQuantitativeCheckResult<ValueType>().getValueVector();
414 EXPECT_NEAR(this->
parseNumber(
"1/2"), inducedResult->template asExplicitQuantitativeCheckResult<ValueType>()[0],
415 storm::utility::convertNumber<ValueType>(this->env().solver().minMax().getPrecision()));
416 EXPECT_NEAR(this->
parseNumber(
"1"), inducedResult->template asExplicitQuantitativeCheckResult<ValueType>()[1],
417 storm::utility::convertNumber<ValueType>(this->env().solver().minMax().getPrecision()));
418 EXPECT_NEAR(this->
parseNumber(
"0"), inducedResult->template asExplicitQuantitativeCheckResult<ValueType>()[2],
419 storm::utility::convertNumber<ValueType>(this->env().solver().minMax().getPrecision()));
426TYPED_TEST(SchedulerGenerationMdpPrctlModelCheckerTest, ltlNondetChoice) {
427 typedef typename TestFixture::ValueType
ValueType;
428#ifdef STORM_HAVE_LTL_MODELCHECKING_SUPPORT
430 std::string formulasString =
"Pmax=? [X X !(x=0)];";
431 auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/mdp/prism-mec-example1.nm", formulasString);
433 auto mdp = std::move(modelFormulas.first);
434 auto tasks = this->getTasks(modelFormulas.second);
435 EXPECT_EQ(3ull, mdp->getNumberOfStates());
436 EXPECT_EQ(5ull, mdp->getNumberOfTransitions());
438 EXPECT_EQ(4ull, mdp->getNumberOfChoices());
443 tasks[0].setOnlyInitialStatesRelevant(
true);
444 auto result = checker.check(this->env(), tasks[0]);
445 ASSERT_TRUE(result->isExplicitQuantitativeCheckResult());
446 EXPECT_NEAR(this->
parseNumber(
"1"), result->template asExplicitQuantitativeCheckResult<ValueType>()[*mdp->getInitialStates().begin()],
447 storm::utility::convertNumber<ValueType>(this->env().solver().minMax().getPrecision()));
448 ASSERT_TRUE(result->template asExplicitQuantitativeCheckResult<ValueType>().hasScheduler());
454 auto inducedModel = mdp->applyScheduler(scheduler);
457 auto const& inducedMdp = inducedModel->template as<storm::models::sparse::Mdp<ValueType>>();
458 EXPECT_EQ(inducedMdp->getNumberOfChoices(), inducedMdp->getNumberOfStates());
461 auto inducedResult = inducedChecker.check(this->env(), tasks[0]);
462 ASSERT_TRUE(inducedResult->isExplicitQuantitativeCheckResult());
463 EXPECT_NEAR(this->
parseNumber(
"1"), inducedResult->template asExplicitQuantitativeCheckResult<ValueType>()[*inducedMdp->getInitialStates().begin()],
464 storm::utility::convertNumber<ValueType>(this->env().solver().minMax().getPrecision()));
471TYPED_TEST(SchedulerGenerationMdpPrctlModelCheckerTest, ltlUnsat) {
472 typedef typename TestFixture::ValueType
ValueType;
473#ifdef STORM_HAVE_LTL_MODELCHECKING_SUPPORT
475 std::string formulasString =
"Pmax=? [(X X !(s=0)) & (X X (s=0))]; Pmin=? [(X X !(s=0)) | (X X (s=0))];";
476 auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/mdp/scheduler_generation.nm", formulasString);
478 auto mdp = std::move(modelFormulas.first);
479 auto tasks = this->getTasks(modelFormulas.second);
480 EXPECT_EQ(4ull, mdp->getNumberOfStates());
481 EXPECT_EQ(11ull, mdp->getNumberOfTransitions());
483 EXPECT_EQ(7ull, mdp->getNumberOfChoices());
488 tasks[0].setOnlyInitialStatesRelevant(
true);
489 auto result = checker.check(this->env(), tasks[0]);
490 ASSERT_TRUE(result->isExplicitQuantitativeCheckResult());
491 EXPECT_NEAR(this->
parseNumber(
"0"), result->template asExplicitQuantitativeCheckResult<ValueType>()[*mdp->getInitialStates().begin()],
492 storm::utility::convertNumber<ValueType>(this->env().solver().minMax().getPrecision()));
493 ASSERT_TRUE(result->template asExplicitQuantitativeCheckResult<ValueType>().hasScheduler());
499 auto inducedModel = mdp->applyScheduler(scheduler);
502 auto const& inducedMdp = inducedModel->template as<storm::models::sparse::Dtmc<ValueType>>();
503 EXPECT_EQ(inducedMdp->getNumberOfChoices(), inducedMdp->getNumberOfStates());
506 auto inducedResult = inducedChecker.check(this->env(), tasks[0]);
507 ASSERT_TRUE(inducedResult->isExplicitQuantitativeCheckResult());
508 EXPECT_NEAR(this->
parseNumber(
"0"), inducedResult->template asExplicitQuantitativeCheckResult<ValueType>()[*inducedMdp->getInitialStates().begin()],
509 storm::utility::convertNumber<ValueType>(this->env().solver().minMax().getPrecision()));
513 tasks[1].setOnlyInitialStatesRelevant(
true);
514 auto result = checker.check(this->env(), tasks[1]);
515 ASSERT_TRUE(result->isExplicitQuantitativeCheckResult());
516 ASSERT_TRUE(result->template asExplicitQuantitativeCheckResult<ValueType>().hasScheduler());
517 EXPECT_NEAR(this->
parseNumber(
"1"), result->template asExplicitQuantitativeCheckResult<ValueType>()[*mdp->getInitialStates().begin()],
518 storm::utility::convertNumber<ValueType>(this->env().solver().minMax().getPrecision()));
524 auto inducedModel = mdp->applyScheduler(scheduler);
527 auto const& inducedMdp = inducedModel->template as<storm::models::sparse::Dtmc<ValueType>>();
528 EXPECT_EQ(inducedMdp->getNumberOfChoices(), inducedMdp->getNumberOfStates());
531 auto inducedResult = inducedChecker.check(this->env(), tasks[1]);
532 ASSERT_TRUE(inducedResult->isExplicitQuantitativeCheckResult());
533 EXPECT_NEAR(this->
parseNumber(
"1"), inducedResult->template asExplicitQuantitativeCheckResult<ValueType>()[*inducedMdp->getInitialStates().begin()],
534 storm::utility::convertNumber<ValueType>(this->env().solver().minMax().getPrecision()));
SolverEnvironment & solver()
void setNondetLraMethod(storm::solver::LraMethod value, bool isSetFromDefault=false)
void setPrecision(storm::RationalNumber value)
void setMethod(storm::solver::MinMaxMethod value, bool isSetFromDefault=false)
MinMaxSolverEnvironment & minMax()
void setForceSoundness(bool value)
LongRunAverageSolverEnvironment & lra()
This class defines which action is chosen in a particular state of a non-deterministic model.
bool isDeterministicScheduler() const
Retrieves whether all defined choices are deterministic.
bool isPartialScheduler() const
Retrieves whether there is a reachable pair of model and memory state for which the choice is undefin...
SchedulerChoice< ValueType > const & getChoice(uint_fast64_t modelState, uint_fast64_t memoryState=0) const
Gets the choice defined by the scheduler for the given model and memory state.
bool isMemorylessScheduler() const
Retrieves whether the scheduler considers a trivial memory structure (i.e., a memory structure with j...
std::vector< storm::jani::Property > parsePropertiesForPrismProgram(std::string const &inputString, storm::prism::Program const &program, boost::optional< std::set< std::string > > const &propertyFilter)
storm::prism::Program parseProgram(std::string const &filename, bool prismCompatibility, bool simplify)
std::vector< std::shared_ptr< storm::logic::Formula const > > extractFormulasFromProperties(std::vector< storm::jani::Property > const &properties)
SFTBDDChecker::ValueType ValueType
NumberType parseNumber(std::string const &value)
Parse number from string.
storm::prism::Program preprocess(storm::prism::Program const &program, std::map< storm::expressions::Variable, storm::expressions::Expression > const &constantDefinitions)
bool isInfinity(ValueType const &a)
TYPED_TEST(GraphTestAR, SymbolicProb01StochasticGameDieSmall)
TYPED_TEST_SUITE(GraphTestAR, TestingTypes,)
::testing::Types< Cudd, Sylvan > TestingTypes