@smake/eigen 1.1.0 → 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 -20
- package/eigen/Eigen/CholmodSupport +28 -28
- package/eigen/Eigen/Core +187 -120
- package/eigen/Eigen/Eigenvalues +16 -13
- package/eigen/Eigen/Geometry +18 -18
- package/eigen/Eigen/Householder +9 -7
- package/eigen/Eigen/IterativeLinearSolvers +8 -4
- package/eigen/Eigen/Jacobi +14 -13
- package/eigen/Eigen/KLUSupport +23 -21
- package/eigen/Eigen/LU +15 -16
- package/eigen/Eigen/MetisSupport +12 -12
- package/eigen/Eigen/OrderingMethods +54 -51
- package/eigen/Eigen/PaStiXSupport +23 -21
- package/eigen/Eigen/PardisoSupport +17 -14
- package/eigen/Eigen/QR +18 -20
- package/eigen/Eigen/QtAlignedMalloc +5 -12
- package/eigen/Eigen/SPQRSupport +21 -14
- package/eigen/Eigen/SVD +23 -17
- package/eigen/Eigen/Sparse +1 -2
- package/eigen/Eigen/SparseCholesky +18 -15
- package/eigen/Eigen/SparseCore +18 -17
- package/eigen/Eigen/SparseLU +9 -9
- 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 +366 -405
- package/eigen/Eigen/src/Cholesky/LLT.h +323 -367
- package/eigen/Eigen/src/Cholesky/LLT_LAPACKE.h +81 -56
- package/eigen/Eigen/src/CholmodSupport/CholmodSupport.h +585 -529
- package/eigen/Eigen/src/CholmodSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Core/ArithmeticSequence.h +143 -317
- package/eigen/Eigen/src/Core/Array.h +329 -370
- package/eigen/Eigen/src/Core/ArrayBase.h +190 -203
- package/eigen/Eigen/src/Core/ArrayWrapper.h +126 -170
- package/eigen/Eigen/src/Core/Assign.h +30 -40
- package/eigen/Eigen/src/Core/AssignEvaluator.h +651 -604
- package/eigen/Eigen/src/Core/Assign_MKL.h +125 -120
- package/eigen/Eigen/src/Core/BandMatrix.h +267 -282
- package/eigen/Eigen/src/Core/Block.h +371 -390
- package/eigen/Eigen/src/Core/CommaInitializer.h +85 -100
- package/eigen/Eigen/src/Core/ConditionEstimator.h +51 -53
- package/eigen/Eigen/src/Core/CoreEvaluators.h +1214 -937
- package/eigen/Eigen/src/Core/CoreIterators.h +72 -63
- package/eigen/Eigen/src/Core/CwiseBinaryOp.h +112 -129
- package/eigen/Eigen/src/Core/CwiseNullaryOp.h +676 -702
- package/eigen/Eigen/src/Core/CwiseTernaryOp.h +77 -103
- package/eigen/Eigen/src/Core/CwiseUnaryOp.h +55 -67
- package/eigen/Eigen/src/Core/CwiseUnaryView.h +127 -92
- package/eigen/Eigen/src/Core/DenseBase.h +630 -658
- package/eigen/Eigen/src/Core/DenseCoeffsBase.h +511 -628
- package/eigen/Eigen/src/Core/DenseStorage.h +511 -590
- package/eigen/Eigen/src/Core/DeviceWrapper.h +153 -0
- package/eigen/Eigen/src/Core/Diagonal.h +168 -207
- package/eigen/Eigen/src/Core/DiagonalMatrix.h +346 -317
- package/eigen/Eigen/src/Core/DiagonalProduct.h +12 -10
- package/eigen/Eigen/src/Core/Dot.h +167 -217
- package/eigen/Eigen/src/Core/EigenBase.h +74 -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 -113
- package/eigen/Eigen/src/Core/Fuzzy.h +82 -105
- package/eigen/Eigen/src/Core/GeneralProduct.h +315 -261
- package/eigen/Eigen/src/Core/GenericPacketMath.h +1182 -520
- package/eigen/Eigen/src/Core/GlobalFunctions.h +193 -157
- package/eigen/Eigen/src/Core/IO.h +131 -156
- package/eigen/Eigen/src/Core/IndexedView.h +209 -125
- 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 +50 -59
- package/eigen/Eigen/src/Core/Map.h +123 -141
- package/eigen/Eigen/src/Core/MapBase.h +255 -282
- package/eigen/Eigen/src/Core/MathFunctions.h +1247 -1201
- package/eigen/Eigen/src/Core/MathFunctionsImpl.h +162 -99
- package/eigen/Eigen/src/Core/Matrix.h +463 -494
- package/eigen/Eigen/src/Core/MatrixBase.h +468 -470
- package/eigen/Eigen/src/Core/NestByValue.h +58 -52
- package/eigen/Eigen/src/Core/NoAlias.h +79 -86
- package/eigen/Eigen/src/Core/NumTraits.h +206 -206
- package/eigen/Eigen/src/Core/PartialReduxEvaluator.h +163 -142
- package/eigen/Eigen/src/Core/PermutationMatrix.h +461 -511
- package/eigen/Eigen/src/Core/PlainObjectBase.h +858 -972
- package/eigen/Eigen/src/Core/Product.h +246 -130
- package/eigen/Eigen/src/Core/ProductEvaluators.h +779 -671
- package/eigen/Eigen/src/Core/Random.h +153 -164
- 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 +334 -314
- package/eigen/Eigen/src/Core/Ref.h +259 -257
- package/eigen/Eigen/src/Core/Replicate.h +92 -104
- package/eigen/Eigen/src/Core/Reshaped.h +215 -271
- package/eigen/Eigen/src/Core/ReturnByValue.h +47 -55
- package/eigen/Eigen/src/Core/Reverse.h +133 -148
- package/eigen/Eigen/src/Core/Select.h +68 -140
- package/eigen/Eigen/src/Core/SelfAdjointView.h +254 -290
- 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 +88 -102
- package/eigen/Eigen/src/Core/SolveTriangular.h +126 -124
- package/eigen/Eigen/src/Core/SolverBase.h +132 -133
- package/eigen/Eigen/src/Core/StableNorm.h +113 -147
- package/eigen/Eigen/src/Core/StlIterators.h +404 -248
- package/eigen/Eigen/src/Core/Stride.h +90 -92
- package/eigen/Eigen/src/Core/Swap.h +70 -39
- package/eigen/Eigen/src/Core/Transpose.h +258 -295
- package/eigen/Eigen/src/Core/Transpositions.h +270 -333
- package/eigen/Eigen/src/Core/TriangularMatrix.h +642 -743
- package/eigen/Eigen/src/Core/VectorBlock.h +59 -72
- package/eigen/Eigen/src/Core/VectorwiseOp.h +653 -704
- package/eigen/Eigen/src/Core/Visitor.h +464 -308
- package/eigen/Eigen/src/Core/arch/AVX/Complex.h +380 -187
- package/eigen/Eigen/src/Core/arch/AVX/MathFunctions.h +65 -163
- package/eigen/Eigen/src/Core/arch/AVX/PacketMath.h +2145 -638
- package/eigen/Eigen/src/Core/arch/AVX/Reductions.h +353 -0
- package/eigen/Eigen/src/Core/arch/AVX/TypeCasting.h +253 -60
- package/eigen/Eigen/src/Core/arch/AVX512/Complex.h +278 -228
- package/eigen/Eigen/src/Core/arch/AVX512/GemmKernel.h +1245 -0
- package/eigen/Eigen/src/Core/arch/AVX512/MathFunctions.h +48 -269
- package/eigen/Eigen/src/Core/arch/AVX512/MathFunctionsFP16.h +75 -0
- package/eigen/Eigen/src/Core/arch/AVX512/PacketMath.h +1597 -754
- 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 +229 -41
- package/eigen/Eigen/src/Core/arch/AVX512/TypeCastingFP16.h +130 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/Complex.h +420 -184
- package/eigen/Eigen/src/Core/arch/AltiVec/MathFunctions.h +40 -49
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProduct.h +2962 -2213
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h +196 -212
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductMMA.h +713 -441
- 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 +2380 -1362
- package/eigen/Eigen/src/Core/arch/AltiVec/TypeCasting.h +153 -0
- package/eigen/Eigen/src/Core/arch/Default/BFloat16.h +390 -224
- package/eigen/Eigen/src/Core/arch/Default/ConjHelper.h +78 -67
- package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h +1784 -799
- package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h +167 -50
- package/eigen/Eigen/src/Core/arch/Default/Half.h +528 -379
- package/eigen/Eigen/src/Core/arch/Default/Settings.h +10 -12
- package/eigen/Eigen/src/Core/arch/GPU/Complex.h +244 -0
- package/eigen/Eigen/src/Core/arch/GPU/MathFunctions.h +41 -40
- package/eigen/Eigen/src/Core/arch/GPU/PacketMath.h +550 -523
- package/eigen/Eigen/src/Core/arch/GPU/Tuple.h +268 -0
- package/eigen/Eigen/src/Core/arch/GPU/TypeCasting.h +27 -30
- package/eigen/Eigen/src/Core/arch/HIP/hcc/math_constants.h +8 -8
- 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 +54 -82
- package/eigen/Eigen/src/Core/arch/MSA/MathFunctions.h +84 -92
- package/eigen/Eigen/src/Core/arch/MSA/PacketMath.h +51 -47
- package/eigen/Eigen/src/Core/arch/NEON/Complex.h +454 -306
- package/eigen/Eigen/src/Core/arch/NEON/GeneralBlockPanelKernel.h +175 -115
- package/eigen/Eigen/src/Core/arch/NEON/MathFunctions.h +23 -30
- package/eigen/Eigen/src/Core/arch/NEON/PacketMath.h +4366 -2857
- package/eigen/Eigen/src/Core/arch/NEON/TypeCasting.h +616 -393
- package/eigen/Eigen/src/Core/arch/NEON/UnaryFunctors.h +57 -0
- package/eigen/Eigen/src/Core/arch/SSE/Complex.h +350 -198
- package/eigen/Eigen/src/Core/arch/SSE/MathFunctions.h +38 -149
- package/eigen/Eigen/src/Core/arch/SSE/PacketMath.h +1791 -912
- package/eigen/Eigen/src/Core/arch/SSE/Reductions.h +324 -0
- package/eigen/Eigen/src/Core/arch/SSE/TypeCasting.h +128 -40
- package/eigen/Eigen/src/Core/arch/SVE/MathFunctions.h +10 -6
- package/eigen/Eigen/src/Core/arch/SVE/PacketMath.h +156 -234
- package/eigen/Eigen/src/Core/arch/SVE/TypeCasting.h +6 -3
- package/eigen/Eigen/src/Core/arch/SYCL/InteropHeaders.h +27 -32
- package/eigen/Eigen/src/Core/arch/SYCL/MathFunctions.h +119 -117
- package/eigen/Eigen/src/Core/arch/SYCL/PacketMath.h +325 -419
- package/eigen/Eigen/src/Core/arch/SYCL/TypeCasting.h +15 -17
- package/eigen/Eigen/src/Core/arch/ZVector/Complex.h +325 -181
- package/eigen/Eigen/src/Core/arch/ZVector/MathFunctions.h +94 -83
- package/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h +811 -458
- package/eigen/Eigen/src/Core/functors/AssignmentFunctors.h +121 -124
- package/eigen/Eigen/src/Core/functors/BinaryFunctors.h +576 -370
- package/eigen/Eigen/src/Core/functors/NullaryFunctors.h +194 -109
- package/eigen/Eigen/src/Core/functors/StlFunctors.h +95 -112
- package/eigen/Eigen/src/Core/functors/TernaryFunctors.h +34 -7
- package/eigen/Eigen/src/Core/functors/UnaryFunctors.h +1038 -749
- package/eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h +1883 -1375
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix.h +312 -370
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +189 -176
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h +84 -81
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix_BLAS.h +154 -73
- package/eigen/Eigen/src/Core/products/GeneralMatrixVector.h +292 -337
- package/eigen/Eigen/src/Core/products/GeneralMatrixVector_BLAS.h +80 -77
- package/eigen/Eigen/src/Core/products/Parallelizer.h +207 -105
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +327 -388
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix_BLAS.h +206 -224
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixVector.h +138 -147
- 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 -47
- 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 -277
- package/eigen/Eigen/src/Core/products/TriangularSolverMatrix_BLAS.h +108 -109
- package/eigen/Eigen/src/Core/products/TriangularSolverVector.h +68 -94
- package/eigen/Eigen/src/Core/util/Assert.h +158 -0
- package/eigen/Eigen/src/Core/util/BlasUtil.h +342 -303
- package/eigen/Eigen/src/Core/util/ConfigureVectorization.h +348 -317
- package/eigen/Eigen/src/Core/util/Constants.h +297 -262
- package/eigen/Eigen/src/Core/util/DisableStupidWarnings.h +130 -90
- package/eigen/Eigen/src/Core/util/EmulateArray.h +270 -0
- package/eigen/Eigen/src/Core/util/ForwardDeclarations.h +449 -247
- 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 +417 -116
- package/eigen/Eigen/src/Core/util/IntegralConstant.h +211 -204
- package/eigen/Eigen/src/Core/util/MKL_support.h +39 -37
- package/eigen/Eigen/src/Core/util/Macros.h +655 -773
- package/eigen/Eigen/src/Core/util/MaxSizeVector.h +139 -0
- package/eigen/Eigen/src/Core/util/Memory.h +970 -748
- package/eigen/Eigen/src/Core/util/Meta.h +581 -633
- 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 +17 -17
- package/eigen/Eigen/src/Core/util/Serializer.h +209 -0
- package/eigen/Eigen/src/Core/util/StaticAssert.h +50 -166
- package/eigen/Eigen/src/Core/util/SymbolicIndex.h +377 -225
- package/eigen/Eigen/src/Core/util/XprHelper.h +784 -547
- 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 +89 -105
- package/eigen/Eigen/src/Eigenvalues/RealQZ.h +537 -607
- package/eigen/Eigen/src/Eigenvalues/RealSchur.h +342 -381
- package/eigen/Eigen/src/Eigenvalues/RealSchur_LAPACKE.h +41 -35
- package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +541 -595
- package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_LAPACKE.h +47 -44
- package/eigen/Eigen/src/Eigenvalues/Tridiagonalization.h +430 -462
- package/eigen/Eigen/src/Geometry/AlignedBox.h +226 -227
- package/eigen/Eigen/src/Geometry/AngleAxis.h +131 -133
- package/eigen/Eigen/src/Geometry/EulerAngles.h +163 -74
- package/eigen/Eigen/src/Geometry/Homogeneous.h +285 -333
- package/eigen/Eigen/src/Geometry/Hyperplane.h +151 -160
- package/eigen/Eigen/src/Geometry/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Geometry/OrthoMethods.h +168 -146
- package/eigen/Eigen/src/Geometry/ParametrizedLine.h +127 -127
- package/eigen/Eigen/src/Geometry/Quaternion.h +566 -506
- package/eigen/Eigen/src/Geometry/Rotation2D.h +107 -105
- package/eigen/Eigen/src/Geometry/RotationBase.h +148 -145
- package/eigen/Eigen/src/Geometry/Scaling.h +113 -106
- package/eigen/Eigen/src/Geometry/Transform.h +858 -936
- package/eigen/Eigen/src/Geometry/Translation.h +94 -92
- package/eigen/Eigen/src/Geometry/Umeyama.h +79 -84
- package/eigen/Eigen/src/Geometry/arch/Geometry_SIMD.h +90 -104
- package/eigen/Eigen/src/Householder/BlockHouseholder.h +51 -46
- package/eigen/Eigen/src/Householder/Householder.h +102 -124
- package/eigen/Eigen/src/Householder/HouseholderSequence.h +412 -453
- package/eigen/Eigen/src/Householder/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +149 -162
- package/eigen/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +124 -119
- package/eigen/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +92 -104
- package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h +251 -243
- package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h +224 -228
- package/eigen/Eigen/src/IterativeLinearSolvers/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +178 -227
- package/eigen/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h +79 -84
- package/eigen/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h +54 -60
- package/eigen/Eigen/src/Jacobi/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Jacobi/Jacobi.h +252 -308
- package/eigen/Eigen/src/KLUSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/KLUSupport/KLUSupport.h +208 -227
- package/eigen/Eigen/src/LU/Determinant.h +50 -69
- package/eigen/Eigen/src/LU/FullPivLU.h +545 -596
- package/eigen/Eigen/src/LU/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/LU/InverseImpl.h +206 -285
- package/eigen/Eigen/src/LU/PartialPivLU.h +390 -428
- package/eigen/Eigen/src/LU/PartialPivLU_LAPACKE.h +54 -40
- package/eigen/Eigen/src/LU/arch/InverseSize4.h +72 -70
- 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 +243 -265
- package/eigen/Eigen/src/OrderingMethods/Eigen_Colamd.h +831 -1004
- package/eigen/Eigen/src/OrderingMethods/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/OrderingMethods/Ordering.h +112 -119
- 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 -430
- package/eigen/Eigen/src/QR/ColPivHouseholderQR.h +479 -479
- package/eigen/Eigen/src/QR/ColPivHouseholderQR_LAPACKE.h +120 -56
- package/eigen/Eigen/src/QR/CompleteOrthogonalDecomposition.h +166 -153
- package/eigen/Eigen/src/QR/FullPivHouseholderQR.h +495 -475
- package/eigen/Eigen/src/QR/HouseholderQR.h +394 -285
- 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 +244 -264
- package/eigen/Eigen/src/SVD/BDCSVD.h +817 -713
- 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 +577 -543
- package/eigen/Eigen/src/SVD/JacobiSVD_LAPACKE.h +85 -49
- package/eigen/Eigen/src/SVD/SVDBase.h +242 -182
- package/eigen/Eigen/src/SVD/UpperBidiagonalization.h +200 -235
- package/eigen/Eigen/src/SparseCholesky/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky.h +765 -594
- package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h +308 -94
- package/eigen/Eigen/src/SparseCore/AmbiVector.h +202 -251
- package/eigen/Eigen/src/SparseCore/CompressedStorage.h +184 -252
- package/eigen/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h +134 -178
- package/eigen/Eigen/src/SparseCore/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SparseCore/SparseAssign.h +149 -140
- package/eigen/Eigen/src/SparseCore/SparseBlock.h +403 -440
- package/eigen/Eigen/src/SparseCore/SparseColEtree.h +100 -112
- package/eigen/Eigen/src/SparseCore/SparseCompressedBase.h +525 -303
- package/eigen/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +555 -339
- package/eigen/Eigen/src/SparseCore/SparseCwiseUnaryOp.h +100 -108
- package/eigen/Eigen/src/SparseCore/SparseDenseProduct.h +169 -197
- 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 +1603 -1245
- package/eigen/Eigen/src/SparseCore/SparseMatrixBase.h +403 -350
- package/eigen/Eigen/src/SparseCore/SparsePermutation.h +186 -115
- package/eigen/Eigen/src/SparseCore/SparseProduct.h +94 -97
- 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 +370 -416
- 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 +138 -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 +756 -710
- 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 +245 -301
- 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 +89 -100
- 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 +124 -132
- 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 +450 -502
- package/eigen/Eigen/src/StlSupport/StdDeque.h +28 -93
- 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 -730
- 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 +428 -464
- 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 +9972 -16179
- 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.h → BlockMethods.inc} +434 -506
- package/eigen/Eigen/src/plugins/CommonCwiseBinaryOps.inc +116 -0
- package/eigen/Eigen/src/plugins/{CommonCwiseUnaryOps.h → CommonCwiseUnaryOps.inc} +58 -68
- 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/package.json +1 -1
- package/eigen/COPYING.APACHE +0 -203
- package/eigen/COPYING.BSD +0 -26
- package/eigen/COPYING.GPL +0 -674
- package/eigen/COPYING.LGPL +0 -502
- package/eigen/COPYING.MINPACK +0 -51
- package/eigen/COPYING.MPL2 +0 -373
- package/eigen/COPYING.README +0 -18
- package/eigen/Eigen/src/Core/BooleanRedux.h +0 -162
- package/eigen/Eigen/src/Core/arch/CUDA/Complex.h +0 -258
- package/eigen/Eigen/src/Core/arch/Default/TypeCasting.h +0 -120
- package/eigen/Eigen/src/Core/arch/SYCL/SyclMemoryModel.h +0 -694
- package/eigen/Eigen/src/Core/util/NonMPL2.h +0 -3
- 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 -358
- package/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.h +0 -696
- package/eigen/Eigen/src/plugins/CommonCwiseBinaryOps.h +0 -115
- package/eigen/Eigen/src/plugins/IndexedViewMethods.h +0 -262
- package/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.h +0 -152
- package/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.h +0 -95
- package/eigen/Eigen/src/plugins/ReshapedMethods.h +0 -149
- package/eigen/README.md +0 -5
|
@@ -13,335 +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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
};
|
|
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
|
+
};
|
|
27
29
|
|
|
28
|
-
|
|
30
|
+
template <typename MatrixType, int UpLo>
|
|
31
|
+
struct LDLT_Traits;
|
|
29
32
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
}
|
|
33
|
+
// PositiveSemiDef means positive semi-definite and non-zero; same for NegativeSemiDef
|
|
34
|
+
enum SignMatrix { PositiveSemiDef, NegativeSemiDef, ZeroSign, Indefinite };
|
|
35
|
+
} // namespace internal
|
|
33
36
|
|
|
34
37
|
/** \ingroup Cholesky_Module
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
template<typename
|
|
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
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
*
|
|
94
|
-
* Like the default constructor but with preallocation of the internal data
|
|
95
|
-
* according to the specified problem \a size.
|
|
96
|
-
* \sa LDLT()
|
|
97
|
-
*/
|
|
98
|
-
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)
|
|
99
96
|
: m_matrix(size, size),
|
|
100
97
|
m_transpositions(size),
|
|
101
98
|
m_temporary(size),
|
|
102
99
|
m_sign(internal::ZeroSign),
|
|
103
|
-
m_isInitialized(false)
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
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)
|
|
114
110
|
: m_matrix(matrix.rows(), matrix.cols()),
|
|
115
111
|
m_transpositions(matrix.rows()),
|
|
116
112
|
m_temporary(matrix.rows()),
|
|
117
113
|
m_sign(internal::ZeroSign),
|
|
118
|
-
m_isInitialized(false)
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
}
|
|
114
|
+
m_isInitialized(false) {
|
|
115
|
+
compute(matrix.derived());
|
|
116
|
+
}
|
|
122
117
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
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)
|
|
131
127
|
: m_matrix(matrix.derived()),
|
|
132
128
|
m_transpositions(matrix.rows()),
|
|
133
129
|
m_temporary(matrix.rows()),
|
|
134
130
|
m_sign(internal::ZeroSign),
|
|
135
|
-
m_isInitialized(false)
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
}
|
|
131
|
+
m_isInitialized(false) {
|
|
132
|
+
compute(matrix.derived());
|
|
133
|
+
}
|
|
139
134
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
{
|
|
145
|
-
m_isInitialized = false;
|
|
146
|
-
}
|
|
135
|
+
/** Clear any existing decomposition
|
|
136
|
+
* \sa rankUpdate(w,sigma)
|
|
137
|
+
*/
|
|
138
|
+
void setZero() { m_isInitialized = false; }
|
|
147
139
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
}
|
|
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
|
+
}
|
|
154
145
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
}
|
|
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
|
+
}
|
|
161
151
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
}
|
|
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
|
+
}
|
|
169
158
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
}
|
|
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
|
+
}
|
|
176
164
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
}
|
|
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
|
+
}
|
|
183
170
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
}
|
|
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
|
+
}
|
|
190
176
|
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
#endif
|
|
211
|
-
|
|
212
|
-
template<typename Derived>
|
|
213
|
-
bool solveInPlace(MatrixBase<Derived> &bAndX) const;
|
|
214
|
-
|
|
215
|
-
template<typename InputType>
|
|
216
|
-
LDLT& compute(const EigenBase<InputType>& matrix);
|
|
217
|
-
|
|
218
|
-
/** \returns an estimate of the reciprocal condition number of the matrix of
|
|
219
|
-
* which \c *this is the LDLT decomposition.
|
|
220
|
-
*/
|
|
221
|
-
RealScalar rcond() const
|
|
222
|
-
{
|
|
223
|
-
eigen_assert(m_isInitialized && "LDLT is not initialized.");
|
|
224
|
-
return internal::rcond_estimate_helper(m_l1_norm, *this);
|
|
225
|
-
}
|
|
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
|
|
226
196
|
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
/** \returns the internal LDLT decomposition matrix
|
|
231
|
-
*
|
|
232
|
-
* TODO: document the storage layout
|
|
233
|
-
*/
|
|
234
|
-
inline const MatrixType& matrixLDLT() const
|
|
235
|
-
{
|
|
236
|
-
eigen_assert(m_isInitialized && "LDLT is not initialized.");
|
|
237
|
-
return m_matrix;
|
|
238
|
-
}
|
|
197
|
+
template <typename Derived>
|
|
198
|
+
bool solveInPlace(MatrixBase<Derived>& bAndX) const;
|
|
239
199
|
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
/** \returns the adjoint of \c *this, that is, a const reference to the decomposition itself as the underlying matrix is self-adjoint.
|
|
243
|
-
*
|
|
244
|
-
* This method is provided for compatibility with other matrix decompositions, thus enabling generic code such as:
|
|
245
|
-
* \code x = decomposition.adjoint().solve(b) \endcode
|
|
246
|
-
*/
|
|
247
|
-
const LDLT& adjoint() const { return *this; };
|
|
248
|
-
|
|
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(); }
|
|
251
|
-
|
|
252
|
-
/** \brief Reports whether previous computation was successful.
|
|
253
|
-
*
|
|
254
|
-
* \returns \c Success if computation was successful,
|
|
255
|
-
* \c NumericalIssue if the factorization failed because of a zero pivot.
|
|
256
|
-
*/
|
|
257
|
-
ComputationInfo info() const
|
|
258
|
-
{
|
|
259
|
-
eigen_assert(m_isInitialized && "LDLT is not initialized.");
|
|
260
|
-
return m_info;
|
|
261
|
-
}
|
|
200
|
+
template <typename InputType>
|
|
201
|
+
LDLT& compute(const EigenBase<InputType>& matrix);
|
|
262
202
|
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
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
|
+
}
|
|
266
210
|
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
#endif
|
|
211
|
+
template <typename Derived>
|
|
212
|
+
LDLT& rankUpdate(const MatrixBase<Derived>& w, const RealScalar& alpha = 1);
|
|
270
213
|
|
|
271
|
-
|
|
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
|
+
}
|
|
272
222
|
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
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
|
+
}
|
|
245
|
+
|
|
246
|
+
#ifndef EIGEN_PARSED_BY_DOXYGEN
|
|
247
|
+
template <typename RhsType, typename DstType>
|
|
248
|
+
void _solve_impl(const RhsType& rhs, DstType& dst) const;
|
|
249
|
+
|
|
250
|
+
template <bool Conjugate, typename RhsType, typename DstType>
|
|
251
|
+
void _solve_impl_transposed(const RhsType& rhs, DstType& dst) const;
|
|
252
|
+
#endif
|
|
277
253
|
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
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;
|
|
291
270
|
};
|
|
292
271
|
|
|
293
272
|
namespace internal {
|
|
294
273
|
|
|
295
|
-
template<int UpLo>
|
|
274
|
+
template <int UpLo>
|
|
275
|
+
struct ldlt_inplace;
|
|
296
276
|
|
|
297
|
-
template<>
|
|
298
|
-
{
|
|
299
|
-
template<typename MatrixType, typename TranspositionType, typename Workspace>
|
|
300
|
-
static bool unblocked(MatrixType& mat, TranspositionType& transpositions, Workspace& temp, SignMatrix& sign)
|
|
301
|
-
{
|
|
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) {
|
|
302
281
|
using std::abs;
|
|
303
282
|
typedef typename MatrixType::Scalar Scalar;
|
|
304
283
|
typedef typename MatrixType::RealScalar RealScalar;
|
|
305
284
|
typedef typename TranspositionType::StorageIndex IndexType;
|
|
306
|
-
eigen_assert(mat.rows()==mat.cols());
|
|
285
|
+
eigen_assert(mat.rows() == mat.cols());
|
|
307
286
|
const Index size = mat.rows();
|
|
308
287
|
bool found_zero_pivot = false;
|
|
309
288
|
bool ret = true;
|
|
310
289
|
|
|
311
|
-
if (size <= 1)
|
|
312
|
-
{
|
|
290
|
+
if (size <= 1) {
|
|
313
291
|
transpositions.setIdentity();
|
|
314
|
-
if(size==0)
|
|
315
|
-
|
|
316
|
-
else if (numext::real(mat.coeff(0,0))
|
|
317
|
-
|
|
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;
|
|
318
300
|
return true;
|
|
319
301
|
}
|
|
320
302
|
|
|
321
|
-
for (Index k = 0; k < size; ++k)
|
|
322
|
-
{
|
|
303
|
+
for (Index k = 0; k < size; ++k) {
|
|
323
304
|
// Find largest diagonal element
|
|
324
305
|
Index index_of_biggest_in_corner;
|
|
325
|
-
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);
|
|
326
307
|
index_of_biggest_in_corner += k;
|
|
327
308
|
|
|
328
309
|
transpositions.coeffRef(k) = IndexType(index_of_biggest_in_corner);
|
|
329
|
-
if(k != index_of_biggest_in_corner)
|
|
330
|
-
{
|
|
310
|
+
if (k != index_of_biggest_in_corner) {
|
|
331
311
|
// apply the transposition while taking care to consider only
|
|
332
312
|
// the lower triangular part
|
|
333
|
-
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
|
|
334
314
|
mat.row(k).head(k).swap(mat.row(index_of_biggest_in_corner).head(k));
|
|
335
315
|
mat.col(k).tail(s).swap(mat.col(index_of_biggest_in_corner).tail(s));
|
|
336
|
-
std::swap(mat.coeffRef(k,k),mat.coeffRef(index_of_biggest_in_corner,index_of_biggest_in_corner));
|
|
337
|
-
for(Index i=k+1;i<index_of_biggest_in_corner
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
mat.coeffRef(i
|
|
341
|
-
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);
|
|
342
321
|
}
|
|
343
|
-
if(NumTraits<Scalar>::IsComplex)
|
|
344
|
-
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));
|
|
345
324
|
}
|
|
346
325
|
|
|
347
326
|
// partition the matrix:
|
|
@@ -349,53 +328,53 @@ template<> struct ldlt_inplace<Lower>
|
|
|
349
328
|
// lu = A10 | A11 | -
|
|
350
329
|
// A20 | A21 | A22
|
|
351
330
|
Index rs = size - k - 1;
|
|
352
|
-
Block<MatrixType,Dynamic,1> A21(mat,k+1,k,rs,1);
|
|
353
|
-
Block<MatrixType,1,Dynamic> A10(mat,k,0,1,k);
|
|
354
|
-
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);
|
|
355
334
|
|
|
356
|
-
if(k>0)
|
|
357
|
-
{
|
|
335
|
+
if (k > 0) {
|
|
358
336
|
temp.head(k) = mat.diagonal().real().head(k).asDiagonal() * A10.adjoint();
|
|
359
|
-
mat.coeffRef(k,k) -= (A10 * temp.head(k)).value();
|
|
360
|
-
if(rs>0)
|
|
361
|
-
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);
|
|
362
339
|
}
|
|
363
340
|
|
|
364
341
|
// In some previous versions of Eigen (e.g., 3.2.1), the scaling was omitted if the pivot
|
|
365
342
|
// was smaller than the cutoff value. However, since LDLT is not rank-revealing
|
|
366
343
|
// we should only make sure that we do not introduce INF or NaN values.
|
|
367
344
|
// Remark that LAPACK also uses 0 as the cutoff value.
|
|
368
|
-
RealScalar realAkk = numext::real(mat.coeffRef(k,k));
|
|
345
|
+
RealScalar realAkk = numext::real(mat.coeffRef(k, k));
|
|
369
346
|
bool pivot_is_valid = (abs(realAkk) > RealScalar(0));
|
|
370
347
|
|
|
371
|
-
if(k==0 && !pivot_is_valid)
|
|
372
|
-
{
|
|
348
|
+
if (k == 0 && !pivot_is_valid) {
|
|
373
349
|
// The entire diagonal is zero, there is nothing more to do
|
|
374
350
|
// except filling the transpositions, and checking whether the matrix is zero.
|
|
375
351
|
sign = ZeroSign;
|
|
376
|
-
for(Index j = 0; j<size; ++j)
|
|
377
|
-
{
|
|
352
|
+
for (Index j = 0; j < size; ++j) {
|
|
378
353
|
transpositions.coeffRef(j) = IndexType(j);
|
|
379
|
-
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();
|
|
380
355
|
}
|
|
381
356
|
return ret;
|
|
382
357
|
}
|
|
383
358
|
|
|
384
|
-
if((rs>0) && pivot_is_valid)
|
|
359
|
+
if ((rs > 0) && pivot_is_valid)
|
|
385
360
|
A21 /= realAkk;
|
|
386
|
-
else if(rs>0)
|
|
387
|
-
ret = ret && (A21.array()==Scalar(0)).all();
|
|
361
|
+
else if (rs > 0)
|
|
362
|
+
ret = ret && (A21.array() == Scalar(0)).all();
|
|
388
363
|
|
|
389
|
-
if(found_zero_pivot && pivot_is_valid)
|
|
390
|
-
|
|
364
|
+
if (found_zero_pivot && pivot_is_valid)
|
|
365
|
+
ret = false; // factorization failed
|
|
366
|
+
else if (!pivot_is_valid)
|
|
367
|
+
found_zero_pivot = true;
|
|
391
368
|
|
|
392
369
|
if (sign == PositiveSemiDef) {
|
|
393
370
|
if (realAkk < static_cast<RealScalar>(0)) sign = Indefinite;
|
|
394
371
|
} else if (sign == NegativeSemiDef) {
|
|
395
372
|
if (realAkk > static_cast<RealScalar>(0)) sign = Indefinite;
|
|
396
373
|
} else if (sign == ZeroSign) {
|
|
397
|
-
if (realAkk > static_cast<RealScalar>(0))
|
|
398
|
-
|
|
374
|
+
if (realAkk > static_cast<RealScalar>(0))
|
|
375
|
+
sign = PositiveSemiDef;
|
|
376
|
+
else if (realAkk < static_cast<RealScalar>(0))
|
|
377
|
+
sign = NegativeSemiDef;
|
|
399
378
|
}
|
|
400
379
|
}
|
|
401
380
|
|
|
@@ -409,98 +388,91 @@ template<> struct ldlt_inplace<Lower>
|
|
|
409
388
|
// original matrix is not of full rank.
|
|
410
389
|
// Here only rank-1 updates are implemented, to reduce the
|
|
411
390
|
// requirement for intermediate storage and improve accuracy
|
|
412
|
-
template<typename MatrixType, typename WDerived>
|
|
413
|
-
static bool updateInPlace(MatrixType& mat, MatrixBase<WDerived>& w,
|
|
414
|
-
|
|
391
|
+
template <typename MatrixType, typename WDerived>
|
|
392
|
+
static bool updateInPlace(MatrixType& mat, MatrixBase<WDerived>& w,
|
|
393
|
+
const typename MatrixType::RealScalar& sigma = 1) {
|
|
415
394
|
using numext::isfinite;
|
|
416
395
|
typedef typename MatrixType::Scalar Scalar;
|
|
417
396
|
typedef typename MatrixType::RealScalar RealScalar;
|
|
418
397
|
|
|
419
398
|
const Index size = mat.rows();
|
|
420
|
-
eigen_assert(mat.cols() == size && w.size()==size);
|
|
399
|
+
eigen_assert(mat.cols() == size && w.size() == size);
|
|
421
400
|
|
|
422
401
|
RealScalar alpha = 1;
|
|
423
402
|
|
|
424
403
|
// Apply the update
|
|
425
|
-
for (Index j = 0; j < size; j++)
|
|
426
|
-
{
|
|
404
|
+
for (Index j = 0; j < size; j++) {
|
|
427
405
|
// Check for termination due to an original decomposition of low-rank
|
|
428
|
-
if (!(isfinite)(alpha))
|
|
429
|
-
break;
|
|
406
|
+
if (!(isfinite)(alpha)) break;
|
|
430
407
|
|
|
431
408
|
// Update the diagonal terms
|
|
432
|
-
RealScalar dj = numext::real(mat.coeff(j,j));
|
|
409
|
+
RealScalar dj = numext::real(mat.coeff(j, j));
|
|
433
410
|
Scalar wj = w.coeff(j);
|
|
434
|
-
RealScalar swj2 = sigma*numext::abs2(wj);
|
|
435
|
-
RealScalar gamma = dj*alpha + swj2;
|
|
436
|
-
|
|
437
|
-
mat.coeffRef(j,j) += swj2/alpha;
|
|
438
|
-
alpha += swj2/dj;
|
|
411
|
+
RealScalar swj2 = sigma * numext::abs2(wj);
|
|
412
|
+
RealScalar gamma = dj * alpha + swj2;
|
|
439
413
|
|
|
414
|
+
mat.coeffRef(j, j) += swj2 / alpha;
|
|
415
|
+
alpha += swj2 / dj;
|
|
440
416
|
|
|
441
417
|
// Update the terms of L
|
|
442
|
-
Index rs = size-j-1;
|
|
418
|
+
Index rs = size - j - 1;
|
|
443
419
|
w.tail(rs) -= wj * mat.col(j).tail(rs);
|
|
444
|
-
if(gamma
|
|
445
|
-
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);
|
|
446
421
|
}
|
|
447
422
|
return true;
|
|
448
423
|
}
|
|
449
424
|
|
|
450
|
-
template<typename MatrixType, typename TranspositionType, typename Workspace, typename WType>
|
|
451
|
-
static bool update(MatrixType& mat, const TranspositionType& transpositions, Workspace& tmp, const WType& w,
|
|
452
|
-
|
|
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) {
|
|
453
428
|
// Apply the permutation to the input w
|
|
454
429
|
tmp = transpositions * w;
|
|
455
430
|
|
|
456
|
-
return ldlt_inplace<Lower>::updateInPlace(mat,tmp,sigma);
|
|
431
|
+
return ldlt_inplace<Lower>::updateInPlace(mat, tmp, sigma);
|
|
457
432
|
}
|
|
458
433
|
};
|
|
459
434
|
|
|
460
|
-
template<>
|
|
461
|
-
{
|
|
462
|
-
template<typename MatrixType, typename TranspositionType, typename Workspace>
|
|
463
|
-
static EIGEN_STRONG_INLINE bool unblocked(MatrixType& mat, TranspositionType& transpositions, Workspace& temp,
|
|
464
|
-
|
|
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) {
|
|
465
440
|
Transpose<MatrixType> matt(mat);
|
|
466
441
|
return ldlt_inplace<Lower>::unblocked(matt, transpositions, temp, sign);
|
|
467
442
|
}
|
|
468
443
|
|
|
469
|
-
template<typename MatrixType, typename TranspositionType, typename Workspace, typename WType>
|
|
470
|
-
static EIGEN_STRONG_INLINE bool update(MatrixType& mat, TranspositionType& transpositions, Workspace& tmp, WType& w,
|
|
471
|
-
|
|
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) {
|
|
472
447
|
Transpose<MatrixType> matt(mat);
|
|
473
448
|
return ldlt_inplace<Lower>::update(matt, transpositions, tmp, w.conjugate(), sigma);
|
|
474
449
|
}
|
|
475
450
|
};
|
|
476
451
|
|
|
477
|
-
template<typename MatrixType>
|
|
478
|
-
{
|
|
452
|
+
template <typename MatrixType>
|
|
453
|
+
struct LDLT_Traits<MatrixType, Lower> {
|
|
479
454
|
typedef const TriangularView<const MatrixType, UnitLower> MatrixL;
|
|
480
455
|
typedef const TriangularView<const typename MatrixType::AdjointReturnType, UnitUpper> MatrixU;
|
|
481
456
|
static inline MatrixL getL(const MatrixType& m) { return MatrixL(m); }
|
|
482
457
|
static inline MatrixU getU(const MatrixType& m) { return MatrixU(m.adjoint()); }
|
|
483
458
|
};
|
|
484
459
|
|
|
485
|
-
template<typename MatrixType>
|
|
486
|
-
{
|
|
460
|
+
template <typename MatrixType>
|
|
461
|
+
struct LDLT_Traits<MatrixType, Upper> {
|
|
487
462
|
typedef const TriangularView<const typename MatrixType::AdjointReturnType, UnitLower> MatrixL;
|
|
488
463
|
typedef const TriangularView<const MatrixType, UnitUpper> MatrixU;
|
|
489
464
|
static inline MatrixL getL(const MatrixType& m) { return MatrixL(m.adjoint()); }
|
|
490
465
|
static inline MatrixU getU(const MatrixType& m) { return MatrixU(m); }
|
|
491
466
|
};
|
|
492
467
|
|
|
493
|
-
}
|
|
468
|
+
} // end namespace internal
|
|
494
469
|
|
|
495
470
|
/** Compute / recompute the LDLT decomposition A = L D L^* = U^* D U of \a matrix
|
|
496
|
-
|
|
497
|
-
template<typename MatrixType, int
|
|
498
|
-
template<typename InputType>
|
|
499
|
-
LDLT<MatrixType,
|
|
500
|
-
|
|
501
|
-
check_template_parameters();
|
|
502
|
-
|
|
503
|
-
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());
|
|
504
476
|
const Index size = a.rows();
|
|
505
477
|
|
|
506
478
|
m_matrix = a.derived();
|
|
@@ -510,12 +482,13 @@ LDLT<MatrixType,_UpLo>& LDLT<MatrixType,_UpLo>::compute(const EigenBase<InputTyp
|
|
|
510
482
|
// TODO move this code to SelfAdjointView
|
|
511
483
|
for (Index col = 0; col < size; ++col) {
|
|
512
484
|
RealScalar abs_col_sum;
|
|
513
|
-
if (
|
|
514
|
-
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>();
|
|
515
488
|
else
|
|
516
|
-
abs_col_sum =
|
|
517
|
-
|
|
518
|
-
|
|
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;
|
|
519
492
|
}
|
|
520
493
|
|
|
521
494
|
m_transpositions.resize(size);
|
|
@@ -523,7 +496,8 @@ LDLT<MatrixType,_UpLo>& LDLT<MatrixType,_UpLo>::compute(const EigenBase<InputTyp
|
|
|
523
496
|
m_temporary.resize(size);
|
|
524
497
|
m_sign = internal::ZeroSign;
|
|
525
498
|
|
|
526
|
-
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;
|
|
527
501
|
|
|
528
502
|
m_isInitialized = true;
|
|
529
503
|
return *this;
|
|
@@ -531,28 +505,24 @@ LDLT<MatrixType,_UpLo>& LDLT<MatrixType,_UpLo>::compute(const EigenBase<InputTyp
|
|
|
531
505
|
|
|
532
506
|
/** Update the LDLT decomposition: given A = L D L^T, efficiently compute the decomposition of A + sigma w w^T.
|
|
533
507
|
* \param w a vector to be incorporated into the decomposition.
|
|
534
|
-
* \param sigma a scalar, +1 for updates and -1 for "downdates," which correspond to removing previously-added column
|
|
535
|
-
* \sa setZero()
|
|
536
|
-
|
|
537
|
-
template<typename MatrixType, int
|
|
538
|
-
template<typename Derived>
|
|
539
|
-
LDLT<MatrixType,
|
|
540
|
-
{
|
|
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) {
|
|
541
515
|
typedef typename TranspositionType::StorageIndex IndexType;
|
|
542
516
|
const Index size = w.rows();
|
|
543
|
-
if (m_isInitialized)
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
else
|
|
548
|
-
{
|
|
549
|
-
m_matrix.resize(size,size);
|
|
517
|
+
if (m_isInitialized) {
|
|
518
|
+
eigen_assert(m_matrix.rows() == size);
|
|
519
|
+
} else {
|
|
520
|
+
m_matrix.resize(size, size);
|
|
550
521
|
m_matrix.setZero();
|
|
551
522
|
m_transpositions.resize(size);
|
|
552
|
-
for (Index i = 0; i < size; i++)
|
|
553
|
-
m_transpositions.coeffRef(i) = IndexType(i);
|
|
523
|
+
for (Index i = 0; i < size; i++) m_transpositions.coeffRef(i) = IndexType(i);
|
|
554
524
|
m_temporary.resize(size);
|
|
555
|
-
m_sign = sigma>=0 ? internal::PositiveSemiDef : internal::NegativeSemiDef;
|
|
525
|
+
m_sign = sigma >= 0 ? internal::PositiveSemiDef : internal::NegativeSemiDef;
|
|
556
526
|
m_isInitialized = true;
|
|
557
527
|
}
|
|
558
528
|
|
|
@@ -562,17 +532,15 @@ LDLT<MatrixType,_UpLo>& LDLT<MatrixType,_UpLo>::rankUpdate(const MatrixBase<Deri
|
|
|
562
532
|
}
|
|
563
533
|
|
|
564
534
|
#ifndef EIGEN_PARSED_BY_DOXYGEN
|
|
565
|
-
template<typename
|
|
566
|
-
template<typename RhsType, typename DstType>
|
|
567
|
-
void LDLT<
|
|
568
|
-
{
|
|
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 {
|
|
569
538
|
_solve_impl_transposed<true>(rhs, dst);
|
|
570
539
|
}
|
|
571
540
|
|
|
572
|
-
template<typename
|
|
573
|
-
template<bool Conjugate, typename RhsType, typename DstType>
|
|
574
|
-
void LDLT<
|
|
575
|
-
{
|
|
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 {
|
|
576
544
|
// dst = P b
|
|
577
545
|
dst = m_transpositions * rhs;
|
|
578
546
|
|
|
@@ -587,15 +555,13 @@ void LDLT<_MatrixType,_UpLo>::_solve_impl_transposed(const RhsType &rhs, DstType
|
|
|
587
555
|
const typename Diagonal<const MatrixType>::RealReturnType vecD(vectorD());
|
|
588
556
|
// In some previous versions, tolerance was set to the max of 1/highest (or rather numeric_limits::min())
|
|
589
557
|
// and the maximal diagonal entry * epsilon as motivated by LAPACK's xGELSS:
|
|
590
|
-
// RealScalar tolerance = numext::maxi(vecD.array().abs().maxCoeff() * NumTraits<RealScalar>::epsilon(),RealScalar(1)
|
|
591
|
-
// However, LDLT is not rank revealing, and so adjusting the tolerance wrt to the
|
|
592
|
-
// diagonal element is not well justified and leads to numerical issues in some cases.
|
|
593
|
-
//
|
|
594
|
-
// 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.
|
|
595
562
|
RealScalar tolerance = (std::numeric_limits<RealScalar>::min)();
|
|
596
|
-
for (Index i = 0; i < vecD.size(); ++i)
|
|
597
|
-
|
|
598
|
-
if(abs(vecD(i)) > tolerance)
|
|
563
|
+
for (Index i = 0; i < vecD.size(); ++i) {
|
|
564
|
+
if (abs(vecD(i)) > tolerance)
|
|
599
565
|
dst.row(i) /= vecD(i);
|
|
600
566
|
else
|
|
601
567
|
dst.row(i).setZero();
|
|
@@ -612,22 +578,21 @@ void LDLT<_MatrixType,_UpLo>::_solve_impl_transposed(const RhsType &rhs, DstType
|
|
|
612
578
|
#endif
|
|
613
579
|
|
|
614
580
|
/** \internal use x = ldlt_object.solve(x);
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
template<typename MatrixType,int
|
|
628
|
-
template<typename Derived>
|
|
629
|
-
bool LDLT<MatrixType,
|
|
630
|
-
{
|
|
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 {
|
|
631
596
|
eigen_assert(m_isInitialized && "LDLT is not initialized.");
|
|
632
597
|
eigen_assert(m_matrix.rows() == bAndX.rows());
|
|
633
598
|
|
|
@@ -639,12 +604,11 @@ bool LDLT<MatrixType,_UpLo>::solveInPlace(MatrixBase<Derived> &bAndX) const
|
|
|
639
604
|
/** \returns the matrix represented by the decomposition,
|
|
640
605
|
* i.e., it returns the product: P^T L D L^* P.
|
|
641
606
|
* This function is provided for debug purpose. */
|
|
642
|
-
template<typename MatrixType, int
|
|
643
|
-
MatrixType LDLT<MatrixType,
|
|
644
|
-
{
|
|
607
|
+
template <typename MatrixType, int UpLo_>
|
|
608
|
+
MatrixType LDLT<MatrixType, UpLo_>::reconstructedMatrix() const {
|
|
645
609
|
eigen_assert(m_isInitialized && "LDLT is not initialized.");
|
|
646
610
|
const Index size = m_matrix.rows();
|
|
647
|
-
MatrixType res(size,size);
|
|
611
|
+
MatrixType res(size, size);
|
|
648
612
|
|
|
649
613
|
// P
|
|
650
614
|
res.setIdentity();
|
|
@@ -662,27 +626,24 @@ MatrixType LDLT<MatrixType,_UpLo>::reconstructedMatrix() const
|
|
|
662
626
|
}
|
|
663
627
|
|
|
664
628
|
/** \cholesky_module
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
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>
|
|
669
633
|
inline const LDLT<typename SelfAdjointView<MatrixType, UpLo>::PlainObject, UpLo>
|
|
670
|
-
SelfAdjointView<MatrixType, UpLo>::ldlt() const
|
|
671
|
-
|
|
672
|
-
return LDLT<PlainObject,UpLo>(m_matrix);
|
|
634
|
+
SelfAdjointView<MatrixType, UpLo>::ldlt() const {
|
|
635
|
+
return LDLT<PlainObject, UpLo>(m_matrix);
|
|
673
636
|
}
|
|
674
637
|
|
|
675
638
|
/** \cholesky_module
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
template<typename Derived>
|
|
680
|
-
inline const LDLT<typename MatrixBase<Derived>::PlainObject>
|
|
681
|
-
MatrixBase<Derived>::ldlt() const
|
|
682
|
-
{
|
|
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 {
|
|
683
644
|
return LDLT<PlainObject>(derived());
|
|
684
645
|
}
|
|
685
646
|
|
|
686
|
-
}
|
|
647
|
+
} // end namespace Eigen
|
|
687
648
|
|
|
688
|
-
#endif
|
|
649
|
+
#endif // EIGEN_LDLT_H
|