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,224 @@
|
|
|
1
|
+
#ifndef IRLBA_UTILS_HPP
|
|
2
|
+
#define IRLBA_UTILS_HPP
|
|
3
|
+
|
|
4
|
+
#include "Eigen/Dense"
|
|
5
|
+
#include <random>
|
|
6
|
+
#include <utility>
|
|
7
|
+
#include "aarand/aarand.hpp"
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @file utils.hpp
|
|
11
|
+
*
|
|
12
|
+
* @brief Various utility functions.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
namespace irlba {
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Orthogonalize a vector against a set of orthonormal column vectors.
|
|
19
|
+
*
|
|
20
|
+
* @param mat A matrix where the left-most `ncols` columns are orthonormal vectors.
|
|
21
|
+
* @param vec The vector of interest, of length equal to the number of rows in `mat`.
|
|
22
|
+
* @param tmp A vector of length equal to `mat.cols()`, used to store intermediate matrix products.
|
|
23
|
+
* @param ncols Number of left-most columns of `mat` to use.
|
|
24
|
+
*
|
|
25
|
+
* @return `vec` is modified to contain `vec - mat0 * t(mat0) * vec`, where `mat0` is defined as the first `ncols` columns of `mat`.
|
|
26
|
+
* This ensures that it is orthogonal to each column of `mat0`.
|
|
27
|
+
*/
|
|
28
|
+
inline void orthogonalize_vector(const Eigen::MatrixXd& mat, Eigen::VectorXd& vec, size_t ncols, Eigen::VectorXd& tmp) {
|
|
29
|
+
tmp.head(ncols).noalias() = mat.leftCols(ncols).adjoint() * vec;
|
|
30
|
+
vec.noalias() -= mat.leftCols(ncols) * tmp.head(ncols);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Fill an **Eigen** vector with random normals via **aarand**.
|
|
36
|
+
*
|
|
37
|
+
* @param Vec Any **Eigen** vector class or equivalent proxy object.
|
|
38
|
+
* @param Engine A (pseudo-)random number generator class that returns a random number when called with no arguments.
|
|
39
|
+
*
|
|
40
|
+
* @param vec Instance of a `Vec` class.
|
|
41
|
+
* @param eng Instance of an `Engine` class.
|
|
42
|
+
*
|
|
43
|
+
* @return `vec` is filled with random draws from a standard normal distribution.
|
|
44
|
+
*/
|
|
45
|
+
template<class Vec, class Engine>
|
|
46
|
+
void fill_with_random_normals(Vec& vec, Engine& eng) {
|
|
47
|
+
Eigen::Index i = 0;
|
|
48
|
+
while (i < vec.size() - 1) {
|
|
49
|
+
auto paired = aarand::standard_normal(eng);
|
|
50
|
+
vec[i] = paired.first;
|
|
51
|
+
vec[i + 1] = paired.second;
|
|
52
|
+
i += 2;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (i != vec.size()) {
|
|
56
|
+
auto paired = aarand::standard_normal(eng);
|
|
57
|
+
vec[i] = paired.first;
|
|
58
|
+
}
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* @cond
|
|
64
|
+
*/
|
|
65
|
+
template<class M>
|
|
66
|
+
struct ColumnVectorProxy {
|
|
67
|
+
ColumnVectorProxy(M& m, int c) : mat(m), col(c) {}
|
|
68
|
+
auto size () { return mat.rows(); }
|
|
69
|
+
auto& operator[](int r) { return mat(r, col); }
|
|
70
|
+
M& mat;
|
|
71
|
+
int col;
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* @endcond
|
|
75
|
+
*/
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Fill a column of an **Eigen** matrix with random normals via **aarand**.
|
|
79
|
+
*
|
|
80
|
+
* @param Matrix Any **Eigen** matrix class or equivalent proxy object.
|
|
81
|
+
* @param Engine A (pseudo-)random number generator class that returns a random number when called with no arguments.
|
|
82
|
+
*
|
|
83
|
+
* @param mat Instance of a `Matrix` class.
|
|
84
|
+
* @param eng Instance of an `Engine` class.
|
|
85
|
+
*
|
|
86
|
+
* @return The `column` column of `mat` is filled with random draws from a standard normal distribution.
|
|
87
|
+
*/
|
|
88
|
+
template<class Matrix, class Engine>
|
|
89
|
+
void fill_with_random_normals(Matrix& mat, int column, Engine& eng) {
|
|
90
|
+
ColumnVectorProxy proxy(mat, column);
|
|
91
|
+
fill_with_random_normals(proxy, eng);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* @brief Test for IRLBA convergence.
|
|
97
|
+
*/
|
|
98
|
+
struct ConvergenceTest {
|
|
99
|
+
public:
|
|
100
|
+
struct Defaults {
|
|
101
|
+
/**
|
|
102
|
+
* See `set_tol()` for more details.
|
|
103
|
+
*/
|
|
104
|
+
static constexpr double tol = 1e-5;
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* See `set_svtol()` for more details.
|
|
108
|
+
*/
|
|
109
|
+
static constexpr double svtol = -1;
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
private:
|
|
113
|
+
double tol = Defaults::tol;
|
|
114
|
+
double svtol = Defaults::svtol;
|
|
115
|
+
|
|
116
|
+
public:
|
|
117
|
+
/**
|
|
118
|
+
* Set the tolerance on the residuals.
|
|
119
|
+
*
|
|
120
|
+
* @param t Tolerance, should be a positive number.
|
|
121
|
+
*
|
|
122
|
+
* @return A reference to this `ConvergenceTest` instance.
|
|
123
|
+
*/
|
|
124
|
+
ConvergenceTest& set_tol(double t = Defaults::tol) {
|
|
125
|
+
tol = t;
|
|
126
|
+
return *this;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Set the tolerance on the relative differences between singular values across iterations.
|
|
131
|
+
*
|
|
132
|
+
* @param s Tolerance, should be a positive number.
|
|
133
|
+
* Alternatively -1, in which case the value supplied to `set_tol()` is used.
|
|
134
|
+
*
|
|
135
|
+
* @return A reference to this `ConvergenceTest` instance.
|
|
136
|
+
*/
|
|
137
|
+
ConvergenceTest& set_svtol(double s = Defaults::svtol) {
|
|
138
|
+
svtol = s;
|
|
139
|
+
return *this;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
public:
|
|
143
|
+
/**
|
|
144
|
+
* Calculate the number of singular values/vectors that have converged.
|
|
145
|
+
*
|
|
146
|
+
* @param sv Vector of singular values.
|
|
147
|
+
* @param residuals Vector of residuals for each singular value/vector.
|
|
148
|
+
*
|
|
149
|
+
* @return The number of singular values/vectors that have achieved convergence.
|
|
150
|
+
*/
|
|
151
|
+
int run(const Eigen::VectorXd& sv, const Eigen::VectorXd& residuals, const Eigen::VectorXd& last) const {
|
|
152
|
+
int counter = 0;
|
|
153
|
+
double Smax = *std::max_element(sv.begin(), sv.end());
|
|
154
|
+
double svtol_actual = (svtol >= 0 ? svtol : tol);
|
|
155
|
+
|
|
156
|
+
for (int j = 0; j < sv.size(); ++j) {
|
|
157
|
+
double ratio = std::abs(sv[j] - last[j]) / sv[j];
|
|
158
|
+
if (std::abs(residuals[j]) < tol * Smax && // see the RHS of Equation 2.13 in Baglama and Reichel.
|
|
159
|
+
ratio < svtol_actual) {
|
|
160
|
+
++counter;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
return counter;
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Utility function to generate a default `NULL` argument for the random number generator input.
|
|
170
|
+
*
|
|
171
|
+
* @return A null pointer to an RNG.
|
|
172
|
+
* Any RNG will do here, so we use the most common one.
|
|
173
|
+
*/
|
|
174
|
+
constexpr std::mt19937_64* null_rng() { return NULL; }
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* @cond
|
|
178
|
+
*/
|
|
179
|
+
template<class M, typename = int>
|
|
180
|
+
struct has_multiply_method {
|
|
181
|
+
static constexpr bool value = false;
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
template<class M>
|
|
185
|
+
struct has_multiply_method<M, decltype((void) (std::declval<M>() * std::declval<Eigen::VectorXd>()), 0)> {
|
|
186
|
+
static constexpr bool value = true;
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
template<class M, typename = int>
|
|
190
|
+
struct has_adjoint_multiply_method {
|
|
191
|
+
static constexpr bool value = false;
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
template<class M>
|
|
195
|
+
struct has_adjoint_multiply_method<M, decltype((void) (std::declval<M>().adjoint() * std::declval<Eigen::VectorXd>()), 0)> {
|
|
196
|
+
static constexpr bool value = true;
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
template<class M, typename = int>
|
|
200
|
+
struct has_realize_method {
|
|
201
|
+
static constexpr bool value = false;
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
template<class M>
|
|
205
|
+
struct has_realize_method<M, decltype((void) std::declval<M>().realize(), 0)> {
|
|
206
|
+
static constexpr bool value = std::is_same<decltype(std::declval<M>().realize()), Eigen::MatrixXd>::value;
|
|
207
|
+
};
|
|
208
|
+
|
|
209
|
+
template<class M, typename = int>
|
|
210
|
+
struct has_data_method {
|
|
211
|
+
static constexpr bool value = false;
|
|
212
|
+
};
|
|
213
|
+
|
|
214
|
+
template<class M>
|
|
215
|
+
struct has_data_method<M, decltype((void) (std::declval<M>().data()), 0)> {
|
|
216
|
+
static constexpr bool value = true;
|
|
217
|
+
};
|
|
218
|
+
/**
|
|
219
|
+
* @endcond
|
|
220
|
+
*/
|
|
221
|
+
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
#endif
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
#ifndef IRLBA_WRAPPERS_HPP
|
|
2
|
+
#define IRLBA_WRAPPERS_HPP
|
|
3
|
+
|
|
4
|
+
#include "utils.hpp"
|
|
5
|
+
#include "Eigen/Dense"
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @file wrappers.hpp
|
|
9
|
+
*
|
|
10
|
+
* @brief Wrapper classes for multiplication of modified matrices.
|
|
11
|
+
*
|
|
12
|
+
* The idea is to compute the product of a modified matrix with a vector - but without actually modifying the underlying matrix.
|
|
13
|
+
* This is especially important when the modification results in an unnecessary copy and/or loss of sparsity.
|
|
14
|
+
* We achieve this effect by deferring the modification into the subspace defined by vector.
|
|
15
|
+
*
|
|
16
|
+
* An instance `mat` of a wrapper class should implement:
|
|
17
|
+
*
|
|
18
|
+
* - `mat.rows()`, returning the number of rows.
|
|
19
|
+
* - `mat.cols()`, returning the number of columns.
|
|
20
|
+
* - `mat.multiply(rhs, out)`, which computes the matrix product `mat * rhs` and stores it in `out`.
|
|
21
|
+
* `rhs` should be an `Eigen::VectorXd` (or an expression equivalent) while `out` should be a `Eigen::VectorXd`.
|
|
22
|
+
* - `mat.adjoint_multiply(rhs, out)`, which computes the matrix product `mat.adjoint() * rhs` and stores it in `out`.
|
|
23
|
+
* `rhs` should be an `Eigen::VectorXd` (or an expression equivalent) while `out` should be a `Eigen::VectorXd`.
|
|
24
|
+
* - `mat.realize()`, which returns an `Eigen::MatrixXd` containing the matrix with all modifications applied.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
namespace irlba {
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* @brief Wrapper for a centered matrix.
|
|
31
|
+
*
|
|
32
|
+
* @tparam Matrix An **Eigen** matrix class - or alternatively, a wrapper class around such a class.
|
|
33
|
+
*
|
|
34
|
+
* This modification involves centering all columns, i.e., subtracting the mean of each column from the values of that column.
|
|
35
|
+
* Naively doing such an operation would involve loss of sparsity, which we avoid by deferring the subtraction into the subspace defined by `rhs`.
|
|
36
|
+
*/
|
|
37
|
+
template<class Matrix>
|
|
38
|
+
struct Centered {
|
|
39
|
+
/**
|
|
40
|
+
* @param m Underlying matrix to be column-centered.
|
|
41
|
+
* @param c Vector of length equal to the number of columns of `m`,
|
|
42
|
+
* containing the value to subtract from each column.
|
|
43
|
+
*/
|
|
44
|
+
Centered(const Matrix* m, const Eigen::VectorXd* c) : mat(m), center(c) {}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* @return Number of rows in the matrix.
|
|
48
|
+
*/
|
|
49
|
+
auto rows() const { return mat->rows(); }
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* @return Number of columns in the matrix.
|
|
53
|
+
*/
|
|
54
|
+
auto cols() const { return mat->cols(); }
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* @tparam Right An `Eigen::VectorXd` or equivalent expression.
|
|
58
|
+
*
|
|
59
|
+
* @param[in] rhs The right-hand side of the matrix product.
|
|
60
|
+
* This should be a vector or have only one column.
|
|
61
|
+
* @param[out] out The output vector to store the matrix product.
|
|
62
|
+
*
|
|
63
|
+
* @return `out` is filled with the product of this matrix and `rhs`.
|
|
64
|
+
*/
|
|
65
|
+
template<class Right>
|
|
66
|
+
void multiply(const Right& rhs, Eigen::VectorXd& out) const {
|
|
67
|
+
if constexpr(has_multiply_method<Matrix>::value) {
|
|
68
|
+
out.noalias() = *mat * rhs;
|
|
69
|
+
} else {
|
|
70
|
+
mat->multiply(rhs, out);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
double beta = rhs.dot(*center);
|
|
74
|
+
for (auto& o : out) {
|
|
75
|
+
o -= beta;
|
|
76
|
+
}
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* @tparam Right An `Eigen::VectorXd` or equivalent expression.
|
|
82
|
+
*
|
|
83
|
+
* @param[in] rhs The right-hand side of the matrix product.
|
|
84
|
+
* This should be a vector or have only one column.
|
|
85
|
+
* @param[out] out The output vector to store the matrix product.
|
|
86
|
+
*
|
|
87
|
+
* @return `out` is filled with the product of the transpose of this matrix and `rhs`.
|
|
88
|
+
*/
|
|
89
|
+
template<class Right>
|
|
90
|
+
void adjoint_multiply(const Right& rhs, Eigen::VectorXd& out) const {
|
|
91
|
+
if constexpr(has_adjoint_multiply_method<Matrix>::value) {
|
|
92
|
+
out.noalias() = mat->adjoint() * rhs;
|
|
93
|
+
} else {
|
|
94
|
+
mat->adjoint_multiply(rhs, out);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
double beta = rhs.sum();
|
|
98
|
+
out -= beta * (*center);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* @return A realized version of the centered matrix,
|
|
104
|
+
* where the centering has been explicitly applied.
|
|
105
|
+
*/
|
|
106
|
+
Eigen::MatrixXd realize() const {
|
|
107
|
+
auto subtractor = [&](Eigen::MatrixXd& m) -> void {
|
|
108
|
+
for (Eigen::Index c = 0; c < m.cols(); ++c) {
|
|
109
|
+
for (Eigen::Index r = 0; r < m.rows(); ++r) {
|
|
110
|
+
m(r, c) -= (*center)[c];
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
if constexpr(has_realize_method<Matrix>::value) {
|
|
116
|
+
Eigen::MatrixXd output = mat->realize();
|
|
117
|
+
subtractor(output);
|
|
118
|
+
return output;
|
|
119
|
+
} else {
|
|
120
|
+
Eigen::MatrixXd output(*mat);
|
|
121
|
+
subtractor(output);
|
|
122
|
+
return output;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
private:
|
|
127
|
+
const Matrix* mat;
|
|
128
|
+
const Eigen::VectorXd* center;
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* @brief Wrapper for a scaled matrix.
|
|
133
|
+
*
|
|
134
|
+
* @tparam Matrix An **Eigen** matrix class - or alternatively, a wrapper class around such a class.
|
|
135
|
+
*
|
|
136
|
+
* This modification involves scaling all columns, i.e., dividing the values of each column by the standard deviation of that column to achieve unit variance.
|
|
137
|
+
* Naively doing such an operation would involve a copy of the matrix, which we avoid by deferring the scaling into the subspace defined by `rhs`.
|
|
138
|
+
*/
|
|
139
|
+
template<class Matrix>
|
|
140
|
+
struct Scaled {
|
|
141
|
+
/**
|
|
142
|
+
* @param m Underlying matrix to be column-scaled.
|
|
143
|
+
* @param s Vector of length equal to the number of columns of `m`,
|
|
144
|
+
* containing the value to scale each column.
|
|
145
|
+
*/
|
|
146
|
+
Scaled(const Matrix* m, const Eigen::VectorXd* s) : mat(m), scale(s) {}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* @return Number of rows in the matrix.
|
|
150
|
+
*/
|
|
151
|
+
auto rows() const { return mat->rows(); }
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* @return Number of columns in the matrix.
|
|
155
|
+
*/
|
|
156
|
+
auto cols() const { return mat->cols(); }
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* @tparam Right An `Eigen::VectorXd` or equivalent expression.
|
|
160
|
+
*
|
|
161
|
+
* @param[in] rhs The right-hand side of the matrix product.
|
|
162
|
+
* This should be a vector or have only one column.
|
|
163
|
+
* @param[out] out The output vector to store the matrix product.
|
|
164
|
+
*
|
|
165
|
+
* @return `out` is filled with the product of this matrix and `rhs`.
|
|
166
|
+
*/
|
|
167
|
+
template<class Right>
|
|
168
|
+
void multiply(const Right& rhs, Eigen::VectorXd& out) const {
|
|
169
|
+
if constexpr(has_multiply_method<Matrix>::value) {
|
|
170
|
+
out.noalias() = *mat * rhs.cwiseQuotient(*scale);
|
|
171
|
+
} else {
|
|
172
|
+
mat->multiply(rhs.cwiseQuotient(*scale), out);
|
|
173
|
+
}
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* @tparam Right An `Eigen::VectorXd` or equivalent expression.
|
|
179
|
+
*
|
|
180
|
+
* @param[in] rhs The right-hand side of the matrix product.
|
|
181
|
+
* This should be a vector or have only one column.
|
|
182
|
+
* @param[out] out The output vector to store the matrix product.
|
|
183
|
+
*
|
|
184
|
+
* @return `out` is filled with the product of the transpose of this matrix and `rhs`.
|
|
185
|
+
*/
|
|
186
|
+
template<class Right>
|
|
187
|
+
void adjoint_multiply(const Right& rhs, Eigen::VectorXd& out) const {
|
|
188
|
+
if constexpr(has_adjoint_multiply_method<Matrix>::value) {
|
|
189
|
+
out.noalias() = mat->adjoint() * rhs;
|
|
190
|
+
} else {
|
|
191
|
+
mat->adjoint_multiply(rhs, out);
|
|
192
|
+
}
|
|
193
|
+
out.noalias() = out.cwiseQuotient(*scale);
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* @return A realized version of the scaled matrix,
|
|
199
|
+
* where the scaling has been explicitly applied.
|
|
200
|
+
*/
|
|
201
|
+
Eigen::MatrixXd realize() const {
|
|
202
|
+
auto scaler = [&](Eigen::MatrixXd& m) -> void {
|
|
203
|
+
for (Eigen::Index c = 0; c < m.cols(); ++c) {
|
|
204
|
+
for (Eigen::Index r = 0; r < m.rows(); ++r) {
|
|
205
|
+
m(r, c) /= (*scale)[c];
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
if constexpr(has_realize_method<Matrix>::value) {
|
|
211
|
+
Eigen::MatrixXd output = mat->realize();
|
|
212
|
+
scaler(output);
|
|
213
|
+
return output;
|
|
214
|
+
} else {
|
|
215
|
+
Eigen::MatrixXd output(*mat);
|
|
216
|
+
scaler(output);
|
|
217
|
+
return output;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
private:
|
|
222
|
+
const Matrix* mat;
|
|
223
|
+
const Eigen::VectorXd* scale;
|
|
224
|
+
};
|
|
225
|
+
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
#endif
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#ifndef KMEANS_BASE_HPP
|
|
2
|
+
#define KMEANS_BASE_HPP
|
|
3
|
+
|
|
4
|
+
#include "Details.hpp"
|
|
5
|
+
|
|
6
|
+
namespace kmeans {
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @brief Base class for all k-means refinement algorithms.
|
|
10
|
+
*
|
|
11
|
+
* @tparam DATA_t Floating-point type for the data and centroids.
|
|
12
|
+
* @tparam CLUSTER_t Integer type for the cluster assignments.
|
|
13
|
+
* @tparam INDEX_t Integer type for the observation index.
|
|
14
|
+
*/
|
|
15
|
+
template<typename DATA_t = double, typename CLUSTER_t = int, typename INDEX_t = int>
|
|
16
|
+
class Refine {
|
|
17
|
+
public:
|
|
18
|
+
virtual ~Refine() {}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* @param ndim Number of dimensions.
|
|
22
|
+
* @param nobs Number of observations.
|
|
23
|
+
* @param[in] data Pointer to a `ndim`-by-`nobs` array where columns are observations and rows are dimensions.
|
|
24
|
+
* Data should be stored in column-major order.
|
|
25
|
+
* @param ncenters Number of cluster centers.
|
|
26
|
+
* @param[in, out] centers Pointer to a `ndim`-by-`ncenters` array where columns are cluster centers and rows are dimensions.
|
|
27
|
+
* On input, this should contain the initial centroid locations for each cluster.
|
|
28
|
+
* Data should be stored in column-major order.
|
|
29
|
+
* On output, this will contain the final centroid locations for each cluster.
|
|
30
|
+
* @param[out] clusters Pointer to an array of length `nobs`.
|
|
31
|
+
* On output, this will contain the cluster assignment for each observation.
|
|
32
|
+
*
|
|
33
|
+
* @return `centers` and `clusters` are filled, and a `Details` object is returned containing clustering statistics.
|
|
34
|
+
* If `ncenters > nobs`, only the first `nobs` columns of the `centers` array will be filled.
|
|
35
|
+
*/
|
|
36
|
+
virtual Details<DATA_t, INDEX_t> run(int ndim, INDEX_t nobs, const DATA_t* data, CLUSTER_t ncenters, DATA_t* centers, CLUSTER_t* clusters) = 0;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* @brief Base class for all k-means initialization algorithms.
|
|
41
|
+
*
|
|
42
|
+
* @tparam DATA_t Floating-point type for the data and centroids.
|
|
43
|
+
* @tparam CLUSTER_t Integer type for the cluster assignments.
|
|
44
|
+
* @tparam INDEX_t Integer type for the observation index.
|
|
45
|
+
*/
|
|
46
|
+
template<typename DATA_t = double, typename CLUSTER_t = int, typename INDEX_t = int>
|
|
47
|
+
class Initialize {
|
|
48
|
+
public:
|
|
49
|
+
virtual ~Initialize() {}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* @param ndim Number of dimensions.
|
|
53
|
+
* @param nobs Number of observations.
|
|
54
|
+
* @param[in] data Pointer to a `ndim`-by-`nobs` array where columns are observations and rows are dimensions.
|
|
55
|
+
* Data should be stored in column-major order.
|
|
56
|
+
* @param ncenters Number of cluster centers.
|
|
57
|
+
* @param[in, out] centers Pointer to a `ndim`-by-`ncenters` array where columns are cluster centers and rows are dimensions.
|
|
58
|
+
* On input, this should contain the initial centroid locations for each cluster, or it may be ignored, depending on the subclass.
|
|
59
|
+
* Data should be stored in column-major order.
|
|
60
|
+
* On output, this will contain the final centroid locations for each cluster.
|
|
61
|
+
* @param[in, out] clusters Pointer to an array of length `nobs`.
|
|
62
|
+
* On input, this should contain the initial cluster assignments for each observation, or it may be ignored, depending on the subclass.
|
|
63
|
+
* This may be modified by the subclass - no guarantees are provided as to the output state.
|
|
64
|
+
*
|
|
65
|
+
* @return `centers` is filled with the new cluster centers.
|
|
66
|
+
* The number of filled centers is returned - this is usually equal to `ncenters`, but may not be if, e.g., `ncenters > nobs`.
|
|
67
|
+
* If the returned value is less than `ncenters`, only the first centers in `centers` will be filled.
|
|
68
|
+
*/
|
|
69
|
+
virtual CLUSTER_t run(int ndim, INDEX_t nobs, const DATA_t* data, CLUSTER_t ncenters, DATA_t* centers, CLUSTER_t* clusters) = 0;
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
#endif
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
#ifndef KMEANS_DETAILS_HPP
|
|
2
|
+
#define KMEANS_DETAILS_HPP
|
|
3
|
+
|
|
4
|
+
#include <vector>
|
|
5
|
+
|
|
6
|
+
namespace kmeans {
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @file Details.hpp
|
|
10
|
+
*
|
|
11
|
+
* @brief Report detailed clustering statistics.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @brief Additional statistics from the k-means algorithm.
|
|
16
|
+
*
|
|
17
|
+
* @tparam DATA_t Floating-point type for the data and centroids.
|
|
18
|
+
* @tparam INDEX_t Integer type for the observation index.
|
|
19
|
+
* This should have a maximum positive value that is at least 50 times greater than the maximum expected number of observations.
|
|
20
|
+
*/
|
|
21
|
+
template<typename DATA_t = double, typename INDEX_t = int>
|
|
22
|
+
struct Details {
|
|
23
|
+
/**
|
|
24
|
+
* @cond
|
|
25
|
+
*/
|
|
26
|
+
Details() {}
|
|
27
|
+
|
|
28
|
+
Details(int it, int st) : sizes(0), withinss(0), iterations(it), status(st) {}
|
|
29
|
+
|
|
30
|
+
Details(std::vector<INDEX_t> s, std::vector<DATA_t> w, int it, int st) : sizes(std::move(s)), withinss(std::move(w)), iterations(it), status(st) {}
|
|
31
|
+
/**
|
|
32
|
+
* @endcond
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* The number of observations in each cluster.
|
|
37
|
+
* All values are guaranteed to be positive for non-zero numbers of observations when `status == 0`.
|
|
38
|
+
*/
|
|
39
|
+
std::vector<INDEX_t> sizes;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* The within-cluster sum of squares for each cluster.
|
|
43
|
+
* All values are guaranteed to be non-negative.
|
|
44
|
+
* Values may be zero for clusters with only one observation.
|
|
45
|
+
*/
|
|
46
|
+
std::vector<DATA_t> withinss;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* The number of iterations used to achieve convergence.
|
|
50
|
+
* This value may be greater than the `maxit` if convergence was not achieved, see `status`.
|
|
51
|
+
*/
|
|
52
|
+
int iterations;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* The status of the algorithm.
|
|
56
|
+
* A value of 0 indicates that the algorithm completed successfully.
|
|
57
|
+
* The interpretation of a non-zero value depends on the algorithm.
|
|
58
|
+
*
|
|
59
|
+
* For `HartiganWong`:
|
|
60
|
+
*
|
|
61
|
+
* - 1: empty cluster detected.
|
|
62
|
+
* This usually indicates a problem with the initial choice of centroids.
|
|
63
|
+
* It can also occur in pathological situations with duplicate points.
|
|
64
|
+
* - 2: maximum iterations reached without convergence.
|
|
65
|
+
* - 3: the number of centers is not positive or greater than the number of observations.
|
|
66
|
+
* - 4: maximum number of quick transfer steps exceeded.
|
|
67
|
+
*
|
|
68
|
+
* For `Lloyd`:
|
|
69
|
+
*
|
|
70
|
+
* - 1: empty cluster detected.
|
|
71
|
+
* - 2: maximum iterations reached without convergence.
|
|
72
|
+
*/
|
|
73
|
+
int status;
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
#endif
|
|
79
|
+
|