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.
Files changed (395) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +25 -0
  3. data/README.md +110 -0
  4. data/ext/umappp/extconf.rb +25 -0
  5. data/ext/umappp/numo.hpp +867 -0
  6. data/ext/umappp/umappp.cpp +225 -0
  7. data/lib/umappp/version.rb +5 -0
  8. data/lib/umappp.rb +41 -0
  9. data/vendor/Eigen/Cholesky +45 -0
  10. data/vendor/Eigen/CholmodSupport +48 -0
  11. data/vendor/Eigen/Core +384 -0
  12. data/vendor/Eigen/Dense +7 -0
  13. data/vendor/Eigen/Eigen +2 -0
  14. data/vendor/Eigen/Eigenvalues +60 -0
  15. data/vendor/Eigen/Geometry +59 -0
  16. data/vendor/Eigen/Householder +29 -0
  17. data/vendor/Eigen/IterativeLinearSolvers +48 -0
  18. data/vendor/Eigen/Jacobi +32 -0
  19. data/vendor/Eigen/KLUSupport +41 -0
  20. data/vendor/Eigen/LU +47 -0
  21. data/vendor/Eigen/MetisSupport +35 -0
  22. data/vendor/Eigen/OrderingMethods +70 -0
  23. data/vendor/Eigen/PaStiXSupport +49 -0
  24. data/vendor/Eigen/PardisoSupport +35 -0
  25. data/vendor/Eigen/QR +50 -0
  26. data/vendor/Eigen/QtAlignedMalloc +39 -0
  27. data/vendor/Eigen/SPQRSupport +34 -0
  28. data/vendor/Eigen/SVD +50 -0
  29. data/vendor/Eigen/Sparse +34 -0
  30. data/vendor/Eigen/SparseCholesky +37 -0
  31. data/vendor/Eigen/SparseCore +69 -0
  32. data/vendor/Eigen/SparseLU +50 -0
  33. data/vendor/Eigen/SparseQR +36 -0
  34. data/vendor/Eigen/StdDeque +27 -0
  35. data/vendor/Eigen/StdList +26 -0
  36. data/vendor/Eigen/StdVector +27 -0
  37. data/vendor/Eigen/SuperLUSupport +64 -0
  38. data/vendor/Eigen/UmfPackSupport +40 -0
  39. data/vendor/Eigen/src/Cholesky/LDLT.h +688 -0
  40. data/vendor/Eigen/src/Cholesky/LLT.h +558 -0
  41. data/vendor/Eigen/src/Cholesky/LLT_LAPACKE.h +99 -0
  42. data/vendor/Eigen/src/CholmodSupport/CholmodSupport.h +682 -0
  43. data/vendor/Eigen/src/Core/ArithmeticSequence.h +413 -0
  44. data/vendor/Eigen/src/Core/Array.h +417 -0
  45. data/vendor/Eigen/src/Core/ArrayBase.h +226 -0
  46. data/vendor/Eigen/src/Core/ArrayWrapper.h +209 -0
  47. data/vendor/Eigen/src/Core/Assign.h +90 -0
  48. data/vendor/Eigen/src/Core/AssignEvaluator.h +1010 -0
  49. data/vendor/Eigen/src/Core/Assign_MKL.h +178 -0
  50. data/vendor/Eigen/src/Core/BandMatrix.h +353 -0
  51. data/vendor/Eigen/src/Core/Block.h +448 -0
  52. data/vendor/Eigen/src/Core/BooleanRedux.h +162 -0
  53. data/vendor/Eigen/src/Core/CommaInitializer.h +164 -0
  54. data/vendor/Eigen/src/Core/ConditionEstimator.h +175 -0
  55. data/vendor/Eigen/src/Core/CoreEvaluators.h +1741 -0
  56. data/vendor/Eigen/src/Core/CoreIterators.h +132 -0
  57. data/vendor/Eigen/src/Core/CwiseBinaryOp.h +183 -0
  58. data/vendor/Eigen/src/Core/CwiseNullaryOp.h +1001 -0
  59. data/vendor/Eigen/src/Core/CwiseTernaryOp.h +197 -0
  60. data/vendor/Eigen/src/Core/CwiseUnaryOp.h +103 -0
  61. data/vendor/Eigen/src/Core/CwiseUnaryView.h +132 -0
  62. data/vendor/Eigen/src/Core/DenseBase.h +701 -0
  63. data/vendor/Eigen/src/Core/DenseCoeffsBase.h +685 -0
  64. data/vendor/Eigen/src/Core/DenseStorage.h +652 -0
  65. data/vendor/Eigen/src/Core/Diagonal.h +258 -0
  66. data/vendor/Eigen/src/Core/DiagonalMatrix.h +391 -0
  67. data/vendor/Eigen/src/Core/DiagonalProduct.h +28 -0
  68. data/vendor/Eigen/src/Core/Dot.h +318 -0
  69. data/vendor/Eigen/src/Core/EigenBase.h +160 -0
  70. data/vendor/Eigen/src/Core/ForceAlignedAccess.h +150 -0
  71. data/vendor/Eigen/src/Core/Fuzzy.h +155 -0
  72. data/vendor/Eigen/src/Core/GeneralProduct.h +465 -0
  73. data/vendor/Eigen/src/Core/GenericPacketMath.h +1040 -0
  74. data/vendor/Eigen/src/Core/GlobalFunctions.h +194 -0
  75. data/vendor/Eigen/src/Core/IO.h +258 -0
  76. data/vendor/Eigen/src/Core/IndexedView.h +237 -0
  77. data/vendor/Eigen/src/Core/Inverse.h +117 -0
  78. data/vendor/Eigen/src/Core/Map.h +171 -0
  79. data/vendor/Eigen/src/Core/MapBase.h +310 -0
  80. data/vendor/Eigen/src/Core/MathFunctions.h +2057 -0
  81. data/vendor/Eigen/src/Core/MathFunctionsImpl.h +200 -0
  82. data/vendor/Eigen/src/Core/Matrix.h +565 -0
  83. data/vendor/Eigen/src/Core/MatrixBase.h +547 -0
  84. data/vendor/Eigen/src/Core/NestByValue.h +85 -0
  85. data/vendor/Eigen/src/Core/NoAlias.h +109 -0
  86. data/vendor/Eigen/src/Core/NumTraits.h +335 -0
  87. data/vendor/Eigen/src/Core/PartialReduxEvaluator.h +232 -0
  88. data/vendor/Eigen/src/Core/PermutationMatrix.h +605 -0
  89. data/vendor/Eigen/src/Core/PlainObjectBase.h +1128 -0
  90. data/vendor/Eigen/src/Core/Product.h +191 -0
  91. data/vendor/Eigen/src/Core/ProductEvaluators.h +1179 -0
  92. data/vendor/Eigen/src/Core/Random.h +218 -0
  93. data/vendor/Eigen/src/Core/Redux.h +515 -0
  94. data/vendor/Eigen/src/Core/Ref.h +381 -0
  95. data/vendor/Eigen/src/Core/Replicate.h +142 -0
  96. data/vendor/Eigen/src/Core/Reshaped.h +454 -0
  97. data/vendor/Eigen/src/Core/ReturnByValue.h +119 -0
  98. data/vendor/Eigen/src/Core/Reverse.h +217 -0
  99. data/vendor/Eigen/src/Core/Select.h +164 -0
  100. data/vendor/Eigen/src/Core/SelfAdjointView.h +365 -0
  101. data/vendor/Eigen/src/Core/SelfCwiseBinaryOp.h +47 -0
  102. data/vendor/Eigen/src/Core/Solve.h +188 -0
  103. data/vendor/Eigen/src/Core/SolveTriangular.h +235 -0
  104. data/vendor/Eigen/src/Core/SolverBase.h +168 -0
  105. data/vendor/Eigen/src/Core/StableNorm.h +251 -0
  106. data/vendor/Eigen/src/Core/StlIterators.h +463 -0
  107. data/vendor/Eigen/src/Core/Stride.h +116 -0
  108. data/vendor/Eigen/src/Core/Swap.h +68 -0
  109. data/vendor/Eigen/src/Core/Transpose.h +464 -0
  110. data/vendor/Eigen/src/Core/Transpositions.h +386 -0
  111. data/vendor/Eigen/src/Core/TriangularMatrix.h +1001 -0
  112. data/vendor/Eigen/src/Core/VectorBlock.h +96 -0
  113. data/vendor/Eigen/src/Core/VectorwiseOp.h +784 -0
  114. data/vendor/Eigen/src/Core/Visitor.h +381 -0
  115. data/vendor/Eigen/src/Core/arch/AVX/Complex.h +372 -0
  116. data/vendor/Eigen/src/Core/arch/AVX/MathFunctions.h +228 -0
  117. data/vendor/Eigen/src/Core/arch/AVX/PacketMath.h +1574 -0
  118. data/vendor/Eigen/src/Core/arch/AVX/TypeCasting.h +115 -0
  119. data/vendor/Eigen/src/Core/arch/AVX512/Complex.h +422 -0
  120. data/vendor/Eigen/src/Core/arch/AVX512/MathFunctions.h +362 -0
  121. data/vendor/Eigen/src/Core/arch/AVX512/PacketMath.h +2303 -0
  122. data/vendor/Eigen/src/Core/arch/AVX512/TypeCasting.h +89 -0
  123. data/vendor/Eigen/src/Core/arch/AltiVec/Complex.h +417 -0
  124. data/vendor/Eigen/src/Core/arch/AltiVec/MathFunctions.h +90 -0
  125. data/vendor/Eigen/src/Core/arch/AltiVec/MatrixProduct.h +2937 -0
  126. data/vendor/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h +221 -0
  127. data/vendor/Eigen/src/Core/arch/AltiVec/MatrixProductMMA.h +629 -0
  128. data/vendor/Eigen/src/Core/arch/AltiVec/PacketMath.h +2711 -0
  129. data/vendor/Eigen/src/Core/arch/CUDA/Complex.h +258 -0
  130. data/vendor/Eigen/src/Core/arch/Default/BFloat16.h +700 -0
  131. data/vendor/Eigen/src/Core/arch/Default/ConjHelper.h +117 -0
  132. data/vendor/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h +1649 -0
  133. data/vendor/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h +110 -0
  134. data/vendor/Eigen/src/Core/arch/Default/Half.h +942 -0
  135. data/vendor/Eigen/src/Core/arch/Default/Settings.h +49 -0
  136. data/vendor/Eigen/src/Core/arch/Default/TypeCasting.h +120 -0
  137. data/vendor/Eigen/src/Core/arch/GPU/MathFunctions.h +103 -0
  138. data/vendor/Eigen/src/Core/arch/GPU/PacketMath.h +1685 -0
  139. data/vendor/Eigen/src/Core/arch/GPU/TypeCasting.h +80 -0
  140. data/vendor/Eigen/src/Core/arch/HIP/hcc/math_constants.h +23 -0
  141. data/vendor/Eigen/src/Core/arch/MSA/Complex.h +648 -0
  142. data/vendor/Eigen/src/Core/arch/MSA/MathFunctions.h +387 -0
  143. data/vendor/Eigen/src/Core/arch/MSA/PacketMath.h +1233 -0
  144. data/vendor/Eigen/src/Core/arch/NEON/Complex.h +584 -0
  145. data/vendor/Eigen/src/Core/arch/NEON/GeneralBlockPanelKernel.h +183 -0
  146. data/vendor/Eigen/src/Core/arch/NEON/MathFunctions.h +75 -0
  147. data/vendor/Eigen/src/Core/arch/NEON/PacketMath.h +4587 -0
  148. data/vendor/Eigen/src/Core/arch/NEON/TypeCasting.h +1419 -0
  149. data/vendor/Eigen/src/Core/arch/SSE/Complex.h +351 -0
  150. data/vendor/Eigen/src/Core/arch/SSE/MathFunctions.h +199 -0
  151. data/vendor/Eigen/src/Core/arch/SSE/PacketMath.h +1505 -0
  152. data/vendor/Eigen/src/Core/arch/SSE/TypeCasting.h +142 -0
  153. data/vendor/Eigen/src/Core/arch/SVE/MathFunctions.h +44 -0
  154. data/vendor/Eigen/src/Core/arch/SVE/PacketMath.h +752 -0
  155. data/vendor/Eigen/src/Core/arch/SVE/TypeCasting.h +49 -0
  156. data/vendor/Eigen/src/Core/arch/SYCL/InteropHeaders.h +232 -0
  157. data/vendor/Eigen/src/Core/arch/SYCL/MathFunctions.h +301 -0
  158. data/vendor/Eigen/src/Core/arch/SYCL/PacketMath.h +670 -0
  159. data/vendor/Eigen/src/Core/arch/SYCL/SyclMemoryModel.h +694 -0
  160. data/vendor/Eigen/src/Core/arch/SYCL/TypeCasting.h +85 -0
  161. data/vendor/Eigen/src/Core/arch/ZVector/Complex.h +426 -0
  162. data/vendor/Eigen/src/Core/arch/ZVector/MathFunctions.h +233 -0
  163. data/vendor/Eigen/src/Core/arch/ZVector/PacketMath.h +1060 -0
  164. data/vendor/Eigen/src/Core/functors/AssignmentFunctors.h +177 -0
  165. data/vendor/Eigen/src/Core/functors/BinaryFunctors.h +541 -0
  166. data/vendor/Eigen/src/Core/functors/NullaryFunctors.h +189 -0
  167. data/vendor/Eigen/src/Core/functors/StlFunctors.h +166 -0
  168. data/vendor/Eigen/src/Core/functors/TernaryFunctors.h +25 -0
  169. data/vendor/Eigen/src/Core/functors/UnaryFunctors.h +1131 -0
  170. data/vendor/Eigen/src/Core/products/GeneralBlockPanelKernel.h +2645 -0
  171. data/vendor/Eigen/src/Core/products/GeneralMatrixMatrix.h +517 -0
  172. data/vendor/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +317 -0
  173. data/vendor/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h +145 -0
  174. data/vendor/Eigen/src/Core/products/GeneralMatrixMatrix_BLAS.h +124 -0
  175. data/vendor/Eigen/src/Core/products/GeneralMatrixVector.h +518 -0
  176. data/vendor/Eigen/src/Core/products/GeneralMatrixVector_BLAS.h +136 -0
  177. data/vendor/Eigen/src/Core/products/Parallelizer.h +180 -0
  178. data/vendor/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +544 -0
  179. data/vendor/Eigen/src/Core/products/SelfadjointMatrixMatrix_BLAS.h +295 -0
  180. data/vendor/Eigen/src/Core/products/SelfadjointMatrixVector.h +262 -0
  181. data/vendor/Eigen/src/Core/products/SelfadjointMatrixVector_BLAS.h +118 -0
  182. data/vendor/Eigen/src/Core/products/SelfadjointProduct.h +133 -0
  183. data/vendor/Eigen/src/Core/products/SelfadjointRank2Update.h +94 -0
  184. data/vendor/Eigen/src/Core/products/TriangularMatrixMatrix.h +472 -0
  185. data/vendor/Eigen/src/Core/products/TriangularMatrixMatrix_BLAS.h +317 -0
  186. data/vendor/Eigen/src/Core/products/TriangularMatrixVector.h +350 -0
  187. data/vendor/Eigen/src/Core/products/TriangularMatrixVector_BLAS.h +255 -0
  188. data/vendor/Eigen/src/Core/products/TriangularSolverMatrix.h +337 -0
  189. data/vendor/Eigen/src/Core/products/TriangularSolverMatrix_BLAS.h +167 -0
  190. data/vendor/Eigen/src/Core/products/TriangularSolverVector.h +148 -0
  191. data/vendor/Eigen/src/Core/util/BlasUtil.h +583 -0
  192. data/vendor/Eigen/src/Core/util/ConfigureVectorization.h +512 -0
  193. data/vendor/Eigen/src/Core/util/Constants.h +563 -0
  194. data/vendor/Eigen/src/Core/util/DisableStupidWarnings.h +106 -0
  195. data/vendor/Eigen/src/Core/util/ForwardDeclarations.h +322 -0
  196. data/vendor/Eigen/src/Core/util/IndexedViewHelper.h +186 -0
  197. data/vendor/Eigen/src/Core/util/IntegralConstant.h +272 -0
  198. data/vendor/Eigen/src/Core/util/MKL_support.h +137 -0
  199. data/vendor/Eigen/src/Core/util/Macros.h +1464 -0
  200. data/vendor/Eigen/src/Core/util/Memory.h +1163 -0
  201. data/vendor/Eigen/src/Core/util/Meta.h +812 -0
  202. data/vendor/Eigen/src/Core/util/NonMPL2.h +3 -0
  203. data/vendor/Eigen/src/Core/util/ReenableStupidWarnings.h +31 -0
  204. data/vendor/Eigen/src/Core/util/ReshapedHelper.h +51 -0
  205. data/vendor/Eigen/src/Core/util/StaticAssert.h +221 -0
  206. data/vendor/Eigen/src/Core/util/SymbolicIndex.h +293 -0
  207. data/vendor/Eigen/src/Core/util/XprHelper.h +856 -0
  208. data/vendor/Eigen/src/Eigenvalues/ComplexEigenSolver.h +346 -0
  209. data/vendor/Eigen/src/Eigenvalues/ComplexSchur.h +462 -0
  210. data/vendor/Eigen/src/Eigenvalues/ComplexSchur_LAPACKE.h +91 -0
  211. data/vendor/Eigen/src/Eigenvalues/EigenSolver.h +622 -0
  212. data/vendor/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h +418 -0
  213. data/vendor/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h +226 -0
  214. data/vendor/Eigen/src/Eigenvalues/HessenbergDecomposition.h +374 -0
  215. data/vendor/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h +158 -0
  216. data/vendor/Eigen/src/Eigenvalues/RealQZ.h +657 -0
  217. data/vendor/Eigen/src/Eigenvalues/RealSchur.h +558 -0
  218. data/vendor/Eigen/src/Eigenvalues/RealSchur_LAPACKE.h +77 -0
  219. data/vendor/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +904 -0
  220. data/vendor/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_LAPACKE.h +87 -0
  221. data/vendor/Eigen/src/Eigenvalues/Tridiagonalization.h +561 -0
  222. data/vendor/Eigen/src/Geometry/AlignedBox.h +486 -0
  223. data/vendor/Eigen/src/Geometry/AngleAxis.h +247 -0
  224. data/vendor/Eigen/src/Geometry/EulerAngles.h +114 -0
  225. data/vendor/Eigen/src/Geometry/Homogeneous.h +501 -0
  226. data/vendor/Eigen/src/Geometry/Hyperplane.h +282 -0
  227. data/vendor/Eigen/src/Geometry/OrthoMethods.h +235 -0
  228. data/vendor/Eigen/src/Geometry/ParametrizedLine.h +232 -0
  229. data/vendor/Eigen/src/Geometry/Quaternion.h +870 -0
  230. data/vendor/Eigen/src/Geometry/Rotation2D.h +199 -0
  231. data/vendor/Eigen/src/Geometry/RotationBase.h +206 -0
  232. data/vendor/Eigen/src/Geometry/Scaling.h +188 -0
  233. data/vendor/Eigen/src/Geometry/Transform.h +1563 -0
  234. data/vendor/Eigen/src/Geometry/Translation.h +202 -0
  235. data/vendor/Eigen/src/Geometry/Umeyama.h +166 -0
  236. data/vendor/Eigen/src/Geometry/arch/Geometry_SIMD.h +168 -0
  237. data/vendor/Eigen/src/Householder/BlockHouseholder.h +110 -0
  238. data/vendor/Eigen/src/Householder/Householder.h +176 -0
  239. data/vendor/Eigen/src/Householder/HouseholderSequence.h +545 -0
  240. data/vendor/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +226 -0
  241. data/vendor/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +212 -0
  242. data/vendor/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +229 -0
  243. data/vendor/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h +394 -0
  244. data/vendor/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h +453 -0
  245. data/vendor/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +444 -0
  246. data/vendor/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h +198 -0
  247. data/vendor/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h +117 -0
  248. data/vendor/Eigen/src/Jacobi/Jacobi.h +483 -0
  249. data/vendor/Eigen/src/KLUSupport/KLUSupport.h +358 -0
  250. data/vendor/Eigen/src/LU/Determinant.h +117 -0
  251. data/vendor/Eigen/src/LU/FullPivLU.h +877 -0
  252. data/vendor/Eigen/src/LU/InverseImpl.h +432 -0
  253. data/vendor/Eigen/src/LU/PartialPivLU.h +624 -0
  254. data/vendor/Eigen/src/LU/PartialPivLU_LAPACKE.h +83 -0
  255. data/vendor/Eigen/src/LU/arch/InverseSize4.h +351 -0
  256. data/vendor/Eigen/src/MetisSupport/MetisSupport.h +137 -0
  257. data/vendor/Eigen/src/OrderingMethods/Amd.h +435 -0
  258. data/vendor/Eigen/src/OrderingMethods/Eigen_Colamd.h +1863 -0
  259. data/vendor/Eigen/src/OrderingMethods/Ordering.h +153 -0
  260. data/vendor/Eigen/src/PaStiXSupport/PaStiXSupport.h +678 -0
  261. data/vendor/Eigen/src/PardisoSupport/PardisoSupport.h +545 -0
  262. data/vendor/Eigen/src/QR/ColPivHouseholderQR.h +674 -0
  263. data/vendor/Eigen/src/QR/ColPivHouseholderQR_LAPACKE.h +97 -0
  264. data/vendor/Eigen/src/QR/CompleteOrthogonalDecomposition.h +635 -0
  265. data/vendor/Eigen/src/QR/FullPivHouseholderQR.h +713 -0
  266. data/vendor/Eigen/src/QR/HouseholderQR.h +434 -0
  267. data/vendor/Eigen/src/QR/HouseholderQR_LAPACKE.h +68 -0
  268. data/vendor/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h +335 -0
  269. data/vendor/Eigen/src/SVD/BDCSVD.h +1366 -0
  270. data/vendor/Eigen/src/SVD/JacobiSVD.h +812 -0
  271. data/vendor/Eigen/src/SVD/JacobiSVD_LAPACKE.h +91 -0
  272. data/vendor/Eigen/src/SVD/SVDBase.h +376 -0
  273. data/vendor/Eigen/src/SVD/UpperBidiagonalization.h +414 -0
  274. data/vendor/Eigen/src/SparseCholesky/SimplicialCholesky.h +697 -0
  275. data/vendor/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h +174 -0
  276. data/vendor/Eigen/src/SparseCore/AmbiVector.h +378 -0
  277. data/vendor/Eigen/src/SparseCore/CompressedStorage.h +274 -0
  278. data/vendor/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h +352 -0
  279. data/vendor/Eigen/src/SparseCore/MappedSparseMatrix.h +67 -0
  280. data/vendor/Eigen/src/SparseCore/SparseAssign.h +270 -0
  281. data/vendor/Eigen/src/SparseCore/SparseBlock.h +571 -0
  282. data/vendor/Eigen/src/SparseCore/SparseColEtree.h +206 -0
  283. data/vendor/Eigen/src/SparseCore/SparseCompressedBase.h +370 -0
  284. data/vendor/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +722 -0
  285. data/vendor/Eigen/src/SparseCore/SparseCwiseUnaryOp.h +150 -0
  286. data/vendor/Eigen/src/SparseCore/SparseDenseProduct.h +342 -0
  287. data/vendor/Eigen/src/SparseCore/SparseDiagonalProduct.h +138 -0
  288. data/vendor/Eigen/src/SparseCore/SparseDot.h +98 -0
  289. data/vendor/Eigen/src/SparseCore/SparseFuzzy.h +29 -0
  290. data/vendor/Eigen/src/SparseCore/SparseMap.h +305 -0
  291. data/vendor/Eigen/src/SparseCore/SparseMatrix.h +1518 -0
  292. data/vendor/Eigen/src/SparseCore/SparseMatrixBase.h +398 -0
  293. data/vendor/Eigen/src/SparseCore/SparsePermutation.h +178 -0
  294. data/vendor/Eigen/src/SparseCore/SparseProduct.h +181 -0
  295. data/vendor/Eigen/src/SparseCore/SparseRedux.h +49 -0
  296. data/vendor/Eigen/src/SparseCore/SparseRef.h +397 -0
  297. data/vendor/Eigen/src/SparseCore/SparseSelfAdjointView.h +659 -0
  298. data/vendor/Eigen/src/SparseCore/SparseSolverBase.h +124 -0
  299. data/vendor/Eigen/src/SparseCore/SparseSparseProductWithPruning.h +198 -0
  300. data/vendor/Eigen/src/SparseCore/SparseTranspose.h +92 -0
  301. data/vendor/Eigen/src/SparseCore/SparseTriangularView.h +189 -0
  302. data/vendor/Eigen/src/SparseCore/SparseUtil.h +186 -0
  303. data/vendor/Eigen/src/SparseCore/SparseVector.h +478 -0
  304. data/vendor/Eigen/src/SparseCore/SparseView.h +254 -0
  305. data/vendor/Eigen/src/SparseCore/TriangularSolver.h +315 -0
  306. data/vendor/Eigen/src/SparseLU/SparseLU.h +923 -0
  307. data/vendor/Eigen/src/SparseLU/SparseLUImpl.h +66 -0
  308. data/vendor/Eigen/src/SparseLU/SparseLU_Memory.h +226 -0
  309. data/vendor/Eigen/src/SparseLU/SparseLU_Structs.h +110 -0
  310. data/vendor/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h +375 -0
  311. data/vendor/Eigen/src/SparseLU/SparseLU_Utils.h +80 -0
  312. data/vendor/Eigen/src/SparseLU/SparseLU_column_bmod.h +181 -0
  313. data/vendor/Eigen/src/SparseLU/SparseLU_column_dfs.h +179 -0
  314. data/vendor/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h +107 -0
  315. data/vendor/Eigen/src/SparseLU/SparseLU_gemm_kernel.h +280 -0
  316. data/vendor/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h +126 -0
  317. data/vendor/Eigen/src/SparseLU/SparseLU_kernel_bmod.h +130 -0
  318. data/vendor/Eigen/src/SparseLU/SparseLU_panel_bmod.h +223 -0
  319. data/vendor/Eigen/src/SparseLU/SparseLU_panel_dfs.h +258 -0
  320. data/vendor/Eigen/src/SparseLU/SparseLU_pivotL.h +137 -0
  321. data/vendor/Eigen/src/SparseLU/SparseLU_pruneL.h +136 -0
  322. data/vendor/Eigen/src/SparseLU/SparseLU_relax_snode.h +83 -0
  323. data/vendor/Eigen/src/SparseQR/SparseQR.h +758 -0
  324. data/vendor/Eigen/src/StlSupport/StdDeque.h +116 -0
  325. data/vendor/Eigen/src/StlSupport/StdList.h +106 -0
  326. data/vendor/Eigen/src/StlSupport/StdVector.h +131 -0
  327. data/vendor/Eigen/src/StlSupport/details.h +84 -0
  328. data/vendor/Eigen/src/SuperLUSupport/SuperLUSupport.h +1025 -0
  329. data/vendor/Eigen/src/UmfPackSupport/UmfPackSupport.h +642 -0
  330. data/vendor/Eigen/src/misc/Image.h +82 -0
  331. data/vendor/Eigen/src/misc/Kernel.h +79 -0
  332. data/vendor/Eigen/src/misc/RealSvd2x2.h +55 -0
  333. data/vendor/Eigen/src/misc/blas.h +440 -0
  334. data/vendor/Eigen/src/misc/lapack.h +152 -0
  335. data/vendor/Eigen/src/misc/lapacke.h +16292 -0
  336. data/vendor/Eigen/src/misc/lapacke_mangling.h +17 -0
  337. data/vendor/Eigen/src/plugins/ArrayCwiseBinaryOps.h +358 -0
  338. data/vendor/Eigen/src/plugins/ArrayCwiseUnaryOps.h +696 -0
  339. data/vendor/Eigen/src/plugins/BlockMethods.h +1442 -0
  340. data/vendor/Eigen/src/plugins/CommonCwiseBinaryOps.h +115 -0
  341. data/vendor/Eigen/src/plugins/CommonCwiseUnaryOps.h +177 -0
  342. data/vendor/Eigen/src/plugins/IndexedViewMethods.h +262 -0
  343. data/vendor/Eigen/src/plugins/MatrixCwiseBinaryOps.h +152 -0
  344. data/vendor/Eigen/src/plugins/MatrixCwiseUnaryOps.h +95 -0
  345. data/vendor/Eigen/src/plugins/ReshapedMethods.h +149 -0
  346. data/vendor/aarand/aarand.hpp +114 -0
  347. data/vendor/annoy/annoylib.h +1495 -0
  348. data/vendor/annoy/kissrandom.h +120 -0
  349. data/vendor/annoy/mman.h +242 -0
  350. data/vendor/hnswlib/bruteforce.h +152 -0
  351. data/vendor/hnswlib/hnswalg.h +1192 -0
  352. data/vendor/hnswlib/hnswlib.h +108 -0
  353. data/vendor/hnswlib/space_ip.h +282 -0
  354. data/vendor/hnswlib/space_l2.h +281 -0
  355. data/vendor/hnswlib/visited_list_pool.h +79 -0
  356. data/vendor/irlba/irlba.hpp +575 -0
  357. data/vendor/irlba/lanczos.hpp +212 -0
  358. data/vendor/irlba/parallel.hpp +474 -0
  359. data/vendor/irlba/utils.hpp +224 -0
  360. data/vendor/irlba/wrappers.hpp +228 -0
  361. data/vendor/kmeans/Base.hpp +75 -0
  362. data/vendor/kmeans/Details.hpp +79 -0
  363. data/vendor/kmeans/HartiganWong.hpp +492 -0
  364. data/vendor/kmeans/InitializeKmeansPP.hpp +144 -0
  365. data/vendor/kmeans/InitializeNone.hpp +44 -0
  366. data/vendor/kmeans/InitializePCAPartition.hpp +309 -0
  367. data/vendor/kmeans/InitializeRandom.hpp +91 -0
  368. data/vendor/kmeans/Kmeans.hpp +161 -0
  369. data/vendor/kmeans/Lloyd.hpp +134 -0
  370. data/vendor/kmeans/MiniBatch.hpp +269 -0
  371. data/vendor/kmeans/QuickSearch.hpp +179 -0
  372. data/vendor/kmeans/compute_centroids.hpp +32 -0
  373. data/vendor/kmeans/compute_wcss.hpp +27 -0
  374. data/vendor/kmeans/is_edge_case.hpp +42 -0
  375. data/vendor/kmeans/random.hpp +55 -0
  376. data/vendor/knncolle/Annoy/Annoy.hpp +193 -0
  377. data/vendor/knncolle/BruteForce/BruteForce.hpp +120 -0
  378. data/vendor/knncolle/Hnsw/Hnsw.hpp +225 -0
  379. data/vendor/knncolle/Kmknn/Kmknn.hpp +286 -0
  380. data/vendor/knncolle/VpTree/VpTree.hpp +256 -0
  381. data/vendor/knncolle/knncolle.hpp +34 -0
  382. data/vendor/knncolle/utils/Base.hpp +100 -0
  383. data/vendor/knncolle/utils/NeighborQueue.hpp +94 -0
  384. data/vendor/knncolle/utils/distances.hpp +98 -0
  385. data/vendor/knncolle/utils/find_nearest_neighbors.hpp +112 -0
  386. data/vendor/powerit/PowerIterations.hpp +157 -0
  387. data/vendor/umappp/NeighborList.hpp +37 -0
  388. data/vendor/umappp/Umap.hpp +662 -0
  389. data/vendor/umappp/combine_neighbor_sets.hpp +95 -0
  390. data/vendor/umappp/find_ab.hpp +157 -0
  391. data/vendor/umappp/neighbor_similarities.hpp +136 -0
  392. data/vendor/umappp/optimize_layout.hpp +285 -0
  393. data/vendor/umappp/spectral_init.hpp +181 -0
  394. data/vendor/umappp/umappp.hpp +13 -0
  395. metadata +465 -0
@@ -0,0 +1,79 @@
1
+ #pragma once
2
+
3
+ #include <mutex>
4
+ #include <string.h>
5
+ #include <deque>
6
+
7
+ namespace hnswlib {
8
+ typedef unsigned short int vl_type;
9
+
10
+ class VisitedList {
11
+ public:
12
+ vl_type curV;
13
+ vl_type *mass;
14
+ unsigned int numelements;
15
+
16
+ VisitedList(int numelements1) {
17
+ curV = -1;
18
+ numelements = numelements1;
19
+ mass = new vl_type[numelements];
20
+ }
21
+
22
+ void reset() {
23
+ curV++;
24
+ if (curV == 0) {
25
+ memset(mass, 0, sizeof(vl_type) * numelements);
26
+ curV++;
27
+ }
28
+ };
29
+
30
+ ~VisitedList() { delete[] mass; }
31
+ };
32
+ ///////////////////////////////////////////////////////////
33
+ //
34
+ // Class for multi-threaded pool-management of VisitedLists
35
+ //
36
+ /////////////////////////////////////////////////////////
37
+
38
+ class VisitedListPool {
39
+ std::deque<VisitedList *> pool;
40
+ std::mutex poolguard;
41
+ int numelements;
42
+
43
+ public:
44
+ VisitedListPool(int initmaxpools, int numelements1) {
45
+ numelements = numelements1;
46
+ for (int i = 0; i < initmaxpools; i++)
47
+ pool.push_front(new VisitedList(numelements));
48
+ }
49
+
50
+ VisitedList *getFreeVisitedList() {
51
+ VisitedList *rez;
52
+ {
53
+ std::unique_lock <std::mutex> lock(poolguard);
54
+ if (pool.size() > 0) {
55
+ rez = pool.front();
56
+ pool.pop_front();
57
+ } else {
58
+ rez = new VisitedList(numelements);
59
+ }
60
+ }
61
+ rez->reset();
62
+ return rez;
63
+ };
64
+
65
+ void releaseVisitedList(VisitedList *vl) {
66
+ std::unique_lock <std::mutex> lock(poolguard);
67
+ pool.push_front(vl);
68
+ };
69
+
70
+ ~VisitedListPool() {
71
+ while (pool.size()) {
72
+ VisitedList *rez = pool.front();
73
+ pool.pop_front();
74
+ delete rez;
75
+ }
76
+ };
77
+ };
78
+ }
79
+
@@ -0,0 +1,575 @@
1
+ #ifndef IRLBA_IRLBA_HPP
2
+ #define IRLBA_IRLBA_HPP
3
+
4
+ #include "Eigen/Dense"
5
+ #include "utils.hpp"
6
+ #include "lanczos.hpp"
7
+
8
+ #include <cmath>
9
+ #include <cstdint>
10
+ #include <random>
11
+ #include <stdexcept>
12
+
13
+ /**
14
+ * @file irlba.hpp
15
+ *
16
+ * @brief Implements the main user-visible class for running IRLBA.
17
+ */
18
+
19
+ namespace irlba {
20
+
21
+ /**
22
+ * @brief Run IRLBA on an input matrix.
23
+ *
24
+ * Implements the Implicitly Restarted Lanczos Bidiagonalization Algorithm (IRLBA) for fast truncated singular value decomposition.
25
+ * This is heavily derived from the C code in the [**irlba** package](https://github.com/bwlewis/irlba),
26
+ * with refactoring into C++ to use Eigen instead of LAPACK for much of the matrix algebra.
27
+ */
28
+ class Irlba {
29
+ public:
30
+ /**
31
+ * @brief Default parameter values.
32
+ */
33
+ struct Defaults {
34
+ /**
35
+ * See `set_number()` for more details.
36
+ */
37
+ static constexpr int number = 5;
38
+
39
+ /**
40
+ * See `set_work()` for more details.
41
+ */
42
+ static constexpr int extra_work = 7;
43
+
44
+ /**
45
+ * See `set_maxit()` for more details.
46
+ */
47
+ static constexpr int maxit = 1000;
48
+
49
+ /**
50
+ * See `set_seed()` for more details.
51
+ */
52
+ static constexpr uint64_t seed = std::mt19937_64::default_seed;
53
+ };
54
+ private:
55
+ LanczosBidiagonalization lp;
56
+
57
+ int number = Defaults::number;
58
+ int extra_work = Defaults::extra_work;
59
+ int maxit = Defaults::maxit;
60
+ uint64_t seed = Defaults::seed;
61
+
62
+ ConvergenceTest convtest;
63
+
64
+ public:
65
+ /**
66
+ * Specify the number of singular values/vectors to obtain.
67
+ * This should be less than the smaller dimension of the matrix supplied to `run()`.
68
+ *
69
+ * @param n Number of singular values/vectors of interest.
70
+ *
71
+ * @return A reference to the `Irlba` instance.
72
+ */
73
+ Irlba& set_number(int n = Defaults::number) {
74
+ number = n;
75
+ return *this;
76
+ }
77
+
78
+ /**
79
+ * Set the maximum number of restart iterations.
80
+ * In most cases, convergence will occur before reaching this limit.
81
+ *
82
+ * @param m Maximum number of iterations.
83
+ *
84
+ * @return A reference to the `Irlba` instance.
85
+ */
86
+ Irlba& set_maxit(int m = Defaults::maxit) {
87
+ maxit = m;
88
+ return *this;
89
+ }
90
+
91
+ /**
92
+ * Set the maximum number of restart iterations.
93
+ * In most cases, convergence will occur before reaching this limit.
94
+ *
95
+ * @param m Maximum number of iterations.
96
+ *
97
+ * @return A reference to the `Irlba` instance.
98
+ */
99
+ Irlba& set_seed(uint64_t s = Defaults::seed) {
100
+ seed = s;
101
+ return *this;
102
+ }
103
+
104
+ /**
105
+ * Set the number of extra dimensions to define the working subspace.
106
+ * Larger values can speed up convergence at the cost of more memory use.
107
+ *
108
+ * @param w Number of extra dimensions, added to the value specified in `set_number()` to obtain the working subspace dimension.
109
+ *
110
+ * @return A reference to the `Irlba` instance.
111
+ */
112
+ Irlba& set_work(int w = Defaults::extra_work) {
113
+ extra_work = w;
114
+ return *this;
115
+ }
116
+
117
+ /**
118
+ * See `LanczosBidiagonalization::set_epsilon()` for details.
119
+ *
120
+ * @param e Epsilon value.
121
+ *
122
+ * @return A reference to the `Irlba` instance.
123
+ */
124
+ Irlba& set_invariant_tolerance(double e = LanczosBidiagonalization::Defaults::epsilon) {
125
+ lp.set_epsilon(e);
126
+ return *this;
127
+ }
128
+
129
+ /**
130
+ * See `ConvergenceTest::set_tol()` for details.
131
+ *
132
+ * @param t Positive tolerance value.
133
+ *
134
+ * @return A reference to the `Irlba` instance.
135
+ */
136
+ Irlba& set_convergence_tolerance(double t = ConvergenceTest::Defaults::tol) {
137
+ convtest.set_tol(t);
138
+ return *this;
139
+ }
140
+
141
+ /**
142
+ * See `ConvergenceTest::set_svtol()` for details.
143
+ *
144
+ * @param t Positive tolerance value, or -1.
145
+ *
146
+ * @return A reference to the `Irlba` instance.
147
+ */
148
+ Irlba& set_singular_value_ratio_tolerance(double t = ConvergenceTest::Defaults::svtol) {
149
+ convtest.set_svtol(t);
150
+ return *this;
151
+ }
152
+
153
+ public:
154
+ /**
155
+ * Run IRLBA on an input matrix to perform an approximate SVD, with arbitrary centering and scaling operations.
156
+ *
157
+ * @tparam M Matrix class, typically from the **Eigen** matrix manipulation library.
158
+ * However, other classes are also supported, see the other `run()` methods for details.
159
+ * @tparam Engine A (pseudo-)random number generator class, returning a randomly sampled value when called as a functor with no arguments.
160
+ *
161
+ * @param[in] mat Input matrix.
162
+ * @param center Should the matrix be centered by column?
163
+ * @param scale Should the matrix be scaled to unit variance for each column?
164
+ * @param[out] outU Output matrix where columns contain the first left singular vectors.
165
+ * Dimensions are set automatically on output;
166
+ * the number of columns is defined by `set_number()` and the number of rows is equal to the number of rows in `mat`.
167
+ * @param[out] outV Output matrix where columns contain the first right singular vectors.
168
+ * Dimensions are set automatically on output;
169
+ * the number of columns is defined by `set_number()` and the number of rows is equal to the number of columns in `mat`.
170
+ * @param[out] outD Vector to store the first singular values.
171
+ * The length is set automatically as defined by `set_number()`.
172
+ * @param eng Pointer to an instance of a random number generator.
173
+ * If set to `NULL`, a Mersenne Twister is used internally with the seed defined by `set_seed()`.
174
+ * @param[in] init Pointer to a vector of length equal to the number of columns of `mat`,
175
+ * containing the initial values of the first right singular vector.
176
+ *
177
+ * @return A pair where the first entry indicates whether the algorithm converged,
178
+ * and the second entry indicates the number of restart iterations performed.
179
+ *
180
+ * Centering is performed by subtracting each element of `center` from the corresponding column of `mat`.
181
+ * Scaling is performed by dividing each column of `mat` by the corresponding element of `scale` (after any centering has been applied).
182
+ * Note that `scale=true` requires `center=true` to guarantee unit variance along each column.
183
+ * No scaling is performed when the variance of a column is zero, so as to avoid divide-by-zero errors.
184
+ */
185
+ template<class M, class Engine = std::mt19937_64>
186
+ std::pair<bool, int> run(
187
+ const M& mat,
188
+ bool center,
189
+ bool scale,
190
+ Eigen::MatrixXd& outU,
191
+ Eigen::MatrixXd& outV,
192
+ Eigen::VectorXd& outD,
193
+ Engine* eng = null_rng(),
194
+ Eigen::VectorXd* init = NULL)
195
+ const {
196
+ if (scale || center) {
197
+ Eigen::VectorXd center0, scale0;
198
+
199
+ if (center) {
200
+ if (mat.rows() < 1) {
201
+ throw std::runtime_error("cannot center with no observations");
202
+ }
203
+ center0.resize(mat.cols());
204
+ }
205
+
206
+ if (scale) {
207
+ if (mat.rows() < 2) {
208
+ throw std::runtime_error("cannot scale with fewer than two observations");
209
+ }
210
+ scale0.resize(mat.cols());
211
+ }
212
+
213
+ for (Eigen::Index i = 0; i < mat.cols(); ++i) {
214
+ double mean = 0;
215
+ if (center) {
216
+ mean = mat.col(i).sum() / mat.rows();
217
+ center0[i] = mean;
218
+ }
219
+ if (scale) {
220
+ Eigen::VectorXd current = mat.col(i); // force it to be a VectorXd, even if it's a sparse matrix.
221
+ double var = 0;
222
+ for (auto x : current) {
223
+ var += (x - mean)*(x - mean);
224
+ }
225
+
226
+ if (var) {
227
+ scale0[i] = std::sqrt(var/(mat.rows() - 1));
228
+ } else {
229
+ scale0[i] = 1;
230
+ }
231
+ }
232
+ }
233
+
234
+ if (center) {
235
+ Centered<M> centered(&mat, &center0);
236
+ if (scale) {
237
+ Scaled<decltype(centered)> centered_scaled(&centered, &scale0);
238
+ return run(centered_scaled, outU, outV, outD, eng, init);
239
+ } else {
240
+ return run(centered, outU, outV, outD, eng, init);
241
+ }
242
+ } else {
243
+ Scaled<M> scaled(&mat, &scale0);
244
+ return run(scaled, outU, outV, outD, eng, init);
245
+ }
246
+ } else {
247
+ return run(mat, outU, outV, outD, eng, init);
248
+ }
249
+ }
250
+
251
+ /**
252
+ * Run IRLBA on an input matrix to perform an approximate SVD.
253
+ *
254
+ * @tparam M Matrix class, most typically from the **Eigen** matrix manipulation library.
255
+ * However, custom classes are also supported, see below for details.
256
+ * @tparam Engine A (pseudo-)random number generator class, returning a randomly sampled value when called as a functor with no arguments.
257
+ *
258
+ * @param[in] mat Input matrix.
259
+ * @param[out] outU Output matrix where columns contain the first left singular vectors.
260
+ * Dimensions are set automatically on output;
261
+ * the number of columns is defined by `set_number()` and the number of rows is equal to the number of rows in `mat`.
262
+ * @param[out] outV Output matrix where columns contain the first right singular vectors.
263
+ * Dimensions are set automatically on output;
264
+ * the number of columns is defined by `set_number()` and the number of rows is equal to the number of columns in `mat`.
265
+ * @param[out] outD Vector to store the first singular values.
266
+ * The length is set automatically as defined by `set_number()`.
267
+ * @param eng Pointer to an instance of a random number generator.
268
+ * If set to `NULL`, a Mersenne Twister is used internally with the seed defined by `set_seed()`.
269
+ * @param[in] init Pointer to a vector of length equal to the number of columns of `mat`,
270
+ * containing the initial values of the first right singular vector.
271
+ *
272
+ * @return A pair where the first entry indicates whether the algorithm converged,
273
+ * and the second entry indicates the number of restart iterations performed.
274
+ *
275
+ * Custom classes can be used to define modified matrices that cannot be efficiently realized into the standard **Eigen** classes.
276
+ * We expect:
277
+ * - A `rows()` method that returns the number of rows.
278
+ * - A `cols()` method that returns the number of columns.
279
+ * - One of the following for matrix-vector multiplication:
280
+ * - `multiply(rhs, out)`, which should compute the product of the matrix with `rhs`, a `Eigen::VectorXd`-equivalent of length equal to the number of columns;
281
+ * and stores the result in `out`, an `Eigen::VectorXd` of length equal to the number of rows.
282
+ * - A `*` method where the right-hand side is an `Eigen::VectorXd` (or equivalent expression) of length equal to the number of columsn,
283
+ * and returns an `Eigen::VectorXd`-equivalent of length equal to the number of rows.
284
+ * - One of the following for matrix transpose-vector multiplication:
285
+ * - `adjoint_multiply(rhs, out)`, which should compute the product of the matrix transpose with `rhs`, a `Eigen::VectorXd`-equivalent of length equal to the number of rows;
286
+ * and stores the result in `out`, an `Eigen::VectorXd` of length equal to the number of columns.
287
+ * - An `adjoint()` method that returns an instance of any class that has a `*` method for matrix-vector multiplication.
288
+ * The method should accept an `Eigen::VectorXd`-equivalent of length equal to the number of rows,
289
+ * and return an `Eigen::VectorXd`-equvialent of length equal to the number of columns.
290
+ * - A `realize()` method that returns an `Eigen::MatrixXd` object representing the modified matrix.
291
+ * This can be omitted if an `Eigen::MatrixXd` can be copy-constructed from the class.
292
+ *
293
+ * See the `Centered` and `Scaled` classes for more details.
294
+ *
295
+ * If the smallest dimension of `mat` is below 6, this method falls back to performing an exact SVD.
296
+ */
297
+ template<class Matrix, class Engine = std::mt19937_64>
298
+ std::pair<bool, int> run(
299
+ const Matrix& mat,
300
+ Eigen::MatrixXd& outU,
301
+ Eigen::MatrixXd& outV,
302
+ Eigen::VectorXd& outD,
303
+ Engine* eng = null_rng(),
304
+ Eigen::VectorXd* init = NULL)
305
+ const {
306
+ if (eng == NULL) {
307
+ std::mt19937_64 rng(seed);
308
+ return run_internal(mat, rng, outU, outV, outD, init);
309
+ } else {
310
+ return run_internal(mat, *eng, outU, outV, outD, init);
311
+ }
312
+ }
313
+
314
+ private:
315
+ template<class M, class Engine>
316
+ std::pair<bool, int> run_internal(
317
+ const M& mat,
318
+ Engine& eng,
319
+ Eigen::MatrixXd& outU,
320
+ Eigen::MatrixXd& outV,
321
+ Eigen::VectorXd& outD,
322
+ Eigen::VectorXd* init)
323
+ const {
324
+ const int smaller = std::min(mat.rows(), mat.cols());
325
+ if (number >= smaller) {
326
+ throw std::runtime_error("requested number of singular values must be less than smaller matrix dimension");
327
+ }
328
+
329
+ // Falling back to an exact SVD for small matrices.
330
+ if (smaller < 6) {
331
+ exact(mat, outU, outV, outD);
332
+ return std::make_pair(true, 0);
333
+ }
334
+
335
+ const int work = std::min(number + extra_work, smaller);
336
+
337
+ Eigen::MatrixXd V(mat.cols(), work);
338
+ if (init) {
339
+ if (init->size() != V.rows()) {
340
+ throw std::runtime_error("initialization vector does not have expected number of rows");
341
+ }
342
+ V.col(0) = *init;
343
+ } else {
344
+ fill_with_random_normals(V, 0, eng);
345
+ }
346
+ V.col(0) /= V.col(0).norm();
347
+
348
+ bool converged = false;
349
+ int iter = 0, k =0;
350
+ Eigen::JacobiSVD<Eigen::MatrixXd> svd(work, work, Eigen::ComputeThinU | Eigen::ComputeThinV);
351
+
352
+ auto lptmp = lp.initialize(mat);
353
+
354
+ Eigen::MatrixXd W(mat.rows(), work);
355
+ Eigen::MatrixXd Wtmp(mat.rows(), work);
356
+ Eigen::MatrixXd Vtmp(mat.cols(), work);
357
+
358
+ Eigen::MatrixXd B(work, work);
359
+ B.setZero(work, work);
360
+ Eigen::VectorXd res(work);
361
+ Eigen::VectorXd F(mat.cols());
362
+
363
+ Eigen::VectorXd prevS(work);
364
+
365
+ for (; iter < maxit; ++iter) {
366
+ // Technically, this is only a 'true' Lanczos bidiagonalization
367
+ // when k = 0. All other times, we're just recycling the machinery,
368
+ // see the text below Equation 3.11 in Baglama and Reichel.
369
+ lp.run(mat, W, V, B, eng, lptmp, k);
370
+
371
+ // if (iter < 2) {
372
+ // std::cout << "B is currently:\n" << B << std::endl;
373
+ // std::cout << "W is currently:\n" << W << std::endl;
374
+ // std::cout << "V is currently:\n" << V << std::endl;
375
+ // }
376
+
377
+ svd.compute(B);
378
+ const auto& BS = svd.singularValues();
379
+ const auto& BU = svd.matrixU();
380
+ const auto& BV = svd.matrixV();
381
+
382
+ // Checking for convergence.
383
+ if (B(work-1, work-1) == 0) { // a.k.a. the final value of 'S' from the Lanczos iterations.
384
+ converged = true;
385
+ break;
386
+ }
387
+
388
+ F = lptmp.residuals();
389
+ double R_F = F.norm();
390
+ F /= R_F;
391
+
392
+ // Computes the convergence criterion defined in on the LHS of Equation 2.13 of Baglama and Riechel.
393
+ // We expose it here as we will be re-using the same values to update B, see below.
394
+ res = R_F * BU.row(work - 1);
395
+
396
+ int n_converged = 0;
397
+ if (iter > 0) {
398
+ n_converged = convtest.run(BS, res, prevS);
399
+ if (n_converged >= number) {
400
+ converged = true;
401
+ break;
402
+ }
403
+ }
404
+ prevS = BS;
405
+
406
+ // Setting 'k'. This looks kinda weird, but this is deliberate,
407
+ // see the text below Algorithm 3.1 of Baglama and Reichel.
408
+ if (n_converged + number > k) {
409
+ k = n_converged + number;
410
+ }
411
+ if (k > work - 3) {
412
+ k = work - 3;
413
+ }
414
+ if (k < 1) {
415
+ k = 1;
416
+ }
417
+
418
+ // Updating B, W and V.
419
+ Vtmp.leftCols(k).noalias() = V * BV.leftCols(k);
420
+ V.leftCols(k) = Vtmp.leftCols(k);
421
+
422
+ V.col(k) = F; // See Equation 3.2 of Baglama and Reichel, where our 'V' is
423
+ // their 'P', and our 'F' is their 'p_{m+1}' (2.2).
424
+ // 'F' was orthogonal to the old 'V' and it so it
425
+ // should still be orthogonal to the new left-most
426
+ // columns of 'V'; the input expectations of 'lp'
427
+ // are still met.
428
+
429
+ Wtmp.leftCols(k).noalias() = W * BU.leftCols(k);
430
+ W.leftCols(k) = Wtmp.leftCols(k);
431
+
432
+ B.setZero(work, work);
433
+ for (int l = 0; l < k; ++l) {
434
+ B(l, l) = BS[l];
435
+ B(l, k) = res[l]; // this looks weird but is deliberate, see
436
+ // Equation 3.6 of Baglama and Reichel.
437
+ // By happy coincidence, this is the same
438
+ // value used to determine convergence in
439
+ // 2.13, so we can just re-use it.
440
+ }
441
+ }
442
+
443
+ // See Equation 2.11 of Baglama and Reichel for how to get from B's
444
+ // singular triplets to mat's singular triplets.
445
+ outD.resize(number);
446
+ outD = svd.singularValues().head(number);
447
+
448
+ outU.resize(mat.rows(), number);
449
+ outU.noalias() = W * svd.matrixU().leftCols(number);
450
+
451
+ outV.resize(mat.cols(), number);
452
+ outV.noalias() = V * svd.matrixV().leftCols(number);
453
+
454
+ return std::make_pair(converged, iter + 1);
455
+ }
456
+
457
+ private:
458
+ template<class M>
459
+ void exact(const M& mat, Eigen::MatrixXd& outU, Eigen::MatrixXd& outV, Eigen::VectorXd& outD) const {
460
+ Eigen::BDCSVD<Eigen::MatrixXd> svd(mat.rows(), mat.cols(), Eigen::ComputeThinU | Eigen::ComputeThinV);
461
+
462
+ if constexpr(std::is_same<M, Eigen::MatrixXd>::value) {
463
+ svd.compute(mat);
464
+ } else {
465
+ if constexpr(has_realize_method<M>::value) {
466
+ Eigen::MatrixXd adjusted = mat.realize();
467
+ svd.compute(adjusted);
468
+ } else {
469
+ Eigen::MatrixXd adjusted(mat);
470
+ svd.compute(adjusted);
471
+ }
472
+ }
473
+
474
+ outD.resize(number);
475
+ outD = svd.singularValues().head(number);
476
+
477
+ outU.resize(mat.rows(), number);
478
+ outU = svd.matrixU().leftCols(number);
479
+
480
+ outV.resize(mat.cols(), number);
481
+ outV = svd.matrixV().leftCols(number);
482
+
483
+ return;
484
+ }
485
+
486
+ public:
487
+ /**
488
+ * Result of the IRLBA-based decomposition.
489
+ */
490
+ struct Results {
491
+ /**
492
+ * The left singular vectors, stored as columns of `U`.
493
+ * The number of rows in `U` is equal to the number of rows in the input matrix,
494
+ * and the number of columns is equal to the number of requested vectors.
495
+ */
496
+ Eigen::MatrixXd U;
497
+
498
+ /**
499
+ * The right singular vectors, stored as columns of `U`.
500
+ * The number of rows in `U` is equal to the number of columns in the input matrix,
501
+ * and the number of columns is equal to the number of requested vectors.
502
+ */
503
+ Eigen::MatrixXd V;
504
+
505
+ /**
506
+ * The requested number of singular values, ordered by decreasing value.
507
+ * These correspond to the vectors in `U` and `V`.
508
+ */
509
+ Eigen::VectorXd D;
510
+
511
+ /**
512
+ * Whether the algorithm converged.
513
+ */
514
+ int iterations;
515
+
516
+ /**
517
+ * The number of restart iterations performed.
518
+ */
519
+ bool converged;
520
+ };
521
+
522
+ /**
523
+ * Run IRLBA on an input matrix to perform an approximate SVD with centering and scaling.
524
+ *
525
+ * @tparam M Matrix class, most typically from the **Eigen** matrix manipulation library.
526
+ * However, other classes are also supported, see the other `run()` methods for details.
527
+ * @tparam Engine A (pseudo-)random number generator class, returning a randomly sampled value when called as a functor with no arguments.
528
+ *
529
+ * @param[in] mat Input matrix.
530
+ * @param center Should the matrix be centered by column?
531
+ * @param scale Should the matrix be scaled to unit variance for each column?
532
+ * @param eng Pointer to an instance of a random number generator.
533
+ * If set to `NULL`, a Mersenne Twister is used internally with the seed defined by `set_seed()`.
534
+ * @param[in] init Pointer to a vector of length equal to the number of columns of `mat`,
535
+ * containing the initial values of the first right singular vector.
536
+ *
537
+ * @return A `Results` object containing the singular vectors and values, as well as some statistics on convergence.
538
+ */
539
+ template<class M, class Engine = std::mt19937_64>
540
+ Results run(const M& mat, bool center, bool scale, Engine* eng = null_rng(), Eigen::VectorXd* init = NULL) const {
541
+ Results output;
542
+ auto stats = run(mat, center, scale, output.U, output.V, output.D, eng, init);
543
+ output.converged = stats.first;
544
+ output.iterations = stats.second;
545
+ return output;
546
+ }
547
+
548
+ /**
549
+ * Run IRLBA on an input matrix to perform an approximate SVD, see the `run()` method for more details.
550
+ *
551
+ * @tparam M Matrix class, most typically from the **Eigen** matrix manipulation library.
552
+ * However, other classes are also supported, see the other `run()` methods for details.
553
+ * @tparam Engine A (pseudo-)random number generator class, returning a randomly sampled value when called as a functor with no arguments.
554
+ *
555
+ * @param[in] mat Input matrix.
556
+ * @param eng Pointer to an instance of a random number generator.
557
+ * If set to `NULL`, a Mersenne Twister is used internally with the seed defined by `set_seed()`.
558
+ * @param[in] init Pointer to a vector of length equal to the number of columns of `mat`,
559
+ * containing the initial values of the first right singular vector.
560
+ *
561
+ * @return A `Results` object containing the singular vectors and values, as well as some statistics on convergence.
562
+ */
563
+ template<class M, class Engine = std::mt19937_64>
564
+ Results run(const M& mat, Engine* eng = null_rng(), Eigen::VectorXd* init = NULL) const {
565
+ Results output;
566
+ auto stats = run(mat, output.U, output.V, output.D, eng, init);
567
+ output.converged = stats.first;
568
+ output.iterations = stats.second;
569
+ return output;
570
+ }
571
+ };
572
+
573
+ }
574
+
575
+ #endif