11 #ifndef EIGEN_INCOMPLETE_CHOlESKY_H
12 #define EIGEN_INCOMPLETE_CHOlESKY_H
50 template <
typename Scalar,
int UpLo_ = Lower,
typename OrderingType_ = AMDOrdering<
int> >
65 typedef std::vector<std::list<StorageIndex> >
VectorList;
80 template <
typename MatrixType>
111 template <
typename MatrixType>
115 ord(
mat.template selfadjointView<UpLo>(),
pinv);
133 template <
typename MatrixType>
142 template <
typename MatrixType>
149 template <
typename Rhs,
typename Dest>
157 x =
m_L.template triangularView<Lower>().solve(
x);
158 x =
m_L.
adjoint().template triangularView<Upper>().solve(
x);
203 template <
typename Scalar,
int UpLo_,
typename OrderingType>
204 template <
typename MatrixType_>
207 eigen_assert(m_analysisIsOk &&
"analyzePattern() should be called first");
213 if (m_perm.rows() ==
mat.
rows())
218 m_L.template selfadjointView<Lower>() =
tmp.template selfadjointView<Lower>();
220 m_L.template selfadjointView<Lower>() =
mat.template selfadjointView<UpLo_>();
227 bool modified =
false;
229 bool inserted =
false;
230 m_L.findOrInsertCoeff(
i,
i, &inserted);
235 if (modified) m_L.makeCompressed();
238 Index nnz = m_L.nonZeros();
247 col_pattern.fill(-1);
254 for (
Index k = colPtr[
j];
k < colPtr[
j + 1];
k++) {
259 m_scale = m_scale.cwiseSqrt().cwiseSqrt();
272 for (
Index k = colPtr[
j];
k < colPtr[
j + 1];
k++) vals[
k] *= (m_scale(
j) * m_scale(rowIdx[
k]));
274 "IncompleteCholesky: only the lower triangular part must be stored");
281 if (mindiag <=
RealScalar(0.)) m_shift = m_initialShift - mindiag;
289 for (
Index j = 0;
j <
n;
j++) vals[colPtr[
j]] += m_shift;
298 for (
Index i = colPtr[
j] + 1;
i < colPtr[
j + 1];
i++) {
300 col_vals(col_nnz) = vals[
i];
301 col_irow(col_nnz) = l;
302 col_pattern(l) = col_nnz;
306 typename std::list<StorageIndex>::iterator
k;
308 for (
k = listCol[
j].begin();
k != listCol[
j].end();
k++) {
314 for (
Index i = jk;
i < colPtr[*
k + 1];
i++) {
316 if (col_pattern[l] < 0) {
317 col_vals(col_nnz) = vals[
i] * v_j_jk;
318 col_irow[col_nnz] = l;
319 col_pattern(l) = col_nnz;
322 col_vals(col_pattern[l]) -= vals[
i] * v_j_jk;
324 updateList(colPtr, rowIdx, vals, *
k, jk, firstElt, listCol);
330 if (++iter >= 10)
return;
338 col_pattern.fill(-1);
339 for (
Index i = 0;
i <
n; ++
i) listCol[
i].clear();
345 vals[colPtr[
j]] = rdiag;
346 for (
Index k = 0;
k < col_nnz; ++
k) {
349 col_vals(
k) /= rdiag;
355 Index p = colPtr[
j + 1] - colPtr[
j] - 1;
361 for (
Index i = colPtr[
j] + 1;
i < colPtr[
j + 1];
i++) {
362 vals[
i] = col_vals(cpt);
363 rowIdx[
i] = col_irow(cpt);
365 col_pattern(col_irow(cpt)) = -1;
370 updateList(colPtr, rowIdx, vals,
j, jk, firstElt, listCol);
374 m_factorizationIsOk =
true;
380 template <
typename Scalar,
int UpLo_,
typename OrderingType>
385 if (jk < colPtr(
col + 1)) {
388 rowIdx.segment(jk,
p).minCoeff(&minpos);
390 if (rowIdx(minpos) != rowIdx(jk)) {
395 firstElt(
col) = internal::convert_index<StorageIndex, Index>(jk);
396 listCol[rowIdx(jk)].push_back(internal::convert_index<StorageIndex, Index>(
col));
AnnoyingScalar conj(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:133
AnnoyingScalar sqrt(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:134
int i
Definition: BiCGSTAB_step_by_step.cpp:9
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
Array< double, 1, 3 > e(1./3., 0.5, 2.)
#define eigen_internal_assert(x)
Definition: Macros.h:916
#define EIGEN_NOEXCEPT
Definition: Macros.h:1267
#define EIGEN_CONSTEXPR
Definition: Macros.h:758
#define eigen_assert(x)
Definition: Macros.h:910
float * p
Definition: Tutorial_Map_using.cpp:9
Scalar * b
Definition: benchVecAdd.cpp:17
SCALAR Scalar
Definition: bench_gemm.cpp:45
NumTraits< Scalar >::Real RealScalar
Definition: bench_gemm.cpp:46
MatrixXf MatrixType
Definition: benchmark-blocking-sizes.cpp:52
Modified Incomplete Cholesky with dual threshold.
Definition: IncompleteCholesky.h:51
PermutationType m_perm
Definition: IncompleteCholesky.h:191
ComputationInfo info() const
Reports whether previous computation was successful.
Definition: IncompleteCholesky.h:100
void updateList(Ref< const VectorIx > colPtr, Ref< VectorIx > rowIdx, Ref< VectorSx > vals, const Index &col, const Index &jk, VectorIx &firstElt, VectorList &listCol)
Definition: IncompleteCholesky.h:381
IncompleteCholesky(const MatrixType &matrix)
Definition: IncompleteCholesky.h:81
VectorRx m_scale
Definition: IncompleteCholesky.h:186
Matrix< StorageIndex, Dynamic, 1 > VectorIx
Definition: IncompleteCholesky.h:64
std::vector< std::list< StorageIndex > > VectorList
Definition: IncompleteCholesky.h:65
@ ColsAtCompileTime
Definition: IncompleteCholesky.h:67
@ MaxColsAtCompileTime
Definition: IncompleteCholesky.h:67
Matrix< Scalar, Dynamic, 1 > VectorSx
Definition: IncompleteCholesky.h:62
ComputationInfo m_info
Definition: IncompleteCholesky.h:190
EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT
Definition: IncompleteCholesky.h:87
@ UpLo
Definition: IncompleteCholesky.h:66
void factorize(const MatrixType &mat)
Performs the numerical factorization of the input matrix mat.
const VectorRx & scalingS() const
Definition: IncompleteCholesky.h:170
OrderingType_ OrderingType
Definition: IncompleteCholesky.h:58
IncompleteCholesky()
Definition: IncompleteCholesky.h:76
const PermutationType & permutationP() const
Definition: IncompleteCholesky.h:176
bool m_factorizationIsOk
Definition: IncompleteCholesky.h:189
void _solve_impl(const Rhs &b, Dest &x) const
Definition: IncompleteCholesky.h:150
Matrix< RealScalar, Dynamic, 1 > VectorRx
Definition: IncompleteCholesky.h:63
OrderingType::PermutationType PermutationType
Definition: IncompleteCholesky.h:59
bool m_analysisIsOk
Definition: IncompleteCholesky.h:188
FactorType m_L
Definition: IncompleteCholesky.h:185
SparseSolverBase< IncompleteCholesky< Scalar, UpLo_, OrderingType_ > > Base
Definition: IncompleteCholesky.h:53
bool m_isInitialized
Definition: SparseSolverBase.h:110
void compute(const MatrixType &mat)
Definition: IncompleteCholesky.h:143
EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT
Definition: IncompleteCholesky.h:90
RealScalar m_shift
Definition: IncompleteCholesky.h:192
const FactorType & matrixL() const
Definition: IncompleteCholesky.h:164
void analyzePattern(const MatrixType &mat)
Computes the fill reducing permutation vector using the sparsity pattern of mat.
Definition: IncompleteCholesky.h:112
RealScalar shift() const
Definition: IncompleteCholesky.h:182
RealScalar m_initialShift
Definition: IncompleteCholesky.h:187
PermutationType::StorageIndex StorageIndex
Definition: IncompleteCholesky.h:60
SparseMatrix< Scalar, ColMajor, StorageIndex > FactorType
Definition: IncompleteCholesky.h:61
NumTraits< Scalar >::Real RealScalar
Definition: IncompleteCholesky.h:57
void setInitialShift(RealScalar shift)
Set the initial shift parameter .
Definition: IncompleteCholesky.h:107
A matrix or vector expression mapping an existing array of data.
Definition: Map.h:96
EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE void resize(Index rows, Index cols)
Definition: PlainObjectBase.h:294
A matrix or vector expression mapping an existing expression.
Definition: Ref.h:264
SparseSymmetricPermutationProduct< Derived, Upper|Lower > twistedBy(const PermutationMatrix< Dynamic, Dynamic, StorageIndex > &perm) const
Definition: SparseMatrixBase.h:325
const AdjointReturnType adjoint() const
Definition: SparseMatrixBase.h:360
Index cols() const
Definition: SparseMatrix.h:161
const Scalar * valuePtr() const
Definition: SparseMatrix.h:171
void resize(Index rows, Index cols)
Definition: SparseMatrix.h:734
Index rows() const
Definition: SparseMatrix.h:159
const StorageIndex * outerIndexPtr() const
Definition: SparseMatrix.h:189
const StorageIndex * innerIndexPtr() const
Definition: SparseMatrix.h:180
A base class for sparse solvers.
Definition: SparseSolverBase.h:67
bool m_isInitialized
Definition: SparseSolverBase.h:110
Eigen::Map< Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor >, 0, Eigen::OuterStride<> > matrix(T *data, int rows, int cols, int stride)
Definition: common.h:85
float real
Definition: datatypes.h:10
#define min(a, b)
Definition: datatypes.h:22
ComputationInfo
Definition: Constants.h:438
@ NumericalIssue
Definition: Constants.h:442
@ Success
Definition: Constants.h:440
EIGEN_BLAS_FUNC() swap(int *n, RealScalar *px, int *incx, RealScalar *py, int *incy)
Definition: level1_impl.h:117
const char const char const char * diag
Definition: level2_impl.h:86
char char char int int * k
Definition: level2_impl.h:374
Eigen::Matrix< Scalar, Dynamic, Dynamic, ColMajor > tmp
Definition: level3_impl.h:365
@ Rhs
Definition: TensorContractionMapper.h:20
Index QuickSplit(VectorV &row, VectorI &ind, Index ncut)
Definition: IncompleteLUT.h:31
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T maxi(const T &x, const T &y)
Definition: MathFunctions.h:926
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T mini(const T &x, const T &y)
Definition: MathFunctions.h:920
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
bool pinv
Definition: jeffery_hamel.cc:86
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