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,1415 @@
1
+ // This file is part of Eigen, a lightweight C++ template library
2
+ // for linear algebra.
3
+ //
4
+ // Copyright (C) 2006-2010 Benoit Jacob <jacob.benoit.1@gmail.com>
5
+ //
6
+ // This Source Code Form is subject to the terms of the Mozilla
7
+ // Public License v. 2.0. If a copy of the MPL was not distributed
8
+ // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9
+
10
+ #ifndef EIGEN_MATHFUNCTIONS_H
11
+ #define EIGEN_MATHFUNCTIONS_H
12
+
13
+ // source: http://www.geom.uiuc.edu/~huberty/math5337/groupe/digits.html
14
+ // TODO this should better be moved to NumTraits
15
+ #define EIGEN_PI 3.141592653589793238462643383279502884197169399375105820974944592307816406L
16
+
17
+
18
+ namespace Eigen {
19
+
20
+ // On WINCE, std::abs is defined for int only, so let's defined our own overloads:
21
+ // This issue has been confirmed with MSVC 2008 only, but the issue might exist for more recent versions too.
22
+ #if EIGEN_OS_WINCE && EIGEN_COMP_MSVC && EIGEN_COMP_MSVC<=1500
23
+ long abs(long x) { return (labs(x)); }
24
+ double abs(double x) { return (fabs(x)); }
25
+ float abs(float x) { return (fabsf(x)); }
26
+ long double abs(long double x) { return (fabsl(x)); }
27
+ #endif
28
+
29
+ namespace internal {
30
+
31
+ /** \internal \class global_math_functions_filtering_base
32
+ *
33
+ * What it does:
34
+ * Defines a typedef 'type' as follows:
35
+ * - if type T has a member typedef Eigen_BaseClassForSpecializationOfGlobalMathFuncImpl, then
36
+ * global_math_functions_filtering_base<T>::type is a typedef for it.
37
+ * - otherwise, global_math_functions_filtering_base<T>::type is a typedef for T.
38
+ *
39
+ * How it's used:
40
+ * To allow to defined the global math functions (like sin...) in certain cases, like the Array expressions.
41
+ * When you do sin(array1+array2), the object array1+array2 has a complicated expression type, all what you want to know
42
+ * is that it inherits ArrayBase. So we implement a partial specialization of sin_impl for ArrayBase<Derived>.
43
+ * So we must make sure to use sin_impl<ArrayBase<Derived> > and not sin_impl<Derived>, otherwise our partial specialization
44
+ * won't be used. How does sin know that? That's exactly what global_math_functions_filtering_base tells it.
45
+ *
46
+ * How it's implemented:
47
+ * SFINAE in the style of enable_if. Highly susceptible of breaking compilers. With GCC, it sure does work, but if you replace
48
+ * the typename dummy by an integer template parameter, it doesn't work anymore!
49
+ */
50
+
51
+ template<typename T, typename dummy = void>
52
+ struct global_math_functions_filtering_base
53
+ {
54
+ typedef T type;
55
+ };
56
+
57
+ template<typename T> struct always_void { typedef void type; };
58
+
59
+ template<typename T>
60
+ struct global_math_functions_filtering_base
61
+ <T,
62
+ typename always_void<typename T::Eigen_BaseClassForSpecializationOfGlobalMathFuncImpl>::type
63
+ >
64
+ {
65
+ typedef typename T::Eigen_BaseClassForSpecializationOfGlobalMathFuncImpl type;
66
+ };
67
+
68
+ #define EIGEN_MATHFUNC_IMPL(func, scalar) Eigen::internal::func##_impl<typename Eigen::internal::global_math_functions_filtering_base<scalar>::type>
69
+ #define EIGEN_MATHFUNC_RETVAL(func, scalar) typename Eigen::internal::func##_retval<typename Eigen::internal::global_math_functions_filtering_base<scalar>::type>::type
70
+
71
+ /****************************************************************************
72
+ * Implementation of real *
73
+ ****************************************************************************/
74
+
75
+ template<typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
76
+ struct real_default_impl
77
+ {
78
+ typedef typename NumTraits<Scalar>::Real RealScalar;
79
+ EIGEN_DEVICE_FUNC
80
+ static inline RealScalar run(const Scalar& x)
81
+ {
82
+ return x;
83
+ }
84
+ };
85
+
86
+ template<typename Scalar>
87
+ struct real_default_impl<Scalar,true>
88
+ {
89
+ typedef typename NumTraits<Scalar>::Real RealScalar;
90
+ EIGEN_DEVICE_FUNC
91
+ static inline RealScalar run(const Scalar& x)
92
+ {
93
+ using std::real;
94
+ return real(x);
95
+ }
96
+ };
97
+
98
+ template<typename Scalar> struct real_impl : real_default_impl<Scalar> {};
99
+
100
+ #ifdef __CUDA_ARCH__
101
+ template<typename T>
102
+ struct real_impl<std::complex<T> >
103
+ {
104
+ typedef T RealScalar;
105
+ EIGEN_DEVICE_FUNC
106
+ static inline T run(const std::complex<T>& x)
107
+ {
108
+ return x.real();
109
+ }
110
+ };
111
+ #endif
112
+
113
+ template<typename Scalar>
114
+ struct real_retval
115
+ {
116
+ typedef typename NumTraits<Scalar>::Real type;
117
+ };
118
+
119
+ /****************************************************************************
120
+ * Implementation of imag *
121
+ ****************************************************************************/
122
+
123
+ template<typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
124
+ struct imag_default_impl
125
+ {
126
+ typedef typename NumTraits<Scalar>::Real RealScalar;
127
+ EIGEN_DEVICE_FUNC
128
+ static inline RealScalar run(const Scalar&)
129
+ {
130
+ return RealScalar(0);
131
+ }
132
+ };
133
+
134
+ template<typename Scalar>
135
+ struct imag_default_impl<Scalar,true>
136
+ {
137
+ typedef typename NumTraits<Scalar>::Real RealScalar;
138
+ EIGEN_DEVICE_FUNC
139
+ static inline RealScalar run(const Scalar& x)
140
+ {
141
+ using std::imag;
142
+ return imag(x);
143
+ }
144
+ };
145
+
146
+ template<typename Scalar> struct imag_impl : imag_default_impl<Scalar> {};
147
+
148
+ #ifdef __CUDA_ARCH__
149
+ template<typename T>
150
+ struct imag_impl<std::complex<T> >
151
+ {
152
+ typedef T RealScalar;
153
+ EIGEN_DEVICE_FUNC
154
+ static inline T run(const std::complex<T>& x)
155
+ {
156
+ return x.imag();
157
+ }
158
+ };
159
+ #endif
160
+
161
+ template<typename Scalar>
162
+ struct imag_retval
163
+ {
164
+ typedef typename NumTraits<Scalar>::Real type;
165
+ };
166
+
167
+ /****************************************************************************
168
+ * Implementation of real_ref *
169
+ ****************************************************************************/
170
+
171
+ template<typename Scalar>
172
+ struct real_ref_impl
173
+ {
174
+ typedef typename NumTraits<Scalar>::Real RealScalar;
175
+ EIGEN_DEVICE_FUNC
176
+ static inline RealScalar& run(Scalar& x)
177
+ {
178
+ return reinterpret_cast<RealScalar*>(&x)[0];
179
+ }
180
+ EIGEN_DEVICE_FUNC
181
+ static inline const RealScalar& run(const Scalar& x)
182
+ {
183
+ return reinterpret_cast<const RealScalar*>(&x)[0];
184
+ }
185
+ };
186
+
187
+ template<typename Scalar>
188
+ struct real_ref_retval
189
+ {
190
+ typedef typename NumTraits<Scalar>::Real & type;
191
+ };
192
+
193
+ /****************************************************************************
194
+ * Implementation of imag_ref *
195
+ ****************************************************************************/
196
+
197
+ template<typename Scalar, bool IsComplex>
198
+ struct imag_ref_default_impl
199
+ {
200
+ typedef typename NumTraits<Scalar>::Real RealScalar;
201
+ EIGEN_DEVICE_FUNC
202
+ static inline RealScalar& run(Scalar& x)
203
+ {
204
+ return reinterpret_cast<RealScalar*>(&x)[1];
205
+ }
206
+ EIGEN_DEVICE_FUNC
207
+ static inline const RealScalar& run(const Scalar& x)
208
+ {
209
+ return reinterpret_cast<RealScalar*>(&x)[1];
210
+ }
211
+ };
212
+
213
+ template<typename Scalar>
214
+ struct imag_ref_default_impl<Scalar, false>
215
+ {
216
+ EIGEN_DEVICE_FUNC
217
+ static inline Scalar run(Scalar&)
218
+ {
219
+ return Scalar(0);
220
+ }
221
+ EIGEN_DEVICE_FUNC
222
+ static inline const Scalar run(const Scalar&)
223
+ {
224
+ return Scalar(0);
225
+ }
226
+ };
227
+
228
+ template<typename Scalar>
229
+ struct imag_ref_impl : imag_ref_default_impl<Scalar, NumTraits<Scalar>::IsComplex> {};
230
+
231
+ template<typename Scalar>
232
+ struct imag_ref_retval
233
+ {
234
+ typedef typename NumTraits<Scalar>::Real & type;
235
+ };
236
+
237
+ /****************************************************************************
238
+ * Implementation of conj *
239
+ ****************************************************************************/
240
+
241
+ template<typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
242
+ struct conj_impl
243
+ {
244
+ EIGEN_DEVICE_FUNC
245
+ static inline Scalar run(const Scalar& x)
246
+ {
247
+ return x;
248
+ }
249
+ };
250
+
251
+ template<typename Scalar>
252
+ struct conj_impl<Scalar,true>
253
+ {
254
+ EIGEN_DEVICE_FUNC
255
+ static inline Scalar run(const Scalar& x)
256
+ {
257
+ using std::conj;
258
+ return conj(x);
259
+ }
260
+ };
261
+
262
+ template<typename Scalar>
263
+ struct conj_retval
264
+ {
265
+ typedef Scalar type;
266
+ };
267
+
268
+ /****************************************************************************
269
+ * Implementation of abs2 *
270
+ ****************************************************************************/
271
+
272
+ template<typename Scalar,bool IsComplex>
273
+ struct abs2_impl_default
274
+ {
275
+ typedef typename NumTraits<Scalar>::Real RealScalar;
276
+ EIGEN_DEVICE_FUNC
277
+ static inline RealScalar run(const Scalar& x)
278
+ {
279
+ return x*x;
280
+ }
281
+ };
282
+
283
+ template<typename Scalar>
284
+ struct abs2_impl_default<Scalar, true> // IsComplex
285
+ {
286
+ typedef typename NumTraits<Scalar>::Real RealScalar;
287
+ EIGEN_DEVICE_FUNC
288
+ static inline RealScalar run(const Scalar& x)
289
+ {
290
+ return real(x)*real(x) + imag(x)*imag(x);
291
+ }
292
+ };
293
+
294
+ template<typename Scalar>
295
+ struct abs2_impl
296
+ {
297
+ typedef typename NumTraits<Scalar>::Real RealScalar;
298
+ EIGEN_DEVICE_FUNC
299
+ static inline RealScalar run(const Scalar& x)
300
+ {
301
+ return abs2_impl_default<Scalar,NumTraits<Scalar>::IsComplex>::run(x);
302
+ }
303
+ };
304
+
305
+ template<typename Scalar>
306
+ struct abs2_retval
307
+ {
308
+ typedef typename NumTraits<Scalar>::Real type;
309
+ };
310
+
311
+ /****************************************************************************
312
+ * Implementation of norm1 *
313
+ ****************************************************************************/
314
+
315
+ template<typename Scalar, bool IsComplex>
316
+ struct norm1_default_impl
317
+ {
318
+ typedef typename NumTraits<Scalar>::Real RealScalar;
319
+ EIGEN_DEVICE_FUNC
320
+ static inline RealScalar run(const Scalar& x)
321
+ {
322
+ EIGEN_USING_STD_MATH(abs);
323
+ return abs(real(x)) + abs(imag(x));
324
+ }
325
+ };
326
+
327
+ template<typename Scalar>
328
+ struct norm1_default_impl<Scalar, false>
329
+ {
330
+ EIGEN_DEVICE_FUNC
331
+ static inline Scalar run(const Scalar& x)
332
+ {
333
+ EIGEN_USING_STD_MATH(abs);
334
+ return abs(x);
335
+ }
336
+ };
337
+
338
+ template<typename Scalar>
339
+ struct norm1_impl : norm1_default_impl<Scalar, NumTraits<Scalar>::IsComplex> {};
340
+
341
+ template<typename Scalar>
342
+ struct norm1_retval
343
+ {
344
+ typedef typename NumTraits<Scalar>::Real type;
345
+ };
346
+
347
+ /****************************************************************************
348
+ * Implementation of hypot *
349
+ ****************************************************************************/
350
+
351
+ template<typename Scalar> struct hypot_impl;
352
+
353
+ template<typename Scalar>
354
+ struct hypot_retval
355
+ {
356
+ typedef typename NumTraits<Scalar>::Real type;
357
+ };
358
+
359
+ /****************************************************************************
360
+ * Implementation of cast *
361
+ ****************************************************************************/
362
+
363
+ template<typename OldType, typename NewType>
364
+ struct cast_impl
365
+ {
366
+ EIGEN_DEVICE_FUNC
367
+ static inline NewType run(const OldType& x)
368
+ {
369
+ return static_cast<NewType>(x);
370
+ }
371
+ };
372
+
373
+ // here, for once, we're plainly returning NewType: we don't want cast to do weird things.
374
+
375
+ template<typename OldType, typename NewType>
376
+ EIGEN_DEVICE_FUNC
377
+ inline NewType cast(const OldType& x)
378
+ {
379
+ return cast_impl<OldType, NewType>::run(x);
380
+ }
381
+
382
+ /****************************************************************************
383
+ * Implementation of round *
384
+ ****************************************************************************/
385
+
386
+ #if EIGEN_HAS_CXX11_MATH
387
+ template<typename Scalar>
388
+ struct round_impl {
389
+ static inline Scalar run(const Scalar& x)
390
+ {
391
+ EIGEN_STATIC_ASSERT((!NumTraits<Scalar>::IsComplex), NUMERIC_TYPE_MUST_BE_REAL)
392
+ using std::round;
393
+ return round(x);
394
+ }
395
+ };
396
+ #else
397
+ template<typename Scalar>
398
+ struct round_impl
399
+ {
400
+ static inline Scalar run(const Scalar& x)
401
+ {
402
+ EIGEN_STATIC_ASSERT((!NumTraits<Scalar>::IsComplex), NUMERIC_TYPE_MUST_BE_REAL)
403
+ EIGEN_USING_STD_MATH(floor);
404
+ EIGEN_USING_STD_MATH(ceil);
405
+ return (x > Scalar(0)) ? floor(x + Scalar(0.5)) : ceil(x - Scalar(0.5));
406
+ }
407
+ };
408
+ #endif
409
+
410
+ template<typename Scalar>
411
+ struct round_retval
412
+ {
413
+ typedef Scalar type;
414
+ };
415
+
416
+ /****************************************************************************
417
+ * Implementation of arg *
418
+ ****************************************************************************/
419
+
420
+ #if EIGEN_HAS_CXX11_MATH
421
+ template<typename Scalar>
422
+ struct arg_impl {
423
+ static inline Scalar run(const Scalar& x)
424
+ {
425
+ EIGEN_USING_STD_MATH(arg);
426
+ return arg(x);
427
+ }
428
+ };
429
+ #else
430
+ template<typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
431
+ struct arg_default_impl
432
+ {
433
+ typedef typename NumTraits<Scalar>::Real RealScalar;
434
+ EIGEN_DEVICE_FUNC
435
+ static inline RealScalar run(const Scalar& x)
436
+ {
437
+ return (x < Scalar(0)) ? Scalar(EIGEN_PI) : Scalar(0); }
438
+ };
439
+
440
+ template<typename Scalar>
441
+ struct arg_default_impl<Scalar,true>
442
+ {
443
+ typedef typename NumTraits<Scalar>::Real RealScalar;
444
+ EIGEN_DEVICE_FUNC
445
+ static inline RealScalar run(const Scalar& x)
446
+ {
447
+ EIGEN_USING_STD_MATH(arg);
448
+ return arg(x);
449
+ }
450
+ };
451
+
452
+ template<typename Scalar> struct arg_impl : arg_default_impl<Scalar> {};
453
+ #endif
454
+
455
+ template<typename Scalar>
456
+ struct arg_retval
457
+ {
458
+ typedef typename NumTraits<Scalar>::Real type;
459
+ };
460
+
461
+ /****************************************************************************
462
+ * Implementation of log1p *
463
+ ****************************************************************************/
464
+
465
+ namespace std_fallback {
466
+ // fallback log1p implementation in case there is no log1p(Scalar) function in namespace of Scalar,
467
+ // or that there is no suitable std::log1p function available
468
+ template<typename Scalar>
469
+ EIGEN_DEVICE_FUNC inline Scalar log1p(const Scalar& x) {
470
+ EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
471
+ typedef typename NumTraits<Scalar>::Real RealScalar;
472
+ EIGEN_USING_STD_MATH(log);
473
+ Scalar x1p = RealScalar(1) + x;
474
+ return numext::equal_strict(x1p, Scalar(1)) ? x : x * ( log(x1p) / (x1p - RealScalar(1)) );
475
+ }
476
+ }
477
+
478
+ template<typename Scalar>
479
+ struct log1p_impl {
480
+ static inline Scalar run(const Scalar& x)
481
+ {
482
+ EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
483
+ #if EIGEN_HAS_CXX11_MATH
484
+ using std::log1p;
485
+ #endif
486
+ using std_fallback::log1p;
487
+ return log1p(x);
488
+ }
489
+ };
490
+
491
+
492
+ template<typename Scalar>
493
+ struct log1p_retval
494
+ {
495
+ typedef Scalar type;
496
+ };
497
+
498
+ /****************************************************************************
499
+ * Implementation of pow *
500
+ ****************************************************************************/
501
+
502
+ template<typename ScalarX,typename ScalarY, bool IsInteger = NumTraits<ScalarX>::IsInteger&&NumTraits<ScalarY>::IsInteger>
503
+ struct pow_impl
504
+ {
505
+ //typedef Scalar retval;
506
+ typedef typename ScalarBinaryOpTraits<ScalarX,ScalarY,internal::scalar_pow_op<ScalarX,ScalarY> >::ReturnType result_type;
507
+ static EIGEN_DEVICE_FUNC inline result_type run(const ScalarX& x, const ScalarY& y)
508
+ {
509
+ EIGEN_USING_STD_MATH(pow);
510
+ return pow(x, y);
511
+ }
512
+ };
513
+
514
+ template<typename ScalarX,typename ScalarY>
515
+ struct pow_impl<ScalarX,ScalarY, true>
516
+ {
517
+ typedef ScalarX result_type;
518
+ static EIGEN_DEVICE_FUNC inline ScalarX run(ScalarX x, ScalarY y)
519
+ {
520
+ ScalarX res(1);
521
+ eigen_assert(!NumTraits<ScalarY>::IsSigned || y >= 0);
522
+ if(y & 1) res *= x;
523
+ y >>= 1;
524
+ while(y)
525
+ {
526
+ x *= x;
527
+ if(y&1) res *= x;
528
+ y >>= 1;
529
+ }
530
+ return res;
531
+ }
532
+ };
533
+
534
+ /****************************************************************************
535
+ * Implementation of random *
536
+ ****************************************************************************/
537
+
538
+ template<typename Scalar,
539
+ bool IsComplex,
540
+ bool IsInteger>
541
+ struct random_default_impl {};
542
+
543
+ template<typename Scalar>
544
+ struct random_impl : random_default_impl<Scalar, NumTraits<Scalar>::IsComplex, NumTraits<Scalar>::IsInteger> {};
545
+
546
+ template<typename Scalar>
547
+ struct random_retval
548
+ {
549
+ typedef Scalar type;
550
+ };
551
+
552
+ template<typename Scalar> inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random(const Scalar& x, const Scalar& y);
553
+ template<typename Scalar> inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random();
554
+
555
+ template<typename Scalar>
556
+ struct random_default_impl<Scalar, false, false>
557
+ {
558
+ static inline Scalar run(const Scalar& x, const Scalar& y)
559
+ {
560
+ return x + (y-x) * Scalar(std::rand()) / Scalar(RAND_MAX);
561
+ }
562
+ static inline Scalar run()
563
+ {
564
+ return run(Scalar(NumTraits<Scalar>::IsSigned ? -1 : 0), Scalar(1));
565
+ }
566
+ };
567
+
568
+ enum {
569
+ meta_floor_log2_terminate,
570
+ meta_floor_log2_move_up,
571
+ meta_floor_log2_move_down,
572
+ meta_floor_log2_bogus
573
+ };
574
+
575
+ template<unsigned int n, int lower, int upper> struct meta_floor_log2_selector
576
+ {
577
+ enum { middle = (lower + upper) / 2,
578
+ value = (upper <= lower + 1) ? int(meta_floor_log2_terminate)
579
+ : (n < (1 << middle)) ? int(meta_floor_log2_move_down)
580
+ : (n==0) ? int(meta_floor_log2_bogus)
581
+ : int(meta_floor_log2_move_up)
582
+ };
583
+ };
584
+
585
+ template<unsigned int n,
586
+ int lower = 0,
587
+ int upper = sizeof(unsigned int) * CHAR_BIT - 1,
588
+ int selector = meta_floor_log2_selector<n, lower, upper>::value>
589
+ struct meta_floor_log2 {};
590
+
591
+ template<unsigned int n, int lower, int upper>
592
+ struct meta_floor_log2<n, lower, upper, meta_floor_log2_move_down>
593
+ {
594
+ enum { value = meta_floor_log2<n, lower, meta_floor_log2_selector<n, lower, upper>::middle>::value };
595
+ };
596
+
597
+ template<unsigned int n, int lower, int upper>
598
+ struct meta_floor_log2<n, lower, upper, meta_floor_log2_move_up>
599
+ {
600
+ enum { value = meta_floor_log2<n, meta_floor_log2_selector<n, lower, upper>::middle, upper>::value };
601
+ };
602
+
603
+ template<unsigned int n, int lower, int upper>
604
+ struct meta_floor_log2<n, lower, upper, meta_floor_log2_terminate>
605
+ {
606
+ enum { value = (n >= ((unsigned int)(1) << (lower+1))) ? lower+1 : lower };
607
+ };
608
+
609
+ template<unsigned int n, int lower, int upper>
610
+ struct meta_floor_log2<n, lower, upper, meta_floor_log2_bogus>
611
+ {
612
+ // no value, error at compile time
613
+ };
614
+
615
+ template<typename Scalar>
616
+ struct random_default_impl<Scalar, false, true>
617
+ {
618
+ static inline Scalar run(const Scalar& x, const Scalar& y)
619
+ {
620
+ if (y <= x)
621
+ return x;
622
+ // ScalarU is the unsigned counterpart of Scalar, possibly Scalar itself.
623
+ typedef typename make_unsigned<Scalar>::type ScalarU;
624
+ // ScalarX is the widest of ScalarU and unsigned int.
625
+ // We'll deal only with ScalarX and unsigned int below thus avoiding signed
626
+ // types and arithmetic and signed overflows (which are undefined behavior).
627
+ typedef typename conditional<(ScalarU(-1) > unsigned(-1)), ScalarU, unsigned>::type ScalarX;
628
+ // The following difference doesn't overflow, provided our integer types are two's
629
+ // complement and have the same number of padding bits in signed and unsigned variants.
630
+ // This is the case in most modern implementations of C++.
631
+ ScalarX range = ScalarX(y) - ScalarX(x);
632
+ ScalarX offset = 0;
633
+ ScalarX divisor = 1;
634
+ ScalarX multiplier = 1;
635
+ const unsigned rand_max = RAND_MAX;
636
+ if (range <= rand_max) divisor = (rand_max + 1) / (range + 1);
637
+ else multiplier = 1 + range / (rand_max + 1);
638
+ // Rejection sampling.
639
+ do {
640
+ offset = (unsigned(std::rand()) * multiplier) / divisor;
641
+ } while (offset > range);
642
+ return Scalar(ScalarX(x) + offset);
643
+ }
644
+
645
+ static inline Scalar run()
646
+ {
647
+ #ifdef EIGEN_MAKING_DOCS
648
+ return run(Scalar(NumTraits<Scalar>::IsSigned ? -10 : 0), Scalar(10));
649
+ #else
650
+ enum { rand_bits = meta_floor_log2<(unsigned int)(RAND_MAX)+1>::value,
651
+ scalar_bits = sizeof(Scalar) * CHAR_BIT,
652
+ shift = EIGEN_PLAIN_ENUM_MAX(0, int(rand_bits) - int(scalar_bits)),
653
+ offset = NumTraits<Scalar>::IsSigned ? (1 << (EIGEN_PLAIN_ENUM_MIN(rand_bits,scalar_bits)-1)) : 0
654
+ };
655
+ return Scalar((std::rand() >> shift) - offset);
656
+ #endif
657
+ }
658
+ };
659
+
660
+ template<typename Scalar>
661
+ struct random_default_impl<Scalar, true, false>
662
+ {
663
+ static inline Scalar run(const Scalar& x, const Scalar& y)
664
+ {
665
+ return Scalar(random(real(x), real(y)),
666
+ random(imag(x), imag(y)));
667
+ }
668
+ static inline Scalar run()
669
+ {
670
+ typedef typename NumTraits<Scalar>::Real RealScalar;
671
+ return Scalar(random<RealScalar>(), random<RealScalar>());
672
+ }
673
+ };
674
+
675
+ template<typename Scalar>
676
+ inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random(const Scalar& x, const Scalar& y)
677
+ {
678
+ return EIGEN_MATHFUNC_IMPL(random, Scalar)::run(x, y);
679
+ }
680
+
681
+ template<typename Scalar>
682
+ inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random()
683
+ {
684
+ return EIGEN_MATHFUNC_IMPL(random, Scalar)::run();
685
+ }
686
+
687
+ // Implementatin of is* functions
688
+
689
+ // std::is* do not work with fast-math and gcc, std::is* are available on MSVC 2013 and newer, as well as in clang.
690
+ #if (EIGEN_HAS_CXX11_MATH && !(EIGEN_COMP_GNUC_STRICT && __FINITE_MATH_ONLY__)) || (EIGEN_COMP_MSVC>=1800) || (EIGEN_COMP_CLANG)
691
+ #define EIGEN_USE_STD_FPCLASSIFY 1
692
+ #else
693
+ #define EIGEN_USE_STD_FPCLASSIFY 0
694
+ #endif
695
+
696
+ template<typename T>
697
+ EIGEN_DEVICE_FUNC
698
+ typename internal::enable_if<internal::is_integral<T>::value,bool>::type
699
+ isnan_impl(const T&) { return false; }
700
+
701
+ template<typename T>
702
+ EIGEN_DEVICE_FUNC
703
+ typename internal::enable_if<internal::is_integral<T>::value,bool>::type
704
+ isinf_impl(const T&) { return false; }
705
+
706
+ template<typename T>
707
+ EIGEN_DEVICE_FUNC
708
+ typename internal::enable_if<internal::is_integral<T>::value,bool>::type
709
+ isfinite_impl(const T&) { return true; }
710
+
711
+ template<typename T>
712
+ EIGEN_DEVICE_FUNC
713
+ typename internal::enable_if<(!internal::is_integral<T>::value)&&(!NumTraits<T>::IsComplex),bool>::type
714
+ isfinite_impl(const T& x)
715
+ {
716
+ #ifdef __CUDA_ARCH__
717
+ return (::isfinite)(x);
718
+ #elif EIGEN_USE_STD_FPCLASSIFY
719
+ using std::isfinite;
720
+ return isfinite EIGEN_NOT_A_MACRO (x);
721
+ #else
722
+ return x<=NumTraits<T>::highest() && x>=NumTraits<T>::lowest();
723
+ #endif
724
+ }
725
+
726
+ template<typename T>
727
+ EIGEN_DEVICE_FUNC
728
+ typename internal::enable_if<(!internal::is_integral<T>::value)&&(!NumTraits<T>::IsComplex),bool>::type
729
+ isinf_impl(const T& x)
730
+ {
731
+ #ifdef __CUDA_ARCH__
732
+ return (::isinf)(x);
733
+ #elif EIGEN_USE_STD_FPCLASSIFY
734
+ using std::isinf;
735
+ return isinf EIGEN_NOT_A_MACRO (x);
736
+ #else
737
+ return x>NumTraits<T>::highest() || x<NumTraits<T>::lowest();
738
+ #endif
739
+ }
740
+
741
+ template<typename T>
742
+ EIGEN_DEVICE_FUNC
743
+ typename internal::enable_if<(!internal::is_integral<T>::value)&&(!NumTraits<T>::IsComplex),bool>::type
744
+ isnan_impl(const T& x)
745
+ {
746
+ #ifdef __CUDA_ARCH__
747
+ return (::isnan)(x);
748
+ #elif EIGEN_USE_STD_FPCLASSIFY
749
+ using std::isnan;
750
+ return isnan EIGEN_NOT_A_MACRO (x);
751
+ #else
752
+ return x != x;
753
+ #endif
754
+ }
755
+
756
+ #if (!EIGEN_USE_STD_FPCLASSIFY)
757
+
758
+ #if EIGEN_COMP_MSVC
759
+
760
+ template<typename T> EIGEN_DEVICE_FUNC bool isinf_msvc_helper(T x)
761
+ {
762
+ return _fpclass(x)==_FPCLASS_NINF || _fpclass(x)==_FPCLASS_PINF;
763
+ }
764
+
765
+ //MSVC defines a _isnan builtin function, but for double only
766
+ EIGEN_DEVICE_FUNC inline bool isnan_impl(const long double& x) { return _isnan(x)!=0; }
767
+ EIGEN_DEVICE_FUNC inline bool isnan_impl(const double& x) { return _isnan(x)!=0; }
768
+ EIGEN_DEVICE_FUNC inline bool isnan_impl(const float& x) { return _isnan(x)!=0; }
769
+
770
+ EIGEN_DEVICE_FUNC inline bool isinf_impl(const long double& x) { return isinf_msvc_helper(x); }
771
+ EIGEN_DEVICE_FUNC inline bool isinf_impl(const double& x) { return isinf_msvc_helper(x); }
772
+ EIGEN_DEVICE_FUNC inline bool isinf_impl(const float& x) { return isinf_msvc_helper(x); }
773
+
774
+ #elif (defined __FINITE_MATH_ONLY__ && __FINITE_MATH_ONLY__ && EIGEN_COMP_GNUC)
775
+
776
+ #if EIGEN_GNUC_AT_LEAST(5,0)
777
+ #define EIGEN_TMP_NOOPT_ATTRIB EIGEN_DEVICE_FUNC inline __attribute__((optimize("no-finite-math-only")))
778
+ #else
779
+ // NOTE the inline qualifier and noinline attribute are both needed: the former is to avoid linking issue (duplicate symbol),
780
+ // while the second prevent too aggressive optimizations in fast-math mode:
781
+ #define EIGEN_TMP_NOOPT_ATTRIB EIGEN_DEVICE_FUNC inline __attribute__((noinline,optimize("no-finite-math-only")))
782
+ #endif
783
+
784
+ template<> EIGEN_TMP_NOOPT_ATTRIB bool isnan_impl(const long double& x) { return __builtin_isnan(x); }
785
+ template<> EIGEN_TMP_NOOPT_ATTRIB bool isnan_impl(const double& x) { return __builtin_isnan(x); }
786
+ template<> EIGEN_TMP_NOOPT_ATTRIB bool isnan_impl(const float& x) { return __builtin_isnan(x); }
787
+ template<> EIGEN_TMP_NOOPT_ATTRIB bool isinf_impl(const double& x) { return __builtin_isinf(x); }
788
+ template<> EIGEN_TMP_NOOPT_ATTRIB bool isinf_impl(const float& x) { return __builtin_isinf(x); }
789
+ template<> EIGEN_TMP_NOOPT_ATTRIB bool isinf_impl(const long double& x) { return __builtin_isinf(x); }
790
+
791
+ #undef EIGEN_TMP_NOOPT_ATTRIB
792
+
793
+ #endif
794
+
795
+ #endif
796
+
797
+ // The following overload are defined at the end of this file
798
+ template<typename T> EIGEN_DEVICE_FUNC bool isfinite_impl(const std::complex<T>& x);
799
+ template<typename T> EIGEN_DEVICE_FUNC bool isnan_impl(const std::complex<T>& x);
800
+ template<typename T> EIGEN_DEVICE_FUNC bool isinf_impl(const std::complex<T>& x);
801
+
802
+ template<typename T> T generic_fast_tanh_float(const T& a_x);
803
+
804
+ } // end namespace internal
805
+
806
+ /****************************************************************************
807
+ * Generic math functions *
808
+ ****************************************************************************/
809
+
810
+ namespace numext {
811
+
812
+ #ifndef __CUDA_ARCH__
813
+ template<typename T>
814
+ EIGEN_DEVICE_FUNC
815
+ EIGEN_ALWAYS_INLINE T mini(const T& x, const T& y)
816
+ {
817
+ EIGEN_USING_STD_MATH(min);
818
+ return min EIGEN_NOT_A_MACRO (x,y);
819
+ }
820
+
821
+ template<typename T>
822
+ EIGEN_DEVICE_FUNC
823
+ EIGEN_ALWAYS_INLINE T maxi(const T& x, const T& y)
824
+ {
825
+ EIGEN_USING_STD_MATH(max);
826
+ return max EIGEN_NOT_A_MACRO (x,y);
827
+ }
828
+ #else
829
+ template<typename T>
830
+ EIGEN_DEVICE_FUNC
831
+ EIGEN_ALWAYS_INLINE T mini(const T& x, const T& y)
832
+ {
833
+ return y < x ? y : x;
834
+ }
835
+ template<>
836
+ EIGEN_DEVICE_FUNC
837
+ EIGEN_ALWAYS_INLINE float mini(const float& x, const float& y)
838
+ {
839
+ return fminf(x, y);
840
+ }
841
+ template<typename T>
842
+ EIGEN_DEVICE_FUNC
843
+ EIGEN_ALWAYS_INLINE T maxi(const T& x, const T& y)
844
+ {
845
+ return x < y ? y : x;
846
+ }
847
+ template<>
848
+ EIGEN_DEVICE_FUNC
849
+ EIGEN_ALWAYS_INLINE float maxi(const float& x, const float& y)
850
+ {
851
+ return fmaxf(x, y);
852
+ }
853
+ #endif
854
+
855
+
856
+ template<typename Scalar>
857
+ EIGEN_DEVICE_FUNC
858
+ inline EIGEN_MATHFUNC_RETVAL(real, Scalar) real(const Scalar& x)
859
+ {
860
+ return EIGEN_MATHFUNC_IMPL(real, Scalar)::run(x);
861
+ }
862
+
863
+ template<typename Scalar>
864
+ EIGEN_DEVICE_FUNC
865
+ inline typename internal::add_const_on_value_type< EIGEN_MATHFUNC_RETVAL(real_ref, Scalar) >::type real_ref(const Scalar& x)
866
+ {
867
+ return internal::real_ref_impl<Scalar>::run(x);
868
+ }
869
+
870
+ template<typename Scalar>
871
+ EIGEN_DEVICE_FUNC
872
+ inline EIGEN_MATHFUNC_RETVAL(real_ref, Scalar) real_ref(Scalar& x)
873
+ {
874
+ return EIGEN_MATHFUNC_IMPL(real_ref, Scalar)::run(x);
875
+ }
876
+
877
+ template<typename Scalar>
878
+ EIGEN_DEVICE_FUNC
879
+ inline EIGEN_MATHFUNC_RETVAL(imag, Scalar) imag(const Scalar& x)
880
+ {
881
+ return EIGEN_MATHFUNC_IMPL(imag, Scalar)::run(x);
882
+ }
883
+
884
+ template<typename Scalar>
885
+ EIGEN_DEVICE_FUNC
886
+ inline EIGEN_MATHFUNC_RETVAL(arg, Scalar) arg(const Scalar& x)
887
+ {
888
+ return EIGEN_MATHFUNC_IMPL(arg, Scalar)::run(x);
889
+ }
890
+
891
+ template<typename Scalar>
892
+ EIGEN_DEVICE_FUNC
893
+ inline typename internal::add_const_on_value_type< EIGEN_MATHFUNC_RETVAL(imag_ref, Scalar) >::type imag_ref(const Scalar& x)
894
+ {
895
+ return internal::imag_ref_impl<Scalar>::run(x);
896
+ }
897
+
898
+ template<typename Scalar>
899
+ EIGEN_DEVICE_FUNC
900
+ inline EIGEN_MATHFUNC_RETVAL(imag_ref, Scalar) imag_ref(Scalar& x)
901
+ {
902
+ return EIGEN_MATHFUNC_IMPL(imag_ref, Scalar)::run(x);
903
+ }
904
+
905
+ template<typename Scalar>
906
+ EIGEN_DEVICE_FUNC
907
+ inline EIGEN_MATHFUNC_RETVAL(conj, Scalar) conj(const Scalar& x)
908
+ {
909
+ return EIGEN_MATHFUNC_IMPL(conj, Scalar)::run(x);
910
+ }
911
+
912
+ template<typename Scalar>
913
+ EIGEN_DEVICE_FUNC
914
+ inline EIGEN_MATHFUNC_RETVAL(abs2, Scalar) abs2(const Scalar& x)
915
+ {
916
+ return EIGEN_MATHFUNC_IMPL(abs2, Scalar)::run(x);
917
+ }
918
+
919
+ template<typename Scalar>
920
+ EIGEN_DEVICE_FUNC
921
+ inline EIGEN_MATHFUNC_RETVAL(norm1, Scalar) norm1(const Scalar& x)
922
+ {
923
+ return EIGEN_MATHFUNC_IMPL(norm1, Scalar)::run(x);
924
+ }
925
+
926
+ template<typename Scalar>
927
+ EIGEN_DEVICE_FUNC
928
+ inline EIGEN_MATHFUNC_RETVAL(hypot, Scalar) hypot(const Scalar& x, const Scalar& y)
929
+ {
930
+ return EIGEN_MATHFUNC_IMPL(hypot, Scalar)::run(x, y);
931
+ }
932
+
933
+ template<typename Scalar>
934
+ EIGEN_DEVICE_FUNC
935
+ inline EIGEN_MATHFUNC_RETVAL(log1p, Scalar) log1p(const Scalar& x)
936
+ {
937
+ return EIGEN_MATHFUNC_IMPL(log1p, Scalar)::run(x);
938
+ }
939
+
940
+ #ifdef __CUDACC__
941
+ template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
942
+ float log1p(const float &x) { return ::log1pf(x); }
943
+
944
+ template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
945
+ double log1p(const double &x) { return ::log1p(x); }
946
+ #endif
947
+
948
+ template<typename ScalarX,typename ScalarY>
949
+ EIGEN_DEVICE_FUNC
950
+ inline typename internal::pow_impl<ScalarX,ScalarY>::result_type pow(const ScalarX& x, const ScalarY& y)
951
+ {
952
+ return internal::pow_impl<ScalarX,ScalarY>::run(x, y);
953
+ }
954
+
955
+ template<typename T> EIGEN_DEVICE_FUNC bool (isnan) (const T &x) { return internal::isnan_impl(x); }
956
+ template<typename T> EIGEN_DEVICE_FUNC bool (isinf) (const T &x) { return internal::isinf_impl(x); }
957
+ template<typename T> EIGEN_DEVICE_FUNC bool (isfinite)(const T &x) { return internal::isfinite_impl(x); }
958
+
959
+ template<typename Scalar>
960
+ EIGEN_DEVICE_FUNC
961
+ inline EIGEN_MATHFUNC_RETVAL(round, Scalar) round(const Scalar& x)
962
+ {
963
+ return EIGEN_MATHFUNC_IMPL(round, Scalar)::run(x);
964
+ }
965
+
966
+ template<typename T>
967
+ EIGEN_DEVICE_FUNC
968
+ T (floor)(const T& x)
969
+ {
970
+ EIGEN_USING_STD_MATH(floor);
971
+ return floor(x);
972
+ }
973
+
974
+ #ifdef __CUDACC__
975
+ template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
976
+ float floor(const float &x) { return ::floorf(x); }
977
+
978
+ template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
979
+ double floor(const double &x) { return ::floor(x); }
980
+ #endif
981
+
982
+ template<typename T>
983
+ EIGEN_DEVICE_FUNC
984
+ T (ceil)(const T& x)
985
+ {
986
+ EIGEN_USING_STD_MATH(ceil);
987
+ return ceil(x);
988
+ }
989
+
990
+ #ifdef __CUDACC__
991
+ template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
992
+ float ceil(const float &x) { return ::ceilf(x); }
993
+
994
+ template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
995
+ double ceil(const double &x) { return ::ceil(x); }
996
+ #endif
997
+
998
+
999
+ /** Log base 2 for 32 bits positive integers.
1000
+ * Conveniently returns 0 for x==0. */
1001
+ inline int log2(int x)
1002
+ {
1003
+ eigen_assert(x>=0);
1004
+ unsigned int v(x);
1005
+ static const int table[32] = { 0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30, 8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31 };
1006
+ v |= v >> 1;
1007
+ v |= v >> 2;
1008
+ v |= v >> 4;
1009
+ v |= v >> 8;
1010
+ v |= v >> 16;
1011
+ return table[(v * 0x07C4ACDDU) >> 27];
1012
+ }
1013
+
1014
+ /** \returns the square root of \a x.
1015
+ *
1016
+ * It is essentially equivalent to
1017
+ * \code using std::sqrt; return sqrt(x); \endcode
1018
+ * but slightly faster for float/double and some compilers (e.g., gcc), thanks to
1019
+ * specializations when SSE is enabled.
1020
+ *
1021
+ * It's usage is justified in performance critical functions, like norm/normalize.
1022
+ */
1023
+ template<typename T>
1024
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1025
+ T sqrt(const T &x)
1026
+ {
1027
+ EIGEN_USING_STD_MATH(sqrt);
1028
+ return sqrt(x);
1029
+ }
1030
+
1031
+ template<typename T>
1032
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1033
+ T log(const T &x) {
1034
+ EIGEN_USING_STD_MATH(log);
1035
+ return log(x);
1036
+ }
1037
+
1038
+ #ifdef __CUDACC__
1039
+ template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1040
+ float log(const float &x) { return ::logf(x); }
1041
+
1042
+ template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1043
+ double log(const double &x) { return ::log(x); }
1044
+ #endif
1045
+
1046
+ template<typename T>
1047
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1048
+ typename internal::enable_if<NumTraits<T>::IsSigned || NumTraits<T>::IsComplex,typename NumTraits<T>::Real>::type
1049
+ abs(const T &x) {
1050
+ EIGEN_USING_STD_MATH(abs);
1051
+ return abs(x);
1052
+ }
1053
+
1054
+ template<typename T>
1055
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1056
+ typename internal::enable_if<!(NumTraits<T>::IsSigned || NumTraits<T>::IsComplex),typename NumTraits<T>::Real>::type
1057
+ abs(const T &x) {
1058
+ return x;
1059
+ }
1060
+
1061
+ #if defined(__SYCL_DEVICE_ONLY__)
1062
+ EIGEN_ALWAYS_INLINE float abs(float x) { return cl::sycl::fabs(x); }
1063
+ EIGEN_ALWAYS_INLINE double abs(double x) { return cl::sycl::fabs(x); }
1064
+ #endif // defined(__SYCL_DEVICE_ONLY__)
1065
+
1066
+ #ifdef __CUDACC__
1067
+ template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1068
+ float abs(const float &x) { return ::fabsf(x); }
1069
+
1070
+ template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1071
+ double abs(const double &x) { return ::fabs(x); }
1072
+
1073
+ template <> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1074
+ float abs(const std::complex<float>& x) {
1075
+ return ::hypotf(x.real(), x.imag());
1076
+ }
1077
+
1078
+ template <> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1079
+ double abs(const std::complex<double>& x) {
1080
+ return ::hypot(x.real(), x.imag());
1081
+ }
1082
+ #endif
1083
+
1084
+ template<typename T>
1085
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1086
+ T exp(const T &x) {
1087
+ EIGEN_USING_STD_MATH(exp);
1088
+ return exp(x);
1089
+ }
1090
+
1091
+ #ifdef __CUDACC__
1092
+ template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1093
+ float exp(const float &x) { return ::expf(x); }
1094
+
1095
+ template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1096
+ double exp(const double &x) { return ::exp(x); }
1097
+ #endif
1098
+
1099
+ template<typename T>
1100
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1101
+ T cos(const T &x) {
1102
+ EIGEN_USING_STD_MATH(cos);
1103
+ return cos(x);
1104
+ }
1105
+
1106
+ #ifdef __CUDACC__
1107
+ template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1108
+ float cos(const float &x) { return ::cosf(x); }
1109
+
1110
+ template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1111
+ double cos(const double &x) { return ::cos(x); }
1112
+ #endif
1113
+
1114
+ template<typename T>
1115
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1116
+ T sin(const T &x) {
1117
+ EIGEN_USING_STD_MATH(sin);
1118
+ return sin(x);
1119
+ }
1120
+
1121
+ #ifdef __CUDACC__
1122
+ template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1123
+ float sin(const float &x) { return ::sinf(x); }
1124
+
1125
+ template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1126
+ double sin(const double &x) { return ::sin(x); }
1127
+ #endif
1128
+
1129
+ template<typename T>
1130
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1131
+ T tan(const T &x) {
1132
+ EIGEN_USING_STD_MATH(tan);
1133
+ return tan(x);
1134
+ }
1135
+
1136
+ #ifdef __CUDACC__
1137
+ template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1138
+ float tan(const float &x) { return ::tanf(x); }
1139
+
1140
+ template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1141
+ double tan(const double &x) { return ::tan(x); }
1142
+ #endif
1143
+
1144
+ template<typename T>
1145
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1146
+ T acos(const T &x) {
1147
+ EIGEN_USING_STD_MATH(acos);
1148
+ return acos(x);
1149
+ }
1150
+
1151
+ #ifdef __CUDACC__
1152
+ template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1153
+ float acos(const float &x) { return ::acosf(x); }
1154
+
1155
+ template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1156
+ double acos(const double &x) { return ::acos(x); }
1157
+ #endif
1158
+
1159
+ template<typename T>
1160
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1161
+ T asin(const T &x) {
1162
+ EIGEN_USING_STD_MATH(asin);
1163
+ return asin(x);
1164
+ }
1165
+
1166
+ #ifdef __CUDACC__
1167
+ template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1168
+ float asin(const float &x) { return ::asinf(x); }
1169
+
1170
+ template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1171
+ double asin(const double &x) { return ::asin(x); }
1172
+ #endif
1173
+
1174
+ template<typename T>
1175
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1176
+ T atan(const T &x) {
1177
+ EIGEN_USING_STD_MATH(atan);
1178
+ return atan(x);
1179
+ }
1180
+
1181
+ #ifdef __CUDACC__
1182
+ template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1183
+ float atan(const float &x) { return ::atanf(x); }
1184
+
1185
+ template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1186
+ double atan(const double &x) { return ::atan(x); }
1187
+ #endif
1188
+
1189
+
1190
+ template<typename T>
1191
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1192
+ T cosh(const T &x) {
1193
+ EIGEN_USING_STD_MATH(cosh);
1194
+ return cosh(x);
1195
+ }
1196
+
1197
+ #ifdef __CUDACC__
1198
+ template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1199
+ float cosh(const float &x) { return ::coshf(x); }
1200
+
1201
+ template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1202
+ double cosh(const double &x) { return ::cosh(x); }
1203
+ #endif
1204
+
1205
+ template<typename T>
1206
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1207
+ T sinh(const T &x) {
1208
+ EIGEN_USING_STD_MATH(sinh);
1209
+ return sinh(x);
1210
+ }
1211
+
1212
+ #ifdef __CUDACC__
1213
+ template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1214
+ float sinh(const float &x) { return ::sinhf(x); }
1215
+
1216
+ template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1217
+ double sinh(const double &x) { return ::sinh(x); }
1218
+ #endif
1219
+
1220
+ template<typename T>
1221
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1222
+ T tanh(const T &x) {
1223
+ EIGEN_USING_STD_MATH(tanh);
1224
+ return tanh(x);
1225
+ }
1226
+
1227
+ #if (!defined(__CUDACC__)) && EIGEN_FAST_MATH
1228
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1229
+ float tanh(float x) { return internal::generic_fast_tanh_float(x); }
1230
+ #endif
1231
+
1232
+ #ifdef __CUDACC__
1233
+ template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1234
+ float tanh(const float &x) { return ::tanhf(x); }
1235
+
1236
+ template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1237
+ double tanh(const double &x) { return ::tanh(x); }
1238
+ #endif
1239
+
1240
+ template <typename T>
1241
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1242
+ T fmod(const T& a, const T& b) {
1243
+ EIGEN_USING_STD_MATH(fmod);
1244
+ return fmod(a, b);
1245
+ }
1246
+
1247
+ #ifdef __CUDACC__
1248
+ template <>
1249
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1250
+ float fmod(const float& a, const float& b) {
1251
+ return ::fmodf(a, b);
1252
+ }
1253
+
1254
+ template <>
1255
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
1256
+ double fmod(const double& a, const double& b) {
1257
+ return ::fmod(a, b);
1258
+ }
1259
+ #endif
1260
+
1261
+ } // end namespace numext
1262
+
1263
+ namespace internal {
1264
+
1265
+ template<typename T>
1266
+ EIGEN_DEVICE_FUNC bool isfinite_impl(const std::complex<T>& x)
1267
+ {
1268
+ return (numext::isfinite)(numext::real(x)) && (numext::isfinite)(numext::imag(x));
1269
+ }
1270
+
1271
+ template<typename T>
1272
+ EIGEN_DEVICE_FUNC bool isnan_impl(const std::complex<T>& x)
1273
+ {
1274
+ return (numext::isnan)(numext::real(x)) || (numext::isnan)(numext::imag(x));
1275
+ }
1276
+
1277
+ template<typename T>
1278
+ EIGEN_DEVICE_FUNC bool isinf_impl(const std::complex<T>& x)
1279
+ {
1280
+ return ((numext::isinf)(numext::real(x)) || (numext::isinf)(numext::imag(x))) && (!(numext::isnan)(x));
1281
+ }
1282
+
1283
+ /****************************************************************************
1284
+ * Implementation of fuzzy comparisons *
1285
+ ****************************************************************************/
1286
+
1287
+ template<typename Scalar,
1288
+ bool IsComplex,
1289
+ bool IsInteger>
1290
+ struct scalar_fuzzy_default_impl {};
1291
+
1292
+ template<typename Scalar>
1293
+ struct scalar_fuzzy_default_impl<Scalar, false, false>
1294
+ {
1295
+ typedef typename NumTraits<Scalar>::Real RealScalar;
1296
+ template<typename OtherScalar> EIGEN_DEVICE_FUNC
1297
+ static inline bool isMuchSmallerThan(const Scalar& x, const OtherScalar& y, const RealScalar& prec)
1298
+ {
1299
+ return numext::abs(x) <= numext::abs(y) * prec;
1300
+ }
1301
+ EIGEN_DEVICE_FUNC
1302
+ static inline bool isApprox(const Scalar& x, const Scalar& y, const RealScalar& prec)
1303
+ {
1304
+ return numext::abs(x - y) <= numext::mini(numext::abs(x), numext::abs(y)) * prec;
1305
+ }
1306
+ EIGEN_DEVICE_FUNC
1307
+ static inline bool isApproxOrLessThan(const Scalar& x, const Scalar& y, const RealScalar& prec)
1308
+ {
1309
+ return x <= y || isApprox(x, y, prec);
1310
+ }
1311
+ };
1312
+
1313
+ template<typename Scalar>
1314
+ struct scalar_fuzzy_default_impl<Scalar, false, true>
1315
+ {
1316
+ typedef typename NumTraits<Scalar>::Real RealScalar;
1317
+ template<typename OtherScalar> EIGEN_DEVICE_FUNC
1318
+ static inline bool isMuchSmallerThan(const Scalar& x, const Scalar&, const RealScalar&)
1319
+ {
1320
+ return x == Scalar(0);
1321
+ }
1322
+ EIGEN_DEVICE_FUNC
1323
+ static inline bool isApprox(const Scalar& x, const Scalar& y, const RealScalar&)
1324
+ {
1325
+ return x == y;
1326
+ }
1327
+ EIGEN_DEVICE_FUNC
1328
+ static inline bool isApproxOrLessThan(const Scalar& x, const Scalar& y, const RealScalar&)
1329
+ {
1330
+ return x <= y;
1331
+ }
1332
+ };
1333
+
1334
+ template<typename Scalar>
1335
+ struct scalar_fuzzy_default_impl<Scalar, true, false>
1336
+ {
1337
+ typedef typename NumTraits<Scalar>::Real RealScalar;
1338
+ template<typename OtherScalar> EIGEN_DEVICE_FUNC
1339
+ static inline bool isMuchSmallerThan(const Scalar& x, const OtherScalar& y, const RealScalar& prec)
1340
+ {
1341
+ return numext::abs2(x) <= numext::abs2(y) * prec * prec;
1342
+ }
1343
+ EIGEN_DEVICE_FUNC
1344
+ static inline bool isApprox(const Scalar& x, const Scalar& y, const RealScalar& prec)
1345
+ {
1346
+ return numext::abs2(x - y) <= numext::mini(numext::abs2(x), numext::abs2(y)) * prec * prec;
1347
+ }
1348
+ };
1349
+
1350
+ template<typename Scalar>
1351
+ struct scalar_fuzzy_impl : scalar_fuzzy_default_impl<Scalar, NumTraits<Scalar>::IsComplex, NumTraits<Scalar>::IsInteger> {};
1352
+
1353
+ template<typename Scalar, typename OtherScalar> EIGEN_DEVICE_FUNC
1354
+ inline bool isMuchSmallerThan(const Scalar& x, const OtherScalar& y,
1355
+ const typename NumTraits<Scalar>::Real &precision = NumTraits<Scalar>::dummy_precision())
1356
+ {
1357
+ return scalar_fuzzy_impl<Scalar>::template isMuchSmallerThan<OtherScalar>(x, y, precision);
1358
+ }
1359
+
1360
+ template<typename Scalar> EIGEN_DEVICE_FUNC
1361
+ inline bool isApprox(const Scalar& x, const Scalar& y,
1362
+ const typename NumTraits<Scalar>::Real &precision = NumTraits<Scalar>::dummy_precision())
1363
+ {
1364
+ return scalar_fuzzy_impl<Scalar>::isApprox(x, y, precision);
1365
+ }
1366
+
1367
+ template<typename Scalar> EIGEN_DEVICE_FUNC
1368
+ inline bool isApproxOrLessThan(const Scalar& x, const Scalar& y,
1369
+ const typename NumTraits<Scalar>::Real &precision = NumTraits<Scalar>::dummy_precision())
1370
+ {
1371
+ return scalar_fuzzy_impl<Scalar>::isApproxOrLessThan(x, y, precision);
1372
+ }
1373
+
1374
+ /******************************************
1375
+ *** The special case of the bool type ***
1376
+ ******************************************/
1377
+
1378
+ template<> struct random_impl<bool>
1379
+ {
1380
+ static inline bool run()
1381
+ {
1382
+ return random<int>(0,1)==0 ? false : true;
1383
+ }
1384
+ };
1385
+
1386
+ template<> struct scalar_fuzzy_impl<bool>
1387
+ {
1388
+ typedef bool RealScalar;
1389
+
1390
+ template<typename OtherScalar> EIGEN_DEVICE_FUNC
1391
+ static inline bool isMuchSmallerThan(const bool& x, const bool&, const bool&)
1392
+ {
1393
+ return !x;
1394
+ }
1395
+
1396
+ EIGEN_DEVICE_FUNC
1397
+ static inline bool isApprox(bool x, bool y, bool)
1398
+ {
1399
+ return x == y;
1400
+ }
1401
+
1402
+ EIGEN_DEVICE_FUNC
1403
+ static inline bool isApproxOrLessThan(const bool& x, const bool& y, const bool&)
1404
+ {
1405
+ return (!x) || y;
1406
+ }
1407
+
1408
+ };
1409
+
1410
+
1411
+ } // end namespace internal
1412
+
1413
+ } // end namespace Eigen
1414
+
1415
+ #endif // EIGEN_MATHFUNCTIONS_H