@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
@@ -11,7 +11,10 @@
11
11
  #ifndef EIGEN_REDUX_H
12
12
  #define EIGEN_REDUX_H
13
13
 
14
- namespace Eigen {
14
+ // IWYU pragma: private
15
+ #include "./InternalHeaderCheck.h"
16
+
17
+ namespace Eigen {
15
18
 
16
19
  namespace internal {
17
20
 
@@ -20,244 +23,300 @@ namespace internal {
20
23
  // * factorize code
21
24
 
22
25
  /***************************************************************************
23
- * Part 1 : the logic deciding a strategy for vectorization and unrolling
24
- ***************************************************************************/
25
-
26
- template<typename Func, typename Derived>
27
- struct redux_traits
28
- {
29
- public:
30
- typedef typename find_best_packet<typename Derived::Scalar,Derived::SizeAtCompileTime>::type PacketType;
26
+ * Part 1 : the logic deciding a strategy for vectorization and unrolling
27
+ ***************************************************************************/
28
+
29
+ template <typename Func, typename Evaluator>
30
+ struct redux_traits {
31
+ public:
32
+ typedef typename find_best_packet<typename Evaluator::Scalar, Evaluator::SizeAtCompileTime>::type PacketType;
31
33
  enum {
32
34
  PacketSize = unpacket_traits<PacketType>::size,
33
- InnerMaxSize = int(Derived::IsRowMajor)
34
- ? Derived::MaxColsAtCompileTime
35
- : Derived::MaxRowsAtCompileTime
35
+ InnerMaxSize = int(Evaluator::IsRowMajor) ? Evaluator::MaxColsAtCompileTime : Evaluator::MaxRowsAtCompileTime,
36
+ OuterMaxSize = int(Evaluator::IsRowMajor) ? Evaluator::MaxRowsAtCompileTime : Evaluator::MaxColsAtCompileTime,
37
+ SliceVectorizedWork = int(InnerMaxSize) == Dynamic ? Dynamic
38
+ : int(OuterMaxSize) == Dynamic ? (int(InnerMaxSize) >= int(PacketSize) ? Dynamic : 0)
39
+ : (int(InnerMaxSize) / int(PacketSize)) * int(OuterMaxSize)
36
40
  };
37
41
 
38
42
  enum {
39
- MightVectorize = (int(Derived::Flags)&ActualPacketAccessBit)
40
- && (functor_traits<Func>::PacketAccess),
41
- MayLinearVectorize = bool(MightVectorize) && (int(Derived::Flags)&LinearAccessBit),
42
- MaySliceVectorize = bool(MightVectorize) && int(InnerMaxSize)>=3*PacketSize
43
+ MayLinearize = (int(Evaluator::Flags) & LinearAccessBit),
44
+ MightVectorize = (int(Evaluator::Flags) & ActualPacketAccessBit) && (functor_traits<Func>::PacketAccess),
45
+ MayLinearVectorize = bool(MightVectorize) && bool(MayLinearize),
46
+ MaySliceVectorize = bool(MightVectorize) && (int(SliceVectorizedWork) == Dynamic || int(SliceVectorizedWork) >= 3)
43
47
  };
44
48
 
45
- public:
49
+ public:
46
50
  enum {
47
- Traversal = int(MayLinearVectorize) ? int(LinearVectorizedTraversal)
48
- : int(MaySliceVectorize) ? int(SliceVectorizedTraversal)
49
- : int(DefaultTraversal)
51
+ Traversal = int(MayLinearVectorize) ? int(LinearVectorizedTraversal)
52
+ : int(MaySliceVectorize) ? int(SliceVectorizedTraversal)
53
+ : int(MayLinearize) ? int(LinearTraversal)
54
+ : int(DefaultTraversal)
50
55
  };
51
56
 
52
- public:
57
+ public:
53
58
  enum {
54
- Cost = Derived::SizeAtCompileTime == Dynamic ? HugeCost
55
- : Derived::SizeAtCompileTime * Derived::CoeffReadCost + (Derived::SizeAtCompileTime-1) * functor_traits<Func>::Cost,
59
+ Cost = Evaluator::SizeAtCompileTime == Dynamic
60
+ ? HugeCost
61
+ : int(Evaluator::SizeAtCompileTime) * int(Evaluator::CoeffReadCost) +
62
+ (Evaluator::SizeAtCompileTime - 1) * functor_traits<Func>::Cost,
56
63
  UnrollingLimit = EIGEN_UNROLLING_LIMIT * (int(Traversal) == int(DefaultTraversal) ? 1 : int(PacketSize))
57
64
  };
58
65
 
59
- public:
60
- enum {
61
- Unrolling = Cost <= UnrollingLimit ? CompleteUnrolling : NoUnrolling
62
- };
63
-
66
+ public:
67
+ enum { Unrolling = Cost <= UnrollingLimit ? CompleteUnrolling : NoUnrolling };
68
+
64
69
  #ifdef EIGEN_DEBUG_ASSIGN
65
- static void debug()
66
- {
67
- std::cerr << "Xpr: " << typeid(typename Derived::XprType).name() << std::endl;
70
+ static void debug() {
71
+ std::cerr << "Xpr: " << typeid(typename Evaluator::XprType).name() << std::endl;
68
72
  std::cerr.setf(std::ios::hex, std::ios::basefield);
69
- EIGEN_DEBUG_VAR(Derived::Flags)
73
+ EIGEN_DEBUG_VAR(Evaluator::Flags)
70
74
  std::cerr.unsetf(std::ios::hex);
71
75
  EIGEN_DEBUG_VAR(InnerMaxSize)
76
+ EIGEN_DEBUG_VAR(OuterMaxSize)
77
+ EIGEN_DEBUG_VAR(SliceVectorizedWork)
72
78
  EIGEN_DEBUG_VAR(PacketSize)
73
79
  EIGEN_DEBUG_VAR(MightVectorize)
74
80
  EIGEN_DEBUG_VAR(MayLinearVectorize)
75
81
  EIGEN_DEBUG_VAR(MaySliceVectorize)
76
- EIGEN_DEBUG_VAR(Traversal)
82
+ std::cerr << "Traversal"
83
+ << " = " << Traversal << " (" << demangle_traversal(Traversal) << ")" << std::endl;
77
84
  EIGEN_DEBUG_VAR(UnrollingLimit)
78
- EIGEN_DEBUG_VAR(Unrolling)
85
+ std::cerr << "Unrolling"
86
+ << " = " << Unrolling << " (" << demangle_unrolling(Unrolling) << ")" << std::endl;
79
87
  std::cerr << std::endl;
80
88
  }
81
89
  #endif
82
90
  };
83
91
 
84
92
  /***************************************************************************
85
- * Part 2 : unrollers
86
- ***************************************************************************/
93
+ * Part 2 : unrollers
94
+ ***************************************************************************/
87
95
 
88
96
  /*** no vectorization ***/
89
97
 
90
- template<typename Func, typename Derived, int Start, int Length>
91
- struct redux_novec_unroller
92
- {
93
- enum {
94
- HalfLength = Length/2
95
- };
98
+ template <typename Func, typename Evaluator, Index Start, Index Length>
99
+ struct redux_novec_unroller {
100
+ static constexpr Index HalfLength = Length / 2;
96
101
 
97
- typedef typename Derived::Scalar Scalar;
102
+ typedef typename Evaluator::Scalar Scalar;
98
103
 
99
- EIGEN_DEVICE_FUNC
100
- static EIGEN_STRONG_INLINE Scalar run(const Derived &mat, const Func& func)
101
- {
102
- return func(redux_novec_unroller<Func, Derived, Start, HalfLength>::run(mat,func),
103
- redux_novec_unroller<Func, Derived, Start+HalfLength, Length-HalfLength>::run(mat,func));
104
+ EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Evaluator& eval, const Func& func) {
105
+ return func(redux_novec_unroller<Func, Evaluator, Start, HalfLength>::run(eval, func),
106
+ redux_novec_unroller<Func, Evaluator, Start + HalfLength, Length - HalfLength>::run(eval, func));
104
107
  }
105
108
  };
106
109
 
107
- template<typename Func, typename Derived, int Start>
108
- struct redux_novec_unroller<Func, Derived, Start, 1>
109
- {
110
- enum {
111
- outer = Start / Derived::InnerSizeAtCompileTime,
112
- inner = Start % Derived::InnerSizeAtCompileTime
113
- };
110
+ template <typename Func, typename Evaluator, Index Start>
111
+ struct redux_novec_unroller<Func, Evaluator, Start, 1> {
112
+ static constexpr Index outer = Start / Evaluator::InnerSizeAtCompileTime;
113
+ static constexpr Index inner = Start % Evaluator::InnerSizeAtCompileTime;
114
114
 
115
- typedef typename Derived::Scalar Scalar;
115
+ typedef typename Evaluator::Scalar Scalar;
116
116
 
117
- EIGEN_DEVICE_FUNC
118
- static EIGEN_STRONG_INLINE Scalar run(const Derived &mat, const Func&)
119
- {
120
- return mat.coeffByOuterInner(outer, inner);
117
+ EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Evaluator& eval, const Func&) {
118
+ return eval.coeffByOuterInner(outer, inner);
121
119
  }
122
120
  };
123
121
 
124
122
  // This is actually dead code and will never be called. It is required
125
123
  // to prevent false warnings regarding failed inlining though
126
124
  // for 0 length run() will never be called at all.
127
- template<typename Func, typename Derived, int Start>
128
- struct redux_novec_unroller<Func, Derived, Start, 0>
129
- {
130
- typedef typename Derived::Scalar Scalar;
131
- EIGEN_DEVICE_FUNC
132
- static EIGEN_STRONG_INLINE Scalar run(const Derived&, const Func&) { return Scalar(); }
125
+ template <typename Func, typename Evaluator, Index Start>
126
+ struct redux_novec_unroller<Func, Evaluator, Start, 0> {
127
+ typedef typename Evaluator::Scalar Scalar;
128
+ EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Evaluator&, const Func&) { return Scalar(); }
133
129
  };
134
130
 
135
- /*** vectorization ***/
131
+ template <typename Func, typename Evaluator, Index Start, Index Length>
132
+ struct redux_novec_linear_unroller {
133
+ static constexpr Index HalfLength = Length / 2;
136
134
 
137
- template<typename Func, typename Derived, int Start, int Length>
138
- struct redux_vec_unroller
139
- {
140
- enum {
141
- PacketSize = redux_traits<Func, Derived>::PacketSize,
142
- HalfLength = Length/2
143
- };
135
+ typedef typename Evaluator::Scalar Scalar;
136
+
137
+ EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Evaluator& eval, const Func& func) {
138
+ return func(redux_novec_linear_unroller<Func, Evaluator, Start, HalfLength>::run(eval, func),
139
+ redux_novec_linear_unroller<Func, Evaluator, Start + HalfLength, Length - HalfLength>::run(eval, func));
140
+ }
141
+ };
144
142
 
145
- typedef typename Derived::Scalar Scalar;
146
- typedef typename redux_traits<Func, Derived>::PacketType PacketScalar;
143
+ template <typename Func, typename Evaluator, Index Start>
144
+ struct redux_novec_linear_unroller<Func, Evaluator, Start, 1> {
145
+ typedef typename Evaluator::Scalar Scalar;
146
+
147
+ EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Evaluator& eval, const Func&) {
148
+ return eval.coeff(Start);
149
+ }
150
+ };
151
+
152
+ // This is actually dead code and will never be called. It is required
153
+ // to prevent false warnings regarding failed inlining though
154
+ // for 0 length run() will never be called at all.
155
+ template <typename Func, typename Evaluator, Index Start>
156
+ struct redux_novec_linear_unroller<Func, Evaluator, Start, 0> {
157
+ typedef typename Evaluator::Scalar Scalar;
158
+ EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Evaluator&, const Func&) { return Scalar(); }
159
+ };
160
+
161
+ /*** vectorization ***/
162
+
163
+ template <typename Func, typename Evaluator, Index Start, Index Length>
164
+ struct redux_vec_unroller {
165
+ template <typename PacketType>
166
+ EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE PacketType run(const Evaluator& eval, const Func& func) {
167
+ constexpr Index HalfLength = Length / 2;
147
168
 
148
- static EIGEN_STRONG_INLINE PacketScalar run(const Derived &mat, const Func& func)
149
- {
150
169
  return func.packetOp(
151
- redux_vec_unroller<Func, Derived, Start, HalfLength>::run(mat,func),
152
- redux_vec_unroller<Func, Derived, Start+HalfLength, Length-HalfLength>::run(mat,func) );
170
+ redux_vec_unroller<Func, Evaluator, Start, HalfLength>::template run<PacketType>(eval, func),
171
+ redux_vec_unroller<Func, Evaluator, Start + HalfLength, Length - HalfLength>::template run<PacketType>(eval,
172
+ func));
153
173
  }
154
174
  };
155
175
 
156
- template<typename Func, typename Derived, int Start>
157
- struct redux_vec_unroller<Func, Derived, Start, 1>
158
- {
159
- enum {
160
- index = Start * redux_traits<Func, Derived>::PacketSize,
161
- outer = index / int(Derived::InnerSizeAtCompileTime),
162
- inner = index % int(Derived::InnerSizeAtCompileTime),
163
- alignment = Derived::Alignment
164
- };
176
+ template <typename Func, typename Evaluator, Index Start>
177
+ struct redux_vec_unroller<Func, Evaluator, Start, 1> {
178
+ template <typename PacketType>
179
+ EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE PacketType run(const Evaluator& eval, const Func&) {
180
+ constexpr Index PacketSize = unpacket_traits<PacketType>::size;
181
+ constexpr Index index = Start * PacketSize;
182
+ constexpr Index outer = index / int(Evaluator::InnerSizeAtCompileTime);
183
+ constexpr Index inner = index % int(Evaluator::InnerSizeAtCompileTime);
184
+ constexpr int alignment = Evaluator::Alignment;
185
+
186
+ return eval.template packetByOuterInner<alignment, PacketType>(outer, inner);
187
+ }
188
+ };
165
189
 
166
- typedef typename Derived::Scalar Scalar;
167
- typedef typename redux_traits<Func, Derived>::PacketType PacketScalar;
190
+ template <typename Func, typename Evaluator, Index Start, Index Length>
191
+ struct redux_vec_linear_unroller {
192
+ template <typename PacketType>
193
+ EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE PacketType run(const Evaluator& eval, const Func& func) {
194
+ constexpr Index HalfLength = Length / 2;
168
195
 
169
- static EIGEN_STRONG_INLINE PacketScalar run(const Derived &mat, const Func&)
170
- {
171
- return mat.template packetByOuterInner<alignment,PacketScalar>(outer, inner);
196
+ return func.packetOp(
197
+ redux_vec_linear_unroller<Func, Evaluator, Start, HalfLength>::template run<PacketType>(eval, func),
198
+ redux_vec_linear_unroller<Func, Evaluator, Start + HalfLength, Length - HalfLength>::template run<PacketType>(
199
+ eval, func));
200
+ }
201
+ };
202
+
203
+ template <typename Func, typename Evaluator, Index Start>
204
+ struct redux_vec_linear_unroller<Func, Evaluator, Start, 1> {
205
+ template <typename PacketType>
206
+ EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE PacketType run(const Evaluator& eval, const Func&) {
207
+ constexpr Index PacketSize = unpacket_traits<PacketType>::size;
208
+ constexpr Index index = (Start * PacketSize);
209
+ constexpr int alignment = Evaluator::Alignment;
210
+ return eval.template packet<alignment, PacketType>(index);
172
211
  }
173
212
  };
174
213
 
175
214
  /***************************************************************************
176
- * Part 3 : implementation of all cases
177
- ***************************************************************************/
215
+ * Part 3 : implementation of all cases
216
+ ***************************************************************************/
178
217
 
179
- template<typename Func, typename Derived,
180
- int Traversal = redux_traits<Func, Derived>::Traversal,
181
- int Unrolling = redux_traits<Func, Derived>::Unrolling
182
- >
218
+ template <typename Func, typename Evaluator, int Traversal = redux_traits<Func, Evaluator>::Traversal,
219
+ int Unrolling = redux_traits<Func, Evaluator>::Unrolling>
183
220
  struct redux_impl;
184
221
 
185
- template<typename Func, typename Derived>
186
- struct redux_impl<Func, Derived, DefaultTraversal, NoUnrolling>
187
- {
188
- typedef typename Derived::Scalar Scalar;
189
- EIGEN_DEVICE_FUNC
190
- static EIGEN_STRONG_INLINE Scalar run(const Derived &mat, const Func& func)
191
- {
192
- eigen_assert(mat.rows()>0 && mat.cols()>0 && "you are using an empty matrix");
193
- Scalar res;
194
- res = mat.coeffByOuterInner(0, 0);
195
- for(Index i = 1; i < mat.innerSize(); ++i)
196
- res = func(res, mat.coeffByOuterInner(0, i));
197
- for(Index i = 1; i < mat.outerSize(); ++i)
198
- for(Index j = 0; j < mat.innerSize(); ++j)
199
- res = func(res, mat.coeffByOuterInner(i, j));
222
+ template <typename Func, typename Evaluator>
223
+ struct redux_impl<Func, Evaluator, DefaultTraversal, NoUnrolling> {
224
+ typedef typename Evaluator::Scalar Scalar;
225
+
226
+ template <typename XprType>
227
+ EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Evaluator& eval, const Func& func, const XprType& xpr) {
228
+ eigen_assert(xpr.rows() > 0 && xpr.cols() > 0 && "you are using an empty matrix");
229
+ Scalar res = eval.coeffByOuterInner(0, 0);
230
+ for (Index i = 1; i < xpr.innerSize(); ++i) res = func(res, eval.coeffByOuterInner(0, i));
231
+ for (Index i = 1; i < xpr.outerSize(); ++i)
232
+ for (Index j = 0; j < xpr.innerSize(); ++j) res = func(res, eval.coeffByOuterInner(i, j));
233
+ return res;
234
+ }
235
+ };
236
+
237
+ template <typename Func, typename Evaluator>
238
+ struct redux_impl<Func, Evaluator, LinearTraversal, NoUnrolling> {
239
+ typedef typename Evaluator::Scalar Scalar;
240
+
241
+ template <typename XprType>
242
+ EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Evaluator& eval, const Func& func, const XprType& xpr) {
243
+ eigen_assert(xpr.size() > 0 && "you are using an empty matrix");
244
+ Scalar res = eval.coeff(0);
245
+ for (Index k = 1; k < xpr.size(); ++k) res = func(res, eval.coeff(k));
200
246
  return res;
201
247
  }
202
248
  };
203
249
 
204
- template<typename Func, typename Derived>
205
- struct redux_impl<Func,Derived, DefaultTraversal, CompleteUnrolling>
206
- : public redux_novec_unroller<Func,Derived, 0, Derived::SizeAtCompileTime>
207
- {};
208
-
209
- template<typename Func, typename Derived>
210
- struct redux_impl<Func, Derived, LinearVectorizedTraversal, NoUnrolling>
211
- {
212
- typedef typename Derived::Scalar Scalar;
213
- typedef typename redux_traits<Func, Derived>::PacketType PacketScalar;
214
-
215
- static Scalar run(const Derived &mat, const Func& func)
216
- {
217
- const Index size = mat.size();
218
-
219
- const Index packetSize = redux_traits<Func, Derived>::PacketSize;
220
- const int packetAlignment = unpacket_traits<PacketScalar>::alignment;
221
- enum {
222
- alignment0 = (bool(Derived::Flags & DirectAccessBit) && bool(packet_traits<Scalar>::AlignedOnScalar)) ? int(packetAlignment) : int(Unaligned),
223
- alignment = EIGEN_PLAIN_ENUM_MAX(alignment0, Derived::Alignment)
224
- };
225
- const Index alignedStart = internal::first_default_aligned(mat.nestedExpression());
226
- const Index alignedSize2 = ((size-alignedStart)/(2*packetSize))*(2*packetSize);
227
- const Index alignedSize = ((size-alignedStart)/(packetSize))*(packetSize);
250
+ template <typename Func, typename Evaluator>
251
+ struct redux_impl<Func, Evaluator, DefaultTraversal, CompleteUnrolling>
252
+ : redux_novec_unroller<Func, Evaluator, 0, Evaluator::SizeAtCompileTime> {
253
+ typedef redux_novec_unroller<Func, Evaluator, 0, Evaluator::SizeAtCompileTime> Base;
254
+ typedef typename Evaluator::Scalar Scalar;
255
+ template <typename XprType>
256
+ EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Evaluator& eval, const Func& func,
257
+ const XprType& /*xpr*/) {
258
+ return Base::run(eval, func);
259
+ }
260
+ };
261
+
262
+ template <typename Func, typename Evaluator>
263
+ struct redux_impl<Func, Evaluator, LinearTraversal, CompleteUnrolling>
264
+ : redux_novec_linear_unroller<Func, Evaluator, 0, Evaluator::SizeAtCompileTime> {
265
+ typedef redux_novec_linear_unroller<Func, Evaluator, 0, Evaluator::SizeAtCompileTime> Base;
266
+ typedef typename Evaluator::Scalar Scalar;
267
+ template <typename XprType>
268
+ EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Evaluator& eval, const Func& func,
269
+ const XprType& /*xpr*/) {
270
+ return Base::run(eval, func);
271
+ }
272
+ };
273
+
274
+ template <typename Func, typename Evaluator>
275
+ struct redux_impl<Func, Evaluator, LinearVectorizedTraversal, NoUnrolling> {
276
+ typedef typename Evaluator::Scalar Scalar;
277
+ typedef typename redux_traits<Func, Evaluator>::PacketType PacketScalar;
278
+
279
+ template <typename XprType>
280
+ static Scalar run(const Evaluator& eval, const Func& func, const XprType& xpr) {
281
+ const Index size = xpr.size();
282
+
283
+ constexpr Index packetSize = redux_traits<Func, Evaluator>::PacketSize;
284
+ constexpr int packetAlignment = unpacket_traits<PacketScalar>::alignment;
285
+ constexpr int alignment0 =
286
+ (bool(Evaluator::Flags & DirectAccessBit) && bool(packet_traits<Scalar>::AlignedOnScalar))
287
+ ? int(packetAlignment)
288
+ : int(Unaligned);
289
+ constexpr int alignment = plain_enum_max(alignment0, Evaluator::Alignment);
290
+ const Index alignedStart = internal::first_default_aligned(xpr);
291
+ const Index alignedSize2 = ((size - alignedStart) / (2 * packetSize)) * (2 * packetSize);
292
+ const Index alignedSize = ((size - alignedStart) / (packetSize)) * (packetSize);
228
293
  const Index alignedEnd2 = alignedStart + alignedSize2;
229
- const Index alignedEnd = alignedStart + alignedSize;
294
+ const Index alignedEnd = alignedStart + alignedSize;
230
295
  Scalar res;
231
- if(alignedSize)
232
- {
233
- PacketScalar packet_res0 = mat.template packet<alignment,PacketScalar>(alignedStart);
234
- if(alignedSize>packetSize) // we have at least two packets to partly unroll the loop
296
+ if (alignedSize) {
297
+ PacketScalar packet_res0 = eval.template packet<alignment, PacketScalar>(alignedStart);
298
+ if (alignedSize > packetSize) // we have at least two packets to partly unroll the loop
235
299
  {
236
- PacketScalar packet_res1 = mat.template packet<alignment,PacketScalar>(alignedStart+packetSize);
237
- for(Index index = alignedStart + 2*packetSize; index < alignedEnd2; index += 2*packetSize)
238
- {
239
- packet_res0 = func.packetOp(packet_res0, mat.template packet<alignment,PacketScalar>(index));
240
- packet_res1 = func.packetOp(packet_res1, mat.template packet<alignment,PacketScalar>(index+packetSize));
300
+ PacketScalar packet_res1 = eval.template packet<alignment, PacketScalar>(alignedStart + packetSize);
301
+ for (Index index = alignedStart + 2 * packetSize; index < alignedEnd2; index += 2 * packetSize) {
302
+ packet_res0 = func.packetOp(packet_res0, eval.template packet<alignment, PacketScalar>(index));
303
+ packet_res1 = func.packetOp(packet_res1, eval.template packet<alignment, PacketScalar>(index + packetSize));
241
304
  }
242
305
 
243
- packet_res0 = func.packetOp(packet_res0,packet_res1);
244
- if(alignedEnd>alignedEnd2)
245
- packet_res0 = func.packetOp(packet_res0, mat.template packet<alignment,PacketScalar>(alignedEnd2));
306
+ packet_res0 = func.packetOp(packet_res0, packet_res1);
307
+ if (alignedEnd > alignedEnd2)
308
+ packet_res0 = func.packetOp(packet_res0, eval.template packet<alignment, PacketScalar>(alignedEnd2));
246
309
  }
247
310
  res = func.predux(packet_res0);
248
311
 
249
- for(Index index = 0; index < alignedStart; ++index)
250
- res = func(res,mat.coeff(index));
312
+ for (Index index = 0; index < alignedStart; ++index) res = func(res, eval.coeff(index));
251
313
 
252
- for(Index index = alignedEnd; index < size; ++index)
253
- res = func(res,mat.coeff(index));
254
- }
255
- else // too small to vectorize anything.
256
- // since this is dynamic-size hence inefficient anyway for such small sizes, don't try to optimize.
314
+ for (Index index = alignedEnd; index < size; ++index) res = func(res, eval.coeff(index));
315
+ } else // too small to vectorize anything.
316
+ // since this is dynamic-size hence inefficient anyway for such small sizes, don't try to optimize.
257
317
  {
258
- res = mat.coeff(0);
259
- for(Index index = 1; index < size; ++index)
260
- res = func(res,mat.coeff(index));
318
+ res = eval.coeff(0);
319
+ for (Index index = 1; index < size; ++index) res = func(res, eval.coeff(index));
261
320
  }
262
321
 
263
322
  return res;
@@ -265,241 +324,212 @@ struct redux_impl<Func, Derived, LinearVectorizedTraversal, NoUnrolling>
265
324
  };
266
325
 
267
326
  // NOTE: for SliceVectorizedTraversal we simply bypass unrolling
268
- template<typename Func, typename Derived, int Unrolling>
269
- struct redux_impl<Func, Derived, SliceVectorizedTraversal, Unrolling>
270
- {
271
- typedef typename Derived::Scalar Scalar;
272
- typedef typename redux_traits<Func, Derived>::PacketType PacketType;
273
-
274
- EIGEN_DEVICE_FUNC static Scalar run(const Derived &mat, const Func& func)
275
- {
276
- eigen_assert(mat.rows()>0 && mat.cols()>0 && "you are using an empty matrix");
277
- const Index innerSize = mat.innerSize();
278
- const Index outerSize = mat.outerSize();
279
- enum {
280
- packetSize = redux_traits<Func, Derived>::PacketSize
281
- };
282
- const Index packetedInnerSize = ((innerSize)/packetSize)*packetSize;
327
+ template <typename Func, typename Evaluator, int Unrolling>
328
+ struct redux_impl<Func, Evaluator, SliceVectorizedTraversal, Unrolling> {
329
+ typedef typename Evaluator::Scalar Scalar;
330
+ typedef typename redux_traits<Func, Evaluator>::PacketType PacketType;
331
+
332
+ template <typename XprType>
333
+ EIGEN_DEVICE_FUNC static Scalar run(const Evaluator& eval, const Func& func, const XprType& xpr) {
334
+ eigen_assert(xpr.rows() > 0 && xpr.cols() > 0 && "you are using an empty matrix");
335
+ constexpr Index packetSize = redux_traits<Func, Evaluator>::PacketSize;
336
+ const Index innerSize = xpr.innerSize();
337
+ const Index outerSize = xpr.outerSize();
338
+ const Index packetedInnerSize = ((innerSize) / packetSize) * packetSize;
283
339
  Scalar res;
284
- if(packetedInnerSize)
285
- {
286
- PacketType packet_res = mat.template packet<Unaligned,PacketType>(0,0);
287
- for(Index j=0; j<outerSize; ++j)
288
- for(Index i=(j==0?packetSize:0); i<packetedInnerSize; i+=Index(packetSize))
289
- packet_res = func.packetOp(packet_res, mat.template packetByOuterInner<Unaligned,PacketType>(j,i));
340
+ if (packetedInnerSize) {
341
+ PacketType packet_res = eval.template packet<Unaligned, PacketType>(0, 0);
342
+ for (Index j = 0; j < outerSize; ++j)
343
+ for (Index i = (j == 0 ? packetSize : 0); i < packetedInnerSize; i += Index(packetSize))
344
+ packet_res = func.packetOp(packet_res, eval.template packetByOuterInner<Unaligned, PacketType>(j, i));
290
345
 
291
346
  res = func.predux(packet_res);
292
- for(Index j=0; j<outerSize; ++j)
293
- for(Index i=packetedInnerSize; i<innerSize; ++i)
294
- res = func(res, mat.coeffByOuterInner(j,i));
295
- }
296
- else // too small to vectorize anything.
297
- // since this is dynamic-size hence inefficient anyway for such small sizes, don't try to optimize.
347
+ for (Index j = 0; j < outerSize; ++j)
348
+ for (Index i = packetedInnerSize; i < innerSize; ++i) res = func(res, eval.coeffByOuterInner(j, i));
349
+ } else // too small to vectorize anything.
350
+ // since this is dynamic-size hence inefficient anyway for such small sizes, don't try to optimize.
298
351
  {
299
- res = redux_impl<Func, Derived, DefaultTraversal, NoUnrolling>::run(mat, func);
352
+ res = redux_impl<Func, Evaluator, DefaultTraversal, NoUnrolling>::run(eval, func, xpr);
300
353
  }
301
354
 
302
355
  return res;
303
356
  }
304
357
  };
305
358
 
306
- template<typename Func, typename Derived>
307
- struct redux_impl<Func, Derived, LinearVectorizedTraversal, CompleteUnrolling>
308
- {
309
- typedef typename Derived::Scalar Scalar;
359
+ template <typename Func, typename Evaluator>
360
+ struct redux_impl<Func, Evaluator, LinearVectorizedTraversal, CompleteUnrolling> {
361
+ typedef typename Evaluator::Scalar Scalar;
310
362
 
311
- typedef typename redux_traits<Func, Derived>::PacketType PacketScalar;
312
- enum {
313
- PacketSize = redux_traits<Func, Derived>::PacketSize,
314
- Size = Derived::SizeAtCompileTime,
315
- VectorizedSize = (Size / PacketSize) * PacketSize
316
- };
317
- EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Derived &mat, const Func& func)
318
- {
319
- eigen_assert(mat.rows()>0 && mat.cols()>0 && "you are using an empty matrix");
363
+ typedef typename redux_traits<Func, Evaluator>::PacketType PacketType;
364
+ static constexpr Index PacketSize = redux_traits<Func, Evaluator>::PacketSize;
365
+ static constexpr Index Size = Evaluator::SizeAtCompileTime;
366
+ static constexpr Index VectorizedSize = (int(Size) / int(PacketSize)) * int(PacketSize);
367
+
368
+ template <typename XprType>
369
+ EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Evaluator& eval, const Func& func, const XprType& xpr) {
370
+ EIGEN_ONLY_USED_FOR_DEBUG(xpr)
371
+ eigen_assert(xpr.rows() > 0 && xpr.cols() > 0 && "you are using an empty matrix");
320
372
  if (VectorizedSize > 0) {
321
- Scalar res = func.predux(redux_vec_unroller<Func, Derived, 0, Size / PacketSize>::run(mat,func));
373
+ Scalar res = func.predux(
374
+ redux_vec_linear_unroller<Func, Evaluator, 0, Size / PacketSize>::template run<PacketType>(eval, func));
322
375
  if (VectorizedSize != Size)
323
- res = func(res,redux_novec_unroller<Func, Derived, VectorizedSize, Size-VectorizedSize>::run(mat,func));
376
+ res = func(
377
+ res, redux_novec_linear_unroller<Func, Evaluator, VectorizedSize, Size - VectorizedSize>::run(eval, func));
324
378
  return res;
325
- }
326
- else {
327
- return redux_novec_unroller<Func, Derived, 0, Size>::run(mat,func);
379
+ } else {
380
+ return redux_novec_linear_unroller<Func, Evaluator, 0, Size>::run(eval, func);
328
381
  }
329
382
  }
330
383
  };
331
384
 
332
385
  // evaluator adaptor
333
- template<typename _XprType>
334
- class redux_evaluator
335
- {
336
- public:
337
- typedef _XprType XprType;
338
- EIGEN_DEVICE_FUNC explicit redux_evaluator(const XprType &xpr) : m_evaluator(xpr), m_xpr(xpr) {}
339
-
386
+ template <typename XprType_>
387
+ class redux_evaluator : public internal::evaluator<XprType_> {
388
+ typedef internal::evaluator<XprType_> Base;
389
+
390
+ public:
391
+ typedef XprType_ XprType;
392
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit redux_evaluator(const XprType& xpr) : Base(xpr) {}
393
+
340
394
  typedef typename XprType::Scalar Scalar;
341
395
  typedef typename XprType::CoeffReturnType CoeffReturnType;
342
396
  typedef typename XprType::PacketScalar PacketScalar;
343
- typedef typename XprType::PacketReturnType PacketReturnType;
344
-
397
+
345
398
  enum {
346
399
  MaxRowsAtCompileTime = XprType::MaxRowsAtCompileTime,
347
400
  MaxColsAtCompileTime = XprType::MaxColsAtCompileTime,
348
- // TODO we should not remove DirectAccessBit and rather find an elegant way to query the alignment offset at runtime from the evaluator
349
- Flags = evaluator<XprType>::Flags & ~DirectAccessBit,
401
+ // TODO we should not remove DirectAccessBit and rather find an elegant way to query the alignment offset at runtime
402
+ // from the evaluator
403
+ Flags = Base::Flags & ~DirectAccessBit,
350
404
  IsRowMajor = XprType::IsRowMajor,
351
405
  SizeAtCompileTime = XprType::SizeAtCompileTime,
352
- InnerSizeAtCompileTime = XprType::InnerSizeAtCompileTime,
353
- CoeffReadCost = evaluator<XprType>::CoeffReadCost,
354
- Alignment = evaluator<XprType>::Alignment
406
+ InnerSizeAtCompileTime = XprType::InnerSizeAtCompileTime
355
407
  };
356
-
357
- EIGEN_DEVICE_FUNC Index rows() const { return m_xpr.rows(); }
358
- EIGEN_DEVICE_FUNC Index cols() const { return m_xpr.cols(); }
359
- EIGEN_DEVICE_FUNC Index size() const { return m_xpr.size(); }
360
- EIGEN_DEVICE_FUNC Index innerSize() const { return m_xpr.innerSize(); }
361
- EIGEN_DEVICE_FUNC Index outerSize() const { return m_xpr.outerSize(); }
362
-
363
- EIGEN_DEVICE_FUNC
364
- CoeffReturnType coeff(Index row, Index col) const
365
- { return m_evaluator.coeff(row, col); }
366
-
367
- EIGEN_DEVICE_FUNC
368
- CoeffReturnType coeff(Index index) const
369
- { return m_evaluator.coeff(index); }
370
-
371
- template<int LoadMode, typename PacketType>
372
- PacketType packet(Index row, Index col) const
373
- { return m_evaluator.template packet<LoadMode,PacketType>(row, col); }
374
-
375
- template<int LoadMode, typename PacketType>
376
- PacketType packet(Index index) const
377
- { return m_evaluator.template packet<LoadMode,PacketType>(index); }
378
-
379
- EIGEN_DEVICE_FUNC
380
- CoeffReturnType coeffByOuterInner(Index outer, Index inner) const
381
- { return m_evaluator.coeff(IsRowMajor ? outer : inner, IsRowMajor ? inner : outer); }
382
-
383
- template<int LoadMode, typename PacketType>
384
- PacketType packetByOuterInner(Index outer, Index inner) const
385
- { return m_evaluator.template packet<LoadMode,PacketType>(IsRowMajor ? outer : inner, IsRowMajor ? inner : outer); }
386
-
387
- const XprType & nestedExpression() const { return m_xpr; }
388
-
389
- protected:
390
- internal::evaluator<XprType> m_evaluator;
391
- const XprType &m_xpr;
408
+
409
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeffByOuterInner(Index outer, Index inner) const {
410
+ return Base::coeff(IsRowMajor ? outer : inner, IsRowMajor ? inner : outer);
411
+ }
412
+
413
+ template <int LoadMode, typename PacketType>
414
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketType packetByOuterInner(Index outer, Index inner) const {
415
+ return Base::template packet<LoadMode, PacketType>(IsRowMajor ? outer : inner, IsRowMajor ? inner : outer);
416
+ }
417
+
418
+ template <int LoadMode, typename PacketType>
419
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketType packetSegmentByOuterInner(Index outer, Index inner, Index begin,
420
+ Index count) const {
421
+ return Base::template packetSegment<LoadMode, PacketType>(IsRowMajor ? outer : inner, IsRowMajor ? inner : outer,
422
+ begin, count);
423
+ }
392
424
  };
393
425
 
394
- } // end namespace internal
426
+ } // end namespace internal
395
427
 
396
428
  /***************************************************************************
397
- * Part 4 : public API
398
- ***************************************************************************/
399
-
429
+ * Part 4 : public API
430
+ ***************************************************************************/
400
431
 
401
432
  /** \returns the result of a full redux operation on the whole matrix or vector using \a func
402
- *
403
- * The template parameter \a BinaryOp is the type of the functor \a func which must be
404
- * an associative operator. Both current C++98 and C++11 functor styles are handled.
405
- *
406
- * \sa DenseBase::sum(), DenseBase::minCoeff(), DenseBase::maxCoeff(), MatrixBase::colwise(), MatrixBase::rowwise()
407
- */
408
- template<typename Derived>
409
- template<typename Func>
410
- EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar
411
- DenseBase<Derived>::redux(const Func& func) const
412
- {
413
- eigen_assert(this->rows()>0 && this->cols()>0 && "you are using an empty matrix");
433
+ *
434
+ * The template parameter \a BinaryOp is the type of the functor \a func which must be
435
+ * an associative operator. Both current C++98 and C++11 functor styles are handled.
436
+ *
437
+ * \warning the matrix must be not empty, otherwise an assertion is triggered.
438
+ *
439
+ * \sa DenseBase::sum(), DenseBase::minCoeff(), DenseBase::maxCoeff(), MatrixBase::colwise(), MatrixBase::rowwise()
440
+ */
441
+ template <typename Derived>
442
+ template <typename Func>
443
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar DenseBase<Derived>::redux(
444
+ const Func& func) const {
445
+ eigen_assert(this->rows() > 0 && this->cols() > 0 && "you are using an empty matrix");
414
446
 
415
447
  typedef typename internal::redux_evaluator<Derived> ThisEvaluator;
416
448
  ThisEvaluator thisEval(derived());
417
-
418
- return internal::redux_impl<Func, ThisEvaluator>::run(thisEval, func);
449
+
450
+ // The initial expression is passed to the reducer as an additional argument instead of
451
+ // passing it as a member of redux_evaluator to help
452
+ return internal::redux_impl<Func, ThisEvaluator>::run(thisEval, func, derived());
419
453
  }
420
454
 
421
455
  /** \returns the minimum of all coefficients of \c *this.
422
- * \warning the result is undefined if \c *this contains NaN.
423
- */
424
- template<typename Derived>
425
- EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar
426
- DenseBase<Derived>::minCoeff() const
427
- {
428
- return derived().redux(Eigen::internal::scalar_min_op<Scalar,Scalar>());
456
+ * In case \c *this contains NaN, NaNPropagation determines the behavior:
457
+ * NaNPropagation == PropagateFast : undefined
458
+ * NaNPropagation == PropagateNaN : result is NaN
459
+ * NaNPropagation == PropagateNumbers : result is minimum of elements that are not NaN
460
+ * \warning the matrix must be not empty, otherwise an assertion is triggered.
461
+ */
462
+ template <typename Derived>
463
+ template <int NaNPropagation>
464
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar DenseBase<Derived>::minCoeff() const {
465
+ return derived().redux(Eigen::internal::scalar_min_op<Scalar, Scalar, NaNPropagation>());
429
466
  }
430
467
 
431
468
  /** \returns the maximum of all coefficients of \c *this.
432
- * \warning the result is undefined if \c *this contains NaN.
433
- */
434
- template<typename Derived>
435
- EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar
436
- DenseBase<Derived>::maxCoeff() const
437
- {
438
- return derived().redux(Eigen::internal::scalar_max_op<Scalar,Scalar>());
469
+ * In case \c *this contains NaN, NaNPropagation determines the behavior:
470
+ * NaNPropagation == PropagateFast : undefined
471
+ * NaNPropagation == PropagateNaN : result is NaN
472
+ * NaNPropagation == PropagateNumbers : result is maximum of elements that are not NaN
473
+ * \warning the matrix must be not empty, otherwise an assertion is triggered.
474
+ */
475
+ template <typename Derived>
476
+ template <int NaNPropagation>
477
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar DenseBase<Derived>::maxCoeff() const {
478
+ return derived().redux(Eigen::internal::scalar_max_op<Scalar, Scalar, NaNPropagation>());
439
479
  }
440
480
 
441
481
  /** \returns the sum of all coefficients of \c *this
442
- *
443
- * If \c *this is empty, then the value 0 is returned.
444
- *
445
- * \sa trace(), prod(), mean()
446
- */
447
- template<typename Derived>
448
- EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar
449
- DenseBase<Derived>::sum() const
450
- {
451
- if(SizeAtCompileTime==0 || (SizeAtCompileTime==Dynamic && size()==0))
452
- return Scalar(0);
453
- return derived().redux(Eigen::internal::scalar_sum_op<Scalar,Scalar>());
482
+ *
483
+ * If \c *this is empty, then the value 0 is returned.
484
+ *
485
+ * \sa trace(), prod(), mean()
486
+ */
487
+ template <typename Derived>
488
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar DenseBase<Derived>::sum() const {
489
+ if (SizeAtCompileTime == 0 || (SizeAtCompileTime == Dynamic && size() == 0)) return Scalar(0);
490
+ return derived().redux(Eigen::internal::scalar_sum_op<Scalar, Scalar>());
454
491
  }
455
492
 
456
493
  /** \returns the mean of all coefficients of *this
457
- *
458
- * \sa trace(), prod(), sum()
459
- */
460
- template<typename Derived>
461
- EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar
462
- DenseBase<Derived>::mean() const
463
- {
494
+ *
495
+ * \sa trace(), prod(), sum()
496
+ */
497
+ template <typename Derived>
498
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar DenseBase<Derived>::mean() const {
464
499
  #ifdef __INTEL_COMPILER
465
- #pragma warning push
466
- #pragma warning ( disable : 2259 )
500
+ #pragma warning push
501
+ #pragma warning(disable : 2259)
467
502
  #endif
468
- return Scalar(derived().redux(Eigen::internal::scalar_sum_op<Scalar,Scalar>())) / Scalar(this->size());
503
+ return Scalar(derived().redux(Eigen::internal::scalar_sum_op<Scalar, Scalar>())) / Scalar(this->size());
469
504
  #ifdef __INTEL_COMPILER
470
- #pragma warning pop
505
+ #pragma warning pop
471
506
  #endif
472
507
  }
473
508
 
474
509
  /** \returns the product of all coefficients of *this
475
- *
476
- * Example: \include MatrixBase_prod.cpp
477
- * Output: \verbinclude MatrixBase_prod.out
478
- *
479
- * \sa sum(), mean(), trace()
480
- */
481
- template<typename Derived>
482
- EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar
483
- DenseBase<Derived>::prod() const
484
- {
485
- if(SizeAtCompileTime==0 || (SizeAtCompileTime==Dynamic && size()==0))
486
- return Scalar(1);
510
+ *
511
+ * Example: \include MatrixBase_prod.cpp
512
+ * Output: \verbinclude MatrixBase_prod.out
513
+ *
514
+ * \sa sum(), mean(), trace()
515
+ */
516
+ template <typename Derived>
517
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar DenseBase<Derived>::prod() const {
518
+ if (SizeAtCompileTime == 0 || (SizeAtCompileTime == Dynamic && size() == 0)) return Scalar(1);
487
519
  return derived().redux(Eigen::internal::scalar_product_op<Scalar>());
488
520
  }
489
521
 
490
522
  /** \returns the trace of \c *this, i.e. the sum of the coefficients on the main diagonal.
491
- *
492
- * \c *this can be any matrix, not necessarily square.
493
- *
494
- * \sa diagonal(), sum()
495
- */
496
- template<typename Derived>
497
- EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar
498
- MatrixBase<Derived>::trace() const
499
- {
523
+ *
524
+ * \c *this can be any matrix, not necessarily square.
525
+ *
526
+ * \sa diagonal(), sum()
527
+ */
528
+ template <typename Derived>
529
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar MatrixBase<Derived>::trace() const {
500
530
  return derived().diagonal().sum();
501
531
  }
502
532
 
503
- } // end namespace Eigen
533
+ } // end namespace Eigen
504
534
 
505
- #endif // EIGEN_REDUX_H
535
+ #endif // EIGEN_REDUX_H