Storm 1.11.1.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
FullySymbolicGameSolverTest.cpp
Go to the documentation of this file.
1#include "storm-config.h"
2#include "test/storm_gtest.h"
3
10
11class Cudd {
12 public:
13 static void checkLibraryAvailable() {
14#ifndef STORM_HAVE_CUDD
15 GTEST_SKIP() << "Library CUDD not available.";
16#endif
17 }
18
20};
21
22class Sylvan {
23 public:
24 static void checkLibraryAvailable() {
25#ifndef STORM_HAVE_SYLVAN
26 GTEST_SKIP() << "Library Sylvan not available.";
27#endif
28 }
29
31};
32
33template<typename TestType>
34class FullySymbolicGameSolverTest : public ::testing::Test {
35 public:
36 void SetUp() override {
37 TestType::checkLibraryAvailable();
38 }
39
40 static const storm::dd::DdType DdType = TestType::DdType;
41};
42
43typedef ::testing::Types<Cudd, Sylvan> TestingTypes;
45
47 const storm::dd::DdType DdType = TestFixture::DdType;
49 // Create some variables.
50 std::shared_ptr<storm::dd::DdManager<DdType>> manager(new storm::dd::DdManager<DdType>());
51 std::pair<storm::expressions::Variable, storm::expressions::Variable> state = manager->addMetaVariable("x", 1, 4);
52 std::pair<storm::expressions::Variable, storm::expressions::Variable> pl1 = manager->addMetaVariable("a", 0, 1);
53 std::pair<storm::expressions::Variable, storm::expressions::Variable> pl2 = manager->addMetaVariable("b", 0, 1);
54
55 storm::dd::Bdd<DdType> allRows = manager->getBddZero();
56 std::set<storm::expressions::Variable> rowMetaVariables({state.first});
57 std::set<storm::expressions::Variable> columnMetaVariables({state.second});
58 std::vector<std::pair<storm::expressions::Variable, storm::expressions::Variable>> rowColumnMetaVariablePairs = {state};
59 std::set<storm::expressions::Variable> player1Variables({pl1.first});
60 std::set<storm::expressions::Variable> player2Variables({pl2.first});
61
62 // Construct simple game.
64 manager->getEncoding(state.first, 1).template toAdd<double>() * manager->getEncoding(state.second, 2).template toAdd<double>() *
65 manager->getEncoding(pl1.first, 0).template toAdd<double>() * manager->getEncoding(pl2.first, 0).template toAdd<double>() * manager->getConstant(0.6);
66 matrix += manager->getEncoding(state.first, 1).template toAdd<double>() * manager->getEncoding(state.second, 1).template toAdd<double>() *
67 manager->getEncoding(pl1.first, 0).template toAdd<double>() * manager->getEncoding(pl2.first, 0).template toAdd<double>() *
68 manager->getConstant(0.4);
69
70 matrix += manager->getEncoding(state.first, 1).template toAdd<double>() * manager->getEncoding(state.second, 2).template toAdd<double>() *
71 manager->getEncoding(pl1.first, 0).template toAdd<double>() * manager->getEncoding(pl2.first, 1).template toAdd<double>() *
72 manager->getConstant(0.2);
73 matrix += manager->getEncoding(state.first, 1).template toAdd<double>() * manager->getEncoding(state.second, 3).template toAdd<double>() *
74 manager->getEncoding(pl1.first, 0).template toAdd<double>() * manager->getEncoding(pl2.first, 1).template toAdd<double>() *
75 manager->getConstant(0.8);
76
77 matrix += manager->getEncoding(state.first, 1).template toAdd<double>() * manager->getEncoding(state.second, 3).template toAdd<double>() *
78 manager->getEncoding(pl1.first, 1).template toAdd<double>() * manager->getEncoding(pl2.first, 0).template toAdd<double>() *
79 manager->getConstant(0.5);
80 matrix += manager->getEncoding(state.first, 1).template toAdd<double>() * manager->getEncoding(state.second, 4).template toAdd<double>() *
81 manager->getEncoding(pl1.first, 1).template toAdd<double>() * manager->getEncoding(pl2.first, 0).template toAdd<double>() *
82 manager->getConstant(0.5);
83
84 matrix += manager->getEncoding(state.first, 1).template toAdd<double>() * manager->getEncoding(state.second, 1).template toAdd<double>() *
85 manager->getEncoding(pl1.first, 1).template toAdd<double>() * manager->getEncoding(pl2.first, 1).template toAdd<double>() *
86 manager->template getConstant<double>(1);
87
88 std::unique_ptr<storm::solver::SymbolicGameSolverFactory<DdType, double>> solverFactory(new storm::solver::SymbolicGameSolverFactory<DdType, double>());
89
90 storm::dd::Bdd<DdType> tmp = matrix.toBdd().existsAbstract({state.second});
91 storm::dd::Bdd<DdType> illegalPlayer2Mask = !tmp && manager->getRange(state.first);
92 storm::dd::Bdd<DdType> illegalPlayer1Mask = tmp.existsAbstract({pl2.first});
93 illegalPlayer2Mask &= illegalPlayer1Mask;
94 illegalPlayer1Mask &= !illegalPlayer1Mask && manager->getRange(state.first);
95
96 std::unique_ptr<storm::solver::SymbolicGameSolver<DdType>> solver =
97 solverFactory->create(matrix, allRows, illegalPlayer1Mask, illegalPlayer2Mask, rowMetaVariables, columnMetaVariables, rowColumnMetaVariablePairs,
98 player1Variables, player2Variables);
99
100 // Create solution and target state vector.
101 storm::dd::Add<DdType, double> x = manager->template getAddZero<double>();
103 manager->getEncoding(state.first, 2).template toAdd<double>() + manager->getEncoding(state.first, 4).template toAdd<double>();
104
105 // Now solve the game with different strategies for the players.
106 storm::dd::Add<DdType> result = solver->solveGame(env, storm::OptimizationDirection::Minimize, storm::OptimizationDirection::Minimize, x, b);
107 result *= manager->getEncoding(state.first, 1).template toAdd<double>();
108 result = result.sumAbstract({state.first});
109 EXPECT_NEAR(0, result.getValue(), storm::settings::getModule<storm::settings::modules::NativeEquationSolverSettings>().getPrecision());
110
111 x = manager->template getAddZero<double>();
112 result = solver->solveGame(env, storm::OptimizationDirection::Minimize, storm::OptimizationDirection::Maximize, x, b);
113 result *= manager->getEncoding(state.first, 1).template toAdd<double>();
114 result = result.sumAbstract({state.first});
115 EXPECT_NEAR(0.5, result.getValue(), storm::settings::getModule<storm::settings::modules::NativeEquationSolverSettings>().getPrecision());
116
117 x = manager->template getAddZero<double>();
118 result = solver->solveGame(env, storm::OptimizationDirection::Maximize, storm::OptimizationDirection::Minimize, x, b);
119 result *= manager->getEncoding(state.first, 1).template toAdd<double>();
120 result = result.sumAbstract({state.first});
121 EXPECT_NEAR(0.2, result.getValue(), storm::settings::getModule<storm::settings::modules::NativeEquationSolverSettings>().getPrecision());
122
123 x = manager->template getAddZero<double>();
124 result = solver->solveGame(env, storm::OptimizationDirection::Maximize, storm::OptimizationDirection::Maximize, x, b);
125 result *= manager->getEncoding(state.first, 1).template toAdd<double>();
126 result = result.sumAbstract({state.first});
127 EXPECT_NEAR(0.99999892625817599, result.getValue(), storm::settings::getModule<storm::settings::modules::NativeEquationSolverSettings>().getPrecision());
128}
TYPED_TEST(FullySymbolicGameSolverTest, Solve)
::testing::Types< Cudd, Sylvan > TestingTypes
TYPED_TEST_SUITE(FullySymbolicGameSolverTest, TestingTypes,)
static void checkLibraryAvailable()
static const storm::dd::DdType DdType
Definition GraphTest.cpp:31
static const storm::dd::DdType DdType
static const storm::dd::DdType DdType
Definition GraphTest.cpp:42
static void checkLibraryAvailable()
ValueType getValue(std::map< storm::expressions::Variable, int_fast64_t > const &metaVariableToValueMap=std::map< storm::expressions::Variable, int_fast64_t >()) const
Retrieves the value of the function when all meta variables are assigned the values of the given mapp...
Definition Add.cpp:504
Add< LibraryType, ValueType > sumAbstract(std::set< storm::expressions::Variable > const &metaVariables) const
Sum-abstracts from the given meta variables.
Definition Add.cpp:174
Bdd< LibraryType > existsAbstract(std::set< storm::expressions::Variable > const &metaVariables) const
Existentially abstracts from the given meta variables.
Definition Bdd.cpp:172
::testing::Types< Cudd, Sylvan > TestingTypes
Definition GraphTest.cpp:59