Storm 1.14.0.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
SymbolicMinMaxLinearEquationSolver.h
Go to the documentation of this file.
1#pragma once
2
3#include <boost/optional.hpp>
4#include <memory>
5#include <set>
6#include <vector>
7
13
15
19
20namespace storm {
21
22class Environment;
23
24namespace dd {
25template<storm::dd::DdType Type, typename ValueType>
26class Add;
27
28template<storm::dd::DdType T>
29class Bdd;
30} // namespace dd
31
32namespace solver {
37template<storm::dd::DdType DdType, typename ValueType>
39 public:
42
58 storm::dd::Bdd<DdType> const& illegalMask, std::set<storm::expressions::Variable> const& rowMetaVariables,
59 std::set<storm::expressions::Variable> const& columnMetaVariables,
60 std::set<storm::expressions::Variable> const& choiceVariables,
61 std::vector<std::pair<storm::expressions::Variable, storm::expressions::Variable>> const& rowColumnMetaVariablePairs,
63
78
92 storm::dd::Add<DdType, ValueType> const* b = nullptr, uint_fast64_t n = 1) const;
93
97 void setInitialScheduler(storm::dd::Bdd<DdType> const& scheduler);
98
103
107 bool hasInitialScheduler() const;
108
113 boost::optional<storm::solver::OptimizationDirection> const& direction = boost::none) const;
114
118 void setHasUniqueSolution(bool value = true);
119
123 bool hasUniqueSolution() const;
124
129 void setRequirementsChecked(bool value = true);
130
134 bool isRequirementsCheckedSet() const;
135
140
141 private:
142 MinMaxMethod getMethod(Environment const& env, bool isExactMode) const;
143
144 storm::dd::Add<DdType, ValueType> solveEquationsWithScheduler(Environment const& env, storm::dd::Bdd<DdType> const& scheduler,
149 storm::dd::Add<DdType, ValueType> const& diagonal) const;
150
151 storm::dd::Add<DdType, ValueType> solveEquationsValueIteration(Environment const& env, storm::solver::OptimizationDirection const& dir,
153 storm::dd::Add<DdType, ValueType> const& b) const;
154 storm::dd::Add<DdType, ValueType> solveEquationsPolicyIteration(Environment const& env, storm::solver::OptimizationDirection const& dir,
156 storm::dd::Add<DdType, ValueType> const& b) const;
157 storm::dd::Add<DdType, ValueType> solveEquationsRationalSearch(Environment const& env, storm::solver::OptimizationDirection const& dir,
159 storm::dd::Add<DdType, ValueType> const& b) const;
160
161 template<typename RationalType, typename ImpreciseType>
162 static storm::dd::Add<DdType, RationalType> sharpen(OptimizationDirection dir, uint64_t precision,
165 bool& isSolution);
166
167 template<typename RationalType, typename ImpreciseType>
168 storm::dd::Add<DdType, RationalType> solveEquationsRationalSearchHelper(Environment const& env, OptimizationDirection dir,
174 template<typename ImpreciseType>
175 typename std::enable_if<std::is_same<ValueType, ImpreciseType>::value && storm::NumberTraits<ValueType>::IsExact, storm::dd::Add<DdType, ValueType>>::type
176 solveEquationsRationalSearchHelper(Environment const& env, storm::solver::OptimizationDirection const& dir, storm::dd::Add<DdType, ValueType> const& x,
177 storm::dd::Add<DdType, ValueType> const& b) const;
178 template<typename ImpreciseType>
179 typename std::enable_if<std::is_same<ValueType, ImpreciseType>::value && !storm::NumberTraits<ValueType>::IsExact, storm::dd::Add<DdType, ValueType>>::type
180 solveEquationsRationalSearchHelper(Environment const& env, storm::solver::OptimizationDirection const& dir, storm::dd::Add<DdType, ValueType> const& x,
181 storm::dd::Add<DdType, ValueType> const& b) const;
182 template<typename ImpreciseType>
183 typename std::enable_if<!std::is_same<ValueType, ImpreciseType>::value, storm::dd::Add<DdType, ValueType>>::type solveEquationsRationalSearchHelper(
185 storm::dd::Add<DdType, ValueType> const& b) const;
186
187 template<storm::dd::DdType DdTypePrime, typename ValueTypePrime>
189
190 struct ValueIterationResult {
191 ValueIterationResult(SolverStatus status, uint64_t iterations, storm::dd::Add<DdType, ValueType> const& values)
192 : status(status), iterations(iterations), values(values) {
193 // Intentionally left empty.
194 }
195
196 SolverStatus status;
197 uint64_t iterations;
199 };
200
201 ValueIterationResult performValueIteration(storm::solver::OptimizationDirection const& dir, storm::dd::Add<DdType, ValueType> const& x,
202 storm::dd::Add<DdType, ValueType> const& b, ValueType const& precision, bool relativeTerminationCriterion,
203 uint64_t maximalIterations) const;
204
205 protected:
206 // The matrix defining the coefficients of the linear equation system.
208
209 // A BDD characterizing the illegal choices.
211
212 // An ADD characterizing the illegal choices.
214
215 // The row variables.
216 std::set<storm::expressions::Variable> rowMetaVariables;
217
218 // The column variables.
219 std::set<storm::expressions::Variable> columnMetaVariables;
220
221 // The choice variables.
222 std::set<storm::expressions::Variable> choiceVariables;
223
224 // The pairs of meta variables used for renaming.
225 std::vector<std::pair<storm::expressions::Variable, storm::expressions::Variable>> rowColumnMetaVariablePairs;
226
227 // A factory for creating linear equation solvers when needed.
228 std::unique_ptr<SymbolicLinearEquationSolverFactory<DdType, ValueType>> linearEquationSolverFactory;
229
230 // Whether the solver can assume that the min-max equation system has a unique solution
232
233 // A flag indicating whether the requirements were checked.
235
236 // A scheduler that specifies with which schedulers to start.
237 boost::optional<storm::dd::Bdd<DdType>> initialScheduler;
238
239 private:
244};
245
246template<storm::dd::DdType DdType, typename ValueType>
248 public:
250
251 virtual std::unique_ptr<storm::solver::SymbolicMinMaxLinearEquationSolver<DdType, ValueType>> create(
252 storm::dd::Add<DdType, ValueType> const& A, storm::dd::Bdd<DdType> const& allRows, storm::dd::Bdd<DdType> const& illegalMask,
253 std::set<storm::expressions::Variable> const& rowMetaVariables, std::set<storm::expressions::Variable> const& columnMetaVariables,
254 std::set<storm::expressions::Variable> const& choiceVariables,
255 std::vector<std::pair<storm::expressions::Variable, storm::expressions::Variable>> const& rowColumnMetaVariablePairs) const = 0;
256
261 MinMaxLinearEquationSolverRequirements getRequirements(Environment const& env, bool hasUniqueSolution = false,
262 boost::optional<storm::solver::OptimizationDirection> const& direction = boost::none) const;
263
264 private:
265 virtual std::unique_ptr<storm::solver::SymbolicMinMaxLinearEquationSolver<DdType, ValueType>> create() const = 0;
266};
267
268template<storm::dd::DdType DdType, typename ValueType>
270 public:
271 virtual std::unique_ptr<storm::solver::SymbolicMinMaxLinearEquationSolver<DdType, ValueType>> create(
272 storm::dd::Add<DdType, ValueType> const& A, storm::dd::Bdd<DdType> const& allRows, storm::dd::Bdd<DdType> const& illegalMask,
273 std::set<storm::expressions::Variable> const& rowMetaVariables, std::set<storm::expressions::Variable> const& columnMetaVariables,
274 std::set<storm::expressions::Variable> const& choiceVariables,
275 std::vector<std::pair<storm::expressions::Variable, storm::expressions::Variable>> const& rowColumnMetaVariablePairs) const override;
276
277 private:
278 virtual std::unique_ptr<storm::solver::SymbolicMinMaxLinearEquationSolver<DdType, ValueType>> create() const override;
279};
280
281} // namespace solver
282} // namespace storm
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.
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.
static const bool IsExact