Storm
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
GameSolverTest.cpp
Go to the documentation of this file.
1#include "storm-config.h"
2#include "test/storm_gtest.h"
3
5
7
11
12namespace {
13
14class DoubleViEnvironment {
15 public:
16 typedef double ValueType;
17 static const bool isExact = false;
18 static storm::Environment createEnvironment() {
20 env.solver().game().setMethod(storm::solver::GameMethod::ValueIteration);
21 env.solver().game().setPrecision(storm::utility::convertNumber<storm::RationalNumber>(1e-8));
22 return env;
23 }
24};
25
26class DoublePiEnvironment {
27 public:
28 typedef double ValueType;
29 static const bool isExact = false;
30 static storm::Environment createEnvironment() {
32 env.solver().game().setMethod(storm::solver::GameMethod::PolicyIteration);
33 env.solver().game().setPrecision(storm::utility::convertNumber<storm::RationalNumber>(1e-8));
34 env.solver().setLinearEquationSolverType(storm::solver::EquationSolverType::Native);
35 env.solver().native().setMethod(storm::solver::NativeLinearEquationSolverMethod::Jacobi);
37 return env;
38 }
39};
40
41class RationalPiEnvironment {
42 public:
43 typedef storm::RationalNumber ValueType;
44 static const bool isExact = true;
45 static storm::Environment createEnvironment() {
47 env.solver().game().setMethod(storm::solver::GameMethod::PolicyIteration);
48 return env;
49 }
50};
51
52template<typename TestType>
53class GameSolverTest : public ::testing::Test {
54 public:
55 typedef typename TestType::ValueType ValueType;
56 GameSolverTest() : _environment(TestType::createEnvironment()) {}
57 storm::Environment const& env() const {
58 return _environment;
59 }
60 ValueType precision() const {
61 return TestType::isExact ? parseNumber("0") : parseNumber("1e-6");
62 }
63 ValueType parseNumber(std::string const& input) const {
64 return storm::utility::convertNumber<ValueType>(input);
65 }
66
67 private:
68 storm::Environment _environment;
69};
70
71typedef ::testing::Types<DoubleViEnvironment, DoublePiEnvironment, RationalPiEnvironment> TestingTypes;
72
73TYPED_TEST_SUITE(GameSolverTest, TestingTypes, );
74
75TYPED_TEST(GameSolverTest, SolveEquations) {
76 typedef typename TestFixture::ValueType ValueType;
77 // Construct simple game. Start with player 2 matrix.
78 storm::storage::SparseMatrixBuilder<ValueType> player2MatrixBuilder(0, 0, 0, false, true);
79 player2MatrixBuilder.newRowGroup(0);
80 player2MatrixBuilder.addNextValue(0, 0, this->parseNumber("0.4"));
81 player2MatrixBuilder.addNextValue(0, 1, this->parseNumber("0.6"));
82 player2MatrixBuilder.addNextValue(1, 1, this->parseNumber("0.2"));
83 player2MatrixBuilder.addNextValue(1, 2, this->parseNumber("0.8"));
84 player2MatrixBuilder.newRowGroup(2);
85 player2MatrixBuilder.addNextValue(2, 2, this->parseNumber("0.5"));
86 player2MatrixBuilder.addNextValue(2, 3, this->parseNumber("0.5"));
87 player2MatrixBuilder.newRowGroup(4);
88 player2MatrixBuilder.newRowGroup(5);
89 player2MatrixBuilder.newRowGroup(6);
90 storm::storage::SparseMatrix<ValueType> player2Matrix = player2MatrixBuilder.build();
91
92 // Now build player 1 matrix.
93 storm::storage::SparseMatrixBuilder<storm::storage::sparse::state_type> player1MatrixBuilder(0, 0, 0, false, true);
94 player1MatrixBuilder.newRowGroup(0);
95 player1MatrixBuilder.addNextValue(0, 0, 1);
96 player1MatrixBuilder.addNextValue(1, 1, 1);
97 player1MatrixBuilder.newRowGroup(2);
98 player1MatrixBuilder.addNextValue(2, 2, 1);
99 player1MatrixBuilder.newRowGroup(3);
100 player1MatrixBuilder.addNextValue(3, 3, 1);
101 player1MatrixBuilder.newRowGroup(4);
102 player1MatrixBuilder.addNextValue(4, 4, 1);
103 storm::storage::SparseMatrix<storm::storage::sparse::state_type> player1Matrix = player1MatrixBuilder.build();
104
106 auto solver = factory.create(this->env(), player1Matrix, player2Matrix);
107
108 // Create solution and target state vector.
109 std::vector<ValueType> result(4);
110 std::vector<ValueType> b(7);
111 b[4] = this->parseNumber("1");
112 b[6] = this->parseNumber("1");
113
114 // Now solve the game with different strategies for the players.
115 solver->solveGame(this->env(), storm::OptimizationDirection::Minimize, storm::OptimizationDirection::Minimize, result, b);
116 EXPECT_NEAR(this->parseNumber("0"), result[0], this->precision());
117
118 result = std::vector<ValueType>(4);
119 solver->setBounds(this->parseNumber("0"), this->parseNumber("1"));
120
121 solver->solveGame(this->env(), storm::OptimizationDirection::Minimize, storm::OptimizationDirection::Maximize, result, b);
122 EXPECT_NEAR(this->parseNumber("0.5"), result[0], this->precision());
123
124 result = std::vector<ValueType>(4);
125
126 solver->solveGame(this->env(), storm::OptimizationDirection::Maximize, storm::OptimizationDirection::Minimize, result, b);
127 EXPECT_NEAR(this->parseNumber("0.2"), result[0], this->precision());
128
129 result = std::vector<ValueType>(4);
130
131 solver->solveGame(this->env(), storm::OptimizationDirection::Maximize, storm::OptimizationDirection::Maximize, result, b);
132 EXPECT_NEAR(this->parseNumber("1"), result[0], this->precision());
133}
134
135} // namespace
SolverEnvironment & solver()
storm::RationalNumber const & getPrecision() const
void setMethod(storm::solver::GameMethod value)
void setPrecision(storm::RationalNumber value)
void setMethod(storm::solver::NativeLinearEquationSolverMethod value)
void setLinearEquationSolverType(storm::solver::EquationSolverType const &value, bool isSetFromDefault=false)
void setLinearEquationSolverPrecision(boost::optional< storm::RationalNumber > const &newPrecision, boost::optional< bool > const &relativePrecision=boost::none)
GameSolverEnvironment & game()
NativeSolverEnvironment & native()
virtual std::unique_ptr< GameSolver< ValueType > > create(Environment const &env, storm::storage::SparseMatrix< storm::storage::sparse::state_type > const &player1Matrix, storm::storage::SparseMatrix< ValueType > const &player2Matrix) const
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