ruby-eigen 0.0.9 → 0.0.10.pre1
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/LICENSE +22 -0
- data/README.md +21 -0
- data/ext/eigen/eigen3/COPYING.BSD +26 -0
- data/ext/eigen/eigen3/COPYING.MPL2 +373 -0
- data/ext/eigen/eigen3/COPYING.README +18 -0
- data/ext/eigen/eigen3/Eigen/Array +11 -0
- data/ext/eigen/eigen3/Eigen/Cholesky +32 -0
- data/ext/eigen/eigen3/Eigen/CholmodSupport +45 -0
- data/ext/eigen/eigen3/Eigen/Core +376 -0
- data/ext/eigen/eigen3/Eigen/Dense +7 -0
- data/ext/eigen/eigen3/Eigen/Eigen +2 -0
- data/ext/eigen/eigen3/Eigen/Eigen2Support +95 -0
- data/ext/eigen/eigen3/Eigen/Eigenvalues +48 -0
- data/ext/eigen/eigen3/Eigen/Geometry +63 -0
- data/ext/eigen/eigen3/Eigen/Householder +23 -0
- data/ext/eigen/eigen3/Eigen/IterativeLinearSolvers +40 -0
- data/ext/eigen/eigen3/Eigen/Jacobi +26 -0
- data/ext/eigen/eigen3/Eigen/LU +41 -0
- data/ext/eigen/eigen3/Eigen/LeastSquares +32 -0
- data/ext/eigen/eigen3/Eigen/MetisSupport +28 -0
- data/ext/eigen/eigen3/Eigen/PaStiXSupport +46 -0
- data/ext/eigen/eigen3/Eigen/PardisoSupport +30 -0
- data/ext/eigen/eigen3/Eigen/QR +45 -0
- data/ext/eigen/eigen3/Eigen/QtAlignedMalloc +34 -0
- data/ext/eigen/eigen3/Eigen/SPQRSupport +29 -0
- data/ext/eigen/eigen3/Eigen/SVD +37 -0
- data/ext/eigen/eigen3/Eigen/Sparse +27 -0
- data/ext/eigen/eigen3/Eigen/SparseCore +64 -0
- data/ext/eigen/eigen3/Eigen/SparseLU +49 -0
- data/ext/eigen/eigen3/Eigen/SparseQR +33 -0
- data/ext/eigen/eigen3/Eigen/StdDeque +27 -0
- data/ext/eigen/eigen3/Eigen/StdList +26 -0
- data/ext/eigen/eigen3/Eigen/StdVector +27 -0
- data/ext/eigen/eigen3/Eigen/SuperLUSupport +59 -0
- data/ext/eigen/eigen3/Eigen/UmfPackSupport +36 -0
- data/ext/eigen/eigen3/Eigen/src/Cholesky/LDLT.h +611 -0
- data/ext/eigen/eigen3/Eigen/src/Cholesky/LLT.h +498 -0
- data/ext/eigen/eigen3/Eigen/src/Cholesky/LLT_MKL.h +102 -0
- data/ext/eigen/eigen3/Eigen/src/CholmodSupport/CholmodSupport.h +607 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Array.h +323 -0
- data/ext/eigen/eigen3/Eigen/src/Core/ArrayBase.h +226 -0
- data/ext/eigen/eigen3/Eigen/src/Core/ArrayWrapper.h +264 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Assign.h +590 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Assign_MKL.h +224 -0
- data/ext/eigen/eigen3/Eigen/src/Core/BandMatrix.h +334 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Block.h +406 -0
- data/ext/eigen/eigen3/Eigen/src/Core/BooleanRedux.h +154 -0
- data/ext/eigen/eigen3/Eigen/src/Core/CommaInitializer.h +154 -0
- data/ext/eigen/eigen3/Eigen/src/Core/CoreIterators.h +61 -0
- data/ext/eigen/eigen3/Eigen/src/Core/CwiseBinaryOp.h +230 -0
- data/ext/eigen/eigen3/Eigen/src/Core/CwiseNullaryOp.h +864 -0
- data/ext/eigen/eigen3/Eigen/src/Core/CwiseUnaryOp.h +126 -0
- data/ext/eigen/eigen3/Eigen/src/Core/CwiseUnaryView.h +139 -0
- data/ext/eigen/eigen3/Eigen/src/Core/DenseBase.h +521 -0
- data/ext/eigen/eigen3/Eigen/src/Core/DenseCoeffsBase.h +754 -0
- data/ext/eigen/eigen3/Eigen/src/Core/DenseStorage.h +434 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Diagonal.h +237 -0
- data/ext/eigen/eigen3/Eigen/src/Core/DiagonalMatrix.h +313 -0
- data/ext/eigen/eigen3/Eigen/src/Core/DiagonalProduct.h +131 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Dot.h +263 -0
- data/ext/eigen/eigen3/Eigen/src/Core/EigenBase.h +131 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Flagged.h +140 -0
- data/ext/eigen/eigen3/Eigen/src/Core/ForceAlignedAccess.h +146 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Functors.h +1026 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Fuzzy.h +150 -0
- data/ext/eigen/eigen3/Eigen/src/Core/GeneralProduct.h +635 -0
- data/ext/eigen/eigen3/Eigen/src/Core/GenericPacketMath.h +350 -0
- data/ext/eigen/eigen3/Eigen/src/Core/GlobalFunctions.h +92 -0
- data/ext/eigen/eigen3/Eigen/src/Core/IO.h +250 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Map.h +192 -0
- data/ext/eigen/eigen3/Eigen/src/Core/MapBase.h +247 -0
- data/ext/eigen/eigen3/Eigen/src/Core/MathFunctions.h +768 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Matrix.h +420 -0
- data/ext/eigen/eigen3/Eigen/src/Core/MatrixBase.h +563 -0
- data/ext/eigen/eigen3/Eigen/src/Core/NestByValue.h +111 -0
- data/ext/eigen/eigen3/Eigen/src/Core/NoAlias.h +134 -0
- data/ext/eigen/eigen3/Eigen/src/Core/NumTraits.h +150 -0
- data/ext/eigen/eigen3/Eigen/src/Core/PermutationMatrix.h +721 -0
- data/ext/eigen/eigen3/Eigen/src/Core/PlainObjectBase.h +822 -0
- data/ext/eigen/eigen3/Eigen/src/Core/ProductBase.h +290 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Random.h +152 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Redux.h +409 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Ref.h +278 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Replicate.h +177 -0
- data/ext/eigen/eigen3/Eigen/src/Core/ReturnByValue.h +99 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Reverse.h +224 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Select.h +162 -0
- data/ext/eigen/eigen3/Eigen/src/Core/SelfAdjointView.h +314 -0
- data/ext/eigen/eigen3/Eigen/src/Core/SelfCwiseBinaryOp.h +191 -0
- data/ext/eigen/eigen3/Eigen/src/Core/SolveTriangular.h +260 -0
- data/ext/eigen/eigen3/Eigen/src/Core/StableNorm.h +203 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Stride.h +108 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Swap.h +126 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Transpose.h +419 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Transpositions.h +436 -0
- data/ext/eigen/eigen3/Eigen/src/Core/TriangularMatrix.h +839 -0
- data/ext/eigen/eigen3/Eigen/src/Core/VectorBlock.h +95 -0
- data/ext/eigen/eigen3/Eigen/src/Core/VectorwiseOp.h +642 -0
- data/ext/eigen/eigen3/Eigen/src/Core/Visitor.h +237 -0
- data/ext/eigen/eigen3/Eigen/src/Core/arch/AltiVec/Complex.h +217 -0
- data/ext/eigen/eigen3/Eigen/src/Core/arch/AltiVec/PacketMath.h +501 -0
- data/ext/eigen/eigen3/Eigen/src/Core/arch/Default/Settings.h +49 -0
- data/ext/eigen/eigen3/Eigen/src/Core/arch/NEON/Complex.h +253 -0
- data/ext/eigen/eigen3/Eigen/src/Core/arch/NEON/PacketMath.h +420 -0
- data/ext/eigen/eigen3/Eigen/src/Core/arch/SSE/Complex.h +442 -0
- data/ext/eigen/eigen3/Eigen/src/Core/arch/SSE/MathFunctions.h +475 -0
- data/ext/eigen/eigen3/Eigen/src/Core/arch/SSE/PacketMath.h +649 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/CoeffBasedProduct.h +476 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/GeneralBlockPanelKernel.h +1341 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/GeneralMatrixMatrix.h +427 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +278 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_MKL.h +146 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/GeneralMatrixMatrix_MKL.h +118 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/GeneralMatrixVector.h +566 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/GeneralMatrixVector_MKL.h +131 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/Parallelizer.h +162 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +436 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/SelfadjointMatrixMatrix_MKL.h +295 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/SelfadjointMatrixVector.h +281 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/SelfadjointMatrixVector_MKL.h +114 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/SelfadjointProduct.h +123 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/SelfadjointRank2Update.h +93 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/TriangularMatrixMatrix.h +427 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/TriangularMatrixMatrix_MKL.h +309 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/TriangularMatrixVector.h +348 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/TriangularMatrixVector_MKL.h +247 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/TriangularSolverMatrix.h +332 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/TriangularSolverMatrix_MKL.h +155 -0
- data/ext/eigen/eigen3/Eigen/src/Core/products/TriangularSolverVector.h +139 -0
- data/ext/eigen/eigen3/Eigen/src/Core/util/BlasUtil.h +264 -0
- data/ext/eigen/eigen3/Eigen/src/Core/util/Constants.h +451 -0
- data/ext/eigen/eigen3/Eigen/src/Core/util/DisableStupidWarnings.h +40 -0
- data/ext/eigen/eigen3/Eigen/src/Core/util/ForwardDeclarations.h +302 -0
- data/ext/eigen/eigen3/Eigen/src/Core/util/MKL_support.h +158 -0
- data/ext/eigen/eigen3/Eigen/src/Core/util/Macros.h +451 -0
- data/ext/eigen/eigen3/Eigen/src/Core/util/Memory.h +977 -0
- data/ext/eigen/eigen3/Eigen/src/Core/util/Meta.h +243 -0
- data/ext/eigen/eigen3/Eigen/src/Core/util/NonMPL2.h +3 -0
- data/ext/eigen/eigen3/Eigen/src/Core/util/ReenableStupidWarnings.h +14 -0
- data/ext/eigen/eigen3/Eigen/src/Core/util/StaticAssert.h +208 -0
- data/ext/eigen/eigen3/Eigen/src/Core/util/XprHelper.h +469 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Block.h +126 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Cwise.h +192 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/CwiseOperators.h +298 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/AlignedBox.h +159 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/All.h +115 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/AngleAxis.h +214 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/Hyperplane.h +254 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/ParametrizedLine.h +141 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/Quaternion.h +495 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/Rotation2D.h +145 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/RotationBase.h +123 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/Scaling.h +167 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/Transform.h +786 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/Translation.h +184 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/LU.h +120 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Lazy.h +71 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/LeastSquares.h +169 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Macros.h +20 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/MathFunctions.h +57 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Memory.h +45 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Meta.h +75 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Minor.h +117 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/QR.h +67 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/SVD.h +637 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/TriangularSolver.h +42 -0
- data/ext/eigen/eigen3/Eigen/src/Eigen2Support/VectorBlock.h +94 -0
- data/ext/eigen/eigen3/Eigen/src/Eigenvalues/ComplexEigenSolver.h +341 -0
- data/ext/eigen/eigen3/Eigen/src/Eigenvalues/ComplexSchur.h +456 -0
- data/ext/eigen/eigen3/Eigen/src/Eigenvalues/ComplexSchur_MKL.h +94 -0
- data/ext/eigen/eigen3/Eigen/src/Eigenvalues/EigenSolver.h +607 -0
- data/ext/eigen/eigen3/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h +350 -0
- data/ext/eigen/eigen3/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h +227 -0
- data/ext/eigen/eigen3/Eigen/src/Eigenvalues/HessenbergDecomposition.h +373 -0
- data/ext/eigen/eigen3/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h +160 -0
- data/ext/eigen/eigen3/Eigen/src/Eigenvalues/RealQZ.h +624 -0
- data/ext/eigen/eigen3/Eigen/src/Eigenvalues/RealSchur.h +525 -0
- data/ext/eigen/eigen3/Eigen/src/Eigenvalues/RealSchur_MKL.h +83 -0
- data/ext/eigen/eigen3/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +801 -0
- data/ext/eigen/eigen3/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_MKL.h +92 -0
- data/ext/eigen/eigen3/Eigen/src/Eigenvalues/Tridiagonalization.h +557 -0
- data/ext/eigen/eigen3/Eigen/src/Geometry/AlignedBox.h +392 -0
- data/ext/eigen/eigen3/Eigen/src/Geometry/AngleAxis.h +233 -0
- data/ext/eigen/eigen3/Eigen/src/Geometry/EulerAngles.h +104 -0
- data/ext/eigen/eigen3/Eigen/src/Geometry/Homogeneous.h +307 -0
- data/ext/eigen/eigen3/Eigen/src/Geometry/Hyperplane.h +280 -0
- data/ext/eigen/eigen3/Eigen/src/Geometry/OrthoMethods.h +218 -0
- data/ext/eigen/eigen3/Eigen/src/Geometry/ParametrizedLine.h +195 -0
- data/ext/eigen/eigen3/Eigen/src/Geometry/Quaternion.h +776 -0
- data/ext/eigen/eigen3/Eigen/src/Geometry/Rotation2D.h +160 -0
- data/ext/eigen/eigen3/Eigen/src/Geometry/RotationBase.h +206 -0
- data/ext/eigen/eigen3/Eigen/src/Geometry/Scaling.h +166 -0
- data/ext/eigen/eigen3/Eigen/src/Geometry/Transform.h +1455 -0
- data/ext/eigen/eigen3/Eigen/src/Geometry/Translation.h +206 -0
- data/ext/eigen/eigen3/Eigen/src/Geometry/Umeyama.h +177 -0
- data/ext/eigen/eigen3/Eigen/src/Geometry/arch/Geometry_SSE.h +115 -0
- data/ext/eigen/eigen3/Eigen/src/Householder/BlockHouseholder.h +68 -0
- data/ext/eigen/eigen3/Eigen/src/Householder/Householder.h +171 -0
- data/ext/eigen/eigen3/Eigen/src/Householder/HouseholderSequence.h +441 -0
- data/ext/eigen/eigen3/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +149 -0
- data/ext/eigen/eigen3/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +263 -0
- data/ext/eigen/eigen3/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +256 -0
- data/ext/eigen/eigen3/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +282 -0
- data/ext/eigen/eigen3/Eigen/src/Jacobi/Jacobi.h +433 -0
- data/ext/eigen/eigen3/Eigen/src/LU/Determinant.h +101 -0
- data/ext/eigen/eigen3/Eigen/src/LU/FullPivLU.h +751 -0
- data/ext/eigen/eigen3/Eigen/src/LU/Inverse.h +400 -0
- data/ext/eigen/eigen3/Eigen/src/LU/PartialPivLU.h +509 -0
- data/ext/eigen/eigen3/Eigen/src/LU/PartialPivLU_MKL.h +85 -0
- data/ext/eigen/eigen3/Eigen/src/LU/arch/Inverse_SSE.h +329 -0
- data/ext/eigen/eigen3/Eigen/src/MetisSupport/MetisSupport.h +137 -0
- data/ext/eigen/eigen3/Eigen/src/OrderingMethods/Amd.h +444 -0
- data/ext/eigen/eigen3/Eigen/src/OrderingMethods/Eigen_Colamd.h +1850 -0
- data/ext/eigen/eigen3/Eigen/src/PaStiXSupport/PaStiXSupport.h +721 -0
- data/ext/eigen/eigen3/Eigen/src/PardisoSupport/PardisoSupport.h +592 -0
- data/ext/eigen/eigen3/Eigen/src/QR/ColPivHouseholderQR.h +580 -0
- data/ext/eigen/eigen3/Eigen/src/QR/ColPivHouseholderQR_MKL.h +99 -0
- data/ext/eigen/eigen3/Eigen/src/QR/FullPivHouseholderQR.h +622 -0
- data/ext/eigen/eigen3/Eigen/src/QR/HouseholderQR.h +388 -0
- data/ext/eigen/eigen3/Eigen/src/QR/HouseholderQR_MKL.h +71 -0
- data/ext/eigen/eigen3/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h +338 -0
- data/ext/eigen/eigen3/Eigen/src/SVD/JacobiSVD.h +976 -0
- data/ext/eigen/eigen3/Eigen/src/SVD/JacobiSVD_MKL.h +92 -0
- data/ext/eigen/eigen3/Eigen/src/SVD/UpperBidiagonalization.h +148 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCholesky/SimplicialCholesky.h +671 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h +199 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/AmbiVector.h +373 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/CompressedStorage.h +233 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h +245 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/MappedSparseMatrix.h +181 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseBlock.h +537 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseColEtree.h +206 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +325 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseCwiseUnaryOp.h +163 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseDenseProduct.h +311 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseDiagonalProduct.h +196 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseDot.h +101 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseFuzzy.h +26 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseMatrix.h +1262 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseMatrixBase.h +461 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/SparsePermutation.h +148 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseProduct.h +188 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseRedux.h +45 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseSelfAdjointView.h +507 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseSparseProductWithPruning.h +150 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseTranspose.h +63 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseTriangularView.h +179 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseUtil.h +172 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseVector.h +448 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseView.h +99 -0
- data/ext/eigen/eigen3/Eigen/src/SparseCore/TriangularSolver.h +334 -0
- data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU.h +806 -0
- data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLUImpl.h +66 -0
- data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_Memory.h +227 -0
- data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_Structs.h +111 -0
- data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h +298 -0
- data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_Utils.h +80 -0
- data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_column_bmod.h +180 -0
- data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_column_dfs.h +177 -0
- data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h +106 -0
- data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_gemm_kernel.h +279 -0
- data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h +127 -0
- data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_kernel_bmod.h +130 -0
- data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_panel_bmod.h +223 -0
- data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_panel_dfs.h +258 -0
- data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_pivotL.h +137 -0
- data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_pruneL.h +135 -0
- data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_relax_snode.h +83 -0
- data/ext/eigen/eigen3/Eigen/src/SparseQR/SparseQR.h +714 -0
- data/ext/eigen/eigen3/Eigen/src/StlSupport/StdDeque.h +134 -0
- data/ext/eigen/eigen3/Eigen/src/StlSupport/StdList.h +114 -0
- data/ext/eigen/eigen3/Eigen/src/StlSupport/StdVector.h +126 -0
- data/ext/eigen/eigen3/Eigen/src/StlSupport/details.h +84 -0
- data/ext/eigen/eigen3/Eigen/src/SuperLUSupport/SuperLUSupport.h +1026 -0
- data/ext/eigen/eigen3/Eigen/src/UmfPackSupport/UmfPackSupport.h +474 -0
- data/ext/eigen/eigen3/Eigen/src/misc/Image.h +84 -0
- data/ext/eigen/eigen3/Eigen/src/misc/Kernel.h +81 -0
- data/ext/eigen/eigen3/Eigen/src/misc/Solve.h +76 -0
- data/ext/eigen/eigen3/Eigen/src/misc/SparseSolve.h +128 -0
- data/ext/eigen/eigen3/Eigen/src/misc/blas.h +658 -0
- data/ext/eigen/eigen3/Eigen/src/plugins/ArrayCwiseBinaryOps.h +253 -0
- data/ext/eigen/eigen3/Eigen/src/plugins/ArrayCwiseUnaryOps.h +187 -0
- data/ext/eigen/eigen3/Eigen/src/plugins/BlockMethods.h +935 -0
- data/ext/eigen/eigen3/Eigen/src/plugins/CommonCwiseBinaryOps.h +46 -0
- data/ext/eigen/eigen3/Eigen/src/plugins/CommonCwiseUnaryOps.h +172 -0
- data/ext/eigen/eigen3/Eigen/src/plugins/MatrixCwiseBinaryOps.h +143 -0
- data/ext/eigen/eigen3/Eigen/src/plugins/MatrixCwiseUnaryOps.h +52 -0
- data/ext/eigen/eigen3/signature_of_eigen3_matrix_library +1 -0
- data/ext/eigen/eigen_wrap.cxx +19420 -10396
- data/ext/eigen/extconf.rb +37 -2
- data/lib/eigen.rb +146 -3
- metadata +294 -7
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
// This file is part of Eigen, a lightweight C++ template library
|
|
2
|
+
// for linear algebra.
|
|
3
|
+
//
|
|
4
|
+
// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>
|
|
5
|
+
//
|
|
6
|
+
// This Source Code Form is subject to the terms of the Mozilla
|
|
7
|
+
// Public License v. 2.0. If a copy of the MPL was not distributed
|
|
8
|
+
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
9
|
+
|
|
10
|
+
#ifndef EIGEN_SOLVETRIANGULAR_H
|
|
11
|
+
#define EIGEN_SOLVETRIANGULAR_H
|
|
12
|
+
|
|
13
|
+
namespace Eigen {
|
|
14
|
+
|
|
15
|
+
namespace internal {
|
|
16
|
+
|
|
17
|
+
// Forward declarations:
|
|
18
|
+
// The following two routines are implemented in the products/TriangularSolver*.h files
|
|
19
|
+
template<typename LhsScalar, typename RhsScalar, typename Index, int Side, int Mode, bool Conjugate, int StorageOrder>
|
|
20
|
+
struct triangular_solve_vector;
|
|
21
|
+
|
|
22
|
+
template <typename Scalar, typename Index, int Side, int Mode, bool Conjugate, int TriStorageOrder, int OtherStorageOrder>
|
|
23
|
+
struct triangular_solve_matrix;
|
|
24
|
+
|
|
25
|
+
// small helper struct extracting some traits on the underlying solver operation
|
|
26
|
+
template<typename Lhs, typename Rhs, int Side>
|
|
27
|
+
class trsolve_traits
|
|
28
|
+
{
|
|
29
|
+
private:
|
|
30
|
+
enum {
|
|
31
|
+
RhsIsVectorAtCompileTime = (Side==OnTheLeft ? Rhs::ColsAtCompileTime : Rhs::RowsAtCompileTime)==1
|
|
32
|
+
};
|
|
33
|
+
public:
|
|
34
|
+
enum {
|
|
35
|
+
Unrolling = (RhsIsVectorAtCompileTime && Rhs::SizeAtCompileTime != Dynamic && Rhs::SizeAtCompileTime <= 8)
|
|
36
|
+
? CompleteUnrolling : NoUnrolling,
|
|
37
|
+
RhsVectors = RhsIsVectorAtCompileTime ? 1 : Dynamic
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
template<typename Lhs, typename Rhs,
|
|
42
|
+
int Side, // can be OnTheLeft/OnTheRight
|
|
43
|
+
int Mode, // can be Upper/Lower | UnitDiag
|
|
44
|
+
int Unrolling = trsolve_traits<Lhs,Rhs,Side>::Unrolling,
|
|
45
|
+
int RhsVectors = trsolve_traits<Lhs,Rhs,Side>::RhsVectors
|
|
46
|
+
>
|
|
47
|
+
struct triangular_solver_selector;
|
|
48
|
+
|
|
49
|
+
template<typename Lhs, typename Rhs, int Side, int Mode>
|
|
50
|
+
struct triangular_solver_selector<Lhs,Rhs,Side,Mode,NoUnrolling,1>
|
|
51
|
+
{
|
|
52
|
+
typedef typename Lhs::Scalar LhsScalar;
|
|
53
|
+
typedef typename Rhs::Scalar RhsScalar;
|
|
54
|
+
typedef blas_traits<Lhs> LhsProductTraits;
|
|
55
|
+
typedef typename LhsProductTraits::ExtractType ActualLhsType;
|
|
56
|
+
typedef Map<Matrix<RhsScalar,Dynamic,1>, Aligned> MappedRhs;
|
|
57
|
+
static void run(const Lhs& lhs, Rhs& rhs)
|
|
58
|
+
{
|
|
59
|
+
ActualLhsType actualLhs = LhsProductTraits::extract(lhs);
|
|
60
|
+
|
|
61
|
+
// FIXME find a way to allow an inner stride if packet_traits<Scalar>::size==1
|
|
62
|
+
|
|
63
|
+
bool useRhsDirectly = Rhs::InnerStrideAtCompileTime==1 || rhs.innerStride()==1;
|
|
64
|
+
|
|
65
|
+
ei_declare_aligned_stack_constructed_variable(RhsScalar,actualRhs,rhs.size(),
|
|
66
|
+
(useRhsDirectly ? rhs.data() : 0));
|
|
67
|
+
|
|
68
|
+
if(!useRhsDirectly)
|
|
69
|
+
MappedRhs(actualRhs,rhs.size()) = rhs;
|
|
70
|
+
|
|
71
|
+
triangular_solve_vector<LhsScalar, RhsScalar, typename Lhs::Index, Side, Mode, LhsProductTraits::NeedToConjugate,
|
|
72
|
+
(int(Lhs::Flags) & RowMajorBit) ? RowMajor : ColMajor>
|
|
73
|
+
::run(actualLhs.cols(), actualLhs.data(), actualLhs.outerStride(), actualRhs);
|
|
74
|
+
|
|
75
|
+
if(!useRhsDirectly)
|
|
76
|
+
rhs = MappedRhs(actualRhs, rhs.size());
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
// the rhs is a matrix
|
|
81
|
+
template<typename Lhs, typename Rhs, int Side, int Mode>
|
|
82
|
+
struct triangular_solver_selector<Lhs,Rhs,Side,Mode,NoUnrolling,Dynamic>
|
|
83
|
+
{
|
|
84
|
+
typedef typename Rhs::Scalar Scalar;
|
|
85
|
+
typedef typename Rhs::Index Index;
|
|
86
|
+
typedef blas_traits<Lhs> LhsProductTraits;
|
|
87
|
+
typedef typename LhsProductTraits::DirectLinearAccessType ActualLhsType;
|
|
88
|
+
|
|
89
|
+
static void run(const Lhs& lhs, Rhs& rhs)
|
|
90
|
+
{
|
|
91
|
+
typename internal::add_const_on_value_type<ActualLhsType>::type actualLhs = LhsProductTraits::extract(lhs);
|
|
92
|
+
|
|
93
|
+
const Index size = lhs.rows();
|
|
94
|
+
const Index othersize = Side==OnTheLeft? rhs.cols() : rhs.rows();
|
|
95
|
+
|
|
96
|
+
typedef internal::gemm_blocking_space<(Rhs::Flags&RowMajorBit) ? RowMajor : ColMajor,Scalar,Scalar,
|
|
97
|
+
Rhs::MaxRowsAtCompileTime, Rhs::MaxColsAtCompileTime, Lhs::MaxRowsAtCompileTime,4> BlockingType;
|
|
98
|
+
|
|
99
|
+
BlockingType blocking(rhs.rows(), rhs.cols(), size);
|
|
100
|
+
|
|
101
|
+
triangular_solve_matrix<Scalar,Index,Side,Mode,LhsProductTraits::NeedToConjugate,(int(Lhs::Flags) & RowMajorBit) ? RowMajor : ColMajor,
|
|
102
|
+
(Rhs::Flags&RowMajorBit) ? RowMajor : ColMajor>
|
|
103
|
+
::run(size, othersize, &actualLhs.coeffRef(0,0), actualLhs.outerStride(), &rhs.coeffRef(0,0), rhs.outerStride(), blocking);
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
/***************************************************************************
|
|
108
|
+
* meta-unrolling implementation
|
|
109
|
+
***************************************************************************/
|
|
110
|
+
|
|
111
|
+
template<typename Lhs, typename Rhs, int Mode, int Index, int Size,
|
|
112
|
+
bool Stop = Index==Size>
|
|
113
|
+
struct triangular_solver_unroller;
|
|
114
|
+
|
|
115
|
+
template<typename Lhs, typename Rhs, int Mode, int Index, int Size>
|
|
116
|
+
struct triangular_solver_unroller<Lhs,Rhs,Mode,Index,Size,false> {
|
|
117
|
+
enum {
|
|
118
|
+
IsLower = ((Mode&Lower)==Lower),
|
|
119
|
+
I = IsLower ? Index : Size - Index - 1,
|
|
120
|
+
S = IsLower ? 0 : I+1
|
|
121
|
+
};
|
|
122
|
+
static void run(const Lhs& lhs, Rhs& rhs)
|
|
123
|
+
{
|
|
124
|
+
if (Index>0)
|
|
125
|
+
rhs.coeffRef(I) -= lhs.row(I).template segment<Index>(S).transpose()
|
|
126
|
+
.cwiseProduct(rhs.template segment<Index>(S)).sum();
|
|
127
|
+
|
|
128
|
+
if(!(Mode & UnitDiag))
|
|
129
|
+
rhs.coeffRef(I) /= lhs.coeff(I,I);
|
|
130
|
+
|
|
131
|
+
triangular_solver_unroller<Lhs,Rhs,Mode,Index+1,Size>::run(lhs,rhs);
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
template<typename Lhs, typename Rhs, int Mode, int Index, int Size>
|
|
136
|
+
struct triangular_solver_unroller<Lhs,Rhs,Mode,Index,Size,true> {
|
|
137
|
+
static void run(const Lhs&, Rhs&) {}
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
template<typename Lhs, typename Rhs, int Mode>
|
|
141
|
+
struct triangular_solver_selector<Lhs,Rhs,OnTheLeft,Mode,CompleteUnrolling,1> {
|
|
142
|
+
static void run(const Lhs& lhs, Rhs& rhs)
|
|
143
|
+
{ triangular_solver_unroller<Lhs,Rhs,Mode,0,Rhs::SizeAtCompileTime>::run(lhs,rhs); }
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
template<typename Lhs, typename Rhs, int Mode>
|
|
147
|
+
struct triangular_solver_selector<Lhs,Rhs,OnTheRight,Mode,CompleteUnrolling,1> {
|
|
148
|
+
static void run(const Lhs& lhs, Rhs& rhs)
|
|
149
|
+
{
|
|
150
|
+
Transpose<const Lhs> trLhs(lhs);
|
|
151
|
+
Transpose<Rhs> trRhs(rhs);
|
|
152
|
+
|
|
153
|
+
triangular_solver_unroller<Transpose<const Lhs>,Transpose<Rhs>,
|
|
154
|
+
((Mode&Upper)==Upper ? Lower : Upper) | (Mode&UnitDiag),
|
|
155
|
+
0,Rhs::SizeAtCompileTime>::run(trLhs,trRhs);
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
} // end namespace internal
|
|
160
|
+
|
|
161
|
+
/***************************************************************************
|
|
162
|
+
* TriangularView methods
|
|
163
|
+
***************************************************************************/
|
|
164
|
+
|
|
165
|
+
/** "in-place" version of TriangularView::solve() where the result is written in \a other
|
|
166
|
+
*
|
|
167
|
+
* \warning The parameter is only marked 'const' to make the C++ compiler accept a temporary expression here.
|
|
168
|
+
* This function will const_cast it, so constness isn't honored here.
|
|
169
|
+
*
|
|
170
|
+
* See TriangularView:solve() for the details.
|
|
171
|
+
*/
|
|
172
|
+
template<typename MatrixType, unsigned int Mode>
|
|
173
|
+
template<int Side, typename OtherDerived>
|
|
174
|
+
void TriangularView<MatrixType,Mode>::solveInPlace(const MatrixBase<OtherDerived>& _other) const
|
|
175
|
+
{
|
|
176
|
+
OtherDerived& other = _other.const_cast_derived();
|
|
177
|
+
eigen_assert( cols() == rows() && ((Side==OnTheLeft && cols() == other.rows()) || (Side==OnTheRight && cols() == other.cols())) );
|
|
178
|
+
eigen_assert((!(Mode & ZeroDiag)) && bool(Mode & (Upper|Lower)));
|
|
179
|
+
|
|
180
|
+
enum { copy = internal::traits<OtherDerived>::Flags & RowMajorBit && OtherDerived::IsVectorAtCompileTime };
|
|
181
|
+
typedef typename internal::conditional<copy,
|
|
182
|
+
typename internal::plain_matrix_type_column_major<OtherDerived>::type, OtherDerived&>::type OtherCopy;
|
|
183
|
+
OtherCopy otherCopy(other);
|
|
184
|
+
|
|
185
|
+
internal::triangular_solver_selector<MatrixType, typename internal::remove_reference<OtherCopy>::type,
|
|
186
|
+
Side, Mode>::run(nestedExpression(), otherCopy);
|
|
187
|
+
|
|
188
|
+
if (copy)
|
|
189
|
+
other = otherCopy;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/** \returns the product of the inverse of \c *this with \a other, \a *this being triangular.
|
|
193
|
+
*
|
|
194
|
+
* This function computes the inverse-matrix matrix product inverse(\c *this) * \a other if
|
|
195
|
+
* \a Side==OnTheLeft (the default), or the right-inverse-multiply \a other * inverse(\c *this) if
|
|
196
|
+
* \a Side==OnTheRight.
|
|
197
|
+
*
|
|
198
|
+
* The matrix \c *this must be triangular and invertible (i.e., all the coefficients of the
|
|
199
|
+
* diagonal must be non zero). It works as a forward (resp. backward) substitution if \c *this
|
|
200
|
+
* is an upper (resp. lower) triangular matrix.
|
|
201
|
+
*
|
|
202
|
+
* Example: \include MatrixBase_marked.cpp
|
|
203
|
+
* Output: \verbinclude MatrixBase_marked.out
|
|
204
|
+
*
|
|
205
|
+
* This function returns an expression of the inverse-multiply and can works in-place if it is assigned
|
|
206
|
+
* to the same matrix or vector \a other.
|
|
207
|
+
*
|
|
208
|
+
* For users coming from BLAS, this function (and more specifically solveInPlace()) offer
|
|
209
|
+
* all the operations supported by the \c *TRSV and \c *TRSM BLAS routines.
|
|
210
|
+
*
|
|
211
|
+
* \sa TriangularView::solveInPlace()
|
|
212
|
+
*/
|
|
213
|
+
template<typename Derived, unsigned int Mode>
|
|
214
|
+
template<int Side, typename Other>
|
|
215
|
+
const internal::triangular_solve_retval<Side,TriangularView<Derived,Mode>,Other>
|
|
216
|
+
TriangularView<Derived,Mode>::solve(const MatrixBase<Other>& other) const
|
|
217
|
+
{
|
|
218
|
+
return internal::triangular_solve_retval<Side,TriangularView,Other>(*this, other.derived());
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
namespace internal {
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
template<int Side, typename TriangularType, typename Rhs>
|
|
225
|
+
struct traits<triangular_solve_retval<Side, TriangularType, Rhs> >
|
|
226
|
+
{
|
|
227
|
+
typedef typename internal::plain_matrix_type_column_major<Rhs>::type ReturnType;
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
template<int Side, typename TriangularType, typename Rhs> struct triangular_solve_retval
|
|
231
|
+
: public ReturnByValue<triangular_solve_retval<Side, TriangularType, Rhs> >
|
|
232
|
+
{
|
|
233
|
+
typedef typename remove_all<typename Rhs::Nested>::type RhsNestedCleaned;
|
|
234
|
+
typedef ReturnByValue<triangular_solve_retval> Base;
|
|
235
|
+
typedef typename Base::Index Index;
|
|
236
|
+
|
|
237
|
+
triangular_solve_retval(const TriangularType& tri, const Rhs& rhs)
|
|
238
|
+
: m_triangularMatrix(tri), m_rhs(rhs)
|
|
239
|
+
{}
|
|
240
|
+
|
|
241
|
+
inline Index rows() const { return m_rhs.rows(); }
|
|
242
|
+
inline Index cols() const { return m_rhs.cols(); }
|
|
243
|
+
|
|
244
|
+
template<typename Dest> inline void evalTo(Dest& dst) const
|
|
245
|
+
{
|
|
246
|
+
if(!(is_same<RhsNestedCleaned,Dest>::value && extract_data(dst) == extract_data(m_rhs)))
|
|
247
|
+
dst = m_rhs;
|
|
248
|
+
m_triangularMatrix.template solveInPlace<Side>(dst);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
protected:
|
|
252
|
+
const TriangularType& m_triangularMatrix;
|
|
253
|
+
typename Rhs::Nested m_rhs;
|
|
254
|
+
};
|
|
255
|
+
|
|
256
|
+
} // namespace internal
|
|
257
|
+
|
|
258
|
+
} // end namespace Eigen
|
|
259
|
+
|
|
260
|
+
#endif // EIGEN_SOLVETRIANGULAR_H
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
// This file is part of Eigen, a lightweight C++ template library
|
|
2
|
+
// for linear algebra.
|
|
3
|
+
//
|
|
4
|
+
// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>
|
|
5
|
+
//
|
|
6
|
+
// This Source Code Form is subject to the terms of the Mozilla
|
|
7
|
+
// Public License v. 2.0. If a copy of the MPL was not distributed
|
|
8
|
+
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
9
|
+
|
|
10
|
+
#ifndef EIGEN_STABLENORM_H
|
|
11
|
+
#define EIGEN_STABLENORM_H
|
|
12
|
+
|
|
13
|
+
namespace Eigen {
|
|
14
|
+
|
|
15
|
+
namespace internal {
|
|
16
|
+
|
|
17
|
+
template<typename ExpressionType, typename Scalar>
|
|
18
|
+
inline void stable_norm_kernel(const ExpressionType& bl, Scalar& ssq, Scalar& scale, Scalar& invScale)
|
|
19
|
+
{
|
|
20
|
+
using std::max;
|
|
21
|
+
Scalar maxCoeff = bl.cwiseAbs().maxCoeff();
|
|
22
|
+
|
|
23
|
+
if (maxCoeff>scale)
|
|
24
|
+
{
|
|
25
|
+
ssq = ssq * numext::abs2(scale/maxCoeff);
|
|
26
|
+
Scalar tmp = Scalar(1)/maxCoeff;
|
|
27
|
+
if(tmp > NumTraits<Scalar>::highest())
|
|
28
|
+
{
|
|
29
|
+
invScale = NumTraits<Scalar>::highest();
|
|
30
|
+
scale = Scalar(1)/invScale;
|
|
31
|
+
}
|
|
32
|
+
else
|
|
33
|
+
{
|
|
34
|
+
scale = maxCoeff;
|
|
35
|
+
invScale = tmp;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// TODO if the maxCoeff is much much smaller than the current scale,
|
|
40
|
+
// then we can neglect this sub vector
|
|
41
|
+
if(scale>Scalar(0)) // if scale==0, then bl is 0
|
|
42
|
+
ssq += (bl*invScale).squaredNorm();
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
template<typename Derived>
|
|
46
|
+
inline typename NumTraits<typename traits<Derived>::Scalar>::Real
|
|
47
|
+
blueNorm_impl(const EigenBase<Derived>& _vec)
|
|
48
|
+
{
|
|
49
|
+
typedef typename Derived::RealScalar RealScalar;
|
|
50
|
+
typedef typename Derived::Index Index;
|
|
51
|
+
using std::pow;
|
|
52
|
+
using std::min;
|
|
53
|
+
using std::max;
|
|
54
|
+
using std::sqrt;
|
|
55
|
+
using std::abs;
|
|
56
|
+
const Derived& vec(_vec.derived());
|
|
57
|
+
static bool initialized = false;
|
|
58
|
+
static RealScalar b1, b2, s1m, s2m, overfl, rbig, relerr;
|
|
59
|
+
if(!initialized)
|
|
60
|
+
{
|
|
61
|
+
int ibeta, it, iemin, iemax, iexp;
|
|
62
|
+
RealScalar eps;
|
|
63
|
+
// This program calculates the machine-dependent constants
|
|
64
|
+
// bl, b2, slm, s2m, relerr overfl
|
|
65
|
+
// from the "basic" machine-dependent numbers
|
|
66
|
+
// nbig, ibeta, it, iemin, iemax, rbig.
|
|
67
|
+
// The following define the basic machine-dependent constants.
|
|
68
|
+
// For portability, the PORT subprograms "ilmaeh" and "rlmach"
|
|
69
|
+
// are used. For any specific computer, each of the assignment
|
|
70
|
+
// statements can be replaced
|
|
71
|
+
ibeta = std::numeric_limits<RealScalar>::radix; // base for floating-point numbers
|
|
72
|
+
it = std::numeric_limits<RealScalar>::digits; // number of base-beta digits in mantissa
|
|
73
|
+
iemin = std::numeric_limits<RealScalar>::min_exponent; // minimum exponent
|
|
74
|
+
iemax = std::numeric_limits<RealScalar>::max_exponent; // maximum exponent
|
|
75
|
+
rbig = (std::numeric_limits<RealScalar>::max)(); // largest floating-point number
|
|
76
|
+
|
|
77
|
+
iexp = -((1-iemin)/2);
|
|
78
|
+
b1 = RealScalar(pow(RealScalar(ibeta),RealScalar(iexp))); // lower boundary of midrange
|
|
79
|
+
iexp = (iemax + 1 - it)/2;
|
|
80
|
+
b2 = RealScalar(pow(RealScalar(ibeta),RealScalar(iexp))); // upper boundary of midrange
|
|
81
|
+
|
|
82
|
+
iexp = (2-iemin)/2;
|
|
83
|
+
s1m = RealScalar(pow(RealScalar(ibeta),RealScalar(iexp))); // scaling factor for lower range
|
|
84
|
+
iexp = - ((iemax+it)/2);
|
|
85
|
+
s2m = RealScalar(pow(RealScalar(ibeta),RealScalar(iexp))); // scaling factor for upper range
|
|
86
|
+
|
|
87
|
+
overfl = rbig*s2m; // overflow boundary for abig
|
|
88
|
+
eps = RealScalar(pow(double(ibeta), 1-it));
|
|
89
|
+
relerr = sqrt(eps); // tolerance for neglecting asml
|
|
90
|
+
initialized = true;
|
|
91
|
+
}
|
|
92
|
+
Index n = vec.size();
|
|
93
|
+
RealScalar ab2 = b2 / RealScalar(n);
|
|
94
|
+
RealScalar asml = RealScalar(0);
|
|
95
|
+
RealScalar amed = RealScalar(0);
|
|
96
|
+
RealScalar abig = RealScalar(0);
|
|
97
|
+
for(typename Derived::InnerIterator it(vec, 0); it; ++it)
|
|
98
|
+
{
|
|
99
|
+
RealScalar ax = abs(it.value());
|
|
100
|
+
if(ax > ab2) abig += numext::abs2(ax*s2m);
|
|
101
|
+
else if(ax < b1) asml += numext::abs2(ax*s1m);
|
|
102
|
+
else amed += numext::abs2(ax);
|
|
103
|
+
}
|
|
104
|
+
if(abig > RealScalar(0))
|
|
105
|
+
{
|
|
106
|
+
abig = sqrt(abig);
|
|
107
|
+
if(abig > overfl)
|
|
108
|
+
{
|
|
109
|
+
return rbig;
|
|
110
|
+
}
|
|
111
|
+
if(amed > RealScalar(0))
|
|
112
|
+
{
|
|
113
|
+
abig = abig/s2m;
|
|
114
|
+
amed = sqrt(amed);
|
|
115
|
+
}
|
|
116
|
+
else
|
|
117
|
+
return abig/s2m;
|
|
118
|
+
}
|
|
119
|
+
else if(asml > RealScalar(0))
|
|
120
|
+
{
|
|
121
|
+
if (amed > RealScalar(0))
|
|
122
|
+
{
|
|
123
|
+
abig = sqrt(amed);
|
|
124
|
+
amed = sqrt(asml) / s1m;
|
|
125
|
+
}
|
|
126
|
+
else
|
|
127
|
+
return sqrt(asml)/s1m;
|
|
128
|
+
}
|
|
129
|
+
else
|
|
130
|
+
return sqrt(amed);
|
|
131
|
+
asml = (min)(abig, amed);
|
|
132
|
+
abig = (max)(abig, amed);
|
|
133
|
+
if(asml <= abig*relerr)
|
|
134
|
+
return abig;
|
|
135
|
+
else
|
|
136
|
+
return abig * sqrt(RealScalar(1) + numext::abs2(asml/abig));
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
} // end namespace internal
|
|
140
|
+
|
|
141
|
+
/** \returns the \em l2 norm of \c *this avoiding underflow and overflow.
|
|
142
|
+
* This version use a blockwise two passes algorithm:
|
|
143
|
+
* 1 - find the absolute largest coefficient \c s
|
|
144
|
+
* 2 - compute \f$ s \Vert \frac{*this}{s} \Vert \f$ in a standard way
|
|
145
|
+
*
|
|
146
|
+
* For architecture/scalar types supporting vectorization, this version
|
|
147
|
+
* is faster than blueNorm(). Otherwise the blueNorm() is much faster.
|
|
148
|
+
*
|
|
149
|
+
* \sa norm(), blueNorm(), hypotNorm()
|
|
150
|
+
*/
|
|
151
|
+
template<typename Derived>
|
|
152
|
+
inline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real
|
|
153
|
+
MatrixBase<Derived>::stableNorm() const
|
|
154
|
+
{
|
|
155
|
+
using std::min;
|
|
156
|
+
using std::sqrt;
|
|
157
|
+
const Index blockSize = 4096;
|
|
158
|
+
RealScalar scale(0);
|
|
159
|
+
RealScalar invScale(1);
|
|
160
|
+
RealScalar ssq(0); // sum of square
|
|
161
|
+
enum {
|
|
162
|
+
Alignment = (int(Flags)&DirectAccessBit) || (int(Flags)&AlignedBit) ? 1 : 0
|
|
163
|
+
};
|
|
164
|
+
Index n = size();
|
|
165
|
+
Index bi = internal::first_aligned(derived());
|
|
166
|
+
if (bi>0)
|
|
167
|
+
internal::stable_norm_kernel(this->head(bi), ssq, scale, invScale);
|
|
168
|
+
for (; bi<n; bi+=blockSize)
|
|
169
|
+
internal::stable_norm_kernel(this->segment(bi,(min)(blockSize, n - bi)).template forceAlignedAccessIf<Alignment>(), ssq, scale, invScale);
|
|
170
|
+
return scale * sqrt(ssq);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/** \returns the \em l2 norm of \c *this using the Blue's algorithm.
|
|
174
|
+
* A Portable Fortran Program to Find the Euclidean Norm of a Vector,
|
|
175
|
+
* ACM TOMS, Vol 4, Issue 1, 1978.
|
|
176
|
+
*
|
|
177
|
+
* For architecture/scalar types without vectorization, this version
|
|
178
|
+
* is much faster than stableNorm(). Otherwise the stableNorm() is faster.
|
|
179
|
+
*
|
|
180
|
+
* \sa norm(), stableNorm(), hypotNorm()
|
|
181
|
+
*/
|
|
182
|
+
template<typename Derived>
|
|
183
|
+
inline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real
|
|
184
|
+
MatrixBase<Derived>::blueNorm() const
|
|
185
|
+
{
|
|
186
|
+
return internal::blueNorm_impl(*this);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/** \returns the \em l2 norm of \c *this avoiding undeflow and overflow.
|
|
190
|
+
* This version use a concatenation of hypot() calls, and it is very slow.
|
|
191
|
+
*
|
|
192
|
+
* \sa norm(), stableNorm()
|
|
193
|
+
*/
|
|
194
|
+
template<typename Derived>
|
|
195
|
+
inline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real
|
|
196
|
+
MatrixBase<Derived>::hypotNorm() const
|
|
197
|
+
{
|
|
198
|
+
return this->cwiseAbs().redux(internal::scalar_hypot_op<RealScalar>());
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
} // end namespace Eigen
|
|
202
|
+
|
|
203
|
+
#endif // EIGEN_STABLENORM_H
|