@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,121 +10,123 @@
10
10
  #ifndef EIGEN_BINARY_FUNCTORS_H
11
11
  #define EIGEN_BINARY_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
  //---------- associative binary functors ----------
18
21
 
19
- template<typename Arg1, typename Arg2>
20
- struct binary_op_base
21
- {
22
+ template <typename Arg1, typename Arg2>
23
+ struct binary_op_base {
22
24
  typedef Arg1 first_argument_type;
23
25
  typedef Arg2 second_argument_type;
24
26
  };
25
27
 
26
28
  /** \internal
27
- * \brief Template functor to compute the sum of two scalars
28
- *
29
- * \sa class CwiseBinaryOp, MatrixBase::operator+, class VectorwiseOp, DenseBase::sum()
30
- */
31
- template<typename LhsScalar,typename RhsScalar>
32
- struct scalar_sum_op : binary_op_base<LhsScalar,RhsScalar>
33
- {
34
- typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_sum_op>::ReturnType result_type;
35
- #ifndef EIGEN_SCALAR_BINARY_OP_PLUGIN
36
- EIGEN_EMPTY_STRUCT_CTOR(scalar_sum_op)
37
- #else
38
- scalar_sum_op() {
39
- EIGEN_SCALAR_BINARY_OP_PLUGIN
40
- }
29
+ * \brief Template functor to compute the sum of two scalars
30
+ *
31
+ * \sa class CwiseBinaryOp, MatrixBase::operator+, class VectorwiseOp, DenseBase::sum()
32
+ */
33
+ template <typename LhsScalar, typename RhsScalar>
34
+ struct scalar_sum_op : binary_op_base<LhsScalar, RhsScalar> {
35
+ typedef typename ScalarBinaryOpTraits<LhsScalar, RhsScalar, scalar_sum_op>::ReturnType result_type;
36
+ #ifdef EIGEN_SCALAR_BINARY_OP_PLUGIN
37
+ scalar_sum_op(){EIGEN_SCALAR_BINARY_OP_PLUGIN}
41
38
  #endif
42
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const { return a + b; }
43
- template<typename Packet>
44
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const
45
- { return internal::padd(a,b); }
46
- template<typename Packet>
47
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type predux(const Packet& a) const
48
- { return internal::predux(a); }
49
- };
50
- template<typename LhsScalar,typename RhsScalar>
51
- struct functor_traits<scalar_sum_op<LhsScalar,RhsScalar> > {
39
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type
40
+ operator()(const LhsScalar& a, const RhsScalar& b) const {
41
+ return a + b;
42
+ }
43
+ template <typename Packet>
44
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const {
45
+ return internal::padd(a, b);
46
+ }
47
+ template <typename Packet>
48
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type predux(const Packet& a) const {
49
+ return internal::predux(a);
50
+ }
51
+ };
52
+ template <typename LhsScalar, typename RhsScalar>
53
+ struct functor_traits<scalar_sum_op<LhsScalar, RhsScalar>> {
52
54
  enum {
53
- Cost = (NumTraits<LhsScalar>::AddCost+NumTraits<RhsScalar>::AddCost)/2, // rough estimate!
54
- PacketAccess = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasAdd && packet_traits<RhsScalar>::HasAdd
55
+ Cost = (int(NumTraits<LhsScalar>::AddCost) + int(NumTraits<RhsScalar>::AddCost)) / 2, // rough estimate!
56
+ PacketAccess =
57
+ is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasAdd && packet_traits<RhsScalar>::HasAdd
55
58
  // TODO vectorize mixed sum
56
59
  };
57
60
  };
58
61
 
59
- /** \internal
60
- * \brief Template specialization to deprecate the summation of boolean expressions.
61
- * This is required to solve Bug 426.
62
- * \sa DenseBase::count(), DenseBase::any(), ArrayBase::cast(), MatrixBase::cast()
63
- */
64
- template<> struct scalar_sum_op<bool,bool> : scalar_sum_op<int,int> {
65
- EIGEN_DEPRECATED
66
- scalar_sum_op() {}
67
- };
68
-
62
+ template <>
63
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool scalar_sum_op<bool, bool>::operator()(const bool& a, const bool& b) const {
64
+ return a || b;
65
+ }
69
66
 
70
67
  /** \internal
71
- * \brief Template functor to compute the product of two scalars
72
- *
73
- * \sa class CwiseBinaryOp, Cwise::operator*(), class VectorwiseOp, MatrixBase::redux()
74
- */
75
- template<typename LhsScalar,typename RhsScalar>
76
- struct scalar_product_op : binary_op_base<LhsScalar,RhsScalar>
77
- {
78
- typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_product_op>::ReturnType result_type;
79
- #ifndef EIGEN_SCALAR_BINARY_OP_PLUGIN
80
- EIGEN_EMPTY_STRUCT_CTOR(scalar_product_op)
81
- #else
82
- scalar_product_op() {
83
- EIGEN_SCALAR_BINARY_OP_PLUGIN
84
- }
68
+ * \brief Template functor to compute the product of two scalars
69
+ *
70
+ * \sa class CwiseBinaryOp, Cwise::operator*(), class VectorwiseOp, MatrixBase::redux()
71
+ */
72
+ template <typename LhsScalar, typename RhsScalar>
73
+ struct scalar_product_op : binary_op_base<LhsScalar, RhsScalar> {
74
+ typedef typename ScalarBinaryOpTraits<LhsScalar, RhsScalar, scalar_product_op>::ReturnType result_type;
75
+ #ifdef EIGEN_SCALAR_BINARY_OP_PLUGIN
76
+ scalar_product_op(){EIGEN_SCALAR_BINARY_OP_PLUGIN}
85
77
  #endif
86
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const { return a * b; }
87
- template<typename Packet>
88
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const
89
- { return internal::pmul(a,b); }
90
- template<typename Packet>
91
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type predux(const Packet& a) const
92
- { return internal::predux_mul(a); }
93
- };
94
- template<typename LhsScalar,typename RhsScalar>
95
- struct functor_traits<scalar_product_op<LhsScalar,RhsScalar> > {
78
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type
79
+ operator()(const LhsScalar& a, const RhsScalar& b) const {
80
+ return a * b;
81
+ }
82
+ template <typename Packet>
83
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const {
84
+ return internal::pmul(a, b);
85
+ }
86
+ template <typename Packet>
87
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type predux(const Packet& a) const {
88
+ return internal::predux_mul(a);
89
+ }
90
+ };
91
+ template <typename LhsScalar, typename RhsScalar>
92
+ struct functor_traits<scalar_product_op<LhsScalar, RhsScalar>> {
96
93
  enum {
97
- Cost = (NumTraits<LhsScalar>::MulCost + NumTraits<RhsScalar>::MulCost)/2, // rough estimate!
98
- PacketAccess = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasMul && packet_traits<RhsScalar>::HasMul
94
+ Cost = (int(NumTraits<LhsScalar>::MulCost) + int(NumTraits<RhsScalar>::MulCost)) / 2, // rough estimate!
95
+ PacketAccess =
96
+ is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasMul && packet_traits<RhsScalar>::HasMul
99
97
  // TODO vectorize mixed product
100
98
  };
101
99
  };
102
100
 
101
+ template <>
102
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool scalar_product_op<bool, bool>::operator()(const bool& a,
103
+ const bool& b) const {
104
+ return a && b;
105
+ }
106
+
103
107
  /** \internal
104
- * \brief Template functor to compute the conjugate product of two scalars
105
- *
106
- * This is a short cut for conj(x) * y which is needed for optimization purpose; in Eigen2 support mode, this becomes x * conj(y)
107
- */
108
- template<typename LhsScalar,typename RhsScalar>
109
- struct scalar_conj_product_op : binary_op_base<LhsScalar,RhsScalar>
110
- {
108
+ * \brief Template functor to compute the conjugate product of two scalars
109
+ *
110
+ * This is a short cut for conj(x) * y which is needed for optimization purpose; in Eigen2 support mode, this becomes x
111
+ * * conj(y)
112
+ */
113
+ template <typename LhsScalar, typename RhsScalar>
114
+ struct scalar_conj_product_op : binary_op_base<LhsScalar, RhsScalar> {
115
+ enum { Conj = NumTraits<LhsScalar>::IsComplex };
111
116
 
112
- enum {
113
- Conj = NumTraits<LhsScalar>::IsComplex
114
- };
115
-
116
- typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_conj_product_op>::ReturnType result_type;
117
-
118
- EIGEN_EMPTY_STRUCT_CTOR(scalar_conj_product_op)
119
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const
120
- { return conj_helper<LhsScalar,RhsScalar,Conj,false>().pmul(a,b); }
121
-
122
- template<typename Packet>
123
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const
124
- { return conj_helper<Packet,Packet,Conj,false>().pmul(a,b); }
125
- };
126
- template<typename LhsScalar,typename RhsScalar>
127
- struct functor_traits<scalar_conj_product_op<LhsScalar,RhsScalar> > {
117
+ typedef typename ScalarBinaryOpTraits<LhsScalar, RhsScalar, scalar_conj_product_op>::ReturnType result_type;
118
+
119
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator()(const LhsScalar& a, const RhsScalar& b) const {
120
+ return conj_helper<LhsScalar, RhsScalar, Conj, false>().pmul(a, b);
121
+ }
122
+
123
+ template <typename Packet>
124
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const {
125
+ return conj_helper<Packet, Packet, Conj, false>().pmul(a, b);
126
+ }
127
+ };
128
+ template <typename LhsScalar, typename RhsScalar>
129
+ struct functor_traits<scalar_conj_product_op<LhsScalar, RhsScalar>> {
128
130
  enum {
129
131
  Cost = NumTraits<LhsScalar>::MulCost,
130
132
  PacketAccess = internal::is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasMul
@@ -132,344 +134,614 @@ struct functor_traits<scalar_conj_product_op<LhsScalar,RhsScalar> > {
132
134
  };
133
135
 
134
136
  /** \internal
135
- * \brief Template functor to compute the min of two scalars
136
- *
137
- * \sa class CwiseBinaryOp, MatrixBase::cwiseMin, class VectorwiseOp, MatrixBase::minCoeff()
138
- */
139
- template<typename LhsScalar,typename RhsScalar>
140
- struct scalar_min_op : binary_op_base<LhsScalar,RhsScalar>
141
- {
142
- typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_min_op>::ReturnType result_type;
143
- EIGEN_EMPTY_STRUCT_CTOR(scalar_min_op)
144
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const { return numext::mini(a, b); }
145
- template<typename Packet>
146
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const
147
- { return internal::pmin(a,b); }
148
- template<typename Packet>
149
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type predux(const Packet& a) const
150
- { return internal::predux_min(a); }
151
- };
152
- template<typename LhsScalar,typename RhsScalar>
153
- struct functor_traits<scalar_min_op<LhsScalar,RhsScalar> > {
137
+ * \brief Template functor to compute the min of two scalars
138
+ *
139
+ * \sa class CwiseBinaryOp, MatrixBase::cwiseMin, class VectorwiseOp, MatrixBase::minCoeff()
140
+ */
141
+ template <typename LhsScalar, typename RhsScalar, int NaNPropagation>
142
+ struct scalar_min_op : binary_op_base<LhsScalar, RhsScalar> {
143
+ typedef typename ScalarBinaryOpTraits<LhsScalar, RhsScalar, scalar_min_op>::ReturnType result_type;
144
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator()(const LhsScalar& a, const RhsScalar& b) const {
145
+ return internal::pmin<NaNPropagation>(a, b);
146
+ }
147
+ template <typename Packet>
148
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const {
149
+ return internal::pmin<NaNPropagation>(a, b);
150
+ }
151
+ template <typename Packet>
152
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type predux(const Packet& a) const {
153
+ return internal::predux_min<NaNPropagation>(a);
154
+ }
155
+ };
156
+
157
+ template <typename LhsScalar, typename RhsScalar, int NaNPropagation>
158
+ struct functor_traits<scalar_min_op<LhsScalar, RhsScalar, NaNPropagation>> {
154
159
  enum {
155
- Cost = (NumTraits<LhsScalar>::AddCost+NumTraits<RhsScalar>::AddCost)/2,
160
+ Cost = (NumTraits<LhsScalar>::AddCost + NumTraits<RhsScalar>::AddCost) / 2,
156
161
  PacketAccess = internal::is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasMin
157
162
  };
158
163
  };
159
164
 
160
165
  /** \internal
161
- * \brief Template functor to compute the max of two scalars
162
- *
163
- * \sa class CwiseBinaryOp, MatrixBase::cwiseMax, class VectorwiseOp, MatrixBase::maxCoeff()
164
- */
165
- template<typename LhsScalar,typename RhsScalar>
166
- struct scalar_max_op : binary_op_base<LhsScalar,RhsScalar>
167
- {
168
- typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_max_op>::ReturnType result_type;
169
- EIGEN_EMPTY_STRUCT_CTOR(scalar_max_op)
170
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const { return numext::maxi(a, b); }
171
- template<typename Packet>
172
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const
173
- { return internal::pmax(a,b); }
174
- template<typename Packet>
175
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type predux(const Packet& a) const
176
- { return internal::predux_max(a); }
177
- };
178
- template<typename LhsScalar,typename RhsScalar>
179
- struct functor_traits<scalar_max_op<LhsScalar,RhsScalar> > {
166
+ * \brief Template functor to compute the max of two scalars
167
+ *
168
+ * \sa class CwiseBinaryOp, MatrixBase::cwiseMax, class VectorwiseOp, MatrixBase::maxCoeff()
169
+ */
170
+ template <typename LhsScalar, typename RhsScalar, int NaNPropagation>
171
+ struct scalar_max_op : binary_op_base<LhsScalar, RhsScalar> {
172
+ typedef typename ScalarBinaryOpTraits<LhsScalar, RhsScalar, scalar_max_op>::ReturnType result_type;
173
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator()(const LhsScalar& a, const RhsScalar& b) const {
174
+ return internal::pmax<NaNPropagation>(a, b);
175
+ }
176
+ template <typename Packet>
177
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const {
178
+ return internal::pmax<NaNPropagation>(a, b);
179
+ }
180
+ template <typename Packet>
181
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type predux(const Packet& a) const {
182
+ return internal::predux_max<NaNPropagation>(a);
183
+ }
184
+ };
185
+
186
+ template <typename LhsScalar, typename RhsScalar, int NaNPropagation>
187
+ struct functor_traits<scalar_max_op<LhsScalar, RhsScalar, NaNPropagation>> {
180
188
  enum {
181
- Cost = (NumTraits<LhsScalar>::AddCost+NumTraits<RhsScalar>::AddCost)/2,
189
+ Cost = (NumTraits<LhsScalar>::AddCost + NumTraits<RhsScalar>::AddCost) / 2,
182
190
  PacketAccess = internal::is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasMax
183
191
  };
184
192
  };
185
193
 
186
194
  /** \internal
187
- * \brief Template functors for comparison of two scalars
188
- * \todo Implement packet-comparisons
189
- */
190
- template<typename LhsScalar, typename RhsScalar, ComparisonName cmp> struct scalar_cmp_op;
195
+ * \brief Template functors for comparison of two scalars
196
+ * \todo Implement packet-comparisons
197
+ */
198
+ template <typename LhsScalar, typename RhsScalar, ComparisonName cmp, bool UseTypedComparators = false>
199
+ struct scalar_cmp_op;
191
200
 
192
- template<typename LhsScalar, typename RhsScalar, ComparisonName cmp>
193
- struct functor_traits<scalar_cmp_op<LhsScalar,RhsScalar, cmp> > {
201
+ template <typename LhsScalar, typename RhsScalar, ComparisonName cmp, bool UseTypedComparators>
202
+ struct functor_traits<scalar_cmp_op<LhsScalar, RhsScalar, cmp, UseTypedComparators>> {
194
203
  enum {
195
- Cost = (NumTraits<LhsScalar>::AddCost+NumTraits<RhsScalar>::AddCost)/2,
196
- PacketAccess = false
204
+ Cost = (NumTraits<LhsScalar>::AddCost + NumTraits<RhsScalar>::AddCost) / 2,
205
+ PacketAccess = (UseTypedComparators || is_same<LhsScalar, bool>::value) && is_same<LhsScalar, RhsScalar>::value &&
206
+ packet_traits<LhsScalar>::HasCmp
197
207
  };
198
208
  };
199
209
 
200
- template<ComparisonName Cmp, typename LhsScalar, typename RhsScalar>
201
- struct result_of<scalar_cmp_op<LhsScalar, RhsScalar, Cmp>(LhsScalar,RhsScalar)> {
202
- typedef bool type;
210
+ template <typename LhsScalar, typename RhsScalar, bool UseTypedComparators>
211
+ struct scalar_cmp_op<LhsScalar, RhsScalar, cmp_EQ, UseTypedComparators> : binary_op_base<LhsScalar, RhsScalar> {
212
+ using result_type = std::conditional_t<UseTypedComparators, LhsScalar, bool>;
213
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator()(const LhsScalar& a, const RhsScalar& b) const {
214
+ return a == b ? result_type(1) : result_type(0);
215
+ }
216
+ template <typename Packet>
217
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const {
218
+ const Packet cst_one = pset1<Packet>(result_type(1));
219
+ return pand(pcmp_eq(a, b), cst_one);
220
+ }
203
221
  };
204
222
 
205
-
206
- template<typename LhsScalar, typename RhsScalar>
207
- struct scalar_cmp_op<LhsScalar,RhsScalar, cmp_EQ> : binary_op_base<LhsScalar,RhsScalar>
208
- {
209
- typedef bool result_type;
210
- EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op)
211
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator()(const LhsScalar& a, const RhsScalar& b) const {return a==b;}
212
- };
213
- template<typename LhsScalar, typename RhsScalar>
214
- struct scalar_cmp_op<LhsScalar,RhsScalar, cmp_LT> : binary_op_base<LhsScalar,RhsScalar>
215
- {
216
- typedef bool result_type;
217
- EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op)
218
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator()(const LhsScalar& a, const RhsScalar& b) const {return a<b;}
219
- };
220
- template<typename LhsScalar, typename RhsScalar>
221
- struct scalar_cmp_op<LhsScalar,RhsScalar, cmp_LE> : binary_op_base<LhsScalar,RhsScalar>
222
- {
223
- typedef bool result_type;
224
- EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op)
225
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator()(const LhsScalar& a, const RhsScalar& b) const {return a<=b;}
223
+ template <typename LhsScalar, typename RhsScalar, bool UseTypedComparators>
224
+ struct scalar_cmp_op<LhsScalar, RhsScalar, cmp_LT, UseTypedComparators> : binary_op_base<LhsScalar, RhsScalar> {
225
+ using result_type = std::conditional_t<UseTypedComparators, LhsScalar, bool>;
226
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator()(const LhsScalar& a, const RhsScalar& b) const {
227
+ return a < b ? result_type(1) : result_type(0);
228
+ }
229
+ template <typename Packet>
230
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const {
231
+ const Packet cst_one = pset1<Packet>(result_type(1));
232
+ return pand(pcmp_lt(a, b), cst_one);
233
+ }
226
234
  };
227
- template<typename LhsScalar, typename RhsScalar>
228
- struct scalar_cmp_op<LhsScalar,RhsScalar, cmp_GT> : binary_op_base<LhsScalar,RhsScalar>
229
- {
230
- typedef bool result_type;
231
- EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op)
232
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator()(const LhsScalar& a, const RhsScalar& b) const {return a>b;}
235
+
236
+ template <typename LhsScalar, typename RhsScalar, bool UseTypedComparators>
237
+ struct scalar_cmp_op<LhsScalar, RhsScalar, cmp_LE, UseTypedComparators> : binary_op_base<LhsScalar, RhsScalar> {
238
+ using result_type = std::conditional_t<UseTypedComparators, LhsScalar, bool>;
239
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator()(const LhsScalar& a, const RhsScalar& b) const {
240
+ return a <= b ? result_type(1) : result_type(0);
241
+ }
242
+ template <typename Packet>
243
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const {
244
+ const Packet cst_one = pset1<Packet>(result_type(1));
245
+ return pand(cst_one, pcmp_le(a, b));
246
+ }
233
247
  };
234
- template<typename LhsScalar, typename RhsScalar>
235
- struct scalar_cmp_op<LhsScalar,RhsScalar, cmp_GE> : binary_op_base<LhsScalar,RhsScalar>
236
- {
237
- typedef bool result_type;
238
- EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op)
239
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator()(const LhsScalar& a, const RhsScalar& b) const {return a>=b;}
248
+
249
+ template <typename LhsScalar, typename RhsScalar, bool UseTypedComparators>
250
+ struct scalar_cmp_op<LhsScalar, RhsScalar, cmp_GT, UseTypedComparators> : binary_op_base<LhsScalar, RhsScalar> {
251
+ using result_type = std::conditional_t<UseTypedComparators, LhsScalar, bool>;
252
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator()(const LhsScalar& a, const RhsScalar& b) const {
253
+ return a > b ? result_type(1) : result_type(0);
254
+ }
255
+ template <typename Packet>
256
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const {
257
+ const Packet cst_one = pset1<Packet>(result_type(1));
258
+ return pand(cst_one, pcmp_lt(b, a));
259
+ }
240
260
  };
241
- template<typename LhsScalar, typename RhsScalar>
242
- struct scalar_cmp_op<LhsScalar,RhsScalar, cmp_UNORD> : binary_op_base<LhsScalar,RhsScalar>
243
- {
244
- typedef bool result_type;
245
- EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op)
246
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator()(const LhsScalar& a, const RhsScalar& b) const {return !(a<=b || b<=a);}
261
+
262
+ template <typename LhsScalar, typename RhsScalar, bool UseTypedComparators>
263
+ struct scalar_cmp_op<LhsScalar, RhsScalar, cmp_GE, UseTypedComparators> : binary_op_base<LhsScalar, RhsScalar> {
264
+ using result_type = std::conditional_t<UseTypedComparators, LhsScalar, bool>;
265
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator()(const LhsScalar& a, const RhsScalar& b) const {
266
+ return a >= b ? result_type(1) : result_type(0);
267
+ }
268
+ template <typename Packet>
269
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const {
270
+ const Packet cst_one = pset1<Packet>(result_type(1));
271
+ return pand(cst_one, pcmp_le(b, a));
272
+ }
247
273
  };
248
- template<typename LhsScalar, typename RhsScalar>
249
- struct scalar_cmp_op<LhsScalar,RhsScalar, cmp_NEQ> : binary_op_base<LhsScalar,RhsScalar>
250
- {
251
- typedef bool result_type;
252
- EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op)
253
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator()(const LhsScalar& a, const RhsScalar& b) const {return a!=b;}
274
+
275
+ template <typename LhsScalar, typename RhsScalar, bool UseTypedComparators>
276
+ struct scalar_cmp_op<LhsScalar, RhsScalar, cmp_UNORD, UseTypedComparators> : binary_op_base<LhsScalar, RhsScalar> {
277
+ using result_type = std::conditional_t<UseTypedComparators, LhsScalar, bool>;
278
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator()(const LhsScalar& a, const RhsScalar& b) const {
279
+ return !(a <= b || b <= a) ? result_type(1) : result_type(0);
280
+ }
281
+ template <typename Packet>
282
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const {
283
+ const Packet cst_one = pset1<Packet>(result_type(1));
284
+ return pandnot(cst_one, por(pcmp_le(a, b), pcmp_le(b, a)));
285
+ }
254
286
  };
255
287
 
288
+ template <typename LhsScalar, typename RhsScalar, bool UseTypedComparators>
289
+ struct scalar_cmp_op<LhsScalar, RhsScalar, cmp_NEQ, UseTypedComparators> : binary_op_base<LhsScalar, RhsScalar> {
290
+ using result_type = std::conditional_t<UseTypedComparators, LhsScalar, bool>;
291
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator()(const LhsScalar& a, const RhsScalar& b) const {
292
+ return a != b ? result_type(1) : result_type(0);
293
+ }
294
+ template <typename Packet>
295
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const {
296
+ const Packet cst_one = pset1<Packet>(result_type(1));
297
+ return pandnot(cst_one, pcmp_eq(a, b));
298
+ }
299
+ };
256
300
 
257
301
  /** \internal
258
- * \brief Template functor to compute the hypot of two \b positive \b and \b real scalars
259
- *
260
- * \sa MatrixBase::stableNorm(), class Redux
261
- */
262
- template<typename Scalar>
263
- struct scalar_hypot_op<Scalar,Scalar> : binary_op_base<Scalar,Scalar>
264
- {
265
- EIGEN_EMPTY_STRUCT_CTOR(scalar_hypot_op)
266
-
267
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar &x, const Scalar &y) const
268
- {
302
+ * \brief Template functor to compute the hypot of two \b positive \b and \b real scalars
303
+ *
304
+ * \sa MatrixBase::stableNorm(), class Redux
305
+ */
306
+ template <typename Scalar>
307
+ struct scalar_hypot_op<Scalar, Scalar> : binary_op_base<Scalar, Scalar> {
308
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& x, const Scalar& y) const {
269
309
  // This functor is used by hypotNorm only for which it is faster to first apply abs
270
310
  // on all coefficients prior to reduction through hypot.
271
311
  // This way we avoid calling abs on positive and real entries, and this also permits
272
312
  // to seamlessly handle complexes. Otherwise we would have to handle both real and complexes
273
313
  // through the same functor...
274
- return internal::positive_real_hypot(x,y);
314
+ return internal::positive_real_hypot(x, y);
275
315
  }
276
316
  };
277
- template<typename Scalar>
278
- struct functor_traits<scalar_hypot_op<Scalar,Scalar> > {
279
- enum
280
- {
281
- Cost = 3 * NumTraits<Scalar>::AddCost +
282
- 2 * NumTraits<Scalar>::MulCost +
283
- 2 * scalar_div_cost<Scalar,false>::value,
317
+ template <typename Scalar>
318
+ struct functor_traits<scalar_hypot_op<Scalar, Scalar>> {
319
+ enum {
320
+ Cost = 3 * NumTraits<Scalar>::AddCost + 2 * NumTraits<Scalar>::MulCost + 2 * scalar_div_cost<Scalar, false>::value,
284
321
  PacketAccess = false
285
322
  };
286
323
  };
287
324
 
288
325
  /** \internal
289
- * \brief Template functor to compute the pow of two scalars
290
- */
291
- template<typename Scalar, typename Exponent>
292
- struct scalar_pow_op : binary_op_base<Scalar,Exponent>
293
- {
294
- typedef typename ScalarBinaryOpTraits<Scalar,Exponent,scalar_pow_op>::ReturnType result_type;
295
- #ifndef EIGEN_SCALAR_BINARY_OP_PLUGIN
296
- EIGEN_EMPTY_STRUCT_CTOR(scalar_pow_op)
297
- #else
326
+ * \brief Template functor to compute the pow of two scalars
327
+ * See the specification of pow in https://en.cppreference.com/w/cpp/numeric/math/pow
328
+ */
329
+ template <typename Scalar, typename Exponent>
330
+ struct scalar_pow_op : binary_op_base<Scalar, Exponent> {
331
+ typedef typename ScalarBinaryOpTraits<Scalar, Exponent, scalar_pow_op>::ReturnType result_type;
332
+ #ifdef EIGEN_SCALAR_BINARY_OP_PLUGIN
298
333
  scalar_pow_op() {
299
334
  typedef Scalar LhsScalar;
300
335
  typedef Exponent RhsScalar;
301
336
  EIGEN_SCALAR_BINARY_OP_PLUGIN
302
337
  }
303
338
  #endif
304
- EIGEN_DEVICE_FUNC
305
- inline result_type operator() (const Scalar& a, const Exponent& b) const { return numext::pow(a, b); }
306
- };
307
- template<typename Scalar, typename Exponent>
308
- struct functor_traits<scalar_pow_op<Scalar,Exponent> > {
309
- enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = false };
310
- };
311
339
 
340
+ EIGEN_DEVICE_FUNC inline result_type operator()(const Scalar& a, const Exponent& b) const {
341
+ return numext::pow(a, b);
342
+ }
312
343
 
344
+ template <typename Packet>
345
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const {
346
+ return generic_pow(a, b);
347
+ }
348
+ };
349
+
350
+ template <typename Scalar, typename Exponent>
351
+ struct functor_traits<scalar_pow_op<Scalar, Exponent>> {
352
+ enum {
353
+ Cost = 5 * NumTraits<Scalar>::MulCost,
354
+ PacketAccess = (!NumTraits<Scalar>::IsComplex && !NumTraits<Scalar>::IsInteger && packet_traits<Scalar>::HasPow)
355
+ };
356
+ };
313
357
 
314
358
  //---------- non associative binary functors ----------
315
359
 
316
360
  /** \internal
317
- * \brief Template functor to compute the difference of two scalars
318
- *
319
- * \sa class CwiseBinaryOp, MatrixBase::operator-
320
- */
321
- template<typename LhsScalar,typename RhsScalar>
322
- struct scalar_difference_op : binary_op_base<LhsScalar,RhsScalar>
323
- {
324
- typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_difference_op>::ReturnType result_type;
325
- #ifndef EIGEN_SCALAR_BINARY_OP_PLUGIN
326
- EIGEN_EMPTY_STRUCT_CTOR(scalar_difference_op)
327
- #else
328
- scalar_difference_op() {
329
- EIGEN_SCALAR_BINARY_OP_PLUGIN
330
- }
361
+ * \brief Template functor to compute the difference of two scalars
362
+ *
363
+ * \sa class CwiseBinaryOp, MatrixBase::operator-
364
+ */
365
+ template <typename LhsScalar, typename RhsScalar>
366
+ struct scalar_difference_op : binary_op_base<LhsScalar, RhsScalar> {
367
+ typedef typename ScalarBinaryOpTraits<LhsScalar, RhsScalar, scalar_difference_op>::ReturnType result_type;
368
+ #ifdef EIGEN_SCALAR_BINARY_OP_PLUGIN
369
+ scalar_difference_op(){EIGEN_SCALAR_BINARY_OP_PLUGIN}
331
370
  #endif
332
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const { return a - b; }
333
- template<typename Packet>
334
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const
335
- { return internal::psub(a,b); }
371
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type
372
+ operator()(const LhsScalar& a, const RhsScalar& b) const {
373
+ return a - b;
374
+ }
375
+ template <typename Packet>
376
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const {
377
+ return internal::psub(a, b);
378
+ }
336
379
  };
337
- template<typename LhsScalar,typename RhsScalar>
338
- struct functor_traits<scalar_difference_op<LhsScalar,RhsScalar> > {
380
+ template <typename LhsScalar, typename RhsScalar>
381
+ struct functor_traits<scalar_difference_op<LhsScalar, RhsScalar>> {
339
382
  enum {
340
- Cost = (NumTraits<LhsScalar>::AddCost+NumTraits<RhsScalar>::AddCost)/2,
341
- PacketAccess = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasSub && packet_traits<RhsScalar>::HasSub
383
+ Cost = (int(NumTraits<LhsScalar>::AddCost) + int(NumTraits<RhsScalar>::AddCost)) / 2,
384
+ PacketAccess =
385
+ is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasSub && packet_traits<RhsScalar>::HasSub
342
386
  };
343
387
  };
344
388
 
345
- /** \internal
346
- * \brief Template functor to compute the quotient of two scalars
347
- *
348
- * \sa class CwiseBinaryOp, Cwise::operator/()
349
- */
350
- template<typename LhsScalar,typename RhsScalar>
351
- struct scalar_quotient_op : binary_op_base<LhsScalar,RhsScalar>
352
- {
353
- typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_quotient_op>::ReturnType result_type;
354
- #ifndef EIGEN_SCALAR_BINARY_OP_PLUGIN
355
- EIGEN_EMPTY_STRUCT_CTOR(scalar_quotient_op)
356
- #else
357
- scalar_quotient_op() {
358
- EIGEN_SCALAR_BINARY_OP_PLUGIN
389
+ template <typename Packet, bool IsInteger = NumTraits<typename unpacket_traits<Packet>::type>::IsInteger>
390
+ struct maybe_raise_div_by_zero {
391
+ static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Packet x) { EIGEN_UNUSED_VARIABLE(x); }
392
+ };
393
+
394
+ #ifndef EIGEN_GPU_COMPILE_PHASE
395
+ template <typename Packet>
396
+ struct maybe_raise_div_by_zero<Packet, true> {
397
+ static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Packet x) {
398
+ if (EIGEN_PREDICT_FALSE(predux_any(pcmp_eq(x, pzero(x))))) {
399
+ // Use volatile variables to force a division by zero, which will
400
+ // result in the default platform behaviour (usually SIGFPE).
401
+ volatile typename unpacket_traits<Packet>::type zero = 0;
402
+ volatile typename unpacket_traits<Packet>::type val = 1;
403
+ val = val / zero;
404
+ }
359
405
  }
406
+ };
407
+ #endif
408
+
409
+ /** \internal
410
+ * \brief Template functor to compute the quotient of two scalars
411
+ *
412
+ * \sa class CwiseBinaryOp, Cwise::operator/()
413
+ */
414
+ template <typename LhsScalar, typename RhsScalar>
415
+ struct scalar_quotient_op : binary_op_base<LhsScalar, RhsScalar> {
416
+ typedef typename ScalarBinaryOpTraits<LhsScalar, RhsScalar, scalar_quotient_op>::ReturnType result_type;
417
+ #ifdef EIGEN_SCALAR_BINARY_OP_PLUGIN
418
+ scalar_quotient_op(){EIGEN_SCALAR_BINARY_OP_PLUGIN}
360
419
  #endif
361
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const { return a / b; }
362
- template<typename Packet>
363
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const
364
- { return internal::pdiv(a,b); }
365
- };
366
- template<typename LhsScalar,typename RhsScalar>
367
- struct functor_traits<scalar_quotient_op<LhsScalar,RhsScalar> > {
368
- typedef typename scalar_quotient_op<LhsScalar,RhsScalar>::result_type result_type;
420
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type
421
+ operator()(const LhsScalar& a, const RhsScalar& b) const {
422
+ return a / b;
423
+ }
424
+ template <typename Packet>
425
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const {
426
+ return internal::pdiv(a, b);
427
+ }
428
+ };
429
+ template <typename LhsScalar, typename RhsScalar>
430
+ struct functor_traits<scalar_quotient_op<LhsScalar, RhsScalar>> {
431
+ typedef typename scalar_quotient_op<LhsScalar, RhsScalar>::result_type result_type;
369
432
  enum {
370
- PacketAccess = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasDiv && packet_traits<RhsScalar>::HasDiv,
371
- Cost = scalar_div_cost<result_type,PacketAccess>::value
433
+ PacketAccess =
434
+ is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasDiv && packet_traits<RhsScalar>::HasDiv,
435
+ Cost = scalar_div_cost<result_type, PacketAccess>::value
372
436
  };
373
437
  };
374
438
 
375
-
376
-
377
439
  /** \internal
378
- * \brief Template functor to compute the and of two booleans
379
- *
380
- * \sa class CwiseBinaryOp, ArrayBase::operator&&
381
- */
440
+ * \brief Template functor to compute the and of two scalars as if they were booleans
441
+ *
442
+ * \sa class CwiseBinaryOp, ArrayBase::operator&&
443
+ */
444
+ template <typename Scalar>
382
445
  struct scalar_boolean_and_op {
383
- EIGEN_EMPTY_STRUCT_CTOR(scalar_boolean_and_op)
384
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator() (const bool& a, const bool& b) const { return a && b; }
446
+ using result_type = Scalar;
447
+ // `false` any value `a` that satisfies `a == Scalar(0)`
448
+ // `true` is the complement of `false`
449
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar& a, const Scalar& b) const {
450
+ return (a != Scalar(0)) && (b != Scalar(0)) ? Scalar(1) : Scalar(0);
451
+ }
452
+ template <typename Packet>
453
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const {
454
+ const Packet cst_one = pset1<Packet>(Scalar(1));
455
+ // and(a,b) == !or(!a,!b)
456
+ Packet not_a = pcmp_eq(a, pzero(a));
457
+ Packet not_b = pcmp_eq(b, pzero(b));
458
+ Packet a_nand_b = por(not_a, not_b);
459
+ return pandnot(cst_one, a_nand_b);
460
+ }
385
461
  };
386
- template<> struct functor_traits<scalar_boolean_and_op> {
387
- enum {
388
- Cost = NumTraits<bool>::AddCost,
389
- PacketAccess = false
390
- };
462
+ template <typename Scalar>
463
+ struct functor_traits<scalar_boolean_and_op<Scalar>> {
464
+ enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = packet_traits<Scalar>::HasCmp };
391
465
  };
392
466
 
393
467
  /** \internal
394
- * \brief Template functor to compute the or of two booleans
395
- *
396
- * \sa class CwiseBinaryOp, ArrayBase::operator||
397
- */
468
+ * \brief Template functor to compute the or of two scalars as if they were booleans
469
+ *
470
+ * \sa class CwiseBinaryOp, ArrayBase::operator||
471
+ */
472
+ template <typename Scalar>
398
473
  struct scalar_boolean_or_op {
399
- EIGEN_EMPTY_STRUCT_CTOR(scalar_boolean_or_op)
400
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator() (const bool& a, const bool& b) const { return a || b; }
474
+ using result_type = Scalar;
475
+ // `false` any value `a` that satisfies `a == Scalar(0)`
476
+ // `true` is the complement of `false`
477
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar& a, const Scalar& b) const {
478
+ return (a != Scalar(0)) || (b != Scalar(0)) ? Scalar(1) : Scalar(0);
479
+ }
480
+ template <typename Packet>
481
+ EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const {
482
+ const Packet cst_one = pset1<Packet>(Scalar(1));
483
+ // if or(a,b) == 0, then a == 0 and b == 0
484
+ // or(a,b) == !nor(a,b)
485
+ Packet a_nor_b = pcmp_eq(por(a, b), pzero(a));
486
+ return pandnot(cst_one, a_nor_b);
487
+ }
401
488
  };
402
- template<> struct functor_traits<scalar_boolean_or_op> {
403
- enum {
404
- Cost = NumTraits<bool>::AddCost,
405
- PacketAccess = false
406
- };
489
+ template <typename Scalar>
490
+ struct functor_traits<scalar_boolean_or_op<Scalar>> {
491
+ enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = packet_traits<Scalar>::HasCmp };
407
492
  };
408
493
 
409
494
  /** \internal
410
- * \brief Template functor to compute the xor of two booleans
495
+ * \brief Template functor to compute the xor of two scalars as if they were booleans
411
496
  *
412
497
  * \sa class CwiseBinaryOp, ArrayBase::operator^
413
498
  */
499
+ template <typename Scalar>
414
500
  struct scalar_boolean_xor_op {
415
- EIGEN_EMPTY_STRUCT_CTOR(scalar_boolean_xor_op)
416
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator() (const bool& a, const bool& b) const { return a ^ b; }
501
+ using result_type = Scalar;
502
+ // `false` any value `a` that satisfies `a == Scalar(0)`
503
+ // `true` is the complement of `false`
504
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar& a, const Scalar& b) const {
505
+ return (a != Scalar(0)) != (b != Scalar(0)) ? Scalar(1) : Scalar(0);
506
+ }
507
+ template <typename Packet>
508
+ EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const {
509
+ const Packet cst_one = pset1<Packet>(Scalar(1));
510
+ // xor(a,b) == xor(!a,!b)
511
+ Packet not_a = pcmp_eq(a, pzero(a));
512
+ Packet not_b = pcmp_eq(b, pzero(b));
513
+ Packet a_xor_b = pxor(not_a, not_b);
514
+ return pand(cst_one, a_xor_b);
515
+ }
516
+ };
517
+ template <typename Scalar>
518
+ struct functor_traits<scalar_boolean_xor_op<Scalar>> {
519
+ enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = packet_traits<Scalar>::HasCmp };
520
+ };
521
+
522
+ template <typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
523
+ struct bitwise_binary_impl {
524
+ static constexpr size_t Size = sizeof(Scalar);
525
+ using uint_t = typename numext::get_integer_by_size<Size>::unsigned_type;
526
+ static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_and(const Scalar& a, const Scalar& b) {
527
+ uint_t a_as_uint = numext::bit_cast<uint_t, Scalar>(a);
528
+ uint_t b_as_uint = numext::bit_cast<uint_t, Scalar>(b);
529
+ uint_t result = a_as_uint & b_as_uint;
530
+ return numext::bit_cast<Scalar, uint_t>(result);
531
+ }
532
+ static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_or(const Scalar& a, const Scalar& b) {
533
+ uint_t a_as_uint = numext::bit_cast<uint_t, Scalar>(a);
534
+ uint_t b_as_uint = numext::bit_cast<uint_t, Scalar>(b);
535
+ uint_t result = a_as_uint | b_as_uint;
536
+ return numext::bit_cast<Scalar, uint_t>(result);
537
+ }
538
+ static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_xor(const Scalar& a, const Scalar& b) {
539
+ uint_t a_as_uint = numext::bit_cast<uint_t, Scalar>(a);
540
+ uint_t b_as_uint = numext::bit_cast<uint_t, Scalar>(b);
541
+ uint_t result = a_as_uint ^ b_as_uint;
542
+ return numext::bit_cast<Scalar, uint_t>(result);
543
+ }
417
544
  };
418
- template<> struct functor_traits<scalar_boolean_xor_op> {
545
+
546
+ template <typename Scalar>
547
+ struct bitwise_binary_impl<Scalar, true> {
548
+ using Real = typename NumTraits<Scalar>::Real;
549
+ static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_and(const Scalar& a, const Scalar& b) {
550
+ Real real_result = bitwise_binary_impl<Real>::run_and(numext::real(a), numext::real(b));
551
+ Real imag_result = bitwise_binary_impl<Real>::run_and(numext::imag(a), numext::imag(b));
552
+ return Scalar(real_result, imag_result);
553
+ }
554
+ static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_or(const Scalar& a, const Scalar& b) {
555
+ Real real_result = bitwise_binary_impl<Real>::run_or(numext::real(a), numext::real(b));
556
+ Real imag_result = bitwise_binary_impl<Real>::run_or(numext::imag(a), numext::imag(b));
557
+ return Scalar(real_result, imag_result);
558
+ }
559
+ static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_xor(const Scalar& a, const Scalar& b) {
560
+ Real real_result = bitwise_binary_impl<Real>::run_xor(numext::real(a), numext::real(b));
561
+ Real imag_result = bitwise_binary_impl<Real>::run_xor(numext::imag(a), numext::imag(b));
562
+ return Scalar(real_result, imag_result);
563
+ }
564
+ };
565
+
566
+ /** \internal
567
+ * \brief Template functor to compute the bitwise and of two scalars
568
+ *
569
+ * \sa class CwiseBinaryOp, ArrayBase::operator&
570
+ */
571
+ template <typename Scalar>
572
+ struct scalar_bitwise_and_op {
573
+ EIGEN_STATIC_ASSERT(!NumTraits<Scalar>::RequireInitialization,
574
+ BITWISE OPERATIONS MAY ONLY BE PERFORMED ON PLAIN DATA TYPES)
575
+ EIGEN_STATIC_ASSERT((!internal::is_same<Scalar, bool>::value), DONT USE BITWISE OPS ON BOOLEAN TYPES)
576
+ using result_type = Scalar;
577
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar& a, const Scalar& b) const {
578
+ return bitwise_binary_impl<Scalar>::run_and(a, b);
579
+ }
580
+ template <typename Packet>
581
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const {
582
+ return pand(a, b);
583
+ }
584
+ };
585
+ template <typename Scalar>
586
+ struct functor_traits<scalar_bitwise_and_op<Scalar>> {
587
+ enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = true };
588
+ };
589
+
590
+ /** \internal
591
+ * \brief Template functor to compute the bitwise or of two scalars
592
+ *
593
+ * \sa class CwiseBinaryOp, ArrayBase::operator|
594
+ */
595
+ template <typename Scalar>
596
+ struct scalar_bitwise_or_op {
597
+ EIGEN_STATIC_ASSERT(!NumTraits<Scalar>::RequireInitialization,
598
+ BITWISE OPERATIONS MAY ONLY BE PERFORMED ON PLAIN DATA TYPES)
599
+ EIGEN_STATIC_ASSERT((!internal::is_same<Scalar, bool>::value), DONT USE BITWISE OPS ON BOOLEAN TYPES)
600
+ using result_type = Scalar;
601
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar& a, const Scalar& b) const {
602
+ return bitwise_binary_impl<Scalar>::run_or(a, b);
603
+ }
604
+ template <typename Packet>
605
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const {
606
+ return por(a, b);
607
+ }
608
+ };
609
+ template <typename Scalar>
610
+ struct functor_traits<scalar_bitwise_or_op<Scalar>> {
611
+ enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = true };
612
+ };
613
+
614
+ /** \internal
615
+ * \brief Template functor to compute the bitwise xor of two scalars
616
+ *
617
+ * \sa class CwiseBinaryOp, ArrayBase::operator^
618
+ */
619
+ template <typename Scalar>
620
+ struct scalar_bitwise_xor_op {
621
+ EIGEN_STATIC_ASSERT(!NumTraits<Scalar>::RequireInitialization,
622
+ BITWISE OPERATIONS MAY ONLY BE PERFORMED ON PLAIN DATA TYPES)
623
+ EIGEN_STATIC_ASSERT((!internal::is_same<Scalar, bool>::value), DONT USE BITWISE OPS ON BOOLEAN TYPES)
624
+ using result_type = Scalar;
625
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar& a, const Scalar& b) const {
626
+ return bitwise_binary_impl<Scalar>::run_xor(a, b);
627
+ }
628
+ template <typename Packet>
629
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const {
630
+ return pxor(a, b);
631
+ }
632
+ };
633
+ template <typename Scalar>
634
+ struct functor_traits<scalar_bitwise_xor_op<Scalar>> {
635
+ enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = true };
636
+ };
637
+
638
+ /** \internal
639
+ * \brief Template functor to compute the absolute difference of two scalars
640
+ *
641
+ * \sa class CwiseBinaryOp, MatrixBase::absolute_difference
642
+ */
643
+ template <typename LhsScalar, typename RhsScalar>
644
+ struct scalar_absolute_difference_op : binary_op_base<LhsScalar, RhsScalar> {
645
+ typedef typename ScalarBinaryOpTraits<LhsScalar, RhsScalar, scalar_absolute_difference_op>::ReturnType result_type;
646
+ #ifdef EIGEN_SCALAR_BINARY_OP_PLUGIN
647
+ scalar_absolute_difference_op(){EIGEN_SCALAR_BINARY_OP_PLUGIN}
648
+ #endif
649
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type
650
+ operator()(const LhsScalar& a, const RhsScalar& b) const {
651
+ return numext::absdiff(a, b);
652
+ }
653
+ template <typename Packet>
654
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const {
655
+ return internal::pabsdiff(a, b);
656
+ }
657
+ };
658
+ template <typename LhsScalar, typename RhsScalar>
659
+ struct functor_traits<scalar_absolute_difference_op<LhsScalar, RhsScalar>> {
419
660
  enum {
420
- Cost = NumTraits<bool>::AddCost,
421
- PacketAccess = false
661
+ Cost = (NumTraits<LhsScalar>::AddCost + NumTraits<RhsScalar>::AddCost) / 2,
662
+ PacketAccess = is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasAbsDiff
422
663
  };
423
664
  };
424
665
 
666
+ template <typename LhsScalar, typename RhsScalar>
667
+ struct scalar_atan2_op {
668
+ using Scalar = LhsScalar;
669
+
670
+ static constexpr bool Enable =
671
+ is_same<LhsScalar, RhsScalar>::value && !NumTraits<Scalar>::IsInteger && !NumTraits<Scalar>::IsComplex;
672
+ EIGEN_STATIC_ASSERT(Enable, "LhsScalar and RhsScalar must be the same non-integer, non-complex type")
673
+
674
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar& y, const Scalar& x) const {
675
+ return numext::atan2(y, x);
676
+ }
677
+ template <typename Packet>
678
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& y, const Packet& x) const {
679
+ return internal::patan2(y, x);
680
+ }
681
+ };
425
682
 
683
+ template <typename LhsScalar, typename RhsScalar>
684
+ struct functor_traits<scalar_atan2_op<LhsScalar, RhsScalar>> {
685
+ using Scalar = LhsScalar;
686
+ enum {
687
+ PacketAccess = is_same<LhsScalar, RhsScalar>::value && packet_traits<Scalar>::HasATan &&
688
+ packet_traits<Scalar>::HasDiv && !NumTraits<Scalar>::IsInteger && !NumTraits<Scalar>::IsComplex,
689
+ Cost = int(scalar_div_cost<Scalar, PacketAccess>::value) + int(functor_traits<scalar_atan_op<Scalar>>::Cost)
690
+ };
691
+ };
426
692
 
427
693
  //---------- binary functors bound to a constant, thus appearing as a unary functor ----------
428
694
 
429
- // The following two classes permits to turn any binary functor into a unary one with one argument bound to a constant value.
430
- // They are analogues to std::binder1st/binder2nd but with the following differences:
695
+ // The following two classes permits to turn any binary functor into a unary one with one argument bound to a constant
696
+ // value. They are analogues to std::binder1st/binder2nd but with the following differences:
431
697
  // - they are compatible with packetOp
432
698
  // - they are portable across C++ versions (the std::binder* are deprecated in C++11)
433
- template<typename BinaryOp> struct bind1st_op : BinaryOp {
434
-
435
- typedef typename BinaryOp::first_argument_type first_argument_type;
699
+ template <typename BinaryOp>
700
+ struct bind1st_op : BinaryOp {
701
+ typedef typename BinaryOp::first_argument_type first_argument_type;
436
702
  typedef typename BinaryOp::second_argument_type second_argument_type;
437
- typedef typename BinaryOp::result_type result_type;
703
+ typedef typename BinaryOp::result_type result_type;
438
704
 
439
- bind1st_op(const first_argument_type &val) : m_value(val) {}
705
+ EIGEN_DEVICE_FUNC explicit bind1st_op(const first_argument_type& val) : m_value(val) {}
440
706
 
441
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const second_argument_type& b) const { return BinaryOp::operator()(m_value,b); }
707
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator()(const second_argument_type& b) const {
708
+ return BinaryOp::operator()(m_value, b);
709
+ }
442
710
 
443
- template<typename Packet>
444
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& b) const
445
- { return BinaryOp::packetOp(internal::pset1<Packet>(m_value), b); }
711
+ template <typename Packet>
712
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& b) const {
713
+ return BinaryOp::packetOp(internal::pset1<Packet>(m_value), b);
714
+ }
446
715
 
447
716
  first_argument_type m_value;
448
717
  };
449
- template<typename BinaryOp> struct functor_traits<bind1st_op<BinaryOp> > : functor_traits<BinaryOp> {};
718
+ template <typename BinaryOp>
719
+ struct functor_traits<bind1st_op<BinaryOp>> : functor_traits<BinaryOp> {};
450
720
 
451
-
452
- template<typename BinaryOp> struct bind2nd_op : BinaryOp {
453
-
454
- typedef typename BinaryOp::first_argument_type first_argument_type;
721
+ template <typename BinaryOp>
722
+ struct bind2nd_op : BinaryOp {
723
+ typedef typename BinaryOp::first_argument_type first_argument_type;
455
724
  typedef typename BinaryOp::second_argument_type second_argument_type;
456
- typedef typename BinaryOp::result_type result_type;
725
+ typedef typename BinaryOp::result_type result_type;
457
726
 
458
- bind2nd_op(const second_argument_type &val) : m_value(val) {}
727
+ EIGEN_DEVICE_FUNC explicit bind2nd_op(const second_argument_type& val) : m_value(val) {}
459
728
 
460
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const first_argument_type& a) const { return BinaryOp::operator()(a,m_value); }
729
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator()(const first_argument_type& a) const {
730
+ return BinaryOp::operator()(a, m_value);
731
+ }
461
732
 
462
- template<typename Packet>
463
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
464
- { return BinaryOp::packetOp(a,internal::pset1<Packet>(m_value)); }
733
+ template <typename Packet>
734
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const {
735
+ return BinaryOp::packetOp(a, internal::pset1<Packet>(m_value));
736
+ }
465
737
 
466
738
  second_argument_type m_value;
467
739
  };
468
- template<typename BinaryOp> struct functor_traits<bind2nd_op<BinaryOp> > : functor_traits<BinaryOp> {};
469
-
740
+ template <typename BinaryOp>
741
+ struct functor_traits<bind2nd_op<BinaryOp>> : functor_traits<BinaryOp> {};
470
742
 
471
- } // end namespace internal
743
+ } // end namespace internal
472
744
 
473
- } // end namespace Eigen
745
+ } // end namespace Eigen
474
746
 
475
- #endif // EIGEN_BINARY_FUNCTORS_H
747
+ #endif // EIGEN_BINARY_FUNCTORS_H