@smake/eigen 1.1.0 → 1.1.1

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 (431) hide show
  1. package/README.md +1 -1
  2. package/eigen/Eigen/AccelerateSupport +52 -0
  3. package/eigen/Eigen/Cholesky +18 -20
  4. package/eigen/Eigen/CholmodSupport +28 -28
  5. package/eigen/Eigen/Core +187 -120
  6. package/eigen/Eigen/Eigenvalues +16 -13
  7. package/eigen/Eigen/Geometry +18 -18
  8. package/eigen/Eigen/Householder +9 -7
  9. package/eigen/Eigen/IterativeLinearSolvers +8 -4
  10. package/eigen/Eigen/Jacobi +14 -13
  11. package/eigen/Eigen/KLUSupport +23 -21
  12. package/eigen/Eigen/LU +15 -16
  13. package/eigen/Eigen/MetisSupport +12 -12
  14. package/eigen/Eigen/OrderingMethods +54 -51
  15. package/eigen/Eigen/PaStiXSupport +23 -21
  16. package/eigen/Eigen/PardisoSupport +17 -14
  17. package/eigen/Eigen/QR +18 -20
  18. package/eigen/Eigen/QtAlignedMalloc +5 -12
  19. package/eigen/Eigen/SPQRSupport +21 -14
  20. package/eigen/Eigen/SVD +23 -17
  21. package/eigen/Eigen/Sparse +1 -2
  22. package/eigen/Eigen/SparseCholesky +18 -15
  23. package/eigen/Eigen/SparseCore +18 -17
  24. package/eigen/Eigen/SparseLU +9 -9
  25. package/eigen/Eigen/SparseQR +16 -14
  26. package/eigen/Eigen/StdDeque +5 -2
  27. package/eigen/Eigen/StdList +5 -2
  28. package/eigen/Eigen/StdVector +5 -2
  29. package/eigen/Eigen/SuperLUSupport +30 -24
  30. package/eigen/Eigen/ThreadPool +80 -0
  31. package/eigen/Eigen/UmfPackSupport +19 -17
  32. package/eigen/Eigen/Version +14 -0
  33. package/eigen/Eigen/src/AccelerateSupport/AccelerateSupport.h +423 -0
  34. package/eigen/Eigen/src/AccelerateSupport/InternalHeaderCheck.h +3 -0
  35. package/eigen/Eigen/src/Cholesky/InternalHeaderCheck.h +3 -0
  36. package/eigen/Eigen/src/Cholesky/LDLT.h +366 -405
  37. package/eigen/Eigen/src/Cholesky/LLT.h +323 -367
  38. package/eigen/Eigen/src/Cholesky/LLT_LAPACKE.h +81 -56
  39. package/eigen/Eigen/src/CholmodSupport/CholmodSupport.h +585 -529
  40. package/eigen/Eigen/src/CholmodSupport/InternalHeaderCheck.h +3 -0
  41. package/eigen/Eigen/src/Core/ArithmeticSequence.h +143 -317
  42. package/eigen/Eigen/src/Core/Array.h +329 -370
  43. package/eigen/Eigen/src/Core/ArrayBase.h +190 -203
  44. package/eigen/Eigen/src/Core/ArrayWrapper.h +126 -170
  45. package/eigen/Eigen/src/Core/Assign.h +30 -40
  46. package/eigen/Eigen/src/Core/AssignEvaluator.h +651 -604
  47. package/eigen/Eigen/src/Core/Assign_MKL.h +125 -120
  48. package/eigen/Eigen/src/Core/BandMatrix.h +267 -282
  49. package/eigen/Eigen/src/Core/Block.h +371 -390
  50. package/eigen/Eigen/src/Core/CommaInitializer.h +85 -100
  51. package/eigen/Eigen/src/Core/ConditionEstimator.h +51 -53
  52. package/eigen/Eigen/src/Core/CoreEvaluators.h +1214 -937
  53. package/eigen/Eigen/src/Core/CoreIterators.h +72 -63
  54. package/eigen/Eigen/src/Core/CwiseBinaryOp.h +112 -129
  55. package/eigen/Eigen/src/Core/CwiseNullaryOp.h +676 -702
  56. package/eigen/Eigen/src/Core/CwiseTernaryOp.h +77 -103
  57. package/eigen/Eigen/src/Core/CwiseUnaryOp.h +55 -67
  58. package/eigen/Eigen/src/Core/CwiseUnaryView.h +127 -92
  59. package/eigen/Eigen/src/Core/DenseBase.h +630 -658
  60. package/eigen/Eigen/src/Core/DenseCoeffsBase.h +511 -628
  61. package/eigen/Eigen/src/Core/DenseStorage.h +511 -590
  62. package/eigen/Eigen/src/Core/DeviceWrapper.h +153 -0
  63. package/eigen/Eigen/src/Core/Diagonal.h +168 -207
  64. package/eigen/Eigen/src/Core/DiagonalMatrix.h +346 -317
  65. package/eigen/Eigen/src/Core/DiagonalProduct.h +12 -10
  66. package/eigen/Eigen/src/Core/Dot.h +167 -217
  67. package/eigen/Eigen/src/Core/EigenBase.h +74 -85
  68. package/eigen/Eigen/src/Core/Fill.h +138 -0
  69. package/eigen/Eigen/src/Core/FindCoeff.h +464 -0
  70. package/eigen/Eigen/src/Core/ForceAlignedAccess.h +90 -113
  71. package/eigen/Eigen/src/Core/Fuzzy.h +82 -105
  72. package/eigen/Eigen/src/Core/GeneralProduct.h +315 -261
  73. package/eigen/Eigen/src/Core/GenericPacketMath.h +1182 -520
  74. package/eigen/Eigen/src/Core/GlobalFunctions.h +193 -157
  75. package/eigen/Eigen/src/Core/IO.h +131 -156
  76. package/eigen/Eigen/src/Core/IndexedView.h +209 -125
  77. package/eigen/Eigen/src/Core/InnerProduct.h +260 -0
  78. package/eigen/Eigen/src/Core/InternalHeaderCheck.h +3 -0
  79. package/eigen/Eigen/src/Core/Inverse.h +50 -59
  80. package/eigen/Eigen/src/Core/Map.h +123 -141
  81. package/eigen/Eigen/src/Core/MapBase.h +255 -282
  82. package/eigen/Eigen/src/Core/MathFunctions.h +1247 -1201
  83. package/eigen/Eigen/src/Core/MathFunctionsImpl.h +162 -99
  84. package/eigen/Eigen/src/Core/Matrix.h +463 -494
  85. package/eigen/Eigen/src/Core/MatrixBase.h +468 -470
  86. package/eigen/Eigen/src/Core/NestByValue.h +58 -52
  87. package/eigen/Eigen/src/Core/NoAlias.h +79 -86
  88. package/eigen/Eigen/src/Core/NumTraits.h +206 -206
  89. package/eigen/Eigen/src/Core/PartialReduxEvaluator.h +163 -142
  90. package/eigen/Eigen/src/Core/PermutationMatrix.h +461 -511
  91. package/eigen/Eigen/src/Core/PlainObjectBase.h +858 -972
  92. package/eigen/Eigen/src/Core/Product.h +246 -130
  93. package/eigen/Eigen/src/Core/ProductEvaluators.h +779 -671
  94. package/eigen/Eigen/src/Core/Random.h +153 -164
  95. package/eigen/Eigen/src/Core/RandomImpl.h +262 -0
  96. package/eigen/Eigen/src/Core/RealView.h +250 -0
  97. package/eigen/Eigen/src/Core/Redux.h +334 -314
  98. package/eigen/Eigen/src/Core/Ref.h +259 -257
  99. package/eigen/Eigen/src/Core/Replicate.h +92 -104
  100. package/eigen/Eigen/src/Core/Reshaped.h +215 -271
  101. package/eigen/Eigen/src/Core/ReturnByValue.h +47 -55
  102. package/eigen/Eigen/src/Core/Reverse.h +133 -148
  103. package/eigen/Eigen/src/Core/Select.h +68 -140
  104. package/eigen/Eigen/src/Core/SelfAdjointView.h +254 -290
  105. package/eigen/Eigen/src/Core/SelfCwiseBinaryOp.h +23 -20
  106. package/eigen/Eigen/src/Core/SkewSymmetricMatrix3.h +382 -0
  107. package/eigen/Eigen/src/Core/Solve.h +88 -102
  108. package/eigen/Eigen/src/Core/SolveTriangular.h +126 -124
  109. package/eigen/Eigen/src/Core/SolverBase.h +132 -133
  110. package/eigen/Eigen/src/Core/StableNorm.h +113 -147
  111. package/eigen/Eigen/src/Core/StlIterators.h +404 -248
  112. package/eigen/Eigen/src/Core/Stride.h +90 -92
  113. package/eigen/Eigen/src/Core/Swap.h +70 -39
  114. package/eigen/Eigen/src/Core/Transpose.h +258 -295
  115. package/eigen/Eigen/src/Core/Transpositions.h +270 -333
  116. package/eigen/Eigen/src/Core/TriangularMatrix.h +642 -743
  117. package/eigen/Eigen/src/Core/VectorBlock.h +59 -72
  118. package/eigen/Eigen/src/Core/VectorwiseOp.h +653 -704
  119. package/eigen/Eigen/src/Core/Visitor.h +464 -308
  120. package/eigen/Eigen/src/Core/arch/AVX/Complex.h +380 -187
  121. package/eigen/Eigen/src/Core/arch/AVX/MathFunctions.h +65 -163
  122. package/eigen/Eigen/src/Core/arch/AVX/PacketMath.h +2145 -638
  123. package/eigen/Eigen/src/Core/arch/AVX/Reductions.h +353 -0
  124. package/eigen/Eigen/src/Core/arch/AVX/TypeCasting.h +253 -60
  125. package/eigen/Eigen/src/Core/arch/AVX512/Complex.h +278 -228
  126. package/eigen/Eigen/src/Core/arch/AVX512/GemmKernel.h +1245 -0
  127. package/eigen/Eigen/src/Core/arch/AVX512/MathFunctions.h +48 -269
  128. package/eigen/Eigen/src/Core/arch/AVX512/MathFunctionsFP16.h +75 -0
  129. package/eigen/Eigen/src/Core/arch/AVX512/PacketMath.h +1597 -754
  130. package/eigen/Eigen/src/Core/arch/AVX512/PacketMathFP16.h +1413 -0
  131. package/eigen/Eigen/src/Core/arch/AVX512/Reductions.h +297 -0
  132. package/eigen/Eigen/src/Core/arch/AVX512/TrsmKernel.h +1167 -0
  133. package/eigen/Eigen/src/Core/arch/AVX512/TrsmUnrolls.inc +1219 -0
  134. package/eigen/Eigen/src/Core/arch/AVX512/TypeCasting.h +229 -41
  135. package/eigen/Eigen/src/Core/arch/AVX512/TypeCastingFP16.h +130 -0
  136. package/eigen/Eigen/src/Core/arch/AltiVec/Complex.h +420 -184
  137. package/eigen/Eigen/src/Core/arch/AltiVec/MathFunctions.h +40 -49
  138. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProduct.h +2962 -2213
  139. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h +196 -212
  140. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductMMA.h +713 -441
  141. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductMMAbfloat16.h +742 -0
  142. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixVectorProduct.inc +2818 -0
  143. package/eigen/Eigen/src/Core/arch/AltiVec/PacketMath.h +2380 -1362
  144. package/eigen/Eigen/src/Core/arch/AltiVec/TypeCasting.h +153 -0
  145. package/eigen/Eigen/src/Core/arch/Default/BFloat16.h +390 -224
  146. package/eigen/Eigen/src/Core/arch/Default/ConjHelper.h +78 -67
  147. package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h +1784 -799
  148. package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h +167 -50
  149. package/eigen/Eigen/src/Core/arch/Default/Half.h +528 -379
  150. package/eigen/Eigen/src/Core/arch/Default/Settings.h +10 -12
  151. package/eigen/Eigen/src/Core/arch/GPU/Complex.h +244 -0
  152. package/eigen/Eigen/src/Core/arch/GPU/MathFunctions.h +41 -40
  153. package/eigen/Eigen/src/Core/arch/GPU/PacketMath.h +550 -523
  154. package/eigen/Eigen/src/Core/arch/GPU/Tuple.h +268 -0
  155. package/eigen/Eigen/src/Core/arch/GPU/TypeCasting.h +27 -30
  156. package/eigen/Eigen/src/Core/arch/HIP/hcc/math_constants.h +8 -8
  157. package/eigen/Eigen/src/Core/arch/HVX/PacketMath.h +1088 -0
  158. package/eigen/Eigen/src/Core/arch/LSX/Complex.h +520 -0
  159. package/eigen/Eigen/src/Core/arch/LSX/GeneralBlockPanelKernel.h +23 -0
  160. package/eigen/Eigen/src/Core/arch/LSX/MathFunctions.h +43 -0
  161. package/eigen/Eigen/src/Core/arch/LSX/PacketMath.h +2866 -0
  162. package/eigen/Eigen/src/Core/arch/LSX/TypeCasting.h +526 -0
  163. package/eigen/Eigen/src/Core/arch/MSA/Complex.h +54 -82
  164. package/eigen/Eigen/src/Core/arch/MSA/MathFunctions.h +84 -92
  165. package/eigen/Eigen/src/Core/arch/MSA/PacketMath.h +51 -47
  166. package/eigen/Eigen/src/Core/arch/NEON/Complex.h +454 -306
  167. package/eigen/Eigen/src/Core/arch/NEON/GeneralBlockPanelKernel.h +175 -115
  168. package/eigen/Eigen/src/Core/arch/NEON/MathFunctions.h +23 -30
  169. package/eigen/Eigen/src/Core/arch/NEON/PacketMath.h +4366 -2857
  170. package/eigen/Eigen/src/Core/arch/NEON/TypeCasting.h +616 -393
  171. package/eigen/Eigen/src/Core/arch/NEON/UnaryFunctors.h +57 -0
  172. package/eigen/Eigen/src/Core/arch/SSE/Complex.h +350 -198
  173. package/eigen/Eigen/src/Core/arch/SSE/MathFunctions.h +38 -149
  174. package/eigen/Eigen/src/Core/arch/SSE/PacketMath.h +1791 -912
  175. package/eigen/Eigen/src/Core/arch/SSE/Reductions.h +324 -0
  176. package/eigen/Eigen/src/Core/arch/SSE/TypeCasting.h +128 -40
  177. package/eigen/Eigen/src/Core/arch/SVE/MathFunctions.h +10 -6
  178. package/eigen/Eigen/src/Core/arch/SVE/PacketMath.h +156 -234
  179. package/eigen/Eigen/src/Core/arch/SVE/TypeCasting.h +6 -3
  180. package/eigen/Eigen/src/Core/arch/SYCL/InteropHeaders.h +27 -32
  181. package/eigen/Eigen/src/Core/arch/SYCL/MathFunctions.h +119 -117
  182. package/eigen/Eigen/src/Core/arch/SYCL/PacketMath.h +325 -419
  183. package/eigen/Eigen/src/Core/arch/SYCL/TypeCasting.h +15 -17
  184. package/eigen/Eigen/src/Core/arch/ZVector/Complex.h +325 -181
  185. package/eigen/Eigen/src/Core/arch/ZVector/MathFunctions.h +94 -83
  186. package/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h +811 -458
  187. package/eigen/Eigen/src/Core/functors/AssignmentFunctors.h +121 -124
  188. package/eigen/Eigen/src/Core/functors/BinaryFunctors.h +576 -370
  189. package/eigen/Eigen/src/Core/functors/NullaryFunctors.h +194 -109
  190. package/eigen/Eigen/src/Core/functors/StlFunctors.h +95 -112
  191. package/eigen/Eigen/src/Core/functors/TernaryFunctors.h +34 -7
  192. package/eigen/Eigen/src/Core/functors/UnaryFunctors.h +1038 -749
  193. package/eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h +1883 -1375
  194. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix.h +312 -370
  195. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +189 -176
  196. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h +84 -81
  197. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix_BLAS.h +154 -73
  198. package/eigen/Eigen/src/Core/products/GeneralMatrixVector.h +292 -337
  199. package/eigen/Eigen/src/Core/products/GeneralMatrixVector_BLAS.h +80 -77
  200. package/eigen/Eigen/src/Core/products/Parallelizer.h +207 -105
  201. package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +327 -388
  202. package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix_BLAS.h +206 -224
  203. package/eigen/Eigen/src/Core/products/SelfadjointMatrixVector.h +138 -147
  204. package/eigen/Eigen/src/Core/products/SelfadjointMatrixVector_BLAS.h +58 -61
  205. package/eigen/Eigen/src/Core/products/SelfadjointProduct.h +71 -71
  206. package/eigen/Eigen/src/Core/products/SelfadjointRank2Update.h +48 -47
  207. package/eigen/Eigen/src/Core/products/TriangularMatrixMatrix.h +294 -369
  208. package/eigen/Eigen/src/Core/products/TriangularMatrixMatrix_BLAS.h +246 -238
  209. package/eigen/Eigen/src/Core/products/TriangularMatrixVector.h +244 -247
  210. package/eigen/Eigen/src/Core/products/TriangularMatrixVector_BLAS.h +212 -192
  211. package/eigen/Eigen/src/Core/products/TriangularSolverMatrix.h +328 -277
  212. package/eigen/Eigen/src/Core/products/TriangularSolverMatrix_BLAS.h +108 -109
  213. package/eigen/Eigen/src/Core/products/TriangularSolverVector.h +68 -94
  214. package/eigen/Eigen/src/Core/util/Assert.h +158 -0
  215. package/eigen/Eigen/src/Core/util/BlasUtil.h +342 -303
  216. package/eigen/Eigen/src/Core/util/ConfigureVectorization.h +348 -317
  217. package/eigen/Eigen/src/Core/util/Constants.h +297 -262
  218. package/eigen/Eigen/src/Core/util/DisableStupidWarnings.h +130 -90
  219. package/eigen/Eigen/src/Core/util/EmulateArray.h +270 -0
  220. package/eigen/Eigen/src/Core/util/ForwardDeclarations.h +449 -247
  221. package/eigen/Eigen/src/Core/util/GpuHipCudaDefines.inc +101 -0
  222. package/eigen/Eigen/src/Core/util/GpuHipCudaUndefines.inc +45 -0
  223. package/eigen/Eigen/src/Core/util/IndexedViewHelper.h +417 -116
  224. package/eigen/Eigen/src/Core/util/IntegralConstant.h +211 -204
  225. package/eigen/Eigen/src/Core/util/MKL_support.h +39 -37
  226. package/eigen/Eigen/src/Core/util/Macros.h +655 -773
  227. package/eigen/Eigen/src/Core/util/MaxSizeVector.h +139 -0
  228. package/eigen/Eigen/src/Core/util/Memory.h +970 -748
  229. package/eigen/Eigen/src/Core/util/Meta.h +581 -633
  230. package/eigen/Eigen/src/Core/util/MoreMeta.h +638 -0
  231. package/eigen/Eigen/src/Core/util/ReenableStupidWarnings.h +32 -19
  232. package/eigen/Eigen/src/Core/util/ReshapedHelper.h +17 -17
  233. package/eigen/Eigen/src/Core/util/Serializer.h +209 -0
  234. package/eigen/Eigen/src/Core/util/StaticAssert.h +50 -166
  235. package/eigen/Eigen/src/Core/util/SymbolicIndex.h +377 -225
  236. package/eigen/Eigen/src/Core/util/XprHelper.h +784 -547
  237. package/eigen/Eigen/src/Eigenvalues/ComplexEigenSolver.h +246 -277
  238. package/eigen/Eigen/src/Eigenvalues/ComplexSchur.h +299 -319
  239. package/eigen/Eigen/src/Eigenvalues/ComplexSchur_LAPACKE.h +52 -48
  240. package/eigen/Eigen/src/Eigenvalues/EigenSolver.h +413 -456
  241. package/eigen/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h +309 -325
  242. package/eigen/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h +157 -171
  243. package/eigen/Eigen/src/Eigenvalues/HessenbergDecomposition.h +292 -310
  244. package/eigen/Eigen/src/Eigenvalues/InternalHeaderCheck.h +3 -0
  245. package/eigen/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h +89 -105
  246. package/eigen/Eigen/src/Eigenvalues/RealQZ.h +537 -607
  247. package/eigen/Eigen/src/Eigenvalues/RealSchur.h +342 -381
  248. package/eigen/Eigen/src/Eigenvalues/RealSchur_LAPACKE.h +41 -35
  249. package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +541 -595
  250. package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_LAPACKE.h +47 -44
  251. package/eigen/Eigen/src/Eigenvalues/Tridiagonalization.h +430 -462
  252. package/eigen/Eigen/src/Geometry/AlignedBox.h +226 -227
  253. package/eigen/Eigen/src/Geometry/AngleAxis.h +131 -133
  254. package/eigen/Eigen/src/Geometry/EulerAngles.h +163 -74
  255. package/eigen/Eigen/src/Geometry/Homogeneous.h +285 -333
  256. package/eigen/Eigen/src/Geometry/Hyperplane.h +151 -160
  257. package/eigen/Eigen/src/Geometry/InternalHeaderCheck.h +3 -0
  258. package/eigen/Eigen/src/Geometry/OrthoMethods.h +168 -146
  259. package/eigen/Eigen/src/Geometry/ParametrizedLine.h +127 -127
  260. package/eigen/Eigen/src/Geometry/Quaternion.h +566 -506
  261. package/eigen/Eigen/src/Geometry/Rotation2D.h +107 -105
  262. package/eigen/Eigen/src/Geometry/RotationBase.h +148 -145
  263. package/eigen/Eigen/src/Geometry/Scaling.h +113 -106
  264. package/eigen/Eigen/src/Geometry/Transform.h +858 -936
  265. package/eigen/Eigen/src/Geometry/Translation.h +94 -92
  266. package/eigen/Eigen/src/Geometry/Umeyama.h +79 -84
  267. package/eigen/Eigen/src/Geometry/arch/Geometry_SIMD.h +90 -104
  268. package/eigen/Eigen/src/Householder/BlockHouseholder.h +51 -46
  269. package/eigen/Eigen/src/Householder/Householder.h +102 -124
  270. package/eigen/Eigen/src/Householder/HouseholderSequence.h +412 -453
  271. package/eigen/Eigen/src/Householder/InternalHeaderCheck.h +3 -0
  272. package/eigen/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +149 -162
  273. package/eigen/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +124 -119
  274. package/eigen/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +92 -104
  275. package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h +251 -243
  276. package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h +224 -228
  277. package/eigen/Eigen/src/IterativeLinearSolvers/InternalHeaderCheck.h +3 -0
  278. package/eigen/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +178 -227
  279. package/eigen/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h +79 -84
  280. package/eigen/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h +54 -60
  281. package/eigen/Eigen/src/Jacobi/InternalHeaderCheck.h +3 -0
  282. package/eigen/Eigen/src/Jacobi/Jacobi.h +252 -308
  283. package/eigen/Eigen/src/KLUSupport/InternalHeaderCheck.h +3 -0
  284. package/eigen/Eigen/src/KLUSupport/KLUSupport.h +208 -227
  285. package/eigen/Eigen/src/LU/Determinant.h +50 -69
  286. package/eigen/Eigen/src/LU/FullPivLU.h +545 -596
  287. package/eigen/Eigen/src/LU/InternalHeaderCheck.h +3 -0
  288. package/eigen/Eigen/src/LU/InverseImpl.h +206 -285
  289. package/eigen/Eigen/src/LU/PartialPivLU.h +390 -428
  290. package/eigen/Eigen/src/LU/PartialPivLU_LAPACKE.h +54 -40
  291. package/eigen/Eigen/src/LU/arch/InverseSize4.h +72 -70
  292. package/eigen/Eigen/src/MetisSupport/InternalHeaderCheck.h +3 -0
  293. package/eigen/Eigen/src/MetisSupport/MetisSupport.h +81 -93
  294. package/eigen/Eigen/src/OrderingMethods/Amd.h +243 -265
  295. package/eigen/Eigen/src/OrderingMethods/Eigen_Colamd.h +831 -1004
  296. package/eigen/Eigen/src/OrderingMethods/InternalHeaderCheck.h +3 -0
  297. package/eigen/Eigen/src/OrderingMethods/Ordering.h +112 -119
  298. package/eigen/Eigen/src/PaStiXSupport/InternalHeaderCheck.h +3 -0
  299. package/eigen/Eigen/src/PaStiXSupport/PaStiXSupport.h +524 -570
  300. package/eigen/Eigen/src/PardisoSupport/InternalHeaderCheck.h +3 -0
  301. package/eigen/Eigen/src/PardisoSupport/PardisoSupport.h +385 -430
  302. package/eigen/Eigen/src/QR/ColPivHouseholderQR.h +479 -479
  303. package/eigen/Eigen/src/QR/ColPivHouseholderQR_LAPACKE.h +120 -56
  304. package/eigen/Eigen/src/QR/CompleteOrthogonalDecomposition.h +166 -153
  305. package/eigen/Eigen/src/QR/FullPivHouseholderQR.h +495 -475
  306. package/eigen/Eigen/src/QR/HouseholderQR.h +394 -285
  307. package/eigen/Eigen/src/QR/HouseholderQR_LAPACKE.h +32 -23
  308. package/eigen/Eigen/src/QR/InternalHeaderCheck.h +3 -0
  309. package/eigen/Eigen/src/SPQRSupport/InternalHeaderCheck.h +3 -0
  310. package/eigen/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h +244 -264
  311. package/eigen/Eigen/src/SVD/BDCSVD.h +817 -713
  312. package/eigen/Eigen/src/SVD/BDCSVD_LAPACKE.h +174 -0
  313. package/eigen/Eigen/src/SVD/InternalHeaderCheck.h +3 -0
  314. package/eigen/Eigen/src/SVD/JacobiSVD.h +577 -543
  315. package/eigen/Eigen/src/SVD/JacobiSVD_LAPACKE.h +85 -49
  316. package/eigen/Eigen/src/SVD/SVDBase.h +242 -182
  317. package/eigen/Eigen/src/SVD/UpperBidiagonalization.h +200 -235
  318. package/eigen/Eigen/src/SparseCholesky/InternalHeaderCheck.h +3 -0
  319. package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky.h +765 -594
  320. package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h +308 -94
  321. package/eigen/Eigen/src/SparseCore/AmbiVector.h +202 -251
  322. package/eigen/Eigen/src/SparseCore/CompressedStorage.h +184 -252
  323. package/eigen/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h +134 -178
  324. package/eigen/Eigen/src/SparseCore/InternalHeaderCheck.h +3 -0
  325. package/eigen/Eigen/src/SparseCore/SparseAssign.h +149 -140
  326. package/eigen/Eigen/src/SparseCore/SparseBlock.h +403 -440
  327. package/eigen/Eigen/src/SparseCore/SparseColEtree.h +100 -112
  328. package/eigen/Eigen/src/SparseCore/SparseCompressedBase.h +525 -303
  329. package/eigen/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +555 -339
  330. package/eigen/Eigen/src/SparseCore/SparseCwiseUnaryOp.h +100 -108
  331. package/eigen/Eigen/src/SparseCore/SparseDenseProduct.h +169 -197
  332. package/eigen/Eigen/src/SparseCore/SparseDiagonalProduct.h +71 -71
  333. package/eigen/Eigen/src/SparseCore/SparseDot.h +49 -47
  334. package/eigen/Eigen/src/SparseCore/SparseFuzzy.h +13 -11
  335. package/eigen/Eigen/src/SparseCore/SparseMap.h +243 -253
  336. package/eigen/Eigen/src/SparseCore/SparseMatrix.h +1603 -1245
  337. package/eigen/Eigen/src/SparseCore/SparseMatrixBase.h +403 -350
  338. package/eigen/Eigen/src/SparseCore/SparsePermutation.h +186 -115
  339. package/eigen/Eigen/src/SparseCore/SparseProduct.h +94 -97
  340. package/eigen/Eigen/src/SparseCore/SparseRedux.h +22 -24
  341. package/eigen/Eigen/src/SparseCore/SparseRef.h +268 -295
  342. package/eigen/Eigen/src/SparseCore/SparseSelfAdjointView.h +370 -416
  343. package/eigen/Eigen/src/SparseCore/SparseSolverBase.h +78 -87
  344. package/eigen/Eigen/src/SparseCore/SparseSparseProductWithPruning.h +81 -95
  345. package/eigen/Eigen/src/SparseCore/SparseTranspose.h +62 -71
  346. package/eigen/Eigen/src/SparseCore/SparseTriangularView.h +132 -144
  347. package/eigen/Eigen/src/SparseCore/SparseUtil.h +138 -115
  348. package/eigen/Eigen/src/SparseCore/SparseVector.h +426 -372
  349. package/eigen/Eigen/src/SparseCore/SparseView.h +164 -193
  350. package/eigen/Eigen/src/SparseCore/TriangularSolver.h +129 -170
  351. package/eigen/Eigen/src/SparseLU/InternalHeaderCheck.h +3 -0
  352. package/eigen/Eigen/src/SparseLU/SparseLU.h +756 -710
  353. package/eigen/Eigen/src/SparseLU/SparseLUImpl.h +61 -48
  354. package/eigen/Eigen/src/SparseLU/SparseLU_Memory.h +102 -118
  355. package/eigen/Eigen/src/SparseLU/SparseLU_Structs.h +38 -35
  356. package/eigen/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h +245 -301
  357. package/eigen/Eigen/src/SparseLU/SparseLU_Utils.h +44 -49
  358. package/eigen/Eigen/src/SparseLU/SparseLU_column_bmod.h +104 -108
  359. package/eigen/Eigen/src/SparseLU/SparseLU_column_dfs.h +89 -100
  360. package/eigen/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h +57 -58
  361. package/eigen/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h +43 -55
  362. package/eigen/Eigen/src/SparseLU/SparseLU_kernel_bmod.h +74 -71
  363. package/eigen/Eigen/src/SparseLU/SparseLU_panel_bmod.h +124 -132
  364. package/eigen/Eigen/src/SparseLU/SparseLU_panel_dfs.h +136 -159
  365. package/eigen/Eigen/src/SparseLU/SparseLU_pivotL.h +51 -52
  366. package/eigen/Eigen/src/SparseLU/SparseLU_pruneL.h +67 -73
  367. package/eigen/Eigen/src/SparseLU/SparseLU_relax_snode.h +24 -26
  368. package/eigen/Eigen/src/SparseQR/InternalHeaderCheck.h +3 -0
  369. package/eigen/Eigen/src/SparseQR/SparseQR.h +450 -502
  370. package/eigen/Eigen/src/StlSupport/StdDeque.h +28 -93
  371. package/eigen/Eigen/src/StlSupport/StdList.h +28 -84
  372. package/eigen/Eigen/src/StlSupport/StdVector.h +28 -108
  373. package/eigen/Eigen/src/StlSupport/details.h +48 -50
  374. package/eigen/Eigen/src/SuperLUSupport/InternalHeaderCheck.h +3 -0
  375. package/eigen/Eigen/src/SuperLUSupport/SuperLUSupport.h +634 -730
  376. package/eigen/Eigen/src/ThreadPool/Barrier.h +70 -0
  377. package/eigen/Eigen/src/ThreadPool/CoreThreadPoolDevice.h +336 -0
  378. package/eigen/Eigen/src/ThreadPool/EventCount.h +241 -0
  379. package/eigen/Eigen/src/ThreadPool/ForkJoin.h +140 -0
  380. package/eigen/Eigen/src/ThreadPool/InternalHeaderCheck.h +4 -0
  381. package/eigen/Eigen/src/ThreadPool/NonBlockingThreadPool.h +587 -0
  382. package/eigen/Eigen/src/ThreadPool/RunQueue.h +230 -0
  383. package/eigen/Eigen/src/ThreadPool/ThreadCancel.h +21 -0
  384. package/eigen/Eigen/src/ThreadPool/ThreadEnvironment.h +43 -0
  385. package/eigen/Eigen/src/ThreadPool/ThreadLocal.h +289 -0
  386. package/eigen/Eigen/src/ThreadPool/ThreadPoolInterface.h +50 -0
  387. package/eigen/Eigen/src/ThreadPool/ThreadYield.h +16 -0
  388. package/eigen/Eigen/src/UmfPackSupport/InternalHeaderCheck.h +3 -0
  389. package/eigen/Eigen/src/UmfPackSupport/UmfPackSupport.h +428 -464
  390. package/eigen/Eigen/src/misc/Image.h +41 -43
  391. package/eigen/Eigen/src/misc/InternalHeaderCheck.h +3 -0
  392. package/eigen/Eigen/src/misc/Kernel.h +39 -41
  393. package/eigen/Eigen/src/misc/RealSvd2x2.h +19 -21
  394. package/eigen/Eigen/src/misc/blas.h +83 -426
  395. package/eigen/Eigen/src/misc/lapacke.h +9972 -16179
  396. package/eigen/Eigen/src/misc/lapacke_helpers.h +163 -0
  397. package/eigen/Eigen/src/misc/lapacke_mangling.h +4 -5
  398. package/eigen/Eigen/src/plugins/ArrayCwiseBinaryOps.inc +344 -0
  399. package/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.inc +544 -0
  400. package/eigen/Eigen/src/plugins/{BlockMethods.h → BlockMethods.inc} +434 -506
  401. package/eigen/Eigen/src/plugins/CommonCwiseBinaryOps.inc +116 -0
  402. package/eigen/Eigen/src/plugins/{CommonCwiseUnaryOps.h → CommonCwiseUnaryOps.inc} +58 -68
  403. package/eigen/Eigen/src/plugins/IndexedViewMethods.inc +192 -0
  404. package/eigen/Eigen/src/plugins/InternalHeaderCheck.inc +3 -0
  405. package/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.inc +331 -0
  406. package/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.inc +118 -0
  407. package/eigen/Eigen/src/plugins/ReshapedMethods.inc +133 -0
  408. package/package.json +1 -1
  409. package/eigen/COPYING.APACHE +0 -203
  410. package/eigen/COPYING.BSD +0 -26
  411. package/eigen/COPYING.GPL +0 -674
  412. package/eigen/COPYING.LGPL +0 -502
  413. package/eigen/COPYING.MINPACK +0 -51
  414. package/eigen/COPYING.MPL2 +0 -373
  415. package/eigen/COPYING.README +0 -18
  416. package/eigen/Eigen/src/Core/BooleanRedux.h +0 -162
  417. package/eigen/Eigen/src/Core/arch/CUDA/Complex.h +0 -258
  418. package/eigen/Eigen/src/Core/arch/Default/TypeCasting.h +0 -120
  419. package/eigen/Eigen/src/Core/arch/SYCL/SyclMemoryModel.h +0 -694
  420. package/eigen/Eigen/src/Core/util/NonMPL2.h +0 -3
  421. package/eigen/Eigen/src/SparseCore/MappedSparseMatrix.h +0 -67
  422. package/eigen/Eigen/src/SparseLU/SparseLU_gemm_kernel.h +0 -280
  423. package/eigen/Eigen/src/misc/lapack.h +0 -152
  424. package/eigen/Eigen/src/plugins/ArrayCwiseBinaryOps.h +0 -358
  425. package/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.h +0 -696
  426. package/eigen/Eigen/src/plugins/CommonCwiseBinaryOps.h +0 -115
  427. package/eigen/Eigen/src/plugins/IndexedViewMethods.h +0 -262
  428. package/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.h +0 -152
  429. package/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.h +0 -95
  430. package/eigen/Eigen/src/plugins/ReshapedMethods.h +0 -149
  431. package/eigen/README.md +0 -5
@@ -10,112 +10,134 @@
10
10
  #ifndef EIGEN_UNARY_FUNCTORS_H
11
11
  #define EIGEN_UNARY_FUNCTORS_H
12
12
 
13
+ // IWYU pragma: private
14
+ #include "../InternalHeaderCheck.h"
15
+
13
16
  namespace Eigen {
14
17
 
15
18
  namespace internal {
16
19
 
17
20
  /** \internal
18
- * \brief Template functor to compute the opposite of a scalar
19
- *
20
- * \sa class CwiseUnaryOp, MatrixBase::operator-
21
- */
22
- template<typename Scalar> struct scalar_opposite_op {
23
- EIGEN_EMPTY_STRUCT_CTOR(scalar_opposite_op)
24
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const { return -a; }
25
- template<typename Packet>
26
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
27
- { return internal::pnegate(a); }
28
- };
29
- template<typename Scalar>
30
- struct functor_traits<scalar_opposite_op<Scalar> >
31
- { enum {
32
- Cost = NumTraits<Scalar>::AddCost,
33
- PacketAccess = packet_traits<Scalar>::HasNegate };
21
+ * \brief Template functor to compute the opposite of a scalar
22
+ *
23
+ * \sa class CwiseUnaryOp, MatrixBase::operator-
24
+ */
25
+ template <typename Scalar>
26
+ struct scalar_opposite_op {
27
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& a) const { return numext::negate(a); }
28
+ template <typename Packet>
29
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const {
30
+ return internal::pnegate(a);
31
+ }
32
+ };
33
+ template <typename Scalar>
34
+ struct functor_traits<scalar_opposite_op<Scalar>> {
35
+ enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = packet_traits<Scalar>::HasNegate };
34
36
  };
35
37
 
36
38
  /** \internal
37
- * \brief Template functor to compute the absolute value of a scalar
38
- *
39
- * \sa class CwiseUnaryOp, Cwise::abs
40
- */
41
- template<typename Scalar> struct scalar_abs_op {
42
- EIGEN_EMPTY_STRUCT_CTOR(scalar_abs_op)
39
+ * \brief Template functor to compute the absolute value of a scalar
40
+ *
41
+ * \sa class CwiseUnaryOp, Cwise::abs
42
+ */
43
+ template <typename Scalar>
44
+ struct scalar_abs_op {
43
45
  typedef typename NumTraits<Scalar>::Real result_type;
44
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const Scalar& a) const { return numext::abs(a); }
45
- template<typename Packet>
46
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
47
- { return internal::pabs(a); }
48
- };
49
- template<typename Scalar>
50
- struct functor_traits<scalar_abs_op<Scalar> >
51
- {
52
- enum {
53
- Cost = NumTraits<Scalar>::AddCost,
54
- PacketAccess = packet_traits<Scalar>::HasAbs
55
- };
46
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator()(const Scalar& a) const { return numext::abs(a); }
47
+ template <typename Packet>
48
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const {
49
+ return internal::pabs(a);
50
+ }
51
+ };
52
+ template <typename Scalar>
53
+ struct functor_traits<scalar_abs_op<Scalar>> {
54
+ enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = packet_traits<Scalar>::HasAbs };
56
55
  };
57
56
 
58
57
  /** \internal
59
- * \brief Template functor to compute the score of a scalar, to chose a pivot
60
- *
61
- * \sa class CwiseUnaryOp
62
- */
63
- template<typename Scalar> struct scalar_score_coeff_op : scalar_abs_op<Scalar>
64
- {
58
+ * \brief Template functor to compute the score of a scalar, to chose a pivot
59
+ *
60
+ * \sa class CwiseUnaryOp
61
+ */
62
+ template <typename Scalar>
63
+ struct scalar_score_coeff_op : scalar_abs_op<Scalar> {
65
64
  typedef void Score_is_abs;
66
65
  };
67
- template<typename Scalar>
68
- struct functor_traits<scalar_score_coeff_op<Scalar> > : functor_traits<scalar_abs_op<Scalar> > {};
66
+ template <typename Scalar>
67
+ struct functor_traits<scalar_score_coeff_op<Scalar>> : functor_traits<scalar_abs_op<Scalar>> {};
69
68
 
70
69
  /* Avoid recomputing abs when we know the score and they are the same. Not a true Eigen functor. */
71
- template<typename Scalar, typename=void> struct abs_knowing_score
72
- {
73
- EIGEN_EMPTY_STRUCT_CTOR(abs_knowing_score)
70
+ template <typename Scalar, typename = void>
71
+ struct abs_knowing_score {
74
72
  typedef typename NumTraits<Scalar>::Real result_type;
75
- template<typename Score>
76
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const Scalar& a, const Score&) const { return numext::abs(a); }
73
+ template <typename Score>
74
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator()(const Scalar& a, const Score&) const {
75
+ return numext::abs(a);
76
+ }
77
77
  };
78
- template<typename Scalar> struct abs_knowing_score<Scalar, typename scalar_score_coeff_op<Scalar>::Score_is_abs>
79
- {
80
- EIGEN_EMPTY_STRUCT_CTOR(abs_knowing_score)
78
+ template <typename Scalar>
79
+ struct abs_knowing_score<Scalar, typename scalar_score_coeff_op<Scalar>::Score_is_abs> {
81
80
  typedef typename NumTraits<Scalar>::Real result_type;
82
- template<typename Scal>
83
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const Scal&, const result_type& a) const { return a; }
81
+ template <typename Scal>
82
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator()(const Scal&, const result_type& a) const {
83
+ return a;
84
+ }
84
85
  };
85
86
 
86
87
  /** \internal
87
- * \brief Template functor to compute the squared absolute value of a scalar
88
- *
89
- * \sa class CwiseUnaryOp, Cwise::abs2
90
- */
91
- template<typename Scalar> struct scalar_abs2_op {
92
- EIGEN_EMPTY_STRUCT_CTOR(scalar_abs2_op)
88
+ * \brief Template functor to compute the squared absolute value of a scalar
89
+ *
90
+ * \sa class CwiseUnaryOp, Cwise::abs2
91
+ */
92
+ template <typename Scalar>
93
+ struct scalar_abs2_op {
93
94
  typedef typename NumTraits<Scalar>::Real result_type;
94
- EIGEN_DEVICE_FUNC
95
- EIGEN_STRONG_INLINE const result_type operator() (const Scalar& a) const { return numext::abs2(a); }
96
- template<typename Packet>
97
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
98
- { return internal::pmul(a,a); }
95
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator()(const Scalar& a) const { return numext::abs2(a); }
96
+ template <typename Packet>
97
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const {
98
+ return internal::pmul(a, a);
99
+ }
100
+ };
101
+ template <typename Scalar>
102
+ struct functor_traits<scalar_abs2_op<Scalar>> {
103
+ enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasAbs2 };
104
+ };
105
+
106
+ template <typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
107
+ struct squared_norm_functor {
108
+ typedef Scalar result_type;
109
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& a) const {
110
+ return Scalar(numext::real(a) * numext::real(a), numext::imag(a) * numext::imag(a));
111
+ }
112
+ template <typename Packet>
113
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const {
114
+ return Packet(pmul(a.v, a.v));
115
+ }
116
+ };
117
+ template <typename Scalar>
118
+ struct squared_norm_functor<Scalar, false> : scalar_abs2_op<Scalar> {};
119
+
120
+ template <typename Scalar>
121
+ struct functor_traits<squared_norm_functor<Scalar>> {
122
+ using Real = typename NumTraits<Scalar>::Real;
123
+ enum { Cost = NumTraits<Real>::MulCost, PacketAccess = packet_traits<Real>::HasMul };
99
124
  };
100
- template<typename Scalar>
101
- struct functor_traits<scalar_abs2_op<Scalar> >
102
- { enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasAbs2 }; };
103
125
 
104
126
  /** \internal
105
- * \brief Template functor to compute the conjugate of a complex value
106
- *
107
- * \sa class CwiseUnaryOp, MatrixBase::conjugate()
108
- */
109
- template<typename Scalar> struct scalar_conjugate_op {
110
- EIGEN_EMPTY_STRUCT_CTOR(scalar_conjugate_op)
111
- EIGEN_DEVICE_FUNC
112
- EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const { return numext::conj(a); }
113
- template<typename Packet>
114
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const { return internal::pconj(a); }
115
- };
116
- template<typename Scalar>
117
- struct functor_traits<scalar_conjugate_op<Scalar> >
118
- {
127
+ * \brief Template functor to compute the conjugate of a complex value
128
+ *
129
+ * \sa class CwiseUnaryOp, MatrixBase::conjugate()
130
+ */
131
+ template <typename Scalar>
132
+ struct scalar_conjugate_op {
133
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& a) const { return numext::conj(a); }
134
+ template <typename Packet>
135
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const {
136
+ return internal::pconj(a);
137
+ }
138
+ };
139
+ template <typename Scalar>
140
+ struct functor_traits<scalar_conjugate_op<Scalar>> {
119
141
  enum {
120
142
  Cost = 0,
121
143
  // Yes the cost is zero even for complexes because in most cases for which
@@ -131,305 +153,382 @@ struct functor_traits<scalar_conjugate_op<Scalar> >
131
153
  };
132
154
 
133
155
  /** \internal
134
- * \brief Template functor to compute the phase angle of a complex
135
- *
136
- * \sa class CwiseUnaryOp, Cwise::arg
137
- */
138
- template<typename Scalar> struct scalar_arg_op {
139
- EIGEN_EMPTY_STRUCT_CTOR(scalar_arg_op)
156
+ * \brief Template functor to compute the phase angle of a complex
157
+ *
158
+ * \sa class CwiseUnaryOp, Cwise::arg
159
+ */
160
+ template <typename Scalar>
161
+ struct scalar_arg_op {
140
162
  typedef typename NumTraits<Scalar>::Real result_type;
141
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const Scalar& a) const { return numext::arg(a); }
142
- template<typename Packet>
143
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
144
- { return internal::parg(a); }
145
- };
146
- template<typename Scalar>
147
- struct functor_traits<scalar_arg_op<Scalar> >
148
- {
163
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator()(const Scalar& a) const { return numext::arg(a); }
164
+ template <typename Packet>
165
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const {
166
+ return internal::parg(a);
167
+ }
168
+ };
169
+ template <typename Scalar>
170
+ struct functor_traits<scalar_arg_op<Scalar>> {
149
171
  enum {
150
172
  Cost = NumTraits<Scalar>::IsComplex ? 5 * NumTraits<Scalar>::MulCost : NumTraits<Scalar>::AddCost,
151
173
  PacketAccess = packet_traits<Scalar>::HasArg
152
174
  };
153
175
  };
176
+
154
177
  /** \internal
155
- * \brief Template functor to cast a scalar to another type
156
- *
157
- * \sa class CwiseUnaryOp, MatrixBase::cast()
158
- */
159
- template<typename Scalar, typename NewType>
178
+ * \brief Template functor to compute the complex argument, returned as a complex type
179
+ *
180
+ * \sa class CwiseUnaryOp, Cwise::carg
181
+ */
182
+ template <typename Scalar>
183
+ struct scalar_carg_op {
184
+ using result_type = Scalar;
185
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& a) const {
186
+ return Scalar(numext::arg(a));
187
+ }
188
+ template <typename Packet>
189
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const {
190
+ return pcarg(a);
191
+ }
192
+ };
193
+ template <typename Scalar>
194
+ struct functor_traits<scalar_carg_op<Scalar>> {
195
+ using RealScalar = typename NumTraits<Scalar>::Real;
196
+ enum { Cost = functor_traits<scalar_atan2_op<RealScalar>>::Cost, PacketAccess = packet_traits<RealScalar>::HasATan };
197
+ };
198
+
199
+ /** \internal
200
+ * \brief Template functor to cast a scalar to another type
201
+ *
202
+ * \sa class CwiseUnaryOp, MatrixBase::cast()
203
+ */
204
+ template <typename Scalar, typename NewType>
160
205
  struct scalar_cast_op {
161
- EIGEN_EMPTY_STRUCT_CTOR(scalar_cast_op)
162
206
  typedef NewType result_type;
163
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const NewType operator() (const Scalar& a) const { return cast<Scalar, NewType>(a); }
207
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const NewType operator()(const Scalar& a) const {
208
+ return cast<Scalar, NewType>(a);
209
+ }
210
+ };
211
+
212
+ template <typename Scalar, typename NewType>
213
+ struct functor_traits<scalar_cast_op<Scalar, NewType>> {
214
+ enum { Cost = is_same<Scalar, NewType>::value ? 0 : NumTraits<NewType>::AddCost, PacketAccess = false };
164
215
  };
165
- template<typename Scalar, typename NewType>
166
- struct functor_traits<scalar_cast_op<Scalar,NewType> >
167
- { enum { Cost = is_same<Scalar, NewType>::value ? 0 : NumTraits<NewType>::AddCost, PacketAccess = false }; };
168
216
 
169
217
  /** \internal
170
- * \brief Template functor to arithmetically shift a scalar right by a number of bits
171
- *
172
- * \sa class CwiseUnaryOp, MatrixBase::shift_right()
173
- */
174
- template<typename Scalar, int N>
175
- struct scalar_shift_right_op {
176
- EIGEN_EMPTY_STRUCT_CTOR(scalar_shift_right_op)
218
+ * `core_cast_op` serves to distinguish the vectorized implementation from that of the legacy `scalar_cast_op` for
219
+ * backwards compatibility. The manner in which packet ops are handled is defined by the specialized unary_evaluator:
220
+ * `unary_evaluator<CwiseUnaryOp<core_cast_op<SrcType, DstType>, ArgType>, IndexBased>` in CoreEvaluators.h
221
+ * Otherwise, the non-vectorized behavior is identical to that of `scalar_cast_op`
222
+ */
223
+ template <typename SrcType, typename DstType>
224
+ struct core_cast_op : scalar_cast_op<SrcType, DstType> {};
225
+
226
+ template <typename SrcType, typename DstType>
227
+ struct functor_traits<core_cast_op<SrcType, DstType>> {
228
+ using CastingTraits = type_casting_traits<SrcType, DstType>;
229
+ enum {
230
+ Cost = is_same<SrcType, DstType>::value ? 0 : NumTraits<DstType>::AddCost,
231
+ PacketAccess = CastingTraits::VectorizedCast && (CastingTraits::SrcCoeffRatio <= 8)
232
+ };
233
+ };
177
234
 
178
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const
179
- { return a >> N; }
180
- template<typename Packet>
181
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
182
- { return internal::parithmetic_shift_right<N>(a); }
235
+ /** \internal
236
+ * \brief Template functor to arithmetically shift a scalar right by a number of bits
237
+ *
238
+ * \sa class CwiseUnaryOp, MatrixBase::shift_right()
239
+ */
240
+ template <typename Scalar, int N>
241
+ struct scalar_shift_right_op {
242
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& a) const {
243
+ return numext::arithmetic_shift_right(a);
244
+ }
245
+ template <typename Packet>
246
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const {
247
+ return internal::parithmetic_shift_right<N>(a);
248
+ }
249
+ };
250
+ template <typename Scalar, int N>
251
+ struct functor_traits<scalar_shift_right_op<Scalar, N>> {
252
+ enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = packet_traits<Scalar>::HasShift };
183
253
  };
184
- template<typename Scalar, int N>
185
- struct functor_traits<scalar_shift_right_op<Scalar,N> >
186
- { enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = packet_traits<Scalar>::HasShift }; };
187
254
 
188
255
  /** \internal
189
- * \brief Template functor to logically shift a scalar left by a number of bits
190
- *
191
- * \sa class CwiseUnaryOp, MatrixBase::shift_left()
192
- */
193
- template<typename Scalar, int N>
256
+ * \brief Template functor to logically shift a scalar left by a number of bits
257
+ *
258
+ * \sa class CwiseUnaryOp, MatrixBase::shift_left()
259
+ */
260
+ template <typename Scalar, int N>
194
261
  struct scalar_shift_left_op {
195
- EIGEN_EMPTY_STRUCT_CTOR(scalar_shift_left_op)
196
-
197
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const
198
- { return a << N; }
199
- template<typename Packet>
200
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
201
- { return internal::plogical_shift_left<N>(a); }
262
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& a) const {
263
+ return numext::logical_shift_left(a);
264
+ }
265
+ template <typename Packet>
266
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const {
267
+ return internal::plogical_shift_left<N>(a);
268
+ }
269
+ };
270
+ template <typename Scalar, int N>
271
+ struct functor_traits<scalar_shift_left_op<Scalar, N>> {
272
+ enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = packet_traits<Scalar>::HasShift };
202
273
  };
203
- template<typename Scalar, int N>
204
- struct functor_traits<scalar_shift_left_op<Scalar,N> >
205
- { enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = packet_traits<Scalar>::HasShift }; };
206
274
 
207
275
  /** \internal
208
- * \brief Template functor to extract the real part of a complex
209
- *
210
- * \sa class CwiseUnaryOp, MatrixBase::real()
211
- */
212
- template<typename Scalar>
276
+ * \brief Template functor to extract the real part of a complex
277
+ *
278
+ * \sa class CwiseUnaryOp, MatrixBase::real()
279
+ */
280
+ template <typename Scalar>
213
281
  struct scalar_real_op {
214
- EIGEN_EMPTY_STRUCT_CTOR(scalar_real_op)
215
282
  typedef typename NumTraits<Scalar>::Real result_type;
216
- EIGEN_DEVICE_FUNC
217
- EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const { return numext::real(a); }
283
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator()(const Scalar& a) const { return numext::real(a); }
284
+ };
285
+ template <typename Scalar>
286
+ struct functor_traits<scalar_real_op<Scalar>> {
287
+ enum { Cost = 0, PacketAccess = false };
218
288
  };
219
- template<typename Scalar>
220
- struct functor_traits<scalar_real_op<Scalar> >
221
- { enum { Cost = 0, PacketAccess = false }; };
222
289
 
223
290
  /** \internal
224
- * \brief Template functor to extract the imaginary part of a complex
225
- *
226
- * \sa class CwiseUnaryOp, MatrixBase::imag()
227
- */
228
- template<typename Scalar>
291
+ * \brief Template functor to extract the imaginary part of a complex
292
+ *
293
+ * \sa class CwiseUnaryOp, MatrixBase::imag()
294
+ */
295
+ template <typename Scalar>
229
296
  struct scalar_imag_op {
230
- EIGEN_EMPTY_STRUCT_CTOR(scalar_imag_op)
231
297
  typedef typename NumTraits<Scalar>::Real result_type;
232
- EIGEN_DEVICE_FUNC
233
- EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const { return numext::imag(a); }
298
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator()(const Scalar& a) const { return numext::imag(a); }
299
+ };
300
+ template <typename Scalar>
301
+ struct functor_traits<scalar_imag_op<Scalar>> {
302
+ enum { Cost = 0, PacketAccess = false };
234
303
  };
235
- template<typename Scalar>
236
- struct functor_traits<scalar_imag_op<Scalar> >
237
- { enum { Cost = 0, PacketAccess = false }; };
238
304
 
239
305
  /** \internal
240
- * \brief Template functor to extract the real part of a complex as a reference
241
- *
242
- * \sa class CwiseUnaryOp, MatrixBase::real()
243
- */
244
- template<typename Scalar>
306
+ * \brief Template functor to extract the real part of a complex as a reference
307
+ *
308
+ * \sa class CwiseUnaryOp, MatrixBase::real()
309
+ */
310
+ template <typename Scalar>
245
311
  struct scalar_real_ref_op {
246
- EIGEN_EMPTY_STRUCT_CTOR(scalar_real_ref_op)
247
312
  typedef typename NumTraits<Scalar>::Real result_type;
248
- EIGEN_DEVICE_FUNC
249
- EIGEN_STRONG_INLINE result_type& operator() (const Scalar& a) const { return numext::real_ref(*const_cast<Scalar*>(&a)); }
313
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type& operator()(const Scalar& a) const {
314
+ return numext::real_ref(a);
315
+ }
316
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type& operator()(Scalar& a) const { return numext::real_ref(a); }
317
+ };
318
+ template <typename Scalar>
319
+ struct functor_traits<scalar_real_ref_op<Scalar>> {
320
+ enum { Cost = 0, PacketAccess = false };
250
321
  };
251
- template<typename Scalar>
252
- struct functor_traits<scalar_real_ref_op<Scalar> >
253
- { enum { Cost = 0, PacketAccess = false }; };
254
322
 
255
323
  /** \internal
256
- * \brief Template functor to extract the imaginary part of a complex as a reference
257
- *
258
- * \sa class CwiseUnaryOp, MatrixBase::imag()
259
- */
260
- template<typename Scalar>
324
+ * \brief Template functor to extract the imaginary part of a complex as a reference
325
+ *
326
+ * \sa class CwiseUnaryOp, MatrixBase::imag()
327
+ */
328
+ template <typename Scalar>
261
329
  struct scalar_imag_ref_op {
262
- EIGEN_EMPTY_STRUCT_CTOR(scalar_imag_ref_op)
263
330
  typedef typename NumTraits<Scalar>::Real result_type;
264
- EIGEN_DEVICE_FUNC
265
- EIGEN_STRONG_INLINE result_type& operator() (const Scalar& a) const { return numext::imag_ref(*const_cast<Scalar*>(&a)); }
331
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type& operator()(Scalar& a) const { return numext::imag_ref(a); }
332
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type& operator()(const Scalar& a) const {
333
+ return numext::imag_ref(a);
334
+ }
335
+ };
336
+ template <typename Scalar>
337
+ struct functor_traits<scalar_imag_ref_op<Scalar>> {
338
+ enum { Cost = 0, PacketAccess = false };
266
339
  };
267
- template<typename Scalar>
268
- struct functor_traits<scalar_imag_ref_op<Scalar> >
269
- { enum { Cost = 0, PacketAccess = false }; };
270
340
 
271
341
  /** \internal
272
- *
273
- * \brief Template functor to compute the exponential of a scalar
274
- *
275
- * \sa class CwiseUnaryOp, Cwise::exp()
276
- */
277
- template<typename Scalar> struct scalar_exp_op {
278
- EIGEN_EMPTY_STRUCT_CTOR(scalar_exp_op)
279
- EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return numext::exp(a); }
342
+ *
343
+ * \brief Template functor to compute the exponential of a scalar
344
+ *
345
+ * \sa class CwiseUnaryOp, Cwise::exp()
346
+ */
347
+ template <typename Scalar>
348
+ struct scalar_exp_op {
349
+ EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return internal::pexp(a); }
280
350
  template <typename Packet>
281
- EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pexp(a); }
351
+ EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
352
+ return internal::pexp(a);
353
+ }
282
354
  };
283
355
  template <typename Scalar>
284
- struct functor_traits<scalar_exp_op<Scalar> > {
356
+ struct functor_traits<scalar_exp_op<Scalar>> {
285
357
  enum {
286
358
  PacketAccess = packet_traits<Scalar>::HasExp,
287
- // The following numbers are based on the AVX implementation.
359
+ // The following numbers are based on the AVX implementation.
288
360
  #ifdef EIGEN_VECTORIZE_FMA
289
361
  // Haswell can issue 2 add/mul/madd per cycle.
290
- Cost =
291
- (sizeof(Scalar) == 4
292
- // float: 8 pmadd, 4 pmul, 2 padd/psub, 6 other
293
- ? (8 * NumTraits<Scalar>::AddCost + 6 * NumTraits<Scalar>::MulCost)
294
- // double: 7 pmadd, 5 pmul, 3 padd/psub, 1 div, 13 other
295
- : (14 * NumTraits<Scalar>::AddCost +
296
- 6 * NumTraits<Scalar>::MulCost +
297
- scalar_div_cost<Scalar,packet_traits<Scalar>::HasDiv>::value))
362
+ Cost = (sizeof(Scalar) == 4
363
+ // float: 8 pmadd, 4 pmul, 2 padd/psub, 6 other
364
+ ? (8 * NumTraits<Scalar>::AddCost + 6 * NumTraits<Scalar>::MulCost)
365
+ // double: 7 pmadd, 5 pmul, 3 padd/psub, 1 div, 13 other
366
+ : (14 * NumTraits<Scalar>::AddCost + 6 * NumTraits<Scalar>::MulCost +
367
+ scalar_div_cost<Scalar, packet_traits<Scalar>::HasDiv>::value))
298
368
  #else
299
- Cost =
300
- (sizeof(Scalar) == 4
301
- // float: 7 pmadd, 6 pmul, 4 padd/psub, 10 other
302
- ? (21 * NumTraits<Scalar>::AddCost + 13 * NumTraits<Scalar>::MulCost)
303
- // double: 7 pmadd, 5 pmul, 3 padd/psub, 1 div, 13 other
304
- : (23 * NumTraits<Scalar>::AddCost +
305
- 12 * NumTraits<Scalar>::MulCost +
306
- scalar_div_cost<Scalar,packet_traits<Scalar>::HasDiv>::value))
369
+ Cost = (sizeof(Scalar) == 4
370
+ // float: 7 pmadd, 6 pmul, 4 padd/psub, 10 other
371
+ ? (21 * NumTraits<Scalar>::AddCost + 13 * NumTraits<Scalar>::MulCost)
372
+ // double: 7 pmadd, 5 pmul, 3 padd/psub, 1 div, 13 other
373
+ : (23 * NumTraits<Scalar>::AddCost + 12 * NumTraits<Scalar>::MulCost +
374
+ scalar_div_cost<Scalar, packet_traits<Scalar>::HasDiv>::value))
307
375
  #endif
308
376
  };
309
377
  };
310
378
 
379
+ template <typename Scalar>
380
+ struct scalar_exp2_op {
381
+ EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return internal::pexp2(a); }
382
+ template <typename Packet>
383
+ EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
384
+ return internal::pexp2(a);
385
+ }
386
+ };
387
+ template <typename Scalar>
388
+ struct functor_traits<scalar_exp2_op<Scalar>> {
389
+ enum {
390
+ PacketAccess = packet_traits<Scalar>::HasExp,
391
+ Cost = functor_traits<scalar_exp_op<Scalar>>::Cost // TODO measure cost of exp2
392
+ };
393
+ };
394
+
311
395
  /** \internal
312
- *
313
- * \brief Template functor to compute the exponential of a scalar - 1.
314
- *
315
- * \sa class CwiseUnaryOp, ArrayBase::expm1()
316
- */
317
- template<typename Scalar> struct scalar_expm1_op {
318
- EIGEN_EMPTY_STRUCT_CTOR(scalar_expm1_op)
319
- EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return numext::expm1(a); }
396
+ *
397
+ * \brief Template functor to compute the exponential of a scalar - 1.
398
+ *
399
+ * \sa class CwiseUnaryOp, ArrayBase::expm1()
400
+ */
401
+ template <typename Scalar>
402
+ struct scalar_expm1_op {
403
+ EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::expm1(a); }
320
404
  template <typename Packet>
321
- EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pexpm1(a); }
405
+ EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
406
+ return internal::pexpm1(a);
407
+ }
322
408
  };
323
409
  template <typename Scalar>
324
- struct functor_traits<scalar_expm1_op<Scalar> > {
410
+ struct functor_traits<scalar_expm1_op<Scalar>> {
325
411
  enum {
326
412
  PacketAccess = packet_traits<Scalar>::HasExpm1,
327
- Cost = functor_traits<scalar_exp_op<Scalar> >::Cost // TODO measure cost of expm1
413
+ Cost = functor_traits<scalar_exp_op<Scalar>>::Cost // TODO measure cost of expm1
328
414
  };
329
415
  };
330
416
 
331
417
  /** \internal
332
- *
333
- * \brief Template functor to compute the logarithm of a scalar
334
- *
335
- * \sa class CwiseUnaryOp, ArrayBase::log()
336
- */
337
- template<typename Scalar> struct scalar_log_op {
338
- EIGEN_EMPTY_STRUCT_CTOR(scalar_log_op)
339
- EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return numext::log(a); }
418
+ *
419
+ * \brief Template functor to compute the logarithm of a scalar
420
+ *
421
+ * \sa class CwiseUnaryOp, ArrayBase::log()
422
+ */
423
+ template <typename Scalar>
424
+ struct scalar_log_op {
425
+ EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::log(a); }
340
426
  template <typename Packet>
341
- EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::plog(a); }
427
+ EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
428
+ return internal::plog(a);
429
+ }
342
430
  };
343
431
  template <typename Scalar>
344
- struct functor_traits<scalar_log_op<Scalar> > {
432
+ struct functor_traits<scalar_log_op<Scalar>> {
345
433
  enum {
346
434
  PacketAccess = packet_traits<Scalar>::HasLog,
347
- Cost =
348
- (PacketAccess
349
- // The following numbers are based on the AVX implementation.
435
+ Cost = (PacketAccess
436
+ // The following numbers are based on the AVX implementation.
350
437
  #ifdef EIGEN_VECTORIZE_FMA
351
- // 8 pmadd, 6 pmul, 8 padd/psub, 16 other, can issue 2 add/mul/madd per cycle.
352
- ? (20 * NumTraits<Scalar>::AddCost + 7 * NumTraits<Scalar>::MulCost)
438
+ // 8 pmadd, 6 pmul, 8 padd/psub, 16 other, can issue 2 add/mul/madd per cycle.
439
+ ? (20 * NumTraits<Scalar>::AddCost + 7 * NumTraits<Scalar>::MulCost)
353
440
  #else
354
- // 8 pmadd, 6 pmul, 8 padd/psub, 20 other
355
- ? (36 * NumTraits<Scalar>::AddCost + 14 * NumTraits<Scalar>::MulCost)
441
+ // 8 pmadd, 6 pmul, 8 padd/psub, 20 other
442
+ ? (36 * NumTraits<Scalar>::AddCost + 14 * NumTraits<Scalar>::MulCost)
356
443
  #endif
357
- // Measured cost of std::log.
358
- : sizeof(Scalar)==4 ? 40 : 85)
444
+ // Measured cost of std::log.
445
+ : sizeof(Scalar) == 4 ? 40 : 85)
359
446
  };
360
447
  };
361
448
 
362
449
  /** \internal
363
- *
364
- * \brief Template functor to compute the logarithm of 1 plus a scalar value
365
- *
366
- * \sa class CwiseUnaryOp, ArrayBase::log1p()
367
- */
368
- template<typename Scalar> struct scalar_log1p_op {
369
- EIGEN_EMPTY_STRUCT_CTOR(scalar_log1p_op)
370
- EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return numext::log1p(a); }
450
+ *
451
+ * \brief Template functor to compute the logarithm of 1 plus a scalar value
452
+ *
453
+ * \sa class CwiseUnaryOp, ArrayBase::log1p()
454
+ */
455
+ template <typename Scalar>
456
+ struct scalar_log1p_op {
457
+ EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::log1p(a); }
371
458
  template <typename Packet>
372
- EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::plog1p(a); }
459
+ EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
460
+ return internal::plog1p(a);
461
+ }
373
462
  };
374
463
  template <typename Scalar>
375
- struct functor_traits<scalar_log1p_op<Scalar> > {
464
+ struct functor_traits<scalar_log1p_op<Scalar>> {
376
465
  enum {
377
466
  PacketAccess = packet_traits<Scalar>::HasLog1p,
378
- Cost = functor_traits<scalar_log_op<Scalar> >::Cost // TODO measure cost of log1p
467
+ Cost = functor_traits<scalar_log_op<Scalar>>::Cost // TODO measure cost of log1p
379
468
  };
380
469
  };
381
470
 
382
471
  /** \internal
383
- *
384
- * \brief Template functor to compute the base-10 logarithm of a scalar
385
- *
386
- * \sa class CwiseUnaryOp, Cwise::log10()
387
- */
388
- template<typename Scalar> struct scalar_log10_op {
389
- EIGEN_EMPTY_STRUCT_CTOR(scalar_log10_op)
390
- EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { EIGEN_USING_STD(log10) return log10(a); }
472
+ *
473
+ * \brief Template functor to compute the base-10 logarithm of a scalar
474
+ *
475
+ * \sa class CwiseUnaryOp, Cwise::log10()
476
+ */
477
+ template <typename Scalar>
478
+ struct scalar_log10_op {
479
+ EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { EIGEN_USING_STD(log10) return log10(a); }
391
480
  template <typename Packet>
392
- EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::plog10(a); }
481
+ EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
482
+ return internal::plog10(a);
483
+ }
484
+ };
485
+ template <typename Scalar>
486
+ struct functor_traits<scalar_log10_op<Scalar>> {
487
+ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasLog10 };
393
488
  };
394
- template<typename Scalar>
395
- struct functor_traits<scalar_log10_op<Scalar> >
396
- { enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasLog10 }; };
397
489
 
398
490
  /** \internal
399
- *
400
- * \brief Template functor to compute the base-2 logarithm of a scalar
401
- *
402
- * \sa class CwiseUnaryOp, Cwise::log2()
403
- */
404
- template<typename Scalar> struct scalar_log2_op {
405
- EIGEN_EMPTY_STRUCT_CTOR(scalar_log2_op)
406
- EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return Scalar(EIGEN_LOG2E) * numext::log(a); }
491
+ *
492
+ * \brief Template functor to compute the base-2 logarithm of a scalar
493
+ *
494
+ * \sa class CwiseUnaryOp, Cwise::log2()
495
+ */
496
+ template <typename Scalar>
497
+ struct scalar_log2_op {
498
+ using RealScalar = typename NumTraits<Scalar>::Real;
499
+ EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const {
500
+ return Scalar(RealScalar(EIGEN_LOG2E)) * numext::log(a);
501
+ }
407
502
  template <typename Packet>
408
- EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::plog2(a); }
503
+ EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
504
+ return internal::plog2(a);
505
+ }
506
+ };
507
+ template <typename Scalar>
508
+ struct functor_traits<scalar_log2_op<Scalar>> {
509
+ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasLog };
409
510
  };
410
- template<typename Scalar>
411
- struct functor_traits<scalar_log2_op<Scalar> >
412
- { enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasLog }; };
413
511
 
414
512
  /** \internal
415
- * \brief Template functor to compute the square root of a scalar
416
- * \sa class CwiseUnaryOp, Cwise::sqrt()
417
- */
418
- template<typename Scalar> struct scalar_sqrt_op {
419
- EIGEN_EMPTY_STRUCT_CTOR(scalar_sqrt_op)
420
- EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return numext::sqrt(a); }
513
+ * \brief Template functor to compute the square root of a scalar
514
+ * \sa class CwiseUnaryOp, Cwise::sqrt()
515
+ */
516
+ template <typename Scalar>
517
+ struct scalar_sqrt_op {
518
+ EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::sqrt(a); }
421
519
  template <typename Packet>
422
- EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::psqrt(a); }
520
+ EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
521
+ return internal::psqrt(a);
522
+ }
423
523
  };
424
524
  template <typename Scalar>
425
- struct functor_traits<scalar_sqrt_op<Scalar> > {
525
+ struct functor_traits<scalar_sqrt_op<Scalar>> {
426
526
  enum {
427
527
  #if EIGEN_FAST_MATH
428
528
  // The following numbers are based on the AVX implementation.
429
529
  Cost = (sizeof(Scalar) == 8 ? 28
430
530
  // 4 pmul, 1 pmadd, 3 other
431
- : (3 * NumTraits<Scalar>::AddCost +
432
- 5 * NumTraits<Scalar>::MulCost)),
531
+ : (3 * NumTraits<Scalar>::AddCost + 5 * NumTraits<Scalar>::MulCost)),
433
532
  #else
434
533
  // The following numbers are based on min VSQRT throughput on Haswell.
435
534
  Cost = (sizeof(Scalar) == 8 ? 28 : 14),
@@ -439,464 +538,500 @@ struct functor_traits<scalar_sqrt_op<Scalar> > {
439
538
  };
440
539
 
441
540
  // Boolean specialization to eliminate -Wimplicit-conversion-floating-point-to-bool warnings.
442
- template<> struct scalar_sqrt_op<bool> {
443
- EIGEN_EMPTY_STRUCT_CTOR(scalar_sqrt_op)
444
- EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline bool operator() (const bool& a) const { return a; }
541
+ template <>
542
+ struct scalar_sqrt_op<bool> {
543
+ EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline bool operator()(const bool& a) const { return a; }
445
544
  template <typename Packet>
446
- EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return a; }
545
+ EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
546
+ return a;
547
+ }
447
548
  };
448
549
  template <>
449
- struct functor_traits<scalar_sqrt_op<bool> > {
550
+ struct functor_traits<scalar_sqrt_op<bool>> {
450
551
  enum { Cost = 1, PacketAccess = packet_traits<bool>::Vectorizable };
451
552
  };
452
553
 
453
554
  /** \internal
454
- * \brief Template functor to compute the reciprocal square root of a scalar
455
- * \sa class CwiseUnaryOp, Cwise::rsqrt()
456
- */
457
- template<typename Scalar> struct scalar_rsqrt_op {
458
- EIGEN_EMPTY_STRUCT_CTOR(scalar_rsqrt_op)
459
- EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return numext::rsqrt(a); }
555
+ * \brief Template functor to compute the cube root of a scalar
556
+ * \sa class CwiseUnaryOp, Cwise::sqrt()
557
+ */
558
+ template <typename Scalar>
559
+ struct scalar_cbrt_op {
560
+ EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::cbrt(a); }
460
561
  template <typename Packet>
461
- EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::prsqrt(a); }
562
+ EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
563
+ return internal::pcbrt(a);
564
+ }
462
565
  };
463
566
 
464
- template<typename Scalar>
465
- struct functor_traits<scalar_rsqrt_op<Scalar> >
466
- { enum {
467
- Cost = 5 * NumTraits<Scalar>::MulCost,
468
- PacketAccess = packet_traits<Scalar>::HasRsqrt
469
- };
567
+ template <typename Scalar>
568
+ struct functor_traits<scalar_cbrt_op<Scalar>> {
569
+ enum { Cost = 20 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasCbrt };
470
570
  };
471
571
 
472
572
  /** \internal
473
- * \brief Template functor to compute the cosine of a scalar
474
- * \sa class CwiseUnaryOp, ArrayBase::cos()
475
- */
476
- template<typename Scalar> struct scalar_cos_op {
477
- EIGEN_EMPTY_STRUCT_CTOR(scalar_cos_op)
478
- EIGEN_DEVICE_FUNC inline Scalar operator() (const Scalar& a) const { return numext::cos(a); }
573
+ * \brief Template functor to compute the reciprocal square root of a scalar
574
+ * \sa class CwiseUnaryOp, Cwise::rsqrt()
575
+ */
576
+ template <typename Scalar>
577
+ struct scalar_rsqrt_op {
578
+ EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::rsqrt(a); }
479
579
  template <typename Packet>
480
- EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pcos(a); }
580
+ EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
581
+ return internal::prsqrt(a);
582
+ }
481
583
  };
482
- template<typename Scalar>
483
- struct functor_traits<scalar_cos_op<Scalar> >
484
- {
485
- enum {
486
- Cost = 5 * NumTraits<Scalar>::MulCost,
487
- PacketAccess = packet_traits<Scalar>::HasCos
488
- };
584
+
585
+ template <typename Scalar>
586
+ struct functor_traits<scalar_rsqrt_op<Scalar>> {
587
+ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasRsqrt };
489
588
  };
490
589
 
491
590
  /** \internal
492
- * \brief Template functor to compute the sine of a scalar
493
- * \sa class CwiseUnaryOp, ArrayBase::sin()
494
- */
495
- template<typename Scalar> struct scalar_sin_op {
496
- EIGEN_EMPTY_STRUCT_CTOR(scalar_sin_op)
497
- EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return numext::sin(a); }
591
+ * \brief Template functor to compute the cosine of a scalar
592
+ * \sa class CwiseUnaryOp, ArrayBase::cos()
593
+ */
594
+ template <typename Scalar>
595
+ struct scalar_cos_op {
596
+ EIGEN_DEVICE_FUNC inline Scalar operator()(const Scalar& a) const { return numext::cos(a); }
498
597
  template <typename Packet>
499
- EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::psin(a); }
598
+ EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
599
+ return internal::pcos(a);
600
+ }
500
601
  };
501
- template<typename Scalar>
502
- struct functor_traits<scalar_sin_op<Scalar> >
503
- {
504
- enum {
505
- Cost = 5 * NumTraits<Scalar>::MulCost,
506
- PacketAccess = packet_traits<Scalar>::HasSin
507
- };
602
+ template <typename Scalar>
603
+ struct functor_traits<scalar_cos_op<Scalar>> {
604
+ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasCos };
508
605
  };
509
606
 
510
-
511
607
  /** \internal
512
- * \brief Template functor to compute the tan of a scalar
513
- * \sa class CwiseUnaryOp, ArrayBase::tan()
514
- */
515
- template<typename Scalar> struct scalar_tan_op {
516
- EIGEN_EMPTY_STRUCT_CTOR(scalar_tan_op)
517
- EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return numext::tan(a); }
608
+ * \brief Template functor to compute the sine of a scalar
609
+ * \sa class CwiseUnaryOp, ArrayBase::sin()
610
+ */
611
+ template <typename Scalar>
612
+ struct scalar_sin_op {
613
+ EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::sin(a); }
518
614
  template <typename Packet>
519
- EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::ptan(a); }
615
+ EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
616
+ return internal::psin(a);
617
+ }
520
618
  };
521
- template<typename Scalar>
522
- struct functor_traits<scalar_tan_op<Scalar> >
523
- {
524
- enum {
525
- Cost = 5 * NumTraits<Scalar>::MulCost,
526
- PacketAccess = packet_traits<Scalar>::HasTan
527
- };
619
+ template <typename Scalar>
620
+ struct functor_traits<scalar_sin_op<Scalar>> {
621
+ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasSin };
528
622
  };
529
623
 
530
624
  /** \internal
531
- * \brief Template functor to compute the arc cosine of a scalar
532
- * \sa class CwiseUnaryOp, ArrayBase::acos()
533
- */
534
- template<typename Scalar> struct scalar_acos_op {
535
- EIGEN_EMPTY_STRUCT_CTOR(scalar_acos_op)
536
- EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return numext::acos(a); }
625
+ * \brief Template functor to compute the tan of a scalar
626
+ * \sa class CwiseUnaryOp, ArrayBase::tan()
627
+ */
628
+ template <typename Scalar>
629
+ struct scalar_tan_op {
630
+ EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::tan(a); }
537
631
  template <typename Packet>
538
- EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pacos(a); }
632
+ EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
633
+ return internal::ptan(a);
634
+ }
539
635
  };
540
- template<typename Scalar>
541
- struct functor_traits<scalar_acos_op<Scalar> >
542
- {
543
- enum {
544
- Cost = 5 * NumTraits<Scalar>::MulCost,
545
- PacketAccess = packet_traits<Scalar>::HasACos
546
- };
636
+ template <typename Scalar>
637
+ struct functor_traits<scalar_tan_op<Scalar>> {
638
+ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasTan };
547
639
  };
548
640
 
549
641
  /** \internal
550
- * \brief Template functor to compute the arc sine of a scalar
551
- * \sa class CwiseUnaryOp, ArrayBase::asin()
552
- */
553
- template<typename Scalar> struct scalar_asin_op {
554
- EIGEN_EMPTY_STRUCT_CTOR(scalar_asin_op)
555
- EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return numext::asin(a); }
642
+ * \brief Template functor to compute the arc cosine of a scalar
643
+ * \sa class CwiseUnaryOp, ArrayBase::acos()
644
+ */
645
+ template <typename Scalar>
646
+ struct scalar_acos_op {
647
+ EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::acos(a); }
556
648
  template <typename Packet>
557
- EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pasin(a); }
649
+ EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
650
+ return internal::pacos(a);
651
+ }
558
652
  };
559
- template<typename Scalar>
560
- struct functor_traits<scalar_asin_op<Scalar> >
561
- {
562
- enum {
563
- Cost = 5 * NumTraits<Scalar>::MulCost,
564
- PacketAccess = packet_traits<Scalar>::HasASin
565
- };
653
+ template <typename Scalar>
654
+ struct functor_traits<scalar_acos_op<Scalar>> {
655
+ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasACos };
566
656
  };
567
657
 
658
+ /** \internal
659
+ * \brief Template functor to compute the arc sine of a scalar
660
+ * \sa class CwiseUnaryOp, ArrayBase::asin()
661
+ */
662
+ template <typename Scalar>
663
+ struct scalar_asin_op {
664
+ EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::asin(a); }
665
+ template <typename Packet>
666
+ EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
667
+ return internal::pasin(a);
668
+ }
669
+ };
670
+ template <typename Scalar>
671
+ struct functor_traits<scalar_asin_op<Scalar>> {
672
+ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasASin };
673
+ };
568
674
 
569
675
  /** \internal
570
- * \brief Template functor to compute the atan of a scalar
571
- * \sa class CwiseUnaryOp, ArrayBase::atan()
572
- */
573
- template<typename Scalar> struct scalar_atan_op {
574
- EIGEN_EMPTY_STRUCT_CTOR(scalar_atan_op)
575
- EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return numext::atan(a); }
676
+ * \brief Template functor to compute the atan of a scalar
677
+ * \sa class CwiseUnaryOp, ArrayBase::atan()
678
+ */
679
+ template <typename Scalar>
680
+ struct scalar_atan_op {
681
+ EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::atan(a); }
576
682
  template <typename Packet>
577
- EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::patan(a); }
683
+ EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
684
+ return internal::patan(a);
685
+ }
578
686
  };
579
- template<typename Scalar>
580
- struct functor_traits<scalar_atan_op<Scalar> >
581
- {
582
- enum {
583
- Cost = 5 * NumTraits<Scalar>::MulCost,
584
- PacketAccess = packet_traits<Scalar>::HasATan
585
- };
687
+ template <typename Scalar>
688
+ struct functor_traits<scalar_atan_op<Scalar>> {
689
+ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasATan };
586
690
  };
587
691
 
588
692
  /** \internal
589
- * \brief Template functor to compute the tanh of a scalar
590
- * \sa class CwiseUnaryOp, ArrayBase::tanh()
591
- */
693
+ * \brief Template functor to compute the tanh of a scalar
694
+ * \sa class CwiseUnaryOp, ArrayBase::tanh()
695
+ */
592
696
  template <typename Scalar>
593
697
  struct scalar_tanh_op {
594
- EIGEN_EMPTY_STRUCT_CTOR(scalar_tanh_op)
595
698
  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::tanh(a); }
596
699
  template <typename Packet>
597
- EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& x) const { return ptanh(x); }
700
+ EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& x) const {
701
+ return ptanh(x);
702
+ }
598
703
  };
599
704
 
600
705
  template <typename Scalar>
601
- struct functor_traits<scalar_tanh_op<Scalar> > {
706
+ struct functor_traits<scalar_tanh_op<Scalar>> {
602
707
  enum {
603
708
  PacketAccess = packet_traits<Scalar>::HasTanh,
604
- Cost = ( (EIGEN_FAST_MATH && is_same<Scalar,float>::value)
709
+ Cost = ((EIGEN_FAST_MATH && is_same<Scalar, float>::value)
605
710
  // The following numbers are based on the AVX implementation,
606
711
  #ifdef EIGEN_VECTORIZE_FMA
607
712
  // Haswell can issue 2 add/mul/madd per cycle.
608
713
  // 9 pmadd, 2 pmul, 1 div, 2 other
609
- ? (2 * NumTraits<Scalar>::AddCost +
610
- 6 * NumTraits<Scalar>::MulCost +
611
- scalar_div_cost<Scalar,packet_traits<Scalar>::HasDiv>::value)
714
+ ? (2 * NumTraits<Scalar>::AddCost + 6 * NumTraits<Scalar>::MulCost +
715
+ scalar_div_cost<Scalar, packet_traits<Scalar>::HasDiv>::value)
612
716
  #else
613
- ? (11 * NumTraits<Scalar>::AddCost +
614
- 11 * NumTraits<Scalar>::MulCost +
615
- scalar_div_cost<Scalar,packet_traits<Scalar>::HasDiv>::value)
717
+ ? (11 * NumTraits<Scalar>::AddCost + 11 * NumTraits<Scalar>::MulCost +
718
+ scalar_div_cost<Scalar, packet_traits<Scalar>::HasDiv>::value)
616
719
  #endif
617
720
  // This number assumes a naive implementation of tanh
618
- : (6 * NumTraits<Scalar>::AddCost +
619
- 3 * NumTraits<Scalar>::MulCost +
620
- 2 * scalar_div_cost<Scalar,packet_traits<Scalar>::HasDiv>::value +
621
- functor_traits<scalar_exp_op<Scalar> >::Cost))
721
+ : (6 * NumTraits<Scalar>::AddCost + 3 * NumTraits<Scalar>::MulCost +
722
+ 2 * scalar_div_cost<Scalar, packet_traits<Scalar>::HasDiv>::value +
723
+ functor_traits<scalar_exp_op<Scalar>>::Cost))
622
724
  };
623
725
  };
624
726
 
625
- #if EIGEN_HAS_CXX11_MATH
626
727
  /** \internal
627
- * \brief Template functor to compute the atanh of a scalar
628
- * \sa class CwiseUnaryOp, ArrayBase::atanh()
629
- */
728
+ * \brief Template functor to compute the atanh of a scalar
729
+ * \sa class CwiseUnaryOp, ArrayBase::atanh()
730
+ */
630
731
  template <typename Scalar>
631
732
  struct scalar_atanh_op {
632
- EIGEN_EMPTY_STRUCT_CTOR(scalar_atanh_op)
633
733
  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::atanh(a); }
734
+ template <typename Packet>
735
+ EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& x) const {
736
+ return patanh(x);
737
+ }
634
738
  };
635
739
 
636
740
  template <typename Scalar>
637
- struct functor_traits<scalar_atanh_op<Scalar> > {
638
- enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = false };
741
+ struct functor_traits<scalar_atanh_op<Scalar>> {
742
+ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasATanh };
639
743
  };
640
- #endif
641
744
 
642
745
  /** \internal
643
- * \brief Template functor to compute the sinh of a scalar
644
- * \sa class CwiseUnaryOp, ArrayBase::sinh()
645
- */
646
- template<typename Scalar> struct scalar_sinh_op {
647
- EIGEN_EMPTY_STRUCT_CTOR(scalar_sinh_op)
648
- EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return numext::sinh(a); }
746
+ * \brief Template functor to compute the sinh of a scalar
747
+ * \sa class CwiseUnaryOp, ArrayBase::sinh()
748
+ */
749
+ template <typename Scalar>
750
+ struct scalar_sinh_op {
751
+ EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::sinh(a); }
649
752
  template <typename Packet>
650
- EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::psinh(a); }
753
+ EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
754
+ return internal::psinh(a);
755
+ }
651
756
  };
652
- template<typename Scalar>
653
- struct functor_traits<scalar_sinh_op<Scalar> >
654
- {
655
- enum {
656
- Cost = 5 * NumTraits<Scalar>::MulCost,
657
- PacketAccess = packet_traits<Scalar>::HasSinh
658
- };
757
+ template <typename Scalar>
758
+ struct functor_traits<scalar_sinh_op<Scalar>> {
759
+ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasSinh };
659
760
  };
660
761
 
661
- #if EIGEN_HAS_CXX11_MATH
662
762
  /** \internal
663
- * \brief Template functor to compute the asinh of a scalar
664
- * \sa class CwiseUnaryOp, ArrayBase::asinh()
665
- */
763
+ * \brief Template functor to compute the asinh of a scalar
764
+ * \sa class CwiseUnaryOp, ArrayBase::asinh()
765
+ */
666
766
  template <typename Scalar>
667
767
  struct scalar_asinh_op {
668
- EIGEN_EMPTY_STRUCT_CTOR(scalar_asinh_op)
669
768
  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::asinh(a); }
670
769
  };
671
770
 
672
771
  template <typename Scalar>
673
- struct functor_traits<scalar_asinh_op<Scalar> > {
772
+ struct functor_traits<scalar_asinh_op<Scalar>> {
674
773
  enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = false };
675
774
  };
676
- #endif
677
775
 
678
776
  /** \internal
679
- * \brief Template functor to compute the cosh of a scalar
680
- * \sa class CwiseUnaryOp, ArrayBase::cosh()
681
- */
682
- template<typename Scalar> struct scalar_cosh_op {
683
- EIGEN_EMPTY_STRUCT_CTOR(scalar_cosh_op)
684
- EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return numext::cosh(a); }
777
+ * \brief Template functor to compute the cosh of a scalar
778
+ * \sa class CwiseUnaryOp, ArrayBase::cosh()
779
+ */
780
+ template <typename Scalar>
781
+ struct scalar_cosh_op {
782
+ EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::cosh(a); }
685
783
  template <typename Packet>
686
- EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pcosh(a); }
784
+ EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
785
+ return internal::pcosh(a);
786
+ }
687
787
  };
688
- template<typename Scalar>
689
- struct functor_traits<scalar_cosh_op<Scalar> >
690
- {
691
- enum {
692
- Cost = 5 * NumTraits<Scalar>::MulCost,
693
- PacketAccess = packet_traits<Scalar>::HasCosh
694
- };
788
+ template <typename Scalar>
789
+ struct functor_traits<scalar_cosh_op<Scalar>> {
790
+ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasCosh };
695
791
  };
696
792
 
697
- #if EIGEN_HAS_CXX11_MATH
698
793
  /** \internal
699
- * \brief Template functor to compute the acosh of a scalar
700
- * \sa class CwiseUnaryOp, ArrayBase::acosh()
701
- */
794
+ * \brief Template functor to compute the acosh of a scalar
795
+ * \sa class CwiseUnaryOp, ArrayBase::acosh()
796
+ */
702
797
  template <typename Scalar>
703
798
  struct scalar_acosh_op {
704
- EIGEN_EMPTY_STRUCT_CTOR(scalar_acosh_op)
705
799
  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::acosh(a); }
706
800
  };
707
801
 
708
802
  template <typename Scalar>
709
- struct functor_traits<scalar_acosh_op<Scalar> > {
803
+ struct functor_traits<scalar_acosh_op<Scalar>> {
710
804
  enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = false };
711
805
  };
712
- #endif
713
806
 
714
807
  /** \internal
715
- * \brief Template functor to compute the inverse of a scalar
716
- * \sa class CwiseUnaryOp, Cwise::inverse()
717
- */
718
- template<typename Scalar>
808
+ * \brief Template functor to compute the inverse of a scalar
809
+ * \sa class CwiseUnaryOp, Cwise::inverse()
810
+ */
811
+ template <typename Scalar>
719
812
  struct scalar_inverse_op {
720
- EIGEN_EMPTY_STRUCT_CTOR(scalar_inverse_op)
721
- EIGEN_DEVICE_FUNC inline Scalar operator() (const Scalar& a) const { return Scalar(1)/a; }
722
- template<typename Packet>
723
- EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const
724
- { return internal::pdiv(pset1<Packet>(Scalar(1)),a); }
813
+ EIGEN_DEVICE_FUNC inline Scalar operator()(const Scalar& a) const { return Scalar(1) / a; }
814
+ template <typename Packet>
815
+ EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const {
816
+ return internal::preciprocal(a);
817
+ }
725
818
  };
726
819
  template <typename Scalar>
727
- struct functor_traits<scalar_inverse_op<Scalar> > {
820
+ struct functor_traits<scalar_inverse_op<Scalar>> {
728
821
  enum {
729
822
  PacketAccess = packet_traits<Scalar>::HasDiv,
730
- Cost = scalar_div_cost<Scalar, PacketAccess>::value
823
+ // If packet_traits<Scalar>::HasReciprocal then the Estimated cost is that
824
+ // of computing an approximation plus a single Newton-Raphson step, which
825
+ // consists of 1 pmul + 1 pmadd.
826
+ Cost = (packet_traits<Scalar>::HasReciprocal ? 4 * NumTraits<Scalar>::MulCost
827
+ : scalar_div_cost<Scalar, PacketAccess>::value)
731
828
  };
732
829
  };
733
830
 
734
831
  /** \internal
735
- * \brief Template functor to compute the square of a scalar
736
- * \sa class CwiseUnaryOp, Cwise::square()
737
- */
738
- template<typename Scalar>
832
+ * \brief Template functor to compute the square of a scalar
833
+ * \sa class CwiseUnaryOp, Cwise::square()
834
+ */
835
+ template <typename Scalar>
739
836
  struct scalar_square_op {
740
- EIGEN_EMPTY_STRUCT_CTOR(scalar_square_op)
741
- EIGEN_DEVICE_FUNC inline Scalar operator() (const Scalar& a) const { return a*a; }
742
- template<typename Packet>
743
- EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const
744
- { return internal::pmul(a,a); }
837
+ EIGEN_DEVICE_FUNC inline Scalar operator()(const Scalar& a) const { return a * a; }
838
+ template <typename Packet>
839
+ EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const {
840
+ return internal::pmul(a, a);
841
+ }
842
+ };
843
+ template <typename Scalar>
844
+ struct functor_traits<scalar_square_op<Scalar>> {
845
+ enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul };
745
846
  };
746
- template<typename Scalar>
747
- struct functor_traits<scalar_square_op<Scalar> >
748
- { enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; };
749
847
 
750
848
  // Boolean specialization to avoid -Wint-in-bool-context warnings on GCC.
751
- template<>
849
+ template <>
752
850
  struct scalar_square_op<bool> {
753
- EIGEN_EMPTY_STRUCT_CTOR(scalar_square_op)
754
- EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline bool operator() (const bool& a) const { return a; }
755
- template<typename Packet>
756
- EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const
757
- { return a; }
851
+ EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline bool operator()(const bool& a) const { return a; }
852
+ template <typename Packet>
853
+ EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const {
854
+ return a;
855
+ }
856
+ };
857
+ template <>
858
+ struct functor_traits<scalar_square_op<bool>> {
859
+ enum { Cost = 0, PacketAccess = packet_traits<bool>::Vectorizable };
758
860
  };
759
- template<>
760
- struct functor_traits<scalar_square_op<bool> >
761
- { enum { Cost = 0, PacketAccess = packet_traits<bool>::Vectorizable }; };
762
861
 
763
862
  /** \internal
764
- * \brief Template functor to compute the cube of a scalar
765
- * \sa class CwiseUnaryOp, Cwise::cube()
766
- */
767
- template<typename Scalar>
863
+ * \brief Template functor to compute the cube of a scalar
864
+ * \sa class CwiseUnaryOp, Cwise::cube()
865
+ */
866
+ template <typename Scalar>
768
867
  struct scalar_cube_op {
769
- EIGEN_EMPTY_STRUCT_CTOR(scalar_cube_op)
770
- EIGEN_DEVICE_FUNC inline Scalar operator() (const Scalar& a) const { return a*a*a; }
771
- template<typename Packet>
772
- EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const
773
- { return internal::pmul(a,pmul(a,a)); }
868
+ EIGEN_DEVICE_FUNC inline Scalar operator()(const Scalar& a) const { return a * a * a; }
869
+ template <typename Packet>
870
+ EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const {
871
+ return internal::pmul(a, pmul(a, a));
872
+ }
873
+ };
874
+ template <typename Scalar>
875
+ struct functor_traits<scalar_cube_op<Scalar>> {
876
+ enum { Cost = 2 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul };
774
877
  };
775
- template<typename Scalar>
776
- struct functor_traits<scalar_cube_op<Scalar> >
777
- { enum { Cost = 2*NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; };
778
878
 
779
879
  // Boolean specialization to avoid -Wint-in-bool-context warnings on GCC.
780
- template<>
880
+ template <>
781
881
  struct scalar_cube_op<bool> {
782
- EIGEN_EMPTY_STRUCT_CTOR(scalar_cube_op)
783
- EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline bool operator() (const bool& a) const { return a; }
784
- template<typename Packet>
785
- EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const
786
- { return a; }
882
+ EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline bool operator()(const bool& a) const { return a; }
883
+ template <typename Packet>
884
+ EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const {
885
+ return a;
886
+ }
887
+ };
888
+ template <>
889
+ struct functor_traits<scalar_cube_op<bool>> {
890
+ enum { Cost = 0, PacketAccess = packet_traits<bool>::Vectorizable };
891
+ };
892
+
893
+ /** \internal
894
+ * \brief Template functor to compute the rounded value of a scalar
895
+ * \sa class CwiseUnaryOp, ArrayBase::round()
896
+ */
897
+ template <typename Scalar>
898
+ struct scalar_round_op {
899
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& a) const { return numext::round(a); }
900
+ template <typename Packet>
901
+ EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
902
+ return internal::pround(a);
903
+ }
904
+ };
905
+ template <typename Scalar>
906
+ struct functor_traits<scalar_round_op<Scalar>> {
907
+ enum {
908
+ Cost = NumTraits<Scalar>::MulCost,
909
+ PacketAccess = packet_traits<Scalar>::HasRound || NumTraits<Scalar>::IsInteger
910
+ };
787
911
  };
788
- template<>
789
- struct functor_traits<scalar_cube_op<bool> >
790
- { enum { Cost = 0, PacketAccess = packet_traits<bool>::Vectorizable }; };
791
912
 
792
913
  /** \internal
793
- * \brief Template functor to compute the rounded value of a scalar
794
- * \sa class CwiseUnaryOp, ArrayBase::round()
795
- */
796
- template<typename Scalar> struct scalar_round_op {
797
- EIGEN_EMPTY_STRUCT_CTOR(scalar_round_op)
798
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const { return numext::round(a); }
914
+ * \brief Template functor to compute the floor of a scalar
915
+ * \sa class CwiseUnaryOp, ArrayBase::floor()
916
+ */
917
+ template <typename Scalar>
918
+ struct scalar_floor_op {
919
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& a) const { return numext::floor(a); }
799
920
  template <typename Packet>
800
- EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pround(a); }
921
+ EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
922
+ return internal::pfloor(a);
923
+ }
801
924
  };
802
- template<typename Scalar>
803
- struct functor_traits<scalar_round_op<Scalar> >
804
- {
925
+ template <typename Scalar>
926
+ struct functor_traits<scalar_floor_op<Scalar>> {
805
927
  enum {
806
928
  Cost = NumTraits<Scalar>::MulCost,
807
- PacketAccess = packet_traits<Scalar>::HasRound
929
+ PacketAccess = packet_traits<Scalar>::HasRound || NumTraits<Scalar>::IsInteger
808
930
  };
809
931
  };
810
932
 
811
933
  /** \internal
812
- * \brief Template functor to compute the floor of a scalar
813
- * \sa class CwiseUnaryOp, ArrayBase::floor()
814
- */
815
- template<typename Scalar> struct scalar_floor_op {
816
- EIGEN_EMPTY_STRUCT_CTOR(scalar_floor_op)
817
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const { return numext::floor(a); }
934
+ * \brief Template functor to compute the rounded (with current rounding mode) value of a scalar
935
+ * \sa class CwiseUnaryOp, ArrayBase::rint()
936
+ */
937
+ template <typename Scalar>
938
+ struct scalar_rint_op {
939
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& a) const { return numext::rint(a); }
818
940
  template <typename Packet>
819
- EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pfloor(a); }
941
+ EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
942
+ return internal::print(a);
943
+ }
820
944
  };
821
- template<typename Scalar>
822
- struct functor_traits<scalar_floor_op<Scalar> >
823
- {
945
+ template <typename Scalar>
946
+ struct functor_traits<scalar_rint_op<Scalar>> {
824
947
  enum {
825
948
  Cost = NumTraits<Scalar>::MulCost,
826
- PacketAccess = packet_traits<Scalar>::HasFloor
949
+ PacketAccess = packet_traits<Scalar>::HasRound || NumTraits<Scalar>::IsInteger
827
950
  };
828
951
  };
829
952
 
830
953
  /** \internal
831
- * \brief Template functor to compute the rounded (with current rounding mode) value of a scalar
832
- * \sa class CwiseUnaryOp, ArrayBase::rint()
833
- */
834
- template<typename Scalar> struct scalar_rint_op {
835
- EIGEN_EMPTY_STRUCT_CTOR(scalar_rint_op)
836
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const { return numext::rint(a); }
954
+ * \brief Template functor to compute the ceil of a scalar
955
+ * \sa class CwiseUnaryOp, ArrayBase::ceil()
956
+ */
957
+ template <typename Scalar>
958
+ struct scalar_ceil_op {
959
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& a) const { return numext::ceil(a); }
837
960
  template <typename Packet>
838
- EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::print(a); }
961
+ EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
962
+ return internal::pceil(a);
963
+ }
839
964
  };
840
- template<typename Scalar>
841
- struct functor_traits<scalar_rint_op<Scalar> >
842
- {
965
+ template <typename Scalar>
966
+ struct functor_traits<scalar_ceil_op<Scalar>> {
843
967
  enum {
844
968
  Cost = NumTraits<Scalar>::MulCost,
845
- PacketAccess = packet_traits<Scalar>::HasRint
969
+ PacketAccess = packet_traits<Scalar>::HasRound || NumTraits<Scalar>::IsInteger
846
970
  };
847
971
  };
848
972
 
849
973
  /** \internal
850
- * \brief Template functor to compute the ceil of a scalar
851
- * \sa class CwiseUnaryOp, ArrayBase::ceil()
852
- */
853
- template<typename Scalar> struct scalar_ceil_op {
854
- EIGEN_EMPTY_STRUCT_CTOR(scalar_ceil_op)
855
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const { return numext::ceil(a); }
974
+ * \brief Template functor to compute the truncation of a scalar
975
+ * \sa class CwiseUnaryOp, ArrayBase::floor()
976
+ */
977
+ template <typename Scalar>
978
+ struct scalar_trunc_op {
979
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& a) const { return numext::trunc(a); }
856
980
  template <typename Packet>
857
- EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pceil(a); }
981
+ EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
982
+ return internal::ptrunc(a);
983
+ }
858
984
  };
859
- template<typename Scalar>
860
- struct functor_traits<scalar_ceil_op<Scalar> >
861
- {
985
+ template <typename Scalar>
986
+ struct functor_traits<scalar_trunc_op<Scalar>> {
862
987
  enum {
863
988
  Cost = NumTraits<Scalar>::MulCost,
864
- PacketAccess = packet_traits<Scalar>::HasCeil
989
+ PacketAccess = packet_traits<Scalar>::HasRound || NumTraits<Scalar>::IsInteger
865
990
  };
866
991
  };
867
992
 
868
993
  /** \internal
869
- * \brief Template functor to compute whether a scalar is NaN
870
- * \sa class CwiseUnaryOp, ArrayBase::isnan()
871
- */
872
- template<typename Scalar> struct scalar_isnan_op {
873
- EIGEN_EMPTY_STRUCT_CTOR(scalar_isnan_op)
874
- typedef bool result_type;
875
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const {
994
+ * \brief Template functor to compute whether a scalar is NaN
995
+ * \sa class CwiseUnaryOp, ArrayBase::isnan()
996
+ */
997
+ template <typename Scalar, bool UseTypedPredicate = false>
998
+ struct scalar_isnan_op {
999
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator()(const Scalar& a) const {
876
1000
  #if defined(SYCL_DEVICE_ONLY)
877
1001
  return numext::isnan(a);
878
1002
  #else
879
- return (numext::isnan)(a);
1003
+ return numext::isnan EIGEN_NOT_A_MACRO(a);
880
1004
  #endif
881
1005
  }
882
1006
  };
883
- template<typename Scalar>
884
- struct functor_traits<scalar_isnan_op<Scalar> >
885
- {
886
- enum {
887
- Cost = NumTraits<Scalar>::MulCost,
888
- PacketAccess = false
889
- };
1007
+
1008
+ template <typename Scalar>
1009
+ struct scalar_isnan_op<Scalar, true> {
1010
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar& a) const {
1011
+ #if defined(SYCL_DEVICE_ONLY)
1012
+ return (numext::isnan(a) ? ptrue(a) : pzero(a));
1013
+ #else
1014
+ return (numext::isnan EIGEN_NOT_A_MACRO(a) ? ptrue(a) : pzero(a));
1015
+ #endif
1016
+ }
1017
+ template <typename Packet>
1018
+ EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
1019
+ return pisnan(a);
1020
+ }
1021
+ };
1022
+
1023
+ template <typename Scalar, bool UseTypedPredicate>
1024
+ struct functor_traits<scalar_isnan_op<Scalar, UseTypedPredicate>> {
1025
+ enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasCmp && UseTypedPredicate };
890
1026
  };
891
1027
 
892
1028
  /** \internal
893
- * \brief Template functor to check whether a scalar is +/-inf
894
- * \sa class CwiseUnaryOp, ArrayBase::isinf()
895
- */
896
- template<typename Scalar> struct scalar_isinf_op {
897
- EIGEN_EMPTY_STRUCT_CTOR(scalar_isinf_op)
898
- typedef bool result_type;
899
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const {
1029
+ * \brief Template functor to check whether a scalar is +/-inf
1030
+ * \sa class CwiseUnaryOp, ArrayBase::isinf()
1031
+ */
1032
+ template <typename Scalar, bool UseTypedPredicate = false>
1033
+ struct scalar_isinf_op {
1034
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator()(const Scalar& a) const {
900
1035
  #if defined(SYCL_DEVICE_ONLY)
901
1036
  return numext::isinf(a);
902
1037
  #else
@@ -904,23 +1039,33 @@ template<typename Scalar> struct scalar_isinf_op {
904
1039
  #endif
905
1040
  }
906
1041
  };
907
- template<typename Scalar>
908
- struct functor_traits<scalar_isinf_op<Scalar> >
909
- {
910
- enum {
911
- Cost = NumTraits<Scalar>::MulCost,
912
- PacketAccess = false
913
- };
1042
+
1043
+ template <typename Scalar>
1044
+ struct scalar_isinf_op<Scalar, true> {
1045
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar& a) const {
1046
+ #if defined(SYCL_DEVICE_ONLY)
1047
+ return (numext::isinf(a) ? ptrue(a) : pzero(a));
1048
+ #else
1049
+ return (numext::isinf EIGEN_NOT_A_MACRO(a) ? ptrue(a) : pzero(a));
1050
+ #endif
1051
+ }
1052
+ template <typename Packet>
1053
+ EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
1054
+ return pisinf(a);
1055
+ }
1056
+ };
1057
+ template <typename Scalar, bool UseTypedPredicate>
1058
+ struct functor_traits<scalar_isinf_op<Scalar, UseTypedPredicate>> {
1059
+ enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasCmp && UseTypedPredicate };
914
1060
  };
915
1061
 
916
1062
  /** \internal
917
- * \brief Template functor to check whether a scalar has a finite value
918
- * \sa class CwiseUnaryOp, ArrayBase::isfinite()
919
- */
920
- template<typename Scalar> struct scalar_isfinite_op {
921
- EIGEN_EMPTY_STRUCT_CTOR(scalar_isfinite_op)
922
- typedef bool result_type;
923
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const {
1063
+ * \brief Template functor to check whether a scalar has a finite value
1064
+ * \sa class CwiseUnaryOp, ArrayBase::isfinite()
1065
+ */
1066
+ template <typename Scalar, bool UseTypedPredicate = false>
1067
+ struct scalar_isfinite_op {
1068
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator()(const Scalar& a) const {
924
1069
  #if defined(SYCL_DEVICE_ONLY)
925
1070
  return numext::isfinite(a);
926
1071
  #else
@@ -928,204 +1073,348 @@ template<typename Scalar> struct scalar_isfinite_op {
928
1073
  #endif
929
1074
  }
930
1075
  };
931
- template<typename Scalar>
932
- struct functor_traits<scalar_isfinite_op<Scalar> >
933
- {
934
- enum {
935
- Cost = NumTraits<Scalar>::MulCost,
936
- PacketAccess = false
937
- };
1076
+
1077
+ template <typename Scalar>
1078
+ struct scalar_isfinite_op<Scalar, true> {
1079
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar& a) const {
1080
+ #if defined(SYCL_DEVICE_ONLY)
1081
+ return (numext::isfinite(a) ? ptrue(a) : pzero(a));
1082
+ #else
1083
+ return (numext::isfinite EIGEN_NOT_A_MACRO(a) ? ptrue(a) : pzero(a));
1084
+ #endif
1085
+ }
1086
+ template <typename Packet>
1087
+ EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
1088
+ constexpr Scalar inf = NumTraits<Scalar>::infinity();
1089
+ return pcmp_lt(pabs(a), pset1<Packet>(inf));
1090
+ }
1091
+ };
1092
+ template <typename Scalar, bool UseTypedPredicate>
1093
+ struct functor_traits<scalar_isfinite_op<Scalar, UseTypedPredicate>> {
1094
+ enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasCmp && UseTypedPredicate };
938
1095
  };
939
1096
 
940
1097
  /** \internal
941
- * \brief Template functor to compute the logical not of a boolean
942
- *
943
- * \sa class CwiseUnaryOp, ArrayBase::operator!
944
- */
945
- template<typename Scalar> struct scalar_boolean_not_op {
946
- EIGEN_EMPTY_STRUCT_CTOR(scalar_boolean_not_op)
947
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator() (const bool& a) const { return !a; }
948
- };
949
- template<typename Scalar>
950
- struct functor_traits<scalar_boolean_not_op<Scalar> > {
951
- enum {
952
- Cost = NumTraits<bool>::AddCost,
953
- PacketAccess = false
954
- };
1098
+ * \brief Template functor to compute the logical not of a scalar as if it were a boolean
1099
+ *
1100
+ * \sa class CwiseUnaryOp, ArrayBase::operator!
1101
+ */
1102
+ template <typename Scalar>
1103
+ struct scalar_boolean_not_op {
1104
+ using result_type = Scalar;
1105
+ // `false` any value `a` that satisfies `a == Scalar(0)`
1106
+ // `true` is the complement of `false`
1107
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar& a) const {
1108
+ return a == Scalar(0) ? Scalar(1) : Scalar(0);
1109
+ }
1110
+ template <typename Packet>
1111
+ EIGEN_STRONG_INLINE Packet packetOp(const Packet& a) const {
1112
+ const Packet cst_one = pset1<Packet>(Scalar(1));
1113
+ Packet not_a = pcmp_eq(a, pzero(a));
1114
+ return pand(not_a, cst_one);
1115
+ }
1116
+ };
1117
+ template <typename Scalar>
1118
+ struct functor_traits<scalar_boolean_not_op<Scalar>> {
1119
+ enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = packet_traits<Scalar>::HasCmp };
1120
+ };
1121
+
1122
+ template <typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
1123
+ struct bitwise_unary_impl {
1124
+ static constexpr size_t Size = sizeof(Scalar);
1125
+ using uint_t = typename numext::get_integer_by_size<Size>::unsigned_type;
1126
+ static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_not(const Scalar& a) {
1127
+ uint_t a_as_uint = numext::bit_cast<uint_t, Scalar>(a);
1128
+ uint_t result = ~a_as_uint;
1129
+ return numext::bit_cast<Scalar, uint_t>(result);
1130
+ }
1131
+ };
1132
+
1133
+ template <typename Scalar>
1134
+ struct bitwise_unary_impl<Scalar, true> {
1135
+ using Real = typename NumTraits<Scalar>::Real;
1136
+ static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_not(const Scalar& a) {
1137
+ Real real_result = bitwise_unary_impl<Real>::run_not(numext::real(a));
1138
+ Real imag_result = bitwise_unary_impl<Real>::run_not(numext::imag(a));
1139
+ return Scalar(real_result, imag_result);
1140
+ }
955
1141
  };
956
1142
 
957
1143
  /** \internal
958
- * \brief Template functor to compute the signum of a scalar
959
- * \sa class CwiseUnaryOp, Cwise::sign()
960
- */
961
- template<typename Scalar,bool is_complex=(NumTraits<Scalar>::IsComplex!=0), bool is_integer=(NumTraits<Scalar>::IsInteger!=0) > struct scalar_sign_op;
962
- template<typename Scalar>
963
- struct scalar_sign_op<Scalar, false, true> {
964
- EIGEN_EMPTY_STRUCT_CTOR(scalar_sign_op)
965
- EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const
966
- {
967
- return Scalar( (a>Scalar(0)) - (a<Scalar(0)) );
968
- }
969
- //TODO
970
- //template <typename Packet>
971
- //EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::psign(a); }
972
- };
973
-
974
- template<typename Scalar>
975
- struct scalar_sign_op<Scalar, false, false> {
976
- EIGEN_EMPTY_STRUCT_CTOR(scalar_sign_op)
977
- EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const
978
- {
979
- return (numext::isnan)(a) ? a : Scalar( (a>Scalar(0)) - (a<Scalar(0)) );
980
- }
981
- //TODO
982
- //template <typename Packet>
983
- //EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::psign(a); }
984
- };
985
-
986
- template<typename Scalar, bool is_integer>
987
- struct scalar_sign_op<Scalar,true, is_integer> {
988
- EIGEN_EMPTY_STRUCT_CTOR(scalar_sign_op)
989
- EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const
990
- {
991
- typedef typename NumTraits<Scalar>::Real real_type;
992
- real_type aa = numext::abs(a);
993
- if (aa==real_type(0))
994
- return Scalar(0);
995
- aa = real_type(1)/aa;
996
- return Scalar(a.real()*aa, a.imag()*aa );
997
- }
998
- //TODO
999
- //template <typename Packet>
1000
- //EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::psign(a); }
1001
- };
1002
- template<typename Scalar>
1003
- struct functor_traits<scalar_sign_op<Scalar> >
1004
- { enum {
1005
- Cost =
1006
- NumTraits<Scalar>::IsComplex
1007
- ? ( 8*NumTraits<Scalar>::MulCost ) // roughly
1008
- : ( 3*NumTraits<Scalar>::AddCost),
1009
- PacketAccess = packet_traits<Scalar>::HasSign
1010
- };
1144
+ * \brief Template functor to compute the bitwise not of a scalar
1145
+ *
1146
+ * \sa class CwiseUnaryOp, ArrayBase::operator~
1147
+ */
1148
+ template <typename Scalar>
1149
+ struct scalar_bitwise_not_op {
1150
+ EIGEN_STATIC_ASSERT(!NumTraits<Scalar>::RequireInitialization,
1151
+ BITWISE OPERATIONS MAY ONLY BE PERFORMED ON PLAIN DATA TYPES)
1152
+ EIGEN_STATIC_ASSERT((!internal::is_same<Scalar, bool>::value), DONT USE BITWISE OPS ON BOOLEAN TYPES)
1153
+ using result_type = Scalar;
1154
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar& a) const {
1155
+ return bitwise_unary_impl<Scalar>::run_not(a);
1156
+ }
1157
+ template <typename Packet>
1158
+ EIGEN_STRONG_INLINE Packet packetOp(const Packet& a) const {
1159
+ return pandnot(ptrue(a), a);
1160
+ }
1161
+ };
1162
+ template <typename Scalar>
1163
+ struct functor_traits<scalar_bitwise_not_op<Scalar>> {
1164
+ enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = true };
1011
1165
  };
1012
1166
 
1013
1167
  /** \internal
1014
- * \brief Template functor to compute the logistic function of a scalar
1015
- * \sa class CwiseUnaryOp, ArrayBase::logistic()
1016
- */
1017
- template <typename T>
1018
- struct scalar_logistic_op {
1019
- EIGEN_EMPTY_STRUCT_CTOR(scalar_logistic_op)
1020
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T operator()(const T& x) const {
1021
- return packetOp(x);
1168
+ * \brief Template functor to compute the signum of a scalar
1169
+ * \sa class CwiseUnaryOp, Cwise::sign()
1170
+ */
1171
+ template <typename Scalar>
1172
+ struct scalar_sign_op {
1173
+ EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::sign(a); }
1174
+
1175
+ template <typename Packet>
1176
+ EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
1177
+ return internal::psign(a);
1022
1178
  }
1179
+ };
1180
+
1181
+ template <typename Scalar>
1182
+ struct functor_traits<scalar_sign_op<Scalar>> {
1183
+ enum {
1184
+ Cost = NumTraits<Scalar>::IsComplex ? (8 * NumTraits<Scalar>::MulCost) // roughly
1185
+ : (3 * NumTraits<Scalar>::AddCost),
1186
+ PacketAccess = packet_traits<Scalar>::HasSign && packet_traits<Scalar>::Vectorizable
1187
+ };
1188
+ };
1189
+
1190
+ // Real-valued implementation.
1191
+ template <typename T, typename EnableIf = void>
1192
+ struct scalar_logistic_op_impl {
1193
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T operator()(const T& x) const { return packetOp(x); }
1023
1194
 
1024
- template <typename Packet> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
1025
- Packet packetOp(const Packet& x) const {
1195
+ template <typename Packet>
1196
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x) const {
1026
1197
  const Packet one = pset1<Packet>(T(1));
1027
- return pdiv(one, padd(one, pexp(pnegate(x))));
1198
+ const Packet inf = pset1<Packet>(NumTraits<T>::infinity());
1199
+ const Packet e = pexp(x);
1200
+ const Packet inf_mask = pcmp_eq(e, inf);
1201
+ return pselect(inf_mask, one, pdiv(e, padd(one, e)));
1202
+ }
1203
+ };
1204
+
1205
+ // Complex-valud implementation.
1206
+ template <typename T>
1207
+ struct scalar_logistic_op_impl<T, std::enable_if_t<NumTraits<T>::IsComplex>> {
1208
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T operator()(const T& x) const {
1209
+ const T e = numext::exp(x);
1210
+ return (numext::isinf)(numext::real(e)) ? T(1) : e / (e + T(1));
1028
1211
  }
1029
1212
  };
1030
1213
 
1031
- #ifndef EIGEN_GPU_COMPILE_PHASE
1032
1214
  /** \internal
1033
- * \brief Template specialization of the logistic function for float.
1034
- *
1035
- * Uses just a 9/10-degree rational interpolant which
1036
- * interpolates 1/(1+exp(-x)) - 0.5 up to a couple of ulps in the range
1037
- * [-9, 18]. Below -9 we use the more accurate approximation
1038
- * 1/(1+exp(-x)) ~= exp(x), and above 18 the logistic function is 1 withing
1039
- * one ulp. The shifted logistic is interpolated because it was easier to
1040
- * make the fit converge.
1041
- *
1042
- */
1215
+ * \brief Template functor to compute the logistic function of a scalar
1216
+ * \sa class CwiseUnaryOp, ArrayBase::logistic()
1217
+ */
1218
+ template <typename T>
1219
+ struct scalar_logistic_op : scalar_logistic_op_impl<T> {};
1220
+
1221
+ // TODO(rmlarsen): Enable the following on host when integer_packet is defined
1222
+ // for the relevant packet types.
1223
+ #ifndef EIGEN_GPUCC
1224
+
1225
+ /** \internal
1226
+ * \brief Template specialization of the logistic function for float.
1227
+ * Computes S(x) = exp(x) / (1 + exp(x)), where exp(x) is implemented
1228
+ * using an algorithm partly adopted from the implementation of
1229
+ * pexp_float. See the individual steps described in the code below.
1230
+ * Note that compared to pexp, we use an additional outer multiplicative
1231
+ * range reduction step using the identity exp(x) = exp(x/2)^2.
1232
+ * This prevert us from having to call ldexp on values that could produce
1233
+ * a denormal result, which allows us to call the faster implementation in
1234
+ * pldexp_fast_impl<Packet>::run(p, m).
1235
+ * The final squaring, however, doubles the error bound on the final
1236
+ * approximation. Exhaustive testing shows that we have a worst case error
1237
+ * of 4.5 ulps (compared to computing S(x) in double precision), which is
1238
+ * acceptable.
1239
+ */
1043
1240
  template <>
1044
1241
  struct scalar_logistic_op<float> {
1045
- EIGEN_EMPTY_STRUCT_CTOR(scalar_logistic_op)
1046
1242
  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float operator()(const float& x) const {
1047
- return packetOp(x);
1243
+ // Truncate at the first point where the interpolant is exactly one.
1244
+ const float cst_exp_hi = 16.6355324f;
1245
+ const float e = numext::exp(numext::mini(x, cst_exp_hi));
1246
+ return e / (1.0f + e);
1048
1247
  }
1049
1248
 
1050
- template <typename Packet> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
1051
- Packet packetOp(const Packet& _x) const {
1052
- const Packet cutoff_lower = pset1<Packet>(-9.f);
1053
- const Packet lt_mask = pcmp_lt<Packet>(_x, cutoff_lower);
1054
- const bool any_small = predux_any(lt_mask);
1055
-
1056
- // The upper cut-off is the smallest x for which the rational approximation evaluates to 1.
1057
- // Choosing this value saves us a few instructions clamping the results at the end.
1058
- #ifdef EIGEN_VECTORIZE_FMA
1059
- const Packet cutoff_upper = pset1<Packet>(15.7243833541870117f);
1060
- #else
1061
- const Packet cutoff_upper = pset1<Packet>(15.6437711715698242f);
1062
- #endif
1063
- const Packet x = pmin(_x, cutoff_upper);
1064
-
1065
- // The monomial coefficients of the numerator polynomial (odd).
1066
- const Packet alpha_1 = pset1<Packet>(2.48287947061529e-01f);
1067
- const Packet alpha_3 = pset1<Packet>(8.51377133304701e-03f);
1068
- const Packet alpha_5 = pset1<Packet>(6.08574864600143e-05f);
1069
- const Packet alpha_7 = pset1<Packet>(1.15627324459942e-07f);
1070
- const Packet alpha_9 = pset1<Packet>(4.37031012579801e-11f);
1071
-
1072
- // The monomial coefficients of the denominator polynomial (even).
1073
- const Packet beta_0 = pset1<Packet>(9.93151921023180e-01f);
1074
- const Packet beta_2 = pset1<Packet>(1.16817656904453e-01f);
1075
- const Packet beta_4 = pset1<Packet>(1.70198817374094e-03f);
1076
- const Packet beta_6 = pset1<Packet>(6.29106785017040e-06f);
1077
- const Packet beta_8 = pset1<Packet>(5.76102136993427e-09f);
1078
- const Packet beta_10 = pset1<Packet>(6.10247389755681e-13f);
1079
-
1080
- // Since the polynomials are odd/even, we need x^2.
1081
- const Packet x2 = pmul(x, x);
1082
-
1083
- // Evaluate the numerator polynomial p.
1084
- Packet p = pmadd(x2, alpha_9, alpha_7);
1085
- p = pmadd(x2, p, alpha_5);
1086
- p = pmadd(x2, p, alpha_3);
1087
- p = pmadd(x2, p, alpha_1);
1088
- p = pmul(x, p);
1089
-
1090
- // Evaluate the denominator polynomial q.
1091
- Packet q = pmadd(x2, beta_10, beta_8);
1092
- q = pmadd(x2, q, beta_6);
1093
- q = pmadd(x2, q, beta_4);
1094
- q = pmadd(x2, q, beta_2);
1095
- q = pmadd(x2, q, beta_0);
1096
- // Divide the numerator by the denominator and shift it up.
1097
- const Packet logistic = padd(pdiv(p, q), pset1<Packet>(0.5f));
1098
- if (EIGEN_PREDICT_FALSE(any_small)) {
1099
- const Packet exponential = pexp(_x);
1100
- return pselect(lt_mask, exponential, logistic);
1101
- } else {
1102
- return logistic;
1103
- }
1249
+ template <typename Packet>
1250
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& _x) const {
1251
+ const Packet cst_zero = pset1<Packet>(0.0f);
1252
+ const Packet cst_one = pset1<Packet>(1.0f);
1253
+ const Packet cst_half = pset1<Packet>(0.5f);
1254
+ // Truncate at the first point where the interpolant is exactly one.
1255
+ const Packet cst_exp_hi = pset1<Packet>(16.6355324f);
1256
+ const Packet cst_exp_lo = pset1<Packet>(-104.f);
1257
+
1258
+ // Clamp x to the non-trivial range where S(x). Outside this
1259
+ // interval the correctly rounded value of S(x) is either zero
1260
+ // or one.
1261
+ Packet zero_mask = pcmp_lt(_x, cst_exp_lo);
1262
+ Packet x = pmin(_x, cst_exp_hi);
1263
+
1264
+ // 1. Multiplicative range reduction:
1265
+ // Reduce the range of x by a factor of 2. This avoids having
1266
+ // to compute exp(x) accurately where the result is a denormalized
1267
+ // value.
1268
+ x = pmul(x, cst_half);
1269
+
1270
+ // 2. Subtractive range reduction:
1271
+ // Express exp(x) as exp(m*ln(2) + r) = 2^m*exp(r), start by extracting
1272
+ // m = floor(x/ln(2) + 0.5), such that x = m*ln(2) + r.
1273
+ const Packet cst_cephes_LOG2EF = pset1<Packet>(1.44269504088896341f);
1274
+ Packet m = pfloor(pmadd(x, cst_cephes_LOG2EF, cst_half));
1275
+ // Get r = x - m*ln(2). We use a trick from Cephes where the term
1276
+ // m*ln(2) is subtracted out in two parts, m*C1+m*C2 = m*ln(2),
1277
+ // to avoid accumulating truncation errors.
1278
+ const Packet cst_cephes_exp_C1 = pset1<Packet>(-0.693359375f);
1279
+ const Packet cst_cephes_exp_C2 = pset1<Packet>(2.12194440e-4f);
1280
+ Packet r = pmadd(m, cst_cephes_exp_C1, x);
1281
+ r = pmadd(m, cst_cephes_exp_C2, r);
1282
+
1283
+ // 3. Compute an approximation to exp(r) using a degree 5 minimax polynomial.
1284
+ // We compute even and odd terms separately to increase instruction level
1285
+ // parallelism.
1286
+ Packet r2 = pmul(r, r);
1287
+ const Packet cst_p2 = pset1<Packet>(0.49999141693115234375f);
1288
+ const Packet cst_p3 = pset1<Packet>(0.16666877269744873046875f);
1289
+ const Packet cst_p4 = pset1<Packet>(4.1898667812347412109375e-2f);
1290
+ const Packet cst_p5 = pset1<Packet>(8.33471305668354034423828125e-3f);
1291
+
1292
+ const Packet p_even = pmadd(r2, cst_p4, cst_p2);
1293
+ const Packet p_odd = pmadd(r2, cst_p5, cst_p3);
1294
+ const Packet p_low = padd(r, cst_one);
1295
+ Packet p = pmadd(r, p_odd, p_even);
1296
+ p = pmadd(r2, p, p_low);
1297
+
1298
+ // 4. Undo subtractive range reduction exp(m*ln(2) + r) = 2^m * exp(r).
1299
+ Packet e = pldexp_fast(p, m);
1300
+
1301
+ // 5. Undo multiplicative range reduction by using exp(r) = exp(r/2)^2.
1302
+ e = pmul(e, e);
1303
+
1304
+ // Return exp(x) / (1 + exp(x))
1305
+ return pselect(zero_mask, cst_zero, pdiv(e, padd(cst_one, e)));
1104
1306
  }
1105
1307
  };
1106
1308
  #endif // #ifndef EIGEN_GPU_COMPILE_PHASE
1107
1309
 
1108
1310
  template <typename T>
1109
- struct functor_traits<scalar_logistic_op<T> > {
1311
+ struct functor_traits<scalar_logistic_op<T>> {
1110
1312
  enum {
1111
1313
  // The cost estimate for float here here is for the common(?) case where
1112
1314
  // all arguments are greater than -9.
1113
1315
  Cost = scalar_div_cost<T, packet_traits<T>::HasDiv>::value +
1114
- (internal::is_same<T, float>::value
1115
- ? NumTraits<T>::AddCost * 15 + NumTraits<T>::MulCost * 11
1116
- : NumTraits<T>::AddCost * 2 +
1117
- functor_traits<scalar_exp_op<T> >::Cost),
1118
- PacketAccess =
1119
- packet_traits<T>::HasAdd && packet_traits<T>::HasDiv &&
1120
- (internal::is_same<T, float>::value
1121
- ? packet_traits<T>::HasMul && packet_traits<T>::HasMax &&
1122
- packet_traits<T>::HasMin
1123
- : packet_traits<T>::HasNegate && packet_traits<T>::HasExp)
1316
+ (internal::is_same<T, float>::value ? NumTraits<T>::AddCost * 15 + NumTraits<T>::MulCost * 11
1317
+ : NumTraits<T>::AddCost * 2 + functor_traits<scalar_exp_op<T>>::Cost),
1318
+ PacketAccess = !NumTraits<T>::IsComplex && packet_traits<T>::HasAdd && packet_traits<T>::HasDiv &&
1319
+ (internal::is_same<T, float>::value
1320
+ ? packet_traits<T>::HasMul && packet_traits<T>::HasMax && packet_traits<T>::HasMin
1321
+ : packet_traits<T>::HasNegate && packet_traits<T>::HasExp)
1322
+ };
1323
+ };
1324
+
1325
+ template <typename Scalar, typename ExponentScalar, bool IsBaseInteger = NumTraits<Scalar>::IsInteger,
1326
+ bool IsExponentInteger = NumTraits<ExponentScalar>::IsInteger,
1327
+ bool IsBaseComplex = NumTraits<Scalar>::IsComplex,
1328
+ bool IsExponentComplex = NumTraits<ExponentScalar>::IsComplex>
1329
+ struct scalar_unary_pow_op {
1330
+ typedef typename internal::promote_scalar_arg<
1331
+ Scalar, ExponentScalar,
1332
+ internal::has_ReturnType<ScalarBinaryOpTraits<Scalar, ExponentScalar, scalar_unary_pow_op>>::value>::type
1333
+ PromotedExponent;
1334
+ typedef typename ScalarBinaryOpTraits<Scalar, PromotedExponent, scalar_unary_pow_op>::ReturnType result_type;
1335
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE scalar_unary_pow_op(const ExponentScalar& exponent) : m_exponent(exponent) {}
1336
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator()(const Scalar& a) const {
1337
+ EIGEN_USING_STD(pow);
1338
+ return static_cast<result_type>(pow(a, m_exponent));
1339
+ }
1340
+
1341
+ private:
1342
+ const ExponentScalar m_exponent;
1343
+ scalar_unary_pow_op() {}
1344
+ };
1345
+
1346
+ template <typename T>
1347
+ constexpr int exponent_digits() {
1348
+ return CHAR_BIT * sizeof(T) - NumTraits<T>::digits() - NumTraits<T>::IsSigned;
1349
+ }
1350
+
1351
+ template <typename From, typename To>
1352
+ struct is_floating_exactly_representable {
1353
+ // TODO(rmlarsen): Add radix to NumTraits and enable this check.
1354
+ // (NumTraits<To>::radix == NumTraits<From>::radix) &&
1355
+ static constexpr bool value =
1356
+ (exponent_digits<To>() >= exponent_digits<From>() && NumTraits<To>::digits() >= NumTraits<From>::digits());
1357
+ };
1358
+
1359
+ // Specialization for real, non-integer types, non-complex types.
1360
+ template <typename Scalar, typename ExponentScalar>
1361
+ struct scalar_unary_pow_op<Scalar, ExponentScalar, false, false, false, false> {
1362
+ template <bool IsExactlyRepresentable = is_floating_exactly_representable<ExponentScalar, Scalar>::value>
1363
+ std::enable_if_t<IsExactlyRepresentable, void> check_is_representable() const {}
1364
+
1365
+ // Issue a deprecation warning if we do a narrowing conversion on the exponent.
1366
+ template <bool IsExactlyRepresentable = is_floating_exactly_representable<ExponentScalar, Scalar>::value>
1367
+ EIGEN_DEPRECATED std::enable_if_t<!IsExactlyRepresentable, void> check_is_representable() const {}
1368
+
1369
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE scalar_unary_pow_op(const ExponentScalar& exponent)
1370
+ : m_exponent(static_cast<Scalar>(exponent)) {
1371
+ check_is_representable();
1372
+ }
1373
+
1374
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar& a) const {
1375
+ EIGEN_USING_STD(pow);
1376
+ return static_cast<Scalar>(pow(a, m_exponent));
1377
+ }
1378
+ template <typename Packet>
1379
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a) const {
1380
+ return unary_pow_impl<Packet, Scalar>::run(a, m_exponent);
1381
+ }
1382
+
1383
+ private:
1384
+ const Scalar m_exponent;
1385
+ scalar_unary_pow_op() {}
1386
+ };
1387
+
1388
+ template <typename Scalar, typename ExponentScalar, bool BaseIsInteger>
1389
+ struct scalar_unary_pow_op<Scalar, ExponentScalar, BaseIsInteger, true, false, false> {
1390
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE scalar_unary_pow_op(const ExponentScalar& exponent) : m_exponent(exponent) {}
1391
+ // TODO: error handling logic for complex^real_integer
1392
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar& a) const {
1393
+ return unary_pow_impl<Scalar, ExponentScalar>::run(a, m_exponent);
1394
+ }
1395
+ template <typename Packet>
1396
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a) const {
1397
+ return unary_pow_impl<Packet, ExponentScalar>::run(a, m_exponent);
1398
+ }
1399
+
1400
+ private:
1401
+ const ExponentScalar m_exponent;
1402
+ scalar_unary_pow_op() {}
1403
+ };
1404
+
1405
+ template <typename Scalar, typename ExponentScalar>
1406
+ struct functor_traits<scalar_unary_pow_op<Scalar, ExponentScalar>> {
1407
+ enum {
1408
+ GenPacketAccess = functor_traits<scalar_pow_op<Scalar, ExponentScalar>>::PacketAccess,
1409
+ IntPacketAccess = !NumTraits<Scalar>::IsComplex && packet_traits<Scalar>::HasMul &&
1410
+ (packet_traits<Scalar>::HasDiv || NumTraits<Scalar>::IsInteger) && packet_traits<Scalar>::HasCmp,
1411
+ PacketAccess = NumTraits<ExponentScalar>::IsInteger ? IntPacketAccess : (IntPacketAccess && GenPacketAccess),
1412
+ Cost = functor_traits<scalar_pow_op<Scalar, ExponentScalar>>::Cost
1124
1413
  };
1125
1414
  };
1126
1415
 
1127
- } // end namespace internal
1416
+ } // end namespace internal
1128
1417
 
1129
- } // end namespace Eigen
1418
+ } // end namespace Eigen
1130
1419
 
1131
- #endif // EIGEN_FUNCTORS_H
1420
+ #endif // EIGEN_FUNCTORS_H