Eigen::IterativeSolverBase< Derived > Class Template Reference

Base class for linear iterative solvers. More...

#include <IterativeSolverBase.h>

+ Inheritance diagram for Eigen::IterativeSolverBase< Derived >:

Public Types

enum  { ColsAtCompileTime = MatrixType::ColsAtCompileTime , MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime }
 
typedef internal::traits< Derived >::MatrixType MatrixType
 
typedef internal::traits< Derived >::Preconditioner Preconditioner
 
typedef MatrixType::Scalar Scalar
 
typedef MatrixType::StorageIndex StorageIndex
 
typedef MatrixType::RealScalar RealScalar
 

Public Member Functions

 IterativeSolverBase ()
 
template<typename MatrixDerived >
 IterativeSolverBase (const EigenBase< MatrixDerived > &A)
 
 IterativeSolverBase (IterativeSolverBase &&)=default
 
 ~IterativeSolverBase ()
 
template<typename MatrixDerived >
Derived & analyzePattern (const EigenBase< MatrixDerived > &A)
 
template<typename MatrixDerived >
Derived & factorize (const EigenBase< MatrixDerived > &A)
 
template<typename MatrixDerived >
Derived & compute (const EigenBase< MatrixDerived > &A)
 
EIGEN_CONSTEXPR Index rows () const EIGEN_NOEXCEPT
 
EIGEN_CONSTEXPR Index cols () const EIGEN_NOEXCEPT
 
RealScalar tolerance () const
 
Derived & setTolerance (const RealScalar &tolerance)
 
Preconditionerpreconditioner ()
 
const Preconditionerpreconditioner () const
 
Index maxIterations () const
 
Derived & setMaxIterations (Index maxIters)
 
Index iterations () const
 
RealScalar error () const
 
template<typename Rhs , typename Guess >
const SolveWithGuess< Derived, Rhs, Guess > solveWithGuess (const MatrixBase< Rhs > &b, const Guess &x0) const
 
ComputationInfo info () const
 
template<typename Rhs , typename DestDerived >
void _solve_with_guess_impl (const Rhs &b, SparseMatrixBase< DestDerived > &aDest) const
 
template<typename Rhs , typename DestDerived >
std::enable_if_t< Rhs::ColsAtCompileTime !=1 &&DestDerived::ColsAtCompileTime !=1 > _solve_with_guess_impl (const Rhs &b, MatrixBase< DestDerived > &aDest) const
 
template<typename Rhs , typename DestDerived >
std::enable_if_t< Rhs::ColsAtCompileTime==1||DestDerived::ColsAtCompileTime==1 > _solve_with_guess_impl (const Rhs &b, MatrixBase< DestDerived > &dest) const
 
template<typename Rhs , typename Dest >
void _solve_impl (const Rhs &b, Dest &x) const
 
Derived & derived ()
 
const Derived & derived () const
 
- Public Member Functions inherited from Eigen::SparseSolverBase< Derived >
 SparseSolverBase ()
 
 SparseSolverBase (SparseSolverBase &&other)
 
 ~SparseSolverBase ()
 
Derived & derived ()
 
const Derived & derived () const
 
template<typename Rhs >
const Solve< Derived, Rhs > solve (const MatrixBase< Rhs > &b) const
 
template<typename Rhs >
const Solve< Derived, Rhs > solve (const SparseMatrixBase< Rhs > &b) const
 
template<typename Rhs , typename Dest >
void _solve_impl (const SparseMatrixBase< Rhs > &b, SparseMatrixBase< Dest > &dest) const
 

Protected Types

typedef SparseSolverBase< Derived > Base
 
typedef internal::generic_matrix_wrapper< MatrixTypeMatrixWrapper
 
typedef MatrixWrapper::ActualMatrixType ActualMatrixType
 

Protected Member Functions

void init ()
 
const ActualMatrixTypematrix () const
 
template<typename InputType >
void grab (const InputType &A)
 

Protected Attributes

MatrixWrapper m_matrixWrapper
 
Preconditioner m_preconditioner
 
Index m_maxIterations
 
RealScalar m_tolerance
 
RealScalar m_error
 
Index m_iterations
 
ComputationInfo m_info
 
bool m_analysisIsOk
 
bool m_factorizationIsOk
 
bool m_isInitialized
 
- Protected Attributes inherited from Eigen::SparseSolverBase< Derived >
bool m_isInitialized
 

Detailed Description

template<typename Derived>
class Eigen::IterativeSolverBase< Derived >

Base class for linear iterative solvers.

See also
class SimplicialCholesky, DiagonalPreconditioner, IdentityPreconditioner

Member Typedef Documentation

◆ ActualMatrixType

template<typename Derived >
typedef MatrixWrapper::ActualMatrixType Eigen::IterativeSolverBase< Derived >::ActualMatrixType
protected

◆ Base

template<typename Derived >
typedef SparseSolverBase<Derived> Eigen::IterativeSolverBase< Derived >::Base
protected

◆ MatrixType

template<typename Derived >
typedef internal::traits<Derived>::MatrixType Eigen::IterativeSolverBase< Derived >::MatrixType

◆ MatrixWrapper

template<typename Derived >
typedef internal::generic_matrix_wrapper<MatrixType> Eigen::IterativeSolverBase< Derived >::MatrixWrapper
protected

◆ Preconditioner

template<typename Derived >
typedef internal::traits<Derived>::Preconditioner Eigen::IterativeSolverBase< Derived >::Preconditioner

◆ RealScalar

template<typename Derived >
typedef MatrixType::RealScalar Eigen::IterativeSolverBase< Derived >::RealScalar

◆ Scalar

template<typename Derived >
typedef MatrixType::Scalar Eigen::IterativeSolverBase< Derived >::Scalar

◆ StorageIndex

template<typename Derived >
typedef MatrixType::StorageIndex Eigen::IterativeSolverBase< Derived >::StorageIndex

Member Enumeration Documentation

◆ anonymous enum

template<typename Derived >
anonymous enum
Enumerator
ColsAtCompileTime 
MaxColsAtCompileTime 
136 { ColsAtCompileTime = MatrixType::ColsAtCompileTime, MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime };
@ MaxColsAtCompileTime
Definition: IterativeSolverBase.h:136
@ ColsAtCompileTime
Definition: IterativeSolverBase.h:136

Constructor & Destructor Documentation

◆ IterativeSolverBase() [1/3]

template<typename Derived >
Eigen::IterativeSolverBase< Derived >::IterativeSolverBase ( )
inline

Default constructor.

142 { init(); }
void init()
Definition: IterativeSolverBase.h:363

References Eigen::IterativeSolverBase< Derived >::init().

◆ IterativeSolverBase() [2/3]

template<typename Derived >
template<typename MatrixDerived >
Eigen::IterativeSolverBase< Derived >::IterativeSolverBase ( const EigenBase< MatrixDerived > &  A)
inlineexplicit

Initialize the solver with matrix A for further Ax=b solving.

This constructor is a shortcut for the default constructor followed by a call to compute().

Warning
this class stores a reference to the matrix A as well as some precomputed values that depend on it. Therefore, if A is changed this class becomes invalid. Call compute() to update it with the new matrix A, or modify a copy of A.
155  : m_matrixWrapper(A.derived()) {
156  init();
157  compute(matrix());
158  }
Matrix< SCALARA, Dynamic, Dynamic, opt_A > A
Definition: bench_gemm.cpp:47
MatrixWrapper m_matrixWrapper
Definition: IterativeSolverBase.h:381
Derived & compute(const EigenBase< MatrixDerived > &A)
Definition: IterativeSolverBase.h:210
const ActualMatrixType & matrix() const
Definition: IterativeSolverBase.h:374

References Eigen::IterativeSolverBase< Derived >::compute(), Eigen::IterativeSolverBase< Derived >::init(), and Eigen::IterativeSolverBase< Derived >::matrix().

◆ IterativeSolverBase() [3/3]

template<typename Derived >
Eigen::IterativeSolverBase< Derived >::IterativeSolverBase ( IterativeSolverBase< Derived > &&  )
default

◆ ~IterativeSolverBase()

template<typename Derived >
Eigen::IterativeSolverBase< Derived >::~IterativeSolverBase ( )
inline
162 {}

Member Function Documentation

◆ _solve_impl()

template<typename Derived >
template<typename Rhs , typename Dest >
void Eigen::IterativeSolverBase< Derived >::_solve_impl ( const Rhs &  b,
Dest &  x 
) const
inline

default initial guess = 0

357  {
358  x.setZero();
359  derived()._solve_with_guess_impl(b, x);
360  }
Scalar * b
Definition: benchVecAdd.cpp:17
Derived & derived()
Definition: SparseSolverBase.h:76
list x
Definition: plotDoE.py:28

References b, Eigen::IterativeSolverBase< Derived >::derived(), and plotDoE::x.

◆ _solve_with_guess_impl() [1/3]

template<typename Derived >
template<typename Rhs , typename DestDerived >
std::enable_if_t<Rhs::ColsAtCompileTime != 1 && DestDerived::ColsAtCompileTime != 1> Eigen::IterativeSolverBase< Derived >::_solve_with_guess_impl ( const Rhs &  b,
MatrixBase< DestDerived > &  aDest 
) const
inline
328  {
329  eigen_assert(rows() == b.rows());
330 
331  Index rhsCols = b.cols();
332  DestDerived& dest(aDest.derived());
333  ComputationInfo global_info = Success;
334  for (Index k = 0; k < rhsCols; ++k) {
335  typename DestDerived::ColXpr xk(dest, k);
336  typename Rhs::ConstColXpr bk(b, k);
337  derived()._solve_vector_with_guess_impl(bk, xk);
338 
339  // The call to _solve_vector_with_guess updates m_info, so if it failed for a previous column
340  // we need to restore it to the worst value.
341  if (m_info == NumericalIssue)
342  global_info = NumericalIssue;
343  else if (m_info == NoConvergence)
344  global_info = NoConvergence;
345  }
346  m_info = global_info;
347  }
#define eigen_assert(x)
Definition: Macros.h:910
ComputationInfo m_info
Definition: IterativeSolverBase.h:389
EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT
Definition: IterativeSolverBase.h:221
ComputationInfo
Definition: Constants.h:438
@ NumericalIssue
Definition: Constants.h:442
@ Success
Definition: Constants.h:440
@ NoConvergence
Definition: Constants.h:444
char char char int int * k
Definition: level2_impl.h:374
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:83

References b, Eigen::IterativeSolverBase< Derived >::derived(), eigen_assert, k, Eigen::IterativeSolverBase< Derived >::m_info, Eigen::NoConvergence, Eigen::NumericalIssue, Eigen::IterativeSolverBase< Derived >::rows(), and Eigen::Success.

◆ _solve_with_guess_impl() [2/3]

template<typename Derived >
template<typename Rhs , typename DestDerived >
std::enable_if_t<Rhs::ColsAtCompileTime == 1 || DestDerived::ColsAtCompileTime == 1> Eigen::IterativeSolverBase< Derived >::_solve_with_guess_impl ( const Rhs &  b,
MatrixBase< DestDerived > &  dest 
) const
inline
351  {
352  derived()._solve_vector_with_guess_impl(b, dest.derived());
353  }

References b, and Eigen::IterativeSolverBase< Derived >::derived().

◆ _solve_with_guess_impl() [3/3]

template<typename Derived >
template<typename Rhs , typename DestDerived >
void Eigen::IterativeSolverBase< Derived >::_solve_with_guess_impl ( const Rhs &  b,
SparseMatrixBase< DestDerived > &  aDest 
) const
inline
295  {
296  eigen_assert(rows() == b.rows());
297 
298  Index rhsCols = b.cols();
299  Index size = b.rows();
300  DestDerived& dest(aDest.derived());
301  typedef typename DestDerived::Scalar DestScalar;
304  // We do not directly fill dest because sparse expressions have to be free of aliasing issue.
305  // For non square least-square problems, b and dest might not have the same size whereas they might alias
306  // each-other.
307  typename DestDerived::PlainObject tmp(cols(), rhsCols);
308  ComputationInfo global_info = Success;
309  for (Index k = 0; k < rhsCols; ++k) {
310  tb = b.col(k);
311  tx = dest.col(k);
312  derived()._solve_vector_with_guess_impl(tb, tx);
313  tmp.col(k) = tx.sparseView(0);
314 
315  // The call to _solve_vector_with_guess_impl updates m_info, so if it failed for a previous column
316  // we need to restore it to the worst value.
317  if (m_info == NumericalIssue)
318  global_info = NumericalIssue;
319  else if (m_info == NoConvergence)
320  global_info = NoConvergence;
321  }
322  m_info = global_info;
323  dest.swap(tmp);
324  }
Scalar Scalar int size
Definition: benchVecAdd.cpp:17
SCALAR Scalar
Definition: bench_gemm.cpp:45
EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT
Definition: IterativeSolverBase.h:224
The matrix class, also used for vectors and row-vectors.
Definition: Eigen/Eigen/src/Core/Matrix.h:186
Eigen::Matrix< Scalar, Dynamic, Dynamic, ColMajor > tmp
Definition: level3_impl.h:365

References b, Eigen::IterativeSolverBase< Derived >::cols(), Eigen::IterativeSolverBase< Derived >::derived(), Eigen::SparseMatrixBase< Derived >::derived(), eigen_assert, k, Eigen::IterativeSolverBase< Derived >::m_info, Eigen::NoConvergence, Eigen::NumericalIssue, Eigen::IterativeSolverBase< Derived >::rows(), size, Eigen::Success, and tmp.

◆ analyzePattern()

template<typename Derived >
template<typename MatrixDerived >
Derived& Eigen::IterativeSolverBase< Derived >::analyzePattern ( const EigenBase< MatrixDerived > &  A)
inline

Initializes the iterative solver for the sparsity pattern of the matrix A for further solving Ax=b problems.

Currently, this function mostly calls analyzePattern on the preconditioner. In the future we might, for instance, implement column reordering for faster matrix vector products.

170  {
171  grab(A.derived());
172  m_preconditioner.analyzePattern(matrix());
173  m_isInitialized = true;
174  m_analysisIsOk = true;
175  m_info = m_preconditioner.info();
176  return derived();
177  }
bool m_analysisIsOk
Definition: IterativeSolverBase.h:390
void grab(const InputType &A)
Definition: IterativeSolverBase.h:377
Preconditioner m_preconditioner
Definition: IterativeSolverBase.h:382
bool m_isInitialized
Definition: SparseSolverBase.h:110

References Eigen::IterativeSolverBase< Derived >::derived(), Eigen::IterativeSolverBase< Derived >::grab(), Eigen::IterativeSolverBase< Derived >::m_analysisIsOk, Eigen::IterativeSolverBase< Derived >::m_info, Eigen::IterativeSolverBase< Derived >::m_isInitialized, Eigen::IterativeSolverBase< Derived >::m_preconditioner, and Eigen::IterativeSolverBase< Derived >::matrix().

◆ cols()

◆ compute()

template<typename Derived >
template<typename MatrixDerived >
Derived& Eigen::IterativeSolverBase< Derived >::compute ( const EigenBase< MatrixDerived > &  A)
inline

Initializes the iterative solver with the matrix A for further solving Ax=b problems.

Currently, this function mostly initializes/computes the preconditioner. In the future we might, for instance, implement column reordering for faster matrix vector products.

Warning
this class stores a reference to the matrix A as well as some precomputed values that depend on it. Therefore, if A is changed this class becomes invalid. Call compute() to update it with the new matrix A, or modify a copy of A.
210  {
211  grab(A.derived());
212  m_preconditioner.compute(matrix());
213  m_isInitialized = true;
214  m_analysisIsOk = true;
215  m_factorizationIsOk = true;
216  m_info = m_preconditioner.info();
217  return derived();
218  }
bool m_factorizationIsOk
Definition: IterativeSolverBase.h:390

References Eigen::IterativeSolverBase< Derived >::derived(), Eigen::IterativeSolverBase< Derived >::grab(), Eigen::IterativeSolverBase< Derived >::m_analysisIsOk, Eigen::IterativeSolverBase< Derived >::m_factorizationIsOk, Eigen::IterativeSolverBase< Derived >::m_info, Eigen::IterativeSolverBase< Derived >::m_isInitialized, Eigen::IterativeSolverBase< Derived >::m_preconditioner, and Eigen::IterativeSolverBase< Derived >::matrix().

Referenced by Eigen::IterativeSolverBase< Derived >::IterativeSolverBase(), and main().

◆ derived() [1/2]

◆ derived() [2/2]

template<typename Derived >
const Derived& Eigen::SparseSolverBase< Derived >::derived
inline
77 { return *static_cast<const Derived*>(this); }

◆ error()

template<typename Derived >
RealScalar Eigen::IterativeSolverBase< Derived >::error ( ) const
inline
Returns
the tolerance error reached during the last solve. It is a close approximation of the true relative residual error |Ax-b|/|b|.
270  {
271  eigen_assert(m_isInitialized && "IterativeSolverBase is not initialized.");
272  return m_error;
273  }
RealScalar m_error
Definition: IterativeSolverBase.h:387

References eigen_assert, Eigen::IterativeSolverBase< Derived >::m_error, and Eigen::IterativeSolverBase< Derived >::m_isInitialized.

Referenced by main().

◆ factorize()

template<typename Derived >
template<typename MatrixDerived >
Derived& Eigen::IterativeSolverBase< Derived >::factorize ( const EigenBase< MatrixDerived > &  A)
inline

Initializes the iterative solver with the numerical values of the matrix A for further solving Ax=b problems.

Currently, this function mostly calls factorize on the preconditioner.

Warning
this class stores a reference to the matrix A as well as some precomputed values that depend on it. Therefore, if A is changed this class becomes invalid. Call compute() to update it with the new matrix A, or modify a copy of A.
190  {
191  eigen_assert(m_analysisIsOk && "You must first call analyzePattern()");
192  grab(A.derived());
193  m_preconditioner.factorize(matrix());
194  m_factorizationIsOk = true;
195  m_info = m_preconditioner.info();
196  return derived();
197  }

References Eigen::IterativeSolverBase< Derived >::derived(), eigen_assert, Eigen::IterativeSolverBase< Derived >::grab(), Eigen::IterativeSolverBase< Derived >::m_analysisIsOk, Eigen::IterativeSolverBase< Derived >::m_factorizationIsOk, Eigen::IterativeSolverBase< Derived >::m_info, Eigen::IterativeSolverBase< Derived >::m_preconditioner, and Eigen::IterativeSolverBase< Derived >::matrix().

◆ grab()

template<typename Derived >
template<typename InputType >
void Eigen::IterativeSolverBase< Derived >::grab ( const InputType &  A)
inlineprotected

◆ info()

template<typename Derived >
ComputationInfo Eigen::IterativeSolverBase< Derived >::info ( ) const
inline
Returns
Success if the iterations converged, and NoConvergence otherwise.
288  {
289  eigen_assert(m_isInitialized && "IterativeSolverBase is not initialized.");
290  return m_info;
291  }

References eigen_assert, Eigen::IterativeSolverBase< Derived >::m_info, and Eigen::IterativeSolverBase< Derived >::m_isInitialized.

◆ init()

◆ iterations()

template<typename Derived >
Index Eigen::IterativeSolverBase< Derived >::iterations ( ) const
inline
Returns
the number of iterations performed during the last solve
262  {
263  eigen_assert(m_isInitialized && "IterativeSolverBase is not initialized.");
264  return m_iterations;
265  }
Index m_iterations
Definition: IterativeSolverBase.h:388

References eigen_assert, Eigen::IterativeSolverBase< Derived >::m_isInitialized, and Eigen::IterativeSolverBase< Derived >::m_iterations.

Referenced by main().

◆ matrix()

◆ maxIterations()

◆ preconditioner() [1/2]

template<typename Derived >
Preconditioner& Eigen::IterativeSolverBase< Derived >::preconditioner ( )
inline
Returns
a read-write reference to the preconditioner for custom configuration.
242 { return m_preconditioner; }

References Eigen::IterativeSolverBase< Derived >::m_preconditioner.

◆ preconditioner() [2/2]

template<typename Derived >
const Preconditioner& Eigen::IterativeSolverBase< Derived >::preconditioner ( ) const
inline
Returns
a read-only reference to the preconditioner.
245 { return m_preconditioner; }

References Eigen::IterativeSolverBase< Derived >::m_preconditioner.

◆ rows()

◆ setMaxIterations()

template<typename Derived >
Derived& Eigen::IterativeSolverBase< Derived >::setMaxIterations ( Index  maxIters)
inline

Sets the max number of iterations. Default is twice the number of columns of the matrix.

256  {
257  m_maxIterations = maxIters;
258  return derived();
259  }

References Eigen::IterativeSolverBase< Derived >::derived(), and Eigen::IterativeSolverBase< Derived >::m_maxIterations.

◆ setTolerance()

template<typename Derived >
Derived& Eigen::IterativeSolverBase< Derived >::setTolerance ( const RealScalar tolerance)
inline

Sets the tolerance threshold used by the stopping criteria.

This value is used as an upper bound to the relative residual error: |Ax-b|/|b|. The default value is the machine precision given by NumTraits<Scalar>::epsilon()

236  {
238  return derived();
239  }
RealScalar tolerance() const
Definition: IterativeSolverBase.h:229

References Eigen::IterativeSolverBase< Derived >::derived(), Eigen::IterativeSolverBase< Derived >::m_tolerance, and Eigen::IterativeSolverBase< Derived >::tolerance().

Referenced by test_bicgstab_T(), test_bicgstabl_T(), and test_idrstabl_T().

◆ solveWithGuess()

template<typename Derived >
template<typename Rhs , typename Guess >
const SolveWithGuess<Derived, Rhs, Guess> Eigen::IterativeSolverBase< Derived >::solveWithGuess ( const MatrixBase< Rhs > &  b,
const Guess &  x0 
) const
inline
Returns
the solution x of \( A x = b \) using the current decomposition of A and x0 as an initial solution.
See also
solve(), compute()
281  {
282  eigen_assert(m_isInitialized && "Solver is not initialized.");
283  eigen_assert(derived().rows() == b.rows() && "solve(): invalid number of rows of the right hand side matrix b");
284  return SolveWithGuess<Derived, Rhs, Guess>(derived(), b.derived(), x0);
285  }
Vector< double > x0(2, 0.0)

References b, Eigen::IterativeSolverBase< Derived >::derived(), eigen_assert, Eigen::IterativeSolverBase< Derived >::m_isInitialized, Eigen::IterativeSolverBase< Derived >::rows(), and Global::x0.

◆ tolerance()

template<typename Derived >
RealScalar Eigen::IterativeSolverBase< Derived >::tolerance ( ) const
inline
Returns
the tolerance threshold used by the stopping criteria.
See also
setTolerance()
229 { return m_tolerance; }

References Eigen::IterativeSolverBase< Derived >::m_tolerance.

Referenced by Eigen::IterativeSolverBase< Derived >::setTolerance().

Member Data Documentation

◆ m_analysisIsOk

◆ m_error

template<typename Derived >
RealScalar Eigen::IterativeSolverBase< Derived >::m_error
mutableprotected

◆ m_factorizationIsOk

◆ m_info

◆ m_isInitialized

◆ m_iterations

template<typename Derived >
Index Eigen::IterativeSolverBase< Derived >::m_iterations
mutableprotected

◆ m_matrixWrapper

template<typename Derived >
MatrixWrapper Eigen::IterativeSolverBase< Derived >::m_matrixWrapper
protected

◆ m_maxIterations

◆ m_preconditioner

◆ m_tolerance


The documentation for this class was generated from the following file: