LDL factorization¶
Symmetric pivoting¶
The following routines return a pivoted LDL factorization, where the vector \(p\) contains the column indices of the nonzero entries of the permutation matrix \(P\) such that \(PAP^T\) equals either \(LDL^T\) or \(LDL^H\), where \(D\) is quasi-diagonal. The Bunch-Kaufman pivoting rules are used within a higher-performance blocked algorithm, whereas the Bunch-Parlett strategy uses an unblocked, but typically more accurate, algorithm.
Factorization¶
C++ API¶
-
type
LDLPivotType¶ An enum for specifying the symmetric pivoting strategy. The current (not yet all supported) options include:
BUNCH_KAUFMAN_ABUNCH_KAUFMAN_C(not yet supported)BUNCH_KAUFMAN_DBUNCH_KAUFMAN_BOUNDED(not yet supported)BUNCH_PARLETTLDL_WITHOUT_PIVOTING
-
template<>
RealLDLPivotConstant<Real>(LDLPivotType pivotType)¶ Maps various LDL pivotings schemes to their optimal threshold constant.
-
template<>
typeLDLPivotCtrl<Real>¶ -
LDLPivotType
pivotType¶ The type of pivoting to perform (by default,
BUNCH_KAUFMAN_A)
-
Real
gamma¶ Pivot tolerance (by default, set to
LDLPivotConstant<Real>(pivotType))
-
LDLPivotCtrl(LDLPivotType piv = BUNCH_KAUFMAN_A)¶
-
LDLPivotType
-
type
LDLPivot¶
-
void
LDL(Matrix<F> &A, Matrix<F> &dSub, Matrix<int> &p, bool conjugate = false, const LDLPivotCtrl<Base<F>> &ctrl = LDLPivotCtrl<Base<F>>())¶
-
void
LDL(AbstractDistMatrix<F> &A, AbstractDistMatrix<F> &dSub, AbstractDistMatrix<int> &p, bool conjugate = false, const LDLPivotCtrl<Base<F>> &ctrl = LDLPivotCtrl<Base<F>>())¶
C API¶
-
ElLDLPivotType¶ An enum for specifying the symmetric pivoting strategy. The current (not yet all supported) options include:
EL_BUNCH_KAUFMAN_AEL_BUNCH_KAUFMAN_C(not yet supported)EL_BUNCH_KAUFMAN_DEL_BUNCH_KAUFMAN_BOUNDED(not yet supported)EL_BUNCH_PARLETT
-
ElLDLPivotCtrl_s¶ -
ElLDLPivotType
pivotType¶
-
float
gamma¶
-
ElLDLPivotType
-
ElLDLPivotCtrl_d¶ -
ElLDLPivotType
pivotType¶
-
double
gamma¶
-
ElLDLPivotType
-
ElLDLPivot¶ -
Int
nb¶ Whether the pivot is 1x1 or 2x2.
-
Int from[2] The source indices of the row or rows to swap with for the 1x1 or 2x2 pivot.
-
Int
TODO:: Document expert versions
Python API¶
TODO: Document
Solving linear systems after factorization¶
C++ API¶
-
void
ldl::SolveAfter(const Matrix<F> &A, const Matrix<F> &dSub, const Matrix<int> &p, Matrix<F> &B, bool conjugated = false)¶
-
void
ldl::SolveAfter(const AbstractDistMatrix<F> &A, const AbstractDistMatrix<F> &dSub, const AbstractDistMatrix<int> &p, AbstractDistMatrix<F> &B, bool conjugated = false)¶
C API¶
-
ElError
ElSolveAfterLDLPiv_s(ElConstMatrix_s A, ElConstMatrix_s dSub, ElConstMatrix_i p, ElMatrix_s B)¶
-
ElError
ElSolveAfterLDLPiv_d(ElConstMatrix_d A, ElConstMatrix_d dSub, ElConstMatrix_i p, ElMatrix_d B)¶
-
ElError
ElSolveAfterLDLPiv_c(ElConstMatrix_c A, ElConstMatrix_c dSub, ElConstMatrix_i p, ElMatrix_c B, bool conjugate)¶
-
ElError
ElSolveAfterLDLPiv_z(ElConstMatrix_z A, ElConstMatrix_z dSub, ElConstMatrix_i p, ElMatrix_z B, bool conjugate)¶
-
ElError
ElSolveAfterLDLPivDist_s(ElConstDistMatrix_s A, ElConstDistMatrix_s dSub, ElConstDistMatrix_i p, ElDistMatrix_s B)¶
-
ElError
ElSolveAfterLDLPivDist_d(ElConstDistMatrix_d A, ElConstDistMatrix_d dSub, ElConstDistMatrix_i p, ElDistMatrix_d B)¶
Python API¶
TODO: Document
Multiply vectors after factorization¶
C++ API¶
-
void
ldl::MultiplyAfter(const Matrix<F> &A, const Matrix<F> &dSub, const Matrix<int> &p, Matrix<F> &B, bool conjugated = false)¶
-
void
ldl::MultiplyAfter(const AbstractDistMatrix<F> &A, const AbstractDistMatrix<F> &dSub, const AbstractDistMatrix<int> &p, AbstractDistMatrix<F> &B, bool conjugated = false)¶
C API¶
-
ElError
ElMultiplyAfterLDLPiv_s(ElConstMatrix_s A, ElConstMatrix_s dSub, ElConstMatrix_i p, ElMatrix_s B)¶
-
ElError
ElMultiplyAfterLDLPiv_d(ElConstMatrix_d A, ElConstMatrix_d dSub, ElConstMatrix_i p, ElMatrix_d B)¶
-
ElError
ElMultiplyAfterLDLPiv_c(ElConstMatrix_c A, ElConstMatrix_c dSub, ElConstMatrix_i p, ElMatrix_c B, bool conjugate)¶
-
ElError
ElMultiplyAfterLDLPiv_z(ElConstMatrix_z A, ElConstMatrix_z dSub, ElConstMatrix_i p, ElMatrix_z B, bool conjugate)¶
-
ElError
ElMultiplyAfterLDLPivDist_s(ElConstDistMatrix_s A, ElConstDistMatrix_s dSub, ElConstDistMatrix_i p, ElDistMatrix_s B)¶
-
ElError
ElMultiplyAfterLDLPivDist_d(ElConstDistMatrix_d A, ElConstDistMatrix_d dSub, ElConstDistMatrix_i p, ElDistMatrix_d B)¶
Computing inertia after factorization¶
C++ API¶
-
InertiaType
ldl::Inertia(const Matrix<Base<F>> &d, const Matrix<F> &dSub)¶
-
InertiaType
ldl::Inertia(const AbstractDistMatrix<Base<F>> &d, const AbstractDistMatrix<F> &dSub)¶
C API¶
-
ElError
ElInertiaAfterLDL_s(ElConstMatrix_s d, ElConstMatrix_s dSub, ElInertiaType* inertia)¶
-
ElError
ElInertiaAfterLDL_d(ElConstMatrix_d d, ElConstMatrix_d dSub, ElInertiaType* inertia)¶
-
ElError
ElInertiaAfterLDL_c(ElConstMatrix_s d, ElConstMatrix_c dSub, ElInertiaType* inertia)¶
-
ElError
ElInertiaAfterLDL_z(ElConstMatrix_d d, ElConstMatrix_z dSub, ElInertiaType* inertia)¶
-
ElError
ElInertiaAfterLDLDist_s(ElConstDistMatrix_s d, ElConstDistMatrix_s dSub, ElInertiaType* inertia)¶
-
ElError
ElInertiaAfterLDLDist_d(ElConstDistMatrix_d d, ElConstDistMatrix_d dSub, ElInertiaType* inertia)¶
-
ElError
ElInertiaAfterLDLDist_c(ElConstDistMatrix_s d, ElConstDistMatrix_c dSub, ElInertiaType* inertia)¶
-
ElError
ElInertiaAfterLDLDist_z(ElConstDistMatrix_d d, ElConstDistMatrix_z dSub, ElInertiaType* inertia)¶
No pivoting¶
Though Cholesky factorization is ideal for HPD matrices, unpivoted LDL
factorization naturally applies to a slightly larger, but harder to define,
class of matrices. Upon successful completion of the factorization,
a lower-triangular (with unit diagonal) \(L\) and diagonal matrix \(D\),
such that \(A = L D L^H\) or \(A = L D L^T\), will be returned in the
lower triangle of \(A\).
If a zero pivot is attempted, then a ZeroPivotException will
be thrown.
Factorization¶
Warning
Please use the following routines with caution, as pivoting should be employed in most cases.
C API¶
Solve linear systems after factorization¶
C++ API¶
-
void
ldl::SolveAfter(const AbstractDistMatrix<F> &A, AbstractDistMatrix<F> &B, bool conjugated = false)¶
C API¶
Multiply vectors after factorization¶
C++ API¶
-
void
ldl::MultiplyAfter(const AbstractDistMatrix<F> &A, AbstractDistMatrix<F> &B, bool conjugated = false)¶
