108 auto eigenX = Eigen::Matrix<ValueType, Eigen::Dynamic, 1>::Map(x.data(), x.size());
109 auto eigenB = Eigen::Matrix<ValueType, Eigen::Dynamic, 1>::Map(b.data(), b.size());
112 if (solutionMethod == EigenLinearEquationSolverMethod::SparseLU) {
113 STORM_LOG_INFO(
"Solving linear equation system (" << x.size() <<
" rows) with sparse LU factorization (Eigen library).");
114 Eigen::SparseLU<Eigen::SparseMatrix<ValueType>, Eigen::COLAMDOrdering<int>> solver;
115 solver.compute(*this->eigenA);
116 solver._solve_impl(eigenB, eigenX);
118 bool converged =
false;
119 uint64_t numberOfIterations = 0;
120 Eigen::Index maxIter = std::numeric_limits<Eigen::Index>::max();
127 if (solutionMethod == EigenLinearEquationSolverMethod::Bicgstab) {
128 if (preconditioner == EigenLinearEquationSolverPreconditioner::Ilu) {
129 STORM_LOG_INFO(
"Solving linear equation system (" << x.size() <<
" rows) with BiCGSTAB with Ilu preconditioner (Eigen library).");
131 Eigen::BiCGSTAB<Eigen::SparseMatrix<ValueType>, Eigen::IncompleteLUT<ValueType>> solver;
132 solver.compute(*this->eigenA);
133 solver.setTolerance(precision);
134 solver.setMaxIterations(maxIter);
135 eigenX = solver.solveWithGuess(eigenB, eigenX);
136 converged = solver.info() == Eigen::ComputationInfo::Success;
137 numberOfIterations = solver.iterations();
138 }
else if (preconditioner == EigenLinearEquationSolverPreconditioner::Diagonal) {
139 STORM_LOG_INFO(
"Solving linear equation system (" << x.size() <<
" rows) with BiCGSTAB with Diagonal preconditioner (Eigen library).");
141 Eigen::BiCGSTAB<Eigen::SparseMatrix<ValueType>, Eigen::DiagonalPreconditioner<ValueType>> solver;
142 solver.setTolerance(precision);
143 solver.setMaxIterations(maxIter);
144 solver.compute(*this->eigenA);
145 eigenX = solver.solveWithGuess(eigenB, eigenX);
146 converged = solver.info() == Eigen::ComputationInfo::Success;
147 numberOfIterations = solver.iterations();
149 STORM_LOG_INFO(
"Solving linear equation system (" << x.size() <<
" rows) with BiCGSTAB with identity preconditioner (Eigen library).");
151 Eigen::BiCGSTAB<Eigen::SparseMatrix<ValueType>, Eigen::IdentityPreconditioner> solver;
152 solver.setTolerance(precision);
153 solver.setMaxIterations(maxIter);
154 solver.compute(*this->eigenA);
155 eigenX = solver.solveWithGuess(eigenB, eigenX);
156 numberOfIterations = solver.iterations();
157 converged = solver.info() == Eigen::ComputationInfo::Success;
159 }
else if (solutionMethod == EigenLinearEquationSolverMethod::DGmres) {
160 if (preconditioner == EigenLinearEquationSolverPreconditioner::Ilu) {
161 STORM_LOG_INFO(
"Solving linear equation system (" << x.size() <<
" rows) with DGMRES with Ilu preconditioner (Eigen library).");
162 Eigen::DGMRES<Eigen::SparseMatrix<ValueType>, Eigen::IncompleteLUT<ValueType>> solver;
163 solver.setTolerance(precision);
164 solver.setMaxIterations(maxIter);
165 solver.set_restart(restartThreshold);
166 solver.compute(*this->eigenA);
167 eigenX = solver.solveWithGuess(eigenB, eigenX);
168 converged = solver.info() == Eigen::ComputationInfo::Success;
169 numberOfIterations = solver.iterations();
170 }
else if (preconditioner == EigenLinearEquationSolverPreconditioner::Diagonal) {
171 STORM_LOG_INFO(
"Solving linear equation system (" << x.size() <<
" rows) with DGMRES with Diagonal preconditioner (Eigen library).");
173 Eigen::DGMRES<Eigen::SparseMatrix<ValueType>, Eigen::DiagonalPreconditioner<ValueType>> solver;
174 solver.setTolerance(precision);
175 solver.setMaxIterations(maxIter);
176 solver.set_restart(restartThreshold);
177 solver.compute(*this->eigenA);
178 eigenX = solver.solveWithGuess(eigenB, eigenX);
179 converged = solver.info() == Eigen::ComputationInfo::Success;
180 numberOfIterations = solver.iterations();
182 STORM_LOG_INFO(
"Solving linear equation system (" << x.size() <<
" rows) with DGMRES with identity preconditioner (Eigen library).");
184 Eigen::DGMRES<Eigen::SparseMatrix<ValueType>, Eigen::IdentityPreconditioner> solver;
185 solver.setTolerance(precision);
186 solver.setMaxIterations(maxIter);
187 solver.set_restart(restartThreshold);
188 solver.compute(*this->eigenA);
189 eigenX = solver.solveWithGuess(eigenB, eigenX);
190 converged = solver.info() == Eigen::ComputationInfo::Success;
191 numberOfIterations = solver.iterations();
194 }
else if (solutionMethod == EigenLinearEquationSolverMethod::Gmres) {
195 if (preconditioner == EigenLinearEquationSolverPreconditioner::Ilu) {
196 STORM_LOG_INFO(
"Solving linear equation system (" << x.size() <<
" rows) with GMRES with Ilu preconditioner (Eigen library).");
198 Eigen::GMRES<Eigen::SparseMatrix<ValueType>, Eigen::IncompleteLUT<ValueType>> solver;
199 solver.setTolerance(precision);
200 solver.setMaxIterations(maxIter);
201 solver.set_restart(restartThreshold);
202 solver.compute(*this->eigenA);
203 eigenX = solver.solveWithGuess(eigenB, eigenX);
204 converged = solver.info() == Eigen::ComputationInfo::Success;
205 numberOfIterations = solver.iterations();
206 }
else if (preconditioner == EigenLinearEquationSolverPreconditioner::Diagonal) {
207 STORM_LOG_INFO(
"Solving linear equation system (" << x.size() <<
" rows) with GMRES with Diagonal preconditioner (Eigen library).");
209 Eigen::GMRES<Eigen::SparseMatrix<ValueType>, Eigen::DiagonalPreconditioner<ValueType>> solver;
210 solver.setTolerance(precision);
211 solver.setMaxIterations(maxIter);
212 solver.set_restart(restartThreshold);
213 solver.compute(*this->eigenA);
214 eigenX = solver.solveWithGuess(eigenB, eigenX);
215 converged = solver.info() == Eigen::ComputationInfo::Success;
216 numberOfIterations = solver.iterations();
218 STORM_LOG_INFO(
"Solving linear equation system (" << x.size() <<
" rows) with GMRES with identity preconditioner (Eigen library).");
220 Eigen::GMRES<Eigen::SparseMatrix<ValueType>, Eigen::IdentityPreconditioner> solver;
221 solver.setTolerance(precision);
222 solver.setMaxIterations(maxIter);
223 solver.set_restart(restartThreshold);
224 solver.compute(*this->eigenA);
225 eigenX = solver.solveWithGuess(eigenB, eigenX);
226 converged = solver.info() == Eigen::ComputationInfo::Success;
227 numberOfIterations = solver.iterations();
236 STORM_LOG_INFO(
"Iterative solver converged after " << numberOfIterations <<
" iterations.");