@smake/eigen 1.0.2 → 1.1.1
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/Eigen/AccelerateSupport +52 -0
- package/eigen/Eigen/Cholesky +18 -21
- package/eigen/Eigen/CholmodSupport +28 -28
- package/eigen/Eigen/Core +235 -326
- package/eigen/Eigen/Eigenvalues +16 -14
- package/eigen/Eigen/Geometry +21 -24
- package/eigen/Eigen/Householder +9 -8
- package/eigen/Eigen/IterativeLinearSolvers +8 -4
- package/eigen/Eigen/Jacobi +14 -14
- package/eigen/Eigen/KLUSupport +43 -0
- package/eigen/Eigen/LU +16 -20
- package/eigen/Eigen/MetisSupport +12 -12
- package/eigen/Eigen/OrderingMethods +54 -54
- package/eigen/Eigen/PaStiXSupport +23 -20
- package/eigen/Eigen/PardisoSupport +17 -14
- package/eigen/Eigen/QR +18 -21
- package/eigen/Eigen/QtAlignedMalloc +5 -13
- package/eigen/Eigen/SPQRSupport +21 -14
- package/eigen/Eigen/SVD +23 -18
- package/eigen/Eigen/Sparse +1 -4
- package/eigen/Eigen/SparseCholesky +18 -23
- package/eigen/Eigen/SparseCore +18 -17
- package/eigen/Eigen/SparseLU +12 -8
- package/eigen/Eigen/SparseQR +16 -14
- package/eigen/Eigen/StdDeque +5 -2
- package/eigen/Eigen/StdList +5 -2
- package/eigen/Eigen/StdVector +5 -2
- package/eigen/Eigen/SuperLUSupport +30 -24
- package/eigen/Eigen/ThreadPool +80 -0
- package/eigen/Eigen/UmfPackSupport +19 -17
- package/eigen/Eigen/Version +14 -0
- package/eigen/Eigen/src/AccelerateSupport/AccelerateSupport.h +423 -0
- package/eigen/Eigen/src/AccelerateSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Cholesky/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Cholesky/LDLT.h +377 -401
- package/eigen/Eigen/src/Cholesky/LLT.h +332 -360
- package/eigen/Eigen/src/Cholesky/LLT_LAPACKE.h +81 -56
- package/eigen/Eigen/src/CholmodSupport/CholmodSupport.h +620 -521
- package/eigen/Eigen/src/CholmodSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Core/ArithmeticSequence.h +239 -0
- package/eigen/Eigen/src/Core/Array.h +341 -294
- package/eigen/Eigen/src/Core/ArrayBase.h +190 -203
- package/eigen/Eigen/src/Core/ArrayWrapper.h +127 -171
- package/eigen/Eigen/src/Core/Assign.h +30 -40
- package/eigen/Eigen/src/Core/AssignEvaluator.h +711 -589
- package/eigen/Eigen/src/Core/Assign_MKL.h +130 -125
- package/eigen/Eigen/src/Core/BandMatrix.h +268 -283
- package/eigen/Eigen/src/Core/Block.h +375 -398
- package/eigen/Eigen/src/Core/CommaInitializer.h +86 -97
- package/eigen/Eigen/src/Core/ConditionEstimator.h +51 -53
- package/eigen/Eigen/src/Core/CoreEvaluators.h +1356 -1026
- package/eigen/Eigen/src/Core/CoreIterators.h +73 -59
- package/eigen/Eigen/src/Core/CwiseBinaryOp.h +114 -132
- package/eigen/Eigen/src/Core/CwiseNullaryOp.h +726 -617
- package/eigen/Eigen/src/Core/CwiseTernaryOp.h +77 -103
- package/eigen/Eigen/src/Core/CwiseUnaryOp.h +56 -68
- package/eigen/Eigen/src/Core/CwiseUnaryView.h +132 -95
- package/eigen/Eigen/src/Core/DenseBase.h +632 -571
- package/eigen/Eigen/src/Core/DenseCoeffsBase.h +511 -624
- package/eigen/Eigen/src/Core/DenseStorage.h +512 -509
- package/eigen/Eigen/src/Core/DeviceWrapper.h +153 -0
- package/eigen/Eigen/src/Core/Diagonal.h +169 -210
- package/eigen/Eigen/src/Core/DiagonalMatrix.h +351 -274
- package/eigen/Eigen/src/Core/DiagonalProduct.h +12 -10
- package/eigen/Eigen/src/Core/Dot.h +172 -222
- package/eigen/Eigen/src/Core/EigenBase.h +75 -85
- package/eigen/Eigen/src/Core/Fill.h +138 -0
- package/eigen/Eigen/src/Core/FindCoeff.h +464 -0
- package/eigen/Eigen/src/Core/ForceAlignedAccess.h +90 -109
- package/eigen/Eigen/src/Core/Fuzzy.h +82 -105
- package/eigen/Eigen/src/Core/GeneralProduct.h +327 -263
- package/eigen/Eigen/src/Core/GenericPacketMath.h +1472 -360
- package/eigen/Eigen/src/Core/GlobalFunctions.h +194 -151
- package/eigen/Eigen/src/Core/IO.h +147 -139
- package/eigen/Eigen/src/Core/IndexedView.h +321 -0
- package/eigen/Eigen/src/Core/InnerProduct.h +260 -0
- package/eigen/Eigen/src/Core/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Core/Inverse.h +56 -66
- package/eigen/Eigen/src/Core/Map.h +124 -142
- package/eigen/Eigen/src/Core/MapBase.h +256 -281
- package/eigen/Eigen/src/Core/MathFunctions.h +1620 -938
- package/eigen/Eigen/src/Core/MathFunctionsImpl.h +233 -71
- package/eigen/Eigen/src/Core/Matrix.h +491 -416
- package/eigen/Eigen/src/Core/MatrixBase.h +468 -453
- package/eigen/Eigen/src/Core/NestByValue.h +66 -85
- package/eigen/Eigen/src/Core/NoAlias.h +79 -85
- package/eigen/Eigen/src/Core/NumTraits.h +235 -148
- package/eigen/Eigen/src/Core/PartialReduxEvaluator.h +253 -0
- package/eigen/Eigen/src/Core/PermutationMatrix.h +461 -511
- package/eigen/Eigen/src/Core/PlainObjectBase.h +871 -894
- package/eigen/Eigen/src/Core/Product.h +260 -139
- package/eigen/Eigen/src/Core/ProductEvaluators.h +863 -714
- package/eigen/Eigen/src/Core/Random.h +161 -136
- package/eigen/Eigen/src/Core/RandomImpl.h +262 -0
- package/eigen/Eigen/src/Core/RealView.h +250 -0
- package/eigen/Eigen/src/Core/Redux.h +366 -336
- package/eigen/Eigen/src/Core/Ref.h +308 -209
- package/eigen/Eigen/src/Core/Replicate.h +94 -106
- package/eigen/Eigen/src/Core/Reshaped.h +398 -0
- package/eigen/Eigen/src/Core/ReturnByValue.h +49 -55
- package/eigen/Eigen/src/Core/Reverse.h +136 -145
- package/eigen/Eigen/src/Core/Select.h +70 -140
- package/eigen/Eigen/src/Core/SelfAdjointView.h +262 -285
- package/eigen/Eigen/src/Core/SelfCwiseBinaryOp.h +23 -20
- package/eigen/Eigen/src/Core/SkewSymmetricMatrix3.h +382 -0
- package/eigen/Eigen/src/Core/Solve.h +97 -111
- package/eigen/Eigen/src/Core/SolveTriangular.h +131 -129
- package/eigen/Eigen/src/Core/SolverBase.h +138 -101
- package/eigen/Eigen/src/Core/StableNorm.h +156 -160
- package/eigen/Eigen/src/Core/StlIterators.h +619 -0
- package/eigen/Eigen/src/Core/Stride.h +91 -88
- package/eigen/Eigen/src/Core/Swap.h +70 -38
- package/eigen/Eigen/src/Core/Transpose.h +295 -273
- package/eigen/Eigen/src/Core/Transpositions.h +272 -317
- package/eigen/Eigen/src/Core/TriangularMatrix.h +670 -755
- package/eigen/Eigen/src/Core/VectorBlock.h +59 -72
- package/eigen/Eigen/src/Core/VectorwiseOp.h +668 -630
- package/eigen/Eigen/src/Core/Visitor.h +480 -216
- package/eigen/Eigen/src/Core/arch/AVX/Complex.h +407 -293
- package/eigen/Eigen/src/Core/arch/AVX/MathFunctions.h +79 -388
- package/eigen/Eigen/src/Core/arch/AVX/PacketMath.h +2935 -491
- package/eigen/Eigen/src/Core/arch/AVX/Reductions.h +353 -0
- package/eigen/Eigen/src/Core/arch/AVX/TypeCasting.h +279 -22
- package/eigen/Eigen/src/Core/arch/AVX512/Complex.h +472 -0
- package/eigen/Eigen/src/Core/arch/AVX512/GemmKernel.h +1245 -0
- package/eigen/Eigen/src/Core/arch/AVX512/MathFunctions.h +85 -333
- package/eigen/Eigen/src/Core/arch/AVX512/MathFunctionsFP16.h +75 -0
- package/eigen/Eigen/src/Core/arch/AVX512/PacketMath.h +2490 -649
- package/eigen/Eigen/src/Core/arch/AVX512/PacketMathFP16.h +1413 -0
- package/eigen/Eigen/src/Core/arch/AVX512/Reductions.h +297 -0
- package/eigen/Eigen/src/Core/arch/AVX512/TrsmKernel.h +1167 -0
- package/eigen/Eigen/src/Core/arch/AVX512/TrsmUnrolls.inc +1219 -0
- package/eigen/Eigen/src/Core/arch/AVX512/TypeCasting.h +277 -0
- package/eigen/Eigen/src/Core/arch/AVX512/TypeCastingFP16.h +130 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/Complex.h +521 -298
- package/eigen/Eigen/src/Core/arch/AltiVec/MathFunctions.h +39 -280
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProduct.h +3686 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h +205 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductMMA.h +901 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductMMAbfloat16.h +742 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixVectorProduct.inc +2818 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/PacketMath.h +3391 -723
- package/eigen/Eigen/src/Core/arch/AltiVec/TypeCasting.h +153 -0
- package/eigen/Eigen/src/Core/arch/Default/BFloat16.h +866 -0
- package/eigen/Eigen/src/Core/arch/Default/ConjHelper.h +113 -14
- package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h +2634 -0
- package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h +227 -0
- package/eigen/Eigen/src/Core/arch/Default/Half.h +1091 -0
- package/eigen/Eigen/src/Core/arch/Default/Settings.h +11 -13
- package/eigen/Eigen/src/Core/arch/GPU/Complex.h +244 -0
- package/eigen/Eigen/src/Core/arch/GPU/MathFunctions.h +104 -0
- package/eigen/Eigen/src/Core/arch/GPU/PacketMath.h +1712 -0
- package/eigen/Eigen/src/Core/arch/GPU/Tuple.h +268 -0
- package/eigen/Eigen/src/Core/arch/GPU/TypeCasting.h +77 -0
- package/eigen/Eigen/src/Core/arch/HIP/hcc/math_constants.h +23 -0
- package/eigen/Eigen/src/Core/arch/HVX/PacketMath.h +1088 -0
- package/eigen/Eigen/src/Core/arch/LSX/Complex.h +520 -0
- package/eigen/Eigen/src/Core/arch/LSX/GeneralBlockPanelKernel.h +23 -0
- package/eigen/Eigen/src/Core/arch/LSX/MathFunctions.h +43 -0
- package/eigen/Eigen/src/Core/arch/LSX/PacketMath.h +2866 -0
- package/eigen/Eigen/src/Core/arch/LSX/TypeCasting.h +526 -0
- package/eigen/Eigen/src/Core/arch/MSA/Complex.h +620 -0
- package/eigen/Eigen/src/Core/arch/MSA/MathFunctions.h +379 -0
- package/eigen/Eigen/src/Core/arch/MSA/PacketMath.h +1237 -0
- package/eigen/Eigen/src/Core/arch/NEON/Complex.h +531 -289
- package/eigen/Eigen/src/Core/arch/NEON/GeneralBlockPanelKernel.h +243 -0
- package/eigen/Eigen/src/Core/arch/NEON/MathFunctions.h +50 -73
- package/eigen/Eigen/src/Core/arch/NEON/PacketMath.h +5915 -579
- package/eigen/Eigen/src/Core/arch/NEON/TypeCasting.h +1642 -0
- package/eigen/Eigen/src/Core/arch/NEON/UnaryFunctors.h +57 -0
- package/eigen/Eigen/src/Core/arch/SSE/Complex.h +366 -334
- package/eigen/Eigen/src/Core/arch/SSE/MathFunctions.h +40 -514
- package/eigen/Eigen/src/Core/arch/SSE/PacketMath.h +2164 -675
- package/eigen/Eigen/src/Core/arch/SSE/Reductions.h +324 -0
- package/eigen/Eigen/src/Core/arch/SSE/TypeCasting.h +188 -35
- package/eigen/Eigen/src/Core/arch/SVE/MathFunctions.h +48 -0
- package/eigen/Eigen/src/Core/arch/SVE/PacketMath.h +674 -0
- package/eigen/Eigen/src/Core/arch/SVE/TypeCasting.h +52 -0
- package/eigen/Eigen/src/Core/arch/SYCL/InteropHeaders.h +227 -0
- package/eigen/Eigen/src/Core/arch/SYCL/MathFunctions.h +303 -0
- package/eigen/Eigen/src/Core/arch/SYCL/PacketMath.h +576 -0
- package/eigen/Eigen/src/Core/arch/SYCL/TypeCasting.h +83 -0
- package/eigen/Eigen/src/Core/arch/ZVector/Complex.h +434 -261
- package/eigen/Eigen/src/Core/arch/ZVector/MathFunctions.h +160 -53
- package/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h +1073 -605
- package/eigen/Eigen/src/Core/functors/AssignmentFunctors.h +123 -117
- package/eigen/Eigen/src/Core/functors/BinaryFunctors.h +594 -322
- package/eigen/Eigen/src/Core/functors/NullaryFunctors.h +204 -118
- package/eigen/Eigen/src/Core/functors/StlFunctors.h +110 -97
- package/eigen/Eigen/src/Core/functors/TernaryFunctors.h +34 -7
- package/eigen/Eigen/src/Core/functors/UnaryFunctors.h +1158 -530
- package/eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h +2329 -1333
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix.h +328 -364
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +191 -178
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h +85 -82
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix_BLAS.h +154 -73
- package/eigen/Eigen/src/Core/products/GeneralMatrixVector.h +396 -542
- package/eigen/Eigen/src/Core/products/GeneralMatrixVector_BLAS.h +80 -77
- package/eigen/Eigen/src/Core/products/Parallelizer.h +208 -92
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +331 -375
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix_BLAS.h +206 -224
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixVector.h +139 -146
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixVector_BLAS.h +58 -61
- package/eigen/Eigen/src/Core/products/SelfadjointProduct.h +71 -71
- package/eigen/Eigen/src/Core/products/SelfadjointRank2Update.h +48 -46
- package/eigen/Eigen/src/Core/products/TriangularMatrixMatrix.h +294 -369
- package/eigen/Eigen/src/Core/products/TriangularMatrixMatrix_BLAS.h +246 -238
- package/eigen/Eigen/src/Core/products/TriangularMatrixVector.h +244 -247
- package/eigen/Eigen/src/Core/products/TriangularMatrixVector_BLAS.h +212 -192
- package/eigen/Eigen/src/Core/products/TriangularSolverMatrix.h +328 -275
- package/eigen/Eigen/src/Core/products/TriangularSolverMatrix_BLAS.h +108 -109
- package/eigen/Eigen/src/Core/products/TriangularSolverVector.h +70 -93
- package/eigen/Eigen/src/Core/util/Assert.h +158 -0
- package/eigen/Eigen/src/Core/util/BlasUtil.h +413 -290
- package/eigen/Eigen/src/Core/util/ConfigureVectorization.h +543 -0
- package/eigen/Eigen/src/Core/util/Constants.h +314 -263
- package/eigen/Eigen/src/Core/util/DisableStupidWarnings.h +130 -78
- package/eigen/Eigen/src/Core/util/EmulateArray.h +270 -0
- package/eigen/Eigen/src/Core/util/ForwardDeclarations.h +450 -224
- package/eigen/Eigen/src/Core/util/GpuHipCudaDefines.inc +101 -0
- package/eigen/Eigen/src/Core/util/GpuHipCudaUndefines.inc +45 -0
- package/eigen/Eigen/src/Core/util/IndexedViewHelper.h +487 -0
- package/eigen/Eigen/src/Core/util/IntegralConstant.h +279 -0
- package/eigen/Eigen/src/Core/util/MKL_support.h +39 -30
- package/eigen/Eigen/src/Core/util/Macros.h +939 -646
- package/eigen/Eigen/src/Core/util/MaxSizeVector.h +139 -0
- package/eigen/Eigen/src/Core/util/Memory.h +1042 -650
- package/eigen/Eigen/src/Core/util/Meta.h +618 -426
- package/eigen/Eigen/src/Core/util/MoreMeta.h +638 -0
- package/eigen/Eigen/src/Core/util/ReenableStupidWarnings.h +32 -19
- package/eigen/Eigen/src/Core/util/ReshapedHelper.h +51 -0
- package/eigen/Eigen/src/Core/util/Serializer.h +209 -0
- package/eigen/Eigen/src/Core/util/StaticAssert.h +51 -164
- package/eigen/Eigen/src/Core/util/SymbolicIndex.h +445 -0
- package/eigen/Eigen/src/Core/util/XprHelper.h +793 -538
- package/eigen/Eigen/src/Eigenvalues/ComplexEigenSolver.h +246 -277
- package/eigen/Eigen/src/Eigenvalues/ComplexSchur.h +299 -319
- package/eigen/Eigen/src/Eigenvalues/ComplexSchur_LAPACKE.h +52 -48
- package/eigen/Eigen/src/Eigenvalues/EigenSolver.h +413 -456
- package/eigen/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h +309 -325
- package/eigen/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h +157 -171
- package/eigen/Eigen/src/Eigenvalues/HessenbergDecomposition.h +292 -310
- package/eigen/Eigen/src/Eigenvalues/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h +91 -107
- package/eigen/Eigen/src/Eigenvalues/RealQZ.h +539 -606
- package/eigen/Eigen/src/Eigenvalues/RealSchur.h +348 -382
- package/eigen/Eigen/src/Eigenvalues/RealSchur_LAPACKE.h +41 -35
- package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +579 -600
- package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_LAPACKE.h +47 -44
- package/eigen/Eigen/src/Eigenvalues/Tridiagonalization.h +434 -461
- package/eigen/Eigen/src/Geometry/AlignedBox.h +307 -214
- package/eigen/Eigen/src/Geometry/AngleAxis.h +135 -137
- package/eigen/Eigen/src/Geometry/EulerAngles.h +163 -74
- package/eigen/Eigen/src/Geometry/Homogeneous.h +289 -333
- package/eigen/Eigen/src/Geometry/Hyperplane.h +152 -161
- package/eigen/Eigen/src/Geometry/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Geometry/OrthoMethods.h +168 -145
- package/eigen/Eigen/src/Geometry/ParametrizedLine.h +141 -104
- package/eigen/Eigen/src/Geometry/Quaternion.h +595 -497
- package/eigen/Eigen/src/Geometry/Rotation2D.h +110 -108
- package/eigen/Eigen/src/Geometry/RotationBase.h +148 -145
- package/eigen/Eigen/src/Geometry/Scaling.h +115 -90
- package/eigen/Eigen/src/Geometry/Transform.h +896 -953
- package/eigen/Eigen/src/Geometry/Translation.h +100 -98
- package/eigen/Eigen/src/Geometry/Umeyama.h +79 -84
- package/eigen/Eigen/src/Geometry/arch/Geometry_SIMD.h +154 -0
- package/eigen/Eigen/src/Householder/BlockHouseholder.h +54 -42
- package/eigen/Eigen/src/Householder/Householder.h +104 -122
- package/eigen/Eigen/src/Householder/HouseholderSequence.h +416 -382
- package/eigen/Eigen/src/Householder/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +153 -166
- package/eigen/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +127 -138
- package/eigen/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +95 -124
- package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h +269 -267
- package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h +246 -259
- package/eigen/Eigen/src/IterativeLinearSolvers/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +218 -217
- package/eigen/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h +80 -103
- package/eigen/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h +59 -63
- package/eigen/Eigen/src/Jacobi/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Jacobi/Jacobi.h +256 -291
- package/eigen/Eigen/src/KLUSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/KLUSupport/KLUSupport.h +339 -0
- package/eigen/Eigen/src/LU/Determinant.h +60 -63
- package/eigen/Eigen/src/LU/FullPivLU.h +561 -626
- package/eigen/Eigen/src/LU/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/LU/InverseImpl.h +213 -275
- package/eigen/Eigen/src/LU/PartialPivLU.h +407 -435
- package/eigen/Eigen/src/LU/PartialPivLU_LAPACKE.h +54 -40
- package/eigen/Eigen/src/LU/arch/InverseSize4.h +353 -0
- package/eigen/Eigen/src/MetisSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/MetisSupport/MetisSupport.h +81 -93
- package/eigen/Eigen/src/OrderingMethods/Amd.h +250 -282
- package/eigen/Eigen/src/OrderingMethods/Eigen_Colamd.h +950 -1103
- package/eigen/Eigen/src/OrderingMethods/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/OrderingMethods/Ordering.h +111 -122
- package/eigen/Eigen/src/PaStiXSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/PaStiXSupport/PaStiXSupport.h +524 -570
- package/eigen/Eigen/src/PardisoSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/PardisoSupport/PardisoSupport.h +385 -429
- package/eigen/Eigen/src/QR/ColPivHouseholderQR.h +494 -473
- package/eigen/Eigen/src/QR/ColPivHouseholderQR_LAPACKE.h +120 -56
- package/eigen/Eigen/src/QR/CompleteOrthogonalDecomposition.h +223 -137
- package/eigen/Eigen/src/QR/FullPivHouseholderQR.h +517 -460
- package/eigen/Eigen/src/QR/HouseholderQR.h +412 -278
- package/eigen/Eigen/src/QR/HouseholderQR_LAPACKE.h +32 -23
- package/eigen/Eigen/src/QR/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SPQRSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h +263 -261
- package/eigen/Eigen/src/SVD/BDCSVD.h +872 -679
- package/eigen/Eigen/src/SVD/BDCSVD_LAPACKE.h +174 -0
- package/eigen/Eigen/src/SVD/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SVD/JacobiSVD.h +585 -543
- package/eigen/Eigen/src/SVD/JacobiSVD_LAPACKE.h +85 -49
- package/eigen/Eigen/src/SVD/SVDBase.h +281 -160
- package/eigen/Eigen/src/SVD/UpperBidiagonalization.h +202 -237
- package/eigen/Eigen/src/SparseCholesky/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky.h +769 -590
- package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h +318 -129
- package/eigen/Eigen/src/SparseCore/AmbiVector.h +202 -251
- package/eigen/Eigen/src/SparseCore/CompressedStorage.h +184 -236
- package/eigen/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h +140 -184
- package/eigen/Eigen/src/SparseCore/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SparseCore/SparseAssign.h +174 -111
- package/eigen/Eigen/src/SparseCore/SparseBlock.h +408 -477
- package/eigen/Eigen/src/SparseCore/SparseColEtree.h +100 -112
- package/eigen/Eigen/src/SparseCore/SparseCompressedBase.h +531 -280
- package/eigen/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +559 -347
- package/eigen/Eigen/src/SparseCore/SparseCwiseUnaryOp.h +100 -108
- package/eigen/Eigen/src/SparseCore/SparseDenseProduct.h +185 -191
- package/eigen/Eigen/src/SparseCore/SparseDiagonalProduct.h +71 -71
- package/eigen/Eigen/src/SparseCore/SparseDot.h +49 -47
- package/eigen/Eigen/src/SparseCore/SparseFuzzy.h +13 -11
- package/eigen/Eigen/src/SparseCore/SparseMap.h +243 -253
- package/eigen/Eigen/src/SparseCore/SparseMatrix.h +1614 -1142
- package/eigen/Eigen/src/SparseCore/SparseMatrixBase.h +403 -357
- package/eigen/Eigen/src/SparseCore/SparsePermutation.h +186 -115
- package/eigen/Eigen/src/SparseCore/SparseProduct.h +100 -91
- package/eigen/Eigen/src/SparseCore/SparseRedux.h +22 -24
- package/eigen/Eigen/src/SparseCore/SparseRef.h +268 -295
- package/eigen/Eigen/src/SparseCore/SparseSelfAdjointView.h +371 -414
- package/eigen/Eigen/src/SparseCore/SparseSolverBase.h +78 -87
- package/eigen/Eigen/src/SparseCore/SparseSparseProductWithPruning.h +81 -95
- package/eigen/Eigen/src/SparseCore/SparseTranspose.h +62 -71
- package/eigen/Eigen/src/SparseCore/SparseTriangularView.h +132 -144
- package/eigen/Eigen/src/SparseCore/SparseUtil.h +146 -115
- package/eigen/Eigen/src/SparseCore/SparseVector.h +426 -372
- package/eigen/Eigen/src/SparseCore/SparseView.h +164 -193
- package/eigen/Eigen/src/SparseCore/TriangularSolver.h +129 -170
- package/eigen/Eigen/src/SparseLU/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SparseLU/SparseLU.h +814 -618
- package/eigen/Eigen/src/SparseLU/SparseLUImpl.h +61 -48
- package/eigen/Eigen/src/SparseLU/SparseLU_Memory.h +102 -118
- package/eigen/Eigen/src/SparseLU/SparseLU_Structs.h +38 -35
- package/eigen/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h +273 -255
- package/eigen/Eigen/src/SparseLU/SparseLU_Utils.h +44 -49
- package/eigen/Eigen/src/SparseLU/SparseLU_column_bmod.h +104 -108
- package/eigen/Eigen/src/SparseLU/SparseLU_column_dfs.h +90 -101
- package/eigen/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h +57 -58
- package/eigen/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h +43 -55
- package/eigen/Eigen/src/SparseLU/SparseLU_kernel_bmod.h +74 -71
- package/eigen/Eigen/src/SparseLU/SparseLU_panel_bmod.h +125 -133
- package/eigen/Eigen/src/SparseLU/SparseLU_panel_dfs.h +136 -159
- package/eigen/Eigen/src/SparseLU/SparseLU_pivotL.h +51 -52
- package/eigen/Eigen/src/SparseLU/SparseLU_pruneL.h +67 -73
- package/eigen/Eigen/src/SparseLU/SparseLU_relax_snode.h +24 -26
- package/eigen/Eigen/src/SparseQR/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SparseQR/SparseQR.h +451 -490
- package/eigen/Eigen/src/StlSupport/StdDeque.h +28 -105
- package/eigen/Eigen/src/StlSupport/StdList.h +28 -84
- package/eigen/Eigen/src/StlSupport/StdVector.h +28 -108
- package/eigen/Eigen/src/StlSupport/details.h +48 -50
- package/eigen/Eigen/src/SuperLUSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SuperLUSupport/SuperLUSupport.h +634 -732
- package/eigen/Eigen/src/ThreadPool/Barrier.h +70 -0
- package/eigen/Eigen/src/ThreadPool/CoreThreadPoolDevice.h +336 -0
- package/eigen/Eigen/src/ThreadPool/EventCount.h +241 -0
- package/eigen/Eigen/src/ThreadPool/ForkJoin.h +140 -0
- package/eigen/Eigen/src/ThreadPool/InternalHeaderCheck.h +4 -0
- package/eigen/Eigen/src/ThreadPool/NonBlockingThreadPool.h +587 -0
- package/eigen/Eigen/src/ThreadPool/RunQueue.h +230 -0
- package/eigen/Eigen/src/ThreadPool/ThreadCancel.h +21 -0
- package/eigen/Eigen/src/ThreadPool/ThreadEnvironment.h +43 -0
- package/eigen/Eigen/src/ThreadPool/ThreadLocal.h +289 -0
- package/eigen/Eigen/src/ThreadPool/ThreadPoolInterface.h +50 -0
- package/eigen/Eigen/src/ThreadPool/ThreadYield.h +16 -0
- package/eigen/Eigen/src/UmfPackSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/UmfPackSupport/UmfPackSupport.h +480 -380
- package/eigen/Eigen/src/misc/Image.h +41 -43
- package/eigen/Eigen/src/misc/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/misc/Kernel.h +39 -41
- package/eigen/Eigen/src/misc/RealSvd2x2.h +19 -21
- package/eigen/Eigen/src/misc/blas.h +83 -426
- package/eigen/Eigen/src/misc/lapacke.h +9976 -16182
- package/eigen/Eigen/src/misc/lapacke_helpers.h +163 -0
- package/eigen/Eigen/src/misc/lapacke_mangling.h +4 -5
- package/eigen/Eigen/src/plugins/ArrayCwiseBinaryOps.inc +344 -0
- package/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.inc +544 -0
- package/eigen/Eigen/src/plugins/BlockMethods.inc +1370 -0
- package/eigen/Eigen/src/plugins/CommonCwiseBinaryOps.inc +116 -0
- package/eigen/Eigen/src/plugins/CommonCwiseUnaryOps.inc +167 -0
- package/eigen/Eigen/src/plugins/IndexedViewMethods.inc +192 -0
- package/eigen/Eigen/src/plugins/InternalHeaderCheck.inc +3 -0
- package/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.inc +331 -0
- package/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.inc +118 -0
- package/eigen/Eigen/src/plugins/ReshapedMethods.inc +133 -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/BooleanRedux.h +0 -164
- package/eigen/Eigen/src/Core/arch/CUDA/Complex.h +0 -103
- package/eigen/Eigen/src/Core/arch/CUDA/Half.h +0 -675
- package/eigen/Eigen/src/Core/arch/CUDA/MathFunctions.h +0 -91
- 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/Core/util/NonMPL2.h +0 -3
- package/eigen/Eigen/src/Geometry/arch/Geometry_SSE.h +0 -161
- package/eigen/Eigen/src/LU/arch/Inverse_SSE.h +0 -338
- package/eigen/Eigen/src/SparseCore/MappedSparseMatrix.h +0 -67
- package/eigen/Eigen/src/SparseLU/SparseLU_gemm_kernel.h +0 -280
- package/eigen/Eigen/src/misc/lapack.h +0 -152
- package/eigen/Eigen/src/plugins/ArrayCwiseBinaryOps.h +0 -332
- package/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.h +0 -552
- package/eigen/Eigen/src/plugins/BlockMethods.h +0 -1058
- package/eigen/Eigen/src/plugins/CommonCwiseBinaryOps.h +0 -115
- package/eigen/Eigen/src/plugins/CommonCwiseUnaryOps.h +0 -163
- package/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.h +0 -152
- package/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.h +0 -85
- package/lib/eigen.d.ts +0 -2
- package/lib/eigen.js +0 -15
|
@@ -13,329 +13,314 @@
|
|
|
13
13
|
#ifndef EIGEN_LDLT_H
|
|
14
14
|
#define EIGEN_LDLT_H
|
|
15
15
|
|
|
16
|
+
// IWYU pragma: private
|
|
17
|
+
#include "./InternalHeaderCheck.h"
|
|
18
|
+
|
|
16
19
|
namespace Eigen {
|
|
17
20
|
|
|
18
21
|
namespace internal {
|
|
19
|
-
|
|
22
|
+
template <typename MatrixType_, int UpLo_>
|
|
23
|
+
struct traits<LDLT<MatrixType_, UpLo_> > : traits<MatrixType_> {
|
|
24
|
+
typedef MatrixXpr XprKind;
|
|
25
|
+
typedef SolverStorage StorageKind;
|
|
26
|
+
typedef int StorageIndex;
|
|
27
|
+
enum { Flags = 0 };
|
|
28
|
+
};
|
|
20
29
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
30
|
+
template <typename MatrixType, int UpLo>
|
|
31
|
+
struct LDLT_Traits;
|
|
32
|
+
|
|
33
|
+
// PositiveSemiDef means positive semi-definite and non-zero; same for NegativeSemiDef
|
|
34
|
+
enum SignMatrix { PositiveSemiDef, NegativeSemiDef, ZeroSign, Indefinite };
|
|
35
|
+
} // namespace internal
|
|
24
36
|
|
|
25
37
|
/** \ingroup Cholesky_Module
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
template<typename
|
|
51
|
-
{
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
/** \brief Default Constructor with memory preallocation
|
|
85
|
-
*
|
|
86
|
-
* Like the default constructor but with preallocation of the internal data
|
|
87
|
-
* according to the specified problem \a size.
|
|
88
|
-
* \sa LDLT()
|
|
89
|
-
*/
|
|
90
|
-
explicit LDLT(Index size)
|
|
38
|
+
*
|
|
39
|
+
* \class LDLT
|
|
40
|
+
*
|
|
41
|
+
* \brief Robust Cholesky decomposition of a matrix with pivoting
|
|
42
|
+
*
|
|
43
|
+
* \tparam MatrixType_ the type of the matrix of which to compute the LDL^T Cholesky decomposition
|
|
44
|
+
* \tparam UpLo_ the triangular part that will be used for the decomposition: Lower (default) or Upper.
|
|
45
|
+
* The other triangular part won't be read.
|
|
46
|
+
*
|
|
47
|
+
* Perform a robust Cholesky decomposition of a positive semidefinite or negative semidefinite
|
|
48
|
+
* matrix \f$ A \f$ such that \f$ A = P^TLDL^*P \f$, where P is a permutation matrix, L
|
|
49
|
+
* is lower triangular with a unit diagonal and D is a diagonal matrix.
|
|
50
|
+
*
|
|
51
|
+
* The decomposition uses pivoting to ensure stability, so that D will have
|
|
52
|
+
* zeros in the bottom right rank(A) - n submatrix. Avoiding the square root
|
|
53
|
+
* on D also stabilizes the computation.
|
|
54
|
+
*
|
|
55
|
+
* Remember that Cholesky decompositions are not rank-revealing. Also, do not use a Cholesky
|
|
56
|
+
* decomposition to determine whether a system of equations has a solution.
|
|
57
|
+
*
|
|
58
|
+
* This class supports the \link InplaceDecomposition inplace decomposition \endlink mechanism.
|
|
59
|
+
*
|
|
60
|
+
* \sa MatrixBase::ldlt(), SelfAdjointView::ldlt(), class LLT
|
|
61
|
+
*/
|
|
62
|
+
template <typename MatrixType_, int UpLo_>
|
|
63
|
+
class LDLT : public SolverBase<LDLT<MatrixType_, UpLo_> > {
|
|
64
|
+
public:
|
|
65
|
+
typedef MatrixType_ MatrixType;
|
|
66
|
+
typedef SolverBase<LDLT> Base;
|
|
67
|
+
friend class SolverBase<LDLT>;
|
|
68
|
+
|
|
69
|
+
EIGEN_GENERIC_PUBLIC_INTERFACE(LDLT)
|
|
70
|
+
enum {
|
|
71
|
+
MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
|
|
72
|
+
MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime,
|
|
73
|
+
UpLo = UpLo_
|
|
74
|
+
};
|
|
75
|
+
typedef Matrix<Scalar, RowsAtCompileTime, 1, 0, MaxRowsAtCompileTime, 1> TmpMatrixType;
|
|
76
|
+
|
|
77
|
+
typedef Transpositions<RowsAtCompileTime, MaxRowsAtCompileTime> TranspositionType;
|
|
78
|
+
typedef PermutationMatrix<RowsAtCompileTime, MaxRowsAtCompileTime> PermutationType;
|
|
79
|
+
|
|
80
|
+
typedef internal::LDLT_Traits<MatrixType, UpLo> Traits;
|
|
81
|
+
|
|
82
|
+
/** \brief Default Constructor.
|
|
83
|
+
*
|
|
84
|
+
* The default constructor is useful in cases in which the user intends to
|
|
85
|
+
* perform decompositions via LDLT::compute(const MatrixType&).
|
|
86
|
+
*/
|
|
87
|
+
LDLT() : m_matrix(), m_transpositions(), m_sign(internal::ZeroSign), m_isInitialized(false) {}
|
|
88
|
+
|
|
89
|
+
/** \brief Default Constructor with memory preallocation
|
|
90
|
+
*
|
|
91
|
+
* Like the default constructor but with preallocation of the internal data
|
|
92
|
+
* according to the specified problem \a size.
|
|
93
|
+
* \sa LDLT()
|
|
94
|
+
*/
|
|
95
|
+
explicit LDLT(Index size)
|
|
91
96
|
: m_matrix(size, size),
|
|
92
97
|
m_transpositions(size),
|
|
93
98
|
m_temporary(size),
|
|
94
99
|
m_sign(internal::ZeroSign),
|
|
95
|
-
m_isInitialized(false)
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
explicit LDLT(const EigenBase<InputType>& matrix)
|
|
100
|
+
m_isInitialized(false) {}
|
|
101
|
+
|
|
102
|
+
/** \brief Constructor with decomposition
|
|
103
|
+
*
|
|
104
|
+
* This calculates the decomposition for the input \a matrix.
|
|
105
|
+
*
|
|
106
|
+
* \sa LDLT(Index size)
|
|
107
|
+
*/
|
|
108
|
+
template <typename InputType>
|
|
109
|
+
explicit LDLT(const EigenBase<InputType>& matrix)
|
|
106
110
|
: m_matrix(matrix.rows(), matrix.cols()),
|
|
107
111
|
m_transpositions(matrix.rows()),
|
|
108
112
|
m_temporary(matrix.rows()),
|
|
109
113
|
m_sign(internal::ZeroSign),
|
|
110
|
-
m_isInitialized(false)
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
}
|
|
114
|
+
m_isInitialized(false) {
|
|
115
|
+
compute(matrix.derived());
|
|
116
|
+
}
|
|
114
117
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
118
|
+
/** \brief Constructs a LDLT factorization from a given matrix
|
|
119
|
+
*
|
|
120
|
+
* This overloaded constructor is provided for \link InplaceDecomposition inplace decomposition \endlink when \c
|
|
121
|
+
* MatrixType is a Eigen::Ref.
|
|
122
|
+
*
|
|
123
|
+
* \sa LDLT(const EigenBase&)
|
|
124
|
+
*/
|
|
125
|
+
template <typename InputType>
|
|
126
|
+
explicit LDLT(EigenBase<InputType>& matrix)
|
|
123
127
|
: m_matrix(matrix.derived()),
|
|
124
128
|
m_transpositions(matrix.rows()),
|
|
125
129
|
m_temporary(matrix.rows()),
|
|
126
130
|
m_sign(internal::ZeroSign),
|
|
127
|
-
m_isInitialized(false)
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
}
|
|
131
|
+
m_isInitialized(false) {
|
|
132
|
+
compute(matrix.derived());
|
|
133
|
+
}
|
|
131
134
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
{
|
|
137
|
-
m_isInitialized = false;
|
|
138
|
-
}
|
|
135
|
+
/** Clear any existing decomposition
|
|
136
|
+
* \sa rankUpdate(w,sigma)
|
|
137
|
+
*/
|
|
138
|
+
void setZero() { m_isInitialized = false; }
|
|
139
139
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
}
|
|
140
|
+
/** \returns a view of the upper triangular matrix U */
|
|
141
|
+
inline typename Traits::MatrixU matrixU() const {
|
|
142
|
+
eigen_assert(m_isInitialized && "LDLT is not initialized.");
|
|
143
|
+
return Traits::getU(m_matrix);
|
|
144
|
+
}
|
|
146
145
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
}
|
|
146
|
+
/** \returns a view of the lower triangular matrix L */
|
|
147
|
+
inline typename Traits::MatrixL matrixL() const {
|
|
148
|
+
eigen_assert(m_isInitialized && "LDLT is not initialized.");
|
|
149
|
+
return Traits::getL(m_matrix);
|
|
150
|
+
}
|
|
153
151
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
}
|
|
152
|
+
/** \returns the permutation matrix P as a transposition sequence.
|
|
153
|
+
*/
|
|
154
|
+
inline const TranspositionType& transpositionsP() const {
|
|
155
|
+
eigen_assert(m_isInitialized && "LDLT is not initialized.");
|
|
156
|
+
return m_transpositions;
|
|
157
|
+
}
|
|
161
158
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
}
|
|
159
|
+
/** \returns the coefficients of the diagonal matrix D */
|
|
160
|
+
inline Diagonal<const MatrixType> vectorD() const {
|
|
161
|
+
eigen_assert(m_isInitialized && "LDLT is not initialized.");
|
|
162
|
+
return m_matrix.diagonal();
|
|
163
|
+
}
|
|
168
164
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
}
|
|
165
|
+
/** \returns true if the matrix is positive (semidefinite) */
|
|
166
|
+
inline bool isPositive() const {
|
|
167
|
+
eigen_assert(m_isInitialized && "LDLT is not initialized.");
|
|
168
|
+
return m_sign == internal::PositiveSemiDef || m_sign == internal::ZeroSign;
|
|
169
|
+
}
|
|
175
170
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
}
|
|
171
|
+
/** \returns true if the matrix is negative (semidefinite) */
|
|
172
|
+
inline bool isNegative(void) const {
|
|
173
|
+
eigen_assert(m_isInitialized && "LDLT is not initialized.");
|
|
174
|
+
return m_sign == internal::NegativeSemiDef || m_sign == internal::ZeroSign;
|
|
175
|
+
}
|
|
182
176
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
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
|
-
}
|
|
177
|
+
#ifdef EIGEN_PARSED_BY_DOXYGEN
|
|
178
|
+
/** \returns a solution x of \f$ A x = b \f$ using the current decomposition of A.
|
|
179
|
+
*
|
|
180
|
+
* This function also supports in-place solves using the syntax <tt>x = decompositionObject.solve(x)</tt> .
|
|
181
|
+
*
|
|
182
|
+
* \note_about_checking_solutions
|
|
183
|
+
*
|
|
184
|
+
* More precisely, this method solves \f$ A x = b \f$ using the decomposition \f$ A = P^T L D L^* P \f$
|
|
185
|
+
* by solving the systems \f$ P^T y_1 = b \f$, \f$ L y_2 = y_1 \f$, \f$ D y_3 = y_2 \f$,
|
|
186
|
+
* \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
|
|
187
|
+
* \f$ D \f$ will also be singular (all the other matrices are invertible). In that case, the
|
|
188
|
+
* least-square solution of \f$ D y_3 = y_2 \f$ is computed. This does not mean that this function
|
|
189
|
+
* computes the least-square solution of \f$ A x = b \f$ if \f$ A \f$ is singular.
|
|
190
|
+
*
|
|
191
|
+
* \sa MatrixBase::ldlt(), SelfAdjointView::ldlt()
|
|
192
|
+
*/
|
|
193
|
+
template <typename Rhs>
|
|
194
|
+
inline const Solve<LDLT, Rhs> solve(const MatrixBase<Rhs>& b) const;
|
|
195
|
+
#endif
|
|
207
196
|
|
|
208
|
-
|
|
209
|
-
|
|
197
|
+
template <typename Derived>
|
|
198
|
+
bool solveInPlace(MatrixBase<Derived>& bAndX) const;
|
|
210
199
|
|
|
211
|
-
|
|
212
|
-
|
|
200
|
+
template <typename InputType>
|
|
201
|
+
LDLT& compute(const EigenBase<InputType>& matrix);
|
|
213
202
|
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
}
|
|
203
|
+
/** \returns an estimate of the reciprocal condition number of the matrix of
|
|
204
|
+
* which \c *this is the LDLT decomposition.
|
|
205
|
+
*/
|
|
206
|
+
RealScalar rcond() const {
|
|
207
|
+
eigen_assert(m_isInitialized && "LDLT is not initialized.");
|
|
208
|
+
return internal::rcond_estimate_helper(m_l1_norm, *this);
|
|
209
|
+
}
|
|
222
210
|
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
/** \returns the internal LDLT decomposition matrix
|
|
227
|
-
*
|
|
228
|
-
* TODO: document the storage layout
|
|
229
|
-
*/
|
|
230
|
-
inline const MatrixType& matrixLDLT() const
|
|
231
|
-
{
|
|
232
|
-
eigen_assert(m_isInitialized && "LDLT is not initialized.");
|
|
233
|
-
return m_matrix;
|
|
234
|
-
}
|
|
211
|
+
template <typename Derived>
|
|
212
|
+
LDLT& rankUpdate(const MatrixBase<Derived>& w, const RealScalar& alpha = 1);
|
|
235
213
|
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
inline Index rows() const { return m_matrix.rows(); }
|
|
246
|
-
inline Index cols() const { return m_matrix.cols(); }
|
|
247
|
-
|
|
248
|
-
/** \brief Reports whether previous computation was successful.
|
|
249
|
-
*
|
|
250
|
-
* \returns \c Success if computation was succesful,
|
|
251
|
-
* \c NumericalIssue if the factorization failed because of a zero pivot.
|
|
252
|
-
*/
|
|
253
|
-
ComputationInfo info() const
|
|
254
|
-
{
|
|
255
|
-
eigen_assert(m_isInitialized && "LDLT is not initialized.");
|
|
256
|
-
return m_info;
|
|
257
|
-
}
|
|
214
|
+
/** \returns the internal LDLT decomposition matrix
|
|
215
|
+
*
|
|
216
|
+
* TODO: document the storage layout
|
|
217
|
+
*/
|
|
218
|
+
inline const MatrixType& matrixLDLT() const {
|
|
219
|
+
eigen_assert(m_isInitialized && "LDLT is not initialized.");
|
|
220
|
+
return m_matrix;
|
|
221
|
+
}
|
|
258
222
|
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
223
|
+
MatrixType reconstructedMatrix() const;
|
|
224
|
+
|
|
225
|
+
/** \returns the adjoint of \c *this, that is, a const reference to the decomposition itself as the underlying matrix
|
|
226
|
+
* is self-adjoint.
|
|
227
|
+
*
|
|
228
|
+
* This method is provided for compatibility with other matrix decompositions, thus enabling generic code such as:
|
|
229
|
+
* \code x = decomposition.adjoint().solve(b) \endcode
|
|
230
|
+
*/
|
|
231
|
+
const LDLT& adjoint() const { return *this; }
|
|
232
|
+
|
|
233
|
+
EIGEN_DEVICE_FUNC constexpr Index rows() const noexcept { return m_matrix.rows(); }
|
|
234
|
+
EIGEN_DEVICE_FUNC constexpr Index cols() const noexcept { return m_matrix.cols(); }
|
|
235
|
+
|
|
236
|
+
/** \brief Reports whether previous computation was successful.
|
|
237
|
+
*
|
|
238
|
+
* \returns \c Success if computation was successful,
|
|
239
|
+
* \c NumericalIssue if the factorization failed because of a zero pivot.
|
|
240
|
+
*/
|
|
241
|
+
ComputationInfo info() const {
|
|
242
|
+
eigen_assert(m_isInitialized && "LDLT is not initialized.");
|
|
243
|
+
return m_info;
|
|
244
|
+
}
|
|
264
245
|
|
|
265
|
-
|
|
246
|
+
#ifndef EIGEN_PARSED_BY_DOXYGEN
|
|
247
|
+
template <typename RhsType, typename DstType>
|
|
248
|
+
void _solve_impl(const RhsType& rhs, DstType& dst) const;
|
|
266
249
|
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
}
|
|
250
|
+
template <bool Conjugate, typename RhsType, typename DstType>
|
|
251
|
+
void _solve_impl_transposed(const RhsType& rhs, DstType& dst) const;
|
|
252
|
+
#endif
|
|
271
253
|
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
254
|
+
protected:
|
|
255
|
+
EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
|
|
256
|
+
|
|
257
|
+
/** \internal
|
|
258
|
+
* Used to compute and store the Cholesky decomposition A = L D L^* = U^* D U.
|
|
259
|
+
* The strict upper part is used during the decomposition, the strict lower
|
|
260
|
+
* part correspond to the coefficients of L (its diagonal is equal to 1 and
|
|
261
|
+
* is not stored), and the diagonal entries correspond to D.
|
|
262
|
+
*/
|
|
263
|
+
MatrixType m_matrix;
|
|
264
|
+
RealScalar m_l1_norm;
|
|
265
|
+
TranspositionType m_transpositions;
|
|
266
|
+
TmpMatrixType m_temporary;
|
|
267
|
+
internal::SignMatrix m_sign;
|
|
268
|
+
bool m_isInitialized;
|
|
269
|
+
ComputationInfo m_info;
|
|
285
270
|
};
|
|
286
271
|
|
|
287
272
|
namespace internal {
|
|
288
273
|
|
|
289
|
-
template<int UpLo>
|
|
274
|
+
template <int UpLo>
|
|
275
|
+
struct ldlt_inplace;
|
|
290
276
|
|
|
291
|
-
template<>
|
|
292
|
-
{
|
|
293
|
-
template<typename MatrixType, typename TranspositionType, typename Workspace>
|
|
294
|
-
static bool unblocked(MatrixType& mat, TranspositionType& transpositions, Workspace& temp, SignMatrix& sign)
|
|
295
|
-
{
|
|
277
|
+
template <>
|
|
278
|
+
struct ldlt_inplace<Lower> {
|
|
279
|
+
template <typename MatrixType, typename TranspositionType, typename Workspace>
|
|
280
|
+
static bool unblocked(MatrixType& mat, TranspositionType& transpositions, Workspace& temp, SignMatrix& sign) {
|
|
296
281
|
using std::abs;
|
|
297
282
|
typedef typename MatrixType::Scalar Scalar;
|
|
298
283
|
typedef typename MatrixType::RealScalar RealScalar;
|
|
299
284
|
typedef typename TranspositionType::StorageIndex IndexType;
|
|
300
|
-
eigen_assert(mat.rows()==mat.cols());
|
|
285
|
+
eigen_assert(mat.rows() == mat.cols());
|
|
301
286
|
const Index size = mat.rows();
|
|
302
287
|
bool found_zero_pivot = false;
|
|
303
288
|
bool ret = true;
|
|
304
289
|
|
|
305
|
-
if (size <= 1)
|
|
306
|
-
{
|
|
290
|
+
if (size <= 1) {
|
|
307
291
|
transpositions.setIdentity();
|
|
308
|
-
if(size==0)
|
|
309
|
-
|
|
310
|
-
else if (numext::real(mat.coeff(0,0))
|
|
311
|
-
|
|
292
|
+
if (size == 0)
|
|
293
|
+
sign = ZeroSign;
|
|
294
|
+
else if (numext::real(mat.coeff(0, 0)) > static_cast<RealScalar>(0))
|
|
295
|
+
sign = PositiveSemiDef;
|
|
296
|
+
else if (numext::real(mat.coeff(0, 0)) < static_cast<RealScalar>(0))
|
|
297
|
+
sign = NegativeSemiDef;
|
|
298
|
+
else
|
|
299
|
+
sign = ZeroSign;
|
|
312
300
|
return true;
|
|
313
301
|
}
|
|
314
302
|
|
|
315
|
-
for (Index k = 0; k < size; ++k)
|
|
316
|
-
{
|
|
303
|
+
for (Index k = 0; k < size; ++k) {
|
|
317
304
|
// Find largest diagonal element
|
|
318
305
|
Index index_of_biggest_in_corner;
|
|
319
|
-
mat.diagonal().tail(size-k).cwiseAbs().maxCoeff(&index_of_biggest_in_corner);
|
|
306
|
+
mat.diagonal().tail(size - k).cwiseAbs().maxCoeff(&index_of_biggest_in_corner);
|
|
320
307
|
index_of_biggest_in_corner += k;
|
|
321
308
|
|
|
322
309
|
transpositions.coeffRef(k) = IndexType(index_of_biggest_in_corner);
|
|
323
|
-
if(k != index_of_biggest_in_corner)
|
|
324
|
-
{
|
|
310
|
+
if (k != index_of_biggest_in_corner) {
|
|
325
311
|
// apply the transposition while taking care to consider only
|
|
326
312
|
// the lower triangular part
|
|
327
|
-
Index s = size-index_of_biggest_in_corner-1;
|
|
313
|
+
Index s = size - index_of_biggest_in_corner - 1; // trailing size after the biggest element
|
|
328
314
|
mat.row(k).head(k).swap(mat.row(index_of_biggest_in_corner).head(k));
|
|
329
315
|
mat.col(k).tail(s).swap(mat.col(index_of_biggest_in_corner).tail(s));
|
|
330
|
-
std::swap(mat.coeffRef(k,k),mat.coeffRef(index_of_biggest_in_corner,index_of_biggest_in_corner));
|
|
331
|
-
for(Index i=k+1;i<index_of_biggest_in_corner
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
mat.coeffRef(i
|
|
335
|
-
mat.coeffRef(index_of_biggest_in_corner,i) = numext::conj(tmp);
|
|
316
|
+
std::swap(mat.coeffRef(k, k), mat.coeffRef(index_of_biggest_in_corner, index_of_biggest_in_corner));
|
|
317
|
+
for (Index i = k + 1; i < index_of_biggest_in_corner; ++i) {
|
|
318
|
+
Scalar tmp = mat.coeffRef(i, k);
|
|
319
|
+
mat.coeffRef(i, k) = numext::conj(mat.coeffRef(index_of_biggest_in_corner, i));
|
|
320
|
+
mat.coeffRef(index_of_biggest_in_corner, i) = numext::conj(tmp);
|
|
336
321
|
}
|
|
337
|
-
if(NumTraits<Scalar>::IsComplex)
|
|
338
|
-
mat.coeffRef(index_of_biggest_in_corner,k) = numext::conj(mat.coeff(index_of_biggest_in_corner,k));
|
|
322
|
+
if (NumTraits<Scalar>::IsComplex)
|
|
323
|
+
mat.coeffRef(index_of_biggest_in_corner, k) = numext::conj(mat.coeff(index_of_biggest_in_corner, k));
|
|
339
324
|
}
|
|
340
325
|
|
|
341
326
|
// partition the matrix:
|
|
@@ -343,53 +328,53 @@ template<> struct ldlt_inplace<Lower>
|
|
|
343
328
|
// lu = A10 | A11 | -
|
|
344
329
|
// A20 | A21 | A22
|
|
345
330
|
Index rs = size - k - 1;
|
|
346
|
-
Block<MatrixType,Dynamic,1> A21(mat,k+1,k,rs,1);
|
|
347
|
-
Block<MatrixType,1,Dynamic> A10(mat,k,0,1,k);
|
|
348
|
-
Block<MatrixType,Dynamic,Dynamic> A20(mat,k+1,0,rs,k);
|
|
331
|
+
Block<MatrixType, Dynamic, 1> A21(mat, k + 1, k, rs, 1);
|
|
332
|
+
Block<MatrixType, 1, Dynamic> A10(mat, k, 0, 1, k);
|
|
333
|
+
Block<MatrixType, Dynamic, Dynamic> A20(mat, k + 1, 0, rs, k);
|
|
349
334
|
|
|
350
|
-
if(k>0)
|
|
351
|
-
{
|
|
335
|
+
if (k > 0) {
|
|
352
336
|
temp.head(k) = mat.diagonal().real().head(k).asDiagonal() * A10.adjoint();
|
|
353
|
-
mat.coeffRef(k,k) -= (A10 * temp.head(k)).value();
|
|
354
|
-
if(rs>0)
|
|
355
|
-
A21.noalias() -= A20 * temp.head(k);
|
|
337
|
+
mat.coeffRef(k, k) -= (A10 * temp.head(k)).value();
|
|
338
|
+
if (rs > 0) A21.noalias() -= A20 * temp.head(k);
|
|
356
339
|
}
|
|
357
340
|
|
|
358
341
|
// In some previous versions of Eigen (e.g., 3.2.1), the scaling was omitted if the pivot
|
|
359
342
|
// was smaller than the cutoff value. However, since LDLT is not rank-revealing
|
|
360
343
|
// we should only make sure that we do not introduce INF or NaN values.
|
|
361
344
|
// Remark that LAPACK also uses 0 as the cutoff value.
|
|
362
|
-
RealScalar realAkk = numext::real(mat.coeffRef(k,k));
|
|
345
|
+
RealScalar realAkk = numext::real(mat.coeffRef(k, k));
|
|
363
346
|
bool pivot_is_valid = (abs(realAkk) > RealScalar(0));
|
|
364
347
|
|
|
365
|
-
if(k==0 && !pivot_is_valid)
|
|
366
|
-
{
|
|
348
|
+
if (k == 0 && !pivot_is_valid) {
|
|
367
349
|
// The entire diagonal is zero, there is nothing more to do
|
|
368
350
|
// except filling the transpositions, and checking whether the matrix is zero.
|
|
369
351
|
sign = ZeroSign;
|
|
370
|
-
for(Index j = 0; j<size; ++j)
|
|
371
|
-
{
|
|
352
|
+
for (Index j = 0; j < size; ++j) {
|
|
372
353
|
transpositions.coeffRef(j) = IndexType(j);
|
|
373
|
-
ret = ret && (mat.col(j).tail(size-j-1).array()==Scalar(0)).all();
|
|
354
|
+
ret = ret && (mat.col(j).tail(size - j - 1).array() == Scalar(0)).all();
|
|
374
355
|
}
|
|
375
356
|
return ret;
|
|
376
357
|
}
|
|
377
358
|
|
|
378
|
-
if((rs>0) && pivot_is_valid)
|
|
359
|
+
if ((rs > 0) && pivot_is_valid)
|
|
379
360
|
A21 /= realAkk;
|
|
380
|
-
else if(rs>0)
|
|
381
|
-
ret = ret && (A21.array()==Scalar(0)).all();
|
|
361
|
+
else if (rs > 0)
|
|
362
|
+
ret = ret && (A21.array() == Scalar(0)).all();
|
|
382
363
|
|
|
383
|
-
if(found_zero_pivot && pivot_is_valid)
|
|
384
|
-
|
|
364
|
+
if (found_zero_pivot && pivot_is_valid)
|
|
365
|
+
ret = false; // factorization failed
|
|
366
|
+
else if (!pivot_is_valid)
|
|
367
|
+
found_zero_pivot = true;
|
|
385
368
|
|
|
386
369
|
if (sign == PositiveSemiDef) {
|
|
387
370
|
if (realAkk < static_cast<RealScalar>(0)) sign = Indefinite;
|
|
388
371
|
} else if (sign == NegativeSemiDef) {
|
|
389
372
|
if (realAkk > static_cast<RealScalar>(0)) sign = Indefinite;
|
|
390
373
|
} else if (sign == ZeroSign) {
|
|
391
|
-
if (realAkk > static_cast<RealScalar>(0))
|
|
392
|
-
|
|
374
|
+
if (realAkk > static_cast<RealScalar>(0))
|
|
375
|
+
sign = PositiveSemiDef;
|
|
376
|
+
else if (realAkk < static_cast<RealScalar>(0))
|
|
377
|
+
sign = NegativeSemiDef;
|
|
393
378
|
}
|
|
394
379
|
}
|
|
395
380
|
|
|
@@ -403,98 +388,91 @@ template<> struct ldlt_inplace<Lower>
|
|
|
403
388
|
// original matrix is not of full rank.
|
|
404
389
|
// Here only rank-1 updates are implemented, to reduce the
|
|
405
390
|
// requirement for intermediate storage and improve accuracy
|
|
406
|
-
template<typename MatrixType, typename WDerived>
|
|
407
|
-
static bool updateInPlace(MatrixType& mat, MatrixBase<WDerived>& w,
|
|
408
|
-
|
|
391
|
+
template <typename MatrixType, typename WDerived>
|
|
392
|
+
static bool updateInPlace(MatrixType& mat, MatrixBase<WDerived>& w,
|
|
393
|
+
const typename MatrixType::RealScalar& sigma = 1) {
|
|
409
394
|
using numext::isfinite;
|
|
410
395
|
typedef typename MatrixType::Scalar Scalar;
|
|
411
396
|
typedef typename MatrixType::RealScalar RealScalar;
|
|
412
397
|
|
|
413
398
|
const Index size = mat.rows();
|
|
414
|
-
eigen_assert(mat.cols() == size && w.size()==size);
|
|
399
|
+
eigen_assert(mat.cols() == size && w.size() == size);
|
|
415
400
|
|
|
416
401
|
RealScalar alpha = 1;
|
|
417
402
|
|
|
418
403
|
// Apply the update
|
|
419
|
-
for (Index j = 0; j < size; j++)
|
|
420
|
-
{
|
|
404
|
+
for (Index j = 0; j < size; j++) {
|
|
421
405
|
// Check for termination due to an original decomposition of low-rank
|
|
422
|
-
if (!(isfinite)(alpha))
|
|
423
|
-
break;
|
|
406
|
+
if (!(isfinite)(alpha)) break;
|
|
424
407
|
|
|
425
408
|
// Update the diagonal terms
|
|
426
|
-
RealScalar dj = numext::real(mat.coeff(j,j));
|
|
409
|
+
RealScalar dj = numext::real(mat.coeff(j, j));
|
|
427
410
|
Scalar wj = w.coeff(j);
|
|
428
|
-
RealScalar swj2 = sigma*numext::abs2(wj);
|
|
429
|
-
RealScalar gamma = dj*alpha + swj2;
|
|
430
|
-
|
|
431
|
-
mat.coeffRef(j,j) += swj2/alpha;
|
|
432
|
-
alpha += swj2/dj;
|
|
411
|
+
RealScalar swj2 = sigma * numext::abs2(wj);
|
|
412
|
+
RealScalar gamma = dj * alpha + swj2;
|
|
433
413
|
|
|
414
|
+
mat.coeffRef(j, j) += swj2 / alpha;
|
|
415
|
+
alpha += swj2 / dj;
|
|
434
416
|
|
|
435
417
|
// Update the terms of L
|
|
436
|
-
Index rs = size-j-1;
|
|
418
|
+
Index rs = size - j - 1;
|
|
437
419
|
w.tail(rs) -= wj * mat.col(j).tail(rs);
|
|
438
|
-
if(gamma
|
|
439
|
-
mat.col(j).tail(rs) += (sigma*numext::conj(wj)/gamma)*w.tail(rs);
|
|
420
|
+
if (!numext::is_exactly_zero(gamma)) mat.col(j).tail(rs) += (sigma * numext::conj(wj) / gamma) * w.tail(rs);
|
|
440
421
|
}
|
|
441
422
|
return true;
|
|
442
423
|
}
|
|
443
424
|
|
|
444
|
-
template<typename MatrixType, typename TranspositionType, typename Workspace, typename WType>
|
|
445
|
-
static bool update(MatrixType& mat, const TranspositionType& transpositions, Workspace& tmp, const WType& w,
|
|
446
|
-
|
|
425
|
+
template <typename MatrixType, typename TranspositionType, typename Workspace, typename WType>
|
|
426
|
+
static bool update(MatrixType& mat, const TranspositionType& transpositions, Workspace& tmp, const WType& w,
|
|
427
|
+
const typename MatrixType::RealScalar& sigma = 1) {
|
|
447
428
|
// Apply the permutation to the input w
|
|
448
429
|
tmp = transpositions * w;
|
|
449
430
|
|
|
450
|
-
return ldlt_inplace<Lower>::updateInPlace(mat,tmp,sigma);
|
|
431
|
+
return ldlt_inplace<Lower>::updateInPlace(mat, tmp, sigma);
|
|
451
432
|
}
|
|
452
433
|
};
|
|
453
434
|
|
|
454
|
-
template<>
|
|
455
|
-
{
|
|
456
|
-
template<typename MatrixType, typename TranspositionType, typename Workspace>
|
|
457
|
-
static EIGEN_STRONG_INLINE bool unblocked(MatrixType& mat, TranspositionType& transpositions, Workspace& temp,
|
|
458
|
-
|
|
435
|
+
template <>
|
|
436
|
+
struct ldlt_inplace<Upper> {
|
|
437
|
+
template <typename MatrixType, typename TranspositionType, typename Workspace>
|
|
438
|
+
static EIGEN_STRONG_INLINE bool unblocked(MatrixType& mat, TranspositionType& transpositions, Workspace& temp,
|
|
439
|
+
SignMatrix& sign) {
|
|
459
440
|
Transpose<MatrixType> matt(mat);
|
|
460
441
|
return ldlt_inplace<Lower>::unblocked(matt, transpositions, temp, sign);
|
|
461
442
|
}
|
|
462
443
|
|
|
463
|
-
template<typename MatrixType, typename TranspositionType, typename Workspace, typename WType>
|
|
464
|
-
static EIGEN_STRONG_INLINE bool update(MatrixType& mat, TranspositionType& transpositions, Workspace& tmp, WType& w,
|
|
465
|
-
|
|
444
|
+
template <typename MatrixType, typename TranspositionType, typename Workspace, typename WType>
|
|
445
|
+
static EIGEN_STRONG_INLINE bool update(MatrixType& mat, TranspositionType& transpositions, Workspace& tmp, WType& w,
|
|
446
|
+
const typename MatrixType::RealScalar& sigma = 1) {
|
|
466
447
|
Transpose<MatrixType> matt(mat);
|
|
467
448
|
return ldlt_inplace<Lower>::update(matt, transpositions, tmp, w.conjugate(), sigma);
|
|
468
449
|
}
|
|
469
450
|
};
|
|
470
451
|
|
|
471
|
-
template<typename MatrixType>
|
|
472
|
-
{
|
|
452
|
+
template <typename MatrixType>
|
|
453
|
+
struct LDLT_Traits<MatrixType, Lower> {
|
|
473
454
|
typedef const TriangularView<const MatrixType, UnitLower> MatrixL;
|
|
474
455
|
typedef const TriangularView<const typename MatrixType::AdjointReturnType, UnitUpper> MatrixU;
|
|
475
456
|
static inline MatrixL getL(const MatrixType& m) { return MatrixL(m); }
|
|
476
457
|
static inline MatrixU getU(const MatrixType& m) { return MatrixU(m.adjoint()); }
|
|
477
458
|
};
|
|
478
459
|
|
|
479
|
-
template<typename MatrixType>
|
|
480
|
-
{
|
|
460
|
+
template <typename MatrixType>
|
|
461
|
+
struct LDLT_Traits<MatrixType, Upper> {
|
|
481
462
|
typedef const TriangularView<const typename MatrixType::AdjointReturnType, UnitLower> MatrixL;
|
|
482
463
|
typedef const TriangularView<const MatrixType, UnitUpper> MatrixU;
|
|
483
464
|
static inline MatrixL getL(const MatrixType& m) { return MatrixL(m.adjoint()); }
|
|
484
465
|
static inline MatrixU getU(const MatrixType& m) { return MatrixU(m); }
|
|
485
466
|
};
|
|
486
467
|
|
|
487
|
-
}
|
|
468
|
+
} // end namespace internal
|
|
488
469
|
|
|
489
470
|
/** Compute / recompute the LDLT decomposition A = L D L^* = U^* D U of \a matrix
|
|
490
|
-
|
|
491
|
-
template<typename MatrixType, int
|
|
492
|
-
template<typename InputType>
|
|
493
|
-
LDLT<MatrixType,
|
|
494
|
-
|
|
495
|
-
check_template_parameters();
|
|
496
|
-
|
|
497
|
-
eigen_assert(a.rows()==a.cols());
|
|
471
|
+
*/
|
|
472
|
+
template <typename MatrixType, int UpLo_>
|
|
473
|
+
template <typename InputType>
|
|
474
|
+
LDLT<MatrixType, UpLo_>& LDLT<MatrixType, UpLo_>::compute(const EigenBase<InputType>& a) {
|
|
475
|
+
eigen_assert(a.rows() == a.cols());
|
|
498
476
|
const Index size = a.rows();
|
|
499
477
|
|
|
500
478
|
m_matrix = a.derived();
|
|
@@ -504,12 +482,13 @@ LDLT<MatrixType,_UpLo>& LDLT<MatrixType,_UpLo>::compute(const EigenBase<InputTyp
|
|
|
504
482
|
// TODO move this code to SelfAdjointView
|
|
505
483
|
for (Index col = 0; col < size; ++col) {
|
|
506
484
|
RealScalar abs_col_sum;
|
|
507
|
-
if (
|
|
508
|
-
abs_col_sum =
|
|
485
|
+
if (UpLo_ == Lower)
|
|
486
|
+
abs_col_sum =
|
|
487
|
+
m_matrix.col(col).tail(size - col).template lpNorm<1>() + m_matrix.row(col).head(col).template lpNorm<1>();
|
|
509
488
|
else
|
|
510
|
-
abs_col_sum =
|
|
511
|
-
|
|
512
|
-
|
|
489
|
+
abs_col_sum =
|
|
490
|
+
m_matrix.col(col).head(col).template lpNorm<1>() + m_matrix.row(col).tail(size - col).template lpNorm<1>();
|
|
491
|
+
if (abs_col_sum > m_l1_norm) m_l1_norm = abs_col_sum;
|
|
513
492
|
}
|
|
514
493
|
|
|
515
494
|
m_transpositions.resize(size);
|
|
@@ -517,7 +496,8 @@ LDLT<MatrixType,_UpLo>& LDLT<MatrixType,_UpLo>::compute(const EigenBase<InputTyp
|
|
|
517
496
|
m_temporary.resize(size);
|
|
518
497
|
m_sign = internal::ZeroSign;
|
|
519
498
|
|
|
520
|
-
m_info = internal::ldlt_inplace<UpLo>::unblocked(m_matrix, m_transpositions, m_temporary, m_sign) ? Success
|
|
499
|
+
m_info = internal::ldlt_inplace<UpLo>::unblocked(m_matrix, m_transpositions, m_temporary, m_sign) ? Success
|
|
500
|
+
: NumericalIssue;
|
|
521
501
|
|
|
522
502
|
m_isInitialized = true;
|
|
523
503
|
return *this;
|
|
@@ -525,28 +505,24 @@ LDLT<MatrixType,_UpLo>& LDLT<MatrixType,_UpLo>::compute(const EigenBase<InputTyp
|
|
|
525
505
|
|
|
526
506
|
/** Update the LDLT decomposition: given A = L D L^T, efficiently compute the decomposition of A + sigma w w^T.
|
|
527
507
|
* \param w a vector to be incorporated into the decomposition.
|
|
528
|
-
* \param sigma a scalar, +1 for updates and -1 for "downdates," which correspond to removing previously-added column
|
|
529
|
-
* \sa setZero()
|
|
530
|
-
|
|
531
|
-
template<typename MatrixType, int
|
|
532
|
-
template<typename Derived>
|
|
533
|
-
LDLT<MatrixType,
|
|
534
|
-
{
|
|
508
|
+
* \param sigma a scalar, +1 for updates and -1 for "downdates," which correspond to removing previously-added column
|
|
509
|
+
* vectors. Optional; default value is +1. \sa setZero()
|
|
510
|
+
*/
|
|
511
|
+
template <typename MatrixType, int UpLo_>
|
|
512
|
+
template <typename Derived>
|
|
513
|
+
LDLT<MatrixType, UpLo_>& LDLT<MatrixType, UpLo_>::rankUpdate(
|
|
514
|
+
const MatrixBase<Derived>& w, const typename LDLT<MatrixType, UpLo_>::RealScalar& sigma) {
|
|
535
515
|
typedef typename TranspositionType::StorageIndex IndexType;
|
|
536
516
|
const Index size = w.rows();
|
|
537
|
-
if (m_isInitialized)
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
else
|
|
542
|
-
{
|
|
543
|
-
m_matrix.resize(size,size);
|
|
517
|
+
if (m_isInitialized) {
|
|
518
|
+
eigen_assert(m_matrix.rows() == size);
|
|
519
|
+
} else {
|
|
520
|
+
m_matrix.resize(size, size);
|
|
544
521
|
m_matrix.setZero();
|
|
545
522
|
m_transpositions.resize(size);
|
|
546
|
-
for (Index i = 0; i < size; i++)
|
|
547
|
-
m_transpositions.coeffRef(i) = IndexType(i);
|
|
523
|
+
for (Index i = 0; i < size; i++) m_transpositions.coeffRef(i) = IndexType(i);
|
|
548
524
|
m_temporary.resize(size);
|
|
549
|
-
m_sign = sigma>=0 ? internal::PositiveSemiDef : internal::NegativeSemiDef;
|
|
525
|
+
m_sign = sigma >= 0 ? internal::PositiveSemiDef : internal::NegativeSemiDef;
|
|
550
526
|
m_isInitialized = true;
|
|
551
527
|
}
|
|
552
528
|
|
|
@@ -556,63 +532,67 @@ LDLT<MatrixType,_UpLo>& LDLT<MatrixType,_UpLo>::rankUpdate(const MatrixBase<Deri
|
|
|
556
532
|
}
|
|
557
533
|
|
|
558
534
|
#ifndef EIGEN_PARSED_BY_DOXYGEN
|
|
559
|
-
template<typename
|
|
560
|
-
template<typename RhsType, typename DstType>
|
|
561
|
-
void LDLT<
|
|
562
|
-
|
|
563
|
-
|
|
535
|
+
template <typename MatrixType_, int UpLo_>
|
|
536
|
+
template <typename RhsType, typename DstType>
|
|
537
|
+
void LDLT<MatrixType_, UpLo_>::_solve_impl(const RhsType& rhs, DstType& dst) const {
|
|
538
|
+
_solve_impl_transposed<true>(rhs, dst);
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
template <typename MatrixType_, int UpLo_>
|
|
542
|
+
template <bool Conjugate, typename RhsType, typename DstType>
|
|
543
|
+
void LDLT<MatrixType_, UpLo_>::_solve_impl_transposed(const RhsType& rhs, DstType& dst) const {
|
|
564
544
|
// dst = P b
|
|
565
545
|
dst = m_transpositions * rhs;
|
|
566
546
|
|
|
567
547
|
// dst = L^-1 (P b)
|
|
568
|
-
|
|
548
|
+
// dst = L^-*T (P b)
|
|
549
|
+
matrixL().template conjugateIf<!Conjugate>().solveInPlace(dst);
|
|
569
550
|
|
|
570
|
-
// dst = D
|
|
551
|
+
// dst = D^-* (L^-1 P b)
|
|
552
|
+
// dst = D^-1 (L^-*T P b)
|
|
571
553
|
// more precisely, use pseudo-inverse of D (see bug 241)
|
|
572
554
|
using std::abs;
|
|
573
555
|
const typename Diagonal<const MatrixType>::RealReturnType vecD(vectorD());
|
|
574
556
|
// In some previous versions, tolerance was set to the max of 1/highest (or rather numeric_limits::min())
|
|
575
557
|
// and the maximal diagonal entry * epsilon as motivated by LAPACK's xGELSS:
|
|
576
|
-
// RealScalar tolerance = numext::maxi(vecD.array().abs().maxCoeff() * NumTraits<RealScalar>::epsilon(),RealScalar(1)
|
|
577
|
-
// However, LDLT is not rank revealing, and so adjusting the tolerance wrt to the
|
|
578
|
-
// diagonal element is not well justified and leads to numerical issues in some cases.
|
|
579
|
-
//
|
|
580
|
-
// Using numeric_limits::min() gives us more robustness to denormals.
|
|
558
|
+
// RealScalar tolerance = numext::maxi(vecD.array().abs().maxCoeff() * NumTraits<RealScalar>::epsilon(),RealScalar(1)
|
|
559
|
+
// / NumTraits<RealScalar>::highest()); However, LDLT is not rank revealing, and so adjusting the tolerance wrt to the
|
|
560
|
+
// highest diagonal element is not well justified and leads to numerical issues in some cases. Moreover, Lapack's
|
|
561
|
+
// xSYTRS routines use 0 for the tolerance. Using numeric_limits::min() gives us more robustness to denormals.
|
|
581
562
|
RealScalar tolerance = (std::numeric_limits<RealScalar>::min)();
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
{
|
|
585
|
-
if(abs(vecD(i)) > tolerance)
|
|
563
|
+
for (Index i = 0; i < vecD.size(); ++i) {
|
|
564
|
+
if (abs(vecD(i)) > tolerance)
|
|
586
565
|
dst.row(i) /= vecD(i);
|
|
587
566
|
else
|
|
588
567
|
dst.row(i).setZero();
|
|
589
568
|
}
|
|
590
569
|
|
|
591
|
-
// dst = L
|
|
592
|
-
|
|
570
|
+
// dst = L^-* (D^-* L^-1 P b)
|
|
571
|
+
// dst = L^-T (D^-1 L^-*T P b)
|
|
572
|
+
matrixL().transpose().template conjugateIf<Conjugate>().solveInPlace(dst);
|
|
593
573
|
|
|
594
|
-
// dst = P
|
|
574
|
+
// dst = P^T (L^-* D^-* L^-1 P b) = A^-1 b
|
|
575
|
+
// dst = P^-T (L^-T D^-1 L^-*T P b) = A^-1 b
|
|
595
576
|
dst = m_transpositions.transpose() * dst;
|
|
596
577
|
}
|
|
597
578
|
#endif
|
|
598
579
|
|
|
599
580
|
/** \internal use x = ldlt_object.solve(x);
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
template<typename MatrixType,int
|
|
613
|
-
template<typename Derived>
|
|
614
|
-
bool LDLT<MatrixType,
|
|
615
|
-
{
|
|
581
|
+
*
|
|
582
|
+
* This is the \em in-place version of solve().
|
|
583
|
+
*
|
|
584
|
+
* \param bAndX represents both the right-hand side matrix b and result x.
|
|
585
|
+
*
|
|
586
|
+
* \returns true always! If you need to check for existence of solutions, use another decomposition like LU, QR, or SVD.
|
|
587
|
+
*
|
|
588
|
+
* This version avoids a copy when the right hand side matrix b is not
|
|
589
|
+
* needed anymore.
|
|
590
|
+
*
|
|
591
|
+
* \sa LDLT::solve(), MatrixBase::ldlt()
|
|
592
|
+
*/
|
|
593
|
+
template <typename MatrixType, int UpLo_>
|
|
594
|
+
template <typename Derived>
|
|
595
|
+
bool LDLT<MatrixType, UpLo_>::solveInPlace(MatrixBase<Derived>& bAndX) const {
|
|
616
596
|
eigen_assert(m_isInitialized && "LDLT is not initialized.");
|
|
617
597
|
eigen_assert(m_matrix.rows() == bAndX.rows());
|
|
618
598
|
|
|
@@ -624,12 +604,11 @@ bool LDLT<MatrixType,_UpLo>::solveInPlace(MatrixBase<Derived> &bAndX) const
|
|
|
624
604
|
/** \returns the matrix represented by the decomposition,
|
|
625
605
|
* i.e., it returns the product: P^T L D L^* P.
|
|
626
606
|
* This function is provided for debug purpose. */
|
|
627
|
-
template<typename MatrixType, int
|
|
628
|
-
MatrixType LDLT<MatrixType,
|
|
629
|
-
{
|
|
607
|
+
template <typename MatrixType, int UpLo_>
|
|
608
|
+
MatrixType LDLT<MatrixType, UpLo_>::reconstructedMatrix() const {
|
|
630
609
|
eigen_assert(m_isInitialized && "LDLT is not initialized.");
|
|
631
610
|
const Index size = m_matrix.rows();
|
|
632
|
-
MatrixType res(size,size);
|
|
611
|
+
MatrixType res(size, size);
|
|
633
612
|
|
|
634
613
|
// P
|
|
635
614
|
res.setIdentity();
|
|
@@ -647,27 +626,24 @@ MatrixType LDLT<MatrixType,_UpLo>::reconstructedMatrix() const
|
|
|
647
626
|
}
|
|
648
627
|
|
|
649
628
|
/** \cholesky_module
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
template<typename MatrixType, unsigned int UpLo>
|
|
629
|
+
* \returns the Cholesky decomposition with full pivoting without square root of \c *this
|
|
630
|
+
* \sa MatrixBase::ldlt()
|
|
631
|
+
*/
|
|
632
|
+
template <typename MatrixType, unsigned int UpLo>
|
|
654
633
|
inline const LDLT<typename SelfAdjointView<MatrixType, UpLo>::PlainObject, UpLo>
|
|
655
|
-
SelfAdjointView<MatrixType, UpLo>::ldlt() const
|
|
656
|
-
|
|
657
|
-
return LDLT<PlainObject,UpLo>(m_matrix);
|
|
634
|
+
SelfAdjointView<MatrixType, UpLo>::ldlt() const {
|
|
635
|
+
return LDLT<PlainObject, UpLo>(m_matrix);
|
|
658
636
|
}
|
|
659
637
|
|
|
660
638
|
/** \cholesky_module
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
template<typename Derived>
|
|
665
|
-
inline const LDLT<typename MatrixBase<Derived>::PlainObject>
|
|
666
|
-
MatrixBase<Derived>::ldlt() const
|
|
667
|
-
{
|
|
639
|
+
* \returns the Cholesky decomposition with full pivoting without square root of \c *this
|
|
640
|
+
* \sa SelfAdjointView::ldlt()
|
|
641
|
+
*/
|
|
642
|
+
template <typename Derived>
|
|
643
|
+
inline const LDLT<typename MatrixBase<Derived>::PlainObject> MatrixBase<Derived>::ldlt() const {
|
|
668
644
|
return LDLT<PlainObject>(derived());
|
|
669
645
|
}
|
|
670
646
|
|
|
671
|
-
}
|
|
647
|
+
} // end namespace Eigen
|
|
672
648
|
|
|
673
|
-
#endif
|
|
649
|
+
#endif // EIGEN_LDLT_H
|