umappp 0.1.2
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 +7 -0
- data/LICENSE.txt +25 -0
- data/README.md +110 -0
- data/ext/umappp/extconf.rb +25 -0
- data/ext/umappp/numo.hpp +867 -0
- data/ext/umappp/umappp.cpp +225 -0
- data/lib/umappp/version.rb +5 -0
- data/lib/umappp.rb +41 -0
- data/vendor/Eigen/Cholesky +45 -0
- data/vendor/Eigen/CholmodSupport +48 -0
- data/vendor/Eigen/Core +384 -0
- data/vendor/Eigen/Dense +7 -0
- data/vendor/Eigen/Eigen +2 -0
- data/vendor/Eigen/Eigenvalues +60 -0
- data/vendor/Eigen/Geometry +59 -0
- data/vendor/Eigen/Householder +29 -0
- data/vendor/Eigen/IterativeLinearSolvers +48 -0
- data/vendor/Eigen/Jacobi +32 -0
- data/vendor/Eigen/KLUSupport +41 -0
- data/vendor/Eigen/LU +47 -0
- data/vendor/Eigen/MetisSupport +35 -0
- data/vendor/Eigen/OrderingMethods +70 -0
- data/vendor/Eigen/PaStiXSupport +49 -0
- data/vendor/Eigen/PardisoSupport +35 -0
- data/vendor/Eigen/QR +50 -0
- data/vendor/Eigen/QtAlignedMalloc +39 -0
- data/vendor/Eigen/SPQRSupport +34 -0
- data/vendor/Eigen/SVD +50 -0
- data/vendor/Eigen/Sparse +34 -0
- data/vendor/Eigen/SparseCholesky +37 -0
- data/vendor/Eigen/SparseCore +69 -0
- data/vendor/Eigen/SparseLU +50 -0
- data/vendor/Eigen/SparseQR +36 -0
- data/vendor/Eigen/StdDeque +27 -0
- data/vendor/Eigen/StdList +26 -0
- data/vendor/Eigen/StdVector +27 -0
- data/vendor/Eigen/SuperLUSupport +64 -0
- data/vendor/Eigen/UmfPackSupport +40 -0
- data/vendor/Eigen/src/Cholesky/LDLT.h +688 -0
- data/vendor/Eigen/src/Cholesky/LLT.h +558 -0
- data/vendor/Eigen/src/Cholesky/LLT_LAPACKE.h +99 -0
- data/vendor/Eigen/src/CholmodSupport/CholmodSupport.h +682 -0
- data/vendor/Eigen/src/Core/ArithmeticSequence.h +413 -0
- data/vendor/Eigen/src/Core/Array.h +417 -0
- data/vendor/Eigen/src/Core/ArrayBase.h +226 -0
- data/vendor/Eigen/src/Core/ArrayWrapper.h +209 -0
- data/vendor/Eigen/src/Core/Assign.h +90 -0
- data/vendor/Eigen/src/Core/AssignEvaluator.h +1010 -0
- data/vendor/Eigen/src/Core/Assign_MKL.h +178 -0
- data/vendor/Eigen/src/Core/BandMatrix.h +353 -0
- data/vendor/Eigen/src/Core/Block.h +448 -0
- data/vendor/Eigen/src/Core/BooleanRedux.h +162 -0
- data/vendor/Eigen/src/Core/CommaInitializer.h +164 -0
- data/vendor/Eigen/src/Core/ConditionEstimator.h +175 -0
- data/vendor/Eigen/src/Core/CoreEvaluators.h +1741 -0
- data/vendor/Eigen/src/Core/CoreIterators.h +132 -0
- data/vendor/Eigen/src/Core/CwiseBinaryOp.h +183 -0
- data/vendor/Eigen/src/Core/CwiseNullaryOp.h +1001 -0
- data/vendor/Eigen/src/Core/CwiseTernaryOp.h +197 -0
- data/vendor/Eigen/src/Core/CwiseUnaryOp.h +103 -0
- data/vendor/Eigen/src/Core/CwiseUnaryView.h +132 -0
- data/vendor/Eigen/src/Core/DenseBase.h +701 -0
- data/vendor/Eigen/src/Core/DenseCoeffsBase.h +685 -0
- data/vendor/Eigen/src/Core/DenseStorage.h +652 -0
- data/vendor/Eigen/src/Core/Diagonal.h +258 -0
- data/vendor/Eigen/src/Core/DiagonalMatrix.h +391 -0
- data/vendor/Eigen/src/Core/DiagonalProduct.h +28 -0
- data/vendor/Eigen/src/Core/Dot.h +318 -0
- data/vendor/Eigen/src/Core/EigenBase.h +160 -0
- data/vendor/Eigen/src/Core/ForceAlignedAccess.h +150 -0
- data/vendor/Eigen/src/Core/Fuzzy.h +155 -0
- data/vendor/Eigen/src/Core/GeneralProduct.h +465 -0
- data/vendor/Eigen/src/Core/GenericPacketMath.h +1040 -0
- data/vendor/Eigen/src/Core/GlobalFunctions.h +194 -0
- data/vendor/Eigen/src/Core/IO.h +258 -0
- data/vendor/Eigen/src/Core/IndexedView.h +237 -0
- data/vendor/Eigen/src/Core/Inverse.h +117 -0
- data/vendor/Eigen/src/Core/Map.h +171 -0
- data/vendor/Eigen/src/Core/MapBase.h +310 -0
- data/vendor/Eigen/src/Core/MathFunctions.h +2057 -0
- data/vendor/Eigen/src/Core/MathFunctionsImpl.h +200 -0
- data/vendor/Eigen/src/Core/Matrix.h +565 -0
- data/vendor/Eigen/src/Core/MatrixBase.h +547 -0
- data/vendor/Eigen/src/Core/NestByValue.h +85 -0
- data/vendor/Eigen/src/Core/NoAlias.h +109 -0
- data/vendor/Eigen/src/Core/NumTraits.h +335 -0
- data/vendor/Eigen/src/Core/PartialReduxEvaluator.h +232 -0
- data/vendor/Eigen/src/Core/PermutationMatrix.h +605 -0
- data/vendor/Eigen/src/Core/PlainObjectBase.h +1128 -0
- data/vendor/Eigen/src/Core/Product.h +191 -0
- data/vendor/Eigen/src/Core/ProductEvaluators.h +1179 -0
- data/vendor/Eigen/src/Core/Random.h +218 -0
- data/vendor/Eigen/src/Core/Redux.h +515 -0
- data/vendor/Eigen/src/Core/Ref.h +381 -0
- data/vendor/Eigen/src/Core/Replicate.h +142 -0
- data/vendor/Eigen/src/Core/Reshaped.h +454 -0
- data/vendor/Eigen/src/Core/ReturnByValue.h +119 -0
- data/vendor/Eigen/src/Core/Reverse.h +217 -0
- data/vendor/Eigen/src/Core/Select.h +164 -0
- data/vendor/Eigen/src/Core/SelfAdjointView.h +365 -0
- data/vendor/Eigen/src/Core/SelfCwiseBinaryOp.h +47 -0
- data/vendor/Eigen/src/Core/Solve.h +188 -0
- data/vendor/Eigen/src/Core/SolveTriangular.h +235 -0
- data/vendor/Eigen/src/Core/SolverBase.h +168 -0
- data/vendor/Eigen/src/Core/StableNorm.h +251 -0
- data/vendor/Eigen/src/Core/StlIterators.h +463 -0
- data/vendor/Eigen/src/Core/Stride.h +116 -0
- data/vendor/Eigen/src/Core/Swap.h +68 -0
- data/vendor/Eigen/src/Core/Transpose.h +464 -0
- data/vendor/Eigen/src/Core/Transpositions.h +386 -0
- data/vendor/Eigen/src/Core/TriangularMatrix.h +1001 -0
- data/vendor/Eigen/src/Core/VectorBlock.h +96 -0
- data/vendor/Eigen/src/Core/VectorwiseOp.h +784 -0
- data/vendor/Eigen/src/Core/Visitor.h +381 -0
- data/vendor/Eigen/src/Core/arch/AVX/Complex.h +372 -0
- data/vendor/Eigen/src/Core/arch/AVX/MathFunctions.h +228 -0
- data/vendor/Eigen/src/Core/arch/AVX/PacketMath.h +1574 -0
- data/vendor/Eigen/src/Core/arch/AVX/TypeCasting.h +115 -0
- data/vendor/Eigen/src/Core/arch/AVX512/Complex.h +422 -0
- data/vendor/Eigen/src/Core/arch/AVX512/MathFunctions.h +362 -0
- data/vendor/Eigen/src/Core/arch/AVX512/PacketMath.h +2303 -0
- data/vendor/Eigen/src/Core/arch/AVX512/TypeCasting.h +89 -0
- data/vendor/Eigen/src/Core/arch/AltiVec/Complex.h +417 -0
- data/vendor/Eigen/src/Core/arch/AltiVec/MathFunctions.h +90 -0
- data/vendor/Eigen/src/Core/arch/AltiVec/MatrixProduct.h +2937 -0
- data/vendor/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h +221 -0
- data/vendor/Eigen/src/Core/arch/AltiVec/MatrixProductMMA.h +629 -0
- data/vendor/Eigen/src/Core/arch/AltiVec/PacketMath.h +2711 -0
- data/vendor/Eigen/src/Core/arch/CUDA/Complex.h +258 -0
- data/vendor/Eigen/src/Core/arch/Default/BFloat16.h +700 -0
- data/vendor/Eigen/src/Core/arch/Default/ConjHelper.h +117 -0
- data/vendor/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h +1649 -0
- data/vendor/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h +110 -0
- data/vendor/Eigen/src/Core/arch/Default/Half.h +942 -0
- data/vendor/Eigen/src/Core/arch/Default/Settings.h +49 -0
- data/vendor/Eigen/src/Core/arch/Default/TypeCasting.h +120 -0
- data/vendor/Eigen/src/Core/arch/GPU/MathFunctions.h +103 -0
- data/vendor/Eigen/src/Core/arch/GPU/PacketMath.h +1685 -0
- data/vendor/Eigen/src/Core/arch/GPU/TypeCasting.h +80 -0
- data/vendor/Eigen/src/Core/arch/HIP/hcc/math_constants.h +23 -0
- data/vendor/Eigen/src/Core/arch/MSA/Complex.h +648 -0
- data/vendor/Eigen/src/Core/arch/MSA/MathFunctions.h +387 -0
- data/vendor/Eigen/src/Core/arch/MSA/PacketMath.h +1233 -0
- data/vendor/Eigen/src/Core/arch/NEON/Complex.h +584 -0
- data/vendor/Eigen/src/Core/arch/NEON/GeneralBlockPanelKernel.h +183 -0
- data/vendor/Eigen/src/Core/arch/NEON/MathFunctions.h +75 -0
- data/vendor/Eigen/src/Core/arch/NEON/PacketMath.h +4587 -0
- data/vendor/Eigen/src/Core/arch/NEON/TypeCasting.h +1419 -0
- data/vendor/Eigen/src/Core/arch/SSE/Complex.h +351 -0
- data/vendor/Eigen/src/Core/arch/SSE/MathFunctions.h +199 -0
- data/vendor/Eigen/src/Core/arch/SSE/PacketMath.h +1505 -0
- data/vendor/Eigen/src/Core/arch/SSE/TypeCasting.h +142 -0
- data/vendor/Eigen/src/Core/arch/SVE/MathFunctions.h +44 -0
- data/vendor/Eigen/src/Core/arch/SVE/PacketMath.h +752 -0
- data/vendor/Eigen/src/Core/arch/SVE/TypeCasting.h +49 -0
- data/vendor/Eigen/src/Core/arch/SYCL/InteropHeaders.h +232 -0
- data/vendor/Eigen/src/Core/arch/SYCL/MathFunctions.h +301 -0
- data/vendor/Eigen/src/Core/arch/SYCL/PacketMath.h +670 -0
- data/vendor/Eigen/src/Core/arch/SYCL/SyclMemoryModel.h +694 -0
- data/vendor/Eigen/src/Core/arch/SYCL/TypeCasting.h +85 -0
- data/vendor/Eigen/src/Core/arch/ZVector/Complex.h +426 -0
- data/vendor/Eigen/src/Core/arch/ZVector/MathFunctions.h +233 -0
- data/vendor/Eigen/src/Core/arch/ZVector/PacketMath.h +1060 -0
- data/vendor/Eigen/src/Core/functors/AssignmentFunctors.h +177 -0
- data/vendor/Eigen/src/Core/functors/BinaryFunctors.h +541 -0
- data/vendor/Eigen/src/Core/functors/NullaryFunctors.h +189 -0
- data/vendor/Eigen/src/Core/functors/StlFunctors.h +166 -0
- data/vendor/Eigen/src/Core/functors/TernaryFunctors.h +25 -0
- data/vendor/Eigen/src/Core/functors/UnaryFunctors.h +1131 -0
- data/vendor/Eigen/src/Core/products/GeneralBlockPanelKernel.h +2645 -0
- data/vendor/Eigen/src/Core/products/GeneralMatrixMatrix.h +517 -0
- data/vendor/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +317 -0
- data/vendor/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h +145 -0
- data/vendor/Eigen/src/Core/products/GeneralMatrixMatrix_BLAS.h +124 -0
- data/vendor/Eigen/src/Core/products/GeneralMatrixVector.h +518 -0
- data/vendor/Eigen/src/Core/products/GeneralMatrixVector_BLAS.h +136 -0
- data/vendor/Eigen/src/Core/products/Parallelizer.h +180 -0
- data/vendor/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +544 -0
- data/vendor/Eigen/src/Core/products/SelfadjointMatrixMatrix_BLAS.h +295 -0
- data/vendor/Eigen/src/Core/products/SelfadjointMatrixVector.h +262 -0
- data/vendor/Eigen/src/Core/products/SelfadjointMatrixVector_BLAS.h +118 -0
- data/vendor/Eigen/src/Core/products/SelfadjointProduct.h +133 -0
- data/vendor/Eigen/src/Core/products/SelfadjointRank2Update.h +94 -0
- data/vendor/Eigen/src/Core/products/TriangularMatrixMatrix.h +472 -0
- data/vendor/Eigen/src/Core/products/TriangularMatrixMatrix_BLAS.h +317 -0
- data/vendor/Eigen/src/Core/products/TriangularMatrixVector.h +350 -0
- data/vendor/Eigen/src/Core/products/TriangularMatrixVector_BLAS.h +255 -0
- data/vendor/Eigen/src/Core/products/TriangularSolverMatrix.h +337 -0
- data/vendor/Eigen/src/Core/products/TriangularSolverMatrix_BLAS.h +167 -0
- data/vendor/Eigen/src/Core/products/TriangularSolverVector.h +148 -0
- data/vendor/Eigen/src/Core/util/BlasUtil.h +583 -0
- data/vendor/Eigen/src/Core/util/ConfigureVectorization.h +512 -0
- data/vendor/Eigen/src/Core/util/Constants.h +563 -0
- data/vendor/Eigen/src/Core/util/DisableStupidWarnings.h +106 -0
- data/vendor/Eigen/src/Core/util/ForwardDeclarations.h +322 -0
- data/vendor/Eigen/src/Core/util/IndexedViewHelper.h +186 -0
- data/vendor/Eigen/src/Core/util/IntegralConstant.h +272 -0
- data/vendor/Eigen/src/Core/util/MKL_support.h +137 -0
- data/vendor/Eigen/src/Core/util/Macros.h +1464 -0
- data/vendor/Eigen/src/Core/util/Memory.h +1163 -0
- data/vendor/Eigen/src/Core/util/Meta.h +812 -0
- data/vendor/Eigen/src/Core/util/NonMPL2.h +3 -0
- data/vendor/Eigen/src/Core/util/ReenableStupidWarnings.h +31 -0
- data/vendor/Eigen/src/Core/util/ReshapedHelper.h +51 -0
- data/vendor/Eigen/src/Core/util/StaticAssert.h +221 -0
- data/vendor/Eigen/src/Core/util/SymbolicIndex.h +293 -0
- data/vendor/Eigen/src/Core/util/XprHelper.h +856 -0
- data/vendor/Eigen/src/Eigenvalues/ComplexEigenSolver.h +346 -0
- data/vendor/Eigen/src/Eigenvalues/ComplexSchur.h +462 -0
- data/vendor/Eigen/src/Eigenvalues/ComplexSchur_LAPACKE.h +91 -0
- data/vendor/Eigen/src/Eigenvalues/EigenSolver.h +622 -0
- data/vendor/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h +418 -0
- data/vendor/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h +226 -0
- data/vendor/Eigen/src/Eigenvalues/HessenbergDecomposition.h +374 -0
- data/vendor/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h +158 -0
- data/vendor/Eigen/src/Eigenvalues/RealQZ.h +657 -0
- data/vendor/Eigen/src/Eigenvalues/RealSchur.h +558 -0
- data/vendor/Eigen/src/Eigenvalues/RealSchur_LAPACKE.h +77 -0
- data/vendor/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +904 -0
- data/vendor/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_LAPACKE.h +87 -0
- data/vendor/Eigen/src/Eigenvalues/Tridiagonalization.h +561 -0
- data/vendor/Eigen/src/Geometry/AlignedBox.h +486 -0
- data/vendor/Eigen/src/Geometry/AngleAxis.h +247 -0
- data/vendor/Eigen/src/Geometry/EulerAngles.h +114 -0
- data/vendor/Eigen/src/Geometry/Homogeneous.h +501 -0
- data/vendor/Eigen/src/Geometry/Hyperplane.h +282 -0
- data/vendor/Eigen/src/Geometry/OrthoMethods.h +235 -0
- data/vendor/Eigen/src/Geometry/ParametrizedLine.h +232 -0
- data/vendor/Eigen/src/Geometry/Quaternion.h +870 -0
- data/vendor/Eigen/src/Geometry/Rotation2D.h +199 -0
- data/vendor/Eigen/src/Geometry/RotationBase.h +206 -0
- data/vendor/Eigen/src/Geometry/Scaling.h +188 -0
- data/vendor/Eigen/src/Geometry/Transform.h +1563 -0
- data/vendor/Eigen/src/Geometry/Translation.h +202 -0
- data/vendor/Eigen/src/Geometry/Umeyama.h +166 -0
- data/vendor/Eigen/src/Geometry/arch/Geometry_SIMD.h +168 -0
- data/vendor/Eigen/src/Householder/BlockHouseholder.h +110 -0
- data/vendor/Eigen/src/Householder/Householder.h +176 -0
- data/vendor/Eigen/src/Householder/HouseholderSequence.h +545 -0
- data/vendor/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +226 -0
- data/vendor/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +212 -0
- data/vendor/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +229 -0
- data/vendor/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h +394 -0
- data/vendor/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h +453 -0
- data/vendor/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +444 -0
- data/vendor/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h +198 -0
- data/vendor/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h +117 -0
- data/vendor/Eigen/src/Jacobi/Jacobi.h +483 -0
- data/vendor/Eigen/src/KLUSupport/KLUSupport.h +358 -0
- data/vendor/Eigen/src/LU/Determinant.h +117 -0
- data/vendor/Eigen/src/LU/FullPivLU.h +877 -0
- data/vendor/Eigen/src/LU/InverseImpl.h +432 -0
- data/vendor/Eigen/src/LU/PartialPivLU.h +624 -0
- data/vendor/Eigen/src/LU/PartialPivLU_LAPACKE.h +83 -0
- data/vendor/Eigen/src/LU/arch/InverseSize4.h +351 -0
- data/vendor/Eigen/src/MetisSupport/MetisSupport.h +137 -0
- data/vendor/Eigen/src/OrderingMethods/Amd.h +435 -0
- data/vendor/Eigen/src/OrderingMethods/Eigen_Colamd.h +1863 -0
- data/vendor/Eigen/src/OrderingMethods/Ordering.h +153 -0
- data/vendor/Eigen/src/PaStiXSupport/PaStiXSupport.h +678 -0
- data/vendor/Eigen/src/PardisoSupport/PardisoSupport.h +545 -0
- data/vendor/Eigen/src/QR/ColPivHouseholderQR.h +674 -0
- data/vendor/Eigen/src/QR/ColPivHouseholderQR_LAPACKE.h +97 -0
- data/vendor/Eigen/src/QR/CompleteOrthogonalDecomposition.h +635 -0
- data/vendor/Eigen/src/QR/FullPivHouseholderQR.h +713 -0
- data/vendor/Eigen/src/QR/HouseholderQR.h +434 -0
- data/vendor/Eigen/src/QR/HouseholderQR_LAPACKE.h +68 -0
- data/vendor/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h +335 -0
- data/vendor/Eigen/src/SVD/BDCSVD.h +1366 -0
- data/vendor/Eigen/src/SVD/JacobiSVD.h +812 -0
- data/vendor/Eigen/src/SVD/JacobiSVD_LAPACKE.h +91 -0
- data/vendor/Eigen/src/SVD/SVDBase.h +376 -0
- data/vendor/Eigen/src/SVD/UpperBidiagonalization.h +414 -0
- data/vendor/Eigen/src/SparseCholesky/SimplicialCholesky.h +697 -0
- data/vendor/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h +174 -0
- data/vendor/Eigen/src/SparseCore/AmbiVector.h +378 -0
- data/vendor/Eigen/src/SparseCore/CompressedStorage.h +274 -0
- data/vendor/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h +352 -0
- data/vendor/Eigen/src/SparseCore/MappedSparseMatrix.h +67 -0
- data/vendor/Eigen/src/SparseCore/SparseAssign.h +270 -0
- data/vendor/Eigen/src/SparseCore/SparseBlock.h +571 -0
- data/vendor/Eigen/src/SparseCore/SparseColEtree.h +206 -0
- data/vendor/Eigen/src/SparseCore/SparseCompressedBase.h +370 -0
- data/vendor/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +722 -0
- data/vendor/Eigen/src/SparseCore/SparseCwiseUnaryOp.h +150 -0
- data/vendor/Eigen/src/SparseCore/SparseDenseProduct.h +342 -0
- data/vendor/Eigen/src/SparseCore/SparseDiagonalProduct.h +138 -0
- data/vendor/Eigen/src/SparseCore/SparseDot.h +98 -0
- data/vendor/Eigen/src/SparseCore/SparseFuzzy.h +29 -0
- data/vendor/Eigen/src/SparseCore/SparseMap.h +305 -0
- data/vendor/Eigen/src/SparseCore/SparseMatrix.h +1518 -0
- data/vendor/Eigen/src/SparseCore/SparseMatrixBase.h +398 -0
- data/vendor/Eigen/src/SparseCore/SparsePermutation.h +178 -0
- data/vendor/Eigen/src/SparseCore/SparseProduct.h +181 -0
- data/vendor/Eigen/src/SparseCore/SparseRedux.h +49 -0
- data/vendor/Eigen/src/SparseCore/SparseRef.h +397 -0
- data/vendor/Eigen/src/SparseCore/SparseSelfAdjointView.h +659 -0
- data/vendor/Eigen/src/SparseCore/SparseSolverBase.h +124 -0
- data/vendor/Eigen/src/SparseCore/SparseSparseProductWithPruning.h +198 -0
- data/vendor/Eigen/src/SparseCore/SparseTranspose.h +92 -0
- data/vendor/Eigen/src/SparseCore/SparseTriangularView.h +189 -0
- data/vendor/Eigen/src/SparseCore/SparseUtil.h +186 -0
- data/vendor/Eigen/src/SparseCore/SparseVector.h +478 -0
- data/vendor/Eigen/src/SparseCore/SparseView.h +254 -0
- data/vendor/Eigen/src/SparseCore/TriangularSolver.h +315 -0
- data/vendor/Eigen/src/SparseLU/SparseLU.h +923 -0
- data/vendor/Eigen/src/SparseLU/SparseLUImpl.h +66 -0
- data/vendor/Eigen/src/SparseLU/SparseLU_Memory.h +226 -0
- data/vendor/Eigen/src/SparseLU/SparseLU_Structs.h +110 -0
- data/vendor/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h +375 -0
- data/vendor/Eigen/src/SparseLU/SparseLU_Utils.h +80 -0
- data/vendor/Eigen/src/SparseLU/SparseLU_column_bmod.h +181 -0
- data/vendor/Eigen/src/SparseLU/SparseLU_column_dfs.h +179 -0
- data/vendor/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h +107 -0
- data/vendor/Eigen/src/SparseLU/SparseLU_gemm_kernel.h +280 -0
- data/vendor/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h +126 -0
- data/vendor/Eigen/src/SparseLU/SparseLU_kernel_bmod.h +130 -0
- data/vendor/Eigen/src/SparseLU/SparseLU_panel_bmod.h +223 -0
- data/vendor/Eigen/src/SparseLU/SparseLU_panel_dfs.h +258 -0
- data/vendor/Eigen/src/SparseLU/SparseLU_pivotL.h +137 -0
- data/vendor/Eigen/src/SparseLU/SparseLU_pruneL.h +136 -0
- data/vendor/Eigen/src/SparseLU/SparseLU_relax_snode.h +83 -0
- data/vendor/Eigen/src/SparseQR/SparseQR.h +758 -0
- data/vendor/Eigen/src/StlSupport/StdDeque.h +116 -0
- data/vendor/Eigen/src/StlSupport/StdList.h +106 -0
- data/vendor/Eigen/src/StlSupport/StdVector.h +131 -0
- data/vendor/Eigen/src/StlSupport/details.h +84 -0
- data/vendor/Eigen/src/SuperLUSupport/SuperLUSupport.h +1025 -0
- data/vendor/Eigen/src/UmfPackSupport/UmfPackSupport.h +642 -0
- data/vendor/Eigen/src/misc/Image.h +82 -0
- data/vendor/Eigen/src/misc/Kernel.h +79 -0
- data/vendor/Eigen/src/misc/RealSvd2x2.h +55 -0
- data/vendor/Eigen/src/misc/blas.h +440 -0
- data/vendor/Eigen/src/misc/lapack.h +152 -0
- data/vendor/Eigen/src/misc/lapacke.h +16292 -0
- data/vendor/Eigen/src/misc/lapacke_mangling.h +17 -0
- data/vendor/Eigen/src/plugins/ArrayCwiseBinaryOps.h +358 -0
- data/vendor/Eigen/src/plugins/ArrayCwiseUnaryOps.h +696 -0
- data/vendor/Eigen/src/plugins/BlockMethods.h +1442 -0
- data/vendor/Eigen/src/plugins/CommonCwiseBinaryOps.h +115 -0
- data/vendor/Eigen/src/plugins/CommonCwiseUnaryOps.h +177 -0
- data/vendor/Eigen/src/plugins/IndexedViewMethods.h +262 -0
- data/vendor/Eigen/src/plugins/MatrixCwiseBinaryOps.h +152 -0
- data/vendor/Eigen/src/plugins/MatrixCwiseUnaryOps.h +95 -0
- data/vendor/Eigen/src/plugins/ReshapedMethods.h +149 -0
- data/vendor/aarand/aarand.hpp +114 -0
- data/vendor/annoy/annoylib.h +1495 -0
- data/vendor/annoy/kissrandom.h +120 -0
- data/vendor/annoy/mman.h +242 -0
- data/vendor/hnswlib/bruteforce.h +152 -0
- data/vendor/hnswlib/hnswalg.h +1192 -0
- data/vendor/hnswlib/hnswlib.h +108 -0
- data/vendor/hnswlib/space_ip.h +282 -0
- data/vendor/hnswlib/space_l2.h +281 -0
- data/vendor/hnswlib/visited_list_pool.h +79 -0
- data/vendor/irlba/irlba.hpp +575 -0
- data/vendor/irlba/lanczos.hpp +212 -0
- data/vendor/irlba/parallel.hpp +474 -0
- data/vendor/irlba/utils.hpp +224 -0
- data/vendor/irlba/wrappers.hpp +228 -0
- data/vendor/kmeans/Base.hpp +75 -0
- data/vendor/kmeans/Details.hpp +79 -0
- data/vendor/kmeans/HartiganWong.hpp +492 -0
- data/vendor/kmeans/InitializeKmeansPP.hpp +144 -0
- data/vendor/kmeans/InitializeNone.hpp +44 -0
- data/vendor/kmeans/InitializePCAPartition.hpp +309 -0
- data/vendor/kmeans/InitializeRandom.hpp +91 -0
- data/vendor/kmeans/Kmeans.hpp +161 -0
- data/vendor/kmeans/Lloyd.hpp +134 -0
- data/vendor/kmeans/MiniBatch.hpp +269 -0
- data/vendor/kmeans/QuickSearch.hpp +179 -0
- data/vendor/kmeans/compute_centroids.hpp +32 -0
- data/vendor/kmeans/compute_wcss.hpp +27 -0
- data/vendor/kmeans/is_edge_case.hpp +42 -0
- data/vendor/kmeans/random.hpp +55 -0
- data/vendor/knncolle/Annoy/Annoy.hpp +193 -0
- data/vendor/knncolle/BruteForce/BruteForce.hpp +120 -0
- data/vendor/knncolle/Hnsw/Hnsw.hpp +225 -0
- data/vendor/knncolle/Kmknn/Kmknn.hpp +286 -0
- data/vendor/knncolle/VpTree/VpTree.hpp +256 -0
- data/vendor/knncolle/knncolle.hpp +34 -0
- data/vendor/knncolle/utils/Base.hpp +100 -0
- data/vendor/knncolle/utils/NeighborQueue.hpp +94 -0
- data/vendor/knncolle/utils/distances.hpp +98 -0
- data/vendor/knncolle/utils/find_nearest_neighbors.hpp +112 -0
- data/vendor/powerit/PowerIterations.hpp +157 -0
- data/vendor/umappp/NeighborList.hpp +37 -0
- data/vendor/umappp/Umap.hpp +662 -0
- data/vendor/umappp/combine_neighbor_sets.hpp +95 -0
- data/vendor/umappp/find_ab.hpp +157 -0
- data/vendor/umappp/neighbor_similarities.hpp +136 -0
- data/vendor/umappp/optimize_layout.hpp +285 -0
- data/vendor/umappp/spectral_init.hpp +181 -0
- data/vendor/umappp/umappp.hpp +13 -0
- metadata +465 -0
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
// This file is part of Eigen, a lightweight C++ template library
|
|
2
|
+
// for linear algebra.
|
|
3
|
+
//
|
|
4
|
+
// Copyright (C) 2001 Intel Corporation
|
|
5
|
+
// Copyright (C) 2010 Gael Guennebaud <gael.guennebaud@inria.fr>
|
|
6
|
+
// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>
|
|
7
|
+
//
|
|
8
|
+
// This Source Code Form is subject to the terms of the Mozilla
|
|
9
|
+
// Public License v. 2.0. If a copy of the MPL was not distributed
|
|
10
|
+
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
11
|
+
//
|
|
12
|
+
// The algorithm below is a reimplementation of former \src\LU\Inverse_SSE.h using PacketMath.
|
|
13
|
+
// inv(M) = M#/|M|, where inv(M), M# and |M| denote the inverse of M,
|
|
14
|
+
// adjugate of M and determinant of M respectively. M# is computed block-wise
|
|
15
|
+
// using specific formulae. For proof, see:
|
|
16
|
+
// https://lxjk.github.io/2017/09/03/Fast-4x4-Matrix-Inverse-with-SSE-SIMD-Explained.html
|
|
17
|
+
// Variable names are adopted from \src\LU\Inverse_SSE.h.
|
|
18
|
+
//
|
|
19
|
+
// The SSE code for the 4x4 float and double matrix inverse in former (deprecated) \src\LU\Inverse_SSE.h
|
|
20
|
+
// comes from the following Intel's library:
|
|
21
|
+
// http://software.intel.com/en-us/articles/optimized-matrix-library-for-use-with-the-intel-pentiumr-4-processors-sse2-instructions/
|
|
22
|
+
//
|
|
23
|
+
// Here is the respective copyright and license statement:
|
|
24
|
+
//
|
|
25
|
+
// Copyright (c) 2001 Intel Corporation.
|
|
26
|
+
//
|
|
27
|
+
// Permition is granted to use, copy, distribute and prepare derivative works
|
|
28
|
+
// of this library for any purpose and without fee, provided, that the above
|
|
29
|
+
// copyright notice and this statement appear in all copies.
|
|
30
|
+
// Intel makes no representations about the suitability of this software for
|
|
31
|
+
// any purpose, and specifically disclaims all warranties.
|
|
32
|
+
// See LEGAL.TXT for all the legal information.
|
|
33
|
+
//
|
|
34
|
+
// TODO: Unify implementations of different data types (i.e. float and double).
|
|
35
|
+
#ifndef EIGEN_INVERSE_SIZE_4_H
|
|
36
|
+
#define EIGEN_INVERSE_SIZE_4_H
|
|
37
|
+
|
|
38
|
+
namespace Eigen
|
|
39
|
+
{
|
|
40
|
+
namespace internal
|
|
41
|
+
{
|
|
42
|
+
template <typename MatrixType, typename ResultType>
|
|
43
|
+
struct compute_inverse_size4<Architecture::Target, float, MatrixType, ResultType>
|
|
44
|
+
{
|
|
45
|
+
enum
|
|
46
|
+
{
|
|
47
|
+
MatrixAlignment = traits<MatrixType>::Alignment,
|
|
48
|
+
ResultAlignment = traits<ResultType>::Alignment,
|
|
49
|
+
StorageOrdersMatch = (MatrixType::Flags & RowMajorBit) == (ResultType::Flags & RowMajorBit)
|
|
50
|
+
};
|
|
51
|
+
typedef typename conditional<(MatrixType::Flags & LinearAccessBit), MatrixType const &, typename MatrixType::PlainObject>::type ActualMatrixType;
|
|
52
|
+
|
|
53
|
+
static void run(const MatrixType &mat, ResultType &result)
|
|
54
|
+
{
|
|
55
|
+
ActualMatrixType matrix(mat);
|
|
56
|
+
|
|
57
|
+
const float* data = matrix.data();
|
|
58
|
+
const Index stride = matrix.innerStride();
|
|
59
|
+
Packet4f _L1 = ploadt<Packet4f,MatrixAlignment>(data);
|
|
60
|
+
Packet4f _L2 = ploadt<Packet4f,MatrixAlignment>(data + stride*4);
|
|
61
|
+
Packet4f _L3 = ploadt<Packet4f,MatrixAlignment>(data + stride*8);
|
|
62
|
+
Packet4f _L4 = ploadt<Packet4f,MatrixAlignment>(data + stride*12);
|
|
63
|
+
|
|
64
|
+
// Four 2x2 sub-matrices of the input matrix
|
|
65
|
+
// input = [[A, B],
|
|
66
|
+
// [C, D]]
|
|
67
|
+
Packet4f A, B, C, D;
|
|
68
|
+
|
|
69
|
+
if (!StorageOrdersMatch)
|
|
70
|
+
{
|
|
71
|
+
A = vec4f_unpacklo(_L1, _L2);
|
|
72
|
+
B = vec4f_unpacklo(_L3, _L4);
|
|
73
|
+
C = vec4f_unpackhi(_L1, _L2);
|
|
74
|
+
D = vec4f_unpackhi(_L3, _L4);
|
|
75
|
+
}
|
|
76
|
+
else
|
|
77
|
+
{
|
|
78
|
+
A = vec4f_movelh(_L1, _L2);
|
|
79
|
+
B = vec4f_movehl(_L2, _L1);
|
|
80
|
+
C = vec4f_movelh(_L3, _L4);
|
|
81
|
+
D = vec4f_movehl(_L4, _L3);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
Packet4f AB, DC;
|
|
85
|
+
|
|
86
|
+
// AB = A# * B, where A# denotes the adjugate of A, and * denotes matrix product.
|
|
87
|
+
AB = pmul(vec4f_swizzle2(A, A, 3, 3, 0, 0), B);
|
|
88
|
+
AB = psub(AB, pmul(vec4f_swizzle2(A, A, 1, 1, 2, 2), vec4f_swizzle2(B, B, 2, 3, 0, 1)));
|
|
89
|
+
|
|
90
|
+
// DC = D#*C
|
|
91
|
+
DC = pmul(vec4f_swizzle2(D, D, 3, 3, 0, 0), C);
|
|
92
|
+
DC = psub(DC, pmul(vec4f_swizzle2(D, D, 1, 1, 2, 2), vec4f_swizzle2(C, C, 2, 3, 0, 1)));
|
|
93
|
+
|
|
94
|
+
// determinants of the sub-matrices
|
|
95
|
+
Packet4f dA, dB, dC, dD;
|
|
96
|
+
|
|
97
|
+
dA = pmul(vec4f_swizzle2(A, A, 3, 3, 1, 1), A);
|
|
98
|
+
dA = psub(dA, vec4f_movehl(dA, dA));
|
|
99
|
+
|
|
100
|
+
dB = pmul(vec4f_swizzle2(B, B, 3, 3, 1, 1), B);
|
|
101
|
+
dB = psub(dB, vec4f_movehl(dB, dB));
|
|
102
|
+
|
|
103
|
+
dC = pmul(vec4f_swizzle2(C, C, 3, 3, 1, 1), C);
|
|
104
|
+
dC = psub(dC, vec4f_movehl(dC, dC));
|
|
105
|
+
|
|
106
|
+
dD = pmul(vec4f_swizzle2(D, D, 3, 3, 1, 1), D);
|
|
107
|
+
dD = psub(dD, vec4f_movehl(dD, dD));
|
|
108
|
+
|
|
109
|
+
Packet4f d, d1, d2;
|
|
110
|
+
|
|
111
|
+
d = pmul(vec4f_swizzle2(DC, DC, 0, 2, 1, 3), AB);
|
|
112
|
+
d = padd(d, vec4f_movehl(d, d));
|
|
113
|
+
d = padd(d, vec4f_swizzle2(d, d, 1, 0, 0, 0));
|
|
114
|
+
d1 = pmul(dA, dD);
|
|
115
|
+
d2 = pmul(dB, dC);
|
|
116
|
+
|
|
117
|
+
// determinant of the input matrix, det = |A||D| + |B||C| - trace(A#*B*D#*C)
|
|
118
|
+
Packet4f det = vec4f_duplane(psub(padd(d1, d2), d), 0);
|
|
119
|
+
|
|
120
|
+
// reciprocal of the determinant of the input matrix, rd = 1/det
|
|
121
|
+
Packet4f rd = pdiv(pset1<Packet4f>(1.0f), det);
|
|
122
|
+
|
|
123
|
+
// Four sub-matrices of the inverse
|
|
124
|
+
Packet4f iA, iB, iC, iD;
|
|
125
|
+
|
|
126
|
+
// iD = D*|A| - C*A#*B
|
|
127
|
+
iD = pmul(vec4f_swizzle2(C, C, 0, 0, 2, 2), vec4f_movelh(AB, AB));
|
|
128
|
+
iD = padd(iD, pmul(vec4f_swizzle2(C, C, 1, 1, 3, 3), vec4f_movehl(AB, AB)));
|
|
129
|
+
iD = psub(pmul(D, vec4f_duplane(dA, 0)), iD);
|
|
130
|
+
|
|
131
|
+
// iA = A*|D| - B*D#*C
|
|
132
|
+
iA = pmul(vec4f_swizzle2(B, B, 0, 0, 2, 2), vec4f_movelh(DC, DC));
|
|
133
|
+
iA = padd(iA, pmul(vec4f_swizzle2(B, B, 1, 1, 3, 3), vec4f_movehl(DC, DC)));
|
|
134
|
+
iA = psub(pmul(A, vec4f_duplane(dD, 0)), iA);
|
|
135
|
+
|
|
136
|
+
// iB = C*|B| - D * (A#B)# = C*|B| - D*B#*A
|
|
137
|
+
iB = pmul(D, vec4f_swizzle2(AB, AB, 3, 0, 3, 0));
|
|
138
|
+
iB = psub(iB, pmul(vec4f_swizzle2(D, D, 1, 0, 3, 2), vec4f_swizzle2(AB, AB, 2, 1, 2, 1)));
|
|
139
|
+
iB = psub(pmul(C, vec4f_duplane(dB, 0)), iB);
|
|
140
|
+
|
|
141
|
+
// iC = B*|C| - A * (D#C)# = B*|C| - A*C#*D
|
|
142
|
+
iC = pmul(A, vec4f_swizzle2(DC, DC, 3, 0, 3, 0));
|
|
143
|
+
iC = psub(iC, pmul(vec4f_swizzle2(A, A, 1, 0, 3, 2), vec4f_swizzle2(DC, DC, 2, 1, 2, 1)));
|
|
144
|
+
iC = psub(pmul(B, vec4f_duplane(dC, 0)), iC);
|
|
145
|
+
|
|
146
|
+
const float sign_mask[4] = {0.0f, numext::bit_cast<float>(0x80000000u), numext::bit_cast<float>(0x80000000u), 0.0f};
|
|
147
|
+
const Packet4f p4f_sign_PNNP = ploadu<Packet4f>(sign_mask);
|
|
148
|
+
rd = pxor(rd, p4f_sign_PNNP);
|
|
149
|
+
iA = pmul(iA, rd);
|
|
150
|
+
iB = pmul(iB, rd);
|
|
151
|
+
iC = pmul(iC, rd);
|
|
152
|
+
iD = pmul(iD, rd);
|
|
153
|
+
|
|
154
|
+
Index res_stride = result.outerStride();
|
|
155
|
+
float *res = result.data();
|
|
156
|
+
|
|
157
|
+
pstoret<float, Packet4f, ResultAlignment>(res + 0, vec4f_swizzle2(iA, iB, 3, 1, 3, 1));
|
|
158
|
+
pstoret<float, Packet4f, ResultAlignment>(res + res_stride, vec4f_swizzle2(iA, iB, 2, 0, 2, 0));
|
|
159
|
+
pstoret<float, Packet4f, ResultAlignment>(res + 2 * res_stride, vec4f_swizzle2(iC, iD, 3, 1, 3, 1));
|
|
160
|
+
pstoret<float, Packet4f, ResultAlignment>(res + 3 * res_stride, vec4f_swizzle2(iC, iD, 2, 0, 2, 0));
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
#if !(defined EIGEN_VECTORIZE_NEON && !(EIGEN_ARCH_ARM64 && !EIGEN_APPLE_DOUBLE_NEON_BUG))
|
|
165
|
+
// same algorithm as above, except that each operand is split into
|
|
166
|
+
// halves for two registers to hold.
|
|
167
|
+
template <typename MatrixType, typename ResultType>
|
|
168
|
+
struct compute_inverse_size4<Architecture::Target, double, MatrixType, ResultType>
|
|
169
|
+
{
|
|
170
|
+
enum
|
|
171
|
+
{
|
|
172
|
+
MatrixAlignment = traits<MatrixType>::Alignment,
|
|
173
|
+
ResultAlignment = traits<ResultType>::Alignment,
|
|
174
|
+
StorageOrdersMatch = (MatrixType::Flags & RowMajorBit) == (ResultType::Flags & RowMajorBit)
|
|
175
|
+
};
|
|
176
|
+
typedef typename conditional<(MatrixType::Flags & LinearAccessBit),
|
|
177
|
+
MatrixType const &,
|
|
178
|
+
typename MatrixType::PlainObject>::type
|
|
179
|
+
ActualMatrixType;
|
|
180
|
+
|
|
181
|
+
static void run(const MatrixType &mat, ResultType &result)
|
|
182
|
+
{
|
|
183
|
+
ActualMatrixType matrix(mat);
|
|
184
|
+
|
|
185
|
+
// Four 2x2 sub-matrices of the input matrix, each is further divided into upper and lower
|
|
186
|
+
// row e.g. A1, upper row of A, A2, lower row of A
|
|
187
|
+
// input = [[A, B], = [[[A1, [B1,
|
|
188
|
+
// [C, D]] A2], B2]],
|
|
189
|
+
// [[C1, [D1,
|
|
190
|
+
// C2], D2]]]
|
|
191
|
+
|
|
192
|
+
Packet2d A1, A2, B1, B2, C1, C2, D1, D2;
|
|
193
|
+
|
|
194
|
+
const double* data = matrix.data();
|
|
195
|
+
const Index stride = matrix.innerStride();
|
|
196
|
+
if (StorageOrdersMatch)
|
|
197
|
+
{
|
|
198
|
+
A1 = ploadt<Packet2d,MatrixAlignment>(data + stride*0);
|
|
199
|
+
B1 = ploadt<Packet2d,MatrixAlignment>(data + stride*2);
|
|
200
|
+
A2 = ploadt<Packet2d,MatrixAlignment>(data + stride*4);
|
|
201
|
+
B2 = ploadt<Packet2d,MatrixAlignment>(data + stride*6);
|
|
202
|
+
C1 = ploadt<Packet2d,MatrixAlignment>(data + stride*8);
|
|
203
|
+
D1 = ploadt<Packet2d,MatrixAlignment>(data + stride*10);
|
|
204
|
+
C2 = ploadt<Packet2d,MatrixAlignment>(data + stride*12);
|
|
205
|
+
D2 = ploadt<Packet2d,MatrixAlignment>(data + stride*14);
|
|
206
|
+
}
|
|
207
|
+
else
|
|
208
|
+
{
|
|
209
|
+
Packet2d temp;
|
|
210
|
+
A1 = ploadt<Packet2d,MatrixAlignment>(data + stride*0);
|
|
211
|
+
C1 = ploadt<Packet2d,MatrixAlignment>(data + stride*2);
|
|
212
|
+
A2 = ploadt<Packet2d,MatrixAlignment>(data + stride*4);
|
|
213
|
+
C2 = ploadt<Packet2d,MatrixAlignment>(data + stride*6);
|
|
214
|
+
temp = A1;
|
|
215
|
+
A1 = vec2d_unpacklo(A1, A2);
|
|
216
|
+
A2 = vec2d_unpackhi(temp, A2);
|
|
217
|
+
|
|
218
|
+
temp = C1;
|
|
219
|
+
C1 = vec2d_unpacklo(C1, C2);
|
|
220
|
+
C2 = vec2d_unpackhi(temp, C2);
|
|
221
|
+
|
|
222
|
+
B1 = ploadt<Packet2d,MatrixAlignment>(data + stride*8);
|
|
223
|
+
D1 = ploadt<Packet2d,MatrixAlignment>(data + stride*10);
|
|
224
|
+
B2 = ploadt<Packet2d,MatrixAlignment>(data + stride*12);
|
|
225
|
+
D2 = ploadt<Packet2d,MatrixAlignment>(data + stride*14);
|
|
226
|
+
|
|
227
|
+
temp = B1;
|
|
228
|
+
B1 = vec2d_unpacklo(B1, B2);
|
|
229
|
+
B2 = vec2d_unpackhi(temp, B2);
|
|
230
|
+
|
|
231
|
+
temp = D1;
|
|
232
|
+
D1 = vec2d_unpacklo(D1, D2);
|
|
233
|
+
D2 = vec2d_unpackhi(temp, D2);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// determinants of the sub-matrices
|
|
237
|
+
Packet2d dA, dB, dC, dD;
|
|
238
|
+
|
|
239
|
+
dA = vec2d_swizzle2(A2, A2, 1);
|
|
240
|
+
dA = pmul(A1, dA);
|
|
241
|
+
dA = psub(dA, vec2d_duplane(dA, 1));
|
|
242
|
+
|
|
243
|
+
dB = vec2d_swizzle2(B2, B2, 1);
|
|
244
|
+
dB = pmul(B1, dB);
|
|
245
|
+
dB = psub(dB, vec2d_duplane(dB, 1));
|
|
246
|
+
|
|
247
|
+
dC = vec2d_swizzle2(C2, C2, 1);
|
|
248
|
+
dC = pmul(C1, dC);
|
|
249
|
+
dC = psub(dC, vec2d_duplane(dC, 1));
|
|
250
|
+
|
|
251
|
+
dD = vec2d_swizzle2(D2, D2, 1);
|
|
252
|
+
dD = pmul(D1, dD);
|
|
253
|
+
dD = psub(dD, vec2d_duplane(dD, 1));
|
|
254
|
+
|
|
255
|
+
Packet2d DC1, DC2, AB1, AB2;
|
|
256
|
+
|
|
257
|
+
// AB = A# * B, where A# denotes the adjugate of A, and * denotes matrix product.
|
|
258
|
+
AB1 = pmul(B1, vec2d_duplane(A2, 1));
|
|
259
|
+
AB2 = pmul(B2, vec2d_duplane(A1, 0));
|
|
260
|
+
AB1 = psub(AB1, pmul(B2, vec2d_duplane(A1, 1)));
|
|
261
|
+
AB2 = psub(AB2, pmul(B1, vec2d_duplane(A2, 0)));
|
|
262
|
+
|
|
263
|
+
// DC = D#*C
|
|
264
|
+
DC1 = pmul(C1, vec2d_duplane(D2, 1));
|
|
265
|
+
DC2 = pmul(C2, vec2d_duplane(D1, 0));
|
|
266
|
+
DC1 = psub(DC1, pmul(C2, vec2d_duplane(D1, 1)));
|
|
267
|
+
DC2 = psub(DC2, pmul(C1, vec2d_duplane(D2, 0)));
|
|
268
|
+
|
|
269
|
+
Packet2d d1, d2;
|
|
270
|
+
|
|
271
|
+
// determinant of the input matrix, det = |A||D| + |B||C| - trace(A#*B*D#*C)
|
|
272
|
+
Packet2d det;
|
|
273
|
+
|
|
274
|
+
// reciprocal of the determinant of the input matrix, rd = 1/det
|
|
275
|
+
Packet2d rd;
|
|
276
|
+
|
|
277
|
+
d1 = pmul(AB1, vec2d_swizzle2(DC1, DC2, 0));
|
|
278
|
+
d2 = pmul(AB2, vec2d_swizzle2(DC1, DC2, 3));
|
|
279
|
+
rd = padd(d1, d2);
|
|
280
|
+
rd = padd(rd, vec2d_duplane(rd, 1));
|
|
281
|
+
|
|
282
|
+
d1 = pmul(dA, dD);
|
|
283
|
+
d2 = pmul(dB, dC);
|
|
284
|
+
|
|
285
|
+
det = padd(d1, d2);
|
|
286
|
+
det = psub(det, rd);
|
|
287
|
+
det = vec2d_duplane(det, 0);
|
|
288
|
+
rd = pdiv(pset1<Packet2d>(1.0), det);
|
|
289
|
+
|
|
290
|
+
// rows of four sub-matrices of the inverse
|
|
291
|
+
Packet2d iA1, iA2, iB1, iB2, iC1, iC2, iD1, iD2;
|
|
292
|
+
|
|
293
|
+
// iD = D*|A| - C*A#*B
|
|
294
|
+
iD1 = pmul(AB1, vec2d_duplane(C1, 0));
|
|
295
|
+
iD2 = pmul(AB1, vec2d_duplane(C2, 0));
|
|
296
|
+
iD1 = padd(iD1, pmul(AB2, vec2d_duplane(C1, 1)));
|
|
297
|
+
iD2 = padd(iD2, pmul(AB2, vec2d_duplane(C2, 1)));
|
|
298
|
+
dA = vec2d_duplane(dA, 0);
|
|
299
|
+
iD1 = psub(pmul(D1, dA), iD1);
|
|
300
|
+
iD2 = psub(pmul(D2, dA), iD2);
|
|
301
|
+
|
|
302
|
+
// iA = A*|D| - B*D#*C
|
|
303
|
+
iA1 = pmul(DC1, vec2d_duplane(B1, 0));
|
|
304
|
+
iA2 = pmul(DC1, vec2d_duplane(B2, 0));
|
|
305
|
+
iA1 = padd(iA1, pmul(DC2, vec2d_duplane(B1, 1)));
|
|
306
|
+
iA2 = padd(iA2, pmul(DC2, vec2d_duplane(B2, 1)));
|
|
307
|
+
dD = vec2d_duplane(dD, 0);
|
|
308
|
+
iA1 = psub(pmul(A1, dD), iA1);
|
|
309
|
+
iA2 = psub(pmul(A2, dD), iA2);
|
|
310
|
+
|
|
311
|
+
// iB = C*|B| - D * (A#B)# = C*|B| - D*B#*A
|
|
312
|
+
iB1 = pmul(D1, vec2d_swizzle2(AB2, AB1, 1));
|
|
313
|
+
iB2 = pmul(D2, vec2d_swizzle2(AB2, AB1, 1));
|
|
314
|
+
iB1 = psub(iB1, pmul(vec2d_swizzle2(D1, D1, 1), vec2d_swizzle2(AB2, AB1, 2)));
|
|
315
|
+
iB2 = psub(iB2, pmul(vec2d_swizzle2(D2, D2, 1), vec2d_swizzle2(AB2, AB1, 2)));
|
|
316
|
+
dB = vec2d_duplane(dB, 0);
|
|
317
|
+
iB1 = psub(pmul(C1, dB), iB1);
|
|
318
|
+
iB2 = psub(pmul(C2, dB), iB2);
|
|
319
|
+
|
|
320
|
+
// iC = B*|C| - A * (D#C)# = B*|C| - A*C#*D
|
|
321
|
+
iC1 = pmul(A1, vec2d_swizzle2(DC2, DC1, 1));
|
|
322
|
+
iC2 = pmul(A2, vec2d_swizzle2(DC2, DC1, 1));
|
|
323
|
+
iC1 = psub(iC1, pmul(vec2d_swizzle2(A1, A1, 1), vec2d_swizzle2(DC2, DC1, 2)));
|
|
324
|
+
iC2 = psub(iC2, pmul(vec2d_swizzle2(A2, A2, 1), vec2d_swizzle2(DC2, DC1, 2)));
|
|
325
|
+
dC = vec2d_duplane(dC, 0);
|
|
326
|
+
iC1 = psub(pmul(B1, dC), iC1);
|
|
327
|
+
iC2 = psub(pmul(B2, dC), iC2);
|
|
328
|
+
|
|
329
|
+
const double sign_mask1[2] = {0.0, numext::bit_cast<double>(0x8000000000000000ull)};
|
|
330
|
+
const double sign_mask2[2] = {numext::bit_cast<double>(0x8000000000000000ull), 0.0};
|
|
331
|
+
const Packet2d sign_PN = ploadu<Packet2d>(sign_mask1);
|
|
332
|
+
const Packet2d sign_NP = ploadu<Packet2d>(sign_mask2);
|
|
333
|
+
d1 = pxor(rd, sign_PN);
|
|
334
|
+
d2 = pxor(rd, sign_NP);
|
|
335
|
+
|
|
336
|
+
Index res_stride = result.outerStride();
|
|
337
|
+
double *res = result.data();
|
|
338
|
+
pstoret<double, Packet2d, ResultAlignment>(res + 0, pmul(vec2d_swizzle2(iA2, iA1, 3), d1));
|
|
339
|
+
pstoret<double, Packet2d, ResultAlignment>(res + res_stride, pmul(vec2d_swizzle2(iA2, iA1, 0), d2));
|
|
340
|
+
pstoret<double, Packet2d, ResultAlignment>(res + 2, pmul(vec2d_swizzle2(iB2, iB1, 3), d1));
|
|
341
|
+
pstoret<double, Packet2d, ResultAlignment>(res + res_stride + 2, pmul(vec2d_swizzle2(iB2, iB1, 0), d2));
|
|
342
|
+
pstoret<double, Packet2d, ResultAlignment>(res + 2 * res_stride, pmul(vec2d_swizzle2(iC2, iC1, 3), d1));
|
|
343
|
+
pstoret<double, Packet2d, ResultAlignment>(res + 3 * res_stride, pmul(vec2d_swizzle2(iC2, iC1, 0), d2));
|
|
344
|
+
pstoret<double, Packet2d, ResultAlignment>(res + 2 * res_stride + 2, pmul(vec2d_swizzle2(iD2, iD1, 3), d1));
|
|
345
|
+
pstoret<double, Packet2d, ResultAlignment>(res + 3 * res_stride + 2, pmul(vec2d_swizzle2(iD2, iD1, 0), d2));
|
|
346
|
+
}
|
|
347
|
+
};
|
|
348
|
+
#endif
|
|
349
|
+
} // namespace internal
|
|
350
|
+
} // namespace Eigen
|
|
351
|
+
#endif
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
// This file is part of Eigen, a lightweight C++ template library
|
|
2
|
+
// for linear algebra.
|
|
3
|
+
//
|
|
4
|
+
// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam@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
|
+
#ifndef METIS_SUPPORT_H
|
|
10
|
+
#define METIS_SUPPORT_H
|
|
11
|
+
|
|
12
|
+
namespace Eigen {
|
|
13
|
+
/**
|
|
14
|
+
* Get the fill-reducing ordering from the METIS package
|
|
15
|
+
*
|
|
16
|
+
* If A is the original matrix and Ap is the permuted matrix,
|
|
17
|
+
* the fill-reducing permutation is defined as follows :
|
|
18
|
+
* Row (column) i of A is the matperm(i) row (column) of Ap.
|
|
19
|
+
* WARNING: As computed by METIS, this corresponds to the vector iperm (instead of perm)
|
|
20
|
+
*/
|
|
21
|
+
template <typename StorageIndex>
|
|
22
|
+
class MetisOrdering
|
|
23
|
+
{
|
|
24
|
+
public:
|
|
25
|
+
typedef PermutationMatrix<Dynamic,Dynamic,StorageIndex> PermutationType;
|
|
26
|
+
typedef Matrix<StorageIndex,Dynamic,1> IndexVector;
|
|
27
|
+
|
|
28
|
+
template <typename MatrixType>
|
|
29
|
+
void get_symmetrized_graph(const MatrixType& A)
|
|
30
|
+
{
|
|
31
|
+
Index m = A.cols();
|
|
32
|
+
eigen_assert((A.rows() == A.cols()) && "ONLY FOR SQUARED MATRICES");
|
|
33
|
+
// Get the transpose of the input matrix
|
|
34
|
+
MatrixType At = A.transpose();
|
|
35
|
+
// Get the number of nonzeros elements in each row/col of At+A
|
|
36
|
+
Index TotNz = 0;
|
|
37
|
+
IndexVector visited(m);
|
|
38
|
+
visited.setConstant(-1);
|
|
39
|
+
for (StorageIndex j = 0; j < m; j++)
|
|
40
|
+
{
|
|
41
|
+
// Compute the union structure of of A(j,:) and At(j,:)
|
|
42
|
+
visited(j) = j; // Do not include the diagonal element
|
|
43
|
+
// Get the nonzeros in row/column j of A
|
|
44
|
+
for (typename MatrixType::InnerIterator it(A, j); it; ++it)
|
|
45
|
+
{
|
|
46
|
+
Index idx = it.index(); // Get the row index (for column major) or column index (for row major)
|
|
47
|
+
if (visited(idx) != j )
|
|
48
|
+
{
|
|
49
|
+
visited(idx) = j;
|
|
50
|
+
++TotNz;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//Get the nonzeros in row/column j of At
|
|
54
|
+
for (typename MatrixType::InnerIterator it(At, j); it; ++it)
|
|
55
|
+
{
|
|
56
|
+
Index idx = it.index();
|
|
57
|
+
if(visited(idx) != j)
|
|
58
|
+
{
|
|
59
|
+
visited(idx) = j;
|
|
60
|
+
++TotNz;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Reserve place for A + At
|
|
65
|
+
m_indexPtr.resize(m+1);
|
|
66
|
+
m_innerIndices.resize(TotNz);
|
|
67
|
+
|
|
68
|
+
// Now compute the real adjacency list of each column/row
|
|
69
|
+
visited.setConstant(-1);
|
|
70
|
+
StorageIndex CurNz = 0;
|
|
71
|
+
for (StorageIndex j = 0; j < m; j++)
|
|
72
|
+
{
|
|
73
|
+
m_indexPtr(j) = CurNz;
|
|
74
|
+
|
|
75
|
+
visited(j) = j; // Do not include the diagonal element
|
|
76
|
+
// Add the pattern of row/column j of A to A+At
|
|
77
|
+
for (typename MatrixType::InnerIterator it(A,j); it; ++it)
|
|
78
|
+
{
|
|
79
|
+
StorageIndex idx = it.index(); // Get the row index (for column major) or column index (for row major)
|
|
80
|
+
if (visited(idx) != j )
|
|
81
|
+
{
|
|
82
|
+
visited(idx) = j;
|
|
83
|
+
m_innerIndices(CurNz) = idx;
|
|
84
|
+
CurNz++;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//Add the pattern of row/column j of At to A+At
|
|
88
|
+
for (typename MatrixType::InnerIterator it(At, j); it; ++it)
|
|
89
|
+
{
|
|
90
|
+
StorageIndex idx = it.index();
|
|
91
|
+
if(visited(idx) != j)
|
|
92
|
+
{
|
|
93
|
+
visited(idx) = j;
|
|
94
|
+
m_innerIndices(CurNz) = idx;
|
|
95
|
+
++CurNz;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
m_indexPtr(m) = CurNz;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
template <typename MatrixType>
|
|
103
|
+
void operator() (const MatrixType& A, PermutationType& matperm)
|
|
104
|
+
{
|
|
105
|
+
StorageIndex m = internal::convert_index<StorageIndex>(A.cols()); // must be StorageIndex, because it is passed by address to METIS
|
|
106
|
+
IndexVector perm(m),iperm(m);
|
|
107
|
+
// First, symmetrize the matrix graph.
|
|
108
|
+
get_symmetrized_graph(A);
|
|
109
|
+
int output_error;
|
|
110
|
+
|
|
111
|
+
// Call the fill-reducing routine from METIS
|
|
112
|
+
output_error = METIS_NodeND(&m, m_indexPtr.data(), m_innerIndices.data(), NULL, NULL, perm.data(), iperm.data());
|
|
113
|
+
|
|
114
|
+
if(output_error != METIS_OK)
|
|
115
|
+
{
|
|
116
|
+
//FIXME The ordering interface should define a class of possible errors
|
|
117
|
+
std::cerr << "ERROR WHILE CALLING THE METIS PACKAGE \n";
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Get the fill-reducing permutation
|
|
122
|
+
//NOTE: If Ap is the permuted matrix then perm and iperm vectors are defined as follows
|
|
123
|
+
// Row (column) i of Ap is the perm(i) row(column) of A, and row (column) i of A is the iperm(i) row(column) of Ap
|
|
124
|
+
|
|
125
|
+
matperm.resize(m);
|
|
126
|
+
for (int j = 0; j < m; j++)
|
|
127
|
+
matperm.indices()(iperm(j)) = j;
|
|
128
|
+
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
protected:
|
|
132
|
+
IndexVector m_indexPtr; // Pointer to the adjacenccy list of each row/column
|
|
133
|
+
IndexVector m_innerIndices; // Adjacency list
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
}// end namespace eigen
|
|
137
|
+
#endif
|