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,181 @@
|
|
|
1
|
+
// This file is part of Eigen, a lightweight C++ template library
|
|
2
|
+
// for linear algebra.
|
|
3
|
+
//
|
|
4
|
+
// Copyright (C) 2008 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_MAPPED_SPARSEMATRIX_H
|
|
11
|
+
#define EIGEN_MAPPED_SPARSEMATRIX_H
|
|
12
|
+
|
|
13
|
+
namespace Eigen {
|
|
14
|
+
|
|
15
|
+
/** \class MappedSparseMatrix
|
|
16
|
+
*
|
|
17
|
+
* \brief Sparse matrix
|
|
18
|
+
*
|
|
19
|
+
* \param _Scalar the scalar type, i.e. the type of the coefficients
|
|
20
|
+
*
|
|
21
|
+
* See http://www.netlib.org/linalg/html_templates/node91.html for details on the storage scheme.
|
|
22
|
+
*
|
|
23
|
+
*/
|
|
24
|
+
namespace internal {
|
|
25
|
+
template<typename _Scalar, int _Flags, typename _Index>
|
|
26
|
+
struct traits<MappedSparseMatrix<_Scalar, _Flags, _Index> > : traits<SparseMatrix<_Scalar, _Flags, _Index> >
|
|
27
|
+
{};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
template<typename _Scalar, int _Flags, typename _Index>
|
|
31
|
+
class MappedSparseMatrix
|
|
32
|
+
: public SparseMatrixBase<MappedSparseMatrix<_Scalar, _Flags, _Index> >
|
|
33
|
+
{
|
|
34
|
+
public:
|
|
35
|
+
EIGEN_SPARSE_PUBLIC_INTERFACE(MappedSparseMatrix)
|
|
36
|
+
enum { IsRowMajor = Base::IsRowMajor };
|
|
37
|
+
|
|
38
|
+
protected:
|
|
39
|
+
|
|
40
|
+
Index m_outerSize;
|
|
41
|
+
Index m_innerSize;
|
|
42
|
+
Index m_nnz;
|
|
43
|
+
Index* m_outerIndex;
|
|
44
|
+
Index* m_innerIndices;
|
|
45
|
+
Scalar* m_values;
|
|
46
|
+
|
|
47
|
+
public:
|
|
48
|
+
|
|
49
|
+
inline Index rows() const { return IsRowMajor ? m_outerSize : m_innerSize; }
|
|
50
|
+
inline Index cols() const { return IsRowMajor ? m_innerSize : m_outerSize; }
|
|
51
|
+
inline Index innerSize() const { return m_innerSize; }
|
|
52
|
+
inline Index outerSize() const { return m_outerSize; }
|
|
53
|
+
|
|
54
|
+
bool isCompressed() const { return true; }
|
|
55
|
+
|
|
56
|
+
//----------------------------------------
|
|
57
|
+
// direct access interface
|
|
58
|
+
inline const Scalar* valuePtr() const { return m_values; }
|
|
59
|
+
inline Scalar* valuePtr() { return m_values; }
|
|
60
|
+
|
|
61
|
+
inline const Index* innerIndexPtr() const { return m_innerIndices; }
|
|
62
|
+
inline Index* innerIndexPtr() { return m_innerIndices; }
|
|
63
|
+
|
|
64
|
+
inline const Index* outerIndexPtr() const { return m_outerIndex; }
|
|
65
|
+
inline Index* outerIndexPtr() { return m_outerIndex; }
|
|
66
|
+
//----------------------------------------
|
|
67
|
+
|
|
68
|
+
inline Scalar coeff(Index row, Index col) const
|
|
69
|
+
{
|
|
70
|
+
const Index outer = IsRowMajor ? row : col;
|
|
71
|
+
const Index inner = IsRowMajor ? col : row;
|
|
72
|
+
|
|
73
|
+
Index start = m_outerIndex[outer];
|
|
74
|
+
Index end = m_outerIndex[outer+1];
|
|
75
|
+
if (start==end)
|
|
76
|
+
return Scalar(0);
|
|
77
|
+
else if (end>0 && inner==m_innerIndices[end-1])
|
|
78
|
+
return m_values[end-1];
|
|
79
|
+
// ^^ optimization: let's first check if it is the last coefficient
|
|
80
|
+
// (very common in high level algorithms)
|
|
81
|
+
|
|
82
|
+
const Index* r = std::lower_bound(&m_innerIndices[start],&m_innerIndices[end-1],inner);
|
|
83
|
+
const Index id = r-&m_innerIndices[0];
|
|
84
|
+
return ((*r==inner) && (id<end)) ? m_values[id] : Scalar(0);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
inline Scalar& coeffRef(Index row, Index col)
|
|
88
|
+
{
|
|
89
|
+
const Index outer = IsRowMajor ? row : col;
|
|
90
|
+
const Index inner = IsRowMajor ? col : row;
|
|
91
|
+
|
|
92
|
+
Index start = m_outerIndex[outer];
|
|
93
|
+
Index end = m_outerIndex[outer+1];
|
|
94
|
+
eigen_assert(end>=start && "you probably called coeffRef on a non finalized matrix");
|
|
95
|
+
eigen_assert(end>start && "coeffRef cannot be called on a zero coefficient");
|
|
96
|
+
Index* r = std::lower_bound(&m_innerIndices[start],&m_innerIndices[end],inner);
|
|
97
|
+
const Index id = r-&m_innerIndices[0];
|
|
98
|
+
eigen_assert((*r==inner) && (id<end) && "coeffRef cannot be called on a zero coefficient");
|
|
99
|
+
return m_values[id];
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
class InnerIterator;
|
|
103
|
+
class ReverseInnerIterator;
|
|
104
|
+
|
|
105
|
+
/** \returns the number of non zero coefficients */
|
|
106
|
+
inline Index nonZeros() const { return m_nnz; }
|
|
107
|
+
|
|
108
|
+
inline MappedSparseMatrix(Index rows, Index cols, Index nnz, Index* outerIndexPtr, Index* innerIndexPtr, Scalar* valuePtr)
|
|
109
|
+
: m_outerSize(IsRowMajor?rows:cols), m_innerSize(IsRowMajor?cols:rows), m_nnz(nnz), m_outerIndex(outerIndexPtr),
|
|
110
|
+
m_innerIndices(innerIndexPtr), m_values(valuePtr)
|
|
111
|
+
{}
|
|
112
|
+
|
|
113
|
+
/** Empty destructor */
|
|
114
|
+
inline ~MappedSparseMatrix() {}
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
template<typename Scalar, int _Flags, typename _Index>
|
|
118
|
+
class MappedSparseMatrix<Scalar,_Flags,_Index>::InnerIterator
|
|
119
|
+
{
|
|
120
|
+
public:
|
|
121
|
+
InnerIterator(const MappedSparseMatrix& mat, Index outer)
|
|
122
|
+
: m_matrix(mat),
|
|
123
|
+
m_outer(outer),
|
|
124
|
+
m_id(mat.outerIndexPtr()[outer]),
|
|
125
|
+
m_start(m_id),
|
|
126
|
+
m_end(mat.outerIndexPtr()[outer+1])
|
|
127
|
+
{}
|
|
128
|
+
|
|
129
|
+
inline InnerIterator& operator++() { m_id++; return *this; }
|
|
130
|
+
|
|
131
|
+
inline Scalar value() const { return m_matrix.valuePtr()[m_id]; }
|
|
132
|
+
inline Scalar& valueRef() { return const_cast<Scalar&>(m_matrix.valuePtr()[m_id]); }
|
|
133
|
+
|
|
134
|
+
inline Index index() const { return m_matrix.innerIndexPtr()[m_id]; }
|
|
135
|
+
inline Index row() const { return IsRowMajor ? m_outer : index(); }
|
|
136
|
+
inline Index col() const { return IsRowMajor ? index() : m_outer; }
|
|
137
|
+
|
|
138
|
+
inline operator bool() const { return (m_id < m_end) && (m_id>=m_start); }
|
|
139
|
+
|
|
140
|
+
protected:
|
|
141
|
+
const MappedSparseMatrix& m_matrix;
|
|
142
|
+
const Index m_outer;
|
|
143
|
+
Index m_id;
|
|
144
|
+
const Index m_start;
|
|
145
|
+
const Index m_end;
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
template<typename Scalar, int _Flags, typename _Index>
|
|
149
|
+
class MappedSparseMatrix<Scalar,_Flags,_Index>::ReverseInnerIterator
|
|
150
|
+
{
|
|
151
|
+
public:
|
|
152
|
+
ReverseInnerIterator(const MappedSparseMatrix& mat, Index outer)
|
|
153
|
+
: m_matrix(mat),
|
|
154
|
+
m_outer(outer),
|
|
155
|
+
m_id(mat.outerIndexPtr()[outer+1]),
|
|
156
|
+
m_start(mat.outerIndexPtr()[outer]),
|
|
157
|
+
m_end(m_id)
|
|
158
|
+
{}
|
|
159
|
+
|
|
160
|
+
inline ReverseInnerIterator& operator--() { m_id--; return *this; }
|
|
161
|
+
|
|
162
|
+
inline Scalar value() const { return m_matrix.valuePtr()[m_id-1]; }
|
|
163
|
+
inline Scalar& valueRef() { return const_cast<Scalar&>(m_matrix.valuePtr()[m_id-1]); }
|
|
164
|
+
|
|
165
|
+
inline Index index() const { return m_matrix.innerIndexPtr()[m_id-1]; }
|
|
166
|
+
inline Index row() const { return IsRowMajor ? m_outer : index(); }
|
|
167
|
+
inline Index col() const { return IsRowMajor ? index() : m_outer; }
|
|
168
|
+
|
|
169
|
+
inline operator bool() const { return (m_id <= m_end) && (m_id>m_start); }
|
|
170
|
+
|
|
171
|
+
protected:
|
|
172
|
+
const MappedSparseMatrix& m_matrix;
|
|
173
|
+
const Index m_outer;
|
|
174
|
+
Index m_id;
|
|
175
|
+
const Index m_start;
|
|
176
|
+
const Index m_end;
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
} // end namespace Eigen
|
|
180
|
+
|
|
181
|
+
#endif // EIGEN_MAPPED_SPARSEMATRIX_H
|
|
@@ -0,0 +1,537 @@
|
|
|
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_SPARSE_BLOCK_H
|
|
11
|
+
#define EIGEN_SPARSE_BLOCK_H
|
|
12
|
+
|
|
13
|
+
namespace Eigen {
|
|
14
|
+
|
|
15
|
+
template<typename XprType, int BlockRows, int BlockCols>
|
|
16
|
+
class BlockImpl<XprType,BlockRows,BlockCols,true,Sparse>
|
|
17
|
+
: public SparseMatrixBase<Block<XprType,BlockRows,BlockCols,true> >
|
|
18
|
+
{
|
|
19
|
+
typedef typename internal::remove_all<typename XprType::Nested>::type _MatrixTypeNested;
|
|
20
|
+
typedef Block<XprType, BlockRows, BlockCols, true> BlockType;
|
|
21
|
+
public:
|
|
22
|
+
enum { IsRowMajor = internal::traits<BlockType>::IsRowMajor };
|
|
23
|
+
protected:
|
|
24
|
+
enum { OuterSize = IsRowMajor ? BlockRows : BlockCols };
|
|
25
|
+
public:
|
|
26
|
+
EIGEN_SPARSE_PUBLIC_INTERFACE(BlockType)
|
|
27
|
+
|
|
28
|
+
class InnerIterator: public XprType::InnerIterator
|
|
29
|
+
{
|
|
30
|
+
typedef typename BlockImpl::Index Index;
|
|
31
|
+
public:
|
|
32
|
+
inline InnerIterator(const BlockType& xpr, Index outer)
|
|
33
|
+
: XprType::InnerIterator(xpr.m_matrix, xpr.m_outerStart + outer), m_outer(outer)
|
|
34
|
+
{}
|
|
35
|
+
inline Index row() const { return IsRowMajor ? m_outer : this->index(); }
|
|
36
|
+
inline Index col() const { return IsRowMajor ? this->index() : m_outer; }
|
|
37
|
+
protected:
|
|
38
|
+
Index m_outer;
|
|
39
|
+
};
|
|
40
|
+
class ReverseInnerIterator: public XprType::ReverseInnerIterator
|
|
41
|
+
{
|
|
42
|
+
typedef typename BlockImpl::Index Index;
|
|
43
|
+
public:
|
|
44
|
+
inline ReverseInnerIterator(const BlockType& xpr, Index outer)
|
|
45
|
+
: XprType::ReverseInnerIterator(xpr.m_matrix, xpr.m_outerStart + outer), m_outer(outer)
|
|
46
|
+
{}
|
|
47
|
+
inline Index row() const { return IsRowMajor ? m_outer : this->index(); }
|
|
48
|
+
inline Index col() const { return IsRowMajor ? this->index() : m_outer; }
|
|
49
|
+
protected:
|
|
50
|
+
Index m_outer;
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
inline BlockImpl(const XprType& xpr, int i)
|
|
54
|
+
: m_matrix(xpr), m_outerStart(i), m_outerSize(OuterSize)
|
|
55
|
+
{}
|
|
56
|
+
|
|
57
|
+
inline BlockImpl(const XprType& xpr, int startRow, int startCol, int blockRows, int blockCols)
|
|
58
|
+
: m_matrix(xpr), m_outerStart(IsRowMajor ? startRow : startCol), m_outerSize(IsRowMajor ? blockRows : blockCols)
|
|
59
|
+
{}
|
|
60
|
+
|
|
61
|
+
inline const Scalar coeff(int row, int col) const
|
|
62
|
+
{
|
|
63
|
+
return m_matrix.coeff(row + IsRowMajor ? m_outerStart : 0, col +IsRowMajor ? 0 : m_outerStart);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
inline const Scalar coeff(int index) const
|
|
67
|
+
{
|
|
68
|
+
return m_matrix.coeff(IsRowMajor ? m_outerStart : index, IsRowMajor ? index : m_outerStart);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
EIGEN_STRONG_INLINE Index rows() const { return IsRowMajor ? m_outerSize.value() : m_matrix.rows(); }
|
|
72
|
+
EIGEN_STRONG_INLINE Index cols() const { return IsRowMajor ? m_matrix.cols() : m_outerSize.value(); }
|
|
73
|
+
|
|
74
|
+
protected:
|
|
75
|
+
|
|
76
|
+
typename XprType::Nested m_matrix;
|
|
77
|
+
Index m_outerStart;
|
|
78
|
+
const internal::variable_if_dynamic<Index, OuterSize> m_outerSize;
|
|
79
|
+
|
|
80
|
+
EIGEN_INHERIT_ASSIGNMENT_OPERATORS(BlockImpl)
|
|
81
|
+
private:
|
|
82
|
+
Index nonZeros() const;
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
/***************************************************************************
|
|
87
|
+
* specialisation for SparseMatrix
|
|
88
|
+
***************************************************************************/
|
|
89
|
+
|
|
90
|
+
template<typename _Scalar, int _Options, typename _Index, int BlockRows, int BlockCols>
|
|
91
|
+
class BlockImpl<SparseMatrix<_Scalar, _Options, _Index>,BlockRows,BlockCols,true,Sparse>
|
|
92
|
+
: public SparseMatrixBase<Block<SparseMatrix<_Scalar, _Options, _Index>,BlockRows,BlockCols,true> >
|
|
93
|
+
{
|
|
94
|
+
typedef SparseMatrix<_Scalar, _Options, _Index> SparseMatrixType;
|
|
95
|
+
typedef typename internal::remove_all<typename SparseMatrixType::Nested>::type _MatrixTypeNested;
|
|
96
|
+
typedef Block<SparseMatrixType, BlockRows, BlockCols, true> BlockType;
|
|
97
|
+
typedef Block<const SparseMatrixType, BlockRows, BlockCols, true> ConstBlockType;
|
|
98
|
+
public:
|
|
99
|
+
enum { IsRowMajor = internal::traits<BlockType>::IsRowMajor };
|
|
100
|
+
EIGEN_SPARSE_PUBLIC_INTERFACE(BlockType)
|
|
101
|
+
protected:
|
|
102
|
+
enum { OuterSize = IsRowMajor ? BlockRows : BlockCols };
|
|
103
|
+
public:
|
|
104
|
+
|
|
105
|
+
class InnerIterator: public SparseMatrixType::InnerIterator
|
|
106
|
+
{
|
|
107
|
+
public:
|
|
108
|
+
inline InnerIterator(const BlockType& xpr, Index outer)
|
|
109
|
+
: SparseMatrixType::InnerIterator(xpr.m_matrix, xpr.m_outerStart + outer), m_outer(outer)
|
|
110
|
+
{}
|
|
111
|
+
inline Index row() const { return IsRowMajor ? m_outer : this->index(); }
|
|
112
|
+
inline Index col() const { return IsRowMajor ? this->index() : m_outer; }
|
|
113
|
+
protected:
|
|
114
|
+
Index m_outer;
|
|
115
|
+
};
|
|
116
|
+
class ReverseInnerIterator: public SparseMatrixType::ReverseInnerIterator
|
|
117
|
+
{
|
|
118
|
+
public:
|
|
119
|
+
inline ReverseInnerIterator(const BlockType& xpr, Index outer)
|
|
120
|
+
: SparseMatrixType::ReverseInnerIterator(xpr.m_matrix, xpr.m_outerStart + outer), m_outer(outer)
|
|
121
|
+
{}
|
|
122
|
+
inline Index row() const { return IsRowMajor ? m_outer : this->index(); }
|
|
123
|
+
inline Index col() const { return IsRowMajor ? this->index() : m_outer; }
|
|
124
|
+
protected:
|
|
125
|
+
Index m_outer;
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
inline BlockImpl(const SparseMatrixType& xpr, int i)
|
|
129
|
+
: m_matrix(xpr), m_outerStart(i), m_outerSize(OuterSize)
|
|
130
|
+
{}
|
|
131
|
+
|
|
132
|
+
inline BlockImpl(const SparseMatrixType& xpr, int startRow, int startCol, int blockRows, int blockCols)
|
|
133
|
+
: m_matrix(xpr), m_outerStart(IsRowMajor ? startRow : startCol), m_outerSize(IsRowMajor ? blockRows : blockCols)
|
|
134
|
+
{}
|
|
135
|
+
|
|
136
|
+
template<typename OtherDerived>
|
|
137
|
+
inline BlockType& operator=(const SparseMatrixBase<OtherDerived>& other)
|
|
138
|
+
{
|
|
139
|
+
typedef typename internal::remove_all<typename SparseMatrixType::Nested>::type _NestedMatrixType;
|
|
140
|
+
_NestedMatrixType& matrix = const_cast<_NestedMatrixType&>(m_matrix);;
|
|
141
|
+
// This assignement is slow if this vector set is not empty
|
|
142
|
+
// and/or it is not at the end of the nonzeros of the underlying matrix.
|
|
143
|
+
|
|
144
|
+
// 1 - eval to a temporary to avoid transposition and/or aliasing issues
|
|
145
|
+
SparseMatrix<Scalar, IsRowMajor ? RowMajor : ColMajor, Index> tmp(other);
|
|
146
|
+
|
|
147
|
+
// 2 - let's check whether there is enough allocated memory
|
|
148
|
+
Index nnz = tmp.nonZeros();
|
|
149
|
+
Index start = m_outerStart==0 ? 0 : matrix.outerIndexPtr()[m_outerStart]; // starting position of the current block
|
|
150
|
+
Index end = m_matrix.outerIndexPtr()[m_outerStart+m_outerSize.value()]; // ending posiiton of the current block
|
|
151
|
+
Index block_size = end - start; // available room in the current block
|
|
152
|
+
Index tail_size = m_matrix.outerIndexPtr()[m_matrix.outerSize()] - end;
|
|
153
|
+
|
|
154
|
+
Index free_size = m_matrix.isCompressed()
|
|
155
|
+
? Index(matrix.data().allocatedSize()) + block_size
|
|
156
|
+
: block_size;
|
|
157
|
+
|
|
158
|
+
if(nnz>free_size)
|
|
159
|
+
{
|
|
160
|
+
// realloc manually to reduce copies
|
|
161
|
+
typename SparseMatrixType::Storage newdata(m_matrix.data().allocatedSize() - block_size + nnz);
|
|
162
|
+
|
|
163
|
+
std::memcpy(&newdata.value(0), &m_matrix.data().value(0), start*sizeof(Scalar));
|
|
164
|
+
std::memcpy(&newdata.index(0), &m_matrix.data().index(0), start*sizeof(Index));
|
|
165
|
+
|
|
166
|
+
std::memcpy(&newdata.value(start), &tmp.data().value(0), nnz*sizeof(Scalar));
|
|
167
|
+
std::memcpy(&newdata.index(start), &tmp.data().index(0), nnz*sizeof(Index));
|
|
168
|
+
|
|
169
|
+
std::memcpy(&newdata.value(start+nnz), &matrix.data().value(end), tail_size*sizeof(Scalar));
|
|
170
|
+
std::memcpy(&newdata.index(start+nnz), &matrix.data().index(end), tail_size*sizeof(Index));
|
|
171
|
+
|
|
172
|
+
newdata.resize(m_matrix.outerIndexPtr()[m_matrix.outerSize()] - block_size + nnz);
|
|
173
|
+
|
|
174
|
+
matrix.data().swap(newdata);
|
|
175
|
+
}
|
|
176
|
+
else
|
|
177
|
+
{
|
|
178
|
+
// no need to realloc, simply copy the tail at its respective position and insert tmp
|
|
179
|
+
matrix.data().resize(start + nnz + tail_size);
|
|
180
|
+
|
|
181
|
+
std::memmove(&matrix.data().value(start+nnz), &matrix.data().value(end), tail_size*sizeof(Scalar));
|
|
182
|
+
std::memmove(&matrix.data().index(start+nnz), &matrix.data().index(end), tail_size*sizeof(Index));
|
|
183
|
+
|
|
184
|
+
std::memcpy(&matrix.data().value(start), &tmp.data().value(0), nnz*sizeof(Scalar));
|
|
185
|
+
std::memcpy(&matrix.data().index(start), &tmp.data().index(0), nnz*sizeof(Index));
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// update innerNonZeros
|
|
189
|
+
if(!m_matrix.isCompressed())
|
|
190
|
+
for(Index j=0; j<m_outerSize.value(); ++j)
|
|
191
|
+
matrix.innerNonZeroPtr()[m_outerStart+j] = tmp.innerVector(j).nonZeros();
|
|
192
|
+
|
|
193
|
+
// update outer index pointers
|
|
194
|
+
Index p = start;
|
|
195
|
+
for(Index k=0; k<m_outerSize.value(); ++k)
|
|
196
|
+
{
|
|
197
|
+
matrix.outerIndexPtr()[m_outerStart+k] = p;
|
|
198
|
+
p += tmp.innerVector(k).nonZeros();
|
|
199
|
+
}
|
|
200
|
+
std::ptrdiff_t offset = nnz - block_size;
|
|
201
|
+
for(Index k = m_outerStart + m_outerSize.value(); k<=matrix.outerSize(); ++k)
|
|
202
|
+
{
|
|
203
|
+
matrix.outerIndexPtr()[k] += offset;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
return derived();
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
inline BlockType& operator=(const BlockType& other)
|
|
210
|
+
{
|
|
211
|
+
return operator=<BlockType>(other);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
inline const Scalar* valuePtr() const
|
|
215
|
+
{ return m_matrix.valuePtr() + m_matrix.outerIndexPtr()[m_outerStart]; }
|
|
216
|
+
inline Scalar* valuePtr()
|
|
217
|
+
{ return m_matrix.const_cast_derived().valuePtr() + m_matrix.outerIndexPtr()[m_outerStart]; }
|
|
218
|
+
|
|
219
|
+
inline const Index* innerIndexPtr() const
|
|
220
|
+
{ return m_matrix.innerIndexPtr() + m_matrix.outerIndexPtr()[m_outerStart]; }
|
|
221
|
+
inline Index* innerIndexPtr()
|
|
222
|
+
{ return m_matrix.const_cast_derived().innerIndexPtr() + m_matrix.outerIndexPtr()[m_outerStart]; }
|
|
223
|
+
|
|
224
|
+
inline const Index* outerIndexPtr() const
|
|
225
|
+
{ return m_matrix.outerIndexPtr() + m_outerStart; }
|
|
226
|
+
inline Index* outerIndexPtr()
|
|
227
|
+
{ return m_matrix.const_cast_derived().outerIndexPtr() + m_outerStart; }
|
|
228
|
+
|
|
229
|
+
Index nonZeros() const
|
|
230
|
+
{
|
|
231
|
+
if(m_matrix.isCompressed())
|
|
232
|
+
return std::size_t(m_matrix.outerIndexPtr()[m_outerStart+m_outerSize.value()])
|
|
233
|
+
- std::size_t(m_matrix.outerIndexPtr()[m_outerStart]);
|
|
234
|
+
else if(m_outerSize.value()==0)
|
|
235
|
+
return 0;
|
|
236
|
+
else
|
|
237
|
+
return Map<const Matrix<Index,OuterSize,1> >(m_matrix.innerNonZeroPtr()+m_outerStart, m_outerSize.value()).sum();
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
inline Scalar& coeffRef(int row, int col)
|
|
241
|
+
{
|
|
242
|
+
return m_matrix.const_cast_derived().coeffRef(row + (IsRowMajor ? m_outerStart : 0), col + (IsRowMajor ? 0 : m_outerStart));
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
inline const Scalar coeff(int row, int col) const
|
|
246
|
+
{
|
|
247
|
+
return m_matrix.coeff(row + (IsRowMajor ? m_outerStart : 0), col + (IsRowMajor ? 0 : m_outerStart));
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
inline const Scalar coeff(int index) const
|
|
251
|
+
{
|
|
252
|
+
return m_matrix.coeff(IsRowMajor ? m_outerStart : index, IsRowMajor ? index : m_outerStart);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
const Scalar& lastCoeff() const
|
|
256
|
+
{
|
|
257
|
+
EIGEN_STATIC_ASSERT_VECTOR_ONLY(BlockImpl);
|
|
258
|
+
eigen_assert(nonZeros()>0);
|
|
259
|
+
if(m_matrix.isCompressed())
|
|
260
|
+
return m_matrix.valuePtr()[m_matrix.outerIndexPtr()[m_outerStart+1]-1];
|
|
261
|
+
else
|
|
262
|
+
return m_matrix.valuePtr()[m_matrix.outerIndexPtr()[m_outerStart]+m_matrix.innerNonZeroPtr()[m_outerStart]-1];
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
EIGEN_STRONG_INLINE Index rows() const { return IsRowMajor ? m_outerSize.value() : m_matrix.rows(); }
|
|
266
|
+
EIGEN_STRONG_INLINE Index cols() const { return IsRowMajor ? m_matrix.cols() : m_outerSize.value(); }
|
|
267
|
+
|
|
268
|
+
protected:
|
|
269
|
+
|
|
270
|
+
typename SparseMatrixType::Nested m_matrix;
|
|
271
|
+
Index m_outerStart;
|
|
272
|
+
const internal::variable_if_dynamic<Index, OuterSize> m_outerSize;
|
|
273
|
+
|
|
274
|
+
};
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
template<typename _Scalar, int _Options, typename _Index, int BlockRows, int BlockCols>
|
|
278
|
+
class BlockImpl<const SparseMatrix<_Scalar, _Options, _Index>,BlockRows,BlockCols,true,Sparse>
|
|
279
|
+
: public SparseMatrixBase<Block<const SparseMatrix<_Scalar, _Options, _Index>,BlockRows,BlockCols,true> >
|
|
280
|
+
{
|
|
281
|
+
typedef SparseMatrix<_Scalar, _Options, _Index> SparseMatrixType;
|
|
282
|
+
typedef typename internal::remove_all<typename SparseMatrixType::Nested>::type _MatrixTypeNested;
|
|
283
|
+
typedef Block<const SparseMatrixType, BlockRows, BlockCols, true> BlockType;
|
|
284
|
+
public:
|
|
285
|
+
enum { IsRowMajor = internal::traits<BlockType>::IsRowMajor };
|
|
286
|
+
EIGEN_SPARSE_PUBLIC_INTERFACE(BlockType)
|
|
287
|
+
protected:
|
|
288
|
+
enum { OuterSize = IsRowMajor ? BlockRows : BlockCols };
|
|
289
|
+
public:
|
|
290
|
+
|
|
291
|
+
class InnerIterator: public SparseMatrixType::InnerIterator
|
|
292
|
+
{
|
|
293
|
+
public:
|
|
294
|
+
inline InnerIterator(const BlockType& xpr, Index outer)
|
|
295
|
+
: SparseMatrixType::InnerIterator(xpr.m_matrix, xpr.m_outerStart + outer), m_outer(outer)
|
|
296
|
+
{}
|
|
297
|
+
inline Index row() const { return IsRowMajor ? m_outer : this->index(); }
|
|
298
|
+
inline Index col() const { return IsRowMajor ? this->index() : m_outer; }
|
|
299
|
+
protected:
|
|
300
|
+
Index m_outer;
|
|
301
|
+
};
|
|
302
|
+
class ReverseInnerIterator: public SparseMatrixType::ReverseInnerIterator
|
|
303
|
+
{
|
|
304
|
+
public:
|
|
305
|
+
inline ReverseInnerIterator(const BlockType& xpr, Index outer)
|
|
306
|
+
: SparseMatrixType::ReverseInnerIterator(xpr.m_matrix, xpr.m_outerStart + outer), m_outer(outer)
|
|
307
|
+
{}
|
|
308
|
+
inline Index row() const { return IsRowMajor ? m_outer : this->index(); }
|
|
309
|
+
inline Index col() const { return IsRowMajor ? this->index() : m_outer; }
|
|
310
|
+
protected:
|
|
311
|
+
Index m_outer;
|
|
312
|
+
};
|
|
313
|
+
|
|
314
|
+
inline BlockImpl(const SparseMatrixType& xpr, int i)
|
|
315
|
+
: m_matrix(xpr), m_outerStart(i), m_outerSize(OuterSize)
|
|
316
|
+
{}
|
|
317
|
+
|
|
318
|
+
inline BlockImpl(const SparseMatrixType& xpr, int startRow, int startCol, int blockRows, int blockCols)
|
|
319
|
+
: m_matrix(xpr), m_outerStart(IsRowMajor ? startRow : startCol), m_outerSize(IsRowMajor ? blockRows : blockCols)
|
|
320
|
+
{}
|
|
321
|
+
|
|
322
|
+
inline const Scalar* valuePtr() const
|
|
323
|
+
{ return m_matrix.valuePtr() + m_matrix.outerIndexPtr()[m_outerStart]; }
|
|
324
|
+
|
|
325
|
+
inline const Index* innerIndexPtr() const
|
|
326
|
+
{ return m_matrix.innerIndexPtr() + m_matrix.outerIndexPtr()[m_outerStart]; }
|
|
327
|
+
|
|
328
|
+
inline const Index* outerIndexPtr() const
|
|
329
|
+
{ return m_matrix.outerIndexPtr() + m_outerStart; }
|
|
330
|
+
|
|
331
|
+
Index nonZeros() const
|
|
332
|
+
{
|
|
333
|
+
if(m_matrix.isCompressed())
|
|
334
|
+
return std::size_t(m_matrix.outerIndexPtr()[m_outerStart+m_outerSize.value()])
|
|
335
|
+
- std::size_t(m_matrix.outerIndexPtr()[m_outerStart]);
|
|
336
|
+
else if(m_outerSize.value()==0)
|
|
337
|
+
return 0;
|
|
338
|
+
else
|
|
339
|
+
return Map<const Matrix<Index,OuterSize,1> >(m_matrix.innerNonZeroPtr()+m_outerStart, m_outerSize.value()).sum();
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
inline const Scalar coeff(int row, int col) const
|
|
343
|
+
{
|
|
344
|
+
return m_matrix.coeff(row + (IsRowMajor ? m_outerStart : 0), col + (IsRowMajor ? 0 : m_outerStart));
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
inline const Scalar coeff(int index) const
|
|
348
|
+
{
|
|
349
|
+
return m_matrix.coeff(IsRowMajor ? m_outerStart : index, IsRowMajor ? index : m_outerStart);
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
const Scalar& lastCoeff() const
|
|
353
|
+
{
|
|
354
|
+
EIGEN_STATIC_ASSERT_VECTOR_ONLY(BlockImpl);
|
|
355
|
+
eigen_assert(nonZeros()>0);
|
|
356
|
+
if(m_matrix.isCompressed())
|
|
357
|
+
return m_matrix.valuePtr()[m_matrix.outerIndexPtr()[m_outerStart+1]-1];
|
|
358
|
+
else
|
|
359
|
+
return m_matrix.valuePtr()[m_matrix.outerIndexPtr()[m_outerStart]+m_matrix.innerNonZeroPtr()[m_outerStart]-1];
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
EIGEN_STRONG_INLINE Index rows() const { return IsRowMajor ? m_outerSize.value() : m_matrix.rows(); }
|
|
363
|
+
EIGEN_STRONG_INLINE Index cols() const { return IsRowMajor ? m_matrix.cols() : m_outerSize.value(); }
|
|
364
|
+
|
|
365
|
+
protected:
|
|
366
|
+
|
|
367
|
+
typename SparseMatrixType::Nested m_matrix;
|
|
368
|
+
Index m_outerStart;
|
|
369
|
+
const internal::variable_if_dynamic<Index, OuterSize> m_outerSize;
|
|
370
|
+
|
|
371
|
+
};
|
|
372
|
+
|
|
373
|
+
//----------
|
|
374
|
+
|
|
375
|
+
/** \returns the \a outer -th column (resp. row) of the matrix \c *this if \c *this
|
|
376
|
+
* is col-major (resp. row-major).
|
|
377
|
+
*/
|
|
378
|
+
template<typename Derived>
|
|
379
|
+
typename SparseMatrixBase<Derived>::InnerVectorReturnType SparseMatrixBase<Derived>::innerVector(Index outer)
|
|
380
|
+
{ return InnerVectorReturnType(derived(), outer); }
|
|
381
|
+
|
|
382
|
+
/** \returns the \a outer -th column (resp. row) of the matrix \c *this if \c *this
|
|
383
|
+
* is col-major (resp. row-major). Read-only.
|
|
384
|
+
*/
|
|
385
|
+
template<typename Derived>
|
|
386
|
+
const typename SparseMatrixBase<Derived>::ConstInnerVectorReturnType SparseMatrixBase<Derived>::innerVector(Index outer) const
|
|
387
|
+
{ return ConstInnerVectorReturnType(derived(), outer); }
|
|
388
|
+
|
|
389
|
+
/** \returns the \a outer -th column (resp. row) of the matrix \c *this if \c *this
|
|
390
|
+
* is col-major (resp. row-major).
|
|
391
|
+
*/
|
|
392
|
+
template<typename Derived>
|
|
393
|
+
typename SparseMatrixBase<Derived>::InnerVectorsReturnType
|
|
394
|
+
SparseMatrixBase<Derived>::innerVectors(Index outerStart, Index outerSize)
|
|
395
|
+
{
|
|
396
|
+
return Block<Derived,Dynamic,Dynamic,true>(derived(),
|
|
397
|
+
IsRowMajor ? outerStart : 0, IsRowMajor ? 0 : outerStart,
|
|
398
|
+
IsRowMajor ? outerSize : rows(), IsRowMajor ? cols() : outerSize);
|
|
399
|
+
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
/** \returns the \a outer -th column (resp. row) of the matrix \c *this if \c *this
|
|
403
|
+
* is col-major (resp. row-major). Read-only.
|
|
404
|
+
*/
|
|
405
|
+
template<typename Derived>
|
|
406
|
+
const typename SparseMatrixBase<Derived>::ConstInnerVectorsReturnType
|
|
407
|
+
SparseMatrixBase<Derived>::innerVectors(Index outerStart, Index outerSize) const
|
|
408
|
+
{
|
|
409
|
+
return Block<const Derived,Dynamic,Dynamic,true>(derived(),
|
|
410
|
+
IsRowMajor ? outerStart : 0, IsRowMajor ? 0 : outerStart,
|
|
411
|
+
IsRowMajor ? outerSize : rows(), IsRowMajor ? cols() : outerSize);
|
|
412
|
+
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
/** Generic implementation of sparse Block expression.
|
|
416
|
+
* Real-only.
|
|
417
|
+
*/
|
|
418
|
+
template<typename XprType, int BlockRows, int BlockCols, bool InnerPanel>
|
|
419
|
+
class BlockImpl<XprType,BlockRows,BlockCols,InnerPanel,Sparse>
|
|
420
|
+
: public SparseMatrixBase<Block<XprType,BlockRows,BlockCols,InnerPanel> >, internal::no_assignment_operator
|
|
421
|
+
{
|
|
422
|
+
typedef typename internal::remove_all<typename XprType::Nested>::type _MatrixTypeNested;
|
|
423
|
+
typedef Block<XprType, BlockRows, BlockCols, InnerPanel> BlockType;
|
|
424
|
+
public:
|
|
425
|
+
enum { IsRowMajor = internal::traits<BlockType>::IsRowMajor };
|
|
426
|
+
EIGEN_SPARSE_PUBLIC_INTERFACE(BlockType)
|
|
427
|
+
|
|
428
|
+
/** Column or Row constructor
|
|
429
|
+
*/
|
|
430
|
+
inline BlockImpl(const XprType& xpr, int i)
|
|
431
|
+
: m_matrix(xpr),
|
|
432
|
+
m_startRow( (BlockRows==1) && (BlockCols==XprType::ColsAtCompileTime) ? i : 0),
|
|
433
|
+
m_startCol( (BlockRows==XprType::RowsAtCompileTime) && (BlockCols==1) ? i : 0),
|
|
434
|
+
m_blockRows(BlockRows==1 ? 1 : xpr.rows()),
|
|
435
|
+
m_blockCols(BlockCols==1 ? 1 : xpr.cols())
|
|
436
|
+
{}
|
|
437
|
+
|
|
438
|
+
/** Dynamic-size constructor
|
|
439
|
+
*/
|
|
440
|
+
inline BlockImpl(const XprType& xpr, int startRow, int startCol, int blockRows, int blockCols)
|
|
441
|
+
: m_matrix(xpr), m_startRow(startRow), m_startCol(startCol), m_blockRows(blockRows), m_blockCols(blockCols)
|
|
442
|
+
{}
|
|
443
|
+
|
|
444
|
+
inline int rows() const { return m_blockRows.value(); }
|
|
445
|
+
inline int cols() const { return m_blockCols.value(); }
|
|
446
|
+
|
|
447
|
+
inline Scalar& coeffRef(int row, int col)
|
|
448
|
+
{
|
|
449
|
+
return m_matrix.const_cast_derived()
|
|
450
|
+
.coeffRef(row + m_startRow.value(), col + m_startCol.value());
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
inline const Scalar coeff(int row, int col) const
|
|
454
|
+
{
|
|
455
|
+
return m_matrix.coeff(row + m_startRow.value(), col + m_startCol.value());
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
inline Scalar& coeffRef(int index)
|
|
459
|
+
{
|
|
460
|
+
return m_matrix.const_cast_derived()
|
|
461
|
+
.coeffRef(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),
|
|
462
|
+
m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0));
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
inline const Scalar coeff(int index) const
|
|
466
|
+
{
|
|
467
|
+
return m_matrix
|
|
468
|
+
.coeff(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),
|
|
469
|
+
m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0));
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
inline const _MatrixTypeNested& nestedExpression() const { return m_matrix; }
|
|
473
|
+
|
|
474
|
+
class InnerIterator : public _MatrixTypeNested::InnerIterator
|
|
475
|
+
{
|
|
476
|
+
typedef typename _MatrixTypeNested::InnerIterator Base;
|
|
477
|
+
const BlockType& m_block;
|
|
478
|
+
Index m_end;
|
|
479
|
+
public:
|
|
480
|
+
|
|
481
|
+
EIGEN_STRONG_INLINE InnerIterator(const BlockType& block, Index outer)
|
|
482
|
+
: Base(block.derived().nestedExpression(), outer + (IsRowMajor ? block.m_startRow.value() : block.m_startCol.value())),
|
|
483
|
+
m_block(block),
|
|
484
|
+
m_end(IsRowMajor ? block.m_startCol.value()+block.m_blockCols.value() : block.m_startRow.value()+block.m_blockRows.value())
|
|
485
|
+
{
|
|
486
|
+
while( (Base::operator bool()) && (Base::index() < (IsRowMajor ? m_block.m_startCol.value() : m_block.m_startRow.value())) )
|
|
487
|
+
Base::operator++();
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
inline Index index() const { return Base::index() - (IsRowMajor ? m_block.m_startCol.value() : m_block.m_startRow.value()); }
|
|
491
|
+
inline Index outer() const { return Base::outer() - (IsRowMajor ? m_block.m_startRow.value() : m_block.m_startCol.value()); }
|
|
492
|
+
inline Index row() const { return Base::row() - m_block.m_startRow.value(); }
|
|
493
|
+
inline Index col() const { return Base::col() - m_block.m_startCol.value(); }
|
|
494
|
+
|
|
495
|
+
inline operator bool() const { return Base::operator bool() && Base::index() < m_end; }
|
|
496
|
+
};
|
|
497
|
+
class ReverseInnerIterator : public _MatrixTypeNested::ReverseInnerIterator
|
|
498
|
+
{
|
|
499
|
+
typedef typename _MatrixTypeNested::ReverseInnerIterator Base;
|
|
500
|
+
const BlockType& m_block;
|
|
501
|
+
Index m_begin;
|
|
502
|
+
public:
|
|
503
|
+
|
|
504
|
+
EIGEN_STRONG_INLINE ReverseInnerIterator(const BlockType& block, Index outer)
|
|
505
|
+
: Base(block.derived().nestedExpression(), outer + (IsRowMajor ? block.m_startRow.value() : block.m_startCol.value())),
|
|
506
|
+
m_block(block),
|
|
507
|
+
m_begin(IsRowMajor ? block.m_startCol.value() : block.m_startRow.value())
|
|
508
|
+
{
|
|
509
|
+
while( (Base::operator bool()) && (Base::index() >= (IsRowMajor ? m_block.m_startCol.value()+block.m_blockCols.value() : m_block.m_startRow.value()+block.m_blockRows.value())) )
|
|
510
|
+
Base::operator--();
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
inline Index index() const { return Base::index() - (IsRowMajor ? m_block.m_startCol.value() : m_block.m_startRow.value()); }
|
|
514
|
+
inline Index outer() const { return Base::outer() - (IsRowMajor ? m_block.m_startRow.value() : m_block.m_startCol.value()); }
|
|
515
|
+
inline Index row() const { return Base::row() - m_block.m_startRow.value(); }
|
|
516
|
+
inline Index col() const { return Base::col() - m_block.m_startCol.value(); }
|
|
517
|
+
|
|
518
|
+
inline operator bool() const { return Base::operator bool() && Base::index() >= m_begin; }
|
|
519
|
+
};
|
|
520
|
+
protected:
|
|
521
|
+
friend class InnerIterator;
|
|
522
|
+
friend class ReverseInnerIterator;
|
|
523
|
+
|
|
524
|
+
EIGEN_INHERIT_ASSIGNMENT_OPERATORS(BlockImpl)
|
|
525
|
+
|
|
526
|
+
typename XprType::Nested m_matrix;
|
|
527
|
+
const internal::variable_if_dynamic<Index, XprType::RowsAtCompileTime == 1 ? 0 : Dynamic> m_startRow;
|
|
528
|
+
const internal::variable_if_dynamic<Index, XprType::ColsAtCompileTime == 1 ? 0 : Dynamic> m_startCol;
|
|
529
|
+
const internal::variable_if_dynamic<Index, RowsAtCompileTime> m_blockRows;
|
|
530
|
+
const internal::variable_if_dynamic<Index, ColsAtCompileTime> m_blockCols;
|
|
531
|
+
|
|
532
|
+
};
|
|
533
|
+
|
|
534
|
+
} // end namespace Eigen
|
|
535
|
+
|
|
536
|
+
#endif // EIGEN_SPARSE_BLOCK_H
|
|
537
|
+
|