10 #ifndef EIGEN_SIMPLICIAL_CHOLESKY_H
11 #define EIGEN_SIMPLICIAL_CHOLESKY_H
15 enum SimplicialCholeskyMode {
16 SimplicialCholeskyLLT,
17 SimplicialCholeskyLDLT
35 template<
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);
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);
170 dest = m_diag.asDiagonal().inverse() * dest;
173 derived().matrixU().solveInPlace(dest);
176 dest = m_Pinv * dest;
179 #endif // EIGEN_PARSED_BY_DOXYGEN
184 template<
bool DoLDLT>
187 eigen_assert(matrix.rows()==matrix.cols());
188 Index size = matrix.cols();
190 ordering(matrix, ap);
191 analyzePattern_preordered(ap, DoLDLT);
192 factorize_preordered<DoLDLT>(ap);
195 template<
bool DoLDLT>
196 void factorize(
const MatrixType& a)
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;
240 RealScalar m_shiftOffset;
241 RealScalar m_shiftScale;
244 template<
typename _MatrixType,
int _UpLo = Lower,
typename _Ordering = AMDOrdering<
typename _MatrixType::Index> >
class SimplicialLLT;
245 template<
typename _MatrixType,
int _UpLo = Lower,
typename _Ordering = AMDOrdering<
typename _MatrixType::Index> >
class SimplicialLDLT;
246 template<
typename _MatrixType,
int _UpLo = Lower,
typename _Ordering = AMDOrdering<
typename _MatrixType::Index> >
class SimplicialCholesky;
250 template<
typename _MatrixType,
int _UpLo,
typename _Ordering>
struct traits<
SimplicialLLT<_MatrixType,_UpLo,_Ordering> >
252 typedef _MatrixType MatrixType;
253 typedef _Ordering OrderingType;
254 enum { UpLo = _UpLo };
255 typedef typename MatrixType::Scalar Scalar;
256 typedef typename MatrixType::Index Index;
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(); }
264 template<
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(); }
278 template<
typename _MatrixType,
int _UpLo,
typename _Ordering>
struct traits<SimplicialCholesky<_MatrixType,_UpLo,_Ordering> >
280 typedef _MatrixType MatrixType;
281 typedef _Ordering OrderingType;
282 enum { UpLo = _UpLo };
305 template<
typename _MatrixType,
int _UpLo,
typename _Ordering>
306 class SimplicialLLT :
public SimplicialCholeskyBase<SimplicialLLT<_MatrixType,_UpLo,_Ordering> >
309 typedef _MatrixType MatrixType;
310 enum { UpLo = _UpLo };
311 typedef SimplicialCholeskyBase<SimplicialLLT> Base;
312 typedef typename MatrixType::Scalar Scalar;
313 typedef typename MatrixType::RealScalar RealScalar;
314 typedef typename MatrixType::Index Index;
315 typedef SparseMatrix<Scalar,ColMajor,Index> CholMatrixType;
316 typedef Matrix<Scalar,Dynamic,1> VectorType;
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);
342 Base::template compute<false>(matrix);
354 Base::analyzePattern(a,
false);
365 Base::template factorize<false>(a);
371 Scalar detL = Base::m_matrix.diagonal().prod();
372 return numext::abs2(detL);
394 template<
typename _MatrixType,
int _UpLo,
typename _Ordering>
395 class SimplicialLDLT :
public SimplicialCholeskyBase<SimplicialLDLT<_MatrixType,_UpLo,_Ordering> >
398 typedef _MatrixType MatrixType;
399 enum { UpLo = _UpLo };
400 typedef SimplicialCholeskyBase<SimplicialLDLT> Base;
401 typedef typename MatrixType::Scalar Scalar;
402 typedef typename MatrixType::RealScalar RealScalar;
403 typedef typename MatrixType::Index Index;
404 typedef SparseMatrix<Scalar,ColMajor,Index> CholMatrixType;
405 typedef Matrix<Scalar,Dynamic,1> VectorType;
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);
437 Base::template compute<true>(matrix);
449 Base::analyzePattern(a,
true);
460 Base::template factorize<true>(a);
466 return Base::m_diag.prod();
476 template<
typename _MatrixType,
int _UpLo,
typename _Ordering>
477 class SimplicialCholesky :
public SimplicialCholeskyBase<SimplicialCholesky<_MatrixType,_UpLo,_Ordering> >
480 typedef _MatrixType MatrixType;
481 enum { UpLo = _UpLo };
482 typedef SimplicialCholeskyBase<SimplicialCholesky> Base;
483 typedef typename MatrixType::Scalar Scalar;
484 typedef typename MatrixType::RealScalar RealScalar;
485 typedef typename MatrixType::Index Index;
486 typedef SparseMatrix<Scalar,ColMajor,Index> CholMatrixType;
487 typedef Matrix<Scalar,Dynamic,1> VectorType;
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;
530 Base::template compute<true>(matrix);
532 Base::template compute<false>(matrix);
544 Base::analyzePattern(a, m_LDLT);
556 Base::template factorize<true>(a);
558 Base::template factorize<false>(a);
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);
616 template<
typename Derived>
617 void 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);
641 template<
typename Derived,
typename Rhs>
642 struct 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);
654 template<
typename Derived,
typename Rhs>
655 struct 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);
671 #endif // EIGEN_SIMPLICIAL_CHOLESKY_H
Index rows() const
Definition: SparseMatrix.h:119
SimplicialLLT()
Definition: SimplicialCholesky.h:322
Derived & setShift(const RealScalar &offset, const RealScalar &scale=1)
Definition: SimplicialCholesky.h:129
const MatrixL matrixL() const
Definition: SimplicialCholesky.h:328
Index cols() const
Definition: SparseMatrix.h:121
Scalar prod() const
Definition: Redux.h:387
void factorize(const MatrixType &a)
Definition: SimplicialCholesky.h:553
SimplicialLDLT(const MatrixType &matrix)
Definition: SimplicialCholesky.h:414
void analyzePattern(const MatrixType &a)
Definition: SimplicialCholesky.h:352
SimplicialLDLT & compute(const MatrixType &matrix)
Definition: SimplicialCholesky.h:435
A direct sparse LDLT Cholesky factorizations without square root.
Definition: SimplicialCholesky.h:245
void analyzePattern(const MatrixType &a)
Definition: SimplicialCholesky.h:542
SimplicialCholesky & compute(const MatrixType &matrix)
Definition: SimplicialCholesky.h:527
Index size() const
Definition: PermutationMatrix.h:114
Index nonZeros() const
Definition: SparseMatrix.h:246
Base class of any sparse matrices or sparse expressions.
Definition: ForwardDeclarations.h:239
Definition: SimplicialCholesky.h:246
Derived & derived()
Definition: EigenBase.h:34
A direct sparse Cholesky factorizations.
Definition: SimplicialCholesky.h:36
void factorize(const MatrixType &a)
Definition: SimplicialCholesky.h:363
const MatrixU matrixU() const
Definition: SimplicialCholesky.h:334
void factorize(const MatrixType &a)
Definition: SimplicialCholesky.h:458
const internal::sparse_solve_retval< SimplicialCholeskyBase, Rhs > solve(const SparseMatrixBase< Rhs > &b) const
Definition: SimplicialCholesky.h:102
const MatrixU matrixU() const
Definition: SimplicialCholesky.h:429
const PermutationMatrix< Dynamic, Dynamic, Index > & permutationPinv() const
Definition: SimplicialCholesky.h:117
void analyzePattern(const MatrixType &a)
Definition: SimplicialCholesky.h:447
Definition: SimplicialCholesky.h:221
const internal::solve_retval< SimplicialCholeskyBase, Rhs > solve(const MatrixBase< Rhs > &b) const
Definition: SimplicialCholesky.h:88
Scalar determinant() const
Definition: SimplicialCholesky.h:464
ComputationInfo info() const
Reports whether previous computation was successful.
Definition: SimplicialCholesky.h:76
Definition: Constants.h:376
void compute(const MatrixType &matrix)
Definition: SimplicialCholesky.h:185
SimplicialLDLT()
Definition: SimplicialCholesky.h:411
A direct sparse LLT Cholesky factorizations.
Definition: SimplicialCholesky.h:244
const VectorType vectorD() const
Definition: SimplicialCholesky.h:418
const MatrixL matrixL() const
Definition: SimplicialCholesky.h:423
Index rows() const
Definition: SparseMatrixBase.h:159
SimplicialLLT & compute(const MatrixType &matrix)
Definition: SimplicialCholesky.h:340
SimplicialCholeskyBase()
Definition: SimplicialCholesky.h:51
SimplicialLLT(const MatrixType &matrix)
Definition: SimplicialCholesky.h:324
ComputationInfo
Definition: Constants.h:374
const PermutationMatrix< Dynamic, Dynamic, Index > & permutationP() const
Definition: SimplicialCholesky.h:112
const DiagonalWrapper< const Derived > asDiagonal() const
Definition: DiagonalMatrix.h:278
Base class for all dense matrices, vectors, and expressions.
Definition: MatrixBase.h:48
Scalar determinant() const
Definition: SimplicialCholesky.h:369