1#include "storm-config.h"
31enum class MdpEngine { PrismSparse, JaniSparse,
Hybrid, PrismDd, JaniDd };
33class SparseDoubleValueIterationGmmxxGaussSeidelMultEnvironment {
36 static const MdpEngine engine = MdpEngine::PrismSparse;
37 static const bool isExact =
false;
50class SparseDoubleValueIterationGmmxxRegularMultEnvironment {
53 static const MdpEngine engine = MdpEngine::PrismSparse;
54 static const bool isExact =
false;
67class SparseDoubleValueIterationNativeGaussSeidelMultEnvironment {
70 static const MdpEngine engine = MdpEngine::PrismSparse;
71 static const bool isExact =
false;
84class SparseDoubleValueIterationNativeRegularMultEnvironment {
87 static const MdpEngine engine = MdpEngine::PrismSparse;
88 static const bool isExact =
false;
101class JaniSparseDoubleValueIterationEnvironment {
104 static const MdpEngine engine = MdpEngine::JaniSparse;
105 static const bool isExact =
false;
116class SparseDoubleIntervalIterationEnvironment {
119 static const MdpEngine engine = MdpEngine::PrismSparse;
120 static const bool isExact =
false;
133class SparseDoubleSoundValueIterationEnvironment {
136 static const MdpEngine engine = MdpEngine::PrismSparse;
137 static const bool isExact =
false;
150class SparseDoubleOptimisticValueIterationEnvironment {
153 static const MdpEngine engine = MdpEngine::PrismSparse;
154 static const bool isExact =
false;
167class SparseDoubleTopologicalValueIterationEnvironment {
170 static const MdpEngine engine = MdpEngine::PrismSparse;
171 static const bool isExact =
false;
184class SparseDoubleTopologicalSoundValueIterationEnvironment {
187 static const MdpEngine engine = MdpEngine::PrismSparse;
188 static const bool isExact =
false;
202class SparseDoubleLPEnvironment {
205 static const MdpEngine engine = MdpEngine::PrismSparse;
206 static const bool isExact =
false;
217class SparseDoubleViToLPEnvironment {
220 static const MdpEngine engine = MdpEngine::PrismSparse;
221 static const bool isExact =
false;
232class SparseRationalPolicyIterationEnvironment {
235 static const MdpEngine engine = MdpEngine::PrismSparse;
236 static const bool isExact =
true;
246class SparseRationalViToPiEnvironment {
249 static const MdpEngine engine = MdpEngine::PrismSparse;
250 static const bool isExact =
true;
260class SparseRationalRationalSearchEnvironment {
263 static const MdpEngine engine = MdpEngine::PrismSparse;
264 static const bool isExact =
true;
273class HybridCuddDoubleValueIterationEnvironment {
276 static const MdpEngine engine = MdpEngine::Hybrid;
277 static const bool isExact =
false;
287class HybridSylvanDoubleValueIterationEnvironment {
290 static const MdpEngine engine = MdpEngine::Hybrid;
291 static const bool isExact =
false;
301class HybridCuddDoubleSoundValueIterationEnvironment {
304 static const MdpEngine engine = MdpEngine::Hybrid;
305 static const bool isExact =
false;
317class HybridCuddDoubleOptimisticValueIterationEnvironment {
320 static const MdpEngine engine = MdpEngine::Hybrid;
321 static const bool isExact =
false;
333class HybridSylvanRationalPolicyIterationEnvironment {
336 static const MdpEngine engine = MdpEngine::Hybrid;
337 static const bool isExact =
true;
346class DdCuddDoubleValueIterationEnvironment {
349 static const MdpEngine engine = MdpEngine::PrismDd;
350 static const bool isExact =
false;
360class JaniDdCuddDoubleValueIterationEnvironment {
363 static const MdpEngine engine = MdpEngine::JaniDd;
364 static const bool isExact =
false;
374class DdSylvanDoubleValueIterationEnvironment {
377 static const MdpEngine engine = MdpEngine::PrismDd;
378 static const bool isExact =
false;
388class DdCuddDoublePolicyIterationEnvironment {
391 static const MdpEngine engine = MdpEngine::PrismDd;
392 static const bool isExact =
false;
402class DdSylvanRationalRationalSearchEnvironment {
405 static const MdpEngine engine = MdpEngine::PrismDd;
406 static const bool isExact =
true;
416template<
typename TestType>
417class MdpPrctlModelCheckerTest :
public ::testing::Test {
419 typedef typename TestType::ValueType
ValueType;
423 MdpPrctlModelCheckerTest() : _environment(TestType::createEnvironment()) {}
425 void SetUp()
override {
427 GTEST_SKIP() <<
"Z3 not available.";
435 return storm::utility::convertNumber<ValueType>(input);
440 bool isSparseModel()
const {
441 return std::is_same<typename TestType::ModelType, SparseModelType>::value;
443 bool isSymbolicModel()
const {
444 return std::is_same<typename TestType::ModelType, SymbolicModelType>::value;
447 template<
typename MT =
typename TestType::ModelType>
448 typename std::enable_if<std::is_same<MT, SparseModelType>::value,
449 std::pair<std::shared_ptr<MT>, std::vector<std::shared_ptr<storm::logic::Formula const>>>>::type
450 buildModelFormulas(std::string
const& pathToPrismFile, std::string
const& formulasAsString, std::string
const& constantDefinitionString =
"")
const {
451 std::pair<std::shared_ptr<MT>, std::vector<std::shared_ptr<storm::logic::Formula const>>> result;
454 if (TestType::engine == MdpEngine::PrismSparse) {
456 result.first = storm::api::buildSparseModel<ValueType>(program, result.second)->template as<MT>();
457 }
else if (TestType::engine == MdpEngine::JaniSparse) {
459 janiData.first.substituteFunctions();
461 result.first = storm::api::buildSparseModel<ValueType>(janiData.first, result.second)->template as<MT>();
466 template<
typename MT =
typename TestType::ModelType>
467 typename std::enable_if<std::is_same<MT, SymbolicModelType>::value,
468 std::pair<std::shared_ptr<MT>, std::vector<std::shared_ptr<storm::logic::Formula const>>>>::type
469 buildModelFormulas(std::string
const& pathToPrismFile, std::string
const& formulasAsString, std::string
const& constantDefinitionString =
"")
const {
470 std::pair<std::shared_ptr<MT>, std::vector<std::shared_ptr<storm::logic::Formula const>>> result;
473 if (TestType::engine == MdpEngine::Hybrid || TestType::engine == MdpEngine::PrismDd) {
475 result.first = storm::api::buildSymbolicModel<TestType::ddType, ValueType>(program, result.second)->template as<MT>();
476 }
else if (TestType::engine == MdpEngine::JaniDd) {
478 janiData.first.substituteFunctions();
480 result.first = storm::api::buildSymbolicModel<TestType::ddType, ValueType>(janiData.first, result.second)->template as<MT>();
485 std::vector<storm::modelchecker::CheckTask<storm::logic::Formula, ValueType>> getTasks(
486 std::vector<std::shared_ptr<storm::logic::Formula const>>
const& formulas)
const {
487 std::vector<storm::modelchecker::CheckTask<storm::logic::Formula, ValueType>> result;
488 for (
auto const& f : formulas) {
489 result.emplace_back(*f);
494 template<
typename MT =
typename TestType::ModelType>
495 typename std::enable_if<std::is_same<MT, SparseModelType>::value, std::shared_ptr<storm::modelchecker::AbstractModelChecker<MT>>>::type createModelChecker(
496 std::shared_ptr<MT>
const& model)
const {
497 if (TestType::engine == MdpEngine::PrismSparse || TestType::engine == MdpEngine::JaniSparse) {
498 return std::make_shared<storm::modelchecker::SparseMdpPrctlModelChecker<SparseModelType>>(*model);
502 template<
typename MT =
typename TestType::ModelType>
503 typename std::enable_if<std::is_same<MT, SymbolicModelType>::value, std::shared_ptr<storm::modelchecker::AbstractModelChecker<MT>>>::type
504 createModelChecker(std::shared_ptr<MT>
const& model)
const {
505 if (TestType::engine == MdpEngine::Hybrid) {
506 return std::make_shared<storm::modelchecker::HybridMdpPrctlModelChecker<SymbolicModelType>>(*model);
507 }
else if (TestType::engine == MdpEngine::PrismDd || TestType::engine == MdpEngine::JaniDd) {
508 return std::make_shared<storm::modelchecker::SymbolicMdpPrctlModelChecker<SymbolicModelType>>(*model);
512 template<
typename MT =
typename TestType::ModelType>
513 typename std::enable_if<std::is_same<MT, SparseModelType>::value,
void>::type execute(std::shared_ptr<MT>
const& model,
514 std::function<
void()>
const& f)
const {
518 template<
typename MT =
typename TestType::ModelType>
519 typename std::enable_if<std::is_same<MT, SymbolicModelType>::value,
void>::type execute(std::shared_ptr<MT>
const& model,
520 std::function<
void()>
const& f)
const {
521 model->getManager().execute(f);
525 std::unique_ptr<storm::modelchecker::CheckResult>& result) {
527 result->filter(*filter);
528 return result->asQualitativeCheckResult().forallTrue();
532 std::unique_ptr<storm::modelchecker::CheckResult>& result) {
534 result->filter(*filter);
535 return result->asQuantitativeCheckResult<
ValueType>().getMin();
542 if (isSparseModel()) {
543 return std::make_unique<storm::modelchecker::ExplicitQualitativeCheckResult>(model->template as<SparseModelType>()->getInitialStates());
545 return std::make_unique<storm::modelchecker::SymbolicQualitativeCheckResult<TestType::ddType>>(
546 model->template as<SymbolicModelType>()->getReachableStates(), model->template as<SymbolicModelType>()->getInitialStates());
551typedef ::testing::Types<SparseDoubleValueIterationGmmxxGaussSeidelMultEnvironment, SparseDoubleValueIterationGmmxxRegularMultEnvironment,
552 SparseDoubleValueIterationNativeGaussSeidelMultEnvironment, SparseDoubleValueIterationNativeRegularMultEnvironment,
553 JaniSparseDoubleValueIterationEnvironment, SparseDoubleIntervalIterationEnvironment, SparseDoubleSoundValueIterationEnvironment,
554 SparseDoubleOptimisticValueIterationEnvironment, SparseDoubleTopologicalValueIterationEnvironment,
555 SparseDoubleTopologicalSoundValueIterationEnvironment, SparseDoubleLPEnvironment, SparseDoubleViToLPEnvironment,
556 SparseRationalPolicyIterationEnvironment, SparseRationalViToPiEnvironment, SparseRationalRationalSearchEnvironment,
557 HybridCuddDoubleValueIterationEnvironment, HybridSylvanDoubleValueIterationEnvironment, HybridCuddDoubleSoundValueIterationEnvironment,
558 HybridCuddDoubleOptimisticValueIterationEnvironment, HybridSylvanRationalPolicyIterationEnvironment,
559 DdCuddDoubleValueIterationEnvironment, JaniDdCuddDoubleValueIterationEnvironment, DdSylvanDoubleValueIterationEnvironment,
560 DdCuddDoublePolicyIterationEnvironment, DdSylvanRationalRationalSearchEnvironment>
566 std::string formulasString =
"Pmin=? [F \"two\"]";
567 formulasString +=
"; Pmax=? [F \"two\"]";
568 formulasString +=
"; Pmin=? [F \"three\"]";
569 formulasString +=
"; Pmax=? [F \"three\"]";
570 formulasString +=
"; Pmin=? [F \"four\"]";
571 formulasString +=
"; Pmax=? [F \"four\"]";
572 formulasString +=
"; Rmin=? [F \"done\"]";
573 formulasString +=
"; Rmax=? [F \"done\"]";
575 auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/mdp/two_dice.nm", formulasString);
576 auto model = std::move(modelFormulas.first);
577 auto tasks = this->getTasks(modelFormulas.second);
578 this->execute(model, [&]() {
579 EXPECT_EQ(169ul, model->getNumberOfStates());
580 EXPECT_EQ(436ul, model->getNumberOfTransitions());
583 auto checker = this->createModelChecker(model);
584 std::unique_ptr<storm::modelchecker::CheckResult> result;
586 result = checker->check(this->env(), tasks[0]);
589 result = checker->check(this->env(), tasks[1]);
592 result = checker->check(this->env(), tasks[2]);
595 result = checker->check(this->env(), tasks[3]);
598 result = checker->check(this->env(), tasks[4]);
601 result = checker->check(this->env(), tasks[5]);
604 result = checker->check(this->env(), tasks[6]);
607 result = checker->check(this->env(), tasks[7]);
612TYPED_TEST(MdpPrctlModelCheckerTest, AsynchronousLeader) {
613 std::string formulasString =
"Pmin=? [F \"elected\"]";
614 formulasString +=
"; Pmax=? [F \"elected\"]";
615 formulasString +=
"; Pmin=? [F<=25 \"elected\"]";
616 formulasString +=
"; Pmax=? [F<=25 \"elected\"]";
617 formulasString +=
"; Rmin=? [F \"elected\"]";
618 formulasString +=
"; Rmax=? [F \"elected\"]";
620 auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/mdp/leader4.nm", formulasString);
621 auto model = std::move(modelFormulas.first);
622 auto tasks = this->getTasks(modelFormulas.second);
623 this->execute(model, [&]() {
624 EXPECT_EQ(3172ul, model->getNumberOfStates());
625 EXPECT_EQ(7144ul, model->getNumberOfTransitions());
627 auto checker = this->createModelChecker(model);
628 std::unique_ptr<storm::modelchecker::CheckResult> result;
630 result = checker->check(this->env(), tasks[0]);
633 result = checker->check(this->env(), tasks[1]);
636 result = checker->check(this->env(), tasks[2]);
639 result = checker->check(this->env(), tasks[3]);
642 result = checker->check(this->env(), tasks[4]);
645 result = checker->check(this->env(), tasks[5]);
650TYPED_TEST(MdpPrctlModelCheckerTest, consensus) {
651 std::string formulasString =
"Pmax=? [F \"finished\"]";
652 formulasString +=
"; Pmax=? [F \"all_coins_equal_1\"]";
653 formulasString +=
"; P<0.8 [F \"all_coins_equal_1\"]";
654 formulasString +=
"; P<0.9 [F \"all_coins_equal_1\"]";
655 formulasString +=
"; Rmax=? [F \"all_coins_equal_1\"]";
656 formulasString +=
"; Rmin=? [F \"all_coins_equal_1\"]";
657 formulasString +=
"; Rmax=? [F \"finished\"]";
658 formulasString +=
"; Rmin=? [F \"finished\"]";
660 auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/mdp/coin2-2.nm", formulasString);
661 auto model = std::move(modelFormulas.first);
662 auto tasks = this->getTasks(modelFormulas.second);
663 this->execute(model, [&]() {
664 EXPECT_EQ(272ul, model->getNumberOfStates());
665 EXPECT_EQ(492ul, model->getNumberOfTransitions());
667 auto checker = this->createModelChecker(model);
668 std::unique_ptr<storm::modelchecker::CheckResult> result;
670 result = checker->check(this->env(), tasks[0]);
673 result = checker->check(this->env(), tasks[1]);
676 result = checker->check(this->env(), tasks[2]);
677 EXPECT_FALSE(this->getQualitativeResultAtInitialState(model, result));
679 result = checker->check(this->env(), tasks[3]);
680 EXPECT_TRUE(this->getQualitativeResultAtInitialState(model, result));
682 result = checker->check(this->env(), tasks[4]);
685 result = checker->check(this->env(), tasks[5]);
688 result = checker->check(this->env(), tasks[6]);
691 result = checker->check(this->env(), tasks[7]);
696TYPED_TEST(MdpPrctlModelCheckerTest, TinyRewards) {
697 std::string formulasString =
"Rmin=? [F \"target\"]";
698 auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/mdp/tiny_rewards.nm", formulasString);
699 auto model = std::move(modelFormulas.first);
700 auto tasks = this->getTasks(modelFormulas.second);
701 this->execute(model, [&]() {
702 EXPECT_EQ(3ul, model->getNumberOfStates());
703 EXPECT_EQ(4ul, model->getNumberOfTransitions());
705 auto checker = this->createModelChecker(model);
706 std::unique_ptr<storm::modelchecker::CheckResult> result;
711 if (TypeParam::engine == MdpEngine::PrismDd && this->env().solver().minMax().getMethod() == storm::solver::MinMaxMethod::RationalSearch) {
714 result = checker->check(this->env(), tasks[0]);
721 std::string formulasString =
"R{\"w_1_total\"}max=? [ C ]";
722 auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/mdp/multiobj_team3.nm", formulasString);
723 auto model = std::move(modelFormulas.first);
724 auto tasks = this->getTasks(modelFormulas.second);
725 this->execute(model, [&]() {
726 EXPECT_EQ(12475ul, model->getNumberOfStates());
727 EXPECT_EQ(15228ul, model->getNumberOfTransitions());
729 auto checker = this->createModelChecker(model);
730 std::unique_ptr<storm::modelchecker::CheckResult> result;
734 if (TypeParam::engine == MdpEngine::PrismSparse || TypeParam::engine == MdpEngine::JaniSparse) {
735 result = checker->check(this->env(), tasks[0]);
738 EXPECT_FALSE(checker->canHandle(tasks[0]));
743TYPED_TEST(MdpPrctlModelCheckerTest, LtlProbabilitiesCoin) {
744#ifdef STORM_HAVE_LTL_MODELCHECKING_SUPPORT
745 std::string formulasString =
"Pmin=? [!(GF \"all_coins_equal_1\")]";
746 formulasString +=
"; Pmax=? [F \"all_coins_equal_1\" U \"finished\"]";
747 formulasString +=
"; P>0.4 [!(GF \"all_coins_equal_1\")]";
748 formulasString +=
"; P<0.6 [F \"all_coins_equal_1\" U \"finished\"]";
750 formulasString +=
"; Pmax=?[ (GF \"all_coins_equal_1\") & ((GF \"all_coins_equal_0\") | (FG \"finished\"))]";
752 auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/mdp/coin2-2.nm", formulasString);
753 auto model = std::move(modelFormulas.first);
754 auto tasks = this->getTasks(modelFormulas.second);
755 this->execute(model, [&]() {
756 EXPECT_EQ(272ul, model->getNumberOfStates());
757 EXPECT_EQ(492ul, model->getNumberOfTransitions());
759 auto checker = this->createModelChecker(model);
760 std::unique_ptr<storm::modelchecker::CheckResult> result;
763 if (TypeParam::engine == MdpEngine::PrismSparse || TypeParam::engine == MdpEngine::JaniSparse) {
764 result = checker->check(this->env(), tasks[0]);
767 result = checker->check(this->env(), tasks[1]);
770 result = checker->check(this->env(), tasks[2]);
771 EXPECT_TRUE(this->getQualitativeResultAtInitialState(model, result));
773 result = checker->check(this->env(), tasks[3]);
774 EXPECT_TRUE(this->getQualitativeResultAtInitialState(model, result));
776 result = checker->check(this->env(), tasks[4]);
780 EXPECT_FALSE(checker->canHandle(tasks[0]));
788TYPED_TEST(MdpPrctlModelCheckerTest, LtlDice) {
789#ifdef STORM_HAVE_LTL_MODELCHECKING_SUPPORT
790 std::string formulasString =
"Pmax=? [ X (((s1=1) U (s1=3)) U (s1=7))]";
791 formulasString +=
"; Pmax=? [ (F (X (s1=6 & (XX s1=5)))) & (F G (d1!=5))]";
792 formulasString +=
"; Pmax=? [ F s1=3 U (\"three\")]";
793 formulasString +=
"; Pmin=? [! F (s2=6) & X \"done\"]";
795 formulasString +=
"; Pmax=? [ ( (G F !(\"two\")) | F G (\"three\") ) & ( (G F !(\"five\") ) | F G (\"seven\") )]";
797 auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/mdp/two_dice.nm", formulasString);
798 auto model = std::move(modelFormulas.first);
799 auto tasks = this->getTasks(modelFormulas.second);
800 this->execute(model, [&]() {
801 EXPECT_EQ(169ul, model->getNumberOfStates());
802 EXPECT_EQ(436ul, model->getNumberOfTransitions());
804 auto checker = this->createModelChecker(model);
805 std::unique_ptr<storm::modelchecker::CheckResult> result;
808 if (TypeParam::engine == MdpEngine::PrismSparse || TypeParam::engine == MdpEngine::JaniSparse) {
809 result = checker->check(this->env(), tasks[0]);
812 result = checker->check(this->env(), tasks[1]);
815 result = checker->check(this->env(), tasks[2]);
818 result = checker->check(this->env(), tasks[3]);
821 result = checker->check(this->env(), tasks[4]);
825 EXPECT_FALSE(checker->canHandle(tasks[0]));
833TYPED_TEST(MdpPrctlModelCheckerTest, LtlCoinFlips) {
834#ifdef STORM_HAVE_LTL_MODELCHECKING_SUPPORT
835 std::string formulasString =
"Pmax=? [ G (true U (heads | \"done\")) ]";
836 formulasString +=
"; Pmin=? [ G (true U (heads | \"done\")) ]";
837 formulasString +=
"; Pmax=? [ G (true U<=10 (heads | \"done\")) ]";
838 formulasString +=
"; Pmin=? [ G (true U<=10 (heads | \"done\")) ]";
839 formulasString +=
"; Pmax=? [ X G (true U<=0 (heads | \"done\")) ]";
840 formulasString +=
"; Pmax=? [ true U[10,12] heads ]";
841 formulasString +=
"; Pmax=? [ X (true U[0,0] heads) ]";
842 formulasString +=
"; Pmax=? [ G (!(P>=1 [\"done\"]) U<=10 (heads | P>=1 [ \"done\"])) ]";
843 auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/mdp/coin_flips.nm", formulasString);
844 auto model = std::move(modelFormulas.first);
845 auto tasks = this->getTasks(modelFormulas.second);
846 this->execute(model, [&]() {
847 EXPECT_EQ(61ul, model->getNumberOfStates());
848 EXPECT_EQ(177ul, model->getNumberOfTransitions());
850 auto checker = this->createModelChecker(model);
851 std::unique_ptr<storm::modelchecker::CheckResult> result;
854 if (TypeParam::engine == MdpEngine::PrismSparse || TypeParam::engine == MdpEngine::JaniSparse) {
855 result = checker->check(this->env(), tasks[0]);
858 result = checker->check(this->env(), tasks[1]);
861 result = checker->check(this->env(), tasks[2]);
864 result = checker->check(this->env(), tasks[3]);
867 result = checker->check(this->env(), tasks[4]);
870 result = checker->check(this->env(), tasks[5]);
873 result = checker->check(this->env(), tasks[6]);
876 result = checker->check(this->env(), tasks[7]);
880 EXPECT_FALSE(checker->canHandle(tasks[0]));
888TYPED_TEST(MdpPrctlModelCheckerTest, HOADice) {
890 std::string formulasString =
"; P=?[HOA: {\"" STORM_TEST_RESOURCES_DIR
"/hoa/automaton_Fandp0Xp1.hoa\", \"p0\" -> \"three\", \"p1\" -> s2=1 }]";
892 formulasString +=
"; P=?[HOA: {\"" STORM_TEST_RESOURCES_DIR
"/hoa/automaton_UXp0p1.hoa\", \"p0\" -> !(s2=6), \"p1\" -> \"done\" }]";
894 auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/mdp/two_dice.nm", formulasString);
895 auto model = std::move(modelFormulas.first);
896 auto tasks = this->getTasks(modelFormulas.second);
897 this->execute(model, [&]() {
898 EXPECT_EQ(169ul, model->getNumberOfStates());
899 EXPECT_EQ(436ul, model->getNumberOfTransitions());
901 auto checker = this->createModelChecker(model);
902 std::unique_ptr<storm::modelchecker::CheckResult> result;
905 if (TypeParam::engine == MdpEngine::PrismSparse || TypeParam::engine == MdpEngine::JaniSparse) {
906 result = checker->check(tasks[0]);
909 result = checker->check(tasks[1]);
912 EXPECT_FALSE(checker->canHandle(tasks[0]));
std::unique_ptr< storm::modelchecker::QualitativeCheckResult > getInitialStateFilter(std::shared_ptr< storm::models::sparse::Model< storm::Interval > > const &model)
double getQuantitativeResultAtInitialState(std::shared_ptr< storm::models::sparse::Model< storm::Interval > > const &model, std::unique_ptr< storm::modelchecker::CheckResult > &result)
SolverEnvironment & solver()
void setMultiplicationStyle(storm::solver::MultiplicationStyle value)
void setPrecision(storm::RationalNumber value)
void setMethod(storm::solver::MinMaxMethod value, bool isSetFromDefault=false)
void setRelativeTerminationCriterion(bool value)
void setType(storm::solver::MultiplierType value, bool isSetFromDefault=false)
TopologicalSolverEnvironment & topological()
MinMaxSolverEnvironment & minMax()
void setForceSoundness(bool value)
MultiplierEnvironment & multiplier()
void setUnderlyingMinMaxMethod(storm::solver::MinMaxMethod value)
This class represents a (discrete-time) Markov decision process.
This class represents a discrete-time Markov decision process.
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)
std::pair< storm::jani::Model, std::vector< storm::jani::Property > > convertPrismToJani(storm::prism::Program const &program, storm::converter::PrismToJaniConverterOptions options)
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)
storm::storage::BitVector filter(std::vector< T > const &values, std::function< bool(T const &value)> const &function)
Retrieves a bit vector containing all the indices for which the value at this position makes the give...
bool isInfinity(ValueType const &a)
TYPED_TEST(GraphTestAR, SymbolicProb01StochasticGameDieSmall)
TYPED_TEST_SUITE(GraphTestAR, TestingTypes,)
::testing::Types< Cudd, Sylvan > TestingTypes
#define STORM_SILENT_EXPECT_THROW(statement, expected_exception)