- java.lang.Object
-
- org.ojalgo.matrix.decomposition.AbstractDecomposition<java.lang.Double,R064Store>
-
- org.ojalgo.matrix.decomposition.SparseQDLDL
-
- All Implemented Interfaces:
LDL<java.lang.Double>,LDU<java.lang.Double>,MatrixDecomposition<java.lang.Double>,MatrixDecomposition.Determinant<java.lang.Double>,MatrixDecomposition.Hermitian<java.lang.Double>,MatrixDecomposition.Ordered<java.lang.Double>,MatrixDecomposition.Pivoting<java.lang.Double>,MatrixDecomposition.RankRevealing<java.lang.Double>,MatrixDecomposition.Solver<java.lang.Double>,Provider2D,Provider2D.Determinant<java.lang.Double>,Provider2D.Inverse<java.util.Optional<MatrixStore<java.lang.Double>>>,Provider2D.Rank,Provider2D.Solution<java.util.Optional<MatrixStore<java.lang.Double>>>,DeterminantTask<java.lang.Double>,InverterTask<java.lang.Double>,MatrixTask<java.lang.Double>,SolverTask<java.lang.Double>,InvertibleFactor<java.lang.Double>,Structure1D,Structure2D
public final class SparseQDLDL extends AbstractDecomposition<java.lang.Double,R064Store> implements LDL<java.lang.Double>
Quasi-Definite LDL (QDLDL) sparse decomposition.Reference: https://github.com/osqp/qdldl
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static classSparseQDLDL.EliminationTreeSymbolic elimination treeprivate static classSparseQDLDL.WorkerCache-
Nested classes/interfaces inherited from interface org.ojalgo.matrix.transformation.InvertibleFactor
InvertibleFactor.IdentityFactor<N extends java.lang.Comparable<N>>
-
Nested classes/interfaces inherited from interface org.ojalgo.matrix.decomposition.LDL
LDL.Factory<N extends java.lang.Comparable<N>>, LDL.ModifiedFactory<N extends java.lang.Comparable<N>>
-
Nested classes/interfaces inherited from interface org.ojalgo.matrix.decomposition.MatrixDecomposition
MatrixDecomposition.Determinant<N extends java.lang.Comparable<N>>, MatrixDecomposition.EconomySize<N extends java.lang.Comparable<N>>, MatrixDecomposition.Factory<D extends MatrixDecomposition<?>>, MatrixDecomposition.Hermitian<N extends java.lang.Comparable<N>>, MatrixDecomposition.Ordered<N extends java.lang.Comparable<N>>, MatrixDecomposition.Pivoting<N extends java.lang.Comparable<N>>, MatrixDecomposition.RankRevealing<N extends java.lang.Comparable<N>>, MatrixDecomposition.Solver<N extends java.lang.Comparable<N>>, MatrixDecomposition.Updatable<N extends java.lang.Comparable<N>>, MatrixDecomposition.Values<N extends java.lang.Comparable<N>>
-
Nested classes/interfaces inherited from interface org.ojalgo.matrix.Provider2D
Provider2D.Condition, Provider2D.Determinant<N extends java.lang.Comparable<N>>, Provider2D.Eigenpairs, Provider2D.Hermitian, Provider2D.Inverse<M>, Provider2D.Rank, Provider2D.Solution<M>, Provider2D.Symmetric, Provider2D.Trace<N extends java.lang.Comparable<N>>
-
Nested classes/interfaces inherited from interface org.ojalgo.structure.Structure1D
Structure1D.BasicMapper<T>, Structure1D.IndexMapper<T>, Structure1D.IntIndex, Structure1D.LongIndex, Structure1D.LoopCallback
-
Nested classes/interfaces inherited from interface org.ojalgo.structure.Structure2D
Structure2D.IntRowColumn, Structure2D.Logical<S extends Structure2D,B extends Structure2D.Logical<S,B>>, Structure2D.LongRowColumn, Structure2D.ReducibleTo1D<R extends Structure1D>, Structure2D.Reshapable, Structure2D.RowColumnKey<R,C>, Structure2D.RowColumnMapper<R,C>
-
-
Field Summary
Fields Modifier and Type Field Description private double[]myDprivate double[]myDinvprivate R064CSCmyLprivate intmyPositiveValuesInDprivate SparseQDLDL.WorkerCachemyWorkerCache-
Fields inherited from interface org.ojalgo.matrix.decomposition.MatrixDecomposition
TYPICAL
-
-
Constructor Summary
Constructors Constructor Description SparseQDLDL()
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description voidbtran(double[] arg)voidbtran(PhysicalStore<java.lang.Double> arg)Backwards-transformationjava.lang.DoublecalculateDeterminant(Access2D<?> matrix)protected booleancheckSolvability()private static SparseQDLDL.EliminationTreecomputeEliminationTree(int n, int[] pointers, int[] indices)SparseQDLDL.EliminationTreecomputeEliminationTree(R064CSC matrix)intcountSignificant(double threshold)private booleandecompose(R064CSC matrix, SparseQDLDL.EliminationTree eTree, R064CSC decomp, double[] D, double[] Dinv, SparseQDLDL.WorkerCache workers)In this method, variable names are deliberately kept close to what they are in the original c-code.booleandecompose(Access2D.Collectable<java.lang.Double,? super TransformableRegion<java.lang.Double>> matrix)booleanfactor(R064CSC matrix)Requirements on the input matrix and summary of the factorisation semantics: Square. Symmetric, with only the upper/right triangle stored.booleanfactor(R064CSC matrix, SparseQDLDL.EliminationTree eTree)Convenience for callers that have already computed the symbolic structure for a given sparsity pattern.voidftran(double[] x)Solve A x = b in-place for one column/vector x.voidftran(PhysicalStore<java.lang.Double> arg)Forward-transformationprivate static voidftranD(double[] inv, double[] x)private static voidftranL(int[] pointers, int[] indices, double[] values, double[] x)private static voidftranU(int[] pointers, int[] indices, double[] values, double[] x)intgetColDim()MatrixStore<java.lang.Double>getD()java.lang.DoublegetDeterminant()Determinant of the factorised matrix.MatrixStore<java.lang.Double>getInverse(PhysicalStore<java.lang.Double> preallocated)Implementing this method is optional.MatrixStore<java.lang.Double>getL()Must implement eitherLDL.getL()orLDL.getR().int[]getPivotOrder()doublegetRankThreshold()int[]getReversePivotOrder()intgetRowDim()MatrixStore<java.lang.Double>getSolution(Access2D.Collectable<java.lang.Double,? super PhysicalStore<java.lang.Double>> rhs, PhysicalStore<java.lang.Double> preallocated)Implementing this method is optional.MatrixStore<java.lang.Double>invert(Access2D<?> original, PhysicalStore<java.lang.Double> preallocated)Exactly how (if at all) a specific implementation makes use ofpreallocatedis not specified by this interface.booleanisPivoted()booleanisSolvable()Please note that producing a pseudoinverse and/or a least squares solution is ok! The return value, of this method, is not an indication of if the decomposed matrix is square, has full rank, is postive definite or whatever.PhysicalStore<java.lang.Double>preallocate(int nbEquations, int nbVariables, int nbSolutions)double[]solve(double[] b)Solve A x = bMatrixStore<java.lang.Double>solve(Access2D<?> body, Access2D<?> rhs, PhysicalStore<java.lang.Double> preallocated)Exactly how (if at all) a specific implementation makes use ofpreallocatedis not specified by this interface.-
Methods inherited from class org.ojalgo.matrix.decomposition.AbstractDecomposition
aggregator, applyPivotOrder, applyReverseOrder, collect, computed, copyColumn, copyRow, function, getDimensionalEpsilon, isAspectRatioNormal, isComputed, makeArray, makeDiagonal, makeEye, makeHouseholder, makeIdentity, makeRotation, makeRotation, makeZero, makeZero, reset, scalar, wrap
-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from interface org.ojalgo.matrix.task.InverterTask
invert, preallocate
-
Methods inherited from interface org.ojalgo.matrix.decomposition.LDL
getR, reconstruct
-
Methods inherited from interface org.ojalgo.matrix.decomposition.MatrixDecomposition
isComputed, reset
-
Methods inherited from interface org.ojalgo.matrix.decomposition.MatrixDecomposition.Determinant
toDeterminantProvider
-
Methods inherited from interface org.ojalgo.matrix.decomposition.MatrixDecomposition.Hermitian
checkAndDecompose
-
Methods inherited from interface org.ojalgo.matrix.decomposition.MatrixDecomposition.Pivoting
decomposeWithoutPivoting
-
Methods inherited from interface org.ojalgo.matrix.decomposition.MatrixDecomposition.RankRevealing
getRank, isFullRank
-
Methods inherited from interface org.ojalgo.matrix.decomposition.MatrixDecomposition.Solver
compute, getInverse, getSolution, invert, preallocate, solve, toInverseProvider, toSolutionProvider
-
Methods inherited from interface org.ojalgo.matrix.task.SolverTask
preallocate, solve
-
Methods inherited from interface org.ojalgo.structure.Structure2D
count, countColumns, countRows, firstInColumn, firstInRow, getMaxDim, getMinDim, isEmpty, isFat, isScalar, isSquare, isTall, isVector, limitOfColumn, limitOfRow, size
-
-
-
-
Field Detail
-
myD
private double[] myD
-
myDinv
private double[] myDinv
-
myL
private R064CSC myL
-
myPositiveValuesInD
private int myPositiveValuesInD
-
myWorkerCache
private final SparseQDLDL.WorkerCache myWorkerCache
-
-
Method Detail
-
computeEliminationTree
private static SparseQDLDL.EliminationTree computeEliminationTree(int n, int[] pointers, int[] indices)
-
ftranD
private static void ftranD(double[] inv, double[] x)
-
ftranL
private static void ftranL(int[] pointers, int[] indices, double[] values, double[] x)
-
ftranU
private static void ftranU(int[] pointers, int[] indices, double[] values, double[] x)
-
btran
public void btran(double[] arg)
- Specified by:
btranin interfaceInvertibleFactor<java.lang.Double>- See Also:
InvertibleFactor.IdentityFactor.btran(PhysicalStore)
-
btran
public void btran(PhysicalStore<java.lang.Double> arg)
Description copied from interface:InvertibleFactorBackwards-transformationSolve [x]T[A] = [b]T (equivalent to [A]T[x] = [b]) by transforming [b] into [x] in-place.
- Specified by:
btranin interfaceInvertibleFactor<java.lang.Double>- Parameters:
arg- [b] transformed into [x]
-
calculateDeterminant
public java.lang.Double calculateDeterminant(Access2D<?> matrix)
- Specified by:
calculateDeterminantin interfaceDeterminantTask<java.lang.Double>
-
computeEliminationTree
public SparseQDLDL.EliminationTree computeEliminationTree(R064CSC matrix)
-
countSignificant
public int countSignificant(double threshold)
- Specified by:
countSignificantin interfaceMatrixDecomposition.RankRevealing<java.lang.Double>- Parameters:
threshold- Significance limit- Returns:
- The number of elements in the diagonal matrix that are greater than the threshold
-
decompose
public boolean decompose(Access2D.Collectable<java.lang.Double,? super TransformableRegion<java.lang.Double>> matrix)
- Specified by:
decomposein interfaceMatrixDecomposition<java.lang.Double>- Parameters:
matrix- A matrix to decompose- Returns:
- true if decomposition suceeded; false if not
-
factor
public boolean factor(R064CSC matrix)
Requirements on the input matrix and summary of the factorisation semantics:- Square.
- Symmetric, with only the upper/right triangle stored. The lower/left triangle is not ignored; any explicitly stored non-zero entries there will cause the symbolic phase to fail.
- Sparse (not strictly required, but this implementation is optimised for sparse structure).
- Quasi-definite for a fully solvable system: during factorisation the diagonal entries D[i] are
classified relative to a small, scale-dependent tolerance derived from the largest |D[i]| seen so far
and the dimensional epsilon. All D[i] must be classified as positive for
isSolvable()to returntrue.
isSolvable() == falseand are not suitable for use as quasi-definite systems when solving or inverting.This method performs both the symbolic analysis (elimination tree) and numeric factorisation. For repeated factorisations with identical sparsity patterns and updated values, callers may instead use
factor(R064CSC, EliminationTree)together with a cached symbolic tree obtained from#getSymbolic().
-
factor
public boolean factor(R064CSC matrix, SparseQDLDL.EliminationTree eTree)
Convenience for callers that have already computed the symbolic structure for a given sparsity pattern. The caller is responsible for ensuring that the suppliedSparseQDLDL.EliminationTreematches the pattern ofmatrix; behaviour is undefined if they do not.
-
ftran
public void ftran(double[] x)
Solve A x = b in-place for one column/vector x. Initially x holds b, on exit x holds the solution.- Specified by:
ftranin interfaceInvertibleFactor<java.lang.Double>- See Also:
InvertibleFactor.IdentityFactor.ftran(PhysicalStore)
-
ftran
public void ftran(PhysicalStore<java.lang.Double> arg)
Description copied from interface:InvertibleFactorForward-transformationSolve [A][x] = [b] by transforming [b] into [x] in-place.
- Specified by:
ftranin interfaceInvertibleFactor<java.lang.Double>- Parameters:
arg- [b] transformed into [x]
-
getColDim
public int getColDim()
- Specified by:
getColDimin interfaceStructure2D- Returns:
- The number of columns
-
getD
public MatrixStore<java.lang.Double> getD()
-
getDeterminant
public java.lang.Double getDeterminant()
Determinant of the factorised matrix.With no pivoting the determinant is computed as the product of the diagonal entries of D returned by the LDL factorisation. For a quasi-definite input (all diagonal entries classified as positive according to the internal tolerance)
isSolvable()istrueand the determinant is strictly positive. For general symmetric or indefinite inputs the determinant may be negative or close to zero and should be interpreted with care. If the factorisation has not been computed this method returns NaN.- Specified by:
getDeterminantin interfaceMatrixDecomposition.Determinant<java.lang.Double>- Specified by:
getDeterminantin interfaceProvider2D.Determinant<java.lang.Double>- Returns:
- The matrix' determinant
-
getInverse
public MatrixStore<java.lang.Double> getInverse(PhysicalStore<java.lang.Double> preallocated)
Description copied from interface:MatrixDecomposition.SolverImplementing this method is optional.
Exactly how a specific implementation makes use of
preallocatedis not specified by this interface. It must be documented for each implementation.Should produce the same results as calling
MatrixDecomposition.Solver.getInverse().- Specified by:
getInversein interfaceMatrixDecomposition.Solver<java.lang.Double>- Parameters:
preallocated- Preallocated memory for the results, possibly some intermediate results. You must assume this is modified, but you cannot assume it will contain the full/final/correct solution. UseMatrixDecomposition.Solver.preallocate(int, int)orInverterTask.preallocate(Structure2D)to get a suitable instance.- Returns:
- The inverse, this is where you get the solution
-
getL
public MatrixStore<java.lang.Double> getL()
Description copied from interface:LDLMust implement eitherLDL.getL()orLDL.getR().
-
getPivotOrder
public int[] getPivotOrder()
- Specified by:
getPivotOrderin interfaceMatrixDecomposition.Pivoting<java.lang.Double>- Returns:
- The pivot (row and/or columnn) order
-
getRankThreshold
public double getRankThreshold()
- Specified by:
getRankThresholdin interfaceMatrixDecomposition.RankRevealing<java.lang.Double>
-
getReversePivotOrder
public int[] getReversePivotOrder()
- Specified by:
getReversePivotOrderin interfaceMatrixDecomposition.Pivoting<java.lang.Double>
-
getRowDim
public int getRowDim()
- Specified by:
getRowDimin interfaceStructure2D- Returns:
- The number of rows
-
getSolution
public MatrixStore<java.lang.Double> getSolution(Access2D.Collectable<java.lang.Double,? super PhysicalStore<java.lang.Double>> rhs, PhysicalStore<java.lang.Double> preallocated)
Description copied from interface:MatrixDecomposition.SolverImplementing this method is optional.
Exactly how a specific implementation makes use of
preallocatedis not specified by this interface. It must be documented for each implementation.Should produce the same results as calling
MatrixDecomposition.Solver.getSolution(Collectable).- Specified by:
getSolutionin interfaceMatrixDecomposition.Solver<java.lang.Double>- Parameters:
rhs- The Right Hand Side, wont be modfiedpreallocated- Preallocated memory for the results, possibly some intermediate results. You must assume this is modified, but you cannot assume it will contain the full/final/correct solution. UseSolverTask.preallocate(int, int, int)orSolverTask.preallocate(Structure2D, Structure2D)to get a suitable instance.- Returns:
- The solution
-
invert
public MatrixStore<java.lang.Double> invert(Access2D<?> original, PhysicalStore<java.lang.Double> preallocated) throws RecoverableCondition
Description copied from interface:InverterTaskExactly how (if at all) a specific implementation makes use of
preallocatedis not specified by this interface. It must be documented for each implementation.Should produce the same results as calling
InverterTask.invert(Access2D).Use
InverterTask.preallocate(Structure2D)to obtain a suitbalepreallocated.- Specified by:
invertin interfaceInverterTask<java.lang.Double>preallocated- Preallocated memory for the results, possibly some intermediate results. You must assume this is modified, but you cannot assume it will contain the full/final/correct solution.- Returns:
- The inverse
- Throws:
RecoverableCondition- TODO
-
isPivoted
public boolean isPivoted()
- Specified by:
isPivotedin interfaceMatrixDecomposition.Pivoting<java.lang.Double>- Returns:
- true if any pivoting was actually done
-
isSolvable
public boolean isSolvable()
Description copied from interface:MatrixDecomposition.SolverPlease note that producing a pseudoinverse and/or a least squares solution is ok! The return value, of this method, is not an indication of if the decomposed matrix is square, has full rank, is postive definite or whatever. It's that in combination with the specific decomposition algorithm's capabilities.- Specified by:
isSolvablein interfaceMatrixDecomposition.Solver<java.lang.Double>- Overrides:
isSolvablein classAbstractDecomposition<java.lang.Double,R064Store>- Returns:
- true if this matrix decomposition is in a state to be able to deliver an inverse or an equation system solution (with some degree of numerical stability).
-
preallocate
public PhysicalStore<java.lang.Double> preallocate(int nbEquations, int nbVariables, int nbSolutions)
- Specified by:
preallocatein interfaceSolverTask<java.lang.Double>
-
solve
public MatrixStore<java.lang.Double> solve(Access2D<?> body, Access2D<?> rhs, PhysicalStore<java.lang.Double> preallocated) throws RecoverableCondition
Description copied from interface:SolverTaskExactly how (if at all) a specific implementation makes use of
preallocatedis not specified by this interface. It must be documented for each implementation.Should produce the same results as calling
SolverTask.solve(Access2D, Access2D).Use
SolverTask.preallocate(Structure2D, Structure2D)to obtain a suitbalepreallocated.- Specified by:
solvein interfaceSolverTask<java.lang.Double>rhs- The Right Hand Side, wont be modfiedpreallocated- Preallocated memory for the results, possibly some intermediate results. You must assume this is modified, but you cannot assume it will contain the full/ /correct solution.- Returns:
- The solution
- Throws:
RecoverableCondition
-
solve
public double[] solve(double[] b)
Solve A x = b
-
decompose
private boolean decompose(R064CSC matrix, SparseQDLDL.EliminationTree eTree, R064CSC decomp, double[] D, double[] Dinv, SparseQDLDL.WorkerCache workers)
In this method, variable names are deliberately kept close to what they are in the original c-code.
-
checkSolvability
protected boolean checkSolvability()
- Overrides:
checkSolvabilityin classAbstractDecomposition<java.lang.Double,R064Store>
-
-