Storm
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
SymbolicMinMaxLinearEquationSolver.h
Go to the documentation of this file.
1#ifndef STORM_SOLVER_SYMBOLICMINMAXLINEAREQUATIONSOLVER_H_
2#define STORM_SOLVER_SYMBOLICMINMAXLINEAREQUATIONSOLVER_H_
3
4#include <boost/optional.hpp>
5#include <memory>
6#include <set>
7#include <vector>
8
14
16
20
21namespace storm {
22
23class Environment;
24
25namespace dd {
26template<storm::dd::DdType Type, typename ValueType>
27class Add;
28
29template<storm::dd::DdType T>
30class Bdd;
31} // namespace dd
32
33namespace solver {
38template<storm::dd::DdType DdType, typename ValueType>
40 public:
43
59 storm::dd::Bdd<DdType> const& illegalMask, std::set<storm::expressions::Variable> const& rowMetaVariables,
60 std::set<storm::expressions::Variable> const& columnMetaVariables,
61 std::set<storm::expressions::Variable> const& choiceVariables,
62 std::vector<std::pair<storm::expressions::Variable, storm::expressions::Variable>> const& rowColumnMetaVariablePairs,
64
79
93 storm::dd::Add<DdType, ValueType> const* b = nullptr, uint_fast64_t n = 1) const;
94
98 void setInitialScheduler(storm::dd::Bdd<DdType> const& scheduler);
99
104
108 bool hasInitialScheduler() const;
109
114 boost::optional<storm::solver::OptimizationDirection> const& direction = boost::none) const;
115
119 void setHasUniqueSolution(bool value = true);
120
124 bool hasUniqueSolution() const;
125
130 void setRequirementsChecked(bool value = true);
131
135 bool isRequirementsCheckedSet() const;
136
141
142 private:
143 MinMaxMethod getMethod(Environment const& env, bool isExactMode) const;
144
145 storm::dd::Add<DdType, ValueType> solveEquationsWithScheduler(Environment const& env, storm::dd::Bdd<DdType> const& scheduler,
150 storm::dd::Add<DdType, ValueType> const& diagonal) const;
151
152 storm::dd::Add<DdType, ValueType> solveEquationsValueIteration(Environment const& env, storm::solver::OptimizationDirection const& dir,
154 storm::dd::Add<DdType, ValueType> const& b) const;
155 storm::dd::Add<DdType, ValueType> solveEquationsPolicyIteration(Environment const& env, storm::solver::OptimizationDirection const& dir,
157 storm::dd::Add<DdType, ValueType> const& b) const;
158 storm::dd::Add<DdType, ValueType> solveEquationsRationalSearch(Environment const& env, storm::solver::OptimizationDirection const& dir,
160 storm::dd::Add<DdType, ValueType> const& b) const;
161
162 template<typename RationalType, typename ImpreciseType>
163 static storm::dd::Add<DdType, RationalType> sharpen(OptimizationDirection dir, uint64_t precision,
166 bool& isSolution);
167
168 template<typename RationalType, typename ImpreciseType>
169 storm::dd::Add<DdType, RationalType> solveEquationsRationalSearchHelper(Environment const& env, OptimizationDirection dir,
175 template<typename ImpreciseType>
176 typename std::enable_if<std::is_same<ValueType, ImpreciseType>::value && storm::NumberTraits<ValueType>::IsExact, storm::dd::Add<DdType, ValueType>>::type
177 solveEquationsRationalSearchHelper(Environment const& env, storm::solver::OptimizationDirection const& dir, storm::dd::Add<DdType, ValueType> const& x,
178 storm::dd::Add<DdType, ValueType> const& b) const;
179 template<typename ImpreciseType>
180 typename std::enable_if<std::is_same<ValueType, ImpreciseType>::value && !storm::NumberTraits<ValueType>::IsExact, storm::dd::Add<DdType, ValueType>>::type
181 solveEquationsRationalSearchHelper(Environment const& env, storm::solver::OptimizationDirection const& dir, storm::dd::Add<DdType, ValueType> const& x,
182 storm::dd::Add<DdType, ValueType> const& b) const;
183 template<typename ImpreciseType>
184 typename std::enable_if<!std::is_same<ValueType, ImpreciseType>::value, storm::dd::Add<DdType, ValueType>>::type solveEquationsRationalSearchHelper(
186 storm::dd::Add<DdType, ValueType> const& b) const;
187
188 template<storm::dd::DdType DdTypePrime, typename ValueTypePrime>
190
191 struct ValueIterationResult {
192 ValueIterationResult(SolverStatus status, uint64_t iterations, storm::dd::Add<DdType, ValueType> const& values)
193 : status(status), iterations(iterations), values(values) {
194 // Intentionally left empty.
195 }
196
197 SolverStatus status;
198 uint64_t iterations;
200 };
201
202 ValueIterationResult performValueIteration(storm::solver::OptimizationDirection const& dir, storm::dd::Add<DdType, ValueType> const& x,
203 storm::dd::Add<DdType, ValueType> const& b, ValueType const& precision, bool relativeTerminationCriterion,
204 uint64_t maximalIterations) const;
205
206 protected:
207 // The matrix defining the coefficients of the linear equation system.
209
210 // A BDD characterizing the illegal choices.
212
213 // An ADD characterizing the illegal choices.
215
216 // The row variables.
217 std::set<storm::expressions::Variable> rowMetaVariables;
218
219 // The column variables.
220 std::set<storm::expressions::Variable> columnMetaVariables;
221
222 // The choice variables.
223 std::set<storm::expressions::Variable> choiceVariables;
224
225 // The pairs of meta variables used for renaming.
226 std::vector<std::pair<storm::expressions::Variable, storm::expressions::Variable>> rowColumnMetaVariablePairs;
227
228 // A factory for creating linear equation solvers when needed.
229 std::unique_ptr<SymbolicLinearEquationSolverFactory<DdType, ValueType>> linearEquationSolverFactory;
230
231 // Whether the solver can assume that the min-max equation system has a unique solution
233
234 // A flag indicating whether the requirements were checked.
236
237 // A scheduler that specifies with which schedulers to start.
238 boost::optional<storm::dd::Bdd<DdType>> initialScheduler;
239
240 private:
245};
246
247template<storm::dd::DdType DdType, typename ValueType>
249 public:
251
252 virtual std::unique_ptr<storm::solver::SymbolicMinMaxLinearEquationSolver<DdType, ValueType>> create(
253 storm::dd::Add<DdType, ValueType> const& A, storm::dd::Bdd<DdType> const& allRows, storm::dd::Bdd<DdType> const& illegalMask,
254 std::set<storm::expressions::Variable> const& rowMetaVariables, std::set<storm::expressions::Variable> const& columnMetaVariables,
255 std::set<storm::expressions::Variable> const& choiceVariables,
256 std::vector<std::pair<storm::expressions::Variable, storm::expressions::Variable>> const& rowColumnMetaVariablePairs) const = 0;
257
262 MinMaxLinearEquationSolverRequirements getRequirements(Environment const& env, bool hasUniqueSolution = false,
263 boost::optional<storm::solver::OptimizationDirection> const& direction = boost::none) const;
264
265 private:
266 virtual std::unique_ptr<storm::solver::SymbolicMinMaxLinearEquationSolver<DdType, ValueType>> create() const = 0;
267};
268
269template<storm::dd::DdType DdType, typename ValueType>
271 public:
272 virtual std::unique_ptr<storm::solver::SymbolicMinMaxLinearEquationSolver<DdType, ValueType>> create(
273 storm::dd::Add<DdType, ValueType> const& A, storm::dd::Bdd<DdType> const& allRows, storm::dd::Bdd<DdType> const& illegalMask,
274 std::set<storm::expressions::Variable> const& rowMetaVariables, std::set<storm::expressions::Variable> const& columnMetaVariables,
275 std::set<storm::expressions::Variable> const& choiceVariables,
276 std::vector<std::pair<storm::expressions::Variable, storm::expressions::Variable>> const& rowColumnMetaVariablePairs) const override;
277
278 private:
279 virtual std::unique_ptr<storm::solver::SymbolicMinMaxLinearEquationSolver<DdType, ValueType>> create() const override;
280};
281
282} // namespace solver
283} // namespace storm
284
285#endif /* STORM_SOLVER_SYMBOLICMINMAXLINEAREQUATIONSOLVER_H_ */
virtual std::unique_ptr< storm::solver::SymbolicMinMaxLinearEquationSolver< DdType, ValueType > > create(storm::dd::Add< DdType, ValueType > const &A, storm::dd::Bdd< DdType > const &allRows, storm::dd::Bdd< DdType > const &illegalMask, std::set< storm::expressions::Variable > const &rowMetaVariables, std::set< storm::expressions::Variable > const &columnMetaVariables, std::set< storm::expressions::Variable > const &choiceVariables, std::vector< std::pair< storm::expressions::Variable, storm::expressions::Variable > > const &rowColumnMetaVariablePairs) const override
An interface that represents an abstract symbolic linear equation solver.
virtual std::unique_ptr< storm::solver::SymbolicMinMaxLinearEquationSolver< DdType, ValueType > > create(storm::dd::Add< DdType, ValueType > const &A, storm::dd::Bdd< DdType > const &allRows, storm::dd::Bdd< DdType > const &illegalMask, std::set< storm::expressions::Variable > const &rowMetaVariables, std::set< storm::expressions::Variable > const &columnMetaVariables, std::set< storm::expressions::Variable > const &choiceVariables, std::vector< std::pair< storm::expressions::Variable, storm::expressions::Variable > > const &rowColumnMetaVariablePairs) const =0
MinMaxLinearEquationSolverRequirements getRequirements(Environment const &env, bool hasUniqueSolution=false, boost::optional< storm::solver::OptimizationDirection > const &direction=boost::none) const
Retrieves the requirements of the solver that would be created when calling create() right now.
An interface that represents an abstract symbolic linear equation solver.
bool hasUniqueSolution() const
Retrieves whether the solution to the min max equation system is assumed to be unique.
bool hasInitialScheduler() const
Retrieves whether an initial scheduler was set.
void setHasUniqueSolution(bool value=true)
Sets whether the solution to the min max equation system is known to be unique.
virtual storm::dd::Add< DdType, ValueType > multiply(storm::solver::OptimizationDirection const &dir, 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 storm::dd::Add< DdType, ValueType > solveEquations(Environment const &env, storm::solver::OptimizationDirection const &dir, storm::dd::Add< DdType, ValueType > const &x, storm::dd::Add< DdType, ValueType > const &b) const
Solves the equation system A*x = b.
bool isSolution(OptimizationDirection dir, storm::dd::Add< DdType, ValueType > const &x, storm::dd::Add< DdType, ValueType > const &b) const
Determines whether the given vector x satisfies x = min/max Ax + b.
void setInitialScheduler(storm::dd::Bdd< DdType > const &scheduler)
Sets an initial scheduler that is required by some solvers (see requirements).
bool isRequirementsCheckedSet() const
Retrieves whether the solver is aware that the requirements were checked.
storm::dd::Bdd< DdType > const & getInitialScheduler() const
Retrieves the initial scheduler (if there is any).
std::unique_ptr< SymbolicLinearEquationSolverFactory< DdType, ValueType > > linearEquationSolverFactory
void setRequirementsChecked(bool value=true)
Notifies the solver that the requirements for solving equations have been checked.
std::vector< std::pair< storm::expressions::Variable, storm::expressions::Variable > > rowColumnMetaVariablePairs
virtual MinMaxLinearEquationSolverRequirements getRequirements(Environment const &env, boost::optional< storm::solver::OptimizationDirection > const &direction=boost::none) const
Retrieves the requirements of the solver.
SFTBDDChecker::Bdd Bdd
LabParser.cpp.
Definition cli.cpp:18