@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
|
@@ -11,80 +11,94 @@
|
|
|
11
11
|
#ifndef EIGEN_FULLPIVOTINGHOUSEHOLDERQR_H
|
|
12
12
|
#define EIGEN_FULLPIVOTINGHOUSEHOLDERQR_H
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
// IWYU pragma: private
|
|
15
|
+
#include "./InternalHeaderCheck.h"
|
|
16
|
+
|
|
17
|
+
namespace Eigen {
|
|
15
18
|
|
|
16
19
|
namespace internal {
|
|
17
20
|
|
|
18
|
-
template<typename
|
|
19
|
-
: traits<
|
|
20
|
-
|
|
21
|
+
template <typename MatrixType_, typename PermutationIndex_>
|
|
22
|
+
struct traits<FullPivHouseholderQR<MatrixType_, PermutationIndex_> > : traits<MatrixType_> {
|
|
23
|
+
typedef MatrixXpr XprKind;
|
|
24
|
+
typedef SolverStorage StorageKind;
|
|
25
|
+
typedef PermutationIndex_ PermutationIndex;
|
|
21
26
|
enum { Flags = 0 };
|
|
22
27
|
};
|
|
23
28
|
|
|
24
|
-
template<typename MatrixType
|
|
29
|
+
template <typename MatrixType, typename PermutationIndex>
|
|
30
|
+
struct FullPivHouseholderQRMatrixQReturnType;
|
|
25
31
|
|
|
26
|
-
template<typename MatrixType>
|
|
27
|
-
struct traits<FullPivHouseholderQRMatrixQReturnType<MatrixType> >
|
|
28
|
-
{
|
|
32
|
+
template <typename MatrixType, typename PermutationIndex>
|
|
33
|
+
struct traits<FullPivHouseholderQRMatrixQReturnType<MatrixType, PermutationIndex> > {
|
|
29
34
|
typedef typename MatrixType::PlainObject ReturnType;
|
|
30
35
|
};
|
|
31
36
|
|
|
32
|
-
}
|
|
37
|
+
} // end namespace internal
|
|
33
38
|
|
|
34
39
|
/** \ingroup QR_Module
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
template<typename
|
|
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
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
FullPivHouseholderQR
|
|
40
|
+
*
|
|
41
|
+
* \class FullPivHouseholderQR
|
|
42
|
+
*
|
|
43
|
+
* \brief Householder rank-revealing QR decomposition of a matrix with full pivoting
|
|
44
|
+
*
|
|
45
|
+
* \tparam MatrixType_ the type of the matrix of which we are computing the QR decomposition
|
|
46
|
+
*
|
|
47
|
+
* This class performs a rank-revealing QR decomposition of a matrix \b A into matrices \b P, \b P', \b Q and \b R
|
|
48
|
+
* such that
|
|
49
|
+
* \f[
|
|
50
|
+
* \mathbf{P} \, \mathbf{A} \, \mathbf{P}' = \mathbf{Q} \, \mathbf{R}
|
|
51
|
+
* \f]
|
|
52
|
+
* by using Householder transformations. Here, \b P and \b P' are permutation matrices, \b Q a unitary matrix
|
|
53
|
+
* and \b R an upper triangular matrix.
|
|
54
|
+
*
|
|
55
|
+
* This decomposition performs a very prudent full pivoting in order to be rank-revealing and achieve optimal
|
|
56
|
+
* numerical stability. The trade-off is that it is slower than HouseholderQR and ColPivHouseholderQR.
|
|
57
|
+
*
|
|
58
|
+
* This class supports the \link InplaceDecomposition inplace decomposition \endlink mechanism.
|
|
59
|
+
*
|
|
60
|
+
* \sa MatrixBase::fullPivHouseholderQr()
|
|
61
|
+
*/
|
|
62
|
+
template <typename MatrixType_, typename PermutationIndex_>
|
|
63
|
+
class FullPivHouseholderQR : public SolverBase<FullPivHouseholderQR<MatrixType_, PermutationIndex_> > {
|
|
64
|
+
public:
|
|
65
|
+
typedef MatrixType_ MatrixType;
|
|
66
|
+
typedef SolverBase<FullPivHouseholderQR> Base;
|
|
67
|
+
friend class SolverBase<FullPivHouseholderQR>;
|
|
68
|
+
typedef PermutationIndex_ PermutationIndex;
|
|
69
|
+
EIGEN_GENERIC_PUBLIC_INTERFACE(FullPivHouseholderQR)
|
|
70
|
+
|
|
71
|
+
enum {
|
|
72
|
+
MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
|
|
73
|
+
MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
|
|
74
|
+
};
|
|
75
|
+
typedef internal::FullPivHouseholderQRMatrixQReturnType<MatrixType, PermutationIndex> MatrixQReturnType;
|
|
76
|
+
typedef typename internal::plain_diag_type<MatrixType>::type HCoeffsType;
|
|
77
|
+
typedef Matrix<PermutationIndex, 1, internal::min_size_prefer_dynamic(ColsAtCompileTime, RowsAtCompileTime), RowMajor,
|
|
78
|
+
1, internal::min_size_prefer_fixed(MaxColsAtCompileTime, MaxRowsAtCompileTime)>
|
|
79
|
+
IntDiagSizeVectorType;
|
|
80
|
+
typedef PermutationMatrix<ColsAtCompileTime, MaxColsAtCompileTime, PermutationIndex> PermutationType;
|
|
81
|
+
typedef typename internal::plain_row_type<MatrixType>::type RowVectorType;
|
|
82
|
+
typedef typename internal::plain_col_type<MatrixType>::type ColVectorType;
|
|
83
|
+
typedef typename MatrixType::PlainObject PlainObject;
|
|
84
|
+
|
|
85
|
+
/** \brief Reports whether the QR factorization was successful.
|
|
86
|
+
*
|
|
87
|
+
* \note This function always returns \c Success. It is provided for compatibility
|
|
88
|
+
* with other factorization routines.
|
|
89
|
+
* \returns \c Success
|
|
90
|
+
*/
|
|
91
|
+
ComputationInfo info() const {
|
|
92
|
+
eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
|
|
93
|
+
return Success;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/** \brief Default Constructor.
|
|
97
|
+
*
|
|
98
|
+
* The default constructor is useful in cases in which the user intends to
|
|
99
|
+
* perform decompositions via FullPivHouseholderQR::compute(const MatrixType&).
|
|
100
|
+
*/
|
|
101
|
+
FullPivHouseholderQR()
|
|
88
102
|
: m_qr(),
|
|
89
103
|
m_hCoeffs(),
|
|
90
104
|
m_rows_transpositions(),
|
|
@@ -94,36 +108,36 @@ template<typename _MatrixType> class FullPivHouseholderQR
|
|
|
94
108
|
m_isInitialized(false),
|
|
95
109
|
m_usePrescribedThreshold(false) {}
|
|
96
110
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
111
|
+
/** \brief Default Constructor with memory preallocation
|
|
112
|
+
*
|
|
113
|
+
* Like the default constructor but with preallocation of the internal data
|
|
114
|
+
* according to the specified problem \a size.
|
|
115
|
+
* \sa FullPivHouseholderQR()
|
|
116
|
+
*/
|
|
117
|
+
FullPivHouseholderQR(Index rows, Index cols)
|
|
104
118
|
: m_qr(rows, cols),
|
|
105
|
-
m_hCoeffs((std::min)(rows,cols)),
|
|
106
|
-
m_rows_transpositions((std::min)(rows,cols)),
|
|
107
|
-
m_cols_transpositions((std::min)(rows,cols)),
|
|
119
|
+
m_hCoeffs((std::min)(rows, cols)),
|
|
120
|
+
m_rows_transpositions((std::min)(rows, cols)),
|
|
121
|
+
m_cols_transpositions((std::min)(rows, cols)),
|
|
108
122
|
m_cols_permutation(cols),
|
|
109
123
|
m_temp(cols),
|
|
110
124
|
m_isInitialized(false),
|
|
111
125
|
m_usePrescribedThreshold(false) {}
|
|
112
126
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
+
/** \brief Constructs a QR factorization from a given matrix
|
|
128
|
+
*
|
|
129
|
+
* This constructor computes the QR factorization of the matrix \a matrix by calling
|
|
130
|
+
* the method compute(). It is a short cut for:
|
|
131
|
+
*
|
|
132
|
+
* \code
|
|
133
|
+
* FullPivHouseholderQR<MatrixType> qr(matrix.rows(), matrix.cols());
|
|
134
|
+
* qr.compute(matrix);
|
|
135
|
+
* \endcode
|
|
136
|
+
*
|
|
137
|
+
* \sa compute()
|
|
138
|
+
*/
|
|
139
|
+
template <typename InputType>
|
|
140
|
+
explicit FullPivHouseholderQR(const EigenBase<InputType>& matrix)
|
|
127
141
|
: m_qr(matrix.rows(), matrix.cols()),
|
|
128
142
|
m_hCoeffs((std::min)(matrix.rows(), matrix.cols())),
|
|
129
143
|
m_rows_transpositions((std::min)(matrix.rows(), matrix.cols())),
|
|
@@ -131,19 +145,19 @@ template<typename _MatrixType> class FullPivHouseholderQR
|
|
|
131
145
|
m_cols_permutation(matrix.cols()),
|
|
132
146
|
m_temp(matrix.cols()),
|
|
133
147
|
m_isInitialized(false),
|
|
134
|
-
m_usePrescribedThreshold(false)
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
}
|
|
148
|
+
m_usePrescribedThreshold(false) {
|
|
149
|
+
compute(matrix.derived());
|
|
150
|
+
}
|
|
138
151
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
152
|
+
/** \brief Constructs a QR factorization from a given matrix
|
|
153
|
+
*
|
|
154
|
+
* This overloaded constructor is provided for \link InplaceDecomposition inplace decomposition \endlink when \c
|
|
155
|
+
* MatrixType is a Eigen::Ref.
|
|
156
|
+
*
|
|
157
|
+
* \sa FullPivHouseholderQR(const EigenBase&)
|
|
158
|
+
*/
|
|
159
|
+
template <typename InputType>
|
|
160
|
+
explicit FullPivHouseholderQR(EigenBase<InputType>& matrix)
|
|
147
161
|
: m_qr(matrix.derived()),
|
|
148
162
|
m_hCoeffs((std::min)(matrix.rows(), matrix.cols())),
|
|
149
163
|
m_rows_transpositions((std::min)(matrix.rows(), matrix.cols())),
|
|
@@ -151,319 +165,341 @@ template<typename _MatrixType> class FullPivHouseholderQR
|
|
|
151
165
|
m_cols_permutation(matrix.cols()),
|
|
152
166
|
m_temp(matrix.cols()),
|
|
153
167
|
m_isInitialized(false),
|
|
154
|
-
m_usePrescribedThreshold(false)
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
}
|
|
168
|
+
m_usePrescribedThreshold(false) {
|
|
169
|
+
computeInPlace();
|
|
170
|
+
}
|
|
158
171
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
|
|
179
|
-
return Solve<FullPivHouseholderQR, Rhs>(*this, b.derived());
|
|
180
|
-
}
|
|
172
|
+
#ifdef EIGEN_PARSED_BY_DOXYGEN
|
|
173
|
+
/** This method finds a solution x to the equation Ax=b, where A is the matrix of which
|
|
174
|
+
* \c *this is the QR decomposition.
|
|
175
|
+
*
|
|
176
|
+
* \param b the right-hand-side of the equation to solve.
|
|
177
|
+
*
|
|
178
|
+
* \returns the exact or least-square solution if the rank is greater or equal to the number of columns of A,
|
|
179
|
+
* and an arbitrary solution otherwise.
|
|
180
|
+
*
|
|
181
|
+
* \note_about_checking_solutions
|
|
182
|
+
*
|
|
183
|
+
* \note_about_arbitrary_choice_of_solution
|
|
184
|
+
*
|
|
185
|
+
* Example: \include FullPivHouseholderQR_solve.cpp
|
|
186
|
+
* Output: \verbinclude FullPivHouseholderQR_solve.out
|
|
187
|
+
*/
|
|
188
|
+
template <typename Rhs>
|
|
189
|
+
inline const Solve<FullPivHouseholderQR, Rhs> solve(const MatrixBase<Rhs>& b) const;
|
|
190
|
+
#endif
|
|
181
191
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
192
|
+
/** \returns Expression object representing the matrix Q
|
|
193
|
+
*/
|
|
194
|
+
MatrixQReturnType matrixQ(void) const;
|
|
185
195
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
}
|
|
196
|
+
/** \returns a reference to the matrix where the Householder QR decomposition is stored
|
|
197
|
+
*/
|
|
198
|
+
const MatrixType& matrixQR() const {
|
|
199
|
+
eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
|
|
200
|
+
return m_qr;
|
|
201
|
+
}
|
|
193
202
|
|
|
194
|
-
|
|
195
|
-
|
|
203
|
+
template <typename InputType>
|
|
204
|
+
FullPivHouseholderQR& compute(const EigenBase<InputType>& matrix);
|
|
196
205
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
}
|
|
206
|
+
/** \returns a const reference to the column permutation matrix */
|
|
207
|
+
const PermutationType& colsPermutation() const {
|
|
208
|
+
eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
|
|
209
|
+
return m_cols_permutation;
|
|
210
|
+
}
|
|
203
211
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
}
|
|
212
|
+
/** \returns a const reference to the vector of indices representing the rows transpositions */
|
|
213
|
+
const IntDiagSizeVectorType& rowsTranspositions() const {
|
|
214
|
+
eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
|
|
215
|
+
return m_rows_transpositions;
|
|
216
|
+
}
|
|
210
217
|
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
218
|
+
/** \returns the determinant of the matrix of which
|
|
219
|
+
* *this is the QR decomposition. It has only linear complexity
|
|
220
|
+
* (that is, O(n) where n is the dimension of the square matrix)
|
|
221
|
+
* as the QR decomposition has already been computed.
|
|
222
|
+
*
|
|
223
|
+
* \note This is only for square matrices.
|
|
224
|
+
*
|
|
225
|
+
* \warning a determinant can be very big or small, so for matrices
|
|
226
|
+
* of large enough dimension, there is a risk of overflow/underflow.
|
|
227
|
+
* One way to work around that is to use logAbsDeterminant() instead.
|
|
228
|
+
*
|
|
229
|
+
* \sa absDeterminant(), logAbsDeterminant(), MatrixBase::determinant()
|
|
230
|
+
*/
|
|
231
|
+
typename MatrixType::Scalar determinant() const;
|
|
232
|
+
|
|
233
|
+
/** \returns the absolute value of the determinant of the matrix of which
|
|
234
|
+
* *this is the QR decomposition. It has only linear complexity
|
|
235
|
+
* (that is, O(n) where n is the dimension of the square matrix)
|
|
236
|
+
* as the QR decomposition has already been computed.
|
|
237
|
+
*
|
|
238
|
+
* \note This is only for square matrices.
|
|
239
|
+
*
|
|
240
|
+
* \warning a determinant can be very big or small, so for matrices
|
|
241
|
+
* of large enough dimension, there is a risk of overflow/underflow.
|
|
242
|
+
* One way to work around that is to use logAbsDeterminant() instead.
|
|
243
|
+
*
|
|
244
|
+
* \sa determinant(), logAbsDeterminant(), MatrixBase::determinant()
|
|
245
|
+
*/
|
|
246
|
+
typename MatrixType::RealScalar absDeterminant() const;
|
|
247
|
+
|
|
248
|
+
/** \returns the natural log of the absolute value of the determinant of the matrix of which
|
|
249
|
+
* *this is the QR decomposition. It has only linear complexity
|
|
250
|
+
* (that is, O(n) where n is the dimension of the square matrix)
|
|
251
|
+
* as the QR decomposition has already been computed.
|
|
252
|
+
*
|
|
253
|
+
* \note This is only for square matrices.
|
|
254
|
+
*
|
|
255
|
+
* \note This method is useful to work around the risk of overflow/underflow that's inherent
|
|
256
|
+
* to determinant computation.
|
|
257
|
+
*
|
|
258
|
+
* \sa determinant(), absDeterminant(), MatrixBase::determinant()
|
|
259
|
+
*/
|
|
260
|
+
typename MatrixType::RealScalar logAbsDeterminant() const;
|
|
261
|
+
|
|
262
|
+
/** \returns the sign of the determinant of the matrix of which
|
|
263
|
+
* *this is the QR decomposition. It has only linear complexity
|
|
264
|
+
* (that is, O(n) where n is the dimension of the square matrix)
|
|
265
|
+
* as the QR decomposition has already been computed.
|
|
266
|
+
*
|
|
267
|
+
* \note This is only for square matrices.
|
|
268
|
+
*
|
|
269
|
+
* \note This method is useful to work around the risk of overflow/underflow that's inherent
|
|
270
|
+
* to determinant computation.
|
|
271
|
+
*
|
|
272
|
+
* \sa determinant(), absDeterminant(), logAbsDeterminant(), MatrixBase::determinant()
|
|
273
|
+
*/
|
|
274
|
+
typename MatrixType::Scalar signDeterminant() const;
|
|
275
|
+
|
|
276
|
+
/** \returns the rank of the matrix of which *this is the QR decomposition.
|
|
277
|
+
*
|
|
278
|
+
* \note This method has to determine which pivots should be considered nonzero.
|
|
279
|
+
* For that, it uses the threshold value that you can control by calling
|
|
280
|
+
* setThreshold(const RealScalar&).
|
|
281
|
+
*/
|
|
282
|
+
inline Index rank() const {
|
|
283
|
+
using std::abs;
|
|
284
|
+
eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
|
|
285
|
+
RealScalar premultiplied_threshold = abs(m_maxpivot) * threshold();
|
|
286
|
+
Index result = 0;
|
|
287
|
+
for (Index i = 0; i < m_nonzero_pivots; ++i) result += (abs(m_qr.coeff(i, i)) > premultiplied_threshold);
|
|
288
|
+
return result;
|
|
289
|
+
}
|
|
256
290
|
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
}
|
|
291
|
+
/** \returns the dimension of the kernel of the matrix of which *this is the QR decomposition.
|
|
292
|
+
*
|
|
293
|
+
* \note This method has to determine which pivots should be considered nonzero.
|
|
294
|
+
* For that, it uses the threshold value that you can control by calling
|
|
295
|
+
* setThreshold(const RealScalar&).
|
|
296
|
+
*/
|
|
297
|
+
inline Index dimensionOfKernel() const {
|
|
298
|
+
eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
|
|
299
|
+
return cols() - rank();
|
|
300
|
+
}
|
|
268
301
|
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
}
|
|
302
|
+
/** \returns true if the matrix of which *this is the QR decomposition represents an injective
|
|
303
|
+
* linear map, i.e. has trivial kernel; false otherwise.
|
|
304
|
+
*
|
|
305
|
+
* \note This method has to determine which pivots should be considered nonzero.
|
|
306
|
+
* For that, it uses the threshold value that you can control by calling
|
|
307
|
+
* setThreshold(const RealScalar&).
|
|
308
|
+
*/
|
|
309
|
+
inline bool isInjective() const {
|
|
310
|
+
eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
|
|
311
|
+
return rank() == cols();
|
|
312
|
+
}
|
|
281
313
|
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
}
|
|
314
|
+
/** \returns true if the matrix of which *this is the QR decomposition represents a surjective
|
|
315
|
+
* linear map; false otherwise.
|
|
316
|
+
*
|
|
317
|
+
* \note This method has to determine which pivots should be considered nonzero.
|
|
318
|
+
* For that, it uses the threshold value that you can control by calling
|
|
319
|
+
* setThreshold(const RealScalar&).
|
|
320
|
+
*/
|
|
321
|
+
inline bool isSurjective() const {
|
|
322
|
+
eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
|
|
323
|
+
return rank() == rows();
|
|
324
|
+
}
|
|
294
325
|
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
}
|
|
326
|
+
/** \returns true if the matrix of which *this is the QR decomposition is invertible.
|
|
327
|
+
*
|
|
328
|
+
* \note This method has to determine which pivots should be considered nonzero.
|
|
329
|
+
* For that, it uses the threshold value that you can control by calling
|
|
330
|
+
* setThreshold(const RealScalar&).
|
|
331
|
+
*/
|
|
332
|
+
inline bool isInvertible() const {
|
|
333
|
+
eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
|
|
334
|
+
return isInjective() && isSurjective();
|
|
335
|
+
}
|
|
306
336
|
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
}
|
|
337
|
+
/** \returns the inverse of the matrix of which *this is the QR decomposition.
|
|
338
|
+
*
|
|
339
|
+
* \note If this matrix is not invertible, the returned matrix has undefined coefficients.
|
|
340
|
+
* Use isInvertible() to first determine whether this matrix is invertible.
|
|
341
|
+
*/
|
|
342
|
+
inline const Inverse<FullPivHouseholderQR> inverse() const {
|
|
343
|
+
eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
|
|
344
|
+
return Inverse<FullPivHouseholderQR>(*this);
|
|
345
|
+
}
|
|
317
346
|
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
}
|
|
347
|
+
inline Index rows() const { return m_qr.rows(); }
|
|
348
|
+
inline Index cols() const { return m_qr.cols(); }
|
|
349
|
+
|
|
350
|
+
/** \returns a const reference to the vector of Householder coefficients used to represent the factor \c Q.
|
|
351
|
+
*
|
|
352
|
+
* For advanced uses only.
|
|
353
|
+
*/
|
|
354
|
+
const HCoeffsType& hCoeffs() const { return m_hCoeffs; }
|
|
355
|
+
|
|
356
|
+
/** Allows to prescribe a threshold to be used by certain methods, such as rank(),
|
|
357
|
+
* who need to determine when pivots are to be considered nonzero. This is not used for the
|
|
358
|
+
* QR decomposition itself.
|
|
359
|
+
*
|
|
360
|
+
* When it needs to get the threshold value, Eigen calls threshold(). By default, this
|
|
361
|
+
* uses a formula to automatically determine a reasonable threshold.
|
|
362
|
+
* Once you have called the present method setThreshold(const RealScalar&),
|
|
363
|
+
* your value is used instead.
|
|
364
|
+
*
|
|
365
|
+
* \param threshold The new value to use as the threshold.
|
|
366
|
+
*
|
|
367
|
+
* A pivot will be considered nonzero if its absolute value is strictly greater than
|
|
368
|
+
* \f$ \vert pivot \vert \leqslant threshold \times \vert maxpivot \vert \f$
|
|
369
|
+
* where maxpivot is the biggest pivot.
|
|
370
|
+
*
|
|
371
|
+
* If you want to come back to the default behavior, call setThreshold(Default_t)
|
|
372
|
+
*/
|
|
373
|
+
FullPivHouseholderQR& setThreshold(const RealScalar& threshold) {
|
|
374
|
+
m_usePrescribedThreshold = true;
|
|
375
|
+
m_prescribedThreshold = threshold;
|
|
376
|
+
return *this;
|
|
377
|
+
}
|
|
350
378
|
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
}
|
|
379
|
+
/** Allows to come back to the default behavior, letting Eigen use its default formula for
|
|
380
|
+
* determining the threshold.
|
|
381
|
+
*
|
|
382
|
+
* You should pass the special object Eigen::Default as parameter here.
|
|
383
|
+
* \code qr.setThreshold(Eigen::Default); \endcode
|
|
384
|
+
*
|
|
385
|
+
* See the documentation of setThreshold(const RealScalar&).
|
|
386
|
+
*/
|
|
387
|
+
FullPivHouseholderQR& setThreshold(Default_t) {
|
|
388
|
+
m_usePrescribedThreshold = false;
|
|
389
|
+
return *this;
|
|
390
|
+
}
|
|
364
391
|
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
}
|
|
392
|
+
/** Returns the threshold that will be used by certain methods such as rank().
|
|
393
|
+
*
|
|
394
|
+
* See the documentation of setThreshold(const RealScalar&).
|
|
395
|
+
*/
|
|
396
|
+
RealScalar threshold() const {
|
|
397
|
+
eigen_assert(m_isInitialized || m_usePrescribedThreshold);
|
|
398
|
+
return m_usePrescribedThreshold ? m_prescribedThreshold
|
|
399
|
+
// this formula comes from experimenting (see "LU precision tuning" thread on the
|
|
400
|
+
// list) and turns out to be identical to Higham's formula used already in LDLt.
|
|
401
|
+
: NumTraits<Scalar>::epsilon() * RealScalar(m_qr.diagonalSize());
|
|
402
|
+
}
|
|
377
403
|
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
}
|
|
404
|
+
/** \returns the number of nonzero pivots in the QR decomposition.
|
|
405
|
+
* Here nonzero is meant in the exact sense, not in a fuzzy sense.
|
|
406
|
+
* So that notion isn't really intrinsically interesting, but it is
|
|
407
|
+
* still useful when implementing algorithms.
|
|
408
|
+
*
|
|
409
|
+
* \sa rank()
|
|
410
|
+
*/
|
|
411
|
+
inline Index nonzeroPivots() const {
|
|
412
|
+
eigen_assert(m_isInitialized && "LU is not initialized.");
|
|
413
|
+
return m_nonzero_pivots;
|
|
414
|
+
}
|
|
390
415
|
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
RealScalar m_precision;
|
|
421
|
-
Index m_det_pq;
|
|
416
|
+
/** \returns the absolute value of the biggest pivot, i.e. the biggest
|
|
417
|
+
* diagonal coefficient of U.
|
|
418
|
+
*/
|
|
419
|
+
RealScalar maxPivot() const { return m_maxpivot; }
|
|
420
|
+
|
|
421
|
+
#ifndef EIGEN_PARSED_BY_DOXYGEN
|
|
422
|
+
template <typename RhsType, typename DstType>
|
|
423
|
+
void _solve_impl(const RhsType& rhs, DstType& dst) const;
|
|
424
|
+
|
|
425
|
+
template <bool Conjugate, typename RhsType, typename DstType>
|
|
426
|
+
void _solve_impl_transposed(const RhsType& rhs, DstType& dst) const;
|
|
427
|
+
#endif
|
|
428
|
+
|
|
429
|
+
protected:
|
|
430
|
+
EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
|
|
431
|
+
|
|
432
|
+
void computeInPlace();
|
|
433
|
+
|
|
434
|
+
MatrixType m_qr;
|
|
435
|
+
HCoeffsType m_hCoeffs;
|
|
436
|
+
IntDiagSizeVectorType m_rows_transpositions;
|
|
437
|
+
IntDiagSizeVectorType m_cols_transpositions;
|
|
438
|
+
PermutationType m_cols_permutation;
|
|
439
|
+
RowVectorType m_temp;
|
|
440
|
+
bool m_isInitialized, m_usePrescribedThreshold;
|
|
441
|
+
RealScalar m_prescribedThreshold, m_maxpivot;
|
|
442
|
+
Index m_nonzero_pivots;
|
|
443
|
+
RealScalar m_precision;
|
|
444
|
+
Index m_det_p;
|
|
422
445
|
};
|
|
423
446
|
|
|
424
|
-
template<typename MatrixType>
|
|
425
|
-
typename MatrixType::
|
|
426
|
-
|
|
447
|
+
template <typename MatrixType, typename PermutationIndex>
|
|
448
|
+
typename MatrixType::Scalar FullPivHouseholderQR<MatrixType, PermutationIndex>::determinant() const {
|
|
449
|
+
eigen_assert(m_isInitialized && "HouseholderQR is not initialized.");
|
|
450
|
+
eigen_assert(m_qr.rows() == m_qr.cols() && "You can't take the determinant of a non-square matrix!");
|
|
451
|
+
Scalar detQ;
|
|
452
|
+
internal::householder_determinant<HCoeffsType, Scalar, NumTraits<Scalar>::IsComplex>::run(m_hCoeffs, detQ);
|
|
453
|
+
return isInjective() ? (detQ * Scalar(m_det_p)) * m_qr.diagonal().prod() : Scalar(0);
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
template <typename MatrixType, typename PermutationIndex>
|
|
457
|
+
typename MatrixType::RealScalar FullPivHouseholderQR<MatrixType, PermutationIndex>::absDeterminant() const {
|
|
427
458
|
using std::abs;
|
|
428
459
|
eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
|
|
429
460
|
eigen_assert(m_qr.rows() == m_qr.cols() && "You can't take the determinant of a non-square matrix!");
|
|
430
|
-
return abs(m_qr.diagonal().prod());
|
|
461
|
+
return isInjective() ? abs(m_qr.diagonal().prod()) : RealScalar(0);
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
template <typename MatrixType, typename PermutationIndex>
|
|
465
|
+
typename MatrixType::RealScalar FullPivHouseholderQR<MatrixType, PermutationIndex>::logAbsDeterminant() const {
|
|
466
|
+
eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
|
|
467
|
+
eigen_assert(m_qr.rows() == m_qr.cols() && "You can't take the determinant of a non-square matrix!");
|
|
468
|
+
return isInjective() ? m_qr.diagonal().cwiseAbs().array().log().sum() : -NumTraits<RealScalar>::infinity();
|
|
431
469
|
}
|
|
432
470
|
|
|
433
|
-
template<typename MatrixType>
|
|
434
|
-
typename MatrixType::
|
|
435
|
-
{
|
|
471
|
+
template <typename MatrixType, typename PermutationIndex>
|
|
472
|
+
typename MatrixType::Scalar FullPivHouseholderQR<MatrixType, PermutationIndex>::signDeterminant() const {
|
|
436
473
|
eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
|
|
437
474
|
eigen_assert(m_qr.rows() == m_qr.cols() && "You can't take the determinant of a non-square matrix!");
|
|
438
|
-
|
|
475
|
+
Scalar detQ;
|
|
476
|
+
internal::householder_determinant<HCoeffsType, Scalar, NumTraits<Scalar>::IsComplex>::run(m_hCoeffs, detQ);
|
|
477
|
+
return isInjective() ? (detQ * Scalar(m_det_p)) * m_qr.diagonal().array().sign().prod() : Scalar(0);
|
|
439
478
|
}
|
|
440
479
|
|
|
441
480
|
/** Performs the QR factorization of the given matrix \a matrix. The result of
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
template<typename MatrixType>
|
|
448
|
-
template<typename InputType>
|
|
449
|
-
FullPivHouseholderQR<MatrixType>& FullPivHouseholderQR<MatrixType>::compute(
|
|
450
|
-
{
|
|
481
|
+
* the factorization is stored into \c *this, and a reference to \c *this
|
|
482
|
+
* is returned.
|
|
483
|
+
*
|
|
484
|
+
* \sa class FullPivHouseholderQR, FullPivHouseholderQR(const MatrixType&)
|
|
485
|
+
*/
|
|
486
|
+
template <typename MatrixType, typename PermutationIndex>
|
|
487
|
+
template <typename InputType>
|
|
488
|
+
FullPivHouseholderQR<MatrixType, PermutationIndex>& FullPivHouseholderQR<MatrixType, PermutationIndex>::compute(
|
|
489
|
+
const EigenBase<InputType>& matrix) {
|
|
451
490
|
m_qr = matrix.derived();
|
|
452
491
|
computeInPlace();
|
|
453
492
|
return *this;
|
|
454
493
|
}
|
|
455
494
|
|
|
456
|
-
template<typename MatrixType>
|
|
457
|
-
void FullPivHouseholderQR<MatrixType>::computeInPlace()
|
|
458
|
-
|
|
459
|
-
check_template_parameters();
|
|
460
|
-
|
|
495
|
+
template <typename MatrixType, typename PermutationIndex>
|
|
496
|
+
void FullPivHouseholderQR<MatrixType, PermutationIndex>::computeInPlace() {
|
|
497
|
+
eigen_assert(m_qr.cols() <= NumTraits<PermutationIndex>::highest());
|
|
461
498
|
using std::abs;
|
|
462
499
|
Index rows = m_qr.rows();
|
|
463
500
|
Index cols = m_qr.cols();
|
|
464
|
-
Index size = (std::min)(rows,cols);
|
|
501
|
+
Index size = (std::min)(rows, cols);
|
|
465
502
|
|
|
466
|
-
|
|
467
503
|
m_hCoeffs.resize(size);
|
|
468
504
|
|
|
469
505
|
m_temp.resize(cols);
|
|
@@ -476,150 +512,172 @@ void FullPivHouseholderQR<MatrixType>::computeInPlace()
|
|
|
476
512
|
|
|
477
513
|
RealScalar biggest(0);
|
|
478
514
|
|
|
479
|
-
m_nonzero_pivots = size;
|
|
515
|
+
m_nonzero_pivots = size; // the generic case is that in which all pivots are nonzero (invertible case)
|
|
480
516
|
m_maxpivot = RealScalar(0);
|
|
481
517
|
|
|
482
|
-
for (Index k = 0; k < size; ++k)
|
|
483
|
-
{
|
|
518
|
+
for (Index k = 0; k < size; ++k) {
|
|
484
519
|
Index row_of_biggest_in_corner, col_of_biggest_in_corner;
|
|
485
520
|
typedef internal::scalar_score_coeff_op<Scalar> Scoring;
|
|
486
521
|
typedef typename Scoring::result_type Score;
|
|
487
522
|
|
|
488
|
-
Score score = m_qr.bottomRightCorner(rows-k, cols-k)
|
|
523
|
+
Score score = m_qr.bottomRightCorner(rows - k, cols - k)
|
|
489
524
|
.unaryExpr(Scoring())
|
|
490
525
|
.maxCoeff(&row_of_biggest_in_corner, &col_of_biggest_in_corner);
|
|
491
526
|
row_of_biggest_in_corner += k;
|
|
492
527
|
col_of_biggest_in_corner += k;
|
|
493
|
-
RealScalar biggest_in_corner =
|
|
494
|
-
|
|
528
|
+
RealScalar biggest_in_corner =
|
|
529
|
+
internal::abs_knowing_score<Scalar>()(m_qr(row_of_biggest_in_corner, col_of_biggest_in_corner), score);
|
|
530
|
+
if (k == 0) biggest = biggest_in_corner;
|
|
495
531
|
|
|
496
532
|
// if the corner is negligible, then we have less than full rank, and we can finish early
|
|
497
|
-
if(internal::isMuchSmallerThan(biggest_in_corner, biggest, m_precision))
|
|
498
|
-
{
|
|
533
|
+
if (internal::isMuchSmallerThan(biggest_in_corner, biggest, m_precision)) {
|
|
499
534
|
m_nonzero_pivots = k;
|
|
500
|
-
for(Index i = k; i < size; i++)
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
m_cols_transpositions.coeffRef(i) = i;
|
|
535
|
+
for (Index i = k; i < size; i++) {
|
|
536
|
+
m_rows_transpositions.coeffRef(i) = internal::convert_index<PermutationIndex>(i);
|
|
537
|
+
m_cols_transpositions.coeffRef(i) = internal::convert_index<PermutationIndex>(i);
|
|
504
538
|
m_hCoeffs.coeffRef(i) = Scalar(0);
|
|
505
539
|
}
|
|
506
540
|
break;
|
|
507
541
|
}
|
|
508
542
|
|
|
509
|
-
m_rows_transpositions.coeffRef(k) = row_of_biggest_in_corner;
|
|
510
|
-
m_cols_transpositions.coeffRef(k) = col_of_biggest_in_corner;
|
|
511
|
-
if(k != row_of_biggest_in_corner) {
|
|
512
|
-
m_qr.row(k).tail(cols-k).swap(m_qr.row(row_of_biggest_in_corner).tail(cols-k));
|
|
543
|
+
m_rows_transpositions.coeffRef(k) = internal::convert_index<PermutationIndex>(row_of_biggest_in_corner);
|
|
544
|
+
m_cols_transpositions.coeffRef(k) = internal::convert_index<PermutationIndex>(col_of_biggest_in_corner);
|
|
545
|
+
if (k != row_of_biggest_in_corner) {
|
|
546
|
+
m_qr.row(k).tail(cols - k).swap(m_qr.row(row_of_biggest_in_corner).tail(cols - k));
|
|
513
547
|
++number_of_transpositions;
|
|
514
548
|
}
|
|
515
|
-
if(k != col_of_biggest_in_corner) {
|
|
549
|
+
if (k != col_of_biggest_in_corner) {
|
|
516
550
|
m_qr.col(k).swap(m_qr.col(col_of_biggest_in_corner));
|
|
517
551
|
++number_of_transpositions;
|
|
518
552
|
}
|
|
519
553
|
|
|
520
554
|
RealScalar beta;
|
|
521
|
-
m_qr.col(k).tail(rows-k).makeHouseholderInPlace(m_hCoeffs.coeffRef(k), beta);
|
|
522
|
-
m_qr.coeffRef(k,k) = beta;
|
|
555
|
+
m_qr.col(k).tail(rows - k).makeHouseholderInPlace(m_hCoeffs.coeffRef(k), beta);
|
|
556
|
+
m_qr.coeffRef(k, k) = beta;
|
|
523
557
|
|
|
524
558
|
// remember the maximum absolute value of diagonal coefficients
|
|
525
|
-
if(abs(beta) > m_maxpivot) m_maxpivot = abs(beta);
|
|
559
|
+
if (abs(beta) > m_maxpivot) m_maxpivot = abs(beta);
|
|
526
560
|
|
|
527
|
-
m_qr.bottomRightCorner(rows-k, cols-k-1)
|
|
528
|
-
.applyHouseholderOnTheLeft(m_qr.col(k).tail(rows-k-1), m_hCoeffs.coeffRef(k), &m_temp.coeffRef(k+1));
|
|
561
|
+
m_qr.bottomRightCorner(rows - k, cols - k - 1)
|
|
562
|
+
.applyHouseholderOnTheLeft(m_qr.col(k).tail(rows - k - 1), m_hCoeffs.coeffRef(k), &m_temp.coeffRef(k + 1));
|
|
529
563
|
}
|
|
530
564
|
|
|
531
565
|
m_cols_permutation.setIdentity(cols);
|
|
532
|
-
for(Index k = 0; k < size; ++k)
|
|
533
|
-
m_cols_permutation.applyTranspositionOnTheRight(k, m_cols_transpositions.coeff(k));
|
|
566
|
+
for (Index k = 0; k < size; ++k) m_cols_permutation.applyTranspositionOnTheRight(k, m_cols_transpositions.coeff(k));
|
|
534
567
|
|
|
535
|
-
|
|
568
|
+
m_det_p = (number_of_transpositions % 2) ? -1 : 1;
|
|
536
569
|
m_isInitialized = true;
|
|
537
570
|
}
|
|
538
571
|
|
|
539
572
|
#ifndef EIGEN_PARSED_BY_DOXYGEN
|
|
540
|
-
template<typename
|
|
541
|
-
template<typename RhsType, typename DstType>
|
|
542
|
-
void FullPivHouseholderQR<
|
|
543
|
-
{
|
|
544
|
-
eigen_assert(rhs.rows() == rows());
|
|
573
|
+
template <typename MatrixType_, typename PermutationIndex_>
|
|
574
|
+
template <typename RhsType, typename DstType>
|
|
575
|
+
void FullPivHouseholderQR<MatrixType_, PermutationIndex_>::_solve_impl(const RhsType& rhs, DstType& dst) const {
|
|
545
576
|
const Index l_rank = rank();
|
|
546
577
|
|
|
547
578
|
// FIXME introduce nonzeroPivots() and use it here. and more generally,
|
|
548
579
|
// make the same improvements in this dec as in FullPivLU.
|
|
549
|
-
if(l_rank==0)
|
|
550
|
-
{
|
|
580
|
+
if (l_rank == 0) {
|
|
551
581
|
dst.setZero();
|
|
552
582
|
return;
|
|
553
583
|
}
|
|
554
584
|
|
|
555
585
|
typename RhsType::PlainObject c(rhs);
|
|
556
586
|
|
|
557
|
-
Matrix<Scalar,1,RhsType::ColsAtCompileTime> temp(rhs.cols());
|
|
558
|
-
for (Index k = 0; k < l_rank; ++k)
|
|
559
|
-
|
|
560
|
-
Index remainingSize = rows()-k;
|
|
587
|
+
Matrix<typename RhsType::Scalar, 1, RhsType::ColsAtCompileTime> temp(rhs.cols());
|
|
588
|
+
for (Index k = 0; k < l_rank; ++k) {
|
|
589
|
+
Index remainingSize = rows() - k;
|
|
561
590
|
c.row(k).swap(c.row(m_rows_transpositions.coeff(k)));
|
|
562
591
|
c.bottomRightCorner(remainingSize, rhs.cols())
|
|
563
|
-
|
|
564
|
-
|
|
592
|
+
.applyHouseholderOnTheLeft(m_qr.col(k).tail(remainingSize - 1), m_hCoeffs.coeff(k), &temp.coeffRef(0));
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
m_qr.topLeftCorner(l_rank, l_rank).template triangularView<Upper>().solveInPlace(c.topRows(l_rank));
|
|
596
|
+
|
|
597
|
+
for (Index i = 0; i < l_rank; ++i) dst.row(m_cols_permutation.indices().coeff(i)) = c.row(i);
|
|
598
|
+
for (Index i = l_rank; i < cols(); ++i) dst.row(m_cols_permutation.indices().coeff(i)).setZero();
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
template <typename MatrixType_, typename PermutationIndex_>
|
|
602
|
+
template <bool Conjugate, typename RhsType, typename DstType>
|
|
603
|
+
void FullPivHouseholderQR<MatrixType_, PermutationIndex_>::_solve_impl_transposed(const RhsType& rhs,
|
|
604
|
+
DstType& dst) const {
|
|
605
|
+
const Index l_rank = rank();
|
|
606
|
+
|
|
607
|
+
if (l_rank == 0) {
|
|
608
|
+
dst.setZero();
|
|
609
|
+
return;
|
|
565
610
|
}
|
|
566
611
|
|
|
612
|
+
typename RhsType::PlainObject c(m_cols_permutation.transpose() * rhs);
|
|
613
|
+
|
|
567
614
|
m_qr.topLeftCorner(l_rank, l_rank)
|
|
568
615
|
.template triangularView<Upper>()
|
|
616
|
+
.transpose()
|
|
617
|
+
.template conjugateIf<Conjugate>()
|
|
569
618
|
.solveInPlace(c.topRows(l_rank));
|
|
570
619
|
|
|
571
|
-
|
|
572
|
-
|
|
620
|
+
dst.topRows(l_rank) = c.topRows(l_rank);
|
|
621
|
+
dst.bottomRows(rows() - l_rank).setZero();
|
|
622
|
+
|
|
623
|
+
Matrix<Scalar, 1, DstType::ColsAtCompileTime> temp(dst.cols());
|
|
624
|
+
const Index size = (std::min)(rows(), cols());
|
|
625
|
+
for (Index k = size - 1; k >= 0; --k) {
|
|
626
|
+
Index remainingSize = rows() - k;
|
|
627
|
+
|
|
628
|
+
dst.bottomRightCorner(remainingSize, dst.cols())
|
|
629
|
+
.applyHouseholderOnTheLeft(m_qr.col(k).tail(remainingSize - 1).template conjugateIf<!Conjugate>(),
|
|
630
|
+
m_hCoeffs.template conjugateIf<Conjugate>().coeff(k), &temp.coeffRef(0));
|
|
631
|
+
|
|
632
|
+
dst.row(k).swap(dst.row(m_rows_transpositions.coeff(k)));
|
|
633
|
+
}
|
|
573
634
|
}
|
|
574
635
|
#endif
|
|
575
636
|
|
|
576
637
|
namespace internal {
|
|
577
|
-
|
|
578
|
-
template<typename DstXprType, typename MatrixType>
|
|
579
|
-
struct Assignment<DstXprType, Inverse<FullPivHouseholderQR<MatrixType> >,
|
|
580
|
-
|
|
581
|
-
|
|
638
|
+
|
|
639
|
+
template <typename DstXprType, typename MatrixType, typename PermutationIndex>
|
|
640
|
+
struct Assignment<DstXprType, Inverse<FullPivHouseholderQR<MatrixType, PermutationIndex> >,
|
|
641
|
+
internal::assign_op<typename DstXprType::Scalar,
|
|
642
|
+
typename FullPivHouseholderQR<MatrixType, PermutationIndex>::Scalar>,
|
|
643
|
+
Dense2Dense> {
|
|
644
|
+
typedef FullPivHouseholderQR<MatrixType, PermutationIndex> QrType;
|
|
582
645
|
typedef Inverse<QrType> SrcXprType;
|
|
583
|
-
static void run(DstXprType
|
|
584
|
-
|
|
646
|
+
static void run(DstXprType& dst, const SrcXprType& src,
|
|
647
|
+
const internal::assign_op<typename DstXprType::Scalar, typename QrType::Scalar>&) {
|
|
585
648
|
dst = src.nestedExpression().solve(MatrixType::Identity(src.rows(), src.cols()));
|
|
586
649
|
}
|
|
587
650
|
};
|
|
588
651
|
|
|
589
652
|
/** \ingroup QR_Module
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
template<typename MatrixType
|
|
596
|
-
|
|
597
|
-
{
|
|
598
|
-
public:
|
|
599
|
-
typedef typename FullPivHouseholderQR<MatrixType>::IntDiagSizeVectorType IntDiagSizeVectorType;
|
|
653
|
+
*
|
|
654
|
+
* \brief Expression type for return value of FullPivHouseholderQR::matrixQ()
|
|
655
|
+
*
|
|
656
|
+
* \tparam MatrixType type of underlying dense matrix
|
|
657
|
+
*/
|
|
658
|
+
template <typename MatrixType, typename PermutationIndex>
|
|
659
|
+
struct FullPivHouseholderQRMatrixQReturnType
|
|
660
|
+
: public ReturnByValue<FullPivHouseholderQRMatrixQReturnType<MatrixType, PermutationIndex> > {
|
|
661
|
+
public:
|
|
662
|
+
typedef typename FullPivHouseholderQR<MatrixType, PermutationIndex>::IntDiagSizeVectorType IntDiagSizeVectorType;
|
|
600
663
|
typedef typename internal::plain_diag_type<MatrixType>::type HCoeffsType;
|
|
601
664
|
typedef Matrix<typename MatrixType::Scalar, 1, MatrixType::RowsAtCompileTime, RowMajor, 1,
|
|
602
|
-
MatrixType::MaxRowsAtCompileTime>
|
|
665
|
+
MatrixType::MaxRowsAtCompileTime>
|
|
666
|
+
WorkVectorType;
|
|
603
667
|
|
|
604
|
-
FullPivHouseholderQRMatrixQReturnType(const MatrixType&
|
|
605
|
-
const HCoeffsType& hCoeffs,
|
|
668
|
+
FullPivHouseholderQRMatrixQReturnType(const MatrixType& qr, const HCoeffsType& hCoeffs,
|
|
606
669
|
const IntDiagSizeVectorType& rowsTranspositions)
|
|
607
|
-
|
|
608
|
-
m_hCoeffs(hCoeffs),
|
|
609
|
-
m_rowsTranspositions(rowsTranspositions)
|
|
610
|
-
{}
|
|
670
|
+
: m_qr(qr), m_hCoeffs(hCoeffs), m_rowsTranspositions(rowsTranspositions) {}
|
|
611
671
|
|
|
612
672
|
template <typename ResultType>
|
|
613
|
-
void evalTo(ResultType& result) const
|
|
614
|
-
{
|
|
673
|
+
void evalTo(ResultType& result) const {
|
|
615
674
|
const Index rows = m_qr.rows();
|
|
616
675
|
WorkVectorType workspace(rows);
|
|
617
676
|
evalTo(result, workspace);
|
|
618
677
|
}
|
|
619
678
|
|
|
620
679
|
template <typename ResultType>
|
|
621
|
-
void evalTo(ResultType& result, WorkVectorType& workspace) const
|
|
622
|
-
{
|
|
680
|
+
void evalTo(ResultType& result, WorkVectorType& workspace) const {
|
|
623
681
|
using numext::conj;
|
|
624
682
|
// compute the product H'_0 H'_1 ... H'_n-1,
|
|
625
683
|
// where H_k is the k-th Householder transformation I - h_k v_k v_k'
|
|
@@ -629,10 +687,9 @@ public:
|
|
|
629
687
|
const Index size = (std::min)(rows, cols);
|
|
630
688
|
workspace.resize(rows);
|
|
631
689
|
result.setIdentity(rows, rows);
|
|
632
|
-
for (Index k = size-1; k >= 0; k--)
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
.applyHouseholderOnTheLeft(m_qr.col(k).tail(rows-k-1), conj(m_hCoeffs.coeff(k)), &workspace.coeffRef(k));
|
|
690
|
+
for (Index k = size - 1; k >= 0; k--) {
|
|
691
|
+
result.block(k, k, rows - k, rows - k)
|
|
692
|
+
.applyHouseholderOnTheLeft(m_qr.col(k).tail(rows - k - 1), conj(m_hCoeffs.coeff(k)), &workspace.coeffRef(k));
|
|
636
693
|
result.row(k).swap(result.row(m_rowsTranspositions.coeff(k)));
|
|
637
694
|
}
|
|
638
695
|
}
|
|
@@ -640,7 +697,7 @@ public:
|
|
|
640
697
|
Index rows() const { return m_qr.rows(); }
|
|
641
698
|
Index cols() const { return m_qr.rows(); }
|
|
642
699
|
|
|
643
|
-
protected:
|
|
700
|
+
protected:
|
|
644
701
|
typename MatrixType::Nested m_qr;
|
|
645
702
|
typename HCoeffsType::Nested m_hCoeffs;
|
|
646
703
|
typename IntDiagSizeVectorType::Nested m_rowsTranspositions;
|
|
@@ -651,26 +708,26 @@ protected:
|
|
|
651
708
|
// : public evaluator<ReturnByValue<FullPivHouseholderQRMatrixQReturnType<MatrixType> > >
|
|
652
709
|
// {};
|
|
653
710
|
|
|
654
|
-
}
|
|
711
|
+
} // end namespace internal
|
|
655
712
|
|
|
656
|
-
template<typename MatrixType>
|
|
657
|
-
inline typename FullPivHouseholderQR<MatrixType>::MatrixQReturnType
|
|
658
|
-
{
|
|
713
|
+
template <typename MatrixType, typename PermutationIndex>
|
|
714
|
+
inline typename FullPivHouseholderQR<MatrixType, PermutationIndex>::MatrixQReturnType
|
|
715
|
+
FullPivHouseholderQR<MatrixType, PermutationIndex>::matrixQ() const {
|
|
659
716
|
eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
|
|
660
717
|
return MatrixQReturnType(m_qr, m_hCoeffs, m_rows_transpositions);
|
|
661
718
|
}
|
|
662
719
|
|
|
663
720
|
/** \return the full-pivoting Householder QR decomposition of \c *this.
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
template<typename Derived>
|
|
668
|
-
|
|
669
|
-
MatrixBase<Derived>::
|
|
670
|
-
{
|
|
671
|
-
return FullPivHouseholderQR<PlainObject>(eval());
|
|
721
|
+
*
|
|
722
|
+
* \sa class FullPivHouseholderQR
|
|
723
|
+
*/
|
|
724
|
+
template <typename Derived>
|
|
725
|
+
template <typename PermutationIndex>
|
|
726
|
+
const FullPivHouseholderQR<typename MatrixBase<Derived>::PlainObject, PermutationIndex>
|
|
727
|
+
MatrixBase<Derived>::fullPivHouseholderQr() const {
|
|
728
|
+
return FullPivHouseholderQR<PlainObject, PermutationIndex>(eval());
|
|
672
729
|
}
|
|
673
730
|
|
|
674
|
-
}
|
|
731
|
+
} // end namespace Eigen
|
|
675
732
|
|
|
676
|
-
#endif
|
|
733
|
+
#endif // EIGEN_FULLPIVOTINGHOUSEHOLDERQR_H
|