@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
@@ -13,134 +13,52 @@
13
13
  // This file contains many lightweight helper classes used to
14
14
  // implement and control fast level 2 and level 3 BLAS-like routines.
15
15
 
16
+ // IWYU pragma: private
17
+ #include "../InternalHeaderCheck.h"
18
+
16
19
  namespace Eigen {
17
20
 
18
21
  namespace internal {
19
22
 
20
23
  // forward declarations
21
- template<typename LhsScalar, typename RhsScalar, typename Index, typename DataMapper, int mr, int nr, bool ConjugateLhs=false, bool ConjugateRhs=false>
24
+ template <typename LhsScalar, typename RhsScalar, typename Index, typename DataMapper, int mr, int nr,
25
+ bool ConjugateLhs = false, bool ConjugateRhs = false>
22
26
  struct gebp_kernel;
23
27
 
24
- template<typename Scalar, typename Index, typename DataMapper, int nr, int StorageOrder, bool Conjugate = false, bool PanelMode=false>
28
+ template <typename Scalar, typename Index, typename DataMapper, int nr, int StorageOrder, bool Conjugate = false,
29
+ bool PanelMode = false>
25
30
  struct gemm_pack_rhs;
26
31
 
27
- template<typename Scalar, typename Index, typename DataMapper, int Pack1, int Pack2, int StorageOrder, bool Conjugate = false, bool PanelMode = false>
32
+ template <typename Scalar, typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, int StorageOrder,
33
+ bool Conjugate = false, bool PanelMode = false>
28
34
  struct gemm_pack_lhs;
29
35
 
30
- template<
31
- typename Index,
32
- typename LhsScalar, int LhsStorageOrder, bool ConjugateLhs,
33
- typename RhsScalar, int RhsStorageOrder, bool ConjugateRhs,
34
- int ResStorageOrder, int ResInnerStride>
36
+ template <typename Index, typename LhsScalar, int LhsStorageOrder, bool ConjugateLhs, typename RhsScalar,
37
+ int RhsStorageOrder, bool ConjugateRhs, int ResStorageOrder, int ResInnerStride>
35
38
  struct general_matrix_matrix_product;
36
39
 
37
- template<typename Index,
38
- typename LhsScalar, typename LhsMapper, int LhsStorageOrder, bool ConjugateLhs,
39
- typename RhsScalar, typename RhsMapper, bool ConjugateRhs, int Version=Specialized>
40
+ template <typename Index, typename LhsScalar, typename LhsMapper, int LhsStorageOrder, bool ConjugateLhs,
41
+ typename RhsScalar, typename RhsMapper, bool ConjugateRhs, int Version = Specialized>
40
42
  struct general_matrix_vector_product;
41
43
 
42
-
43
- template<bool Conjugate> struct conj_if;
44
-
45
- template<> struct conj_if<true> {
46
- template<typename T>
47
- inline T operator()(const T& x) const { return numext::conj(x); }
48
- template<typename T>
49
- inline T pconj(const T& x) const { return internal::pconj(x); }
50
- };
51
-
52
- template<> struct conj_if<false> {
53
- template<typename T>
54
- inline const T& operator()(const T& x) const { return x; }
55
- template<typename T>
56
- inline const T& pconj(const T& x) const { return x; }
57
- };
58
-
59
- // Generic implementation for custom complex types.
60
- template<typename LhsScalar, typename RhsScalar, bool ConjLhs, bool ConjRhs>
61
- struct conj_helper
62
- {
63
- typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar>::ReturnType Scalar;
64
-
65
- EIGEN_STRONG_INLINE Scalar pmadd(const LhsScalar& x, const RhsScalar& y, const Scalar& c) const
66
- { return padd(c, pmul(x,y)); }
67
-
68
- EIGEN_STRONG_INLINE Scalar pmul(const LhsScalar& x, const RhsScalar& y) const
69
- { return conj_if<ConjLhs>()(x) * conj_if<ConjRhs>()(y); }
70
- };
71
-
72
- template<typename Scalar> struct conj_helper<Scalar,Scalar,false,false>
73
- {
74
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar pmadd(const Scalar& x, const Scalar& y, const Scalar& c) const { return internal::pmadd(x,y,c); }
75
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar pmul(const Scalar& x, const Scalar& y) const { return internal::pmul(x,y); }
76
- };
77
-
78
- template<typename RealScalar> struct conj_helper<std::complex<RealScalar>, std::complex<RealScalar>, false,true>
79
- {
80
- typedef std::complex<RealScalar> Scalar;
81
- EIGEN_STRONG_INLINE Scalar pmadd(const Scalar& x, const Scalar& y, const Scalar& c) const
82
- { return c + pmul(x,y); }
83
-
84
- EIGEN_STRONG_INLINE Scalar pmul(const Scalar& x, const Scalar& y) const
85
- { return Scalar(numext::real(x)*numext::real(y) + numext::imag(x)*numext::imag(y), numext::imag(x)*numext::real(y) - numext::real(x)*numext::imag(y)); }
86
- };
87
-
88
- template<typename RealScalar> struct conj_helper<std::complex<RealScalar>, std::complex<RealScalar>, true,false>
89
- {
90
- typedef std::complex<RealScalar> Scalar;
91
- EIGEN_STRONG_INLINE Scalar pmadd(const Scalar& x, const Scalar& y, const Scalar& c) const
92
- { return c + pmul(x,y); }
93
-
94
- EIGEN_STRONG_INLINE Scalar pmul(const Scalar& x, const Scalar& y) const
95
- { return Scalar(numext::real(x)*numext::real(y) + numext::imag(x)*numext::imag(y), numext::real(x)*numext::imag(y) - numext::imag(x)*numext::real(y)); }
96
- };
97
-
98
- template<typename RealScalar> struct conj_helper<std::complex<RealScalar>, std::complex<RealScalar>, true,true>
99
- {
100
- typedef std::complex<RealScalar> Scalar;
101
- EIGEN_STRONG_INLINE Scalar pmadd(const Scalar& x, const Scalar& y, const Scalar& c) const
102
- { return c + pmul(x,y); }
103
-
104
- EIGEN_STRONG_INLINE Scalar pmul(const Scalar& x, const Scalar& y) const
105
- { return Scalar(numext::real(x)*numext::real(y) - numext::imag(x)*numext::imag(y), - numext::real(x)*numext::imag(y) - numext::imag(x)*numext::real(y)); }
106
- };
107
-
108
- template<typename RealScalar,bool Conj> struct conj_helper<std::complex<RealScalar>, RealScalar, Conj,false>
109
- {
110
- typedef std::complex<RealScalar> Scalar;
111
- EIGEN_STRONG_INLINE Scalar pmadd(const Scalar& x, const RealScalar& y, const Scalar& c) const
112
- { return padd(c, pmul(x,y)); }
113
- EIGEN_STRONG_INLINE Scalar pmul(const Scalar& x, const RealScalar& y) const
114
- { return conj_if<Conj>()(x)*y; }
115
- };
116
-
117
- template<typename RealScalar,bool Conj> struct conj_helper<RealScalar, std::complex<RealScalar>, false,Conj>
118
- {
119
- typedef std::complex<RealScalar> Scalar;
120
- EIGEN_STRONG_INLINE Scalar pmadd(const RealScalar& x, const Scalar& y, const Scalar& c) const
121
- { return padd(c, pmul(x,y)); }
122
- EIGEN_STRONG_INLINE Scalar pmul(const RealScalar& x, const Scalar& y) const
123
- { return x*conj_if<Conj>()(y); }
124
- };
125
-
126
- template<typename From,typename To> struct get_factor {
44
+ template <typename From, typename To>
45
+ struct get_factor {
127
46
  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE To run(const From& x) { return To(x); }
128
47
  };
129
48
 
130
- template<typename Scalar> struct get_factor<Scalar,typename NumTraits<Scalar>::Real> {
131
- EIGEN_DEVICE_FUNC
132
- static EIGEN_STRONG_INLINE typename NumTraits<Scalar>::Real run(const Scalar& x) { return numext::real(x); }
49
+ template <typename Scalar>
50
+ struct get_factor<Scalar, typename NumTraits<Scalar>::Real> {
51
+ EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE typename NumTraits<Scalar>::Real run(const Scalar& x) {
52
+ return numext::real(x);
53
+ }
133
54
  };
134
55
 
135
-
136
- template<typename Scalar, typename Index>
56
+ template <typename Scalar, typename Index>
137
57
  class BlasVectorMapper {
138
- public:
139
- EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE BlasVectorMapper(Scalar *data) : m_data(data) {}
58
+ public:
59
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE BlasVectorMapper(Scalar* data) : m_data(data) {}
140
60
 
141
- EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Scalar operator()(Index i) const {
142
- return m_data[i];
143
- }
61
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Scalar operator()(Index i) const { return m_data[i]; }
144
62
  template <typename Packet, int AlignmentType>
145
63
  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet load(Index i) const {
146
64
  return ploadt<Packet, AlignmentType>(m_data + i);
@@ -148,122 +66,198 @@ class BlasVectorMapper {
148
66
 
149
67
  template <typename Packet>
150
68
  EIGEN_DEVICE_FUNC bool aligned(Index i) const {
151
- return (UIntPtr(m_data+i)%sizeof(Packet))==0;
69
+ return (std::uintptr_t(m_data + i) % sizeof(Packet)) == 0;
152
70
  }
153
71
 
154
- protected:
72
+ protected:
155
73
  Scalar* m_data;
156
74
  };
157
75
 
158
- template<typename Scalar, typename Index, int AlignmentType, int Incr=1>
76
+ template <typename Scalar, typename Index, int AlignmentType, int Incr = 1>
159
77
  class BlasLinearMapper;
160
78
 
161
- template<typename Scalar, typename Index, int AlignmentType>
162
- class BlasLinearMapper<Scalar,Index,AlignmentType,1> {
163
- public:
164
- typedef typename packet_traits<Scalar>::type Packet;
165
- typedef typename packet_traits<Scalar>::half HalfPacket;
166
-
167
- EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE BlasLinearMapper(Scalar *data, Index incr=1)
168
- : m_data(data)
169
- {
79
+ template <typename Scalar, typename Index, int AlignmentType>
80
+ class BlasLinearMapper<Scalar, Index, AlignmentType> {
81
+ public:
82
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE BlasLinearMapper(Scalar* data, Index incr = 1) : m_data(data) {
170
83
  EIGEN_ONLY_USED_FOR_DEBUG(incr);
171
- eigen_assert(incr==1);
84
+ eigen_assert(incr == 1);
172
85
  }
173
86
 
174
- EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void prefetch(int i) const {
175
- internal::prefetch(&operator()(i));
87
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void prefetch(Index i) const { internal::prefetch(&operator()(i)); }
88
+
89
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Scalar& operator()(Index i) const { return m_data[i]; }
90
+
91
+ template <typename PacketType>
92
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketType loadPacket(Index i) const {
93
+ return ploadt<PacketType, AlignmentType>(m_data + i);
176
94
  }
177
95
 
178
- EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Scalar& operator()(Index i) const {
179
- return m_data[i];
96
+ template <typename PacketType>
97
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketType loadPacketPartial(Index i, Index n, Index offset = 0) const {
98
+ return ploadt_partial<PacketType, AlignmentType>(m_data + i, n, offset);
180
99
  }
181
100
 
182
- EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet loadPacket(Index i) const {
183
- return ploadt<Packet, AlignmentType>(m_data + i);
101
+ template <typename PacketType, int AlignmentT>
102
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketType load(Index i) const {
103
+ return ploadt<PacketType, AlignmentT>(m_data + i);
184
104
  }
185
105
 
186
- EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE HalfPacket loadHalfPacket(Index i) const {
187
- return ploadt<HalfPacket, AlignmentType>(m_data + i);
106
+ template <typename PacketType>
107
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacket(Index i, const PacketType& p) const {
108
+ pstoret<Scalar, PacketType, AlignmentType>(m_data + i, p);
188
109
  }
189
110
 
190
- EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacket(Index i, const Packet &p) const {
191
- pstoret<Scalar, Packet, AlignmentType>(m_data + i, p);
111
+ template <typename PacketType>
112
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacketPartial(Index i, const PacketType& p, Index n,
113
+ Index offset = 0) const {
114
+ pstoret_partial<Scalar, PacketType, AlignmentType>(m_data + i, p, n, offset);
192
115
  }
193
116
 
194
- protected:
195
- Scalar *m_data;
117
+ protected:
118
+ Scalar* m_data;
196
119
  };
197
120
 
198
121
  // Lightweight helper class to access matrix coefficients.
199
- template<typename Scalar, typename Index, int StorageOrder, int AlignmentType = Unaligned, int Incr = 1>
122
+ template <typename Scalar, typename Index, int StorageOrder, int AlignmentType = Unaligned, int Incr = 1>
200
123
  class blas_data_mapper;
201
124
 
202
- template<typename Scalar, typename Index, int StorageOrder, int AlignmentType>
203
- class blas_data_mapper<Scalar,Index,StorageOrder,AlignmentType,1>
204
- {
205
- public:
206
- typedef typename packet_traits<Scalar>::type Packet;
207
- typedef typename packet_traits<Scalar>::half HalfPacket;
125
+ // TMP to help PacketBlock store implementation.
126
+ // There's currently no known use case for PacketBlock load.
127
+ // The default implementation assumes ColMajor order.
128
+ // It always store each packet sequentially one `stride` apart.
129
+ template <typename Index, typename Scalar, typename Packet, int n, int idx, int StorageOrder>
130
+ struct PacketBlockManagement {
131
+ PacketBlockManagement<Index, Scalar, Packet, n, idx - 1, StorageOrder> pbm;
132
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(Scalar* to, const Index stride, Index i, Index j,
133
+ const PacketBlock<Packet, n>& block) const {
134
+ pbm.store(to, stride, i, j, block);
135
+ pstoreu<Scalar>(to + i + (j + idx) * stride, block.packet[idx]);
136
+ }
137
+ };
208
138
 
139
+ // PacketBlockManagement specialization to take care of RowMajor order without ifs.
140
+ template <typename Index, typename Scalar, typename Packet, int n, int idx>
141
+ struct PacketBlockManagement<Index, Scalar, Packet, n, idx, RowMajor> {
142
+ PacketBlockManagement<Index, Scalar, Packet, n, idx - 1, RowMajor> pbm;
143
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(Scalar* to, const Index stride, Index i, Index j,
144
+ const PacketBlock<Packet, n>& block) const {
145
+ pbm.store(to, stride, i, j, block);
146
+ pstoreu<Scalar>(to + j + (i + idx) * stride, block.packet[idx]);
147
+ }
148
+ };
149
+
150
+ template <typename Index, typename Scalar, typename Packet, int n, int StorageOrder>
151
+ struct PacketBlockManagement<Index, Scalar, Packet, n, -1, StorageOrder> {
152
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(Scalar* to, const Index stride, Index i, Index j,
153
+ const PacketBlock<Packet, n>& block) const {
154
+ EIGEN_UNUSED_VARIABLE(to);
155
+ EIGEN_UNUSED_VARIABLE(stride);
156
+ EIGEN_UNUSED_VARIABLE(i);
157
+ EIGEN_UNUSED_VARIABLE(j);
158
+ EIGEN_UNUSED_VARIABLE(block);
159
+ }
160
+ };
161
+
162
+ template <typename Index, typename Scalar, typename Packet, int n>
163
+ struct PacketBlockManagement<Index, Scalar, Packet, n, -1, RowMajor> {
164
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(Scalar* to, const Index stride, Index i, Index j,
165
+ const PacketBlock<Packet, n>& block) const {
166
+ EIGEN_UNUSED_VARIABLE(to);
167
+ EIGEN_UNUSED_VARIABLE(stride);
168
+ EIGEN_UNUSED_VARIABLE(i);
169
+ EIGEN_UNUSED_VARIABLE(j);
170
+ EIGEN_UNUSED_VARIABLE(block);
171
+ }
172
+ };
173
+
174
+ template <typename Scalar, typename Index, int StorageOrder, int AlignmentType>
175
+ class blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType, 1> {
176
+ public:
209
177
  typedef BlasLinearMapper<Scalar, Index, AlignmentType> LinearMapper;
178
+ typedef blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType> SubMapper;
210
179
  typedef BlasVectorMapper<Scalar, Index> VectorMapper;
211
180
 
212
- EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE blas_data_mapper(Scalar* data, Index stride, Index incr=1)
213
- : m_data(data), m_stride(stride)
214
- {
181
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE blas_data_mapper(Scalar* data, Index stride, Index incr = 1)
182
+ : m_data(data), m_stride(stride) {
215
183
  EIGEN_ONLY_USED_FOR_DEBUG(incr);
216
- eigen_assert(incr==1);
184
+ eigen_assert(incr == 1);
217
185
  }
218
186
 
219
- EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType>
220
- getSubMapper(Index i, Index j) const {
221
- return blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType>(&operator()(i, j), m_stride);
187
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE SubMapper getSubMapper(Index i, Index j) const {
188
+ return SubMapper(&operator()(i, j), m_stride);
222
189
  }
223
190
 
224
- EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE LinearMapper getLinearMapper(Index i, Index j) const {
191
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE LinearMapper getLinearMapper(Index i, Index j) const {
225
192
  return LinearMapper(&operator()(i, j));
226
193
  }
227
194
 
228
- EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE VectorMapper getVectorMapper(Index i, Index j) const {
195
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE VectorMapper getVectorMapper(Index i, Index j) const {
229
196
  return VectorMapper(&operator()(i, j));
230
197
  }
231
198
 
199
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void prefetch(Index i, Index j) const { internal::prefetch(&operator()(i, j)); }
232
200
 
233
- EIGEN_DEVICE_FUNC
234
- EIGEN_ALWAYS_INLINE Scalar& operator()(Index i, Index j) const {
235
- return m_data[StorageOrder==RowMajor ? j + i*m_stride : i + j*m_stride];
201
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Scalar& operator()(Index i, Index j) const {
202
+ return m_data[StorageOrder == RowMajor ? j + i * m_stride : i + j * m_stride];
236
203
  }
237
204
 
238
- EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet loadPacket(Index i, Index j) const {
239
- return ploadt<Packet, AlignmentType>(&operator()(i, j));
205
+ template <typename PacketType>
206
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketType loadPacket(Index i, Index j) const {
207
+ return ploadt<PacketType, AlignmentType>(&operator()(i, j));
240
208
  }
241
209
 
242
- EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE HalfPacket loadHalfPacket(Index i, Index j) const {
243
- return ploadt<HalfPacket, AlignmentType>(&operator()(i, j));
210
+ template <typename PacketType>
211
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketType loadPacketPartial(Index i, Index j, Index n,
212
+ Index offset = 0) const {
213
+ return ploadt_partial<PacketType, AlignmentType>(&operator()(i, j), n, offset);
244
214
  }
245
215
 
246
- template<typename SubPacket>
247
- EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void scatterPacket(Index i, Index j, const SubPacket &p) const {
216
+ template <typename PacketT, int AlignmentT>
217
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketT load(Index i, Index j) const {
218
+ return ploadt<PacketT, AlignmentT>(&operator()(i, j));
219
+ }
220
+
221
+ template <typename PacketType>
222
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacket(Index i, Index j, const PacketType& p) const {
223
+ pstoret<Scalar, PacketType, AlignmentType>(&operator()(i, j), p);
224
+ }
225
+
226
+ template <typename PacketType>
227
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacketPartial(Index i, Index j, const PacketType& p, Index n,
228
+ Index offset = 0) const {
229
+ pstoret_partial<Scalar, PacketType, AlignmentType>(&operator()(i, j), p, n, offset);
230
+ }
231
+
232
+ template <typename SubPacket>
233
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void scatterPacket(Index i, Index j, const SubPacket& p) const {
248
234
  pscatter<Scalar, SubPacket>(&operator()(i, j), p, m_stride);
249
235
  }
250
236
 
251
- template<typename SubPacket>
237
+ template <typename SubPacket>
252
238
  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE SubPacket gatherPacket(Index i, Index j) const {
253
239
  return pgather<Scalar, SubPacket>(&operator()(i, j), m_stride);
254
240
  }
255
241
 
256
242
  EIGEN_DEVICE_FUNC const Index stride() const { return m_stride; }
257
- EIGEN_DEVICE_FUNC const Scalar* data() const { return m_data; }
243
+ EIGEN_DEVICE_FUNC const Index incr() const { return 1; }
244
+ EIGEN_DEVICE_FUNC constexpr const Scalar* data() const { return m_data; }
258
245
 
259
246
  EIGEN_DEVICE_FUNC Index firstAligned(Index size) const {
260
- if (UIntPtr(m_data)%sizeof(Scalar)) {
247
+ if (std::uintptr_t(m_data) % sizeof(Scalar)) {
261
248
  return -1;
262
249
  }
263
250
  return internal::first_default_aligned(m_data, size);
264
251
  }
265
252
 
266
- protected:
253
+ template <typename SubPacket, int n>
254
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacketBlock(Index i, Index j,
255
+ const PacketBlock<SubPacket, n>& block) const {
256
+ PacketBlockManagement<Index, Scalar, SubPacket, n, n - 1, StorageOrder> pbm;
257
+ pbm.store(m_data, m_stride, i, j, block);
258
+ }
259
+
260
+ protected:
267
261
  Scalar* EIGEN_RESTRICT m_data;
268
262
  const Index m_stride;
269
263
  };
@@ -271,229 +265,358 @@ public:
271
265
  // Implementation of non-natural increment (i.e. inner-stride != 1)
272
266
  // The exposed API is not complete yet compared to the Incr==1 case
273
267
  // because some features makes less sense in this case.
274
- template<typename Scalar, typename Index, int AlignmentType, int Incr>
275
- class BlasLinearMapper
276
- {
277
- public:
278
- typedef typename packet_traits<Scalar>::type Packet;
279
- typedef typename packet_traits<Scalar>::half HalfPacket;
268
+ template <typename Scalar, typename Index, int AlignmentType, int Incr>
269
+ class BlasLinearMapper {
270
+ public:
271
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE BlasLinearMapper(Scalar* data, Index incr) : m_data(data), m_incr(incr) {}
272
+
273
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void prefetch(int i) const { internal::prefetch(&operator()(i)); }
280
274
 
281
- EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE BlasLinearMapper(Scalar *data,Index incr) : m_data(data), m_incr(incr) {}
275
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Scalar& operator()(Index i) const { return m_data[i * m_incr.value()]; }
282
276
 
283
- EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void prefetch(int i) const {
284
- internal::prefetch(&operator()(i));
277
+ template <typename PacketType>
278
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketType loadPacket(Index i) const {
279
+ return pgather<Scalar, PacketType>(m_data + i * m_incr.value(), m_incr.value());
285
280
  }
286
281
 
287
- EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Scalar& operator()(Index i) const {
288
- return m_data[i*m_incr.value()];
282
+ template <typename PacketType>
283
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketType loadPacketPartial(Index i, Index n, Index /*offset*/ = 0) const {
284
+ return pgather_partial<Scalar, PacketType>(m_data + i * m_incr.value(), m_incr.value(), n);
289
285
  }
290
286
 
291
- EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet loadPacket(Index i) const {
292
- return pgather<Scalar,Packet>(m_data + i*m_incr.value(), m_incr.value());
287
+ template <typename PacketType>
288
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacket(Index i, const PacketType& p) const {
289
+ pscatter<Scalar, PacketType>(m_data + i * m_incr.value(), p, m_incr.value());
293
290
  }
294
291
 
295
- template<typename PacketType>
296
- EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacket(Index i, const PacketType &p) const {
297
- pscatter<Scalar, PacketType>(m_data + i*m_incr.value(), p, m_incr.value());
292
+ template <typename PacketType>
293
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacketPartial(Index i, const PacketType& p, Index n,
294
+ Index /*offset*/ = 0) const {
295
+ pscatter_partial<Scalar, PacketType>(m_data + i * m_incr.value(), p, m_incr.value(), n);
298
296
  }
299
297
 
300
- protected:
301
- Scalar *m_data;
302
- const internal::variable_if_dynamic<Index,Incr> m_incr;
298
+ protected:
299
+ Scalar* m_data;
300
+ const internal::variable_if_dynamic<Index, Incr> m_incr;
303
301
  };
304
302
 
305
- template<typename Scalar, typename Index, int StorageOrder, int AlignmentType,int Incr>
306
- class blas_data_mapper
307
- {
308
- public:
309
- typedef typename packet_traits<Scalar>::type Packet;
310
- typedef typename packet_traits<Scalar>::half HalfPacket;
311
-
312
- typedef BlasLinearMapper<Scalar, Index, AlignmentType,Incr> LinearMapper;
303
+ template <typename Scalar, typename Index, int StorageOrder, int AlignmentType, int Incr>
304
+ class blas_data_mapper {
305
+ public:
306
+ typedef BlasLinearMapper<Scalar, Index, AlignmentType, Incr> LinearMapper;
307
+ typedef blas_data_mapper SubMapper;
313
308
 
314
- EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE blas_data_mapper(Scalar* data, Index stride, Index incr) : m_data(data), m_stride(stride), m_incr(incr) {}
309
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE blas_data_mapper(Scalar* data, Index stride, Index incr)
310
+ : m_data(data), m_stride(stride), m_incr(incr) {}
315
311
 
316
- EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE blas_data_mapper
317
- getSubMapper(Index i, Index j) const {
318
- return blas_data_mapper(&operator()(i, j), m_stride, m_incr.value());
312
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE SubMapper getSubMapper(Index i, Index j) const {
313
+ return SubMapper(&operator()(i, j), m_stride, m_incr.value());
319
314
  }
320
315
 
321
- EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE LinearMapper getLinearMapper(Index i, Index j) const {
316
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE LinearMapper getLinearMapper(Index i, Index j) const {
322
317
  return LinearMapper(&operator()(i, j), m_incr.value());
323
318
  }
324
319
 
325
- EIGEN_DEVICE_FUNC
326
- EIGEN_ALWAYS_INLINE Scalar& operator()(Index i, Index j) const {
327
- return m_data[StorageOrder==RowMajor ? j*m_incr.value() + i*m_stride : i*m_incr.value() + j*m_stride];
320
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void prefetch(Index i, Index j) const { internal::prefetch(&operator()(i, j)); }
321
+
322
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Scalar& operator()(Index i, Index j) const {
323
+ return m_data[StorageOrder == RowMajor ? j * m_incr.value() + i * m_stride : i * m_incr.value() + j * m_stride];
324
+ }
325
+
326
+ template <typename PacketType>
327
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketType loadPacket(Index i, Index j) const {
328
+ return pgather<Scalar, PacketType>(&operator()(i, j), m_incr.value());
328
329
  }
329
330
 
330
- EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet loadPacket(Index i, Index j) const {
331
- return pgather<Scalar,Packet>(&operator()(i, j),m_incr.value());
331
+ template <typename PacketType>
332
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketType loadPacketPartial(Index i, Index j, Index n,
333
+ Index /*offset*/ = 0) const {
334
+ return pgather_partial<Scalar, PacketType>(&operator()(i, j), m_incr.value(), n);
332
335
  }
333
336
 
334
337
  template <typename PacketT, int AlignmentT>
335
338
  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketT load(Index i, Index j) const {
336
- return pgather<Scalar,PacketT>(&operator()(i, j),m_incr.value());
339
+ return pgather<Scalar, PacketT>(&operator()(i, j), m_incr.value());
337
340
  }
338
341
 
339
- template<typename SubPacket>
340
- EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void scatterPacket(Index i, Index j, const SubPacket &p) const {
342
+ template <typename PacketType>
343
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacket(Index i, Index j, const PacketType& p) const {
344
+ pscatter<Scalar, PacketType>(&operator()(i, j), p, m_incr.value());
345
+ }
346
+
347
+ template <typename PacketType>
348
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacketPartial(Index i, Index j, const PacketType& p, Index n,
349
+ Index /*offset*/ = 0) const {
350
+ pscatter_partial<Scalar, PacketType>(&operator()(i, j), p, m_incr.value(), n);
351
+ }
352
+
353
+ template <typename SubPacket>
354
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void scatterPacket(Index i, Index j, const SubPacket& p) const {
341
355
  pscatter<Scalar, SubPacket>(&operator()(i, j), p, m_stride);
342
356
  }
343
357
 
344
- template<typename SubPacket>
358
+ template <typename SubPacket>
345
359
  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE SubPacket gatherPacket(Index i, Index j) const {
346
360
  return pgather<Scalar, SubPacket>(&operator()(i, j), m_stride);
347
361
  }
348
362
 
349
- protected:
363
+ // storePacketBlock_helper defines a way to access values inside the PacketBlock, this is essentially required by the
364
+ // Complex types.
365
+ template <typename SubPacket, typename Scalar_, int n, int idx>
366
+ struct storePacketBlock_helper {
367
+ storePacketBlock_helper<SubPacket, Scalar_, n, idx - 1> spbh;
368
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(
369
+ const blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType, Incr>* sup, Index i, Index j,
370
+ const PacketBlock<SubPacket, n>& block) const {
371
+ spbh.store(sup, i, j, block);
372
+ sup->template storePacket<SubPacket>(i, j + idx, block.packet[idx]);
373
+ }
374
+ };
375
+
376
+ template <typename SubPacket, int n, int idx>
377
+ struct storePacketBlock_helper<SubPacket, std::complex<float>, n, idx> {
378
+ storePacketBlock_helper<SubPacket, std::complex<float>, n, idx - 1> spbh;
379
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(
380
+ const blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType, Incr>* sup, Index i, Index j,
381
+ const PacketBlock<SubPacket, n>& block) const {
382
+ spbh.store(sup, i, j, block);
383
+ sup->template storePacket<SubPacket>(i, j + idx, block.packet[idx]);
384
+ }
385
+ };
386
+
387
+ template <typename SubPacket, int n, int idx>
388
+ struct storePacketBlock_helper<SubPacket, std::complex<double>, n, idx> {
389
+ storePacketBlock_helper<SubPacket, std::complex<double>, n, idx - 1> spbh;
390
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(
391
+ const blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType, Incr>* sup, Index i, Index j,
392
+ const PacketBlock<SubPacket, n>& block) const {
393
+ spbh.store(sup, i, j, block);
394
+ for (int l = 0; l < unpacket_traits<SubPacket>::size; l++) {
395
+ std::complex<double>* v = &sup->operator()(i + l, j + idx);
396
+ v->real(block.packet[idx].v[2 * l + 0]);
397
+ v->imag(block.packet[idx].v[2 * l + 1]);
398
+ }
399
+ }
400
+ };
401
+
402
+ template <typename SubPacket, typename Scalar_, int n>
403
+ struct storePacketBlock_helper<SubPacket, Scalar_, n, -1> {
404
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(
405
+ const blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType, Incr>*, Index, Index,
406
+ const PacketBlock<SubPacket, n>&) const {}
407
+ };
408
+
409
+ template <typename SubPacket, int n>
410
+ struct storePacketBlock_helper<SubPacket, std::complex<float>, n, -1> {
411
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(
412
+ const blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType, Incr>*, Index, Index,
413
+ const PacketBlock<SubPacket, n>&) const {}
414
+ };
415
+
416
+ template <typename SubPacket, int n>
417
+ struct storePacketBlock_helper<SubPacket, std::complex<double>, n, -1> {
418
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(
419
+ const blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType, Incr>*, Index, Index,
420
+ const PacketBlock<SubPacket, n>&) const {}
421
+ };
422
+ // This function stores a PacketBlock on m_data, this approach is really quite slow compare to Incr=1 and should be
423
+ // avoided when possible.
424
+ template <typename SubPacket, int n>
425
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacketBlock(Index i, Index j,
426
+ const PacketBlock<SubPacket, n>& block) const {
427
+ storePacketBlock_helper<SubPacket, Scalar, n, n - 1> spb;
428
+ spb.store(this, i, j, block);
429
+ }
430
+
431
+ EIGEN_DEVICE_FUNC const Index stride() const { return m_stride; }
432
+ EIGEN_DEVICE_FUNC const Index incr() const { return m_incr.value(); }
433
+ EIGEN_DEVICE_FUNC constexpr Scalar* data() const { return m_data; }
434
+
435
+ protected:
350
436
  Scalar* EIGEN_RESTRICT m_data;
351
437
  const Index m_stride;
352
- const internal::variable_if_dynamic<Index,Incr> m_incr;
438
+ const internal::variable_if_dynamic<Index, Incr> m_incr;
353
439
  };
354
440
 
355
441
  // lightweight helper class to access matrix coefficients (const version)
356
- template<typename Scalar, typename Index, int StorageOrder>
442
+ template <typename Scalar, typename Index, int StorageOrder>
357
443
  class const_blas_data_mapper : public blas_data_mapper<const Scalar, Index, StorageOrder> {
358
- public:
359
- EIGEN_ALWAYS_INLINE const_blas_data_mapper(const Scalar *data, Index stride) : blas_data_mapper<const Scalar, Index, StorageOrder>(data, stride) {}
444
+ public:
445
+ typedef const_blas_data_mapper<Scalar, Index, StorageOrder> SubMapper;
360
446
 
361
- EIGEN_ALWAYS_INLINE const_blas_data_mapper<Scalar, Index, StorageOrder> getSubMapper(Index i, Index j) const {
362
- return const_blas_data_mapper<Scalar, Index, StorageOrder>(&(this->operator()(i, j)), this->m_stride);
447
+ EIGEN_ALWAYS_INLINE const_blas_data_mapper(const Scalar* data, Index stride)
448
+ : blas_data_mapper<const Scalar, Index, StorageOrder>(data, stride) {}
449
+
450
+ EIGEN_ALWAYS_INLINE SubMapper getSubMapper(Index i, Index j) const {
451
+ return SubMapper(&(this->operator()(i, j)), this->m_stride);
363
452
  }
364
453
  };
365
454
 
366
-
367
455
  /* Helper class to analyze the factors of a Product expression.
368
456
  * In particular it allows to pop out operator-, scalar multiples,
369
457
  * and conjugate */
370
- template<typename XprType> struct blas_traits
371
- {
458
+ template <typename XprType>
459
+ struct blas_traits {
372
460
  typedef typename traits<XprType>::Scalar Scalar;
373
461
  typedef const XprType& ExtractType;
374
- typedef XprType _ExtractType;
462
+ typedef XprType ExtractType_;
375
463
  enum {
376
464
  IsComplex = NumTraits<Scalar>::IsComplex,
377
465
  IsTransposed = false,
378
466
  NeedToConjugate = false,
379
- HasUsableDirectAccess = ( (int(XprType::Flags)&DirectAccessBit)
380
- && ( bool(XprType::IsVectorAtCompileTime)
381
- || int(inner_stride_at_compile_time<XprType>::ret) == 1)
382
- ) ? 1 : 0
467
+ HasUsableDirectAccess =
468
+ ((int(XprType::Flags) & DirectAccessBit) &&
469
+ (bool(XprType::IsVectorAtCompileTime) || int(inner_stride_at_compile_time<XprType>::ret) == 1))
470
+ ? 1
471
+ : 0,
472
+ HasScalarFactor = false
383
473
  };
384
- typedef typename conditional<bool(HasUsableDirectAccess),
385
- ExtractType,
386
- typename _ExtractType::PlainObject
387
- >::type DirectLinearAccessType;
388
- static inline ExtractType extract(const XprType& x) { return x; }
389
- static inline const Scalar extractScalarFactor(const XprType&) { return Scalar(1); }
474
+ typedef std::conditional_t<bool(HasUsableDirectAccess), ExtractType, typename ExtractType_::PlainObject>
475
+ DirectLinearAccessType;
476
+ EIGEN_DEVICE_FUNC static inline EIGEN_DEVICE_FUNC ExtractType extract(const XprType& x) { return x; }
477
+ EIGEN_DEVICE_FUNC static inline EIGEN_DEVICE_FUNC const Scalar extractScalarFactor(const XprType&) {
478
+ return Scalar(1);
479
+ }
390
480
  };
391
481
 
392
482
  // pop conjugate
393
- template<typename Scalar, typename NestedXpr>
394
- struct blas_traits<CwiseUnaryOp<scalar_conjugate_op<Scalar>, NestedXpr> >
395
- : blas_traits<NestedXpr>
396
- {
483
+ template <typename Scalar, typename NestedXpr>
484
+ struct blas_traits<CwiseUnaryOp<scalar_conjugate_op<Scalar>, NestedXpr> > : blas_traits<NestedXpr> {
397
485
  typedef blas_traits<NestedXpr> Base;
398
486
  typedef CwiseUnaryOp<scalar_conjugate_op<Scalar>, NestedXpr> XprType;
399
487
  typedef typename Base::ExtractType ExtractType;
400
488
 
401
- enum {
402
- IsComplex = NumTraits<Scalar>::IsComplex,
403
- NeedToConjugate = Base::NeedToConjugate ? 0 : IsComplex
404
- };
405
- static inline ExtractType extract(const XprType& x) { return Base::extract(x.nestedExpression()); }
406
- static inline Scalar extractScalarFactor(const XprType& x) { return conj(Base::extractScalarFactor(x.nestedExpression())); }
489
+ enum { IsComplex = NumTraits<Scalar>::IsComplex, NeedToConjugate = Base::NeedToConjugate ? 0 : IsComplex };
490
+ EIGEN_DEVICE_FUNC static inline ExtractType extract(const XprType& x) { return Base::extract(x.nestedExpression()); }
491
+ EIGEN_DEVICE_FUNC static inline Scalar extractScalarFactor(const XprType& x) {
492
+ return conj(Base::extractScalarFactor(x.nestedExpression()));
493
+ }
407
494
  };
408
495
 
409
496
  // pop scalar multiple
410
- template<typename Scalar, typename NestedXpr, typename Plain>
411
- struct blas_traits<CwiseBinaryOp<scalar_product_op<Scalar>, const CwiseNullaryOp<scalar_constant_op<Scalar>,Plain>, NestedXpr> >
412
- : blas_traits<NestedXpr>
413
- {
497
+ template <typename Scalar, typename NestedXpr, typename Plain>
498
+ struct blas_traits<
499
+ CwiseBinaryOp<scalar_product_op<Scalar>, const CwiseNullaryOp<scalar_constant_op<Scalar>, Plain>, NestedXpr> >
500
+ : blas_traits<NestedXpr> {
501
+ enum { HasScalarFactor = true };
414
502
  typedef blas_traits<NestedXpr> Base;
415
- typedef CwiseBinaryOp<scalar_product_op<Scalar>, const CwiseNullaryOp<scalar_constant_op<Scalar>,Plain>, NestedXpr> XprType;
503
+ typedef CwiseBinaryOp<scalar_product_op<Scalar>, const CwiseNullaryOp<scalar_constant_op<Scalar>, Plain>, NestedXpr>
504
+ XprType;
416
505
  typedef typename Base::ExtractType ExtractType;
417
- static inline ExtractType extract(const XprType& x) { return Base::extract(x.rhs()); }
418
- static inline Scalar extractScalarFactor(const XprType& x)
419
- { return x.lhs().functor().m_other * Base::extractScalarFactor(x.rhs()); }
506
+ EIGEN_DEVICE_FUNC static inline EIGEN_DEVICE_FUNC ExtractType extract(const XprType& x) {
507
+ return Base::extract(x.rhs());
508
+ }
509
+ EIGEN_DEVICE_FUNC static inline EIGEN_DEVICE_FUNC Scalar extractScalarFactor(const XprType& x) {
510
+ return x.lhs().functor().m_other * Base::extractScalarFactor(x.rhs());
511
+ }
420
512
  };
421
- template<typename Scalar, typename NestedXpr, typename Plain>
422
- struct blas_traits<CwiseBinaryOp<scalar_product_op<Scalar>, NestedXpr, const CwiseNullaryOp<scalar_constant_op<Scalar>,Plain> > >
423
- : blas_traits<NestedXpr>
424
- {
513
+ template <typename Scalar, typename NestedXpr, typename Plain>
514
+ struct blas_traits<
515
+ CwiseBinaryOp<scalar_product_op<Scalar>, NestedXpr, const CwiseNullaryOp<scalar_constant_op<Scalar>, Plain> > >
516
+ : blas_traits<NestedXpr> {
517
+ enum { HasScalarFactor = true };
425
518
  typedef blas_traits<NestedXpr> Base;
426
- typedef CwiseBinaryOp<scalar_product_op<Scalar>, NestedXpr, const CwiseNullaryOp<scalar_constant_op<Scalar>,Plain> > XprType;
519
+ typedef CwiseBinaryOp<scalar_product_op<Scalar>, NestedXpr, const CwiseNullaryOp<scalar_constant_op<Scalar>, Plain> >
520
+ XprType;
427
521
  typedef typename Base::ExtractType ExtractType;
428
- static inline ExtractType extract(const XprType& x) { return Base::extract(x.lhs()); }
429
- static inline Scalar extractScalarFactor(const XprType& x)
430
- { return Base::extractScalarFactor(x.lhs()) * x.rhs().functor().m_other; }
522
+ EIGEN_DEVICE_FUNC static inline ExtractType extract(const XprType& x) { return Base::extract(x.lhs()); }
523
+ EIGEN_DEVICE_FUNC static inline Scalar extractScalarFactor(const XprType& x) {
524
+ return Base::extractScalarFactor(x.lhs()) * x.rhs().functor().m_other;
525
+ }
431
526
  };
432
- template<typename Scalar, typename Plain1, typename Plain2>
433
- struct blas_traits<CwiseBinaryOp<scalar_product_op<Scalar>, const CwiseNullaryOp<scalar_constant_op<Scalar>,Plain1>,
434
- const CwiseNullaryOp<scalar_constant_op<Scalar>,Plain2> > >
435
- : blas_traits<CwiseNullaryOp<scalar_constant_op<Scalar>,Plain1> >
436
- {};
527
+ template <typename Scalar, typename Plain1, typename Plain2>
528
+ struct blas_traits<CwiseBinaryOp<scalar_product_op<Scalar>, const CwiseNullaryOp<scalar_constant_op<Scalar>, Plain1>,
529
+ const CwiseNullaryOp<scalar_constant_op<Scalar>, Plain2> > >
530
+ : blas_traits<CwiseNullaryOp<scalar_constant_op<Scalar>, Plain1> > {};
437
531
 
438
532
  // pop opposite
439
- template<typename Scalar, typename NestedXpr>
440
- struct blas_traits<CwiseUnaryOp<scalar_opposite_op<Scalar>, NestedXpr> >
441
- : blas_traits<NestedXpr>
442
- {
533
+ template <typename Scalar, typename NestedXpr>
534
+ struct blas_traits<CwiseUnaryOp<scalar_opposite_op<Scalar>, NestedXpr> > : blas_traits<NestedXpr> {
535
+ enum { HasScalarFactor = true };
443
536
  typedef blas_traits<NestedXpr> Base;
444
537
  typedef CwiseUnaryOp<scalar_opposite_op<Scalar>, NestedXpr> XprType;
445
538
  typedef typename Base::ExtractType ExtractType;
446
- static inline ExtractType extract(const XprType& x) { return Base::extract(x.nestedExpression()); }
447
- static inline Scalar extractScalarFactor(const XprType& x)
448
- { return - Base::extractScalarFactor(x.nestedExpression()); }
539
+ EIGEN_DEVICE_FUNC static inline ExtractType extract(const XprType& x) { return Base::extract(x.nestedExpression()); }
540
+ EIGEN_DEVICE_FUNC static inline Scalar extractScalarFactor(const XprType& x) {
541
+ return -Base::extractScalarFactor(x.nestedExpression());
542
+ }
449
543
  };
450
544
 
451
545
  // pop/push transpose
452
- template<typename NestedXpr>
453
- struct blas_traits<Transpose<NestedXpr> >
454
- : blas_traits<NestedXpr>
455
- {
546
+ template <typename NestedXpr>
547
+ struct blas_traits<Transpose<NestedXpr> > : blas_traits<NestedXpr> {
456
548
  typedef typename NestedXpr::Scalar Scalar;
457
549
  typedef blas_traits<NestedXpr> Base;
458
550
  typedef Transpose<NestedXpr> XprType;
459
- typedef Transpose<const typename Base::_ExtractType> ExtractType; // const to get rid of a compile error; anyway blas traits are only used on the RHS
460
- typedef Transpose<const typename Base::_ExtractType> _ExtractType;
461
- typedef typename conditional<bool(Base::HasUsableDirectAccess),
462
- ExtractType,
463
- typename ExtractType::PlainObject
464
- >::type DirectLinearAccessType;
465
- enum {
466
- IsTransposed = Base::IsTransposed ? 0 : 1
467
- };
468
- static inline ExtractType extract(const XprType& x) { return ExtractType(Base::extract(x.nestedExpression())); }
469
- static inline Scalar extractScalarFactor(const XprType& x) { return Base::extractScalarFactor(x.nestedExpression()); }
551
+ typedef Transpose<const typename Base::ExtractType_>
552
+ ExtractType; // const to get rid of a compile error; anyway blas traits are only used on the RHS
553
+ typedef Transpose<const typename Base::ExtractType_> ExtractType_;
554
+ typedef std::conditional_t<bool(Base::HasUsableDirectAccess), ExtractType, typename ExtractType::PlainObject>
555
+ DirectLinearAccessType;
556
+ enum { IsTransposed = Base::IsTransposed ? 0 : 1 };
557
+ EIGEN_DEVICE_FUNC static inline ExtractType extract(const XprType& x) {
558
+ return ExtractType(Base::extract(x.nestedExpression()));
559
+ }
560
+ EIGEN_DEVICE_FUNC static inline Scalar extractScalarFactor(const XprType& x) {
561
+ return Base::extractScalarFactor(x.nestedExpression());
562
+ }
470
563
  };
471
564
 
472
- template<typename T>
473
- struct blas_traits<const T>
474
- : blas_traits<T>
475
- {};
565
+ template <typename T>
566
+ struct blas_traits<const T> : blas_traits<T> {};
476
567
 
477
- template<typename T, bool HasUsableDirectAccess=blas_traits<T>::HasUsableDirectAccess>
568
+ template <typename T, bool HasUsableDirectAccess = blas_traits<T>::HasUsableDirectAccess>
478
569
  struct extract_data_selector {
479
- static const typename T::Scalar* run(const T& m)
480
- {
570
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE static const typename T::Scalar* run(const T& m) {
481
571
  return blas_traits<T>::extract(m).data();
482
572
  }
483
573
  };
484
574
 
485
- template<typename T>
486
- struct extract_data_selector<T,false> {
487
- static typename T::Scalar* run(const T&) { return 0; }
575
+ template <typename T>
576
+ struct extract_data_selector<T, false> {
577
+ EIGEN_DEVICE_FUNC static typename T::Scalar* run(const T&) { return 0; }
488
578
  };
489
579
 
490
- template<typename T> const typename T::Scalar* extract_data(const T& m)
491
- {
580
+ template <typename T>
581
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE const typename T::Scalar* extract_data(const T& m) {
492
582
  return extract_data_selector<T>::run(m);
493
583
  }
494
584
 
495
- } // end namespace internal
585
+ /**
586
+ * \c combine_scalar_factors extracts and multiplies factors from GEMM and GEMV products.
587
+ * There is a specialization for booleans
588
+ */
589
+ template <typename ResScalar, typename Lhs, typename Rhs>
590
+ struct combine_scalar_factors_impl {
591
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE static ResScalar run(const Lhs& lhs, const Rhs& rhs) {
592
+ return blas_traits<Lhs>::extractScalarFactor(lhs) * blas_traits<Rhs>::extractScalarFactor(rhs);
593
+ }
594
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE static ResScalar run(const ResScalar& alpha, const Lhs& lhs, const Rhs& rhs) {
595
+ return alpha * blas_traits<Lhs>::extractScalarFactor(lhs) * blas_traits<Rhs>::extractScalarFactor(rhs);
596
+ }
597
+ };
598
+ template <typename Lhs, typename Rhs>
599
+ struct combine_scalar_factors_impl<bool, Lhs, Rhs> {
600
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE static bool run(const Lhs& lhs, const Rhs& rhs) {
601
+ return blas_traits<Lhs>::extractScalarFactor(lhs) && blas_traits<Rhs>::extractScalarFactor(rhs);
602
+ }
603
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE static bool run(const bool& alpha, const Lhs& lhs, const Rhs& rhs) {
604
+ return alpha && blas_traits<Lhs>::extractScalarFactor(lhs) && blas_traits<Rhs>::extractScalarFactor(rhs);
605
+ }
606
+ };
607
+
608
+ template <typename ResScalar, typename Lhs, typename Rhs>
609
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE ResScalar combine_scalar_factors(const ResScalar& alpha, const Lhs& lhs,
610
+ const Rhs& rhs) {
611
+ return combine_scalar_factors_impl<ResScalar, Lhs, Rhs>::run(alpha, lhs, rhs);
612
+ }
613
+ template <typename ResScalar, typename Lhs, typename Rhs>
614
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE ResScalar combine_scalar_factors(const Lhs& lhs, const Rhs& rhs) {
615
+ return combine_scalar_factors_impl<ResScalar, Lhs, Rhs>::run(lhs, rhs);
616
+ }
617
+
618
+ } // end namespace internal
496
619
 
497
- } // end namespace Eigen
620
+ } // end namespace Eigen
498
621
 
499
- #endif // EIGEN_BLASUTIL_H
622
+ #endif // EIGEN_BLASUTIL_H