112 auto eigenX = Eigen::Matrix<ValueType, Eigen::Dynamic, 1>::Map(x.data(), x.size());
113 auto eigenB = Eigen::Matrix<ValueType, Eigen::Dynamic, 1>::Map(b.data(), b.size());
116 if (solutionMethod == EigenLinearEquationSolverMethod::SparseLU) {
117 STORM_LOG_INFO(
"Solving linear equation system (" << x.size() <<
" rows) with sparse LU factorization (Eigen library).");
118 Eigen::SparseLU<Eigen::SparseMatrix<ValueType>, Eigen::COLAMDOrdering<int>> solver;
119 solver.compute(*this->eigenA);
120 solver._solve_impl(eigenB, eigenX);
122 bool converged =
false;
123 uint64_t numberOfIterations = 0;
124 Eigen::Index maxIter = std::numeric_limits<Eigen::Index>::max();
131 if (solutionMethod == EigenLinearEquationSolverMethod::Bicgstab) {
132 if (preconditioner == EigenLinearEquationSolverPreconditioner::Ilu) {
133 STORM_LOG_INFO(
"Solving linear equation system (" << x.size() <<
" rows) with BiCGSTAB with Ilu preconditioner (Eigen library).");
135 Eigen::BiCGSTAB<Eigen::SparseMatrix<ValueType>, Eigen::IncompleteLUT<ValueType>> solver;
136 solver.compute(*this->eigenA);
137 solver.setTolerance(precision);
138 solver.setMaxIterations(maxIter);
139 eigenX = solver.solveWithGuess(eigenB, eigenX);
140 converged = solver.info() == Eigen::ComputationInfo::Success;
141 numberOfIterations = solver.iterations();
142 }
else if (preconditioner == EigenLinearEquationSolverPreconditioner::Diagonal) {
143 STORM_LOG_INFO(
"Solving linear equation system (" << x.size() <<
" rows) with BiCGSTAB with Diagonal preconditioner (Eigen library).");
145 Eigen::BiCGSTAB<Eigen::SparseMatrix<ValueType>, Eigen::DiagonalPreconditioner<ValueType>> solver;
146 solver.setTolerance(precision);
147 solver.setMaxIterations(maxIter);
148 solver.compute(*this->eigenA);
149 eigenX = solver.solveWithGuess(eigenB, eigenX);
150 converged = solver.info() == Eigen::ComputationInfo::Success;
151 numberOfIterations = solver.iterations();
153 STORM_LOG_INFO(
"Solving linear equation system (" << x.size() <<
" rows) with BiCGSTAB with identity preconditioner (Eigen library).");
155 Eigen::BiCGSTAB<Eigen::SparseMatrix<ValueType>, Eigen::IdentityPreconditioner> solver;
156 solver.setTolerance(precision);
157 solver.setMaxIterations(maxIter);
158 solver.compute(*this->eigenA);
159 eigenX = solver.solveWithGuess(eigenB, eigenX);
160 numberOfIterations = solver.iterations();
161 converged = solver.info() == Eigen::ComputationInfo::Success;
163 }
else if (solutionMethod == EigenLinearEquationSolverMethod::DGmres) {
164 if (preconditioner == EigenLinearEquationSolverPreconditioner::Ilu) {
165 STORM_LOG_INFO(
"Solving linear equation system (" << x.size() <<
" rows) with DGMRES with Ilu preconditioner (Eigen library).");
166 Eigen::DGMRES<Eigen::SparseMatrix<ValueType>, Eigen::IncompleteLUT<ValueType>> solver;
167 solver.setTolerance(precision);
168 solver.setMaxIterations(maxIter);
169 solver.set_restart(restartThreshold);
170 solver.compute(*this->eigenA);
171 eigenX = solver.solveWithGuess(eigenB, eigenX);
172 converged = solver.info() == Eigen::ComputationInfo::Success;
173 numberOfIterations = solver.iterations();
174 }
else if (preconditioner == EigenLinearEquationSolverPreconditioner::Diagonal) {
175 STORM_LOG_INFO(
"Solving linear equation system (" << x.size() <<
" rows) with DGMRES with Diagonal preconditioner (Eigen library).");
177 Eigen::DGMRES<Eigen::SparseMatrix<ValueType>, Eigen::DiagonalPreconditioner<ValueType>> solver;
178 solver.setTolerance(precision);
179 solver.setMaxIterations(maxIter);
180 solver.set_restart(restartThreshold);
181 solver.compute(*this->eigenA);
182 eigenX = solver.solveWithGuess(eigenB, eigenX);
183 converged = solver.info() == Eigen::ComputationInfo::Success;
184 numberOfIterations = solver.iterations();
186 STORM_LOG_INFO(
"Solving linear equation system (" << x.size() <<
" rows) with DGMRES with identity preconditioner (Eigen library).");
188 Eigen::DGMRES<Eigen::SparseMatrix<ValueType>, Eigen::IdentityPreconditioner> solver;
189 solver.setTolerance(precision);
190 solver.setMaxIterations(maxIter);
191 solver.set_restart(restartThreshold);
192 solver.compute(*this->eigenA);
193 eigenX = solver.solveWithGuess(eigenB, eigenX);
194 converged = solver.info() == Eigen::ComputationInfo::Success;
195 numberOfIterations = solver.iterations();
198 }
else if (solutionMethod == EigenLinearEquationSolverMethod::Gmres) {
199 if (preconditioner == EigenLinearEquationSolverPreconditioner::Ilu) {
200 STORM_LOG_INFO(
"Solving linear equation system (" << x.size() <<
" rows) with GMRES with Ilu preconditioner (Eigen library).");
202 Eigen::GMRES<Eigen::SparseMatrix<ValueType>, Eigen::IncompleteLUT<ValueType>> solver;
203 solver.setTolerance(precision);
204 solver.setMaxIterations(maxIter);
205 solver.set_restart(restartThreshold);
206 solver.compute(*this->eigenA);
207 eigenX = solver.solveWithGuess(eigenB, eigenX);
208 converged = solver.info() == Eigen::ComputationInfo::Success;
209 numberOfIterations = solver.iterations();
210 }
else if (preconditioner == EigenLinearEquationSolverPreconditioner::Diagonal) {
211 STORM_LOG_INFO(
"Solving linear equation system (" << x.size() <<
" rows) with GMRES with Diagonal preconditioner (Eigen library).");
213 Eigen::GMRES<Eigen::SparseMatrix<ValueType>, Eigen::DiagonalPreconditioner<ValueType>> solver;
214 solver.setTolerance(precision);
215 solver.setMaxIterations(maxIter);
216 solver.set_restart(restartThreshold);
217 solver.compute(*this->eigenA);
218 eigenX = solver.solveWithGuess(eigenB, eigenX);
219 converged = solver.info() == Eigen::ComputationInfo::Success;
220 numberOfIterations = solver.iterations();
222 STORM_LOG_INFO(
"Solving linear equation system (" << x.size() <<
" rows) with GMRES with identity preconditioner (Eigen library).");
224 Eigen::GMRES<Eigen::SparseMatrix<ValueType>, Eigen::IdentityPreconditioner> solver;
225 solver.setTolerance(precision);
226 solver.setMaxIterations(maxIter);
227 solver.set_restart(restartThreshold);
228 solver.compute(*this->eigenA);
229 eigenX = solver.solveWithGuess(eigenB, eigenX);
230 converged = solver.info() == Eigen::ComputationInfo::Success;
231 numberOfIterations = solver.iterations();
240 STORM_LOG_INFO(
"Iterative solver converged after " << numberOfIterations <<
" iterations.");