Storm 1.11.1.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
SymbolicLinearEquationSolver.cpp
Go to the documentation of this file.
2
12
13namespace storm {
14namespace solver {
15
16template<storm::dd::DdType DdType, typename ValueType>
20
21template<storm::dd::DdType DdType, typename ValueType>
23 storm::dd::Add<DdType, ValueType> const& A, storm::dd::Bdd<DdType> const& allRows, std::set<storm::expressions::Variable> const& rowMetaVariables,
24 std::set<storm::expressions::Variable> const& columnMetaVariables,
25 std::vector<std::pair<storm::expressions::Variable, storm::expressions::Variable>> const& rowColumnMetaVariablePairs)
26 : SymbolicLinearEquationSolver(allRows, rowMetaVariables, columnMetaVariables, rowColumnMetaVariablePairs) {
27 this->setMatrix(A);
28}
29
30template<storm::dd::DdType DdType, typename ValueType>
32 storm::dd::Bdd<DdType> const& allRows, std::set<storm::expressions::Variable> const& rowMetaVariables,
33 std::set<storm::expressions::Variable> const& columnMetaVariables,
34 std::vector<std::pair<storm::expressions::Variable, storm::expressions::Variable>> const& rowColumnMetaVariablePairs)
35 : SymbolicEquationSolver<DdType, ValueType>(allRows),
36 rowMetaVariables(rowMetaVariables),
37 columnMetaVariables(columnMetaVariables),
38 rowColumnMetaVariablePairs(rowColumnMetaVariablePairs) {
39 // Intentionally left empty.
40}
41
42template<storm::dd::DdType DdType, typename ValueType>
44 storm::dd::Add<DdType, ValueType> const* b, uint_fast64_t n) const {
46
47 // Perform matrix-vector multiplication while the bound is met.
48 for (uint_fast64_t i = 0; i < n; ++i) {
49 xCopy = xCopy.swapVariables(this->rowColumnMetaVariablePairs);
50 xCopy = this->A.multiplyMatrix(xCopy, this->columnMetaVariables);
51 if (b != nullptr) {
52 xCopy += *b;
53 }
54 }
55
56 return xCopy;
57}
58
59template<storm::dd::DdType DdType, typename ValueType>
61 return LinearEquationSolverProblemFormat::EquationSystem;
62}
63
64template<storm::dd::DdType DdType, typename ValueType>
69
70template<storm::dd::DdType DdType, typename ValueType>
74
75template<storm::dd::DdType DdType, typename ValueType>
77 storm::dd::Bdd<DdType> const& allRows, std::set<storm::expressions::Variable> const& rowMetaVariables,
78 std::set<storm::expressions::Variable> const& columnMetaVariables,
79 std::vector<std::pair<storm::expressions::Variable, storm::expressions::Variable>> const& rowColumnMetaVariablePairs) {
80 this->setAllRows(allRows);
81 this->rowMetaVariables = rowMetaVariables;
82 this->columnMetaVariables = columnMetaVariables;
83 this->rowColumnMetaVariablePairs = rowColumnMetaVariablePairs;
84}
85
86template<storm::dd::DdType DdType, typename ValueType>
87std::unique_ptr<storm::solver::SymbolicLinearEquationSolver<DdType, ValueType>> SymbolicLinearEquationSolverFactory<DdType, ValueType>::create(
88 Environment const& env, storm::dd::Add<DdType, ValueType> const& A, storm::dd::Bdd<DdType> const& allRows,
89 std::set<storm::expressions::Variable> const& rowMetaVariables, std::set<storm::expressions::Variable> const& columnMetaVariables,
90 std::vector<std::pair<storm::expressions::Variable, storm::expressions::Variable>> const& rowColumnMetaVariablePairs) const {
91 std::unique_ptr<storm::solver::SymbolicLinearEquationSolver<DdType, ValueType>> solver =
92 this->create(env, allRows, rowMetaVariables, columnMetaVariables, rowColumnMetaVariablePairs);
93 solver->setMatrix(A);
94 return solver;
95}
96
97template<storm::dd::DdType DdType, typename ValueType>
98std::unique_ptr<storm::solver::SymbolicLinearEquationSolver<DdType, ValueType>> SymbolicLinearEquationSolverFactory<DdType, ValueType>::create(
99 Environment const& env, storm::dd::Bdd<DdType> const& allRows, std::set<storm::expressions::Variable> const& rowMetaVariables,
100 std::set<storm::expressions::Variable> const& columnMetaVariables,
101 std::vector<std::pair<storm::expressions::Variable, storm::expressions::Variable>> const& rowColumnMetaVariablePairs) const {
102 std::unique_ptr<storm::solver::SymbolicLinearEquationSolver<DdType, ValueType>> solver = this->create(env);
103 solver->setData(allRows, rowMetaVariables, columnMetaVariables, rowColumnMetaVariablePairs);
104 return solver;
105}
107template<storm::dd::DdType DdType, typename ValueType>
111
112template<storm::dd::DdType DdType, typename ValueType>
116
117template<>
118std::unique_ptr<storm::solver::SymbolicLinearEquationSolver<storm::dd::DdType::Sylvan, storm::RationalFunction>>
120 EquationSolverType type = env.solver().getLinearEquationSolverType();
121
122 // Adjust the solver type if it is not supported in the Dd engine with rational functions
123 if (type != EquationSolverType::Elimination) {
124 type = EquationSolverType::Elimination;
125 STORM_LOG_INFO("The selected equation solver is not available in the parametric dd engine. Falling back to " << toString(type) << " solver.");
126 }
127
128 switch (type) {
129 case EquationSolverType::Elimination:
130 return std::make_unique<SymbolicEliminationLinearEquationSolver<storm::dd::DdType::Sylvan, storm::RationalFunction>>();
131 default:
132 STORM_LOG_THROW(false, storm::exceptions::InvalidEnvironmentException, "Unknown solver type.");
133 return nullptr;
134 }
135}
136
137template<storm::dd::DdType DdType, typename ValueType>
138std::unique_ptr<storm::solver::SymbolicLinearEquationSolver<DdType, ValueType>> GeneralSymbolicLinearEquationSolverFactory<DdType, ValueType>::create(
139 Environment const& env) const {
140 EquationSolverType type = env.solver().getLinearEquationSolverType();
141
142 // Adjust the solver type if it is not supported in the Dd engine
143 if (type != EquationSolverType::Native && type != EquationSolverType::Elimination) {
144 type = EquationSolverType::Native;
145 STORM_LOG_INFO("The selected equation solver is not available in the dd engine. Falling back to " << toString(type) << " solver.");
146 }
147
148 switch (type) {
149 case EquationSolverType::Native:
150 return std::make_unique<SymbolicNativeLinearEquationSolver<DdType, ValueType>>();
151 case EquationSolverType::Elimination:
152 return std::make_unique<SymbolicEliminationLinearEquationSolver<DdType, ValueType>>();
153 default:
154 STORM_LOG_THROW(false, storm::exceptions::InvalidEnvironmentException, "Unknown solver type.");
155 return nullptr;
156 }
157}
158
161
165
171
177
178} // namespace solver
179} // 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:285
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:365
LinearEquationSolverRequirements getRequirements(Environment const &env) const
LinearEquationSolverProblemFormat getEquationProblemFormat(Environment const &env) const
An interface that represents an abstract symbolic linear equation solver.
void setMatrix(storm::dd::Add< DdType, ValueType > const &newA)
#define STORM_LOG_INFO(message)
Definition logging.h:24
#define STORM_LOG_THROW(cond, exception, message)
Definition macros.h:30