10#ifndef EIGEN_SIMPLICIAL_CHOLESKY_H
11#define EIGEN_SIMPLICIAL_CHOLESKY_H
15enum SimplicialCholeskyMode {
16 SimplicialCholeskyLLT,
17 SimplicialCholeskyLDLT
35template<
typename Derived>
39 typedef typename internal::traits<Derived>::MatrixType MatrixType;
40 typedef typename internal::traits<Derived>::OrderingType OrderingType;
41 enum { UpLo = internal::traits<Derived>::UpLo };
42 typedef typename MatrixType::Scalar Scalar;
43 typedef typename MatrixType::RealScalar RealScalar;
44 typedef typename MatrixType::Index Index;
52 : m_info(
Success), m_isInitialized(false), m_shiftOffset(0), m_shiftScale(1)
56 : m_info(
Success), m_isInitialized(false), m_shiftOffset(0), m_shiftScale(1)
58 derived().compute(matrix);
61 ~SimplicialCholeskyBase()
65 Derived& derived() {
return *
static_cast<Derived*
>(
this); }
66 const Derived& derived()
const {
return *
static_cast<const Derived*
>(
this); }
68 inline Index cols()
const {
return m_matrix.cols(); }
69 inline Index rows()
const {
return m_matrix.rows(); }
78 eigen_assert(m_isInitialized &&
"Decomposition is not initialized.");
86 template<
typename Rhs>
87 inline const internal::solve_retval<SimplicialCholeskyBase, Rhs>
90 eigen_assert(m_isInitialized &&
"Simplicial LLT or LDLT is not initialized.");
91 eigen_assert(rows()==b.rows()
92 &&
"SimplicialCholeskyBase::solve(): invalid number of rows of the right hand side matrix b");
93 return internal::solve_retval<SimplicialCholeskyBase, Rhs>(*
this, b.derived());
100 template<
typename Rhs>
101 inline const internal::sparse_solve_retval<SimplicialCholeskyBase, Rhs>
104 eigen_assert(m_isInitialized &&
"Simplicial LLT or LDLT is not initialized.");
105 eigen_assert(rows()==b.
rows()
106 &&
"SimplicialCholesky::solve(): invalid number of rows of the right hand side matrix b");
107 return internal::sparse_solve_retval<SimplicialCholeskyBase, Rhs>(*
this, b.
derived());
129 Derived&
setShift(
const RealScalar& offset,
const RealScalar& scale = 1)
131 m_shiftOffset = offset;
132 m_shiftScale = scale;
136#ifndef EIGEN_PARSED_BY_DOXYGEN
138 template<
typename Stream>
139 void dumpMemory(Stream& s)
142 s <<
" L: " << ((total+=(m_matrix.
cols()+1) *
sizeof(
int) + m_matrix.
nonZeros()*(
sizeof(
int)+
sizeof(Scalar))) >> 20) <<
"Mb" <<
"\n";
143 s <<
" diag: " << ((total+=m_diag.size() *
sizeof(Scalar)) >> 20) <<
"Mb" <<
"\n";
144 s <<
" tree: " << ((total+=m_parent.size() *
sizeof(
int)) >> 20) <<
"Mb" <<
"\n";
145 s <<
" nonzeros: " << ((total+=m_nonZerosPerCol.size() *
sizeof(
int)) >> 20) <<
"Mb" <<
"\n";
146 s <<
" perm: " << ((total+=m_P.
size() *
sizeof(
int)) >> 20) <<
"Mb" <<
"\n";
147 s <<
" perm^-1: " << ((total+=m_Pinv.
size() *
sizeof(
int)) >> 20) <<
"Mb" <<
"\n";
148 s <<
" TOTAL: " << (total>> 20) <<
"Mb" <<
"\n";
152 template<
typename Rhs,
typename Dest>
153 void _solve(
const MatrixBase<Rhs> &b, MatrixBase<Dest> &dest)
const
155 eigen_assert(m_factorizationIsOk &&
"The decomposition is not in a valid state for solving, you must first call either compute() or symbolic()/numeric()");
156 eigen_assert(m_matrix.
rows()==b.rows());
167 derived().matrixL().solveInPlace(dest);
173 derived().matrixU().solveInPlace(dest);
176 dest = m_Pinv * dest;
184 template<
bool DoLDLT>
187 eigen_assert(matrix.rows()==matrix.cols());
188 Index size = matrix.cols();
189 CholMatrixType ap(size,size);
190 ordering(matrix, ap);
191 analyzePattern_preordered(ap, DoLDLT);
192 factorize_preordered<DoLDLT>(ap);
195 template<
bool DoLDLT>
198 eigen_assert(a.rows()==a.cols());
200 CholMatrixType ap(size,size);
201 ap.template selfadjointView<Upper>() = a.template selfadjointView<UpLo>().twistedBy(m_P);
202 factorize_preordered<DoLDLT>(ap);
205 template<
bool DoLDLT>
206 void factorize_preordered(
const CholMatrixType& a);
208 void analyzePattern(
const MatrixType& a,
bool doLDLT)
210 eigen_assert(a.rows()==a.cols());
212 CholMatrixType ap(size,size);
214 analyzePattern_preordered(ap,doLDLT);
216 void analyzePattern_preordered(
const CholMatrixType& a,
bool doLDLT);
218 void ordering(
const MatrixType& a, CholMatrixType& ap);
222 inline bool operator() (
const Index& row,
const Index& col,
const Scalar&)
const
229 bool m_isInitialized;
230 bool m_factorizationIsOk;
233 CholMatrixType m_matrix;
236 VectorXi m_nonZerosPerCol;
240 RealScalar m_shiftOffset;
241 RealScalar m_shiftScale;
244template<
typename _MatrixType,
int _UpLo = Lower,
typename _Ordering = AMDOrdering<
typename _MatrixType::Index> >
class SimplicialLLT;
245template<
typename _MatrixType,
int _UpLo = Lower,
typename _Ordering = AMDOrdering<
typename _MatrixType::Index> >
class SimplicialLDLT;
246template<
typename _MatrixType,
int _UpLo = Lower,
typename _Ordering = AMDOrdering<
typename _MatrixType::Index> >
class SimplicialCholesky;
250template<
typename _MatrixType,
int _UpLo,
typename _Ordering>
struct traits<
SimplicialLLT<_MatrixType,_UpLo,_Ordering> >
253 typedef _Ordering OrderingType;
254 enum { UpLo = _UpLo };
255 typedef typename MatrixType::Scalar Scalar;
256 typedef typename MatrixType::Index Index;
257 typedef SparseMatrix<Scalar, ColMajor, Index> CholMatrixType;
258 typedef SparseTriangularView<CholMatrixType, Eigen::Lower> MatrixL;
259 typedef SparseTriangularView<typename CholMatrixType::AdjointReturnType, Eigen::Upper> MatrixU;
260 static inline MatrixL getL(
const MatrixType& m) {
return m; }
261 static inline MatrixU getU(
const MatrixType& m) {
return m.adjoint(); }
264template<
typename _MatrixType,
int _UpLo,
typename _Ordering>
struct traits<SimplicialLDLT<_MatrixType,_UpLo,_Ordering> >
266 typedef _MatrixType MatrixType;
267 typedef _Ordering OrderingType;
268 enum { UpLo = _UpLo };
269 typedef typename MatrixType::Scalar Scalar;
270 typedef typename MatrixType::Index Index;
271 typedef SparseMatrix<Scalar, ColMajor, Index> CholMatrixType;
272 typedef SparseTriangularView<CholMatrixType, Eigen::UnitLower> MatrixL;
273 typedef SparseTriangularView<typename CholMatrixType::AdjointReturnType, Eigen::UnitUpper> MatrixU;
274 static inline MatrixL getL(
const MatrixType& m) {
return m; }
275 static inline MatrixU getU(
const MatrixType& m) {
return m.adjoint(); }
278template<
typename _MatrixType,
int _UpLo,
typename _Ordering>
struct traits<SimplicialCholesky<_MatrixType,_UpLo,_Ordering> >
280 typedef _MatrixType MatrixType;
281 typedef _Ordering OrderingType;
282 enum { UpLo = _UpLo };
305template<
typename _MatrixType,
int _UpLo,
typename _Ordering>
309 typedef _MatrixType MatrixType;
310 enum { UpLo = _UpLo };
312 typedef typename MatrixType::Scalar Scalar;
313 typedef typename MatrixType::RealScalar RealScalar;
314 typedef typename MatrixType::Index Index;
317 typedef internal::traits<SimplicialLLT> Traits;
318 typedef typename Traits::MatrixL MatrixL;
319 typedef typename Traits::MatrixU MatrixU;
329 eigen_assert(Base::m_factorizationIsOk &&
"Simplicial LLT not factorized");
330 return Traits::getL(Base::m_matrix);
335 eigen_assert(Base::m_factorizationIsOk &&
"Simplicial LLT not factorized");
336 return Traits::getU(Base::m_matrix);
354 Base::analyzePattern(a,
false);
371 Scalar detL = Base::m_matrix.diagonal().prod();
372 return numext::abs2(detL);
394template<
typename _MatrixType,
int _UpLo,
typename _Ordering>
398 typedef _MatrixType MatrixType;
399 enum { UpLo = _UpLo };
401 typedef typename MatrixType::Scalar Scalar;
402 typedef typename MatrixType::RealScalar RealScalar;
403 typedef typename MatrixType::Index Index;
406 typedef internal::traits<SimplicialLDLT> Traits;
407 typedef typename Traits::MatrixL MatrixL;
408 typedef typename Traits::MatrixU MatrixU;
419 eigen_assert(Base::m_factorizationIsOk &&
"Simplicial LDLT not factorized");
424 eigen_assert(Base::m_factorizationIsOk &&
"Simplicial LDLT not factorized");
425 return Traits::getL(Base::m_matrix);
430 eigen_assert(Base::m_factorizationIsOk &&
"Simplicial LDLT not factorized");
431 return Traits::getU(Base::m_matrix);
449 Base::analyzePattern(a,
true);
466 return Base::m_diag.prod();
476template<
typename _MatrixType,
int _UpLo,
typename _Ordering>
480 typedef _MatrixType MatrixType;
481 enum { UpLo = _UpLo };
483 typedef typename MatrixType::Scalar Scalar;
484 typedef typename MatrixType::RealScalar RealScalar;
485 typedef typename MatrixType::Index Index;
488 typedef internal::traits<SimplicialCholesky> Traits;
489 typedef internal::traits<SimplicialLDLT<MatrixType,UpLo> > LDLTTraits;
490 typedef internal::traits<SimplicialLLT<MatrixType,UpLo> > LLTTraits;
492 SimplicialCholesky() : Base(), m_LDLT(
true) {}
494 SimplicialCholesky(
const MatrixType& matrix)
495 : Base(), m_LDLT(
true)
500 SimplicialCholesky& setMode(SimplicialCholeskyMode mode)
504 case SimplicialCholeskyLLT:
507 case SimplicialCholeskyLDLT:
517 inline const VectorType vectorD()
const {
518 eigen_assert(Base::m_factorizationIsOk &&
"Simplicial Cholesky not factorized");
521 inline const CholMatrixType rawMatrix()
const {
522 eigen_assert(Base::m_factorizationIsOk &&
"Simplicial Cholesky not factorized");
523 return Base::m_matrix;
527 SimplicialCholesky&
compute(
const MatrixType& matrix)
544 Base::analyzePattern(a, m_LDLT);
562 template<
typename Rhs,
typename Dest>
565 eigen_assert(Base::m_factorizationIsOk &&
"The decomposition is not in a valid state for solving, you must first call either compute() or symbolic()/numeric()");
566 eigen_assert(Base::m_matrix.rows()==b.rows());
571 if(Base::m_P.size()>0)
572 dest = Base::m_P * b;
576 if(Base::m_matrix.nonZeros()>0)
579 LDLTTraits::getL(Base::m_matrix).solveInPlace(dest);
581 LLTTraits::getL(Base::m_matrix).solveInPlace(dest);
584 if(Base::m_diag.size()>0)
585 dest = Base::m_diag.
asDiagonal().inverse() * dest;
587 if (Base::m_matrix.nonZeros()>0)
590 LDLTTraits::getU(Base::m_matrix).solveInPlace(dest);
592 LLTTraits::getU(Base::m_matrix).solveInPlace(dest);
595 if(Base::m_P.size()>0)
596 dest = Base::m_Pinv * dest;
599 Scalar determinant()
const
603 return Base::m_diag.prod();
607 Scalar detL = Diagonal<const CholMatrixType>(Base::m_matrix).prod();
608 return numext::abs2(detL);
616template<
typename Derived>
617void SimplicialCholeskyBase<Derived>::ordering(
const MatrixType& a, CholMatrixType& ap)
619 eigen_assert(a.rows()==a.cols());
620 const Index size = a.rows();
624 C = a.template selfadjointView<UpLo>();
626 OrderingType ordering;
631 m_P = m_Pinv.inverse();
635 ap.resize(size,size);
636 ap.template selfadjointView<Upper>() = a.template selfadjointView<UpLo>().twistedBy(m_P);
641template<
typename Derived,
typename Rhs>
642struct solve_retval<SimplicialCholeskyBase<Derived>, Rhs>
643 : solve_retval_base<SimplicialCholeskyBase<Derived>, Rhs>
645 typedef SimplicialCholeskyBase<Derived> Dec;
646 EIGEN_MAKE_SOLVE_HELPERS(Dec,Rhs)
648 template<
typename Dest>
void evalTo(Dest& dst)
const
650 dec().derived()._solve(rhs(),dst);
654template<
typename Derived,
typename Rhs>
655struct sparse_solve_retval<SimplicialCholeskyBase<Derived>, Rhs>
656 : sparse_solve_retval_base<SimplicialCholeskyBase<Derived>, Rhs>
658 typedef SimplicialCholeskyBase<Derived> Dec;
659 EIGEN_MAKE_SPARSE_SOLVE_HELPERS(Dec,Rhs)
661 template<
typename Dest>
void evalTo(Dest& dst)
const
663 this->defaultEvalTo(dst);
Base class for all dense matrices, vectors, and expressions.
Definition MatrixBase.h:50
const DiagonalWrapper< const Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > > asDiagonal() const
Definition DiagonalMatrix.h:278
The matrix class, also used for vectors and row-vectors.
Definition Matrix.h:129
Index size() const
Definition PermutationMatrix.h:114
Permutation matrix.
Definition PermutationMatrix.h:313
const PermutationMatrix< Dynamic, Dynamic, Index > & permutationP() const
Definition SimplicialCholesky.h:112
const internal::sparse_solve_retval< SimplicialCholeskyBase, Rhs > solve(const SparseMatrixBase< Rhs > &b) const
Definition SimplicialCholesky.h:102
SimplicialCholeskyBase()
Definition SimplicialCholesky.h:51
const internal::solve_retval< SimplicialCholeskyBase, Rhs > solve(const MatrixBase< Rhs > &b) const
Definition SimplicialCholesky.h:88
const PermutationMatrix< Dynamic, Dynamic, Index > & permutationPinv() const
Definition SimplicialCholesky.h:117
ComputationInfo info() const
Reports whether previous computation was successful.
Definition SimplicialCholesky.h:76
void compute(const MatrixType &matrix)
Definition SimplicialCholesky.h:185
Derived & setShift(const RealScalar &offset, const RealScalar &scale=1)
Definition SimplicialCholesky.h:129
Definition SimplicialCholesky.h:478
void analyzePattern(const MatrixType &a)
Definition SimplicialCholesky.h:542
void factorize(const MatrixType &a)
Definition SimplicialCholesky.h:553
SimplicialCholesky & compute(const MatrixType &matrix)
Definition SimplicialCholesky.h:527
A direct sparse LDLT Cholesky factorizations without square root.
Definition SimplicialCholesky.h:396
Scalar determinant() const
Definition SimplicialCholesky.h:464
SimplicialLDLT(const MatrixType &matrix)
Definition SimplicialCholesky.h:414
void analyzePattern(const MatrixType &a)
Definition SimplicialCholesky.h:447
const MatrixL matrixL() const
Definition SimplicialCholesky.h:423
void factorize(const MatrixType &a)
Definition SimplicialCholesky.h:458
SimplicialLDLT()
Definition SimplicialCholesky.h:411
const VectorType vectorD() const
Definition SimplicialCholesky.h:418
const MatrixU matrixU() const
Definition SimplicialCholesky.h:429
SimplicialLDLT & compute(const MatrixType &matrix)
Definition SimplicialCholesky.h:435
A direct sparse LLT Cholesky factorizations.
Definition SimplicialCholesky.h:307
Scalar determinant() const
Definition SimplicialCholesky.h:369
void analyzePattern(const MatrixType &a)
Definition SimplicialCholesky.h:352
const MatrixL matrixL() const
Definition SimplicialCholesky.h:328
SimplicialLLT & compute(const MatrixType &matrix)
Definition SimplicialCholesky.h:340
SimplicialLLT()
Definition SimplicialCholesky.h:322
void factorize(const MatrixType &a)
Definition SimplicialCholesky.h:363
SimplicialLLT(const MatrixType &matrix)
Definition SimplicialCholesky.h:324
const MatrixU matrixU() const
Definition SimplicialCholesky.h:334
Base class of any sparse matrices or sparse expressions.
Definition SparseMatrixBase.h:34
Index rows() const
Definition SparseMatrixBase.h:160
A versatible sparse matrix representation.
Definition SparseMatrix.h:87
Index cols() const
Definition SparseMatrix.h:121
Index nonZeros() const
Definition SparseMatrix.h:246
Index rows() const
Definition SparseMatrix.h:119
ComputationInfo
Definition Constants.h:374
@ Success
Definition Constants.h:376
Derived & derived()
Definition EigenBase.h:34
Definition SimplicialCholesky.h:221