BasicPreconditioners.h
Go to the documentation of this file.
1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra.
3 //
4 // Copyright (C) 2011-2014 Gael Guennebaud <gael.guennebaud@inria.fr>
5 //
6 // This Source Code Form is subject to the terms of the Mozilla
7 // Public License v. 2.0. If a copy of the MPL was not distributed
8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 
10 #ifndef EIGEN_BASIC_PRECONDITIONERS_H
11 #define EIGEN_BASIC_PRECONDITIONERS_H
12 
13 // IWYU pragma: private
14 #include "./InternalHeaderCheck.h"
15 
16 namespace Eigen {
17 
38 template <typename Scalar_>
40  typedef Scalar_ Scalar;
42 
43  public:
44  typedef typename Vector::StorageIndex StorageIndex;
46 
48 
49  template <typename MatType>
50  explicit DiagonalPreconditioner(const MatType& mat) : m_invdiag(mat.cols()) {
51  compute(mat);
52  }
53 
54  EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT { return m_invdiag.size(); }
55  EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT { return m_invdiag.size(); }
56 
57  template <typename MatType>
59  return *this;
60  }
61 
62  template <typename MatType>
65  for (int j = 0; j < mat.outerSize(); ++j) {
66  typename MatType::InnerIterator it(mat, j);
67  while (it && it.index() != j) ++it;
68  if (it && it.index() == j && it.value() != Scalar(0))
69  m_invdiag(j) = Scalar(1) / it.value();
70  else
71  m_invdiag(j) = Scalar(1);
72  }
73  m_isInitialized = true;
74  return *this;
75  }
76 
77  template <typename MatType>
78  DiagonalPreconditioner& compute(const MatType& mat) {
79  return factorize(mat);
80  }
81 
83  template <typename Rhs, typename Dest>
84  void _solve_impl(const Rhs& b, Dest& x) const {
85  x = m_invdiag.array() * b.array();
86  }
87 
88  template <typename Rhs>
90  eigen_assert(m_isInitialized && "DiagonalPreconditioner is not initialized.");
91  eigen_assert(m_invdiag.size() == b.rows() &&
92  "DiagonalPreconditioner::solve(): invalid number of rows of the right hand side matrix b");
93  return Solve<DiagonalPreconditioner, Rhs>(*this, b.derived());
94  }
95 
97 
98  protected:
101 };
102 
120 template <typename Scalar_>
122  typedef Scalar_ Scalar;
125  using Base::m_invdiag;
126 
127  public:
129 
130  template <typename MatType>
131  explicit LeastSquareDiagonalPreconditioner(const MatType& mat) : Base() {
132  compute(mat);
133  }
134 
135  template <typename MatType>
137  return *this;
138  }
139 
140  template <typename MatType>
142  // Compute the inverse squared-norm of each column of mat
144  if (MatType::IsRowMajor) {
145  m_invdiag.setZero();
146  for (Index j = 0; j < mat.outerSize(); ++j) {
147  for (typename MatType::InnerIterator it(mat, j); it; ++it) m_invdiag(it.index()) += numext::abs2(it.value());
148  }
149  for (Index j = 0; j < mat.cols(); ++j)
151  } else {
152  for (Index j = 0; j < mat.outerSize(); ++j) {
153  RealScalar sum = mat.col(j).squaredNorm();
154  if (sum > RealScalar(0))
155  m_invdiag(j) = RealScalar(1) / sum;
156  else
157  m_invdiag(j) = RealScalar(1);
158  }
159  }
160  Base::m_isInitialized = true;
161  return *this;
162  }
163 
164  template <typename MatType>
166  return factorize(mat);
167  }
168 
170 
171  protected:
172 };
173 
182  public:
184 
185  template <typename MatrixType>
186  explicit IdentityPreconditioner(const MatrixType&) {}
187 
188  template <typename MatrixType>
190  return *this;
191  }
192 
193  template <typename MatrixType>
195  return *this;
196  }
197 
198  template <typename MatrixType>
200  return *this;
201  }
202 
203  template <typename Rhs>
204  inline const Rhs& solve(const Rhs& b) const {
205  return b;
206  }
207 
209 };
210 
211 } // end namespace Eigen
212 
213 #endif // EIGEN_BASIC_PRECONDITIONERS_H
#define EIGEN_NOEXCEPT
Definition: Macros.h:1267
#define EIGEN_CONSTEXPR
Definition: Macros.h:758
#define eigen_assert(x)
Definition: Macros.h:910
Scalar * b
Definition: benchVecAdd.cpp:17
MatrixXf MatrixType
Definition: benchmark-blocking-sizes.cpp:52
A preconditioner based on the digonal entries.
Definition: BasicPreconditioners.h:39
DiagonalPreconditioner & factorize(const MatType &mat)
Definition: BasicPreconditioners.h:63
EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT
Definition: BasicPreconditioners.h:55
Scalar_ Scalar
Definition: BasicPreconditioners.h:40
DiagonalPreconditioner & analyzePattern(const MatType &)
Definition: BasicPreconditioners.h:58
void _solve_impl(const Rhs &b, Dest &x) const
Definition: BasicPreconditioners.h:84
ComputationInfo info()
Definition: BasicPreconditioners.h:96
DiagonalPreconditioner(const MatType &mat)
Definition: BasicPreconditioners.h:50
Vector m_invdiag
Definition: BasicPreconditioners.h:99
@ MaxColsAtCompileTime
Definition: BasicPreconditioners.h:45
@ ColsAtCompileTime
Definition: BasicPreconditioners.h:45
EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT
Definition: BasicPreconditioners.h:54
DiagonalPreconditioner()
Definition: BasicPreconditioners.h:47
DiagonalPreconditioner & compute(const MatType &mat)
Definition: BasicPreconditioners.h:78
Matrix< Scalar, Dynamic, 1 > Vector
Definition: BasicPreconditioners.h:41
bool m_isInitialized
Definition: BasicPreconditioners.h:100
const Solve< DiagonalPreconditioner, Rhs > solve(const MatrixBase< Rhs > &b) const
Definition: BasicPreconditioners.h:89
Vector::StorageIndex StorageIndex
Definition: BasicPreconditioners.h:44
A naive preconditioner which approximates any matrix as the identity matrix.
Definition: BasicPreconditioners.h:181
IdentityPreconditioner & factorize(const MatrixType &)
Definition: BasicPreconditioners.h:194
ComputationInfo info()
Definition: BasicPreconditioners.h:208
IdentityPreconditioner(const MatrixType &)
Definition: BasicPreconditioners.h:186
IdentityPreconditioner & analyzePattern(const MatrixType &)
Definition: BasicPreconditioners.h:189
const Rhs & solve(const Rhs &b) const
Definition: BasicPreconditioners.h:204
IdentityPreconditioner()
Definition: BasicPreconditioners.h:183
IdentityPreconditioner & compute(const MatrixType &)
Definition: BasicPreconditioners.h:199
Jacobi preconditioner for LeastSquaresConjugateGradient.
Definition: BasicPreconditioners.h:121
LeastSquareDiagonalPreconditioner & compute(const MatType &mat)
Definition: BasicPreconditioners.h:165
LeastSquareDiagonalPreconditioner & analyzePattern(const MatType &)
Definition: BasicPreconditioners.h:136
Vector m_invdiag
Definition: BasicPreconditioners.h:99
DiagonalPreconditioner< Scalar_ > Base
Definition: BasicPreconditioners.h:124
LeastSquareDiagonalPreconditioner()
Definition: BasicPreconditioners.h:128
LeastSquareDiagonalPreconditioner & factorize(const MatType &mat)
Definition: BasicPreconditioners.h:141
LeastSquareDiagonalPreconditioner(const MatType &mat)
Definition: BasicPreconditioners.h:131
NumTraits< Scalar >::Real RealScalar
Definition: BasicPreconditioners.h:123
Scalar_ Scalar
Definition: BasicPreconditioners.h:122
ComputationInfo info()
Definition: BasicPreconditioners.h:169
Base class for all dense matrices, vectors, and expressions.
Definition: MatrixBase.h:52
EIGEN_DEVICE_FUNC Derived & setZero(Index size)
Definition: CwiseNullaryOp.h:569
EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE void resize(Index rows, Index cols)
Definition: PlainObjectBase.h:294
Pseudo expression representing a solving operation.
Definition: Solve.h:62
RealScalar squaredNorm() const
Definition: SparseDot.h:82
Index cols() const
Definition: SparseMatrix.h:161
Index outerSize() const
Definition: SparseMatrix.h:166
float real
Definition: datatypes.h:10
ComputationInfo
Definition: Constants.h:438
@ Success
Definition: Constants.h:440
@ Rhs
Definition: TensorContractionMapper.h:20
EIGEN_DEVICE_FUNC bool abs2(bool x)
Definition: MathFunctions.h:1102
Namespace containing all symbols from the Eigen library.
Definition: bench_norm.cpp:70
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:83
const int Dynamic
Definition: Constants.h:25
list x
Definition: plotDoE.py:28
Holds information about the various numeric (i.e. scalar) types allowed by Eigen.
Definition: NumTraits.h:217
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2