Storm 1.10.0.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
MinMaxLinearEquationSolverTest.cpp
Go to the documentation of this file.
1#include "storm-config.h"
2#include "test/storm_gtest.h"
3
4#include "test/storm_gtest.h"
5
12
13namespace {
14
15class DoubleViEnvironment {
16 public:
17 typedef double ValueType;
18 static const bool isExact = false;
19 static storm::Environment createEnvironment() {
21 env.solver().minMax().setMethod(storm::solver::MinMaxMethod::ValueIteration);
22 env.solver().minMax().setPrecision(storm::utility::convertNumber<storm::RationalNumber>(1e-8));
23 return env;
24 }
25};
26
27class DoubleViRegMultEnvironment {
28 public:
29 typedef double ValueType;
30 static const bool isExact = false;
31 static storm::Environment createEnvironment() {
33 env.solver().minMax().setMethod(storm::solver::MinMaxMethod::ValueIteration);
34 env.solver().minMax().setPrecision(storm::utility::convertNumber<storm::RationalNumber>(1e-8));
36 return env;
37 }
38};
39
40class DoubleSoundViEnvironment {
41 public:
42 typedef double ValueType;
43 static const bool isExact = false;
44 static storm::Environment createEnvironment() {
46 env.solver().minMax().setMethod(storm::solver::MinMaxMethod::SoundValueIteration);
47 env.solver().setForceSoundness(true);
48 env.solver().minMax().setPrecision(storm::utility::convertNumber<storm::RationalNumber>(1e-6));
49 return env;
50 }
51};
52
53class DoubleIntervalIterationEnvironment {
54 public:
55 typedef double ValueType;
56 static const bool isExact = false;
57 static storm::Environment createEnvironment() {
59 env.solver().minMax().setMethod(storm::solver::MinMaxMethod::IntervalIteration);
60 env.solver().setForceSoundness(true);
61 env.solver().minMax().setPrecision(storm::utility::convertNumber<storm::RationalNumber>(1e-6));
62 return env;
63 }
64};
65
66class DoubleGuessingViEnvironment {
67 public:
68 typedef double ValueType;
69 static const bool isExact = false;
70 static storm::Environment createEnvironment() {
72 env.solver().minMax().setMethod(storm::solver::MinMaxMethod::GuessingValueIteration);
73 env.solver().setForceSoundness(true);
74 env.solver().minMax().setPrecision(storm::utility::convertNumber<storm::RationalNumber>(1e-6));
75 return env;
76 }
77};
78
79class DoubleOptimisticViEnvironment {
80 public:
81 typedef double ValueType;
82 static const bool isExact = false;
83 static storm::Environment createEnvironment() {
85 env.solver().minMax().setMethod(storm::solver::MinMaxMethod::OptimisticValueIteration);
86 env.solver().setForceSoundness(true);
87 env.solver().minMax().setPrecision(storm::utility::convertNumber<storm::RationalNumber>(1e-6));
88 return env;
89 }
90};
91
92class DoubleTopologicalViEnvironment {
93 public:
94 typedef double ValueType;
95 static const bool isExact = false;
96 static storm::Environment createEnvironment() {
98 env.solver().minMax().setMethod(storm::solver::MinMaxMethod::Topological);
99 env.solver().topological().setUnderlyingMinMaxMethod(storm::solver::MinMaxMethod::ValueIteration);
100 env.solver().minMax().setPrecision(storm::utility::convertNumber<storm::RationalNumber>(1e-8));
101 return env;
102 }
103};
104
105class DoublePIEnvironment {
106 public:
107 typedef double ValueType;
108 static const bool isExact = false;
109 static storm::Environment createEnvironment() {
111 env.solver().minMax().setMethod(storm::solver::MinMaxMethod::PolicyIteration);
112 env.solver().minMax().setPrecision(storm::utility::convertNumber<storm::RationalNumber>(1e-8));
113 env.solver().setLinearEquationSolverType(storm::solver::EquationSolverType::Native);
114 env.solver().native().setMethod(storm::solver::NativeLinearEquationSolverMethod::Jacobi);
116 return env;
117 }
118};
119class RationalPIEnvironment {
120 public:
121 typedef storm::RationalNumber ValueType;
122 static const bool isExact = true;
123 static storm::Environment createEnvironment() {
125 env.solver().minMax().setMethod(storm::solver::MinMaxMethod::PolicyIteration);
126 return env;
127 }
128};
129class RationalRationalSearchEnvironment {
130 public:
131 typedef storm::RationalNumber ValueType;
132 static const bool isExact = true;
133 static storm::Environment createEnvironment() {
135 env.solver().minMax().setMethod(storm::solver::MinMaxMethod::RationalSearch);
136 return env;
137 }
138};
139
140template<typename TestType>
141class MinMaxLinearEquationSolverTest : public ::testing::Test {
142 public:
143 typedef typename TestType::ValueType ValueType;
144 MinMaxLinearEquationSolverTest() : _environment(TestType::createEnvironment()) {}
145 storm::Environment const& env() const {
146 return _environment;
147 }
148 ValueType precision() const {
149 return TestType::isExact ? parseNumber("0") : parseNumber("1e-6");
150 }
151 ValueType parseNumber(std::string const& input) const {
152 return storm::utility::convertNumber<ValueType>(input);
153 }
154
155 private:
156 storm::Environment _environment;
157};
158
159typedef ::testing::Types<DoubleViEnvironment, DoubleViRegMultEnvironment, DoubleSoundViEnvironment, DoubleIntervalIterationEnvironment,
160 DoubleOptimisticViEnvironment, DoubleGuessingViEnvironment, DoubleTopologicalViEnvironment, DoublePIEnvironment, RationalPIEnvironment,
161 RationalRationalSearchEnvironment>
163
164TYPED_TEST_SUITE(MinMaxLinearEquationSolverTest, TestingTypes, );
165
166TYPED_TEST(MinMaxLinearEquationSolverTest, SolveEquations) {
167 typedef typename TestFixture::ValueType ValueType;
168
169 storm::storage::SparseMatrixBuilder<ValueType> builder(0, 0, 0, false, true);
170 ASSERT_NO_THROW(builder.newRowGroup(0));
171 ASSERT_NO_THROW(builder.addNextValue(0, 0, this->parseNumber("0.9")));
172
174 ASSERT_NO_THROW(A = builder.build(2));
175
176 std::vector<ValueType> x(1);
177 std::vector<ValueType> b = {this->parseNumber("0.099"), this->parseNumber("0.5")};
178
180 auto solver = factory.create(this->env(), A);
181 solver->setHasUniqueSolution(true);
182 solver->setHasNoEndComponents(true);
183 solver->setBounds(this->parseNumber("0"), this->parseNumber("2"));
184 storm::solver::MinMaxLinearEquationSolverRequirements req = solver->getRequirements(this->env());
185 req.clearBounds();
186 ASSERT_FALSE(req.hasEnabledRequirement());
187 ASSERT_NO_THROW(solver->solveEquations(this->env(), storm::OptimizationDirection::Minimize, x, b));
188 EXPECT_NEAR(x[0], this->parseNumber("0.5"), this->precision());
189
190 ASSERT_NO_THROW(solver->solveEquations(this->env(), storm::OptimizationDirection::Maximize, x, b));
191 EXPECT_NEAR(x[0], this->parseNumber("0.99"), this->precision());
192}
193} // namespace
SolverEnvironment & solver()
void setMultiplicationStyle(storm::solver::MultiplicationStyle value)
storm::RationalNumber const & getPrecision() const
void setPrecision(storm::RationalNumber value)
void setMethod(storm::solver::MinMaxMethod value, bool isSetFromDefault=false)
void setMethod(storm::solver::NativeLinearEquationSolverMethod value)
TopologicalSolverEnvironment & topological()
void setLinearEquationSolverType(storm::solver::EquationSolverType const &value, bool isSetFromDefault=false)
MinMaxSolverEnvironment & minMax()
void setLinearEquationSolverPrecision(boost::optional< storm::RationalNumber > const &newPrecision, boost::optional< bool > const &relativePrecision=boost::none)
NativeSolverEnvironment & native()
void setUnderlyingMinMaxMethod(storm::solver::MinMaxMethod value)
A class that can be used to build a sparse matrix by adding value by value.
A class that holds a possibly non-square matrix in the compressed row storage format.
SFTBDDChecker::ValueType ValueType
NumberType parseNumber(std::string const &value)
Parse number from string.
TYPED_TEST(GraphTestAR, SymbolicProb01StochasticGameDieSmall)
Definition GraphTest.cpp:49
TYPED_TEST_SUITE(GraphTestAR, TestingTypes,)
::testing::Types< Cudd, Sylvan > TestingTypes
Definition GraphTest.cpp:46