69 std::vector<storm::RationalNumber>
const& b)
const {
70 auto solutionMethod = getMethod(env,
true);
71 STORM_LOG_WARN_COND(solutionMethod == EigenLinearEquationSolverMethod::SparseLU,
"Switching method to SparseLU.");
72 STORM_LOG_INFO(
"Solving linear equation system (" << x.size() <<
" rows) with with rational numbers using LU factorization (Eigen library).");
75 auto eigenX = Eigen::Matrix<storm::RationalNumber, Eigen::Dynamic, 1>::Map(x.data(), x.size());
76 auto eigenB = Eigen::Matrix<storm::RationalNumber, Eigen::Dynamic, 1>::Map(b.data(), b.size());
78 Eigen::SparseLU<Eigen::SparseMatrix<storm::RationalNumber>, Eigen::COLAMDOrdering<int>>
solver;
80 solver._solve_impl(eigenB, eigenX);
82 if (
solver.info() != Eigen::ComputationInfo::Success) {
92 std::vector<storm::RationalFunction>
const& b)
const {
93 auto solutionMethod = getMethod(env,
true);
94 STORM_LOG_WARN_COND(solutionMethod == EigenLinearEquationSolverMethod::SparseLU,
"Switching method to SparseLU.");
95 STORM_LOG_INFO(
"Solving linear equation system (" << x.size() <<
" rows) with rational functions using LU factorization (Eigen library).");
98 auto eigenX = Eigen::Matrix<storm::RationalFunction, Eigen::Dynamic, 1>::Map(x.data(), x.size());
99 auto eigenB = Eigen::Matrix<storm::RationalFunction, Eigen::Dynamic, 1>::Map(b.data(), b.size());
101 Eigen::SparseLU<Eigen::SparseMatrix<storm::RationalFunction>, Eigen::COLAMDOrdering<int>>
solver;
103 solver._solve_impl(eigenB, eigenX);
104 if (
solver.info() != Eigen::ComputationInfo::Success) {
114 auto eigenX = Eigen::Matrix<ValueType, Eigen::Dynamic, 1>::Map(x.data(), x.size());
115 auto eigenB = Eigen::Matrix<ValueType, Eigen::Dynamic, 1>::Map(b.data(), b.size());
118 if (solutionMethod == EigenLinearEquationSolverMethod::SparseLU) {
119 STORM_LOG_INFO(
"Solving linear equation system (" << x.size() <<
" rows) with sparse LU factorization (Eigen library).");
120 Eigen::SparseLU<Eigen::SparseMatrix<ValueType>, Eigen::COLAMDOrdering<int>>
solver;
121 solver.compute(*this->eigenA);
122 solver._solve_impl(eigenB, eigenX);
123 if (
solver.info() != Eigen::ComputationInfo::Success) {
128 bool converged =
false;
129 uint64_t numberOfIterations = 0;
130 Eigen::Index maxIter = std::numeric_limits<Eigen::Index>::max();
137 if (solutionMethod == EigenLinearEquationSolverMethod::Bicgstab) {
138 if (preconditioner == EigenLinearEquationSolverPreconditioner::Ilu) {
139 STORM_LOG_INFO(
"Solving linear equation system (" << x.size() <<
" rows) with BiCGSTAB with Ilu preconditioner (Eigen library).");
141 Eigen::BiCGSTAB<Eigen::SparseMatrix<ValueType>, Eigen::IncompleteLUT<ValueType>>
solver;
142 solver.compute(*this->eigenA);
143 solver.setTolerance(precision);
144 solver.setMaxIterations(maxIter);
145 eigenX =
solver.solveWithGuess(eigenB, eigenX);
146 converged =
solver.info() == Eigen::ComputationInfo::Success;
147 numberOfIterations =
solver.iterations();
148 }
else if (preconditioner == EigenLinearEquationSolverPreconditioner::Diagonal) {
149 STORM_LOG_INFO(
"Solving linear equation system (" << x.size() <<
" rows) with BiCGSTAB with Diagonal preconditioner (Eigen library).");
151 Eigen::BiCGSTAB<Eigen::SparseMatrix<ValueType>, Eigen::DiagonalPreconditioner<ValueType>>
solver;
152 solver.setTolerance(precision);
153 solver.setMaxIterations(maxIter);
154 solver.compute(*this->eigenA);
155 eigenX =
solver.solveWithGuess(eigenB, eigenX);
156 converged =
solver.info() == Eigen::ComputationInfo::Success;
157 numberOfIterations =
solver.iterations();
159 STORM_LOG_INFO(
"Solving linear equation system (" << x.size() <<
" rows) with BiCGSTAB with identity preconditioner (Eigen library).");
161 Eigen::BiCGSTAB<Eigen::SparseMatrix<ValueType>, Eigen::IdentityPreconditioner>
solver;
162 solver.setTolerance(precision);
163 solver.setMaxIterations(maxIter);
164 solver.compute(*this->eigenA);
165 eigenX =
solver.solveWithGuess(eigenB, eigenX);
166 numberOfIterations =
solver.iterations();
167 converged =
solver.info() == Eigen::ComputationInfo::Success;
169 }
else if (solutionMethod == EigenLinearEquationSolverMethod::DGmres) {
170 if (preconditioner == EigenLinearEquationSolverPreconditioner::Ilu) {
171 STORM_LOG_INFO(
"Solving linear equation system (" << x.size() <<
" rows) with DGMRES with Ilu preconditioner (Eigen library).");
172 Eigen::DGMRES<Eigen::SparseMatrix<ValueType>, Eigen::IncompleteLUT<ValueType>>
solver;
173 solver.setTolerance(precision);
174 solver.setMaxIterations(maxIter);
175 solver.set_restart(restartThreshold);
176 solver.compute(*this->eigenA);
177 eigenX =
solver.solveWithGuess(eigenB, eigenX);
178 converged =
solver.info() == Eigen::ComputationInfo::Success;
179 numberOfIterations =
solver.iterations();
180 }
else if (preconditioner == EigenLinearEquationSolverPreconditioner::Diagonal) {
181 STORM_LOG_INFO(
"Solving linear equation system (" << x.size() <<
" rows) with DGMRES with Diagonal preconditioner (Eigen library).");
183 Eigen::DGMRES<Eigen::SparseMatrix<ValueType>, Eigen::DiagonalPreconditioner<ValueType>>
solver;
184 solver.setTolerance(precision);
185 solver.setMaxIterations(maxIter);
186 solver.set_restart(restartThreshold);
187 solver.compute(*this->eigenA);
188 eigenX =
solver.solveWithGuess(eigenB, eigenX);
189 converged =
solver.info() == Eigen::ComputationInfo::Success;
190 numberOfIterations =
solver.iterations();
192 STORM_LOG_INFO(
"Solving linear equation system (" << x.size() <<
" rows) with DGMRES with identity preconditioner (Eigen library).");
194 Eigen::DGMRES<Eigen::SparseMatrix<ValueType>, Eigen::IdentityPreconditioner>
solver;
195 solver.setTolerance(precision);
196 solver.setMaxIterations(maxIter);
197 solver.set_restart(restartThreshold);
198 solver.compute(*this->eigenA);
199 eigenX =
solver.solveWithGuess(eigenB, eigenX);
200 converged =
solver.info() == Eigen::ComputationInfo::Success;
201 numberOfIterations =
solver.iterations();
204 }
else if (solutionMethod == EigenLinearEquationSolverMethod::Gmres) {
205 if (preconditioner == EigenLinearEquationSolverPreconditioner::Ilu) {
206 STORM_LOG_INFO(
"Solving linear equation system (" << x.size() <<
" rows) with GMRES with Ilu preconditioner (Eigen library).");
208 Eigen::GMRES<Eigen::SparseMatrix<ValueType>, Eigen::IncompleteLUT<ValueType>>
solver;
209 solver.setTolerance(precision);
210 solver.setMaxIterations(maxIter);
211 solver.set_restart(restartThreshold);
212 solver.compute(*this->eigenA);
213 eigenX =
solver.solveWithGuess(eigenB, eigenX);
214 converged =
solver.info() == Eigen::ComputationInfo::Success;
215 numberOfIterations =
solver.iterations();
216 }
else if (preconditioner == EigenLinearEquationSolverPreconditioner::Diagonal) {
217 STORM_LOG_INFO(
"Solving linear equation system (" << x.size() <<
" rows) with GMRES with Diagonal preconditioner (Eigen library).");
219 Eigen::GMRES<Eigen::SparseMatrix<ValueType>, Eigen::DiagonalPreconditioner<ValueType>>
solver;
220 solver.setTolerance(precision);
221 solver.setMaxIterations(maxIter);
222 solver.set_restart(restartThreshold);
223 solver.compute(*this->eigenA);
224 eigenX =
solver.solveWithGuess(eigenB, eigenX);
225 converged =
solver.info() == Eigen::ComputationInfo::Success;
226 numberOfIterations =
solver.iterations();
228 STORM_LOG_INFO(
"Solving linear equation system (" << x.size() <<
" rows) with GMRES with identity preconditioner (Eigen library).");
230 Eigen::GMRES<Eigen::SparseMatrix<ValueType>, Eigen::IdentityPreconditioner>
solver;
231 solver.setTolerance(precision);
232 solver.setMaxIterations(maxIter);
233 solver.set_restart(restartThreshold);
234 solver.compute(*this->eigenA);
235 eigenX =
solver.solveWithGuess(eigenB, eigenX);
236 converged =
solver.info() == Eigen::ComputationInfo::Success;
237 numberOfIterations =
solver.iterations();
246 STORM_LOG_INFO(
"Iterative solver converged after " << numberOfIterations <<
" iterations.");