1#include "storm-config.h"
34enum class DtmcEngine { PrismSparse, JaniSparse,
Hybrid, PrismDd, JaniDd };
36class SparseGmmxxGmresIluEnvironment {
39 static const DtmcEngine engine = DtmcEngine::PrismSparse;
40 static const bool isExact =
false;
53class JaniSparseGmmxxGmresIluEnvironment {
56 static const DtmcEngine engine = DtmcEngine::JaniSparse;
57 static const bool isExact =
false;
70class SparseGmmxxGmresDiagEnvironment {
73 static const DtmcEngine engine = DtmcEngine::PrismSparse;
74 static const bool isExact =
false;
87class SparseGmmxxBicgstabIluEnvironment {
90 static const DtmcEngine engine = DtmcEngine::PrismSparse;
91 static const bool isExact =
false;
104class SparseEigenDGmresEnvironment {
107 static const DtmcEngine engine = DtmcEngine::PrismSparse;
108 static const bool isExact =
false;
121class SparseEigenDoubleLUEnvironment {
124 static const DtmcEngine engine = DtmcEngine::PrismSparse;
125 static const bool isExact =
false;
136class SparseEigenRationalLUEnvironment {
139 static const DtmcEngine engine = DtmcEngine::PrismSparse;
140 static const bool isExact =
true;
151class SparseRationalEliminationEnvironment {
154 static const DtmcEngine engine = DtmcEngine::PrismSparse;
155 static const bool isExact =
true;
165class SparseNativeJacobiEnvironment {
168 static const DtmcEngine engine = DtmcEngine::PrismSparse;
169 static const bool isExact =
false;
181class SparseNativeWalkerChaeEnvironment {
184 static const DtmcEngine engine = DtmcEngine::PrismSparse;
185 static const bool isExact =
false;
198class SparseNativeSorEnvironment {
201 static const DtmcEngine engine = DtmcEngine::PrismSparse;
202 static const bool isExact =
false;
214class SparseNativePowerEnvironment {
217 static const DtmcEngine engine = DtmcEngine::PrismSparse;
218 static const bool isExact =
false;
230class SparseNativeSoundValueIterationEnvironment {
233 static const DtmcEngine engine = DtmcEngine::PrismSparse;
234 static const bool isExact =
false;
241 env.
solver().
native().
setMethod(storm::solver::NativeLinearEquationSolverMethod::SoundValueIteration);
247class SparseNativeOptimisticValueIterationEnvironment {
250 static const DtmcEngine engine = DtmcEngine::PrismSparse;
251 static const bool isExact =
false;
258 env.
solver().
native().
setMethod(storm::solver::NativeLinearEquationSolverMethod::OptimisticValueIteration);
264class SparseNativeIntervalIterationEnvironment {
267 static const DtmcEngine engine = DtmcEngine::PrismSparse;
268 static const bool isExact =
false;
282class SparseNativeRationalSearchEnvironment {
285 static const DtmcEngine engine = DtmcEngine::PrismSparse;
286 static const bool isExact =
true;
297class SparseTopologicalEigenLUEnvironment {
300 static const DtmcEngine engine = DtmcEngine::PrismSparse;
301 static const bool isExact =
true;
313class HybridSylvanGmmxxGmresEnvironment {
316 static const DtmcEngine engine = DtmcEngine::Hybrid;
317 static const bool isExact =
false;
329class HybridCuddNativeJacobiEnvironment {
332 static const DtmcEngine engine = DtmcEngine::Hybrid;
333 static const bool isExact =
false;
345class HybridCuddNativeSoundValueIterationEnvironment {
348 static const DtmcEngine engine = DtmcEngine::Hybrid;
349 static const bool isExact =
false;
362class HybridSylvanNativeRationalSearchEnvironment {
365 static const DtmcEngine engine = DtmcEngine::Hybrid;
366 static const bool isExact =
true;
377class DdSylvanNativePowerEnvironment {
380 static const DtmcEngine engine = DtmcEngine::PrismDd;
381 static const bool isExact =
false;
393class JaniDdSylvanNativePowerEnvironment {
396 static const DtmcEngine engine = DtmcEngine::JaniDd;
397 static const bool isExact =
false;
409class DdCuddNativeJacobiEnvironment {
412 static const DtmcEngine engine = DtmcEngine::PrismDd;
413 static const bool isExact =
false;
425class DdSylvanRationalSearchEnvironment {
428 static const DtmcEngine engine = DtmcEngine::PrismDd;
429 static const bool isExact =
true;
440template<
typename TestType>
441class DtmcPrctlModelCheckerTest :
public ::testing::Test {
443 typedef typename TestType::ValueType
ValueType;
447 DtmcPrctlModelCheckerTest() : _environment(TestType::createEnvironment()) {}
449 void SetUp()
override {
451 GTEST_SKIP() <<
"Z3 not available.";
459 return storm::utility::convertNumber<ValueType>(input);
464 bool isSparseModel()
const {
465 return std::is_same<typename TestType::ModelType, SparseModelType>::value;
467 bool isSymbolicModel()
const {
468 return std::is_same<typename TestType::ModelType, SymbolicModelType>::value;
471 template<
typename MT =
typename TestType::ModelType>
472 typename std::enable_if<std::is_same<MT, SparseModelType>::value,
473 std::pair<std::shared_ptr<MT>, std::vector<std::shared_ptr<storm::logic::Formula const>>>>::type
474 buildModelFormulas(std::string
const& pathToPrismFile, std::string
const& formulasAsString, std::string
const& constantDefinitionString =
"")
const {
475 std::pair<std::shared_ptr<MT>, std::vector<std::shared_ptr<storm::logic::Formula const>>> result;
478 if (TestType::engine == DtmcEngine::PrismSparse) {
480 result.first = storm::api::buildSparseModel<ValueType>(program, result.second)->template as<MT>();
481 }
else if (TestType::engine == DtmcEngine::JaniSparse) {
484 result.first = storm::api::buildSparseModel<ValueType>(janiData.first, result.second)->template as<MT>();
490 template<
typename MT =
typename TestType::ModelType>
491 typename std::enable_if<std::is_same<MT, SymbolicModelType>::value,
492 std::pair<std::shared_ptr<MT>, std::vector<std::shared_ptr<storm::logic::Formula const>>>>::type
493 buildModelFormulas(std::string
const& pathToPrismFile, std::string
const& formulasAsString, std::string
const& constantDefinitionString =
"")
const {
494 std::pair<std::shared_ptr<MT>, std::vector<std::shared_ptr<storm::logic::Formula const>>> result;
497 if (TestType::engine == DtmcEngine::Hybrid || TestType::engine == DtmcEngine::PrismDd) {
499 result.first = storm::api::buildSymbolicModel<TestType::ddType, ValueType>(program, result.second)->template as<MT>();
500 }
else if (TestType::engine == DtmcEngine::JaniDd) {
502 janiData.first.substituteFunctions();
504 result.first = storm::api::buildSymbolicModel<TestType::ddType, ValueType>(janiData.first, result.second)->template as<MT>();
509 std::vector<storm::modelchecker::CheckTask<storm::logic::Formula, ValueType>> getTasks(
510 std::vector<std::shared_ptr<storm::logic::Formula const>>
const& formulas)
const {
511 std::vector<storm::modelchecker::CheckTask<storm::logic::Formula, ValueType>> result;
512 for (
auto const& f : formulas) {
513 result.emplace_back(*f);
518 template<
typename MT =
typename TestType::ModelType>
519 typename std::enable_if<std::is_same<MT, SparseModelType>::value, std::shared_ptr<storm::modelchecker::AbstractModelChecker<MT>>>::type createModelChecker(
520 std::shared_ptr<MT>
const& model)
const {
521 if (TestType::engine == DtmcEngine::PrismSparse || TestType::engine == DtmcEngine::JaniSparse) {
522 return std::make_shared<storm::modelchecker::SparseDtmcPrctlModelChecker<SparseModelType>>(*model);
526 template<
typename MT =
typename TestType::ModelType>
527 typename std::enable_if<std::is_same<MT, SymbolicModelType>::value, std::shared_ptr<storm::modelchecker::AbstractModelChecker<MT>>>::type
528 createModelChecker(std::shared_ptr<MT>
const& model)
const {
529 if (TestType::engine == DtmcEngine::Hybrid) {
530 return std::make_shared<storm::modelchecker::HybridDtmcPrctlModelChecker<SymbolicModelType>>(*model);
531 }
else if (TestType::engine == DtmcEngine::PrismDd || TestType::engine == DtmcEngine::JaniDd) {
532 return std::make_shared<storm::modelchecker::SymbolicDtmcPrctlModelChecker<SymbolicModelType>>(*model);
536 template<
typename MT =
typename TestType::ModelType>
537 typename std::enable_if<std::is_same<MT, SparseModelType>::value,
void>::type execute(std::shared_ptr<MT>
const& model,
538 std::function<
void()>
const& f)
const {
542 template<
typename MT =
typename TestType::ModelType>
543 typename std::enable_if<std::is_same<MT, SymbolicModelType>::value,
void>::type execute(std::shared_ptr<MT>
const& model,
544 std::function<
void()>
const& f)
const {
545 model->getManager().execute(f);
549 std::unique_ptr<storm::modelchecker::CheckResult>& result) {
551 result->filter(*filter);
552 return result->asQualitativeCheckResult().forallTrue();
556 std::unique_ptr<storm::modelchecker::CheckResult>& result) {
558 result->filter(*filter);
559 return result->asQuantitativeCheckResult<
ValueType>().getMin();
566 if (isSparseModel()) {
567 return std::make_unique<storm::modelchecker::ExplicitQualitativeCheckResult>(model->template as<SparseModelType>()->getInitialStates());
569 return std::make_unique<storm::modelchecker::SymbolicQualitativeCheckResult<TestType::ddType>>(
570 model->template as<SymbolicModelType>()->getReachableStates(), model->template as<SymbolicModelType>()->getInitialStates());
575typedef ::testing::Types<
577 SparseGmmxxGmresIluEnvironment, JaniSparseGmmxxGmresIluEnvironment, SparseGmmxxGmresDiagEnvironment, SparseGmmxxBicgstabIluEnvironment,
578 HybridSylvanGmmxxGmresEnvironment,
580 SparseEigenDGmresEnvironment, SparseEigenDoubleLUEnvironment, SparseEigenRationalLUEnvironment, SparseRationalEliminationEnvironment,
581 SparseNativeJacobiEnvironment, SparseNativeWalkerChaeEnvironment, SparseNativeSorEnvironment, SparseNativePowerEnvironment,
582 SparseNativeSoundValueIterationEnvironment, SparseNativeOptimisticValueIterationEnvironment, SparseNativeIntervalIterationEnvironment,
583 SparseNativeRationalSearchEnvironment, SparseTopologicalEigenLUEnvironment, HybridCuddNativeJacobiEnvironment,
584 HybridCuddNativeSoundValueIterationEnvironment, HybridSylvanNativeRationalSearchEnvironment, DdSylvanNativePowerEnvironment,
585 JaniDdSylvanNativePowerEnvironment, DdCuddNativeJacobiEnvironment, DdSylvanRationalSearchEnvironment>
591 std::string formulasString =
"P=? [F \"one\"]";
592 formulasString +=
"; P=? [F \"two\"]";
593 formulasString +=
"; P=? [F \"three\"]";
594 formulasString +=
"; R=? [F \"done\"]";
596 auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/dtmc/die.pm", formulasString);
597 auto model = std::move(modelFormulas.first);
598 auto tasks = this->getTasks(modelFormulas.second);
599 this->execute(model, [&]() {
600 EXPECT_EQ(13ul, model->getNumberOfStates());
601 EXPECT_EQ(20ul, model->getNumberOfTransitions());
603 auto checker = this->createModelChecker(model);
604 std::unique_ptr<storm::modelchecker::CheckResult> result;
606 result = checker->check(this->env(), tasks[0]);
609 result = checker->check(this->env(), tasks[1]);
612 result = checker->check(this->env(), tasks[2]);
615 result = checker->check(this->env(), tasks[3]);
620TYPED_TEST(DtmcPrctlModelCheckerTest, Crowds) {
621 std::string formulasString =
"P=? [F observe0>1]";
622 formulasString +=
"; P=? [F \"observeIGreater1\"]";
623 formulasString +=
"; P=? [F observe1>1]";
625 auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/dtmc/crowds-4-3.pm", formulasString);
626 auto model = std::move(modelFormulas.first);
627 auto tasks = this->getTasks(modelFormulas.second);
628 this->execute(model, [&]() {
629 EXPECT_EQ(726ul, model->getNumberOfStates());
630 EXPECT_EQ(1146ul, model->getNumberOfTransitions());
632 auto checker = this->createModelChecker(model);
633 std::unique_ptr<storm::modelchecker::CheckResult> result;
635 result = checker->check(this->env(), tasks[0]);
638 result = checker->check(this->env(), tasks[1]);
641 result = checker->check(this->env(), tasks[2]);
646TYPED_TEST(DtmcPrctlModelCheckerTest, SynchronousLeader) {
647 std::string formulasString =
"P=? [F \"elected\"]";
648 formulasString +=
"; P=? [F<=5 \"elected\"]";
649 formulasString +=
"; R=? [F \"elected\"]";
651 auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/dtmc/leader-3-5.pm", formulasString);
652 auto model = std::move(modelFormulas.first);
653 auto tasks = this->getTasks(modelFormulas.second);
654 this->execute(model, [&]() {
655 EXPECT_EQ(273ul, model->getNumberOfStates());
656 EXPECT_EQ(397ul, model->getNumberOfTransitions());
658 auto checker = this->createModelChecker(model);
659 std::unique_ptr<storm::modelchecker::CheckResult> result;
661 result = checker->check(this->env(), tasks[0]);
664 result = checker->check(this->env(), tasks[1]);
667 result = checker->check(this->env(), tasks[2]);
672TEST(DtmcPrctlModelCheckerTest, AllUntilProbabilities) {
674 GTEST_SKIP() <<
"Z3 not available.";
676 std::string formulasString =
"P=? [F \"one\"]";
677 formulasString +=
"; P=? [F \"two\"]";
678 formulasString +=
"; P=? [F \"three\"]";
682 std::vector<storm::modelchecker::CheckTask<storm::logic::Formula, double>> tasks;
683 for (
auto const& f : formulas) {
684 tasks.emplace_back(*f);
686 auto model = storm::api::buildSparseModel<double>(program, formulas)->template as<storm::models::sparse::Dtmc<double>>();
687 EXPECT_EQ(13ul, model->getNumberOfStates());
688 EXPECT_EQ(20ul, model->getNumberOfTransitions());
692 initialStates.set(0);
704 initialStates, phiStates, psiStates);
706 EXPECT_NEAR(1.0 / 6, result[7], 1e-6);
707 EXPECT_NEAR(1.0 / 6, result[8], 1e-6);
708 EXPECT_NEAR(1.0 / 6, result[9], 1e-6);
709 EXPECT_NEAR(1.0 / 6, result[10], 1e-6);
710 EXPECT_NEAR(1.0 / 6, result[11], 1e-6);
711 EXPECT_NEAR(1.0 / 6, result[12], 1e-6);
718 EXPECT_NEAR(1, result[0], 1e-6);
719 EXPECT_NEAR(0.5, result[1], 1e-6);
720 EXPECT_NEAR(0.5, result[2], 1e-6);
721 EXPECT_NEAR(0.25, result[5], 1e-6);
722 EXPECT_NEAR(0, result[7], 1e-6);
723 EXPECT_NEAR(0, result[8], 1e-6);
724 EXPECT_NEAR(0, result[9], 1e-6);
725 EXPECT_NEAR(0.125, result[10], 1e-6);
726 EXPECT_NEAR(0.125, result[11], 1e-6);
727 EXPECT_NEAR(0, result[12], 1e-6);
730TYPED_TEST(DtmcPrctlModelCheckerTest, LtlProbabilitiesDie) {
731#ifdef STORM_HAVE_LTL_MODELCHECKING_SUPPORT
732 std::string formulasString =
"P=? [(X s>0) U (s=7 & d=2)]";
733 formulasString +=
"; P=? [ X (((s=1) U (s=3)) U (s=7))]";
734 formulasString +=
"; P=? [ (F (X (s=6 & (XX s=5)))) & (F G (d!=5))]";
735 formulasString +=
"; P=? [ F (s=3 U (\"three\"))]";
736 formulasString +=
"; P=? [ F s=3 U (\"three\")]";
737 formulasString +=
"; P=? [ F (s=6) & X \"done\"]";
738 formulasString +=
"; P=? [ (F s=6) & (X \"done\")]";
740 auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/dtmc/die.pm", formulasString);
741 auto model = std::move(modelFormulas.first);
742 auto tasks = this->getTasks(modelFormulas.second);
743 this->execute(model, [&]() {
744 EXPECT_EQ(13ul, model->getNumberOfStates());
745 EXPECT_EQ(20ul, model->getNumberOfTransitions());
747 auto checker = this->createModelChecker(model);
748 std::unique_ptr<storm::modelchecker::CheckResult> result;
751 if (TypeParam::engine == DtmcEngine::PrismSparse || TypeParam::engine == DtmcEngine::JaniSparse) {
752 result = checker->check(tasks[0]);
755 result = checker->check(tasks[1]);
758 result = checker->check(tasks[2]);
761 result = checker->check(tasks[3]);
764 result = checker->check(tasks[4]);
767 result = checker->check(tasks[5]);
770 result = checker->check(tasks[6]);
773 EXPECT_FALSE(checker->canHandle(tasks[0]));
781TYPED_TEST(DtmcPrctlModelCheckerTest, LtlProbabilitiesSynchronousLeader) {
782#ifdef STORM_HAVE_LTL_MODELCHECKING_SUPPORT
783 std::string formulasString =
"P=? [X (u1=true U \"elected\")]";
784 formulasString +=
"; P=? [X !(u1=true U \"elected\")]";
785 formulasString +=
"; P=? [X v1=2 & X v1=1]";
786 formulasString +=
"; P=? [(X v1=2) & (X v1=1)]";
787 formulasString +=
"; P=? [(!X v1=2) & (X v1=1)]";
789 auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/dtmc/leader-3-5.pm", formulasString);
790 auto model = std::move(modelFormulas.first);
791 auto tasks = this->getTasks(modelFormulas.second);
792 this->execute(model, [&]() {
793 EXPECT_EQ(273ul, model->getNumberOfStates());
794 EXPECT_EQ(397ul, model->getNumberOfTransitions());
796 auto checker = this->createModelChecker(model);
797 std::unique_ptr<storm::modelchecker::CheckResult> result;
800 if (TypeParam::engine == DtmcEngine::PrismSparse || TypeParam::engine == DtmcEngine::JaniSparse) {
801 result = checker->check(tasks[0]);
804 result = checker->check(tasks[1]);
807 result = checker->check(tasks[2]);
810 result = checker->check(tasks[3]);
813 result = checker->check(tasks[4]);
817 EXPECT_FALSE(checker->canHandle(tasks[0]));
825TYPED_TEST(DtmcPrctlModelCheckerTest, HOAProbabilitiesDie) {
827 std::string formulasString =
"P=?[HOA: {\"" STORM_TEST_RESOURCES_DIR
"/hoa/automaton_UXp0p1.hoa\", \"p0\" -> (s>0), \"p1\" -> (s=7 & d=2) }]";
829 formulasString +=
"; P=?[HOA: {\"" STORM_TEST_RESOURCES_DIR
"/hoa/automaton_UXp0p1.hoa\", \"p0\" -> (s>0), \"p1\" -> (d=4 | d=2) }]";
831 formulasString +=
"; P=?[HOA: {\"" STORM_TEST_RESOURCES_DIR
"/hoa/automaton_Fandp0Xp1.hoa\", \"p0\" -> (s=4), \"p1\" -> \"three\" }]";
833 formulasString +=
"; P=?[HOA: {\"" STORM_TEST_RESOURCES_DIR
"/hoa/automaton_Fandp0Xp1.hoa\", \"p0\" -> (s=6), \"p1\" -> \"done\" }]";
835 formulasString +=
"; P=?[HOA: {\"" STORM_TEST_RESOURCES_DIR
"/hoa/automaton_Fandp0Xp1.hoa\", \"p0\" -> (s=6), \"p1\" -> !\"done\" }]";
837 formulasString +=
"; P=?[HOA: {\"" STORM_TEST_RESOURCES_DIR
"/hoa/automaton_Fandp0Xp1.hoa\", \"p0\" -> (s=4 | s=5), \"p1\" -> s=7 & (d=3 | d=5) }]";
839 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) }]";
841 auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/dtmc/die.pm", formulasString);
842 auto model = std::move(modelFormulas.first);
843 auto tasks = this->getTasks(modelFormulas.second);
844 this->execute(model, [&]() {
845 EXPECT_EQ(13ul, model->getNumberOfStates());
846 EXPECT_EQ(20ul, model->getNumberOfTransitions());
848 auto checker = this->createModelChecker(model);
849 std::unique_ptr<storm::modelchecker::CheckResult> result;
852 if (TypeParam::engine == DtmcEngine::PrismSparse || TypeParam::engine == DtmcEngine::JaniSparse) {
853 result = checker->check(tasks[0]);
856 result = checker->check(tasks[1]);
859 result = checker->check(tasks[2]);
862 result = checker->check(tasks[3]);
865 result = checker->check(tasks[4]);
868 result = checker->check(tasks[5]);
871 result = checker->check(tasks[6]);
872 EXPECT_TRUE(this->getQualitativeResultAtInitialState(model, result));
874 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)
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