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,286 @@
1
+ /**
2
+ * @file PacketFilter.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_PACKET_FILTER_H
13
+ #define EIGENRAND_PACKET_FILTER_H
14
+
15
+ #include <array>
16
+ #include <EigenRand/MorePacketMath.h>
17
+
18
+ namespace Eigen
19
+ {
20
+ namespace Rand
21
+ {
22
+ namespace detail
23
+ {
24
+ template<size_t PacketSize>
25
+ class CompressMask;
26
+ }
27
+ }
28
+ }
29
+ #ifdef EIGEN_VECTORIZE_AVX
30
+ #include <immintrin.h>
31
+ namespace Eigen
32
+ {
33
+ namespace Rand
34
+ {
35
+ namespace detail
36
+ {
37
+ template<>
38
+ class CompressMask<32>
39
+ {
40
+ std::array<std::array<internal::Packet8i, 256>, 15> idx;
41
+ std::array<internal::Packet8f, 8> selector;
42
+ std::array<uint8_t, 256> cnt;
43
+
44
+ static internal::Packet8i make_compress(int mask, int offset = 0)
45
+ {
46
+ int32_t ret[8] = { 0, };
47
+ int n = offset;
48
+ for (int i = 0; i < 8; ++i)
49
+ {
50
+ int l = mask & 1;
51
+ mask >>= 1;
52
+ if (l)
53
+ {
54
+ if (n >= 0) ret[n] = i;
55
+ if (++n >= 8) break;
56
+ }
57
+ }
58
+ return _mm256_loadu_si256((internal::Packet8i*)ret);
59
+ }
60
+
61
+ static uint8_t count(int mask)
62
+ {
63
+ uint8_t ret = 0;
64
+ for (int i = 0; i < 8; ++i)
65
+ {
66
+ ret += mask & 1;
67
+ mask >>= 1;
68
+ }
69
+ return ret;
70
+ }
71
+
72
+ CompressMask()
73
+ {
74
+ for (int i = 0; i < 256; ++i)
75
+ {
76
+ for (int o = 0; o < 15; ++o)
77
+ {
78
+ idx[o][i] = make_compress(i, o < 8 ? o : o - 15);
79
+ }
80
+
81
+ cnt[i] = count(i);
82
+ }
83
+
84
+ selector[0] = _mm256_castsi256_ps(_mm256_setr_epi32(0, 0, 0, 0, 0, 0, 0, 0));
85
+ selector[1] = _mm256_castsi256_ps(_mm256_setr_epi32(-1, 0, 0, 0, 0, 0, 0, 0));
86
+ selector[2] = _mm256_castsi256_ps(_mm256_setr_epi32(-1, -1, 0, 0, 0, 0, 0, 0));
87
+ selector[3] = _mm256_castsi256_ps(_mm256_setr_epi32(-1, -1, -1, 0, 0, 0, 0, 0));
88
+ selector[4] = _mm256_castsi256_ps(_mm256_setr_epi32(-1, -1, -1, -1, 0, 0, 0, 0));
89
+ selector[5] = _mm256_castsi256_ps(_mm256_setr_epi32(-1, -1, -1, -1, -1, 0, 0, 0));
90
+ selector[6] = _mm256_castsi256_ps(_mm256_setr_epi32(-1, -1, -1, -1, -1, -1, 0, 0));
91
+ selector[7] = _mm256_castsi256_ps(_mm256_setr_epi32(-1, -1, -1, -1, -1, -1, -1, 0));
92
+ }
93
+
94
+ static EIGEN_STRONG_INLINE internal::Packet8f permute(const internal::Packet8f& p, const internal::Packet8i& i)
95
+ {
96
+ #ifdef EIGEN_VECTORIZE_AVX2
97
+ return _mm256_permutevar8x32_ps(p, i);
98
+ #else
99
+ auto l = _mm256_permutevar_ps(p, i);
100
+ auto h = _mm256_permutevar_ps(_mm256_permute2f128_ps(p, p, 0x01), i);
101
+ internal::Packet4i i1, i2;
102
+ internal::split_two(i, i1, i2);
103
+ i1 = _mm_slli_epi32(i1, 29);
104
+ i2 = _mm_slli_epi32(i2, 29);
105
+ auto c = _mm256_castsi256_ps(
106
+ internal::combine_two(
107
+ _mm_cmplt_epi32(i1, internal::pset1<internal::Packet4i>(0)),
108
+ _mm_cmplt_epi32(internal::pset1<internal::Packet4i>(-1), i2)
109
+ )
110
+ );
111
+ return internal::pblendv(c, h, l);
112
+ #endif
113
+ }
114
+
115
+ public:
116
+ enum { full_size = 8 };
117
+ static const CompressMask& get_inst()
118
+ {
119
+ static CompressMask cm;
120
+ return cm;
121
+ }
122
+
123
+ template<typename Packet>
124
+ EIGEN_STRONG_INLINE int compress_append(Packet& _value, const Packet& _mask,
125
+ Packet& _rest, int rest_cnt, bool& full) const
126
+ {
127
+ auto& value = reinterpret_cast<internal::Packet8f&>(_value);
128
+ auto& mask = reinterpret_cast<const internal::Packet8f&>(_mask);
129
+ auto& rest = reinterpret_cast<internal::Packet8f&>(_rest);
130
+
131
+ int m = _mm256_movemask_ps(mask);
132
+ if (cnt[m] == full_size)
133
+ {
134
+ full = true;
135
+ return rest_cnt;
136
+ }
137
+
138
+ auto p1 = permute(value, idx[rest_cnt][m]);
139
+ p1 = internal::pblendv(selector[rest_cnt], rest, p1);
140
+
141
+ auto new_cnt = rest_cnt + cnt[m];
142
+ if (new_cnt >= full_size)
143
+ {
144
+ if (new_cnt > full_size)
145
+ {
146
+ rest = permute(value, idx[new_cnt - cnt[m] + full_size - 1][m]);
147
+ }
148
+ value = p1;
149
+ full = true;
150
+ return new_cnt - full_size;
151
+ }
152
+ else
153
+ {
154
+ rest = p1;
155
+ full = false;
156
+ return new_cnt;
157
+ }
158
+ }
159
+ };
160
+ }
161
+ }
162
+ }
163
+ #endif
164
+
165
+ #ifdef EIGEN_VECTORIZE_SSE2
166
+ #include <xmmintrin.h>
167
+
168
+ namespace Eigen
169
+ {
170
+ namespace Rand
171
+ {
172
+ namespace detail
173
+ {
174
+ template<>
175
+ class CompressMask<16>
176
+ {
177
+ std::array<std::array<uint8_t, 16>, 7> idx;
178
+ std::array<internal::Packet4f, 4> selector;
179
+ std::array<uint8_t, 64> cnt;
180
+
181
+ static uint8_t make_compress(int mask, int offset = 0)
182
+ {
183
+ uint8_t ret = 0;
184
+ int n = offset;
185
+ for (int i = 0; i < 4; ++i)
186
+ {
187
+ int l = mask & 1;
188
+ mask >>= 1;
189
+ if (l)
190
+ {
191
+ if (n >= 0) ret |= (i & 3) << (2 * n);
192
+ if (++n >= 4) break;
193
+ }
194
+ }
195
+ return ret;
196
+ }
197
+
198
+ static uint8_t count(int mask)
199
+ {
200
+ uint8_t ret = 0;
201
+ for (int i = 0; i < 4; ++i)
202
+ {
203
+ ret += mask & 1;
204
+ mask >>= 1;
205
+ }
206
+ return ret;
207
+ }
208
+
209
+ CompressMask()
210
+ {
211
+ for (int i = 0; i < 16; ++i)
212
+ {
213
+ for (int o = 0; o < 7; ++o)
214
+ {
215
+ idx[o][i] = make_compress(i, o < 4 ? o : o - 7);
216
+ }
217
+
218
+ cnt[i] = count(i);
219
+ }
220
+
221
+ selector[0] = _mm_castsi128_ps(_mm_setr_epi32(0, 0, 0, 0));
222
+ selector[1] = _mm_castsi128_ps(_mm_setr_epi32(-1, 0, 0, 0));
223
+ selector[2] = _mm_castsi128_ps(_mm_setr_epi32(-1, -1, 0, 0));
224
+ selector[3] = _mm_castsi128_ps(_mm_setr_epi32(-1, -1, -1, 0));
225
+ }
226
+
227
+ static EIGEN_STRONG_INLINE internal::Packet4f permute(const internal::Packet4f& p, uint8_t i)
228
+ {
229
+ float u[4];
230
+ _mm_storeu_ps(u, p);
231
+ return _mm_setr_ps(u[i & 3], u[(i >> 2) & 3], u[(i >> 4) & 3], u[(i >> 6) & 3]);
232
+ }
233
+
234
+ public:
235
+
236
+ enum { full_size = 4 };
237
+
238
+ static const CompressMask& get_inst()
239
+ {
240
+ static CompressMask cm;
241
+ return cm;
242
+ }
243
+
244
+ template<typename Packet>
245
+ EIGEN_STRONG_INLINE int compress_append(Packet& _value, const Packet& _mask,
246
+ Packet& _rest, int rest_cnt, bool& full) const
247
+ {
248
+ auto& value = reinterpret_cast<internal::Packet4f&>(_value);
249
+ auto& mask = reinterpret_cast<const internal::Packet4f&>(_mask);
250
+ auto& rest = reinterpret_cast<internal::Packet4f&>(_rest);
251
+
252
+ int m = _mm_movemask_ps(mask);
253
+ if (cnt[m] == full_size)
254
+ {
255
+ full = true;
256
+ return rest_cnt;
257
+ }
258
+
259
+ auto p1 = permute(value, idx[rest_cnt][m]);
260
+ p1 = internal::pblendv(selector[rest_cnt], rest, p1);
261
+
262
+ auto new_cnt = rest_cnt + cnt[m];
263
+ if (new_cnt >= full_size)
264
+ {
265
+ if (new_cnt > full_size)
266
+ {
267
+ rest = permute(value, idx[new_cnt - cnt[m] + full_size - 1][m]);
268
+ }
269
+ value = p1;
270
+ full = true;
271
+ return new_cnt - full_size;
272
+ }
273
+ else
274
+ {
275
+ rest = p1;
276
+ full = false;
277
+ return new_cnt;
278
+ }
279
+ }
280
+ };
281
+ }
282
+ }
283
+ }
284
+ #endif
285
+
286
+ #endif
@@ -0,0 +1,624 @@
1
+ /**
2
+ * @file PacketRandomEngine.h
3
+ * @author bab2min (bab2min@gmail.com)
4
+ * @brief
5
+ * @version 0.2.1
6
+ * @date 2020-07-11
7
+ *
8
+ * @copyright Copyright (c) 2020
9
+ *
10
+ */
11
+
12
+ #ifndef EIGENRAND_PACKET_RANDOM_ENGINE_H
13
+ #define EIGENRAND_PACKET_RANDOM_ENGINE_H
14
+
15
+ #include <array>
16
+ #include <random>
17
+ #include <type_traits>
18
+ #include <EigenRand/MorePacketMath.h>
19
+ #include <fstream>
20
+
21
+ namespace Eigen
22
+ {
23
+ namespace internal
24
+ {
25
+ template<typename Ty>
26
+ struct IsIntPacket : std::false_type {};
27
+
28
+ template<typename Ty>
29
+ struct HalfPacket;
30
+
31
+ #ifdef EIGEN_VECTORIZE_AVX2
32
+ template<>
33
+ struct IsIntPacket<Packet8i> : std::true_type {};
34
+
35
+ template<>
36
+ struct HalfPacket<Packet8i>
37
+ {
38
+ using type = Packet4i;
39
+ };
40
+ #endif
41
+ #ifdef EIGEN_VECTORIZE_SSE2
42
+ template<>
43
+ struct IsIntPacket<Packet4i> : std::true_type {};
44
+
45
+ template<>
46
+ struct HalfPacket<Packet4i>
47
+ {
48
+ using type = uint64_t;
49
+ };
50
+ #endif
51
+ }
52
+
53
+ namespace Rand
54
+ {
55
+ namespace detail
56
+ {
57
+ template<typename T>
58
+ auto test_integral_result_type(int)->std::integral_constant<bool, std::is_integral<typename T::result_type>::value>;
59
+
60
+ template<typename T>
61
+ auto test_integral_result_type(...)->std::false_type;
62
+
63
+ template<typename T>
64
+ auto test_intpacket_result_type(int)->std::integral_constant<bool, internal::IsIntPacket<typename T::result_type>::value>;
65
+
66
+ template<typename T>
67
+ auto test_intpacket_result_type(...)->std::false_type;
68
+ }
69
+
70
+ template<typename Ty>
71
+ struct IsScalarRandomEngine : decltype(detail::test_integral_result_type<Ty>(0))
72
+ {
73
+ };
74
+
75
+ template<typename Ty>
76
+ struct IsPacketRandomEngine : decltype(detail::test_intpacket_result_type<Ty>(0))
77
+ {
78
+ };
79
+
80
+ enum class RandomEngineType
81
+ {
82
+ none, scalar, packet
83
+ };
84
+
85
+ template<typename Ty>
86
+ struct GetRandomEngineType : std::integral_constant <
87
+ RandomEngineType,
88
+ IsPacketRandomEngine<Ty>::value ? RandomEngineType::packet :
89
+ (IsScalarRandomEngine<Ty>::value ? RandomEngineType::scalar : RandomEngineType::none)
90
+ >
91
+ {
92
+ };
93
+
94
+ template<typename Ty, size_t length, size_t alignment = 64>
95
+ class AlignedArray
96
+ {
97
+ public:
98
+ AlignedArray()
99
+ {
100
+ allocate();
101
+ for (size_t i = 0; i < length; ++i)
102
+ {
103
+ new (&aligned[i]) Ty();
104
+ }
105
+ }
106
+
107
+ AlignedArray(const AlignedArray& o)
108
+ {
109
+ allocate();
110
+ for (size_t i = 0; i < length; ++i)
111
+ {
112
+ aligned[i] = o[i];
113
+ }
114
+ }
115
+
116
+ AlignedArray(AlignedArray&& o)
117
+ {
118
+ std::swap(memory, o.memory);
119
+ std::swap(aligned, o.aligned);
120
+ }
121
+
122
+ AlignedArray& operator=(const AlignedArray& o)
123
+ {
124
+ for (size_t i = 0; i < length; ++i)
125
+ {
126
+ aligned[i] = o[i];
127
+ }
128
+ return *this;
129
+ }
130
+
131
+ AlignedArray& operator=(AlignedArray&& o)
132
+ {
133
+ std::swap(memory, o.memory);
134
+ std::swap(aligned, o.aligned);
135
+ return *this;
136
+ }
137
+
138
+ ~AlignedArray()
139
+ {
140
+ deallocate();
141
+ }
142
+
143
+ Ty& operator[](size_t i)
144
+ {
145
+ return aligned[i];
146
+ }
147
+
148
+ const Ty& operator[](size_t i) const
149
+ {
150
+ return aligned[i];
151
+ }
152
+
153
+ size_t size() const
154
+ {
155
+ return length;
156
+ }
157
+
158
+ Ty* data()
159
+ {
160
+ return aligned;
161
+ }
162
+
163
+ const Ty* data() const
164
+ {
165
+ return aligned;
166
+ }
167
+
168
+ private:
169
+ void allocate()
170
+ {
171
+ memory = std::malloc(sizeof(Ty) * length + alignment);
172
+ aligned = (Ty*)(((size_t)memory + alignment) & ~(alignment - 1));
173
+ }
174
+
175
+ void deallocate()
176
+ {
177
+ if (memory)
178
+ {
179
+ for (size_t i = 0; i < length; ++i)
180
+ {
181
+ aligned[i].~Ty();
182
+ }
183
+ std::free(memory);
184
+ memory = nullptr;
185
+ aligned = nullptr;
186
+ }
187
+ }
188
+
189
+ void* memory = nullptr;
190
+ Ty* aligned = nullptr;
191
+ };
192
+
193
+ #ifndef EIGEN_DONT_VECTORIZE
194
+ /**
195
+ * @brief A vectorized version of Mersenne Twister Engine
196
+ *
197
+ * @tparam Packet a type of integer packet being generated from this engine
198
+ * @tparam _Nx
199
+ * @tparam _Mx
200
+ * @tparam _Rx
201
+ * @tparam _Px
202
+ * @tparam _Ux
203
+ * @tparam _Dx
204
+ * @tparam _Sx
205
+ * @tparam _Bx
206
+ * @tparam _Tx
207
+ * @tparam _Cx
208
+ * @tparam _Lx
209
+ * @tparam _Fx
210
+ *
211
+ * @note It is recommended to use the alias, Eigen::Rand::Vmt19937_64 rather than using raw MersenneTwister template class
212
+ * because the definition of Eigen::Rand::Vmt19937_64 is changed to use the appropriate PacketType depending on compile options and the architecture of machines.
213
+ */
214
+ template<typename Packet,
215
+ int _Nx, int _Mx,
216
+ int _Rx, uint64_t _Px,
217
+ int _Ux, uint64_t _Dx,
218
+ int _Sx, uint64_t _Bx,
219
+ int _Tx, uint64_t _Cx,
220
+ int _Lx, uint64_t _Fx>
221
+ class MersenneTwister
222
+ {
223
+ public:
224
+ using result_type = Packet;
225
+
226
+ static constexpr int word_size = 64;
227
+ static constexpr int state_size = _Nx;
228
+ static constexpr int shift_size = _Mx;
229
+ static constexpr int mask_bits = _Rx;
230
+ static constexpr uint64_t parameter_a = _Px;
231
+ static constexpr int output_u = _Ux;
232
+ static constexpr int output_s = _Sx;
233
+ static constexpr uint64_t output_b = _Bx;
234
+ static constexpr int output_t = _Tx;
235
+ static constexpr uint64_t output_c = _Cx;
236
+ static constexpr int output_l = _Lx;
237
+
238
+ static constexpr uint64_t default_seed = 5489U;
239
+
240
+ /**
241
+ * @brief Construct a new Mersenne Twister engine with a scalar seed
242
+ *
243
+ * @param x0 scalar seed for the engine
244
+ *
245
+ * @note The seed for the first element of packet is initialized to `x0`,
246
+ * for the second element to `x0 + 1`, and the n-th element to is `x0 + n - 1`.
247
+ */
248
+ MersenneTwister(uint64_t x0 = default_seed)
249
+ {
250
+ using namespace Eigen::internal;
251
+ std::array<uint64_t, unpacket_traits<Packet>::size / 2> seeds;
252
+ for (uint64_t i = 0; i < seeds.size(); ++i)
253
+ {
254
+ seeds[i] = x0 + i;
255
+ }
256
+ seed(ploadu<Packet>((int*)seeds.data()));
257
+ }
258
+
259
+ /**
260
+ * @brief Construct a new Mersenne Twister engine with a packet seed
261
+ *
262
+ * @param x0 packet seed for the engine
263
+ */
264
+ MersenneTwister(Packet x0)
265
+ {
266
+ seed(x0);
267
+ }
268
+
269
+ /**
270
+ * @brief initialize the engine with a given seed
271
+ *
272
+ * @param x0 packet seed for the engine
273
+ */
274
+ void seed(Packet x0)
275
+ {
276
+ using namespace Eigen::internal;
277
+ Packet prev = state[0] = x0;
278
+ for (int i = 1; i < _Nx; ++i)
279
+ {
280
+ prev = state[i] = pmuluadd64(pxor(prev, psrl64(prev, word_size - 2)), _Fx, i);
281
+ }
282
+ stateIdx = _Nx;
283
+ }
284
+
285
+ /**
286
+ * @brief minimum value of the result
287
+ *
288
+ * @return uint64_t
289
+ */
290
+ uint64_t min() const
291
+ {
292
+ return 0;
293
+ }
294
+
295
+ /**
296
+ * @brief maximum value of the result
297
+ *
298
+ * @return uint64_t
299
+ */
300
+ uint64_t max() const
301
+ {
302
+ return _wMask;
303
+ }
304
+
305
+ /**
306
+ * @brief Generates one random packet and advance the internal state.
307
+ *
308
+ * @return result_type
309
+ *
310
+ * @note A value generated from this engine is not scalar, but packet type.
311
+ * If you need to extract scalar values, use Eigen::Rand::makeScalarRng or Eigen::Rand::PacketRandomEngineAdaptor.
312
+ */
313
+ result_type operator()()
314
+ {
315
+ if (stateIdx == _Nx)
316
+ refill_upper();
317
+ else if (2 * _Nx <= stateIdx)
318
+ refill_lower();
319
+
320
+ using namespace Eigen::internal;
321
+
322
+ Packet res = state[stateIdx++];
323
+ res = pxor(res, pand(psrl64(res, _Ux), pseti64<Packet>(_Dx)));
324
+ res = pxor(res, pand(psll64(res, _Sx), pseti64<Packet>(_Bx)));
325
+ res = pxor(res, pand(psll64(res, _Tx), pseti64<Packet>(_Cx)));
326
+ res = pxor(res, psrl64(res, _Lx));
327
+ return res;
328
+ }
329
+
330
+ /**
331
+ * @brief Discards `num` items being generated
332
+ *
333
+ * @param num the number of items being discarded
334
+ */
335
+ void discard(unsigned long long num)
336
+ {
337
+ for (; 0 < num; --num)
338
+ {
339
+ operator()();
340
+ }
341
+ }
342
+
343
+ typename internal::HalfPacket<Packet>::type half()
344
+ {
345
+ if (valid)
346
+ {
347
+ valid = false;
348
+ return cache;
349
+ }
350
+ typename internal::HalfPacket<Packet>::type a;
351
+ internal::split_two(operator()(), a, cache);
352
+ valid = true;
353
+ return a;
354
+ }
355
+
356
+ protected:
357
+
358
+ void refill_lower()
359
+ {
360
+ using namespace Eigen::internal;
361
+
362
+ auto hmask = pseti64<Packet>(_hMask),
363
+ lmask = pseti64<Packet>(_lMask),
364
+ px = pseti64<Packet>(_Px),
365
+ one = pseti64<Packet>(1);
366
+
367
+ int i;
368
+ for (i = 0; i < _Nx - _Mx; ++i)
369
+ {
370
+ Packet tmp = por(pand(state[i + _Nx], hmask),
371
+ pand(state[i + _Nx + 1], lmask));
372
+
373
+ state[i] = pxor(pxor(
374
+ psrl64(tmp, 1),
375
+ pand(pcmpeq64(pand(tmp, one), one), px)),
376
+ state[i + _Nx + _Mx]
377
+ );
378
+ }
379
+
380
+ for (; i < _Nx - 1; ++i)
381
+ {
382
+ Packet tmp = por(pand(state[i + _Nx], hmask),
383
+ pand(state[i + _Nx + 1], lmask));
384
+
385
+ state[i] = pxor(pxor(
386
+ psrl64(tmp, 1),
387
+ pand(pcmpeq64(pand(tmp, one), one), px)),
388
+ state[i - _Nx + _Mx]
389
+ );
390
+ }
391
+
392
+ Packet tmp = por(pand(state[i + _Nx], hmask),
393
+ pand(state[0], lmask));
394
+ state[i] = pxor(pxor(
395
+ psrl64(tmp, 1),
396
+ pand(pcmpeq64(pand(tmp, one), one), px)),
397
+ state[_Mx - 1]
398
+ );
399
+ stateIdx = 0;
400
+ }
401
+
402
+ void refill_upper()
403
+ {
404
+ using namespace Eigen::internal;
405
+
406
+ auto hmask = pseti64<Packet>(_hMask),
407
+ lmask = pseti64<Packet>(_lMask),
408
+ px = pseti64<Packet>(_Px),
409
+ one = pseti64<Packet>(1);
410
+
411
+ for (int i = _Nx; i < 2 * _Nx; ++i)
412
+ {
413
+ Packet tmp = por(pand(state[i - _Nx], hmask),
414
+ pand(state[i - _Nx + 1], lmask));
415
+
416
+ state[i] = pxor(pxor(
417
+ psrl64(tmp, 1),
418
+ pand(pcmpeq64(pand(tmp, one), one), px)),
419
+ state[i - _Nx + _Mx]
420
+ );
421
+ }
422
+ }
423
+
424
+ AlignedArray<Packet, _Nx * 2> state;
425
+ size_t stateIdx = 0;
426
+ typename internal::HalfPacket<Packet>::type cache;
427
+ bool valid = false;
428
+
429
+ static constexpr uint64_t _wMask = (uint64_t)-1;
430
+ static constexpr uint64_t _hMask = (_wMask << _Rx) & _wMask;
431
+ static constexpr uint64_t _lMask = ~_hMask & _wMask;
432
+ };
433
+
434
+ /**
435
+ * @brief Alias of Eigen::Rand::MersenneTwister, equivalent to std::mt19937_64
436
+ *
437
+ * @tparam Packet
438
+ */
439
+ template<typename Packet>
440
+ using Pmt19937_64 = MersenneTwister<Packet, 312, 156, 31,
441
+ 0xb5026f5aa96619e9, 29,
442
+ 0x5555555555555555, 17,
443
+ 0x71d67fffeda60000, 37,
444
+ 0xfff7eee000000000, 43, 6364136223846793005>;
445
+ #endif
446
+
447
+ template<typename UIntType, typename BaseRng, int numU64>
448
+ class ParallelRandomEngineAdaptor
449
+ {
450
+ static_assert(GetRandomEngineType<BaseRng>::value != RandomEngineType::none, "BaseRng must be a kind of Random Engine.");
451
+ public:
452
+ using result_type = UIntType;
453
+
454
+ ParallelRandomEngineAdaptor(size_t seed = BaseRng::default_seed)
455
+ {
456
+ for (int i = 0; i < num_parallel; ++i)
457
+ {
458
+ rngs[i].~BaseRng();
459
+ new (&rngs[i]) BaseRng{ seed + i * u64_stride };
460
+ }
461
+ }
462
+
463
+ ParallelRandomEngineAdaptor(const BaseRng& o)
464
+ {
465
+ for (int i = 0; i < num_parallel; ++i)
466
+ {
467
+ rngs[i].~BaseRng();
468
+ new (&rngs[i]) BaseRng{ o };
469
+ }
470
+ }
471
+
472
+ ParallelRandomEngineAdaptor(const ParallelRandomEngineAdaptor&) = default;
473
+ ParallelRandomEngineAdaptor(ParallelRandomEngineAdaptor&&) = default;
474
+
475
+ static constexpr result_type min()
476
+ {
477
+ return std::numeric_limits<result_type>::min();
478
+ }
479
+
480
+ static constexpr result_type max()
481
+ {
482
+ return std::numeric_limits<result_type>::max();
483
+ }
484
+
485
+ result_type operator()()
486
+ {
487
+ if (cnt >= buf_size)
488
+ {
489
+ refill_buffer();
490
+ }
491
+ return buf[cnt++];
492
+ }
493
+
494
+ float uniform_real()
495
+ {
496
+ if (fcnt >= fbuf_size)
497
+ {
498
+ refill_fbuffer();
499
+ }
500
+ return fbuf[fcnt++];
501
+ }
502
+ private:
503
+
504
+ void refill_buffer()
505
+ {
506
+ cnt = 0;
507
+ for (size_t i = 0; i < num_parallel; ++i)
508
+ {
509
+ reinterpret_cast<typename BaseRng::result_type&>(buf[i * result_type_stride]) = rngs[i]();
510
+ }
511
+ }
512
+
513
+ void refill_fbuffer()
514
+ {
515
+ fcnt = 0;
516
+ for (size_t i = 0; i < num_parallel; ++i)
517
+ {
518
+ auto urf = internal::bit_to_ur_float(rngs[i]());
519
+ reinterpret_cast<decltype(urf)&>(fbuf[i * u64_stride * 2]) = urf;
520
+ }
521
+ }
522
+
523
+ static constexpr int u64_stride = sizeof(typename BaseRng::result_type) / sizeof(uint64_t);
524
+ static constexpr int result_type_stride = sizeof(typename BaseRng::result_type) / sizeof(result_type);
525
+ static constexpr int num_parallel = numU64 / u64_stride;
526
+ static constexpr int byte_size = sizeof(uint64_t) * numU64;
527
+ static constexpr size_t buf_size = byte_size / sizeof(result_type);
528
+ static constexpr size_t fbuf_size = byte_size / sizeof(float);
529
+
530
+ std::array<BaseRng, num_parallel> rngs;
531
+ AlignedArray<result_type, buf_size> buf;
532
+ AlignedArray<float, fbuf_size> fbuf;
533
+ size_t cnt = buf_size, fcnt = fbuf_size;
534
+ };
535
+
536
+ /**
537
+ * @brief Scalar adaptor for random engines which generates packet
538
+ *
539
+ * @tparam UIntType scalar integer type for `result_type` of an adapted random number engine
540
+ * @tparam BaseRng
541
+ */
542
+ template<typename UIntType, typename BaseRng>
543
+ using PacketRandomEngineAdaptor = ParallelRandomEngineAdaptor<UIntType, BaseRng,
544
+ sizeof(typename BaseRng::result_type) / sizeof(uint64_t)>;
545
+
546
+ template<typename BaseRng>
547
+ class RandomEngineWrapper : public BaseRng
548
+ {
549
+ public:
550
+ using BaseRng::BaseRng;
551
+
552
+ RandomEngineWrapper(const BaseRng& o) : BaseRng{ o }
553
+ {
554
+ }
555
+
556
+ RandomEngineWrapper(BaseRng&& o) : BaseRng{ o }
557
+ {
558
+ }
559
+
560
+ RandomEngineWrapper(size_t seed) : BaseRng{ seed }
561
+ {
562
+ }
563
+
564
+ RandomEngineWrapper() = default;
565
+ RandomEngineWrapper(const RandomEngineWrapper&) = default;
566
+ RandomEngineWrapper(RandomEngineWrapper&&) = default;
567
+
568
+ float uniform_real()
569
+ {
570
+ internal::bit_scalar<float> bs;
571
+ return bs.to_ur(this->operator()());
572
+ }
573
+ };
574
+
575
+ template<typename UIntType, typename Rng>
576
+ using UniversalRandomEngine = typename std::conditional<
577
+ IsPacketRandomEngine<typename std::remove_reference<Rng>::type>::value,
578
+ PacketRandomEngineAdaptor<UIntType, typename std::remove_reference<Rng>::type>,
579
+ typename std::conditional<
580
+ IsScalarRandomEngine<typename std::remove_reference<Rng>::type>::value,
581
+ RandomEngineWrapper<typename std::remove_reference<Rng>::type>,
582
+ void
583
+ >::type
584
+ >::type;
585
+
586
+ /**
587
+ * @brief Helper function for making a UniversalRandomEngine
588
+ *
589
+ * @tparam UIntType
590
+ * @tparam Rng
591
+ * @param rng any random number engine for either packet or scalar type
592
+ * @return an instance of PacketRandomEngineAdaptor for UIntType
593
+ */
594
+ template<typename UIntType, typename Rng>
595
+ UniversalRandomEngine<UIntType, Rng> makeUniversalRng(Rng&& rng)
596
+ {
597
+ return { std::forward<Rng>(rng) };
598
+ }
599
+
600
+ #ifdef EIGEN_VECTORIZE_AVX2
601
+ using Vmt19937_64 = Pmt19937_64<internal::Packet8i>;
602
+ #elif defined(EIGEN_VECTORIZE_AVX) || defined(EIGEN_VECTORIZE_SSE2)
603
+ using Vmt19937_64 = Pmt19937_64<internal::Packet4i>;
604
+ #else
605
+ /**
606
+ * @brief same as std::mt19937_64 when EIGEN_DONT_VECTORIZE,
607
+ * Pmt19937_64<internal::Packet4i> when SSE2 enabled
608
+ * and Pmt19937_64<internal::Packet8i> when AVX2 enabled
609
+ *
610
+ * @note It yields the same random sequence only within the same seed and the same SIMD ISA.
611
+ * If you want to keep the same random sequence across different SIMD ISAs, use P8_mt19937_64.
612
+ */
613
+ using Vmt19937_64 = std::mt19937_64;
614
+ #endif
615
+ /**
616
+ * @brief a vectorized mt19937_64 which generates 8 integers of 64bit simultaneously.
617
+ * It always yields the same value regardless of SIMD ISA.
618
+ */
619
+ template<typename UIntType = uint64_t>
620
+ using P8_mt19937_64 = ParallelRandomEngineAdaptor<UIntType, Vmt19937_64, 8>;
621
+ }
622
+ }
623
+
624
+ #endif