@smake/eigen 1.0.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/eigen/COPYING.APACHE +203 -0
- package/eigen/COPYING.BSD +1 -1
- package/eigen/COPYING.MINPACK +51 -52
- package/eigen/Eigen/Cholesky +0 -1
- package/eigen/Eigen/Core +108 -266
- package/eigen/Eigen/Eigenvalues +0 -1
- package/eigen/Eigen/Geometry +3 -6
- package/eigen/Eigen/Householder +0 -1
- package/eigen/Eigen/Jacobi +0 -1
- package/eigen/Eigen/KLUSupport +41 -0
- package/eigen/Eigen/LU +2 -5
- package/eigen/Eigen/OrderingMethods +0 -3
- package/eigen/Eigen/PaStiXSupport +1 -0
- package/eigen/Eigen/PardisoSupport +0 -0
- package/eigen/Eigen/QR +0 -1
- package/eigen/Eigen/QtAlignedMalloc +0 -1
- package/eigen/Eigen/SVD +0 -1
- package/eigen/Eigen/Sparse +0 -2
- package/eigen/Eigen/SparseCholesky +0 -8
- package/eigen/Eigen/SparseLU +4 -0
- package/eigen/Eigen/src/Cholesky/LDLT.h +42 -27
- package/eigen/Eigen/src/Cholesky/LLT.h +39 -23
- package/eigen/Eigen/src/CholmodSupport/CholmodSupport.h +90 -47
- package/eigen/Eigen/src/Core/ArithmeticSequence.h +413 -0
- package/eigen/Eigen/src/Core/Array.h +99 -11
- package/eigen/Eigen/src/Core/ArrayBase.h +1 -1
- package/eigen/Eigen/src/Core/ArrayWrapper.h +21 -21
- package/eigen/Eigen/src/Core/Assign.h +1 -1
- package/eigen/Eigen/src/Core/AssignEvaluator.h +125 -50
- package/eigen/Eigen/src/Core/Assign_MKL.h +10 -10
- package/eigen/Eigen/src/Core/BandMatrix.h +16 -16
- package/eigen/Eigen/src/Core/Block.h +56 -60
- package/eigen/Eigen/src/Core/BooleanRedux.h +29 -31
- package/eigen/Eigen/src/Core/CommaInitializer.h +7 -3
- package/eigen/Eigen/src/Core/CoreEvaluators.h +325 -272
- package/eigen/Eigen/src/Core/CoreIterators.h +5 -0
- package/eigen/Eigen/src/Core/CwiseBinaryOp.h +21 -22
- package/eigen/Eigen/src/Core/CwiseNullaryOp.h +153 -18
- package/eigen/Eigen/src/Core/CwiseUnaryOp.h +6 -6
- package/eigen/Eigen/src/Core/CwiseUnaryView.h +12 -10
- package/eigen/Eigen/src/Core/DenseBase.h +128 -39
- package/eigen/Eigen/src/Core/DenseCoeffsBase.h +25 -21
- package/eigen/Eigen/src/Core/DenseStorage.h +150 -68
- package/eigen/Eigen/src/Core/Diagonal.h +21 -23
- package/eigen/Eigen/src/Core/DiagonalMatrix.h +50 -2
- package/eigen/Eigen/src/Core/DiagonalProduct.h +1 -1
- package/eigen/Eigen/src/Core/Dot.h +10 -10
- package/eigen/Eigen/src/Core/EigenBase.h +10 -9
- package/eigen/Eigen/src/Core/ForceAlignedAccess.h +8 -4
- package/eigen/Eigen/src/Core/Fuzzy.h +3 -3
- package/eigen/Eigen/src/Core/GeneralProduct.h +20 -10
- package/eigen/Eigen/src/Core/GenericPacketMath.h +597 -147
- package/eigen/Eigen/src/Core/GlobalFunctions.h +40 -33
- package/eigen/Eigen/src/Core/IO.h +40 -7
- package/eigen/Eigen/src/Core/IndexedView.h +237 -0
- package/eigen/Eigen/src/Core/Inverse.h +9 -10
- package/eigen/Eigen/src/Core/Map.h +7 -7
- package/eigen/Eigen/src/Core/MapBase.h +5 -3
- package/eigen/Eigen/src/Core/MathFunctions.h +756 -120
- package/eigen/Eigen/src/Core/MathFunctionsImpl.h +118 -19
- package/eigen/Eigen/src/Core/Matrix.h +131 -25
- package/eigen/Eigen/src/Core/MatrixBase.h +19 -2
- package/eigen/Eigen/src/Core/NestByValue.h +25 -50
- package/eigen/Eigen/src/Core/NoAlias.h +4 -3
- package/eigen/Eigen/src/Core/NumTraits.h +107 -20
- package/eigen/Eigen/src/Core/PartialReduxEvaluator.h +232 -0
- package/eigen/Eigen/src/Core/PermutationMatrix.h +3 -3
- package/eigen/Eigen/src/Core/PlainObjectBase.h +145 -54
- package/eigen/Eigen/src/Core/Product.h +30 -25
- package/eigen/Eigen/src/Core/ProductEvaluators.h +183 -142
- package/eigen/Eigen/src/Core/Random.h +37 -1
- package/eigen/Eigen/src/Core/Redux.h +180 -170
- package/eigen/Eigen/src/Core/Ref.h +118 -21
- package/eigen/Eigen/src/Core/Replicate.h +8 -8
- package/eigen/Eigen/src/Core/Reshaped.h +454 -0
- package/eigen/Eigen/src/Core/ReturnByValue.h +7 -5
- package/eigen/Eigen/src/Core/Reverse.h +18 -12
- package/eigen/Eigen/src/Core/Select.h +8 -6
- package/eigen/Eigen/src/Core/SelfAdjointView.h +33 -20
- package/eigen/Eigen/src/Core/Solve.h +14 -14
- package/eigen/Eigen/src/Core/SolveTriangular.h +13 -13
- package/eigen/Eigen/src/Core/SolverBase.h +41 -3
- package/eigen/Eigen/src/Core/StableNorm.h +100 -70
- package/eigen/Eigen/src/Core/StlIterators.h +463 -0
- package/eigen/Eigen/src/Core/Stride.h +9 -4
- package/eigen/Eigen/src/Core/Swap.h +5 -4
- package/eigen/Eigen/src/Core/Transpose.h +86 -27
- package/eigen/Eigen/src/Core/Transpositions.h +26 -8
- package/eigen/Eigen/src/Core/TriangularMatrix.h +88 -72
- package/eigen/Eigen/src/Core/VectorBlock.h +5 -5
- package/eigen/Eigen/src/Core/VectorwiseOp.h +159 -70
- package/eigen/Eigen/src/Core/Visitor.h +137 -29
- package/eigen/Eigen/src/Core/arch/AVX/Complex.h +50 -129
- package/eigen/Eigen/src/Core/arch/AVX/MathFunctions.h +126 -337
- package/eigen/Eigen/src/Core/arch/AVX/PacketMath.h +1092 -155
- package/eigen/Eigen/src/Core/arch/AVX/TypeCasting.h +65 -1
- package/eigen/Eigen/src/Core/arch/AVX512/Complex.h +422 -0
- package/eigen/Eigen/src/Core/arch/AVX512/MathFunctions.h +186 -213
- package/eigen/Eigen/src/Core/arch/AVX512/PacketMath.h +1250 -252
- package/eigen/Eigen/src/Core/arch/AVX512/TypeCasting.h +89 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/Complex.h +152 -165
- package/eigen/Eigen/src/Core/arch/AltiVec/MathFunctions.h +19 -251
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProduct.h +2937 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h +221 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductMMA.h +629 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/PacketMath.h +2042 -392
- package/eigen/Eigen/src/Core/arch/CUDA/Complex.h +235 -80
- package/eigen/Eigen/src/Core/arch/Default/BFloat16.h +700 -0
- package/eigen/Eigen/src/Core/arch/Default/ConjHelper.h +102 -14
- package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h +1649 -0
- package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h +110 -0
- package/eigen/Eigen/src/Core/arch/Default/Half.h +942 -0
- package/eigen/Eigen/src/Core/arch/Default/Settings.h +1 -1
- package/eigen/Eigen/src/Core/arch/Default/TypeCasting.h +120 -0
- package/eigen/Eigen/src/Core/arch/{CUDA → GPU}/MathFunctions.h +16 -4
- package/eigen/Eigen/src/Core/arch/GPU/PacketMath.h +1685 -0
- package/eigen/Eigen/src/Core/arch/GPU/TypeCasting.h +80 -0
- package/eigen/Eigen/src/Core/arch/HIP/hcc/math_constants.h +23 -0
- package/eigen/Eigen/src/Core/arch/MSA/Complex.h +648 -0
- package/eigen/Eigen/src/Core/arch/MSA/MathFunctions.h +387 -0
- package/eigen/Eigen/src/Core/arch/MSA/PacketMath.h +1233 -0
- package/eigen/Eigen/src/Core/arch/NEON/Complex.h +313 -219
- package/eigen/Eigen/src/Core/arch/NEON/GeneralBlockPanelKernel.h +183 -0
- package/eigen/Eigen/src/Core/arch/NEON/MathFunctions.h +54 -70
- package/eigen/Eigen/src/Core/arch/NEON/PacketMath.h +4376 -549
- package/eigen/Eigen/src/Core/arch/NEON/TypeCasting.h +1419 -0
- package/eigen/Eigen/src/Core/arch/SSE/Complex.h +59 -179
- package/eigen/Eigen/src/Core/arch/SSE/MathFunctions.h +65 -428
- package/eigen/Eigen/src/Core/arch/SSE/PacketMath.h +893 -283
- package/eigen/Eigen/src/Core/arch/SSE/TypeCasting.h +65 -0
- package/eigen/Eigen/src/Core/arch/SVE/MathFunctions.h +44 -0
- package/eigen/Eigen/src/Core/arch/SVE/PacketMath.h +752 -0
- package/eigen/Eigen/src/Core/arch/SVE/TypeCasting.h +49 -0
- package/eigen/Eigen/src/Core/arch/SYCL/InteropHeaders.h +232 -0
- package/eigen/Eigen/src/Core/arch/SYCL/MathFunctions.h +301 -0
- package/eigen/Eigen/src/Core/arch/SYCL/PacketMath.h +670 -0
- package/eigen/Eigen/src/Core/arch/SYCL/SyclMemoryModel.h +694 -0
- package/eigen/Eigen/src/Core/arch/SYCL/TypeCasting.h +85 -0
- package/eigen/Eigen/src/Core/arch/ZVector/Complex.h +212 -183
- package/eigen/Eigen/src/Core/arch/ZVector/MathFunctions.h +101 -5
- package/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h +510 -395
- package/eigen/Eigen/src/Core/functors/AssignmentFunctors.h +11 -2
- package/eigen/Eigen/src/Core/functors/BinaryFunctors.h +112 -46
- package/eigen/Eigen/src/Core/functors/NullaryFunctors.h +31 -30
- package/eigen/Eigen/src/Core/functors/StlFunctors.h +32 -2
- package/eigen/Eigen/src/Core/functors/UnaryFunctors.h +354 -15
- package/eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h +1073 -585
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix.h +29 -7
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +4 -4
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h +1 -1
- package/eigen/Eigen/src/Core/products/GeneralMatrixVector.h +382 -483
- package/eigen/Eigen/src/Core/products/Parallelizer.h +23 -9
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +23 -6
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixVector.h +8 -6
- package/eigen/Eigen/src/Core/products/SelfadjointProduct.h +2 -2
- package/eigen/Eigen/src/Core/products/SelfadjointRank2Update.h +5 -4
- package/eigen/Eigen/src/Core/products/TriangularMatrixMatrix.h +3 -3
- package/eigen/Eigen/src/Core/products/TriangularSolverMatrix.h +5 -3
- package/eigen/Eigen/src/Core/products/TriangularSolverVector.h +13 -10
- package/eigen/Eigen/src/Core/util/BlasUtil.h +208 -124
- package/eigen/Eigen/src/Core/util/ConfigureVectorization.h +512 -0
- package/eigen/Eigen/src/Core/util/Constants.h +25 -9
- package/eigen/Eigen/src/Core/util/DisableStupidWarnings.h +14 -2
- package/eigen/Eigen/src/Core/util/ForwardDeclarations.h +28 -4
- package/eigen/Eigen/src/Core/util/IndexedViewHelper.h +186 -0
- package/eigen/Eigen/src/Core/util/IntegralConstant.h +272 -0
- package/eigen/Eigen/src/Core/util/MKL_support.h +8 -1
- package/eigen/Eigen/src/Core/util/Macros.h +661 -250
- package/eigen/Eigen/src/Core/util/Memory.h +222 -52
- package/eigen/Eigen/src/Core/util/Meta.h +349 -105
- package/eigen/Eigen/src/Core/util/ReshapedHelper.h +51 -0
- package/eigen/Eigen/src/Core/util/StaticAssert.h +8 -5
- package/eigen/Eigen/src/Core/util/SymbolicIndex.h +293 -0
- package/eigen/Eigen/src/Core/util/XprHelper.h +48 -30
- package/eigen/Eigen/src/Eigenvalues/ComplexEigenSolver.h +1 -1
- package/eigen/Eigen/src/Eigenvalues/ComplexSchur.h +1 -1
- package/eigen/Eigen/src/Eigenvalues/EigenSolver.h +2 -2
- package/eigen/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h +1 -1
- package/eigen/Eigen/src/Eigenvalues/HessenbergDecomposition.h +2 -2
- package/eigen/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h +2 -2
- package/eigen/Eigen/src/Eigenvalues/RealQZ.h +9 -6
- package/eigen/Eigen/src/Eigenvalues/RealSchur.h +10 -5
- package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +75 -42
- package/eigen/Eigen/src/Eigenvalues/Tridiagonalization.h +20 -15
- package/eigen/Eigen/src/Geometry/AlignedBox.h +99 -5
- package/eigen/Eigen/src/Geometry/AngleAxis.h +4 -4
- package/eigen/Eigen/src/Geometry/EulerAngles.h +3 -3
- package/eigen/Eigen/src/Geometry/Homogeneous.h +15 -11
- package/eigen/Eigen/src/Geometry/Hyperplane.h +1 -1
- package/eigen/Eigen/src/Geometry/OrthoMethods.h +3 -2
- package/eigen/Eigen/src/Geometry/ParametrizedLine.h +39 -2
- package/eigen/Eigen/src/Geometry/Quaternion.h +52 -14
- package/eigen/Eigen/src/Geometry/Rotation2D.h +3 -3
- package/eigen/Eigen/src/Geometry/Scaling.h +22 -4
- package/eigen/Eigen/src/Geometry/Transform.h +86 -65
- package/eigen/Eigen/src/Geometry/Translation.h +6 -6
- package/eigen/Eigen/src/Geometry/arch/Geometry_SIMD.h +168 -0
- package/eigen/Eigen/src/Householder/BlockHouseholder.h +9 -2
- package/eigen/Eigen/src/Householder/Householder.h +8 -4
- package/eigen/Eigen/src/Householder/HouseholderSequence.h +123 -48
- package/eigen/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +15 -15
- package/eigen/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +7 -23
- package/eigen/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +5 -22
- package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h +41 -47
- package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h +51 -60
- package/eigen/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +70 -20
- package/eigen/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h +2 -20
- package/eigen/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h +11 -9
- package/eigen/Eigen/src/Jacobi/Jacobi.h +31 -10
- package/eigen/Eigen/src/KLUSupport/KLUSupport.h +358 -0
- package/eigen/Eigen/src/LU/Determinant.h +35 -19
- package/eigen/Eigen/src/LU/FullPivLU.h +29 -43
- package/eigen/Eigen/src/LU/InverseImpl.h +25 -8
- package/eigen/Eigen/src/LU/PartialPivLU.h +67 -57
- package/eigen/Eigen/src/LU/arch/InverseSize4.h +351 -0
- package/eigen/Eigen/src/OrderingMethods/Amd.h +7 -17
- package/eigen/Eigen/src/OrderingMethods/Eigen_Colamd.h +297 -277
- package/eigen/Eigen/src/OrderingMethods/Ordering.h +6 -10
- package/eigen/Eigen/src/PaStiXSupport/PaStiXSupport.h +1 -1
- package/eigen/Eigen/src/PardisoSupport/PardisoSupport.h +10 -9
- package/eigen/Eigen/src/QR/ColPivHouseholderQR.h +41 -20
- package/eigen/Eigen/src/QR/CompleteOrthogonalDecomposition.h +100 -27
- package/eigen/Eigen/src/QR/FullPivHouseholderQR.h +59 -22
- package/eigen/Eigen/src/QR/HouseholderQR.h +48 -23
- package/eigen/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h +25 -3
- package/eigen/Eigen/src/SVD/BDCSVD.h +137 -48
- package/eigen/Eigen/src/SVD/JacobiSVD.h +22 -14
- package/eigen/Eigen/src/SVD/SVDBase.h +82 -21
- package/eigen/Eigen/src/SVD/UpperBidiagonalization.h +3 -3
- package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky.h +16 -8
- package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h +11 -36
- package/eigen/Eigen/src/SparseCore/CompressedStorage.h +16 -0
- package/eigen/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h +6 -6
- package/eigen/Eigen/src/SparseCore/SparseAssign.h +81 -27
- package/eigen/Eigen/src/SparseCore/SparseBlock.h +25 -57
- package/eigen/Eigen/src/SparseCore/SparseCompressedBase.h +40 -11
- package/eigen/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +11 -15
- package/eigen/Eigen/src/SparseCore/SparseCwiseUnaryOp.h +2 -2
- package/eigen/Eigen/src/SparseCore/SparseDenseProduct.h +30 -8
- package/eigen/Eigen/src/SparseCore/SparseMatrix.h +124 -10
- package/eigen/Eigen/src/SparseCore/SparseMatrixBase.h +5 -12
- package/eigen/Eigen/src/SparseCore/SparseProduct.h +13 -1
- package/eigen/Eigen/src/SparseCore/SparseRef.h +7 -7
- package/eigen/Eigen/src/SparseCore/SparseSelfAdjointView.h +3 -0
- package/eigen/Eigen/src/SparseCore/SparseUtil.h +8 -0
- package/eigen/Eigen/src/SparseCore/SparseVector.h +1 -1
- package/eigen/Eigen/src/SparseLU/SparseLU.h +160 -10
- package/eigen/Eigen/src/SparseLU/SparseLU_Memory.h +1 -1
- package/eigen/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h +76 -2
- package/eigen/Eigen/src/SparseLU/SparseLU_column_dfs.h +2 -2
- package/eigen/Eigen/src/SparseLU/SparseLU_gemm_kernel.h +1 -1
- package/eigen/Eigen/src/SparseLU/SparseLU_panel_bmod.h +1 -1
- package/eigen/Eigen/src/SparseQR/SparseQR.h +19 -6
- package/eigen/Eigen/src/StlSupport/StdDeque.h +2 -14
- package/eigen/Eigen/src/StlSupport/StdList.h +2 -2
- package/eigen/Eigen/src/StlSupport/StdVector.h +2 -2
- package/eigen/Eigen/src/SuperLUSupport/SuperLUSupport.h +6 -8
- package/eigen/Eigen/src/UmfPackSupport/UmfPackSupport.h +175 -39
- package/eigen/Eigen/src/misc/lapacke.h +5 -4
- package/eigen/Eigen/src/plugins/ArrayCwiseBinaryOps.h +27 -1
- package/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.h +155 -11
- package/eigen/Eigen/src/plugins/BlockMethods.h +626 -242
- package/eigen/Eigen/src/plugins/CommonCwiseUnaryOps.h +14 -0
- package/eigen/Eigen/src/plugins/IndexedViewMethods.h +262 -0
- package/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.h +4 -4
- package/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.h +10 -0
- package/eigen/Eigen/src/plugins/ReshapedMethods.h +149 -0
- package/eigen/README.md +2 -0
- package/lib/LibEigen.d.ts +4 -0
- package/lib/LibEigen.js +14 -0
- package/lib/index.d.ts +1 -1
- package/lib/index.js +7 -3
- package/package.json +2 -10
- package/eigen/Eigen/CMakeLists.txt +0 -19
- package/eigen/Eigen/src/Core/arch/CUDA/Half.h +0 -675
- package/eigen/Eigen/src/Core/arch/CUDA/PacketMath.h +0 -333
- package/eigen/Eigen/src/Core/arch/CUDA/PacketMathHalf.h +0 -1124
- package/eigen/Eigen/src/Core/arch/CUDA/TypeCasting.h +0 -212
- package/eigen/Eigen/src/Geometry/arch/Geometry_SSE.h +0 -161
- package/eigen/Eigen/src/LU/arch/Inverse_SSE.h +0 -338
- package/lib/eigen.d.ts +0 -2
- package/lib/eigen.js +0 -15
package/eigen/Eigen/SparseLU
CHANGED
|
@@ -23,6 +23,8 @@
|
|
|
23
23
|
// Ordering interface
|
|
24
24
|
#include "OrderingMethods"
|
|
25
25
|
|
|
26
|
+
#include "src/Core/util/DisableStupidWarnings.h"
|
|
27
|
+
|
|
26
28
|
#include "src/SparseLU/SparseLU_gemm_kernel.h"
|
|
27
29
|
|
|
28
30
|
#include "src/SparseLU/SparseLU_Structs.h"
|
|
@@ -43,4 +45,6 @@
|
|
|
43
45
|
#include "src/SparseLU/SparseLU_Utils.h"
|
|
44
46
|
#include "src/SparseLU/SparseLU.h"
|
|
45
47
|
|
|
48
|
+
#include "src/Core/util/ReenableStupidWarnings.h"
|
|
49
|
+
|
|
46
50
|
#endif // EIGEN_SPARSELU_MODULE_H
|
|
@@ -16,6 +16,15 @@
|
|
|
16
16
|
namespace Eigen {
|
|
17
17
|
|
|
18
18
|
namespace internal {
|
|
19
|
+
template<typename _MatrixType, int _UpLo> struct traits<LDLT<_MatrixType, _UpLo> >
|
|
20
|
+
: traits<_MatrixType>
|
|
21
|
+
{
|
|
22
|
+
typedef MatrixXpr XprKind;
|
|
23
|
+
typedef SolverStorage StorageKind;
|
|
24
|
+
typedef int StorageIndex;
|
|
25
|
+
enum { Flags = 0 };
|
|
26
|
+
};
|
|
27
|
+
|
|
19
28
|
template<typename MatrixType, int UpLo> struct LDLT_Traits;
|
|
20
29
|
|
|
21
30
|
// PositiveSemiDef means positive semi-definite and non-zero; same for NegativeSemiDef
|
|
@@ -36,7 +45,7 @@ namespace internal {
|
|
|
36
45
|
* matrix \f$ A \f$ such that \f$ A = P^TLDL^*P \f$, where P is a permutation matrix, L
|
|
37
46
|
* is lower triangular with a unit diagonal and D is a diagonal matrix.
|
|
38
47
|
*
|
|
39
|
-
* The decomposition uses pivoting to ensure stability, so that
|
|
48
|
+
* The decomposition uses pivoting to ensure stability, so that D will have
|
|
40
49
|
* zeros in the bottom right rank(A) - n submatrix. Avoiding the square root
|
|
41
50
|
* on D also stabilizes the computation.
|
|
42
51
|
*
|
|
@@ -44,24 +53,23 @@ namespace internal {
|
|
|
44
53
|
* decomposition to determine whether a system of equations has a solution.
|
|
45
54
|
*
|
|
46
55
|
* This class supports the \link InplaceDecomposition inplace decomposition \endlink mechanism.
|
|
47
|
-
*
|
|
56
|
+
*
|
|
48
57
|
* \sa MatrixBase::ldlt(), SelfAdjointView::ldlt(), class LLT
|
|
49
58
|
*/
|
|
50
59
|
template<typename _MatrixType, int _UpLo> class LDLT
|
|
60
|
+
: public SolverBase<LDLT<_MatrixType, _UpLo> >
|
|
51
61
|
{
|
|
52
62
|
public:
|
|
53
63
|
typedef _MatrixType MatrixType;
|
|
64
|
+
typedef SolverBase<LDLT> Base;
|
|
65
|
+
friend class SolverBase<LDLT>;
|
|
66
|
+
|
|
67
|
+
EIGEN_GENERIC_PUBLIC_INTERFACE(LDLT)
|
|
54
68
|
enum {
|
|
55
|
-
RowsAtCompileTime = MatrixType::RowsAtCompileTime,
|
|
56
|
-
ColsAtCompileTime = MatrixType::ColsAtCompileTime,
|
|
57
69
|
MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
|
|
58
70
|
MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime,
|
|
59
71
|
UpLo = _UpLo
|
|
60
72
|
};
|
|
61
|
-
typedef typename MatrixType::Scalar Scalar;
|
|
62
|
-
typedef typename NumTraits<typename MatrixType::Scalar>::Real RealScalar;
|
|
63
|
-
typedef Eigen::Index Index; ///< \deprecated since Eigen 3.3
|
|
64
|
-
typedef typename MatrixType::StorageIndex StorageIndex;
|
|
65
73
|
typedef Matrix<Scalar, RowsAtCompileTime, 1, 0, MaxRowsAtCompileTime, 1> TmpMatrixType;
|
|
66
74
|
|
|
67
75
|
typedef Transpositions<RowsAtCompileTime, MaxRowsAtCompileTime> TranspositionType;
|
|
@@ -180,6 +188,7 @@ template<typename _MatrixType, int _UpLo> class LDLT
|
|
|
180
188
|
return m_sign == internal::NegativeSemiDef || m_sign == internal::ZeroSign;
|
|
181
189
|
}
|
|
182
190
|
|
|
191
|
+
#ifdef EIGEN_PARSED_BY_DOXYGEN
|
|
183
192
|
/** \returns a solution x of \f$ A x = b \f$ using the current decomposition of A.
|
|
184
193
|
*
|
|
185
194
|
* This function also supports in-place solves using the syntax <tt>x = decompositionObject.solve(x)</tt> .
|
|
@@ -191,19 +200,14 @@ template<typename _MatrixType, int _UpLo> class LDLT
|
|
|
191
200
|
* \f$ L^* y_4 = y_3 \f$ and \f$ P x = y_4 \f$ in succession. If the matrix \f$ A \f$ is singular, then
|
|
192
201
|
* \f$ D \f$ will also be singular (all the other matrices are invertible). In that case, the
|
|
193
202
|
* least-square solution of \f$ D y_3 = y_2 \f$ is computed. This does not mean that this function
|
|
194
|
-
* computes the least-square solution of \f$ A x = b \f$
|
|
203
|
+
* computes the least-square solution of \f$ A x = b \f$ if \f$ A \f$ is singular.
|
|
195
204
|
*
|
|
196
205
|
* \sa MatrixBase::ldlt(), SelfAdjointView::ldlt()
|
|
197
206
|
*/
|
|
198
207
|
template<typename Rhs>
|
|
199
208
|
inline const Solve<LDLT, Rhs>
|
|
200
|
-
solve(const MatrixBase<Rhs>& b) const
|
|
201
|
-
|
|
202
|
-
eigen_assert(m_isInitialized && "LDLT is not initialized.");
|
|
203
|
-
eigen_assert(m_matrix.rows()==b.rows()
|
|
204
|
-
&& "LDLT::solve(): invalid number of rows of the right hand side matrix b");
|
|
205
|
-
return Solve<LDLT, Rhs>(*this, b.derived());
|
|
206
|
-
}
|
|
209
|
+
solve(const MatrixBase<Rhs>& b) const;
|
|
210
|
+
#endif
|
|
207
211
|
|
|
208
212
|
template<typename Derived>
|
|
209
213
|
bool solveInPlace(MatrixBase<Derived> &bAndX) const;
|
|
@@ -242,12 +246,12 @@ template<typename _MatrixType, int _UpLo> class LDLT
|
|
|
242
246
|
*/
|
|
243
247
|
const LDLT& adjoint() const { return *this; };
|
|
244
248
|
|
|
245
|
-
inline Index rows() const { return m_matrix.rows(); }
|
|
246
|
-
inline Index cols() const { return m_matrix.cols(); }
|
|
249
|
+
EIGEN_DEVICE_FUNC inline EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT { return m_matrix.rows(); }
|
|
250
|
+
EIGEN_DEVICE_FUNC inline EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT { return m_matrix.cols(); }
|
|
247
251
|
|
|
248
252
|
/** \brief Reports whether previous computation was successful.
|
|
249
253
|
*
|
|
250
|
-
* \returns \c Success if computation was
|
|
254
|
+
* \returns \c Success if computation was successful,
|
|
251
255
|
* \c NumericalIssue if the factorization failed because of a zero pivot.
|
|
252
256
|
*/
|
|
253
257
|
ComputationInfo info() const
|
|
@@ -258,8 +262,10 @@ template<typename _MatrixType, int _UpLo> class LDLT
|
|
|
258
262
|
|
|
259
263
|
#ifndef EIGEN_PARSED_BY_DOXYGEN
|
|
260
264
|
template<typename RhsType, typename DstType>
|
|
261
|
-
EIGEN_DEVICE_FUNC
|
|
262
265
|
void _solve_impl(const RhsType &rhs, DstType &dst) const;
|
|
266
|
+
|
|
267
|
+
template<bool Conjugate, typename RhsType, typename DstType>
|
|
268
|
+
void _solve_impl_transposed(const RhsType &rhs, DstType &dst) const;
|
|
263
269
|
#endif
|
|
264
270
|
|
|
265
271
|
protected:
|
|
@@ -560,14 +566,22 @@ template<typename _MatrixType, int _UpLo>
|
|
|
560
566
|
template<typename RhsType, typename DstType>
|
|
561
567
|
void LDLT<_MatrixType,_UpLo>::_solve_impl(const RhsType &rhs, DstType &dst) const
|
|
562
568
|
{
|
|
563
|
-
|
|
569
|
+
_solve_impl_transposed<true>(rhs, dst);
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
template<typename _MatrixType,int _UpLo>
|
|
573
|
+
template<bool Conjugate, typename RhsType, typename DstType>
|
|
574
|
+
void LDLT<_MatrixType,_UpLo>::_solve_impl_transposed(const RhsType &rhs, DstType &dst) const
|
|
575
|
+
{
|
|
564
576
|
// dst = P b
|
|
565
577
|
dst = m_transpositions * rhs;
|
|
566
578
|
|
|
567
579
|
// dst = L^-1 (P b)
|
|
568
|
-
|
|
580
|
+
// dst = L^-*T (P b)
|
|
581
|
+
matrixL().template conjugateIf<!Conjugate>().solveInPlace(dst);
|
|
569
582
|
|
|
570
|
-
// dst = D
|
|
583
|
+
// dst = D^-* (L^-1 P b)
|
|
584
|
+
// dst = D^-1 (L^-*T P b)
|
|
571
585
|
// more precisely, use pseudo-inverse of D (see bug 241)
|
|
572
586
|
using std::abs;
|
|
573
587
|
const typename Diagonal<const MatrixType>::RealReturnType vecD(vectorD());
|
|
@@ -579,7 +593,6 @@ void LDLT<_MatrixType,_UpLo>::_solve_impl(const RhsType &rhs, DstType &dst) cons
|
|
|
579
593
|
// Moreover, Lapack's xSYTRS routines use 0 for the tolerance.
|
|
580
594
|
// Using numeric_limits::min() gives us more robustness to denormals.
|
|
581
595
|
RealScalar tolerance = (std::numeric_limits<RealScalar>::min)();
|
|
582
|
-
|
|
583
596
|
for (Index i = 0; i < vecD.size(); ++i)
|
|
584
597
|
{
|
|
585
598
|
if(abs(vecD(i)) > tolerance)
|
|
@@ -588,10 +601,12 @@ void LDLT<_MatrixType,_UpLo>::_solve_impl(const RhsType &rhs, DstType &dst) cons
|
|
|
588
601
|
dst.row(i).setZero();
|
|
589
602
|
}
|
|
590
603
|
|
|
591
|
-
// dst = L
|
|
592
|
-
|
|
604
|
+
// dst = L^-* (D^-* L^-1 P b)
|
|
605
|
+
// dst = L^-T (D^-1 L^-*T P b)
|
|
606
|
+
matrixL().transpose().template conjugateIf<Conjugate>().solveInPlace(dst);
|
|
593
607
|
|
|
594
|
-
// dst = P
|
|
608
|
+
// dst = P^T (L^-* D^-* L^-1 P b) = A^-1 b
|
|
609
|
+
// dst = P^-T (L^-T D^-1 L^-*T P b) = A^-1 b
|
|
595
610
|
dst = m_transpositions.transpose() * dst;
|
|
596
611
|
}
|
|
597
612
|
#endif
|
|
@@ -13,6 +13,16 @@
|
|
|
13
13
|
namespace Eigen {
|
|
14
14
|
|
|
15
15
|
namespace internal{
|
|
16
|
+
|
|
17
|
+
template<typename _MatrixType, int _UpLo> struct traits<LLT<_MatrixType, _UpLo> >
|
|
18
|
+
: traits<_MatrixType>
|
|
19
|
+
{
|
|
20
|
+
typedef MatrixXpr XprKind;
|
|
21
|
+
typedef SolverStorage StorageKind;
|
|
22
|
+
typedef int StorageIndex;
|
|
23
|
+
enum { Flags = 0 };
|
|
24
|
+
};
|
|
25
|
+
|
|
16
26
|
template<typename MatrixType, int UpLo> struct LLT_Traits;
|
|
17
27
|
}
|
|
18
28
|
|
|
@@ -54,18 +64,17 @@ template<typename MatrixType, int UpLo> struct LLT_Traits;
|
|
|
54
64
|
* \sa MatrixBase::llt(), SelfAdjointView::llt(), class LDLT
|
|
55
65
|
*/
|
|
56
66
|
template<typename _MatrixType, int _UpLo> class LLT
|
|
67
|
+
: public SolverBase<LLT<_MatrixType, _UpLo> >
|
|
57
68
|
{
|
|
58
69
|
public:
|
|
59
70
|
typedef _MatrixType MatrixType;
|
|
71
|
+
typedef SolverBase<LLT> Base;
|
|
72
|
+
friend class SolverBase<LLT>;
|
|
73
|
+
|
|
74
|
+
EIGEN_GENERIC_PUBLIC_INTERFACE(LLT)
|
|
60
75
|
enum {
|
|
61
|
-
RowsAtCompileTime = MatrixType::RowsAtCompileTime,
|
|
62
|
-
ColsAtCompileTime = MatrixType::ColsAtCompileTime,
|
|
63
76
|
MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
|
|
64
77
|
};
|
|
65
|
-
typedef typename MatrixType::Scalar Scalar;
|
|
66
|
-
typedef typename NumTraits<typename MatrixType::Scalar>::Real RealScalar;
|
|
67
|
-
typedef Eigen::Index Index; ///< \deprecated since Eigen 3.3
|
|
68
|
-
typedef typename MatrixType::StorageIndex StorageIndex;
|
|
69
78
|
|
|
70
79
|
enum {
|
|
71
80
|
PacketSize = internal::packet_traits<Scalar>::size,
|
|
@@ -100,7 +109,7 @@ template<typename _MatrixType, int _UpLo> class LLT
|
|
|
100
109
|
compute(matrix.derived());
|
|
101
110
|
}
|
|
102
111
|
|
|
103
|
-
/** \brief Constructs a
|
|
112
|
+
/** \brief Constructs a LLT factorization from a given matrix
|
|
104
113
|
*
|
|
105
114
|
* This overloaded constructor is provided for \link InplaceDecomposition inplace decomposition \endlink when
|
|
106
115
|
* \c MatrixType is a Eigen::Ref.
|
|
@@ -129,6 +138,7 @@ template<typename _MatrixType, int _UpLo> class LLT
|
|
|
129
138
|
return Traits::getL(m_matrix);
|
|
130
139
|
}
|
|
131
140
|
|
|
141
|
+
#ifdef EIGEN_PARSED_BY_DOXYGEN
|
|
132
142
|
/** \returns the solution x of \f$ A x = b \f$ using the current decomposition of A.
|
|
133
143
|
*
|
|
134
144
|
* Since this LLT class assumes anyway that the matrix A is invertible, the solution
|
|
@@ -141,13 +151,8 @@ template<typename _MatrixType, int _UpLo> class LLT
|
|
|
141
151
|
*/
|
|
142
152
|
template<typename Rhs>
|
|
143
153
|
inline const Solve<LLT, Rhs>
|
|
144
|
-
solve(const MatrixBase<Rhs>& b) const
|
|
145
|
-
|
|
146
|
-
eigen_assert(m_isInitialized && "LLT is not initialized.");
|
|
147
|
-
eigen_assert(m_matrix.rows()==b.rows()
|
|
148
|
-
&& "LLT::solve(): invalid number of rows of the right hand side matrix b");
|
|
149
|
-
return Solve<LLT, Rhs>(*this, b.derived());
|
|
150
|
-
}
|
|
154
|
+
solve(const MatrixBase<Rhs>& b) const;
|
|
155
|
+
#endif
|
|
151
156
|
|
|
152
157
|
template<typename Derived>
|
|
153
158
|
void solveInPlace(const MatrixBase<Derived> &bAndX) const;
|
|
@@ -180,7 +185,7 @@ template<typename _MatrixType, int _UpLo> class LLT
|
|
|
180
185
|
|
|
181
186
|
/** \brief Reports whether previous computation was successful.
|
|
182
187
|
*
|
|
183
|
-
* \returns \c Success if computation was
|
|
188
|
+
* \returns \c Success if computation was successful,
|
|
184
189
|
* \c NumericalIssue if the matrix.appears not to be positive definite.
|
|
185
190
|
*/
|
|
186
191
|
ComputationInfo info() const
|
|
@@ -194,18 +199,20 @@ template<typename _MatrixType, int _UpLo> class LLT
|
|
|
194
199
|
* This method is provided for compatibility with other matrix decompositions, thus enabling generic code such as:
|
|
195
200
|
* \code x = decomposition.adjoint().solve(b) \endcode
|
|
196
201
|
*/
|
|
197
|
-
const LLT& adjoint() const { return *this; };
|
|
202
|
+
const LLT& adjoint() const EIGEN_NOEXCEPT { return *this; };
|
|
198
203
|
|
|
199
|
-
inline Index rows() const { return m_matrix.rows(); }
|
|
200
|
-
inline Index cols() const { return m_matrix.cols(); }
|
|
204
|
+
inline EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT { return m_matrix.rows(); }
|
|
205
|
+
inline EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT { return m_matrix.cols(); }
|
|
201
206
|
|
|
202
207
|
template<typename VectorType>
|
|
203
|
-
LLT rankUpdate(const VectorType& vec, const RealScalar& sigma = 1);
|
|
208
|
+
LLT & rankUpdate(const VectorType& vec, const RealScalar& sigma = 1);
|
|
204
209
|
|
|
205
210
|
#ifndef EIGEN_PARSED_BY_DOXYGEN
|
|
206
211
|
template<typename RhsType, typename DstType>
|
|
207
|
-
EIGEN_DEVICE_FUNC
|
|
208
212
|
void _solve_impl(const RhsType &rhs, DstType &dst) const;
|
|
213
|
+
|
|
214
|
+
template<bool Conjugate, typename RhsType, typename DstType>
|
|
215
|
+
void _solve_impl_transposed(const RhsType &rhs, DstType &dst) const;
|
|
209
216
|
#endif
|
|
210
217
|
|
|
211
218
|
protected:
|
|
@@ -459,7 +466,7 @@ LLT<MatrixType,_UpLo>& LLT<MatrixType,_UpLo>::compute(const EigenBase<InputType>
|
|
|
459
466
|
*/
|
|
460
467
|
template<typename _MatrixType, int _UpLo>
|
|
461
468
|
template<typename VectorType>
|
|
462
|
-
LLT<_MatrixType,_UpLo> LLT<_MatrixType,_UpLo>::rankUpdate(const VectorType& v, const RealScalar& sigma)
|
|
469
|
+
LLT<_MatrixType,_UpLo> & LLT<_MatrixType,_UpLo>::rankUpdate(const VectorType& v, const RealScalar& sigma)
|
|
463
470
|
{
|
|
464
471
|
EIGEN_STATIC_ASSERT_VECTOR_ONLY(VectorType);
|
|
465
472
|
eigen_assert(v.size()==m_matrix.cols());
|
|
@@ -477,8 +484,17 @@ template<typename _MatrixType,int _UpLo>
|
|
|
477
484
|
template<typename RhsType, typename DstType>
|
|
478
485
|
void LLT<_MatrixType,_UpLo>::_solve_impl(const RhsType &rhs, DstType &dst) const
|
|
479
486
|
{
|
|
480
|
-
dst
|
|
481
|
-
|
|
487
|
+
_solve_impl_transposed<true>(rhs, dst);
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
template<typename _MatrixType,int _UpLo>
|
|
491
|
+
template<bool Conjugate, typename RhsType, typename DstType>
|
|
492
|
+
void LLT<_MatrixType,_UpLo>::_solve_impl_transposed(const RhsType &rhs, DstType &dst) const
|
|
493
|
+
{
|
|
494
|
+
dst = rhs;
|
|
495
|
+
|
|
496
|
+
matrixL().template conjugateIf<!Conjugate>().solveInPlace(dst);
|
|
497
|
+
matrixU().template conjugateIf<!Conjugate>().solveInPlace(dst);
|
|
482
498
|
}
|
|
483
499
|
#endif
|
|
484
500
|
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
#ifndef EIGEN_CHOLMODSUPPORT_H
|
|
11
11
|
#define EIGEN_CHOLMODSUPPORT_H
|
|
12
12
|
|
|
13
|
-
namespace Eigen {
|
|
13
|
+
namespace Eigen {
|
|
14
14
|
|
|
15
15
|
namespace internal {
|
|
16
16
|
|
|
@@ -32,7 +32,7 @@ template<> struct cholmod_configure_matrix<std::complex<double> > {
|
|
|
32
32
|
}
|
|
33
33
|
};
|
|
34
34
|
|
|
35
|
-
// Other scalar types are not yet
|
|
35
|
+
// Other scalar types are not yet supported by Cholmod
|
|
36
36
|
// template<> struct cholmod_configure_matrix<float> {
|
|
37
37
|
// template<typename CholmodType>
|
|
38
38
|
// static void run(CholmodType& mat) {
|
|
@@ -79,12 +79,12 @@ cholmod_sparse viewAsCholmod(Ref<SparseMatrix<_Scalar,_Options,_StorageIndex> >
|
|
|
79
79
|
|
|
80
80
|
res.dtype = 0;
|
|
81
81
|
res.stype = -1;
|
|
82
|
-
|
|
82
|
+
|
|
83
83
|
if (internal::is_same<_StorageIndex,int>::value)
|
|
84
84
|
{
|
|
85
85
|
res.itype = CHOLMOD_INT;
|
|
86
86
|
}
|
|
87
|
-
else if (internal::is_same<_StorageIndex,
|
|
87
|
+
else if (internal::is_same<_StorageIndex,SuiteSparse_long>::value)
|
|
88
88
|
{
|
|
89
89
|
res.itype = CHOLMOD_LONG;
|
|
90
90
|
}
|
|
@@ -95,9 +95,9 @@ cholmod_sparse viewAsCholmod(Ref<SparseMatrix<_Scalar,_Options,_StorageIndex> >
|
|
|
95
95
|
|
|
96
96
|
// setup res.xtype
|
|
97
97
|
internal::cholmod_configure_matrix<_Scalar>::run(res);
|
|
98
|
-
|
|
98
|
+
|
|
99
99
|
res.stype = 0;
|
|
100
|
-
|
|
100
|
+
|
|
101
101
|
return res;
|
|
102
102
|
}
|
|
103
103
|
|
|
@@ -121,9 +121,12 @@ template<typename _Scalar, int _Options, typename _Index, unsigned int UpLo>
|
|
|
121
121
|
cholmod_sparse viewAsCholmod(const SparseSelfAdjointView<const SparseMatrix<_Scalar,_Options,_Index>, UpLo>& mat)
|
|
122
122
|
{
|
|
123
123
|
cholmod_sparse res = viewAsCholmod(Ref<SparseMatrix<_Scalar,_Options,_Index> >(mat.matrix().const_cast_derived()));
|
|
124
|
-
|
|
124
|
+
|
|
125
125
|
if(UpLo==Upper) res.stype = 1;
|
|
126
126
|
if(UpLo==Lower) res.stype = -1;
|
|
127
|
+
// swap stype for rowmajor matrices (only works for real matrices)
|
|
128
|
+
EIGEN_STATIC_ASSERT((_Options & RowMajorBit) == 0 || NumTraits<_Scalar>::IsComplex == 0, THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES);
|
|
129
|
+
if(_Options & RowMajorBit) res.stype *=-1;
|
|
127
130
|
|
|
128
131
|
return res;
|
|
129
132
|
}
|
|
@@ -159,6 +162,44 @@ MappedSparseMatrix<Scalar,Flags,StorageIndex> viewAsEigen(cholmod_sparse& cm)
|
|
|
159
162
|
static_cast<StorageIndex*>(cm.p), static_cast<StorageIndex*>(cm.i),static_cast<Scalar*>(cm.x) );
|
|
160
163
|
}
|
|
161
164
|
|
|
165
|
+
namespace internal {
|
|
166
|
+
|
|
167
|
+
// template specializations for int and long that call the correct cholmod method
|
|
168
|
+
|
|
169
|
+
#define EIGEN_CHOLMOD_SPECIALIZE0(ret, name) \
|
|
170
|
+
template<typename _StorageIndex> inline ret cm_ ## name (cholmod_common &Common) { return cholmod_ ## name (&Common); } \
|
|
171
|
+
template<> inline ret cm_ ## name<SuiteSparse_long> (cholmod_common &Common) { return cholmod_l_ ## name (&Common); }
|
|
172
|
+
|
|
173
|
+
#define EIGEN_CHOLMOD_SPECIALIZE1(ret, name, t1, a1) \
|
|
174
|
+
template<typename _StorageIndex> inline ret cm_ ## name (t1& a1, cholmod_common &Common) { return cholmod_ ## name (&a1, &Common); } \
|
|
175
|
+
template<> inline ret cm_ ## name<SuiteSparse_long> (t1& a1, cholmod_common &Common) { return cholmod_l_ ## name (&a1, &Common); }
|
|
176
|
+
|
|
177
|
+
EIGEN_CHOLMOD_SPECIALIZE0(int, start)
|
|
178
|
+
EIGEN_CHOLMOD_SPECIALIZE0(int, finish)
|
|
179
|
+
|
|
180
|
+
EIGEN_CHOLMOD_SPECIALIZE1(int, free_factor, cholmod_factor*, L)
|
|
181
|
+
EIGEN_CHOLMOD_SPECIALIZE1(int, free_dense, cholmod_dense*, X)
|
|
182
|
+
EIGEN_CHOLMOD_SPECIALIZE1(int, free_sparse, cholmod_sparse*, A)
|
|
183
|
+
|
|
184
|
+
EIGEN_CHOLMOD_SPECIALIZE1(cholmod_factor*, analyze, cholmod_sparse, A)
|
|
185
|
+
|
|
186
|
+
template<typename _StorageIndex> inline cholmod_dense* cm_solve (int sys, cholmod_factor& L, cholmod_dense& B, cholmod_common &Common) { return cholmod_solve (sys, &L, &B, &Common); }
|
|
187
|
+
template<> inline cholmod_dense* cm_solve<SuiteSparse_long> (int sys, cholmod_factor& L, cholmod_dense& B, cholmod_common &Common) { return cholmod_l_solve (sys, &L, &B, &Common); }
|
|
188
|
+
|
|
189
|
+
template<typename _StorageIndex> inline cholmod_sparse* cm_spsolve (int sys, cholmod_factor& L, cholmod_sparse& B, cholmod_common &Common) { return cholmod_spsolve (sys, &L, &B, &Common); }
|
|
190
|
+
template<> inline cholmod_sparse* cm_spsolve<SuiteSparse_long> (int sys, cholmod_factor& L, cholmod_sparse& B, cholmod_common &Common) { return cholmod_l_spsolve (sys, &L, &B, &Common); }
|
|
191
|
+
|
|
192
|
+
template<typename _StorageIndex>
|
|
193
|
+
inline int cm_factorize_p (cholmod_sparse* A, double beta[2], _StorageIndex* fset, std::size_t fsize, cholmod_factor* L, cholmod_common &Common) { return cholmod_factorize_p (A, beta, fset, fsize, L, &Common); }
|
|
194
|
+
template<>
|
|
195
|
+
inline int cm_factorize_p<SuiteSparse_long> (cholmod_sparse* A, double beta[2], SuiteSparse_long* fset, std::size_t fsize, cholmod_factor* L, cholmod_common &Common) { return cholmod_l_factorize_p (A, beta, fset, fsize, L, &Common); }
|
|
196
|
+
|
|
197
|
+
#undef EIGEN_CHOLMOD_SPECIALIZE0
|
|
198
|
+
#undef EIGEN_CHOLMOD_SPECIALIZE1
|
|
199
|
+
|
|
200
|
+
} // namespace internal
|
|
201
|
+
|
|
202
|
+
|
|
162
203
|
enum CholmodMode {
|
|
163
204
|
CholmodAuto, CholmodSimplicialLLt, CholmodSupernodalLLt, CholmodLDLt
|
|
164
205
|
};
|
|
@@ -195,7 +236,7 @@ class CholmodBase : public SparseSolverBase<Derived>
|
|
|
195
236
|
{
|
|
196
237
|
EIGEN_STATIC_ASSERT((internal::is_same<double,RealScalar>::value), CHOLMOD_SUPPORTS_DOUBLE_PRECISION_ONLY);
|
|
197
238
|
m_shiftOffset[0] = m_shiftOffset[1] = 0.0;
|
|
198
|
-
|
|
239
|
+
internal::cm_start<StorageIndex>(m_cholmod);
|
|
199
240
|
}
|
|
200
241
|
|
|
201
242
|
explicit CholmodBase(const MatrixType& matrix)
|
|
@@ -203,23 +244,23 @@ class CholmodBase : public SparseSolverBase<Derived>
|
|
|
203
244
|
{
|
|
204
245
|
EIGEN_STATIC_ASSERT((internal::is_same<double,RealScalar>::value), CHOLMOD_SUPPORTS_DOUBLE_PRECISION_ONLY);
|
|
205
246
|
m_shiftOffset[0] = m_shiftOffset[1] = 0.0;
|
|
206
|
-
|
|
247
|
+
internal::cm_start<StorageIndex>(m_cholmod);
|
|
207
248
|
compute(matrix);
|
|
208
249
|
}
|
|
209
250
|
|
|
210
251
|
~CholmodBase()
|
|
211
252
|
{
|
|
212
253
|
if(m_cholmodFactor)
|
|
213
|
-
|
|
214
|
-
|
|
254
|
+
internal::cm_free_factor<StorageIndex>(m_cholmodFactor, m_cholmod);
|
|
255
|
+
internal::cm_finish<StorageIndex>(m_cholmod);
|
|
215
256
|
}
|
|
216
|
-
|
|
257
|
+
|
|
217
258
|
inline StorageIndex cols() const { return internal::convert_index<StorageIndex, Index>(m_cholmodFactor->n); }
|
|
218
259
|
inline StorageIndex rows() const { return internal::convert_index<StorageIndex, Index>(m_cholmodFactor->n); }
|
|
219
|
-
|
|
260
|
+
|
|
220
261
|
/** \brief Reports whether previous computation was successful.
|
|
221
262
|
*
|
|
222
|
-
* \returns \c Success if computation was
|
|
263
|
+
* \returns \c Success if computation was successful,
|
|
223
264
|
* \c NumericalIssue if the matrix.appears to be negative.
|
|
224
265
|
*/
|
|
225
266
|
ComputationInfo info() const
|
|
@@ -235,29 +276,29 @@ class CholmodBase : public SparseSolverBase<Derived>
|
|
|
235
276
|
factorize(matrix);
|
|
236
277
|
return derived();
|
|
237
278
|
}
|
|
238
|
-
|
|
279
|
+
|
|
239
280
|
/** Performs a symbolic decomposition on the sparsity pattern of \a matrix.
|
|
240
281
|
*
|
|
241
282
|
* This function is particularly useful when solving for several problems having the same structure.
|
|
242
|
-
*
|
|
283
|
+
*
|
|
243
284
|
* \sa factorize()
|
|
244
285
|
*/
|
|
245
286
|
void analyzePattern(const MatrixType& matrix)
|
|
246
287
|
{
|
|
247
288
|
if(m_cholmodFactor)
|
|
248
289
|
{
|
|
249
|
-
|
|
290
|
+
internal::cm_free_factor<StorageIndex>(m_cholmodFactor, m_cholmod);
|
|
250
291
|
m_cholmodFactor = 0;
|
|
251
292
|
}
|
|
252
293
|
cholmod_sparse A = viewAsCholmod(matrix.template selfadjointView<UpLo>());
|
|
253
|
-
m_cholmodFactor =
|
|
254
|
-
|
|
294
|
+
m_cholmodFactor = internal::cm_analyze<StorageIndex>(A, m_cholmod);
|
|
295
|
+
|
|
255
296
|
this->m_isInitialized = true;
|
|
256
297
|
this->m_info = Success;
|
|
257
298
|
m_analysisIsOk = true;
|
|
258
299
|
m_factorizationIsOk = false;
|
|
259
300
|
}
|
|
260
|
-
|
|
301
|
+
|
|
261
302
|
/** Performs a numeric decomposition of \a matrix
|
|
262
303
|
*
|
|
263
304
|
* The given matrix must have the same sparsity pattern as the matrix on which the symbolic decomposition has been performed.
|
|
@@ -268,17 +309,17 @@ class CholmodBase : public SparseSolverBase<Derived>
|
|
|
268
309
|
{
|
|
269
310
|
eigen_assert(m_analysisIsOk && "You must first call analyzePattern()");
|
|
270
311
|
cholmod_sparse A = viewAsCholmod(matrix.template selfadjointView<UpLo>());
|
|
271
|
-
|
|
312
|
+
internal::cm_factorize_p<StorageIndex>(&A, m_shiftOffset, 0, 0, m_cholmodFactor, m_cholmod);
|
|
272
313
|
|
|
273
314
|
// If the factorization failed, minor is the column at which it did. On success minor == n.
|
|
274
315
|
this->m_info = (m_cholmodFactor->minor == m_cholmodFactor->n ? Success : NumericalIssue);
|
|
275
316
|
m_factorizationIsOk = true;
|
|
276
317
|
}
|
|
277
|
-
|
|
318
|
+
|
|
278
319
|
/** Returns a reference to the Cholmod's configuration structure to get a full control over the performed operations.
|
|
279
320
|
* See the Cholmod user guide for details. */
|
|
280
321
|
cholmod_common& cholmod() { return m_cholmod; }
|
|
281
|
-
|
|
322
|
+
|
|
282
323
|
#ifndef EIGEN_PARSED_BY_DOXYGEN
|
|
283
324
|
/** \internal */
|
|
284
325
|
template<typename Rhs,typename Dest>
|
|
@@ -288,22 +329,23 @@ class CholmodBase : public SparseSolverBase<Derived>
|
|
|
288
329
|
const Index size = m_cholmodFactor->n;
|
|
289
330
|
EIGEN_UNUSED_VARIABLE(size);
|
|
290
331
|
eigen_assert(size==b.rows());
|
|
291
|
-
|
|
292
|
-
// Cholmod needs column-major
|
|
332
|
+
|
|
333
|
+
// Cholmod needs column-major storage without inner-stride, which corresponds to the default behavior of Ref.
|
|
293
334
|
Ref<const Matrix<typename Rhs::Scalar,Dynamic,Dynamic,ColMajor> > b_ref(b.derived());
|
|
294
335
|
|
|
295
336
|
cholmod_dense b_cd = viewAsCholmod(b_ref);
|
|
296
|
-
cholmod_dense* x_cd =
|
|
337
|
+
cholmod_dense* x_cd = internal::cm_solve<StorageIndex>(CHOLMOD_A, *m_cholmodFactor, b_cd, m_cholmod);
|
|
297
338
|
if(!x_cd)
|
|
298
339
|
{
|
|
299
340
|
this->m_info = NumericalIssue;
|
|
300
341
|
return;
|
|
301
342
|
}
|
|
302
343
|
// TODO optimize this copy by swapping when possible (be careful with alignment, etc.)
|
|
344
|
+
// NOTE Actually, the copy can be avoided by calling cholmod_solve2 instead of cholmod_solve
|
|
303
345
|
dest = Matrix<Scalar,Dest::RowsAtCompileTime,Dest::ColsAtCompileTime>::Map(reinterpret_cast<Scalar*>(x_cd->x),b.rows(),b.cols());
|
|
304
|
-
|
|
346
|
+
internal::cm_free_dense<StorageIndex>(x_cd, m_cholmod);
|
|
305
347
|
}
|
|
306
|
-
|
|
348
|
+
|
|
307
349
|
/** \internal */
|
|
308
350
|
template<typename RhsDerived, typename DestDerived>
|
|
309
351
|
void _solve_impl(const SparseMatrixBase<RhsDerived> &b, SparseMatrixBase<DestDerived> &dest) const
|
|
@@ -316,19 +358,20 @@ class CholmodBase : public SparseSolverBase<Derived>
|
|
|
316
358
|
// note: cs stands for Cholmod Sparse
|
|
317
359
|
Ref<SparseMatrix<typename RhsDerived::Scalar,ColMajor,typename RhsDerived::StorageIndex> > b_ref(b.const_cast_derived());
|
|
318
360
|
cholmod_sparse b_cs = viewAsCholmod(b_ref);
|
|
319
|
-
cholmod_sparse* x_cs =
|
|
361
|
+
cholmod_sparse* x_cs = internal::cm_spsolve<StorageIndex>(CHOLMOD_A, *m_cholmodFactor, b_cs, m_cholmod);
|
|
320
362
|
if(!x_cs)
|
|
321
363
|
{
|
|
322
364
|
this->m_info = NumericalIssue;
|
|
323
365
|
return;
|
|
324
366
|
}
|
|
325
367
|
// TODO optimize this copy by swapping when possible (be careful with alignment, etc.)
|
|
368
|
+
// NOTE cholmod_spsolve in fact just calls the dense solver for blocks of 4 columns at a time (similar to Eigen's sparse solver)
|
|
326
369
|
dest.derived() = viewAsEigen<typename DestDerived::Scalar,ColMajor,typename DestDerived::StorageIndex>(*x_cs);
|
|
327
|
-
|
|
370
|
+
internal::cm_free_sparse<StorageIndex>(x_cs, m_cholmod);
|
|
328
371
|
}
|
|
329
372
|
#endif // EIGEN_PARSED_BY_DOXYGEN
|
|
330
|
-
|
|
331
|
-
|
|
373
|
+
|
|
374
|
+
|
|
332
375
|
/** Sets the shift parameter that will be used to adjust the diagonal coefficients during the numerical factorization.
|
|
333
376
|
*
|
|
334
377
|
* During the numerical factorization, an offset term is added to the diagonal coefficients:\n
|
|
@@ -343,7 +386,7 @@ class CholmodBase : public SparseSolverBase<Derived>
|
|
|
343
386
|
m_shiftOffset[0] = double(offset);
|
|
344
387
|
return derived();
|
|
345
388
|
}
|
|
346
|
-
|
|
389
|
+
|
|
347
390
|
/** \returns the determinant of the underlying matrix from the current factorization */
|
|
348
391
|
Scalar determinant() const
|
|
349
392
|
{
|
|
@@ -398,7 +441,7 @@ class CholmodBase : public SparseSolverBase<Derived>
|
|
|
398
441
|
template<typename Stream>
|
|
399
442
|
void dumpMemory(Stream& /*s*/)
|
|
400
443
|
{}
|
|
401
|
-
|
|
444
|
+
|
|
402
445
|
protected:
|
|
403
446
|
mutable cholmod_common m_cholmod;
|
|
404
447
|
cholmod_factor* m_cholmodFactor;
|
|
@@ -435,11 +478,11 @@ class CholmodSimplicialLLT : public CholmodBase<_MatrixType, _UpLo, CholmodSimpl
|
|
|
435
478
|
{
|
|
436
479
|
typedef CholmodBase<_MatrixType, _UpLo, CholmodSimplicialLLT> Base;
|
|
437
480
|
using Base::m_cholmod;
|
|
438
|
-
|
|
481
|
+
|
|
439
482
|
public:
|
|
440
|
-
|
|
483
|
+
|
|
441
484
|
typedef _MatrixType MatrixType;
|
|
442
|
-
|
|
485
|
+
|
|
443
486
|
CholmodSimplicialLLT() : Base() { init(); }
|
|
444
487
|
|
|
445
488
|
CholmodSimplicialLLT(const MatrixType& matrix) : Base()
|
|
@@ -486,11 +529,11 @@ class CholmodSimplicialLDLT : public CholmodBase<_MatrixType, _UpLo, CholmodSimp
|
|
|
486
529
|
{
|
|
487
530
|
typedef CholmodBase<_MatrixType, _UpLo, CholmodSimplicialLDLT> Base;
|
|
488
531
|
using Base::m_cholmod;
|
|
489
|
-
|
|
532
|
+
|
|
490
533
|
public:
|
|
491
|
-
|
|
534
|
+
|
|
492
535
|
typedef _MatrixType MatrixType;
|
|
493
|
-
|
|
536
|
+
|
|
494
537
|
CholmodSimplicialLDLT() : Base() { init(); }
|
|
495
538
|
|
|
496
539
|
CholmodSimplicialLDLT(const MatrixType& matrix) : Base()
|
|
@@ -535,11 +578,11 @@ class CholmodSupernodalLLT : public CholmodBase<_MatrixType, _UpLo, CholmodSuper
|
|
|
535
578
|
{
|
|
536
579
|
typedef CholmodBase<_MatrixType, _UpLo, CholmodSupernodalLLT> Base;
|
|
537
580
|
using Base::m_cholmod;
|
|
538
|
-
|
|
581
|
+
|
|
539
582
|
public:
|
|
540
|
-
|
|
583
|
+
|
|
541
584
|
typedef _MatrixType MatrixType;
|
|
542
|
-
|
|
585
|
+
|
|
543
586
|
CholmodSupernodalLLT() : Base() { init(); }
|
|
544
587
|
|
|
545
588
|
CholmodSupernodalLLT(const MatrixType& matrix) : Base()
|
|
@@ -586,11 +629,11 @@ class CholmodDecomposition : public CholmodBase<_MatrixType, _UpLo, CholmodDecom
|
|
|
586
629
|
{
|
|
587
630
|
typedef CholmodBase<_MatrixType, _UpLo, CholmodDecomposition> Base;
|
|
588
631
|
using Base::m_cholmod;
|
|
589
|
-
|
|
632
|
+
|
|
590
633
|
public:
|
|
591
|
-
|
|
634
|
+
|
|
592
635
|
typedef _MatrixType MatrixType;
|
|
593
|
-
|
|
636
|
+
|
|
594
637
|
CholmodDecomposition() : Base() { init(); }
|
|
595
638
|
|
|
596
639
|
CholmodDecomposition(const MatrixType& matrix) : Base()
|
|
@@ -600,7 +643,7 @@ class CholmodDecomposition : public CholmodBase<_MatrixType, _UpLo, CholmodDecom
|
|
|
600
643
|
}
|
|
601
644
|
|
|
602
645
|
~CholmodDecomposition() {}
|
|
603
|
-
|
|
646
|
+
|
|
604
647
|
void setMode(CholmodMode mode)
|
|
605
648
|
{
|
|
606
649
|
switch(mode)
|