10 #ifndef EIGEN_ITERATIVE_SOLVER_BASE_H 11 #define EIGEN_ITERATIVE_SOLVER_BASE_H 17 template<
typename MatrixType>
21 template <
typename T0>
24 template <
typename T> any_conversion(
const volatile T&);
25 template <
typename T> any_conversion(
T&);
27 struct yes {
int a[1];};
28 struct no {
int a[2];};
33 static no test(any_conversion<T>, ...);
36 static MatrixType ms_from;
37 enum { value =
sizeof(test<MatrixType>(ms_from, 0))==
sizeof(yes) };
40 template<
typename MatrixType>
46 template<typename MatrixType, bool MatrixFree = !internal::is_ref_compatible<MatrixType>::value>
50 template<
typename MatrixType>
55 template<
int UpLo>
struct ConstSelfAdjointViewReturnType {
56 typedef typename ActualMatrixType::template ConstSelfAdjointViewReturnType<UpLo>::Type Type;
64 : m_dummy(0,0), m_matrix(m_dummy)
67 template<
typename InputType>
72 const ActualMatrixType& matrix()
const 77 template<
typename MatrixDerived>
80 m_matrix.~Ref<
const MatrixType>();
86 if(&(mat.derived()) != &m_matrix)
88 m_matrix.~Ref<
const MatrixType>();
95 ActualMatrixType m_matrix;
99 template<
typename MatrixType>
103 typedef MatrixType ActualMatrixType;
104 template<
int UpLo>
struct ConstSelfAdjointViewReturnType
106 typedef ActualMatrixType Type;
121 const ActualMatrixType& matrix()
const 126 void grab(
const MatrixType &mat)
132 const ActualMatrixType *mp_matrix;
142 template<
typename Derived>
147 using Base::m_isInitialized;
152 typedef typename MatrixType::Scalar Scalar;
153 typedef typename MatrixType::StorageIndex StorageIndex;
154 typedef typename MatrixType::RealScalar RealScalar;
157 ColsAtCompileTime = MatrixType::ColsAtCompileTime,
158 MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
181 template<
typename MatrixDerived>
183 : m_matrixWrapper(A.derived())
196 template<
typename MatrixDerived>
200 m_preconditioner.analyzePattern(matrix());
201 m_isInitialized =
true;
202 m_analysisIsOk =
true;
203 m_info = m_preconditioner.info();
216 template<
typename MatrixDerived>
219 eigen_assert(m_analysisIsOk &&
"You must first call analyzePattern()");
221 m_preconditioner.factorize(matrix());
222 m_factorizationIsOk =
true;
223 m_info = m_preconditioner.info();
237 template<
typename MatrixDerived>
241 m_preconditioner.compute(matrix());
242 m_isInitialized =
true;
243 m_analysisIsOk =
true;
244 m_factorizationIsOk =
true;
245 m_info = m_preconditioner.info();
250 Index rows()
const {
return matrix().rows(); }
253 Index cols()
const {
return matrix().cols(); }
267 m_tolerance = tolerance;
283 return (m_maxIterations<0) ? 2*matrix().cols() : m_maxIterations;
291 m_maxIterations = maxIters;
298 eigen_assert(m_isInitialized &&
"ConjugateGradient is not initialized.");
307 eigen_assert(m_isInitialized &&
"ConjugateGradient is not initialized.");
316 template<
typename Rhs,
typename Guess>
320 eigen_assert(m_isInitialized &&
"Solver is not initialized.");
321 eigen_assert(derived().rows()==b.rows() &&
"solve(): invalid number of rows of the right hand side matrix b");
328 eigen_assert(m_isInitialized &&
"IterativeSolverBase is not initialized.");
333 template<
typename Rhs,
typename DestDerived>
336 eigen_assert(rows()==b.rows());
338 Index rhsCols = b.cols();
339 Index size = b.rows();
340 DestDerived& dest(aDest.derived());
341 typedef typename DestDerived::Scalar DestScalar;
346 typename DestDerived::PlainObject tmp(cols(),rhsCols);
347 for(
Index k=0; k<rhsCols; ++k)
350 tx = derived().solve(tb);
351 tmp.col(k) = tx.sparseView(0);
359 m_isInitialized =
false;
360 m_analysisIsOk =
false;
361 m_factorizationIsOk =
false;
362 m_maxIterations = -1;
367 typedef typename MatrixWrapper::ActualMatrixType ActualMatrixType;
369 const ActualMatrixType& matrix()
const 371 return m_matrixWrapper.matrix();
374 template<
typename InputType>
375 void grab(
const InputType &
A)
377 m_matrixWrapper.grab(A);
380 MatrixWrapper m_matrixWrapper;
381 Preconditioner m_preconditioner;
383 Index m_maxIterations;
384 RealScalar m_tolerance;
386 mutable RealScalar m_error;
387 mutable Index m_iterations;
389 mutable bool m_analysisIsOk, m_factorizationIsOk;
394 #endif // EIGEN_ITERATIVE_SOLVER_BASE_H Definition: IterativeSolverBase.h:18
Pseudo expression representing a solving operation.
Definition: SolveWithGuess.h:15
Derived & setTolerance(const RealScalar &tolerance)
Sets the tolerance threshold used by the stopping criteria.
Definition: IterativeSolverBase.h:265
ComputationInfo info() const
Definition: IterativeSolverBase.h:326
IterativeSolverBase(const EigenBase< MatrixDerived > &A)
Initialize the solver with matrix A for further Ax=b solving.
Definition: IterativeSolverBase.h:182
Definition: IterativeSolverBase.h:41
A base class for sparse solvers.
Definition: SparseSolverBase.h:67
Namespace containing all symbols from the Eigen library.
Definition: bench_norm.cpp:85
Holds information about the various numeric (i.e.
Definition: NumTraits.h:150
const Preconditioner & preconditioner() const
Definition: IterativeSolverBase.h:275
Index iterations() const
Definition: IterativeSolverBase.h:296
Derived & factorize(const EigenBase< MatrixDerived > &A)
Initializes the iterative solver with the numerical values of the matrix A for further solving Ax=b p...
Definition: IterativeSolverBase.h:217
RealScalar tolerance() const
Definition: IterativeSolverBase.h:258
Common base class for all classes T such that MatrixBase has an operator=(T) and a constructor Matrix...
Definition: EigenBase.h:28
RealScalar error() const
Definition: IterativeSolverBase.h:305
Base class of any sparse matrices or sparse expressions.
Definition: ForwardDeclarations.h:281
Derived & analyzePattern(const EigenBase< MatrixDerived > &A)
Initializes the iterative solver for the sparsity pattern of the matrix A for further solving Ax=b pr...
Definition: IterativeSolverBase.h:197
Derived & compute(const EigenBase< MatrixDerived > &A)
Initializes the iterative solver with the matrix A for further solving Ax=b problems.
Definition: IterativeSolverBase.h:238
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:33
const SolveWithGuess< Derived, Rhs, Guess > solveWithGuess(const MatrixBase< Rhs > &b, const Guess &x0) const
Definition: IterativeSolverBase.h:318
Derived & setMaxIterations(Index maxIters)
Sets the max number of iterations.
Definition: IterativeSolverBase.h:289
A matrix or vector expression mapping an existing expression.
Definition: Ref.h:190
Definition: BandTriangularSolver.h:13
Definition: TutorialInplaceLU.cpp:2
Preconditioner & preconditioner()
Definition: IterativeSolverBase.h:272
The matrix class, also used for vectors and row-vectors.
Definition: Matrix.h:178
IterativeSolverBase()
Default constructor.
Definition: IterativeSolverBase.h:166
ComputationInfo
Enum for reporting the status of a computation.
Definition: Constants.h:430
Base class for linear iterative solvers.
Definition: IterativeSolverBase.h:143
EIGEN_DEVICE_FUNC Derived & derived()
Definition: EigenBase.h:44
Base class for all dense matrices, vectors, and expressions.
Definition: MatrixBase.h:48
Definition: ForwardDeclarations.h:17
Definition: IterativeSolverBase.h:47
Index maxIterations() const
Definition: IterativeSolverBase.h:281