Storm 1.14.0.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
NativeLinearEquationSolver.h
Go to the documentation of this file.
1#pragma once
2
3#include <ostream>
4
6
11
13
14namespace storm {
15
16class Environment;
17
18namespace solver {
19
23template<typename ValueType>
25 public:
29
30 virtual void setMatrix(storm::storage::SparseMatrix<ValueType> const& A) override;
31 virtual void setMatrix(storm::storage::SparseMatrix<ValueType>&& A) override;
32
34 virtual LinearEquationSolverRequirements getRequirements(Environment const& env) const override;
35
36 virtual void clearCache() const override;
37
38 protected:
39 virtual bool internalSolveEquations(storm::Environment const& env, std::vector<ValueType>& x, std::vector<ValueType> const& b) const override;
40
41 private:
42 struct PowerIterationResult {
43 PowerIterationResult(uint64_t iterations, SolverStatus status) : iterations(iterations), status(status) {
44 // Intentionally left empty.
45 }
46
47 uint64_t iterations;
48 SolverStatus status;
49 };
50
51 template<typename ValueTypePrime>
53
54 PowerIterationResult performPowerIteration(Environment const& env, std::vector<ValueType>*& currentX, std::vector<ValueType>*& newX,
55 std::vector<ValueType> const& b, ValueType const& precision, bool relative, SolverGuarantee const& guarantee,
56 uint64_t currentIterations, uint64_t maxIterations,
57 storm::solver::MultiplicationStyle const& multiplicationStyle) const;
58
59 virtual uint64_t getMatrixRowCount() const override;
60 virtual uint64_t getMatrixColumnCount() const override;
61
62 NativeLinearEquationSolverMethod getMethod(Environment const& env, bool isExactMode) const;
63
64 virtual bool solveEquationsSOR(storm::Environment const& env, std::vector<ValueType>& x, std::vector<ValueType> const& b, ValueType const& omega) const;
65 virtual bool solveEquationsJacobi(storm::Environment const& env, std::vector<ValueType>& x, std::vector<ValueType> const& b) const;
66 virtual bool solveEquationsWalkerChae(storm::Environment const& env, std::vector<ValueType>& x, std::vector<ValueType> const& b) const;
67 virtual bool solveEquationsPower(storm::Environment const& env, std::vector<ValueType>& x, std::vector<ValueType> const& b) const;
68 virtual bool solveEquationsSoundValueIteration(storm::Environment const& env, std::vector<ValueType>& x, std::vector<ValueType> const& b) const;
69 virtual bool solveEquationsOptimisticValueIteration(storm::Environment const& env, std::vector<ValueType>& x, std::vector<ValueType> const& b) const;
70 virtual bool solveEquationsGuessingValueIteration(storm::Environment const& env, std::vector<ValueType>& x, std::vector<ValueType> const& b) const;
71 virtual bool solveEquationsIntervalIteration(storm::Environment const& env, std::vector<ValueType>& x, std::vector<ValueType> const& b) const;
72 virtual bool solveEquationsRationalSearch(storm::Environment const& env, std::vector<ValueType>& x, std::vector<ValueType> const& b) const;
73
74 void setUpViOperator() const;
75
76 // If the solver takes posession of the matrix, we store the moved matrix in this member, so it gets deleted
77 // when the solver is destructed.
78 std::unique_ptr<storm::storage::SparseMatrix<ValueType>> localA;
79
80 // A pointer to the original sparse matrix given to this solver. If the solver takes posession of the matrix
81 // the pointer refers to localA.
83
84 mutable std::shared_ptr<storm::solver::helper::ValueIterationOperator<ValueType, true>> viOperator;
85
86 // An object to dispatch all multiplication operations.
87 mutable std::unique_ptr<Multiplier<ValueType>> multiplier;
88
89 struct JacobiDecomposition {
90 JacobiDecomposition(Environment const& env, storm::storage::SparseMatrix<ValueType> const& A);
91
93 std::vector<ValueType> DVector;
94 std::unique_ptr<storm::solver::Multiplier<ValueType>> multiplier;
95 };
96 mutable std::unique_ptr<JacobiDecomposition> jacobiDecomposition;
97
98 struct WalkerChaeData {
99 WalkerChaeData(Environment const& env, storm::storage::SparseMatrix<ValueType> const& originalMatrix, std::vector<ValueType> const& originalB);
100
101 void computeWalkerChaeMatrix(storm::storage::SparseMatrix<ValueType> const& originalMatrix);
102 void computeNewB(std::vector<ValueType> const& originalB);
103 void precomputeAuxiliaryData();
104
106 std::vector<ValueType> b;
107 ValueType t;
108 std::unique_ptr<storm::solver::Multiplier<ValueType>> multiplier;
109
110 // Auxiliary data.
111 std::vector<ValueType> columnSums;
112 std::vector<ValueType> newX;
113 };
114 mutable std::unique_ptr<WalkerChaeData> walkerChaeData;
115};
116
117template<typename ValueType>
119 public:
121
122 virtual std::unique_ptr<storm::solver::LinearEquationSolver<ValueType>> create(Environment const& env) const override;
123
124 virtual std::unique_ptr<LinearEquationSolverFactory<ValueType>> clone() const override;
125};
126} // namespace solver
127} // namespace storm
virtual std::unique_ptr< storm::solver::LinearEquationSolver< ValueType > > create(Environment const &env) const override
Creates an equation solver with the current settings, but without a matrix.
virtual std::unique_ptr< LinearEquationSolverFactory< ValueType > > clone() const override
Creates a copy of this factory.
virtual LinearEquationSolverProblemFormat getEquationProblemFormat(storm::Environment const &env) const override
Retrieves the format in which this solver expects to solve equations.
virtual bool internalSolveEquations(storm::Environment const &env, std::vector< ValueType > &x, std::vector< ValueType > const &b) const override
virtual void setMatrix(storm::storage::SparseMatrix< ValueType > const &A) override
virtual LinearEquationSolverRequirements getRequirements(Environment const &env) const override
Retrieves the requirements of the solver under the current settings.
A class that holds a possibly non-square matrix in the compressed row storage format.