@smake/eigen 1.0.2 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/eigen/Eigen/AccelerateSupport +52 -0
- package/eigen/Eigen/Cholesky +18 -21
- package/eigen/Eigen/CholmodSupport +28 -28
- package/eigen/Eigen/Core +235 -326
- package/eigen/Eigen/Eigenvalues +16 -14
- package/eigen/Eigen/Geometry +21 -24
- package/eigen/Eigen/Householder +9 -8
- package/eigen/Eigen/IterativeLinearSolvers +8 -4
- package/eigen/Eigen/Jacobi +14 -14
- package/eigen/Eigen/KLUSupport +43 -0
- package/eigen/Eigen/LU +16 -20
- package/eigen/Eigen/MetisSupport +12 -12
- package/eigen/Eigen/OrderingMethods +54 -54
- package/eigen/Eigen/PaStiXSupport +23 -20
- package/eigen/Eigen/PardisoSupport +17 -14
- package/eigen/Eigen/QR +18 -21
- package/eigen/Eigen/QtAlignedMalloc +5 -13
- package/eigen/Eigen/SPQRSupport +21 -14
- package/eigen/Eigen/SVD +23 -18
- package/eigen/Eigen/Sparse +1 -4
- package/eigen/Eigen/SparseCholesky +18 -23
- package/eigen/Eigen/SparseCore +18 -17
- package/eigen/Eigen/SparseLU +12 -8
- package/eigen/Eigen/SparseQR +16 -14
- package/eigen/Eigen/StdDeque +5 -2
- package/eigen/Eigen/StdList +5 -2
- package/eigen/Eigen/StdVector +5 -2
- package/eigen/Eigen/SuperLUSupport +30 -24
- package/eigen/Eigen/ThreadPool +80 -0
- package/eigen/Eigen/UmfPackSupport +19 -17
- package/eigen/Eigen/Version +14 -0
- package/eigen/Eigen/src/AccelerateSupport/AccelerateSupport.h +423 -0
- package/eigen/Eigen/src/AccelerateSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Cholesky/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Cholesky/LDLT.h +377 -401
- package/eigen/Eigen/src/Cholesky/LLT.h +332 -360
- package/eigen/Eigen/src/Cholesky/LLT_LAPACKE.h +81 -56
- package/eigen/Eigen/src/CholmodSupport/CholmodSupport.h +620 -521
- package/eigen/Eigen/src/CholmodSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Core/ArithmeticSequence.h +239 -0
- package/eigen/Eigen/src/Core/Array.h +341 -294
- package/eigen/Eigen/src/Core/ArrayBase.h +190 -203
- package/eigen/Eigen/src/Core/ArrayWrapper.h +127 -171
- package/eigen/Eigen/src/Core/Assign.h +30 -40
- package/eigen/Eigen/src/Core/AssignEvaluator.h +711 -589
- package/eigen/Eigen/src/Core/Assign_MKL.h +130 -125
- package/eigen/Eigen/src/Core/BandMatrix.h +268 -283
- package/eigen/Eigen/src/Core/Block.h +375 -398
- package/eigen/Eigen/src/Core/CommaInitializer.h +86 -97
- package/eigen/Eigen/src/Core/ConditionEstimator.h +51 -53
- package/eigen/Eigen/src/Core/CoreEvaluators.h +1356 -1026
- package/eigen/Eigen/src/Core/CoreIterators.h +73 -59
- package/eigen/Eigen/src/Core/CwiseBinaryOp.h +114 -132
- package/eigen/Eigen/src/Core/CwiseNullaryOp.h +726 -617
- package/eigen/Eigen/src/Core/CwiseTernaryOp.h +77 -103
- package/eigen/Eigen/src/Core/CwiseUnaryOp.h +56 -68
- package/eigen/Eigen/src/Core/CwiseUnaryView.h +132 -95
- package/eigen/Eigen/src/Core/DenseBase.h +632 -571
- package/eigen/Eigen/src/Core/DenseCoeffsBase.h +511 -624
- package/eigen/Eigen/src/Core/DenseStorage.h +512 -509
- package/eigen/Eigen/src/Core/DeviceWrapper.h +153 -0
- package/eigen/Eigen/src/Core/Diagonal.h +169 -210
- package/eigen/Eigen/src/Core/DiagonalMatrix.h +351 -274
- package/eigen/Eigen/src/Core/DiagonalProduct.h +12 -10
- package/eigen/Eigen/src/Core/Dot.h +172 -222
- package/eigen/Eigen/src/Core/EigenBase.h +75 -85
- package/eigen/Eigen/src/Core/Fill.h +138 -0
- package/eigen/Eigen/src/Core/FindCoeff.h +464 -0
- package/eigen/Eigen/src/Core/ForceAlignedAccess.h +90 -109
- package/eigen/Eigen/src/Core/Fuzzy.h +82 -105
- package/eigen/Eigen/src/Core/GeneralProduct.h +327 -263
- package/eigen/Eigen/src/Core/GenericPacketMath.h +1472 -360
- package/eigen/Eigen/src/Core/GlobalFunctions.h +194 -151
- package/eigen/Eigen/src/Core/IO.h +147 -139
- package/eigen/Eigen/src/Core/IndexedView.h +321 -0
- package/eigen/Eigen/src/Core/InnerProduct.h +260 -0
- package/eigen/Eigen/src/Core/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Core/Inverse.h +56 -66
- package/eigen/Eigen/src/Core/Map.h +124 -142
- package/eigen/Eigen/src/Core/MapBase.h +256 -281
- package/eigen/Eigen/src/Core/MathFunctions.h +1620 -938
- package/eigen/Eigen/src/Core/MathFunctionsImpl.h +233 -71
- package/eigen/Eigen/src/Core/Matrix.h +491 -416
- package/eigen/Eigen/src/Core/MatrixBase.h +468 -453
- package/eigen/Eigen/src/Core/NestByValue.h +66 -85
- package/eigen/Eigen/src/Core/NoAlias.h +79 -85
- package/eigen/Eigen/src/Core/NumTraits.h +235 -148
- package/eigen/Eigen/src/Core/PartialReduxEvaluator.h +253 -0
- package/eigen/Eigen/src/Core/PermutationMatrix.h +461 -511
- package/eigen/Eigen/src/Core/PlainObjectBase.h +871 -894
- package/eigen/Eigen/src/Core/Product.h +260 -139
- package/eigen/Eigen/src/Core/ProductEvaluators.h +863 -714
- package/eigen/Eigen/src/Core/Random.h +161 -136
- package/eigen/Eigen/src/Core/RandomImpl.h +262 -0
- package/eigen/Eigen/src/Core/RealView.h +250 -0
- package/eigen/Eigen/src/Core/Redux.h +366 -336
- package/eigen/Eigen/src/Core/Ref.h +308 -209
- package/eigen/Eigen/src/Core/Replicate.h +94 -106
- package/eigen/Eigen/src/Core/Reshaped.h +398 -0
- package/eigen/Eigen/src/Core/ReturnByValue.h +49 -55
- package/eigen/Eigen/src/Core/Reverse.h +136 -145
- package/eigen/Eigen/src/Core/Select.h +70 -140
- package/eigen/Eigen/src/Core/SelfAdjointView.h +262 -285
- package/eigen/Eigen/src/Core/SelfCwiseBinaryOp.h +23 -20
- package/eigen/Eigen/src/Core/SkewSymmetricMatrix3.h +382 -0
- package/eigen/Eigen/src/Core/Solve.h +97 -111
- package/eigen/Eigen/src/Core/SolveTriangular.h +131 -129
- package/eigen/Eigen/src/Core/SolverBase.h +138 -101
- package/eigen/Eigen/src/Core/StableNorm.h +156 -160
- package/eigen/Eigen/src/Core/StlIterators.h +619 -0
- package/eigen/Eigen/src/Core/Stride.h +91 -88
- package/eigen/Eigen/src/Core/Swap.h +70 -38
- package/eigen/Eigen/src/Core/Transpose.h +295 -273
- package/eigen/Eigen/src/Core/Transpositions.h +272 -317
- package/eigen/Eigen/src/Core/TriangularMatrix.h +670 -755
- package/eigen/Eigen/src/Core/VectorBlock.h +59 -72
- package/eigen/Eigen/src/Core/VectorwiseOp.h +668 -630
- package/eigen/Eigen/src/Core/Visitor.h +480 -216
- package/eigen/Eigen/src/Core/arch/AVX/Complex.h +407 -293
- package/eigen/Eigen/src/Core/arch/AVX/MathFunctions.h +79 -388
- package/eigen/Eigen/src/Core/arch/AVX/PacketMath.h +2935 -491
- package/eigen/Eigen/src/Core/arch/AVX/Reductions.h +353 -0
- package/eigen/Eigen/src/Core/arch/AVX/TypeCasting.h +279 -22
- package/eigen/Eigen/src/Core/arch/AVX512/Complex.h +472 -0
- package/eigen/Eigen/src/Core/arch/AVX512/GemmKernel.h +1245 -0
- package/eigen/Eigen/src/Core/arch/AVX512/MathFunctions.h +85 -333
- package/eigen/Eigen/src/Core/arch/AVX512/MathFunctionsFP16.h +75 -0
- package/eigen/Eigen/src/Core/arch/AVX512/PacketMath.h +2490 -649
- package/eigen/Eigen/src/Core/arch/AVX512/PacketMathFP16.h +1413 -0
- package/eigen/Eigen/src/Core/arch/AVX512/Reductions.h +297 -0
- package/eigen/Eigen/src/Core/arch/AVX512/TrsmKernel.h +1167 -0
- package/eigen/Eigen/src/Core/arch/AVX512/TrsmUnrolls.inc +1219 -0
- package/eigen/Eigen/src/Core/arch/AVX512/TypeCasting.h +277 -0
- package/eigen/Eigen/src/Core/arch/AVX512/TypeCastingFP16.h +130 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/Complex.h +521 -298
- package/eigen/Eigen/src/Core/arch/AltiVec/MathFunctions.h +39 -280
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProduct.h +3686 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h +205 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductMMA.h +901 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductMMAbfloat16.h +742 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixVectorProduct.inc +2818 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/PacketMath.h +3391 -723
- package/eigen/Eigen/src/Core/arch/AltiVec/TypeCasting.h +153 -0
- package/eigen/Eigen/src/Core/arch/Default/BFloat16.h +866 -0
- package/eigen/Eigen/src/Core/arch/Default/ConjHelper.h +113 -14
- package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h +2634 -0
- package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h +227 -0
- package/eigen/Eigen/src/Core/arch/Default/Half.h +1091 -0
- package/eigen/Eigen/src/Core/arch/Default/Settings.h +11 -13
- package/eigen/Eigen/src/Core/arch/GPU/Complex.h +244 -0
- package/eigen/Eigen/src/Core/arch/GPU/MathFunctions.h +104 -0
- package/eigen/Eigen/src/Core/arch/GPU/PacketMath.h +1712 -0
- package/eigen/Eigen/src/Core/arch/GPU/Tuple.h +268 -0
- package/eigen/Eigen/src/Core/arch/GPU/TypeCasting.h +77 -0
- package/eigen/Eigen/src/Core/arch/HIP/hcc/math_constants.h +23 -0
- package/eigen/Eigen/src/Core/arch/HVX/PacketMath.h +1088 -0
- package/eigen/Eigen/src/Core/arch/LSX/Complex.h +520 -0
- package/eigen/Eigen/src/Core/arch/LSX/GeneralBlockPanelKernel.h +23 -0
- package/eigen/Eigen/src/Core/arch/LSX/MathFunctions.h +43 -0
- package/eigen/Eigen/src/Core/arch/LSX/PacketMath.h +2866 -0
- package/eigen/Eigen/src/Core/arch/LSX/TypeCasting.h +526 -0
- package/eigen/Eigen/src/Core/arch/MSA/Complex.h +620 -0
- package/eigen/Eigen/src/Core/arch/MSA/MathFunctions.h +379 -0
- package/eigen/Eigen/src/Core/arch/MSA/PacketMath.h +1237 -0
- package/eigen/Eigen/src/Core/arch/NEON/Complex.h +531 -289
- package/eigen/Eigen/src/Core/arch/NEON/GeneralBlockPanelKernel.h +243 -0
- package/eigen/Eigen/src/Core/arch/NEON/MathFunctions.h +50 -73
- package/eigen/Eigen/src/Core/arch/NEON/PacketMath.h +5915 -579
- package/eigen/Eigen/src/Core/arch/NEON/TypeCasting.h +1642 -0
- package/eigen/Eigen/src/Core/arch/NEON/UnaryFunctors.h +57 -0
- package/eigen/Eigen/src/Core/arch/SSE/Complex.h +366 -334
- package/eigen/Eigen/src/Core/arch/SSE/MathFunctions.h +40 -514
- package/eigen/Eigen/src/Core/arch/SSE/PacketMath.h +2164 -675
- package/eigen/Eigen/src/Core/arch/SSE/Reductions.h +324 -0
- package/eigen/Eigen/src/Core/arch/SSE/TypeCasting.h +188 -35
- package/eigen/Eigen/src/Core/arch/SVE/MathFunctions.h +48 -0
- package/eigen/Eigen/src/Core/arch/SVE/PacketMath.h +674 -0
- package/eigen/Eigen/src/Core/arch/SVE/TypeCasting.h +52 -0
- package/eigen/Eigen/src/Core/arch/SYCL/InteropHeaders.h +227 -0
- package/eigen/Eigen/src/Core/arch/SYCL/MathFunctions.h +303 -0
- package/eigen/Eigen/src/Core/arch/SYCL/PacketMath.h +576 -0
- package/eigen/Eigen/src/Core/arch/SYCL/TypeCasting.h +83 -0
- package/eigen/Eigen/src/Core/arch/ZVector/Complex.h +434 -261
- package/eigen/Eigen/src/Core/arch/ZVector/MathFunctions.h +160 -53
- package/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h +1073 -605
- package/eigen/Eigen/src/Core/functors/AssignmentFunctors.h +123 -117
- package/eigen/Eigen/src/Core/functors/BinaryFunctors.h +594 -322
- package/eigen/Eigen/src/Core/functors/NullaryFunctors.h +204 -118
- package/eigen/Eigen/src/Core/functors/StlFunctors.h +110 -97
- package/eigen/Eigen/src/Core/functors/TernaryFunctors.h +34 -7
- package/eigen/Eigen/src/Core/functors/UnaryFunctors.h +1158 -530
- package/eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h +2329 -1333
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix.h +328 -364
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +191 -178
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h +85 -82
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix_BLAS.h +154 -73
- package/eigen/Eigen/src/Core/products/GeneralMatrixVector.h +396 -542
- package/eigen/Eigen/src/Core/products/GeneralMatrixVector_BLAS.h +80 -77
- package/eigen/Eigen/src/Core/products/Parallelizer.h +208 -92
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +331 -375
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix_BLAS.h +206 -224
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixVector.h +139 -146
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixVector_BLAS.h +58 -61
- package/eigen/Eigen/src/Core/products/SelfadjointProduct.h +71 -71
- package/eigen/Eigen/src/Core/products/SelfadjointRank2Update.h +48 -46
- package/eigen/Eigen/src/Core/products/TriangularMatrixMatrix.h +294 -369
- package/eigen/Eigen/src/Core/products/TriangularMatrixMatrix_BLAS.h +246 -238
- package/eigen/Eigen/src/Core/products/TriangularMatrixVector.h +244 -247
- package/eigen/Eigen/src/Core/products/TriangularMatrixVector_BLAS.h +212 -192
- package/eigen/Eigen/src/Core/products/TriangularSolverMatrix.h +328 -275
- package/eigen/Eigen/src/Core/products/TriangularSolverMatrix_BLAS.h +108 -109
- package/eigen/Eigen/src/Core/products/TriangularSolverVector.h +70 -93
- package/eigen/Eigen/src/Core/util/Assert.h +158 -0
- package/eigen/Eigen/src/Core/util/BlasUtil.h +413 -290
- package/eigen/Eigen/src/Core/util/ConfigureVectorization.h +543 -0
- package/eigen/Eigen/src/Core/util/Constants.h +314 -263
- package/eigen/Eigen/src/Core/util/DisableStupidWarnings.h +130 -78
- package/eigen/Eigen/src/Core/util/EmulateArray.h +270 -0
- package/eigen/Eigen/src/Core/util/ForwardDeclarations.h +450 -224
- package/eigen/Eigen/src/Core/util/GpuHipCudaDefines.inc +101 -0
- package/eigen/Eigen/src/Core/util/GpuHipCudaUndefines.inc +45 -0
- package/eigen/Eigen/src/Core/util/IndexedViewHelper.h +487 -0
- package/eigen/Eigen/src/Core/util/IntegralConstant.h +279 -0
- package/eigen/Eigen/src/Core/util/MKL_support.h +39 -30
- package/eigen/Eigen/src/Core/util/Macros.h +939 -646
- package/eigen/Eigen/src/Core/util/MaxSizeVector.h +139 -0
- package/eigen/Eigen/src/Core/util/Memory.h +1042 -650
- package/eigen/Eigen/src/Core/util/Meta.h +618 -426
- package/eigen/Eigen/src/Core/util/MoreMeta.h +638 -0
- package/eigen/Eigen/src/Core/util/ReenableStupidWarnings.h +32 -19
- package/eigen/Eigen/src/Core/util/ReshapedHelper.h +51 -0
- package/eigen/Eigen/src/Core/util/Serializer.h +209 -0
- package/eigen/Eigen/src/Core/util/StaticAssert.h +51 -164
- package/eigen/Eigen/src/Core/util/SymbolicIndex.h +445 -0
- package/eigen/Eigen/src/Core/util/XprHelper.h +793 -538
- package/eigen/Eigen/src/Eigenvalues/ComplexEigenSolver.h +246 -277
- package/eigen/Eigen/src/Eigenvalues/ComplexSchur.h +299 -319
- package/eigen/Eigen/src/Eigenvalues/ComplexSchur_LAPACKE.h +52 -48
- package/eigen/Eigen/src/Eigenvalues/EigenSolver.h +413 -456
- package/eigen/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h +309 -325
- package/eigen/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h +157 -171
- package/eigen/Eigen/src/Eigenvalues/HessenbergDecomposition.h +292 -310
- package/eigen/Eigen/src/Eigenvalues/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h +91 -107
- package/eigen/Eigen/src/Eigenvalues/RealQZ.h +539 -606
- package/eigen/Eigen/src/Eigenvalues/RealSchur.h +348 -382
- package/eigen/Eigen/src/Eigenvalues/RealSchur_LAPACKE.h +41 -35
- package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +579 -600
- package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_LAPACKE.h +47 -44
- package/eigen/Eigen/src/Eigenvalues/Tridiagonalization.h +434 -461
- package/eigen/Eigen/src/Geometry/AlignedBox.h +307 -214
- package/eigen/Eigen/src/Geometry/AngleAxis.h +135 -137
- package/eigen/Eigen/src/Geometry/EulerAngles.h +163 -74
- package/eigen/Eigen/src/Geometry/Homogeneous.h +289 -333
- package/eigen/Eigen/src/Geometry/Hyperplane.h +152 -161
- package/eigen/Eigen/src/Geometry/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Geometry/OrthoMethods.h +168 -145
- package/eigen/Eigen/src/Geometry/ParametrizedLine.h +141 -104
- package/eigen/Eigen/src/Geometry/Quaternion.h +595 -497
- package/eigen/Eigen/src/Geometry/Rotation2D.h +110 -108
- package/eigen/Eigen/src/Geometry/RotationBase.h +148 -145
- package/eigen/Eigen/src/Geometry/Scaling.h +115 -90
- package/eigen/Eigen/src/Geometry/Transform.h +896 -953
- package/eigen/Eigen/src/Geometry/Translation.h +100 -98
- package/eigen/Eigen/src/Geometry/Umeyama.h +79 -84
- package/eigen/Eigen/src/Geometry/arch/Geometry_SIMD.h +154 -0
- package/eigen/Eigen/src/Householder/BlockHouseholder.h +54 -42
- package/eigen/Eigen/src/Householder/Householder.h +104 -122
- package/eigen/Eigen/src/Householder/HouseholderSequence.h +416 -382
- package/eigen/Eigen/src/Householder/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +153 -166
- package/eigen/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +127 -138
- package/eigen/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +95 -124
- package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h +269 -267
- package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h +246 -259
- package/eigen/Eigen/src/IterativeLinearSolvers/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +218 -217
- package/eigen/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h +80 -103
- package/eigen/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h +59 -63
- package/eigen/Eigen/src/Jacobi/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Jacobi/Jacobi.h +256 -291
- package/eigen/Eigen/src/KLUSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/KLUSupport/KLUSupport.h +339 -0
- package/eigen/Eigen/src/LU/Determinant.h +60 -63
- package/eigen/Eigen/src/LU/FullPivLU.h +561 -626
- package/eigen/Eigen/src/LU/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/LU/InverseImpl.h +213 -275
- package/eigen/Eigen/src/LU/PartialPivLU.h +407 -435
- package/eigen/Eigen/src/LU/PartialPivLU_LAPACKE.h +54 -40
- package/eigen/Eigen/src/LU/arch/InverseSize4.h +353 -0
- package/eigen/Eigen/src/MetisSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/MetisSupport/MetisSupport.h +81 -93
- package/eigen/Eigen/src/OrderingMethods/Amd.h +250 -282
- package/eigen/Eigen/src/OrderingMethods/Eigen_Colamd.h +950 -1103
- package/eigen/Eigen/src/OrderingMethods/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/OrderingMethods/Ordering.h +111 -122
- package/eigen/Eigen/src/PaStiXSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/PaStiXSupport/PaStiXSupport.h +524 -570
- package/eigen/Eigen/src/PardisoSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/PardisoSupport/PardisoSupport.h +385 -429
- package/eigen/Eigen/src/QR/ColPivHouseholderQR.h +494 -473
- package/eigen/Eigen/src/QR/ColPivHouseholderQR_LAPACKE.h +120 -56
- package/eigen/Eigen/src/QR/CompleteOrthogonalDecomposition.h +223 -137
- package/eigen/Eigen/src/QR/FullPivHouseholderQR.h +517 -460
- package/eigen/Eigen/src/QR/HouseholderQR.h +412 -278
- package/eigen/Eigen/src/QR/HouseholderQR_LAPACKE.h +32 -23
- package/eigen/Eigen/src/QR/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SPQRSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h +263 -261
- package/eigen/Eigen/src/SVD/BDCSVD.h +872 -679
- package/eigen/Eigen/src/SVD/BDCSVD_LAPACKE.h +174 -0
- package/eigen/Eigen/src/SVD/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SVD/JacobiSVD.h +585 -543
- package/eigen/Eigen/src/SVD/JacobiSVD_LAPACKE.h +85 -49
- package/eigen/Eigen/src/SVD/SVDBase.h +281 -160
- package/eigen/Eigen/src/SVD/UpperBidiagonalization.h +202 -237
- package/eigen/Eigen/src/SparseCholesky/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky.h +769 -590
- package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h +318 -129
- package/eigen/Eigen/src/SparseCore/AmbiVector.h +202 -251
- package/eigen/Eigen/src/SparseCore/CompressedStorage.h +184 -236
- package/eigen/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h +140 -184
- package/eigen/Eigen/src/SparseCore/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SparseCore/SparseAssign.h +174 -111
- package/eigen/Eigen/src/SparseCore/SparseBlock.h +408 -477
- package/eigen/Eigen/src/SparseCore/SparseColEtree.h +100 -112
- package/eigen/Eigen/src/SparseCore/SparseCompressedBase.h +531 -280
- package/eigen/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +559 -347
- package/eigen/Eigen/src/SparseCore/SparseCwiseUnaryOp.h +100 -108
- package/eigen/Eigen/src/SparseCore/SparseDenseProduct.h +185 -191
- package/eigen/Eigen/src/SparseCore/SparseDiagonalProduct.h +71 -71
- package/eigen/Eigen/src/SparseCore/SparseDot.h +49 -47
- package/eigen/Eigen/src/SparseCore/SparseFuzzy.h +13 -11
- package/eigen/Eigen/src/SparseCore/SparseMap.h +243 -253
- package/eigen/Eigen/src/SparseCore/SparseMatrix.h +1614 -1142
- package/eigen/Eigen/src/SparseCore/SparseMatrixBase.h +403 -357
- package/eigen/Eigen/src/SparseCore/SparsePermutation.h +186 -115
- package/eigen/Eigen/src/SparseCore/SparseProduct.h +100 -91
- package/eigen/Eigen/src/SparseCore/SparseRedux.h +22 -24
- package/eigen/Eigen/src/SparseCore/SparseRef.h +268 -295
- package/eigen/Eigen/src/SparseCore/SparseSelfAdjointView.h +371 -414
- package/eigen/Eigen/src/SparseCore/SparseSolverBase.h +78 -87
- package/eigen/Eigen/src/SparseCore/SparseSparseProductWithPruning.h +81 -95
- package/eigen/Eigen/src/SparseCore/SparseTranspose.h +62 -71
- package/eigen/Eigen/src/SparseCore/SparseTriangularView.h +132 -144
- package/eigen/Eigen/src/SparseCore/SparseUtil.h +146 -115
- package/eigen/Eigen/src/SparseCore/SparseVector.h +426 -372
- package/eigen/Eigen/src/SparseCore/SparseView.h +164 -193
- package/eigen/Eigen/src/SparseCore/TriangularSolver.h +129 -170
- package/eigen/Eigen/src/SparseLU/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SparseLU/SparseLU.h +814 -618
- package/eigen/Eigen/src/SparseLU/SparseLUImpl.h +61 -48
- package/eigen/Eigen/src/SparseLU/SparseLU_Memory.h +102 -118
- package/eigen/Eigen/src/SparseLU/SparseLU_Structs.h +38 -35
- package/eigen/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h +273 -255
- package/eigen/Eigen/src/SparseLU/SparseLU_Utils.h +44 -49
- package/eigen/Eigen/src/SparseLU/SparseLU_column_bmod.h +104 -108
- package/eigen/Eigen/src/SparseLU/SparseLU_column_dfs.h +90 -101
- package/eigen/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h +57 -58
- package/eigen/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h +43 -55
- package/eigen/Eigen/src/SparseLU/SparseLU_kernel_bmod.h +74 -71
- package/eigen/Eigen/src/SparseLU/SparseLU_panel_bmod.h +125 -133
- package/eigen/Eigen/src/SparseLU/SparseLU_panel_dfs.h +136 -159
- package/eigen/Eigen/src/SparseLU/SparseLU_pivotL.h +51 -52
- package/eigen/Eigen/src/SparseLU/SparseLU_pruneL.h +67 -73
- package/eigen/Eigen/src/SparseLU/SparseLU_relax_snode.h +24 -26
- package/eigen/Eigen/src/SparseQR/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SparseQR/SparseQR.h +451 -490
- package/eigen/Eigen/src/StlSupport/StdDeque.h +28 -105
- package/eigen/Eigen/src/StlSupport/StdList.h +28 -84
- package/eigen/Eigen/src/StlSupport/StdVector.h +28 -108
- package/eigen/Eigen/src/StlSupport/details.h +48 -50
- package/eigen/Eigen/src/SuperLUSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SuperLUSupport/SuperLUSupport.h +634 -732
- package/eigen/Eigen/src/ThreadPool/Barrier.h +70 -0
- package/eigen/Eigen/src/ThreadPool/CoreThreadPoolDevice.h +336 -0
- package/eigen/Eigen/src/ThreadPool/EventCount.h +241 -0
- package/eigen/Eigen/src/ThreadPool/ForkJoin.h +140 -0
- package/eigen/Eigen/src/ThreadPool/InternalHeaderCheck.h +4 -0
- package/eigen/Eigen/src/ThreadPool/NonBlockingThreadPool.h +587 -0
- package/eigen/Eigen/src/ThreadPool/RunQueue.h +230 -0
- package/eigen/Eigen/src/ThreadPool/ThreadCancel.h +21 -0
- package/eigen/Eigen/src/ThreadPool/ThreadEnvironment.h +43 -0
- package/eigen/Eigen/src/ThreadPool/ThreadLocal.h +289 -0
- package/eigen/Eigen/src/ThreadPool/ThreadPoolInterface.h +50 -0
- package/eigen/Eigen/src/ThreadPool/ThreadYield.h +16 -0
- package/eigen/Eigen/src/UmfPackSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/UmfPackSupport/UmfPackSupport.h +480 -380
- package/eigen/Eigen/src/misc/Image.h +41 -43
- package/eigen/Eigen/src/misc/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/misc/Kernel.h +39 -41
- package/eigen/Eigen/src/misc/RealSvd2x2.h +19 -21
- package/eigen/Eigen/src/misc/blas.h +83 -426
- package/eigen/Eigen/src/misc/lapacke.h +9976 -16182
- package/eigen/Eigen/src/misc/lapacke_helpers.h +163 -0
- package/eigen/Eigen/src/misc/lapacke_mangling.h +4 -5
- package/eigen/Eigen/src/plugins/ArrayCwiseBinaryOps.inc +344 -0
- package/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.inc +544 -0
- package/eigen/Eigen/src/plugins/BlockMethods.inc +1370 -0
- package/eigen/Eigen/src/plugins/CommonCwiseBinaryOps.inc +116 -0
- package/eigen/Eigen/src/plugins/CommonCwiseUnaryOps.inc +167 -0
- package/eigen/Eigen/src/plugins/IndexedViewMethods.inc +192 -0
- package/eigen/Eigen/src/plugins/InternalHeaderCheck.inc +3 -0
- package/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.inc +331 -0
- package/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.inc +118 -0
- package/eigen/Eigen/src/plugins/ReshapedMethods.inc +133 -0
- package/lib/LibEigen.d.ts +4 -0
- package/lib/LibEigen.js +14 -0
- package/lib/index.d.ts +1 -1
- package/lib/index.js +7 -3
- package/package.json +2 -10
- package/eigen/Eigen/CMakeLists.txt +0 -19
- package/eigen/Eigen/src/Core/BooleanRedux.h +0 -164
- package/eigen/Eigen/src/Core/arch/CUDA/Complex.h +0 -103
- package/eigen/Eigen/src/Core/arch/CUDA/Half.h +0 -675
- package/eigen/Eigen/src/Core/arch/CUDA/MathFunctions.h +0 -91
- package/eigen/Eigen/src/Core/arch/CUDA/PacketMath.h +0 -333
- package/eigen/Eigen/src/Core/arch/CUDA/PacketMathHalf.h +0 -1124
- package/eigen/Eigen/src/Core/arch/CUDA/TypeCasting.h +0 -212
- package/eigen/Eigen/src/Core/util/NonMPL2.h +0 -3
- package/eigen/Eigen/src/Geometry/arch/Geometry_SSE.h +0 -161
- package/eigen/Eigen/src/LU/arch/Inverse_SSE.h +0 -338
- package/eigen/Eigen/src/SparseCore/MappedSparseMatrix.h +0 -67
- package/eigen/Eigen/src/SparseLU/SparseLU_gemm_kernel.h +0 -280
- package/eigen/Eigen/src/misc/lapack.h +0 -152
- package/eigen/Eigen/src/plugins/ArrayCwiseBinaryOps.h +0 -332
- package/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.h +0 -552
- package/eigen/Eigen/src/plugins/BlockMethods.h +0 -1058
- package/eigen/Eigen/src/plugins/CommonCwiseBinaryOps.h +0 -115
- package/eigen/Eigen/src/plugins/CommonCwiseUnaryOps.h +0 -163
- package/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.h +0 -152
- package/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.h +0 -85
- package/lib/eigen.d.ts +0 -2
- package/lib/eigen.js +0 -15
|
@@ -13,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 succesful, \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,69 +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
|
-
// Step 2. Reduce to real Schur form
|
|
274
|
-
|
|
262
|
+
// Step 2. Reduce to real Schur form
|
|
263
|
+
// Note: we copy m_hess.matrixQ() into m_matU here and not in computeFromHessenberg
|
|
264
|
+
// to be able to pass our working-space buffer for the Householder to Dense evaluation.
|
|
265
|
+
m_workspaceVector.resize(matrix.cols());
|
|
266
|
+
if (computeU) m_hess.matrixQ().evalTo(m_matU, m_workspaceVector);
|
|
267
|
+
computeFromHessenberg(m_hess.matrixH(), m_matU, computeU);
|
|
275
268
|
|
|
276
269
|
m_matT *= scale;
|
|
277
|
-
|
|
270
|
+
|
|
278
271
|
return *this;
|
|
279
272
|
}
|
|
280
|
-
template<typename MatrixType>
|
|
281
|
-
template<typename HessMatrixType, typename OrthMatrixType>
|
|
282
|
-
RealSchur<MatrixType>& RealSchur<MatrixType>::computeFromHessenberg(const HessMatrixType& matrixH,
|
|
283
|
-
{
|
|
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) {
|
|
284
277
|
using std::abs;
|
|
285
278
|
|
|
286
279
|
m_matT = matrixH;
|
|
287
|
-
if(computeU)
|
|
288
|
-
m_matU = matrixQ;
|
|
289
|
-
|
|
290
|
-
Index maxIters = m_maxIters;
|
|
291
|
-
if (maxIters == -1)
|
|
292
|
-
maxIters = m_maxIterationsPerRow * matrixH.rows();
|
|
293
280
|
m_workspaceVector.resize(m_matT.cols());
|
|
281
|
+
if (computeU && !internal::is_same_dense(m_matU, matrixQ)) m_matU = matrixQ;
|
|
282
|
+
|
|
283
|
+
Index maxIters = m_maxIters;
|
|
284
|
+
if (maxIters == -1) maxIters = m_maxIterationsPerRow * matrixH.rows();
|
|
294
285
|
Scalar* workspace = &m_workspaceVector.coeffRef(0);
|
|
295
286
|
|
|
296
|
-
// The matrix m_matT is divided in three parts.
|
|
297
|
-
// 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.
|
|
298
289
|
// Rows il,...,iu is the part we are working on (the active window).
|
|
299
290
|
// Rows iu+1,...,end are already brought in triangular form.
|
|
300
291
|
Index iu = m_matT.cols() - 1;
|
|
301
|
-
Index iter = 0;
|
|
302
|
-
Index totalIter = 0;
|
|
303
|
-
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
|
|
304
295
|
Scalar norm = computeNormOfT();
|
|
305
296
|
// sub-diagonal entries smaller than considerAsZero will be treated as zero.
|
|
306
297
|
// We use eps^2 to enable more precision in small eigenvalues.
|
|
307
|
-
Scalar considerAsZero =
|
|
308
|
-
|
|
298
|
+
Scalar considerAsZero =
|
|
299
|
+
numext::maxi<Scalar>(norm * numext::abs2(NumTraits<Scalar>::epsilon()), (std::numeric_limits<Scalar>::min)());
|
|
309
300
|
|
|
310
|
-
if(norm
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
{
|
|
314
|
-
Index il = findSmallSubdiagEntry(iu,considerAsZero);
|
|
301
|
+
if (!numext::is_exactly_zero(norm)) {
|
|
302
|
+
while (iu >= 0) {
|
|
303
|
+
Index il = findSmallSubdiagEntry(iu, considerAsZero);
|
|
315
304
|
|
|
316
305
|
// Check for convergence
|
|
317
|
-
if (il == iu)
|
|
306
|
+
if (il == iu) // One root found
|
|
318
307
|
{
|
|
319
|
-
m_matT.coeffRef(iu,iu) = m_matT.coeff(iu,iu) + exshift;
|
|
320
|
-
if (iu > 0)
|
|
321
|
-
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);
|
|
322
310
|
iu--;
|
|
323
311
|
iter = 0;
|
|
324
|
-
}
|
|
325
|
-
else if (il == iu-1) // Two roots found
|
|
312
|
+
} else if (il == iu - 1) // Two roots found
|
|
326
313
|
{
|
|
327
314
|
splitOffTwoRows(iu, computeU, exshift);
|
|
328
315
|
iu -= 2;
|
|
329
316
|
iter = 0;
|
|
330
|
-
}
|
|
331
|
-
else // No convergence yet
|
|
317
|
+
} else // No convergence yet
|
|
332
318
|
{
|
|
333
|
-
// 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 )
|
|
334
321
|
Vector3s firstHouseholderVector = Vector3s::Zero(), shiftInfo;
|
|
335
322
|
computeShift(iu, iter, exshift, shiftInfo);
|
|
336
323
|
iter = iter + 1;
|
|
@@ -342,7 +329,7 @@ RealSchur<MatrixType>& RealSchur<MatrixType>::computeFromHessenberg(const HessMa
|
|
|
342
329
|
}
|
|
343
330
|
}
|
|
344
331
|
}
|
|
345
|
-
if(totalIter <= maxIters)
|
|
332
|
+
if (totalIter <= maxIters)
|
|
346
333
|
m_info = Success;
|
|
347
334
|
else
|
|
348
335
|
m_info = NoConvergence;
|
|
@@ -353,201 +340,180 @@ RealSchur<MatrixType>& RealSchur<MatrixType>::computeFromHessenberg(const HessMa
|
|
|
353
340
|
}
|
|
354
341
|
|
|
355
342
|
/** \internal Computes and returns vector L1 norm of T */
|
|
356
|
-
template<typename MatrixType>
|
|
357
|
-
inline typename MatrixType::Scalar RealSchur<MatrixType>::computeNormOfT()
|
|
358
|
-
{
|
|
343
|
+
template <typename MatrixType>
|
|
344
|
+
inline typename MatrixType::Scalar RealSchur<MatrixType>::computeNormOfT() {
|
|
359
345
|
const Index size = m_matT.cols();
|
|
360
346
|
// FIXME to be efficient the following would requires a triangular reduxion code
|
|
361
|
-
// Scalar norm = m_matT.upper().cwiseAbs().sum()
|
|
347
|
+
// Scalar norm = m_matT.upper().cwiseAbs().sum()
|
|
362
348
|
// + m_matT.bottomLeftCorner(size-1,size-1).diagonal().cwiseAbs().sum();
|
|
363
349
|
Scalar norm(0);
|
|
364
|
-
for (Index j = 0; j < size; ++j)
|
|
365
|
-
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();
|
|
366
351
|
return norm;
|
|
367
352
|
}
|
|
368
353
|
|
|
369
354
|
/** \internal Look for single small sub-diagonal element and returns its index */
|
|
370
|
-
template<typename MatrixType>
|
|
371
|
-
inline Index RealSchur<MatrixType>::findSmallSubdiagEntry(Index iu, const Scalar& considerAsZero)
|
|
372
|
-
{
|
|
355
|
+
template <typename MatrixType>
|
|
356
|
+
inline Index RealSchur<MatrixType>::findSmallSubdiagEntry(Index iu, const Scalar& considerAsZero) {
|
|
373
357
|
using std::abs;
|
|
374
358
|
Index res = iu;
|
|
375
|
-
while (res > 0)
|
|
376
|
-
|
|
377
|
-
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));
|
|
378
361
|
|
|
379
362
|
s = numext::maxi<Scalar>(s * NumTraits<Scalar>::epsilon(), considerAsZero);
|
|
380
|
-
|
|
381
|
-
if (abs(m_matT.coeff(res,res-1)) <= s)
|
|
382
|
-
break;
|
|
363
|
+
|
|
364
|
+
if (abs(m_matT.coeff(res, res - 1)) <= s) break;
|
|
383
365
|
res--;
|
|
384
366
|
}
|
|
385
367
|
return res;
|
|
386
368
|
}
|
|
387
369
|
|
|
388
370
|
/** \internal Update T given that rows iu-1 and iu decouple from the rest. */
|
|
389
|
-
template<typename MatrixType>
|
|
390
|
-
inline void RealSchur<MatrixType>::splitOffTwoRows(Index iu, bool computeU, const Scalar& exshift)
|
|
391
|
-
{
|
|
392
|
-
using std::sqrt;
|
|
371
|
+
template <typename MatrixType>
|
|
372
|
+
inline void RealSchur<MatrixType>::splitOffTwoRows(Index iu, bool computeU, const Scalar& exshift) {
|
|
393
373
|
using std::abs;
|
|
374
|
+
using std::sqrt;
|
|
394
375
|
const Index size = m_matT.cols();
|
|
395
376
|
|
|
396
|
-
// The eigenvalues of the 2x2 matrix [a b; c d] are
|
|
377
|
+
// The eigenvalues of the 2x2 matrix [a b; c d] are
|
|
397
378
|
// trace +/- sqrt(discr/4) where discr = tr^2 - 4*det, tr = a + d, det = ad - bc
|
|
398
|
-
Scalar p = Scalar(0.5) * (m_matT.coeff(iu-1,iu-1) - m_matT.coeff(iu,iu));
|
|
399
|
-
Scalar q = p * p + m_matT.coeff(iu,iu-1) * m_matT.coeff(iu-1,iu);
|
|
400
|
-
m_matT.coeffRef(iu,iu) += exshift;
|
|
401
|
-
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;
|
|
402
383
|
|
|
403
|
-
if (q >= Scalar(0))
|
|
384
|
+
if (q >= Scalar(0)) // Two real eigenvalues
|
|
404
385
|
{
|
|
405
386
|
Scalar z = sqrt(abs(q));
|
|
406
387
|
JacobiRotation<Scalar> rot;
|
|
407
388
|
if (p >= Scalar(0))
|
|
408
|
-
rot.makeGivens(p + z, m_matT.coeff(iu, iu-1));
|
|
389
|
+
rot.makeGivens(p + z, m_matT.coeff(iu, iu - 1));
|
|
409
390
|
else
|
|
410
|
-
rot.makeGivens(p - z, m_matT.coeff(iu, iu-1));
|
|
391
|
+
rot.makeGivens(p - z, m_matT.coeff(iu, iu - 1));
|
|
411
392
|
|
|
412
|
-
m_matT.rightCols(size-iu+1).applyOnTheLeft(iu-1, iu, rot.adjoint());
|
|
413
|
-
m_matT.topRows(iu+1).applyOnTheRight(iu-1, iu, rot);
|
|
414
|
-
m_matT.coeffRef(iu, iu-1) = Scalar(0);
|
|
415
|
-
if (computeU)
|
|
416
|
-
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);
|
|
417
397
|
}
|
|
418
398
|
|
|
419
|
-
if (iu > 1)
|
|
420
|
-
m_matT.coeffRef(iu-1, iu-2) = Scalar(0);
|
|
399
|
+
if (iu > 1) m_matT.coeffRef(iu - 1, iu - 2) = Scalar(0);
|
|
421
400
|
}
|
|
422
401
|
|
|
423
402
|
/** \internal Form shift in shiftInfo, and update exshift if an exceptional shift is performed. */
|
|
424
|
-
template<typename MatrixType>
|
|
425
|
-
inline void RealSchur<MatrixType>::computeShift(Index iu, Index iter, Scalar& exshift, Vector3s& shiftInfo)
|
|
426
|
-
{
|
|
427
|
-
using std::sqrt;
|
|
403
|
+
template <typename MatrixType>
|
|
404
|
+
inline void RealSchur<MatrixType>::computeShift(Index iu, Index iter, Scalar& exshift, Vector3s& shiftInfo) {
|
|
428
405
|
using std::abs;
|
|
429
|
-
|
|
430
|
-
shiftInfo.coeffRef(
|
|
431
|
-
shiftInfo.coeffRef(
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
{
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
exshift += s;
|
|
458
|
-
for (Index i = 0; i <= iu; ++i)
|
|
459
|
-
m_matT.coeffRef(i,i) -= s;
|
|
460
|
-
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
|
+
}
|
|
461
434
|
}
|
|
462
435
|
}
|
|
463
436
|
}
|
|
464
437
|
|
|
465
438
|
/** \internal Compute index im at which Francis QR step starts and the first Householder vector. */
|
|
466
|
-
template<typename MatrixType>
|
|
467
|
-
inline void RealSchur<MatrixType>::initFrancisQRStep(Index il, Index iu, const Vector3s& shiftInfo, Index& im,
|
|
468
|
-
{
|
|
439
|
+
template <typename MatrixType>
|
|
440
|
+
inline void RealSchur<MatrixType>::initFrancisQRStep(Index il, Index iu, const Vector3s& shiftInfo, Index& im,
|
|
441
|
+
Vector3s& firstHouseholderVector) {
|
|
469
442
|
using std::abs;
|
|
470
|
-
Vector3s& v = firstHouseholderVector;
|
|
443
|
+
Vector3s& v = firstHouseholderVector; // alias to save typing
|
|
471
444
|
|
|
472
|
-
for (im = iu-2; im >= il; --im)
|
|
473
|
-
|
|
474
|
-
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);
|
|
475
447
|
const Scalar r = shiftInfo.coeff(0) - Tmm;
|
|
476
448
|
const Scalar s = shiftInfo.coeff(1) - Tmm;
|
|
477
|
-
v.coeffRef(0) = (r * s - shiftInfo.coeff(2)) / m_matT.coeff(im+1,im) + m_matT.coeff(im,im+1);
|
|
478
|
-
v.coeffRef(1) = m_matT.coeff(im+1,im+1) - Tmm - r - s;
|
|
479
|
-
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);
|
|
480
452
|
if (im == il) {
|
|
481
453
|
break;
|
|
482
454
|
}
|
|
483
|
-
const Scalar lhs = m_matT.coeff(im,im-1) * (abs(v.coeff(1)) + abs(v.coeff(2)));
|
|
484
|
-
const Scalar rhs = v.coeff(0) * (abs(m_matT.coeff(im-1,im-1)) + abs(Tmm) + abs(m_matT.coeff(im+1,im+1)));
|
|
485
|
-
if (abs(lhs) < NumTraits<Scalar>::epsilon() * rhs)
|
|
486
|
-
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;
|
|
487
458
|
}
|
|
488
459
|
}
|
|
489
460
|
|
|
490
461
|
/** \internal Perform a Francis QR step involving rows il:iu and columns im:iu. */
|
|
491
|
-
template<typename MatrixType>
|
|
492
|
-
inline void RealSchur<MatrixType>::performFrancisQRStep(Index il, Index im, Index iu, bool computeU,
|
|
493
|
-
{
|
|
462
|
+
template <typename MatrixType>
|
|
463
|
+
inline void RealSchur<MatrixType>::performFrancisQRStep(Index il, Index im, Index iu, bool computeU,
|
|
464
|
+
const Vector3s& firstHouseholderVector, Scalar* workspace) {
|
|
494
465
|
eigen_assert(im >= il);
|
|
495
|
-
eigen_assert(im <= iu-2);
|
|
466
|
+
eigen_assert(im <= iu - 2);
|
|
496
467
|
|
|
497
468
|
const Index size = m_matT.cols();
|
|
498
469
|
|
|
499
|
-
for (Index k = im; k <= iu-2; ++k)
|
|
500
|
-
{
|
|
470
|
+
for (Index k = im; k <= iu - 2; ++k) {
|
|
501
471
|
bool firstIteration = (k == im);
|
|
502
472
|
|
|
503
473
|
Vector3s v;
|
|
504
474
|
if (firstIteration)
|
|
505
475
|
v = firstHouseholderVector;
|
|
506
476
|
else
|
|
507
|
-
v = m_matT.template block<3,1>(k,k-1);
|
|
477
|
+
v = m_matT.template block<3, 1>(k, k - 1);
|
|
508
478
|
|
|
509
479
|
Scalar tau, beta;
|
|
510
480
|
Matrix<Scalar, 2, 1> ess;
|
|
511
481
|
v.makeHouseholder(ess, tau, beta);
|
|
512
|
-
|
|
513
|
-
if (beta
|
|
482
|
+
|
|
483
|
+
if (!numext::is_exactly_zero(beta)) // if v is not zero
|
|
514
484
|
{
|
|
515
485
|
if (firstIteration && k > il)
|
|
516
|
-
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);
|
|
517
487
|
else if (!firstIteration)
|
|
518
|
-
m_matT.coeffRef(k,k-1) = beta;
|
|
488
|
+
m_matT.coeffRef(k, k - 1) = beta;
|
|
519
489
|
|
|
520
490
|
// These Householder transformations form the O(n^3) part of the algorithm
|
|
521
|
-
m_matT.block(k, k, 3, size-k).applyHouseholderOnTheLeft(ess, tau, workspace);
|
|
522
|
-
m_matT.block(0, k, (std::min)(iu,k+3) + 1, 3).applyHouseholderOnTheRight(ess, tau, workspace);
|
|
523
|
-
if (computeU)
|
|
524
|
-
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);
|
|
525
494
|
}
|
|
526
495
|
}
|
|
527
496
|
|
|
528
|
-
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);
|
|
529
498
|
Scalar tau, beta;
|
|
530
499
|
Matrix<Scalar, 1, 1> ess;
|
|
531
500
|
v.makeHouseholder(ess, tau, beta);
|
|
532
501
|
|
|
533
|
-
if (beta
|
|
502
|
+
if (!numext::is_exactly_zero(beta)) // if v is not zero
|
|
534
503
|
{
|
|
535
|
-
m_matT.coeffRef(iu-1, iu-2) = beta;
|
|
536
|
-
m_matT.block(iu-1, iu-1, 2, size-iu+1).applyHouseholderOnTheLeft(ess, tau, workspace);
|
|
537
|
-
m_matT.block(0, iu-1, iu+1, 2).applyHouseholderOnTheRight(ess, tau, workspace);
|
|
538
|
-
if (computeU)
|
|
539
|
-
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);
|
|
540
508
|
}
|
|
541
509
|
|
|
542
510
|
// clean up pollution due to round-off errors
|
|
543
|
-
for (Index i = im+2; i <= iu; ++i)
|
|
544
|
-
|
|
545
|
-
m_matT.coeffRef(i,i-
|
|
546
|
-
if (i > im+2)
|
|
547
|
-
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);
|
|
548
514
|
}
|
|
549
515
|
}
|
|
550
516
|
|
|
551
|
-
}
|
|
517
|
+
} // end namespace Eigen
|
|
552
518
|
|
|
553
|
-
#endif
|
|
519
|
+
#endif // EIGEN_REAL_SCHUR_H
|