Storm 1.11.1.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
10
11namespace {
12
13class DoubleViEnvironment {
14 public:
15 typedef double ValueType;
16 static const bool isExact = false;
17 static storm::Environment createEnvironment() {
19 env.solver().minMax().setMethod(storm::solver::MinMaxMethod::ValueIteration);
20 env.solver().minMax().setPrecision(storm::utility::convertNumber<storm::RationalNumber>(1e-8));
21 return env;
22 }
23};
24
25class DoubleViRegMultEnvironment {
26 public:
27 typedef double ValueType;
28 static const bool isExact = false;
29 static storm::Environment createEnvironment() {
31 env.solver().minMax().setMethod(storm::solver::MinMaxMethod::ValueIteration);
32 env.solver().minMax().setPrecision(storm::utility::convertNumber<storm::RationalNumber>(1e-8));
34 return env;
35 }
36};
37
38class DoubleSoundViEnvironment {
39 public:
40 typedef double ValueType;
41 static const bool isExact = false;
42 static storm::Environment createEnvironment() {
44 env.solver().minMax().setMethod(storm::solver::MinMaxMethod::SoundValueIteration);
45 env.solver().setForceSoundness(true);
46 env.solver().minMax().setPrecision(storm::utility::convertNumber<storm::RationalNumber>(1e-6));
47 return env;
48 }
49};
50
51class DoubleIntervalIterationEnvironment {
52 public:
53 typedef double ValueType;
54 static const bool isExact = false;
55 static storm::Environment createEnvironment() {
57 env.solver().minMax().setMethod(storm::solver::MinMaxMethod::IntervalIteration);
58 env.solver().setForceSoundness(true);
59 env.solver().minMax().setPrecision(storm::utility::convertNumber<storm::RationalNumber>(1e-6));
60 return env;
61 }
62};
63
64class DoubleGuessingViEnvironment {
65 public:
66 typedef double ValueType;
67 static const bool isExact = false;
68 static storm::Environment createEnvironment() {
70 env.solver().minMax().setMethod(storm::solver::MinMaxMethod::GuessingValueIteration);
71 env.solver().setForceSoundness(true);
72 env.solver().minMax().setPrecision(storm::utility::convertNumber<storm::RationalNumber>(1e-6));
73 return env;
74 }
75};
76
77class DoubleOptimisticViEnvironment {
78 public:
79 typedef double ValueType;
80 static const bool isExact = false;
81 static storm::Environment createEnvironment() {
83 env.solver().minMax().setMethod(storm::solver::MinMaxMethod::OptimisticValueIteration);
84 env.solver().setForceSoundness(true);
85 env.solver().minMax().setPrecision(storm::utility::convertNumber<storm::RationalNumber>(1e-6));
86 return env;
87 }
88};
89
90class DoubleTopologicalViEnvironment {
91 public:
92 typedef double ValueType;
93 static const bool isExact = false;
94 static storm::Environment createEnvironment() {
96 env.solver().minMax().setMethod(storm::solver::MinMaxMethod::Topological);
97 env.solver().topological().setUnderlyingMinMaxMethod(storm::solver::MinMaxMethod::ValueIteration);
98 env.solver().minMax().setPrecision(storm::utility::convertNumber<storm::RationalNumber>(1e-8));
99 return env;
100 }
101};
102
103class DoublePIEnvironment {
104 public:
105 typedef double ValueType;
106 static const bool isExact = false;
107 static storm::Environment createEnvironment() {
109 env.solver().minMax().setMethod(storm::solver::MinMaxMethod::PolicyIteration);
110 env.solver().minMax().setPrecision(storm::utility::convertNumber<storm::RationalNumber>(1e-8));
111 env.solver().setLinearEquationSolverType(storm::solver::EquationSolverType::Native);
112 env.solver().native().setMethod(storm::solver::NativeLinearEquationSolverMethod::Jacobi);
114 return env;
115 }
116};
117class RationalPIEnvironment {
118 public:
119 typedef storm::RationalNumber ValueType;
120 static const bool isExact = true;
121 static storm::Environment createEnvironment() {
123 env.solver().minMax().setMethod(storm::solver::MinMaxMethod::PolicyIteration);
124 return env;
125 }
126};
127class RationalRationalSearchEnvironment {
128 public:
129 typedef storm::RationalNumber ValueType;
130 static const bool isExact = true;
131 static storm::Environment createEnvironment() {
133 env.solver().minMax().setMethod(storm::solver::MinMaxMethod::RationalSearch);
134 return env;
135 }
136};
137
138template<typename TestType>
139class MinMaxLinearEquationSolverTest : public ::testing::Test {
140 public:
141 typedef typename TestType::ValueType ValueType;
142 MinMaxLinearEquationSolverTest() : _environment(TestType::createEnvironment()) {}
143 storm::Environment const& env() const {
144 return _environment;
145 }
146 ValueType precision() const {
147 return TestType::isExact ? parseNumber("0") : parseNumber("1e-6");
148 }
149 ValueType parseNumber(std::string const& input) const {
150 return storm::utility::convertNumber<ValueType>(input);
151 }
152
153 private:
154 storm::Environment _environment;
155};
156
157typedef ::testing::Types<DoubleViEnvironment, DoubleViRegMultEnvironment, DoubleSoundViEnvironment, DoubleIntervalIterationEnvironment,
158 DoubleOptimisticViEnvironment, DoubleGuessingViEnvironment, DoubleTopologicalViEnvironment, DoublePIEnvironment, RationalPIEnvironment,
159 RationalRationalSearchEnvironment>
161
162TYPED_TEST_SUITE(MinMaxLinearEquationSolverTest, TestingTypes, );
163
164TYPED_TEST(MinMaxLinearEquationSolverTest, SolveEquations) {
165 typedef typename TestFixture::ValueType ValueType;
166
167 storm::storage::SparseMatrixBuilder<ValueType> builder(0, 0, 0, false, true);
168 ASSERT_NO_THROW(builder.newRowGroup(0));
169 ASSERT_NO_THROW(builder.addNextValue(0, 0, this->parseNumber("0.9")));
170
172 ASSERT_NO_THROW(A = builder.build(2));
173
174 std::vector<ValueType> x(1);
175 std::vector<ValueType> b = {this->parseNumber("0.099"), this->parseNumber("0.5")};
176
178 auto solver = factory.create(this->env(), A);
179 solver->setHasUniqueSolution(true);
180 solver->setHasNoEndComponents(true);
181 solver->setBounds(this->parseNumber("0"), this->parseNumber("2"));
182 storm::solver::MinMaxLinearEquationSolverRequirements req = solver->getRequirements(this->env());
183 req.clearBounds();
184 ASSERT_FALSE(req.hasEnabledRequirement());
185 ASSERT_NO_THROW(solver->solveEquations(this->env(), storm::OptimizationDirection::Minimize, x, b));
186 EXPECT_NEAR(x[0], this->parseNumber("0.5"), this->precision());
187
188 ASSERT_NO_THROW(solver->solveEquations(this->env(), storm::OptimizationDirection::Maximize, x, b));
189 EXPECT_NEAR(x[0], this->parseNumber("0.99"), this->precision());
190}
191} // 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:62
TYPED_TEST_SUITE(GraphTestAR, TestingTypes,)
::testing::Types< Cudd, Sylvan > TestingTypes
Definition GraphTest.cpp:59