tomoto 0.1.0

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 (420) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +3 -0
  3. data/LICENSE.txt +22 -0
  4. data/README.md +123 -0
  5. data/ext/tomoto/ext.cpp +245 -0
  6. data/ext/tomoto/extconf.rb +28 -0
  7. data/lib/tomoto.rb +12 -0
  8. data/lib/tomoto/ct.rb +11 -0
  9. data/lib/tomoto/hdp.rb +11 -0
  10. data/lib/tomoto/lda.rb +67 -0
  11. data/lib/tomoto/version.rb +3 -0
  12. data/vendor/EigenRand/EigenRand/Core.h +1139 -0
  13. data/vendor/EigenRand/EigenRand/Dists/Basic.h +111 -0
  14. data/vendor/EigenRand/EigenRand/Dists/Discrete.h +877 -0
  15. data/vendor/EigenRand/EigenRand/Dists/GammaPoisson.h +108 -0
  16. data/vendor/EigenRand/EigenRand/Dists/NormalExp.h +626 -0
  17. data/vendor/EigenRand/EigenRand/EigenRand +19 -0
  18. data/vendor/EigenRand/EigenRand/Macro.h +24 -0
  19. data/vendor/EigenRand/EigenRand/MorePacketMath.h +978 -0
  20. data/vendor/EigenRand/EigenRand/PacketFilter.h +286 -0
  21. data/vendor/EigenRand/EigenRand/PacketRandomEngine.h +624 -0
  22. data/vendor/EigenRand/EigenRand/RandUtils.h +413 -0
  23. data/vendor/EigenRand/EigenRand/doc.h +220 -0
  24. data/vendor/EigenRand/LICENSE +21 -0
  25. data/vendor/EigenRand/README.md +288 -0
  26. data/vendor/eigen/COPYING.BSD +26 -0
  27. data/vendor/eigen/COPYING.GPL +674 -0
  28. data/vendor/eigen/COPYING.LGPL +502 -0
  29. data/vendor/eigen/COPYING.MINPACK +52 -0
  30. data/vendor/eigen/COPYING.MPL2 +373 -0
  31. data/vendor/eigen/COPYING.README +18 -0
  32. data/vendor/eigen/Eigen/CMakeLists.txt +19 -0
  33. data/vendor/eigen/Eigen/Cholesky +46 -0
  34. data/vendor/eigen/Eigen/CholmodSupport +48 -0
  35. data/vendor/eigen/Eigen/Core +537 -0
  36. data/vendor/eigen/Eigen/Dense +7 -0
  37. data/vendor/eigen/Eigen/Eigen +2 -0
  38. data/vendor/eigen/Eigen/Eigenvalues +61 -0
  39. data/vendor/eigen/Eigen/Geometry +62 -0
  40. data/vendor/eigen/Eigen/Householder +30 -0
  41. data/vendor/eigen/Eigen/IterativeLinearSolvers +48 -0
  42. data/vendor/eigen/Eigen/Jacobi +33 -0
  43. data/vendor/eigen/Eigen/LU +50 -0
  44. data/vendor/eigen/Eigen/MetisSupport +35 -0
  45. data/vendor/eigen/Eigen/OrderingMethods +73 -0
  46. data/vendor/eigen/Eigen/PaStiXSupport +48 -0
  47. data/vendor/eigen/Eigen/PardisoSupport +35 -0
  48. data/vendor/eigen/Eigen/QR +51 -0
  49. data/vendor/eigen/Eigen/QtAlignedMalloc +40 -0
  50. data/vendor/eigen/Eigen/SPQRSupport +34 -0
  51. data/vendor/eigen/Eigen/SVD +51 -0
  52. data/vendor/eigen/Eigen/Sparse +36 -0
  53. data/vendor/eigen/Eigen/SparseCholesky +45 -0
  54. data/vendor/eigen/Eigen/SparseCore +69 -0
  55. data/vendor/eigen/Eigen/SparseLU +46 -0
  56. data/vendor/eigen/Eigen/SparseQR +37 -0
  57. data/vendor/eigen/Eigen/StdDeque +27 -0
  58. data/vendor/eigen/Eigen/StdList +26 -0
  59. data/vendor/eigen/Eigen/StdVector +27 -0
  60. data/vendor/eigen/Eigen/SuperLUSupport +64 -0
  61. data/vendor/eigen/Eigen/UmfPackSupport +40 -0
  62. data/vendor/eigen/Eigen/src/Cholesky/LDLT.h +673 -0
  63. data/vendor/eigen/Eigen/src/Cholesky/LLT.h +542 -0
  64. data/vendor/eigen/Eigen/src/Cholesky/LLT_LAPACKE.h +99 -0
  65. data/vendor/eigen/Eigen/src/CholmodSupport/CholmodSupport.h +639 -0
  66. data/vendor/eigen/Eigen/src/Core/Array.h +329 -0
  67. data/vendor/eigen/Eigen/src/Core/ArrayBase.h +226 -0
  68. data/vendor/eigen/Eigen/src/Core/ArrayWrapper.h +209 -0
  69. data/vendor/eigen/Eigen/src/Core/Assign.h +90 -0
  70. data/vendor/eigen/Eigen/src/Core/AssignEvaluator.h +935 -0
  71. data/vendor/eigen/Eigen/src/Core/Assign_MKL.h +178 -0
  72. data/vendor/eigen/Eigen/src/Core/BandMatrix.h +353 -0
  73. data/vendor/eigen/Eigen/src/Core/Block.h +452 -0
  74. data/vendor/eigen/Eigen/src/Core/BooleanRedux.h +164 -0
  75. data/vendor/eigen/Eigen/src/Core/CommaInitializer.h +160 -0
  76. data/vendor/eigen/Eigen/src/Core/ConditionEstimator.h +175 -0
  77. data/vendor/eigen/Eigen/src/Core/CoreEvaluators.h +1688 -0
  78. data/vendor/eigen/Eigen/src/Core/CoreIterators.h +127 -0
  79. data/vendor/eigen/Eigen/src/Core/CwiseBinaryOp.h +184 -0
  80. data/vendor/eigen/Eigen/src/Core/CwiseNullaryOp.h +866 -0
  81. data/vendor/eigen/Eigen/src/Core/CwiseTernaryOp.h +197 -0
  82. data/vendor/eigen/Eigen/src/Core/CwiseUnaryOp.h +103 -0
  83. data/vendor/eigen/Eigen/src/Core/CwiseUnaryView.h +128 -0
  84. data/vendor/eigen/Eigen/src/Core/DenseBase.h +611 -0
  85. data/vendor/eigen/Eigen/src/Core/DenseCoeffsBase.h +681 -0
  86. data/vendor/eigen/Eigen/src/Core/DenseStorage.h +570 -0
  87. data/vendor/eigen/Eigen/src/Core/Diagonal.h +260 -0
  88. data/vendor/eigen/Eigen/src/Core/DiagonalMatrix.h +343 -0
  89. data/vendor/eigen/Eigen/src/Core/DiagonalProduct.h +28 -0
  90. data/vendor/eigen/Eigen/src/Core/Dot.h +318 -0
  91. data/vendor/eigen/Eigen/src/Core/EigenBase.h +159 -0
  92. data/vendor/eigen/Eigen/src/Core/ForceAlignedAccess.h +146 -0
  93. data/vendor/eigen/Eigen/src/Core/Fuzzy.h +155 -0
  94. data/vendor/eigen/Eigen/src/Core/GeneralProduct.h +455 -0
  95. data/vendor/eigen/Eigen/src/Core/GenericPacketMath.h +593 -0
  96. data/vendor/eigen/Eigen/src/Core/GlobalFunctions.h +187 -0
  97. data/vendor/eigen/Eigen/src/Core/IO.h +225 -0
  98. data/vendor/eigen/Eigen/src/Core/Inverse.h +118 -0
  99. data/vendor/eigen/Eigen/src/Core/Map.h +171 -0
  100. data/vendor/eigen/Eigen/src/Core/MapBase.h +303 -0
  101. data/vendor/eigen/Eigen/src/Core/MathFunctions.h +1415 -0
  102. data/vendor/eigen/Eigen/src/Core/MathFunctionsImpl.h +101 -0
  103. data/vendor/eigen/Eigen/src/Core/Matrix.h +459 -0
  104. data/vendor/eigen/Eigen/src/Core/MatrixBase.h +529 -0
  105. data/vendor/eigen/Eigen/src/Core/NestByValue.h +110 -0
  106. data/vendor/eigen/Eigen/src/Core/NoAlias.h +108 -0
  107. data/vendor/eigen/Eigen/src/Core/NumTraits.h +248 -0
  108. data/vendor/eigen/Eigen/src/Core/PermutationMatrix.h +633 -0
  109. data/vendor/eigen/Eigen/src/Core/PlainObjectBase.h +1035 -0
  110. data/vendor/eigen/Eigen/src/Core/Product.h +186 -0
  111. data/vendor/eigen/Eigen/src/Core/ProductEvaluators.h +1112 -0
  112. data/vendor/eigen/Eigen/src/Core/Random.h +182 -0
  113. data/vendor/eigen/Eigen/src/Core/Redux.h +505 -0
  114. data/vendor/eigen/Eigen/src/Core/Ref.h +283 -0
  115. data/vendor/eigen/Eigen/src/Core/Replicate.h +142 -0
  116. data/vendor/eigen/Eigen/src/Core/ReturnByValue.h +117 -0
  117. data/vendor/eigen/Eigen/src/Core/Reverse.h +211 -0
  118. data/vendor/eigen/Eigen/src/Core/Select.h +162 -0
  119. data/vendor/eigen/Eigen/src/Core/SelfAdjointView.h +352 -0
  120. data/vendor/eigen/Eigen/src/Core/SelfCwiseBinaryOp.h +47 -0
  121. data/vendor/eigen/Eigen/src/Core/Solve.h +188 -0
  122. data/vendor/eigen/Eigen/src/Core/SolveTriangular.h +235 -0
  123. data/vendor/eigen/Eigen/src/Core/SolverBase.h +130 -0
  124. data/vendor/eigen/Eigen/src/Core/StableNorm.h +221 -0
  125. data/vendor/eigen/Eigen/src/Core/Stride.h +111 -0
  126. data/vendor/eigen/Eigen/src/Core/Swap.h +67 -0
  127. data/vendor/eigen/Eigen/src/Core/Transpose.h +403 -0
  128. data/vendor/eigen/Eigen/src/Core/Transpositions.h +407 -0
  129. data/vendor/eigen/Eigen/src/Core/TriangularMatrix.h +983 -0
  130. data/vendor/eigen/Eigen/src/Core/VectorBlock.h +96 -0
  131. data/vendor/eigen/Eigen/src/Core/VectorwiseOp.h +695 -0
  132. data/vendor/eigen/Eigen/src/Core/Visitor.h +273 -0
  133. data/vendor/eigen/Eigen/src/Core/arch/AVX/Complex.h +451 -0
  134. data/vendor/eigen/Eigen/src/Core/arch/AVX/MathFunctions.h +439 -0
  135. data/vendor/eigen/Eigen/src/Core/arch/AVX/PacketMath.h +637 -0
  136. data/vendor/eigen/Eigen/src/Core/arch/AVX/TypeCasting.h +51 -0
  137. data/vendor/eigen/Eigen/src/Core/arch/AVX512/MathFunctions.h +391 -0
  138. data/vendor/eigen/Eigen/src/Core/arch/AVX512/PacketMath.h +1316 -0
  139. data/vendor/eigen/Eigen/src/Core/arch/AltiVec/Complex.h +430 -0
  140. data/vendor/eigen/Eigen/src/Core/arch/AltiVec/MathFunctions.h +322 -0
  141. data/vendor/eigen/Eigen/src/Core/arch/AltiVec/PacketMath.h +1061 -0
  142. data/vendor/eigen/Eigen/src/Core/arch/CUDA/Complex.h +103 -0
  143. data/vendor/eigen/Eigen/src/Core/arch/CUDA/Half.h +674 -0
  144. data/vendor/eigen/Eigen/src/Core/arch/CUDA/MathFunctions.h +91 -0
  145. data/vendor/eigen/Eigen/src/Core/arch/CUDA/PacketMath.h +333 -0
  146. data/vendor/eigen/Eigen/src/Core/arch/CUDA/PacketMathHalf.h +1124 -0
  147. data/vendor/eigen/Eigen/src/Core/arch/CUDA/TypeCasting.h +212 -0
  148. data/vendor/eigen/Eigen/src/Core/arch/Default/ConjHelper.h +29 -0
  149. data/vendor/eigen/Eigen/src/Core/arch/Default/Settings.h +49 -0
  150. data/vendor/eigen/Eigen/src/Core/arch/NEON/Complex.h +490 -0
  151. data/vendor/eigen/Eigen/src/Core/arch/NEON/MathFunctions.h +91 -0
  152. data/vendor/eigen/Eigen/src/Core/arch/NEON/PacketMath.h +760 -0
  153. data/vendor/eigen/Eigen/src/Core/arch/SSE/Complex.h +471 -0
  154. data/vendor/eigen/Eigen/src/Core/arch/SSE/MathFunctions.h +562 -0
  155. data/vendor/eigen/Eigen/src/Core/arch/SSE/PacketMath.h +895 -0
  156. data/vendor/eigen/Eigen/src/Core/arch/SSE/TypeCasting.h +77 -0
  157. data/vendor/eigen/Eigen/src/Core/arch/ZVector/Complex.h +397 -0
  158. data/vendor/eigen/Eigen/src/Core/arch/ZVector/MathFunctions.h +137 -0
  159. data/vendor/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h +945 -0
  160. data/vendor/eigen/Eigen/src/Core/functors/AssignmentFunctors.h +168 -0
  161. data/vendor/eigen/Eigen/src/Core/functors/BinaryFunctors.h +475 -0
  162. data/vendor/eigen/Eigen/src/Core/functors/NullaryFunctors.h +188 -0
  163. data/vendor/eigen/Eigen/src/Core/functors/StlFunctors.h +136 -0
  164. data/vendor/eigen/Eigen/src/Core/functors/TernaryFunctors.h +25 -0
  165. data/vendor/eigen/Eigen/src/Core/functors/UnaryFunctors.h +792 -0
  166. data/vendor/eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h +2156 -0
  167. data/vendor/eigen/Eigen/src/Core/products/GeneralMatrixMatrix.h +492 -0
  168. data/vendor/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +311 -0
  169. data/vendor/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h +145 -0
  170. data/vendor/eigen/Eigen/src/Core/products/GeneralMatrixMatrix_BLAS.h +122 -0
  171. data/vendor/eigen/Eigen/src/Core/products/GeneralMatrixVector.h +619 -0
  172. data/vendor/eigen/Eigen/src/Core/products/GeneralMatrixVector_BLAS.h +136 -0
  173. data/vendor/eigen/Eigen/src/Core/products/Parallelizer.h +163 -0
  174. data/vendor/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +521 -0
  175. data/vendor/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix_BLAS.h +287 -0
  176. data/vendor/eigen/Eigen/src/Core/products/SelfadjointMatrixVector.h +260 -0
  177. data/vendor/eigen/Eigen/src/Core/products/SelfadjointMatrixVector_BLAS.h +118 -0
  178. data/vendor/eigen/Eigen/src/Core/products/SelfadjointProduct.h +133 -0
  179. data/vendor/eigen/Eigen/src/Core/products/SelfadjointRank2Update.h +93 -0
  180. data/vendor/eigen/Eigen/src/Core/products/TriangularMatrixMatrix.h +466 -0
  181. data/vendor/eigen/Eigen/src/Core/products/TriangularMatrixMatrix_BLAS.h +315 -0
  182. data/vendor/eigen/Eigen/src/Core/products/TriangularMatrixVector.h +350 -0
  183. data/vendor/eigen/Eigen/src/Core/products/TriangularMatrixVector_BLAS.h +255 -0
  184. data/vendor/eigen/Eigen/src/Core/products/TriangularSolverMatrix.h +335 -0
  185. data/vendor/eigen/Eigen/src/Core/products/TriangularSolverMatrix_BLAS.h +163 -0
  186. data/vendor/eigen/Eigen/src/Core/products/TriangularSolverVector.h +145 -0
  187. data/vendor/eigen/Eigen/src/Core/util/BlasUtil.h +398 -0
  188. data/vendor/eigen/Eigen/src/Core/util/Constants.h +547 -0
  189. data/vendor/eigen/Eigen/src/Core/util/DisableStupidWarnings.h +83 -0
  190. data/vendor/eigen/Eigen/src/Core/util/ForwardDeclarations.h +302 -0
  191. data/vendor/eigen/Eigen/src/Core/util/MKL_support.h +130 -0
  192. data/vendor/eigen/Eigen/src/Core/util/Macros.h +1001 -0
  193. data/vendor/eigen/Eigen/src/Core/util/Memory.h +993 -0
  194. data/vendor/eigen/Eigen/src/Core/util/Meta.h +534 -0
  195. data/vendor/eigen/Eigen/src/Core/util/NonMPL2.h +3 -0
  196. data/vendor/eigen/Eigen/src/Core/util/ReenableStupidWarnings.h +27 -0
  197. data/vendor/eigen/Eigen/src/Core/util/StaticAssert.h +218 -0
  198. data/vendor/eigen/Eigen/src/Core/util/XprHelper.h +821 -0
  199. data/vendor/eigen/Eigen/src/Eigenvalues/ComplexEigenSolver.h +346 -0
  200. data/vendor/eigen/Eigen/src/Eigenvalues/ComplexSchur.h +459 -0
  201. data/vendor/eigen/Eigen/src/Eigenvalues/ComplexSchur_LAPACKE.h +91 -0
  202. data/vendor/eigen/Eigen/src/Eigenvalues/EigenSolver.h +622 -0
  203. data/vendor/eigen/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h +418 -0
  204. data/vendor/eigen/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h +226 -0
  205. data/vendor/eigen/Eigen/src/Eigenvalues/HessenbergDecomposition.h +374 -0
  206. data/vendor/eigen/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h +158 -0
  207. data/vendor/eigen/Eigen/src/Eigenvalues/RealQZ.h +654 -0
  208. data/vendor/eigen/Eigen/src/Eigenvalues/RealSchur.h +546 -0
  209. data/vendor/eigen/Eigen/src/Eigenvalues/RealSchur_LAPACKE.h +77 -0
  210. data/vendor/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +870 -0
  211. data/vendor/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_LAPACKE.h +87 -0
  212. data/vendor/eigen/Eigen/src/Eigenvalues/Tridiagonalization.h +556 -0
  213. data/vendor/eigen/Eigen/src/Geometry/AlignedBox.h +392 -0
  214. data/vendor/eigen/Eigen/src/Geometry/AngleAxis.h +247 -0
  215. data/vendor/eigen/Eigen/src/Geometry/EulerAngles.h +114 -0
  216. data/vendor/eigen/Eigen/src/Geometry/Homogeneous.h +497 -0
  217. data/vendor/eigen/Eigen/src/Geometry/Hyperplane.h +282 -0
  218. data/vendor/eigen/Eigen/src/Geometry/OrthoMethods.h +234 -0
  219. data/vendor/eigen/Eigen/src/Geometry/ParametrizedLine.h +195 -0
  220. data/vendor/eigen/Eigen/src/Geometry/Quaternion.h +814 -0
  221. data/vendor/eigen/Eigen/src/Geometry/Rotation2D.h +199 -0
  222. data/vendor/eigen/Eigen/src/Geometry/RotationBase.h +206 -0
  223. data/vendor/eigen/Eigen/src/Geometry/Scaling.h +170 -0
  224. data/vendor/eigen/Eigen/src/Geometry/Transform.h +1542 -0
  225. data/vendor/eigen/Eigen/src/Geometry/Translation.h +208 -0
  226. data/vendor/eigen/Eigen/src/Geometry/Umeyama.h +166 -0
  227. data/vendor/eigen/Eigen/src/Geometry/arch/Geometry_SSE.h +161 -0
  228. data/vendor/eigen/Eigen/src/Householder/BlockHouseholder.h +103 -0
  229. data/vendor/eigen/Eigen/src/Householder/Householder.h +172 -0
  230. data/vendor/eigen/Eigen/src/Householder/HouseholderSequence.h +470 -0
  231. data/vendor/eigen/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +226 -0
  232. data/vendor/eigen/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +228 -0
  233. data/vendor/eigen/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +246 -0
  234. data/vendor/eigen/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h +400 -0
  235. data/vendor/eigen/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h +462 -0
  236. data/vendor/eigen/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +394 -0
  237. data/vendor/eigen/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h +216 -0
  238. data/vendor/eigen/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h +115 -0
  239. data/vendor/eigen/Eigen/src/Jacobi/Jacobi.h +462 -0
  240. data/vendor/eigen/Eigen/src/LU/Determinant.h +101 -0
  241. data/vendor/eigen/Eigen/src/LU/FullPivLU.h +891 -0
  242. data/vendor/eigen/Eigen/src/LU/InverseImpl.h +415 -0
  243. data/vendor/eigen/Eigen/src/LU/PartialPivLU.h +611 -0
  244. data/vendor/eigen/Eigen/src/LU/PartialPivLU_LAPACKE.h +83 -0
  245. data/vendor/eigen/Eigen/src/LU/arch/Inverse_SSE.h +338 -0
  246. data/vendor/eigen/Eigen/src/MetisSupport/MetisSupport.h +137 -0
  247. data/vendor/eigen/Eigen/src/OrderingMethods/Amd.h +445 -0
  248. data/vendor/eigen/Eigen/src/OrderingMethods/Eigen_Colamd.h +1843 -0
  249. data/vendor/eigen/Eigen/src/OrderingMethods/Ordering.h +157 -0
  250. data/vendor/eigen/Eigen/src/PaStiXSupport/PaStiXSupport.h +678 -0
  251. data/vendor/eigen/Eigen/src/PardisoSupport/PardisoSupport.h +543 -0
  252. data/vendor/eigen/Eigen/src/QR/ColPivHouseholderQR.h +653 -0
  253. data/vendor/eigen/Eigen/src/QR/ColPivHouseholderQR_LAPACKE.h +97 -0
  254. data/vendor/eigen/Eigen/src/QR/CompleteOrthogonalDecomposition.h +562 -0
  255. data/vendor/eigen/Eigen/src/QR/FullPivHouseholderQR.h +676 -0
  256. data/vendor/eigen/Eigen/src/QR/HouseholderQR.h +409 -0
  257. data/vendor/eigen/Eigen/src/QR/HouseholderQR_LAPACKE.h +68 -0
  258. data/vendor/eigen/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h +313 -0
  259. data/vendor/eigen/Eigen/src/SVD/BDCSVD.h +1246 -0
  260. data/vendor/eigen/Eigen/src/SVD/JacobiSVD.h +804 -0
  261. data/vendor/eigen/Eigen/src/SVD/JacobiSVD_LAPACKE.h +91 -0
  262. data/vendor/eigen/Eigen/src/SVD/SVDBase.h +315 -0
  263. data/vendor/eigen/Eigen/src/SVD/UpperBidiagonalization.h +414 -0
  264. data/vendor/eigen/Eigen/src/SparseCholesky/SimplicialCholesky.h +689 -0
  265. data/vendor/eigen/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h +199 -0
  266. data/vendor/eigen/Eigen/src/SparseCore/AmbiVector.h +377 -0
  267. data/vendor/eigen/Eigen/src/SparseCore/CompressedStorage.h +258 -0
  268. data/vendor/eigen/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h +352 -0
  269. data/vendor/eigen/Eigen/src/SparseCore/MappedSparseMatrix.h +67 -0
  270. data/vendor/eigen/Eigen/src/SparseCore/SparseAssign.h +216 -0
  271. data/vendor/eigen/Eigen/src/SparseCore/SparseBlock.h +603 -0
  272. data/vendor/eigen/Eigen/src/SparseCore/SparseColEtree.h +206 -0
  273. data/vendor/eigen/Eigen/src/SparseCore/SparseCompressedBase.h +341 -0
  274. data/vendor/eigen/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +726 -0
  275. data/vendor/eigen/Eigen/src/SparseCore/SparseCwiseUnaryOp.h +148 -0
  276. data/vendor/eigen/Eigen/src/SparseCore/SparseDenseProduct.h +320 -0
  277. data/vendor/eigen/Eigen/src/SparseCore/SparseDiagonalProduct.h +138 -0
  278. data/vendor/eigen/Eigen/src/SparseCore/SparseDot.h +98 -0
  279. data/vendor/eigen/Eigen/src/SparseCore/SparseFuzzy.h +29 -0
  280. data/vendor/eigen/Eigen/src/SparseCore/SparseMap.h +305 -0
  281. data/vendor/eigen/Eigen/src/SparseCore/SparseMatrix.h +1403 -0
  282. data/vendor/eigen/Eigen/src/SparseCore/SparseMatrixBase.h +405 -0
  283. data/vendor/eigen/Eigen/src/SparseCore/SparsePermutation.h +178 -0
  284. data/vendor/eigen/Eigen/src/SparseCore/SparseProduct.h +169 -0
  285. data/vendor/eigen/Eigen/src/SparseCore/SparseRedux.h +49 -0
  286. data/vendor/eigen/Eigen/src/SparseCore/SparseRef.h +397 -0
  287. data/vendor/eigen/Eigen/src/SparseCore/SparseSelfAdjointView.h +656 -0
  288. data/vendor/eigen/Eigen/src/SparseCore/SparseSolverBase.h +124 -0
  289. data/vendor/eigen/Eigen/src/SparseCore/SparseSparseProductWithPruning.h +198 -0
  290. data/vendor/eigen/Eigen/src/SparseCore/SparseTranspose.h +92 -0
  291. data/vendor/eigen/Eigen/src/SparseCore/SparseTriangularView.h +189 -0
  292. data/vendor/eigen/Eigen/src/SparseCore/SparseUtil.h +178 -0
  293. data/vendor/eigen/Eigen/src/SparseCore/SparseVector.h +478 -0
  294. data/vendor/eigen/Eigen/src/SparseCore/SparseView.h +253 -0
  295. data/vendor/eigen/Eigen/src/SparseCore/TriangularSolver.h +315 -0
  296. data/vendor/eigen/Eigen/src/SparseLU/SparseLU.h +773 -0
  297. data/vendor/eigen/Eigen/src/SparseLU/SparseLUImpl.h +66 -0
  298. data/vendor/eigen/Eigen/src/SparseLU/SparseLU_Memory.h +226 -0
  299. data/vendor/eigen/Eigen/src/SparseLU/SparseLU_Structs.h +110 -0
  300. data/vendor/eigen/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h +301 -0
  301. data/vendor/eigen/Eigen/src/SparseLU/SparseLU_Utils.h +80 -0
  302. data/vendor/eigen/Eigen/src/SparseLU/SparseLU_column_bmod.h +181 -0
  303. data/vendor/eigen/Eigen/src/SparseLU/SparseLU_column_dfs.h +179 -0
  304. data/vendor/eigen/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h +107 -0
  305. data/vendor/eigen/Eigen/src/SparseLU/SparseLU_gemm_kernel.h +280 -0
  306. data/vendor/eigen/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h +126 -0
  307. data/vendor/eigen/Eigen/src/SparseLU/SparseLU_kernel_bmod.h +130 -0
  308. data/vendor/eigen/Eigen/src/SparseLU/SparseLU_panel_bmod.h +223 -0
  309. data/vendor/eigen/Eigen/src/SparseLU/SparseLU_panel_dfs.h +258 -0
  310. data/vendor/eigen/Eigen/src/SparseLU/SparseLU_pivotL.h +137 -0
  311. data/vendor/eigen/Eigen/src/SparseLU/SparseLU_pruneL.h +136 -0
  312. data/vendor/eigen/Eigen/src/SparseLU/SparseLU_relax_snode.h +83 -0
  313. data/vendor/eigen/Eigen/src/SparseQR/SparseQR.h +745 -0
  314. data/vendor/eigen/Eigen/src/StlSupport/StdDeque.h +126 -0
  315. data/vendor/eigen/Eigen/src/StlSupport/StdList.h +106 -0
  316. data/vendor/eigen/Eigen/src/StlSupport/StdVector.h +131 -0
  317. data/vendor/eigen/Eigen/src/StlSupport/details.h +84 -0
  318. data/vendor/eigen/Eigen/src/SuperLUSupport/SuperLUSupport.h +1027 -0
  319. data/vendor/eigen/Eigen/src/UmfPackSupport/UmfPackSupport.h +506 -0
  320. data/vendor/eigen/Eigen/src/misc/Image.h +82 -0
  321. data/vendor/eigen/Eigen/src/misc/Kernel.h +79 -0
  322. data/vendor/eigen/Eigen/src/misc/RealSvd2x2.h +55 -0
  323. data/vendor/eigen/Eigen/src/misc/blas.h +440 -0
  324. data/vendor/eigen/Eigen/src/misc/lapack.h +152 -0
  325. data/vendor/eigen/Eigen/src/misc/lapacke.h +16291 -0
  326. data/vendor/eigen/Eigen/src/misc/lapacke_mangling.h +17 -0
  327. data/vendor/eigen/Eigen/src/plugins/ArrayCwiseBinaryOps.h +332 -0
  328. data/vendor/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.h +552 -0
  329. data/vendor/eigen/Eigen/src/plugins/BlockMethods.h +1058 -0
  330. data/vendor/eigen/Eigen/src/plugins/CommonCwiseBinaryOps.h +115 -0
  331. data/vendor/eigen/Eigen/src/plugins/CommonCwiseUnaryOps.h +163 -0
  332. data/vendor/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.h +152 -0
  333. data/vendor/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.h +85 -0
  334. data/vendor/eigen/README.md +3 -0
  335. data/vendor/eigen/bench/README.txt +55 -0
  336. data/vendor/eigen/bench/btl/COPYING +340 -0
  337. data/vendor/eigen/bench/btl/README +154 -0
  338. data/vendor/eigen/bench/tensors/README +21 -0
  339. data/vendor/eigen/blas/README.txt +6 -0
  340. data/vendor/eigen/demos/mandelbrot/README +10 -0
  341. data/vendor/eigen/demos/mix_eigen_and_c/README +9 -0
  342. data/vendor/eigen/demos/opengl/README +13 -0
  343. data/vendor/eigen/unsupported/Eigen/CXX11/src/Tensor/README.md +1760 -0
  344. data/vendor/eigen/unsupported/README.txt +50 -0
  345. data/vendor/tomotopy/LICENSE +21 -0
  346. data/vendor/tomotopy/README.kr.rst +375 -0
  347. data/vendor/tomotopy/README.rst +382 -0
  348. data/vendor/tomotopy/src/Labeling/FoRelevance.cpp +362 -0
  349. data/vendor/tomotopy/src/Labeling/FoRelevance.h +88 -0
  350. data/vendor/tomotopy/src/Labeling/Labeler.h +50 -0
  351. data/vendor/tomotopy/src/TopicModel/CT.h +37 -0
  352. data/vendor/tomotopy/src/TopicModel/CTModel.cpp +13 -0
  353. data/vendor/tomotopy/src/TopicModel/CTModel.hpp +293 -0
  354. data/vendor/tomotopy/src/TopicModel/DMR.h +51 -0
  355. data/vendor/tomotopy/src/TopicModel/DMRModel.cpp +13 -0
  356. data/vendor/tomotopy/src/TopicModel/DMRModel.hpp +374 -0
  357. data/vendor/tomotopy/src/TopicModel/DT.h +65 -0
  358. data/vendor/tomotopy/src/TopicModel/DTM.h +22 -0
  359. data/vendor/tomotopy/src/TopicModel/DTModel.cpp +15 -0
  360. data/vendor/tomotopy/src/TopicModel/DTModel.hpp +572 -0
  361. data/vendor/tomotopy/src/TopicModel/GDMR.h +37 -0
  362. data/vendor/tomotopy/src/TopicModel/GDMRModel.cpp +14 -0
  363. data/vendor/tomotopy/src/TopicModel/GDMRModel.hpp +485 -0
  364. data/vendor/tomotopy/src/TopicModel/HDP.h +74 -0
  365. data/vendor/tomotopy/src/TopicModel/HDPModel.cpp +13 -0
  366. data/vendor/tomotopy/src/TopicModel/HDPModel.hpp +592 -0
  367. data/vendor/tomotopy/src/TopicModel/HLDA.h +40 -0
  368. data/vendor/tomotopy/src/TopicModel/HLDAModel.cpp +13 -0
  369. data/vendor/tomotopy/src/TopicModel/HLDAModel.hpp +681 -0
  370. data/vendor/tomotopy/src/TopicModel/HPA.h +27 -0
  371. data/vendor/tomotopy/src/TopicModel/HPAModel.cpp +21 -0
  372. data/vendor/tomotopy/src/TopicModel/HPAModel.hpp +588 -0
  373. data/vendor/tomotopy/src/TopicModel/LDA.h +144 -0
  374. data/vendor/tomotopy/src/TopicModel/LDACVB0Model.hpp +442 -0
  375. data/vendor/tomotopy/src/TopicModel/LDAModel.cpp +13 -0
  376. data/vendor/tomotopy/src/TopicModel/LDAModel.hpp +1058 -0
  377. data/vendor/tomotopy/src/TopicModel/LLDA.h +45 -0
  378. data/vendor/tomotopy/src/TopicModel/LLDAModel.cpp +13 -0
  379. data/vendor/tomotopy/src/TopicModel/LLDAModel.hpp +203 -0
  380. data/vendor/tomotopy/src/TopicModel/MGLDA.h +63 -0
  381. data/vendor/tomotopy/src/TopicModel/MGLDAModel.cpp +17 -0
  382. data/vendor/tomotopy/src/TopicModel/MGLDAModel.hpp +558 -0
  383. data/vendor/tomotopy/src/TopicModel/PA.h +43 -0
  384. data/vendor/tomotopy/src/TopicModel/PAModel.cpp +13 -0
  385. data/vendor/tomotopy/src/TopicModel/PAModel.hpp +467 -0
  386. data/vendor/tomotopy/src/TopicModel/PLDA.h +17 -0
  387. data/vendor/tomotopy/src/TopicModel/PLDAModel.cpp +13 -0
  388. data/vendor/tomotopy/src/TopicModel/PLDAModel.hpp +214 -0
  389. data/vendor/tomotopy/src/TopicModel/SLDA.h +54 -0
  390. data/vendor/tomotopy/src/TopicModel/SLDAModel.cpp +17 -0
  391. data/vendor/tomotopy/src/TopicModel/SLDAModel.hpp +456 -0
  392. data/vendor/tomotopy/src/TopicModel/TopicModel.hpp +692 -0
  393. data/vendor/tomotopy/src/Utils/AliasMethod.hpp +169 -0
  394. data/vendor/tomotopy/src/Utils/Dictionary.h +80 -0
  395. data/vendor/tomotopy/src/Utils/EigenAddonOps.hpp +181 -0
  396. data/vendor/tomotopy/src/Utils/LBFGS.h +202 -0
  397. data/vendor/tomotopy/src/Utils/LBFGS/LineSearchBacktracking.h +120 -0
  398. data/vendor/tomotopy/src/Utils/LBFGS/LineSearchBracketing.h +122 -0
  399. data/vendor/tomotopy/src/Utils/LBFGS/Param.h +213 -0
  400. data/vendor/tomotopy/src/Utils/LUT.hpp +82 -0
  401. data/vendor/tomotopy/src/Utils/MultiNormalDistribution.hpp +69 -0
  402. data/vendor/tomotopy/src/Utils/PolyaGamma.hpp +200 -0
  403. data/vendor/tomotopy/src/Utils/PolyaGammaHybrid.hpp +672 -0
  404. data/vendor/tomotopy/src/Utils/ThreadPool.hpp +150 -0
  405. data/vendor/tomotopy/src/Utils/Trie.hpp +220 -0
  406. data/vendor/tomotopy/src/Utils/TruncMultiNormal.hpp +94 -0
  407. data/vendor/tomotopy/src/Utils/Utils.hpp +337 -0
  408. data/vendor/tomotopy/src/Utils/avx_gamma.h +46 -0
  409. data/vendor/tomotopy/src/Utils/avx_mathfun.h +736 -0
  410. data/vendor/tomotopy/src/Utils/exception.h +28 -0
  411. data/vendor/tomotopy/src/Utils/math.h +281 -0
  412. data/vendor/tomotopy/src/Utils/rtnorm.hpp +2690 -0
  413. data/vendor/tomotopy/src/Utils/sample.hpp +192 -0
  414. data/vendor/tomotopy/src/Utils/serializer.hpp +695 -0
  415. data/vendor/tomotopy/src/Utils/slp.hpp +131 -0
  416. data/vendor/tomotopy/src/Utils/sse_gamma.h +48 -0
  417. data/vendor/tomotopy/src/Utils/sse_mathfun.h +710 -0
  418. data/vendor/tomotopy/src/Utils/text.hpp +49 -0
  419. data/vendor/tomotopy/src/Utils/tvector.hpp +543 -0
  420. metadata +531 -0
@@ -0,0 +1,65 @@
1
+ #pragma once
2
+ #include "LDAModel.hpp"
3
+ #include "LDA.h"
4
+
5
+ namespace tomoto
6
+ {
7
+ template<TermWeight _tw>
8
+ struct DocumentDTM : public DocumentLDA<_tw>
9
+ {
10
+ using BaseDocument = DocumentLDA<_tw>;
11
+ using DocumentLDA<_tw>::DocumentLDA;
12
+
13
+ size_t timepoint = 0;
14
+ ShareableVector<Float> eta;
15
+ sample::AliasMethod<> aliasTable;
16
+
17
+ DEFINE_SERIALIZER_AFTER_BASE_WITH_VERSION(BaseDocument, 0, timepoint);
18
+ DEFINE_TAGGED_SERIALIZER_AFTER_BASE_WITH_VERSION(BaseDocument, 1, 0x00010001, timepoint);
19
+ };
20
+
21
+ class IDTModel : public ILDAModel
22
+ {
23
+ public:
24
+ using DefaultDocType = DocumentDTM<TermWeight::one>;
25
+ static IDTModel* create(TermWeight _weight, size_t _K = 1, size_t _T = 1,
26
+ Float _alphaVar = 1.0, Float _etaVar = 1.0, Float _phiVar = 1.0,
27
+ Float _shapeA = 0.03, Float _shapeB = 0.1, Float _shapeC = 0.55,
28
+ Float _etaRegL2 = 0,
29
+ size_t seed = std::random_device{}(),
30
+ bool scalarRng = false);
31
+
32
+ virtual size_t addDoc(const std::vector<std::string>& words, size_t timepoint) = 0;
33
+ virtual std::unique_ptr<DocumentBase> makeDoc(const std::vector<std::string>& words, size_t timepoint) const = 0;
34
+
35
+ virtual size_t addDoc(const std::string& rawStr, const RawDocTokenizer::Factory& tokenizer,
36
+ size_t timepoint) = 0;
37
+ virtual std::unique_ptr<DocumentBase> makeDoc(const std::string& rawStr, const RawDocTokenizer::Factory& tokenizer,
38
+ size_t timepoint) const = 0;
39
+
40
+ virtual size_t addDoc(const std::string& rawStr, const std::vector<Vid>& words,
41
+ const std::vector<uint32_t>& pos, const std::vector<uint16_t>& len,
42
+ size_t timepoint) = 0;
43
+ virtual std::unique_ptr<DocumentBase> makeDoc(const std::string& rawStr, const std::vector<Vid>& words,
44
+ const std::vector<uint32_t>& pos, const std::vector<uint16_t>& len,
45
+ size_t timepoint) const = 0;
46
+
47
+ virtual size_t getT() const = 0;
48
+ virtual std::vector<uint32_t> getNumDocsByT() const = 0;
49
+
50
+ virtual Float getAlphaVar() const = 0;
51
+ virtual Float getEtaVar() const = 0;
52
+ virtual Float getPhiVar() const = 0;
53
+
54
+ virtual Float getShapeA() const = 0;
55
+ virtual Float getShapeB() const = 0;
56
+ virtual Float getShapeC() const = 0;
57
+
58
+ virtual void setShapeA(Float a) = 0;
59
+ virtual void setShapeB(Float a) = 0;
60
+ virtual void setShapeC(Float a) = 0;
61
+
62
+ virtual Float getAlpha(size_t k, size_t t) const = 0;
63
+ virtual std::vector<Float> getPhi(size_t k, size_t t) const = 0;
64
+ };
65
+ }
@@ -0,0 +1,22 @@
1
+ #pragma once
2
+ #include "LDAModel.hpp"
3
+ #include "LDA.h"
4
+
5
+ namespace tomoto
6
+ {
7
+ template<TermWeight _tw, size_t _Flags = 0>
8
+ struct DocumentDTM : public DocumentLDA<_tw, _Flags>
9
+ {
10
+ using BaseDocument = DocumentLDA<_tw, _Flags>;
11
+ using DocumentLDA<_tw, _Flags>::DocumentLDA;
12
+ using WeightType = typename std::conditional<_tw == TermWeight::one, int32_t, float>::type;
13
+ };
14
+
15
+ class IDTModel : public ILDAModel
16
+ {
17
+ public:
18
+ using DefaultDocType = DocumentDTM<TermWeight::one>;
19
+ static IDTModel* create(TermWeight _weight, size_t _K = 1, Float _alpha = 0.1, Float _eta = 0.01, const RandGen& _rg = RandGen{ std::random_device{}() });
20
+
21
+ };
22
+ }
@@ -0,0 +1,15 @@
1
+ #include "DTModel.hpp"
2
+
3
+ namespace tomoto
4
+ {
5
+ /*template class DTModel<TermWeight::one>;
6
+ template class DTModel<TermWeight::idf>;
7
+ template class DTModel<TermWeight::pmi>;*/
8
+
9
+ IDTModel* IDTModel::create(TermWeight _weight, size_t _K, size_t _T,
10
+ Float _alphaVar, Float _etaVar, Float _phiVar,
11
+ Float _shapeA, Float _shapeB, Float _shapeC, Float _etaRegL2, size_t seed, bool scalarRng)
12
+ {
13
+ TMT_SWITCH_TW(_weight, scalarRng, DTModel, _K, _T, _alphaVar, _etaVar, _phiVar, _shapeA, _shapeB, _shapeC, _etaRegL2, seed);
14
+ }
15
+ }
@@ -0,0 +1,572 @@
1
+ #pragma once
2
+ #include "LDAModel.hpp"
3
+ #include "DT.h"
4
+
5
+ /*
6
+ Implementation of Dynamic Topic Model using Gibbs sampling by bab2min
7
+
8
+ * Blei, D. M., & Lafferty, J. D. (2006, June). Dynamic topic models. In Proceedings of the 23rd international conference on Machine learning (pp. 113-120).
9
+ * Bhadury, A., Chen, J., Zhu, J., & Liu, S. (2016, April). Scaling up dynamic topic models. In Proceedings of the 25th International Conference on World Wide Web (pp. 381-390).
10
+ * https://github.com/Arnie0426/FastDTM
11
+
12
+ */
13
+
14
+ namespace tomoto
15
+ {
16
+ template<TermWeight _tw>
17
+ struct ModelStateDTM
18
+ {
19
+ using WeightType = typename std::conditional<_tw == TermWeight::one, int32_t, float>::type;
20
+
21
+ Eigen::Matrix<WeightType, -1, -1> numByTopic; // Dim: (Topic, Time)
22
+ Eigen::Matrix<WeightType, -1, -1> numByTopicWord; // Dim: (Topic * Time, Vocabs)
23
+ DEFINE_SERIALIZER(numByTopic, numByTopicWord);
24
+ };
25
+
26
+ template<TermWeight _tw, typename _RandGen,
27
+ size_t _Flags = flags::partitioned_multisampling,
28
+ typename _Interface = IDTModel,
29
+ typename _Derived = void,
30
+ typename _DocType = DocumentDTM<_tw>,
31
+ typename _ModelState = ModelStateDTM<_tw>>
32
+ class DTModel : public LDAModel<_tw, _RandGen, _Flags, _Interface,
33
+ typename std::conditional<std::is_same<_Derived, void>::value, DTModel<_tw, _RandGen, _Flags>, _Derived>::type,
34
+ _DocType, _ModelState>
35
+ {
36
+ protected:
37
+ using DerivedClass = typename std::conditional<std::is_same<_Derived, void>::value, DTModel<_tw, _RandGen>, _Derived>::type;
38
+ using BaseClass = LDAModel<_tw, _RandGen, _Flags, _Interface, DerivedClass, _DocType, _ModelState>;
39
+ friend BaseClass;
40
+ friend typename BaseClass::BaseClass;
41
+ using WeightType = typename BaseClass::WeightType;
42
+
43
+ static constexpr char TMID[] = "DTM\0";
44
+
45
+ uint64_t T;
46
+ Float shapeA = 0.03f, shapeB = 0.1f, shapeC = 0.55f;
47
+ const Float alphaVar = 1.f, etaVar = 1.f, phiVar = 1.f, etaRegL2 = 0.0f;
48
+
49
+ Eigen::Matrix<Float, -1, -1> alphas; // Dim: (Topic, Time)
50
+ Eigen::Matrix<Float, -1, -1> etaByDoc; // Dim: (Topic, Docs) : Topic distribution by docs(and time)
51
+ std::vector<uint32_t> numDocsByTime; // Dim: (Time)
52
+ Eigen::Matrix<Float, -1, -1> phi; // Dim: (Word, Topic * Time)
53
+ std::vector<sample::AliasMethod<>> wordAliasTables; // Dim: (Word * Time)
54
+
55
+ template<int _inc>
56
+ inline void addWordTo(_ModelState& ld, _DocType& doc, uint32_t pid, Vid vid, Tid tid) const
57
+ {
58
+ assert(tid < this->K);
59
+ assert(vid < this->realV);
60
+ constexpr bool _dec = _inc < 0 && _tw != TermWeight::one;
61
+ typename std::conditional<_tw != TermWeight::one, float, int32_t>::type weight
62
+ = _tw != TermWeight::one ? doc.wordWeights[pid] : 1;
63
+
64
+ updateCnt<_dec>(doc.numByTopic[tid], _inc * weight);
65
+ updateCnt<_dec>(ld.numByTopic(tid, doc.timepoint), _inc * weight);
66
+ updateCnt<_dec>(ld.numByTopicWord(tid + this->K * doc.timepoint, vid), _inc * weight);
67
+ }
68
+
69
+ /*
70
+ Sampling Process
71
+
72
+ For each timeslice t,
73
+ For each document d,
74
+ - sampling eta(t, d)
75
+ - sampling zeta
76
+ - sampling phi(t, k) for all k
77
+ - sampling alpha
78
+ */
79
+
80
+ void presampleDocument(_DocType& doc, size_t docId, _ModelState& ld, _RandGen& rgs, size_t iterationCnt) const
81
+ {
82
+ const Float eps = shapeA * (std::pow(shapeB + 1 + iterationCnt, -shapeC));
83
+
84
+ // sampling eta
85
+ {
86
+ Eigen::Matrix<Float, -1, 1> estimatedCnt = (doc.eta.array() - doc.eta.maxCoeff()).exp();
87
+ Eigen::Matrix<Float, -1, 1> etaTmp;
88
+ estimatedCnt *= doc.getSumWordWeight() / estimatedCnt.sum();
89
+ auto prior = (alphas.col(doc.timepoint) - doc.eta) / std::max(etaVar, eps * 2);
90
+ auto grad = doc.numByTopic.template cast<Float>() - estimatedCnt;
91
+ doc.eta.array() += (eps / 2) * (prior.array() + grad.array())
92
+ + Eigen::Rand::normal<Eigen::Array<Float, -1, 1>>(this->K, 1, rgs) * eps;
93
+ }
94
+
95
+ Eigen::Array<Float, -1, 1> expEta = (doc.eta.array() - doc.eta.maxCoeff()).exp();
96
+ doc.aliasTable.buildTable(expEta.data(), expEta.data() + expEta.size());
97
+ }
98
+
99
+ template<ParallelScheme _ps, bool _infer, typename _ExtraDocData>
100
+ void sampleDocument(_DocType& doc, const _ExtraDocData& edd, size_t docId, _ModelState& ld, _RandGen& rgs, size_t iterationCnt, size_t partitionId = 0) const
101
+ {
102
+ size_t b = 0, e = doc.words.size();
103
+ if (_ps == ParallelScheme::partition)
104
+ {
105
+ b = edd.chunkOffsetByDoc(partitionId, docId);
106
+ e = edd.chunkOffsetByDoc(partitionId + 1, docId);
107
+ }
108
+
109
+ size_t vOffset = (_ps == ParallelScheme::partition && partitionId) ? edd.vChunkOffset[partitionId - 1] : 0;
110
+
111
+ // sampling zeta
112
+ for (size_t w = b; w < e; ++w)
113
+ {
114
+ auto v = doc.words[w];
115
+ if (v >= this->realV) continue;
116
+ addWordTo<-1>(ld, doc, w, v - vOffset, doc.Zs[w]);
117
+
118
+ for (size_t mh = 0; mh < 2; ++mh)
119
+ {
120
+ // doc proposal
121
+ Tid new_z = doc.aliasTable(rgs);
122
+ Float acceptance = std::min(1.f,
123
+ std::exp(phi(v, new_z + this->K * doc.timepoint) - phi(v, doc.Zs[w] + this->K * doc.timepoint))
124
+ );
125
+ if (acceptance >= 1 || rgs.uniform_real() < acceptance) doc.Zs[w] = new_z;
126
+
127
+ // word proposal
128
+ new_z = wordAliasTables[v + this->realV * doc.timepoint](rgs);
129
+ acceptance = std::min(1.f,
130
+ std::exp(doc.eta(new_z) - doc.eta(doc.Zs[w]))
131
+ );
132
+ if (acceptance >= 1 || rgs.uniform_real() < acceptance) doc.Zs[w] = new_z;
133
+ }
134
+
135
+ addWordTo<1>(ld, doc, w, v - vOffset, doc.Zs[w]);
136
+ }
137
+ }
138
+
139
+ template<ParallelScheme _ps, typename _ExtraDocData>
140
+ void mergeState(ThreadPool& pool, _ModelState& globalState, _ModelState& tState, _ModelState* localData, _RandGen*, const _ExtraDocData& edd) const
141
+ {
142
+ std::vector<std::future<void>> res;
143
+
144
+ if (_ps == ParallelScheme::copy_merge)
145
+ {
146
+ tState = globalState;
147
+ globalState = localData[0];
148
+ for (size_t i = 1; i < pool.getNumWorkers(); ++i)
149
+ {
150
+ globalState.numByTopicWord += localData[i].numByTopicWord - tState.numByTopicWord;
151
+ }
152
+
153
+ // make all count being positive
154
+ if (_tw != TermWeight::one)
155
+ {
156
+ globalState.numByTopicWord = globalState.numByTopicWord.cwiseMax(0);
157
+ }
158
+ Eigen::Map<Eigen::Matrix<WeightType, -1, 1>>{ globalState.numByTopic.data(), globalState.numByTopic.size() }
159
+ = globalState.numByTopicWord.rowwise().sum();
160
+
161
+ for (size_t i = 0; i < pool.getNumWorkers(); ++i)
162
+ {
163
+ res.emplace_back(pool.enqueue([&, i](size_t)
164
+ {
165
+ localData[i] = globalState;
166
+ }));
167
+ }
168
+ }
169
+ else if (_ps == ParallelScheme::partition)
170
+ {
171
+ res = pool.enqueueToAll([&](size_t partitionId)
172
+ {
173
+ size_t b = partitionId ? edd.vChunkOffset[partitionId - 1] : 0,
174
+ e = edd.vChunkOffset[partitionId];
175
+ globalState.numByTopicWord.block(0, b, globalState.numByTopicWord.rows(), e - b) = localData[partitionId].numByTopicWord;
176
+ });
177
+ for (auto& r : res) r.get();
178
+ res.clear();
179
+
180
+ // make all count being positive
181
+ if (_tw != TermWeight::one)
182
+ {
183
+ globalState.numByTopicWord = globalState.numByTopicWord.cwiseMax(0);
184
+ }
185
+ Eigen::Map<Eigen::Matrix<WeightType, -1, 1>>{ globalState.numByTopic.data(), globalState.numByTopic.size() }
186
+ = globalState.numByTopicWord.rowwise().sum();
187
+
188
+ res = pool.enqueueToAll([&](size_t threadId)
189
+ {
190
+ localData[threadId].numByTopic = globalState.numByTopic;
191
+ });
192
+ }
193
+ for (auto& r : res) r.get();
194
+ }
195
+
196
+ template<typename _DocIter>
197
+ void sampleGlobalLevel(ThreadPool* pool, _ModelState* localData, _RandGen* rgs, _DocIter first, _DocIter last)
198
+ {
199
+ const auto K = this->K;
200
+ const Float eps = shapeA * (std::pow(shapeB + 1 + this->globalStep, -shapeC));
201
+
202
+ // sampling phi
203
+ for (size_t k = 0; k < K; ++k)
204
+ {
205
+ Eigen::Matrix<Float, -1, -1> phiGrad{ (Eigen::Index)this->realV, (Eigen::Index)T };
206
+ for (size_t t = 0; t < T; ++t)
207
+ {
208
+ auto phi_tk = phi.col(k + K * t);
209
+ Eigen::Matrix<Float, -1, 1> estimatedCnt = (phi_tk.array() - phi_tk.maxCoeff()).exp();
210
+ estimatedCnt *= this->globalState.numByTopic(k, t) / estimatedCnt.sum();
211
+
212
+ Eigen::Matrix<Float, -1, 1> grad = this->globalState.numByTopicWord.row(k + K * t).template cast<Float>();
213
+ grad -= estimatedCnt;
214
+ auto epsNoise = Eigen::Rand::normal<Eigen::Array<Float, -1, 1>>(this->realV, 1, *rgs) * eps;
215
+ if (t == 0)
216
+ {
217
+ if (T > 1)
218
+ {
219
+ const Float phiVar2 = 100 / (100 + phiVar);
220
+ auto prior = (phi.col(k + K * (t + 1)) * phiVar2 - phi_tk) / std::max(phiVar / 2, eps * 2);
221
+ phiGrad.col(t) = (eps / 2) * (prior.array() + grad.array()) + epsNoise;
222
+ }
223
+ else
224
+ {
225
+ phiGrad.col(t) = (eps / 2) * grad.array() + epsNoise;
226
+ }
227
+ }
228
+ else if (t == T - 1)
229
+ {
230
+ auto prior = (phi.col(k + K * (t - 1)) - phi_tk) / std::max(phiVar, eps * 2);
231
+ phiGrad.col(t) = (eps / 2) * (prior.array() + grad.array()) + epsNoise;
232
+ }
233
+ else
234
+ {
235
+ auto prior = (phi.col(k + K * (t + 1)) + phi.col(k + K * (t - 1)) - 2 * phi_tk) / std::max(phiVar, eps * 2);
236
+ phiGrad.col(t) = (eps / 2) * (prior.array() + grad.array()) + epsNoise;
237
+ }
238
+ }
239
+
240
+ for (size_t t = 0; t < T; ++t)
241
+ {
242
+ phi.col(k + K * t) += phiGrad.col(t);
243
+ }
244
+ }
245
+
246
+ Eigen::Matrix<Float, -1, -1> newAlphas = Eigen::Matrix<Float, -1, -1>::Zero(alphas.rows(), alphas.cols());
247
+ for (size_t t = 0; t < T; ++t)
248
+ {
249
+ // update alias tables for word proposal
250
+ if (pool)
251
+ {
252
+ const size_t chStride = pool->getNumWorkers() * 8;
253
+ std::vector<std::future<void>> futures;
254
+ futures.reserve(chStride);
255
+ for (size_t ch = 0; ch < chStride; ++ch)
256
+ {
257
+ futures.emplace_back(pool->enqueue([&, ch, chStride](size_t)
258
+ {
259
+ for (Vid v = ch; v < this->realV; v += chStride)
260
+ {
261
+ Eigen::Array<Float, -1, 1> ps = phi.row(v).segment(K * t, K);
262
+ ps = (ps - ps.maxCoeff()).exp();
263
+ wordAliasTables[v + this->realV * t].buildTable(ps.data(), ps.data() + ps.size());
264
+ }
265
+ }));
266
+ }
267
+ for (auto& f : futures) f.get();
268
+ }
269
+ else
270
+ {
271
+ for (Vid v = 0; v < this->realV; ++v)
272
+ {
273
+ Eigen::Array<Float, -1, 1> ps = phi.row(v).segment(K * t, K);
274
+ ps = (ps - ps.maxCoeff()).exp();
275
+ wordAliasTables[v + this->realV * t].buildTable(ps.data(), ps.data() + ps.size());
276
+ }
277
+ }
278
+
279
+ // sampling alpha
280
+ Float lambda = 2 / alphaVar + numDocsByTime[t] / etaVar;
281
+
282
+ auto newAlpha = newAlphas.col(t);
283
+ newAlpha.setZero();
284
+ for (size_t d = 0; d < this->docs.size(); ++d)
285
+ {
286
+ auto& doc = this->docs[d];
287
+ if (doc.timepoint == t) newAlpha.array() += doc.eta.array();
288
+ }
289
+ newAlpha /= etaVar;
290
+ if(etaRegL2) newAlpha *= 1 - etaRegL2;
291
+ if (t == 0)
292
+ {
293
+ if (T > 1)
294
+ {
295
+ newAlpha += alphas.col(t + 1) / (2 * alphaVar);
296
+ }
297
+ else
298
+ {
299
+ newAlpha.setZero();
300
+ }
301
+ }
302
+ else if (t == T - 1)
303
+ {
304
+ newAlpha += alphas.col(t - 1) / (2 * alphaVar);
305
+ }
306
+ else
307
+ {
308
+ newAlpha += (alphas.col(t + 1) + alphas.col(t - 1)) / alphaVar;
309
+ }
310
+ newAlpha /= lambda;
311
+ newAlpha.array() += Eigen::Rand::normal<Eigen::Array<Float, -1, 1>>(this->K, 1, *rgs) / std::sqrt(lambda);
312
+ }
313
+ alphas = newAlphas;
314
+ }
315
+
316
+ template<typename _DocIter>
317
+ void sampleGlobalLevel(ThreadPool* pool, _ModelState* localData, _RandGen* rgs, _DocIter first, _DocIter last) const
318
+ {
319
+ // do nothing
320
+ }
321
+
322
+ void optimizeParameters(ThreadPool& pool, _ModelState* localData, _RandGen* rgs)
323
+ {
324
+ }
325
+
326
+ template<typename _ExtraDocData>
327
+ void distributePartition(ThreadPool& pool, const _ModelState& globalState, _ModelState* localData, const _ExtraDocData& edd) const
328
+ {
329
+ std::vector<std::future<void>> res = pool.enqueueToAll([&](size_t partitionId)
330
+ {
331
+ size_t b = partitionId ? edd.vChunkOffset[partitionId - 1] : 0,
332
+ e = edd.vChunkOffset[partitionId];
333
+
334
+ localData[partitionId].numByTopicWord = globalState.numByTopicWord.block(0, b, globalState.numByTopicWord.rows(), e - b);
335
+ localData[partitionId].numByTopic = globalState.numByTopic;
336
+ });
337
+
338
+ for (auto& r : res) r.get();
339
+ }
340
+
341
+ void prepareDoc(_DocType& doc, size_t docId, size_t wordSize) const
342
+ {
343
+ BaseClass::prepareDoc(doc, docId, wordSize);
344
+ if (docId == (size_t)-1)
345
+ {
346
+ doc.eta.init(nullptr, this->K);
347
+ }
348
+ else
349
+ {
350
+ doc.eta.init((Float*)etaByDoc.col(docId).data(), this->K);
351
+ }
352
+ }
353
+
354
+ template<typename _DocIter>
355
+ double getLLDocs(_DocIter _first, _DocIter _last) const
356
+ {
357
+ double ll = 0;
358
+ // doc-topic distribution
359
+ for (; _first != _last; ++_first)
360
+ {
361
+ auto& doc = *_first;
362
+ // log P(eta | alpha)
363
+ ll -= (doc.eta.matrix() - alphas.col(doc.timepoint)).squaredNorm() / (2 * etaVar);
364
+ ll -= std::log(2 * math::pi * etaVar) / 2 * this->K;
365
+
366
+ // log P(z | eta)
367
+ Float etaMax = doc.eta.maxCoeff();
368
+ Eigen::Array<Float, -1, 1> normalizedEta = doc.eta.array()
369
+ - etaMax - std::log((doc.eta.array() - etaMax).exp().sum());
370
+ ll += (doc.numByTopic.template cast<Float>().array() * normalizedEta).sum();
371
+ }
372
+ return ll;
373
+ }
374
+
375
+ double getLLRest(const _ModelState& ld) const
376
+ {
377
+ double ll = 0;
378
+ const size_t V = this->realV;
379
+ for (Tid t = 0; t < T; ++t)
380
+ {
381
+ // topic-word distribution
382
+ for (Tid k = 0; k < this->K; ++k)
383
+ {
384
+ auto phi_tk = phi.col(k + this->K * t);
385
+ Float phiMax = phi_tk.maxCoeff();
386
+ Eigen::Array<Float, -1, 1> normalizedPhi = phi_tk.array()
387
+ - phiMax - std::log((phi_tk.array() - phiMax).exp().sum());
388
+ ll += (ld.numByTopicWord.row(k + this->K * t).transpose().template cast<Float>().array() * normalizedPhi).sum();
389
+
390
+ // log P(phi_t | phi_t-1)
391
+ if (t > 0)
392
+ {
393
+ ll -= (phi_tk - phi.col(k + this->K * (t - 1))).squaredNorm() / (2 * phiVar);
394
+ ll -= std::log(2 * math::pi * phiVar) / 2 * V;
395
+ }
396
+ }
397
+
398
+ // log P(alpha_t | alpha_t-1)
399
+ if (t > 0)
400
+ {
401
+ ll -= (alphas.col(t) - alphas.col(t - 1)).squaredNorm() / (2 * alphaVar);
402
+ ll -= std::log(2 * math::pi * alphaVar) / 2 * this->K;
403
+ }
404
+ }
405
+ return ll;
406
+ }
407
+
408
+ void initGlobalState(bool initDocs)
409
+ {
410
+ const size_t V = this->realV;
411
+ if (initDocs)
412
+ {
413
+ this->globalState.numByTopic = Eigen::Matrix<WeightType, -1, -1>::Zero(this->K, T);
414
+ this->globalState.numByTopicWord = Eigen::Matrix<WeightType, -1, -1>::Zero(this->K * T, V);
415
+
416
+ alphas = Eigen::Matrix<Float, -1, -1>::Zero(this->K, T);
417
+ etaByDoc = Eigen::Matrix<Float, -1, -1>::Zero(this->K, this->docs.size());
418
+ phi = Eigen::Matrix<Float, -1, -1>::Zero(this->realV, this->K * T);
419
+ }
420
+
421
+ numDocsByTime.resize(T);
422
+ wordAliasTables.resize(this->realV * this->T);
423
+
424
+ size_t docId = 0;
425
+ for (auto& doc : this->docs)
426
+ {
427
+ numDocsByTime[doc.timepoint]++;
428
+ if (!initDocs)
429
+ {
430
+ doc.eta.init((Float*)etaByDoc.col(docId++).data(), this->K);
431
+ }
432
+ }
433
+
434
+ for (Tid t = 0; t < T; ++t)
435
+ {
436
+ if (initDocs && !numDocsByTime[t]) THROW_ERROR_WITH_INFO(exception::InvalidArgument, text::format("No document with timepoint = %d", t));
437
+
438
+ // update alias tables for word proposal
439
+ for (Vid v = 0; v < this->realV; ++v)
440
+ {
441
+ Eigen::Array<Float, -1, 1> ps = phi.row(v).segment(this->K * t, this->K);
442
+ ps = ps.exp();
443
+ wordAliasTables[v + this->realV * t].buildTable(ps.data(), ps.data() + ps.size());
444
+ }
445
+ }
446
+ }
447
+
448
+ template<bool _Infer, typename _Generator>
449
+ void updateStateWithDoc(_Generator& g, _ModelState& ld, _RandGen& rgs, _DocType& doc, size_t i) const
450
+ {
451
+ auto& z = doc.Zs[i];
452
+ auto w = doc.words[i];
453
+ z = g.theta(rgs);
454
+ addWordTo<1>(ld, doc, i, w, z);
455
+ }
456
+
457
+ std::vector<Float> _getWidsByTopic(size_t tid) const
458
+ {
459
+ const size_t V = this->realV;
460
+ std::vector<Float> ret(V);
461
+ Eigen::Map<Eigen::Array<Float, -1, 1>> retMap(ret.data(), V);
462
+ retMap = phi.col(tid).array().exp();
463
+ retMap /= retMap.sum();
464
+ Eigen::Array<Float, -1, 1> t = this->globalState.numByTopicWord.row(tid).array().template cast<Float>();
465
+ t /= std::max(t.sum(), (Float)0.1);
466
+ retMap += t;
467
+ retMap /= 2;
468
+ return ret;
469
+ }
470
+
471
+ _DocType& _updateDoc(_DocType& doc, size_t timepoint) const
472
+ {
473
+ if (timepoint >= T) THROW_ERROR_WITH_INFO(exception::InvalidArgument, "timepoint must < T");
474
+ doc.timepoint = timepoint;
475
+ return doc;
476
+ }
477
+
478
+ std::vector<uint64_t> _getTopicsCount() const
479
+ {
480
+ std::vector<uint64_t> cnt(this->K * T);
481
+ for (auto& doc : this->docs)
482
+ {
483
+ for (size_t i = 0; i < doc.Zs.size(); ++i)
484
+ {
485
+ if (doc.words[i] < this->realV) ++cnt[doc.Zs[i] + this->K * doc.timepoint];
486
+ }
487
+ }
488
+ return cnt;
489
+ }
490
+
491
+ public:
492
+ DEFINE_SERIALIZER_AFTER_BASE_WITH_VERSION(BaseClass, 0,
493
+ T, shapeA, shapeB, shapeC, alphaVar, etaVar, phiVar, alphas, etaByDoc, phi);
494
+ DEFINE_TAGGED_SERIALIZER_AFTER_BASE_WITH_VERSION(BaseClass, 1, 0x00010001,
495
+ T, shapeA, shapeB, shapeC, alphaVar, etaVar, phiVar, alphas, etaByDoc, phi);
496
+
497
+ GETTER(T, size_t, T);
498
+ GETTER(NumDocsByT, std::vector<uint32_t>, numDocsByTime);
499
+ GETTER(AlphaVar, Float, alphaVar);
500
+ GETTER(EtaVar, Float, etaVar);
501
+ GETTER(PhiVar, Float, phiVar);
502
+
503
+ GETTER(ShapeA, Float, shapeA);
504
+ GETTER(ShapeB, Float, shapeB);
505
+ GETTER(ShapeC, Float, shapeC);
506
+
507
+ DTModel(size_t _K, size_t _T, Float _alphaVar, Float _etaVar, Float _phiVar,
508
+ Float _shapeA, Float _shapeB, Float _shapeC, Float _etaRegL2, size_t _rg)
509
+ : BaseClass{ _K, _alphaVar, _etaVar, _rg },
510
+ T{ _T }, alphaVar{ _alphaVar }, etaVar{ _etaVar }, phiVar{ _phiVar },
511
+ shapeA{ _shapeA }, shapeB{ _shapeB }, shapeC{ _shapeC }, etaRegL2{ _etaRegL2 }
512
+ {
513
+ }
514
+
515
+ size_t addDoc(const std::vector<std::string>& words, size_t timepoint) override
516
+ {
517
+ auto doc = this->_makeDoc(words);
518
+ return this->_addDoc(_updateDoc(doc, timepoint));
519
+ }
520
+
521
+ std::unique_ptr<DocumentBase> makeDoc(const std::vector<std::string>& words, size_t timepoint) const override
522
+ {
523
+ auto doc = as_mutable(this)->template _makeDoc<true>(words);
524
+ return make_unique<_DocType>(_updateDoc(doc, timepoint));
525
+ }
526
+
527
+ size_t addDoc(const std::string& rawStr, const RawDocTokenizer::Factory& tokenizer,
528
+ size_t timepoint) override
529
+ {
530
+ auto doc = this->template _makeRawDoc<false>(rawStr, tokenizer);
531
+ return this->_addDoc(_updateDoc(doc, timepoint));
532
+ }
533
+
534
+ std::unique_ptr<DocumentBase> makeDoc(const std::string& rawStr, const RawDocTokenizer::Factory& tokenizer,
535
+ size_t timepoint) const override
536
+ {
537
+ auto doc = as_mutable(this)->template _makeRawDoc<true>(rawStr, tokenizer);
538
+ return make_unique<_DocType>(_updateDoc(doc, timepoint));
539
+ }
540
+
541
+ size_t addDoc(const std::string& rawStr, const std::vector<Vid>& words,
542
+ const std::vector<uint32_t>& pos, const std::vector<uint16_t>& len,
543
+ size_t timepoint) override
544
+ {
545
+ auto doc = this->_makeRawDoc(rawStr, words, pos, len);
546
+ return this->_addDoc(_updateDoc(doc, timepoint));
547
+ }
548
+
549
+ std::unique_ptr<DocumentBase> makeDoc(const std::string& rawStr, const std::vector<Vid>& words,
550
+ const std::vector<uint32_t>& pos, const std::vector<uint16_t>& len,
551
+ size_t timepoint) const override
552
+ {
553
+ auto doc = this->_makeRawDoc(rawStr, words, pos, len);
554
+ return make_unique<_DocType>(_updateDoc(doc, timepoint));
555
+ }
556
+
557
+ Float getAlpha(size_t k, size_t t) const override
558
+ {
559
+ return alphas(k, t);
560
+ }
561
+
562
+ std::vector<Float> getPhi(size_t k, size_t t) const override
563
+ {
564
+ auto c = phi.col(k + this->K * t);
565
+ return { c.data(), c.data() + c.size() };
566
+ }
567
+
568
+ void setShapeA(Float a) override { shapeA = a; }
569
+ void setShapeB(Float b) override { shapeB = b; }
570
+ void setShapeC(Float c) override { shapeC = c; }
571
+ };
572
+ }