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,94 @@
|
|
|
1
|
+
#ifndef NEIGHBOR_QUEUE_HPP
|
|
2
|
+
#define NEIGHBOR_QUEUE_HPP
|
|
3
|
+
|
|
4
|
+
#include <queue>
|
|
5
|
+
#include <vector>
|
|
6
|
+
#include <algorithm>
|
|
7
|
+
|
|
8
|
+
namespace knncolle {
|
|
9
|
+
|
|
10
|
+
template<typename INDEX_t, typename DATA_t>
|
|
11
|
+
using neighbor_queue = std::priority_queue<std::pair<DATA_t, INDEX_t> >;
|
|
12
|
+
|
|
13
|
+
template<typename INDEX_t, typename DISTANCE_t, class QUEUE>
|
|
14
|
+
inline std::vector<std::pair<INDEX_t, DISTANCE_t> > harvest_queue(QUEUE& nearest, bool check_self = false, INDEX_t self_index = 0) {
|
|
15
|
+
std::vector<std::pair<INDEX_t, DISTANCE_t> > output;
|
|
16
|
+
|
|
17
|
+
// If 'check_self=false', then it never enters the !found_self clause below, which is the correct behaviour.
|
|
18
|
+
bool found_self=!check_self;
|
|
19
|
+
|
|
20
|
+
while (!nearest.empty()) {
|
|
21
|
+
if (!found_self && nearest.top().second==self_index) {
|
|
22
|
+
nearest.pop();
|
|
23
|
+
found_self=true;
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
output.push_back(std::pair<INDEX_t, DISTANCE_t>(nearest.top().second, nearest.top().first));
|
|
27
|
+
nearest.pop();
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// We use push_back + reverse to give us sorting in increasing order;
|
|
31
|
+
// this is nicer than push_front() for std::vectors.
|
|
32
|
+
std::reverse(output.begin(), output.end());
|
|
33
|
+
|
|
34
|
+
// Getting rid of the last entry to get the 'k' nearest neighbors, if
|
|
35
|
+
// 'self' was not in the queue; this assumes that we searched on the k+1
|
|
36
|
+
// neighbors. Note that the absence of the self implies that we have at
|
|
37
|
+
// least 'k + 2' total observations, otherwise we must have picked up the
|
|
38
|
+
// self_index; thus, we have guaranteed to have gotten 'k+1' non-self hits,
|
|
39
|
+
// so the pop is always safe.
|
|
40
|
+
if (check_self && !found_self) {
|
|
41
|
+
output.pop_back();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return output;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/* The NeighborQueue class is a priority queue that contains indices and
|
|
48
|
+
* distances in decreasing order from the top of the queue. Existing elements
|
|
49
|
+
* are displaced by incoming elements that have shorter distances, thus making
|
|
50
|
+
* it a useful data structure for retaining the k-nearest neighbors.
|
|
51
|
+
*/
|
|
52
|
+
template<typename INDEX_t = int, typename DATA_t = double>
|
|
53
|
+
class NeighborQueue {
|
|
54
|
+
public:
|
|
55
|
+
NeighborQueue(int k) : n_neighbors(k), full(n_neighbors == 0) {}
|
|
56
|
+
|
|
57
|
+
NeighborQueue(int k, INDEX_t self) : n_neighbors(k + 1), full(false), check_self(true), self_index(self) {}
|
|
58
|
+
|
|
59
|
+
void add(INDEX_t i, DATA_t d) {
|
|
60
|
+
if (!full) {
|
|
61
|
+
nearest.push(std::make_pair(d, i));
|
|
62
|
+
if (static_cast<int>(nearest.size()) == n_neighbors) {
|
|
63
|
+
full=true;
|
|
64
|
+
}
|
|
65
|
+
} else if (d < limit()) {
|
|
66
|
+
nearest.push(std::make_pair(d, i));
|
|
67
|
+
nearest.pop();
|
|
68
|
+
}
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
bool is_full() const {
|
|
73
|
+
return full;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
DATA_t limit() const {
|
|
77
|
+
return nearest.top().first;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
template<typename DISTANCE_t>
|
|
81
|
+
std::vector<std::pair<INDEX_t, DISTANCE_t> > report() {
|
|
82
|
+
return harvest_queue<INDEX_t, DISTANCE_t>(nearest, check_self, self_index);
|
|
83
|
+
}
|
|
84
|
+
private:
|
|
85
|
+
int n_neighbors;
|
|
86
|
+
bool full = false;
|
|
87
|
+
bool check_self = false;
|
|
88
|
+
INDEX_t self_index = 0;
|
|
89
|
+
neighbor_queue<INDEX_t, DATA_t> nearest;
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
#endif
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
#ifndef KNNCOLLE_DISTANCES_HPP
|
|
2
|
+
#define KNNCOLLE_DISTANCES_HPP
|
|
3
|
+
#include <cmath>
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @file distances.hpp
|
|
7
|
+
*
|
|
8
|
+
* @brief Classes for distance calculations.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
namespace knncolle {
|
|
12
|
+
|
|
13
|
+
namespace distances {
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @brief Compute Euclidean distances between two input vectors.
|
|
17
|
+
*/
|
|
18
|
+
struct Euclidean {
|
|
19
|
+
/**
|
|
20
|
+
* @param x Pointer to the array containing the first vector.
|
|
21
|
+
* @param y Pointer to the array containing the second vector.
|
|
22
|
+
* @param n Length of both vectors.
|
|
23
|
+
*
|
|
24
|
+
* @tparam ITYPE Integer type for the vector length.
|
|
25
|
+
* @tparam DTYPE Floating point type for the output distance.
|
|
26
|
+
* @tparam XTYPE Floating point type for the first data vector.
|
|
27
|
+
* @tparam YTYPE Floating point type for the second data vector.
|
|
28
|
+
*
|
|
29
|
+
* @return The squared Euclidean distance between vectors.
|
|
30
|
+
*
|
|
31
|
+
* @note
|
|
32
|
+
* This should be passed through `normalize()` to obtain the actual Euclidean distance.
|
|
33
|
+
* We separate out these two steps to avoid the costly root operation when only the relative values are of interest.
|
|
34
|
+
*/
|
|
35
|
+
template<typename ITYPE = int, typename DTYPE = double, typename XTYPE = DTYPE, typename YTYPE = DTYPE>
|
|
36
|
+
static DTYPE raw_distance(const XTYPE* x, const YTYPE* y, ITYPE n) {
|
|
37
|
+
double output = 0;
|
|
38
|
+
for (ITYPE i = 0; i < n; ++i, ++x, ++y) {
|
|
39
|
+
output += ((*x) - (*y)) * ((*x) - (*y));
|
|
40
|
+
}
|
|
41
|
+
return output;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* @tparam DTYPE Floating point type for the distance.
|
|
46
|
+
*
|
|
47
|
+
* @param raw The value produced by `raw_distance()`.
|
|
48
|
+
*
|
|
49
|
+
* @return The square root of `raw`.
|
|
50
|
+
*/
|
|
51
|
+
template<typename DTYPE = double>
|
|
52
|
+
static DTYPE normalize(DTYPE raw) {
|
|
53
|
+
return std::sqrt(raw);
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* @brief Compute Manhattan distances between two input vectors.
|
|
59
|
+
*/
|
|
60
|
+
struct Manhattan {
|
|
61
|
+
/**
|
|
62
|
+
* @tparam ITYPE Integer type for the vector length.
|
|
63
|
+
* @tparam DTYPE Floating point type for the output distance.
|
|
64
|
+
* @tparam XTYPE Floating point type for the first data vector.
|
|
65
|
+
* @tparam YTYPE Floating point type for the second data vector.
|
|
66
|
+
*
|
|
67
|
+
* @param x Pointer to the array containing the first vector.
|
|
68
|
+
* @param y Pointer to the array containing the second vector.
|
|
69
|
+
* @param n Length of both vectors.
|
|
70
|
+
*
|
|
71
|
+
* @return The Manhattan distance between vectors.
|
|
72
|
+
*/
|
|
73
|
+
template<typename ITYPE = int, typename DTYPE = double, typename XTYPE = DTYPE, typename YTYPE = DTYPE>
|
|
74
|
+
static DTYPE raw_distance(const XTYPE* x, const YTYPE* y, ITYPE n) {
|
|
75
|
+
DTYPE output = 0;
|
|
76
|
+
for (ITYPE i = 0; i < n; ++i, ++x, ++y) {
|
|
77
|
+
output += std::abs(*x - *y);
|
|
78
|
+
}
|
|
79
|
+
return output;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* @tparam DTYPE Floating point type for the distance.
|
|
84
|
+
* @param raw The value produced by `raw_distance()`.
|
|
85
|
+
*
|
|
86
|
+
* @return `raw` with no modification.
|
|
87
|
+
*/
|
|
88
|
+
template<typename DTYPE = double>
|
|
89
|
+
static DTYPE normalize(DTYPE raw) {
|
|
90
|
+
return raw;
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
#endif
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
#ifndef KNNCOLLE_FIND_NEAREST_NEIGHBORS_HPP
|
|
2
|
+
#define KNNCOLLE_FIND_NEAREST_NEIGHBORS_HPP
|
|
3
|
+
|
|
4
|
+
#include <vector>
|
|
5
|
+
#include <utility>
|
|
6
|
+
#include <type_traits>
|
|
7
|
+
#include "Base.hpp"
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @file find_nearest_neighbors.hpp
|
|
11
|
+
*
|
|
12
|
+
* @brief Find nearest neighbors from an existing index.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
namespace knncolle {
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* List of nearest neighbors for multiple observations.
|
|
19
|
+
* Each entry corresponds to an observation and contains the nearest neighbors as (index, distance) pairs for that observation.
|
|
20
|
+
*
|
|
21
|
+
* @tparam INDEX_t Integer type for the indices.
|
|
22
|
+
* @tparam DISTANCE_t Floating point type for the distances.
|
|
23
|
+
*/
|
|
24
|
+
template<typename INDEX_t = int, typename DISTANCE_t = double>
|
|
25
|
+
using NeighborList = std::vector<std::vector<std::pair<INDEX_t, DISTANCE_t> > >;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Find the nearest neighbors within a pre-built index.
|
|
29
|
+
* This is a convenient wrapper around `Base::find_nearest_neighbors` that saves the caller the trouble of writing a loop.
|
|
30
|
+
*
|
|
31
|
+
* @tparam INDEX_t Integer type for the indices in the output object.
|
|
32
|
+
* @tparam DISTANCE_t Floating point type for the distances in the output object
|
|
33
|
+
* @tparam InputINDEX_t Integer type for the indices in the input index.
|
|
34
|
+
* @tparam InputDISTANCE_t Floating point type for the distances in the input index.
|
|
35
|
+
* @tparam QUERY_t Floating point type for the query data in the input index.
|
|
36
|
+
*
|
|
37
|
+
* @param ptr Pointer to a `Base` index.
|
|
38
|
+
* @param k Number of nearest neighbors.
|
|
39
|
+
*
|
|
40
|
+
* @return A `NeighborList` of length equal to the number of observations in `ptr->nobs()`.
|
|
41
|
+
* Each entry contains the `k` nearest neighbors for each observation, sorted by increasing distance.
|
|
42
|
+
*/
|
|
43
|
+
template<typename INDEX_t = int, typename DISTANCE_t = double, typename InputINDEX_t, typename InputDISTANCE_t, typename InputQUERY_t>
|
|
44
|
+
NeighborList<INDEX_t, DISTANCE_t> find_nearest_neighbors(const Base<InputINDEX_t, InputDISTANCE_t, InputQUERY_t>* ptr, int k) {
|
|
45
|
+
auto n = ptr->nobs();
|
|
46
|
+
NeighborList<INDEX_t, DISTANCE_t> output(n);
|
|
47
|
+
|
|
48
|
+
#ifndef KNNCOLLE_CUSTOM_PARALLEL
|
|
49
|
+
#pragma omp parallel for
|
|
50
|
+
for (size_t i = 0; i < n; ++i) {
|
|
51
|
+
#else
|
|
52
|
+
KNNCOLLE_CUSTOM_PARALLEL(n, [&](size_t first, size_t last) -> void {
|
|
53
|
+
for (size_t i = first; i < last; ++i) {
|
|
54
|
+
#endif
|
|
55
|
+
if constexpr(std::is_same<INDEX_t, InputINDEX_t>::value && std::is_same<DISTANCE_t, InputDISTANCE_t>::value) {
|
|
56
|
+
output[i] = ptr->find_nearest_neighbors(i, k);
|
|
57
|
+
} else {
|
|
58
|
+
auto current = ptr->find_nearest_neighbors(i, k);
|
|
59
|
+
for (const auto& x : current) {
|
|
60
|
+
output[i].emplace_back(x.first, x.second);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
#ifdef KNNCOLLE_CUSTOM_PARALLEL
|
|
65
|
+
});
|
|
66
|
+
#endif
|
|
67
|
+
|
|
68
|
+
return output;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Find the nearest neighbors within a pre-built search index.
|
|
73
|
+
* Here, only the neighbor indices are returned, not the distances.
|
|
74
|
+
*
|
|
75
|
+
* @tparam INDEX_t Integer type for the indices in the output object.
|
|
76
|
+
* @tparam InputINDEX_t Integer type for the indices in the input index.
|
|
77
|
+
* @tparam InputDISTANCE_t Floating point type for the distances in the input index.
|
|
78
|
+
* @tparam QUERY_t Floating point type for the query data in the input index.
|
|
79
|
+
*
|
|
80
|
+
* @param ptr Pointer to a `Base` index.
|
|
81
|
+
* @param k Number of nearest neighbors.
|
|
82
|
+
*
|
|
83
|
+
* @return A vector of vectors of length equal to the number of observations in `ptr->nobs()`.
|
|
84
|
+
* Each vector contains the indices of the `k` nearest neighbors for each observation, sorted by increasing distance.
|
|
85
|
+
*/
|
|
86
|
+
template<typename INDEX_t = int, typename InputINDEX_t, typename InputDISTANCE_t, typename InputQUERY_t>
|
|
87
|
+
std::vector<std::vector<INDEX_t> > find_nearest_neighbors_index_only(const Base<InputINDEX_t, InputDISTANCE_t, InputQUERY_t>* ptr, int k) {
|
|
88
|
+
auto n = ptr->nobs();
|
|
89
|
+
std::vector<std::vector<INDEX_t> > output(n);
|
|
90
|
+
|
|
91
|
+
#ifndef KNNCOLLE_CUSTOM_PARALLEL
|
|
92
|
+
#pragma omp parallel for
|
|
93
|
+
for (size_t i = 0; i < n; ++i) {
|
|
94
|
+
#else
|
|
95
|
+
KNNCOLLE_CUSTOM_PARALLEL(n, [&](size_t first, size_t last) -> void {
|
|
96
|
+
for (size_t i = first; i < last; ++i) {
|
|
97
|
+
#endif
|
|
98
|
+
auto current = ptr->find_nearest_neighbors(i, k);
|
|
99
|
+
for (const auto& x : current) {
|
|
100
|
+
output[i].push_back(x.first);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
#ifdef KNNCOLLE_CUSTOM_PARALLEL
|
|
104
|
+
});
|
|
105
|
+
#endif
|
|
106
|
+
|
|
107
|
+
return output;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
#endif
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
#ifndef POWERIT_POWERIT_HPP
|
|
2
|
+
#define POWERIT_POWERIT_HPP
|
|
3
|
+
|
|
4
|
+
#include <algorithm>
|
|
5
|
+
#include <numeric>
|
|
6
|
+
#include <vector>
|
|
7
|
+
#include <cmath>
|
|
8
|
+
#include "aarand/aarand.hpp"
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @file powerit.hpp
|
|
12
|
+
*
|
|
13
|
+
* @brief Implements some power iterations.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
namespace powerit {
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @brief Perform power iterations to find the first eigenvalue/vector.
|
|
20
|
+
*
|
|
21
|
+
* Pretty much as it says.
|
|
22
|
+
* Given a diagonalizable matrix, this will perform power iterations to find the first eigenvalue and vector.
|
|
23
|
+
* For example, we can apply this to a covariance matrix to obtain the first principal component.
|
|
24
|
+
*/
|
|
25
|
+
class PowerIterations {
|
|
26
|
+
public:
|
|
27
|
+
/**
|
|
28
|
+
* @brief Default parameter settings.
|
|
29
|
+
*/
|
|
30
|
+
struct Defaults {
|
|
31
|
+
/**
|
|
32
|
+
* See `set_iterations()` for details.
|
|
33
|
+
*/
|
|
34
|
+
static constexpr int iterations = 500;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* See `set_tolerance()` for details.
|
|
38
|
+
*/
|
|
39
|
+
static constexpr double tolerance = 0.000001;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* @param i Maximum number of iterations to perform.
|
|
44
|
+
* Note that the algorithm may converge before reaching this limit.
|
|
45
|
+
*
|
|
46
|
+
* @return A reference to this `PowerIterations` object.
|
|
47
|
+
*/
|
|
48
|
+
PowerIterations& set_iterations(int i = Defaults::iterations) {
|
|
49
|
+
iterations = i;
|
|
50
|
+
return *this;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* @param t Tolerance used to determine convergence.
|
|
55
|
+
* The error is defined as the L2 norm of the difference between eigenvectors at successive iterations;
|
|
56
|
+
* if this drops below `t`, we assume that the algorithm has converged.
|
|
57
|
+
*
|
|
58
|
+
* @return A reference to this `PowerIterations` object.
|
|
59
|
+
*/
|
|
60
|
+
PowerIterations& set_tolerance(double t = Defaults::tolerance) {
|
|
61
|
+
tolerance = t;
|
|
62
|
+
return *this;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
private:
|
|
66
|
+
int iterations = Defaults::iterations;
|
|
67
|
+
double tolerance = Defaults::tolerance;
|
|
68
|
+
|
|
69
|
+
template<typename Data>
|
|
70
|
+
static Data normalize(int ndim, Data* x) {
|
|
71
|
+
Data ss = 0;
|
|
72
|
+
for (int d = 0; d < ndim; ++d) {
|
|
73
|
+
ss += x[d] * x[d];
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (ss) {
|
|
77
|
+
ss = std::sqrt(ss);
|
|
78
|
+
for (int d = 0; d < ndim; ++d) {
|
|
79
|
+
x[d] /= ss;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return ss;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
public:
|
|
86
|
+
/**
|
|
87
|
+
* @tparam Data Floating-point type for the data.
|
|
88
|
+
* @tparam Engine Any C++11-compliant random number generator class.
|
|
89
|
+
*
|
|
90
|
+
* @param order Order of the square matrix.
|
|
91
|
+
* @param[in] x Pointer to an array containing an `order`-by-`order` diagonalizable matrix.
|
|
92
|
+
* This is assumed to be column-major.
|
|
93
|
+
* @param[out] output Pointer to an array of length `order`,
|
|
94
|
+
* to store the output eigenvector.
|
|
95
|
+
* @param eng Instance of the random number generator.
|
|
96
|
+
*
|
|
97
|
+
* @return Pair containing the eigenvalue (first) and the number of iterations required for convergence (second).
|
|
98
|
+
* The latter is set to -1 if convergence did not occur before the maximum number of iterations specified in `set_iterations()`.
|
|
99
|
+
*/
|
|
100
|
+
template<class Data, class Engine>
|
|
101
|
+
std::pair<Data, int> run(size_t order, const Data* x, Data* output, Engine& eng) {
|
|
102
|
+
// Defining a random starting vector.
|
|
103
|
+
while (1) {
|
|
104
|
+
for (int d = 0; d < order - 1; d += 2) {
|
|
105
|
+
auto sampled = aarand::standard_normal<Data>(eng);
|
|
106
|
+
output[d] = sampled.first;
|
|
107
|
+
output[d + 1] = sampled.second;
|
|
108
|
+
}
|
|
109
|
+
if (order % 2) {
|
|
110
|
+
output[order - 1] = aarand::standard_normal<Data>(eng).first;
|
|
111
|
+
}
|
|
112
|
+
if (normalize(order, output)) {
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
std::pair<Data, int> stats;
|
|
118
|
+
auto& l2 = stats.first;
|
|
119
|
+
stats.second = -1;
|
|
120
|
+
std::vector<Data> buffer(order);
|
|
121
|
+
|
|
122
|
+
// Applying power iterations.
|
|
123
|
+
for (int i = 0; i < iterations; ++i) {
|
|
124
|
+
for (size_t j = 0; j < order; ++j) {
|
|
125
|
+
// As the matrix is symmetric, we can use inner_product.
|
|
126
|
+
// This technically computes the transpose of the matrix
|
|
127
|
+
// with the vector, but it's all the same, so whatever.
|
|
128
|
+
buffer[j] = std::inner_product(output, output + order, x + j * order, static_cast<Data>(0.0));
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Normalizing the vector.
|
|
132
|
+
l2 = normalize(order, buffer.data());
|
|
133
|
+
|
|
134
|
+
// We want to know if SIGMA * output = lambda * output, i.e., l2 * buffer = lambda * output.
|
|
135
|
+
// If we use l2 as a working estimate for lambda, we're basically just testing the difference
|
|
136
|
+
// between buffer and output. We compute the error and compare this to the tolerance. No need
|
|
137
|
+
// to normalize as we've already implicitly done that.
|
|
138
|
+
Data err = 0;
|
|
139
|
+
for (size_t d = 0; d < order; ++d) {
|
|
140
|
+
Data diff = buffer[d] - output[d];
|
|
141
|
+
err += diff * diff;
|
|
142
|
+
}
|
|
143
|
+
if (std::sqrt(err) < tolerance) {
|
|
144
|
+
stats.second = i + 1;
|
|
145
|
+
break;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
std::copy(buffer.begin(), buffer.end(), output);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
return stats;
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
#endif
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
#ifndef UMAPPP_NEIGHBOR_LIST_HPP
|
|
2
|
+
#define UMAPPP_NEIGHBOR_LIST_HPP
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @file NeighborList.hpp
|
|
6
|
+
*
|
|
7
|
+
* @brief Defines the `NeighborList` typedef.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
namespace umappp {
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @brief Neighbor specification based on index and distance.
|
|
14
|
+
*
|
|
15
|
+
* @tparam Float Floating-point type.
|
|
16
|
+
*
|
|
17
|
+
* The index refers to the position of the neighboring observation in the dataset.
|
|
18
|
+
* The statistic can store some statistic related to the neighbor, e.g., distance or probabilities.
|
|
19
|
+
*/
|
|
20
|
+
template<typename Float = double>
|
|
21
|
+
using Neighbor = std::pair<int, Float>;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* @brief Lists of neighbors for each observation.
|
|
25
|
+
*
|
|
26
|
+
* @tparam Float Floating-point type.
|
|
27
|
+
*
|
|
28
|
+
* Each inner vector corresponds to an observation and contains the list of nearest neighbors for that observation.
|
|
29
|
+
* Neighbors for each observation should be unique - there should be no more than one occurrence of each index in each inner vector.
|
|
30
|
+
* Also, the inner vector for observation `i` should not contain any `Neighbor` with index `i`.
|
|
31
|
+
*/
|
|
32
|
+
template<typename Float = double>
|
|
33
|
+
using NeighborList = std::vector<std::vector<Neighbor<Float> > >;
|
|
34
|
+
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
#endif
|