Storm 1.11.1.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
ConditionalDtmcPrctlModelCheckerTest.cpp
Go to the documentation of this file.
1#include "storm-config.h"
2#include "test/storm_gtest.h"
3
6#include "storm/api/builder.h"
15
16namespace {
17
18#ifdef STORM_HAVE_GMM
19class GmmxxDoubleGmresEnvironment {
20 public:
21 typedef double ValueType;
22 static const bool isExact = false;
23 static storm::Environment createEnvironment() {
25 env.solver().setLinearEquationSolverType(storm::solver::EquationSolverType::Gmmxx);
26 env.solver().gmmxx().setMethod(storm::solver::GmmxxLinearEquationSolverMethod::Gmres);
27 env.solver().gmmxx().setPreconditioner(storm::solver::GmmxxLinearEquationSolverPreconditioner::Ilu);
28 env.solver().gmmxx().setPrecision(storm::utility::convertNumber<storm::RationalNumber>(1e-8));
29 return env;
30 }
31};
32
33class EigenDoubleDGmresEnvironment {
34 public:
35 typedef double ValueType;
36 static const bool isExact = false;
37 static storm::Environment createEnvironment() {
39 env.solver().setLinearEquationSolverType(storm::solver::EquationSolverType::Eigen);
40 env.solver().eigen().setMethod(storm::solver::EigenLinearEquationSolverMethod::DGmres);
41 env.solver().eigen().setPreconditioner(storm::solver::EigenLinearEquationSolverPreconditioner::Ilu);
42 env.solver().eigen().setPrecision(storm::utility::convertNumber<storm::RationalNumber>(1e-8));
43 return env;
44 }
45};
46#endif
47
48class EigenRationalLUEnvironment {
49 public:
50 typedef storm::RationalNumber ValueType;
51 static const bool isExact = true;
52 static storm::Environment createEnvironment() {
54 env.solver().setLinearEquationSolverType(storm::solver::EquationSolverType::Eigen);
55 env.solver().eigen().setMethod(storm::solver::EigenLinearEquationSolverMethod::SparseLU);
56 return env;
57 }
58};
59
60class NativeSorEnvironment {
61 public:
62 typedef double ValueType;
63 static const bool isExact = false;
64 static storm::Environment createEnvironment() {
66 env.solver().setLinearEquationSolverType(storm::solver::EquationSolverType::Native);
67 env.solver().native().setMethod(storm::solver::NativeLinearEquationSolverMethod::SOR);
68 env.solver().native().setSorOmega(storm::utility::convertNumber<storm::RationalNumber>(0.9));
69 env.solver().native().setPrecision(storm::utility::convertNumber<storm::RationalNumber>(1e-8));
70 return env;
71 }
72};
73
74class NativePowerEnvironment {
75 public:
76 typedef double ValueType;
77 static const bool isExact = false;
78 static storm::Environment createEnvironment() {
80 env.solver().setLinearEquationSolverType(storm::solver::EquationSolverType::Native);
81 env.solver().native().setMethod(storm::solver::NativeLinearEquationSolverMethod::Power);
82 env.solver().native().setPrecision(storm::utility::convertNumber<storm::RationalNumber>(1e-8));
83 return env;
84 }
85};
86
87class NativeWalkerChaeEnvironment {
88 public:
89 typedef double ValueType;
90 static const bool isExact = false;
91 static storm::Environment createEnvironment() {
93 env.solver().setLinearEquationSolverType(storm::solver::EquationSolverType::Native);
94 env.solver().native().setMethod(storm::solver::NativeLinearEquationSolverMethod::WalkerChae);
95 env.solver().native().setPrecision(storm::utility::convertNumber<storm::RationalNumber>(1e-8));
97 return env;
98 }
99};
100
101template<typename TestType>
102class ConditionalDtmcPrctlModelCheckerTest : public ::testing::Test {
103 public:
104 typedef typename TestType::ValueType ValueType;
105 ConditionalDtmcPrctlModelCheckerTest() : _environment(TestType::createEnvironment()) {}
106
107 void SetUp() override {
108#ifndef STORM_HAVE_Z3
109 GTEST_SKIP() << "Z3 not available.";
110#endif
111 }
112
113 storm::Environment const& env() const {
114 return _environment;
115 }
116 ValueType parseNumber(std::string const& input) const {
117 return storm::utility::convertNumber<ValueType>(input);
118 }
119 ValueType precision() const {
120 return TestType::isExact ? parseNumber("0") : parseNumber("1e-6");
121 }
122
123 private:
124 storm::Environment _environment;
125};
126
127typedef ::testing::Types<
128#ifdef STORM_HAVE_GMM
129 GmmxxDoubleGmresEnvironment, EigenDoubleDGmresEnvironment,
130#endif
131 EigenRationalLUEnvironment, NativeSorEnvironment, NativePowerEnvironment, NativeWalkerChaeEnvironment>
133
134TYPED_TEST_SUITE(ConditionalDtmcPrctlModelCheckerTest, TestingTypes, );
135
136TYPED_TEST(ConditionalDtmcPrctlModelCheckerTest, Conditional) {
137 typedef typename TestFixture::ValueType ValueType;
138
139 storm::prism::Program program = storm::parser::PrismParser::parse(STORM_TEST_RESOURCES_DIR "/dtmc/test_conditional.pm");
140
143 std::shared_ptr<storm::models::sparse::Model<ValueType>> model = storm::builder::ExplicitModelBuilder<ValueType>(program, options).build();
144 ASSERT_TRUE(model->getType() == storm::models::ModelType::Dtmc);
145 ASSERT_EQ(4ul, model->getNumberOfStates());
146 ASSERT_EQ(5ul, model->getNumberOfTransitions());
147
148 std::shared_ptr<storm::models::sparse::Dtmc<ValueType>> dtmc = model->template as<storm::models::sparse::Dtmc<ValueType>>();
149
151
152 // A parser that we use for conveniently constructing the formulas.
153
154 auto expManager = std::make_shared<storm::expressions::ExpressionManager>();
155 storm::parser::FormulaParser formulaParser(expManager);
156 std::shared_ptr<storm::logic::Formula const> formula = formulaParser.parseSingleFormulaFromString("P=? [F \"target\"]");
157
158 std::unique_ptr<storm::modelchecker::CheckResult> result = checker.check(this->env(), *formula);
160 EXPECT_NEAR(this->parseNumber("0.5"), quantitativeResult1[0], this->precision());
161
162 formula = formulaParser.parseSingleFormulaFromString("P=? [F \"target\" || F \"condition\"]");
163
164 result = checker.check(this->env(), *formula);
166 EXPECT_NEAR(storm::utility::one<ValueType>(), quantitativeResult2[0], this->precision());
167
168 formula = formulaParser.parseSingleFormulaFromString("R=? [F \"target\"]");
169
170 result = checker.check(this->env(), *formula);
172 EXPECT_EQ(storm::utility::infinity<ValueType>(), quantitativeResult3[0]);
173
174 formula = formulaParser.parseSingleFormulaFromString("R=? [F \"target\" || F \"condition\"]");
175
176 result = checker.check(this->env(), *formula);
178 EXPECT_NEAR(storm::utility::one<ValueType>(), quantitativeResult4[0], this->precision());
179}
180} // namespace
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 setSorOmega(storm::RationalNumber const &value)
void setMaximalNumberOfIterations(uint64_t value)
void setMethod(storm::solver::NativeLinearEquationSolverMethod value)
void setPrecision(storm::RationalNumber value)
void setLinearEquationSolverType(storm::solver::EquationSolverType const &value, bool isSetFromDefault=false)
EigenSolverEnvironment & eigen()
NativeSolverEnvironment & native()
GmmxxSolverEnvironment & gmmxx()
BuilderOptions & setBuildAllLabels(bool newValue=true)
Should all reward models be built? If not set, only required reward models are build.
BuilderOptions & setBuildAllRewardModels(bool newValue=true)
Should all reward models be built? If not set, only required reward models are build.
std::shared_ptr< storm::models::sparse::Model< ValueType, RewardModelType > > build()
Convert the program given at construction time to an abstract model.
ExplicitQuantitativeCheckResult< ValueType > & asExplicitQuantitativeCheckResult()
static storm::prism::Program parse(std::string const &filename, bool prismCompatability=false)
Parses the given file into the PRISM storage classes assuming it complies with the PRISM syntax.
SFTBDDChecker::ValueType ValueType
NumberType parseNumber(std::string const &value)
Parse number from string.
TYPED_TEST(GraphTestAR, SymbolicProb01StochasticGameDieSmall)
Definition GraphTest.cpp:62
TYPED_TEST_SUITE(GraphTestAR, TestingTypes,)
::testing::Types< Cudd, Sylvan > TestingTypes
Definition GraphTest.cpp:59