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;
350class HybridCuddNativeJacobiEnvironment {
353 static const DtmcEngine engine = DtmcEngine::Hybrid;
354 static const bool isExact =
false;
366class HybridCuddNativeSoundValueIterationEnvironment {
369 static const DtmcEngine engine = DtmcEngine::Hybrid;
370 static const bool isExact =
false;
383class HybridSylvanNativeRationalSearchEnvironment {
386 static const DtmcEngine engine = DtmcEngine::Hybrid;
387 static const bool isExact =
true;
398class DdSylvanNativePowerEnvironment {
401 static const DtmcEngine engine = DtmcEngine::PrismDd;
402 static const bool isExact =
false;
414class JaniDdSylvanNativePowerEnvironment {
417 static const DtmcEngine engine = DtmcEngine::JaniDd;
418 static const bool isExact =
false;
430class DdCuddNativeJacobiEnvironment {
433 static const DtmcEngine engine = DtmcEngine::PrismDd;
434 static const bool isExact =
false;
446class DdSylvanRationalSearchEnvironment {
449 static const DtmcEngine engine = DtmcEngine::PrismDd;
450 static const bool isExact =
true;
461template<
typename TestType>
462class DtmcPrctlModelCheckerTest :
public ::testing::Test {
464 typedef typename TestType::ValueType
ValueType;
468 DtmcPrctlModelCheckerTest() : _environment(TestType::createEnvironment()) {}
470 void SetUp()
override {
472 GTEST_SKIP() <<
"Z3 not available.";
480 return storm::utility::convertNumber<ValueType>(input);
485 bool isSparseModel()
const {
486 return std::is_same<typename TestType::ModelType, SparseModelType>::value;
488 bool isSymbolicModel()
const {
489 return std::is_same<typename TestType::ModelType, SymbolicModelType>::value;
492 template<
typename MT =
typename TestType::ModelType>
493 typename std::enable_if<std::is_same<MT, SparseModelType>::value,
494 std::pair<std::shared_ptr<MT>, std::vector<std::shared_ptr<storm::logic::Formula const>>>>::type
495 buildModelFormulas(std::string
const& pathToPrismFile, std::string
const& formulasAsString, std::string
const& constantDefinitionString =
"")
const {
496 std::pair<std::shared_ptr<MT>, std::vector<std::shared_ptr<storm::logic::Formula const>>> result;
499 if (TestType::engine == DtmcEngine::PrismSparse) {
501 result.first = storm::api::buildSparseModel<ValueType>(program, result.second)->template as<MT>();
502 }
else if (TestType::engine == DtmcEngine::JaniSparse) {
505 result.first = storm::api::buildSparseModel<ValueType>(janiData.first, result.second)->template as<MT>();
511 template<
typename MT =
typename TestType::ModelType>
512 typename std::enable_if<std::is_same<MT, SymbolicModelType>::value,
513 std::pair<std::shared_ptr<MT>, std::vector<std::shared_ptr<storm::logic::Formula const>>>>::type
514 buildModelFormulas(std::string
const& pathToPrismFile, std::string
const& formulasAsString, std::string
const& constantDefinitionString =
"")
const {
515 std::pair<std::shared_ptr<MT>, std::vector<std::shared_ptr<storm::logic::Formula const>>> result;
518 if (TestType::engine == DtmcEngine::Hybrid || TestType::engine == DtmcEngine::PrismDd) {
520 result.first = storm::api::buildSymbolicModel<TestType::ddType, ValueType>(program, result.second)->template as<MT>();
521 }
else if (TestType::engine == DtmcEngine::JaniDd) {
523 janiData.first.substituteFunctions();
525 result.first = storm::api::buildSymbolicModel<TestType::ddType, ValueType>(janiData.first, result.second)->template as<MT>();
530 std::vector<storm::modelchecker::CheckTask<storm::logic::Formula, ValueType>> getTasks(
531 std::vector<std::shared_ptr<storm::logic::Formula const>>
const& formulas)
const {
532 std::vector<storm::modelchecker::CheckTask<storm::logic::Formula, ValueType>> result;
533 for (
auto const& f : formulas) {
534 result.emplace_back(*f);
539 template<
typename MT =
typename TestType::ModelType>
540 typename std::enable_if<std::is_same<MT, SparseModelType>::value, std::shared_ptr<storm::modelchecker::AbstractModelChecker<MT>>>::type createModelChecker(
541 std::shared_ptr<MT>
const& model)
const {
542 if (TestType::engine == DtmcEngine::PrismSparse || TestType::engine == DtmcEngine::JaniSparse) {
543 return std::make_shared<storm::modelchecker::SparseDtmcPrctlModelChecker<SparseModelType>>(*model);
547 template<
typename MT =
typename TestType::ModelType>
548 typename std::enable_if<std::is_same<MT, SymbolicModelType>::value, std::shared_ptr<storm::modelchecker::AbstractModelChecker<MT>>>::type
549 createModelChecker(std::shared_ptr<MT>
const& model)
const {
550 if (TestType::engine == DtmcEngine::Hybrid) {
551 return std::make_shared<storm::modelchecker::HybridDtmcPrctlModelChecker<SymbolicModelType>>(*model);
552 }
else if (TestType::engine == DtmcEngine::PrismDd || TestType::engine == DtmcEngine::JaniDd) {
553 return std::make_shared<storm::modelchecker::SymbolicDtmcPrctlModelChecker<SymbolicModelType>>(*model);
557 template<
typename MT =
typename TestType::ModelType>
558 typename std::enable_if<std::is_same<MT, SparseModelType>::value,
void>::type execute(std::shared_ptr<MT>
const& model,
559 std::function<
void()>
const& f)
const {
563 template<
typename MT =
typename TestType::ModelType>
564 typename std::enable_if<std::is_same<MT, SymbolicModelType>::value,
void>::type execute(std::shared_ptr<MT>
const& model,
565 std::function<
void()>
const& f)
const {
566 model->getManager().execute(f);
570 std::unique_ptr<storm::modelchecker::CheckResult>& result) {
572 result->filter(*filter);
573 return result->asQualitativeCheckResult().forallTrue();
577 std::unique_ptr<storm::modelchecker::CheckResult>& result) {
579 result->filter(*filter);
580 return result->asQuantitativeCheckResult<
ValueType>().getMin();
587 if (isSparseModel()) {
588 return std::make_unique<storm::modelchecker::ExplicitQualitativeCheckResult>(model->template as<SparseModelType>()->getInitialStates());
590 return std::make_unique<storm::modelchecker::SymbolicQualitativeCheckResult<TestType::ddType>>(
591 model->template as<SymbolicModelType>()->getReachableStates(), model->template as<SymbolicModelType>()->getInitialStates());
596typedef ::testing::Types<
598 SparseGmmxxGmresIluEnvironment, JaniSparseGmmxxGmresIluEnvironment, SparseGmmxxGmresDiagEnvironment, SparseGmmxxBicgstabIluEnvironment,
599 HybridSylvanGmmxxGmresEnvironment,
601 SparseEigenDGmresEnvironment, SparseEigenDoubleLUEnvironment, SparseEigenRationalLUEnvironment, SparseRationalEliminationEnvironment,
602 SparseNativeJacobiEnvironment, SparseNativeWalkerChaeEnvironment, SparseNativeSorEnvironment, SparseNativePowerEnvironment,
603 SparseNativeSoundValueIterationEnvironment, SparseNativeOptimisticValueIterationEnvironment, SparseNativeGuessingValueIterationEnvironment,
604 SparseNativeIntervalIterationEnvironment, SparseNativeRationalSearchEnvironment, SparseTopologicalEigenLUEnvironment, HybridCuddNativeJacobiEnvironment,
605 HybridCuddNativeSoundValueIterationEnvironment, HybridSylvanNativeRationalSearchEnvironment, DdSylvanNativePowerEnvironment,
606 JaniDdSylvanNativePowerEnvironment, DdCuddNativeJacobiEnvironment, DdSylvanRationalSearchEnvironment>
612 std::string formulasString =
"P=? [F \"one\"]";
613 formulasString +=
"; P=? [F \"two\"]";
614 formulasString +=
"; P=? [F \"three\"]";
615 formulasString +=
"; R=? [F \"done\"]";
617 auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/dtmc/die.pm", formulasString);
618 auto model = std::move(modelFormulas.first);
619 auto tasks = this->getTasks(modelFormulas.second);
620 this->execute(model, [&]() {
621 EXPECT_EQ(13ul, model->getNumberOfStates());
622 EXPECT_EQ(20ul, model->getNumberOfTransitions());
624 auto checker = this->createModelChecker(model);
625 std::unique_ptr<storm::modelchecker::CheckResult> result;
627 result = checker->check(this->env(), tasks[0]);
630 result = checker->check(this->env(), tasks[1]);
633 result = checker->check(this->env(), tasks[2]);
636 result = checker->check(this->env(), tasks[3]);
641TYPED_TEST(DtmcPrctlModelCheckerTest, Crowds) {
642 std::string formulasString =
"P=? [F observe0>1]";
643 formulasString +=
"; P=? [F \"observeIGreater1\"]";
644 formulasString +=
"; P=? [F observe1>1]";
646 auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/dtmc/crowds-4-3.pm", formulasString);
647 auto model = std::move(modelFormulas.first);
648 auto tasks = this->getTasks(modelFormulas.second);
649 this->execute(model, [&]() {
650 EXPECT_EQ(726ul, model->getNumberOfStates());
651 EXPECT_EQ(1146ul, model->getNumberOfTransitions());
653 auto checker = this->createModelChecker(model);
654 std::unique_ptr<storm::modelchecker::CheckResult> result;
656 result = checker->check(this->env(), tasks[0]);
659 result = checker->check(this->env(), tasks[1]);
662 result = checker->check(this->env(), tasks[2]);
667TYPED_TEST(DtmcPrctlModelCheckerTest, SynchronousLeader) {
668 std::string formulasString =
"P=? [F \"elected\"]";
669 formulasString +=
"; P=? [F<=5 \"elected\"]";
670 formulasString +=
"; R=? [F \"elected\"]";
672 auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/dtmc/leader-3-5.pm", formulasString);
673 auto model = std::move(modelFormulas.first);
674 auto tasks = this->getTasks(modelFormulas.second);
675 this->execute(model, [&]() {
676 EXPECT_EQ(273ul, model->getNumberOfStates());
677 EXPECT_EQ(397ul, model->getNumberOfTransitions());
679 auto checker = this->createModelChecker(model);
680 std::unique_ptr<storm::modelchecker::CheckResult> result;
682 result = checker->check(this->env(), tasks[0]);
685 result = checker->check(this->env(), tasks[1]);
688 result = checker->check(this->env(), tasks[2]);
693TEST(DtmcPrctlModelCheckerTest, AllUntilProbabilities) {
695 GTEST_SKIP() <<
"Z3 not available.";
697 std::string formulasString =
"P=? [F \"one\"]";
698 formulasString +=
"; P=? [F \"two\"]";
699 formulasString +=
"; P=? [F \"three\"]";
703 std::vector<storm::modelchecker::CheckTask<storm::logic::Formula, double>> tasks;
704 for (
auto const& f : formulas) {
705 tasks.emplace_back(*f);
707 auto model = storm::api::buildSparseModel<double>(program, formulas)->template as<storm::models::sparse::Dtmc<double>>();
708 EXPECT_EQ(13ul, model->getNumberOfStates());
709 EXPECT_EQ(20ul, model->getNumberOfTransitions());
713 initialStates.set(0);
725 initialStates, phiStates, psiStates);
727 EXPECT_NEAR(1.0 / 6, result[7], 1e-6);
728 EXPECT_NEAR(1.0 / 6, result[8], 1e-6);
729 EXPECT_NEAR(1.0 / 6, result[9], 1e-6);
730 EXPECT_NEAR(1.0 / 6, result[10], 1e-6);
731 EXPECT_NEAR(1.0 / 6, result[11], 1e-6);
732 EXPECT_NEAR(1.0 / 6, result[12], 1e-6);
739 EXPECT_NEAR(1, result[0], 1e-6);
740 EXPECT_NEAR(0.5, result[1], 1e-6);
741 EXPECT_NEAR(0.5, result[2], 1e-6);
742 EXPECT_NEAR(0.25, result[5], 1e-6);
743 EXPECT_NEAR(0, result[7], 1e-6);
744 EXPECT_NEAR(0, result[8], 1e-6);
745 EXPECT_NEAR(0, result[9], 1e-6);
746 EXPECT_NEAR(0.125, result[10], 1e-6);
747 EXPECT_NEAR(0.125, result[11], 1e-6);
748 EXPECT_NEAR(0, result[12], 1e-6);
751TYPED_TEST(DtmcPrctlModelCheckerTest, LtlProbabilitiesDie) {
752#ifdef STORM_HAVE_LTL_MODELCHECKING_SUPPORT
753 std::string formulasString =
"P=? [(X s>0) U (s=7 & d=2)]";
754 formulasString +=
"; P=? [ X (((s=1) U (s=3)) U (s=7))]";
755 formulasString +=
"; P=? [ (F (X (s=6 & (XX s=5)))) & (F G (d!=5))]";
756 formulasString +=
"; P=? [ F (s=3 U (\"three\"))]";
757 formulasString +=
"; P=? [ F s=3 U (\"three\")]";
758 formulasString +=
"; P=? [ F (s=6) & X \"done\"]";
759 formulasString +=
"; P=? [ (F s=6) & (X \"done\")]";
761 auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/dtmc/die.pm", formulasString);
762 auto model = std::move(modelFormulas.first);
763 auto tasks = this->getTasks(modelFormulas.second);
764 this->execute(model, [&]() {
765 EXPECT_EQ(13ul, model->getNumberOfStates());
766 EXPECT_EQ(20ul, model->getNumberOfTransitions());
768 auto checker = this->createModelChecker(model);
769 std::unique_ptr<storm::modelchecker::CheckResult> result;
772 if (TypeParam::engine == DtmcEngine::PrismSparse || TypeParam::engine == DtmcEngine::JaniSparse) {
773 result = checker->check(tasks[0]);
776 result = checker->check(tasks[1]);
779 result = checker->check(tasks[2]);
782 result = checker->check(tasks[3]);
785 result = checker->check(tasks[4]);
788 result = checker->check(tasks[5]);
791 result = checker->check(tasks[6]);
794 EXPECT_FALSE(checker->canHandle(tasks[0]));
802TYPED_TEST(DtmcPrctlModelCheckerTest, LtlProbabilitiesSynchronousLeader) {
803#ifdef STORM_HAVE_LTL_MODELCHECKING_SUPPORT
804 std::string formulasString =
"P=? [X (u1=true U \"elected\")]";
805 formulasString +=
"; P=? [X !(u1=true U \"elected\")]";
806 formulasString +=
"; P=? [X v1=2 & X v1=1]";
807 formulasString +=
"; P=? [(X v1=2) & (X v1=1)]";
808 formulasString +=
"; P=? [(!X v1=2) & (X v1=1)]";
810 auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/dtmc/leader-3-5.pm", formulasString);
811 auto model = std::move(modelFormulas.first);
812 auto tasks = this->getTasks(modelFormulas.second);
813 this->execute(model, [&]() {
814 EXPECT_EQ(273ul, model->getNumberOfStates());
815 EXPECT_EQ(397ul, model->getNumberOfTransitions());
817 auto checker = this->createModelChecker(model);
818 std::unique_ptr<storm::modelchecker::CheckResult> result;
821 if (TypeParam::engine == DtmcEngine::PrismSparse || TypeParam::engine == DtmcEngine::JaniSparse) {
822 result = checker->check(tasks[0]);
825 result = checker->check(tasks[1]);
828 result = checker->check(tasks[2]);
831 result = checker->check(tasks[3]);
834 result = checker->check(tasks[4]);
838 EXPECT_FALSE(checker->canHandle(tasks[0]));
846TYPED_TEST(DtmcPrctlModelCheckerTest, HOAProbabilitiesDie) {
848 std::string formulasString =
"P=?[HOA: {\"" STORM_TEST_RESOURCES_DIR
"/hoa/automaton_UXp0p1.hoa\", \"p0\" -> (s>0), \"p1\" -> (s=7 & d=2) }]";
850 formulasString +=
"; P=?[HOA: {\"" STORM_TEST_RESOURCES_DIR
"/hoa/automaton_UXp0p1.hoa\", \"p0\" -> (s>0), \"p1\" -> (d=4 | d=2) }]";
852 formulasString +=
"; P=?[HOA: {\"" STORM_TEST_RESOURCES_DIR
"/hoa/automaton_Fandp0Xp1.hoa\", \"p0\" -> (s=4), \"p1\" -> \"three\" }]";
854 formulasString +=
"; P=?[HOA: {\"" STORM_TEST_RESOURCES_DIR
"/hoa/automaton_Fandp0Xp1.hoa\", \"p0\" -> (s=6), \"p1\" -> \"done\" }]";
856 formulasString +=
"; P=?[HOA: {\"" STORM_TEST_RESOURCES_DIR
"/hoa/automaton_Fandp0Xp1.hoa\", \"p0\" -> (s=6), \"p1\" -> !\"done\" }]";
858 formulasString +=
"; P=?[HOA: {\"" STORM_TEST_RESOURCES_DIR
"/hoa/automaton_Fandp0Xp1.hoa\", \"p0\" -> (s=4 | s=5), \"p1\" -> s=7 & (d=3 | d=5) }]";
860 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) }]";
862 auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/dtmc/die.pm", formulasString);
863 auto model = std::move(modelFormulas.first);
864 auto tasks = this->getTasks(modelFormulas.second);
865 this->execute(model, [&]() {
866 EXPECT_EQ(13ul, model->getNumberOfStates());
867 EXPECT_EQ(20ul, model->getNumberOfTransitions());
869 auto checker = this->createModelChecker(model);
870 std::unique_ptr<storm::modelchecker::CheckResult> result;
873 if (TypeParam::engine == DtmcEngine::PrismSparse || TypeParam::engine == DtmcEngine::JaniSparse) {
874 result = checker->check(tasks[0]);
877 result = checker->check(tasks[1]);
880 result = checker->check(tasks[2]);
883 result = checker->check(tasks[3]);
886 result = checker->check(tasks[4]);
889 result = checker->check(tasks[5]);
892 result = checker->check(tasks[6]);
893 EXPECT_TRUE(this->getQualitativeResultAtInitialState(model, result));
895 EXPECT_FALSE(checker->canHandle(tasks[0]));
900TYPED_TEST(DtmcPrctlModelCheckerTest, SmallDiscount) {
901 if (TypeParam::isExact) {
902 GTEST_SKIP() <<
"Exact computations for discounted properties are not supported.";
904 std::string formulasString =
"R=? [ C ]";
905 formulasString +=
"; R=? [ Cdiscount=9/10 ]";
906 formulasString +=
"; R=? [ Cdiscount=15/16 ]";
907 formulasString +=
"; R=? [ C<5discount=9/10 ]";
908 formulasString +=
"; R=? [ C<5discount=15/16 ]";
909 auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/dtmc/small_discount.nm", formulasString);
910 auto model = std::move(modelFormulas.first);
911 auto tasks = this->getTasks(modelFormulas.second);
912 EXPECT_EQ(3ul, model->getNumberOfStates());
913 EXPECT_EQ(4ul, model->getNumberOfTransitions());
915 auto checker = this->createModelChecker(model);
917 if (TypeParam::engine == DtmcEngine::PrismSparse || TypeParam::engine == DtmcEngine::JaniSparse) {
918 std::unique_ptr<storm::modelchecker::CheckResult> result = checker->check(this->env(), tasks[0]);
921 result = checker->check(this->env(), tasks[1]);
923 result = checker->check(this->env(), tasks[2]);
925 result = checker->check(this->env(), tasks[3]);
927 result = checker->check(this->env(), tasks[4]);
930 EXPECT_FALSE(checker->canHandle(tasks[0]));
931 EXPECT_FALSE(checker->canHandle(tasks[1]));
932 EXPECT_FALSE(checker->canHandle(tasks[2]));
933 EXPECT_FALSE(checker->canHandle(tasks[3]));
934 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