Storm 1.11.1.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
SteadyStateCtmcCslModelCheckerTest.cpp
Go to the documentation of this file.
1#include "storm-config.h"
2#include "test/storm_gtest.h"
3
5#include "storm/api/builder.h"
15
16namespace {
17
18enum class CtmcEngine { JaniSparse };
19
20#ifdef STORM_HAVE_GMM
21class SparseGmmxxGmresIluEnvironment {
22 public:
23 static const CtmcEngine engine = CtmcEngine::JaniSparse;
24 static const bool isExact = false;
25 typedef double ValueType;
27 static storm::Environment createEnvironment() {
29 env.solver().setLinearEquationSolverType(storm::solver::EquationSolverType::Gmmxx);
30 env.solver().gmmxx().setMethod(storm::solver::GmmxxLinearEquationSolverMethod::Gmres);
31 env.solver().gmmxx().setPreconditioner(storm::solver::GmmxxLinearEquationSolverPreconditioner::Ilu);
32 // env.solver().gmmxx().setPrecision(storm::utility::convertNumber<storm::RationalNumber>(1e-6)); // Need to increase precision because eq sys yields
33 // incorrect results
34 return env;
35 }
36};
37#endif
38
39class SparseSoundEvtEnvironment {
40 public:
41 static const CtmcEngine engine = CtmcEngine::JaniSparse;
42 static const bool isExact = false;
43 typedef double ValueType;
45 static storm::Environment createEnvironment() {
48 env.solver().setForceSoundness(true);
49 return env;
50 }
51};
52
53class SparseClassicEnvironment {
54 public:
55 static const CtmcEngine engine = CtmcEngine::JaniSparse;
56 static const bool isExact = false;
57 typedef double ValueType;
59 static storm::Environment createEnvironment() {
62 return env;
63 }
64};
65
66class SparseEigenRationalLuEnvironment {
67 public:
68 static const CtmcEngine engine = CtmcEngine::JaniSparse;
69 static const bool isExact = true;
70 typedef storm::RationalNumber ValueType;
72 static storm::Environment createEnvironment() {
74 env.solver().setLinearEquationSolverType(storm::solver::EquationSolverType::Eigen);
75 env.solver().eigen().setMethod(storm::solver::EigenLinearEquationSolverMethod::SparseLU);
76 env.solver().setForceExact(true);
77 return env;
78 }
79};
80
81template<typename TestType>
82class SteadyStateCtmcCslModelCheckerTest : public ::testing::Test {
83 public:
84 typedef typename TestType::ValueType ValueType;
85 typedef typename storm::models::sparse::Ctmc<ValueType> SparseModelType;
86
87 SteadyStateCtmcCslModelCheckerTest() : _environment(TestType::createEnvironment()) {}
88 storm::Environment const& env() const {
89 return _environment;
90 }
91 ValueType parseNumber(std::string const& input) const {
92 return storm::utility::convertNumber<ValueType>(input);
93 }
94 ValueType precision() const {
95 return TestType::isExact ? parseNumber("0") : parseNumber("1e-6");
96 }
97 bool isSparseModel() const {
98 return std::is_same<typename TestType::ModelType, SparseModelType>::value;
99 }
100 CtmcEngine getEngine() const {
101 return TestType::engine;
102 }
103
104 template<typename MT = typename TestType::ModelType>
105 typename std::enable_if<std::is_same<MT, SparseModelType>::value, std::shared_ptr<MT>>::type buildJaniModel(
106 std::string const& pathToJaniModel, std::string const& constantDefinitionString = "") const {
107 auto janiDescr = storm::storage::SymbolicModelDescription(storm::api::parseJaniModel(pathToJaniModel).first);
108 janiDescr = janiDescr.preprocess(constantDefinitionString);
109 return storm::api::buildSparseModel<ValueType>(janiDescr, storm::builder::BuilderOptions())->template as<MT>();
110 }
111
112 template<typename MT = typename TestType::ModelType>
113 typename std::enable_if<std::is_same<MT, SparseModelType>::value, std::shared_ptr<storm::modelchecker::SparseCtmcCslModelChecker<MT>>>::type
114 createModelChecker(std::shared_ptr<MT> const& model) const {
115 if (TestType::engine == CtmcEngine::JaniSparse) {
116 return std::make_shared<storm::modelchecker::SparseCtmcCslModelChecker<SparseModelType>>(*model);
117 }
118 return nullptr;
119 }
120
121 private:
122 storm::Environment _environment;
123};
124
125typedef ::testing::Types<
126#ifdef STORM_HAVE_GMM
127 SparseGmmxxGmresIluEnvironment,
128#endif
129 SparseSoundEvtEnvironment, SparseClassicEnvironment, SparseEigenRationalLuEnvironment>
131
132TYPED_TEST_SUITE(SteadyStateCtmcCslModelCheckerTest, TestingTypes, );
133
134TYPED_TEST(SteadyStateCtmcCslModelCheckerTest, steadystatetest) {
135 typedef typename TestFixture::ValueType ValueType;
136
137 auto model = this->buildJaniModel(STORM_TEST_RESOURCES_DIR "/ctmc/steadystatetest.jani");
138 EXPECT_EQ(8ul, model->getNumberOfStates());
139 EXPECT_EQ(12ul, model->getNumberOfTransitions());
140 ASSERT_EQ(model->getType(), storm::models::ModelType::Ctmc);
141 auto checker = this->createModelChecker(model);
142 auto result = checker->computeSteadyStateDistribution(this->env());
143
144 ASSERT_TRUE(result->isExplicitQuantitativeCheckResult());
145 auto resultVector = result->template asExplicitQuantitativeCheckResult<ValueType>().getValueVector();
146 auto sortedVector = resultVector;
147 std::sort(sortedVector.begin(), sortedVector.end());
148 EXPECT_EQ(sortedVector[0], storm::utility::zero<ValueType>())
149 << "Result of steady state computation is " << storm::utility::vector::toString(resultVector) << '\n';
150 EXPECT_EQ(sortedVector[1], storm::utility::zero<ValueType>())
151 << "Result of steady state computation is " << storm::utility::vector::toString(resultVector) << '\n';
152 EXPECT_EQ(sortedVector[2], storm::utility::zero<ValueType>())
153 << "Result of steady state computation is " << storm::utility::vector::toString(resultVector) << '\n';
154 EXPECT_NEAR(sortedVector[3], this->parseNumber("1/35"), this->precision())
155 << "Result of steady state computation is " << storm::utility::vector::toString(resultVector) << '\n';
156 EXPECT_NEAR(sortedVector[4], this->parseNumber("2/35"), this->precision())
157 << "Result of steady state computation is " << storm::utility::vector::toString(resultVector) << '\n';
158 EXPECT_NEAR(sortedVector[5], this->parseNumber("4/35"), this->precision())
159 << "Result of steady state computation is " << storm::utility::vector::toString(resultVector) << '\n';
160 EXPECT_NEAR(sortedVector[6], this->parseNumber("1/5"), this->precision())
161 << "Result of steady state computation is " << storm::utility::vector::toString(resultVector) << '\n';
162 EXPECT_NEAR(sortedVector[7], this->parseNumber("3/5"), this->precision())
163 << "Result of steady state computation is " << storm::utility::vector::toString(resultVector) << '\n';
164}
165} // namespace
void setMethod(storm::solver::EigenLinearEquationSolverMethod value)
SolverEnvironment & solver()
ModelCheckerEnvironment & modelchecker()
void setMethod(storm::solver::GmmxxLinearEquationSolverMethod value)
void setPreconditioner(storm::solver::GmmxxLinearEquationSolverPreconditioner value)
void setSteadyStateDistributionAlgorithm(SteadyStateDistributionAlgorithm value)
void setLinearEquationSolverType(storm::solver::EquationSolverType const &value, bool isSetFromDefault=false)
EigenSolverEnvironment & eigen()
GmmxxSolverEnvironment & gmmxx()
This class represents a continuous-time Markov chain.
Definition Ctmc.h:14
std::pair< storm::jani::Model, std::vector< storm::jani::Property > > parseJaniModel(std::string const &filename, boost::optional< std::vector< std::string > > const &propertyFilter)
SFTBDDChecker::ValueType ValueType
NumberType parseNumber(std::string const &value)
Parse number from string.
std::string toString(std::vector< ValueType > const &vector)
Output vector as string.
Definition vector.h:1149
TYPED_TEST(GraphTestAR, SymbolicProb01StochasticGameDieSmall)
Definition GraphTest.cpp:49
TYPED_TEST_SUITE(GraphTestAR, TestingTypes,)
::testing::Types< Cudd, Sylvan > TestingTypes
Definition GraphTest.cpp:46