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<SparseGmmxxGmresIluEnvironment, JaniSparseGmmxxGmresIluEnvironment, SparseGmmxxGmresDiagEnvironment, SparseGmmxxBicgstabIluEnvironment,
576 SparseEigenDGmresEnvironment, SparseEigenDoubleLUEnvironment, SparseEigenRationalLUEnvironment, SparseRationalEliminationEnvironment,
577 SparseNativeJacobiEnvironment, SparseNativeWalkerChaeEnvironment, SparseNativeSorEnvironment, SparseNativePowerEnvironment,
578 SparseNativeSoundValueIterationEnvironment, SparseNativeOptimisticValueIterationEnvironment, SparseNativeIntervalIterationEnvironment,
579 SparseNativeRationalSearchEnvironment, SparseTopologicalEigenLUEnvironment, HybridSylvanGmmxxGmresEnvironment,
580 HybridCuddNativeJacobiEnvironment, HybridCuddNativeSoundValueIterationEnvironment, HybridSylvanNativeRationalSearchEnvironment,
581 DdSylvanNativePowerEnvironment, JaniDdSylvanNativePowerEnvironment, DdCuddNativeJacobiEnvironment, DdSylvanRationalSearchEnvironment>
587 std::string formulasString =
"P=? [F \"one\"]";
588 formulasString +=
"; P=? [F \"two\"]";
589 formulasString +=
"; P=? [F \"three\"]";
590 formulasString +=
"; R=? [F \"done\"]";
592 auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/dtmc/die.pm", formulasString);
593 auto model = std::move(modelFormulas.first);
594 auto tasks = this->getTasks(modelFormulas.second);
595 this->execute(model, [&]() {
596 EXPECT_EQ(13ul, model->getNumberOfStates());
597 EXPECT_EQ(20ul, model->getNumberOfTransitions());
599 auto checker = this->createModelChecker(model);
600 std::unique_ptr<storm::modelchecker::CheckResult> result;
602 result = checker->check(this->env(), tasks[0]);
605 result = checker->check(this->env(), tasks[1]);
608 result = checker->check(this->env(), tasks[2]);
611 result = checker->check(this->env(), tasks[3]);
616TYPED_TEST(DtmcPrctlModelCheckerTest, Crowds) {
617 std::string formulasString =
"P=? [F observe0>1]";
618 formulasString +=
"; P=? [F \"observeIGreater1\"]";
619 formulasString +=
"; P=? [F observe1>1]";
621 auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/dtmc/crowds-4-3.pm", formulasString);
622 auto model = std::move(modelFormulas.first);
623 auto tasks = this->getTasks(modelFormulas.second);
624 this->execute(model, [&]() {
625 EXPECT_EQ(726ul, model->getNumberOfStates());
626 EXPECT_EQ(1146ul, model->getNumberOfTransitions());
628 auto checker = this->createModelChecker(model);
629 std::unique_ptr<storm::modelchecker::CheckResult> result;
631 result = checker->check(this->env(), tasks[0]);
634 result = checker->check(this->env(), tasks[1]);
637 result = checker->check(this->env(), tasks[2]);
642TYPED_TEST(DtmcPrctlModelCheckerTest, SynchronousLeader) {
643 std::string formulasString =
"P=? [F \"elected\"]";
644 formulasString +=
"; P=? [F<=5 \"elected\"]";
645 formulasString +=
"; R=? [F \"elected\"]";
647 auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/dtmc/leader-3-5.pm", formulasString);
648 auto model = std::move(modelFormulas.first);
649 auto tasks = this->getTasks(modelFormulas.second);
650 this->execute(model, [&]() {
651 EXPECT_EQ(273ul, model->getNumberOfStates());
652 EXPECT_EQ(397ul, model->getNumberOfTransitions());
654 auto checker = this->createModelChecker(model);
655 std::unique_ptr<storm::modelchecker::CheckResult> result;
657 result = checker->check(this->env(), tasks[0]);
660 result = checker->check(this->env(), tasks[1]);
663 result = checker->check(this->env(), tasks[2]);
668TEST(DtmcPrctlModelCheckerTest, AllUntilProbabilities) {
670 GTEST_SKIP() <<
"Z3 not available.";
672 std::string formulasString =
"P=? [F \"one\"]";
673 formulasString +=
"; P=? [F \"two\"]";
674 formulasString +=
"; P=? [F \"three\"]";
678 std::vector<storm::modelchecker::CheckTask<storm::logic::Formula, double>> tasks;
679 for (
auto const& f : formulas) {
680 tasks.emplace_back(*f);
682 auto model = storm::api::buildSparseModel<double>(program, formulas)->template as<storm::models::sparse::Dtmc<double>>();
683 EXPECT_EQ(13ul, model->getNumberOfStates());
684 EXPECT_EQ(20ul, model->getNumberOfTransitions());
688 initialStates.set(0);
700 initialStates, phiStates, psiStates);
702 EXPECT_NEAR(1.0 / 6, result[7], 1e-6);
703 EXPECT_NEAR(1.0 / 6, result[8], 1e-6);
704 EXPECT_NEAR(1.0 / 6, result[9], 1e-6);
705 EXPECT_NEAR(1.0 / 6, result[10], 1e-6);
706 EXPECT_NEAR(1.0 / 6, result[11], 1e-6);
707 EXPECT_NEAR(1.0 / 6, result[12], 1e-6);
714 EXPECT_NEAR(1, result[0], 1e-6);
715 EXPECT_NEAR(0.5, result[1], 1e-6);
716 EXPECT_NEAR(0.5, result[2], 1e-6);
717 EXPECT_NEAR(0.25, result[5], 1e-6);
718 EXPECT_NEAR(0, result[7], 1e-6);
719 EXPECT_NEAR(0, result[8], 1e-6);
720 EXPECT_NEAR(0, result[9], 1e-6);
721 EXPECT_NEAR(0.125, result[10], 1e-6);
722 EXPECT_NEAR(0.125, result[11], 1e-6);
723 EXPECT_NEAR(0, result[12], 1e-6);
726TYPED_TEST(DtmcPrctlModelCheckerTest, LtlProbabilitiesDie) {
727#ifdef STORM_HAVE_LTL_MODELCHECKING_SUPPORT
728 std::string formulasString =
"P=? [(X s>0) U (s=7 & d=2)]";
729 formulasString +=
"; P=? [ X (((s=1) U (s=3)) U (s=7))]";
730 formulasString +=
"; P=? [ (F (X (s=6 & (XX s=5)))) & (F G (d!=5))]";
731 formulasString +=
"; P=? [ F (s=3 U (\"three\"))]";
732 formulasString +=
"; P=? [ F s=3 U (\"three\")]";
733 formulasString +=
"; P=? [ F (s=6) & X \"done\"]";
734 formulasString +=
"; P=? [ (F s=6) & (X \"done\")]";
736 auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/dtmc/die.pm", formulasString);
737 auto model = std::move(modelFormulas.first);
738 auto tasks = this->getTasks(modelFormulas.second);
739 this->execute(model, [&]() {
740 EXPECT_EQ(13ul, model->getNumberOfStates());
741 EXPECT_EQ(20ul, model->getNumberOfTransitions());
743 auto checker = this->createModelChecker(model);
744 std::unique_ptr<storm::modelchecker::CheckResult> result;
747 if (TypeParam::engine == DtmcEngine::PrismSparse || TypeParam::engine == DtmcEngine::JaniSparse) {
748 result = checker->check(tasks[0]);
751 result = checker->check(tasks[1]);
754 result = checker->check(tasks[2]);
757 result = checker->check(tasks[3]);
760 result = checker->check(tasks[4]);
763 result = checker->check(tasks[5]);
766 result = checker->check(tasks[6]);
769 EXPECT_FALSE(checker->canHandle(tasks[0]));
777TYPED_TEST(DtmcPrctlModelCheckerTest, LtlProbabilitiesSynchronousLeader) {
778#ifdef STORM_HAVE_LTL_MODELCHECKING_SUPPORT
779 std::string formulasString =
"P=? [X (u1=true U \"elected\")]";
780 formulasString +=
"; P=? [X !(u1=true U \"elected\")]";
781 formulasString +=
"; P=? [X v1=2 & X v1=1]";
782 formulasString +=
"; P=? [(X v1=2) & (X v1=1)]";
783 formulasString +=
"; P=? [(!X v1=2) & (X v1=1)]";
785 auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/dtmc/leader-3-5.pm", formulasString);
786 auto model = std::move(modelFormulas.first);
787 auto tasks = this->getTasks(modelFormulas.second);
788 this->execute(model, [&]() {
789 EXPECT_EQ(273ul, model->getNumberOfStates());
790 EXPECT_EQ(397ul, model->getNumberOfTransitions());
792 auto checker = this->createModelChecker(model);
793 std::unique_ptr<storm::modelchecker::CheckResult> result;
796 if (TypeParam::engine == DtmcEngine::PrismSparse || TypeParam::engine == DtmcEngine::JaniSparse) {
797 result = checker->check(tasks[0]);
800 result = checker->check(tasks[1]);
803 result = checker->check(tasks[2]);
806 result = checker->check(tasks[3]);
809 result = checker->check(tasks[4]);
813 EXPECT_FALSE(checker->canHandle(tasks[0]));
821TYPED_TEST(DtmcPrctlModelCheckerTest, HOAProbabilitiesDie) {
823 std::string formulasString =
"P=?[HOA: {\"" STORM_TEST_RESOURCES_DIR
"/hoa/automaton_UXp0p1.hoa\", \"p0\" -> (s>0), \"p1\" -> (s=7 & d=2) }]";
825 formulasString +=
"; P=?[HOA: {\"" STORM_TEST_RESOURCES_DIR
"/hoa/automaton_UXp0p1.hoa\", \"p0\" -> (s>0), \"p1\" -> (d=4 | d=2) }]";
827 formulasString +=
"; P=?[HOA: {\"" STORM_TEST_RESOURCES_DIR
"/hoa/automaton_Fandp0Xp1.hoa\", \"p0\" -> (s=4), \"p1\" -> \"three\" }]";
829 formulasString +=
"; P=?[HOA: {\"" STORM_TEST_RESOURCES_DIR
"/hoa/automaton_Fandp0Xp1.hoa\", \"p0\" -> (s=6), \"p1\" -> \"done\" }]";
831 formulasString +=
"; P=?[HOA: {\"" STORM_TEST_RESOURCES_DIR
"/hoa/automaton_Fandp0Xp1.hoa\", \"p0\" -> (s=6), \"p1\" -> !\"done\" }]";
833 formulasString +=
"; P=?[HOA: {\"" STORM_TEST_RESOURCES_DIR
"/hoa/automaton_Fandp0Xp1.hoa\", \"p0\" -> (s=4 | s=5), \"p1\" -> s=7 & (d=3 | d=5) }]";
835 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) }]";
837 auto modelFormulas = this->buildModelFormulas(STORM_TEST_RESOURCES_DIR
"/dtmc/die.pm", formulasString);
838 auto model = std::move(modelFormulas.first);
839 auto tasks = this->getTasks(modelFormulas.second);
840 this->execute(model, [&]() {
841 EXPECT_EQ(13ul, model->getNumberOfStates());
842 EXPECT_EQ(20ul, model->getNumberOfTransitions());
844 auto checker = this->createModelChecker(model);
845 std::unique_ptr<storm::modelchecker::CheckResult> result;
848 if (TypeParam::engine == DtmcEngine::PrismSparse || TypeParam::engine == DtmcEngine::JaniSparse) {
849 result = checker->check(tasks[0]);
852 result = checker->check(tasks[1]);
855 result = checker->check(tasks[2]);
858 result = checker->check(tasks[3]);
861 result = checker->check(tasks[4]);
864 result = checker->check(tasks[5]);
867 result = checker->check(tasks[6]);
868 EXPECT_TRUE(this->getQualitativeResultAtInitialState(model, result));
870 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