@smake/eigen 1.0.2 → 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 (435) hide show
  1. package/README.md +1 -1
  2. package/eigen/Eigen/AccelerateSupport +52 -0
  3. package/eigen/Eigen/Cholesky +18 -21
  4. package/eigen/Eigen/CholmodSupport +28 -28
  5. package/eigen/Eigen/Core +235 -326
  6. package/eigen/Eigen/Eigenvalues +16 -14
  7. package/eigen/Eigen/Geometry +21 -24
  8. package/eigen/Eigen/Householder +9 -8
  9. package/eigen/Eigen/IterativeLinearSolvers +8 -4
  10. package/eigen/Eigen/Jacobi +14 -14
  11. package/eigen/Eigen/KLUSupport +43 -0
  12. package/eigen/Eigen/LU +16 -20
  13. package/eigen/Eigen/MetisSupport +12 -12
  14. package/eigen/Eigen/OrderingMethods +54 -54
  15. package/eigen/Eigen/PaStiXSupport +23 -20
  16. package/eigen/Eigen/PardisoSupport +17 -14
  17. package/eigen/Eigen/QR +18 -21
  18. package/eigen/Eigen/QtAlignedMalloc +5 -13
  19. package/eigen/Eigen/SPQRSupport +21 -14
  20. package/eigen/Eigen/SVD +23 -18
  21. package/eigen/Eigen/Sparse +1 -4
  22. package/eigen/Eigen/SparseCholesky +18 -23
  23. package/eigen/Eigen/SparseCore +18 -17
  24. package/eigen/Eigen/SparseLU +12 -8
  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 +377 -401
  37. package/eigen/Eigen/src/Cholesky/LLT.h +332 -360
  38. package/eigen/Eigen/src/Cholesky/LLT_LAPACKE.h +81 -56
  39. package/eigen/Eigen/src/CholmodSupport/CholmodSupport.h +620 -521
  40. package/eigen/Eigen/src/CholmodSupport/InternalHeaderCheck.h +3 -0
  41. package/eigen/Eigen/src/Core/ArithmeticSequence.h +239 -0
  42. package/eigen/Eigen/src/Core/Array.h +341 -294
  43. package/eigen/Eigen/src/Core/ArrayBase.h +190 -203
  44. package/eigen/Eigen/src/Core/ArrayWrapper.h +127 -171
  45. package/eigen/Eigen/src/Core/Assign.h +30 -40
  46. package/eigen/Eigen/src/Core/AssignEvaluator.h +711 -589
  47. package/eigen/Eigen/src/Core/Assign_MKL.h +130 -125
  48. package/eigen/Eigen/src/Core/BandMatrix.h +268 -283
  49. package/eigen/Eigen/src/Core/Block.h +375 -398
  50. package/eigen/Eigen/src/Core/CommaInitializer.h +86 -97
  51. package/eigen/Eigen/src/Core/ConditionEstimator.h +51 -53
  52. package/eigen/Eigen/src/Core/CoreEvaluators.h +1356 -1026
  53. package/eigen/Eigen/src/Core/CoreIterators.h +73 -59
  54. package/eigen/Eigen/src/Core/CwiseBinaryOp.h +114 -132
  55. package/eigen/Eigen/src/Core/CwiseNullaryOp.h +726 -617
  56. package/eigen/Eigen/src/Core/CwiseTernaryOp.h +77 -103
  57. package/eigen/Eigen/src/Core/CwiseUnaryOp.h +56 -68
  58. package/eigen/Eigen/src/Core/CwiseUnaryView.h +132 -95
  59. package/eigen/Eigen/src/Core/DenseBase.h +632 -571
  60. package/eigen/Eigen/src/Core/DenseCoeffsBase.h +511 -624
  61. package/eigen/Eigen/src/Core/DenseStorage.h +512 -509
  62. package/eigen/Eigen/src/Core/DeviceWrapper.h +153 -0
  63. package/eigen/Eigen/src/Core/Diagonal.h +169 -210
  64. package/eigen/Eigen/src/Core/DiagonalMatrix.h +351 -274
  65. package/eigen/Eigen/src/Core/DiagonalProduct.h +12 -10
  66. package/eigen/Eigen/src/Core/Dot.h +172 -222
  67. package/eigen/Eigen/src/Core/EigenBase.h +75 -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 -109
  71. package/eigen/Eigen/src/Core/Fuzzy.h +82 -105
  72. package/eigen/Eigen/src/Core/GeneralProduct.h +327 -263
  73. package/eigen/Eigen/src/Core/GenericPacketMath.h +1472 -360
  74. package/eigen/Eigen/src/Core/GlobalFunctions.h +194 -151
  75. package/eigen/Eigen/src/Core/IO.h +147 -139
  76. package/eigen/Eigen/src/Core/IndexedView.h +321 -0
  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 +56 -66
  80. package/eigen/Eigen/src/Core/Map.h +124 -142
  81. package/eigen/Eigen/src/Core/MapBase.h +256 -281
  82. package/eigen/Eigen/src/Core/MathFunctions.h +1620 -938
  83. package/eigen/Eigen/src/Core/MathFunctionsImpl.h +233 -71
  84. package/eigen/Eigen/src/Core/Matrix.h +491 -416
  85. package/eigen/Eigen/src/Core/MatrixBase.h +468 -453
  86. package/eigen/Eigen/src/Core/NestByValue.h +66 -85
  87. package/eigen/Eigen/src/Core/NoAlias.h +79 -85
  88. package/eigen/Eigen/src/Core/NumTraits.h +235 -148
  89. package/eigen/Eigen/src/Core/PartialReduxEvaluator.h +253 -0
  90. package/eigen/Eigen/src/Core/PermutationMatrix.h +461 -511
  91. package/eigen/Eigen/src/Core/PlainObjectBase.h +871 -894
  92. package/eigen/Eigen/src/Core/Product.h +260 -139
  93. package/eigen/Eigen/src/Core/ProductEvaluators.h +863 -714
  94. package/eigen/Eigen/src/Core/Random.h +161 -136
  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 +366 -336
  98. package/eigen/Eigen/src/Core/Ref.h +308 -209
  99. package/eigen/Eigen/src/Core/Replicate.h +94 -106
  100. package/eigen/Eigen/src/Core/Reshaped.h +398 -0
  101. package/eigen/Eigen/src/Core/ReturnByValue.h +49 -55
  102. package/eigen/Eigen/src/Core/Reverse.h +136 -145
  103. package/eigen/Eigen/src/Core/Select.h +70 -140
  104. package/eigen/Eigen/src/Core/SelfAdjointView.h +262 -285
  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 +97 -111
  108. package/eigen/Eigen/src/Core/SolveTriangular.h +131 -129
  109. package/eigen/Eigen/src/Core/SolverBase.h +138 -101
  110. package/eigen/Eigen/src/Core/StableNorm.h +156 -160
  111. package/eigen/Eigen/src/Core/StlIterators.h +619 -0
  112. package/eigen/Eigen/src/Core/Stride.h +91 -88
  113. package/eigen/Eigen/src/Core/Swap.h +70 -38
  114. package/eigen/Eigen/src/Core/Transpose.h +295 -273
  115. package/eigen/Eigen/src/Core/Transpositions.h +272 -317
  116. package/eigen/Eigen/src/Core/TriangularMatrix.h +670 -755
  117. package/eigen/Eigen/src/Core/VectorBlock.h +59 -72
  118. package/eigen/Eigen/src/Core/VectorwiseOp.h +668 -630
  119. package/eigen/Eigen/src/Core/Visitor.h +480 -216
  120. package/eigen/Eigen/src/Core/arch/AVX/Complex.h +407 -293
  121. package/eigen/Eigen/src/Core/arch/AVX/MathFunctions.h +79 -388
  122. package/eigen/Eigen/src/Core/arch/AVX/PacketMath.h +2935 -491
  123. package/eigen/Eigen/src/Core/arch/AVX/Reductions.h +353 -0
  124. package/eigen/Eigen/src/Core/arch/AVX/TypeCasting.h +279 -22
  125. package/eigen/Eigen/src/Core/arch/AVX512/Complex.h +472 -0
  126. package/eigen/Eigen/src/Core/arch/AVX512/GemmKernel.h +1245 -0
  127. package/eigen/Eigen/src/Core/arch/AVX512/MathFunctions.h +85 -333
  128. package/eigen/Eigen/src/Core/arch/AVX512/MathFunctionsFP16.h +75 -0
  129. package/eigen/Eigen/src/Core/arch/AVX512/PacketMath.h +2490 -649
  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 +277 -0
  135. package/eigen/Eigen/src/Core/arch/AVX512/TypeCastingFP16.h +130 -0
  136. package/eigen/Eigen/src/Core/arch/AltiVec/Complex.h +521 -298
  137. package/eigen/Eigen/src/Core/arch/AltiVec/MathFunctions.h +39 -280
  138. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProduct.h +3686 -0
  139. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h +205 -0
  140. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductMMA.h +901 -0
  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 +3391 -723
  144. package/eigen/Eigen/src/Core/arch/AltiVec/TypeCasting.h +153 -0
  145. package/eigen/Eigen/src/Core/arch/Default/BFloat16.h +866 -0
  146. package/eigen/Eigen/src/Core/arch/Default/ConjHelper.h +113 -14
  147. package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h +2634 -0
  148. package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h +227 -0
  149. package/eigen/Eigen/src/Core/arch/Default/Half.h +1091 -0
  150. package/eigen/Eigen/src/Core/arch/Default/Settings.h +11 -13
  151. package/eigen/Eigen/src/Core/arch/GPU/Complex.h +244 -0
  152. package/eigen/Eigen/src/Core/arch/GPU/MathFunctions.h +104 -0
  153. package/eigen/Eigen/src/Core/arch/GPU/PacketMath.h +1712 -0
  154. package/eigen/Eigen/src/Core/arch/GPU/Tuple.h +268 -0
  155. package/eigen/Eigen/src/Core/arch/GPU/TypeCasting.h +77 -0
  156. package/eigen/Eigen/src/Core/arch/HIP/hcc/math_constants.h +23 -0
  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 +620 -0
  164. package/eigen/Eigen/src/Core/arch/MSA/MathFunctions.h +379 -0
  165. package/eigen/Eigen/src/Core/arch/MSA/PacketMath.h +1237 -0
  166. package/eigen/Eigen/src/Core/arch/NEON/Complex.h +531 -289
  167. package/eigen/Eigen/src/Core/arch/NEON/GeneralBlockPanelKernel.h +243 -0
  168. package/eigen/Eigen/src/Core/arch/NEON/MathFunctions.h +50 -73
  169. package/eigen/Eigen/src/Core/arch/NEON/PacketMath.h +5915 -579
  170. package/eigen/Eigen/src/Core/arch/NEON/TypeCasting.h +1642 -0
  171. package/eigen/Eigen/src/Core/arch/NEON/UnaryFunctors.h +57 -0
  172. package/eigen/Eigen/src/Core/arch/SSE/Complex.h +366 -334
  173. package/eigen/Eigen/src/Core/arch/SSE/MathFunctions.h +40 -514
  174. package/eigen/Eigen/src/Core/arch/SSE/PacketMath.h +2164 -675
  175. package/eigen/Eigen/src/Core/arch/SSE/Reductions.h +324 -0
  176. package/eigen/Eigen/src/Core/arch/SSE/TypeCasting.h +188 -35
  177. package/eigen/Eigen/src/Core/arch/SVE/MathFunctions.h +48 -0
  178. package/eigen/Eigen/src/Core/arch/SVE/PacketMath.h +674 -0
  179. package/eigen/Eigen/src/Core/arch/SVE/TypeCasting.h +52 -0
  180. package/eigen/Eigen/src/Core/arch/SYCL/InteropHeaders.h +227 -0
  181. package/eigen/Eigen/src/Core/arch/SYCL/MathFunctions.h +303 -0
  182. package/eigen/Eigen/src/Core/arch/SYCL/PacketMath.h +576 -0
  183. package/eigen/Eigen/src/Core/arch/SYCL/TypeCasting.h +83 -0
  184. package/eigen/Eigen/src/Core/arch/ZVector/Complex.h +434 -261
  185. package/eigen/Eigen/src/Core/arch/ZVector/MathFunctions.h +160 -53
  186. package/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h +1073 -605
  187. package/eigen/Eigen/src/Core/functors/AssignmentFunctors.h +123 -117
  188. package/eigen/Eigen/src/Core/functors/BinaryFunctors.h +594 -322
  189. package/eigen/Eigen/src/Core/functors/NullaryFunctors.h +204 -118
  190. package/eigen/Eigen/src/Core/functors/StlFunctors.h +110 -97
  191. package/eigen/Eigen/src/Core/functors/TernaryFunctors.h +34 -7
  192. package/eigen/Eigen/src/Core/functors/UnaryFunctors.h +1158 -530
  193. package/eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h +2329 -1333
  194. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix.h +328 -364
  195. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +191 -178
  196. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h +85 -82
  197. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix_BLAS.h +154 -73
  198. package/eigen/Eigen/src/Core/products/GeneralMatrixVector.h +396 -542
  199. package/eigen/Eigen/src/Core/products/GeneralMatrixVector_BLAS.h +80 -77
  200. package/eigen/Eigen/src/Core/products/Parallelizer.h +208 -92
  201. package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +331 -375
  202. package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix_BLAS.h +206 -224
  203. package/eigen/Eigen/src/Core/products/SelfadjointMatrixVector.h +139 -146
  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 -46
  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 -275
  212. package/eigen/Eigen/src/Core/products/TriangularSolverMatrix_BLAS.h +108 -109
  213. package/eigen/Eigen/src/Core/products/TriangularSolverVector.h +70 -93
  214. package/eigen/Eigen/src/Core/util/Assert.h +158 -0
  215. package/eigen/Eigen/src/Core/util/BlasUtil.h +413 -290
  216. package/eigen/Eigen/src/Core/util/ConfigureVectorization.h +543 -0
  217. package/eigen/Eigen/src/Core/util/Constants.h +314 -263
  218. package/eigen/Eigen/src/Core/util/DisableStupidWarnings.h +130 -78
  219. package/eigen/Eigen/src/Core/util/EmulateArray.h +270 -0
  220. package/eigen/Eigen/src/Core/util/ForwardDeclarations.h +450 -224
  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 +487 -0
  224. package/eigen/Eigen/src/Core/util/IntegralConstant.h +279 -0
  225. package/eigen/Eigen/src/Core/util/MKL_support.h +39 -30
  226. package/eigen/Eigen/src/Core/util/Macros.h +939 -646
  227. package/eigen/Eigen/src/Core/util/MaxSizeVector.h +139 -0
  228. package/eigen/Eigen/src/Core/util/Memory.h +1042 -650
  229. package/eigen/Eigen/src/Core/util/Meta.h +618 -426
  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 +51 -0
  233. package/eigen/Eigen/src/Core/util/Serializer.h +209 -0
  234. package/eigen/Eigen/src/Core/util/StaticAssert.h +51 -164
  235. package/eigen/Eigen/src/Core/util/SymbolicIndex.h +445 -0
  236. package/eigen/Eigen/src/Core/util/XprHelper.h +793 -538
  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 +91 -107
  246. package/eigen/Eigen/src/Eigenvalues/RealQZ.h +539 -606
  247. package/eigen/Eigen/src/Eigenvalues/RealSchur.h +348 -382
  248. package/eigen/Eigen/src/Eigenvalues/RealSchur_LAPACKE.h +41 -35
  249. package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +579 -600
  250. package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_LAPACKE.h +47 -44
  251. package/eigen/Eigen/src/Eigenvalues/Tridiagonalization.h +434 -461
  252. package/eigen/Eigen/src/Geometry/AlignedBox.h +307 -214
  253. package/eigen/Eigen/src/Geometry/AngleAxis.h +135 -137
  254. package/eigen/Eigen/src/Geometry/EulerAngles.h +163 -74
  255. package/eigen/Eigen/src/Geometry/Homogeneous.h +289 -333
  256. package/eigen/Eigen/src/Geometry/Hyperplane.h +152 -161
  257. package/eigen/Eigen/src/Geometry/InternalHeaderCheck.h +3 -0
  258. package/eigen/Eigen/src/Geometry/OrthoMethods.h +168 -145
  259. package/eigen/Eigen/src/Geometry/ParametrizedLine.h +141 -104
  260. package/eigen/Eigen/src/Geometry/Quaternion.h +595 -497
  261. package/eigen/Eigen/src/Geometry/Rotation2D.h +110 -108
  262. package/eigen/Eigen/src/Geometry/RotationBase.h +148 -145
  263. package/eigen/Eigen/src/Geometry/Scaling.h +115 -90
  264. package/eigen/Eigen/src/Geometry/Transform.h +896 -953
  265. package/eigen/Eigen/src/Geometry/Translation.h +100 -98
  266. package/eigen/Eigen/src/Geometry/Umeyama.h +79 -84
  267. package/eigen/Eigen/src/Geometry/arch/Geometry_SIMD.h +154 -0
  268. package/eigen/Eigen/src/Householder/BlockHouseholder.h +54 -42
  269. package/eigen/Eigen/src/Householder/Householder.h +104 -122
  270. package/eigen/Eigen/src/Householder/HouseholderSequence.h +416 -382
  271. package/eigen/Eigen/src/Householder/InternalHeaderCheck.h +3 -0
  272. package/eigen/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +153 -166
  273. package/eigen/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +127 -138
  274. package/eigen/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +95 -124
  275. package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h +269 -267
  276. package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h +246 -259
  277. package/eigen/Eigen/src/IterativeLinearSolvers/InternalHeaderCheck.h +3 -0
  278. package/eigen/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +218 -217
  279. package/eigen/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h +80 -103
  280. package/eigen/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h +59 -63
  281. package/eigen/Eigen/src/Jacobi/InternalHeaderCheck.h +3 -0
  282. package/eigen/Eigen/src/Jacobi/Jacobi.h +256 -291
  283. package/eigen/Eigen/src/KLUSupport/InternalHeaderCheck.h +3 -0
  284. package/eigen/Eigen/src/KLUSupport/KLUSupport.h +339 -0
  285. package/eigen/Eigen/src/LU/Determinant.h +60 -63
  286. package/eigen/Eigen/src/LU/FullPivLU.h +561 -626
  287. package/eigen/Eigen/src/LU/InternalHeaderCheck.h +3 -0
  288. package/eigen/Eigen/src/LU/InverseImpl.h +213 -275
  289. package/eigen/Eigen/src/LU/PartialPivLU.h +407 -435
  290. package/eigen/Eigen/src/LU/PartialPivLU_LAPACKE.h +54 -40
  291. package/eigen/Eigen/src/LU/arch/InverseSize4.h +353 -0
  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 +250 -282
  295. package/eigen/Eigen/src/OrderingMethods/Eigen_Colamd.h +950 -1103
  296. package/eigen/Eigen/src/OrderingMethods/InternalHeaderCheck.h +3 -0
  297. package/eigen/Eigen/src/OrderingMethods/Ordering.h +111 -122
  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 -429
  302. package/eigen/Eigen/src/QR/ColPivHouseholderQR.h +494 -473
  303. package/eigen/Eigen/src/QR/ColPivHouseholderQR_LAPACKE.h +120 -56
  304. package/eigen/Eigen/src/QR/CompleteOrthogonalDecomposition.h +223 -137
  305. package/eigen/Eigen/src/QR/FullPivHouseholderQR.h +517 -460
  306. package/eigen/Eigen/src/QR/HouseholderQR.h +412 -278
  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 +263 -261
  311. package/eigen/Eigen/src/SVD/BDCSVD.h +872 -679
  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 +585 -543
  315. package/eigen/Eigen/src/SVD/JacobiSVD_LAPACKE.h +85 -49
  316. package/eigen/Eigen/src/SVD/SVDBase.h +281 -160
  317. package/eigen/Eigen/src/SVD/UpperBidiagonalization.h +202 -237
  318. package/eigen/Eigen/src/SparseCholesky/InternalHeaderCheck.h +3 -0
  319. package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky.h +769 -590
  320. package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h +318 -129
  321. package/eigen/Eigen/src/SparseCore/AmbiVector.h +202 -251
  322. package/eigen/Eigen/src/SparseCore/CompressedStorage.h +184 -236
  323. package/eigen/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h +140 -184
  324. package/eigen/Eigen/src/SparseCore/InternalHeaderCheck.h +3 -0
  325. package/eigen/Eigen/src/SparseCore/SparseAssign.h +174 -111
  326. package/eigen/Eigen/src/SparseCore/SparseBlock.h +408 -477
  327. package/eigen/Eigen/src/SparseCore/SparseColEtree.h +100 -112
  328. package/eigen/Eigen/src/SparseCore/SparseCompressedBase.h +531 -280
  329. package/eigen/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +559 -347
  330. package/eigen/Eigen/src/SparseCore/SparseCwiseUnaryOp.h +100 -108
  331. package/eigen/Eigen/src/SparseCore/SparseDenseProduct.h +185 -191
  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 +1614 -1142
  337. package/eigen/Eigen/src/SparseCore/SparseMatrixBase.h +403 -357
  338. package/eigen/Eigen/src/SparseCore/SparsePermutation.h +186 -115
  339. package/eigen/Eigen/src/SparseCore/SparseProduct.h +100 -91
  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 +371 -414
  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 +146 -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 +814 -618
  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 +273 -255
  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 +90 -101
  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 +125 -133
  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 +451 -490
  370. package/eigen/Eigen/src/StlSupport/StdDeque.h +28 -105
  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 -732
  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 +480 -380
  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 +9976 -16182
  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.inc +1370 -0
  401. package/eigen/Eigen/src/plugins/CommonCwiseBinaryOps.inc +116 -0
  402. package/eigen/Eigen/src/plugins/CommonCwiseUnaryOps.inc +167 -0
  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/lib/LibEigen.d.ts +4 -0
  409. package/lib/LibEigen.js +14 -0
  410. package/lib/index.d.ts +1 -1
  411. package/lib/index.js +7 -3
  412. package/package.json +2 -10
  413. package/eigen/Eigen/CMakeLists.txt +0 -19
  414. package/eigen/Eigen/src/Core/BooleanRedux.h +0 -164
  415. package/eigen/Eigen/src/Core/arch/CUDA/Complex.h +0 -103
  416. package/eigen/Eigen/src/Core/arch/CUDA/Half.h +0 -675
  417. package/eigen/Eigen/src/Core/arch/CUDA/MathFunctions.h +0 -91
  418. package/eigen/Eigen/src/Core/arch/CUDA/PacketMath.h +0 -333
  419. package/eigen/Eigen/src/Core/arch/CUDA/PacketMathHalf.h +0 -1124
  420. package/eigen/Eigen/src/Core/arch/CUDA/TypeCasting.h +0 -212
  421. package/eigen/Eigen/src/Core/util/NonMPL2.h +0 -3
  422. package/eigen/Eigen/src/Geometry/arch/Geometry_SSE.h +0 -161
  423. package/eigen/Eigen/src/LU/arch/Inverse_SSE.h +0 -338
  424. package/eigen/Eigen/src/SparseCore/MappedSparseMatrix.h +0 -67
  425. package/eigen/Eigen/src/SparseLU/SparseLU_gemm_kernel.h +0 -280
  426. package/eigen/Eigen/src/misc/lapack.h +0 -152
  427. package/eigen/Eigen/src/plugins/ArrayCwiseBinaryOps.h +0 -332
  428. package/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.h +0 -552
  429. package/eigen/Eigen/src/plugins/BlockMethods.h +0 -1058
  430. package/eigen/Eigen/src/plugins/CommonCwiseBinaryOps.h +0 -115
  431. package/eigen/Eigen/src/plugins/CommonCwiseUnaryOps.h +0 -163
  432. package/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.h +0 -152
  433. package/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.h +0 -85
  434. package/lib/eigen.d.ts +0 -2
  435. package/lib/eigen.js +0 -15
@@ -10,344 +10,525 @@
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); }
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
+ }
28
32
  };
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 };
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); }
99
- };
100
- template<typename Scalar>
101
- struct functor_traits<scalar_abs2_op<Scalar> >
102
- { enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasAbs2 }; };
103
-
104
- /** \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 { using numext::conj; return 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
- {
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 };
124
+ };
125
+
126
+ /** \internal
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
- Cost = NumTraits<Scalar>::IsComplex ? NumTraits<Scalar>::AddCost : 0,
142
+ Cost = 0,
143
+ // Yes the cost is zero even for complexes because in most cases for which
144
+ // the cost is used, conjugation turns to be a no-op. Some examples:
145
+ // cost(a*conj(b)) == cost(a*b)
146
+ // cost(a+conj(b)) == cost(a+b)
147
+ // <etc.
148
+ // If we don't set it to zero, then:
149
+ // A.conjugate().lazyProduct(B.conjugate())
150
+ // will bake its operands. We definitely don't want that!
121
151
  PacketAccess = packet_traits<Scalar>::HasConj
122
152
  };
123
153
  };
124
154
 
125
155
  /** \internal
126
- * \brief Template functor to compute the phase angle of a complex
127
- *
128
- * \sa class CwiseUnaryOp, Cwise::arg
129
- */
130
- template<typename Scalar> struct scalar_arg_op {
131
- 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 {
132
162
  typedef typename NumTraits<Scalar>::Real result_type;
133
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const Scalar& a) const { using numext::arg; return arg(a); }
134
- template<typename Packet>
135
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
136
- { return internal::parg(a); }
137
- };
138
- template<typename Scalar>
139
- struct functor_traits<scalar_arg_op<Scalar> >
140
- {
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>> {
141
171
  enum {
142
172
  Cost = NumTraits<Scalar>::IsComplex ? 5 * NumTraits<Scalar>::MulCost : NumTraits<Scalar>::AddCost,
143
173
  PacketAccess = packet_traits<Scalar>::HasArg
144
174
  };
145
175
  };
176
+
146
177
  /** \internal
147
- * \brief Template functor to cast a scalar to another type
148
- *
149
- * \sa class CwiseUnaryOp, MatrixBase::cast()
150
- */
151
- 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>
152
205
  struct scalar_cast_op {
153
- EIGEN_EMPTY_STRUCT_CTOR(scalar_cast_op)
154
206
  typedef NewType result_type;
155
- 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 };
215
+ };
216
+
217
+ /** \internal
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
+ };
234
+
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 };
253
+ };
254
+
255
+ /** \internal
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>
261
+ struct scalar_shift_left_op {
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 };
156
273
  };
157
- template<typename Scalar, typename NewType>
158
- struct functor_traits<scalar_cast_op<Scalar,NewType> >
159
- { enum { Cost = is_same<Scalar, NewType>::value ? 0 : NumTraits<NewType>::AddCost, PacketAccess = false }; };
160
274
 
161
275
  /** \internal
162
- * \brief Template functor to extract the real part of a complex
163
- *
164
- * \sa class CwiseUnaryOp, MatrixBase::real()
165
- */
166
- 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>
167
281
  struct scalar_real_op {
168
- EIGEN_EMPTY_STRUCT_CTOR(scalar_real_op)
169
282
  typedef typename NumTraits<Scalar>::Real result_type;
170
- EIGEN_DEVICE_FUNC
171
- 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 };
172
288
  };
173
- template<typename Scalar>
174
- struct functor_traits<scalar_real_op<Scalar> >
175
- { enum { Cost = 0, PacketAccess = false }; };
176
289
 
177
290
  /** \internal
178
- * \brief Template functor to extract the imaginary part of a complex
179
- *
180
- * \sa class CwiseUnaryOp, MatrixBase::imag()
181
- */
182
- 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>
183
296
  struct scalar_imag_op {
184
- EIGEN_EMPTY_STRUCT_CTOR(scalar_imag_op)
185
297
  typedef typename NumTraits<Scalar>::Real result_type;
186
- EIGEN_DEVICE_FUNC
187
- 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 };
188
303
  };
189
- template<typename Scalar>
190
- struct functor_traits<scalar_imag_op<Scalar> >
191
- { enum { Cost = 0, PacketAccess = false }; };
192
304
 
193
305
  /** \internal
194
- * \brief Template functor to extract the real part of a complex as a reference
195
- *
196
- * \sa class CwiseUnaryOp, MatrixBase::real()
197
- */
198
- 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>
199
311
  struct scalar_real_ref_op {
200
- EIGEN_EMPTY_STRUCT_CTOR(scalar_real_ref_op)
201
312
  typedef typename NumTraits<Scalar>::Real result_type;
202
- EIGEN_DEVICE_FUNC
203
- 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 };
204
321
  };
205
- template<typename Scalar>
206
- struct functor_traits<scalar_real_ref_op<Scalar> >
207
- { enum { Cost = 0, PacketAccess = false }; };
208
322
 
209
323
  /** \internal
210
- * \brief Template functor to extract the imaginary part of a complex as a reference
211
- *
212
- * \sa class CwiseUnaryOp, MatrixBase::imag()
213
- */
214
- 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>
215
329
  struct scalar_imag_ref_op {
216
- EIGEN_EMPTY_STRUCT_CTOR(scalar_imag_ref_op)
217
330
  typedef typename NumTraits<Scalar>::Real result_type;
218
- EIGEN_DEVICE_FUNC
219
- 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 };
220
339
  };
221
- template<typename Scalar>
222
- struct functor_traits<scalar_imag_ref_op<Scalar> >
223
- { enum { Cost = 0, PacketAccess = false }; };
224
340
 
225
341
  /** \internal
226
- *
227
- * \brief Template functor to compute the exponential of a scalar
228
- *
229
- * \sa class CwiseUnaryOp, Cwise::exp()
230
- */
231
- template<typename Scalar> struct scalar_exp_op {
232
- EIGEN_EMPTY_STRUCT_CTOR(scalar_exp_op)
233
- 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); }
234
350
  template <typename Packet>
235
- 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
+ }
236
354
  };
237
355
  template <typename Scalar>
238
- struct functor_traits<scalar_exp_op<Scalar> > {
356
+ struct functor_traits<scalar_exp_op<Scalar>> {
239
357
  enum {
240
358
  PacketAccess = packet_traits<Scalar>::HasExp,
241
- // The following numbers are based on the AVX implementation.
359
+ // The following numbers are based on the AVX implementation.
242
360
  #ifdef EIGEN_VECTORIZE_FMA
243
361
  // Haswell can issue 2 add/mul/madd per cycle.
244
- Cost =
245
- (sizeof(Scalar) == 4
246
- // float: 8 pmadd, 4 pmul, 2 padd/psub, 6 other
247
- ? (8 * NumTraits<Scalar>::AddCost + 6 * NumTraits<Scalar>::MulCost)
248
- // double: 7 pmadd, 5 pmul, 3 padd/psub, 1 div, 13 other
249
- : (14 * NumTraits<Scalar>::AddCost +
250
- 6 * NumTraits<Scalar>::MulCost +
251
- 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))
252
368
  #else
253
- Cost =
254
- (sizeof(Scalar) == 4
255
- // float: 7 pmadd, 6 pmul, 4 padd/psub, 10 other
256
- ? (21 * NumTraits<Scalar>::AddCost + 13 * NumTraits<Scalar>::MulCost)
257
- // double: 7 pmadd, 5 pmul, 3 padd/psub, 1 div, 13 other
258
- : (23 * NumTraits<Scalar>::AddCost +
259
- 12 * NumTraits<Scalar>::MulCost +
260
- 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))
261
375
  #endif
262
376
  };
263
377
  };
264
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
+
395
+ /** \internal
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); }
404
+ template <typename Packet>
405
+ EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
406
+ return internal::pexpm1(a);
407
+ }
408
+ };
409
+ template <typename Scalar>
410
+ struct functor_traits<scalar_expm1_op<Scalar>> {
411
+ enum {
412
+ PacketAccess = packet_traits<Scalar>::HasExpm1,
413
+ Cost = functor_traits<scalar_exp_op<Scalar>>::Cost // TODO measure cost of expm1
414
+ };
415
+ };
416
+
265
417
  /** \internal
266
- *
267
- * \brief Template functor to compute the logarithm of a scalar
268
- *
269
- * \sa class CwiseUnaryOp, ArrayBase::log()
270
- */
271
- template<typename Scalar> struct scalar_log_op {
272
- EIGEN_EMPTY_STRUCT_CTOR(scalar_log_op)
273
- 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); }
274
426
  template <typename Packet>
275
- 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
+ }
276
430
  };
277
431
  template <typename Scalar>
278
- struct functor_traits<scalar_log_op<Scalar> > {
432
+ struct functor_traits<scalar_log_op<Scalar>> {
279
433
  enum {
280
434
  PacketAccess = packet_traits<Scalar>::HasLog,
281
- Cost =
282
- (PacketAccess
283
- // The following numbers are based on the AVX implementation.
435
+ Cost = (PacketAccess
436
+ // The following numbers are based on the AVX implementation.
284
437
  #ifdef EIGEN_VECTORIZE_FMA
285
- // 8 pmadd, 6 pmul, 8 padd/psub, 16 other, can issue 2 add/mul/madd per cycle.
286
- ? (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)
287
440
  #else
288
- // 8 pmadd, 6 pmul, 8 padd/psub, 20 other
289
- ? (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)
290
443
  #endif
291
- // Measured cost of std::log.
292
- : sizeof(Scalar)==4 ? 40 : 85)
444
+ // Measured cost of std::log.
445
+ : sizeof(Scalar) == 4 ? 40 : 85)
293
446
  };
294
447
  };
295
448
 
296
449
  /** \internal
297
- *
298
- * \brief Template functor to compute the logarithm of 1 plus a scalar value
299
- *
300
- * \sa class CwiseUnaryOp, ArrayBase::log1p()
301
- */
302
- template<typename Scalar> struct scalar_log1p_op {
303
- EIGEN_EMPTY_STRUCT_CTOR(scalar_log1p_op)
304
- 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); }
305
458
  template <typename Packet>
306
- 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
+ }
307
462
  };
308
463
  template <typename Scalar>
309
- struct functor_traits<scalar_log1p_op<Scalar> > {
464
+ struct functor_traits<scalar_log1p_op<Scalar>> {
310
465
  enum {
311
466
  PacketAccess = packet_traits<Scalar>::HasLog1p,
312
- 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
313
468
  };
314
469
  };
315
470
 
316
471
  /** \internal
317
- *
318
- * \brief Template functor to compute the base-10 logarithm of a scalar
319
- *
320
- * \sa class CwiseUnaryOp, Cwise::log10()
321
- */
322
- template<typename Scalar> struct scalar_log10_op {
323
- EIGEN_EMPTY_STRUCT_CTOR(scalar_log10_op)
324
- EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { EIGEN_USING_STD_MATH(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); }
480
+ template <typename Packet>
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 };
488
+ };
489
+
490
+ /** \internal
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
+ }
325
502
  template <typename Packet>
326
- EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::plog10(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 };
327
510
  };
328
- template<typename Scalar>
329
- struct functor_traits<scalar_log10_op<Scalar> >
330
- { enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasLog10 }; };
331
511
 
332
512
  /** \internal
333
- * \brief Template functor to compute the square root of a scalar
334
- * \sa class CwiseUnaryOp, Cwise::sqrt()
335
- */
336
- template<typename Scalar> struct scalar_sqrt_op {
337
- EIGEN_EMPTY_STRUCT_CTOR(scalar_sqrt_op)
338
- 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); }
339
519
  template <typename Packet>
340
- 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
+ }
341
523
  };
342
524
  template <typename Scalar>
343
- struct functor_traits<scalar_sqrt_op<Scalar> > {
525
+ struct functor_traits<scalar_sqrt_op<Scalar>> {
344
526
  enum {
345
527
  #if EIGEN_FAST_MATH
346
528
  // The following numbers are based on the AVX implementation.
347
529
  Cost = (sizeof(Scalar) == 8 ? 28
348
530
  // 4 pmul, 1 pmadd, 3 other
349
- : (3 * NumTraits<Scalar>::AddCost +
350
- 5 * NumTraits<Scalar>::MulCost)),
531
+ : (3 * NumTraits<Scalar>::AddCost + 5 * NumTraits<Scalar>::MulCost)),
351
532
  #else
352
533
  // The following numbers are based on min VSQRT throughput on Haswell.
353
534
  Cost = (sizeof(Scalar) == 8 ? 28 : 14),
@@ -356,437 +537,884 @@ struct functor_traits<scalar_sqrt_op<Scalar> > {
356
537
  };
357
538
  };
358
539
 
540
+ // Boolean specialization to eliminate -Wimplicit-conversion-floating-point-to-bool warnings.
541
+ template <>
542
+ struct scalar_sqrt_op<bool> {
543
+ EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline bool operator()(const bool& a) const { return a; }
544
+ template <typename Packet>
545
+ EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
546
+ return a;
547
+ }
548
+ };
549
+ template <>
550
+ struct functor_traits<scalar_sqrt_op<bool>> {
551
+ enum { Cost = 1, PacketAccess = packet_traits<bool>::Vectorizable };
552
+ };
553
+
359
554
  /** \internal
360
- * \brief Template functor to compute the reciprocal square root of a scalar
361
- * \sa class CwiseUnaryOp, Cwise::rsqrt()
362
- */
363
- template<typename Scalar> struct scalar_rsqrt_op {
364
- EIGEN_EMPTY_STRUCT_CTOR(scalar_rsqrt_op)
365
- EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return Scalar(1)/numext::sqrt(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); }
366
561
  template <typename Packet>
367
- 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
+ }
368
565
  };
369
566
 
370
- template<typename Scalar>
371
- struct functor_traits<scalar_rsqrt_op<Scalar> >
372
- { enum {
373
- Cost = 5 * NumTraits<Scalar>::MulCost,
374
- PacketAccess = packet_traits<Scalar>::HasRsqrt
375
- };
567
+ template <typename Scalar>
568
+ struct functor_traits<scalar_cbrt_op<Scalar>> {
569
+ enum { Cost = 20 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasCbrt };
376
570
  };
377
571
 
378
572
  /** \internal
379
- * \brief Template functor to compute the cosine of a scalar
380
- * \sa class CwiseUnaryOp, ArrayBase::cos()
381
- */
382
- template<typename Scalar> struct scalar_cos_op {
383
- EIGEN_EMPTY_STRUCT_CTOR(scalar_cos_op)
384
- 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); }
385
579
  template <typename Packet>
386
- 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
+ }
387
583
  };
388
- template<typename Scalar>
389
- struct functor_traits<scalar_cos_op<Scalar> >
390
- {
391
- enum {
392
- Cost = 5 * NumTraits<Scalar>::MulCost,
393
- PacketAccess = packet_traits<Scalar>::HasCos
394
- };
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 };
395
588
  };
396
589
 
397
590
  /** \internal
398
- * \brief Template functor to compute the sine of a scalar
399
- * \sa class CwiseUnaryOp, ArrayBase::sin()
400
- */
401
- template<typename Scalar> struct scalar_sin_op {
402
- EIGEN_EMPTY_STRUCT_CTOR(scalar_sin_op)
403
- 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); }
404
597
  template <typename Packet>
405
- 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
+ }
406
601
  };
407
- template<typename Scalar>
408
- struct functor_traits<scalar_sin_op<Scalar> >
409
- {
410
- enum {
411
- Cost = 5 * NumTraits<Scalar>::MulCost,
412
- PacketAccess = packet_traits<Scalar>::HasSin
413
- };
602
+ template <typename Scalar>
603
+ struct functor_traits<scalar_cos_op<Scalar>> {
604
+ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasCos };
414
605
  };
415
606
 
416
-
417
607
  /** \internal
418
- * \brief Template functor to compute the tan of a scalar
419
- * \sa class CwiseUnaryOp, ArrayBase::tan()
420
- */
421
- template<typename Scalar> struct scalar_tan_op {
422
- EIGEN_EMPTY_STRUCT_CTOR(scalar_tan_op)
423
- 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); }
424
614
  template <typename Packet>
425
- 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
+ }
426
618
  };
427
- template<typename Scalar>
428
- struct functor_traits<scalar_tan_op<Scalar> >
429
- {
430
- enum {
431
- Cost = 5 * NumTraits<Scalar>::MulCost,
432
- PacketAccess = packet_traits<Scalar>::HasTan
433
- };
619
+ template <typename Scalar>
620
+ struct functor_traits<scalar_sin_op<Scalar>> {
621
+ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasSin };
434
622
  };
435
623
 
436
624
  /** \internal
437
- * \brief Template functor to compute the arc cosine of a scalar
438
- * \sa class CwiseUnaryOp, ArrayBase::acos()
439
- */
440
- template<typename Scalar> struct scalar_acos_op {
441
- EIGEN_EMPTY_STRUCT_CTOR(scalar_acos_op)
442
- 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); }
443
631
  template <typename Packet>
444
- 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
+ }
445
635
  };
446
- template<typename Scalar>
447
- struct functor_traits<scalar_acos_op<Scalar> >
448
- {
449
- enum {
450
- Cost = 5 * NumTraits<Scalar>::MulCost,
451
- PacketAccess = packet_traits<Scalar>::HasACos
452
- };
636
+ template <typename Scalar>
637
+ struct functor_traits<scalar_tan_op<Scalar>> {
638
+ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasTan };
453
639
  };
454
640
 
455
641
  /** \internal
456
- * \brief Template functor to compute the arc sine of a scalar
457
- * \sa class CwiseUnaryOp, ArrayBase::asin()
458
- */
459
- template<typename Scalar> struct scalar_asin_op {
460
- EIGEN_EMPTY_STRUCT_CTOR(scalar_asin_op)
461
- 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); }
462
648
  template <typename Packet>
463
- 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
+ }
464
652
  };
465
- template<typename Scalar>
466
- struct functor_traits<scalar_asin_op<Scalar> >
467
- {
468
- enum {
469
- Cost = 5 * NumTraits<Scalar>::MulCost,
470
- PacketAccess = packet_traits<Scalar>::HasASin
471
- };
653
+ template <typename Scalar>
654
+ struct functor_traits<scalar_acos_op<Scalar>> {
655
+ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasACos };
472
656
  };
473
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
+ };
474
674
 
475
675
  /** \internal
476
- * \brief Template functor to compute the atan of a scalar
477
- * \sa class CwiseUnaryOp, ArrayBase::atan()
478
- */
479
- template<typename Scalar> struct scalar_atan_op {
480
- EIGEN_EMPTY_STRUCT_CTOR(scalar_atan_op)
481
- 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); }
482
682
  template <typename Packet>
483
- 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
+ }
484
686
  };
485
- template<typename Scalar>
486
- struct functor_traits<scalar_atan_op<Scalar> >
487
- {
488
- enum {
489
- Cost = 5 * NumTraits<Scalar>::MulCost,
490
- PacketAccess = packet_traits<Scalar>::HasATan
491
- };
687
+ template <typename Scalar>
688
+ struct functor_traits<scalar_atan_op<Scalar>> {
689
+ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasATan };
492
690
  };
493
691
 
494
692
  /** \internal
495
- * \brief Template functor to compute the tanh of a scalar
496
- * \sa class CwiseUnaryOp, ArrayBase::tanh()
497
- */
693
+ * \brief Template functor to compute the tanh of a scalar
694
+ * \sa class CwiseUnaryOp, ArrayBase::tanh()
695
+ */
498
696
  template <typename Scalar>
499
697
  struct scalar_tanh_op {
500
- EIGEN_EMPTY_STRUCT_CTOR(scalar_tanh_op)
501
698
  EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::tanh(a); }
502
699
  template <typename Packet>
503
- 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
+ }
504
703
  };
505
704
 
506
705
  template <typename Scalar>
507
- struct functor_traits<scalar_tanh_op<Scalar> > {
706
+ struct functor_traits<scalar_tanh_op<Scalar>> {
508
707
  enum {
509
708
  PacketAccess = packet_traits<Scalar>::HasTanh,
510
- Cost = ( (EIGEN_FAST_MATH && is_same<Scalar,float>::value)
709
+ Cost = ((EIGEN_FAST_MATH && is_same<Scalar, float>::value)
511
710
  // The following numbers are based on the AVX implementation,
512
711
  #ifdef EIGEN_VECTORIZE_FMA
513
712
  // Haswell can issue 2 add/mul/madd per cycle.
514
713
  // 9 pmadd, 2 pmul, 1 div, 2 other
515
- ? (2 * NumTraits<Scalar>::AddCost +
516
- 6 * NumTraits<Scalar>::MulCost +
517
- 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)
518
716
  #else
519
- ? (11 * NumTraits<Scalar>::AddCost +
520
- 11 * NumTraits<Scalar>::MulCost +
521
- 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)
522
719
  #endif
523
720
  // This number assumes a naive implementation of tanh
524
- : (6 * NumTraits<Scalar>::AddCost +
525
- 3 * NumTraits<Scalar>::MulCost +
526
- 2 * scalar_div_cost<Scalar,packet_traits<Scalar>::HasDiv>::value +
527
- 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))
528
724
  };
529
725
  };
530
726
 
531
727
  /** \internal
532
- * \brief Template functor to compute the sinh of a scalar
533
- * \sa class CwiseUnaryOp, ArrayBase::sinh()
534
- */
535
- template<typename Scalar> struct scalar_sinh_op {
536
- EIGEN_EMPTY_STRUCT_CTOR(scalar_sinh_op)
537
- EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return numext::sinh(a); }
728
+ * \brief Template functor to compute the atanh of a scalar
729
+ * \sa class CwiseUnaryOp, ArrayBase::atanh()
730
+ */
731
+ template <typename Scalar>
732
+ struct scalar_atanh_op {
733
+ EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::atanh(a); }
538
734
  template <typename Packet>
539
- EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::psinh(a); }
735
+ EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& x) const {
736
+ return patanh(x);
737
+ }
540
738
  };
541
- template<typename Scalar>
542
- struct functor_traits<scalar_sinh_op<Scalar> >
543
- {
544
- enum {
545
- Cost = 5 * NumTraits<Scalar>::MulCost,
546
- PacketAccess = packet_traits<Scalar>::HasSinh
547
- };
739
+
740
+ template <typename Scalar>
741
+ struct functor_traits<scalar_atanh_op<Scalar>> {
742
+ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasATanh };
548
743
  };
549
744
 
550
745
  /** \internal
551
- * \brief Template functor to compute the cosh of a scalar
552
- * \sa class CwiseUnaryOp, ArrayBase::cosh()
553
- */
554
- template<typename Scalar> struct scalar_cosh_op {
555
- EIGEN_EMPTY_STRUCT_CTOR(scalar_cosh_op)
556
- EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return numext::cosh(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); }
557
752
  template <typename Packet>
558
- EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pcosh(a); }
753
+ EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
754
+ return internal::psinh(a);
755
+ }
559
756
  };
560
- template<typename Scalar>
561
- struct functor_traits<scalar_cosh_op<Scalar> >
562
- {
563
- enum {
564
- Cost = 5 * NumTraits<Scalar>::MulCost,
565
- PacketAccess = packet_traits<Scalar>::HasCosh
566
- };
757
+ template <typename Scalar>
758
+ struct functor_traits<scalar_sinh_op<Scalar>> {
759
+ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasSinh };
567
760
  };
568
761
 
569
762
  /** \internal
570
- * \brief Template functor to compute the inverse of a scalar
571
- * \sa class CwiseUnaryOp, Cwise::inverse()
572
- */
573
- template<typename Scalar>
763
+ * \brief Template functor to compute the asinh of a scalar
764
+ * \sa class CwiseUnaryOp, ArrayBase::asinh()
765
+ */
766
+ template <typename Scalar>
767
+ struct scalar_asinh_op {
768
+ EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::asinh(a); }
769
+ };
770
+
771
+ template <typename Scalar>
772
+ struct functor_traits<scalar_asinh_op<Scalar>> {
773
+ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = false };
774
+ };
775
+
776
+ /** \internal
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); }
783
+ template <typename Packet>
784
+ EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
785
+ return internal::pcosh(a);
786
+ }
787
+ };
788
+ template <typename Scalar>
789
+ struct functor_traits<scalar_cosh_op<Scalar>> {
790
+ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasCosh };
791
+ };
792
+
793
+ /** \internal
794
+ * \brief Template functor to compute the acosh of a scalar
795
+ * \sa class CwiseUnaryOp, ArrayBase::acosh()
796
+ */
797
+ template <typename Scalar>
798
+ struct scalar_acosh_op {
799
+ EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::acosh(a); }
800
+ };
801
+
802
+ template <typename Scalar>
803
+ struct functor_traits<scalar_acosh_op<Scalar>> {
804
+ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = false };
805
+ };
806
+
807
+ /** \internal
808
+ * \brief Template functor to compute the inverse of a scalar
809
+ * \sa class CwiseUnaryOp, Cwise::inverse()
810
+ */
811
+ template <typename Scalar>
574
812
  struct scalar_inverse_op {
575
- EIGEN_EMPTY_STRUCT_CTOR(scalar_inverse_op)
576
- EIGEN_DEVICE_FUNC inline Scalar operator() (const Scalar& a) const { return Scalar(1)/a; }
577
- template<typename Packet>
578
- EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const
579
- { 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
+ }
818
+ };
819
+ template <typename Scalar>
820
+ struct functor_traits<scalar_inverse_op<Scalar>> {
821
+ enum {
822
+ PacketAccess = packet_traits<Scalar>::HasDiv,
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)
828
+ };
580
829
  };
581
- template<typename Scalar>
582
- struct functor_traits<scalar_inverse_op<Scalar> >
583
- { enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasDiv }; };
584
830
 
585
831
  /** \internal
586
- * \brief Template functor to compute the square of a scalar
587
- * \sa class CwiseUnaryOp, Cwise::square()
588
- */
589
- 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>
590
836
  struct scalar_square_op {
591
- EIGEN_EMPTY_STRUCT_CTOR(scalar_square_op)
592
- EIGEN_DEVICE_FUNC inline Scalar operator() (const Scalar& a) const { return a*a; }
593
- template<typename Packet>
594
- EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const
595
- { 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 };
846
+ };
847
+
848
+ // Boolean specialization to avoid -Wint-in-bool-context warnings on GCC.
849
+ template <>
850
+ struct scalar_square_op<bool> {
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 };
596
860
  };
597
- template<typename Scalar>
598
- struct functor_traits<scalar_square_op<Scalar> >
599
- { enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; };
600
861
 
601
862
  /** \internal
602
- * \brief Template functor to compute the cube of a scalar
603
- * \sa class CwiseUnaryOp, Cwise::cube()
604
- */
605
- 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>
606
867
  struct scalar_cube_op {
607
- EIGEN_EMPTY_STRUCT_CTOR(scalar_cube_op)
608
- EIGEN_DEVICE_FUNC inline Scalar operator() (const Scalar& a) const { return a*a*a; }
609
- template<typename Packet>
610
- EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const
611
- { 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 };
877
+ };
878
+
879
+ // Boolean specialization to avoid -Wint-in-bool-context warnings on GCC.
880
+ template <>
881
+ struct scalar_cube_op<bool> {
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 };
612
891
  };
613
- template<typename Scalar>
614
- struct functor_traits<scalar_cube_op<Scalar> >
615
- { enum { Cost = 2*NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; };
616
892
 
617
893
  /** \internal
618
- * \brief Template functor to compute the rounded value of a scalar
619
- * \sa class CwiseUnaryOp, ArrayBase::round()
620
- */
621
- template<typename Scalar> struct scalar_round_op {
622
- EIGEN_EMPTY_STRUCT_CTOR(scalar_round_op)
623
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const { return numext::round(a); }
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); }
624
900
  template <typename Packet>
625
- EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pround(a); }
901
+ EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
902
+ return internal::pround(a);
903
+ }
626
904
  };
627
- template<typename Scalar>
628
- struct functor_traits<scalar_round_op<Scalar> >
629
- {
905
+ template <typename Scalar>
906
+ struct functor_traits<scalar_round_op<Scalar>> {
630
907
  enum {
631
908
  Cost = NumTraits<Scalar>::MulCost,
632
- PacketAccess = packet_traits<Scalar>::HasRound
909
+ PacketAccess = packet_traits<Scalar>::HasRound || NumTraits<Scalar>::IsInteger
633
910
  };
634
911
  };
635
912
 
636
913
  /** \internal
637
- * \brief Template functor to compute the floor of a scalar
638
- * \sa class CwiseUnaryOp, ArrayBase::floor()
639
- */
640
- template<typename Scalar> struct scalar_floor_op {
641
- EIGEN_EMPTY_STRUCT_CTOR(scalar_floor_op)
642
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const { return numext::floor(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); }
643
920
  template <typename Packet>
644
- EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pfloor(a); }
921
+ EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
922
+ return internal::pfloor(a);
923
+ }
645
924
  };
646
- template<typename Scalar>
647
- struct functor_traits<scalar_floor_op<Scalar> >
648
- {
925
+ template <typename Scalar>
926
+ struct functor_traits<scalar_floor_op<Scalar>> {
649
927
  enum {
650
928
  Cost = NumTraits<Scalar>::MulCost,
651
- PacketAccess = packet_traits<Scalar>::HasFloor
929
+ PacketAccess = packet_traits<Scalar>::HasRound || NumTraits<Scalar>::IsInteger
652
930
  };
653
931
  };
654
932
 
655
933
  /** \internal
656
- * \brief Template functor to compute the ceil of a scalar
657
- * \sa class CwiseUnaryOp, ArrayBase::ceil()
658
- */
659
- template<typename Scalar> struct scalar_ceil_op {
660
- EIGEN_EMPTY_STRUCT_CTOR(scalar_ceil_op)
661
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const { return numext::ceil(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); }
662
940
  template <typename Packet>
663
- EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pceil(a); }
941
+ EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
942
+ return internal::print(a);
943
+ }
664
944
  };
665
- template<typename Scalar>
666
- struct functor_traits<scalar_ceil_op<Scalar> >
667
- {
945
+ template <typename Scalar>
946
+ struct functor_traits<scalar_rint_op<Scalar>> {
668
947
  enum {
669
948
  Cost = NumTraits<Scalar>::MulCost,
670
- PacketAccess = packet_traits<Scalar>::HasCeil
949
+ PacketAccess = packet_traits<Scalar>::HasRound || NumTraits<Scalar>::IsInteger
671
950
  };
672
951
  };
673
952
 
674
953
  /** \internal
675
- * \brief Template functor to compute whether a scalar is NaN
676
- * \sa class CwiseUnaryOp, ArrayBase::isnan()
677
- */
678
- template<typename Scalar> struct scalar_isnan_op {
679
- EIGEN_EMPTY_STRUCT_CTOR(scalar_isnan_op)
680
- typedef bool result_type;
681
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const { return (numext::isnan)(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); }
960
+ template <typename Packet>
961
+ EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
962
+ return internal::pceil(a);
963
+ }
682
964
  };
683
- template<typename Scalar>
684
- struct functor_traits<scalar_isnan_op<Scalar> >
685
- {
965
+ template <typename Scalar>
966
+ struct functor_traits<scalar_ceil_op<Scalar>> {
686
967
  enum {
687
968
  Cost = NumTraits<Scalar>::MulCost,
688
- PacketAccess = false
969
+ PacketAccess = packet_traits<Scalar>::HasRound || NumTraits<Scalar>::IsInteger
689
970
  };
690
971
  };
691
972
 
692
973
  /** \internal
693
- * \brief Template functor to check whether a scalar is +/-inf
694
- * \sa class CwiseUnaryOp, ArrayBase::isinf()
695
- */
696
- template<typename Scalar> struct scalar_isinf_op {
697
- EIGEN_EMPTY_STRUCT_CTOR(scalar_isinf_op)
698
- typedef bool result_type;
699
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const { return (numext::isinf)(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); }
980
+ template <typename Packet>
981
+ EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
982
+ return internal::ptrunc(a);
983
+ }
700
984
  };
701
- template<typename Scalar>
702
- struct functor_traits<scalar_isinf_op<Scalar> >
703
- {
985
+ template <typename Scalar>
986
+ struct functor_traits<scalar_trunc_op<Scalar>> {
704
987
  enum {
705
988
  Cost = NumTraits<Scalar>::MulCost,
706
- PacketAccess = false
989
+ PacketAccess = packet_traits<Scalar>::HasRound || NumTraits<Scalar>::IsInteger
707
990
  };
708
991
  };
709
992
 
710
993
  /** \internal
711
- * \brief Template functor to check whether a scalar has a finite value
712
- * \sa class CwiseUnaryOp, ArrayBase::isfinite()
713
- */
714
- template<typename Scalar> struct scalar_isfinite_op {
715
- EIGEN_EMPTY_STRUCT_CTOR(scalar_isfinite_op)
716
- typedef bool result_type;
717
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const { return (numext::isfinite)(a); }
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 {
1000
+ #if defined(SYCL_DEVICE_ONLY)
1001
+ return numext::isnan(a);
1002
+ #else
1003
+ return numext::isnan EIGEN_NOT_A_MACRO(a);
1004
+ #endif
1005
+ }
1006
+ };
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 };
1026
+ };
1027
+
1028
+ /** \internal
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 {
1035
+ #if defined(SYCL_DEVICE_ONLY)
1036
+ return numext::isinf(a);
1037
+ #else
1038
+ return (numext::isinf)(a);
1039
+ #endif
1040
+ }
718
1041
  };
719
- template<typename Scalar>
720
- struct functor_traits<scalar_isfinite_op<Scalar> >
721
- {
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 };
1060
+ };
1061
+
1062
+ /** \internal
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 {
1069
+ #if defined(SYCL_DEVICE_ONLY)
1070
+ return numext::isfinite(a);
1071
+ #else
1072
+ return (numext::isfinite)(a);
1073
+ #endif
1074
+ }
1075
+ };
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 };
1095
+ };
1096
+
1097
+ /** \internal
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
+ }
1141
+ };
1142
+
1143
+ /** \internal
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 };
1165
+ };
1166
+
1167
+ /** \internal
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);
1178
+ }
1179
+ };
1180
+
1181
+ template <typename Scalar>
1182
+ struct functor_traits<scalar_sign_op<Scalar>> {
722
1183
  enum {
723
- Cost = NumTraits<Scalar>::MulCost,
724
- PacketAccess = false
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
725
1187
  };
726
1188
  };
727
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); }
1194
+
1195
+ template <typename Packet>
1196
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x) const {
1197
+ const Packet one = pset1<Packet>(T(1));
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));
1211
+ }
1212
+ };
1213
+
1214
+ /** \internal
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
+
728
1225
  /** \internal
729
- * \brief Template functor to compute the logical not of a boolean
730
- *
731
- * \sa class CwiseUnaryOp, ArrayBase::operator!
732
- */
733
- template<typename Scalar> struct scalar_boolean_not_op {
734
- EIGEN_EMPTY_STRUCT_CTOR(scalar_boolean_not_op)
735
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator() (const bool& a) const { return !a; }
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
+ */
1240
+ template <>
1241
+ struct scalar_logistic_op<float> {
1242
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float operator()(const float& x) const {
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);
1247
+ }
1248
+
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)));
1306
+ }
736
1307
  };
737
- template<typename Scalar>
738
- struct functor_traits<scalar_boolean_not_op<Scalar> > {
1308
+ #endif // #ifndef EIGEN_GPU_COMPILE_PHASE
1309
+
1310
+ template <typename T>
1311
+ struct functor_traits<scalar_logistic_op<T>> {
739
1312
  enum {
740
- Cost = NumTraits<bool>::AddCost,
741
- PacketAccess = false
1313
+ // The cost estimate for float here here is for the common(?) case where
1314
+ // all arguments are greater than -9.
1315
+ Cost = scalar_div_cost<T, packet_traits<T>::HasDiv>::value +
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)
742
1322
  };
743
1323
  };
744
1324
 
745
- /** \internal
746
- * \brief Template functor to compute the signum of a scalar
747
- * \sa class CwiseUnaryOp, Cwise::sign()
748
- */
749
- template<typename Scalar,bool iscpx=(NumTraits<Scalar>::IsComplex!=0) > struct scalar_sign_op;
750
- template<typename Scalar>
751
- struct scalar_sign_op<Scalar,false> {
752
- EIGEN_EMPTY_STRUCT_CTOR(scalar_sign_op)
753
- EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const
754
- {
755
- return Scalar( (a>Scalar(0)) - (a<Scalar(0)) );
756
- }
757
- //TODO
758
- //template <typename Packet>
759
- //EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::psign(a); }
760
- };
761
- template<typename Scalar>
762
- struct scalar_sign_op<Scalar,true> {
763
- EIGEN_EMPTY_STRUCT_CTOR(scalar_sign_op)
764
- EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const
765
- {
766
- typedef typename NumTraits<Scalar>::Real real_type;
767
- real_type aa = numext::abs(a);
768
- if (aa==real_type(0))
769
- return Scalar(0);
770
- aa = real_type(1)/aa;
771
- return Scalar(a.real()*aa, a.imag()*aa );
772
- }
773
- //TODO
774
- //template <typename Packet>
775
- //EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::psign(a); }
776
- };
777
- template<typename Scalar>
778
- struct functor_traits<scalar_sign_op<Scalar> >
779
- { enum {
780
- Cost =
781
- NumTraits<Scalar>::IsComplex
782
- ? ( 8*NumTraits<Scalar>::MulCost ) // roughly
783
- : ( 3*NumTraits<Scalar>::AddCost),
784
- PacketAccess = packet_traits<Scalar>::HasSign
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
785
1413
  };
786
1414
  };
787
1415
 
788
- } // end namespace internal
1416
+ } // end namespace internal
789
1417
 
790
- } // end namespace Eigen
1418
+ } // end namespace Eigen
791
1419
 
792
- #endif // EIGEN_FUNCTORS_H
1420
+ #endif // EIGEN_FUNCTORS_H