Storm
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
SymbolicLinearEquationSolver.cpp
Go to the documentation of this file.
2
5
6#include "storm/utility/dd.h"
7
11
13
17
19
20namespace storm {
21namespace solver {
22
23template<storm::dd::DdType DdType, typename ValueType>
27
28template<storm::dd::DdType DdType, typename ValueType>
30 storm::dd::Add<DdType, ValueType> const& A, storm::dd::Bdd<DdType> const& allRows, std::set<storm::expressions::Variable> const& rowMetaVariables,
31 std::set<storm::expressions::Variable> const& columnMetaVariables,
32 std::vector<std::pair<storm::expressions::Variable, storm::expressions::Variable>> const& rowColumnMetaVariablePairs)
33 : SymbolicLinearEquationSolver(allRows, rowMetaVariables, columnMetaVariables, rowColumnMetaVariablePairs) {
34 this->setMatrix(A);
35}
36
37template<storm::dd::DdType DdType, typename ValueType>
39 storm::dd::Bdd<DdType> const& allRows, std::set<storm::expressions::Variable> const& rowMetaVariables,
40 std::set<storm::expressions::Variable> const& columnMetaVariables,
41 std::vector<std::pair<storm::expressions::Variable, storm::expressions::Variable>> const& rowColumnMetaVariablePairs)
42 : SymbolicEquationSolver<DdType, ValueType>(allRows),
43 rowMetaVariables(rowMetaVariables),
44 columnMetaVariables(columnMetaVariables),
45 rowColumnMetaVariablePairs(rowColumnMetaVariablePairs) {
46 // Intentionally left empty.
47}
48
49template<storm::dd::DdType DdType, typename ValueType>
51 storm::dd::Add<DdType, ValueType> const* b, uint_fast64_t n) const {
53
54 // Perform matrix-vector multiplication while the bound is met.
55 for (uint_fast64_t i = 0; i < n; ++i) {
56 xCopy = xCopy.swapVariables(this->rowColumnMetaVariablePairs);
57 xCopy = this->A.multiplyMatrix(xCopy, this->columnMetaVariables);
58 if (b != nullptr) {
59 xCopy += *b;
60 }
61 }
62
63 return xCopy;
64}
65
66template<storm::dd::DdType DdType, typename ValueType>
69}
70
71template<storm::dd::DdType DdType, typename ValueType>
76
77template<storm::dd::DdType DdType, typename ValueType>
81
82template<storm::dd::DdType DdType, typename ValueType>
84 storm::dd::Bdd<DdType> const& allRows, std::set<storm::expressions::Variable> const& rowMetaVariables,
85 std::set<storm::expressions::Variable> const& columnMetaVariables,
86 std::vector<std::pair<storm::expressions::Variable, storm::expressions::Variable>> const& rowColumnMetaVariablePairs) {
87 this->setAllRows(allRows);
88 this->rowMetaVariables = rowMetaVariables;
89 this->columnMetaVariables = columnMetaVariables;
90 this->rowColumnMetaVariablePairs = rowColumnMetaVariablePairs;
91}
92
93template<storm::dd::DdType DdType, typename ValueType>
94std::unique_ptr<storm::solver::SymbolicLinearEquationSolver<DdType, ValueType>> SymbolicLinearEquationSolverFactory<DdType, ValueType>::create(
96 std::set<storm::expressions::Variable> const& rowMetaVariables, std::set<storm::expressions::Variable> const& columnMetaVariables,
97 std::vector<std::pair<storm::expressions::Variable, storm::expressions::Variable>> const& rowColumnMetaVariablePairs) const {
98 std::unique_ptr<storm::solver::SymbolicLinearEquationSolver<DdType, ValueType>> solver =
99 this->create(env, allRows, rowMetaVariables, columnMetaVariables, rowColumnMetaVariablePairs);
100 solver->setMatrix(A);
101 return solver;
103
104template<storm::dd::DdType DdType, typename ValueType>
105std::unique_ptr<storm::solver::SymbolicLinearEquationSolver<DdType, ValueType>> SymbolicLinearEquationSolverFactory<DdType, ValueType>::create(
106 Environment const& env, storm::dd::Bdd<DdType> const& allRows, std::set<storm::expressions::Variable> const& rowMetaVariables,
107 std::set<storm::expressions::Variable> const& columnMetaVariables,
108 std::vector<std::pair<storm::expressions::Variable, storm::expressions::Variable>> const& rowColumnMetaVariablePairs) const {
109 std::unique_ptr<storm::solver::SymbolicLinearEquationSolver<DdType, ValueType>> solver = this->create(env);
110 solver->setData(allRows, rowMetaVariables, columnMetaVariables, rowColumnMetaVariablePairs);
111 return solver;
112}
113
114template<storm::dd::DdType DdType, typename ValueType>
116 return this->create(env)->getEquationProblemFormat(env);
117}
118
119template<storm::dd::DdType DdType, typename ValueType>
121 return this->create(env)->getRequirements(env);
122}
123
124template<>
125std::unique_ptr<storm::solver::SymbolicLinearEquationSolver<storm::dd::DdType::Sylvan, storm::RationalFunction>>
127 EquationSolverType type = env.solver().getLinearEquationSolverType();
128
129 // Adjust the solver type if it is not supported in the Dd engine with rational functions
130 if (type != EquationSolverType::Elimination) {
131 type = EquationSolverType::Elimination;
132 STORM_LOG_INFO("The selected equation solver is not available in the parametric dd engine. Falling back to " << toString(type) << " solver.");
133 }
134
135 switch (type) {
136 case EquationSolverType::Elimination:
137 return std::make_unique<SymbolicEliminationLinearEquationSolver<storm::dd::DdType::Sylvan, storm::RationalFunction>>();
138 default:
139 STORM_LOG_THROW(false, storm::exceptions::InvalidEnvironmentException, "Unknown solver type.");
140 return nullptr;
141 }
142}
143
144template<storm::dd::DdType DdType, typename ValueType>
145std::unique_ptr<storm::solver::SymbolicLinearEquationSolver<DdType, ValueType>> GeneralSymbolicLinearEquationSolverFactory<DdType, ValueType>::create(
146 Environment const& env) const {
147 EquationSolverType type = env.solver().getLinearEquationSolverType();
148
149 // Adjust the solver type if it is not supported in the Dd engine
150 if (type != EquationSolverType::Native && type != EquationSolverType::Elimination) {
151 type = EquationSolverType::Native;
152 STORM_LOG_INFO("The selected equation solver is not available in the dd engine. Falling back to " << toString(type) << " solver.");
153 }
154
155 switch (type) {
156 case EquationSolverType::Native:
157 return std::make_unique<SymbolicNativeLinearEquationSolver<DdType, ValueType>>();
158 case EquationSolverType::Elimination:
159 return std::make_unique<SymbolicEliminationLinearEquationSolver<DdType, ValueType>>();
160 default:
161 STORM_LOG_THROW(false, storm::exceptions::InvalidEnvironmentException, "Unknown solver type.");
162 return nullptr;
163 }
164}
165
168
172
178
184
185} // namespace solver
186} // namespace storm
SolverEnvironment & solver()
storm::solver::EquationSolverType const & getLinearEquationSolverType() const
Add< LibraryType, ValueType > swapVariables(std::vector< std::pair< storm::expressions::Variable, storm::expressions::Variable > > const &metaVariablePairs) const
Swaps the given pairs of meta variables in the ADD.
Definition Add.cpp:292
Add< LibraryType, ValueType > multiplyMatrix(Add< LibraryType, ValueType > const &otherMatrix, std::set< storm::expressions::Variable > const &summationMetaVariables) const
Multiplies the current ADD (representing a matrix) with the given matrix by summing over the given me...
Definition Add.cpp:372
virtual std::unique_ptr< storm::solver::SymbolicLinearEquationSolver< DdType, ValueType > > create(Environment const &env) const override
std::unique_ptr< storm::solver::SymbolicLinearEquationSolver< DdType, ValueType > > create(Environment const &env, storm::dd::Bdd< DdType > const &allRows, std::set< storm::expressions::Variable > const &rowMetaVariables, std::set< storm::expressions::Variable > const &columnMetaVariables, std::vector< std::pair< storm::expressions::Variable, storm::expressions::Variable > > const &rowColumnMetaVariablePairs) const
LinearEquationSolverRequirements getRequirements(Environment const &env) const
LinearEquationSolverProblemFormat getEquationProblemFormat(Environment const &env) const
An interface that represents an abstract symbolic linear equation solver.
virtual void setData(storm::dd::Bdd< DdType > const &allRows, std::set< storm::expressions::Variable > const &rowMetaVariables, std::set< storm::expressions::Variable > const &columnMetaVariables, std::vector< std::pair< storm::expressions::Variable, storm::expressions::Variable > > const &rowColumnMetaVariablePairs)
virtual storm::dd::Add< DdType, ValueType > multiply(storm::dd::Add< DdType, ValueType > const &x, storm::dd::Add< DdType, ValueType > const *b=nullptr, uint_fast64_t n=1) const
Performs repeated matrix-vector multiplication, using x[0] = x and x[i + 1] = A*x[i] + b.
virtual LinearEquationSolverProblemFormat getEquationProblemFormat(Environment const &env) const
Retrieves the format in which this solver expects to solve equations.
void setMatrix(storm::dd::Add< DdType, ValueType > const &newA)
virtual LinearEquationSolverRequirements getRequirements(Environment const &env) const
Retrieves the requirements of the solver under the current settings.
#define STORM_LOG_INFO(message)
Definition logging.h:29
#define STORM_LOG_THROW(cond, exception, message)
Definition macros.h:30
std::string toString(GurobiSolverMethod const &method)
Yields a string representation of the GurobiSolverMethod.
LabParser.cpp.
Definition cli.cpp:18