10 #ifndef EIGEN_SIMPLICIAL_CHOLESKY_H 11 #define EIGEN_SIMPLICIAL_CHOLESKY_H 35 template<
typename Derived>
41 typedef typename MatrixType::Scalar
Scalar;
43 typedef typename MatrixType::Index
Index;
64 Derived&
derived() {
return *
static_cast<Derived*
>(
this); }
65 const Derived&
derived()
const {
return *
static_cast<const Derived*
>(
this); }
85 template<
typename Rhs>
91 &&
"SimplicialCholeskyBase::solve(): invalid number of rows of the right hand side matrix b");
99 template<
typename Rhs>
105 &&
"SimplicialCholesky::solve(): invalid number of rows of the right hand side matrix b");
128 Derived&
setShift(
const RealScalar& offset,
const RealScalar& scale = 1)
135 #ifndef EIGEN_PARSED_BY_DOXYGEN 137 template<
typename Stream>
142 s <<
" diag: " << ((total+=
m_diag.size() *
sizeof(
Scalar)) >> 20) <<
"Mb" <<
"\n";
143 s <<
" tree: " << ((total+=
m_parent.size() *
sizeof(int)) >> 20) <<
"Mb" <<
"\n";
144 s <<
" nonzeros: " << ((total+=
m_nonZerosPerCol.size() *
sizeof(int)) >> 20) <<
"Mb" <<
"\n";
145 s <<
" perm: " << ((total+=
m_P.
size() *
sizeof(int)) >> 20) <<
"Mb" <<
"\n";
146 s <<
" perm^-1: " << ((total+=
m_Pinv.
size() *
sizeof(int)) >> 20) <<
"Mb" <<
"\n";
147 s <<
" TOTAL: " << (total>> 20) <<
"Mb" <<
"\n";
151 template<
typename Rhs,
typename Dest>
154 eigen_assert(
m_factorizationIsOk &&
"The decomposition is not in a valid state for solving, you must first call either compute() or symbolic()/numeric()");
166 derived().matrixL().solveInPlace(dest);
169 dest =
m_diag.asDiagonal().inverse() * dest;
172 derived().matrixU().solveInPlace(dest);
178 #endif // EIGEN_PARSED_BY_DOXYGEN 183 template<
bool DoLDLT>
187 Index size = matrix.cols();
188 CholMatrixType ap(size,size);
191 factorize_preordered<DoLDLT>(ap);
194 template<
bool DoLDLT>
199 CholMatrixType ap(size,size);
200 ap.template selfadjointView<Upper>() = a.template selfadjointView<UpLo>().
twistedBy(
m_P);
201 factorize_preordered<DoLDLT>(ap);
204 template<
bool DoLDLT>
211 CholMatrixType ap(size,size);
217 void ordering(
const MatrixType& a, CholMatrixType& ap);
253 typedef typename MatrixType::Scalar
Scalar;
254 typedef typename MatrixType::Index
Index;
258 static inline MatrixL
getL(
const MatrixType& m) {
return m; }
259 static inline MatrixU
getU(
const MatrixType& m) {
return m.
adjoint(); }
266 typedef typename MatrixType::Scalar
Scalar;
267 typedef typename MatrixType::Index
Index;
271 static inline MatrixL
getL(
const MatrixType& m) {
return m; }
272 static inline MatrixU
getU(
const MatrixType& m) {
return m.
adjoint(); }
300 template<
typename _MatrixType,
int _UpLo>
307 typedef typename MatrixType::Scalar
Scalar;
309 typedef typename MatrixType::Index
Index;
324 eigen_assert(Base::m_factorizationIsOk &&
"Simplicial LLT not factorized");
325 return Traits::getL(Base::m_matrix);
330 eigen_assert(Base::m_factorizationIsOk &&
"Simplicial LLT not factorized");
331 return Traits::getU(Base::m_matrix);
337 Base::template compute<false>(matrix);
349 Base::analyzePattern(a,
false);
360 Base::template factorize<false>(a);
366 Scalar detL = Base::m_matrix.diagonal().prod();
388 template<
typename _MatrixType,
int _UpLo>
395 typedef typename MatrixType::Scalar
Scalar;
397 typedef typename MatrixType::Index
Index;
413 eigen_assert(Base::m_factorizationIsOk &&
"Simplicial LDLT not factorized");
418 eigen_assert(Base::m_factorizationIsOk &&
"Simplicial LDLT not factorized");
419 return Traits::getL(Base::m_matrix);
424 eigen_assert(Base::m_factorizationIsOk &&
"Simplicial LDLT not factorized");
425 return Traits::getU(Base::m_matrix);
431 Base::template compute<true>(matrix);
443 Base::analyzePattern(a,
true);
454 Base::template factorize<true>(a);
460 return Base::m_diag.prod();
470 template<
typename _MatrixType,
int _UpLo>
477 typedef typename MatrixType::Scalar
Scalar;
479 typedef typename MatrixType::Index
Index;
489 : Base(), m_LDLT(true)
512 eigen_assert(Base::m_factorizationIsOk &&
"Simplicial Cholesky not factorized");
516 eigen_assert(Base::m_factorizationIsOk &&
"Simplicial Cholesky not factorized");
517 return Base::m_matrix;
524 Base::template compute<true>(matrix);
526 Base::template compute<false>(matrix);
538 Base::analyzePattern(a, m_LDLT);
550 Base::template factorize<true>(a);
552 Base::template factorize<false>(a);
556 template<
typename Rhs,
typename Dest>
559 eigen_assert(Base::m_factorizationIsOk &&
"The decomposition is not in a valid state for solving, you must first call either compute() or symbolic()/numeric()");
565 if(Base::m_P.size()>0)
566 dest = Base::m_P * b;
570 if(Base::m_matrix.nonZeros()>0)
573 LDLTTraits::getL(Base::m_matrix).solveInPlace(dest);
575 LLTTraits::getL(Base::m_matrix).solveInPlace(dest);
578 if(Base::m_diag.size()>0)
579 dest = Base::m_diag.
asDiagonal().inverse() * dest;
581 if (Base::m_matrix.nonZeros()>0)
584 LDLTTraits::getU(Base::m_matrix).solveInPlace(dest);
586 LLTTraits::getU(Base::m_matrix).solveInPlace(dest);
589 if(Base::m_P.size()>0)
590 dest = Base::m_Pinv * dest;
597 return Base::m_diag.prod();
610 template<
typename Derived>
614 const Index size = a.rows();
619 C = a.template selfadjointView<UpLo>();
632 ap.template selfadjointView<Upper>() = a.template selfadjointView<UpLo>().
twistedBy(
m_P);
637 template<
typename Derived,
typename Rhs>
644 template<typename Dest>
void evalTo(Dest& dst)
const 646 dec().derived()._solve(rhs(),dst);
650 template<
typename Derived,
typename Rhs>
657 template<typename Dest>
void evalTo(Dest& dst)
const 659 this->defaultEvalTo(dst);
667 #endif // EIGEN_SIMPLICIAL_CHOLESKY_H PermutationMatrix< Dynamic, Dynamic, Index > m_P
SimplicialCholesky(const MatrixType &matrix)
internal::traits< SimplicialLDLT< MatrixType, UpLo > > LDLTTraits
bool operator()(const Index &row, const Index &col, const Scalar &) const
void factorize(const MatrixType &a)
const AdjointReturnType adjoint() const
SimplicialCholeskyBase< SimplicialCholesky > Base
MatrixType::Scalar Scalar
SimplicialCholeskyBase< SimplicialLLT > Base
VectorXi m_nonZerosPerCol
Derived & setShift(const RealScalar &offset, const RealScalar &scale=1)
void analyzePattern(const MatrixType &a)
const internal::solve_retval< SimplicialCholeskyBase, Rhs > solve(const MatrixBase< Rhs > &b) const
MatrixType::RealScalar RealScalar
internal::traits< SimplicialLLT > Traits
static MatrixU getU(const MatrixType &m)
SparseMatrix< Scalar, ColMajor, Index > CholMatrixType
~SimplicialCholeskyBase()
SimplicialCholeskyBase(const MatrixType &matrix)
A direct sparse LDLT Cholesky factorizations without square root.
void analyzePattern(const MatrixType &a)
SimplicialCholesky & setMode(SimplicialCholeskyMode mode)
EIGEN_STRONG_INLINE const CwiseUnaryOp< internal::scalar_abs2_op< Scalar >, const Derived > abs2() const
void analyzePattern_preordered(const CholMatrixType &a, bool doLDLT)
SparseMatrix< Scalar, ColMajor, Index > CholMatrixType
SparseMatrix< Scalar, ColMajor, Index > CholMatrixType
Matrix< Scalar, Dynamic, 1 > VectorType
const VectorType vectorD() const
SimplicialCholeskyBase< Derived > Dec
internal::traits< SimplicialLLT< MatrixType, UpLo > > LLTTraits
SimplicialLLT & compute(const MatrixType &matrix)
const internal::sparse_solve_retval< SimplicialCholeskyBase, Rhs > solve(const SparseMatrixBase< Rhs > &b) const
SparseMatrix< Scalar, ColMajor, Index > CholMatrixType
const MatrixU matrixU() const
Scalar determinant() const
SparseSymmetricPermutationProduct< Derived, Upper|Lower > twistedBy(const PermutationMatrix< Dynamic, Dynamic, Index > &perm) const
Matrix< Scalar, Dynamic, 1 > VectorType
MatrixType::Scalar Scalar
const Derived & derived() const
void factorize(const MatrixType &a)
SimplicialCholeskyBase< Derived > Dec
void compute(const MatrixType &matrix)
Base class of any sparse matrices or sparse expressions.
void ordering(const MatrixType &a, CholMatrixType &ap)
Matrix< Scalar, Dynamic, 1 > VectorType
void factorize(const MatrixType &a)
void factorize(const MatrixType &a)
A direct sparse Cholesky factorizations.
const MatrixL matrixL() const
const PermutationMatrix< Dynamic, Dynamic, Index > & permutationPinv() const
MatrixType::Scalar Scalar
SparseMatrix< Scalar, ColMajor, Index > CholMatrixType
internal::traits< SimplicialLDLT > Traits
void resize(Index rows, Index cols)
void minimum_degree_ordering(SparseMatrix< Scalar, ColMajor, Index > &C, PermutationMatrix< Dynamic, Dynamic, Index > &perm)
void analyzePattern(const MatrixType &a, bool doLDLT)
ComputationInfo info() const
Reports whether previous computation was successful.
MatrixType::RealScalar RealScalar
#define EIGEN_MAKE_SPARSE_SOLVE_HELPERS(DecompositionType, Rhs)
Transpose< PermutationBase > inverse() const
static MatrixL getL(const MatrixType &m)
Scalar determinant() const
void factorize_preordered(const CholMatrixType &a)
MatrixType::RealScalar RealScalar
const VectorType vectorD() const
MatrixType::Scalar Scalar
SimplicialCholesky & compute(const MatrixType &matrix)
SparseTriangularView< CholMatrixType, Eigen::Lower > MatrixL
MatrixType::Scalar Scalar
internal::traits< Derived >::MatrixType MatrixType
const Derived & derived() const
SimplicialLDLT & compute(const MatrixType &matrix)
Scalar determinant() const
SparseTriangularView< typename CholMatrixType::AdjointReturnType, Eigen::UnitUpper > MatrixU
void analyzePattern(const MatrixType &a)
internal::traits< SimplicialCholesky > Traits
SparseMatrix< Scalar, ColMajor, Index > CholMatrixType
void _solve(const MatrixBase< Rhs > &b, MatrixBase< Dest > &dest) const
#define EIGEN_MAKE_SOLVE_HELPERS(DecompositionType, Rhs)
MatrixType::Scalar Scalar
Expression of a diagonal/subdiagonal/superdiagonal in a matrix.
Matrix< Scalar, Dynamic, 1 > VectorType
MatrixType::RealScalar RealScalar
void dumpMemory(Stream &s)
A direct sparse LLT Cholesky factorizations.
SparseTriangularView< typename CholMatrixType::AdjointReturnType, Eigen::Upper > MatrixU
SimplicialCholeskyBase< SimplicialLDLT > Base
const PermutationMatrix< Dynamic, Dynamic, Index > & permutationP() const
const DiagonalWrapper< const Derived > asDiagonal() const
const MatrixL matrixL() const
void resize(Index newSize)
SimplicialLDLT(const MatrixType &matrix)
const CholMatrixType rawMatrix() const
const MatrixU matrixU() const
void _solve(const MatrixBase< Rhs > &b, MatrixBase< Dest > &dest) const
Base class for all dense matrices, vectors, and expressions.
SparseTriangularView< CholMatrixType, Eigen::UnitLower > MatrixL
static MatrixU getU(const MatrixType &m)
static MatrixL getL(const MatrixType &m)
PermutationMatrix< Dynamic, Dynamic, Index > m_Pinv
SimplicialLLT(const MatrixType &matrix)