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,314 @@
|
|
|
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_SELFADJOINTMATRIX_H
|
|
11
|
+
#define EIGEN_SELFADJOINTMATRIX_H
|
|
12
|
+
|
|
13
|
+
namespace Eigen {
|
|
14
|
+
|
|
15
|
+
/** \class SelfAdjointView
|
|
16
|
+
* \ingroup Core_Module
|
|
17
|
+
*
|
|
18
|
+
*
|
|
19
|
+
* \brief Expression of a selfadjoint matrix from a triangular part of a dense matrix
|
|
20
|
+
*
|
|
21
|
+
* \param MatrixType the type of the dense matrix storing the coefficients
|
|
22
|
+
* \param TriangularPart can be either \c #Lower or \c #Upper
|
|
23
|
+
*
|
|
24
|
+
* This class is an expression of a sefladjoint matrix from a triangular part of a matrix
|
|
25
|
+
* with given dense storage of the coefficients. It is the return type of MatrixBase::selfadjointView()
|
|
26
|
+
* and most of the time this is the only way that it is used.
|
|
27
|
+
*
|
|
28
|
+
* \sa class TriangularBase, MatrixBase::selfadjointView()
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
namespace internal {
|
|
32
|
+
template<typename MatrixType, unsigned int UpLo>
|
|
33
|
+
struct traits<SelfAdjointView<MatrixType, UpLo> > : traits<MatrixType>
|
|
34
|
+
{
|
|
35
|
+
typedef typename nested<MatrixType>::type MatrixTypeNested;
|
|
36
|
+
typedef typename remove_all<MatrixTypeNested>::type MatrixTypeNestedCleaned;
|
|
37
|
+
typedef MatrixType ExpressionType;
|
|
38
|
+
typedef typename MatrixType::PlainObject DenseMatrixType;
|
|
39
|
+
enum {
|
|
40
|
+
Mode = UpLo | SelfAdjoint,
|
|
41
|
+
Flags = MatrixTypeNestedCleaned::Flags & (HereditaryBits)
|
|
42
|
+
& (~(PacketAccessBit | DirectAccessBit | LinearAccessBit)), // FIXME these flags should be preserved
|
|
43
|
+
CoeffReadCost = MatrixTypeNestedCleaned::CoeffReadCost
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
template <typename Lhs, int LhsMode, bool LhsIsVector,
|
|
49
|
+
typename Rhs, int RhsMode, bool RhsIsVector>
|
|
50
|
+
struct SelfadjointProductMatrix;
|
|
51
|
+
|
|
52
|
+
// FIXME could also be called SelfAdjointWrapper to be consistent with DiagonalWrapper ??
|
|
53
|
+
template<typename MatrixType, unsigned int UpLo> class SelfAdjointView
|
|
54
|
+
: public TriangularBase<SelfAdjointView<MatrixType, UpLo> >
|
|
55
|
+
{
|
|
56
|
+
public:
|
|
57
|
+
|
|
58
|
+
typedef TriangularBase<SelfAdjointView> Base;
|
|
59
|
+
typedef typename internal::traits<SelfAdjointView>::MatrixTypeNested MatrixTypeNested;
|
|
60
|
+
typedef typename internal::traits<SelfAdjointView>::MatrixTypeNestedCleaned MatrixTypeNestedCleaned;
|
|
61
|
+
|
|
62
|
+
/** \brief The type of coefficients in this matrix */
|
|
63
|
+
typedef typename internal::traits<SelfAdjointView>::Scalar Scalar;
|
|
64
|
+
|
|
65
|
+
typedef typename MatrixType::Index Index;
|
|
66
|
+
|
|
67
|
+
enum {
|
|
68
|
+
Mode = internal::traits<SelfAdjointView>::Mode
|
|
69
|
+
};
|
|
70
|
+
typedef typename MatrixType::PlainObject PlainObject;
|
|
71
|
+
|
|
72
|
+
inline SelfAdjointView(MatrixType& matrix) : m_matrix(matrix)
|
|
73
|
+
{}
|
|
74
|
+
|
|
75
|
+
inline Index rows() const { return m_matrix.rows(); }
|
|
76
|
+
inline Index cols() const { return m_matrix.cols(); }
|
|
77
|
+
inline Index outerStride() const { return m_matrix.outerStride(); }
|
|
78
|
+
inline Index innerStride() const { return m_matrix.innerStride(); }
|
|
79
|
+
|
|
80
|
+
/** \sa MatrixBase::coeff()
|
|
81
|
+
* \warning the coordinates must fit into the referenced triangular part
|
|
82
|
+
*/
|
|
83
|
+
inline Scalar coeff(Index row, Index col) const
|
|
84
|
+
{
|
|
85
|
+
Base::check_coordinates_internal(row, col);
|
|
86
|
+
return m_matrix.coeff(row, col);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** \sa MatrixBase::coeffRef()
|
|
90
|
+
* \warning the coordinates must fit into the referenced triangular part
|
|
91
|
+
*/
|
|
92
|
+
inline Scalar& coeffRef(Index row, Index col)
|
|
93
|
+
{
|
|
94
|
+
Base::check_coordinates_internal(row, col);
|
|
95
|
+
return m_matrix.const_cast_derived().coeffRef(row, col);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** \internal */
|
|
99
|
+
const MatrixTypeNestedCleaned& _expression() const { return m_matrix; }
|
|
100
|
+
|
|
101
|
+
const MatrixTypeNestedCleaned& nestedExpression() const { return m_matrix; }
|
|
102
|
+
MatrixTypeNestedCleaned& nestedExpression() { return *const_cast<MatrixTypeNestedCleaned*>(&m_matrix); }
|
|
103
|
+
|
|
104
|
+
/** Efficient self-adjoint matrix times vector/matrix product */
|
|
105
|
+
template<typename OtherDerived>
|
|
106
|
+
SelfadjointProductMatrix<MatrixType,Mode,false,OtherDerived,0,OtherDerived::IsVectorAtCompileTime>
|
|
107
|
+
operator*(const MatrixBase<OtherDerived>& rhs) const
|
|
108
|
+
{
|
|
109
|
+
return SelfadjointProductMatrix
|
|
110
|
+
<MatrixType,Mode,false,OtherDerived,0,OtherDerived::IsVectorAtCompileTime>
|
|
111
|
+
(m_matrix, rhs.derived());
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/** Efficient vector/matrix times self-adjoint matrix product */
|
|
115
|
+
template<typename OtherDerived> friend
|
|
116
|
+
SelfadjointProductMatrix<OtherDerived,0,OtherDerived::IsVectorAtCompileTime,MatrixType,Mode,false>
|
|
117
|
+
operator*(const MatrixBase<OtherDerived>& lhs, const SelfAdjointView& rhs)
|
|
118
|
+
{
|
|
119
|
+
return SelfadjointProductMatrix
|
|
120
|
+
<OtherDerived,0,OtherDerived::IsVectorAtCompileTime,MatrixType,Mode,false>
|
|
121
|
+
(lhs.derived(),rhs.m_matrix);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/** Perform a symmetric rank 2 update of the selfadjoint matrix \c *this:
|
|
125
|
+
* \f$ this = this + \alpha u v^* + conj(\alpha) v u^* \f$
|
|
126
|
+
* \returns a reference to \c *this
|
|
127
|
+
*
|
|
128
|
+
* The vectors \a u and \c v \b must be column vectors, however they can be
|
|
129
|
+
* a adjoint expression without any overhead. Only the meaningful triangular
|
|
130
|
+
* part of the matrix is updated, the rest is left unchanged.
|
|
131
|
+
*
|
|
132
|
+
* \sa rankUpdate(const MatrixBase<DerivedU>&, Scalar)
|
|
133
|
+
*/
|
|
134
|
+
template<typename DerivedU, typename DerivedV>
|
|
135
|
+
SelfAdjointView& rankUpdate(const MatrixBase<DerivedU>& u, const MatrixBase<DerivedV>& v, const Scalar& alpha = Scalar(1));
|
|
136
|
+
|
|
137
|
+
/** Perform a symmetric rank K update of the selfadjoint matrix \c *this:
|
|
138
|
+
* \f$ this = this + \alpha ( u u^* ) \f$ where \a u is a vector or matrix.
|
|
139
|
+
*
|
|
140
|
+
* \returns a reference to \c *this
|
|
141
|
+
*
|
|
142
|
+
* Note that to perform \f$ this = this + \alpha ( u^* u ) \f$ you can simply
|
|
143
|
+
* call this function with u.adjoint().
|
|
144
|
+
*
|
|
145
|
+
* \sa rankUpdate(const MatrixBase<DerivedU>&, const MatrixBase<DerivedV>&, Scalar)
|
|
146
|
+
*/
|
|
147
|
+
template<typename DerivedU>
|
|
148
|
+
SelfAdjointView& rankUpdate(const MatrixBase<DerivedU>& u, const Scalar& alpha = Scalar(1));
|
|
149
|
+
|
|
150
|
+
/////////// Cholesky module ///////////
|
|
151
|
+
|
|
152
|
+
const LLT<PlainObject, UpLo> llt() const;
|
|
153
|
+
const LDLT<PlainObject, UpLo> ldlt() const;
|
|
154
|
+
|
|
155
|
+
/////////// Eigenvalue module ///////////
|
|
156
|
+
|
|
157
|
+
/** Real part of #Scalar */
|
|
158
|
+
typedef typename NumTraits<Scalar>::Real RealScalar;
|
|
159
|
+
/** Return type of eigenvalues() */
|
|
160
|
+
typedef Matrix<RealScalar, internal::traits<MatrixType>::ColsAtCompileTime, 1> EigenvaluesReturnType;
|
|
161
|
+
|
|
162
|
+
EigenvaluesReturnType eigenvalues() const;
|
|
163
|
+
RealScalar operatorNorm() const;
|
|
164
|
+
|
|
165
|
+
#ifdef EIGEN2_SUPPORT
|
|
166
|
+
template<typename OtherDerived>
|
|
167
|
+
SelfAdjointView& operator=(const MatrixBase<OtherDerived>& other)
|
|
168
|
+
{
|
|
169
|
+
enum {
|
|
170
|
+
OtherPart = UpLo == Upper ? StrictlyLower : StrictlyUpper
|
|
171
|
+
};
|
|
172
|
+
m_matrix.const_cast_derived().template triangularView<UpLo>() = other;
|
|
173
|
+
m_matrix.const_cast_derived().template triangularView<OtherPart>() = other.adjoint();
|
|
174
|
+
return *this;
|
|
175
|
+
}
|
|
176
|
+
template<typename OtherMatrixType, unsigned int OtherMode>
|
|
177
|
+
SelfAdjointView& operator=(const TriangularView<OtherMatrixType, OtherMode>& other)
|
|
178
|
+
{
|
|
179
|
+
enum {
|
|
180
|
+
OtherPart = UpLo == Upper ? StrictlyLower : StrictlyUpper
|
|
181
|
+
};
|
|
182
|
+
m_matrix.const_cast_derived().template triangularView<UpLo>() = other.toDenseMatrix();
|
|
183
|
+
m_matrix.const_cast_derived().template triangularView<OtherPart>() = other.toDenseMatrix().adjoint();
|
|
184
|
+
return *this;
|
|
185
|
+
}
|
|
186
|
+
#endif
|
|
187
|
+
|
|
188
|
+
protected:
|
|
189
|
+
MatrixTypeNested m_matrix;
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
// template<typename OtherDerived, typename MatrixType, unsigned int UpLo>
|
|
194
|
+
// internal::selfadjoint_matrix_product_returntype<OtherDerived,SelfAdjointView<MatrixType,UpLo> >
|
|
195
|
+
// operator*(const MatrixBase<OtherDerived>& lhs, const SelfAdjointView<MatrixType,UpLo>& rhs)
|
|
196
|
+
// {
|
|
197
|
+
// return internal::matrix_selfadjoint_product_returntype<OtherDerived,SelfAdjointView<MatrixType,UpLo> >(lhs.derived(),rhs);
|
|
198
|
+
// }
|
|
199
|
+
|
|
200
|
+
// selfadjoint to dense matrix
|
|
201
|
+
|
|
202
|
+
namespace internal {
|
|
203
|
+
|
|
204
|
+
template<typename Derived1, typename Derived2, int UnrollCount, bool ClearOpposite>
|
|
205
|
+
struct triangular_assignment_selector<Derived1, Derived2, (SelfAdjoint|Upper), UnrollCount, ClearOpposite>
|
|
206
|
+
{
|
|
207
|
+
enum {
|
|
208
|
+
col = (UnrollCount-1) / Derived1::RowsAtCompileTime,
|
|
209
|
+
row = (UnrollCount-1) % Derived1::RowsAtCompileTime
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
static inline void run(Derived1 &dst, const Derived2 &src)
|
|
213
|
+
{
|
|
214
|
+
triangular_assignment_selector<Derived1, Derived2, (SelfAdjoint|Upper), UnrollCount-1, ClearOpposite>::run(dst, src);
|
|
215
|
+
|
|
216
|
+
if(row == col)
|
|
217
|
+
dst.coeffRef(row, col) = numext::real(src.coeff(row, col));
|
|
218
|
+
else if(row < col)
|
|
219
|
+
dst.coeffRef(col, row) = numext::conj(dst.coeffRef(row, col) = src.coeff(row, col));
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
|
|
223
|
+
template<typename Derived1, typename Derived2, bool ClearOpposite>
|
|
224
|
+
struct triangular_assignment_selector<Derived1, Derived2, SelfAdjoint|Upper, 0, ClearOpposite>
|
|
225
|
+
{
|
|
226
|
+
static inline void run(Derived1 &, const Derived2 &) {}
|
|
227
|
+
};
|
|
228
|
+
|
|
229
|
+
template<typename Derived1, typename Derived2, int UnrollCount, bool ClearOpposite>
|
|
230
|
+
struct triangular_assignment_selector<Derived1, Derived2, (SelfAdjoint|Lower), UnrollCount, ClearOpposite>
|
|
231
|
+
{
|
|
232
|
+
enum {
|
|
233
|
+
col = (UnrollCount-1) / Derived1::RowsAtCompileTime,
|
|
234
|
+
row = (UnrollCount-1) % Derived1::RowsAtCompileTime
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
static inline void run(Derived1 &dst, const Derived2 &src)
|
|
238
|
+
{
|
|
239
|
+
triangular_assignment_selector<Derived1, Derived2, (SelfAdjoint|Lower), UnrollCount-1, ClearOpposite>::run(dst, src);
|
|
240
|
+
|
|
241
|
+
if(row == col)
|
|
242
|
+
dst.coeffRef(row, col) = numext::real(src.coeff(row, col));
|
|
243
|
+
else if(row > col)
|
|
244
|
+
dst.coeffRef(col, row) = numext::conj(dst.coeffRef(row, col) = src.coeff(row, col));
|
|
245
|
+
}
|
|
246
|
+
};
|
|
247
|
+
|
|
248
|
+
template<typename Derived1, typename Derived2, bool ClearOpposite>
|
|
249
|
+
struct triangular_assignment_selector<Derived1, Derived2, SelfAdjoint|Lower, 0, ClearOpposite>
|
|
250
|
+
{
|
|
251
|
+
static inline void run(Derived1 &, const Derived2 &) {}
|
|
252
|
+
};
|
|
253
|
+
|
|
254
|
+
template<typename Derived1, typename Derived2, bool ClearOpposite>
|
|
255
|
+
struct triangular_assignment_selector<Derived1, Derived2, SelfAdjoint|Upper, Dynamic, ClearOpposite>
|
|
256
|
+
{
|
|
257
|
+
typedef typename Derived1::Index Index;
|
|
258
|
+
static inline void run(Derived1 &dst, const Derived2 &src)
|
|
259
|
+
{
|
|
260
|
+
for(Index j = 0; j < dst.cols(); ++j)
|
|
261
|
+
{
|
|
262
|
+
for(Index i = 0; i < j; ++i)
|
|
263
|
+
{
|
|
264
|
+
dst.copyCoeff(i, j, src);
|
|
265
|
+
dst.coeffRef(j,i) = numext::conj(dst.coeff(i,j));
|
|
266
|
+
}
|
|
267
|
+
dst.copyCoeff(j, j, src);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
};
|
|
271
|
+
|
|
272
|
+
template<typename Derived1, typename Derived2, bool ClearOpposite>
|
|
273
|
+
struct triangular_assignment_selector<Derived1, Derived2, SelfAdjoint|Lower, Dynamic, ClearOpposite>
|
|
274
|
+
{
|
|
275
|
+
static inline void run(Derived1 &dst, const Derived2 &src)
|
|
276
|
+
{
|
|
277
|
+
typedef typename Derived1::Index Index;
|
|
278
|
+
for(Index i = 0; i < dst.rows(); ++i)
|
|
279
|
+
{
|
|
280
|
+
for(Index j = 0; j < i; ++j)
|
|
281
|
+
{
|
|
282
|
+
dst.copyCoeff(i, j, src);
|
|
283
|
+
dst.coeffRef(j,i) = numext::conj(dst.coeff(i,j));
|
|
284
|
+
}
|
|
285
|
+
dst.copyCoeff(i, i, src);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
};
|
|
289
|
+
|
|
290
|
+
} // end namespace internal
|
|
291
|
+
|
|
292
|
+
/***************************************************************************
|
|
293
|
+
* Implementation of MatrixBase methods
|
|
294
|
+
***************************************************************************/
|
|
295
|
+
|
|
296
|
+
template<typename Derived>
|
|
297
|
+
template<unsigned int UpLo>
|
|
298
|
+
typename MatrixBase<Derived>::template ConstSelfAdjointViewReturnType<UpLo>::Type
|
|
299
|
+
MatrixBase<Derived>::selfadjointView() const
|
|
300
|
+
{
|
|
301
|
+
return derived();
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
template<typename Derived>
|
|
305
|
+
template<unsigned int UpLo>
|
|
306
|
+
typename MatrixBase<Derived>::template SelfAdjointViewReturnType<UpLo>::Type
|
|
307
|
+
MatrixBase<Derived>::selfadjointView()
|
|
308
|
+
{
|
|
309
|
+
return derived();
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
} // end namespace Eigen
|
|
313
|
+
|
|
314
|
+
#endif // EIGEN_SELFADJOINTMATRIX_H
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
// This file is part of Eigen, a lightweight C++ template library
|
|
2
|
+
// for linear algebra.
|
|
3
|
+
//
|
|
4
|
+
// Copyright (C) 2009-2010 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_SELFCWISEBINARYOP_H
|
|
11
|
+
#define EIGEN_SELFCWISEBINARYOP_H
|
|
12
|
+
|
|
13
|
+
namespace Eigen {
|
|
14
|
+
|
|
15
|
+
/** \class SelfCwiseBinaryOp
|
|
16
|
+
* \ingroup Core_Module
|
|
17
|
+
*
|
|
18
|
+
* \internal
|
|
19
|
+
*
|
|
20
|
+
* \brief Internal helper class for optimizing operators like +=, -=
|
|
21
|
+
*
|
|
22
|
+
* This is a pseudo expression class re-implementing the copyCoeff/copyPacket
|
|
23
|
+
* method to directly performs a +=/-= operations in an optimal way. In particular,
|
|
24
|
+
* this allows to make sure that the input/output data are loaded only once using
|
|
25
|
+
* aligned packet loads.
|
|
26
|
+
*
|
|
27
|
+
* \sa class SwapWrapper for a similar trick.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
namespace internal {
|
|
31
|
+
template<typename BinaryOp, typename Lhs, typename Rhs>
|
|
32
|
+
struct traits<SelfCwiseBinaryOp<BinaryOp,Lhs,Rhs> >
|
|
33
|
+
: traits<CwiseBinaryOp<BinaryOp,Lhs,Rhs> >
|
|
34
|
+
{
|
|
35
|
+
enum {
|
|
36
|
+
// Note that it is still a good idea to preserve the DirectAccessBit
|
|
37
|
+
// so that assign can correctly align the data.
|
|
38
|
+
Flags = traits<CwiseBinaryOp<BinaryOp,Lhs,Rhs> >::Flags | (Lhs::Flags&DirectAccessBit) | (Lhs::Flags&LvalueBit),
|
|
39
|
+
OuterStrideAtCompileTime = Lhs::OuterStrideAtCompileTime,
|
|
40
|
+
InnerStrideAtCompileTime = Lhs::InnerStrideAtCompileTime
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
template<typename BinaryOp, typename Lhs, typename Rhs> class SelfCwiseBinaryOp
|
|
46
|
+
: public internal::dense_xpr_base< SelfCwiseBinaryOp<BinaryOp, Lhs, Rhs> >::type
|
|
47
|
+
{
|
|
48
|
+
public:
|
|
49
|
+
|
|
50
|
+
typedef typename internal::dense_xpr_base<SelfCwiseBinaryOp>::type Base;
|
|
51
|
+
EIGEN_DENSE_PUBLIC_INTERFACE(SelfCwiseBinaryOp)
|
|
52
|
+
|
|
53
|
+
typedef typename internal::packet_traits<Scalar>::type Packet;
|
|
54
|
+
|
|
55
|
+
inline SelfCwiseBinaryOp(Lhs& xpr, const BinaryOp& func = BinaryOp()) : m_matrix(xpr), m_functor(func) {}
|
|
56
|
+
|
|
57
|
+
inline Index rows() const { return m_matrix.rows(); }
|
|
58
|
+
inline Index cols() const { return m_matrix.cols(); }
|
|
59
|
+
inline Index outerStride() const { return m_matrix.outerStride(); }
|
|
60
|
+
inline Index innerStride() const { return m_matrix.innerStride(); }
|
|
61
|
+
inline const Scalar* data() const { return m_matrix.data(); }
|
|
62
|
+
|
|
63
|
+
// note that this function is needed by assign to correctly align loads/stores
|
|
64
|
+
// TODO make Assign use .data()
|
|
65
|
+
inline Scalar& coeffRef(Index row, Index col)
|
|
66
|
+
{
|
|
67
|
+
EIGEN_STATIC_ASSERT_LVALUE(Lhs)
|
|
68
|
+
return m_matrix.const_cast_derived().coeffRef(row, col);
|
|
69
|
+
}
|
|
70
|
+
inline const Scalar& coeffRef(Index row, Index col) const
|
|
71
|
+
{
|
|
72
|
+
return m_matrix.coeffRef(row, col);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// note that this function is needed by assign to correctly align loads/stores
|
|
76
|
+
// TODO make Assign use .data()
|
|
77
|
+
inline Scalar& coeffRef(Index index)
|
|
78
|
+
{
|
|
79
|
+
EIGEN_STATIC_ASSERT_LVALUE(Lhs)
|
|
80
|
+
return m_matrix.const_cast_derived().coeffRef(index);
|
|
81
|
+
}
|
|
82
|
+
inline const Scalar& coeffRef(Index index) const
|
|
83
|
+
{
|
|
84
|
+
return m_matrix.const_cast_derived().coeffRef(index);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
template<typename OtherDerived>
|
|
88
|
+
void copyCoeff(Index row, Index col, const DenseBase<OtherDerived>& other)
|
|
89
|
+
{
|
|
90
|
+
OtherDerived& _other = other.const_cast_derived();
|
|
91
|
+
eigen_internal_assert(row >= 0 && row < rows()
|
|
92
|
+
&& col >= 0 && col < cols());
|
|
93
|
+
Scalar& tmp = m_matrix.coeffRef(row,col);
|
|
94
|
+
tmp = m_functor(tmp, _other.coeff(row,col));
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
template<typename OtherDerived>
|
|
98
|
+
void copyCoeff(Index index, const DenseBase<OtherDerived>& other)
|
|
99
|
+
{
|
|
100
|
+
OtherDerived& _other = other.const_cast_derived();
|
|
101
|
+
eigen_internal_assert(index >= 0 && index < m_matrix.size());
|
|
102
|
+
Scalar& tmp = m_matrix.coeffRef(index);
|
|
103
|
+
tmp = m_functor(tmp, _other.coeff(index));
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
template<typename OtherDerived, int StoreMode, int LoadMode>
|
|
107
|
+
void copyPacket(Index row, Index col, const DenseBase<OtherDerived>& other)
|
|
108
|
+
{
|
|
109
|
+
OtherDerived& _other = other.const_cast_derived();
|
|
110
|
+
eigen_internal_assert(row >= 0 && row < rows()
|
|
111
|
+
&& col >= 0 && col < cols());
|
|
112
|
+
m_matrix.template writePacket<StoreMode>(row, col,
|
|
113
|
+
m_functor.packetOp(m_matrix.template packet<StoreMode>(row, col),_other.template packet<LoadMode>(row, col)) );
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
template<typename OtherDerived, int StoreMode, int LoadMode>
|
|
117
|
+
void copyPacket(Index index, const DenseBase<OtherDerived>& other)
|
|
118
|
+
{
|
|
119
|
+
OtherDerived& _other = other.const_cast_derived();
|
|
120
|
+
eigen_internal_assert(index >= 0 && index < m_matrix.size());
|
|
121
|
+
m_matrix.template writePacket<StoreMode>(index,
|
|
122
|
+
m_functor.packetOp(m_matrix.template packet<StoreMode>(index),_other.template packet<LoadMode>(index)) );
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// reimplement lazyAssign to handle complex *= real
|
|
126
|
+
// see CwiseBinaryOp ctor for details
|
|
127
|
+
template<typename RhsDerived>
|
|
128
|
+
EIGEN_STRONG_INLINE SelfCwiseBinaryOp& lazyAssign(const DenseBase<RhsDerived>& rhs)
|
|
129
|
+
{
|
|
130
|
+
EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(Lhs,RhsDerived)
|
|
131
|
+
EIGEN_CHECK_BINARY_COMPATIBILIY(BinaryOp,typename Lhs::Scalar,typename RhsDerived::Scalar);
|
|
132
|
+
|
|
133
|
+
#ifdef EIGEN_DEBUG_ASSIGN
|
|
134
|
+
internal::assign_traits<SelfCwiseBinaryOp, RhsDerived>::debug();
|
|
135
|
+
#endif
|
|
136
|
+
eigen_assert(rows() == rhs.rows() && cols() == rhs.cols());
|
|
137
|
+
internal::assign_impl<SelfCwiseBinaryOp, RhsDerived>::run(*this,rhs.derived());
|
|
138
|
+
#ifndef EIGEN_NO_DEBUG
|
|
139
|
+
this->checkTransposeAliasing(rhs.derived());
|
|
140
|
+
#endif
|
|
141
|
+
return *this;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// overloaded to honor evaluation of special matrices
|
|
145
|
+
// maybe another solution would be to not use SelfCwiseBinaryOp
|
|
146
|
+
// at first...
|
|
147
|
+
SelfCwiseBinaryOp& operator=(const Rhs& _rhs)
|
|
148
|
+
{
|
|
149
|
+
typename internal::nested<Rhs>::type rhs(_rhs);
|
|
150
|
+
return Base::operator=(rhs);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
Lhs& expression() const
|
|
154
|
+
{
|
|
155
|
+
return m_matrix;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
const BinaryOp& functor() const
|
|
159
|
+
{
|
|
160
|
+
return m_functor;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
protected:
|
|
164
|
+
Lhs& m_matrix;
|
|
165
|
+
const BinaryOp& m_functor;
|
|
166
|
+
|
|
167
|
+
private:
|
|
168
|
+
SelfCwiseBinaryOp& operator=(const SelfCwiseBinaryOp&);
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
template<typename Derived>
|
|
172
|
+
inline Derived& DenseBase<Derived>::operator*=(const Scalar& other)
|
|
173
|
+
{
|
|
174
|
+
typedef typename Derived::PlainObject PlainObject;
|
|
175
|
+
SelfCwiseBinaryOp<internal::scalar_product_op<Scalar>, Derived, typename PlainObject::ConstantReturnType> tmp(derived());
|
|
176
|
+
tmp = PlainObject::Constant(rows(),cols(),other);
|
|
177
|
+
return derived();
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
template<typename Derived>
|
|
181
|
+
inline Derived& DenseBase<Derived>::operator/=(const Scalar& other)
|
|
182
|
+
{
|
|
183
|
+
typedef typename Derived::PlainObject PlainObject;
|
|
184
|
+
SelfCwiseBinaryOp<internal::scalar_quotient_op<Scalar>, Derived, typename PlainObject::ConstantReturnType> tmp(derived());
|
|
185
|
+
tmp = PlainObject::Constant(rows(),cols(), other);
|
|
186
|
+
return derived();
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
} // end namespace Eigen
|
|
190
|
+
|
|
191
|
+
#endif // EIGEN_SELFCWISEBINARYOP_H
|