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,413 @@
1
+ /**
2
+ * @file RandUtils.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_RAND_UTILS_H
13
+ #define EIGENRAND_RAND_UTILS_H
14
+
15
+ #include <EigenRand/MorePacketMath.h>
16
+ #include <EigenRand/PacketFilter.h>
17
+ #include <EigenRand/PacketRandomEngine.h>
18
+
19
+ namespace Eigen
20
+ {
21
+ namespace internal
22
+ {
23
+ template<typename Packet, typename Rng,
24
+ typename RngResult = typename std::remove_reference<Rng>::type::result_type,
25
+ Rand::RandomEngineType reType = Rand::GetRandomEngineType<
26
+ typename std::remove_reference<Rng>::type
27
+ >::value>
28
+ struct RawbitsMaker;
29
+
30
+ template<typename PacketType, typename Rng>
31
+ struct UniformRealUtils;
32
+
33
+ template<typename PacketType, typename Rng>
34
+ struct RandUtils : public UniformRealUtils<PacketType, Rng>
35
+ {
36
+ EIGEN_STRONG_INLINE PacketType balanced(Rng& rng)
37
+ {
38
+ return psub(pmul(this->zero_to_one(rng), pset1<PacketType>(2)), pset1<PacketType>(1));
39
+ }
40
+
41
+ EIGEN_STRONG_INLINE PacketType nonzero_uniform_real(Rng& rng)
42
+ {
43
+ constexpr auto epsilon = std::numeric_limits<typename unpacket_traits<PacketType>::type>::epsilon() / 8;
44
+ return padd(this->uniform_real(rng), pset1<PacketType>(epsilon));
45
+ }
46
+ };
47
+
48
+ EIGEN_STRONG_INLINE uint32_t collect_upper8bits(uint32_t a, uint32_t b, uint32_t c)
49
+ {
50
+ return ((a & 0xFF000000) >> 24) | ((b & 0xFF000000) >> 16) | ((c & 0xFF000000) >> 8);
51
+ }
52
+ }
53
+ }
54
+
55
+ #ifdef EIGEN_VECTORIZE_AVX
56
+ #include <immintrin.h>
57
+
58
+ namespace Eigen
59
+ {
60
+ namespace internal
61
+ {
62
+ template<typename Rng>
63
+ struct RawbitsMaker<Packet4i, Rng, Packet8i, Rand::RandomEngineType::packet>
64
+ {
65
+ EIGEN_STRONG_INLINE Packet4i rawbits(Rng& rng)
66
+ {
67
+ return rng.half();
68
+ }
69
+
70
+ EIGEN_STRONG_INLINE Packet4i rawbits_34(Rng& rng)
71
+ {
72
+ return rng.half();
73
+ }
74
+
75
+ EIGEN_STRONG_INLINE Packet4i rawbits_half(Rng& rng)
76
+ {
77
+ return rng.half();
78
+ }
79
+ };
80
+
81
+ template<typename Rng>
82
+ struct RawbitsMaker<Packet8i, Rng, Packet4i, Rand::RandomEngineType::packet>
83
+ {
84
+ EIGEN_STRONG_INLINE Packet8i rawbits(Rng& rng)
85
+ {
86
+ return _mm256_insertf128_si256(_mm256_castsi128_si256(rng()), rng(), 1);
87
+ }
88
+
89
+ EIGEN_STRONG_INLINE Packet8i rawbits_34(Rng& rng)
90
+ {
91
+ return _mm256_insertf128_si256(_mm256_castsi128_si256(rng()), rng(), 1);
92
+ }
93
+
94
+ EIGEN_STRONG_INLINE Packet4i rawbits_half(Rng& rng)
95
+ {
96
+ return rng();
97
+ }
98
+ };
99
+
100
+ template<typename Rng, typename RngResult>
101
+ struct RawbitsMaker<Packet8i, Rng, RngResult, Rand::RandomEngineType::scalar>
102
+ {
103
+ EIGEN_STRONG_INLINE Packet8i rawbits(Rng& rng)
104
+ {
105
+ if (sizeof(decltype(rng())) == 8)
106
+ {
107
+ return _mm256_set_epi64x(rng(), rng(), rng(), rng());
108
+ }
109
+ else
110
+ {
111
+ return _mm256_set_epi32(rng(), rng(), rng(), rng(),
112
+ rng(), rng(), rng(), rng());
113
+ }
114
+ }
115
+
116
+ EIGEN_STRONG_INLINE Packet8i rawbits_34(Rng& rng)
117
+ {
118
+ Packet8i p;
119
+ if (sizeof(decltype(rng())) == 8)
120
+ {
121
+ #ifdef EIGEN_VECTORIZE_AVX2
122
+ p = _mm256_setr_epi64x(rng(), rng(), rng(), 0);
123
+ p = _mm256_permutevar8x32_epi32(p, _mm256_setr_epi32(0, 1, 2, 7, 3, 4, 5, 7));
124
+ p = _mm256_shuffle_epi8(p, _mm256_setr_epi8(
125
+ 0, 1, 2, 3,
126
+ 4, 5, 6, 7,
127
+ 8, 9, 10, 11,
128
+ 3, 7, 11, 11,
129
+ 0, 1, 2, 3,
130
+ 4, 5, 6, 7,
131
+ 8, 9, 10, 11,
132
+ 3, 7, 11, 11
133
+ ));
134
+
135
+ #else
136
+ auto v = rng();
137
+ p = _mm256_setr_epi64x(rng(), v, rng(), v >> 32);
138
+ Packet4i p1, p2, o = _mm_setr_epi8(
139
+ 0, 1, 2, 3,
140
+ 4, 5, 6, 7,
141
+ 8, 9, 10, 11,
142
+ 3, 7, 11, 11);
143
+ split_two(p, p1, p2);
144
+ p = combine_two(_mm_shuffle_epi8(p1, o), _mm_shuffle_epi8(p2, o));
145
+ #endif
146
+ }
147
+ else
148
+ {
149
+ p = _mm256_setr_epi32(rng(), rng(), rng(), 0, rng(), rng(), rng(), 0);
150
+ #ifdef EIGEN_VECTORIZE_AVX2
151
+ p = _mm256_shuffle_epi8(p, _mm256_setr_epi8(
152
+ 0, 1, 2, 3,
153
+ 4, 5, 6, 7,
154
+ 8, 9, 10, 11,
155
+ 3, 7, 11, 11,
156
+ 0, 1, 2, 3,
157
+ 4, 5, 6, 7,
158
+ 8, 9, 10, 11,
159
+ 3, 7, 11, 11
160
+ ));
161
+ #else
162
+ Packet4i p1, p2, o = _mm_setr_epi8(
163
+ 0, 1, 2, 3,
164
+ 4, 5, 6, 7,
165
+ 8, 9, 10, 11,
166
+ 3, 7, 11, 11);
167
+ split_two(p, p1, p2);
168
+ p = combine_two(_mm_shuffle_epi8(p1, o), _mm_shuffle_epi8(p2, o));
169
+ #endif
170
+ }
171
+ return p;
172
+ }
173
+
174
+ EIGEN_STRONG_INLINE Packet4i rawbits_half(Rng& rng)
175
+ {
176
+ if (sizeof(decltype(rng())) == 8)
177
+ {
178
+ return _mm_set_epi64x(rng(), rng());
179
+ }
180
+ else
181
+ {
182
+ return _mm_set_epi32(rng(), rng(), rng(), rng());
183
+ }
184
+ }
185
+ };
186
+
187
+ template<typename Rng>
188
+ struct RawbitsMaker<Packet8i, Rng, Packet8i, Rand::RandomEngineType::packet>
189
+ {
190
+ EIGEN_STRONG_INLINE Packet8i rawbits(Rng& rng)
191
+ {
192
+ return rng();
193
+ }
194
+
195
+ EIGEN_STRONG_INLINE Packet8i rawbits_34(Rng& rng)
196
+ {
197
+ return rng();
198
+ }
199
+
200
+ EIGEN_STRONG_INLINE Packet4i rawbits_half(Rng& rng)
201
+ {
202
+ return rng.half();
203
+ }
204
+ };
205
+
206
+ #ifndef EIGEN_VECTORIZE_AVX2
207
+ template<>
208
+ EIGEN_STRONG_INLINE Packet8f bit_to_ur_float<Packet8i>(const Packet8i& x)
209
+ {
210
+ const Packet4i lower = pset1<Packet4i>(0x7FFFFF),
211
+ upper = pset1<Packet4i>(127 << 23);
212
+ const Packet8f one = pset1<Packet8f>(1);
213
+
214
+ Packet4i x1, x2;
215
+ split_two(x, x1, x2);
216
+
217
+ return psub(reinterpret_to_float(
218
+ combine_two(por(pand(x1, lower), upper), por(pand(x2, lower), upper)
219
+ )), one);
220
+ }
221
+
222
+ template<>
223
+ EIGEN_STRONG_INLINE Packet4d bit_to_ur_double<Packet8i>(const Packet8i& x)
224
+ {
225
+ const Packet4i lower = pseti64<Packet4i>(0xFFFFFFFFFFFFFull),
226
+ upper = pseti64<Packet4i>(1023ull << 52);
227
+ const Packet4d one = pset1<Packet4d>(1);
228
+
229
+ Packet4i x1, x2;
230
+ split_two(x, x1, x2);
231
+
232
+ return psub(reinterpret_to_double(
233
+ combine_two(por(pand(x1, lower), upper), por(pand(x2, lower), upper)
234
+ )), one);
235
+ }
236
+ #endif
237
+
238
+ template<typename Rng>
239
+ struct UniformRealUtils<Packet8f, Rng> : public RawbitsMaker<Packet8i, Rng>
240
+ {
241
+ EIGEN_STRONG_INLINE Packet8f zero_to_one(Rng& rng)
242
+ {
243
+ return pdiv(_mm256_cvtepi32_ps(pand(this->rawbits(rng), pset1<Packet8i>(0x7FFFFFFF))),
244
+ pset1<Packet8f>(0x7FFFFFFF));
245
+ }
246
+
247
+ EIGEN_STRONG_INLINE Packet8f uniform_real(Rng& rng)
248
+ {
249
+ return bit_to_ur_float(this->rawbits_34(rng));
250
+ }
251
+ };
252
+
253
+ template<typename Rng>
254
+ struct UniformRealUtils<Packet4d, Rng> : public RawbitsMaker<Packet8i, Rng>
255
+ {
256
+ EIGEN_STRONG_INLINE Packet4d zero_to_one(Rng& rng)
257
+ {
258
+ return pdiv(_mm256_cvtepi32_pd(pand(this->rawbits_half(rng), pset1<Packet4i>(0x7FFFFFFF))),
259
+ pset1<Packet4d>(0x7FFFFFFF));
260
+ }
261
+
262
+ EIGEN_STRONG_INLINE Packet4d uniform_real(Rng& rng)
263
+ {
264
+ return bit_to_ur_double(this->rawbits(rng));
265
+ }
266
+ };
267
+ }
268
+ }
269
+ #endif
270
+
271
+ #ifdef EIGEN_VECTORIZE_SSE2
272
+ #include <xmmintrin.h>
273
+
274
+ namespace Eigen
275
+ {
276
+ namespace internal
277
+ {
278
+ template<typename Rng, typename RngResult>
279
+ struct RawbitsMaker<Packet4i, Rng, RngResult, Rand::RandomEngineType::scalar>
280
+ {
281
+ EIGEN_STRONG_INLINE Packet4i rawbits(Rng& rng)
282
+ {
283
+ if (sizeof(RngResult) == 8)
284
+ {
285
+ return _mm_set_epi64x(rng(), rng());
286
+ }
287
+ else
288
+ {
289
+ return _mm_set_epi32(rng(), rng(), rng(), rng());
290
+ }
291
+ }
292
+
293
+ EIGEN_STRONG_INLINE Packet4i rawbits_34(Rng& rng)
294
+ {
295
+ if (sizeof(RngResult) == 8)
296
+ {
297
+ return _mm_set_epi64x(rng(), rng());
298
+ }
299
+ else
300
+ {
301
+ #ifdef EIGEN_VECTORIZE_SSSE3
302
+ Packet4i p = _mm_setr_epi32(rng(), rng(), rng(), 0);
303
+ return _mm_shuffle_epi8(p, _mm_setr_epi8(
304
+ 0, 1, 2, 3,
305
+ 4, 5, 6, 7,
306
+ 8, 9, 10, 11,
307
+ 3, 7, 11, 11));
308
+ #else
309
+ return _mm_set_epi32(rng(), rng(), rng(), rng());
310
+ #endif
311
+ }
312
+ }
313
+
314
+ EIGEN_STRONG_INLINE Packet4i rawbits_half(Rng& rng)
315
+ {
316
+ if (sizeof(decltype(rng())) == 8)
317
+ {
318
+ return _mm_set_epi64x(0, rng());
319
+ }
320
+ else
321
+ {
322
+ return _mm_setr_epi32(rng(), rng(), 0, 0);
323
+ }
324
+ }
325
+ };
326
+
327
+ template<typename Rng>
328
+ struct RawbitsMaker<Packet4i, Rng, Packet4i, Rand::RandomEngineType::packet>
329
+ {
330
+ EIGEN_STRONG_INLINE Packet4i rawbits(Rng& rng)
331
+ {
332
+ return rng();
333
+ }
334
+
335
+ EIGEN_STRONG_INLINE Packet4i rawbits_34(Rng& rng)
336
+ {
337
+ return rng();
338
+ }
339
+
340
+ EIGEN_STRONG_INLINE Packet4i rawbits_half(Rng& rng)
341
+ {
342
+ return rng();
343
+ }
344
+ };
345
+
346
+ template<typename Rng>
347
+ struct UniformRealUtils<Packet4f, Rng> : public RawbitsMaker<Packet4i, Rng>
348
+ {
349
+ EIGEN_STRONG_INLINE Packet4f zero_to_one(Rng& rng)
350
+ {
351
+ return pdiv(_mm_cvtepi32_ps(pand(this->rawbits(rng), pset1<Packet4i>(0x7FFFFFFF))),
352
+ pset1<Packet4f>(0x7FFFFFFF));
353
+ }
354
+
355
+ EIGEN_STRONG_INLINE Packet4f uniform_real(Rng& rng)
356
+ {
357
+ return bit_to_ur_float(this->rawbits_34(rng));
358
+ }
359
+ };
360
+
361
+ template<typename Rng>
362
+ struct UniformRealUtils<Packet2d, Rng> : public RawbitsMaker<Packet4i, Rng>
363
+ {
364
+ EIGEN_STRONG_INLINE Packet2d zero_to_one(Rng& rng)
365
+ {
366
+ return pdiv(_mm_cvtepi32_pd(pand(this->rawbits_half(rng), pset1<Packet4i>(0x7FFFFFFF))),
367
+ pset1<Packet2d>(0x7FFFFFFF));
368
+ }
369
+
370
+ EIGEN_STRONG_INLINE Packet2d uniform_real(Rng& rng)
371
+ {
372
+ return bit_to_ur_double(this->rawbits(rng));
373
+ }
374
+ };
375
+ }
376
+ }
377
+ #endif
378
+
379
+ namespace Eigen
380
+ {
381
+ namespace internal
382
+ {
383
+ template<typename Scalar, typename Rng>
384
+ struct scalar_base_rng
385
+ {
386
+ static_assert(
387
+ Rand::IsScalarRandomEngine<
388
+ typename std::remove_reference<Rng>::type
389
+ >::value ||
390
+ Rand::IsPacketRandomEngine<
391
+ typename std::remove_reference<Rng>::type
392
+ >::value, "Rng must satisfy RandomNumberEngine");
393
+
394
+ Rng rng;
395
+
396
+ scalar_base_rng(const Rng& _rng) : rng{ _rng }
397
+ {
398
+ }
399
+
400
+ scalar_base_rng(const scalar_base_rng& o)
401
+ : rng{ o.rng }
402
+ {
403
+ }
404
+
405
+ scalar_base_rng(scalar_base_rng&& o)
406
+ : rng{ std::move(o.rng) }
407
+ {
408
+ }
409
+ };
410
+ }
411
+ }
412
+
413
+ #endif
@@ -0,0 +1,220 @@
1
+ /**
2
+ @mainpage EigenRand : The Fastest C++11-compatible random distribution generator for Eigen
3
+
4
+ EigenRand is a header-only library for [Eigen](http://eigen.tuxfamily.org/index.php?title=Main_Page), providing vectorized random number engines and vectorized random distribution generators.
5
+ Since the classic Random functions of Eigen relies on an old C function `rand()`,
6
+ there is no way to control random numbers and no guarantee for quality of generated numbers.
7
+ In addition, Eigen's Random is slow because rand() is hard to vectorize.
8
+
9
+ EigenRand provides a variety of random distribution functions similar to C++11 standard's random functions,
10
+ which can be vectorized and easily integrated into Eigen's expressions of Matrix and Array.
11
+
12
+ You can get 5~10 times speed by just replacing old Eigen's Random
13
+ or unvectorizable c++11 random number generators with EigenRand.
14
+
15
+ EigenRand currently supports only x86-64 architecture (SSE, AVX, AVX2).
16
+
17
+ EigenRand is distributed under the MIT License.
18
+
19
+ If you want to contribute or report bugs, please visit Github repository https://github.com/bab2min/EigenRand.
20
+
21
+
22
+ - @link getting_started Getting Started @endlink
23
+ - @link list_of_supported_distribution List of Supported Random Distribution @endlink
24
+ - @link performance Performance @endlink
25
+
26
+ @page getting_started Getting Started
27
+
28
+ @section getting_started_1 Installation
29
+
30
+ You can install EigenRand by just downloading the source codes from [the repository](https://github.com/bab2min/EigenRand/releases).
31
+ Since EigenRand is a header-only library like Eigen, none of binaries needs to be installed.
32
+ All you need is [Eigen 3.3.7](http://eigen.tuxfamily.org/index.php?title=Main_Page) and C++11 compiler.
33
+
34
+ @section getting_started_2 Simple Random Matrix Generators
35
+ @code
36
+ #include <iostream>
37
+ #include <Eigen/Dense>
38
+ #include <EigenRand/EigenRand>
39
+
40
+ using namespace Eigen;
41
+
42
+ int main()
43
+ {
44
+ // Initialize random number generator with seed=42 for following codes.
45
+ // Or you can use C++11 RNG such as std::mt19937 or std::ranlux48.
46
+ Rand::Vmt19937_64 urng{ 42 };
47
+
48
+ // this will generate 4x4 real matrix with range [-1, 1]
49
+ MatrixXf mat = Rand::balanced<MatrixXf>(4, 4, urng);
50
+ std::cout << mat << std::endl;
51
+
52
+ // this will generate 10x10 real 2d array on the normal distribution
53
+ ArrayXXf arr = Rand::normal<ArrayXXf>(10, 10, urng);
54
+ std::cout << arr << std::endl;
55
+
56
+ return 0;
57
+ }
58
+ @endcode
59
+
60
+ @section getting_started_3 Random Matrix Functions with suffix '-Like'
61
+ Basically, in order to call each random distribution function of EigenRand, template parameters must be passed following the dense matrix or array type to be created.
62
+ But, if you have an instance of Eigen::Matrix or Eigen::Array already, you can use -Like function to generate a random matrix or array with the same type and shape.
63
+ @code
64
+ #include <iostream>
65
+ #include <Eigen/Dense>
66
+ #include <EigenRand/EigenRand>
67
+
68
+ using namespace Eigen;
69
+
70
+ int main()
71
+ {
72
+ Rand::Vmt19937_64 urng{ 42 };
73
+
74
+ MatrixXf mat{ 10, 10 };
75
+ // this will generate a random matrix in MatrixXf type with the shape (10, 10)
76
+ // note: it doesn't change mat at all.
77
+ Rand::balancedLike(mat, urng);
78
+
79
+ // if you want to assign a random matrix into itself, use assignment operator.
80
+ mat = Rand::balancedLike(mat, urng);
81
+ std::cout << mat << std::endl;
82
+ return 0;
83
+ }
84
+ @endcode
85
+
86
+ Every random distribution function has its corresponding -Like function.
87
+
88
+ * @page list_of_supported_distribution List of Supported Random Distribution
89
+ *
90
+ *
91
+ @section list_of_supported_distribution_1 Random Distributions for Real types
92
+
93
+ | Function | Scalar Type | Description | Equivalent to |
94
+ |:---:|:---:|:---:|:---:|
95
+ | `Eigen::Rand::balanced` | float, double | generates real values in the [-1, 1] range | `Eigen::DenseBase<Ty>::Random` for floating point types |
96
+ | `Eigen::Rand::cauchy` | float, double | generates real values on the [Cauchy distribution](https://en.wikipedia.org/wiki/Cauchy_distribution). | `std::cauchy_distribution` |
97
+ | `Eigen::Rand::chiSquared` | float, double | generates real values on a [chi-squared distribution](https://en.wikipedia.org/wiki/Chi-squared_distribution). | `std::chi_squared_distribution` |
98
+ | `Eigen::Rand::exponential` | float, double | generates real values on an [exponential distribution](https://en.wikipedia.org/wiki/Exponential_distribution). | `std::exponential_distribution` |
99
+ | `Eigen::Rand::extremeValue` | float, double | generates real values on an [extreme value distribution](https://en.wikipedia.org/wiki/Generalized_extreme_value_distribution). | `std::extreme_value_distribution` |
100
+ | `Eigen::Rand::fisherF` | float, double | generates real values on the [Fisher's F distribution](https://en.wikipedia.org/wiki/F_distribution). | `std::fisher_f_distribution` |
101
+ | `Eigen::Rand::gamma` | float, double | generates real values on a [gamma distribution](https://en.wikipedia.org/wiki/Gamma_distribution). | `std::gamma_distribution` |
102
+ | `Eigen::Rand::lognormal` | float, double | generates real values on a [lognormal distribution](https://en.wikipedia.org/wiki/Lognormal_distribution). | `std::lognormal_distribution` |
103
+ | `Eigen::Rand::normal` | float, double | generates real values on a [normal distribution](https://en.wikipedia.org/wiki/Normal_distribution). | `std::normal_distribution` |
104
+ | `Eigen::Rand::studentT` | float, double | generates real values on the [Student's t distribution](https://en.wikipedia.org/wiki/Student%27s_t-distribution). | `std::student_t_distribution` |
105
+ | `Eigen::Rand::uniformReal` | float, double | generates real values in the `[-1, 0)` range. | `std::generate_canonical` |
106
+ | `Eigen::Rand::weibull` | float, double | generates real values on the [Weibull distribution](https://en.wikipedia.org/wiki/Weibull_distribution). | `std::weibull_distribution` |
107
+
108
+ @section list_of_supported_distribution_2 Random Distributions for Integer Types
109
+
110
+ | Function | Scalar Type | Description | Equivalent to |
111
+ |:---:|:---:|:---:|:---:|
112
+ | `Eigen::Rand::binomial` | int | generates integers on a [binomial distribution](https://en.wikipedia.org/wiki/Binomial_distribution). | `std::binomial_distribution` |
113
+ | `Eigen::Rand::discrete` | int | generates random integers on a discrete distribution. | `std::discrete_distribution` |
114
+ | `Eigen::Rand::geometric` | int | generates integers on a [geometric distribution](https://en.wikipedia.org/wiki/Geometric_distribution). | `std::geometric_distribution` |
115
+ | `Eigen::Rand::negativeBinomial` | int | generates integers on a [negative binomial distribution](https://en.wikipedia.org/wiki/Negative_binomial_distribution). | `std::negative_binomial_distribution` |
116
+ | `Eigen::Rand::poisson` | int | generates integers on the [Poisson distribution](https://en.wikipedia.org/wiki/Poisson_distribution). | `std::poisson_distribution` |
117
+ | `Eigen::Rand::randBits` | int | generates integers with random bits. | `Eigen::DenseBase<Ty>::Random` for integer types |
118
+ | `Eigen::Rand::uniformInt` | int | generates integers in the `[min, max]` range. | `std::uniform_int_distribution` |
119
+
120
+ @section list_of_supported_distribution_3 Random Number Engines
121
+
122
+ | | Description | Equivalent to |
123
+ |:---:|:---:|:---:|
124
+ | `Eigen::Rand::Vmt19937_64` | a vectorized version of Mersenne Twister algorithm. It generates two 64bit random integers simultaneously with SSE2 and four integers with AVX2. | `std::mt19937_64` |
125
+
126
+ *
127
+ * @page performance Performance
128
+ *
129
+ * The following result is a measure of the time in seconds it takes to generate 1M random numbers. It shows the average of 20 times.
130
+
131
+ @section performance_1 Intel(R) Xeon(R) Platinum 8171M CPU @ 2.60GHz (Ubuntu 16.04, gcc7.5)
132
+
133
+ | | C++ std (or Eigen) | EigenRand (No Vect.) | EigenRand (SSE2) | EigenRand (SSSE3) | EigenRand (AVX) | EigenRand (AVX2) |
134
+ |---|---:|---:|---:|---:|---:|---:|
135
+ | `balanced`* | 9.0 | 5.9 | 1.5 | 1.4 | 1.3 | 0.9 |
136
+ | `balanced`(double)* | 8.7 | 6.4 | 3.3 | 2.9 | 1.7 | 1.7 |
137
+ | `binomial(20, 0.5)` | 400.8 | 118.5 | 32.7 | 36.6 | 30.0 | 22.7 |
138
+ | `binomial(50, 0.01)` | 71.7 | 22.5 | 7.7 | 8.3 | 7.9 | 6.6 |
139
+ | `binomial(100, 0.75)` | 340.5 | 454.5 | 91.7 | 111.5 | 106.3 | 86.4 |
140
+ | `cauchy` | 36.1 | 54.4 | 6.1 | 7.1 | 4.7 | 3.9 |
141
+ | `chiSquared` | 80.5 | 249.5 | 64.6 | 58.0 | 29.4 | 28.8 |
142
+ | `discrete`(int32) | - | 14.0 | 2.9 | 2.6 | 2.4 | 1.7 |
143
+ | `discrete`(fp32) | - | 21.9 | 4.3 | 4.0 | 3.6 | 3.0 |
144
+ | `discrete`(fp64) | 72.4 | 21.4 | 6.9 | 6.5 | 4.9 | 3.7 |
145
+ | `exponential` | 31.0 | 25.3 | 5.5 | 5.3 | 3.3 | 2.9 |
146
+ | `extremeValue` | 66.0 | 60.1 | 11.9 | 10.7 | 6.5 | 5.8 |
147
+ | `fisherF(1, 1)` | 178.1 | 35.1 | 33.2 | 39.3 | 22.9 | 18.7 |
148
+ | `fisherF(5, 5)` | 141.8 | 415.2 | 136.47 | 172.4 | 92.4 | 74.9 |
149
+ | `gamma(0.2, 1)` | 207.8 | 211.4 | 54.6 | 51.2 | 26.9 | 27.0 |
150
+ | `gamma(5, 3)` | 80.9 | 60.0 | 14.3 | 13.3 | 11.4 | 8.0 |
151
+ | `gamma(10.5, 1)` | 81.1 | 248.6 | 63.3 | 58.5 | 29.2 | 28.4 |
152
+ | `geometric` | 43.0 | 22.4 | 6.7 | 7.4 | 5.8 | |
153
+ | `lognormal` | 66.3 | 55.4 | 12.8 | 11.8 | 6.2 | 6.2 |
154
+ | `negativeBinomial(10, 0.5)` | 312.0 | 301.4 | 82.9 | 100.6 | 95.3 | 77.9 |
155
+ | `negativeBinomial(20, 0.25)` | 483.4 | 575.9 | 125.0 | 158.2 | 148.4 | 119.5 |
156
+ | `normal(0, 1)` | 38.1 | 28.5 | 6.8 | 6.2 | 3.8 | 3.7 |
157
+ | `normal(2, 3)` | 37.6 | 29.0 | 7.3 | 6.6 | 4.0 | 3.9 |
158
+ | `poisson(1)` | 31.8 | 25.2 | 9.8 | 10.8 | 9.7 | 8.2 |
159
+ | `poisson(16)` | 231.8 | 274.1 | 66.2 | 80.7 | 74.4 | 64.2 |
160
+ | `randBits` | 5.2 | 5.4 | 1.4 | 1.3 | 1.1 | 1.0 |
161
+ | `studentT(1)` | 122.7 | 120.1 | 15.3 | 19.2 | 12.6 | 9.4 |
162
+ | `studentT(20)` | 102.2 | 111.1 | 15.4 | 19.2 | 12.2 | 9.4 |
163
+ | `uniformInt(0~63)` | 22.4 | 4.7 | 1.7 | 1.6 | 1.4 | 1.1 |
164
+ | `uniformInt(0~100k)` | 21.8 | 10.1 | 6.2 | 6.7 | 6.6 | 5.4 |
165
+ | `uniformReal` | 12.9 | 5.7 | 1.4 | 1.2 | 1.4 | 0.7 |
166
+ | `weibull` | 41.0 | 35.8 | 17.7 | 15.5 | 8.5 | 8.5 |
167
+
168
+ * Since there is no equivalent class to `balanced` in C++11 std, we used Eigen::DenseBase::Random instead.
169
+
170
+ | | C++ std | EigenRand (No Vect.) | EigenRand (SSE2) | EigenRand (SSSE3) | EigenRand (AVX) | EigenRand (AVX2) |
171
+ |---|---:|---:|---:|---:|---:|---:|
172
+ | Mersenne Twister(int32) | 4.7 | 5.6 | 4.0 | 3.7 | 3.5 | 3.6 |
173
+ | Mersenne Twister(int64) | 5.4 | 5.3 | 4.0 | 3.9 | 3.4 | 2.6 |
174
+
175
+ @section performance_2 AMD Ryzen 7 3700x CPU @ 3.60GHz (Windows 10, MSVC2017)
176
+
177
+ | | C++ std (or Eigen) | EigenRand (SSE2) | EigenRand (AVX) | EigenRand (AVX2) |
178
+ |---|---:|---:|---:|---:|
179
+ | `balanced`* | 20.8 | 1.9 | 2.0 | 1.4 |
180
+ | `balanced`(double)* | 21.7 | 4.1 | 2.7 | 3.0 |
181
+ | `binomial(20, 0.5)` | 416.0 | 27.7 | 28.9 | 29.1 |
182
+ | `binomial(50, 0.01)` | 37.8 | 6.3 | 6.0 | 6.6 |
183
+ | `binomial(100, 0.75)` | 309.1 | 72.4 | 66.0 | 67.0 |
184
+ | `cauchy` | 42.2 | 4.8 | 5.1 | 2.7 |
185
+ | `chiSquared` | 153.8 | 33.5 | 21.2 | 17.0 |
186
+ | `discrete`(int32) | - | 2.4 | 2.3 | 2.5 |
187
+ | `discrete`(fp32) | - | 2.6 | 2.3 | 3.5 |
188
+ | `discrete`(fp64) | 55.8 | 5.1 | 4.7 | 4.3 |
189
+ | `exponential` | 33.4 | 6.4 | 2.8 | 2.2 |
190
+ | `extremeValue` | 39.4 | 7.8 | 4.6 | 4.0 |
191
+ | `fisherF(1, 1)` | 103.9 | 25.3 | 14.9 | 11.7 |
192
+ | `fisherF(5, 5)` | 295.7 | 85.5 | 58.3 | 44.8 |
193
+ | `gamma(0.2, 1)` | 128.8 | 31.9 | 18.3 | 15.8 |
194
+ | `gamma(5, 3)` | 156.1 | 9.7 | 8.0 | 5.0 |
195
+ | `gamma(10.5, 1)` | 148.5 | 33.1 | 21.1 | 17.2 |
196
+ | `geometric` | 27.1 | 6.6 | 4.3 | 4.1 |
197
+ | `lognormal` | 104.0 | 6.6 | 4.7 | 3.5 |
198
+ | `negativeBinomial(10, 0.5)` | 462.1 | 60.0 | 56.4 | 58.6 |
199
+ | `negativeBinomial(20, 0.25)` | 357.6 | 84.5 | 80.6 | 78.4 |
200
+ | `normal(0, 1)` | 48.8 | 4.2 | 3.7 | 2.3 |
201
+ | `normal(2, 3)` | 48.8 | 4.5 | 3.8 | 2.4 |
202
+ | `poisson(1)` | 46.4 | 7.9 | 7.4 | 8.2 |
203
+ | `poisson(16)` | 192.4 | 43.2 | 40.4 | 40.9 |
204
+ | `randBits` | 4.2 | 1.7 | 1.5 | 1.8 |
205
+ | `studentT(1)` | 107.0 | 12.3 | 6.8 | 5.7 |
206
+ | `studentT(20)` | 107.1 | 12.3 | 6.8 | 5.8 |
207
+ | `uniformInt(0~63)` | 31.2 | 1.1 | 1.0 | 1.2 |
208
+ | `uniformInt(0~100k)` | 27.7 | 5.6 | 5.6 | 5.4 |
209
+ | `uniformReal` | 30.7 | 1.1 | 1.0 | 0.6 |
210
+ | `weibull` | 46.5 | 10.6 | 6.4 | 5.2 |
211
+
212
+ * Since there is no equivalent class to `balanced` in C++11 std, we used Eigen::DenseBase::Random instead.
213
+
214
+ | | C++ std | EigenRand (SSE2) | EigenRand (AVX) | EigenRand (AVX2) |
215
+ |---|---:|---:|---:|---:|
216
+ | Mersenne Twister(int32) | 5.0 | 3.4 | 3.4 | 3.3 |
217
+ | Mersenne Twister(int64) | 5.1 | 3.9 | 3.9 | 3.3 |
218
+
219
+ *
220
+ */