tomoto 0.2.2 → 0.3.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/README.md +8 -10
- data/ext/tomoto/ct.cpp +11 -11
- data/ext/tomoto/dmr.cpp +14 -13
- data/ext/tomoto/dt.cpp +14 -14
- data/ext/tomoto/extconf.rb +7 -5
- data/ext/tomoto/gdmr.cpp +7 -7
- data/ext/tomoto/hdp.cpp +9 -9
- data/ext/tomoto/hlda.cpp +13 -13
- data/ext/tomoto/hpa.cpp +5 -5
- data/ext/tomoto/lda.cpp +42 -39
- data/ext/tomoto/llda.cpp +6 -6
- data/ext/tomoto/mglda.cpp +15 -15
- data/ext/tomoto/pa.cpp +6 -6
- data/ext/tomoto/plda.cpp +6 -6
- data/ext/tomoto/slda.cpp +8 -8
- data/ext/tomoto/{ext.cpp → tomoto.cpp} +8 -8
- data/ext/tomoto/utils.h +16 -70
- data/lib/tomoto/version.rb +1 -1
- data/lib/tomoto.rb +5 -1
- data/vendor/EigenRand/EigenRand/Core.h +10 -10
- data/vendor/EigenRand/EigenRand/Dists/Basic.h +208 -9
- data/vendor/EigenRand/EigenRand/Dists/Discrete.h +52 -31
- data/vendor/EigenRand/EigenRand/Dists/GammaPoisson.h +9 -8
- data/vendor/EigenRand/EigenRand/Dists/NormalExp.h +28 -21
- data/vendor/EigenRand/EigenRand/EigenRand +11 -6
- data/vendor/EigenRand/EigenRand/Macro.h +13 -7
- data/vendor/EigenRand/EigenRand/MorePacketMath.h +348 -740
- data/vendor/EigenRand/EigenRand/MvDists/Multinomial.h +5 -3
- data/vendor/EigenRand/EigenRand/MvDists/MvNormal.h +9 -3
- data/vendor/EigenRand/EigenRand/PacketFilter.h +11 -253
- data/vendor/EigenRand/EigenRand/PacketRandomEngine.h +21 -47
- data/vendor/EigenRand/EigenRand/RandUtils.h +50 -344
- data/vendor/EigenRand/EigenRand/arch/AVX/MorePacketMath.h +619 -0
- data/vendor/EigenRand/EigenRand/arch/AVX/PacketFilter.h +149 -0
- data/vendor/EigenRand/EigenRand/arch/AVX/RandUtils.h +228 -0
- data/vendor/EigenRand/EigenRand/arch/NEON/MorePacketMath.h +473 -0
- data/vendor/EigenRand/EigenRand/arch/NEON/PacketFilter.h +142 -0
- data/vendor/EigenRand/EigenRand/arch/NEON/RandUtils.h +126 -0
- data/vendor/EigenRand/EigenRand/arch/SSE/MorePacketMath.h +501 -0
- data/vendor/EigenRand/EigenRand/arch/SSE/PacketFilter.h +133 -0
- data/vendor/EigenRand/EigenRand/arch/SSE/RandUtils.h +120 -0
- data/vendor/EigenRand/EigenRand/doc.h +24 -12
- data/vendor/EigenRand/README.md +57 -4
- data/vendor/eigen/COPYING.APACHE +203 -0
- data/vendor/eigen/COPYING.BSD +1 -1
- data/vendor/eigen/COPYING.MINPACK +51 -52
- data/vendor/eigen/Eigen/Cholesky +0 -1
- data/vendor/eigen/Eigen/Core +112 -265
- data/vendor/eigen/Eigen/Eigenvalues +2 -3
- data/vendor/eigen/Eigen/Geometry +5 -8
- data/vendor/eigen/Eigen/Householder +0 -1
- data/vendor/eigen/Eigen/Jacobi +0 -1
- data/vendor/eigen/Eigen/KLUSupport +41 -0
- data/vendor/eigen/Eigen/LU +2 -5
- data/vendor/eigen/Eigen/OrderingMethods +0 -3
- data/vendor/eigen/Eigen/PaStiXSupport +1 -0
- data/vendor/eigen/Eigen/PardisoSupport +0 -0
- data/vendor/eigen/Eigen/QR +2 -3
- data/vendor/eigen/Eigen/QtAlignedMalloc +0 -1
- data/vendor/eigen/Eigen/SVD +0 -1
- data/vendor/eigen/Eigen/Sparse +0 -2
- data/vendor/eigen/Eigen/SparseCholesky +0 -8
- data/vendor/eigen/Eigen/SparseLU +4 -0
- data/vendor/eigen/Eigen/SparseQR +0 -1
- data/vendor/eigen/Eigen/src/Cholesky/LDLT.h +42 -27
- data/vendor/eigen/Eigen/src/Cholesky/LLT.h +39 -23
- data/vendor/eigen/Eigen/src/CholmodSupport/CholmodSupport.h +90 -47
- data/vendor/eigen/Eigen/src/Core/ArithmeticSequence.h +413 -0
- data/vendor/eigen/Eigen/src/Core/Array.h +99 -11
- data/vendor/eigen/Eigen/src/Core/ArrayBase.h +3 -3
- data/vendor/eigen/Eigen/src/Core/ArrayWrapper.h +21 -21
- data/vendor/eigen/Eigen/src/Core/Assign.h +1 -1
- data/vendor/eigen/Eigen/src/Core/AssignEvaluator.h +125 -50
- data/vendor/eigen/Eigen/src/Core/Assign_MKL.h +10 -10
- data/vendor/eigen/Eigen/src/Core/BandMatrix.h +16 -16
- data/vendor/eigen/Eigen/src/Core/Block.h +56 -60
- data/vendor/eigen/Eigen/src/Core/BooleanRedux.h +29 -31
- data/vendor/eigen/Eigen/src/Core/CommaInitializer.h +7 -3
- data/vendor/eigen/Eigen/src/Core/CoreEvaluators.h +325 -272
- data/vendor/eigen/Eigen/src/Core/CoreIterators.h +5 -0
- data/vendor/eigen/Eigen/src/Core/CwiseBinaryOp.h +21 -22
- data/vendor/eigen/Eigen/src/Core/CwiseNullaryOp.h +153 -18
- data/vendor/eigen/Eigen/src/Core/CwiseUnaryOp.h +6 -6
- data/vendor/eigen/Eigen/src/Core/CwiseUnaryView.h +14 -10
- data/vendor/eigen/Eigen/src/Core/DenseBase.h +132 -42
- data/vendor/eigen/Eigen/src/Core/DenseCoeffsBase.h +25 -21
- data/vendor/eigen/Eigen/src/Core/DenseStorage.h +153 -71
- data/vendor/eigen/Eigen/src/Core/Diagonal.h +21 -23
- data/vendor/eigen/Eigen/src/Core/DiagonalMatrix.h +50 -2
- data/vendor/eigen/Eigen/src/Core/DiagonalProduct.h +1 -1
- data/vendor/eigen/Eigen/src/Core/Dot.h +10 -10
- data/vendor/eigen/Eigen/src/Core/EigenBase.h +10 -9
- data/vendor/eigen/Eigen/src/Core/ForceAlignedAccess.h +8 -4
- data/vendor/eigen/Eigen/src/Core/Fuzzy.h +3 -3
- data/vendor/eigen/Eigen/src/Core/GeneralProduct.h +20 -10
- data/vendor/eigen/Eigen/src/Core/GenericPacketMath.h +599 -152
- data/vendor/eigen/Eigen/src/Core/GlobalFunctions.h +40 -33
- data/vendor/eigen/Eigen/src/Core/IO.h +40 -7
- data/vendor/eigen/Eigen/src/Core/IndexedView.h +237 -0
- data/vendor/eigen/Eigen/src/Core/Inverse.h +9 -10
- data/vendor/eigen/Eigen/src/Core/Map.h +7 -7
- data/vendor/eigen/Eigen/src/Core/MapBase.h +10 -3
- data/vendor/eigen/Eigen/src/Core/MathFunctions.h +767 -125
- data/vendor/eigen/Eigen/src/Core/MathFunctionsImpl.h +118 -19
- data/vendor/eigen/Eigen/src/Core/Matrix.h +131 -25
- data/vendor/eigen/Eigen/src/Core/MatrixBase.h +21 -3
- data/vendor/eigen/Eigen/src/Core/NestByValue.h +25 -50
- data/vendor/eigen/Eigen/src/Core/NoAlias.h +4 -3
- data/vendor/eigen/Eigen/src/Core/NumTraits.h +107 -20
- data/vendor/eigen/Eigen/src/Core/PartialReduxEvaluator.h +232 -0
- data/vendor/eigen/Eigen/src/Core/PermutationMatrix.h +3 -31
- data/vendor/eigen/Eigen/src/Core/PlainObjectBase.h +152 -59
- data/vendor/eigen/Eigen/src/Core/Product.h +30 -25
- data/vendor/eigen/Eigen/src/Core/ProductEvaluators.h +192 -125
- data/vendor/eigen/Eigen/src/Core/Random.h +37 -1
- data/vendor/eigen/Eigen/src/Core/Redux.h +180 -170
- data/vendor/eigen/Eigen/src/Core/Ref.h +121 -23
- data/vendor/eigen/Eigen/src/Core/Replicate.h +8 -8
- data/vendor/eigen/Eigen/src/Core/Reshaped.h +454 -0
- data/vendor/eigen/Eigen/src/Core/ReturnByValue.h +7 -5
- data/vendor/eigen/Eigen/src/Core/Reverse.h +18 -12
- data/vendor/eigen/Eigen/src/Core/Select.h +8 -6
- data/vendor/eigen/Eigen/src/Core/SelfAdjointView.h +33 -20
- data/vendor/eigen/Eigen/src/Core/Solve.h +14 -14
- data/vendor/eigen/Eigen/src/Core/SolveTriangular.h +16 -16
- data/vendor/eigen/Eigen/src/Core/SolverBase.h +41 -3
- data/vendor/eigen/Eigen/src/Core/StableNorm.h +100 -70
- data/vendor/eigen/Eigen/src/Core/StlIterators.h +463 -0
- data/vendor/eigen/Eigen/src/Core/Stride.h +9 -4
- data/vendor/eigen/Eigen/src/Core/Swap.h +5 -4
- data/vendor/eigen/Eigen/src/Core/Transpose.h +88 -27
- data/vendor/eigen/Eigen/src/Core/Transpositions.h +26 -47
- data/vendor/eigen/Eigen/src/Core/TriangularMatrix.h +93 -75
- data/vendor/eigen/Eigen/src/Core/VectorBlock.h +5 -5
- data/vendor/eigen/Eigen/src/Core/VectorwiseOp.h +159 -70
- data/vendor/eigen/Eigen/src/Core/Visitor.h +137 -29
- data/vendor/eigen/Eigen/src/Core/arch/AVX/Complex.h +50 -129
- data/vendor/eigen/Eigen/src/Core/arch/AVX/MathFunctions.h +126 -337
- data/vendor/eigen/Eigen/src/Core/arch/AVX/PacketMath.h +1092 -155
- data/vendor/eigen/Eigen/src/Core/arch/AVX/TypeCasting.h +65 -1
- data/vendor/eigen/Eigen/src/Core/arch/AVX512/Complex.h +422 -0
- data/vendor/eigen/Eigen/src/Core/arch/AVX512/MathFunctions.h +207 -236
- data/vendor/eigen/Eigen/src/Core/arch/AVX512/PacketMath.h +1482 -495
- data/vendor/eigen/Eigen/src/Core/arch/AVX512/TypeCasting.h +89 -0
- data/vendor/eigen/Eigen/src/Core/arch/AltiVec/Complex.h +152 -165
- data/vendor/eigen/Eigen/src/Core/arch/AltiVec/MathFunctions.h +19 -251
- data/vendor/eigen/Eigen/src/Core/arch/AltiVec/MatrixProduct.h +2937 -0
- data/vendor/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h +221 -0
- data/vendor/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductMMA.h +629 -0
- data/vendor/eigen/Eigen/src/Core/arch/AltiVec/PacketMath.h +2042 -392
- data/vendor/eigen/Eigen/src/Core/arch/CUDA/Complex.h +235 -80
- data/vendor/eigen/Eigen/src/Core/arch/Default/BFloat16.h +700 -0
- data/vendor/eigen/Eigen/src/Core/arch/Default/ConjHelper.h +102 -14
- data/vendor/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h +1649 -0
- data/vendor/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h +110 -0
- data/vendor/eigen/Eigen/src/Core/arch/Default/Half.h +942 -0
- data/vendor/eigen/Eigen/src/Core/arch/Default/Settings.h +1 -1
- data/vendor/eigen/Eigen/src/Core/arch/Default/TypeCasting.h +120 -0
- data/vendor/eigen/Eigen/src/Core/arch/{CUDA → GPU}/MathFunctions.h +16 -4
- data/vendor/eigen/Eigen/src/Core/arch/GPU/PacketMath.h +1685 -0
- data/vendor/eigen/Eigen/src/Core/arch/GPU/TypeCasting.h +80 -0
- data/vendor/eigen/Eigen/src/Core/arch/HIP/hcc/math_constants.h +23 -0
- data/vendor/eigen/Eigen/src/Core/arch/MSA/Complex.h +648 -0
- data/vendor/eigen/Eigen/src/Core/arch/MSA/MathFunctions.h +387 -0
- data/vendor/eigen/Eigen/src/Core/arch/MSA/PacketMath.h +1233 -0
- data/vendor/eigen/Eigen/src/Core/arch/NEON/Complex.h +313 -219
- data/vendor/eigen/Eigen/src/Core/arch/NEON/GeneralBlockPanelKernel.h +183 -0
- data/vendor/eigen/Eigen/src/Core/arch/NEON/MathFunctions.h +54 -70
- data/vendor/eigen/Eigen/src/Core/arch/NEON/PacketMath.h +4376 -549
- data/vendor/eigen/Eigen/src/Core/arch/NEON/TypeCasting.h +1419 -0
- data/vendor/eigen/Eigen/src/Core/arch/SSE/Complex.h +59 -179
- data/vendor/eigen/Eigen/src/Core/arch/SSE/MathFunctions.h +65 -428
- data/vendor/eigen/Eigen/src/Core/arch/SSE/PacketMath.h +893 -283
- data/vendor/eigen/Eigen/src/Core/arch/SSE/TypeCasting.h +65 -0
- data/vendor/eigen/Eigen/src/Core/arch/SVE/MathFunctions.h +44 -0
- data/vendor/eigen/Eigen/src/Core/arch/SVE/PacketMath.h +752 -0
- data/vendor/eigen/Eigen/src/Core/arch/SVE/TypeCasting.h +49 -0
- data/vendor/eigen/Eigen/src/Core/arch/SYCL/InteropHeaders.h +232 -0
- data/vendor/eigen/Eigen/src/Core/arch/SYCL/MathFunctions.h +301 -0
- data/vendor/eigen/Eigen/src/Core/arch/SYCL/PacketMath.h +670 -0
- data/vendor/eigen/Eigen/src/Core/arch/SYCL/SyclMemoryModel.h +694 -0
- data/vendor/eigen/Eigen/src/Core/arch/SYCL/TypeCasting.h +85 -0
- data/vendor/eigen/Eigen/src/Core/arch/ZVector/Complex.h +212 -183
- data/vendor/eigen/Eigen/src/Core/arch/ZVector/MathFunctions.h +101 -5
- data/vendor/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h +510 -395
- data/vendor/eigen/Eigen/src/Core/functors/AssignmentFunctors.h +11 -2
- data/vendor/eigen/Eigen/src/Core/functors/BinaryFunctors.h +112 -46
- data/vendor/eigen/Eigen/src/Core/functors/NullaryFunctors.h +31 -30
- data/vendor/eigen/Eigen/src/Core/functors/StlFunctors.h +32 -2
- data/vendor/eigen/Eigen/src/Core/functors/UnaryFunctors.h +355 -16
- data/vendor/eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h +1075 -586
- data/vendor/eigen/Eigen/src/Core/products/GeneralMatrixMatrix.h +49 -24
- data/vendor/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +41 -35
- data/vendor/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h +6 -6
- data/vendor/eigen/Eigen/src/Core/products/GeneralMatrixMatrix_BLAS.h +4 -2
- data/vendor/eigen/Eigen/src/Core/products/GeneralMatrixVector.h +382 -483
- data/vendor/eigen/Eigen/src/Core/products/Parallelizer.h +22 -5
- data/vendor/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +53 -30
- data/vendor/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix_BLAS.h +16 -8
- data/vendor/eigen/Eigen/src/Core/products/SelfadjointMatrixVector.h +8 -6
- data/vendor/eigen/Eigen/src/Core/products/SelfadjointProduct.h +4 -4
- data/vendor/eigen/Eigen/src/Core/products/SelfadjointRank2Update.h +5 -4
- data/vendor/eigen/Eigen/src/Core/products/TriangularMatrixMatrix.h +33 -27
- data/vendor/eigen/Eigen/src/Core/products/TriangularMatrixMatrix_BLAS.h +14 -12
- data/vendor/eigen/Eigen/src/Core/products/TriangularSolverMatrix.h +36 -34
- data/vendor/eigen/Eigen/src/Core/products/TriangularSolverMatrix_BLAS.h +8 -4
- data/vendor/eigen/Eigen/src/Core/products/TriangularSolverVector.h +13 -10
- data/vendor/eigen/Eigen/src/Core/util/BlasUtil.h +304 -119
- data/vendor/eigen/Eigen/src/Core/util/ConfigureVectorization.h +512 -0
- data/vendor/eigen/Eigen/src/Core/util/Constants.h +25 -9
- data/vendor/eigen/Eigen/src/Core/util/DisableStupidWarnings.h +26 -3
- data/vendor/eigen/Eigen/src/Core/util/ForwardDeclarations.h +29 -9
- data/vendor/eigen/Eigen/src/Core/util/IndexedViewHelper.h +186 -0
- data/vendor/eigen/Eigen/src/Core/util/IntegralConstant.h +272 -0
- data/vendor/eigen/Eigen/src/Core/util/MKL_support.h +8 -1
- data/vendor/eigen/Eigen/src/Core/util/Macros.h +709 -246
- data/vendor/eigen/Eigen/src/Core/util/Memory.h +222 -52
- data/vendor/eigen/Eigen/src/Core/util/Meta.h +355 -77
- data/vendor/eigen/Eigen/src/Core/util/ReenableStupidWarnings.h +5 -1
- data/vendor/eigen/Eigen/src/Core/util/ReshapedHelper.h +51 -0
- data/vendor/eigen/Eigen/src/Core/util/StaticAssert.h +8 -5
- data/vendor/eigen/Eigen/src/Core/util/SymbolicIndex.h +293 -0
- data/vendor/eigen/Eigen/src/Core/util/XprHelper.h +65 -30
- data/vendor/eigen/Eigen/src/Eigenvalues/ComplexEigenSolver.h +1 -1
- data/vendor/eigen/Eigen/src/Eigenvalues/ComplexSchur.h +7 -4
- data/vendor/eigen/Eigen/src/Eigenvalues/EigenSolver.h +2 -2
- data/vendor/eigen/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h +1 -1
- data/vendor/eigen/Eigen/src/Eigenvalues/HessenbergDecomposition.h +2 -2
- data/vendor/eigen/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h +2 -2
- data/vendor/eigen/Eigen/src/Eigenvalues/RealQZ.h +9 -6
- data/vendor/eigen/Eigen/src/Eigenvalues/RealSchur.h +21 -9
- data/vendor/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +77 -43
- data/vendor/eigen/Eigen/src/Eigenvalues/Tridiagonalization.h +20 -15
- data/vendor/eigen/Eigen/src/Geometry/AlignedBox.h +99 -5
- data/vendor/eigen/Eigen/src/Geometry/AngleAxis.h +4 -4
- data/vendor/eigen/Eigen/src/Geometry/EulerAngles.h +3 -3
- data/vendor/eigen/Eigen/src/Geometry/Homogeneous.h +15 -11
- data/vendor/eigen/Eigen/src/Geometry/Hyperplane.h +1 -1
- data/vendor/eigen/Eigen/src/Geometry/OrthoMethods.h +3 -2
- data/vendor/eigen/Eigen/src/Geometry/ParametrizedLine.h +39 -2
- data/vendor/eigen/Eigen/src/Geometry/Quaternion.h +70 -14
- data/vendor/eigen/Eigen/src/Geometry/Rotation2D.h +3 -3
- data/vendor/eigen/Eigen/src/Geometry/Scaling.h +23 -5
- data/vendor/eigen/Eigen/src/Geometry/Transform.h +88 -67
- data/vendor/eigen/Eigen/src/Geometry/Translation.h +6 -12
- data/vendor/eigen/Eigen/src/Geometry/Umeyama.h +1 -1
- data/vendor/eigen/Eigen/src/Geometry/arch/Geometry_SIMD.h +168 -0
- data/vendor/eigen/Eigen/src/Householder/BlockHouseholder.h +9 -2
- data/vendor/eigen/Eigen/src/Householder/Householder.h +8 -4
- data/vendor/eigen/Eigen/src/Householder/HouseholderSequence.h +123 -48
- data/vendor/eigen/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +15 -15
- data/vendor/eigen/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +7 -23
- data/vendor/eigen/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +5 -22
- data/vendor/eigen/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h +41 -47
- data/vendor/eigen/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h +51 -60
- data/vendor/eigen/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +70 -20
- data/vendor/eigen/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h +2 -20
- data/vendor/eigen/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h +11 -9
- data/vendor/eigen/Eigen/src/Jacobi/Jacobi.h +31 -10
- data/vendor/eigen/Eigen/src/KLUSupport/KLUSupport.h +358 -0
- data/vendor/eigen/Eigen/src/LU/Determinant.h +35 -19
- data/vendor/eigen/Eigen/src/LU/FullPivLU.h +29 -43
- data/vendor/eigen/Eigen/src/LU/InverseImpl.h +25 -8
- data/vendor/eigen/Eigen/src/LU/PartialPivLU.h +71 -58
- data/vendor/eigen/Eigen/src/LU/arch/InverseSize4.h +351 -0
- data/vendor/eigen/Eigen/src/OrderingMethods/Amd.h +7 -17
- data/vendor/eigen/Eigen/src/OrderingMethods/Eigen_Colamd.h +297 -277
- data/vendor/eigen/Eigen/src/OrderingMethods/Ordering.h +6 -10
- data/vendor/eigen/Eigen/src/PaStiXSupport/PaStiXSupport.h +1 -1
- data/vendor/eigen/Eigen/src/PardisoSupport/PardisoSupport.h +9 -7
- data/vendor/eigen/Eigen/src/QR/ColPivHouseholderQR.h +41 -20
- data/vendor/eigen/Eigen/src/QR/CompleteOrthogonalDecomposition.h +100 -27
- data/vendor/eigen/Eigen/src/QR/FullPivHouseholderQR.h +59 -22
- data/vendor/eigen/Eigen/src/QR/HouseholderQR.h +48 -23
- data/vendor/eigen/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h +25 -3
- data/vendor/eigen/Eigen/src/SVD/BDCSVD.h +183 -63
- data/vendor/eigen/Eigen/src/SVD/JacobiSVD.h +22 -14
- data/vendor/eigen/Eigen/src/SVD/SVDBase.h +83 -22
- data/vendor/eigen/Eigen/src/SVD/UpperBidiagonalization.h +3 -3
- data/vendor/eigen/Eigen/src/SparseCholesky/SimplicialCholesky.h +17 -9
- data/vendor/eigen/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h +12 -37
- data/vendor/eigen/Eigen/src/SparseCore/AmbiVector.h +3 -2
- data/vendor/eigen/Eigen/src/SparseCore/CompressedStorage.h +16 -0
- data/vendor/eigen/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h +6 -6
- data/vendor/eigen/Eigen/src/SparseCore/SparseAssign.h +81 -27
- data/vendor/eigen/Eigen/src/SparseCore/SparseBlock.h +25 -57
- data/vendor/eigen/Eigen/src/SparseCore/SparseCompressedBase.h +40 -11
- data/vendor/eigen/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +11 -15
- data/vendor/eigen/Eigen/src/SparseCore/SparseCwiseUnaryOp.h +4 -2
- data/vendor/eigen/Eigen/src/SparseCore/SparseDenseProduct.h +30 -8
- data/vendor/eigen/Eigen/src/SparseCore/SparseMatrix.h +126 -11
- data/vendor/eigen/Eigen/src/SparseCore/SparseMatrixBase.h +5 -12
- data/vendor/eigen/Eigen/src/SparseCore/SparseProduct.h +13 -1
- data/vendor/eigen/Eigen/src/SparseCore/SparseRef.h +7 -7
- data/vendor/eigen/Eigen/src/SparseCore/SparseSelfAdjointView.h +5 -2
- data/vendor/eigen/Eigen/src/SparseCore/SparseUtil.h +8 -0
- data/vendor/eigen/Eigen/src/SparseCore/SparseVector.h +1 -1
- data/vendor/eigen/Eigen/src/SparseCore/SparseView.h +1 -0
- data/vendor/eigen/Eigen/src/SparseLU/SparseLU.h +162 -12
- data/vendor/eigen/Eigen/src/SparseLU/SparseLU_Memory.h +1 -1
- data/vendor/eigen/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h +76 -2
- data/vendor/eigen/Eigen/src/SparseLU/SparseLU_column_dfs.h +2 -2
- data/vendor/eigen/Eigen/src/SparseLU/SparseLU_gemm_kernel.h +1 -1
- data/vendor/eigen/Eigen/src/SparseLU/SparseLU_panel_bmod.h +1 -1
- data/vendor/eigen/Eigen/src/SparseQR/SparseQR.h +19 -6
- data/vendor/eigen/Eigen/src/StlSupport/StdDeque.h +2 -12
- data/vendor/eigen/Eigen/src/StlSupport/StdList.h +2 -2
- data/vendor/eigen/Eigen/src/StlSupport/StdVector.h +2 -2
- data/vendor/eigen/Eigen/src/SuperLUSupport/SuperLUSupport.h +6 -8
- data/vendor/eigen/Eigen/src/UmfPackSupport/UmfPackSupport.h +175 -39
- data/vendor/eigen/Eigen/src/misc/lapacke.h +5 -4
- data/vendor/eigen/Eigen/src/plugins/ArrayCwiseBinaryOps.h +28 -2
- data/vendor/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.h +155 -11
- data/vendor/eigen/Eigen/src/plugins/BlockMethods.h +626 -242
- data/vendor/eigen/Eigen/src/plugins/CommonCwiseUnaryOps.h +14 -0
- data/vendor/eigen/Eigen/src/plugins/IndexedViewMethods.h +262 -0
- data/vendor/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.h +4 -4
- data/vendor/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.h +10 -0
- data/vendor/eigen/Eigen/src/plugins/ReshapedMethods.h +149 -0
- data/vendor/eigen/README.md +2 -0
- data/vendor/eigen/bench/btl/README +1 -1
- data/vendor/eigen/bench/tensors/README +6 -7
- data/vendor/eigen/ci/README.md +56 -0
- data/vendor/eigen/demos/mix_eigen_and_c/README +1 -1
- data/vendor/eigen/unsupported/Eigen/CXX11/src/Tensor/README.md +213 -158
- data/vendor/eigen/unsupported/README.txt +1 -1
- data/vendor/tomotopy/README.kr.rst +78 -0
- data/vendor/tomotopy/README.rst +75 -0
- data/vendor/tomotopy/src/Labeling/FoRelevance.cpp +2 -2
- data/vendor/tomotopy/src/Labeling/Phraser.hpp +4 -4
- data/vendor/tomotopy/src/TopicModel/CTModel.hpp +7 -3
- data/vendor/tomotopy/src/TopicModel/DMRModel.hpp +7 -3
- data/vendor/tomotopy/src/TopicModel/DTModel.hpp +6 -3
- data/vendor/tomotopy/src/TopicModel/GDMRModel.hpp +2 -2
- data/vendor/tomotopy/src/TopicModel/HDP.h +1 -0
- data/vendor/tomotopy/src/TopicModel/HDPModel.hpp +57 -6
- data/vendor/tomotopy/src/TopicModel/HLDAModel.hpp +6 -3
- data/vendor/tomotopy/src/TopicModel/HPAModel.hpp +3 -2
- data/vendor/tomotopy/src/TopicModel/LDA.h +3 -3
- data/vendor/tomotopy/src/TopicModel/LDACVB0Model.hpp +5 -5
- data/vendor/tomotopy/src/TopicModel/LDAModel.hpp +50 -19
- data/vendor/tomotopy/src/TopicModel/LLDAModel.hpp +6 -2
- data/vendor/tomotopy/src/TopicModel/MGLDAModel.hpp +3 -2
- data/vendor/tomotopy/src/TopicModel/PAModel.hpp +1 -1
- data/vendor/tomotopy/src/TopicModel/PLDAModel.hpp +6 -2
- data/vendor/tomotopy/src/TopicModel/PT.h +3 -1
- data/vendor/tomotopy/src/TopicModel/PTModel.hpp +36 -3
- data/vendor/tomotopy/src/TopicModel/SLDAModel.hpp +6 -3
- data/vendor/tomotopy/src/TopicModel/TopicModel.hpp +55 -26
- data/vendor/tomotopy/src/Utils/AliasMethod.hpp +5 -4
- data/vendor/tomotopy/src/Utils/Dictionary.h +2 -2
- data/vendor/tomotopy/src/Utils/EigenAddonOps.hpp +36 -1
- data/vendor/tomotopy/src/Utils/MultiNormalDistribution.hpp +1 -1
- data/vendor/tomotopy/src/Utils/TruncMultiNormal.hpp +1 -1
- data/vendor/tomotopy/src/Utils/exception.h +6 -0
- data/vendor/tomotopy/src/Utils/math.h +2 -2
- data/vendor/tomotopy/src/Utils/sample.hpp +14 -12
- data/vendor/tomotopy/src/Utils/serializer.hpp +30 -5
- data/vendor/tomotopy/src/Utils/sse_gamma.h +0 -3
- metadata +64 -18
- data/vendor/eigen/Eigen/CMakeLists.txt +0 -19
- data/vendor/eigen/Eigen/src/Core/arch/CUDA/Half.h +0 -674
- data/vendor/eigen/Eigen/src/Core/arch/CUDA/PacketMath.h +0 -333
- data/vendor/eigen/Eigen/src/Core/arch/CUDA/PacketMathHalf.h +0 -1124
- data/vendor/eigen/Eigen/src/Core/arch/CUDA/TypeCasting.h +0 -212
- data/vendor/eigen/Eigen/src/Geometry/arch/Geometry_SSE.h +0 -161
- data/vendor/eigen/Eigen/src/LU/arch/Inverse_SSE.h +0 -338
|
@@ -267,7 +267,7 @@ template<typename _MatrixType> class HessenbergDecomposition
|
|
|
267
267
|
|
|
268
268
|
private:
|
|
269
269
|
|
|
270
|
-
typedef Matrix<Scalar, 1, Size, Options | RowMajor, 1, MaxSize> VectorType;
|
|
270
|
+
typedef Matrix<Scalar, 1, Size, int(Options) | int(RowMajor), 1, MaxSize> VectorType;
|
|
271
271
|
typedef typename NumTraits<Scalar>::Real RealScalar;
|
|
272
272
|
static void _compute(MatrixType& matA, CoeffVectorType& hCoeffs, VectorType& temp);
|
|
273
273
|
|
|
@@ -315,7 +315,7 @@ void HessenbergDecomposition<MatrixType>::_compute(MatrixType& matA, CoeffVector
|
|
|
315
315
|
|
|
316
316
|
// A = A H'
|
|
317
317
|
matA.rightCols(remainingSize)
|
|
318
|
-
.applyHouseholderOnTheRight(matA.col(i).tail(remainingSize-1)
|
|
318
|
+
.applyHouseholderOnTheRight(matA.col(i).tail(remainingSize-1), numext::conj(h), &temp.coeffRef(0));
|
|
319
319
|
}
|
|
320
320
|
}
|
|
321
321
|
|
|
@@ -84,7 +84,7 @@ MatrixBase<Derived>::eigenvalues() const
|
|
|
84
84
|
* \sa SelfAdjointEigenSolver::eigenvalues(), MatrixBase::eigenvalues()
|
|
85
85
|
*/
|
|
86
86
|
template<typename MatrixType, unsigned int UpLo>
|
|
87
|
-
inline typename SelfAdjointView<MatrixType, UpLo>::EigenvaluesReturnType
|
|
87
|
+
EIGEN_DEVICE_FUNC inline typename SelfAdjointView<MatrixType, UpLo>::EigenvaluesReturnType
|
|
88
88
|
SelfAdjointView<MatrixType, UpLo>::eigenvalues() const
|
|
89
89
|
{
|
|
90
90
|
PlainObject thisAsMatrix(*this);
|
|
@@ -147,7 +147,7 @@ MatrixBase<Derived>::operatorNorm() const
|
|
|
147
147
|
* \sa eigenvalues(), MatrixBase::operatorNorm()
|
|
148
148
|
*/
|
|
149
149
|
template<typename MatrixType, unsigned int UpLo>
|
|
150
|
-
inline typename SelfAdjointView<MatrixType, UpLo>::RealScalar
|
|
150
|
+
EIGEN_DEVICE_FUNC inline typename SelfAdjointView<MatrixType, UpLo>::RealScalar
|
|
151
151
|
SelfAdjointView<MatrixType, UpLo>::operatorNorm() const
|
|
152
152
|
{
|
|
153
153
|
return eigenvalues().cwiseAbs().maxCoeff();
|
|
@@ -90,8 +90,9 @@ namespace Eigen {
|
|
|
90
90
|
m_Z(size, size),
|
|
91
91
|
m_workspace(size*2),
|
|
92
92
|
m_maxIters(400),
|
|
93
|
-
m_isInitialized(false)
|
|
94
|
-
|
|
93
|
+
m_isInitialized(false),
|
|
94
|
+
m_computeQZ(true)
|
|
95
|
+
{}
|
|
95
96
|
|
|
96
97
|
/** \brief Constructor; computes real QZ decomposition of given matrices
|
|
97
98
|
*
|
|
@@ -108,9 +109,11 @@ namespace Eigen {
|
|
|
108
109
|
m_Z(A.rows(),A.cols()),
|
|
109
110
|
m_workspace(A.rows()*2),
|
|
110
111
|
m_maxIters(400),
|
|
111
|
-
m_isInitialized(false)
|
|
112
|
-
|
|
113
|
-
|
|
112
|
+
m_isInitialized(false),
|
|
113
|
+
m_computeQZ(true)
|
|
114
|
+
{
|
|
115
|
+
compute(A, B, computeQZ);
|
|
116
|
+
}
|
|
114
117
|
|
|
115
118
|
/** \brief Returns matrix Q in the QZ decomposition.
|
|
116
119
|
*
|
|
@@ -161,7 +164,7 @@ namespace Eigen {
|
|
|
161
164
|
|
|
162
165
|
/** \brief Reports whether previous computation was successful.
|
|
163
166
|
*
|
|
164
|
-
* \returns \c Success if computation was
|
|
167
|
+
* \returns \c Success if computation was successful, \c NoConvergence otherwise.
|
|
165
168
|
*/
|
|
166
169
|
ComputationInfo info() const
|
|
167
170
|
{
|
|
@@ -190,7 +190,7 @@ template<typename _MatrixType> class RealSchur
|
|
|
190
190
|
RealSchur& computeFromHessenberg(const HessMatrixType& matrixH, const OrthMatrixType& matrixQ, bool computeU);
|
|
191
191
|
/** \brief Reports whether previous computation was successful.
|
|
192
192
|
*
|
|
193
|
-
* \returns \c Success if computation was
|
|
193
|
+
* \returns \c Success if computation was successful, \c NoConvergence otherwise.
|
|
194
194
|
*/
|
|
195
195
|
ComputationInfo info() const
|
|
196
196
|
{
|
|
@@ -236,7 +236,7 @@ template<typename _MatrixType> class RealSchur
|
|
|
236
236
|
typedef Matrix<Scalar,3,1> Vector3s;
|
|
237
237
|
|
|
238
238
|
Scalar computeNormOfT();
|
|
239
|
-
Index findSmallSubdiagEntry(Index iu);
|
|
239
|
+
Index findSmallSubdiagEntry(Index iu, const Scalar& considerAsZero);
|
|
240
240
|
void splitOffTwoRows(Index iu, bool computeU, const Scalar& exshift);
|
|
241
241
|
void computeShift(Index iu, Index iter, Scalar& exshift, Vector3s& shiftInfo);
|
|
242
242
|
void initFrancisQRStep(Index il, Index iu, const Vector3s& shiftInfo, Index& im, Vector3s& firstHouseholderVector);
|
|
@@ -270,8 +270,13 @@ RealSchur<MatrixType>& RealSchur<MatrixType>::compute(const EigenBase<InputType>
|
|
|
270
270
|
// Step 1. Reduce to Hessenberg form
|
|
271
271
|
m_hess.compute(matrix.derived()/scale);
|
|
272
272
|
|
|
273
|
-
// Step 2. Reduce to real Schur form
|
|
274
|
-
|
|
273
|
+
// Step 2. Reduce to real Schur form
|
|
274
|
+
// Note: we copy m_hess.matrixQ() into m_matU here and not in computeFromHessenberg
|
|
275
|
+
// to be able to pass our working-space buffer for the Householder to Dense evaluation.
|
|
276
|
+
m_workspaceVector.resize(matrix.cols());
|
|
277
|
+
if(computeU)
|
|
278
|
+
m_hess.matrixQ().evalTo(m_matU, m_workspaceVector);
|
|
279
|
+
computeFromHessenberg(m_hess.matrixH(), m_matU, computeU);
|
|
275
280
|
|
|
276
281
|
m_matT *= scale;
|
|
277
282
|
|
|
@@ -284,13 +289,13 @@ RealSchur<MatrixType>& RealSchur<MatrixType>::computeFromHessenberg(const HessMa
|
|
|
284
289
|
using std::abs;
|
|
285
290
|
|
|
286
291
|
m_matT = matrixH;
|
|
287
|
-
|
|
292
|
+
m_workspaceVector.resize(m_matT.cols());
|
|
293
|
+
if(computeU && !internal::is_same_dense(m_matU,matrixQ))
|
|
288
294
|
m_matU = matrixQ;
|
|
289
295
|
|
|
290
296
|
Index maxIters = m_maxIters;
|
|
291
297
|
if (maxIters == -1)
|
|
292
298
|
maxIters = m_maxIterationsPerRow * matrixH.rows();
|
|
293
|
-
m_workspaceVector.resize(m_matT.cols());
|
|
294
299
|
Scalar* workspace = &m_workspaceVector.coeffRef(0);
|
|
295
300
|
|
|
296
301
|
// The matrix m_matT is divided in three parts.
|
|
@@ -302,12 +307,16 @@ RealSchur<MatrixType>& RealSchur<MatrixType>::computeFromHessenberg(const HessMa
|
|
|
302
307
|
Index totalIter = 0; // iteration count for whole matrix
|
|
303
308
|
Scalar exshift(0); // sum of exceptional shifts
|
|
304
309
|
Scalar norm = computeNormOfT();
|
|
310
|
+
// sub-diagonal entries smaller than considerAsZero will be treated as zero.
|
|
311
|
+
// We use eps^2 to enable more precision in small eigenvalues.
|
|
312
|
+
Scalar considerAsZero = numext::maxi<Scalar>( norm * numext::abs2(NumTraits<Scalar>::epsilon()),
|
|
313
|
+
(std::numeric_limits<Scalar>::min)() );
|
|
305
314
|
|
|
306
315
|
if(norm!=Scalar(0))
|
|
307
316
|
{
|
|
308
317
|
while (iu >= 0)
|
|
309
318
|
{
|
|
310
|
-
Index il = findSmallSubdiagEntry(iu);
|
|
319
|
+
Index il = findSmallSubdiagEntry(iu,considerAsZero);
|
|
311
320
|
|
|
312
321
|
// Check for convergence
|
|
313
322
|
if (il == iu) // One root found
|
|
@@ -364,14 +373,17 @@ inline typename MatrixType::Scalar RealSchur<MatrixType>::computeNormOfT()
|
|
|
364
373
|
|
|
365
374
|
/** \internal Look for single small sub-diagonal element and returns its index */
|
|
366
375
|
template<typename MatrixType>
|
|
367
|
-
inline Index RealSchur<MatrixType>::findSmallSubdiagEntry(Index iu)
|
|
376
|
+
inline Index RealSchur<MatrixType>::findSmallSubdiagEntry(Index iu, const Scalar& considerAsZero)
|
|
368
377
|
{
|
|
369
378
|
using std::abs;
|
|
370
379
|
Index res = iu;
|
|
371
380
|
while (res > 0)
|
|
372
381
|
{
|
|
373
382
|
Scalar s = abs(m_matT.coeff(res-1,res-1)) + abs(m_matT.coeff(res,res));
|
|
374
|
-
|
|
383
|
+
|
|
384
|
+
s = numext::maxi<Scalar>(s * NumTraits<Scalar>::epsilon(), considerAsZero);
|
|
385
|
+
|
|
386
|
+
if (abs(m_matT.coeff(res,res-1)) <= s)
|
|
375
387
|
break;
|
|
376
388
|
res--;
|
|
377
389
|
}
|
|
@@ -20,7 +20,9 @@ class GeneralizedSelfAdjointEigenSolver;
|
|
|
20
20
|
|
|
21
21
|
namespace internal {
|
|
22
22
|
template<typename SolverType,int Size,bool IsComplex> struct direct_selfadjoint_eigenvalues;
|
|
23
|
+
|
|
23
24
|
template<typename MatrixType, typename DiagType, typename SubDiagType>
|
|
25
|
+
EIGEN_DEVICE_FUNC
|
|
24
26
|
ComputationInfo computeFromTridiagonal_impl(DiagType& diag, SubDiagType& subdiag, const Index maxIterations, bool computeEigenvectors, MatrixType& eivec);
|
|
25
27
|
}
|
|
26
28
|
|
|
@@ -42,10 +44,14 @@ ComputationInfo computeFromTridiagonal_impl(DiagType& diag, SubDiagType& subdiag
|
|
|
42
44
|
* \f$ v \f$ such that \f$ Av = \lambda v \f$. The eigenvalues of a
|
|
43
45
|
* selfadjoint matrix are always real. If \f$ D \f$ is a diagonal matrix with
|
|
44
46
|
* the eigenvalues on the diagonal, and \f$ V \f$ is a matrix with the
|
|
45
|
-
* eigenvectors as its columns, then \f$ A = V D V^{-1} \f
|
|
46
|
-
* matrices, the matrix \f$ V \f$ is always invertible). This is called the
|
|
47
|
+
* eigenvectors as its columns, then \f$ A = V D V^{-1} \f$. This is called the
|
|
47
48
|
* eigendecomposition.
|
|
48
49
|
*
|
|
50
|
+
* For a selfadjoint matrix, \f$ V \f$ is unitary, meaning its inverse is equal
|
|
51
|
+
* to its adjoint, \f$ V^{-1} = V^{\dagger} \f$. If \f$ A \f$ is real, then
|
|
52
|
+
* \f$ V \f$ is also real and therefore orthogonal, meaning its inverse is
|
|
53
|
+
* equal to its transpose, \f$ V^{-1} = V^T \f$.
|
|
54
|
+
*
|
|
49
55
|
* The algorithm exploits the fact that the matrix is selfadjoint, making it
|
|
50
56
|
* faster and more accurate than the general purpose eigenvalue algorithms
|
|
51
57
|
* implemented in EigenSolver and ComplexEigenSolver.
|
|
@@ -119,7 +125,10 @@ template<typename _MatrixType> class SelfAdjointEigenSolver
|
|
|
119
125
|
: m_eivec(),
|
|
120
126
|
m_eivalues(),
|
|
121
127
|
m_subdiag(),
|
|
122
|
-
|
|
128
|
+
m_hcoeffs(),
|
|
129
|
+
m_info(InvalidInput),
|
|
130
|
+
m_isInitialized(false),
|
|
131
|
+
m_eigenvectorsOk(false)
|
|
123
132
|
{ }
|
|
124
133
|
|
|
125
134
|
/** \brief Constructor, pre-allocates memory for dynamic-size matrices.
|
|
@@ -139,7 +148,9 @@ template<typename _MatrixType> class SelfAdjointEigenSolver
|
|
|
139
148
|
: m_eivec(size, size),
|
|
140
149
|
m_eivalues(size),
|
|
141
150
|
m_subdiag(size > 1 ? size - 1 : 1),
|
|
142
|
-
|
|
151
|
+
m_hcoeffs(size > 1 ? size - 1 : 1),
|
|
152
|
+
m_isInitialized(false),
|
|
153
|
+
m_eigenvectorsOk(false)
|
|
143
154
|
{}
|
|
144
155
|
|
|
145
156
|
/** \brief Constructor; computes eigendecomposition of given matrix.
|
|
@@ -163,7 +174,9 @@ template<typename _MatrixType> class SelfAdjointEigenSolver
|
|
|
163
174
|
: m_eivec(matrix.rows(), matrix.cols()),
|
|
164
175
|
m_eivalues(matrix.cols()),
|
|
165
176
|
m_subdiag(matrix.rows() > 1 ? matrix.rows() - 1 : 1),
|
|
166
|
-
|
|
177
|
+
m_hcoeffs(matrix.cols() > 1 ? matrix.cols() - 1 : 1),
|
|
178
|
+
m_isInitialized(false),
|
|
179
|
+
m_eigenvectorsOk(false)
|
|
167
180
|
{
|
|
168
181
|
compute(matrix.derived(), options);
|
|
169
182
|
}
|
|
@@ -250,6 +263,11 @@ template<typename _MatrixType> class SelfAdjointEigenSolver
|
|
|
250
263
|
* matrix \f$ A \f$, then the matrix returned by this function is the
|
|
251
264
|
* matrix \f$ V \f$ in the eigendecomposition \f$ A = V D V^{-1} \f$.
|
|
252
265
|
*
|
|
266
|
+
* For a selfadjoint matrix, \f$ V \f$ is unitary, meaning its inverse is equal
|
|
267
|
+
* to its adjoint, \f$ V^{-1} = V^{\dagger} \f$. If \f$ A \f$ is real, then
|
|
268
|
+
* \f$ V \f$ is also real and therefore orthogonal, meaning its inverse is
|
|
269
|
+
* equal to its transpose, \f$ V^{-1} = V^T \f$.
|
|
270
|
+
*
|
|
253
271
|
* Example: \include SelfAdjointEigenSolver_eigenvectors.cpp
|
|
254
272
|
* Output: \verbinclude SelfAdjointEigenSolver_eigenvectors.out
|
|
255
273
|
*
|
|
@@ -337,7 +355,7 @@ template<typename _MatrixType> class SelfAdjointEigenSolver
|
|
|
337
355
|
|
|
338
356
|
/** \brief Reports whether previous computation was successful.
|
|
339
357
|
*
|
|
340
|
-
* \returns \c Success if computation was
|
|
358
|
+
* \returns \c Success if computation was successful, \c NoConvergence otherwise.
|
|
341
359
|
*/
|
|
342
360
|
EIGEN_DEVICE_FUNC
|
|
343
361
|
ComputationInfo info() const
|
|
@@ -354,7 +372,8 @@ template<typename _MatrixType> class SelfAdjointEigenSolver
|
|
|
354
372
|
static const int m_maxIterations = 30;
|
|
355
373
|
|
|
356
374
|
protected:
|
|
357
|
-
static
|
|
375
|
+
static EIGEN_DEVICE_FUNC
|
|
376
|
+
void check_template_parameters()
|
|
358
377
|
{
|
|
359
378
|
EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar);
|
|
360
379
|
}
|
|
@@ -362,6 +381,7 @@ template<typename _MatrixType> class SelfAdjointEigenSolver
|
|
|
362
381
|
EigenvectorsType m_eivec;
|
|
363
382
|
RealVectorType m_eivalues;
|
|
364
383
|
typename TridiagonalizationType::SubDiagonalType m_subdiag;
|
|
384
|
+
typename TridiagonalizationType::CoeffVectorType m_hcoeffs;
|
|
365
385
|
ComputationInfo m_info;
|
|
366
386
|
bool m_isInitialized;
|
|
367
387
|
bool m_eigenvectorsOk;
|
|
@@ -403,7 +423,7 @@ SelfAdjointEigenSolver<MatrixType>& SelfAdjointEigenSolver<MatrixType>
|
|
|
403
423
|
|
|
404
424
|
const InputType &matrix(a_matrix.derived());
|
|
405
425
|
|
|
406
|
-
|
|
426
|
+
EIGEN_USING_STD(abs);
|
|
407
427
|
eigen_assert(matrix.cols() == matrix.rows());
|
|
408
428
|
eigen_assert((options&~(EigVecMask|GenEigMask))==0
|
|
409
429
|
&& (options&EigVecMask)!=EigVecMask
|
|
@@ -434,7 +454,8 @@ SelfAdjointEigenSolver<MatrixType>& SelfAdjointEigenSolver<MatrixType>
|
|
|
434
454
|
if(scale==RealScalar(0)) scale = RealScalar(1);
|
|
435
455
|
mat.template triangularView<Lower>() /= scale;
|
|
436
456
|
m_subdiag.resize(n-1);
|
|
437
|
-
|
|
457
|
+
m_hcoeffs.resize(n-1);
|
|
458
|
+
internal::tridiagonalization_inplace(mat, diag, m_subdiag, m_hcoeffs, computeEigenvectors);
|
|
438
459
|
|
|
439
460
|
m_info = internal::computeFromTridiagonal_impl(diag, m_subdiag, m_maxIterations, computeEigenvectors, m_eivec);
|
|
440
461
|
|
|
@@ -479,10 +500,9 @@ namespace internal {
|
|
|
479
500
|
* \returns \c Success or \c NoConvergence
|
|
480
501
|
*/
|
|
481
502
|
template<typename MatrixType, typename DiagType, typename SubDiagType>
|
|
503
|
+
EIGEN_DEVICE_FUNC
|
|
482
504
|
ComputationInfo computeFromTridiagonal_impl(DiagType& diag, SubDiagType& subdiag, const Index maxIterations, bool computeEigenvectors, MatrixType& eivec)
|
|
483
505
|
{
|
|
484
|
-
using std::abs;
|
|
485
|
-
|
|
486
506
|
ComputationInfo info;
|
|
487
507
|
typedef typename MatrixType::Scalar Scalar;
|
|
488
508
|
|
|
@@ -493,15 +513,23 @@ ComputationInfo computeFromTridiagonal_impl(DiagType& diag, SubDiagType& subdiag
|
|
|
493
513
|
|
|
494
514
|
typedef typename DiagType::RealScalar RealScalar;
|
|
495
515
|
const RealScalar considerAsZero = (std::numeric_limits<RealScalar>::min)();
|
|
496
|
-
const RealScalar
|
|
497
|
-
|
|
516
|
+
const RealScalar precision_inv = RealScalar(1)/NumTraits<RealScalar>::epsilon();
|
|
498
517
|
while (end>0)
|
|
499
518
|
{
|
|
500
|
-
for (Index i = start; i<end; ++i)
|
|
501
|
-
if (
|
|
502
|
-
subdiag[i] = 0;
|
|
519
|
+
for (Index i = start; i<end; ++i) {
|
|
520
|
+
if (numext::abs(subdiag[i]) < considerAsZero) {
|
|
521
|
+
subdiag[i] = RealScalar(0);
|
|
522
|
+
} else {
|
|
523
|
+
// abs(subdiag[i]) <= epsilon * sqrt(abs(diag[i]) + abs(diag[i+1]))
|
|
524
|
+
// Scaled to prevent underflows.
|
|
525
|
+
const RealScalar scaled_subdiag = precision_inv * subdiag[i];
|
|
526
|
+
if (scaled_subdiag * scaled_subdiag <= (numext::abs(diag[i])+numext::abs(diag[i+1]))) {
|
|
527
|
+
subdiag[i] = RealScalar(0);
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
}
|
|
503
531
|
|
|
504
|
-
// find the largest unreduced block
|
|
532
|
+
// find the largest unreduced block at the end of the matrix.
|
|
505
533
|
while (end>0 && subdiag[end-1]==RealScalar(0))
|
|
506
534
|
{
|
|
507
535
|
end--;
|
|
@@ -535,7 +563,7 @@ ComputationInfo computeFromTridiagonal_impl(DiagType& diag, SubDiagType& subdiag
|
|
|
535
563
|
diag.segment(i,n-i).minCoeff(&k);
|
|
536
564
|
if (k > 0)
|
|
537
565
|
{
|
|
538
|
-
|
|
566
|
+
numext::swap(diag[i], diag[k+i]);
|
|
539
567
|
if(computeEigenvectors)
|
|
540
568
|
eivec.col(i).swap(eivec.col(k+i));
|
|
541
569
|
}
|
|
@@ -566,10 +594,10 @@ template<typename SolverType> struct direct_selfadjoint_eigenvalues<SolverType,3
|
|
|
566
594
|
EIGEN_DEVICE_FUNC
|
|
567
595
|
static inline void computeRoots(const MatrixType& m, VectorType& roots)
|
|
568
596
|
{
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
597
|
+
EIGEN_USING_STD(sqrt)
|
|
598
|
+
EIGEN_USING_STD(atan2)
|
|
599
|
+
EIGEN_USING_STD(cos)
|
|
600
|
+
EIGEN_USING_STD(sin)
|
|
573
601
|
const Scalar s_inv3 = Scalar(1)/Scalar(3);
|
|
574
602
|
const Scalar s_sqrt3 = sqrt(Scalar(3));
|
|
575
603
|
|
|
@@ -605,7 +633,8 @@ template<typename SolverType> struct direct_selfadjoint_eigenvalues<SolverType,3
|
|
|
605
633
|
EIGEN_DEVICE_FUNC
|
|
606
634
|
static inline bool extract_kernel(MatrixType& mat, Ref<VectorType> res, Ref<VectorType> representative)
|
|
607
635
|
{
|
|
608
|
-
|
|
636
|
+
EIGEN_USING_STD(abs);
|
|
637
|
+
EIGEN_USING_STD(sqrt);
|
|
609
638
|
Index i0;
|
|
610
639
|
// Find non-zero column i0 (by construction, there must exist a non zero coefficient on the diagonal):
|
|
611
640
|
mat.diagonal().cwiseAbs().maxCoeff(&i0);
|
|
@@ -616,8 +645,8 @@ template<typename SolverType> struct direct_selfadjoint_eigenvalues<SolverType,3
|
|
|
616
645
|
VectorType c0, c1;
|
|
617
646
|
n0 = (c0 = representative.cross(mat.col((i0+1)%3))).squaredNorm();
|
|
618
647
|
n1 = (c1 = representative.cross(mat.col((i0+2)%3))).squaredNorm();
|
|
619
|
-
if(n0>n1) res = c0/
|
|
620
|
-
else res = c1/
|
|
648
|
+
if(n0>n1) res = c0/sqrt(n0);
|
|
649
|
+
else res = c1/sqrt(n1);
|
|
621
650
|
|
|
622
651
|
return true;
|
|
623
652
|
}
|
|
@@ -719,7 +748,7 @@ struct direct_selfadjoint_eigenvalues<SolverType,2,false>
|
|
|
719
748
|
EIGEN_DEVICE_FUNC
|
|
720
749
|
static inline void computeRoots(const MatrixType& m, VectorType& roots)
|
|
721
750
|
{
|
|
722
|
-
|
|
751
|
+
EIGEN_USING_STD(sqrt);
|
|
723
752
|
const Scalar t0 = Scalar(0.5) * sqrt( numext::abs2(m(0,0)-m(1,1)) + Scalar(4)*numext::abs2(m(1,0)));
|
|
724
753
|
const Scalar t1 = Scalar(0.5) * (m(0,0) + m(1,1));
|
|
725
754
|
roots(0) = t1 - t0;
|
|
@@ -729,8 +758,8 @@ struct direct_selfadjoint_eigenvalues<SolverType,2,false>
|
|
|
729
758
|
EIGEN_DEVICE_FUNC
|
|
730
759
|
static inline void run(SolverType& solver, const MatrixType& mat, int options)
|
|
731
760
|
{
|
|
732
|
-
|
|
733
|
-
|
|
761
|
+
EIGEN_USING_STD(sqrt);
|
|
762
|
+
EIGEN_USING_STD(abs);
|
|
734
763
|
|
|
735
764
|
eigen_assert(mat.cols() == 2 && mat.cols() == mat.rows());
|
|
736
765
|
eigen_assert((options&~(EigVecMask|GenEigMask))==0
|
|
@@ -803,32 +832,38 @@ SelfAdjointEigenSolver<MatrixType>& SelfAdjointEigenSolver<MatrixType>
|
|
|
803
832
|
}
|
|
804
833
|
|
|
805
834
|
namespace internal {
|
|
835
|
+
|
|
836
|
+
// Francis implicit QR step.
|
|
806
837
|
template<int StorageOrder,typename RealScalar, typename Scalar, typename Index>
|
|
807
838
|
EIGEN_DEVICE_FUNC
|
|
808
839
|
static void tridiagonal_qr_step(RealScalar* diag, RealScalar* subdiag, Index start, Index end, Scalar* matrixQ, Index n)
|
|
809
840
|
{
|
|
810
|
-
|
|
841
|
+
// Wilkinson Shift.
|
|
811
842
|
RealScalar td = (diag[end-1] - diag[end])*RealScalar(0.5);
|
|
812
843
|
RealScalar e = subdiag[end-1];
|
|
813
844
|
// Note that thanks to scaling, e^2 or td^2 cannot overflow, however they can still
|
|
814
845
|
// underflow thus leading to inf/NaN values when using the following commented code:
|
|
815
|
-
// RealScalar e2 = numext::abs2(subdiag[end-1]);
|
|
816
|
-
// RealScalar mu = diag[end] - e2 / (td + (td>0 ? 1 : -1) * sqrt(td*td + e2));
|
|
846
|
+
// RealScalar e2 = numext::abs2(subdiag[end-1]);
|
|
847
|
+
// RealScalar mu = diag[end] - e2 / (td + (td>0 ? 1 : -1) * sqrt(td*td + e2));
|
|
817
848
|
// This explain the following, somewhat more complicated, version:
|
|
818
849
|
RealScalar mu = diag[end];
|
|
819
|
-
if(td==RealScalar(0))
|
|
820
|
-
mu -= abs(e);
|
|
821
|
-
else
|
|
822
|
-
|
|
823
|
-
RealScalar
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
else
|
|
850
|
+
if(td==RealScalar(0)) {
|
|
851
|
+
mu -= numext::abs(e);
|
|
852
|
+
} else if (e != RealScalar(0)) {
|
|
853
|
+
const RealScalar e2 = numext::abs2(e);
|
|
854
|
+
const RealScalar h = numext::hypot(td,e);
|
|
855
|
+
if(e2 == RealScalar(0)) {
|
|
856
|
+
mu -= e / ((td + (td>RealScalar(0) ? h : -h)) / e);
|
|
857
|
+
} else {
|
|
858
|
+
mu -= e2 / (td + (td>RealScalar(0) ? h : -h));
|
|
859
|
+
}
|
|
827
860
|
}
|
|
828
|
-
|
|
861
|
+
|
|
829
862
|
RealScalar x = diag[start] - mu;
|
|
830
863
|
RealScalar z = subdiag[start];
|
|
831
|
-
|
|
864
|
+
// If z ever becomes zero, the Givens rotation will be the identity and
|
|
865
|
+
// z will stay zero for all future iterations.
|
|
866
|
+
for (Index k = start; k < end && z != RealScalar(0); ++k)
|
|
832
867
|
{
|
|
833
868
|
JacobiRotation<RealScalar> rot;
|
|
834
869
|
rot.makeGivens(x, z);
|
|
@@ -841,12 +876,11 @@ static void tridiagonal_qr_step(RealScalar* diag, RealScalar* subdiag, Index sta
|
|
|
841
876
|
diag[k+1] = rot.s() * sdk + rot.c() * dkp1;
|
|
842
877
|
subdiag[k] = rot.c() * sdk - rot.s() * dkp1;
|
|
843
878
|
|
|
844
|
-
|
|
845
879
|
if (k > start)
|
|
846
880
|
subdiag[k - 1] = rot.c() * subdiag[k-1] - rot.s() * z;
|
|
847
881
|
|
|
882
|
+
// "Chasing the bulge" to return to triangular form.
|
|
848
883
|
x = subdiag[k];
|
|
849
|
-
|
|
850
884
|
if (k < end - 1)
|
|
851
885
|
{
|
|
852
886
|
z = -rot.s() * subdiag[k+1];
|
|
@@ -11,10 +11,10 @@
|
|
|
11
11
|
#ifndef EIGEN_TRIDIAGONALIZATION_H
|
|
12
12
|
#define EIGEN_TRIDIAGONALIZATION_H
|
|
13
13
|
|
|
14
|
-
namespace Eigen {
|
|
14
|
+
namespace Eigen {
|
|
15
15
|
|
|
16
16
|
namespace internal {
|
|
17
|
-
|
|
17
|
+
|
|
18
18
|
template<typename MatrixType> struct TridiagonalizationMatrixTReturnType;
|
|
19
19
|
template<typename MatrixType>
|
|
20
20
|
struct traits<TridiagonalizationMatrixTReturnType<MatrixType> >
|
|
@@ -25,6 +25,7 @@ struct traits<TridiagonalizationMatrixTReturnType<MatrixType> >
|
|
|
25
25
|
};
|
|
26
26
|
|
|
27
27
|
template<typename MatrixType, typename CoeffVectorType>
|
|
28
|
+
EIGEN_DEVICE_FUNC
|
|
28
29
|
void tridiagonalization_inplace(MatrixType& matA, CoeffVectorType& hCoeffs);
|
|
29
30
|
}
|
|
30
31
|
|
|
@@ -344,6 +345,7 @@ namespace internal {
|
|
|
344
345
|
* \sa Tridiagonalization::packedMatrix()
|
|
345
346
|
*/
|
|
346
347
|
template<typename MatrixType, typename CoeffVectorType>
|
|
348
|
+
EIGEN_DEVICE_FUNC
|
|
347
349
|
void tridiagonalization_inplace(MatrixType& matA, CoeffVectorType& hCoeffs)
|
|
348
350
|
{
|
|
349
351
|
using numext::conj;
|
|
@@ -352,7 +354,7 @@ void tridiagonalization_inplace(MatrixType& matA, CoeffVectorType& hCoeffs)
|
|
|
352
354
|
Index n = matA.rows();
|
|
353
355
|
eigen_assert(n==matA.cols());
|
|
354
356
|
eigen_assert(n==hCoeffs.size()+1 || n==1);
|
|
355
|
-
|
|
357
|
+
|
|
356
358
|
for (Index i = 0; i<n-1; ++i)
|
|
357
359
|
{
|
|
358
360
|
Index remainingSize = n-i-1;
|
|
@@ -423,11 +425,13 @@ struct tridiagonalization_inplace_selector;
|
|
|
423
425
|
*
|
|
424
426
|
* \sa class Tridiagonalization
|
|
425
427
|
*/
|
|
426
|
-
template<typename MatrixType, typename DiagonalType, typename SubDiagonalType>
|
|
427
|
-
|
|
428
|
+
template<typename MatrixType, typename DiagonalType, typename SubDiagonalType, typename CoeffVectorType>
|
|
429
|
+
EIGEN_DEVICE_FUNC
|
|
430
|
+
void tridiagonalization_inplace(MatrixType& mat, DiagonalType& diag, SubDiagonalType& subdiag,
|
|
431
|
+
CoeffVectorType& hcoeffs, bool extractQ)
|
|
428
432
|
{
|
|
429
433
|
eigen_assert(mat.cols()==mat.rows() && diag.size()==mat.rows() && subdiag.size()==mat.rows()-1);
|
|
430
|
-
tridiagonalization_inplace_selector<MatrixType>::run(mat, diag, subdiag, extractQ);
|
|
434
|
+
tridiagonalization_inplace_selector<MatrixType>::run(mat, diag, subdiag, hcoeffs, extractQ);
|
|
431
435
|
}
|
|
432
436
|
|
|
433
437
|
/** \internal
|
|
@@ -439,10 +443,10 @@ struct tridiagonalization_inplace_selector
|
|
|
439
443
|
typedef typename Tridiagonalization<MatrixType>::CoeffVectorType CoeffVectorType;
|
|
440
444
|
typedef typename Tridiagonalization<MatrixType>::HouseholderSequenceType HouseholderSequenceType;
|
|
441
445
|
template<typename DiagonalType, typename SubDiagonalType>
|
|
442
|
-
static
|
|
446
|
+
static EIGEN_DEVICE_FUNC
|
|
447
|
+
void run(MatrixType& mat, DiagonalType& diag, SubDiagonalType& subdiag, CoeffVectorType& hCoeffs, bool extractQ)
|
|
443
448
|
{
|
|
444
|
-
|
|
445
|
-
tridiagonalization_inplace(mat,hCoeffs);
|
|
449
|
+
tridiagonalization_inplace(mat, hCoeffs);
|
|
446
450
|
diag = mat.diagonal().real();
|
|
447
451
|
subdiag = mat.template diagonal<-1>().real();
|
|
448
452
|
if(extractQ)
|
|
@@ -462,8 +466,8 @@ struct tridiagonalization_inplace_selector<MatrixType,3,false>
|
|
|
462
466
|
typedef typename MatrixType::Scalar Scalar;
|
|
463
467
|
typedef typename MatrixType::RealScalar RealScalar;
|
|
464
468
|
|
|
465
|
-
template<typename DiagonalType, typename SubDiagonalType>
|
|
466
|
-
static void run(MatrixType& mat, DiagonalType& diag, SubDiagonalType& subdiag, bool extractQ)
|
|
469
|
+
template<typename DiagonalType, typename SubDiagonalType, typename CoeffVectorType>
|
|
470
|
+
static void run(MatrixType& mat, DiagonalType& diag, SubDiagonalType& subdiag, CoeffVectorType&, bool extractQ)
|
|
467
471
|
{
|
|
468
472
|
using std::sqrt;
|
|
469
473
|
const RealScalar tol = (std::numeric_limits<RealScalar>::min)();
|
|
@@ -507,8 +511,9 @@ struct tridiagonalization_inplace_selector<MatrixType,1,IsComplex>
|
|
|
507
511
|
{
|
|
508
512
|
typedef typename MatrixType::Scalar Scalar;
|
|
509
513
|
|
|
510
|
-
template<typename DiagonalType, typename SubDiagonalType>
|
|
511
|
-
static
|
|
514
|
+
template<typename DiagonalType, typename SubDiagonalType, typename CoeffVectorType>
|
|
515
|
+
static EIGEN_DEVICE_FUNC
|
|
516
|
+
void run(MatrixType& mat, DiagonalType& diag, SubDiagonalType&, CoeffVectorType&, bool extractQ)
|
|
512
517
|
{
|
|
513
518
|
diag(0,0) = numext::real(mat(0,0));
|
|
514
519
|
if(extractQ)
|
|
@@ -542,8 +547,8 @@ template<typename MatrixType> struct TridiagonalizationMatrixTReturnType
|
|
|
542
547
|
result.template diagonal<-1>() = m_matrix.template diagonal<-1>();
|
|
543
548
|
}
|
|
544
549
|
|
|
545
|
-
Index rows() const { return m_matrix.rows(); }
|
|
546
|
-
Index cols() const { return m_matrix.cols(); }
|
|
550
|
+
EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT { return m_matrix.rows(); }
|
|
551
|
+
EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT { return m_matrix.cols(); }
|
|
547
552
|
|
|
548
553
|
protected:
|
|
549
554
|
typename MatrixType::Nested m_matrix;
|