1#include "storm-config.h"
34enum class DtmcEngine { PrismSparse, JaniSparse,
Hybrid, PrismDd, JaniDd };
37class SparseGmmxxGmresIluEnvironment {
40 static const DtmcEngine engine = DtmcEngine::PrismSparse;
41 static const bool isExact =
false;
54class JaniSparseGmmxxGmresIluEnvironment {
57 static const DtmcEngine engine = DtmcEngine::JaniSparse;
58 static const bool isExact =
false;
71class SparseGmmxxGmresDiagEnvironment {
74 static const DtmcEngine engine = DtmcEngine::PrismSparse;
75 static const bool isExact =
false;
88class SparseGmmxxBicgstabIluEnvironment {
91 static const DtmcEngine engine = DtmcEngine::PrismSparse;
92 static const bool isExact =
false;
106class SparseEigenDGmresEnvironment {
109 static const DtmcEngine engine = DtmcEngine::PrismSparse;
110 static const bool isExact =
false;
123class SparseEigenDoubleLUEnvironment {
126 static const DtmcEngine engine = DtmcEngine::PrismSparse;
127 static const bool isExact =
false;
138class SparseEigenRationalLUEnvironment {
141 static const DtmcEngine engine = DtmcEngine::PrismSparse;
142 static const bool isExact =
true;
153class SparseRationalEliminationEnvironment {
156 static const DtmcEngine engine = DtmcEngine::PrismSparse;
157 static const bool isExact =
true;
167class SparseNativeJacobiEnvironment {
170 static const DtmcEngine engine = DtmcEngine::PrismSparse;
171 static const bool isExact =
false;
183class SparseNativeWalkerChaeEnvironment {
186 static const DtmcEngine engine = DtmcEngine::PrismSparse;
187 static const bool isExact =
false;
200class SparseNativeSorEnvironment {
203 static const DtmcEngine engine = DtmcEngine::PrismSparse;
204 static const bool isExact =
false;
216class SparseNativePowerEnvironment {
219 static const DtmcEngine engine = DtmcEngine::PrismSparse;
220 static const bool isExact =
false;
232class SparseNativeSoundValueIterationEnvironment {
235 static const DtmcEngine engine = DtmcEngine::PrismSparse;
236 static const bool isExact =
false;
243 env.
solver().
native().
setMethod(storm::solver::NativeLinearEquationSolverMethod::SoundValueIteration);
249class SparseNativeOptimisticValueIterationEnvironment {
252 static const DtmcEngine engine = DtmcEngine::PrismSparse;
253 static const bool isExact =
false;
260 env.
solver().
native().
setMethod(storm::solver::NativeLinearEquationSolverMethod::OptimisticValueIteration);
266class SparseNativeGuessingValueIterationEnvironment {
269 static const DtmcEngine engine = DtmcEngine::PrismSparse;
270 static const bool isExact =
false;
277 env.
solver().
native().
setMethod(storm::solver::NativeLinearEquationSolverMethod::GuessingValueIteration);
283class SparseNativeIntervalIterationEnvironment {
286 static const DtmcEngine engine = DtmcEngine::PrismSparse;
287 static const bool isExact =
false;
301class SparseNativeRationalSearchEnvironment {
304 static const DtmcEngine engine = DtmcEngine::PrismSparse;
305 static const bool isExact =
true;
316class SparseTopologicalEigenLUEnvironment {
319 static const DtmcEngine engine = DtmcEngine::PrismSparse;
320 static const bool isExact =
true;
333class HybridSylvanGmmxxGmresEnvironment {
336 static const DtmcEngine engine = DtmcEngine::Hybrid;
337 static const bool isExact =
false;
341 static void checkLibraryAvailable() {
342#ifndef STORM_HAVE_SYLVAN
343 GTEST_SKIP() <<
"Library Sylvan not available.";
357class HybridCuddNativeJacobiEnvironment {
360 static const DtmcEngine engine = DtmcEngine::Hybrid;
361 static const bool isExact =
false;
365 static void checkLibraryAvailable() {
366#ifndef STORM_HAVE_CUDD
367 GTEST_SKIP() <<
"Library CUDD not available.";
380class HybridCuddNativeSoundValueIterationEnvironment {
383 static const DtmcEngine engine = DtmcEngine::Hybrid;
384 static const bool isExact =
false;
388 static void checkLibraryAvailable() {
389#ifndef STORM_HAVE_CUDD
390 GTEST_SKIP() <<
"Library CUDD not available.";
404class HybridSylvanNativeRationalSearchEnvironment {
407 static const DtmcEngine engine = DtmcEngine::Hybrid;
408 static const bool isExact =
true;
412 static void checkLibraryAvailable() {
413#ifndef STORM_HAVE_SYLVAN
414 GTEST_SKIP() <<
"Library Sylvan not available.";
426class DdSylvanNativePowerEnvironment {
429 static const DtmcEngine engine = DtmcEngine::PrismDd;
430 static const bool isExact =
false;
434 static void checkLibraryAvailable() {
435#ifndef STORM_HAVE_SYLVAN
436 GTEST_SKIP() <<
"Library Sylvan not available.";
449class JaniDdSylvanNativePowerEnvironment {
452 static const DtmcEngine engine = DtmcEngine::JaniDd;
453 static const bool isExact =
false;
457 static void checkLibraryAvailable() {
458#ifndef STORM_HAVE_SYLVAN
459 GTEST_SKIP() <<
"Library Sylvan not available.";
472class DdCuddNativeJacobiEnvironment {
475 static const DtmcEngine engine = DtmcEngine::PrismDd;
476 static const bool isExact =
false;
480 static void checkLibraryAvailable() {
481#ifndef STORM_HAVE_CUDD
482 GTEST_SKIP() <<
"Library CUDD not available.";
495class DdSylvanRationalSearchEnvironment {
498 static const DtmcEngine engine = DtmcEngine::PrismDd;
499 static const bool isExact =
true;
503 static void checkLibraryAvailable() {
504#ifndef STORM_HAVE_SYLVAN
505 GTEST_SKIP() <<
"Library Sylvan not available.";
517template<
typename TestType>
518class DtmcPrctlModelCheckerTest :
public ::testing::Test {
520 typedef typename TestType::ValueType
ValueType;
524 DtmcPrctlModelCheckerTest() : _environment(TestType::createEnvironment()) {}
526 void SetUp()
override {
528 GTEST_SKIP() <<
"Z3 not available.";
530 if constexpr (TestType::engine == DtmcEngine::Hybrid || TestType::engine == DtmcEngine::PrismDd || TestType::engine == DtmcEngine::JaniDd) {
531 TestType::checkLibraryAvailable();
539 return storm::utility::convertNumber<ValueType>(input);
544 bool isSparseModel()
const {
545 return std::is_same<typename TestType::ModelType, SparseModelType>::value;
547 bool isSymbolicModel()
const {
548 return std::is_same<typename TestType::ModelType, SymbolicModelType>::value;
551 template<
typename MT =
typename TestType::ModelType>
552 typename std::enable_if<std::is_same<MT, SparseModelType>::value,
553 std::pair<std::shared_ptr<MT>, std::vector<std::shared_ptr<storm::logic::Formula const>>>>::type
554 buildModelFormulas(std::string
const& pathToPrismFile, std::string
const& formulasAsString, std::string
const& constantDefinitionString =
"")
const {
555 std::pair<std::shared_ptr<MT>, std::vector<std::shared_ptr<storm::logic::Formula const>>> result;
558 if (TestType::engine == DtmcEngine::PrismSparse) {
560 result.first = storm::api::buildSparseModel<ValueType>(program, result.second)->template as<MT>();
561 }
else if (TestType::engine == DtmcEngine::JaniSparse) {
564 result.first = storm::api::buildSparseModel<ValueType>(janiData.first, result.second)->template as<MT>();
570 template<
typename MT =
typename TestType::ModelType>
571 typename std::enable_if<std::is_same<MT, SymbolicModelType>::value,
572 std::pair<std::shared_ptr<MT>, std::vector<std::shared_ptr<storm::logic::Formula const>>>>::type
573 buildModelFormulas(std::string
const& pathToPrismFile, std::string
const& formulasAsString, std::string
const& constantDefinitionString =
"")
const {
574 std::pair<std::shared_ptr<MT>, std::vector<std::shared_ptr<storm::logic::Formula const>>> result;
577 if (TestType::engine == DtmcEngine::Hybrid || TestType::engine == DtmcEngine::PrismDd) {
579 result.first = storm::api::buildSymbolicModel<TestType::ddType, ValueType>(program, result.second)->template as<MT>();
580 }
else if (TestType::engine == DtmcEngine::JaniDd) {
582 janiData.first.substituteFunctions();
584 result.first = storm::api::buildSymbolicModel<TestType::ddType, ValueType>(janiData.first, result.second)->template as<MT>();
589 std::vector<storm::modelchecker::CheckTask<storm::logic::Formula, ValueType>> getTasks(
590 std::vector<std::shared_ptr<storm::logic::Formula const>>
const& formulas)
const {
591 std::vector<storm::modelchecker::CheckTask<storm::logic::Formula, ValueType>> result;
592 for (
auto const& f : formulas) {
593 result.emplace_back(*f);
598 template<
typename MT =
typename TestType::ModelType>
599 typename std::enable_if<std::is_same<MT, SparseModelType>::value, std::shared_ptr<storm::modelchecker::AbstractModelChecker<MT>>>::type createModelChecker(
600 std::shared_ptr<MT>
const& model)
const {
601 if (TestType::engine == DtmcEngine::PrismSparse || TestType::engine == DtmcEngine::JaniSparse) {
602 return std::make_shared<storm::modelchecker::SparseDtmcPrctlModelChecker<SparseModelType>>(*model);
606 template<
typename MT =
typename TestType::ModelType>
607 typename std::enable_if<std::is_same<MT, SymbolicModelType>::value, std::shared_ptr<storm::modelchecker::AbstractModelChecker<MT>>>::type
608 createModelChecker(std::shared_ptr<MT>
const& model)
const {
609 if (TestType::engine == DtmcEngine::Hybrid) {
610 return std::make_shared<storm::modelchecker::HybridDtmcPrctlModelChecker<SymbolicModelType>>(*model);
611 }
else if (TestType::engine == DtmcEngine::PrismDd || TestType::engine == DtmcEngine::JaniDd) {
612 return std::make_shared<storm::modelchecker::SymbolicDtmcPrctlModelChecker<SymbolicModelType>>(*model);
616 template<
typename MT =
typename TestType::ModelType>
617 typename std::enable_if<std::is_same<MT, SparseModelType>::value,
void>::type execute(std::shared_ptr<MT>
const& model,
618 std::function<
void()>
const& f)
const {
622 template<
typename MT =
typename TestType::ModelType>
623 typename std::enable_if<std::is_same<MT, SymbolicModelType>::value,
void>::type execute(std::shared_ptr<MT>
const& model,
624 std::function<
void()>
const& f)
const {
625 model->getManager().execute(f);
629 std::unique_ptr<storm::modelchecker::CheckResult>& result) {
631 result->filter(*filter);
632 return result->asQualitativeCheckResult().forallTrue();
636 std::unique_ptr<storm::modelchecker::CheckResult>& result) {
638 result->filter(*filter);
639 return result->asQuantitativeCheckResult<
ValueType>().getMin();
646 if (isSparseModel()) {
647 return std::make_unique<storm::modelchecker::ExplicitQualitativeCheckResult>(model->template as<SparseModelType>()->getInitialStates());
649 return std::make_unique<storm::modelchecker::SymbolicQualitativeCheckResult<TestType::ddType>>(
650 model->template as<SymbolicModelType>()->getReachableStates(), model->template as<SymbolicModelType>()->getInitialStates());
655typedef ::testing::Types<
657 SparseGmmxxGmresIluEnvironment, JaniSparseGmmxxGmresIluEnvironment, SparseGmmxxGmresDiagEnvironment, SparseGmmxxBicgstabIluEnvironment,
658 HybridSylvanGmmxxGmresEnvironment,
660 SparseEigenDGmresEnvironment, SparseEigenDoubleLUEnvironment, SparseEigenRationalLUEnvironment, SparseRationalEliminationEnvironment,
661 SparseNativeJacobiEnvironment, SparseNativeWalkerChaeEnvironment, SparseNativeSorEnvironment, SparseNativePowerEnvironment,
662 SparseNativeSoundValueIterationEnvironment, SparseNativeOptimisticValueIterationEnvironment, SparseNativeGuessingValueIterationEnvironment,
663 SparseNativeIntervalIterationEnvironment, SparseNativeRationalSearchEnvironment, SparseTopologicalEigenLUEnvironment, HybridCuddNativeJacobiEnvironment,
664 HybridCuddNativeSoundValueIterationEnvironment, HybridSylvanNativeRationalSearchEnvironment, DdSylvanNativePowerEnvironment,
665 JaniDdSylvanNativePowerEnvironment, DdCuddNativeJacobiEnvironment, DdSylvanRationalSearchEnvironment>
671 std::string formulasString =
"P=? [F \"one\"]";
672 formulasString +=
"; P=? [F \"two\"]";
673 formulasString +=
"; P=? [F \"three\"]";
674 formulasString +=
"; R=? [F \"done\"]";
676 auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/dtmc/die.pm", formulasString);
677 auto model = std::move(modelFormulas.first);
678 auto tasks = this->getTasks(modelFormulas.second);
679 this->execute(model, [&]() {
680 EXPECT_EQ(13ul, model->getNumberOfStates());
681 EXPECT_EQ(20ul, model->getNumberOfTransitions());
683 auto checker = this->createModelChecker(model);
684 std::unique_ptr<storm::modelchecker::CheckResult> result;
686 result = checker->check(this->env(), tasks[0]);
689 result = checker->check(this->env(), tasks[1]);
692 result = checker->check(this->env(), tasks[2]);
695 result = checker->check(this->env(), tasks[3]);
700TYPED_TEST(DtmcPrctlModelCheckerTest, Crowds) {
701 std::string formulasString =
"P=? [F observe0>1]";
702 formulasString +=
"; P=? [F \"observeIGreater1\"]";
703 formulasString +=
"; P=? [F observe1>1]";
705 auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/dtmc/crowds-4-3.pm", formulasString);
706 auto model = std::move(modelFormulas.first);
707 auto tasks = this->getTasks(modelFormulas.second);
708 this->execute(model, [&]() {
709 EXPECT_EQ(726ul, model->getNumberOfStates());
710 EXPECT_EQ(1146ul, model->getNumberOfTransitions());
712 auto checker = this->createModelChecker(model);
713 std::unique_ptr<storm::modelchecker::CheckResult> result;
715 result = checker->check(this->env(), tasks[0]);
718 result = checker->check(this->env(), tasks[1]);
721 result = checker->check(this->env(), tasks[2]);
726TYPED_TEST(DtmcPrctlModelCheckerTest, SynchronousLeader) {
727 std::string formulasString =
"P=? [F \"elected\"]";
728 formulasString +=
"; P=? [F<=5 \"elected\"]";
729 formulasString +=
"; R=? [F \"elected\"]";
731 auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/dtmc/leader-3-5.pm", formulasString);
732 auto model = std::move(modelFormulas.first);
733 auto tasks = this->getTasks(modelFormulas.second);
734 this->execute(model, [&]() {
735 EXPECT_EQ(273ul, model->getNumberOfStates());
736 EXPECT_EQ(397ul, model->getNumberOfTransitions());
738 auto checker = this->createModelChecker(model);
739 std::unique_ptr<storm::modelchecker::CheckResult> result;
741 result = checker->check(this->env(), tasks[0]);
744 result = checker->check(this->env(), tasks[1]);
747 result = checker->check(this->env(), tasks[2]);
752TEST(DtmcPrctlModelCheckerTest, AllUntilProbabilities) {
754 GTEST_SKIP() <<
"Z3 not available.";
756 std::string formulasString =
"P=? [F \"one\"]";
757 formulasString +=
"; P=? [F \"two\"]";
758 formulasString +=
"; P=? [F \"three\"]";
762 std::vector<storm::modelchecker::CheckTask<storm::logic::Formula, double>> tasks;
763 for (
auto const& f : formulas) {
764 tasks.emplace_back(*f);
766 auto model = storm::api::buildSparseModel<double>(program, formulas)->template as<storm::models::sparse::Dtmc<double>>();
767 EXPECT_EQ(13ul, model->getNumberOfStates());
768 EXPECT_EQ(20ul, model->getNumberOfTransitions());
772 initialStates.set(0);
784 initialStates, phiStates, psiStates);
786 EXPECT_NEAR(1.0 / 6, result[7], 1e-6);
787 EXPECT_NEAR(1.0 / 6, result[8], 1e-6);
788 EXPECT_NEAR(1.0 / 6, result[9], 1e-6);
789 EXPECT_NEAR(1.0 / 6, result[10], 1e-6);
790 EXPECT_NEAR(1.0 / 6, result[11], 1e-6);
791 EXPECT_NEAR(1.0 / 6, result[12], 1e-6);
798 EXPECT_NEAR(1, result[0], 1e-6);
799 EXPECT_NEAR(0.5, result[1], 1e-6);
800 EXPECT_NEAR(0.5, result[2], 1e-6);
801 EXPECT_NEAR(0.25, result[5], 1e-6);
802 EXPECT_NEAR(0, result[7], 1e-6);
803 EXPECT_NEAR(0, result[8], 1e-6);
804 EXPECT_NEAR(0, result[9], 1e-6);
805 EXPECT_NEAR(0.125, result[10], 1e-6);
806 EXPECT_NEAR(0.125, result[11], 1e-6);
807 EXPECT_NEAR(0, result[12], 1e-6);
810TYPED_TEST(DtmcPrctlModelCheckerTest, LtlProbabilitiesDie) {
811#ifdef STORM_HAVE_LTL_MODELCHECKING_SUPPORT
812 std::string formulasString =
"P=? [(X s>0) U (s=7 & d=2)]";
813 formulasString +=
"; P=? [ X (((s=1) U (s=3)) U (s=7))]";
814 formulasString +=
"; P=? [ (F (X (s=6 & (XX s=5)))) & (F G (d!=5))]";
815 formulasString +=
"; P=? [ F (s=3 U (\"three\"))]";
816 formulasString +=
"; P=? [ F s=3 U (\"three\")]";
817 formulasString +=
"; P=? [ F (s=6) & X \"done\"]";
818 formulasString +=
"; P=? [ (F s=6) & (X \"done\")]";
820 auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/dtmc/die.pm", formulasString);
821 auto model = std::move(modelFormulas.first);
822 auto tasks = this->getTasks(modelFormulas.second);
823 this->execute(model, [&]() {
824 EXPECT_EQ(13ul, model->getNumberOfStates());
825 EXPECT_EQ(20ul, model->getNumberOfTransitions());
827 auto checker = this->createModelChecker(model);
828 std::unique_ptr<storm::modelchecker::CheckResult> result;
831 if (TypeParam::engine == DtmcEngine::PrismSparse || TypeParam::engine == DtmcEngine::JaniSparse) {
832 result = checker->check(tasks[0]);
835 result = checker->check(tasks[1]);
838 result = checker->check(tasks[2]);
841 result = checker->check(tasks[3]);
844 result = checker->check(tasks[4]);
847 result = checker->check(tasks[5]);
850 result = checker->check(tasks[6]);
853 EXPECT_FALSE(checker->canHandle(tasks[0]));
861TYPED_TEST(DtmcPrctlModelCheckerTest, LtlProbabilitiesSynchronousLeader) {
862#ifdef STORM_HAVE_LTL_MODELCHECKING_SUPPORT
863 std::string formulasString =
"P=? [X (u1=true U \"elected\")]";
864 formulasString +=
"; P=? [X !(u1=true U \"elected\")]";
865 formulasString +=
"; P=? [X v1=2 & X v1=1]";
866 formulasString +=
"; P=? [(X v1=2) & (X v1=1)]";
867 formulasString +=
"; P=? [(!X v1=2) & (X v1=1)]";
869 auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/dtmc/leader-3-5.pm", formulasString);
870 auto model = std::move(modelFormulas.first);
871 auto tasks = this->getTasks(modelFormulas.second);
872 this->execute(model, [&]() {
873 EXPECT_EQ(273ul, model->getNumberOfStates());
874 EXPECT_EQ(397ul, model->getNumberOfTransitions());
876 auto checker = this->createModelChecker(model);
877 std::unique_ptr<storm::modelchecker::CheckResult> result;
880 if (TypeParam::engine == DtmcEngine::PrismSparse || TypeParam::engine == DtmcEngine::JaniSparse) {
881 result = checker->check(tasks[0]);
884 result = checker->check(tasks[1]);
887 result = checker->check(tasks[2]);
890 result = checker->check(tasks[3]);
893 result = checker->check(tasks[4]);
897 EXPECT_FALSE(checker->canHandle(tasks[0]));
905TYPED_TEST(DtmcPrctlModelCheckerTest, HOAProbabilitiesDie) {
907 std::string formulasString =
"P=?[HOA: {\"" STORM_TEST_RESOURCES_DIR
"/hoa/automaton_UXp0p1.hoa\", \"p0\" -> (s>0), \"p1\" -> (s=7 & d=2) }]";
909 formulasString +=
"; P=?[HOA: {\"" STORM_TEST_RESOURCES_DIR
"/hoa/automaton_UXp0p1.hoa\", \"p0\" -> (s>0), \"p1\" -> (d=4 | d=2) }]";
911 formulasString +=
"; P=?[HOA: {\"" STORM_TEST_RESOURCES_DIR
"/hoa/automaton_Fandp0Xp1.hoa\", \"p0\" -> (s=4), \"p1\" -> \"three\" }]";
913 formulasString +=
"; P=?[HOA: {\"" STORM_TEST_RESOURCES_DIR
"/hoa/automaton_Fandp0Xp1.hoa\", \"p0\" -> (s=6), \"p1\" -> \"done\" }]";
915 formulasString +=
"; P=?[HOA: {\"" STORM_TEST_RESOURCES_DIR
"/hoa/automaton_Fandp0Xp1.hoa\", \"p0\" -> (s=6), \"p1\" -> !\"done\" }]";
917 formulasString +=
"; P=?[HOA: {\"" STORM_TEST_RESOURCES_DIR
"/hoa/automaton_Fandp0Xp1.hoa\", \"p0\" -> (s=4 | s=5), \"p1\" -> s=7 & (d=3 | d=5) }]";
919 formulasString +=
"; P>0.3[HOA: {\"" STORM_TEST_RESOURCES_DIR
"/hoa/automaton_Fandp0Xp1.hoa\", \"p0\" -> (s=4 | s=5), \"p1\" -> s=7 & (d=3 | d=5) }]";
921 auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/dtmc/die.pm", formulasString);
922 auto model = std::move(modelFormulas.first);
923 auto tasks = this->getTasks(modelFormulas.second);
924 this->execute(model, [&]() {
925 EXPECT_EQ(13ul, model->getNumberOfStates());
926 EXPECT_EQ(20ul, model->getNumberOfTransitions());
928 auto checker = this->createModelChecker(model);
929 std::unique_ptr<storm::modelchecker::CheckResult> result;
932 if (TypeParam::engine == DtmcEngine::PrismSparse || TypeParam::engine == DtmcEngine::JaniSparse) {
933 result = checker->check(tasks[0]);
936 result = checker->check(tasks[1]);
939 result = checker->check(tasks[2]);
942 result = checker->check(tasks[3]);
945 result = checker->check(tasks[4]);
948 result = checker->check(tasks[5]);
951 result = checker->check(tasks[6]);
952 EXPECT_TRUE(this->getQualitativeResultAtInitialState(model, result));
954 EXPECT_FALSE(checker->canHandle(tasks[0]));
959TYPED_TEST(DtmcPrctlModelCheckerTest, SmallDiscount) {
960 if (TypeParam::isExact) {
961 GTEST_SKIP() <<
"Exact computations for discounted properties are not supported.";
963 std::string formulasString =
"R=? [ C ]";
964 formulasString +=
"; R=? [ Cdiscount=9/10 ]";
965 formulasString +=
"; R=? [ Cdiscount=15/16 ]";
966 formulasString +=
"; R=? [ C<5discount=9/10 ]";
967 formulasString +=
"; R=? [ C<5discount=15/16 ]";
968 auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/dtmc/small_discount.nm", formulasString);
969 auto model = std::move(modelFormulas.first);
970 auto tasks = this->getTasks(modelFormulas.second);
971 EXPECT_EQ(3ul, model->getNumberOfStates());
972 EXPECT_EQ(4ul, model->getNumberOfTransitions());
974 auto checker = this->createModelChecker(model);
976 if (TypeParam::engine == DtmcEngine::PrismSparse || TypeParam::engine == DtmcEngine::JaniSparse) {
977 std::unique_ptr<storm::modelchecker::CheckResult> result = checker->check(this->env(), tasks[0]);
980 result = checker->check(this->env(), tasks[1]);
982 result = checker->check(this->env(), tasks[2]);
984 result = checker->check(this->env(), tasks[3]);
986 result = checker->check(this->env(), tasks[4]);
989 EXPECT_FALSE(checker->canHandle(tasks[0]));
990 EXPECT_FALSE(checker->canHandle(tasks[1]));
991 EXPECT_FALSE(checker->canHandle(tasks[2]));
992 EXPECT_FALSE(checker->canHandle(tasks[3]));
993 EXPECT_FALSE(checker->canHandle(tasks[4]));
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)
void setPrecision(storm::RationalNumber value)
void setPreconditioner(storm::solver::EigenLinearEquationSolverPreconditioner value)
void setMethod(storm::solver::EigenLinearEquationSolverMethod value)
SolverEnvironment & solver()
void setMethod(storm::solver::GmmxxLinearEquationSolverMethod value)
void setPrecision(storm::RationalNumber value)
void setPreconditioner(storm::solver::GmmxxLinearEquationSolverPreconditioner value)
void setMaximalNumberOfIterations(uint64_t value)
void setMethod(storm::solver::NativeLinearEquationSolverMethod value)
void setRelativeTerminationCriterion(bool value)
void setPrecision(storm::RationalNumber value)
TopologicalSolverEnvironment & topological()
void setLinearEquationSolverType(storm::solver::EquationSolverType const &value, bool isSetFromDefault=false)
EigenSolverEnvironment & eigen()
void setForceSoundness(bool value)
NativeSolverEnvironment & native()
GmmxxSolverEnvironment & gmmxx()
void setUnderlyingEquationSolverType(storm::solver::EquationSolverType value)
static std::vector< ValueType > computeAllUntilProbabilities(Environment const &env, storm::solver::SolveGoal< ValueType > &&goal, storm::storage::SparseMatrix< ValueType > const &transitionMatrix, storm::storage::BitVector const &initialStates, storm::storage::BitVector const &phiStates, storm::storage::BitVector const &psiStates)
This class represents a discrete-time Markov chain.
This class represents a discrete-time Markov chain.
A bit vector that is internally represented as a vector of 64-bit values.
A class that holds a possibly non-square matrix in the compressed row storage format.
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...
TYPED_TEST(GraphTestAR, SymbolicProb01StochasticGameDieSmall)
TYPED_TEST_SUITE(GraphTestAR, TestingTypes,)
::testing::Types< Cudd, Sylvan > TestingTypes