10 #ifndef EIGEN_ITERATIVE_SOLVER_BASE_H
11 #define EIGEN_ITERATIVE_SOLVER_BASE_H
20 template<
typename Derived>
25 using Base::m_isInitialized;
28 typedef typename internal::traits<Derived>::MatrixType MatrixType;
29 typedef typename internal::traits<Derived>::Preconditioner Preconditioner;
30 typedef typename MatrixType::Scalar Scalar;
31 typedef typename MatrixType::StorageIndex StorageIndex;
32 typedef typename MatrixType::RealScalar RealScalar;
40 : m_dummy(0,0), mp_matrix(m_dummy)
55 template<
typename MatrixDerived>
57 : mp_matrix(A.derived())
70 template<
typename MatrixDerived>
74 m_preconditioner.analyzePattern(mp_matrix);
75 m_isInitialized =
true;
76 m_analysisIsOk =
true;
77 m_info = m_preconditioner.info();
90 template<
typename MatrixDerived>
93 eigen_assert(m_analysisIsOk &&
"You must first call analyzePattern()");
95 m_preconditioner.factorize(mp_matrix);
96 m_factorizationIsOk =
true;
97 m_info = m_preconditioner.info();
111 template<
typename MatrixDerived>
115 m_preconditioner.compute(mp_matrix);
116 m_isInitialized =
true;
117 m_analysisIsOk =
true;
118 m_factorizationIsOk =
true;
119 m_info = m_preconditioner.info();
124 Index rows()
const {
return mp_matrix.rows(); }
127 Index cols()
const {
return mp_matrix.cols(); }
157 return (m_maxIterations<0) ? 2*mp_matrix.cols() : m_maxIterations;
165 m_maxIterations = maxIters;
172 eigen_assert(m_isInitialized &&
"ConjugateGradient is not initialized.");
181 eigen_assert(m_isInitialized &&
"ConjugateGradient is not initialized.");
190 template<
typename Rhs,
typename Guess>
194 eigen_assert(m_isInitialized &&
"Solver is not initialized.");
195 eigen_assert(derived().rows()==b.rows() &&
"solve(): invalid number of rows of the right hand side matrix b");
202 eigen_assert(m_isInitialized &&
"IterativeSolverBase is not initialized.");
207 template<
typename Rhs,
typename DestScalar,
int DestOptions,
typename DestIndex>
210 eigen_assert(rows()==b.rows());
212 Index rhsCols = b.cols();
213 Index size = b.rows();
219 for(Index k=0; k<rhsCols; ++k)
222 tx = derived().solve(tb);
223 tmp.col(k) = tx.sparseView(0);
231 m_isInitialized =
false;
232 m_analysisIsOk =
false;
233 m_factorizationIsOk =
false;
234 m_maxIterations = -1;
235 m_tolerance = NumTraits<Scalar>::epsilon();
238 template<
typename MatrixDerived>
239 void grab(
const EigenBase<MatrixDerived> &A)
241 mp_matrix.~Ref<
const MatrixType>();
242 ::new (&mp_matrix) Ref<const MatrixType>(A.derived());
245 void grab(const Ref<const MatrixType> &A)
247 if(&(A.derived()) != &mp_matrix)
249 mp_matrix.~Ref<
const MatrixType>();
250 ::new (&mp_matrix) Ref<const MatrixType>(A);
255 Ref<const MatrixType> mp_matrix;
256 Preconditioner m_preconditioner;
258 Index m_maxIterations;
259 RealScalar m_tolerance;
261 mutable RealScalar m_error;
262 mutable Index m_iterations;
264 mutable
bool m_analysisIsOk, m_factorizationIsOk;
269 #endif // EIGEN_ITERATIVE_SOLVER_BASE_H
Pseudo expression representing a solving operation.
Definition: SolveWithGuess.h:15
Derived & setTolerance(const RealScalar &tolerance)
Definition: IterativeSolverBase.h:139
A versatible sparse matrix representation.
Definition: SparseMatrix.h:92
IterativeSolverBase(const EigenBase< MatrixDerived > &A)
Definition: IterativeSolverBase.h:56
A base class for sparse solvers.
Definition: SparseSolverBase.h:53
Derived & derived()
Definition: EigenBase.h:44
Derived & factorize(const EigenBase< MatrixDerived > &A)
Definition: IterativeSolverBase.h:91
Index maxIterations() const
Definition: IterativeSolverBase.h:155
Definition: EigenBase.h:28
Derived & analyzePattern(const EigenBase< MatrixDerived > &A)
Definition: IterativeSolverBase.h:71
Derived & compute(const EigenBase< MatrixDerived > &A)
Definition: IterativeSolverBase.h:112
const SolveWithGuess< Derived, Rhs, Guess > solveWithGuess(const MatrixBase< Rhs > &b, const Guess &x0) const
Definition: IterativeSolverBase.h:192
ComputationInfo info() const
Definition: IterativeSolverBase.h:200
RealScalar tolerance() const
Definition: IterativeSolverBase.h:132
Derived & setMaxIterations(Index maxIters)
Definition: IterativeSolverBase.h:163
Preconditioner & preconditioner()
Definition: IterativeSolverBase.h:146
RealScalar error() const
Definition: IterativeSolverBase.h:179
The matrix class, also used for vectors and row-vectors.
Definition: Matrix.h:178
IterativeSolverBase()
Definition: IterativeSolverBase.h:39
ComputationInfo
Definition: Constants.h:422
Base class for linear iterative solvers.
Definition: IterativeSolverBase.h:21
Base class for all dense matrices, vectors, and expressions.
Definition: MatrixBase.h:48
const Preconditioner & preconditioner() const
Definition: IterativeSolverBase.h:149
Index iterations() const
Definition: IterativeSolverBase.h:170