@smake/eigen 1.1.0 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (431) hide show
  1. package/README.md +1 -1
  2. package/eigen/Eigen/AccelerateSupport +52 -0
  3. package/eigen/Eigen/Cholesky +18 -20
  4. package/eigen/Eigen/CholmodSupport +28 -28
  5. package/eigen/Eigen/Core +187 -120
  6. package/eigen/Eigen/Eigenvalues +16 -13
  7. package/eigen/Eigen/Geometry +18 -18
  8. package/eigen/Eigen/Householder +9 -7
  9. package/eigen/Eigen/IterativeLinearSolvers +8 -4
  10. package/eigen/Eigen/Jacobi +14 -13
  11. package/eigen/Eigen/KLUSupport +23 -21
  12. package/eigen/Eigen/LU +15 -16
  13. package/eigen/Eigen/MetisSupport +12 -12
  14. package/eigen/Eigen/OrderingMethods +54 -51
  15. package/eigen/Eigen/PaStiXSupport +23 -21
  16. package/eigen/Eigen/PardisoSupport +17 -14
  17. package/eigen/Eigen/QR +18 -20
  18. package/eigen/Eigen/QtAlignedMalloc +5 -12
  19. package/eigen/Eigen/SPQRSupport +21 -14
  20. package/eigen/Eigen/SVD +23 -17
  21. package/eigen/Eigen/Sparse +1 -2
  22. package/eigen/Eigen/SparseCholesky +18 -15
  23. package/eigen/Eigen/SparseCore +18 -17
  24. package/eigen/Eigen/SparseLU +9 -9
  25. package/eigen/Eigen/SparseQR +16 -14
  26. package/eigen/Eigen/StdDeque +5 -2
  27. package/eigen/Eigen/StdList +5 -2
  28. package/eigen/Eigen/StdVector +5 -2
  29. package/eigen/Eigen/SuperLUSupport +30 -24
  30. package/eigen/Eigen/ThreadPool +80 -0
  31. package/eigen/Eigen/UmfPackSupport +19 -17
  32. package/eigen/Eigen/Version +14 -0
  33. package/eigen/Eigen/src/AccelerateSupport/AccelerateSupport.h +423 -0
  34. package/eigen/Eigen/src/AccelerateSupport/InternalHeaderCheck.h +3 -0
  35. package/eigen/Eigen/src/Cholesky/InternalHeaderCheck.h +3 -0
  36. package/eigen/Eigen/src/Cholesky/LDLT.h +366 -405
  37. package/eigen/Eigen/src/Cholesky/LLT.h +323 -367
  38. package/eigen/Eigen/src/Cholesky/LLT_LAPACKE.h +81 -56
  39. package/eigen/Eigen/src/CholmodSupport/CholmodSupport.h +585 -529
  40. package/eigen/Eigen/src/CholmodSupport/InternalHeaderCheck.h +3 -0
  41. package/eigen/Eigen/src/Core/ArithmeticSequence.h +143 -317
  42. package/eigen/Eigen/src/Core/Array.h +329 -370
  43. package/eigen/Eigen/src/Core/ArrayBase.h +190 -203
  44. package/eigen/Eigen/src/Core/ArrayWrapper.h +126 -170
  45. package/eigen/Eigen/src/Core/Assign.h +30 -40
  46. package/eigen/Eigen/src/Core/AssignEvaluator.h +651 -604
  47. package/eigen/Eigen/src/Core/Assign_MKL.h +125 -120
  48. package/eigen/Eigen/src/Core/BandMatrix.h +267 -282
  49. package/eigen/Eigen/src/Core/Block.h +371 -390
  50. package/eigen/Eigen/src/Core/CommaInitializer.h +85 -100
  51. package/eigen/Eigen/src/Core/ConditionEstimator.h +51 -53
  52. package/eigen/Eigen/src/Core/CoreEvaluators.h +1214 -937
  53. package/eigen/Eigen/src/Core/CoreIterators.h +72 -63
  54. package/eigen/Eigen/src/Core/CwiseBinaryOp.h +112 -129
  55. package/eigen/Eigen/src/Core/CwiseNullaryOp.h +676 -702
  56. package/eigen/Eigen/src/Core/CwiseTernaryOp.h +77 -103
  57. package/eigen/Eigen/src/Core/CwiseUnaryOp.h +55 -67
  58. package/eigen/Eigen/src/Core/CwiseUnaryView.h +127 -92
  59. package/eigen/Eigen/src/Core/DenseBase.h +630 -658
  60. package/eigen/Eigen/src/Core/DenseCoeffsBase.h +511 -628
  61. package/eigen/Eigen/src/Core/DenseStorage.h +511 -590
  62. package/eigen/Eigen/src/Core/DeviceWrapper.h +153 -0
  63. package/eigen/Eigen/src/Core/Diagonal.h +168 -207
  64. package/eigen/Eigen/src/Core/DiagonalMatrix.h +346 -317
  65. package/eigen/Eigen/src/Core/DiagonalProduct.h +12 -10
  66. package/eigen/Eigen/src/Core/Dot.h +167 -217
  67. package/eigen/Eigen/src/Core/EigenBase.h +74 -85
  68. package/eigen/Eigen/src/Core/Fill.h +138 -0
  69. package/eigen/Eigen/src/Core/FindCoeff.h +464 -0
  70. package/eigen/Eigen/src/Core/ForceAlignedAccess.h +90 -113
  71. package/eigen/Eigen/src/Core/Fuzzy.h +82 -105
  72. package/eigen/Eigen/src/Core/GeneralProduct.h +315 -261
  73. package/eigen/Eigen/src/Core/GenericPacketMath.h +1182 -520
  74. package/eigen/Eigen/src/Core/GlobalFunctions.h +193 -157
  75. package/eigen/Eigen/src/Core/IO.h +131 -156
  76. package/eigen/Eigen/src/Core/IndexedView.h +209 -125
  77. package/eigen/Eigen/src/Core/InnerProduct.h +260 -0
  78. package/eigen/Eigen/src/Core/InternalHeaderCheck.h +3 -0
  79. package/eigen/Eigen/src/Core/Inverse.h +50 -59
  80. package/eigen/Eigen/src/Core/Map.h +123 -141
  81. package/eigen/Eigen/src/Core/MapBase.h +255 -282
  82. package/eigen/Eigen/src/Core/MathFunctions.h +1247 -1201
  83. package/eigen/Eigen/src/Core/MathFunctionsImpl.h +162 -99
  84. package/eigen/Eigen/src/Core/Matrix.h +463 -494
  85. package/eigen/Eigen/src/Core/MatrixBase.h +468 -470
  86. package/eigen/Eigen/src/Core/NestByValue.h +58 -52
  87. package/eigen/Eigen/src/Core/NoAlias.h +79 -86
  88. package/eigen/Eigen/src/Core/NumTraits.h +206 -206
  89. package/eigen/Eigen/src/Core/PartialReduxEvaluator.h +163 -142
  90. package/eigen/Eigen/src/Core/PermutationMatrix.h +461 -511
  91. package/eigen/Eigen/src/Core/PlainObjectBase.h +858 -972
  92. package/eigen/Eigen/src/Core/Product.h +246 -130
  93. package/eigen/Eigen/src/Core/ProductEvaluators.h +779 -671
  94. package/eigen/Eigen/src/Core/Random.h +153 -164
  95. package/eigen/Eigen/src/Core/RandomImpl.h +262 -0
  96. package/eigen/Eigen/src/Core/RealView.h +250 -0
  97. package/eigen/Eigen/src/Core/Redux.h +334 -314
  98. package/eigen/Eigen/src/Core/Ref.h +259 -257
  99. package/eigen/Eigen/src/Core/Replicate.h +92 -104
  100. package/eigen/Eigen/src/Core/Reshaped.h +215 -271
  101. package/eigen/Eigen/src/Core/ReturnByValue.h +47 -55
  102. package/eigen/Eigen/src/Core/Reverse.h +133 -148
  103. package/eigen/Eigen/src/Core/Select.h +68 -140
  104. package/eigen/Eigen/src/Core/SelfAdjointView.h +254 -290
  105. package/eigen/Eigen/src/Core/SelfCwiseBinaryOp.h +23 -20
  106. package/eigen/Eigen/src/Core/SkewSymmetricMatrix3.h +382 -0
  107. package/eigen/Eigen/src/Core/Solve.h +88 -102
  108. package/eigen/Eigen/src/Core/SolveTriangular.h +126 -124
  109. package/eigen/Eigen/src/Core/SolverBase.h +132 -133
  110. package/eigen/Eigen/src/Core/StableNorm.h +113 -147
  111. package/eigen/Eigen/src/Core/StlIterators.h +404 -248
  112. package/eigen/Eigen/src/Core/Stride.h +90 -92
  113. package/eigen/Eigen/src/Core/Swap.h +70 -39
  114. package/eigen/Eigen/src/Core/Transpose.h +258 -295
  115. package/eigen/Eigen/src/Core/Transpositions.h +270 -333
  116. package/eigen/Eigen/src/Core/TriangularMatrix.h +642 -743
  117. package/eigen/Eigen/src/Core/VectorBlock.h +59 -72
  118. package/eigen/Eigen/src/Core/VectorwiseOp.h +653 -704
  119. package/eigen/Eigen/src/Core/Visitor.h +464 -308
  120. package/eigen/Eigen/src/Core/arch/AVX/Complex.h +380 -187
  121. package/eigen/Eigen/src/Core/arch/AVX/MathFunctions.h +65 -163
  122. package/eigen/Eigen/src/Core/arch/AVX/PacketMath.h +2145 -638
  123. package/eigen/Eigen/src/Core/arch/AVX/Reductions.h +353 -0
  124. package/eigen/Eigen/src/Core/arch/AVX/TypeCasting.h +253 -60
  125. package/eigen/Eigen/src/Core/arch/AVX512/Complex.h +278 -228
  126. package/eigen/Eigen/src/Core/arch/AVX512/GemmKernel.h +1245 -0
  127. package/eigen/Eigen/src/Core/arch/AVX512/MathFunctions.h +48 -269
  128. package/eigen/Eigen/src/Core/arch/AVX512/MathFunctionsFP16.h +75 -0
  129. package/eigen/Eigen/src/Core/arch/AVX512/PacketMath.h +1597 -754
  130. package/eigen/Eigen/src/Core/arch/AVX512/PacketMathFP16.h +1413 -0
  131. package/eigen/Eigen/src/Core/arch/AVX512/Reductions.h +297 -0
  132. package/eigen/Eigen/src/Core/arch/AVX512/TrsmKernel.h +1167 -0
  133. package/eigen/Eigen/src/Core/arch/AVX512/TrsmUnrolls.inc +1219 -0
  134. package/eigen/Eigen/src/Core/arch/AVX512/TypeCasting.h +229 -41
  135. package/eigen/Eigen/src/Core/arch/AVX512/TypeCastingFP16.h +130 -0
  136. package/eigen/Eigen/src/Core/arch/AltiVec/Complex.h +420 -184
  137. package/eigen/Eigen/src/Core/arch/AltiVec/MathFunctions.h +40 -49
  138. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProduct.h +2962 -2213
  139. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h +196 -212
  140. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductMMA.h +713 -441
  141. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductMMAbfloat16.h +742 -0
  142. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixVectorProduct.inc +2818 -0
  143. package/eigen/Eigen/src/Core/arch/AltiVec/PacketMath.h +2380 -1362
  144. package/eigen/Eigen/src/Core/arch/AltiVec/TypeCasting.h +153 -0
  145. package/eigen/Eigen/src/Core/arch/Default/BFloat16.h +390 -224
  146. package/eigen/Eigen/src/Core/arch/Default/ConjHelper.h +78 -67
  147. package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h +1784 -799
  148. package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h +167 -50
  149. package/eigen/Eigen/src/Core/arch/Default/Half.h +528 -379
  150. package/eigen/Eigen/src/Core/arch/Default/Settings.h +10 -12
  151. package/eigen/Eigen/src/Core/arch/GPU/Complex.h +244 -0
  152. package/eigen/Eigen/src/Core/arch/GPU/MathFunctions.h +41 -40
  153. package/eigen/Eigen/src/Core/arch/GPU/PacketMath.h +550 -523
  154. package/eigen/Eigen/src/Core/arch/GPU/Tuple.h +268 -0
  155. package/eigen/Eigen/src/Core/arch/GPU/TypeCasting.h +27 -30
  156. package/eigen/Eigen/src/Core/arch/HIP/hcc/math_constants.h +8 -8
  157. package/eigen/Eigen/src/Core/arch/HVX/PacketMath.h +1088 -0
  158. package/eigen/Eigen/src/Core/arch/LSX/Complex.h +520 -0
  159. package/eigen/Eigen/src/Core/arch/LSX/GeneralBlockPanelKernel.h +23 -0
  160. package/eigen/Eigen/src/Core/arch/LSX/MathFunctions.h +43 -0
  161. package/eigen/Eigen/src/Core/arch/LSX/PacketMath.h +2866 -0
  162. package/eigen/Eigen/src/Core/arch/LSX/TypeCasting.h +526 -0
  163. package/eigen/Eigen/src/Core/arch/MSA/Complex.h +54 -82
  164. package/eigen/Eigen/src/Core/arch/MSA/MathFunctions.h +84 -92
  165. package/eigen/Eigen/src/Core/arch/MSA/PacketMath.h +51 -47
  166. package/eigen/Eigen/src/Core/arch/NEON/Complex.h +454 -306
  167. package/eigen/Eigen/src/Core/arch/NEON/GeneralBlockPanelKernel.h +175 -115
  168. package/eigen/Eigen/src/Core/arch/NEON/MathFunctions.h +23 -30
  169. package/eigen/Eigen/src/Core/arch/NEON/PacketMath.h +4366 -2857
  170. package/eigen/Eigen/src/Core/arch/NEON/TypeCasting.h +616 -393
  171. package/eigen/Eigen/src/Core/arch/NEON/UnaryFunctors.h +57 -0
  172. package/eigen/Eigen/src/Core/arch/SSE/Complex.h +350 -198
  173. package/eigen/Eigen/src/Core/arch/SSE/MathFunctions.h +38 -149
  174. package/eigen/Eigen/src/Core/arch/SSE/PacketMath.h +1791 -912
  175. package/eigen/Eigen/src/Core/arch/SSE/Reductions.h +324 -0
  176. package/eigen/Eigen/src/Core/arch/SSE/TypeCasting.h +128 -40
  177. package/eigen/Eigen/src/Core/arch/SVE/MathFunctions.h +10 -6
  178. package/eigen/Eigen/src/Core/arch/SVE/PacketMath.h +156 -234
  179. package/eigen/Eigen/src/Core/arch/SVE/TypeCasting.h +6 -3
  180. package/eigen/Eigen/src/Core/arch/SYCL/InteropHeaders.h +27 -32
  181. package/eigen/Eigen/src/Core/arch/SYCL/MathFunctions.h +119 -117
  182. package/eigen/Eigen/src/Core/arch/SYCL/PacketMath.h +325 -419
  183. package/eigen/Eigen/src/Core/arch/SYCL/TypeCasting.h +15 -17
  184. package/eigen/Eigen/src/Core/arch/ZVector/Complex.h +325 -181
  185. package/eigen/Eigen/src/Core/arch/ZVector/MathFunctions.h +94 -83
  186. package/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h +811 -458
  187. package/eigen/Eigen/src/Core/functors/AssignmentFunctors.h +121 -124
  188. package/eigen/Eigen/src/Core/functors/BinaryFunctors.h +576 -370
  189. package/eigen/Eigen/src/Core/functors/NullaryFunctors.h +194 -109
  190. package/eigen/Eigen/src/Core/functors/StlFunctors.h +95 -112
  191. package/eigen/Eigen/src/Core/functors/TernaryFunctors.h +34 -7
  192. package/eigen/Eigen/src/Core/functors/UnaryFunctors.h +1038 -749
  193. package/eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h +1883 -1375
  194. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix.h +312 -370
  195. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +189 -176
  196. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h +84 -81
  197. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix_BLAS.h +154 -73
  198. package/eigen/Eigen/src/Core/products/GeneralMatrixVector.h +292 -337
  199. package/eigen/Eigen/src/Core/products/GeneralMatrixVector_BLAS.h +80 -77
  200. package/eigen/Eigen/src/Core/products/Parallelizer.h +207 -105
  201. package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +327 -388
  202. package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix_BLAS.h +206 -224
  203. package/eigen/Eigen/src/Core/products/SelfadjointMatrixVector.h +138 -147
  204. package/eigen/Eigen/src/Core/products/SelfadjointMatrixVector_BLAS.h +58 -61
  205. package/eigen/Eigen/src/Core/products/SelfadjointProduct.h +71 -71
  206. package/eigen/Eigen/src/Core/products/SelfadjointRank2Update.h +48 -47
  207. package/eigen/Eigen/src/Core/products/TriangularMatrixMatrix.h +294 -369
  208. package/eigen/Eigen/src/Core/products/TriangularMatrixMatrix_BLAS.h +246 -238
  209. package/eigen/Eigen/src/Core/products/TriangularMatrixVector.h +244 -247
  210. package/eigen/Eigen/src/Core/products/TriangularMatrixVector_BLAS.h +212 -192
  211. package/eigen/Eigen/src/Core/products/TriangularSolverMatrix.h +328 -277
  212. package/eigen/Eigen/src/Core/products/TriangularSolverMatrix_BLAS.h +108 -109
  213. package/eigen/Eigen/src/Core/products/TriangularSolverVector.h +68 -94
  214. package/eigen/Eigen/src/Core/util/Assert.h +158 -0
  215. package/eigen/Eigen/src/Core/util/BlasUtil.h +342 -303
  216. package/eigen/Eigen/src/Core/util/ConfigureVectorization.h +348 -317
  217. package/eigen/Eigen/src/Core/util/Constants.h +297 -262
  218. package/eigen/Eigen/src/Core/util/DisableStupidWarnings.h +130 -90
  219. package/eigen/Eigen/src/Core/util/EmulateArray.h +270 -0
  220. package/eigen/Eigen/src/Core/util/ForwardDeclarations.h +449 -247
  221. package/eigen/Eigen/src/Core/util/GpuHipCudaDefines.inc +101 -0
  222. package/eigen/Eigen/src/Core/util/GpuHipCudaUndefines.inc +45 -0
  223. package/eigen/Eigen/src/Core/util/IndexedViewHelper.h +417 -116
  224. package/eigen/Eigen/src/Core/util/IntegralConstant.h +211 -204
  225. package/eigen/Eigen/src/Core/util/MKL_support.h +39 -37
  226. package/eigen/Eigen/src/Core/util/Macros.h +655 -773
  227. package/eigen/Eigen/src/Core/util/MaxSizeVector.h +139 -0
  228. package/eigen/Eigen/src/Core/util/Memory.h +970 -748
  229. package/eigen/Eigen/src/Core/util/Meta.h +581 -633
  230. package/eigen/Eigen/src/Core/util/MoreMeta.h +638 -0
  231. package/eigen/Eigen/src/Core/util/ReenableStupidWarnings.h +32 -19
  232. package/eigen/Eigen/src/Core/util/ReshapedHelper.h +17 -17
  233. package/eigen/Eigen/src/Core/util/Serializer.h +209 -0
  234. package/eigen/Eigen/src/Core/util/StaticAssert.h +50 -166
  235. package/eigen/Eigen/src/Core/util/SymbolicIndex.h +377 -225
  236. package/eigen/Eigen/src/Core/util/XprHelper.h +784 -547
  237. package/eigen/Eigen/src/Eigenvalues/ComplexEigenSolver.h +246 -277
  238. package/eigen/Eigen/src/Eigenvalues/ComplexSchur.h +299 -319
  239. package/eigen/Eigen/src/Eigenvalues/ComplexSchur_LAPACKE.h +52 -48
  240. package/eigen/Eigen/src/Eigenvalues/EigenSolver.h +413 -456
  241. package/eigen/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h +309 -325
  242. package/eigen/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h +157 -171
  243. package/eigen/Eigen/src/Eigenvalues/HessenbergDecomposition.h +292 -310
  244. package/eigen/Eigen/src/Eigenvalues/InternalHeaderCheck.h +3 -0
  245. package/eigen/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h +89 -105
  246. package/eigen/Eigen/src/Eigenvalues/RealQZ.h +537 -607
  247. package/eigen/Eigen/src/Eigenvalues/RealSchur.h +342 -381
  248. package/eigen/Eigen/src/Eigenvalues/RealSchur_LAPACKE.h +41 -35
  249. package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +541 -595
  250. package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_LAPACKE.h +47 -44
  251. package/eigen/Eigen/src/Eigenvalues/Tridiagonalization.h +430 -462
  252. package/eigen/Eigen/src/Geometry/AlignedBox.h +226 -227
  253. package/eigen/Eigen/src/Geometry/AngleAxis.h +131 -133
  254. package/eigen/Eigen/src/Geometry/EulerAngles.h +163 -74
  255. package/eigen/Eigen/src/Geometry/Homogeneous.h +285 -333
  256. package/eigen/Eigen/src/Geometry/Hyperplane.h +151 -160
  257. package/eigen/Eigen/src/Geometry/InternalHeaderCheck.h +3 -0
  258. package/eigen/Eigen/src/Geometry/OrthoMethods.h +168 -146
  259. package/eigen/Eigen/src/Geometry/ParametrizedLine.h +127 -127
  260. package/eigen/Eigen/src/Geometry/Quaternion.h +566 -506
  261. package/eigen/Eigen/src/Geometry/Rotation2D.h +107 -105
  262. package/eigen/Eigen/src/Geometry/RotationBase.h +148 -145
  263. package/eigen/Eigen/src/Geometry/Scaling.h +113 -106
  264. package/eigen/Eigen/src/Geometry/Transform.h +858 -936
  265. package/eigen/Eigen/src/Geometry/Translation.h +94 -92
  266. package/eigen/Eigen/src/Geometry/Umeyama.h +79 -84
  267. package/eigen/Eigen/src/Geometry/arch/Geometry_SIMD.h +90 -104
  268. package/eigen/Eigen/src/Householder/BlockHouseholder.h +51 -46
  269. package/eigen/Eigen/src/Householder/Householder.h +102 -124
  270. package/eigen/Eigen/src/Householder/HouseholderSequence.h +412 -453
  271. package/eigen/Eigen/src/Householder/InternalHeaderCheck.h +3 -0
  272. package/eigen/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +149 -162
  273. package/eigen/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +124 -119
  274. package/eigen/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +92 -104
  275. package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h +251 -243
  276. package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h +224 -228
  277. package/eigen/Eigen/src/IterativeLinearSolvers/InternalHeaderCheck.h +3 -0
  278. package/eigen/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +178 -227
  279. package/eigen/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h +79 -84
  280. package/eigen/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h +54 -60
  281. package/eigen/Eigen/src/Jacobi/InternalHeaderCheck.h +3 -0
  282. package/eigen/Eigen/src/Jacobi/Jacobi.h +252 -308
  283. package/eigen/Eigen/src/KLUSupport/InternalHeaderCheck.h +3 -0
  284. package/eigen/Eigen/src/KLUSupport/KLUSupport.h +208 -227
  285. package/eigen/Eigen/src/LU/Determinant.h +50 -69
  286. package/eigen/Eigen/src/LU/FullPivLU.h +545 -596
  287. package/eigen/Eigen/src/LU/InternalHeaderCheck.h +3 -0
  288. package/eigen/Eigen/src/LU/InverseImpl.h +206 -285
  289. package/eigen/Eigen/src/LU/PartialPivLU.h +390 -428
  290. package/eigen/Eigen/src/LU/PartialPivLU_LAPACKE.h +54 -40
  291. package/eigen/Eigen/src/LU/arch/InverseSize4.h +72 -70
  292. package/eigen/Eigen/src/MetisSupport/InternalHeaderCheck.h +3 -0
  293. package/eigen/Eigen/src/MetisSupport/MetisSupport.h +81 -93
  294. package/eigen/Eigen/src/OrderingMethods/Amd.h +243 -265
  295. package/eigen/Eigen/src/OrderingMethods/Eigen_Colamd.h +831 -1004
  296. package/eigen/Eigen/src/OrderingMethods/InternalHeaderCheck.h +3 -0
  297. package/eigen/Eigen/src/OrderingMethods/Ordering.h +112 -119
  298. package/eigen/Eigen/src/PaStiXSupport/InternalHeaderCheck.h +3 -0
  299. package/eigen/Eigen/src/PaStiXSupport/PaStiXSupport.h +524 -570
  300. package/eigen/Eigen/src/PardisoSupport/InternalHeaderCheck.h +3 -0
  301. package/eigen/Eigen/src/PardisoSupport/PardisoSupport.h +385 -430
  302. package/eigen/Eigen/src/QR/ColPivHouseholderQR.h +479 -479
  303. package/eigen/Eigen/src/QR/ColPivHouseholderQR_LAPACKE.h +120 -56
  304. package/eigen/Eigen/src/QR/CompleteOrthogonalDecomposition.h +166 -153
  305. package/eigen/Eigen/src/QR/FullPivHouseholderQR.h +495 -475
  306. package/eigen/Eigen/src/QR/HouseholderQR.h +394 -285
  307. package/eigen/Eigen/src/QR/HouseholderQR_LAPACKE.h +32 -23
  308. package/eigen/Eigen/src/QR/InternalHeaderCheck.h +3 -0
  309. package/eigen/Eigen/src/SPQRSupport/InternalHeaderCheck.h +3 -0
  310. package/eigen/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h +244 -264
  311. package/eigen/Eigen/src/SVD/BDCSVD.h +817 -713
  312. package/eigen/Eigen/src/SVD/BDCSVD_LAPACKE.h +174 -0
  313. package/eigen/Eigen/src/SVD/InternalHeaderCheck.h +3 -0
  314. package/eigen/Eigen/src/SVD/JacobiSVD.h +577 -543
  315. package/eigen/Eigen/src/SVD/JacobiSVD_LAPACKE.h +85 -49
  316. package/eigen/Eigen/src/SVD/SVDBase.h +242 -182
  317. package/eigen/Eigen/src/SVD/UpperBidiagonalization.h +200 -235
  318. package/eigen/Eigen/src/SparseCholesky/InternalHeaderCheck.h +3 -0
  319. package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky.h +765 -594
  320. package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h +308 -94
  321. package/eigen/Eigen/src/SparseCore/AmbiVector.h +202 -251
  322. package/eigen/Eigen/src/SparseCore/CompressedStorage.h +184 -252
  323. package/eigen/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h +134 -178
  324. package/eigen/Eigen/src/SparseCore/InternalHeaderCheck.h +3 -0
  325. package/eigen/Eigen/src/SparseCore/SparseAssign.h +149 -140
  326. package/eigen/Eigen/src/SparseCore/SparseBlock.h +403 -440
  327. package/eigen/Eigen/src/SparseCore/SparseColEtree.h +100 -112
  328. package/eigen/Eigen/src/SparseCore/SparseCompressedBase.h +525 -303
  329. package/eigen/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +555 -339
  330. package/eigen/Eigen/src/SparseCore/SparseCwiseUnaryOp.h +100 -108
  331. package/eigen/Eigen/src/SparseCore/SparseDenseProduct.h +169 -197
  332. package/eigen/Eigen/src/SparseCore/SparseDiagonalProduct.h +71 -71
  333. package/eigen/Eigen/src/SparseCore/SparseDot.h +49 -47
  334. package/eigen/Eigen/src/SparseCore/SparseFuzzy.h +13 -11
  335. package/eigen/Eigen/src/SparseCore/SparseMap.h +243 -253
  336. package/eigen/Eigen/src/SparseCore/SparseMatrix.h +1603 -1245
  337. package/eigen/Eigen/src/SparseCore/SparseMatrixBase.h +403 -350
  338. package/eigen/Eigen/src/SparseCore/SparsePermutation.h +186 -115
  339. package/eigen/Eigen/src/SparseCore/SparseProduct.h +94 -97
  340. package/eigen/Eigen/src/SparseCore/SparseRedux.h +22 -24
  341. package/eigen/Eigen/src/SparseCore/SparseRef.h +268 -295
  342. package/eigen/Eigen/src/SparseCore/SparseSelfAdjointView.h +370 -416
  343. package/eigen/Eigen/src/SparseCore/SparseSolverBase.h +78 -87
  344. package/eigen/Eigen/src/SparseCore/SparseSparseProductWithPruning.h +81 -95
  345. package/eigen/Eigen/src/SparseCore/SparseTranspose.h +62 -71
  346. package/eigen/Eigen/src/SparseCore/SparseTriangularView.h +132 -144
  347. package/eigen/Eigen/src/SparseCore/SparseUtil.h +138 -115
  348. package/eigen/Eigen/src/SparseCore/SparseVector.h +426 -372
  349. package/eigen/Eigen/src/SparseCore/SparseView.h +164 -193
  350. package/eigen/Eigen/src/SparseCore/TriangularSolver.h +129 -170
  351. package/eigen/Eigen/src/SparseLU/InternalHeaderCheck.h +3 -0
  352. package/eigen/Eigen/src/SparseLU/SparseLU.h +756 -710
  353. package/eigen/Eigen/src/SparseLU/SparseLUImpl.h +61 -48
  354. package/eigen/Eigen/src/SparseLU/SparseLU_Memory.h +102 -118
  355. package/eigen/Eigen/src/SparseLU/SparseLU_Structs.h +38 -35
  356. package/eigen/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h +245 -301
  357. package/eigen/Eigen/src/SparseLU/SparseLU_Utils.h +44 -49
  358. package/eigen/Eigen/src/SparseLU/SparseLU_column_bmod.h +104 -108
  359. package/eigen/Eigen/src/SparseLU/SparseLU_column_dfs.h +89 -100
  360. package/eigen/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h +57 -58
  361. package/eigen/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h +43 -55
  362. package/eigen/Eigen/src/SparseLU/SparseLU_kernel_bmod.h +74 -71
  363. package/eigen/Eigen/src/SparseLU/SparseLU_panel_bmod.h +124 -132
  364. package/eigen/Eigen/src/SparseLU/SparseLU_panel_dfs.h +136 -159
  365. package/eigen/Eigen/src/SparseLU/SparseLU_pivotL.h +51 -52
  366. package/eigen/Eigen/src/SparseLU/SparseLU_pruneL.h +67 -73
  367. package/eigen/Eigen/src/SparseLU/SparseLU_relax_snode.h +24 -26
  368. package/eigen/Eigen/src/SparseQR/InternalHeaderCheck.h +3 -0
  369. package/eigen/Eigen/src/SparseQR/SparseQR.h +450 -502
  370. package/eigen/Eigen/src/StlSupport/StdDeque.h +28 -93
  371. package/eigen/Eigen/src/StlSupport/StdList.h +28 -84
  372. package/eigen/Eigen/src/StlSupport/StdVector.h +28 -108
  373. package/eigen/Eigen/src/StlSupport/details.h +48 -50
  374. package/eigen/Eigen/src/SuperLUSupport/InternalHeaderCheck.h +3 -0
  375. package/eigen/Eigen/src/SuperLUSupport/SuperLUSupport.h +634 -730
  376. package/eigen/Eigen/src/ThreadPool/Barrier.h +70 -0
  377. package/eigen/Eigen/src/ThreadPool/CoreThreadPoolDevice.h +336 -0
  378. package/eigen/Eigen/src/ThreadPool/EventCount.h +241 -0
  379. package/eigen/Eigen/src/ThreadPool/ForkJoin.h +140 -0
  380. package/eigen/Eigen/src/ThreadPool/InternalHeaderCheck.h +4 -0
  381. package/eigen/Eigen/src/ThreadPool/NonBlockingThreadPool.h +587 -0
  382. package/eigen/Eigen/src/ThreadPool/RunQueue.h +230 -0
  383. package/eigen/Eigen/src/ThreadPool/ThreadCancel.h +21 -0
  384. package/eigen/Eigen/src/ThreadPool/ThreadEnvironment.h +43 -0
  385. package/eigen/Eigen/src/ThreadPool/ThreadLocal.h +289 -0
  386. package/eigen/Eigen/src/ThreadPool/ThreadPoolInterface.h +50 -0
  387. package/eigen/Eigen/src/ThreadPool/ThreadYield.h +16 -0
  388. package/eigen/Eigen/src/UmfPackSupport/InternalHeaderCheck.h +3 -0
  389. package/eigen/Eigen/src/UmfPackSupport/UmfPackSupport.h +428 -464
  390. package/eigen/Eigen/src/misc/Image.h +41 -43
  391. package/eigen/Eigen/src/misc/InternalHeaderCheck.h +3 -0
  392. package/eigen/Eigen/src/misc/Kernel.h +39 -41
  393. package/eigen/Eigen/src/misc/RealSvd2x2.h +19 -21
  394. package/eigen/Eigen/src/misc/blas.h +83 -426
  395. package/eigen/Eigen/src/misc/lapacke.h +9972 -16179
  396. package/eigen/Eigen/src/misc/lapacke_helpers.h +163 -0
  397. package/eigen/Eigen/src/misc/lapacke_mangling.h +4 -5
  398. package/eigen/Eigen/src/plugins/ArrayCwiseBinaryOps.inc +344 -0
  399. package/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.inc +544 -0
  400. package/eigen/Eigen/src/plugins/{BlockMethods.h → BlockMethods.inc} +434 -506
  401. package/eigen/Eigen/src/plugins/CommonCwiseBinaryOps.inc +116 -0
  402. package/eigen/Eigen/src/plugins/{CommonCwiseUnaryOps.h → CommonCwiseUnaryOps.inc} +58 -68
  403. package/eigen/Eigen/src/plugins/IndexedViewMethods.inc +192 -0
  404. package/eigen/Eigen/src/plugins/InternalHeaderCheck.inc +3 -0
  405. package/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.inc +331 -0
  406. package/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.inc +118 -0
  407. package/eigen/Eigen/src/plugins/ReshapedMethods.inc +133 -0
  408. package/package.json +1 -1
  409. package/eigen/COPYING.APACHE +0 -203
  410. package/eigen/COPYING.BSD +0 -26
  411. package/eigen/COPYING.GPL +0 -674
  412. package/eigen/COPYING.LGPL +0 -502
  413. package/eigen/COPYING.MINPACK +0 -51
  414. package/eigen/COPYING.MPL2 +0 -373
  415. package/eigen/COPYING.README +0 -18
  416. package/eigen/Eigen/src/Core/BooleanRedux.h +0 -162
  417. package/eigen/Eigen/src/Core/arch/CUDA/Complex.h +0 -258
  418. package/eigen/Eigen/src/Core/arch/Default/TypeCasting.h +0 -120
  419. package/eigen/Eigen/src/Core/arch/SYCL/SyclMemoryModel.h +0 -694
  420. package/eigen/Eigen/src/Core/util/NonMPL2.h +0 -3
  421. package/eigen/Eigen/src/SparseCore/MappedSparseMatrix.h +0 -67
  422. package/eigen/Eigen/src/SparseLU/SparseLU_gemm_kernel.h +0 -280
  423. package/eigen/Eigen/src/misc/lapack.h +0 -152
  424. package/eigen/Eigen/src/plugins/ArrayCwiseBinaryOps.h +0 -358
  425. package/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.h +0 -696
  426. package/eigen/Eigen/src/plugins/CommonCwiseBinaryOps.h +0 -115
  427. package/eigen/Eigen/src/plugins/IndexedViewMethods.h +0 -262
  428. package/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.h +0 -152
  429. package/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.h +0 -95
  430. package/eigen/Eigen/src/plugins/ReshapedMethods.h +0 -149
  431. package/eigen/README.md +0 -5
@@ -10,119 +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 result_type operator() (const LhsScalar& a, const RhsScalar& b) const { return a + b; }
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
- template<typename Packet>
47
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE 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 = (int(NumTraits<LhsScalar>::AddCost) + int(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
-
60
- template<>
61
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool scalar_sum_op<bool,bool>::operator() (const bool& a, const bool& b) const { return a || b; }
62
-
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
+ }
63
66
 
64
67
  /** \internal
65
- * \brief Template functor to compute the product of two scalars
66
- *
67
- * \sa class CwiseBinaryOp, Cwise::operator*(), class VectorwiseOp, MatrixBase::redux()
68
- */
69
- template<typename LhsScalar,typename RhsScalar>
70
- struct scalar_product_op : binary_op_base<LhsScalar,RhsScalar>
71
- {
72
- typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_product_op>::ReturnType result_type;
73
- #ifndef EIGEN_SCALAR_BINARY_OP_PLUGIN
74
- EIGEN_EMPTY_STRUCT_CTOR(scalar_product_op)
75
- #else
76
- scalar_product_op() {
77
- EIGEN_SCALAR_BINARY_OP_PLUGIN
78
- }
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}
79
77
  #endif
80
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const LhsScalar& a, const RhsScalar& b) const { return a * b; }
81
- template<typename Packet>
82
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const
83
- { return internal::pmul(a,b); }
84
- template<typename Packet>
85
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type predux(const Packet& a) const
86
- { return internal::predux_mul(a); }
87
- };
88
- template<typename LhsScalar,typename RhsScalar>
89
- 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>> {
90
93
  enum {
91
- Cost = (int(NumTraits<LhsScalar>::MulCost) + int(NumTraits<RhsScalar>::MulCost))/2, // rough estimate!
92
- 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
93
97
  // TODO vectorize mixed product
94
98
  };
95
99
  };
96
100
 
97
- template<>
98
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool scalar_product_op<bool,bool>::operator() (const bool& a, const bool& b) const { return a && b; }
99
-
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
+ }
100
106
 
101
107
  /** \internal
102
- * \brief Template functor to compute the conjugate product of two scalars
103
- *
104
- * This is a short cut for conj(x) * y which is needed for optimization purpose; in Eigen2 support mode, this becomes x * conj(y)
105
- */
106
- template<typename LhsScalar,typename RhsScalar>
107
- struct scalar_conj_product_op : binary_op_base<LhsScalar,RhsScalar>
108
- {
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 };
109
116
 
110
- enum {
111
- Conj = NumTraits<LhsScalar>::IsComplex
112
- };
113
-
114
- typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_conj_product_op>::ReturnType result_type;
115
-
116
- EIGEN_EMPTY_STRUCT_CTOR(scalar_conj_product_op)
117
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const LhsScalar& a, const RhsScalar& b) const
118
- { return conj_helper<LhsScalar,RhsScalar,Conj,false>().pmul(a,b); }
119
-
120
- template<typename Packet>
121
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const
122
- { return conj_helper<Packet,Packet,Conj,false>().pmul(a,b); }
123
- };
124
- template<typename LhsScalar,typename RhsScalar>
125
- 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>> {
126
130
  enum {
127
131
  Cost = NumTraits<LhsScalar>::MulCost,
128
132
  PacketAccess = internal::is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasMul
@@ -130,183 +134,202 @@ struct functor_traits<scalar_conj_product_op<LhsScalar,RhsScalar> > {
130
134
  };
131
135
 
132
136
  /** \internal
133
- * \brief Template functor to compute the min of two scalars
134
- *
135
- * \sa class CwiseBinaryOp, MatrixBase::cwiseMin, class VectorwiseOp, MatrixBase::minCoeff()
136
- */
137
- template<typename LhsScalar,typename RhsScalar, int NaNPropagation>
138
- struct scalar_min_op : binary_op_base<LhsScalar,RhsScalar>
139
- {
140
- typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_min_op>::ReturnType result_type;
141
- EIGEN_EMPTY_STRUCT_CTOR(scalar_min_op)
142
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const LhsScalar& a, const RhsScalar& b) const {
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 {
143
145
  return internal::pmin<NaNPropagation>(a, b);
144
146
  }
145
- template<typename Packet>
146
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const
147
- {
148
- return internal::pmin<NaNPropagation>(a,b);
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);
149
150
  }
150
- template<typename Packet>
151
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type predux(const Packet& a) const
152
- {
151
+ template <typename Packet>
152
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type predux(const Packet& a) const {
153
153
  return internal::predux_min<NaNPropagation>(a);
154
154
  }
155
155
  };
156
156
 
157
- template<typename LhsScalar,typename RhsScalar, int NaNPropagation>
158
- struct functor_traits<scalar_min_op<LhsScalar,RhsScalar, NaNPropagation> > {
157
+ template <typename LhsScalar, typename RhsScalar, int NaNPropagation>
158
+ struct functor_traits<scalar_min_op<LhsScalar, RhsScalar, NaNPropagation>> {
159
159
  enum {
160
- Cost = (NumTraits<LhsScalar>::AddCost+NumTraits<RhsScalar>::AddCost)/2,
160
+ Cost = (NumTraits<LhsScalar>::AddCost + NumTraits<RhsScalar>::AddCost) / 2,
161
161
  PacketAccess = internal::is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasMin
162
162
  };
163
163
  };
164
164
 
165
165
  /** \internal
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
- {
173
- typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_max_op>::ReturnType result_type;
174
- EIGEN_EMPTY_STRUCT_CTOR(scalar_max_op)
175
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const LhsScalar& a, const RhsScalar& b) const {
176
- return internal::pmax<NaNPropagation>(a,b);
177
- }
178
- template<typename Packet>
179
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const
180
- {
181
- return internal::pmax<NaNPropagation>(a,b);
182
- }
183
- template<typename Packet>
184
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type predux(const Packet& a) const
185
- {
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 {
186
182
  return internal::predux_max<NaNPropagation>(a);
187
183
  }
188
184
  };
189
185
 
190
- template<typename LhsScalar,typename RhsScalar, int NaNPropagation>
191
- struct functor_traits<scalar_max_op<LhsScalar,RhsScalar, NaNPropagation> > {
186
+ template <typename LhsScalar, typename RhsScalar, int NaNPropagation>
187
+ struct functor_traits<scalar_max_op<LhsScalar, RhsScalar, NaNPropagation>> {
192
188
  enum {
193
- Cost = (NumTraits<LhsScalar>::AddCost+NumTraits<RhsScalar>::AddCost)/2,
189
+ Cost = (NumTraits<LhsScalar>::AddCost + NumTraits<RhsScalar>::AddCost) / 2,
194
190
  PacketAccess = internal::is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasMax
195
191
  };
196
192
  };
197
193
 
198
194
  /** \internal
199
- * \brief Template functors for comparison of two scalars
200
- * \todo Implement packet-comparisons
201
- */
202
- 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;
203
200
 
204
- template<typename LhsScalar, typename RhsScalar, ComparisonName cmp>
205
- 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>> {
206
203
  enum {
207
- Cost = (NumTraits<LhsScalar>::AddCost+NumTraits<RhsScalar>::AddCost)/2,
208
- 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
209
207
  };
210
208
  };
211
209
 
212
- template<ComparisonName Cmp, typename LhsScalar, typename RhsScalar>
213
- struct result_of<scalar_cmp_op<LhsScalar, RhsScalar, Cmp>(LhsScalar,RhsScalar)> {
214
- typedef bool type;
215
- };
216
-
217
-
218
- template<typename LhsScalar, typename RhsScalar>
219
- struct scalar_cmp_op<LhsScalar,RhsScalar, cmp_EQ> : binary_op_base<LhsScalar,RhsScalar>
220
- {
221
- typedef bool result_type;
222
- EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op)
223
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator()(const LhsScalar& a, const RhsScalar& b) const {return a==b;}
224
- };
225
- template<typename LhsScalar, typename RhsScalar>
226
- struct scalar_cmp_op<LhsScalar,RhsScalar, cmp_LT> : binary_op_base<LhsScalar,RhsScalar>
227
- {
228
- typedef bool result_type;
229
- EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op)
230
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator()(const LhsScalar& a, const RhsScalar& b) const {return a<b;}
231
- };
232
- template<typename LhsScalar, typename RhsScalar>
233
- struct scalar_cmp_op<LhsScalar,RhsScalar, cmp_LE> : binary_op_base<LhsScalar,RhsScalar>
234
- {
235
- typedef bool result_type;
236
- EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op)
237
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator()(const LhsScalar& a, const RhsScalar& b) const {return a<=b;}
238
- };
239
- template<typename LhsScalar, typename RhsScalar>
240
- struct scalar_cmp_op<LhsScalar,RhsScalar, cmp_GT> : binary_op_base<LhsScalar,RhsScalar>
241
- {
242
- typedef bool result_type;
243
- EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op)
244
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator()(const LhsScalar& a, const RhsScalar& b) const {return a>b;}
245
- };
246
- template<typename LhsScalar, typename RhsScalar>
247
- struct scalar_cmp_op<LhsScalar,RhsScalar, cmp_GE> : binary_op_base<LhsScalar,RhsScalar>
248
- {
249
- typedef bool result_type;
250
- EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op)
251
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator()(const LhsScalar& a, const RhsScalar& b) const {return a>=b;}
252
- };
253
- template<typename LhsScalar, typename RhsScalar>
254
- struct scalar_cmp_op<LhsScalar,RhsScalar, cmp_UNORD> : binary_op_base<LhsScalar,RhsScalar>
255
- {
256
- typedef bool result_type;
257
- EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op)
258
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator()(const LhsScalar& a, const RhsScalar& b) const {return !(a<=b || b<=a);}
259
- };
260
- template<typename LhsScalar, typename RhsScalar>
261
- struct scalar_cmp_op<LhsScalar,RhsScalar, cmp_NEQ> : binary_op_base<LhsScalar,RhsScalar>
262
- {
263
- typedef bool result_type;
264
- EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op)
265
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator()(const LhsScalar& a, const RhsScalar& b) const {return a!=b;}
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
+ }
221
+ };
222
+
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
+ }
234
+ };
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
+ }
247
+ };
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
+ }
260
+ };
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
+ }
273
+ };
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
+ }
286
+ };
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
+ }
266
299
  };
267
300
 
268
301
  /** \internal
269
- * \brief Template functor to compute the hypot of two \b positive \b and \b real scalars
270
- *
271
- * \sa MatrixBase::stableNorm(), class Redux
272
- */
273
- template<typename Scalar>
274
- struct scalar_hypot_op<Scalar,Scalar> : binary_op_base<Scalar,Scalar>
275
- {
276
- EIGEN_EMPTY_STRUCT_CTOR(scalar_hypot_op)
277
-
278
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar &x, const Scalar &y) const
279
- {
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 {
280
309
  // This functor is used by hypotNorm only for which it is faster to first apply abs
281
310
  // on all coefficients prior to reduction through hypot.
282
311
  // This way we avoid calling abs on positive and real entries, and this also permits
283
312
  // to seamlessly handle complexes. Otherwise we would have to handle both real and complexes
284
313
  // through the same functor...
285
- return internal::positive_real_hypot(x,y);
314
+ return internal::positive_real_hypot(x, y);
286
315
  }
287
316
  };
288
- template<typename Scalar>
289
- struct functor_traits<scalar_hypot_op<Scalar,Scalar> > {
290
- enum
291
- {
292
- Cost = 3 * NumTraits<Scalar>::AddCost +
293
- 2 * NumTraits<Scalar>::MulCost +
294
- 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,
295
321
  PacketAccess = false
296
322
  };
297
323
  };
298
324
 
299
325
  /** \internal
300
- * \brief Template functor to compute the pow of two scalars
301
- * See the specification of pow in https://en.cppreference.com/w/cpp/numeric/math/pow
302
- */
303
- template<typename Scalar, typename Exponent>
304
- struct scalar_pow_op : binary_op_base<Scalar,Exponent>
305
- {
306
- typedef typename ScalarBinaryOpTraits<Scalar,Exponent,scalar_pow_op>::ReturnType result_type;
307
- #ifndef EIGEN_SCALAR_BINARY_OP_PLUGIN
308
- EIGEN_EMPTY_STRUCT_CTOR(scalar_pow_op)
309
- #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
310
333
  scalar_pow_op() {
311
334
  typedef Scalar LhsScalar;
312
335
  typedef Exponent RhsScalar;
@@ -314,228 +337,411 @@ struct scalar_pow_op : binary_op_base<Scalar,Exponent>
314
337
  }
315
338
  #endif
316
339
 
317
- EIGEN_DEVICE_FUNC
318
- inline result_type operator() (const Scalar& a, const Exponent& b) const { return numext::pow(a, b); }
340
+ EIGEN_DEVICE_FUNC inline result_type operator()(const Scalar& a, const Exponent& b) const {
341
+ return numext::pow(a, b);
342
+ }
319
343
 
320
- template<typename Packet>
321
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const
322
- {
323
- return generic_pow(a,b);
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);
324
347
  }
325
348
  };
326
349
 
327
- template<typename Scalar, typename Exponent>
328
- struct functor_traits<scalar_pow_op<Scalar,Exponent> > {
350
+ template <typename Scalar, typename Exponent>
351
+ struct functor_traits<scalar_pow_op<Scalar, Exponent>> {
329
352
  enum {
330
353
  Cost = 5 * NumTraits<Scalar>::MulCost,
331
- PacketAccess = (!NumTraits<Scalar>::IsComplex && !NumTraits<Scalar>::IsInteger &&
332
- packet_traits<Scalar>::HasExp && packet_traits<Scalar>::HasLog &&
333
- packet_traits<Scalar>::HasRound && packet_traits<Scalar>::HasCmp &&
334
- // Temporarly disable packet access for half/bfloat16 until
335
- // accuracy is improved.
336
- !is_same<Scalar, half>::value && !is_same<Scalar, bfloat16>::value
337
- )
354
+ PacketAccess = (!NumTraits<Scalar>::IsComplex && !NumTraits<Scalar>::IsInteger && packet_traits<Scalar>::HasPow)
338
355
  };
339
356
  };
340
357
 
341
358
  //---------- non associative binary functors ----------
342
359
 
343
360
  /** \internal
344
- * \brief Template functor to compute the difference of two scalars
345
- *
346
- * \sa class CwiseBinaryOp, MatrixBase::operator-
347
- */
348
- template<typename LhsScalar,typename RhsScalar>
349
- struct scalar_difference_op : binary_op_base<LhsScalar,RhsScalar>
350
- {
351
- typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_difference_op>::ReturnType result_type;
352
- #ifndef EIGEN_SCALAR_BINARY_OP_PLUGIN
353
- EIGEN_EMPTY_STRUCT_CTOR(scalar_difference_op)
354
- #else
355
- scalar_difference_op() {
356
- EIGEN_SCALAR_BINARY_OP_PLUGIN
357
- }
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}
358
370
  #endif
359
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const { return a - b; }
360
- template<typename Packet>
361
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const
362
- { 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
+ }
363
379
  };
364
- template<typename LhsScalar,typename RhsScalar>
365
- struct functor_traits<scalar_difference_op<LhsScalar,RhsScalar> > {
380
+ template <typename LhsScalar, typename RhsScalar>
381
+ struct functor_traits<scalar_difference_op<LhsScalar, RhsScalar>> {
366
382
  enum {
367
383
  Cost = (int(NumTraits<LhsScalar>::AddCost) + int(NumTraits<RhsScalar>::AddCost)) / 2,
368
- PacketAccess = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasSub && packet_traits<RhsScalar>::HasSub
384
+ PacketAccess =
385
+ is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasSub && packet_traits<RhsScalar>::HasSub
369
386
  };
370
387
  };
371
388
 
372
- /** \internal
373
- * \brief Template functor to compute the quotient of two scalars
374
- *
375
- * \sa class CwiseBinaryOp, Cwise::operator/()
376
- */
377
- template<typename LhsScalar,typename RhsScalar>
378
- struct scalar_quotient_op : binary_op_base<LhsScalar,RhsScalar>
379
- {
380
- typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_quotient_op>::ReturnType result_type;
381
- #ifndef EIGEN_SCALAR_BINARY_OP_PLUGIN
382
- EIGEN_EMPTY_STRUCT_CTOR(scalar_quotient_op)
383
- #else
384
- scalar_quotient_op() {
385
- 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
+ }
386
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}
387
419
  #endif
388
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const { return a / b; }
389
- template<typename Packet>
390
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const
391
- { return internal::pdiv(a,b); }
392
- };
393
- template<typename LhsScalar,typename RhsScalar>
394
- struct functor_traits<scalar_quotient_op<LhsScalar,RhsScalar> > {
395
- 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;
396
432
  enum {
397
- PacketAccess = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasDiv && packet_traits<RhsScalar>::HasDiv,
398
- 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
399
436
  };
400
437
  };
401
438
 
402
-
403
-
404
439
  /** \internal
405
- * \brief Template functor to compute the and of two booleans
406
- *
407
- * \sa class CwiseBinaryOp, ArrayBase::operator&&
408
- */
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>
409
445
  struct scalar_boolean_and_op {
410
- EIGEN_EMPTY_STRUCT_CTOR(scalar_boolean_and_op)
411
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator() (const bool& a, const bool& b) const { return a && b; }
412
- template<typename Packet>
413
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const
414
- { return internal::pand(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
+ }
415
461
  };
416
- template<> struct functor_traits<scalar_boolean_and_op> {
417
- enum {
418
- Cost = NumTraits<bool>::AddCost,
419
- PacketAccess = true
420
- };
462
+ template <typename Scalar>
463
+ struct functor_traits<scalar_boolean_and_op<Scalar>> {
464
+ enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = packet_traits<Scalar>::HasCmp };
421
465
  };
422
466
 
423
467
  /** \internal
424
- * \brief Template functor to compute the or of two booleans
425
- *
426
- * \sa class CwiseBinaryOp, ArrayBase::operator||
427
- */
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>
428
473
  struct scalar_boolean_or_op {
429
- EIGEN_EMPTY_STRUCT_CTOR(scalar_boolean_or_op)
430
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator() (const bool& a, const bool& b) const { return a || b; }
431
- template<typename Packet>
432
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const
433
- { return internal::por(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
+ }
434
488
  };
435
- template<> struct functor_traits<scalar_boolean_or_op> {
436
- enum {
437
- Cost = NumTraits<bool>::AddCost,
438
- PacketAccess = true
439
- };
489
+ template <typename Scalar>
490
+ struct functor_traits<scalar_boolean_or_op<Scalar>> {
491
+ enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = packet_traits<Scalar>::HasCmp };
440
492
  };
441
493
 
442
494
  /** \internal
443
- * \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
444
496
  *
445
497
  * \sa class CwiseBinaryOp, ArrayBase::operator^
446
498
  */
499
+ template <typename Scalar>
447
500
  struct scalar_boolean_xor_op {
448
- EIGEN_EMPTY_STRUCT_CTOR(scalar_boolean_xor_op)
449
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator() (const bool& a, const bool& b) const { return a ^ b; }
450
- template<typename Packet>
451
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const
452
- { return internal::pxor(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
+ }
453
516
  };
454
- template<> struct functor_traits<scalar_boolean_xor_op> {
455
- enum {
456
- Cost = NumTraits<bool>::AddCost,
457
- PacketAccess = true
458
- };
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
+ }
544
+ };
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
+ }
459
564
  };
460
565
 
461
566
  /** \internal
462
- * \brief Template functor to compute the absolute difference of two scalars
463
- *
464
- * \sa class CwiseBinaryOp, MatrixBase::absolute_difference
465
- */
466
- template<typename LhsScalar,typename RhsScalar>
467
- struct scalar_absolute_difference_op : binary_op_base<LhsScalar,RhsScalar>
468
- {
469
- typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_absolute_difference_op>::ReturnType result_type;
470
- #ifndef EIGEN_SCALAR_BINARY_OP_PLUGIN
471
- EIGEN_EMPTY_STRUCT_CTOR(scalar_absolute_difference_op)
472
- #else
473
- scalar_absolute_difference_op() {
474
- EIGEN_SCALAR_BINARY_OP_PLUGIN
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);
475
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}
476
648
  #endif
477
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const
478
- { return numext::absdiff(a,b); }
479
- template<typename Packet>
480
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const
481
- { return internal::pabsdiff(a,b); }
482
- };
483
- template<typename LhsScalar,typename RhsScalar>
484
- struct functor_traits<scalar_absolute_difference_op<LhsScalar,RhsScalar> > {
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>> {
485
660
  enum {
486
- Cost = (NumTraits<LhsScalar>::AddCost+NumTraits<RhsScalar>::AddCost)/2,
487
- PacketAccess = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasAbsDiff
661
+ Cost = (NumTraits<LhsScalar>::AddCost + NumTraits<RhsScalar>::AddCost) / 2,
662
+ PacketAccess = is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasAbsDiff
488
663
  };
489
664
  };
490
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")
491
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
+ };
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
+ };
492
692
 
493
693
  //---------- binary functors bound to a constant, thus appearing as a unary functor ----------
494
694
 
495
- // The following two classes permits to turn any binary functor into a unary one with one argument bound to a constant value.
496
- // 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:
497
697
  // - they are compatible with packetOp
498
698
  // - they are portable across C++ versions (the std::binder* are deprecated in C++11)
499
- template<typename BinaryOp> struct bind1st_op : BinaryOp {
500
-
501
- 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;
502
702
  typedef typename BinaryOp::second_argument_type second_argument_type;
503
- typedef typename BinaryOp::result_type result_type;
703
+ typedef typename BinaryOp::result_type result_type;
504
704
 
505
- EIGEN_DEVICE_FUNC explicit 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) {}
506
706
 
507
- 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
+ }
508
710
 
509
- template<typename Packet>
510
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& b) const
511
- { 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
+ }
512
715
 
513
716
  first_argument_type m_value;
514
717
  };
515
- 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> {};
516
720
 
517
-
518
- template<typename BinaryOp> struct bind2nd_op : BinaryOp {
519
-
520
- 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;
521
724
  typedef typename BinaryOp::second_argument_type second_argument_type;
522
- typedef typename BinaryOp::result_type result_type;
725
+ typedef typename BinaryOp::result_type result_type;
523
726
 
524
- EIGEN_DEVICE_FUNC explicit 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) {}
525
728
 
526
- 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
+ }
527
732
 
528
- template<typename Packet>
529
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
530
- { 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
+ }
531
737
 
532
738
  second_argument_type m_value;
533
739
  };
534
- template<typename BinaryOp> struct functor_traits<bind2nd_op<BinaryOp> > : functor_traits<BinaryOp> {};
535
-
740
+ template <typename BinaryOp>
741
+ struct functor_traits<bind2nd_op<BinaryOp>> : functor_traits<BinaryOp> {};
536
742
 
537
- } // end namespace internal
743
+ } // end namespace internal
538
744
 
539
- } // end namespace Eigen
745
+ } // end namespace Eigen
540
746
 
541
- #endif // EIGEN_BINARY_FUNCTORS_H
747
+ #endif // EIGEN_BINARY_FUNCTORS_H