@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,457 +11,459 @@
|
|
|
11
11
|
#ifndef EIGEN_SPARSE_QR_H
|
|
12
12
|
#define EIGEN_SPARSE_QR_H
|
|
13
13
|
|
|
14
|
+
// IWYU pragma: private
|
|
15
|
+
#include "./InternalHeaderCheck.h"
|
|
16
|
+
|
|
14
17
|
namespace Eigen {
|
|
15
18
|
|
|
16
|
-
template<typename MatrixType, typename OrderingType>
|
|
17
|
-
|
|
18
|
-
template<typename SparseQRType>
|
|
19
|
-
|
|
19
|
+
template <typename MatrixType, typename OrderingType>
|
|
20
|
+
class SparseQR;
|
|
21
|
+
template <typename SparseQRType>
|
|
22
|
+
struct SparseQRMatrixQReturnType;
|
|
23
|
+
template <typename SparseQRType>
|
|
24
|
+
struct SparseQRMatrixQTransposeReturnType;
|
|
25
|
+
template <typename SparseQRType, typename Derived>
|
|
26
|
+
struct SparseQR_QProduct;
|
|
20
27
|
namespace internal {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
typedef typename Derived::PlainObject ReturnType;
|
|
38
|
-
};
|
|
39
|
-
} // End namespace internal
|
|
28
|
+
template <typename SparseQRType>
|
|
29
|
+
struct traits<SparseQRMatrixQReturnType<SparseQRType> > {
|
|
30
|
+
typedef typename SparseQRType::MatrixType ReturnType;
|
|
31
|
+
typedef typename ReturnType::StorageIndex StorageIndex;
|
|
32
|
+
typedef typename ReturnType::StorageKind StorageKind;
|
|
33
|
+
enum { RowsAtCompileTime = Dynamic, ColsAtCompileTime = Dynamic };
|
|
34
|
+
};
|
|
35
|
+
template <typename SparseQRType>
|
|
36
|
+
struct traits<SparseQRMatrixQTransposeReturnType<SparseQRType> > {
|
|
37
|
+
typedef typename SparseQRType::MatrixType ReturnType;
|
|
38
|
+
};
|
|
39
|
+
template <typename SparseQRType, typename Derived>
|
|
40
|
+
struct traits<SparseQR_QProduct<SparseQRType, Derived> > {
|
|
41
|
+
typedef typename Derived::PlainObject ReturnType;
|
|
42
|
+
};
|
|
43
|
+
} // End namespace internal
|
|
40
44
|
|
|
41
45
|
/**
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
analyzePattern(mat);
|
|
118
|
-
factorize(mat);
|
|
119
|
-
}
|
|
120
|
-
void analyzePattern(const MatrixType& mat);
|
|
121
|
-
void factorize(const MatrixType& mat);
|
|
122
|
-
|
|
123
|
-
/** \returns the number of rows of the represented matrix.
|
|
124
|
-
*/
|
|
125
|
-
inline Index rows() const { return m_pmat.rows(); }
|
|
126
|
-
|
|
127
|
-
/** \returns the number of columns of the represented matrix.
|
|
128
|
-
*/
|
|
129
|
-
inline Index cols() const { return m_pmat.cols();}
|
|
130
|
-
|
|
131
|
-
/** \returns a const reference to the \b sparse upper triangular matrix R of the QR factorization.
|
|
132
|
-
* \warning The entries of the returned matrix are not sorted. This means that using it in algorithms
|
|
133
|
-
* expecting sorted entries will fail. This include random coefficient accesses (SpaseMatrix::coeff()),
|
|
134
|
-
* and coefficient-wise operations. Matrix products and triangular solves are fine though.
|
|
135
|
-
*
|
|
136
|
-
* To sort the entries, you can assign it to a row-major matrix, and if a column-major matrix
|
|
137
|
-
* is required, you can copy it again:
|
|
138
|
-
* \code
|
|
139
|
-
* SparseMatrix<double> R = qr.matrixR(); // column-major, not sorted!
|
|
140
|
-
* SparseMatrix<double,RowMajor> Rr = qr.matrixR(); // row-major, sorted
|
|
141
|
-
* SparseMatrix<double> Rc = Rr; // column-major, sorted
|
|
142
|
-
* \endcode
|
|
143
|
-
*/
|
|
144
|
-
const QRMatrixType& matrixR() const { return m_R; }
|
|
145
|
-
|
|
146
|
-
/** \returns the number of non linearly dependent columns as determined by the pivoting threshold.
|
|
147
|
-
*
|
|
148
|
-
* \sa setPivotThreshold()
|
|
149
|
-
*/
|
|
150
|
-
Index rank() const
|
|
151
|
-
{
|
|
152
|
-
eigen_assert(m_isInitialized && "The factorization should be called first, use compute()");
|
|
153
|
-
return m_nonzeropivots;
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
/** \returns an expression of the matrix Q as products of sparse Householder reflectors.
|
|
157
|
-
* The common usage of this function is to apply it to a dense matrix or vector
|
|
158
|
-
* \code
|
|
159
|
-
* VectorXd B1, B2;
|
|
160
|
-
* // Initialize B1
|
|
161
|
-
* B2 = matrixQ() * B1;
|
|
162
|
-
* \endcode
|
|
163
|
-
*
|
|
164
|
-
* To get a plain SparseMatrix representation of Q:
|
|
165
|
-
* \code
|
|
166
|
-
* SparseMatrix<double> Q;
|
|
167
|
-
* Q = SparseQR<SparseMatrix<double> >(A).matrixQ();
|
|
168
|
-
* \endcode
|
|
169
|
-
* Internally, this call simply performs a sparse product between the matrix Q
|
|
170
|
-
* and a sparse identity matrix. However, due to the fact that the sparse
|
|
171
|
-
* reflectors are stored unsorted, two transpositions are needed to sort
|
|
172
|
-
* them before performing the product.
|
|
173
|
-
*/
|
|
174
|
-
SparseQRMatrixQReturnType<SparseQR> matrixQ() const
|
|
175
|
-
{ return SparseQRMatrixQReturnType<SparseQR>(*this); }
|
|
176
|
-
|
|
177
|
-
/** \returns a const reference to the column permutation P that was applied to A such that A*P = Q*R
|
|
178
|
-
* It is the combination of the fill-in reducing permutation and numerical column pivoting.
|
|
179
|
-
*/
|
|
180
|
-
const PermutationType& colsPermutation() const
|
|
181
|
-
{
|
|
182
|
-
eigen_assert(m_isInitialized && "Decomposition is not initialized.");
|
|
183
|
-
return m_outputPerm_c;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
/** \returns A string describing the type of error.
|
|
187
|
-
* This method is provided to ease debugging, not to handle errors.
|
|
188
|
-
*/
|
|
189
|
-
std::string lastErrorMessage() const { return m_lastError; }
|
|
190
|
-
|
|
191
|
-
/** \internal */
|
|
192
|
-
template<typename Rhs, typename Dest>
|
|
193
|
-
bool _solve_impl(const MatrixBase<Rhs> &B, MatrixBase<Dest> &dest) const
|
|
194
|
-
{
|
|
195
|
-
eigen_assert(m_isInitialized && "The factorization should be called first, use compute()");
|
|
196
|
-
eigen_assert(this->rows() == B.rows() && "SparseQR::solve() : invalid number of rows in the right hand side matrix");
|
|
197
|
-
|
|
198
|
-
Index rank = this->rank();
|
|
199
|
-
|
|
200
|
-
// Compute Q^* * b;
|
|
201
|
-
typename Dest::PlainObject y, b;
|
|
202
|
-
y = this->matrixQ().adjoint() * B;
|
|
203
|
-
b = y;
|
|
204
|
-
|
|
205
|
-
// Solve with the triangular matrix R
|
|
206
|
-
y.resize((std::max<Index>)(cols(),y.rows()),y.cols());
|
|
207
|
-
y.topRows(rank) = this->matrixR().topLeftCorner(rank, rank).template triangularView<Upper>().solve(b.topRows(rank));
|
|
208
|
-
y.bottomRows(y.rows()-rank).setZero();
|
|
209
|
-
|
|
210
|
-
// Apply the column permutation
|
|
211
|
-
if (m_perm_c.size()) dest = colsPermutation() * y.topRows(cols());
|
|
212
|
-
else dest = y.topRows(cols());
|
|
213
|
-
|
|
214
|
-
m_info = Success;
|
|
215
|
-
return true;
|
|
216
|
-
}
|
|
46
|
+
* \ingroup SparseQR_Module
|
|
47
|
+
* \class SparseQR
|
|
48
|
+
* \brief Sparse left-looking QR factorization with numerical column pivoting
|
|
49
|
+
*
|
|
50
|
+
* This class implements a left-looking QR decomposition of sparse matrices
|
|
51
|
+
* with numerical column pivoting.
|
|
52
|
+
* When a column has a norm less than a given tolerance
|
|
53
|
+
* it is implicitly permuted to the end. The QR factorization thus obtained is
|
|
54
|
+
* given by A*P = Q*R where R is upper triangular or trapezoidal.
|
|
55
|
+
*
|
|
56
|
+
* P is the column permutation which is the product of the fill-reducing and the
|
|
57
|
+
* numerical permutations. Use colsPermutation() to get it.
|
|
58
|
+
*
|
|
59
|
+
* Q is the orthogonal matrix represented as products of Householder reflectors.
|
|
60
|
+
* Use matrixQ() to get an expression and matrixQ().adjoint() to get the adjoint.
|
|
61
|
+
* You can then apply it to a vector.
|
|
62
|
+
*
|
|
63
|
+
* R is the sparse triangular or trapezoidal matrix. The later occurs when A is rank-deficient.
|
|
64
|
+
* matrixR().topLeftCorner(rank(), rank()) always returns a triangular factor of full rank.
|
|
65
|
+
*
|
|
66
|
+
* \tparam MatrixType_ The type of the sparse matrix A, must be a column-major SparseMatrix<>
|
|
67
|
+
* \tparam OrderingType_ The fill-reducing ordering method. See the \link OrderingMethods_Module
|
|
68
|
+
* OrderingMethods \endlink module for the list of built-in and external ordering methods.
|
|
69
|
+
*
|
|
70
|
+
* \implsparsesolverconcept
|
|
71
|
+
*
|
|
72
|
+
* The numerical pivoting strategy and default threshold are the same as in SuiteSparse QR, and
|
|
73
|
+
* detailed in the following paper:
|
|
74
|
+
* <i>
|
|
75
|
+
* Tim Davis, "Algorithm 915, SuiteSparseQR: Multifrontal Multithreaded Rank-Revealing
|
|
76
|
+
* Sparse QR Factorization", ACM Trans. on Math. Soft. 38(1), 2011.
|
|
77
|
+
* </i>
|
|
78
|
+
* Even though it is qualified as "rank-revealing", this strategy might fail for some
|
|
79
|
+
* rank deficient problems. When this class is used to solve linear or least-square problems
|
|
80
|
+
* it is thus strongly recommended to check the accuracy of the computed solution. If it
|
|
81
|
+
* failed, it usually helps to increase the threshold with setPivotThreshold.
|
|
82
|
+
*
|
|
83
|
+
* \warning The input sparse matrix A must be in compressed mode (see SparseMatrix::makeCompressed()).
|
|
84
|
+
* \warning For complex matrices matrixQ().transpose() will actually return the adjoint matrix.
|
|
85
|
+
*
|
|
86
|
+
*/
|
|
87
|
+
template <typename MatrixType_, typename OrderingType_>
|
|
88
|
+
class SparseQR : public SparseSolverBase<SparseQR<MatrixType_, OrderingType_> > {
|
|
89
|
+
protected:
|
|
90
|
+
typedef SparseSolverBase<SparseQR<MatrixType_, OrderingType_> > Base;
|
|
91
|
+
using Base::m_isInitialized;
|
|
92
|
+
|
|
93
|
+
public:
|
|
94
|
+
using Base::_solve_impl;
|
|
95
|
+
typedef MatrixType_ MatrixType;
|
|
96
|
+
typedef OrderingType_ OrderingType;
|
|
97
|
+
typedef typename MatrixType::Scalar Scalar;
|
|
98
|
+
typedef typename MatrixType::RealScalar RealScalar;
|
|
99
|
+
typedef typename MatrixType::StorageIndex StorageIndex;
|
|
100
|
+
typedef SparseMatrix<Scalar, ColMajor, StorageIndex> QRMatrixType;
|
|
101
|
+
typedef Matrix<StorageIndex, Dynamic, 1> IndexVector;
|
|
102
|
+
typedef Matrix<Scalar, Dynamic, 1> ScalarVector;
|
|
103
|
+
typedef PermutationMatrix<Dynamic, Dynamic, StorageIndex> PermutationType;
|
|
104
|
+
|
|
105
|
+
enum { ColsAtCompileTime = MatrixType::ColsAtCompileTime, MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime };
|
|
106
|
+
|
|
107
|
+
public:
|
|
108
|
+
SparseQR()
|
|
109
|
+
: m_analysisIsok(false), m_lastError(""), m_useDefaultThreshold(true), m_isQSorted(false), m_isEtreeOk(false) {}
|
|
110
|
+
|
|
111
|
+
/** Construct a QR factorization of the matrix \a mat.
|
|
112
|
+
*
|
|
113
|
+
* \warning The matrix \a mat must be in compressed mode (see SparseMatrix::makeCompressed()).
|
|
114
|
+
*
|
|
115
|
+
* \sa compute()
|
|
116
|
+
*/
|
|
117
|
+
explicit SparseQR(const MatrixType& mat)
|
|
118
|
+
: m_analysisIsok(false), m_lastError(""), m_useDefaultThreshold(true), m_isQSorted(false), m_isEtreeOk(false) {
|
|
119
|
+
compute(mat);
|
|
120
|
+
}
|
|
217
121
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
*
|
|
231
|
-
* \sa compute()
|
|
232
|
-
*/
|
|
233
|
-
template<typename Rhs>
|
|
234
|
-
inline const Solve<SparseQR, Rhs> solve(const MatrixBase<Rhs>& B) const
|
|
235
|
-
{
|
|
236
|
-
eigen_assert(m_isInitialized && "The factorization should be called first, use compute()");
|
|
237
|
-
eigen_assert(this->rows() == B.rows() && "SparseQR::solve() : invalid number of rows in the right hand side matrix");
|
|
238
|
-
return Solve<SparseQR, Rhs>(*this, B.derived());
|
|
239
|
-
}
|
|
240
|
-
template<typename Rhs>
|
|
241
|
-
inline const Solve<SparseQR, Rhs> solve(const SparseMatrixBase<Rhs>& B) const
|
|
242
|
-
{
|
|
243
|
-
eigen_assert(m_isInitialized && "The factorization should be called first, use compute()");
|
|
244
|
-
eigen_assert(this->rows() == B.rows() && "SparseQR::solve() : invalid number of rows in the right hand side matrix");
|
|
245
|
-
return Solve<SparseQR, Rhs>(*this, B.derived());
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
/** \brief Reports whether previous computation was successful.
|
|
249
|
-
*
|
|
250
|
-
* \returns \c Success if computation was successful,
|
|
251
|
-
* \c NumericalIssue if the QR factorization reports a numerical problem
|
|
252
|
-
* \c InvalidInput if the input matrix is invalid
|
|
253
|
-
*
|
|
254
|
-
* \sa iparm()
|
|
255
|
-
*/
|
|
256
|
-
ComputationInfo info() const
|
|
257
|
-
{
|
|
258
|
-
eigen_assert(m_isInitialized && "Decomposition is not initialized.");
|
|
259
|
-
return m_info;
|
|
260
|
-
}
|
|
122
|
+
/** Computes the QR factorization of the sparse matrix \a mat.
|
|
123
|
+
*
|
|
124
|
+
* \warning The matrix \a mat must be in compressed mode (see SparseMatrix::makeCompressed()).
|
|
125
|
+
*
|
|
126
|
+
* \sa analyzePattern(), factorize()
|
|
127
|
+
*/
|
|
128
|
+
void compute(const MatrixType& mat) {
|
|
129
|
+
analyzePattern(mat);
|
|
130
|
+
factorize(mat);
|
|
131
|
+
}
|
|
132
|
+
void analyzePattern(const MatrixType& mat);
|
|
133
|
+
void factorize(const MatrixType& mat);
|
|
261
134
|
|
|
135
|
+
/** \returns the number of rows of the represented matrix.
|
|
136
|
+
*/
|
|
137
|
+
inline Index rows() const { return m_pmat.rows(); }
|
|
262
138
|
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
139
|
+
/** \returns the number of columns of the represented matrix.
|
|
140
|
+
*/
|
|
141
|
+
inline Index cols() const { return m_pmat.cols(); }
|
|
142
|
+
|
|
143
|
+
/** \returns a const reference to the \b sparse upper triangular matrix R of the QR factorization.
|
|
144
|
+
* \warning The entries of the returned matrix are not sorted. This means that using it in algorithms
|
|
145
|
+
* expecting sorted entries will fail. This include random coefficient accesses (SpaseMatrix::coeff()),
|
|
146
|
+
* and coefficient-wise operations. Matrix products and triangular solves are fine though.
|
|
147
|
+
*
|
|
148
|
+
* To sort the entries, you can assign it to a row-major matrix, and if a column-major matrix
|
|
149
|
+
* is required, you can copy it again:
|
|
150
|
+
* \code
|
|
151
|
+
* SparseMatrix<double> R = qr.matrixR(); // column-major, not sorted!
|
|
152
|
+
* SparseMatrix<double,RowMajor> Rr = qr.matrixR(); // row-major, sorted
|
|
153
|
+
* SparseMatrix<double> Rc = Rr; // column-major, sorted
|
|
154
|
+
* \endcode
|
|
155
|
+
*/
|
|
156
|
+
const QRMatrixType& matrixR() const { return m_R; }
|
|
157
|
+
|
|
158
|
+
/** \returns the number of non linearly dependent columns as determined by the pivoting threshold.
|
|
159
|
+
*
|
|
160
|
+
* \sa setPivotThreshold()
|
|
161
|
+
*/
|
|
162
|
+
Index rank() const {
|
|
163
|
+
eigen_assert(m_isInitialized && "The factorization should be called first, use compute()");
|
|
164
|
+
return m_nonzeropivots;
|
|
165
|
+
}
|
|
272
166
|
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
167
|
+
/** \returns an expression of the matrix Q as products of sparse Householder reflectors.
|
|
168
|
+
* The common usage of this function is to apply it to a dense matrix or vector
|
|
169
|
+
* \code
|
|
170
|
+
* VectorXd B1, B2;
|
|
171
|
+
* // Initialize B1
|
|
172
|
+
* B2 = matrixQ() * B1;
|
|
173
|
+
* \endcode
|
|
174
|
+
*
|
|
175
|
+
* To get a plain SparseMatrix representation of Q:
|
|
176
|
+
* \code
|
|
177
|
+
* SparseMatrix<double> Q;
|
|
178
|
+
* Q = SparseQR<SparseMatrix<double> >(A).matrixQ();
|
|
179
|
+
* \endcode
|
|
180
|
+
* Internally, this call simply performs a sparse product between the matrix Q
|
|
181
|
+
* and a sparse identity matrix. However, due to the fact that the sparse
|
|
182
|
+
* reflectors are stored unsorted, two transpositions are needed to sort
|
|
183
|
+
* them before performing the product.
|
|
184
|
+
*/
|
|
185
|
+
SparseQRMatrixQReturnType<SparseQR> matrixQ() const { return SparseQRMatrixQReturnType<SparseQR>(*this); }
|
|
186
|
+
|
|
187
|
+
/** \returns a const reference to the column permutation P that was applied to A such that A*P = Q*R
|
|
188
|
+
* It is the combination of the fill-in reducing permutation and numerical column pivoting.
|
|
189
|
+
*/
|
|
190
|
+
const PermutationType& colsPermutation() const {
|
|
191
|
+
eigen_assert(m_isInitialized && "Decomposition is not initialized.");
|
|
192
|
+
return m_outputPerm_c;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/** \returns A string describing the type of error.
|
|
196
|
+
* This method is provided to ease debugging, not to handle errors.
|
|
197
|
+
*/
|
|
198
|
+
std::string lastErrorMessage() const { return m_lastError; }
|
|
199
|
+
|
|
200
|
+
/** \internal */
|
|
201
|
+
template <typename Rhs, typename Dest>
|
|
202
|
+
bool _solve_impl(const MatrixBase<Rhs>& B, MatrixBase<Dest>& dest) const {
|
|
203
|
+
eigen_assert(m_isInitialized && "The factorization should be called first, use compute()");
|
|
204
|
+
eigen_assert(this->rows() == B.rows() &&
|
|
205
|
+
"SparseQR::solve() : invalid number of rows in the right hand side matrix");
|
|
206
|
+
|
|
207
|
+
Index rank = this->rank();
|
|
208
|
+
|
|
209
|
+
// Compute Q^* * b;
|
|
210
|
+
typename Dest::PlainObject y, b;
|
|
211
|
+
y = this->matrixQ().adjoint() * B;
|
|
212
|
+
b = y;
|
|
213
|
+
|
|
214
|
+
// Solve with the triangular matrix R
|
|
215
|
+
y.resize((std::max<Index>)(cols(), y.rows()), y.cols());
|
|
216
|
+
y.topRows(rank) = this->matrixR().topLeftCorner(rank, rank).template triangularView<Upper>().solve(b.topRows(rank));
|
|
217
|
+
y.bottomRows(y.rows() - rank).setZero();
|
|
218
|
+
|
|
219
|
+
// Apply the column permutation
|
|
220
|
+
if (m_perm_c.size())
|
|
221
|
+
dest = colsPermutation() * y.topRows(cols());
|
|
222
|
+
else
|
|
223
|
+
dest = y.topRows(cols());
|
|
224
|
+
|
|
225
|
+
m_info = Success;
|
|
226
|
+
return true;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/** Sets the threshold that is used to determine linearly dependent columns during the factorization.
|
|
230
|
+
*
|
|
231
|
+
* In practice, if during the factorization the norm of the column that has to be eliminated is below
|
|
232
|
+
* this threshold, then the entire column is treated as zero, and it is moved at the end.
|
|
233
|
+
*/
|
|
234
|
+
void setPivotThreshold(const RealScalar& threshold) {
|
|
235
|
+
m_useDefaultThreshold = false;
|
|
236
|
+
m_threshold = threshold;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/** \returns the solution X of \f$ A X = B \f$ using the current decomposition of A.
|
|
240
|
+
*
|
|
241
|
+
* \sa compute()
|
|
242
|
+
*/
|
|
243
|
+
template <typename Rhs>
|
|
244
|
+
inline const Solve<SparseQR, Rhs> solve(const MatrixBase<Rhs>& B) const {
|
|
245
|
+
eigen_assert(m_isInitialized && "The factorization should be called first, use compute()");
|
|
246
|
+
eigen_assert(this->rows() == B.rows() &&
|
|
247
|
+
"SparseQR::solve() : invalid number of rows in the right hand side matrix");
|
|
248
|
+
return Solve<SparseQR, Rhs>(*this, B.derived());
|
|
249
|
+
}
|
|
250
|
+
template <typename Rhs>
|
|
251
|
+
inline const Solve<SparseQR, Rhs> solve(const SparseMatrixBase<Rhs>& B) const {
|
|
252
|
+
eigen_assert(m_isInitialized && "The factorization should be called first, use compute()");
|
|
253
|
+
eigen_assert(this->rows() == B.rows() &&
|
|
254
|
+
"SparseQR::solve() : invalid number of rows in the right hand side matrix");
|
|
255
|
+
return Solve<SparseQR, Rhs>(*this, B.derived());
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/** \brief Reports whether previous computation was successful.
|
|
259
|
+
*
|
|
260
|
+
* \returns \c Success if computation was successful,
|
|
261
|
+
* \c NumericalIssue if the QR factorization reports a numerical problem
|
|
262
|
+
* \c InvalidInput if the input matrix is invalid
|
|
263
|
+
*
|
|
264
|
+
* \sa iparm()
|
|
265
|
+
*/
|
|
266
|
+
ComputationInfo info() const {
|
|
267
|
+
eigen_assert(m_isInitialized && "Decomposition is not initialized.");
|
|
268
|
+
return m_info;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/** \internal */
|
|
272
|
+
inline void _sort_matrix_Q() {
|
|
273
|
+
if (this->m_isQSorted) return;
|
|
274
|
+
// The matrix Q is sorted during the transposition
|
|
275
|
+
SparseMatrix<Scalar, RowMajor, Index> mQrm(this->m_Q);
|
|
276
|
+
this->m_Q = mQrm;
|
|
277
|
+
this->m_isQSorted = true;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
protected:
|
|
281
|
+
bool m_analysisIsok;
|
|
282
|
+
bool m_factorizationIsok;
|
|
283
|
+
mutable ComputationInfo m_info;
|
|
284
|
+
std::string m_lastError;
|
|
285
|
+
QRMatrixType m_pmat; // Temporary matrix
|
|
286
|
+
QRMatrixType m_R; // The triangular factor matrix
|
|
287
|
+
QRMatrixType m_Q; // The orthogonal reflectors
|
|
288
|
+
ScalarVector m_hcoeffs; // The Householder coefficients
|
|
289
|
+
PermutationType m_perm_c; // Fill-reducing Column permutation
|
|
290
|
+
PermutationType m_pivotperm; // The permutation for rank revealing
|
|
291
|
+
PermutationType m_outputPerm_c; // The final column permutation
|
|
292
|
+
RealScalar m_threshold; // Threshold to determine null Householder reflections
|
|
293
|
+
bool m_useDefaultThreshold; // Use default threshold
|
|
294
|
+
Index m_nonzeropivots; // Number of non zero pivots found
|
|
295
|
+
IndexVector m_etree; // Column elimination tree
|
|
296
|
+
IndexVector m_firstRowElt; // First element in each row
|
|
297
|
+
bool m_isQSorted; // whether Q is sorted or not
|
|
298
|
+
bool m_isEtreeOk; // whether the elimination tree match the initial input matrix
|
|
299
|
+
|
|
300
|
+
template <typename, typename>
|
|
301
|
+
friend struct SparseQR_QProduct;
|
|
296
302
|
};
|
|
297
303
|
|
|
298
|
-
/** \brief Preprocessing step of a QR factorization
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
304
|
+
/** \brief Preprocessing step of a QR factorization
|
|
305
|
+
*
|
|
306
|
+
* \warning The matrix \a mat must be in compressed mode (see SparseMatrix::makeCompressed()).
|
|
307
|
+
*
|
|
308
|
+
* In this step, the fill-reducing permutation is computed and applied to the columns of A
|
|
309
|
+
* and the column elimination tree is computed as well. Only the sparsity pattern of \a mat is exploited.
|
|
310
|
+
*
|
|
311
|
+
* \note In this step it is assumed that there is no empty row in the matrix \a mat.
|
|
312
|
+
*/
|
|
307
313
|
template <typename MatrixType, typename OrderingType>
|
|
308
|
-
void SparseQR<MatrixType,OrderingType>::analyzePattern(const MatrixType& mat)
|
|
309
|
-
|
|
310
|
-
|
|
314
|
+
void SparseQR<MatrixType, OrderingType>::analyzePattern(const MatrixType& mat) {
|
|
315
|
+
eigen_assert(
|
|
316
|
+
mat.isCompressed() &&
|
|
317
|
+
"SparseQR requires a sparse matrix in compressed mode. Call .makeCompressed() before passing it to SparseQR");
|
|
311
318
|
// Copy to a column major matrix if the input is rowmajor
|
|
312
|
-
|
|
319
|
+
std::conditional_t<MatrixType::IsRowMajor, QRMatrixType, const MatrixType&> matCpy(mat);
|
|
313
320
|
// Compute the column fill reducing ordering
|
|
314
|
-
OrderingType ord;
|
|
315
|
-
ord(matCpy, m_perm_c);
|
|
321
|
+
OrderingType ord;
|
|
322
|
+
ord(matCpy, m_perm_c);
|
|
316
323
|
Index n = mat.cols();
|
|
317
324
|
Index m = mat.rows();
|
|
318
|
-
Index diagSize = (std::min)(m,n);
|
|
319
|
-
|
|
320
|
-
if (!m_perm_c.size())
|
|
321
|
-
{
|
|
325
|
+
Index diagSize = (std::min)(m, n);
|
|
326
|
+
|
|
327
|
+
if (!m_perm_c.size()) {
|
|
322
328
|
m_perm_c.resize(n);
|
|
323
|
-
m_perm_c.indices().setLinSpaced(n, 0,StorageIndex(n-1));
|
|
329
|
+
m_perm_c.indices().setLinSpaced(n, 0, StorageIndex(n - 1));
|
|
324
330
|
}
|
|
325
|
-
|
|
331
|
+
|
|
326
332
|
// Compute the column elimination tree of the permuted matrix
|
|
327
333
|
m_outputPerm_c = m_perm_c.inverse();
|
|
328
334
|
internal::coletree(matCpy, m_etree, m_firstRowElt, m_outputPerm_c.indices().data());
|
|
329
335
|
m_isEtreeOk = true;
|
|
330
|
-
|
|
336
|
+
|
|
331
337
|
m_R.resize(m, n);
|
|
332
338
|
m_Q.resize(m, diagSize);
|
|
333
|
-
|
|
334
|
-
// Allocate space for nonzero elements
|
|
335
|
-
m_R.reserve(2*mat.nonZeros());
|
|
336
|
-
|
|
339
|
+
|
|
340
|
+
// Allocate space for nonzero elements: rough estimation
|
|
341
|
+
m_R.reserve(2 * mat.nonZeros()); // FIXME Get a more accurate estimation through symbolic factorization with the
|
|
342
|
+
// etree
|
|
343
|
+
m_Q.reserve(2 * mat.nonZeros());
|
|
337
344
|
m_hcoeffs.resize(diagSize);
|
|
338
345
|
m_analysisIsok = true;
|
|
339
346
|
}
|
|
340
347
|
|
|
341
348
|
/** \brief Performs the numerical QR factorization of the input matrix
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
349
|
+
*
|
|
350
|
+
* The function SparseQR::analyzePattern(const MatrixType&) must have been called beforehand with
|
|
351
|
+
* a matrix having the same sparsity pattern than \a mat.
|
|
352
|
+
*
|
|
353
|
+
* \param mat The sparse column-major matrix
|
|
354
|
+
*/
|
|
348
355
|
template <typename MatrixType, typename OrderingType>
|
|
349
|
-
void SparseQR<MatrixType,OrderingType>::factorize(const MatrixType& mat)
|
|
350
|
-
{
|
|
356
|
+
void SparseQR<MatrixType, OrderingType>::factorize(const MatrixType& mat) {
|
|
351
357
|
using std::abs;
|
|
352
|
-
|
|
358
|
+
|
|
353
359
|
eigen_assert(m_analysisIsok && "analyzePattern() should be called before this step");
|
|
354
360
|
StorageIndex m = StorageIndex(mat.rows());
|
|
355
361
|
StorageIndex n = StorageIndex(mat.cols());
|
|
356
|
-
StorageIndex diagSize = (std::min)(m,n);
|
|
357
|
-
IndexVector mark((std::max)(m,n));
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
362
|
+
StorageIndex diagSize = (std::min)(m, n);
|
|
363
|
+
IndexVector mark((std::max)(m, n));
|
|
364
|
+
mark.setConstant(-1); // Record the visited nodes
|
|
365
|
+
IndexVector Ridx(n), Qidx(m); // Store temporarily the row indexes for the current column of R and Q
|
|
366
|
+
Index nzcolR, nzcolQ; // Number of nonzero for the current column of R and Q
|
|
367
|
+
ScalarVector tval(m); // The dense vector used to compute the current column
|
|
368
|
+
|
|
363
369
|
m_R.setZero();
|
|
364
370
|
m_Q.setZero();
|
|
365
371
|
m_pmat = mat;
|
|
366
|
-
if(!m_isEtreeOk)
|
|
367
|
-
{
|
|
372
|
+
if (!m_isEtreeOk) {
|
|
368
373
|
m_outputPerm_c = m_perm_c.inverse();
|
|
369
374
|
internal::coletree(m_pmat, m_etree, m_firstRowElt, m_outputPerm_c.indices().data());
|
|
370
375
|
m_isEtreeOk = true;
|
|
371
376
|
}
|
|
372
377
|
|
|
373
|
-
m_pmat.uncompress();
|
|
374
|
-
|
|
378
|
+
m_pmat.uncompress(); // To have the innerNonZeroPtr allocated
|
|
379
|
+
|
|
375
380
|
// Apply the fill-in reducing permutation lazily:
|
|
376
381
|
{
|
|
377
382
|
// If the input is row major, copy the original column indices,
|
|
378
383
|
// otherwise directly use the input matrix
|
|
379
|
-
//
|
|
384
|
+
//
|
|
380
385
|
IndexVector originalOuterIndicesCpy;
|
|
381
|
-
const StorageIndex
|
|
382
|
-
if(MatrixType::IsRowMajor)
|
|
383
|
-
|
|
384
|
-
originalOuterIndicesCpy = IndexVector::Map(m_pmat.outerIndexPtr(),n+1);
|
|
386
|
+
const StorageIndex* originalOuterIndices = mat.outerIndexPtr();
|
|
387
|
+
if (MatrixType::IsRowMajor) {
|
|
388
|
+
originalOuterIndicesCpy = IndexVector::Map(m_pmat.outerIndexPtr(), n + 1);
|
|
385
389
|
originalOuterIndices = originalOuterIndicesCpy.data();
|
|
386
390
|
}
|
|
387
|
-
|
|
388
|
-
for (int i = 0; i < n; i++)
|
|
389
|
-
{
|
|
391
|
+
|
|
392
|
+
for (int i = 0; i < n; i++) {
|
|
390
393
|
Index p = m_perm_c.size() ? m_perm_c.indices()(i) : i;
|
|
391
|
-
m_pmat.outerIndexPtr()[p] = originalOuterIndices[i];
|
|
392
|
-
m_pmat.innerNonZeroPtr()[p] = originalOuterIndices[i+1] - originalOuterIndices[i];
|
|
394
|
+
m_pmat.outerIndexPtr()[p] = originalOuterIndices[i];
|
|
395
|
+
m_pmat.innerNonZeroPtr()[p] = originalOuterIndices[i + 1] - originalOuterIndices[i];
|
|
393
396
|
}
|
|
394
397
|
}
|
|
395
|
-
|
|
398
|
+
|
|
396
399
|
/* Compute the default threshold as in MatLab, see:
|
|
397
400
|
* Tim Davis, "Algorithm 915, SuiteSparseQR: Multifrontal Multithreaded Rank-Revealing
|
|
398
|
-
* Sparse QR Factorization, ACM Trans. on Math. Soft. 38(1), 2011, Page 8:3
|
|
401
|
+
* Sparse QR Factorization, ACM Trans. on Math. Soft. 38(1), 2011, Page 8:3
|
|
399
402
|
*/
|
|
400
|
-
|
|
401
|
-
{
|
|
403
|
+
RealScalar pivotThreshold;
|
|
404
|
+
if (m_useDefaultThreshold) {
|
|
402
405
|
RealScalar max2Norm = 0.0;
|
|
403
406
|
for (int j = 0; j < n; j++) max2Norm = numext::maxi(max2Norm, m_pmat.col(j).norm());
|
|
404
|
-
if(max2Norm==RealScalar(0))
|
|
405
|
-
max2Norm = RealScalar(1);
|
|
407
|
+
if (max2Norm == RealScalar(0)) max2Norm = RealScalar(1);
|
|
406
408
|
pivotThreshold = 20 * (m + n) * max2Norm * NumTraits<RealScalar>::epsilon();
|
|
409
|
+
} else {
|
|
410
|
+
pivotThreshold = m_threshold;
|
|
407
411
|
}
|
|
408
|
-
|
|
412
|
+
|
|
409
413
|
// Initialize the numerical permutation
|
|
410
414
|
m_pivotperm.setIdentity(n);
|
|
411
|
-
|
|
412
|
-
StorageIndex nonzeroCol = 0;
|
|
415
|
+
|
|
416
|
+
StorageIndex nonzeroCol = 0; // Record the number of valid pivots
|
|
413
417
|
m_Q.startVec(0);
|
|
414
418
|
|
|
415
419
|
// Left looking rank-revealing QR factorization: compute a column of R and Q at a time
|
|
416
|
-
for (StorageIndex col = 0; col < n; ++col)
|
|
417
|
-
{
|
|
420
|
+
for (StorageIndex col = 0; col < n; ++col) {
|
|
418
421
|
mark.setConstant(-1);
|
|
419
422
|
m_R.startVec(col);
|
|
420
423
|
mark(nonzeroCol) = col;
|
|
421
424
|
Qidx(0) = nonzeroCol;
|
|
422
|
-
nzcolR = 0;
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
425
|
+
nzcolR = 0;
|
|
426
|
+
nzcolQ = 1;
|
|
427
|
+
bool found_diag = nonzeroCol >= m;
|
|
428
|
+
tval.setZero();
|
|
429
|
+
|
|
426
430
|
// Symbolic factorization: find the nonzero locations of the column k of the factors R and Q, i.e.,
|
|
427
|
-
// all the nodes (with indexes lower than rank) reachable through the column elimination tree (etree) rooted at node
|
|
428
|
-
// Note: if the diagonal entry does not exist, then its contribution must be explicitly added,
|
|
429
|
-
//
|
|
430
|
-
for (typename QRMatrixType::InnerIterator itp(m_pmat, col); itp || !found_diag; ++itp)
|
|
431
|
-
{
|
|
431
|
+
// all the nodes (with indexes lower than rank) reachable through the column elimination tree (etree) rooted at node
|
|
432
|
+
// k. Note: if the diagonal entry does not exist, then its contribution must be explicitly added, thus the trick
|
|
433
|
+
// with found_diag that permits to do one more iteration on the diagonal element if this one has not been found.
|
|
434
|
+
for (typename QRMatrixType::InnerIterator itp(m_pmat, col); itp || !found_diag; ++itp) {
|
|
432
435
|
StorageIndex curIdx = nonzeroCol;
|
|
433
|
-
if(itp) curIdx = StorageIndex(itp.row());
|
|
434
|
-
if(curIdx == nonzeroCol) found_diag = true;
|
|
435
|
-
|
|
436
|
+
if (itp) curIdx = StorageIndex(itp.row());
|
|
437
|
+
if (curIdx == nonzeroCol) found_diag = true;
|
|
438
|
+
|
|
436
439
|
// Get the nonzeros indexes of the current column of R
|
|
437
|
-
StorageIndex st = m_firstRowElt(curIdx);
|
|
438
|
-
if (st < 0
|
|
439
|
-
{
|
|
440
|
+
StorageIndex st = m_firstRowElt(curIdx); // The traversal of the etree starts here
|
|
441
|
+
if (st < 0) {
|
|
440
442
|
m_lastError = "Empty row found during numerical factorization";
|
|
441
443
|
m_info = InvalidInput;
|
|
442
444
|
return;
|
|
443
445
|
}
|
|
444
446
|
|
|
445
|
-
// Traverse the etree
|
|
447
|
+
// Traverse the etree
|
|
446
448
|
Index bi = nzcolR;
|
|
447
|
-
for (; mark(st) != col; st = m_etree(st))
|
|
448
|
-
{
|
|
449
|
+
for (; mark(st) != col; st = m_etree(st)) {
|
|
449
450
|
Ridx(nzcolR) = st; // Add this row to the list,
|
|
450
451
|
mark(st) = col; // and mark this row as visited
|
|
451
452
|
nzcolR++;
|
|
452
453
|
}
|
|
453
454
|
|
|
454
455
|
// Reverse the list to get the topological ordering
|
|
455
|
-
Index nt = nzcolR-bi;
|
|
456
|
-
for(Index i = 0; i < nt/2; i++) std::swap(Ridx(bi+i), Ridx(nzcolR-i-1));
|
|
457
|
-
|
|
456
|
+
Index nt = nzcolR - bi;
|
|
457
|
+
for (Index i = 0; i < nt / 2; i++) std::swap(Ridx(bi + i), Ridx(nzcolR - i - 1));
|
|
458
|
+
|
|
458
459
|
// Copy the current (curIdx,pcol) value of the input matrix
|
|
459
|
-
if
|
|
460
|
-
|
|
461
|
-
|
|
460
|
+
if (itp)
|
|
461
|
+
tval(curIdx) = itp.value();
|
|
462
|
+
else
|
|
463
|
+
tval(curIdx) = Scalar(0);
|
|
464
|
+
|
|
462
465
|
// Compute the pattern of Q(:,k)
|
|
463
|
-
if(curIdx > nonzeroCol && mark(curIdx) != col
|
|
464
|
-
{
|
|
466
|
+
if (curIdx > nonzeroCol && mark(curIdx) != col) {
|
|
465
467
|
Qidx(nzcolQ) = curIdx; // Add this row to the pattern of Q,
|
|
466
468
|
mark(curIdx) = col; // and mark it as visited
|
|
467
469
|
nzcolQ++;
|
|
@@ -469,110 +471,89 @@ void SparseQR<MatrixType,OrderingType>::factorize(const MatrixType& mat)
|
|
|
469
471
|
}
|
|
470
472
|
|
|
471
473
|
// Browse all the indexes of R(:,col) in reverse order
|
|
472
|
-
for (Index i = nzcolR-1; i >= 0; i--)
|
|
473
|
-
{
|
|
474
|
+
for (Index i = nzcolR - 1; i >= 0; i--) {
|
|
474
475
|
Index curIdx = Ridx(i);
|
|
475
|
-
|
|
476
|
+
|
|
476
477
|
// Apply the curIdx-th householder vector to the current column (temporarily stored into tval)
|
|
477
478
|
Scalar tdot(0);
|
|
478
|
-
|
|
479
|
+
|
|
479
480
|
// First compute q' * tval
|
|
480
481
|
tdot = m_Q.col(curIdx).dot(tval);
|
|
481
482
|
|
|
482
483
|
tdot *= m_hcoeffs(curIdx);
|
|
483
|
-
|
|
484
|
+
|
|
484
485
|
// Then update tval = tval - q * tau
|
|
485
|
-
|
|
486
|
-
for (typename QRMatrixType::InnerIterator itq(m_Q, curIdx); itq; ++itq)
|
|
487
|
-
tval(itq.row()) -= itq.value() * tdot;
|
|
486
|
+
tval -= tdot * m_Q.col(curIdx);
|
|
488
487
|
|
|
489
488
|
// Detect fill-in for the current column of Q
|
|
490
|
-
if(m_etree(Ridx(i)) == nonzeroCol)
|
|
491
|
-
|
|
492
|
-
for (typename QRMatrixType::InnerIterator itq(m_Q, curIdx); itq; ++itq)
|
|
493
|
-
{
|
|
489
|
+
if (m_etree(Ridx(i)) == nonzeroCol) {
|
|
490
|
+
for (typename QRMatrixType::InnerIterator itq(m_Q, curIdx); itq; ++itq) {
|
|
494
491
|
StorageIndex iQ = StorageIndex(itq.row());
|
|
495
|
-
if (mark(iQ) != col)
|
|
496
|
-
{
|
|
492
|
+
if (mark(iQ) != col) {
|
|
497
493
|
Qidx(nzcolQ++) = iQ; // Add this row to the pattern of Q,
|
|
498
494
|
mark(iQ) = col; // and mark it as visited
|
|
499
495
|
}
|
|
500
496
|
}
|
|
501
497
|
}
|
|
502
|
-
}
|
|
503
|
-
|
|
498
|
+
} // End update current column
|
|
499
|
+
|
|
504
500
|
Scalar tau = RealScalar(0);
|
|
505
501
|
RealScalar beta = 0;
|
|
506
|
-
|
|
507
|
-
if(nonzeroCol < diagSize)
|
|
508
|
-
{
|
|
502
|
+
|
|
503
|
+
if (nonzeroCol < diagSize) {
|
|
509
504
|
// Compute the Householder reflection that eliminate the current column
|
|
510
505
|
// FIXME this step should call the Householder module.
|
|
511
506
|
Scalar c0 = nzcolQ ? tval(Qidx(0)) : Scalar(0);
|
|
512
|
-
|
|
507
|
+
|
|
513
508
|
// First, the squared norm of Q((col+1):m, col)
|
|
514
509
|
RealScalar sqrNorm = 0.;
|
|
515
510
|
for (Index itq = 1; itq < nzcolQ; ++itq) sqrNorm += numext::abs2(tval(Qidx(itq)));
|
|
516
|
-
if(sqrNorm == RealScalar(0) && numext::imag(c0) == RealScalar(0))
|
|
517
|
-
{
|
|
511
|
+
if (sqrNorm == RealScalar(0) && numext::imag(c0) == RealScalar(0)) {
|
|
518
512
|
beta = numext::real(c0);
|
|
519
513
|
tval(Qidx(0)) = 1;
|
|
520
|
-
}
|
|
521
|
-
else
|
|
522
|
-
{
|
|
514
|
+
} else {
|
|
523
515
|
using std::sqrt;
|
|
524
516
|
beta = sqrt(numext::abs2(c0) + sqrNorm);
|
|
525
|
-
if(numext::real(c0) >= RealScalar(0))
|
|
526
|
-
beta = -beta;
|
|
517
|
+
if (numext::real(c0) >= RealScalar(0)) beta = -beta;
|
|
527
518
|
tval(Qidx(0)) = 1;
|
|
528
|
-
for (Index itq = 1; itq < nzcolQ; ++itq)
|
|
529
|
-
|
|
530
|
-
tau = numext::conj((beta-c0) / beta);
|
|
531
|
-
|
|
519
|
+
for (Index itq = 1; itq < nzcolQ; ++itq) tval(Qidx(itq)) /= (c0 - beta);
|
|
520
|
+
tau = numext::conj((beta - c0) / beta);
|
|
532
521
|
}
|
|
533
522
|
}
|
|
534
523
|
|
|
535
524
|
// Insert values in R
|
|
536
|
-
for (Index
|
|
537
|
-
{
|
|
525
|
+
for (Index i = nzcolR - 1; i >= 0; i--) {
|
|
538
526
|
Index curIdx = Ridx(i);
|
|
539
|
-
if(curIdx < nonzeroCol)
|
|
540
|
-
{
|
|
527
|
+
if (curIdx < nonzeroCol) {
|
|
541
528
|
m_R.insertBackByOuterInnerUnordered(col, curIdx) = tval(curIdx);
|
|
542
529
|
tval(curIdx) = Scalar(0.);
|
|
543
530
|
}
|
|
544
531
|
}
|
|
545
532
|
|
|
546
|
-
if(nonzeroCol < diagSize && abs(beta) >= pivotThreshold)
|
|
547
|
-
{
|
|
533
|
+
if (nonzeroCol < diagSize && abs(beta) >= pivotThreshold) {
|
|
548
534
|
m_R.insertBackByOuterInner(col, nonzeroCol) = beta;
|
|
549
535
|
// The householder coefficient
|
|
550
536
|
m_hcoeffs(nonzeroCol) = tau;
|
|
551
537
|
// Record the householder reflections
|
|
552
|
-
for (Index itq = 0; itq < nzcolQ; ++itq)
|
|
553
|
-
{
|
|
538
|
+
for (Index itq = 0; itq < nzcolQ; ++itq) {
|
|
554
539
|
Index iQ = Qidx(itq);
|
|
555
|
-
m_Q.insertBackByOuterInnerUnordered(nonzeroCol,iQ) = tval(iQ);
|
|
540
|
+
m_Q.insertBackByOuterInnerUnordered(nonzeroCol, iQ) = tval(iQ);
|
|
556
541
|
tval(iQ) = Scalar(0.);
|
|
557
542
|
}
|
|
558
543
|
nonzeroCol++;
|
|
559
|
-
if(nonzeroCol<diagSize)
|
|
560
|
-
|
|
561
|
-
}
|
|
562
|
-
else
|
|
563
|
-
{
|
|
544
|
+
if (nonzeroCol < diagSize) m_Q.startVec(nonzeroCol);
|
|
545
|
+
} else {
|
|
564
546
|
// Zero pivot found: move implicitly this column to the end
|
|
565
|
-
for (Index j = nonzeroCol; j < n-1; j++)
|
|
566
|
-
|
|
567
|
-
|
|
547
|
+
for (Index j = nonzeroCol; j < n - 1; j++) std::swap(m_pivotperm.indices()(j), m_pivotperm.indices()[j + 1]);
|
|
548
|
+
|
|
568
549
|
// Recompute the column elimination tree
|
|
569
550
|
internal::coletree(m_pmat, m_etree, m_firstRowElt, m_pivotperm.indices().data());
|
|
570
551
|
m_isEtreeOk = false;
|
|
571
552
|
}
|
|
572
553
|
}
|
|
573
|
-
|
|
574
|
-
m_hcoeffs.tail(diagSize-nonzeroCol).setZero();
|
|
575
|
-
|
|
554
|
+
|
|
555
|
+
m_hcoeffs.tail(diagSize - nonzeroCol).setZero();
|
|
556
|
+
|
|
576
557
|
// Finalize the column pointers of the sparse matrices R and Q
|
|
577
558
|
m_Q.finalize();
|
|
578
559
|
m_Q.makeCompressed();
|
|
@@ -581,165 +562,145 @@ void SparseQR<MatrixType,OrderingType>::factorize(const MatrixType& mat)
|
|
|
581
562
|
m_isQSorted = false;
|
|
582
563
|
|
|
583
564
|
m_nonzeropivots = nonzeroCol;
|
|
584
|
-
|
|
585
|
-
if(nonzeroCol<n)
|
|
586
|
-
{
|
|
565
|
+
|
|
566
|
+
if (nonzeroCol < n) {
|
|
587
567
|
// Permute the triangular factor to put the 'dead' columns to the end
|
|
588
568
|
QRMatrixType tempR(m_R);
|
|
589
569
|
m_R = tempR * m_pivotperm;
|
|
590
|
-
|
|
570
|
+
|
|
591
571
|
// Update the column permutation
|
|
592
572
|
m_outputPerm_c = m_outputPerm_c * m_pivotperm;
|
|
593
573
|
}
|
|
594
|
-
|
|
595
|
-
m_isInitialized = true;
|
|
574
|
+
|
|
575
|
+
m_isInitialized = true;
|
|
596
576
|
m_factorizationIsok = true;
|
|
597
577
|
m_info = Success;
|
|
598
578
|
}
|
|
599
579
|
|
|
600
580
|
template <typename SparseQRType, typename Derived>
|
|
601
|
-
struct SparseQR_QProduct : ReturnByValue<SparseQR_QProduct<SparseQRType, Derived> >
|
|
602
|
-
{
|
|
581
|
+
struct SparseQR_QProduct : ReturnByValue<SparseQR_QProduct<SparseQRType, Derived> > {
|
|
603
582
|
typedef typename SparseQRType::QRMatrixType MatrixType;
|
|
604
583
|
typedef typename SparseQRType::Scalar Scalar;
|
|
605
|
-
// Get the references
|
|
606
|
-
SparseQR_QProduct(const SparseQRType& qr, const Derived& other, bool transpose)
|
|
607
|
-
|
|
584
|
+
// Get the references
|
|
585
|
+
SparseQR_QProduct(const SparseQRType& qr, const Derived& other, bool transpose)
|
|
586
|
+
: m_qr(qr), m_other(other), m_transpose(transpose) {}
|
|
608
587
|
inline Index rows() const { return m_qr.matrixQ().rows(); }
|
|
609
588
|
inline Index cols() const { return m_other.cols(); }
|
|
610
|
-
|
|
589
|
+
|
|
611
590
|
// Assign to a vector
|
|
612
|
-
template<typename DesType>
|
|
613
|
-
void evalTo(DesType& res) const
|
|
614
|
-
{
|
|
591
|
+
template <typename DesType>
|
|
592
|
+
void evalTo(DesType& res) const {
|
|
615
593
|
Index m = m_qr.rows();
|
|
616
594
|
Index n = m_qr.cols();
|
|
617
|
-
Index diagSize = (std::min)(m,n);
|
|
595
|
+
Index diagSize = (std::min)(m, n);
|
|
618
596
|
res = m_other;
|
|
619
|
-
if (m_transpose)
|
|
620
|
-
{
|
|
597
|
+
if (m_transpose) {
|
|
621
598
|
eigen_assert(m_qr.m_Q.rows() == m_other.rows() && "Non conforming object sizes");
|
|
622
|
-
//Compute res = Q' * other column by column
|
|
623
|
-
for(Index j = 0; j < res.cols(); j++){
|
|
624
|
-
for (Index k = 0; k < diagSize; k++)
|
|
625
|
-
{
|
|
599
|
+
// Compute res = Q' * other column by column
|
|
600
|
+
for (Index j = 0; j < res.cols(); j++) {
|
|
601
|
+
for (Index k = 0; k < diagSize; k++) {
|
|
626
602
|
Scalar tau = Scalar(0);
|
|
627
603
|
tau = m_qr.m_Q.col(k).dot(res.col(j));
|
|
628
|
-
if(tau==Scalar(0)) continue;
|
|
604
|
+
if (tau == Scalar(0)) continue;
|
|
629
605
|
tau = tau * m_qr.m_hcoeffs(k);
|
|
630
606
|
res.col(j) -= tau * m_qr.m_Q.col(k);
|
|
631
607
|
}
|
|
632
608
|
}
|
|
633
|
-
}
|
|
634
|
-
else
|
|
635
|
-
{
|
|
609
|
+
} else {
|
|
636
610
|
eigen_assert(m_qr.matrixQ().cols() == m_other.rows() && "Non conforming object sizes");
|
|
637
611
|
|
|
638
612
|
res.conservativeResize(rows(), cols());
|
|
639
613
|
|
|
640
614
|
// Compute res = Q * other column by column
|
|
641
|
-
for(Index j = 0; j < res.cols(); j++)
|
|
642
|
-
|
|
643
|
-
for (Index k =
|
|
644
|
-
{
|
|
615
|
+
for (Index j = 0; j < res.cols(); j++) {
|
|
616
|
+
Index start_k = internal::is_identity<Derived>::value ? numext::mini(j, diagSize - 1) : diagSize - 1;
|
|
617
|
+
for (Index k = start_k; k >= 0; k--) {
|
|
645
618
|
Scalar tau = Scalar(0);
|
|
646
619
|
tau = m_qr.m_Q.col(k).dot(res.col(j));
|
|
647
|
-
if(tau==Scalar(0)) continue;
|
|
620
|
+
if (tau == Scalar(0)) continue;
|
|
648
621
|
tau = tau * numext::conj(m_qr.m_hcoeffs(k));
|
|
649
622
|
res.col(j) -= tau * m_qr.m_Q.col(k);
|
|
650
623
|
}
|
|
651
624
|
}
|
|
652
625
|
}
|
|
653
626
|
}
|
|
654
|
-
|
|
627
|
+
|
|
655
628
|
const SparseQRType& m_qr;
|
|
656
629
|
const Derived& m_other;
|
|
657
|
-
bool m_transpose;
|
|
630
|
+
bool m_transpose; // TODO this actually means adjoint
|
|
658
631
|
};
|
|
659
632
|
|
|
660
|
-
template<typename SparseQRType>
|
|
661
|
-
struct SparseQRMatrixQReturnType : public EigenBase<SparseQRMatrixQReturnType<SparseQRType> >
|
|
662
|
-
{
|
|
633
|
+
template <typename SparseQRType>
|
|
634
|
+
struct SparseQRMatrixQReturnType : public EigenBase<SparseQRMatrixQReturnType<SparseQRType> > {
|
|
663
635
|
typedef typename SparseQRType::Scalar Scalar;
|
|
664
|
-
typedef Matrix<Scalar,Dynamic,Dynamic> DenseMatrix;
|
|
665
|
-
enum {
|
|
666
|
-
RowsAtCompileTime = Dynamic,
|
|
667
|
-
ColsAtCompileTime = Dynamic
|
|
668
|
-
};
|
|
636
|
+
typedef Matrix<Scalar, Dynamic, Dynamic> DenseMatrix;
|
|
637
|
+
enum { RowsAtCompileTime = Dynamic, ColsAtCompileTime = Dynamic };
|
|
669
638
|
explicit SparseQRMatrixQReturnType(const SparseQRType& qr) : m_qr(qr) {}
|
|
670
|
-
template<typename Derived>
|
|
671
|
-
SparseQR_QProduct<SparseQRType, Derived> operator*(const MatrixBase<Derived>& other)
|
|
672
|
-
|
|
673
|
-
return SparseQR_QProduct<SparseQRType,Derived>(m_qr,other.derived(),false);
|
|
639
|
+
template <typename Derived>
|
|
640
|
+
SparseQR_QProduct<SparseQRType, Derived> operator*(const MatrixBase<Derived>& other) {
|
|
641
|
+
return SparseQR_QProduct<SparseQRType, Derived>(m_qr, other.derived(), false);
|
|
674
642
|
}
|
|
675
643
|
// To use for operations with the adjoint of Q
|
|
676
|
-
SparseQRMatrixQTransposeReturnType<SparseQRType> adjoint() const
|
|
677
|
-
{
|
|
644
|
+
SparseQRMatrixQTransposeReturnType<SparseQRType> adjoint() const {
|
|
678
645
|
return SparseQRMatrixQTransposeReturnType<SparseQRType>(m_qr);
|
|
679
646
|
}
|
|
680
647
|
inline Index rows() const { return m_qr.rows(); }
|
|
681
648
|
inline Index cols() const { return m_qr.rows(); }
|
|
682
649
|
// To use for operations with the transpose of Q FIXME this is the same as adjoint at the moment
|
|
683
|
-
SparseQRMatrixQTransposeReturnType<SparseQRType> transpose() const
|
|
684
|
-
{
|
|
650
|
+
SparseQRMatrixQTransposeReturnType<SparseQRType> transpose() const {
|
|
685
651
|
return SparseQRMatrixQTransposeReturnType<SparseQRType>(m_qr);
|
|
686
652
|
}
|
|
687
653
|
const SparseQRType& m_qr;
|
|
688
654
|
};
|
|
689
655
|
|
|
690
656
|
// TODO this actually represents the adjoint of Q
|
|
691
|
-
template<typename SparseQRType>
|
|
692
|
-
struct SparseQRMatrixQTransposeReturnType
|
|
693
|
-
{
|
|
657
|
+
template <typename SparseQRType>
|
|
658
|
+
struct SparseQRMatrixQTransposeReturnType {
|
|
694
659
|
explicit SparseQRMatrixQTransposeReturnType(const SparseQRType& qr) : m_qr(qr) {}
|
|
695
|
-
template<typename Derived>
|
|
696
|
-
SparseQR_QProduct<SparseQRType,Derived> operator*(const MatrixBase<Derived>& other)
|
|
697
|
-
|
|
698
|
-
return SparseQR_QProduct<SparseQRType,Derived>(m_qr,other.derived(), true);
|
|
660
|
+
template <typename Derived>
|
|
661
|
+
SparseQR_QProduct<SparseQRType, Derived> operator*(const MatrixBase<Derived>& other) {
|
|
662
|
+
return SparseQR_QProduct<SparseQRType, Derived>(m_qr, other.derived(), true);
|
|
699
663
|
}
|
|
700
664
|
const SparseQRType& m_qr;
|
|
701
665
|
};
|
|
702
666
|
|
|
703
667
|
namespace internal {
|
|
704
|
-
|
|
705
|
-
template<typename SparseQRType>
|
|
706
|
-
struct evaluator_traits<SparseQRMatrixQReturnType<SparseQRType> >
|
|
707
|
-
{
|
|
668
|
+
|
|
669
|
+
template <typename SparseQRType>
|
|
670
|
+
struct evaluator_traits<SparseQRMatrixQReturnType<SparseQRType> > {
|
|
708
671
|
typedef typename SparseQRType::MatrixType MatrixType;
|
|
709
672
|
typedef typename storage_kind_to_evaluator_kind<typename MatrixType::StorageKind>::Kind Kind;
|
|
710
673
|
typedef SparseShape Shape;
|
|
711
674
|
};
|
|
712
675
|
|
|
713
|
-
template<
|
|
714
|
-
struct Assignment<DstXprType, SparseQRMatrixQReturnType<SparseQRType>,
|
|
715
|
-
{
|
|
676
|
+
template <typename DstXprType, typename SparseQRType>
|
|
677
|
+
struct Assignment<DstXprType, SparseQRMatrixQReturnType<SparseQRType>,
|
|
678
|
+
internal::assign_op<typename DstXprType::Scalar, typename DstXprType::Scalar>, Sparse2Sparse> {
|
|
716
679
|
typedef SparseQRMatrixQReturnType<SparseQRType> SrcXprType;
|
|
717
680
|
typedef typename DstXprType::Scalar Scalar;
|
|
718
681
|
typedef typename DstXprType::StorageIndex StorageIndex;
|
|
719
|
-
static void run(DstXprType
|
|
720
|
-
{
|
|
682
|
+
static void run(DstXprType& dst, const SrcXprType& src, const internal::assign_op<Scalar, Scalar>& /*func*/) {
|
|
721
683
|
typename DstXprType::PlainObject idMat(src.rows(), src.cols());
|
|
722
684
|
idMat.setIdentity();
|
|
723
685
|
// Sort the sparse householder reflectors if needed
|
|
724
|
-
const_cast<SparseQRType
|
|
686
|
+
const_cast<SparseQRType*>(&src.m_qr)->_sort_matrix_Q();
|
|
725
687
|
dst = SparseQR_QProduct<SparseQRType, DstXprType>(src.m_qr, idMat, false);
|
|
726
688
|
}
|
|
727
689
|
};
|
|
728
690
|
|
|
729
|
-
template<
|
|
730
|
-
struct Assignment<DstXprType, SparseQRMatrixQReturnType<SparseQRType>,
|
|
731
|
-
{
|
|
691
|
+
template <typename DstXprType, typename SparseQRType>
|
|
692
|
+
struct Assignment<DstXprType, SparseQRMatrixQReturnType<SparseQRType>,
|
|
693
|
+
internal::assign_op<typename DstXprType::Scalar, typename DstXprType::Scalar>, Sparse2Dense> {
|
|
732
694
|
typedef SparseQRMatrixQReturnType<SparseQRType> SrcXprType;
|
|
733
695
|
typedef typename DstXprType::Scalar Scalar;
|
|
734
696
|
typedef typename DstXprType::StorageIndex StorageIndex;
|
|
735
|
-
static void run(DstXprType
|
|
736
|
-
{
|
|
697
|
+
static void run(DstXprType& dst, const SrcXprType& src, const internal::assign_op<Scalar, Scalar>& /*func*/) {
|
|
737
698
|
dst = src.m_qr.matrixQ() * DstXprType::Identity(src.m_qr.rows(), src.m_qr.rows());
|
|
738
699
|
}
|
|
739
700
|
};
|
|
740
701
|
|
|
741
|
-
}
|
|
702
|
+
} // end namespace internal
|
|
742
703
|
|
|
743
|
-
}
|
|
704
|
+
} // end namespace Eigen
|
|
744
705
|
|
|
745
706
|
#endif
|