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,111 @@
1
+ /**
2
+ * @file Basic.h
3
+ * @author bab2min (bab2min@gmail.com)
4
+ * @brief
5
+ * @version 0.2.0
6
+ * @date 2020-06-22
7
+ *
8
+ * @copyright Copyright (c) 2020
9
+ *
10
+ */
11
+
12
+ #ifndef EIGENRAND_DISTS_BASIC_H
13
+ #define EIGENRAND_DISTS_BASIC_H
14
+
15
+ namespace Eigen
16
+ {
17
+ namespace internal
18
+ {
19
+ namespace constant
20
+ {
21
+ static constexpr double pi = 3.1415926535897932;
22
+ static constexpr double e = 2.7182818284590452;
23
+ }
24
+
25
+ template<typename Scalar, typename Rng>
26
+ struct scalar_randbits_op : public scalar_base_rng<Scalar, Rng>
27
+ {
28
+ static_assert(std::is_integral<Scalar>::value, "randBits needs integral types.");
29
+
30
+ using scalar_base_rng<Scalar, Rng>::scalar_base_rng;
31
+
32
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() () const
33
+ {
34
+ return pfirst(this->rng());
35
+ }
36
+
37
+ template<typename Packet>
38
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp() const
39
+ {
40
+ using RUtils = RawbitsMaker<Packet, Rng>;
41
+ return RUtils{}.rawbits(this->rng);
42
+ }
43
+ };
44
+
45
+ template<typename Scalar, typename Urng>
46
+ struct functor_traits<scalar_randbits_op<Scalar, Urng> >
47
+ {
48
+ enum { Cost = HugeCost, PacketAccess = packet_traits<Scalar>::Vectorizable, IsRepeatable = false };
49
+ };
50
+
51
+
52
+ template<typename Scalar, typename Rng>
53
+ struct scalar_uniform_real_op : public scalar_base_rng<Scalar, Rng>
54
+ {
55
+ static_assert(std::is_floating_point<Scalar>::value, "uniformReal needs floating point types.");
56
+
57
+ using scalar_base_rng<Scalar, Rng>::scalar_base_rng;
58
+
59
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() () const
60
+ {
61
+ return bit_scalar<Scalar>{}.to_ur(pfirst(this->rng()));
62
+ }
63
+
64
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar nzur_scalar() const
65
+ {
66
+ return bit_scalar<Scalar>{}.to_nzur(pfirst(this->rng()));
67
+ }
68
+
69
+ template<typename Packet>
70
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp() const
71
+ {
72
+ using RUtils = RandUtils<Packet, Rng>;
73
+ return RUtils{}.uniform_real(this->rng);
74
+ }
75
+ };
76
+
77
+ template<typename Scalar, typename Urng>
78
+ struct functor_traits<scalar_uniform_real_op<Scalar, Urng> >
79
+ {
80
+ enum { Cost = HugeCost, PacketAccess = packet_traits<Scalar>::Vectorizable, IsRepeatable = false };
81
+ };
82
+
83
+ template<typename Scalar, typename Rng>
84
+ struct scalar_balanced_op : public scalar_base_rng<Scalar, Rng>
85
+ {
86
+ static_assert(std::is_floating_point<Scalar>::value, "balanced needs floating point types.");
87
+
88
+ using scalar_base_rng<Scalar, Rng>::scalar_base_rng;
89
+
90
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() () const
91
+ {
92
+ return ((Scalar)((int32_t)pfirst(this->rng()) & 0x7FFFFFFF) / 0x7FFFFFFF) * 2 - 1;
93
+ }
94
+
95
+ template<typename Packet>
96
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp() const
97
+ {
98
+ using RUtils = RandUtils<Packet, Rng>;
99
+ return RUtils{}.balanced(this->rng);
100
+ }
101
+ };
102
+
103
+ template<typename Scalar, typename Urng>
104
+ struct functor_traits<scalar_balanced_op<Scalar, Urng> >
105
+ {
106
+ enum { Cost = HugeCost, PacketAccess = packet_traits<Scalar>::Vectorizable, IsRepeatable = false };
107
+ };
108
+ }
109
+ }
110
+
111
+ #endif
@@ -0,0 +1,877 @@
1
+ /**
2
+ * @file Discrete.h
3
+ * @author bab2min (bab2min@gmail.com)
4
+ * @brief
5
+ * @version 0.2.0
6
+ * @date 2020-06-22
7
+ *
8
+ * @copyright Copyright (c) 2020
9
+ *
10
+ */
11
+
12
+ #ifndef EIGENRAND_DISTS_DISCRETE_H
13
+ #define EIGENRAND_DISTS_DISCRETE_H
14
+
15
+ #include <memory>
16
+ #include <iterator>
17
+ #include <limits>
18
+
19
+ namespace Eigen
20
+ {
21
+ namespace internal
22
+ {
23
+ template<typename Scalar, typename Rng>
24
+ struct scalar_uniform_int_op : public scalar_randbits_op<Scalar, Rng>
25
+ {
26
+ static_assert(std::is_same<Scalar, int32_t>::value, "uniformInt needs integral types.");
27
+ using ur_base = scalar_randbits_op<Scalar, Rng>;
28
+
29
+ Scalar pmin;
30
+ size_t pdiff, bitsize, bitmask;
31
+
32
+ scalar_uniform_int_op(const Rng& _rng, Scalar _min, Scalar _max)
33
+ : ur_base{ _rng }, pmin{ _min }, pdiff{ (size_t)(_max - _min) }
34
+ {
35
+ if ((pdiff + 1) > pdiff)
36
+ {
37
+ bitsize = (size_t)std::ceil(std::log2(pdiff + 1));
38
+ }
39
+ else
40
+ {
41
+ bitsize = (size_t)std::ceil(std::log2(pdiff));
42
+ }
43
+ bitmask = (Scalar)(((size_t)-1) >> (sizeof(size_t) * 8 - bitsize));
44
+ }
45
+
46
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() () const
47
+ {
48
+ auto rx = ur_base::operator()();
49
+ if (pdiff == bitmask)
50
+ {
51
+ return (Scalar)(rx & bitmask) + pmin;
52
+ }
53
+ else
54
+ {
55
+ size_t bitcnt = bitsize;
56
+ while (1)
57
+ {
58
+ Scalar cands = (Scalar)(rx & bitmask);
59
+ if (cands <= pdiff) return cands;
60
+ if (bitcnt + bitsize < 32)
61
+ {
62
+ rx >>= bitsize;
63
+ bitcnt += bitsize;
64
+ }
65
+ else
66
+ {
67
+ rx = ur_base::operator()();
68
+ bitcnt = bitsize;
69
+ }
70
+ }
71
+ }
72
+ }
73
+
74
+ template<typename Packet>
75
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp() const
76
+ {
77
+ auto rx = ur_base::template packetOp<Packet>();
78
+ auto pbitmask = pset1<Packet>(bitmask);
79
+ if (pdiff == bitmask)
80
+ {
81
+ return padd(pand(rx, pbitmask), pset1<Packet>(pmin));
82
+ }
83
+ else
84
+ {
85
+ auto& cm = Rand::detail::CompressMask<sizeof(Packet)>::get_inst();
86
+ thread_local Packet cache_rest;
87
+ thread_local int cache_rest_cnt;
88
+ thread_local const scalar_uniform_int_op* cache_ptr = nullptr;
89
+ if (cache_ptr != this)
90
+ {
91
+ cache_ptr = this;
92
+ cache_rest = pset1<Packet>(0);
93
+ cache_rest_cnt = 0;
94
+ }
95
+
96
+ auto plen = pset1<Packet>(pdiff + 1);
97
+ size_t bitcnt = bitsize;
98
+ while (1)
99
+ {
100
+ // accept cands that only < plen
101
+ auto cands = pand(rx, pbitmask);
102
+ bool full = false;
103
+ cache_rest_cnt = cm.compress_append(cands, pcmplt(cands, plen),
104
+ cache_rest, cache_rest_cnt, full);
105
+ if (full) return padd(cands, pset1<Packet>(pmin));
106
+
107
+ if (bitcnt + bitsize < 32)
108
+ {
109
+ rx = psrl(rx, bitsize);
110
+ bitcnt += bitsize;
111
+ }
112
+ else
113
+ {
114
+ rx = ur_base::template packetOp<Packet>();
115
+ bitcnt = bitsize;
116
+ }
117
+ }
118
+ }
119
+ }
120
+ };
121
+
122
+ template<typename Scalar, typename Urng>
123
+ struct functor_traits<scalar_uniform_int_op<Scalar, Urng> >
124
+ {
125
+ enum { Cost = HugeCost, PacketAccess = packet_traits<Scalar>::Vectorizable, IsRepeatable = false };
126
+ };
127
+
128
+ template<typename _Precision = uint32_t, typename _Size = uint32_t>
129
+ class AliasMethod
130
+ {
131
+ std::unique_ptr<_Precision[]> arr;
132
+ std::unique_ptr<_Size[]> alias;
133
+ size_t msize = 0, bitsize = 0, bitmask = 0;
134
+
135
+ public:
136
+ AliasMethod()
137
+ {
138
+ }
139
+
140
+ AliasMethod(const AliasMethod& o)
141
+ {
142
+ operator=(o);
143
+ }
144
+
145
+ AliasMethod(AliasMethod&& o)
146
+ {
147
+ operator=(o);
148
+ }
149
+
150
+ AliasMethod& operator=(const AliasMethod& o)
151
+ {
152
+ msize = o.msize;
153
+ bitsize = o.bitsize;
154
+ bitmask = o.bitmask;
155
+ if (msize)
156
+ {
157
+ arr = std::unique_ptr<_Precision[]>(new _Precision[1 << bitsize]);
158
+ alias = std::unique_ptr<_Size[]>(new _Size[1 << bitsize]);
159
+
160
+ std::copy(o.arr.get(), o.arr.get() + (1 << bitsize), arr.get());
161
+ std::copy(o.alias.get(), o.alias.get() + (1 << bitsize), alias.get());
162
+ }
163
+ return *this;
164
+ }
165
+
166
+ AliasMethod& operator=(AliasMethod&& o)
167
+ {
168
+ msize = o.msize;
169
+ bitsize = o.bitsize;
170
+ bitmask = o.bitmask;
171
+ std::swap(arr, o.arr);
172
+ std::swap(alias, o.alias);
173
+ return *this;
174
+ }
175
+
176
+ template<typename _Iter>
177
+ AliasMethod(_Iter first, _Iter last)
178
+ {
179
+ buildTable(first, last);
180
+ }
181
+
182
+ template<typename _Iter>
183
+ void buildTable(_Iter first, _Iter last)
184
+ {
185
+ size_t psize, nbsize;
186
+ msize = 0;
187
+ double sum = 0;
188
+ for (auto it = first; it != last; ++it, ++msize)
189
+ {
190
+ sum += *it;
191
+ }
192
+
193
+ if (!std::isfinite(sum)) throw std::invalid_argument{ "cannot build NaN value distribution" };
194
+
195
+ // ceil to power of 2
196
+ nbsize = (size_t)std::ceil(std::log2(msize));
197
+ psize = (size_t)1 << nbsize;
198
+
199
+ if (nbsize != bitsize)
200
+ {
201
+ arr = std::unique_ptr<_Precision[]>(new _Precision[psize]);
202
+ std::fill(arr.get(), arr.get() + psize, 0);
203
+ alias = std::unique_ptr<_Size[]>(new _Size[psize]);
204
+ bitsize = nbsize;
205
+ bitmask = ((size_t)(-1)) >> (sizeof(size_t) * 8 - bitsize);
206
+ }
207
+
208
+ sum /= psize;
209
+
210
+ auto f = std::unique_ptr<double[]>(new double[psize]);
211
+ auto pf = f.get();
212
+ for (auto it = first; it != last; ++it, ++pf)
213
+ {
214
+ *pf = *it / sum;
215
+ }
216
+ std::fill(pf, pf + psize - msize, 0);
217
+
218
+ size_t over = 0, under = 0, mm;
219
+ while (over < psize && f[over] < 1) ++over;
220
+ while (under < psize && f[under] >= 1) ++under;
221
+ mm = under + 1;
222
+
223
+ while (over < psize && under < psize)
224
+ {
225
+ if (std::is_integral<_Precision>::value)
226
+ {
227
+ arr[under] = (_Precision)(f[under] * (std::numeric_limits<_Precision>::max() + 1.0));
228
+ }
229
+ else
230
+ {
231
+ arr[under] = (_Precision)f[under];
232
+ }
233
+ alias[under] = over;
234
+ f[over] += f[under] - 1;
235
+ if (f[over] >= 1 || mm <= over)
236
+ {
237
+ for (under = mm; under < psize && f[under] >= 1; ++under);
238
+ mm = under + 1;
239
+ }
240
+ else
241
+ {
242
+ under = over;
243
+ }
244
+
245
+ while (over < psize && f[over] < 1) ++over;
246
+ }
247
+
248
+ for (; over < psize; ++over)
249
+ {
250
+ if (f[over] >= 1)
251
+ {
252
+ if (std::is_integral<_Precision>::value)
253
+ {
254
+ arr[over] = std::numeric_limits<_Precision>::max();
255
+ }
256
+ else
257
+ {
258
+ arr[over] = 1;
259
+ }
260
+ alias[over] = over;
261
+ }
262
+ }
263
+
264
+ if (under < psize)
265
+ {
266
+ if (std::is_integral<_Precision>::value)
267
+ {
268
+ arr[under] = std::numeric_limits<_Precision>::max();
269
+ }
270
+ else
271
+ {
272
+ arr[under] = 1;
273
+ }
274
+ alias[under] = under;
275
+ for (under = mm; under < msize; ++under)
276
+ {
277
+ if (f[under] < 1)
278
+ {
279
+ if (std::is_integral<_Precision>::value)
280
+ {
281
+ arr[under] = std::numeric_limits<_Precision>::max();
282
+ }
283
+ else
284
+ {
285
+ arr[under] = 1;
286
+ }
287
+ alias[under] = under;
288
+ }
289
+ }
290
+ }
291
+ }
292
+
293
+ size_t get_bitsize() const
294
+ {
295
+ return bitsize;
296
+ }
297
+
298
+ size_t get_bitmask() const
299
+ {
300
+ return bitmask;
301
+ }
302
+
303
+ const _Precision* get_prob() const
304
+ {
305
+ return arr.get();
306
+ }
307
+
308
+ const _Size* get_alias() const
309
+ {
310
+ return alias.get();
311
+ }
312
+ };
313
+
314
+ template<typename Scalar, typename Rng, typename Precision = float>
315
+ struct scalar_discrete_dist_op;
316
+
317
+ template<typename Scalar, typename Rng>
318
+ struct scalar_discrete_dist_op<Scalar, Rng, int32_t> : public scalar_randbits_op<Scalar, Rng>
319
+ {
320
+ static_assert(std::is_same<Scalar, int32_t>::value, "discreteDist needs integral types.");
321
+ using ur_base = scalar_randbits_op<Scalar, Rng>;
322
+
323
+ std::vector<uint32_t> cdf;
324
+ AliasMethod<int32_t, Scalar> alias_table;
325
+
326
+ template<typename RealIter>
327
+ scalar_discrete_dist_op(const Rng& _rng, RealIter first, RealIter last)
328
+ : ur_base{ _rng }
329
+ {
330
+ if (std::distance(first, last) < 16)
331
+ {
332
+ // use linear or binary search
333
+ std::vector<double> _cdf;
334
+ double acc = 0;
335
+ for (; first != last; ++first)
336
+ {
337
+ _cdf.emplace_back(acc += *first);
338
+ }
339
+
340
+ for (auto& p : _cdf)
341
+ {
342
+ cdf.emplace_back((uint32_t)(p / _cdf.back() * 0x80000000));
343
+ }
344
+ }
345
+ else
346
+ {
347
+ // use alias table
348
+ alias_table = AliasMethod<int32_t, Scalar>{ first, last };
349
+ }
350
+ }
351
+
352
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() () const
353
+ {
354
+ if (!cdf.empty())
355
+ {
356
+ auto rx = ur_base::operator()() & 0x7FFFFFFF;
357
+ return (Scalar)(std::lower_bound(cdf.begin(), cdf.end() - 1, rx) - cdf.begin());
358
+ }
359
+ else
360
+ {
361
+ auto rx = ur_base::operator()();
362
+ auto albit = rx & alias_table.get_bitmask();
363
+ uint32_t alx = (uint32_t)(rx >> (sizeof(rx) * 8 - 31));
364
+ if (alx < alias_table.get_prob()[albit]) return albit;
365
+ return alias_table.get_alias()[albit];
366
+ }
367
+ }
368
+
369
+ template<typename Packet>
370
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp() const
371
+ {
372
+ #ifdef EIGEN_VECTORIZE_AVX2
373
+ thread_local Packet4i cache;
374
+ thread_local const scalar_discrete_dist_op* cache_ptr = nullptr;
375
+ if (cache_ptr == this)
376
+ {
377
+ cache_ptr = nullptr;
378
+ return cache;
379
+ }
380
+
381
+ using PacketType = Packet8i;
382
+ #else
383
+ using PacketType = Packet;
384
+ #endif
385
+
386
+ PacketType ret;
387
+ if (!cdf.empty())
388
+ {
389
+ ret = pset1<PacketType>(cdf.size() - 1);
390
+ auto rx = pand(ur_base::template packetOp<PacketType>(), pset1<PacketType>(0x7FFFFFFF));
391
+ for (size_t i = 0; i < cdf.size() - 1; ++i)
392
+ {
393
+ ret = padd(ret, pcmplt(rx, pset1<PacketType>(cdf[i])));
394
+ }
395
+ }
396
+ else
397
+ {
398
+ auto rx = ur_base::template packetOp<PacketType>();
399
+ auto albit = pand(rx, pset1<PacketType>(alias_table.get_bitmask()));
400
+ auto c = pcmplt(psrl(rx, 1), pgather(alias_table.get_prob(), albit));
401
+ ret = pblendv(c, albit, pgather(alias_table.get_alias(), albit));
402
+ }
403
+
404
+ #ifdef EIGEN_VECTORIZE_AVX2
405
+ cache = _mm256_extractf128_si256(ret, 1);
406
+ cache_ptr = this;
407
+ return _mm256_extractf128_si256(ret, 0);
408
+ #else
409
+ return ret;
410
+ #endif
411
+ }
412
+ };
413
+
414
+ template<typename Scalar, typename Rng>
415
+ struct scalar_discrete_dist_op<Scalar, Rng, float> : public scalar_uniform_real_op<float, Rng>
416
+ {
417
+ static_assert(std::is_same<Scalar, int32_t>::value, "discreteDist needs integral types.");
418
+ using ur_base = scalar_uniform_real_op<float, Rng>;
419
+
420
+ std::vector<float> cdf;
421
+ AliasMethod<float, Scalar> alias_table;
422
+
423
+ template<typename RealIter>
424
+ scalar_discrete_dist_op(const Rng& _rng, RealIter first, RealIter last)
425
+ : ur_base{ _rng }
426
+ {
427
+ if (std::distance(first, last) < 16)
428
+ {
429
+ // use linear or binary search
430
+ std::vector<double> _cdf;
431
+ double acc = 0;
432
+ for (; first != last; ++first)
433
+ {
434
+ _cdf.emplace_back(acc += *first);
435
+ }
436
+
437
+ for (auto& p : _cdf)
438
+ {
439
+ cdf.emplace_back(p / _cdf.back());
440
+ }
441
+ }
442
+ else
443
+ {
444
+ // use alias table
445
+ alias_table = AliasMethod<float, Scalar>{ first, last };
446
+ }
447
+ }
448
+
449
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() () const
450
+ {
451
+ if (!cdf.empty())
452
+ {
453
+ auto rx = ur_base::operator()();
454
+ return (Scalar)(std::lower_bound(cdf.begin(), cdf.end() - 1, rx) - cdf.begin());
455
+ }
456
+ else
457
+ {
458
+ auto albit = pfirst(this->rng()) & alias_table.get_bitmask();
459
+ auto alx = ur_base::operator()();
460
+ if (alx < alias_table.get_prob()[albit]) return albit;
461
+ return alias_table.get_alias()[albit];
462
+ }
463
+ }
464
+
465
+ template<typename Packet>
466
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp() const
467
+ {
468
+ using PacketType = decltype(reinterpret_to_float(std::declval<Packet>()));
469
+
470
+ if (!cdf.empty())
471
+ {
472
+ auto ret = pset1<Packet>(cdf.size());
473
+ auto rx = ur_base::template packetOp<PacketType>();
474
+ for (auto& p : cdf)
475
+ {
476
+ ret = padd(ret, reinterpret_to_int(pcmplt(rx, pset1<PacketType>(p))));
477
+ }
478
+ return ret;
479
+ }
480
+ else
481
+ {
482
+ using RUtils = RawbitsMaker<Packet, Rng>;
483
+ auto albit = pand(RUtils{}.rawbits(this->rng), pset1<Packet>(alias_table.get_bitmask()));
484
+ auto c = reinterpret_to_int(pcmplt(ur_base::template packetOp<PacketType>(), pgather(alias_table.get_prob(), albit)));
485
+ return pblendv(c, albit, pgather(alias_table.get_alias(), albit));
486
+ }
487
+ }
488
+ };
489
+
490
+ template<typename Scalar, typename Rng>
491
+ struct scalar_discrete_dist_op<Scalar, Rng, double> : public scalar_uniform_real_op<double, Rng>
492
+ {
493
+ static_assert(std::is_same<Scalar, int32_t>::value, "discreteDist needs integral types.");
494
+ using ur_base = scalar_uniform_real_op<double, Rng>;
495
+
496
+ std::vector<double> cdf;
497
+ AliasMethod<double, Scalar> alias_table;
498
+
499
+ template<typename RealIter>
500
+ scalar_discrete_dist_op(const Rng& _rng, RealIter first, RealIter last)
501
+ : ur_base{ _rng }
502
+ {
503
+ if (std::distance(first, last) < 16)
504
+ {
505
+ // use linear or binary search
506
+ std::vector<double> _cdf;
507
+ double acc = 0;
508
+ for (; first != last; ++first)
509
+ {
510
+ _cdf.emplace_back(acc += *first);
511
+ }
512
+
513
+ for (auto& p : _cdf)
514
+ {
515
+ cdf.emplace_back(p / _cdf.back());
516
+ }
517
+ }
518
+ else
519
+ {
520
+ // use alias table
521
+ alias_table = AliasMethod<double, Scalar>{ first, last };
522
+ }
523
+ }
524
+
525
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() () const
526
+ {
527
+ if (!cdf.empty())
528
+ {
529
+ auto rx = ur_base::operator()();
530
+ return (Scalar)(std::lower_bound(cdf.begin(), cdf.end() - 1, rx) - cdf.begin());
531
+ }
532
+ else
533
+ {
534
+ auto albit = pfirst(this->rng()) & alias_table.get_bitmask();
535
+ auto alx = ur_base::operator()();
536
+ if (alx < alias_table.get_prob()[albit]) return albit;
537
+ return alias_table.get_alias()[albit];
538
+ }
539
+ }
540
+
541
+ template<typename Packet>
542
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp() const
543
+ {
544
+ using DPacket = decltype(reinterpret_to_double(std::declval<Packet>()));
545
+ if (!cdf.empty())
546
+ {
547
+ auto ret = pset1<Packet>(cdf.size());
548
+ #ifdef EIGEN_VECTORIZE_AVX
549
+ auto rx = ur_base::template packetOp<Packet4d>();
550
+ for (auto& p : cdf)
551
+ {
552
+ auto c = reinterpret_to_int(pcmplt(rx, pset1<decltype(rx)>(p)));
553
+ auto r = combine_low32(c);
554
+ ret = padd(ret, r);
555
+ }
556
+ #else
557
+ auto rx1 = ur_base::template packetOp<DPacket>(),
558
+ rx2 = ur_base::template packetOp<DPacket>();
559
+ for (auto& p : cdf)
560
+ {
561
+ auto pp = pset1<decltype(rx1)>(p);
562
+ ret = padd(ret, combine_low32(reinterpret_to_int(pcmplt(rx1, pp)), reinterpret_to_int(pcmplt(rx2, pp))));
563
+ }
564
+ #endif
565
+ return ret;
566
+ }
567
+ else
568
+ {
569
+ #ifdef EIGEN_VECTORIZE_AVX
570
+ using RUtils = RawbitsMaker<Packet, Rng>;
571
+ auto albit = pand(RUtils{}.rawbits(this->rng), pset1<Packet>(alias_table.get_bitmask()));
572
+ auto c = reinterpret_to_int(pcmplt(ur_base::template packetOp<Packet4d>(), pgather(alias_table.get_prob(), _mm256_castsi128_si256(albit))));
573
+ return pblendv(combine_low32(c), albit, pgather(alias_table.get_alias(), albit));
574
+ #else
575
+ using RUtils = RawbitsMaker<Packet, Rng>;
576
+ auto albit = pand(RUtils{}.rawbits(this->rng), pset1<Packet>(alias_table.get_bitmask()));
577
+ auto c1 = reinterpret_to_int(pcmplt(ur_base::template packetOp<DPacket>(), pgather(alias_table.get_prob(), albit)));
578
+ auto c2 = reinterpret_to_int(pcmplt(ur_base::template packetOp<DPacket>(), pgather(alias_table.get_prob(), albit, true)));
579
+ return pblendv(combine_low32(c1, c2), albit, pgather(alias_table.get_alias(), albit));
580
+ #endif
581
+ }
582
+ }
583
+ };
584
+
585
+ template<typename Scalar, typename Urng, typename Precision>
586
+ struct functor_traits<scalar_discrete_dist_op<Scalar, Urng, Precision> >
587
+ {
588
+ enum { Cost = HugeCost, PacketAccess = packet_traits<Scalar>::Vectorizable, IsRepeatable = false };
589
+ };
590
+
591
+ template<typename Scalar, typename Rng>
592
+ struct scalar_poisson_dist_op : public scalar_uniform_real_op<float, Rng>
593
+ {
594
+ static_assert(std::is_same<Scalar, int32_t>::value, "poisson needs integral types.");
595
+ using ur_base = scalar_uniform_real_op<float, Rng>;
596
+
597
+ double mean, ne_mean, sqrt_tmean, log_mean, g1;
598
+
599
+ scalar_poisson_dist_op(const Rng& _rng, double _mean)
600
+ : ur_base{ _rng }, mean{ _mean }, ne_mean{ std::exp(-_mean) }
601
+ {
602
+ sqrt_tmean = std::sqrt(2 * mean);
603
+ log_mean = std::log(mean);
604
+ g1 = mean * log_mean - std::lgamma(mean + 1);
605
+ }
606
+
607
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() () const
608
+ {
609
+ if (mean < 12)
610
+ {
611
+ Scalar res = 0;
612
+ double val = 1;
613
+ for (; ; ++res)
614
+ {
615
+ val *= ur_base::operator()();
616
+ if (val <= ne_mean) break;
617
+ }
618
+ return res;
619
+ }
620
+ else
621
+ {
622
+ Scalar res;
623
+ double yx;
624
+ while(1)
625
+ {
626
+ yx = std::tan(constant::pi * ur_base::operator()());
627
+ res = (Scalar)(sqrt_tmean * yx + mean);
628
+ if (res >= 0 && ur_base::operator()() <= 0.9 * (1.0 + yx * yx)
629
+ * std::exp(res * log_mean - std::lgamma(res + 1.0) - g1))
630
+ {
631
+ return res;
632
+ }
633
+ }
634
+ }
635
+ }
636
+
637
+ template<typename Packet>
638
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp() const
639
+ {
640
+ using PacketType = decltype(reinterpret_to_float(std::declval<Packet>()));
641
+
642
+ if (mean < 12)
643
+ {
644
+ Packet res = pset1<Packet>(0);
645
+ PacketType val = pset1<PacketType>(1), pne_mean = pset1<PacketType>(ne_mean);
646
+ while (1)
647
+ {
648
+ val = pmul(val, ur_base::template packetOp<PacketType>());
649
+ auto c = reinterpret_to_int(pcmplt(pne_mean, val));
650
+ if (pmovemask(c) == 0) break;
651
+ res = padd(res, pnegate(c));
652
+ }
653
+ return res;
654
+ }
655
+ else
656
+ {
657
+ auto& cm = Rand::detail::CompressMask<sizeof(Packet)>::get_inst();
658
+ thread_local PacketType cache_rest;
659
+ thread_local int cache_rest_cnt;
660
+ thread_local const scalar_poisson_dist_op* cache_ptr = nullptr;
661
+ if (cache_ptr != this)
662
+ {
663
+ cache_ptr = this;
664
+ cache_rest = pset1<PacketType>(0);
665
+ cache_rest_cnt = 0;
666
+ }
667
+
668
+ const PacketType ppi = pset1<PacketType>(constant::pi),
669
+ psqrt_tmean = pset1<PacketType>(sqrt_tmean),
670
+ pmean = pset1<PacketType>(mean),
671
+ plog_mean = pset1<PacketType>(log_mean),
672
+ pg1 = pset1<PacketType>(g1);
673
+ while (1)
674
+ {
675
+ PacketType fres, yx, psin, pcos;
676
+ psincos(pmul(ppi, ur_base::template packetOp<PacketType>()), psin, pcos);
677
+ yx = pdiv(psin, pcos);
678
+ fres = ptruncate(padd(pmul(psqrt_tmean, yx), pmean));
679
+
680
+ auto p1 = pmul(padd(pmul(yx, yx), pset1<PacketType>(1)), pset1<PacketType>(0.9));
681
+ auto p2 = pexp(psub(psub(pmul(fres, plog_mean), plgamma(padd(fres, pset1<PacketType>(1)))), pg1));
682
+
683
+ auto c1 = pcmple(pset1<PacketType>(0), fres);
684
+ auto c2 = pcmple(ur_base::template packetOp<PacketType>(), pmul(p1, p2));
685
+
686
+ auto cands = fres;
687
+ bool full = false;
688
+ cache_rest_cnt = cm.compress_append(cands, pand(c1, c2),
689
+ cache_rest, cache_rest_cnt, full);
690
+ if (full) return pcast<PacketType, Packet>(cands);
691
+ }
692
+ }
693
+ }
694
+ };
695
+
696
+ template<typename Scalar, typename Urng>
697
+ struct functor_traits<scalar_poisson_dist_op<Scalar, Urng> >
698
+ {
699
+ enum { Cost = HugeCost, PacketAccess = packet_traits<Scalar>::Vectorizable, IsRepeatable = false };
700
+ };
701
+
702
+ template<typename Scalar, typename Rng>
703
+ struct scalar_binomial_dist_op : public scalar_poisson_dist_op<Scalar, Rng>
704
+ {
705
+ static_assert(std::is_same<Scalar, int32_t>::value, "binomial needs integral types.");
706
+ using ur_base = scalar_uniform_real_op<float, Rng>;
707
+
708
+ Scalar trials;
709
+ double p, small_p, g1, sqrt_v, log_small_p, log_small_q;
710
+
711
+ scalar_binomial_dist_op(const Rng& _rng, Scalar _trials = 1, double _p = 0.5)
712
+ : scalar_poisson_dist_op<Scalar, Rng>{ _rng, _trials * std::min(_p, 1 - _p) },
713
+ trials{ _trials }, p{ _p }, small_p{ std::min(p, 1 - p) }
714
+
715
+ {
716
+ g1 = std::lgamma(trials + 1);
717
+ sqrt_v = std::sqrt(2 * this->mean * (1 - small_p));
718
+ log_small_p = std::log(small_p);
719
+ log_small_q = std::log(1 - small_p);
720
+ }
721
+
722
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() () const
723
+ {
724
+ Scalar res;
725
+ if (trials < 25)
726
+ {
727
+ res = 0;
728
+ for (int i = 0; i < trials; ++i)
729
+ {
730
+ if (ur_base::operator()() < p) ++res;
731
+ }
732
+ return res;
733
+ }
734
+ else if (this->mean < 1.0)
735
+ {
736
+ res = scalar_poisson_dist_op<Scalar, Rng>::operator()();
737
+ }
738
+ else
739
+ {
740
+ while(1)
741
+ {
742
+ double ys;
743
+ ys = std::tan(constant::pi * ur_base::operator()());
744
+ res = (Scalar)(sqrt_v * ys + this->mean);
745
+ if (0 <= res && res <= trials && ur_base::operator()() <= 1.2 * sqrt_v
746
+ * (1.0 + ys * ys)
747
+ * std::exp(g1 - std::lgamma(res + 1)
748
+ - std::lgamma(trials - res + 1.0)
749
+ + res * log_small_p
750
+ + (trials - res) * log_small_q)
751
+ )
752
+ {
753
+ break;
754
+ }
755
+ }
756
+ }
757
+ return p == small_p ? res : trials - res;
758
+ }
759
+
760
+ template<typename Packet>
761
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp() const
762
+ {
763
+ using PacketType = decltype(reinterpret_to_float(std::declval<Packet>()));
764
+ Packet res;
765
+ if (trials < 25)
766
+ {
767
+ PacketType pp = pset1<PacketType>(p);
768
+ res = pset1<Packet>(trials);
769
+ for (int i = 0; i < trials; ++i)
770
+ {
771
+ auto c = reinterpret_to_int(pcmple(pp, ur_base::template packetOp<PacketType>()));
772
+ res = padd(res, c);
773
+ }
774
+ return res;
775
+ }
776
+ else if (this->mean < 1.0)
777
+ {
778
+ res = scalar_poisson_dist_op<Scalar, Rng>::template packetOp<Packet>();
779
+ }
780
+ else
781
+ {
782
+ auto& cm = Rand::detail::CompressMask<sizeof(Packet)>::get_inst();
783
+ thread_local PacketType cache_rest;
784
+ thread_local int cache_rest_cnt;
785
+ thread_local const scalar_binomial_dist_op* cache_ptr = nullptr;
786
+ if (cache_ptr != this)
787
+ {
788
+ cache_ptr = this;
789
+ cache_rest = pset1<PacketType>(0);
790
+ cache_rest_cnt = 0;
791
+ }
792
+
793
+ const PacketType ppi = pset1<PacketType>(constant::pi),
794
+ ptrials = pset1<PacketType>(trials),
795
+ psqrt_v = pset1<PacketType>(sqrt_v),
796
+ pmean = pset1<PacketType>(this->mean),
797
+ plog_small_p = pset1<PacketType>(log_small_p),
798
+ plog_small_q = pset1<PacketType>(log_small_q),
799
+ pg1 = pset1<PacketType>(g1);
800
+ while (1)
801
+ {
802
+ PacketType fres, ys, psin, pcos;
803
+ psincos(pmul(ppi, ur_base::template packetOp<PacketType>()), psin, pcos);
804
+ ys = pdiv(psin, pcos);
805
+ fres = ptruncate(padd(pmul(psqrt_v, ys), pmean));
806
+
807
+ auto p1 = pmul(pmul(pset1<PacketType>(1.2), psqrt_v), padd(pset1<PacketType>(1), pmul(ys, ys)));
808
+ auto p2 = pexp(
809
+ padd(padd(psub(
810
+ psub(pg1, plgamma(padd(fres, pset1<PacketType>(1)))),
811
+ plgamma(psub(padd(ptrials, pset1<PacketType>(1)), fres))
812
+ ), pmul(fres, plog_small_p)), pmul(psub(ptrials, fres), plog_small_q))
813
+ );
814
+
815
+ auto c1 = pand(pcmple(pset1<PacketType>(0), fres), pcmple(fres, ptrials));
816
+ auto c2 = pcmple(ur_base::template packetOp<PacketType>(), pmul(p1, p2));
817
+
818
+ auto cands = fres;
819
+ bool full = false;
820
+ cache_rest_cnt = cm.compress_append(cands, pand(c1, c2),
821
+ cache_rest, cache_rest_cnt, full);
822
+ if (full)
823
+ {
824
+ res = pcast<PacketType, Packet>(cands);
825
+ break;
826
+ }
827
+ }
828
+ }
829
+ return p == small_p ? res : psub(pset1<Packet>(trials), res);
830
+ }
831
+ };
832
+
833
+ template<typename Scalar, typename Urng>
834
+ struct functor_traits<scalar_binomial_dist_op<Scalar, Urng> >
835
+ {
836
+ enum { Cost = HugeCost, PacketAccess = packet_traits<Scalar>::Vectorizable, IsRepeatable = false };
837
+ };
838
+
839
+ template<typename Scalar, typename Rng>
840
+ struct scalar_geometric_dist_op : public scalar_uniform_real_op<float, Rng>
841
+ {
842
+ static_assert(std::is_same<Scalar, int32_t>::value, "geomtric needs integral types.");
843
+ using ur_base = scalar_uniform_real_op<float, Rng>;
844
+
845
+ double p, rlog_q;
846
+
847
+ scalar_geometric_dist_op(const Rng& _rng, double _p)
848
+ : ur_base{ _rng }, p{ _p }, rlog_q{ 1 / std::log(1 - p) }
849
+ {
850
+ }
851
+
852
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() () const
853
+ {
854
+ return (Scalar)(std::log(1 - ur_base::operator()()) * rlog_q);
855
+ }
856
+
857
+ template<typename Packet>
858
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp() const
859
+ {
860
+ using PacketType = decltype(reinterpret_to_float(std::declval<Packet>()));
861
+
862
+ return pcast<PacketType, Packet>(ptruncate(pmul(plog(
863
+ psub(pset1<PacketType>(1), ur_base::template packetOp<PacketType>())
864
+ ), pset1<PacketType>(rlog_q))));
865
+ }
866
+ };
867
+
868
+ template<typename Scalar, typename Urng>
869
+ struct functor_traits<scalar_geometric_dist_op<Scalar, Urng> >
870
+ {
871
+ enum { Cost = HugeCost, PacketAccess = packet_traits<Scalar>::Vectorizable, IsRepeatable = false };
872
+ };
873
+
874
+ }
875
+ }
876
+
877
+ #endif