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