@smake/eigen 1.1.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/eigen/Eigen/AccelerateSupport +52 -0
- package/eigen/Eigen/Cholesky +18 -20
- package/eigen/Eigen/CholmodSupport +28 -28
- package/eigen/Eigen/Core +187 -120
- package/eigen/Eigen/Eigenvalues +16 -13
- package/eigen/Eigen/Geometry +18 -18
- package/eigen/Eigen/Householder +9 -7
- package/eigen/Eigen/IterativeLinearSolvers +8 -4
- package/eigen/Eigen/Jacobi +14 -13
- package/eigen/Eigen/KLUSupport +23 -21
- package/eigen/Eigen/LU +15 -16
- package/eigen/Eigen/MetisSupport +12 -12
- package/eigen/Eigen/OrderingMethods +54 -51
- package/eigen/Eigen/PaStiXSupport +23 -21
- package/eigen/Eigen/PardisoSupport +17 -14
- package/eigen/Eigen/QR +18 -20
- package/eigen/Eigen/QtAlignedMalloc +5 -12
- package/eigen/Eigen/SPQRSupport +21 -14
- package/eigen/Eigen/SVD +23 -17
- package/eigen/Eigen/Sparse +1 -2
- package/eigen/Eigen/SparseCholesky +18 -15
- package/eigen/Eigen/SparseCore +18 -17
- package/eigen/Eigen/SparseLU +9 -9
- package/eigen/Eigen/SparseQR +16 -14
- package/eigen/Eigen/StdDeque +5 -2
- package/eigen/Eigen/StdList +5 -2
- package/eigen/Eigen/StdVector +5 -2
- package/eigen/Eigen/SuperLUSupport +30 -24
- package/eigen/Eigen/ThreadPool +80 -0
- package/eigen/Eigen/UmfPackSupport +19 -17
- package/eigen/Eigen/Version +14 -0
- package/eigen/Eigen/src/AccelerateSupport/AccelerateSupport.h +423 -0
- package/eigen/Eigen/src/AccelerateSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Cholesky/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Cholesky/LDLT.h +366 -405
- package/eigen/Eigen/src/Cholesky/LLT.h +323 -367
- package/eigen/Eigen/src/Cholesky/LLT_LAPACKE.h +81 -56
- package/eigen/Eigen/src/CholmodSupport/CholmodSupport.h +585 -529
- package/eigen/Eigen/src/CholmodSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Core/ArithmeticSequence.h +143 -317
- package/eigen/Eigen/src/Core/Array.h +329 -370
- package/eigen/Eigen/src/Core/ArrayBase.h +190 -203
- package/eigen/Eigen/src/Core/ArrayWrapper.h +126 -170
- package/eigen/Eigen/src/Core/Assign.h +30 -40
- package/eigen/Eigen/src/Core/AssignEvaluator.h +651 -604
- package/eigen/Eigen/src/Core/Assign_MKL.h +125 -120
- package/eigen/Eigen/src/Core/BandMatrix.h +267 -282
- package/eigen/Eigen/src/Core/Block.h +371 -390
- package/eigen/Eigen/src/Core/CommaInitializer.h +85 -100
- package/eigen/Eigen/src/Core/ConditionEstimator.h +51 -53
- package/eigen/Eigen/src/Core/CoreEvaluators.h +1214 -937
- package/eigen/Eigen/src/Core/CoreIterators.h +72 -63
- package/eigen/Eigen/src/Core/CwiseBinaryOp.h +112 -129
- package/eigen/Eigen/src/Core/CwiseNullaryOp.h +676 -702
- package/eigen/Eigen/src/Core/CwiseTernaryOp.h +77 -103
- package/eigen/Eigen/src/Core/CwiseUnaryOp.h +55 -67
- package/eigen/Eigen/src/Core/CwiseUnaryView.h +127 -92
- package/eigen/Eigen/src/Core/DenseBase.h +630 -658
- package/eigen/Eigen/src/Core/DenseCoeffsBase.h +511 -628
- package/eigen/Eigen/src/Core/DenseStorage.h +511 -590
- package/eigen/Eigen/src/Core/DeviceWrapper.h +153 -0
- package/eigen/Eigen/src/Core/Diagonal.h +168 -207
- package/eigen/Eigen/src/Core/DiagonalMatrix.h +346 -317
- package/eigen/Eigen/src/Core/DiagonalProduct.h +12 -10
- package/eigen/Eigen/src/Core/Dot.h +167 -217
- package/eigen/Eigen/src/Core/EigenBase.h +74 -85
- package/eigen/Eigen/src/Core/Fill.h +138 -0
- package/eigen/Eigen/src/Core/FindCoeff.h +464 -0
- package/eigen/Eigen/src/Core/ForceAlignedAccess.h +90 -113
- package/eigen/Eigen/src/Core/Fuzzy.h +82 -105
- package/eigen/Eigen/src/Core/GeneralProduct.h +315 -261
- package/eigen/Eigen/src/Core/GenericPacketMath.h +1182 -520
- package/eigen/Eigen/src/Core/GlobalFunctions.h +193 -157
- package/eigen/Eigen/src/Core/IO.h +131 -156
- package/eigen/Eigen/src/Core/IndexedView.h +209 -125
- package/eigen/Eigen/src/Core/InnerProduct.h +260 -0
- package/eigen/Eigen/src/Core/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Core/Inverse.h +50 -59
- package/eigen/Eigen/src/Core/Map.h +123 -141
- package/eigen/Eigen/src/Core/MapBase.h +255 -282
- package/eigen/Eigen/src/Core/MathFunctions.h +1247 -1201
- package/eigen/Eigen/src/Core/MathFunctionsImpl.h +162 -99
- package/eigen/Eigen/src/Core/Matrix.h +463 -494
- package/eigen/Eigen/src/Core/MatrixBase.h +468 -470
- package/eigen/Eigen/src/Core/NestByValue.h +58 -52
- package/eigen/Eigen/src/Core/NoAlias.h +79 -86
- package/eigen/Eigen/src/Core/NumTraits.h +206 -206
- package/eigen/Eigen/src/Core/PartialReduxEvaluator.h +163 -142
- package/eigen/Eigen/src/Core/PermutationMatrix.h +461 -511
- package/eigen/Eigen/src/Core/PlainObjectBase.h +858 -972
- package/eigen/Eigen/src/Core/Product.h +246 -130
- package/eigen/Eigen/src/Core/ProductEvaluators.h +779 -671
- package/eigen/Eigen/src/Core/Random.h +153 -164
- package/eigen/Eigen/src/Core/RandomImpl.h +262 -0
- package/eigen/Eigen/src/Core/RealView.h +250 -0
- package/eigen/Eigen/src/Core/Redux.h +334 -314
- package/eigen/Eigen/src/Core/Ref.h +259 -257
- package/eigen/Eigen/src/Core/Replicate.h +92 -104
- package/eigen/Eigen/src/Core/Reshaped.h +215 -271
- package/eigen/Eigen/src/Core/ReturnByValue.h +47 -55
- package/eigen/Eigen/src/Core/Reverse.h +133 -148
- package/eigen/Eigen/src/Core/Select.h +68 -140
- package/eigen/Eigen/src/Core/SelfAdjointView.h +254 -290
- package/eigen/Eigen/src/Core/SelfCwiseBinaryOp.h +23 -20
- package/eigen/Eigen/src/Core/SkewSymmetricMatrix3.h +382 -0
- package/eigen/Eigen/src/Core/Solve.h +88 -102
- package/eigen/Eigen/src/Core/SolveTriangular.h +126 -124
- package/eigen/Eigen/src/Core/SolverBase.h +132 -133
- package/eigen/Eigen/src/Core/StableNorm.h +113 -147
- package/eigen/Eigen/src/Core/StlIterators.h +404 -248
- package/eigen/Eigen/src/Core/Stride.h +90 -92
- package/eigen/Eigen/src/Core/Swap.h +70 -39
- package/eigen/Eigen/src/Core/Transpose.h +258 -295
- package/eigen/Eigen/src/Core/Transpositions.h +270 -333
- package/eigen/Eigen/src/Core/TriangularMatrix.h +642 -743
- package/eigen/Eigen/src/Core/VectorBlock.h +59 -72
- package/eigen/Eigen/src/Core/VectorwiseOp.h +653 -704
- package/eigen/Eigen/src/Core/Visitor.h +464 -308
- package/eigen/Eigen/src/Core/arch/AVX/Complex.h +380 -187
- package/eigen/Eigen/src/Core/arch/AVX/MathFunctions.h +65 -163
- package/eigen/Eigen/src/Core/arch/AVX/PacketMath.h +2145 -638
- package/eigen/Eigen/src/Core/arch/AVX/Reductions.h +353 -0
- package/eigen/Eigen/src/Core/arch/AVX/TypeCasting.h +253 -60
- package/eigen/Eigen/src/Core/arch/AVX512/Complex.h +278 -228
- package/eigen/Eigen/src/Core/arch/AVX512/GemmKernel.h +1245 -0
- package/eigen/Eigen/src/Core/arch/AVX512/MathFunctions.h +48 -269
- package/eigen/Eigen/src/Core/arch/AVX512/MathFunctionsFP16.h +75 -0
- package/eigen/Eigen/src/Core/arch/AVX512/PacketMath.h +1597 -754
- package/eigen/Eigen/src/Core/arch/AVX512/PacketMathFP16.h +1413 -0
- package/eigen/Eigen/src/Core/arch/AVX512/Reductions.h +297 -0
- package/eigen/Eigen/src/Core/arch/AVX512/TrsmKernel.h +1167 -0
- package/eigen/Eigen/src/Core/arch/AVX512/TrsmUnrolls.inc +1219 -0
- package/eigen/Eigen/src/Core/arch/AVX512/TypeCasting.h +229 -41
- package/eigen/Eigen/src/Core/arch/AVX512/TypeCastingFP16.h +130 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/Complex.h +420 -184
- package/eigen/Eigen/src/Core/arch/AltiVec/MathFunctions.h +40 -49
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProduct.h +2962 -2213
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h +196 -212
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductMMA.h +713 -441
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductMMAbfloat16.h +742 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixVectorProduct.inc +2818 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/PacketMath.h +2380 -1362
- package/eigen/Eigen/src/Core/arch/AltiVec/TypeCasting.h +153 -0
- package/eigen/Eigen/src/Core/arch/Default/BFloat16.h +390 -224
- package/eigen/Eigen/src/Core/arch/Default/ConjHelper.h +78 -67
- package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h +1784 -799
- package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h +167 -50
- package/eigen/Eigen/src/Core/arch/Default/Half.h +528 -379
- package/eigen/Eigen/src/Core/arch/Default/Settings.h +10 -12
- package/eigen/Eigen/src/Core/arch/GPU/Complex.h +244 -0
- package/eigen/Eigen/src/Core/arch/GPU/MathFunctions.h +41 -40
- package/eigen/Eigen/src/Core/arch/GPU/PacketMath.h +550 -523
- package/eigen/Eigen/src/Core/arch/GPU/Tuple.h +268 -0
- package/eigen/Eigen/src/Core/arch/GPU/TypeCasting.h +27 -30
- package/eigen/Eigen/src/Core/arch/HIP/hcc/math_constants.h +8 -8
- package/eigen/Eigen/src/Core/arch/HVX/PacketMath.h +1088 -0
- package/eigen/Eigen/src/Core/arch/LSX/Complex.h +520 -0
- package/eigen/Eigen/src/Core/arch/LSX/GeneralBlockPanelKernel.h +23 -0
- package/eigen/Eigen/src/Core/arch/LSX/MathFunctions.h +43 -0
- package/eigen/Eigen/src/Core/arch/LSX/PacketMath.h +2866 -0
- package/eigen/Eigen/src/Core/arch/LSX/TypeCasting.h +526 -0
- package/eigen/Eigen/src/Core/arch/MSA/Complex.h +54 -82
- package/eigen/Eigen/src/Core/arch/MSA/MathFunctions.h +84 -92
- package/eigen/Eigen/src/Core/arch/MSA/PacketMath.h +51 -47
- package/eigen/Eigen/src/Core/arch/NEON/Complex.h +454 -306
- package/eigen/Eigen/src/Core/arch/NEON/GeneralBlockPanelKernel.h +175 -115
- package/eigen/Eigen/src/Core/arch/NEON/MathFunctions.h +23 -30
- package/eigen/Eigen/src/Core/arch/NEON/PacketMath.h +4366 -2857
- package/eigen/Eigen/src/Core/arch/NEON/TypeCasting.h +616 -393
- package/eigen/Eigen/src/Core/arch/NEON/UnaryFunctors.h +57 -0
- package/eigen/Eigen/src/Core/arch/SSE/Complex.h +350 -198
- package/eigen/Eigen/src/Core/arch/SSE/MathFunctions.h +38 -149
- package/eigen/Eigen/src/Core/arch/SSE/PacketMath.h +1791 -912
- package/eigen/Eigen/src/Core/arch/SSE/Reductions.h +324 -0
- package/eigen/Eigen/src/Core/arch/SSE/TypeCasting.h +128 -40
- package/eigen/Eigen/src/Core/arch/SVE/MathFunctions.h +10 -6
- package/eigen/Eigen/src/Core/arch/SVE/PacketMath.h +156 -234
- package/eigen/Eigen/src/Core/arch/SVE/TypeCasting.h +6 -3
- package/eigen/Eigen/src/Core/arch/SYCL/InteropHeaders.h +27 -32
- package/eigen/Eigen/src/Core/arch/SYCL/MathFunctions.h +119 -117
- package/eigen/Eigen/src/Core/arch/SYCL/PacketMath.h +325 -419
- package/eigen/Eigen/src/Core/arch/SYCL/TypeCasting.h +15 -17
- package/eigen/Eigen/src/Core/arch/ZVector/Complex.h +325 -181
- package/eigen/Eigen/src/Core/arch/ZVector/MathFunctions.h +94 -83
- package/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h +811 -458
- package/eigen/Eigen/src/Core/functors/AssignmentFunctors.h +121 -124
- package/eigen/Eigen/src/Core/functors/BinaryFunctors.h +576 -370
- package/eigen/Eigen/src/Core/functors/NullaryFunctors.h +194 -109
- package/eigen/Eigen/src/Core/functors/StlFunctors.h +95 -112
- package/eigen/Eigen/src/Core/functors/TernaryFunctors.h +34 -7
- package/eigen/Eigen/src/Core/functors/UnaryFunctors.h +1038 -749
- package/eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h +1883 -1375
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix.h +312 -370
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +189 -176
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h +84 -81
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix_BLAS.h +154 -73
- package/eigen/Eigen/src/Core/products/GeneralMatrixVector.h +292 -337
- package/eigen/Eigen/src/Core/products/GeneralMatrixVector_BLAS.h +80 -77
- package/eigen/Eigen/src/Core/products/Parallelizer.h +207 -105
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +327 -388
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix_BLAS.h +206 -224
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixVector.h +138 -147
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixVector_BLAS.h +58 -61
- package/eigen/Eigen/src/Core/products/SelfadjointProduct.h +71 -71
- package/eigen/Eigen/src/Core/products/SelfadjointRank2Update.h +48 -47
- package/eigen/Eigen/src/Core/products/TriangularMatrixMatrix.h +294 -369
- package/eigen/Eigen/src/Core/products/TriangularMatrixMatrix_BLAS.h +246 -238
- package/eigen/Eigen/src/Core/products/TriangularMatrixVector.h +244 -247
- package/eigen/Eigen/src/Core/products/TriangularMatrixVector_BLAS.h +212 -192
- package/eigen/Eigen/src/Core/products/TriangularSolverMatrix.h +328 -277
- package/eigen/Eigen/src/Core/products/TriangularSolverMatrix_BLAS.h +108 -109
- package/eigen/Eigen/src/Core/products/TriangularSolverVector.h +68 -94
- package/eigen/Eigen/src/Core/util/Assert.h +158 -0
- package/eigen/Eigen/src/Core/util/BlasUtil.h +342 -303
- package/eigen/Eigen/src/Core/util/ConfigureVectorization.h +348 -317
- package/eigen/Eigen/src/Core/util/Constants.h +297 -262
- package/eigen/Eigen/src/Core/util/DisableStupidWarnings.h +130 -90
- package/eigen/Eigen/src/Core/util/EmulateArray.h +270 -0
- package/eigen/Eigen/src/Core/util/ForwardDeclarations.h +449 -247
- package/eigen/Eigen/src/Core/util/GpuHipCudaDefines.inc +101 -0
- package/eigen/Eigen/src/Core/util/GpuHipCudaUndefines.inc +45 -0
- package/eigen/Eigen/src/Core/util/IndexedViewHelper.h +417 -116
- package/eigen/Eigen/src/Core/util/IntegralConstant.h +211 -204
- package/eigen/Eigen/src/Core/util/MKL_support.h +39 -37
- package/eigen/Eigen/src/Core/util/Macros.h +655 -773
- package/eigen/Eigen/src/Core/util/MaxSizeVector.h +139 -0
- package/eigen/Eigen/src/Core/util/Memory.h +970 -748
- package/eigen/Eigen/src/Core/util/Meta.h +581 -633
- package/eigen/Eigen/src/Core/util/MoreMeta.h +638 -0
- package/eigen/Eigen/src/Core/util/ReenableStupidWarnings.h +32 -19
- package/eigen/Eigen/src/Core/util/ReshapedHelper.h +17 -17
- package/eigen/Eigen/src/Core/util/Serializer.h +209 -0
- package/eigen/Eigen/src/Core/util/StaticAssert.h +50 -166
- package/eigen/Eigen/src/Core/util/SymbolicIndex.h +377 -225
- package/eigen/Eigen/src/Core/util/XprHelper.h +784 -547
- package/eigen/Eigen/src/Eigenvalues/ComplexEigenSolver.h +246 -277
- package/eigen/Eigen/src/Eigenvalues/ComplexSchur.h +299 -319
- package/eigen/Eigen/src/Eigenvalues/ComplexSchur_LAPACKE.h +52 -48
- package/eigen/Eigen/src/Eigenvalues/EigenSolver.h +413 -456
- package/eigen/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h +309 -325
- package/eigen/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h +157 -171
- package/eigen/Eigen/src/Eigenvalues/HessenbergDecomposition.h +292 -310
- package/eigen/Eigen/src/Eigenvalues/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h +89 -105
- package/eigen/Eigen/src/Eigenvalues/RealQZ.h +537 -607
- package/eigen/Eigen/src/Eigenvalues/RealSchur.h +342 -381
- package/eigen/Eigen/src/Eigenvalues/RealSchur_LAPACKE.h +41 -35
- package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +541 -595
- package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_LAPACKE.h +47 -44
- package/eigen/Eigen/src/Eigenvalues/Tridiagonalization.h +430 -462
- package/eigen/Eigen/src/Geometry/AlignedBox.h +226 -227
- package/eigen/Eigen/src/Geometry/AngleAxis.h +131 -133
- package/eigen/Eigen/src/Geometry/EulerAngles.h +163 -74
- package/eigen/Eigen/src/Geometry/Homogeneous.h +285 -333
- package/eigen/Eigen/src/Geometry/Hyperplane.h +151 -160
- package/eigen/Eigen/src/Geometry/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Geometry/OrthoMethods.h +168 -146
- package/eigen/Eigen/src/Geometry/ParametrizedLine.h +127 -127
- package/eigen/Eigen/src/Geometry/Quaternion.h +566 -506
- package/eigen/Eigen/src/Geometry/Rotation2D.h +107 -105
- package/eigen/Eigen/src/Geometry/RotationBase.h +148 -145
- package/eigen/Eigen/src/Geometry/Scaling.h +113 -106
- package/eigen/Eigen/src/Geometry/Transform.h +858 -936
- package/eigen/Eigen/src/Geometry/Translation.h +94 -92
- package/eigen/Eigen/src/Geometry/Umeyama.h +79 -84
- package/eigen/Eigen/src/Geometry/arch/Geometry_SIMD.h +90 -104
- package/eigen/Eigen/src/Householder/BlockHouseholder.h +51 -46
- package/eigen/Eigen/src/Householder/Householder.h +102 -124
- package/eigen/Eigen/src/Householder/HouseholderSequence.h +412 -453
- package/eigen/Eigen/src/Householder/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +149 -162
- package/eigen/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +124 -119
- package/eigen/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +92 -104
- package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h +251 -243
- package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h +224 -228
- package/eigen/Eigen/src/IterativeLinearSolvers/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +178 -227
- package/eigen/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h +79 -84
- package/eigen/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h +54 -60
- package/eigen/Eigen/src/Jacobi/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Jacobi/Jacobi.h +252 -308
- package/eigen/Eigen/src/KLUSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/KLUSupport/KLUSupport.h +208 -227
- package/eigen/Eigen/src/LU/Determinant.h +50 -69
- package/eigen/Eigen/src/LU/FullPivLU.h +545 -596
- package/eigen/Eigen/src/LU/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/LU/InverseImpl.h +206 -285
- package/eigen/Eigen/src/LU/PartialPivLU.h +390 -428
- package/eigen/Eigen/src/LU/PartialPivLU_LAPACKE.h +54 -40
- package/eigen/Eigen/src/LU/arch/InverseSize4.h +72 -70
- package/eigen/Eigen/src/MetisSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/MetisSupport/MetisSupport.h +81 -93
- package/eigen/Eigen/src/OrderingMethods/Amd.h +243 -265
- package/eigen/Eigen/src/OrderingMethods/Eigen_Colamd.h +831 -1004
- package/eigen/Eigen/src/OrderingMethods/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/OrderingMethods/Ordering.h +112 -119
- package/eigen/Eigen/src/PaStiXSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/PaStiXSupport/PaStiXSupport.h +524 -570
- package/eigen/Eigen/src/PardisoSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/PardisoSupport/PardisoSupport.h +385 -430
- package/eigen/Eigen/src/QR/ColPivHouseholderQR.h +479 -479
- package/eigen/Eigen/src/QR/ColPivHouseholderQR_LAPACKE.h +120 -56
- package/eigen/Eigen/src/QR/CompleteOrthogonalDecomposition.h +166 -153
- package/eigen/Eigen/src/QR/FullPivHouseholderQR.h +495 -475
- package/eigen/Eigen/src/QR/HouseholderQR.h +394 -285
- package/eigen/Eigen/src/QR/HouseholderQR_LAPACKE.h +32 -23
- package/eigen/Eigen/src/QR/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SPQRSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h +244 -264
- package/eigen/Eigen/src/SVD/BDCSVD.h +817 -713
- package/eigen/Eigen/src/SVD/BDCSVD_LAPACKE.h +174 -0
- package/eigen/Eigen/src/SVD/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SVD/JacobiSVD.h +577 -543
- package/eigen/Eigen/src/SVD/JacobiSVD_LAPACKE.h +85 -49
- package/eigen/Eigen/src/SVD/SVDBase.h +242 -182
- package/eigen/Eigen/src/SVD/UpperBidiagonalization.h +200 -235
- package/eigen/Eigen/src/SparseCholesky/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky.h +765 -594
- package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h +308 -94
- package/eigen/Eigen/src/SparseCore/AmbiVector.h +202 -251
- package/eigen/Eigen/src/SparseCore/CompressedStorage.h +184 -252
- package/eigen/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h +134 -178
- package/eigen/Eigen/src/SparseCore/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SparseCore/SparseAssign.h +149 -140
- package/eigen/Eigen/src/SparseCore/SparseBlock.h +403 -440
- package/eigen/Eigen/src/SparseCore/SparseColEtree.h +100 -112
- package/eigen/Eigen/src/SparseCore/SparseCompressedBase.h +525 -303
- package/eigen/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +555 -339
- package/eigen/Eigen/src/SparseCore/SparseCwiseUnaryOp.h +100 -108
- package/eigen/Eigen/src/SparseCore/SparseDenseProduct.h +169 -197
- package/eigen/Eigen/src/SparseCore/SparseDiagonalProduct.h +71 -71
- package/eigen/Eigen/src/SparseCore/SparseDot.h +49 -47
- package/eigen/Eigen/src/SparseCore/SparseFuzzy.h +13 -11
- package/eigen/Eigen/src/SparseCore/SparseMap.h +243 -253
- package/eigen/Eigen/src/SparseCore/SparseMatrix.h +1603 -1245
- package/eigen/Eigen/src/SparseCore/SparseMatrixBase.h +403 -350
- package/eigen/Eigen/src/SparseCore/SparsePermutation.h +186 -115
- package/eigen/Eigen/src/SparseCore/SparseProduct.h +94 -97
- package/eigen/Eigen/src/SparseCore/SparseRedux.h +22 -24
- package/eigen/Eigen/src/SparseCore/SparseRef.h +268 -295
- package/eigen/Eigen/src/SparseCore/SparseSelfAdjointView.h +370 -416
- package/eigen/Eigen/src/SparseCore/SparseSolverBase.h +78 -87
- package/eigen/Eigen/src/SparseCore/SparseSparseProductWithPruning.h +81 -95
- package/eigen/Eigen/src/SparseCore/SparseTranspose.h +62 -71
- package/eigen/Eigen/src/SparseCore/SparseTriangularView.h +132 -144
- package/eigen/Eigen/src/SparseCore/SparseUtil.h +138 -115
- package/eigen/Eigen/src/SparseCore/SparseVector.h +426 -372
- package/eigen/Eigen/src/SparseCore/SparseView.h +164 -193
- package/eigen/Eigen/src/SparseCore/TriangularSolver.h +129 -170
- package/eigen/Eigen/src/SparseLU/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SparseLU/SparseLU.h +756 -710
- package/eigen/Eigen/src/SparseLU/SparseLUImpl.h +61 -48
- package/eigen/Eigen/src/SparseLU/SparseLU_Memory.h +102 -118
- package/eigen/Eigen/src/SparseLU/SparseLU_Structs.h +38 -35
- package/eigen/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h +245 -301
- package/eigen/Eigen/src/SparseLU/SparseLU_Utils.h +44 -49
- package/eigen/Eigen/src/SparseLU/SparseLU_column_bmod.h +104 -108
- package/eigen/Eigen/src/SparseLU/SparseLU_column_dfs.h +89 -100
- package/eigen/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h +57 -58
- package/eigen/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h +43 -55
- package/eigen/Eigen/src/SparseLU/SparseLU_kernel_bmod.h +74 -71
- package/eigen/Eigen/src/SparseLU/SparseLU_panel_bmod.h +124 -132
- package/eigen/Eigen/src/SparseLU/SparseLU_panel_dfs.h +136 -159
- package/eigen/Eigen/src/SparseLU/SparseLU_pivotL.h +51 -52
- package/eigen/Eigen/src/SparseLU/SparseLU_pruneL.h +67 -73
- package/eigen/Eigen/src/SparseLU/SparseLU_relax_snode.h +24 -26
- package/eigen/Eigen/src/SparseQR/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SparseQR/SparseQR.h +450 -502
- package/eigen/Eigen/src/StlSupport/StdDeque.h +28 -93
- package/eigen/Eigen/src/StlSupport/StdList.h +28 -84
- package/eigen/Eigen/src/StlSupport/StdVector.h +28 -108
- package/eigen/Eigen/src/StlSupport/details.h +48 -50
- package/eigen/Eigen/src/SuperLUSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SuperLUSupport/SuperLUSupport.h +634 -730
- package/eigen/Eigen/src/ThreadPool/Barrier.h +70 -0
- package/eigen/Eigen/src/ThreadPool/CoreThreadPoolDevice.h +336 -0
- package/eigen/Eigen/src/ThreadPool/EventCount.h +241 -0
- package/eigen/Eigen/src/ThreadPool/ForkJoin.h +140 -0
- package/eigen/Eigen/src/ThreadPool/InternalHeaderCheck.h +4 -0
- package/eigen/Eigen/src/ThreadPool/NonBlockingThreadPool.h +587 -0
- package/eigen/Eigen/src/ThreadPool/RunQueue.h +230 -0
- package/eigen/Eigen/src/ThreadPool/ThreadCancel.h +21 -0
- package/eigen/Eigen/src/ThreadPool/ThreadEnvironment.h +43 -0
- package/eigen/Eigen/src/ThreadPool/ThreadLocal.h +289 -0
- package/eigen/Eigen/src/ThreadPool/ThreadPoolInterface.h +50 -0
- package/eigen/Eigen/src/ThreadPool/ThreadYield.h +16 -0
- package/eigen/Eigen/src/UmfPackSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/UmfPackSupport/UmfPackSupport.h +428 -464
- package/eigen/Eigen/src/misc/Image.h +41 -43
- package/eigen/Eigen/src/misc/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/misc/Kernel.h +39 -41
- package/eigen/Eigen/src/misc/RealSvd2x2.h +19 -21
- package/eigen/Eigen/src/misc/blas.h +83 -426
- package/eigen/Eigen/src/misc/lapacke.h +9972 -16179
- package/eigen/Eigen/src/misc/lapacke_helpers.h +163 -0
- package/eigen/Eigen/src/misc/lapacke_mangling.h +4 -5
- package/eigen/Eigen/src/plugins/ArrayCwiseBinaryOps.inc +344 -0
- package/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.inc +544 -0
- package/eigen/Eigen/src/plugins/{BlockMethods.h → BlockMethods.inc} +434 -506
- package/eigen/Eigen/src/plugins/CommonCwiseBinaryOps.inc +116 -0
- package/eigen/Eigen/src/plugins/{CommonCwiseUnaryOps.h → CommonCwiseUnaryOps.inc} +58 -68
- package/eigen/Eigen/src/plugins/IndexedViewMethods.inc +192 -0
- package/eigen/Eigen/src/plugins/InternalHeaderCheck.inc +3 -0
- package/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.inc +331 -0
- package/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.inc +118 -0
- package/eigen/Eigen/src/plugins/ReshapedMethods.inc +133 -0
- package/package.json +1 -1
- package/eigen/COPYING.APACHE +0 -203
- package/eigen/COPYING.BSD +0 -26
- package/eigen/COPYING.GPL +0 -674
- package/eigen/COPYING.LGPL +0 -502
- package/eigen/COPYING.MINPACK +0 -51
- package/eigen/COPYING.MPL2 +0 -373
- package/eigen/COPYING.README +0 -18
- package/eigen/Eigen/src/Core/BooleanRedux.h +0 -162
- package/eigen/Eigen/src/Core/arch/CUDA/Complex.h +0 -258
- package/eigen/Eigen/src/Core/arch/Default/TypeCasting.h +0 -120
- package/eigen/Eigen/src/Core/arch/SYCL/SyclMemoryModel.h +0 -694
- package/eigen/Eigen/src/Core/util/NonMPL2.h +0 -3
- package/eigen/Eigen/src/SparseCore/MappedSparseMatrix.h +0 -67
- package/eigen/Eigen/src/SparseLU/SparseLU_gemm_kernel.h +0 -280
- package/eigen/Eigen/src/misc/lapack.h +0 -152
- package/eigen/Eigen/src/plugins/ArrayCwiseBinaryOps.h +0 -358
- package/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.h +0 -696
- package/eigen/Eigen/src/plugins/CommonCwiseBinaryOps.h +0 -115
- package/eigen/Eigen/src/plugins/IndexedViewMethods.h +0 -262
- package/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.h +0 -152
- package/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.h +0 -95
- package/eigen/Eigen/src/plugins/ReshapedMethods.h +0 -149
- package/eigen/README.md +0 -5
|
@@ -13,254 +13,243 @@
|
|
|
13
13
|
|
|
14
14
|
#include "./HessenbergDecomposition.h"
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
// IWYU pragma: private
|
|
17
|
+
#include "./InternalHeaderCheck.h"
|
|
18
|
+
|
|
19
|
+
namespace Eigen {
|
|
17
20
|
|
|
18
21
|
/** \eigenvalues_module \ingroup Eigenvalues_Module
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
template<typename
|
|
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
|
-
compute(matrix.derived(), computeU);
|
|
114
|
-
}
|
|
22
|
+
*
|
|
23
|
+
*
|
|
24
|
+
* \class RealSchur
|
|
25
|
+
*
|
|
26
|
+
* \brief Performs a real Schur decomposition of a square matrix
|
|
27
|
+
*
|
|
28
|
+
* \tparam MatrixType_ the type of the matrix of which we are computing the
|
|
29
|
+
* real Schur decomposition; this is expected to be an instantiation of the
|
|
30
|
+
* Matrix class template.
|
|
31
|
+
*
|
|
32
|
+
* Given a real square matrix A, this class computes the real Schur
|
|
33
|
+
* decomposition: \f$ A = U T U^T \f$ where U is a real orthogonal matrix and
|
|
34
|
+
* T is a real quasi-triangular matrix. An orthogonal matrix is a matrix whose
|
|
35
|
+
* inverse is equal to its transpose, \f$ U^{-1} = U^T \f$. A quasi-triangular
|
|
36
|
+
* matrix is a block-triangular matrix whose diagonal consists of 1-by-1
|
|
37
|
+
* blocks and 2-by-2 blocks with complex eigenvalues. The eigenvalues of the
|
|
38
|
+
* blocks on the diagonal of T are the same as the eigenvalues of the matrix
|
|
39
|
+
* A, and thus the real Schur decomposition is used in EigenSolver to compute
|
|
40
|
+
* the eigendecomposition of a matrix.
|
|
41
|
+
*
|
|
42
|
+
* Call the function compute() to compute the real Schur decomposition of a
|
|
43
|
+
* given matrix. Alternatively, you can use the RealSchur(const MatrixType&, bool)
|
|
44
|
+
* constructor which computes the real Schur decomposition at construction
|
|
45
|
+
* time. Once the decomposition is computed, you can use the matrixU() and
|
|
46
|
+
* matrixT() functions to retrieve the matrices U and T in the decomposition.
|
|
47
|
+
*
|
|
48
|
+
* The documentation of RealSchur(const MatrixType&, bool) contains an example
|
|
49
|
+
* of the typical use of this class.
|
|
50
|
+
*
|
|
51
|
+
* \note The implementation is adapted from
|
|
52
|
+
* <a href="http://math.nist.gov/javanumerics/jama/">JAMA</a> (public domain).
|
|
53
|
+
* Their code is based on EISPACK.
|
|
54
|
+
*
|
|
55
|
+
* \sa class ComplexSchur, class EigenSolver, class ComplexEigenSolver
|
|
56
|
+
*/
|
|
57
|
+
template <typename MatrixType_>
|
|
58
|
+
class RealSchur {
|
|
59
|
+
public:
|
|
60
|
+
typedef MatrixType_ MatrixType;
|
|
61
|
+
enum {
|
|
62
|
+
RowsAtCompileTime = MatrixType::RowsAtCompileTime,
|
|
63
|
+
ColsAtCompileTime = MatrixType::ColsAtCompileTime,
|
|
64
|
+
Options = internal::traits<MatrixType>::Options,
|
|
65
|
+
MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
|
|
66
|
+
MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
|
|
67
|
+
};
|
|
68
|
+
typedef typename MatrixType::Scalar Scalar;
|
|
69
|
+
typedef internal::make_complex_t<Scalar> ComplexScalar;
|
|
70
|
+
typedef Eigen::Index Index; ///< \deprecated since Eigen 3.3
|
|
71
|
+
|
|
72
|
+
typedef Matrix<ComplexScalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> EigenvalueType;
|
|
73
|
+
typedef Matrix<Scalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> ColumnVectorType;
|
|
74
|
+
|
|
75
|
+
/** \brief Default constructor.
|
|
76
|
+
*
|
|
77
|
+
* \param [in] size Positive integer, size of the matrix whose Schur decomposition will be computed.
|
|
78
|
+
*
|
|
79
|
+
* The default constructor is useful in cases in which the user intends to
|
|
80
|
+
* perform decompositions via compute(). The \p size parameter is only
|
|
81
|
+
* used as a hint. It is not an error to give a wrong \p size, but it may
|
|
82
|
+
* impair performance.
|
|
83
|
+
*
|
|
84
|
+
* \sa compute() for an example.
|
|
85
|
+
*/
|
|
86
|
+
explicit RealSchur(Index size = RowsAtCompileTime == Dynamic ? 1 : RowsAtCompileTime)
|
|
87
|
+
: m_matT(size, size),
|
|
88
|
+
m_matU(size, size),
|
|
89
|
+
m_workspaceVector(size),
|
|
90
|
+
m_hess(size),
|
|
91
|
+
m_isInitialized(false),
|
|
92
|
+
m_matUisUptodate(false),
|
|
93
|
+
m_maxIters(-1) {}
|
|
94
|
+
|
|
95
|
+
/** \brief Constructor; computes real Schur decomposition of given matrix.
|
|
96
|
+
*
|
|
97
|
+
* \param[in] matrix Square matrix whose Schur decomposition is to be computed.
|
|
98
|
+
* \param[in] computeU If true, both T and U are computed; if false, only T is computed.
|
|
99
|
+
*
|
|
100
|
+
* This constructor calls compute() to compute the Schur decomposition.
|
|
101
|
+
*
|
|
102
|
+
* Example: \include RealSchur_RealSchur_MatrixType.cpp
|
|
103
|
+
* Output: \verbinclude RealSchur_RealSchur_MatrixType.out
|
|
104
|
+
*/
|
|
105
|
+
template <typename InputType>
|
|
106
|
+
explicit RealSchur(const EigenBase<InputType>& matrix, bool computeU = true)
|
|
107
|
+
: m_matT(matrix.rows(), matrix.cols()),
|
|
108
|
+
m_matU(matrix.rows(), matrix.cols()),
|
|
109
|
+
m_workspaceVector(matrix.rows()),
|
|
110
|
+
m_hess(matrix.rows()),
|
|
111
|
+
m_isInitialized(false),
|
|
112
|
+
m_matUisUptodate(false),
|
|
113
|
+
m_maxIters(-1) {
|
|
114
|
+
compute(matrix.derived(), computeU);
|
|
115
|
+
}
|
|
115
116
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
}
|
|
117
|
+
/** \brief Returns the orthogonal matrix in the Schur decomposition.
|
|
118
|
+
*
|
|
119
|
+
* \returns A const reference to the matrix U.
|
|
120
|
+
*
|
|
121
|
+
* \pre Either the constructor RealSchur(const MatrixType&, bool) or the
|
|
122
|
+
* member function compute(const MatrixType&, bool) has been called before
|
|
123
|
+
* to compute the Schur decomposition of a matrix, and \p computeU was set
|
|
124
|
+
* to true (the default value).
|
|
125
|
+
*
|
|
126
|
+
* \sa RealSchur(const MatrixType&, bool) for an example
|
|
127
|
+
*/
|
|
128
|
+
const MatrixType& matrixU() const {
|
|
129
|
+
eigen_assert(m_isInitialized && "RealSchur is not initialized.");
|
|
130
|
+
eigen_assert(m_matUisUptodate && "The matrix U has not been computed during the RealSchur decomposition.");
|
|
131
|
+
return m_matU;
|
|
132
|
+
}
|
|
133
133
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
/** \brief Computes Schur decomposition of given matrix.
|
|
151
|
-
*
|
|
152
|
-
* \param[in] matrix Square matrix whose Schur decomposition is to be computed.
|
|
153
|
-
* \param[in] computeU If true, both T and U are computed; if false, only T is computed.
|
|
154
|
-
* \returns Reference to \c *this
|
|
155
|
-
*
|
|
156
|
-
* The Schur decomposition is computed by first reducing the matrix to
|
|
157
|
-
* Hessenberg form using the class HessenbergDecomposition. The Hessenberg
|
|
158
|
-
* matrix is then reduced to triangular form by performing Francis QR
|
|
159
|
-
* iterations with implicit double shift. The cost of computing the Schur
|
|
160
|
-
* decomposition depends on the number of iterations; as a rough guide, it
|
|
161
|
-
* may be taken to be \f$25n^3\f$ flops if \a computeU is true and
|
|
162
|
-
* \f$10n^3\f$ flops if \a computeU is false.
|
|
163
|
-
*
|
|
164
|
-
* Example: \include RealSchur_compute.cpp
|
|
165
|
-
* Output: \verbinclude RealSchur_compute.out
|
|
166
|
-
*
|
|
167
|
-
* \sa compute(const MatrixType&, bool, Index)
|
|
168
|
-
*/
|
|
169
|
-
template<typename InputType>
|
|
170
|
-
RealSchur& compute(const EigenBase<InputType>& matrix, bool computeU = true);
|
|
171
|
-
|
|
172
|
-
/** \brief Computes Schur decomposition of a Hessenberg matrix H = Z T Z^T
|
|
173
|
-
* \param[in] matrixH Matrix in Hessenberg form H
|
|
174
|
-
* \param[in] matrixQ orthogonal matrix Q that transform a matrix A to H : A = Q H Q^T
|
|
175
|
-
* \param computeU Computes the matriX U of the Schur vectors
|
|
176
|
-
* \return Reference to \c *this
|
|
177
|
-
*
|
|
178
|
-
* This routine assumes that the matrix is already reduced in Hessenberg form matrixH
|
|
179
|
-
* using either the class HessenbergDecomposition or another mean.
|
|
180
|
-
* It computes the upper quasi-triangular matrix T of the Schur decomposition of H
|
|
181
|
-
* When computeU is true, this routine computes the matrix U such that
|
|
182
|
-
* A = U T U^T = (QZ) T (QZ)^T = Q H Q^T where A is the initial matrix
|
|
183
|
-
*
|
|
184
|
-
* NOTE Q is referenced if computeU is true; so, if the initial orthogonal matrix
|
|
185
|
-
* is not available, the user should give an identity matrix (Q.setIdentity())
|
|
186
|
-
*
|
|
187
|
-
* \sa compute(const MatrixType&, bool)
|
|
188
|
-
*/
|
|
189
|
-
template<typename HessMatrixType, typename OrthMatrixType>
|
|
190
|
-
RealSchur& computeFromHessenberg(const HessMatrixType& matrixH, const OrthMatrixType& matrixQ, bool computeU);
|
|
191
|
-
/** \brief Reports whether previous computation was successful.
|
|
192
|
-
*
|
|
193
|
-
* \returns \c Success if computation was successful, \c NoConvergence otherwise.
|
|
194
|
-
*/
|
|
195
|
-
ComputationInfo info() const
|
|
196
|
-
{
|
|
197
|
-
eigen_assert(m_isInitialized && "RealSchur is not initialized.");
|
|
198
|
-
return m_info;
|
|
199
|
-
}
|
|
134
|
+
/** \brief Returns the quasi-triangular matrix in the Schur decomposition.
|
|
135
|
+
*
|
|
136
|
+
* \returns A const reference to the matrix T.
|
|
137
|
+
*
|
|
138
|
+
* \pre Either the constructor RealSchur(const MatrixType&, bool) or the
|
|
139
|
+
* member function compute(const MatrixType&, bool) has been called before
|
|
140
|
+
* to compute the Schur decomposition of a matrix.
|
|
141
|
+
*
|
|
142
|
+
* \sa RealSchur(const MatrixType&, bool) for an example
|
|
143
|
+
*/
|
|
144
|
+
const MatrixType& matrixT() const {
|
|
145
|
+
eigen_assert(m_isInitialized && "RealSchur is not initialized.");
|
|
146
|
+
return m_matT;
|
|
147
|
+
}
|
|
200
148
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
149
|
+
/** \brief Computes Schur decomposition of given matrix.
|
|
150
|
+
*
|
|
151
|
+
* \param[in] matrix Square matrix whose Schur decomposition is to be computed.
|
|
152
|
+
* \param[in] computeU If true, both T and U are computed; if false, only T is computed.
|
|
153
|
+
* \returns Reference to \c *this
|
|
154
|
+
*
|
|
155
|
+
* The Schur decomposition is computed by first reducing the matrix to
|
|
156
|
+
* Hessenberg form using the class HessenbergDecomposition. The Hessenberg
|
|
157
|
+
* matrix is then reduced to triangular form by performing Francis QR
|
|
158
|
+
* iterations with implicit double shift. The cost of computing the Schur
|
|
159
|
+
* decomposition depends on the number of iterations; as a rough guide, it
|
|
160
|
+
* may be taken to be \f$25n^3\f$ flops if \a computeU is true and
|
|
161
|
+
* \f$10n^3\f$ flops if \a computeU is false.
|
|
162
|
+
*
|
|
163
|
+
* Example: \include RealSchur_compute.cpp
|
|
164
|
+
* Output: \verbinclude RealSchur_compute.out
|
|
165
|
+
*
|
|
166
|
+
* \sa compute(const MatrixType&, bool, Index)
|
|
167
|
+
*/
|
|
168
|
+
template <typename InputType>
|
|
169
|
+
RealSchur& compute(const EigenBase<InputType>& matrix, bool computeU = true);
|
|
170
|
+
|
|
171
|
+
/** \brief Computes Schur decomposition of a Hessenberg matrix H = Z T Z^T
|
|
172
|
+
* \param[in] matrixH Matrix in Hessenberg form H
|
|
173
|
+
* \param[in] matrixQ orthogonal matrix Q that transform a matrix A to H : A = Q H Q^T
|
|
174
|
+
* \param computeU Computes the matriX U of the Schur vectors
|
|
175
|
+
* \return Reference to \c *this
|
|
176
|
+
*
|
|
177
|
+
* This routine assumes that the matrix is already reduced in Hessenberg form matrixH
|
|
178
|
+
* using either the class HessenbergDecomposition or another mean.
|
|
179
|
+
* It computes the upper quasi-triangular matrix T of the Schur decomposition of H
|
|
180
|
+
* When computeU is true, this routine computes the matrix U such that
|
|
181
|
+
* A = U T U^T = (QZ) T (QZ)^T = Q H Q^T where A is the initial matrix
|
|
182
|
+
*
|
|
183
|
+
* NOTE Q is referenced if computeU is true; so, if the initial orthogonal matrix
|
|
184
|
+
* is not available, the user should give an identity matrix (Q.setIdentity())
|
|
185
|
+
*
|
|
186
|
+
* \sa compute(const MatrixType&, bool)
|
|
187
|
+
*/
|
|
188
|
+
template <typename HessMatrixType, typename OrthMatrixType>
|
|
189
|
+
RealSchur& computeFromHessenberg(const HessMatrixType& matrixH, const OrthMatrixType& matrixQ, bool computeU);
|
|
190
|
+
/** \brief Reports whether previous computation was successful.
|
|
191
|
+
*
|
|
192
|
+
* \returns \c Success if computation was successful, \c NoConvergence otherwise.
|
|
193
|
+
*/
|
|
194
|
+
ComputationInfo info() const {
|
|
195
|
+
eigen_assert(m_isInitialized && "RealSchur is not initialized.");
|
|
196
|
+
return m_info;
|
|
197
|
+
}
|
|
211
198
|
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
199
|
+
/** \brief Sets the maximum number of iterations allowed.
|
|
200
|
+
*
|
|
201
|
+
* If not specified by the user, the maximum number of iterations is m_maxIterationsPerRow times the size
|
|
202
|
+
* of the matrix.
|
|
203
|
+
*/
|
|
204
|
+
RealSchur& setMaxIterations(Index maxIters) {
|
|
205
|
+
m_maxIters = maxIters;
|
|
206
|
+
return *this;
|
|
207
|
+
}
|
|
217
208
|
|
|
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
|
-
|
|
209
|
+
/** \brief Returns the maximum number of iterations. */
|
|
210
|
+
Index getMaxIterations() { return m_maxIters; }
|
|
211
|
+
|
|
212
|
+
/** \brief Maximum number of iterations per row.
|
|
213
|
+
*
|
|
214
|
+
* If not otherwise specified, the maximum number of iterations is this number times the size of the
|
|
215
|
+
* matrix. It is currently set to 40.
|
|
216
|
+
*/
|
|
217
|
+
static const int m_maxIterationsPerRow = 40;
|
|
218
|
+
|
|
219
|
+
private:
|
|
220
|
+
MatrixType m_matT;
|
|
221
|
+
MatrixType m_matU;
|
|
222
|
+
ColumnVectorType m_workspaceVector;
|
|
223
|
+
HessenbergDecomposition<MatrixType> m_hess;
|
|
224
|
+
ComputationInfo m_info;
|
|
225
|
+
bool m_isInitialized;
|
|
226
|
+
bool m_matUisUptodate;
|
|
227
|
+
Index m_maxIters;
|
|
228
|
+
|
|
229
|
+
typedef Matrix<Scalar, 3, 1> Vector3s;
|
|
230
|
+
|
|
231
|
+
Scalar computeNormOfT();
|
|
232
|
+
Index findSmallSubdiagEntry(Index iu, const Scalar& considerAsZero);
|
|
233
|
+
void splitOffTwoRows(Index iu, bool computeU, const Scalar& exshift);
|
|
234
|
+
void computeShift(Index iu, Index iter, Scalar& exshift, Vector3s& shiftInfo);
|
|
235
|
+
void initFrancisQRStep(Index il, Index iu, const Vector3s& shiftInfo, Index& im, Vector3s& firstHouseholderVector);
|
|
236
|
+
void performFrancisQRStep(Index il, Index im, Index iu, bool computeU, const Vector3s& firstHouseholderVector,
|
|
237
|
+
Scalar* workspace);
|
|
244
238
|
};
|
|
245
239
|
|
|
246
|
-
|
|
247
|
-
template<typename
|
|
248
|
-
|
|
249
|
-
RealSchur<MatrixType>& RealSchur<MatrixType>::compute(const EigenBase<InputType>& matrix, bool computeU)
|
|
250
|
-
{
|
|
240
|
+
template <typename MatrixType>
|
|
241
|
+
template <typename InputType>
|
|
242
|
+
RealSchur<MatrixType>& RealSchur<MatrixType>::compute(const EigenBase<InputType>& matrix, bool computeU) {
|
|
251
243
|
const Scalar considerAsZero = (std::numeric_limits<Scalar>::min)();
|
|
252
244
|
|
|
253
245
|
eigen_assert(matrix.cols() == matrix.rows());
|
|
254
246
|
Index maxIters = m_maxIters;
|
|
255
|
-
if (maxIters == -1)
|
|
256
|
-
maxIters = m_maxIterationsPerRow * matrix.rows();
|
|
247
|
+
if (maxIters == -1) maxIters = m_maxIterationsPerRow * matrix.rows();
|
|
257
248
|
|
|
258
249
|
Scalar scale = matrix.derived().cwiseAbs().maxCoeff();
|
|
259
|
-
if(scale<considerAsZero)
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
if(computeU)
|
|
263
|
-
m_matU.setIdentity(matrix.rows(),matrix.cols());
|
|
250
|
+
if (scale < considerAsZero) {
|
|
251
|
+
m_matT.setZero(matrix.rows(), matrix.cols());
|
|
252
|
+
if (computeU) m_matU.setIdentity(matrix.rows(), matrix.cols());
|
|
264
253
|
m_info = Success;
|
|
265
254
|
m_isInitialized = true;
|
|
266
255
|
m_matUisUptodate = computeU;
|
|
@@ -268,74 +257,67 @@ RealSchur<MatrixType>& RealSchur<MatrixType>::compute(const EigenBase<InputType>
|
|
|
268
257
|
}
|
|
269
258
|
|
|
270
259
|
// Step 1. Reduce to Hessenberg form
|
|
271
|
-
m_hess.compute(matrix.derived()/scale);
|
|
260
|
+
m_hess.compute(matrix.derived() / scale);
|
|
272
261
|
|
|
273
262
|
// Step 2. Reduce to real Schur form
|
|
274
263
|
// Note: we copy m_hess.matrixQ() into m_matU here and not in computeFromHessenberg
|
|
275
264
|
// to be able to pass our working-space buffer for the Householder to Dense evaluation.
|
|
276
265
|
m_workspaceVector.resize(matrix.cols());
|
|
277
|
-
if(computeU)
|
|
278
|
-
m_hess.matrixQ().evalTo(m_matU, m_workspaceVector);
|
|
266
|
+
if (computeU) m_hess.matrixQ().evalTo(m_matU, m_workspaceVector);
|
|
279
267
|
computeFromHessenberg(m_hess.matrixH(), m_matU, computeU);
|
|
280
268
|
|
|
281
269
|
m_matT *= scale;
|
|
282
|
-
|
|
270
|
+
|
|
283
271
|
return *this;
|
|
284
272
|
}
|
|
285
|
-
template<typename MatrixType>
|
|
286
|
-
template<typename HessMatrixType, typename OrthMatrixType>
|
|
287
|
-
RealSchur<MatrixType>& RealSchur<MatrixType>::computeFromHessenberg(const HessMatrixType& matrixH,
|
|
288
|
-
{
|
|
273
|
+
template <typename MatrixType>
|
|
274
|
+
template <typename HessMatrixType, typename OrthMatrixType>
|
|
275
|
+
RealSchur<MatrixType>& RealSchur<MatrixType>::computeFromHessenberg(const HessMatrixType& matrixH,
|
|
276
|
+
const OrthMatrixType& matrixQ, bool computeU) {
|
|
289
277
|
using std::abs;
|
|
290
278
|
|
|
291
279
|
m_matT = matrixH;
|
|
292
280
|
m_workspaceVector.resize(m_matT.cols());
|
|
293
|
-
if(computeU && !internal::is_same_dense(m_matU,matrixQ))
|
|
294
|
-
|
|
295
|
-
|
|
281
|
+
if (computeU && !internal::is_same_dense(m_matU, matrixQ)) m_matU = matrixQ;
|
|
282
|
+
|
|
296
283
|
Index maxIters = m_maxIters;
|
|
297
|
-
if (maxIters == -1)
|
|
298
|
-
maxIters = m_maxIterationsPerRow * matrixH.rows();
|
|
284
|
+
if (maxIters == -1) maxIters = m_maxIterationsPerRow * matrixH.rows();
|
|
299
285
|
Scalar* workspace = &m_workspaceVector.coeffRef(0);
|
|
300
286
|
|
|
301
|
-
// The matrix m_matT is divided in three parts.
|
|
302
|
-
// Rows 0,...,il-1 are decoupled from the rest because m_matT(il,il-1) is zero.
|
|
287
|
+
// The matrix m_matT is divided in three parts.
|
|
288
|
+
// Rows 0,...,il-1 are decoupled from the rest because m_matT(il,il-1) is zero.
|
|
303
289
|
// Rows il,...,iu is the part we are working on (the active window).
|
|
304
290
|
// Rows iu+1,...,end are already brought in triangular form.
|
|
305
291
|
Index iu = m_matT.cols() - 1;
|
|
306
|
-
Index iter = 0;
|
|
307
|
-
Index totalIter = 0;
|
|
308
|
-
Scalar exshift(0);
|
|
292
|
+
Index iter = 0; // iteration count for current eigenvalue
|
|
293
|
+
Index totalIter = 0; // iteration count for whole matrix
|
|
294
|
+
Scalar exshift(0); // sum of exceptional shifts
|
|
309
295
|
Scalar norm = computeNormOfT();
|
|
310
296
|
// sub-diagonal entries smaller than considerAsZero will be treated as zero.
|
|
311
297
|
// We use eps^2 to enable more precision in small eigenvalues.
|
|
312
|
-
Scalar considerAsZero =
|
|
313
|
-
|
|
298
|
+
Scalar considerAsZero =
|
|
299
|
+
numext::maxi<Scalar>(norm * numext::abs2(NumTraits<Scalar>::epsilon()), (std::numeric_limits<Scalar>::min)());
|
|
314
300
|
|
|
315
|
-
if(norm
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
{
|
|
319
|
-
Index il = findSmallSubdiagEntry(iu,considerAsZero);
|
|
301
|
+
if (!numext::is_exactly_zero(norm)) {
|
|
302
|
+
while (iu >= 0) {
|
|
303
|
+
Index il = findSmallSubdiagEntry(iu, considerAsZero);
|
|
320
304
|
|
|
321
305
|
// Check for convergence
|
|
322
|
-
if (il == iu)
|
|
306
|
+
if (il == iu) // One root found
|
|
323
307
|
{
|
|
324
|
-
m_matT.coeffRef(iu,iu) = m_matT.coeff(iu,iu) + exshift;
|
|
325
|
-
if (iu > 0)
|
|
326
|
-
m_matT.coeffRef(iu, iu-1) = Scalar(0);
|
|
308
|
+
m_matT.coeffRef(iu, iu) = m_matT.coeff(iu, iu) + exshift;
|
|
309
|
+
if (iu > 0) m_matT.coeffRef(iu, iu - 1) = Scalar(0);
|
|
327
310
|
iu--;
|
|
328
311
|
iter = 0;
|
|
329
|
-
}
|
|
330
|
-
else if (il == iu-1) // Two roots found
|
|
312
|
+
} else if (il == iu - 1) // Two roots found
|
|
331
313
|
{
|
|
332
314
|
splitOffTwoRows(iu, computeU, exshift);
|
|
333
315
|
iu -= 2;
|
|
334
316
|
iter = 0;
|
|
335
|
-
}
|
|
336
|
-
else // No convergence yet
|
|
317
|
+
} else // No convergence yet
|
|
337
318
|
{
|
|
338
|
-
// The firstHouseholderVector vector has to be initialized to something to get rid of a silly GCC warning (-O1
|
|
319
|
+
// The firstHouseholderVector vector has to be initialized to something to get rid of a silly GCC warning (-O1
|
|
320
|
+
// -Wall -DNDEBUG )
|
|
339
321
|
Vector3s firstHouseholderVector = Vector3s::Zero(), shiftInfo;
|
|
340
322
|
computeShift(iu, iter, exshift, shiftInfo);
|
|
341
323
|
iter = iter + 1;
|
|
@@ -347,7 +329,7 @@ RealSchur<MatrixType>& RealSchur<MatrixType>::computeFromHessenberg(const HessMa
|
|
|
347
329
|
}
|
|
348
330
|
}
|
|
349
331
|
}
|
|
350
|
-
if(totalIter <= maxIters)
|
|
332
|
+
if (totalIter <= maxIters)
|
|
351
333
|
m_info = Success;
|
|
352
334
|
else
|
|
353
335
|
m_info = NoConvergence;
|
|
@@ -358,201 +340,180 @@ RealSchur<MatrixType>& RealSchur<MatrixType>::computeFromHessenberg(const HessMa
|
|
|
358
340
|
}
|
|
359
341
|
|
|
360
342
|
/** \internal Computes and returns vector L1 norm of T */
|
|
361
|
-
template<typename MatrixType>
|
|
362
|
-
inline typename MatrixType::Scalar RealSchur<MatrixType>::computeNormOfT()
|
|
363
|
-
{
|
|
343
|
+
template <typename MatrixType>
|
|
344
|
+
inline typename MatrixType::Scalar RealSchur<MatrixType>::computeNormOfT() {
|
|
364
345
|
const Index size = m_matT.cols();
|
|
365
346
|
// FIXME to be efficient the following would requires a triangular reduxion code
|
|
366
|
-
// Scalar norm = m_matT.upper().cwiseAbs().sum()
|
|
347
|
+
// Scalar norm = m_matT.upper().cwiseAbs().sum()
|
|
367
348
|
// + m_matT.bottomLeftCorner(size-1,size-1).diagonal().cwiseAbs().sum();
|
|
368
349
|
Scalar norm(0);
|
|
369
|
-
for (Index j = 0; j < size; ++j)
|
|
370
|
-
norm += m_matT.col(j).segment(0, (std::min)(size,j+2)).cwiseAbs().sum();
|
|
350
|
+
for (Index j = 0; j < size; ++j) norm += m_matT.col(j).segment(0, (std::min)(size, j + 2)).cwiseAbs().sum();
|
|
371
351
|
return norm;
|
|
372
352
|
}
|
|
373
353
|
|
|
374
354
|
/** \internal Look for single small sub-diagonal element and returns its index */
|
|
375
|
-
template<typename MatrixType>
|
|
376
|
-
inline Index RealSchur<MatrixType>::findSmallSubdiagEntry(Index iu, const Scalar& considerAsZero)
|
|
377
|
-
{
|
|
355
|
+
template <typename MatrixType>
|
|
356
|
+
inline Index RealSchur<MatrixType>::findSmallSubdiagEntry(Index iu, const Scalar& considerAsZero) {
|
|
378
357
|
using std::abs;
|
|
379
358
|
Index res = iu;
|
|
380
|
-
while (res > 0)
|
|
381
|
-
|
|
382
|
-
Scalar s = abs(m_matT.coeff(res-1,res-1)) + abs(m_matT.coeff(res,res));
|
|
359
|
+
while (res > 0) {
|
|
360
|
+
Scalar s = abs(m_matT.coeff(res - 1, res - 1)) + abs(m_matT.coeff(res, res));
|
|
383
361
|
|
|
384
362
|
s = numext::maxi<Scalar>(s * NumTraits<Scalar>::epsilon(), considerAsZero);
|
|
385
|
-
|
|
386
|
-
if (abs(m_matT.coeff(res,res-1)) <= s)
|
|
387
|
-
break;
|
|
363
|
+
|
|
364
|
+
if (abs(m_matT.coeff(res, res - 1)) <= s) break;
|
|
388
365
|
res--;
|
|
389
366
|
}
|
|
390
367
|
return res;
|
|
391
368
|
}
|
|
392
369
|
|
|
393
370
|
/** \internal Update T given that rows iu-1 and iu decouple from the rest. */
|
|
394
|
-
template<typename MatrixType>
|
|
395
|
-
inline void RealSchur<MatrixType>::splitOffTwoRows(Index iu, bool computeU, const Scalar& exshift)
|
|
396
|
-
{
|
|
397
|
-
using std::sqrt;
|
|
371
|
+
template <typename MatrixType>
|
|
372
|
+
inline void RealSchur<MatrixType>::splitOffTwoRows(Index iu, bool computeU, const Scalar& exshift) {
|
|
398
373
|
using std::abs;
|
|
374
|
+
using std::sqrt;
|
|
399
375
|
const Index size = m_matT.cols();
|
|
400
376
|
|
|
401
|
-
// The eigenvalues of the 2x2 matrix [a b; c d] are
|
|
377
|
+
// The eigenvalues of the 2x2 matrix [a b; c d] are
|
|
402
378
|
// trace +/- sqrt(discr/4) where discr = tr^2 - 4*det, tr = a + d, det = ad - bc
|
|
403
|
-
Scalar p = Scalar(0.5) * (m_matT.coeff(iu-1,iu-1) - m_matT.coeff(iu,iu));
|
|
404
|
-
Scalar q = p * p + m_matT.coeff(iu,iu-1) * m_matT.coeff(iu-1,iu);
|
|
405
|
-
m_matT.coeffRef(iu,iu) += exshift;
|
|
406
|
-
m_matT.coeffRef(iu-1,iu-1) += exshift;
|
|
379
|
+
Scalar p = Scalar(0.5) * (m_matT.coeff(iu - 1, iu - 1) - m_matT.coeff(iu, iu));
|
|
380
|
+
Scalar q = p * p + m_matT.coeff(iu, iu - 1) * m_matT.coeff(iu - 1, iu); // q = tr^2 / 4 - det = discr/4
|
|
381
|
+
m_matT.coeffRef(iu, iu) += exshift;
|
|
382
|
+
m_matT.coeffRef(iu - 1, iu - 1) += exshift;
|
|
407
383
|
|
|
408
|
-
if (q >= Scalar(0))
|
|
384
|
+
if (q >= Scalar(0)) // Two real eigenvalues
|
|
409
385
|
{
|
|
410
386
|
Scalar z = sqrt(abs(q));
|
|
411
387
|
JacobiRotation<Scalar> rot;
|
|
412
388
|
if (p >= Scalar(0))
|
|
413
|
-
rot.makeGivens(p + z, m_matT.coeff(iu, iu-1));
|
|
389
|
+
rot.makeGivens(p + z, m_matT.coeff(iu, iu - 1));
|
|
414
390
|
else
|
|
415
|
-
rot.makeGivens(p - z, m_matT.coeff(iu, iu-1));
|
|
391
|
+
rot.makeGivens(p - z, m_matT.coeff(iu, iu - 1));
|
|
416
392
|
|
|
417
|
-
m_matT.rightCols(size-iu+1).applyOnTheLeft(iu-1, iu, rot.adjoint());
|
|
418
|
-
m_matT.topRows(iu+1).applyOnTheRight(iu-1, iu, rot);
|
|
419
|
-
m_matT.coeffRef(iu, iu-1) = Scalar(0);
|
|
420
|
-
if (computeU)
|
|
421
|
-
m_matU.applyOnTheRight(iu-1, iu, rot);
|
|
393
|
+
m_matT.rightCols(size - iu + 1).applyOnTheLeft(iu - 1, iu, rot.adjoint());
|
|
394
|
+
m_matT.topRows(iu + 1).applyOnTheRight(iu - 1, iu, rot);
|
|
395
|
+
m_matT.coeffRef(iu, iu - 1) = Scalar(0);
|
|
396
|
+
if (computeU) m_matU.applyOnTheRight(iu - 1, iu, rot);
|
|
422
397
|
}
|
|
423
398
|
|
|
424
|
-
if (iu > 1)
|
|
425
|
-
m_matT.coeffRef(iu-1, iu-2) = Scalar(0);
|
|
399
|
+
if (iu > 1) m_matT.coeffRef(iu - 1, iu - 2) = Scalar(0);
|
|
426
400
|
}
|
|
427
401
|
|
|
428
402
|
/** \internal Form shift in shiftInfo, and update exshift if an exceptional shift is performed. */
|
|
429
|
-
template<typename MatrixType>
|
|
430
|
-
inline void RealSchur<MatrixType>::computeShift(Index iu, Index iter, Scalar& exshift, Vector3s& shiftInfo)
|
|
431
|
-
{
|
|
432
|
-
using std::sqrt;
|
|
403
|
+
template <typename MatrixType>
|
|
404
|
+
inline void RealSchur<MatrixType>::computeShift(Index iu, Index iter, Scalar& exshift, Vector3s& shiftInfo) {
|
|
433
405
|
using std::abs;
|
|
434
|
-
|
|
435
|
-
shiftInfo.coeffRef(
|
|
436
|
-
shiftInfo.coeffRef(
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
{
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
exshift += s;
|
|
463
|
-
for (Index i = 0; i <= iu; ++i)
|
|
464
|
-
m_matT.coeffRef(i,i) -= s;
|
|
465
|
-
shiftInfo.setConstant(Scalar(0.964));
|
|
406
|
+
using std::sqrt;
|
|
407
|
+
shiftInfo.coeffRef(0) = m_matT.coeff(iu, iu);
|
|
408
|
+
shiftInfo.coeffRef(1) = m_matT.coeff(iu - 1, iu - 1);
|
|
409
|
+
shiftInfo.coeffRef(2) = m_matT.coeff(iu, iu - 1) * m_matT.coeff(iu - 1, iu);
|
|
410
|
+
|
|
411
|
+
// Alternate exceptional shifting strategy every 16 iterations.
|
|
412
|
+
if (iter > 0 && iter % 16 == 0) {
|
|
413
|
+
// Wilkinson's original ad hoc shift
|
|
414
|
+
if (iter % 32 != 0) {
|
|
415
|
+
exshift += shiftInfo.coeff(0);
|
|
416
|
+
for (Index i = 0; i <= iu; ++i) m_matT.coeffRef(i, i) -= shiftInfo.coeff(0);
|
|
417
|
+
Scalar s = abs(m_matT.coeff(iu, iu - 1)) + abs(m_matT.coeff(iu - 1, iu - 2));
|
|
418
|
+
shiftInfo.coeffRef(0) = Scalar(0.75) * s;
|
|
419
|
+
shiftInfo.coeffRef(1) = Scalar(0.75) * s;
|
|
420
|
+
shiftInfo.coeffRef(2) = Scalar(-0.4375) * s * s;
|
|
421
|
+
} else {
|
|
422
|
+
// MATLAB's new ad hoc shift
|
|
423
|
+
Scalar s = (shiftInfo.coeff(1) - shiftInfo.coeff(0)) / Scalar(2.0);
|
|
424
|
+
s = s * s + shiftInfo.coeff(2);
|
|
425
|
+
if (s > Scalar(0)) {
|
|
426
|
+
s = sqrt(s);
|
|
427
|
+
if (shiftInfo.coeff(1) < shiftInfo.coeff(0)) s = -s;
|
|
428
|
+
s = s + (shiftInfo.coeff(1) - shiftInfo.coeff(0)) / Scalar(2.0);
|
|
429
|
+
s = shiftInfo.coeff(0) - shiftInfo.coeff(2) / s;
|
|
430
|
+
exshift += s;
|
|
431
|
+
for (Index i = 0; i <= iu; ++i) m_matT.coeffRef(i, i) -= s;
|
|
432
|
+
shiftInfo.setConstant(Scalar(0.964));
|
|
433
|
+
}
|
|
466
434
|
}
|
|
467
435
|
}
|
|
468
436
|
}
|
|
469
437
|
|
|
470
438
|
/** \internal Compute index im at which Francis QR step starts and the first Householder vector. */
|
|
471
|
-
template<typename MatrixType>
|
|
472
|
-
inline void RealSchur<MatrixType>::initFrancisQRStep(Index il, Index iu, const Vector3s& shiftInfo, Index& im,
|
|
473
|
-
{
|
|
439
|
+
template <typename MatrixType>
|
|
440
|
+
inline void RealSchur<MatrixType>::initFrancisQRStep(Index il, Index iu, const Vector3s& shiftInfo, Index& im,
|
|
441
|
+
Vector3s& firstHouseholderVector) {
|
|
474
442
|
using std::abs;
|
|
475
|
-
Vector3s& v = firstHouseholderVector;
|
|
443
|
+
Vector3s& v = firstHouseholderVector; // alias to save typing
|
|
476
444
|
|
|
477
|
-
for (im = iu-2; im >= il; --im)
|
|
478
|
-
|
|
479
|
-
const Scalar Tmm = m_matT.coeff(im,im);
|
|
445
|
+
for (im = iu - 2; im >= il; --im) {
|
|
446
|
+
const Scalar Tmm = m_matT.coeff(im, im);
|
|
480
447
|
const Scalar r = shiftInfo.coeff(0) - Tmm;
|
|
481
448
|
const Scalar s = shiftInfo.coeff(1) - Tmm;
|
|
482
|
-
v.coeffRef(0) = (r * s - shiftInfo.coeff(2)) / m_matT.coeff(im+1,im) + m_matT.coeff(im,im+1);
|
|
483
|
-
v.coeffRef(1) = m_matT.coeff(im+1,im+1) - Tmm - r - s;
|
|
484
|
-
v.coeffRef(2) = m_matT.coeff(im+2,im+1);
|
|
449
|
+
v.coeffRef(0) = (r * s - shiftInfo.coeff(2)) / m_matT.coeff(im + 1, im) + m_matT.coeff(im, im + 1);
|
|
450
|
+
v.coeffRef(1) = m_matT.coeff(im + 1, im + 1) - Tmm - r - s;
|
|
451
|
+
v.coeffRef(2) = m_matT.coeff(im + 2, im + 1);
|
|
485
452
|
if (im == il) {
|
|
486
453
|
break;
|
|
487
454
|
}
|
|
488
|
-
const Scalar lhs = m_matT.coeff(im,im-1) * (abs(v.coeff(1)) + abs(v.coeff(2)));
|
|
489
|
-
const Scalar rhs = v.coeff(0) * (abs(m_matT.coeff(im-1,im-1)) + abs(Tmm) + abs(m_matT.coeff(im+1,im+1)));
|
|
490
|
-
if (abs(lhs) < NumTraits<Scalar>::epsilon() * rhs)
|
|
491
|
-
break;
|
|
455
|
+
const Scalar lhs = m_matT.coeff(im, im - 1) * (abs(v.coeff(1)) + abs(v.coeff(2)));
|
|
456
|
+
const Scalar rhs = v.coeff(0) * (abs(m_matT.coeff(im - 1, im - 1)) + abs(Tmm) + abs(m_matT.coeff(im + 1, im + 1)));
|
|
457
|
+
if (abs(lhs) < NumTraits<Scalar>::epsilon() * rhs) break;
|
|
492
458
|
}
|
|
493
459
|
}
|
|
494
460
|
|
|
495
461
|
/** \internal Perform a Francis QR step involving rows il:iu and columns im:iu. */
|
|
496
|
-
template<typename MatrixType>
|
|
497
|
-
inline void RealSchur<MatrixType>::performFrancisQRStep(Index il, Index im, Index iu, bool computeU,
|
|
498
|
-
{
|
|
462
|
+
template <typename MatrixType>
|
|
463
|
+
inline void RealSchur<MatrixType>::performFrancisQRStep(Index il, Index im, Index iu, bool computeU,
|
|
464
|
+
const Vector3s& firstHouseholderVector, Scalar* workspace) {
|
|
499
465
|
eigen_assert(im >= il);
|
|
500
|
-
eigen_assert(im <= iu-2);
|
|
466
|
+
eigen_assert(im <= iu - 2);
|
|
501
467
|
|
|
502
468
|
const Index size = m_matT.cols();
|
|
503
469
|
|
|
504
|
-
for (Index k = im; k <= iu-2; ++k)
|
|
505
|
-
{
|
|
470
|
+
for (Index k = im; k <= iu - 2; ++k) {
|
|
506
471
|
bool firstIteration = (k == im);
|
|
507
472
|
|
|
508
473
|
Vector3s v;
|
|
509
474
|
if (firstIteration)
|
|
510
475
|
v = firstHouseholderVector;
|
|
511
476
|
else
|
|
512
|
-
v = m_matT.template block<3,1>(k,k-1);
|
|
477
|
+
v = m_matT.template block<3, 1>(k, k - 1);
|
|
513
478
|
|
|
514
479
|
Scalar tau, beta;
|
|
515
480
|
Matrix<Scalar, 2, 1> ess;
|
|
516
481
|
v.makeHouseholder(ess, tau, beta);
|
|
517
|
-
|
|
518
|
-
if (beta
|
|
482
|
+
|
|
483
|
+
if (!numext::is_exactly_zero(beta)) // if v is not zero
|
|
519
484
|
{
|
|
520
485
|
if (firstIteration && k > il)
|
|
521
|
-
m_matT.coeffRef(k,k-1) = -m_matT.coeff(k,k-1);
|
|
486
|
+
m_matT.coeffRef(k, k - 1) = -m_matT.coeff(k, k - 1);
|
|
522
487
|
else if (!firstIteration)
|
|
523
|
-
m_matT.coeffRef(k,k-1) = beta;
|
|
488
|
+
m_matT.coeffRef(k, k - 1) = beta;
|
|
524
489
|
|
|
525
490
|
// These Householder transformations form the O(n^3) part of the algorithm
|
|
526
|
-
m_matT.block(k, k, 3, size-k).applyHouseholderOnTheLeft(ess, tau, workspace);
|
|
527
|
-
m_matT.block(0, k, (std::min)(iu,k+3) + 1, 3).applyHouseholderOnTheRight(ess, tau, workspace);
|
|
528
|
-
if (computeU)
|
|
529
|
-
m_matU.block(0, k, size, 3).applyHouseholderOnTheRight(ess, tau, workspace);
|
|
491
|
+
m_matT.block(k, k, 3, size - k).applyHouseholderOnTheLeft(ess, tau, workspace);
|
|
492
|
+
m_matT.block(0, k, (std::min)(iu, k + 3) + 1, 3).applyHouseholderOnTheRight(ess, tau, workspace);
|
|
493
|
+
if (computeU) m_matU.block(0, k, size, 3).applyHouseholderOnTheRight(ess, tau, workspace);
|
|
530
494
|
}
|
|
531
495
|
}
|
|
532
496
|
|
|
533
|
-
Matrix<Scalar, 2, 1> v = m_matT.template block<2,1>(iu-1, iu-2);
|
|
497
|
+
Matrix<Scalar, 2, 1> v = m_matT.template block<2, 1>(iu - 1, iu - 2);
|
|
534
498
|
Scalar tau, beta;
|
|
535
499
|
Matrix<Scalar, 1, 1> ess;
|
|
536
500
|
v.makeHouseholder(ess, tau, beta);
|
|
537
501
|
|
|
538
|
-
if (beta
|
|
502
|
+
if (!numext::is_exactly_zero(beta)) // if v is not zero
|
|
539
503
|
{
|
|
540
|
-
m_matT.coeffRef(iu-1, iu-2) = beta;
|
|
541
|
-
m_matT.block(iu-1, iu-1, 2, size-iu+1).applyHouseholderOnTheLeft(ess, tau, workspace);
|
|
542
|
-
m_matT.block(0, iu-1, iu+1, 2).applyHouseholderOnTheRight(ess, tau, workspace);
|
|
543
|
-
if (computeU)
|
|
544
|
-
m_matU.block(0, iu-1, size, 2).applyHouseholderOnTheRight(ess, tau, workspace);
|
|
504
|
+
m_matT.coeffRef(iu - 1, iu - 2) = beta;
|
|
505
|
+
m_matT.block(iu - 1, iu - 1, 2, size - iu + 1).applyHouseholderOnTheLeft(ess, tau, workspace);
|
|
506
|
+
m_matT.block(0, iu - 1, iu + 1, 2).applyHouseholderOnTheRight(ess, tau, workspace);
|
|
507
|
+
if (computeU) m_matU.block(0, iu - 1, size, 2).applyHouseholderOnTheRight(ess, tau, workspace);
|
|
545
508
|
}
|
|
546
509
|
|
|
547
510
|
// clean up pollution due to round-off errors
|
|
548
|
-
for (Index i = im+2; i <= iu; ++i)
|
|
549
|
-
|
|
550
|
-
m_matT.coeffRef(i,i-
|
|
551
|
-
if (i > im+2)
|
|
552
|
-
m_matT.coeffRef(i,i-3) = Scalar(0);
|
|
511
|
+
for (Index i = im + 2; i <= iu; ++i) {
|
|
512
|
+
m_matT.coeffRef(i, i - 2) = Scalar(0);
|
|
513
|
+
if (i > im + 2) m_matT.coeffRef(i, i - 3) = Scalar(0);
|
|
553
514
|
}
|
|
554
515
|
}
|
|
555
516
|
|
|
556
|
-
}
|
|
517
|
+
} // end namespace Eigen
|
|
557
518
|
|
|
558
|
-
#endif
|
|
519
|
+
#endif // EIGEN_REAL_SCHUR_H
|