Storm
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:
14};
15
16class Sylvan {
17 public:
19};
20
21template<typename TestType>
22class FullySymbolicGameSolverTest : public ::testing::Test {
23 public:
24 static const storm::dd::DdType DdType = TestType::DdType;
25};
26
27typedef ::testing::Types<Cudd, Sylvan> TestingTypes;
29
31 const storm::dd::DdType DdType = TestFixture::DdType;
33 // Create some variables.
34 std::shared_ptr<storm::dd::DdManager<DdType>> manager(new storm::dd::DdManager<DdType>());
35 std::pair<storm::expressions::Variable, storm::expressions::Variable> state = manager->addMetaVariable("x", 1, 4);
36 std::pair<storm::expressions::Variable, storm::expressions::Variable> pl1 = manager->addMetaVariable("a", 0, 1);
37 std::pair<storm::expressions::Variable, storm::expressions::Variable> pl2 = manager->addMetaVariable("b", 0, 1);
38
39 storm::dd::Bdd<DdType> allRows = manager->getBddZero();
40 std::set<storm::expressions::Variable> rowMetaVariables({state.first});
41 std::set<storm::expressions::Variable> columnMetaVariables({state.second});
42 std::vector<std::pair<storm::expressions::Variable, storm::expressions::Variable>> rowColumnMetaVariablePairs = {state};
43 std::set<storm::expressions::Variable> player1Variables({pl1.first});
44 std::set<storm::expressions::Variable> player2Variables({pl2.first});
45
46 // Construct simple game.
48 manager->getEncoding(state.first, 1).template toAdd<double>() * manager->getEncoding(state.second, 2).template toAdd<double>() *
49 manager->getEncoding(pl1.first, 0).template toAdd<double>() * manager->getEncoding(pl2.first, 0).template toAdd<double>() * manager->getConstant(0.6);
50 matrix += manager->getEncoding(state.first, 1).template toAdd<double>() * manager->getEncoding(state.second, 1).template toAdd<double>() *
51 manager->getEncoding(pl1.first, 0).template toAdd<double>() * manager->getEncoding(pl2.first, 0).template toAdd<double>() *
52 manager->getConstant(0.4);
53
54 matrix += manager->getEncoding(state.first, 1).template toAdd<double>() * manager->getEncoding(state.second, 2).template toAdd<double>() *
55 manager->getEncoding(pl1.first, 0).template toAdd<double>() * manager->getEncoding(pl2.first, 1).template toAdd<double>() *
56 manager->getConstant(0.2);
57 matrix += manager->getEncoding(state.first, 1).template toAdd<double>() * manager->getEncoding(state.second, 3).template toAdd<double>() *
58 manager->getEncoding(pl1.first, 0).template toAdd<double>() * manager->getEncoding(pl2.first, 1).template toAdd<double>() *
59 manager->getConstant(0.8);
60
61 matrix += manager->getEncoding(state.first, 1).template toAdd<double>() * manager->getEncoding(state.second, 3).template toAdd<double>() *
62 manager->getEncoding(pl1.first, 1).template toAdd<double>() * manager->getEncoding(pl2.first, 0).template toAdd<double>() *
63 manager->getConstant(0.5);
64 matrix += manager->getEncoding(state.first, 1).template toAdd<double>() * manager->getEncoding(state.second, 4).template toAdd<double>() *
65 manager->getEncoding(pl1.first, 1).template toAdd<double>() * manager->getEncoding(pl2.first, 0).template toAdd<double>() *
66 manager->getConstant(0.5);
67
68 matrix += manager->getEncoding(state.first, 1).template toAdd<double>() * manager->getEncoding(state.second, 1).template toAdd<double>() *
69 manager->getEncoding(pl1.first, 1).template toAdd<double>() * manager->getEncoding(pl2.first, 1).template toAdd<double>() *
70 manager->template getConstant<double>(1);
71
72 std::unique_ptr<storm::solver::SymbolicGameSolverFactory<DdType, double>> solverFactory(new storm::solver::SymbolicGameSolverFactory<DdType, double>());
73
74 storm::dd::Bdd<DdType> tmp = matrix.toBdd().existsAbstract({state.second});
75 storm::dd::Bdd<DdType> illegalPlayer2Mask = !tmp && manager->getRange(state.first);
76 storm::dd::Bdd<DdType> illegalPlayer1Mask = tmp.existsAbstract({pl2.first});
77 illegalPlayer2Mask &= illegalPlayer1Mask;
78 illegalPlayer1Mask &= !illegalPlayer1Mask && manager->getRange(state.first);
79
80 std::unique_ptr<storm::solver::SymbolicGameSolver<DdType>> solver =
81 solverFactory->create(matrix, allRows, illegalPlayer1Mask, illegalPlayer2Mask, rowMetaVariables, columnMetaVariables, rowColumnMetaVariablePairs,
82 player1Variables, player2Variables);
83
84 // Create solution and target state vector.
85 storm::dd::Add<DdType, double> x = manager->template getAddZero<double>();
87 manager->getEncoding(state.first, 2).template toAdd<double>() + manager->getEncoding(state.first, 4).template toAdd<double>();
88
89 // Now solve the game with different strategies for the players.
90 storm::dd::Add<DdType> result = solver->solveGame(env, storm::OptimizationDirection::Minimize, storm::OptimizationDirection::Minimize, x, b);
91 result *= manager->getEncoding(state.first, 1).template toAdd<double>();
92 result = result.sumAbstract({state.first});
94
95 x = manager->template getAddZero<double>();
96 result = solver->solveGame(env, storm::OptimizationDirection::Minimize, storm::OptimizationDirection::Maximize, x, b);
97 result *= manager->getEncoding(state.first, 1).template toAdd<double>();
98 result = result.sumAbstract({state.first});
100
101 x = manager->template getAddZero<double>();
102 result = solver->solveGame(env, storm::OptimizationDirection::Maximize, storm::OptimizationDirection::Minimize, x, b);
103 result *= manager->getEncoding(state.first, 1).template toAdd<double>();
104 result = result.sumAbstract({state.first});
106
107 x = manager->template getAddZero<double>();
108 result = solver->solveGame(env, storm::OptimizationDirection::Maximize, storm::OptimizationDirection::Maximize, x, b);
109 result *= manager->getEncoding(state.first, 1).template toAdd<double>();
110 result = result.sumAbstract({state.first});
111 EXPECT_NEAR(0.99999892625817599, result.getValue(), storm::settings::getModule<storm::settings::modules::NativeEquationSolverSettings>().getPrecision());
112}
TYPED_TEST(FullySymbolicGameSolverTest, Solve)
::testing::Types< Cudd, Sylvan > TestingTypes
TYPED_TEST_SUITE(FullySymbolicGameSolverTest, TestingTypes,)
static const storm::dd::DdType DdType
Definition GraphTest.cpp:25
static const storm::dd::DdType DdType
static const storm::dd::DdType DdType
Definition GraphTest.cpp:30
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:508
Add< LibraryType, ValueType > sumAbstract(std::set< storm::expressions::Variable > const &metaVariables) const
Sum-abstracts from the given meta variables.
Definition Add.cpp:178
Bdd< LibraryType > existsAbstract(std::set< storm::expressions::Variable > const &metaVariables) const
Existentially abstracts from the given meta variables.
Definition Bdd.cpp:178
SettingsType const & getModule()
Get module.
::testing::Types< Cudd, Sylvan > TestingTypes
Definition GraphTest.cpp:46