tomoto 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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