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
|
@@ -22,6 +22,11 @@
|
|
|
22
22
|
// #define EIGEN_BDCSVD_DEBUG_VERBOSE
|
|
23
23
|
// #define EIGEN_BDCSVD_SANITY_CHECKS
|
|
24
24
|
|
|
25
|
+
#ifdef EIGEN_BDCSVD_SANITY_CHECKS
|
|
26
|
+
#undef eigen_internal_assert
|
|
27
|
+
#define eigen_internal_assert(X) assert(X);
|
|
28
|
+
#endif
|
|
29
|
+
|
|
25
30
|
namespace Eigen {
|
|
26
31
|
|
|
27
32
|
#ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
|
|
@@ -34,6 +39,7 @@ namespace internal {
|
|
|
34
39
|
|
|
35
40
|
template<typename _MatrixType>
|
|
36
41
|
struct traits<BDCSVD<_MatrixType> >
|
|
42
|
+
: traits<_MatrixType>
|
|
37
43
|
{
|
|
38
44
|
typedef _MatrixType MatrixType;
|
|
39
45
|
};
|
|
@@ -57,7 +63,7 @@ struct traits<BDCSVD<_MatrixType> >
|
|
|
57
63
|
* recommended and can several order of magnitude faster.
|
|
58
64
|
*
|
|
59
65
|
* \warning this algorithm is unlikely to provide accurate result when compiled with unsafe math optimizations.
|
|
60
|
-
* For instance, this concerns Intel's compiler (ICC), which
|
|
66
|
+
* For instance, this concerns Intel's compiler (ICC), which performs such optimization by default unless
|
|
61
67
|
* you compile with the \c -fp-model \c precise option. Likewise, the \c -ffast-math option of GCC or clang will
|
|
62
68
|
* significantly degrade the accuracy.
|
|
63
69
|
*
|
|
@@ -105,7 +111,7 @@ public:
|
|
|
105
111
|
* The default constructor is useful in cases in which the user intends to
|
|
106
112
|
* perform decompositions via BDCSVD::compute(const MatrixType&).
|
|
107
113
|
*/
|
|
108
|
-
BDCSVD() : m_algoswap(16), m_numIters(0)
|
|
114
|
+
BDCSVD() : m_algoswap(16), m_isTranspose(false), m_compU(false), m_compV(false), m_numIters(0)
|
|
109
115
|
{}
|
|
110
116
|
|
|
111
117
|
|
|
@@ -202,6 +208,7 @@ protected:
|
|
|
202
208
|
using Base::m_computeThinV;
|
|
203
209
|
using Base::m_matrixU;
|
|
204
210
|
using Base::m_matrixV;
|
|
211
|
+
using Base::m_info;
|
|
205
212
|
using Base::m_isInitialized;
|
|
206
213
|
using Base::m_nonzeroSingularValues;
|
|
207
214
|
|
|
@@ -212,7 +219,7 @@ public:
|
|
|
212
219
|
|
|
213
220
|
// Method to allocate and initialize matrix and attributes
|
|
214
221
|
template<typename MatrixType>
|
|
215
|
-
void BDCSVD<MatrixType>::allocate(Index rows, Index cols, unsigned int computationOptions)
|
|
222
|
+
void BDCSVD<MatrixType>::allocate(Eigen::Index rows, Eigen::Index cols, unsigned int computationOptions)
|
|
216
223
|
{
|
|
217
224
|
m_isTranspose = (cols > rows);
|
|
218
225
|
|
|
@@ -250,16 +257,25 @@ BDCSVD<MatrixType>& BDCSVD<MatrixType>::compute(const MatrixType& matrix, unsign
|
|
|
250
257
|
{
|
|
251
258
|
// FIXME this line involves temporaries
|
|
252
259
|
JacobiSVD<MatrixType> jsvd(matrix,computationOptions);
|
|
253
|
-
if(computeU()) m_matrixU = jsvd.matrixU();
|
|
254
|
-
if(computeV()) m_matrixV = jsvd.matrixV();
|
|
255
|
-
m_singularValues = jsvd.singularValues();
|
|
256
|
-
m_nonzeroSingularValues = jsvd.nonzeroSingularValues();
|
|
257
260
|
m_isInitialized = true;
|
|
261
|
+
m_info = jsvd.info();
|
|
262
|
+
if (m_info == Success || m_info == NoConvergence) {
|
|
263
|
+
if(computeU()) m_matrixU = jsvd.matrixU();
|
|
264
|
+
if(computeV()) m_matrixV = jsvd.matrixV();
|
|
265
|
+
m_singularValues = jsvd.singularValues();
|
|
266
|
+
m_nonzeroSingularValues = jsvd.nonzeroSingularValues();
|
|
267
|
+
}
|
|
258
268
|
return *this;
|
|
259
269
|
}
|
|
260
270
|
|
|
261
271
|
//**** step 0 - Copy the input matrix and apply scaling to reduce over/under-flows
|
|
262
|
-
RealScalar scale = matrix.cwiseAbs().maxCoeff();
|
|
272
|
+
RealScalar scale = matrix.cwiseAbs().template maxCoeff<PropagateNaN>();
|
|
273
|
+
if (!(numext::isfinite)(scale)) {
|
|
274
|
+
m_isInitialized = true;
|
|
275
|
+
m_info = InvalidInput;
|
|
276
|
+
return *this;
|
|
277
|
+
}
|
|
278
|
+
|
|
263
279
|
if(scale==Literal(0)) scale = Literal(1);
|
|
264
280
|
MatrixX copy;
|
|
265
281
|
if (m_isTranspose) copy = matrix.adjoint()/scale;
|
|
@@ -276,7 +292,11 @@ BDCSVD<MatrixType>& BDCSVD<MatrixType>::compute(const MatrixType& matrix, unsign
|
|
|
276
292
|
m_computed.topRows(m_diagSize) = bid.bidiagonal().toDenseMatrix().transpose();
|
|
277
293
|
m_computed.template bottomRows<1>().setZero();
|
|
278
294
|
divide(0, m_diagSize - 1, 0, 0, 0);
|
|
279
|
-
|
|
295
|
+
if (m_info != Success && m_info != NoConvergence) {
|
|
296
|
+
m_isInitialized = true;
|
|
297
|
+
return *this;
|
|
298
|
+
}
|
|
299
|
+
|
|
280
300
|
//**** step 3 - Copy singular values and vectors
|
|
281
301
|
for (int i=0; i<m_diagSize; i++)
|
|
282
302
|
{
|
|
@@ -388,7 +408,7 @@ void BDCSVD<MatrixType>::structured_update(Block<MatrixXr,Dynamic,Dynamic> A, co
|
|
|
388
408
|
//@param shift : Each time one takes the left submatrix, one must add 1 to the shift. Why? Because! We actually want the last column of the U submatrix
|
|
389
409
|
// to become the first column (*coeff) and to shift all the other columns to the right. There are more details on the reference paper.
|
|
390
410
|
template<typename MatrixType>
|
|
391
|
-
void BDCSVD<MatrixType>::divide
|
|
411
|
+
void BDCSVD<MatrixType>::divide(Eigen::Index firstCol, Eigen::Index lastCol, Eigen::Index firstRowW, Eigen::Index firstColW, Eigen::Index shift)
|
|
392
412
|
{
|
|
393
413
|
// requires rows = cols + 1;
|
|
394
414
|
using std::pow;
|
|
@@ -408,6 +428,8 @@ void BDCSVD<MatrixType>::divide (Index firstCol, Index lastCol, Index firstRowW,
|
|
|
408
428
|
{
|
|
409
429
|
// FIXME this line involves temporaries
|
|
410
430
|
JacobiSVD<MatrixXr> b(m_computed.block(firstCol, firstCol, n + 1, n), ComputeFullU | (m_compV ? ComputeFullV : 0));
|
|
431
|
+
m_info = b.info();
|
|
432
|
+
if (m_info != Success && m_info != NoConvergence) return;
|
|
411
433
|
if (m_compU)
|
|
412
434
|
m_naiveU.block(firstCol, firstCol, n + 1, n + 1).real() = b.matrixU();
|
|
413
435
|
else
|
|
@@ -427,7 +449,9 @@ void BDCSVD<MatrixType>::divide (Index firstCol, Index lastCol, Index firstRowW,
|
|
|
427
449
|
// and the divide of the right submatrice reads one column of the left submatrice. That's why we need to treat the
|
|
428
450
|
// right submatrix before the left one.
|
|
429
451
|
divide(k + 1 + firstCol, lastCol, k + 1 + firstRowW, k + 1 + firstColW, shift);
|
|
452
|
+
if (m_info != Success && m_info != NoConvergence) return;
|
|
430
453
|
divide(firstCol, k - 1 + firstCol, firstRowW, firstColW + 1, shift + 1);
|
|
454
|
+
if (m_info != Success && m_info != NoConvergence) return;
|
|
431
455
|
|
|
432
456
|
if (m_compU)
|
|
433
457
|
{
|
|
@@ -568,7 +592,7 @@ void BDCSVD<MatrixType>::divide (Index firstCol, Index lastCol, Index firstRowW,
|
|
|
568
592
|
// handling of round-off errors, be consistent in ordering
|
|
569
593
|
// For instance, to solve the secular equation using FMM, see http://www.stat.uchicago.edu/~lekheng/courses/302/classics/greengard-rokhlin.pdf
|
|
570
594
|
template <typename MatrixType>
|
|
571
|
-
void BDCSVD<MatrixType>::computeSVDofM(Index firstCol, Index n, MatrixXr& U, VectorType& singVals, MatrixXr& V)
|
|
595
|
+
void BDCSVD<MatrixType>::computeSVDofM(Eigen::Index firstCol, Eigen::Index n, MatrixXr& U, VectorType& singVals, MatrixXr& V)
|
|
572
596
|
{
|
|
573
597
|
const RealScalar considerZero = (std::numeric_limits<RealScalar>::min)();
|
|
574
598
|
using std::abs;
|
|
@@ -591,7 +615,7 @@ void BDCSVD<MatrixType>::computeSVDofM(Index firstCol, Index n, MatrixXr& U, Vec
|
|
|
591
615
|
// but others are interleaved and we must ignore them at this stage.
|
|
592
616
|
// To this end, let's compute a permutation skipping them:
|
|
593
617
|
Index actual_n = n;
|
|
594
|
-
while(actual_n>1 && diag(actual_n-1)==Literal(0)) --actual_n;
|
|
618
|
+
while(actual_n>1 && diag(actual_n-1)==Literal(0)) {--actual_n; eigen_internal_assert(col0(actual_n)==Literal(0)); }
|
|
595
619
|
Index m = 0; // size of the deflated problem
|
|
596
620
|
for(Index k=0;k<actual_n;++k)
|
|
597
621
|
if(abs(col0(k))>considerZero)
|
|
@@ -618,13 +642,11 @@ void BDCSVD<MatrixType>::computeSVDofM(Index firstCol, Index n, MatrixXr& U, Vec
|
|
|
618
642
|
std::cout << " shift: " << shifts.transpose() << "\n";
|
|
619
643
|
|
|
620
644
|
{
|
|
621
|
-
Index actual_n = n;
|
|
622
|
-
while(actual_n>1 && abs(col0(actual_n-1))<considerZero) --actual_n;
|
|
623
645
|
std::cout << "\n\n mus: " << mus.head(actual_n).transpose() << "\n\n";
|
|
624
646
|
std::cout << " check1 (expect0) : " << ((singVals.array()-(shifts+mus)) / singVals.array()).head(actual_n).transpose() << "\n\n";
|
|
647
|
+
assert((((singVals.array()-(shifts+mus)) / singVals.array()).head(actual_n) >= 0).all());
|
|
625
648
|
std::cout << " check2 (>0) : " << ((singVals.array()-diag) / singVals.array()).head(actual_n).transpose() << "\n\n";
|
|
626
|
-
|
|
627
|
-
std::cout << " check4 (>0) : " << ((singVals.segment(1,actual_n-1)-singVals.head(actual_n-1))).transpose() << "\n\n\n";
|
|
649
|
+
assert((((singVals.array()-diag) / singVals.array()).head(actual_n) >= 0).all());
|
|
628
650
|
}
|
|
629
651
|
#endif
|
|
630
652
|
|
|
@@ -652,13 +674,13 @@ void BDCSVD<MatrixType>::computeSVDofM(Index firstCol, Index n, MatrixXr& U, Vec
|
|
|
652
674
|
#endif
|
|
653
675
|
|
|
654
676
|
#ifdef EIGEN_BDCSVD_SANITY_CHECKS
|
|
655
|
-
assert(U.allFinite());
|
|
656
|
-
assert(V.allFinite());
|
|
657
|
-
assert((U.transpose() * U - MatrixXr(MatrixXr::Identity(U.cols(),U.cols()))).norm() < 1e-14 * n);
|
|
658
|
-
assert((V.transpose() * V - MatrixXr(MatrixXr::Identity(V.cols(),V.cols()))).norm() < 1e-14 * n);
|
|
659
677
|
assert(m_naiveU.allFinite());
|
|
660
678
|
assert(m_naiveV.allFinite());
|
|
661
679
|
assert(m_computed.allFinite());
|
|
680
|
+
assert(U.allFinite());
|
|
681
|
+
assert(V.allFinite());
|
|
682
|
+
// assert((U.transpose() * U - MatrixXr(MatrixXr::Identity(U.cols(),U.cols()))).norm() < 100*NumTraits<RealScalar>::epsilon() * n);
|
|
683
|
+
// assert((V.transpose() * V - MatrixXr(MatrixXr::Identity(V.cols(),V.cols()))).norm() < 100*NumTraits<RealScalar>::epsilon() * n);
|
|
662
684
|
#endif
|
|
663
685
|
|
|
664
686
|
// Because of deflation, the singular values might not be completely sorted.
|
|
@@ -673,6 +695,15 @@ void BDCSVD<MatrixType>::computeSVDofM(Index firstCol, Index n, MatrixXr& U, Vec
|
|
|
673
695
|
if(m_compV) V.col(i).swap(V.col(i+1));
|
|
674
696
|
}
|
|
675
697
|
}
|
|
698
|
+
|
|
699
|
+
#ifdef EIGEN_BDCSVD_SANITY_CHECKS
|
|
700
|
+
{
|
|
701
|
+
bool singular_values_sorted = (((singVals.segment(1,actual_n-1)-singVals.head(actual_n-1))).array() >= 0).all();
|
|
702
|
+
if(!singular_values_sorted)
|
|
703
|
+
std::cout << "Singular values are not sorted: " << singVals.segment(1,actual_n).transpose() << "\n";
|
|
704
|
+
assert(singular_values_sorted);
|
|
705
|
+
}
|
|
706
|
+
#endif
|
|
676
707
|
|
|
677
708
|
// Reverse order so that singular values in increased order
|
|
678
709
|
// Because of deflation, the zeros singular-values are already at the end
|
|
@@ -749,25 +780,43 @@ void BDCSVD<MatrixType>::computeSingVals(const ArrayRef& col0, const ArrayRef& d
|
|
|
749
780
|
RealScalar mid = left + (right-left) / Literal(2);
|
|
750
781
|
RealScalar fMid = secularEq(mid, col0, diag, perm, diag, Literal(0));
|
|
751
782
|
#ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
|
|
752
|
-
std::cout << right-left << "\n";
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
<< " " << secularEq(0.
|
|
757
|
-
<< " " << secularEq(0.
|
|
758
|
-
<< " " << secularEq(0.
|
|
759
|
-
<< " " << secularEq(0.
|
|
760
|
-
<< " " << secularEq(0.
|
|
761
|
-
<< " " << secularEq(0.
|
|
762
|
-
<< " " << secularEq(0.
|
|
763
|
-
<< " " << secularEq(0.
|
|
764
|
-
<< " " << secularEq(0.
|
|
783
|
+
std::cout << "right-left = " << right-left << "\n";
|
|
784
|
+
// std::cout << "fMid = " << fMid << " " << secularEq(mid-left, col0, diag, perm, ArrayXr(diag-left), left)
|
|
785
|
+
// << " " << secularEq(mid-right, col0, diag, perm, ArrayXr(diag-right), right) << "\n";
|
|
786
|
+
std::cout << " = " << secularEq(left+RealScalar(0.000001)*(right-left), col0, diag, perm, diag, 0)
|
|
787
|
+
<< " " << secularEq(left+RealScalar(0.1) *(right-left), col0, diag, perm, diag, 0)
|
|
788
|
+
<< " " << secularEq(left+RealScalar(0.2) *(right-left), col0, diag, perm, diag, 0)
|
|
789
|
+
<< " " << secularEq(left+RealScalar(0.3) *(right-left), col0, diag, perm, diag, 0)
|
|
790
|
+
<< " " << secularEq(left+RealScalar(0.4) *(right-left), col0, diag, perm, diag, 0)
|
|
791
|
+
<< " " << secularEq(left+RealScalar(0.49) *(right-left), col0, diag, perm, diag, 0)
|
|
792
|
+
<< " " << secularEq(left+RealScalar(0.5) *(right-left), col0, diag, perm, diag, 0)
|
|
793
|
+
<< " " << secularEq(left+RealScalar(0.51) *(right-left), col0, diag, perm, diag, 0)
|
|
794
|
+
<< " " << secularEq(left+RealScalar(0.6) *(right-left), col0, diag, perm, diag, 0)
|
|
795
|
+
<< " " << secularEq(left+RealScalar(0.7) *(right-left), col0, diag, perm, diag, 0)
|
|
796
|
+
<< " " << secularEq(left+RealScalar(0.8) *(right-left), col0, diag, perm, diag, 0)
|
|
797
|
+
<< " " << secularEq(left+RealScalar(0.9) *(right-left), col0, diag, perm, diag, 0)
|
|
798
|
+
<< " " << secularEq(left+RealScalar(0.999999)*(right-left), col0, diag, perm, diag, 0) << "\n";
|
|
765
799
|
#endif
|
|
766
800
|
RealScalar shift = (k == actual_n-1 || fMid > Literal(0)) ? left : right;
|
|
767
801
|
|
|
768
802
|
// measure everything relative to shift
|
|
769
803
|
Map<ArrayXr> diagShifted(m_workspace.data()+4*n, n);
|
|
770
804
|
diagShifted = diag - shift;
|
|
805
|
+
|
|
806
|
+
if(k!=actual_n-1)
|
|
807
|
+
{
|
|
808
|
+
// check that after the shift, f(mid) is still negative:
|
|
809
|
+
RealScalar midShifted = (right - left) / RealScalar(2);
|
|
810
|
+
if(shift==right)
|
|
811
|
+
midShifted = -midShifted;
|
|
812
|
+
RealScalar fMidShifted = secularEq(midShifted, col0, diag, perm, diagShifted, shift);
|
|
813
|
+
if(fMidShifted>0)
|
|
814
|
+
{
|
|
815
|
+
// fMid was erroneous, fix it:
|
|
816
|
+
shift = fMidShifted > Literal(0) ? left : right;
|
|
817
|
+
diagShifted = diag - shift;
|
|
818
|
+
}
|
|
819
|
+
}
|
|
771
820
|
|
|
772
821
|
// initial guess
|
|
773
822
|
RealScalar muPrev, muCur;
|
|
@@ -804,13 +853,16 @@ void BDCSVD<MatrixType>::computeSingVals(const ArrayRef& col0, const ArrayRef& d
|
|
|
804
853
|
// And find mu such that f(mu)==0:
|
|
805
854
|
RealScalar muZero = -a/b;
|
|
806
855
|
RealScalar fZero = secularEq(muZero, col0, diag, perm, diagShifted, shift);
|
|
856
|
+
|
|
857
|
+
#ifdef EIGEN_BDCSVD_SANITY_CHECKS
|
|
858
|
+
assert((numext::isfinite)(fZero));
|
|
859
|
+
#endif
|
|
807
860
|
|
|
808
861
|
muPrev = muCur;
|
|
809
862
|
fPrev = fCur;
|
|
810
863
|
muCur = muZero;
|
|
811
864
|
fCur = fZero;
|
|
812
865
|
|
|
813
|
-
|
|
814
866
|
if (shift == left && (muCur < Literal(0) || muCur > right - left)) useBisection = true;
|
|
815
867
|
if (shift == right && (muCur < -(right - left) || muCur > Literal(0))) useBisection = true;
|
|
816
868
|
if (abs(fCur)>abs(fPrev)) useBisection = true;
|
|
@@ -843,44 +895,82 @@ void BDCSVD<MatrixType>::computeSingVals(const ArrayRef& col0, const ArrayRef& d
|
|
|
843
895
|
else
|
|
844
896
|
rightShifted = -(std::numeric_limits<RealScalar>::min)();
|
|
845
897
|
}
|
|
846
|
-
|
|
898
|
+
|
|
847
899
|
RealScalar fLeft = secularEq(leftShifted, col0, diag, perm, diagShifted, shift);
|
|
900
|
+
eigen_internal_assert(fLeft<Literal(0));
|
|
848
901
|
|
|
849
|
-
#if defined EIGEN_INTERNAL_DEBUGGING || defined
|
|
902
|
+
#if defined EIGEN_INTERNAL_DEBUGGING || defined EIGEN_BDCSVD_SANITY_CHECKS
|
|
850
903
|
RealScalar fRight = secularEq(rightShifted, col0, diag, perm, diagShifted, shift);
|
|
851
904
|
#endif
|
|
852
905
|
|
|
906
|
+
#ifdef EIGEN_BDCSVD_SANITY_CHECKS
|
|
907
|
+
if(!(numext::isfinite)(fLeft))
|
|
908
|
+
std::cout << "f(" << leftShifted << ") =" << fLeft << " ; " << left << " " << shift << " " << right << "\n";
|
|
909
|
+
assert((numext::isfinite)(fLeft));
|
|
910
|
+
|
|
911
|
+
if(!(numext::isfinite)(fRight))
|
|
912
|
+
std::cout << "f(" << rightShifted << ") =" << fRight << " ; " << left << " " << shift << " " << right << "\n";
|
|
913
|
+
// assert((numext::isfinite)(fRight));
|
|
914
|
+
#endif
|
|
915
|
+
|
|
853
916
|
#ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
|
|
854
917
|
if(!(fLeft * fRight<0))
|
|
855
918
|
{
|
|
856
|
-
std::cout << "
|
|
857
|
-
|
|
919
|
+
std::cout << "f(leftShifted) using leftShifted=" << leftShifted << " ; diagShifted(1:10):" << diagShifted.head(10).transpose() << "\n ; "
|
|
920
|
+
<< "left==shift=" << bool(left==shift) << " ; left-shift = " << (left-shift) << "\n";
|
|
921
|
+
std::cout << "k=" << k << ", " << fLeft << " * " << fRight << " == " << fLeft * fRight << " ; "
|
|
922
|
+
<< "[" << left << " .. " << right << "] -> [" << leftShifted << " " << rightShifted << "], shift=" << shift
|
|
923
|
+
<< " , f(right)=" << secularEq(0, col0, diag, perm, diagShifted, shift)
|
|
924
|
+
<< " == " << secularEq(right, col0, diag, perm, diag, 0) << " == " << fRight << "\n";
|
|
858
925
|
}
|
|
859
926
|
#endif
|
|
860
927
|
eigen_internal_assert(fLeft * fRight < Literal(0));
|
|
861
|
-
|
|
862
|
-
|
|
928
|
+
|
|
929
|
+
if(fLeft<Literal(0))
|
|
863
930
|
{
|
|
864
|
-
|
|
865
|
-
fMid = secularEq(midShifted, col0, diag, perm, diagShifted, shift);
|
|
866
|
-
if (fLeft * fMid < Literal(0))
|
|
931
|
+
while (rightShifted - leftShifted > Literal(2) * NumTraits<RealScalar>::epsilon() * numext::maxi<RealScalar>(abs(leftShifted), abs(rightShifted)))
|
|
867
932
|
{
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
933
|
+
RealScalar midShifted = (leftShifted + rightShifted) / Literal(2);
|
|
934
|
+
fMid = secularEq(midShifted, col0, diag, perm, diagShifted, shift);
|
|
935
|
+
eigen_internal_assert((numext::isfinite)(fMid));
|
|
936
|
+
|
|
937
|
+
if (fLeft * fMid < Literal(0))
|
|
938
|
+
{
|
|
939
|
+
rightShifted = midShifted;
|
|
940
|
+
}
|
|
941
|
+
else
|
|
942
|
+
{
|
|
943
|
+
leftShifted = midShifted;
|
|
944
|
+
fLeft = fMid;
|
|
945
|
+
}
|
|
874
946
|
}
|
|
947
|
+
muCur = (leftShifted + rightShifted) / Literal(2);
|
|
948
|
+
}
|
|
949
|
+
else
|
|
950
|
+
{
|
|
951
|
+
// We have a problem as shifting on the left or right give either a positive or negative value
|
|
952
|
+
// at the middle of [left,right]...
|
|
953
|
+
// Instead fo abbording or entering an infinite loop,
|
|
954
|
+
// let's just use the middle as the estimated zero-crossing:
|
|
955
|
+
muCur = (right - left) * RealScalar(0.5);
|
|
956
|
+
if(shift == right)
|
|
957
|
+
muCur = -muCur;
|
|
875
958
|
}
|
|
876
|
-
|
|
877
|
-
muCur = (leftShifted + rightShifted) / Literal(2);
|
|
878
959
|
}
|
|
879
960
|
|
|
880
961
|
singVals[k] = shift + muCur;
|
|
881
962
|
shifts[k] = shift;
|
|
882
963
|
mus[k] = muCur;
|
|
883
964
|
|
|
965
|
+
#ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
|
|
966
|
+
if(k+1<n)
|
|
967
|
+
std::cout << "found " << singVals[k] << " == " << shift << " + " << muCur << " from " << diag(k) << " .. " << diag(k+1) << "\n";
|
|
968
|
+
#endif
|
|
969
|
+
#ifdef EIGEN_BDCSVD_SANITY_CHECKS
|
|
970
|
+
assert(k==0 || singVals[k]>=singVals[k-1]);
|
|
971
|
+
assert(singVals[k]>=diag(k));
|
|
972
|
+
#endif
|
|
973
|
+
|
|
884
974
|
// perturb singular value slightly if it equals diagonal entry to avoid division by zero later
|
|
885
975
|
// (deflation is supposed to avoid this from happening)
|
|
886
976
|
// - this does no seem to be necessary anymore -
|
|
@@ -904,7 +994,7 @@ void BDCSVD<MatrixType>::perturbCol0
|
|
|
904
994
|
zhat.setZero();
|
|
905
995
|
return;
|
|
906
996
|
}
|
|
907
|
-
Index
|
|
997
|
+
Index lastIdx = perm(m-1);
|
|
908
998
|
// The offset permits to skip deflated entries while computing zhat
|
|
909
999
|
for (Index k = 0; k < n; ++k)
|
|
910
1000
|
{
|
|
@@ -914,27 +1004,58 @@ void BDCSVD<MatrixType>::perturbCol0
|
|
|
914
1004
|
{
|
|
915
1005
|
// see equation (3.6)
|
|
916
1006
|
RealScalar dk = diag(k);
|
|
917
|
-
RealScalar prod = (singVals(
|
|
1007
|
+
RealScalar prod = (singVals(lastIdx) + dk) * (mus(lastIdx) + (shifts(lastIdx) - dk));
|
|
1008
|
+
#ifdef EIGEN_BDCSVD_SANITY_CHECKS
|
|
1009
|
+
if(prod<0) {
|
|
1010
|
+
std::cout << "k = " << k << " ; z(k)=" << col0(k) << ", diag(k)=" << dk << "\n";
|
|
1011
|
+
std::cout << "prod = " << "(" << singVals(lastIdx) << " + " << dk << ") * (" << mus(lastIdx) << " + (" << shifts(lastIdx) << " - " << dk << "))" << "\n";
|
|
1012
|
+
std::cout << " = " << singVals(lastIdx) + dk << " * " << mus(lastIdx) + (shifts(lastIdx) - dk) << "\n";
|
|
1013
|
+
}
|
|
1014
|
+
assert(prod>=0);
|
|
1015
|
+
#endif
|
|
918
1016
|
|
|
919
1017
|
for(Index l = 0; l<m; ++l)
|
|
920
1018
|
{
|
|
921
1019
|
Index i = perm(l);
|
|
922
1020
|
if(i!=k)
|
|
923
1021
|
{
|
|
1022
|
+
#ifdef EIGEN_BDCSVD_SANITY_CHECKS
|
|
1023
|
+
if(i>=k && (l==0 || l-1>=m))
|
|
1024
|
+
{
|
|
1025
|
+
std::cout << "Error in perturbCol0\n";
|
|
1026
|
+
std::cout << " " << k << "/" << n << " " << l << "/" << m << " " << i << "/" << n << " ; " << col0(k) << " " << diag(k) << " " << "\n";
|
|
1027
|
+
std::cout << " " <<diag(i) << "\n";
|
|
1028
|
+
Index j = (i<k /*|| l==0*/) ? i : perm(l-1);
|
|
1029
|
+
std::cout << " " << "j=" << j << "\n";
|
|
1030
|
+
}
|
|
1031
|
+
#endif
|
|
924
1032
|
Index j = i<k ? i : perm(l-1);
|
|
1033
|
+
#ifdef EIGEN_BDCSVD_SANITY_CHECKS
|
|
1034
|
+
if(!(dk!=Literal(0) || diag(i)!=Literal(0)))
|
|
1035
|
+
{
|
|
1036
|
+
std::cout << "k=" << k << ", i=" << i << ", l=" << l << ", perm.size()=" << perm.size() << "\n";
|
|
1037
|
+
}
|
|
1038
|
+
assert(dk!=Literal(0) || diag(i)!=Literal(0));
|
|
1039
|
+
#endif
|
|
925
1040
|
prod *= ((singVals(j)+dk) / ((diag(i)+dk))) * ((mus(j)+(shifts(j)-dk)) / ((diag(i)-dk)));
|
|
1041
|
+
#ifdef EIGEN_BDCSVD_SANITY_CHECKS
|
|
1042
|
+
assert(prod>=0);
|
|
1043
|
+
#endif
|
|
926
1044
|
#ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
|
|
927
|
-
if(i!=k &&
|
|
1045
|
+
if(i!=k && numext::abs(((singVals(j)+dk)*(mus(j)+(shifts(j)-dk)))/((diag(i)+dk)*(diag(i)-dk)) - 1) > 0.9 )
|
|
928
1046
|
std::cout << " " << ((singVals(j)+dk)*(mus(j)+(shifts(j)-dk)))/((diag(i)+dk)*(diag(i)-dk)) << " == (" << (singVals(j)+dk) << " * " << (mus(j)+(shifts(j)-dk))
|
|
929
1047
|
<< ") / (" << (diag(i)+dk) << " * " << (diag(i)-dk) << ")\n";
|
|
930
1048
|
#endif
|
|
931
1049
|
}
|
|
932
1050
|
}
|
|
933
1051
|
#ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
|
|
934
|
-
std::cout << "zhat(" << k << ") = sqrt( " << prod << ") ; " << (singVals(
|
|
1052
|
+
std::cout << "zhat(" << k << ") = sqrt( " << prod << ") ; " << (singVals(lastIdx) + dk) << " * " << mus(lastIdx) + shifts(lastIdx) << " - " << dk << "\n";
|
|
935
1053
|
#endif
|
|
936
1054
|
RealScalar tmp = sqrt(prod);
|
|
937
|
-
|
|
1055
|
+
#ifdef EIGEN_BDCSVD_SANITY_CHECKS
|
|
1056
|
+
assert((numext::isfinite)(tmp));
|
|
1057
|
+
#endif
|
|
1058
|
+
zhat(k) = col0(k) > Literal(0) ? RealScalar(tmp) : RealScalar(-tmp);
|
|
938
1059
|
}
|
|
939
1060
|
}
|
|
940
1061
|
}
|
|
@@ -987,7 +1108,7 @@ void BDCSVD<MatrixType>::computeSingVecs
|
|
|
987
1108
|
// i >= 1, di almost null and zi non null.
|
|
988
1109
|
// We use a rotation to zero out zi applied to the left of M
|
|
989
1110
|
template <typename MatrixType>
|
|
990
|
-
void BDCSVD<MatrixType>::deflation43(Index firstCol, Index shift, Index i, Index size)
|
|
1111
|
+
void BDCSVD<MatrixType>::deflation43(Eigen::Index firstCol, Eigen::Index shift, Eigen::Index i, Eigen::Index size)
|
|
991
1112
|
{
|
|
992
1113
|
using std::abs;
|
|
993
1114
|
using std::sqrt;
|
|
@@ -1016,7 +1137,7 @@ void BDCSVD<MatrixType>::deflation43(Index firstCol, Index shift, Index i, Index
|
|
|
1016
1137
|
// We apply two rotations to have zj = 0;
|
|
1017
1138
|
// TODO deflation44 is still broken and not properly tested
|
|
1018
1139
|
template <typename MatrixType>
|
|
1019
|
-
void BDCSVD<MatrixType>::deflation44(Index firstColu , Index firstColm, Index firstRowW, Index firstColW, Index i, Index j, Index size)
|
|
1140
|
+
void BDCSVD<MatrixType>::deflation44(Eigen::Index firstColu , Eigen::Index firstColm, Eigen::Index firstRowW, Eigen::Index firstColW, Eigen::Index i, Eigen::Index j, Eigen::Index size)
|
|
1020
1141
|
{
|
|
1021
1142
|
using std::abs;
|
|
1022
1143
|
using std::sqrt;
|
|
@@ -1043,7 +1164,7 @@ void BDCSVD<MatrixType>::deflation44(Index firstColu , Index firstColm, Index fi
|
|
|
1043
1164
|
}
|
|
1044
1165
|
c/=r;
|
|
1045
1166
|
s/=r;
|
|
1046
|
-
m_computed(firstColm + i, firstColm) = r;
|
|
1167
|
+
m_computed(firstColm + i, firstColm) = r;
|
|
1047
1168
|
m_computed(firstColm + j, firstColm + j) = m_computed(firstColm + i, firstColm + i);
|
|
1048
1169
|
m_computed(firstColm + j, firstColm) = Literal(0);
|
|
1049
1170
|
|
|
@@ -1056,7 +1177,7 @@ void BDCSVD<MatrixType>::deflation44(Index firstColu , Index firstColm, Index fi
|
|
|
1056
1177
|
|
|
1057
1178
|
// acts on block from (firstCol+shift, firstCol+shift) to (lastCol+shift, lastCol+shift) [inclusive]
|
|
1058
1179
|
template <typename MatrixType>
|
|
1059
|
-
void BDCSVD<MatrixType>::deflation(Index firstCol, Index lastCol, Index k, Index firstRowW, Index firstColW, Index shift)
|
|
1180
|
+
void BDCSVD<MatrixType>::deflation(Eigen::Index firstCol, Eigen::Index lastCol, Eigen::Index k, Eigen::Index firstRowW, Eigen::Index firstColW, Eigen::Index shift)
|
|
1060
1181
|
{
|
|
1061
1182
|
using std::sqrt;
|
|
1062
1183
|
using std::abs;
|
|
@@ -1117,6 +1238,7 @@ void BDCSVD<MatrixType>::deflation(Index firstCol, Index lastCol, Index k, Index
|
|
|
1117
1238
|
#endif
|
|
1118
1239
|
#ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
|
|
1119
1240
|
std::cout << "to be sorted: " << diag.transpose() << "\n\n";
|
|
1241
|
+
std::cout << " : " << col0.transpose() << "\n\n";
|
|
1120
1242
|
#endif
|
|
1121
1243
|
{
|
|
1122
1244
|
// Check for total deflation
|
|
@@ -1207,7 +1329,7 @@ void BDCSVD<MatrixType>::deflation(Index firstCol, Index lastCol, Index k, Index
|
|
|
1207
1329
|
if( (diag(i) - diag(i-1)) < NumTraits<RealScalar>::epsilon()*maxDiag )
|
|
1208
1330
|
{
|
|
1209
1331
|
#ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
|
|
1210
|
-
std::cout << "deflation 4.4 with i = " << i << " because " << (diag(i) - diag(i-1)) << " < " << NumTraits<RealScalar>::epsilon()
|
|
1332
|
+
std::cout << "deflation 4.4 with i = " << i << " because " << diag(i) << " - " << diag(i-1) << " == " << (diag(i) - diag(i-1)) << " < " << NumTraits<RealScalar>::epsilon()*/*diag(i)*/maxDiag << "\n";
|
|
1211
1333
|
#endif
|
|
1212
1334
|
eigen_internal_assert(abs(diag(i) - diag(i-1))<epsilon_coarse && " diagonal entries are not properly sorted");
|
|
1213
1335
|
deflation44(firstCol, firstCol + shift, firstRowW, firstColW, i-1, i, length);
|
|
@@ -1226,7 +1348,6 @@ void BDCSVD<MatrixType>::deflation(Index firstCol, Index lastCol, Index k, Index
|
|
|
1226
1348
|
#endif
|
|
1227
1349
|
}//end deflation
|
|
1228
1350
|
|
|
1229
|
-
#ifndef __CUDACC__
|
|
1230
1351
|
/** \svd_module
|
|
1231
1352
|
*
|
|
1232
1353
|
* \return the singular value decomposition of \c *this computed by Divide & Conquer algorithm
|
|
@@ -1239,7 +1360,6 @@ MatrixBase<Derived>::bdcSvd(unsigned int computationOptions) const
|
|
|
1239
1360
|
{
|
|
1240
1361
|
return BDCSVD<PlainObject>(*this, computationOptions);
|
|
1241
1362
|
}
|
|
1242
|
-
#endif
|
|
1243
1363
|
|
|
1244
1364
|
} // end namespace Eigen
|
|
1245
1365
|
|
|
@@ -112,12 +112,12 @@ public:
|
|
|
112
112
|
ColsAtCompileTime = MatrixType::ColsAtCompileTime,
|
|
113
113
|
MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
|
|
114
114
|
MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime,
|
|
115
|
-
|
|
116
|
-
: ColsAtCompileTime==1 ? (MatrixType::Options | RowMajor)
|
|
117
|
-
: MatrixType::Options
|
|
115
|
+
Options = MatrixType::Options
|
|
118
116
|
};
|
|
119
|
-
|
|
120
|
-
|
|
117
|
+
|
|
118
|
+
typedef typename internal::make_proper_matrix_type<
|
|
119
|
+
Scalar, ColsAtCompileTime, RowsAtCompileTime, Options, MaxColsAtCompileTime, MaxRowsAtCompileTime
|
|
120
|
+
>::type TransposeTypeWithSameStorageOrder;
|
|
121
121
|
|
|
122
122
|
void allocate(const JacobiSVD<MatrixType, FullPivHouseholderQRPreconditioner>& svd)
|
|
123
123
|
{
|
|
@@ -202,13 +202,12 @@ public:
|
|
|
202
202
|
ColsAtCompileTime = MatrixType::ColsAtCompileTime,
|
|
203
203
|
MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
|
|
204
204
|
MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime,
|
|
205
|
-
|
|
206
|
-
: ColsAtCompileTime==1 ? (MatrixType::Options | RowMajor)
|
|
207
|
-
: MatrixType::Options
|
|
205
|
+
Options = MatrixType::Options
|
|
208
206
|
};
|
|
209
207
|
|
|
210
|
-
typedef
|
|
211
|
-
|
|
208
|
+
typedef typename internal::make_proper_matrix_type<
|
|
209
|
+
Scalar, ColsAtCompileTime, RowsAtCompileTime, Options, MaxColsAtCompileTime, MaxRowsAtCompileTime
|
|
210
|
+
>::type TransposeTypeWithSameStorageOrder;
|
|
212
211
|
|
|
213
212
|
void allocate(const JacobiSVD<MatrixType, ColPivHouseholderQRPreconditioner>& svd)
|
|
214
213
|
{
|
|
@@ -303,8 +302,9 @@ public:
|
|
|
303
302
|
Options = MatrixType::Options
|
|
304
303
|
};
|
|
305
304
|
|
|
306
|
-
typedef
|
|
307
|
-
|
|
305
|
+
typedef typename internal::make_proper_matrix_type<
|
|
306
|
+
Scalar, ColsAtCompileTime, RowsAtCompileTime, Options, MaxColsAtCompileTime, MaxRowsAtCompileTime
|
|
307
|
+
>::type TransposeTypeWithSameStorageOrder;
|
|
308
308
|
|
|
309
309
|
void allocate(const JacobiSVD<MatrixType, HouseholderQRPreconditioner>& svd)
|
|
310
310
|
{
|
|
@@ -425,6 +425,7 @@ struct svd_precondition_2x2_block_to_be_real<MatrixType, QRPreconditioner, true>
|
|
|
425
425
|
|
|
426
426
|
template<typename _MatrixType, int QRPreconditioner>
|
|
427
427
|
struct traits<JacobiSVD<_MatrixType,QRPreconditioner> >
|
|
428
|
+
: traits<_MatrixType>
|
|
428
429
|
{
|
|
429
430
|
typedef _MatrixType MatrixType;
|
|
430
431
|
};
|
|
@@ -584,6 +585,7 @@ template<typename _MatrixType, int QRPreconditioner> class JacobiSVD
|
|
|
584
585
|
using Base::m_matrixU;
|
|
585
586
|
using Base::m_matrixV;
|
|
586
587
|
using Base::m_singularValues;
|
|
588
|
+
using Base::m_info;
|
|
587
589
|
using Base::m_isInitialized;
|
|
588
590
|
using Base::m_isAllocated;
|
|
589
591
|
using Base::m_usePrescribedThreshold;
|
|
@@ -610,7 +612,7 @@ template<typename _MatrixType, int QRPreconditioner> class JacobiSVD
|
|
|
610
612
|
};
|
|
611
613
|
|
|
612
614
|
template<typename MatrixType, int QRPreconditioner>
|
|
613
|
-
void JacobiSVD<MatrixType, QRPreconditioner>::allocate(Index rows, Index cols, unsigned int computationOptions)
|
|
615
|
+
void JacobiSVD<MatrixType, QRPreconditioner>::allocate(Eigen::Index rows, Eigen::Index cols, unsigned int computationOptions)
|
|
614
616
|
{
|
|
615
617
|
eigen_assert(rows >= 0 && cols >= 0);
|
|
616
618
|
|
|
@@ -624,6 +626,7 @@ void JacobiSVD<MatrixType, QRPreconditioner>::allocate(Index rows, Index cols, u
|
|
|
624
626
|
|
|
625
627
|
m_rows = rows;
|
|
626
628
|
m_cols = cols;
|
|
629
|
+
m_info = Success;
|
|
627
630
|
m_isInitialized = false;
|
|
628
631
|
m_isAllocated = true;
|
|
629
632
|
m_computationOptions = computationOptions;
|
|
@@ -673,7 +676,12 @@ JacobiSVD<MatrixType, QRPreconditioner>::compute(const MatrixType& matrix, unsig
|
|
|
673
676
|
const RealScalar considerAsZero = (std::numeric_limits<RealScalar>::min)();
|
|
674
677
|
|
|
675
678
|
// Scaling factor to reduce over/under-flows
|
|
676
|
-
RealScalar scale = matrix.cwiseAbs().maxCoeff();
|
|
679
|
+
RealScalar scale = matrix.cwiseAbs().template maxCoeff<PropagateNaN>();
|
|
680
|
+
if (!(numext::isfinite)(scale)) {
|
|
681
|
+
m_isInitialized = true;
|
|
682
|
+
m_info = InvalidInput;
|
|
683
|
+
return *this;
|
|
684
|
+
}
|
|
677
685
|
if(scale==RealScalar(0)) scale = RealScalar(1);
|
|
678
686
|
|
|
679
687
|
/*** step 1. The R-SVD step: we use a QR decomposition to reduce to the case of a square matrix */
|