@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,73 +11,77 @@
11
11
  #ifndef EIGEN_GENERAL_PRODUCT_H
12
12
  #define EIGEN_GENERAL_PRODUCT_H
13
13
 
14
+ // IWYU pragma: private
15
+ #include "./InternalHeaderCheck.h"
16
+
14
17
  namespace Eigen {
15
18
 
16
- enum {
17
- Large = 2,
18
- Small = 3
19
- };
19
+ enum { Large = 2, Small = 3 };
20
+
21
+ // Define the threshold value to fallback from the generic matrix-matrix product
22
+ // implementation (heavy) to the lightweight coeff-based product one.
23
+ // See generic_product_impl<Lhs,Rhs,DenseShape,DenseShape,GemmProduct>
24
+ // in products/GeneralMatrixMatrix.h for more details.
25
+ // TODO This threshold should also be used in the compile-time selector below.
26
+ #ifndef EIGEN_GEMM_TO_COEFFBASED_THRESHOLD
27
+ // This default value has been obtained on a Haswell architecture.
28
+ #define EIGEN_GEMM_TO_COEFFBASED_THRESHOLD 20
29
+ #endif
20
30
 
21
31
  namespace internal {
22
32
 
23
- template<int Rows, int Cols, int Depth> struct product_type_selector;
33
+ template <int Rows, int Cols, int Depth>
34
+ struct product_type_selector;
24
35
 
25
- template<int Size, int MaxSize> struct product_size_category
26
- {
36
+ template <int Size, int MaxSize>
37
+ struct product_size_category {
27
38
  enum {
28
- #ifndef EIGEN_CUDA_ARCH
29
- is_large = MaxSize == Dynamic ||
30
- Size >= EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD ||
31
- (Size==Dynamic && MaxSize>=EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD),
32
- #else
39
+ #ifndef EIGEN_GPU_COMPILE_PHASE
40
+ is_large = MaxSize == Dynamic || Size >= EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD ||
41
+ (Size == Dynamic && MaxSize >= EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD),
42
+ #else
33
43
  is_large = 0,
34
- #endif
35
- value = is_large ? Large
36
- : Size == 1 ? 1
37
- : Small
44
+ #endif
45
+ value = is_large ? Large
46
+ : Size == 1 ? 1
47
+ : Small
38
48
  };
39
49
  };
40
50
 
41
- template<typename Lhs, typename Rhs> struct product_type
42
- {
43
- typedef typename remove_all<Lhs>::type _Lhs;
44
- typedef typename remove_all<Rhs>::type _Rhs;
51
+ template <typename Lhs, typename Rhs>
52
+ struct product_type {
53
+ typedef remove_all_t<Lhs> Lhs_;
54
+ typedef remove_all_t<Rhs> Rhs_;
45
55
  enum {
46
- MaxRows = traits<_Lhs>::MaxRowsAtCompileTime,
47
- Rows = traits<_Lhs>::RowsAtCompileTime,
48
- MaxCols = traits<_Rhs>::MaxColsAtCompileTime,
49
- Cols = traits<_Rhs>::ColsAtCompileTime,
50
- MaxDepth = EIGEN_SIZE_MIN_PREFER_FIXED(traits<_Lhs>::MaxColsAtCompileTime,
51
- traits<_Rhs>::MaxRowsAtCompileTime),
52
- Depth = EIGEN_SIZE_MIN_PREFER_FIXED(traits<_Lhs>::ColsAtCompileTime,
53
- traits<_Rhs>::RowsAtCompileTime)
56
+ MaxRows = traits<Lhs_>::MaxRowsAtCompileTime,
57
+ Rows = traits<Lhs_>::RowsAtCompileTime,
58
+ MaxCols = traits<Rhs_>::MaxColsAtCompileTime,
59
+ Cols = traits<Rhs_>::ColsAtCompileTime,
60
+ MaxDepth = min_size_prefer_fixed(traits<Lhs_>::MaxColsAtCompileTime, traits<Rhs_>::MaxRowsAtCompileTime),
61
+ Depth = min_size_prefer_fixed(traits<Lhs_>::ColsAtCompileTime, traits<Rhs_>::RowsAtCompileTime)
54
62
  };
55
63
 
56
64
  // the splitting into different lines of code here, introducing the _select enums and the typedef below,
57
65
  // is to work around an internal compiler error with gcc 4.1 and 4.2.
58
- private:
66
+ private:
59
67
  enum {
60
- rows_select = product_size_category<Rows,MaxRows>::value,
61
- cols_select = product_size_category<Cols,MaxCols>::value,
62
- depth_select = product_size_category<Depth,MaxDepth>::value
68
+ rows_select = product_size_category<Rows, MaxRows>::value,
69
+ cols_select = product_size_category<Cols, MaxCols>::value,
70
+ depth_select = product_size_category<Depth, MaxDepth>::value
63
71
  };
64
72
  typedef product_type_selector<rows_select, cols_select, depth_select> selector;
65
73
 
66
- public:
67
- enum {
68
- value = selector::ret,
69
- ret = selector::ret
70
- };
74
+ public:
75
+ enum { value = selector::ret, ret = selector::ret };
71
76
  #ifdef EIGEN_DEBUG_PRODUCT
72
- static void debug()
73
- {
74
- EIGEN_DEBUG_VAR(Rows);
75
- EIGEN_DEBUG_VAR(Cols);
76
- EIGEN_DEBUG_VAR(Depth);
77
- EIGEN_DEBUG_VAR(rows_select);
78
- EIGEN_DEBUG_VAR(cols_select);
79
- EIGEN_DEBUG_VAR(depth_select);
80
- EIGEN_DEBUG_VAR(value);
77
+ static void debug() {
78
+ EIGEN_DEBUG_VAR(Rows);
79
+ EIGEN_DEBUG_VAR(Cols);
80
+ EIGEN_DEBUG_VAR(Depth);
81
+ EIGEN_DEBUG_VAR(rows_select);
82
+ EIGEN_DEBUG_VAR(cols_select);
83
+ EIGEN_DEBUG_VAR(depth_select);
84
+ EIGEN_DEBUG_VAR(value);
81
85
  }
82
86
  #endif
83
87
  };
@@ -86,36 +90,108 @@ public:
86
90
  * based on the three dimensions of the product.
87
91
  * This is a compile time mapping from {1,Small,Large}^3 -> {product types} */
88
92
  // FIXME I'm not sure the current mapping is the ideal one.
89
- template<int M, int N> struct product_type_selector<M,N,1> { enum { ret = OuterProduct }; };
90
- template<int M> struct product_type_selector<M, 1, 1> { enum { ret = LazyCoeffBasedProductMode }; };
91
- template<int N> struct product_type_selector<1, N, 1> { enum { ret = LazyCoeffBasedProductMode }; };
92
- template<int Depth> struct product_type_selector<1, 1, Depth> { enum { ret = InnerProduct }; };
93
- template<> struct product_type_selector<1, 1, 1> { enum { ret = InnerProduct }; };
94
- template<> struct product_type_selector<Small,1, Small> { enum { ret = CoeffBasedProductMode }; };
95
- template<> struct product_type_selector<1, Small,Small> { enum { ret = CoeffBasedProductMode }; };
96
- template<> struct product_type_selector<Small,Small,Small> { enum { ret = CoeffBasedProductMode }; };
97
- template<> struct product_type_selector<Small, Small, 1> { enum { ret = LazyCoeffBasedProductMode }; };
98
- template<> struct product_type_selector<Small, Large, 1> { enum { ret = LazyCoeffBasedProductMode }; };
99
- template<> struct product_type_selector<Large, Small, 1> { enum { ret = LazyCoeffBasedProductMode }; };
100
- template<> struct product_type_selector<1, Large,Small> { enum { ret = CoeffBasedProductMode }; };
101
- template<> struct product_type_selector<1, Large,Large> { enum { ret = GemvProduct }; };
102
- template<> struct product_type_selector<1, Small,Large> { enum { ret = CoeffBasedProductMode }; };
103
- template<> struct product_type_selector<Large,1, Small> { enum { ret = CoeffBasedProductMode }; };
104
- template<> struct product_type_selector<Large,1, Large> { enum { ret = GemvProduct }; };
105
- template<> struct product_type_selector<Small,1, Large> { enum { ret = CoeffBasedProductMode }; };
106
- template<> struct product_type_selector<Small,Small,Large> { enum { ret = GemmProduct }; };
107
- template<> struct product_type_selector<Large,Small,Large> { enum { ret = GemmProduct }; };
108
- template<> struct product_type_selector<Small,Large,Large> { enum { ret = GemmProduct }; };
109
- template<> struct product_type_selector<Large,Large,Large> { enum { ret = GemmProduct }; };
110
- template<> struct product_type_selector<Large,Small,Small> { enum { ret = CoeffBasedProductMode }; };
111
- template<> struct product_type_selector<Small,Large,Small> { enum { ret = CoeffBasedProductMode }; };
112
- template<> struct product_type_selector<Large,Large,Small> { enum { ret = GemmProduct }; };
113
-
114
- } // end namespace internal
93
+ template <int M, int N>
94
+ struct product_type_selector<M, N, 1> {
95
+ enum { ret = OuterProduct };
96
+ };
97
+ template <int M>
98
+ struct product_type_selector<M, 1, 1> {
99
+ enum { ret = LazyCoeffBasedProductMode };
100
+ };
101
+ template <int N>
102
+ struct product_type_selector<1, N, 1> {
103
+ enum { ret = LazyCoeffBasedProductMode };
104
+ };
105
+ template <int Depth>
106
+ struct product_type_selector<1, 1, Depth> {
107
+ enum { ret = InnerProduct };
108
+ };
109
+ template <>
110
+ struct product_type_selector<1, 1, 1> {
111
+ enum { ret = InnerProduct };
112
+ };
113
+ template <>
114
+ struct product_type_selector<Small, 1, Small> {
115
+ enum { ret = CoeffBasedProductMode };
116
+ };
117
+ template <>
118
+ struct product_type_selector<1, Small, Small> {
119
+ enum { ret = CoeffBasedProductMode };
120
+ };
121
+ template <>
122
+ struct product_type_selector<Small, Small, Small> {
123
+ enum { ret = CoeffBasedProductMode };
124
+ };
125
+ template <>
126
+ struct product_type_selector<Small, Small, 1> {
127
+ enum { ret = LazyCoeffBasedProductMode };
128
+ };
129
+ template <>
130
+ struct product_type_selector<Small, Large, 1> {
131
+ enum { ret = LazyCoeffBasedProductMode };
132
+ };
133
+ template <>
134
+ struct product_type_selector<Large, Small, 1> {
135
+ enum { ret = LazyCoeffBasedProductMode };
136
+ };
137
+ template <>
138
+ struct product_type_selector<1, Large, Small> {
139
+ enum { ret = CoeffBasedProductMode };
140
+ };
141
+ template <>
142
+ struct product_type_selector<1, Large, Large> {
143
+ enum { ret = GemvProduct };
144
+ };
145
+ template <>
146
+ struct product_type_selector<1, Small, Large> {
147
+ enum { ret = CoeffBasedProductMode };
148
+ };
149
+ template <>
150
+ struct product_type_selector<Large, 1, Small> {
151
+ enum { ret = CoeffBasedProductMode };
152
+ };
153
+ template <>
154
+ struct product_type_selector<Large, 1, Large> {
155
+ enum { ret = GemvProduct };
156
+ };
157
+ template <>
158
+ struct product_type_selector<Small, 1, Large> {
159
+ enum { ret = CoeffBasedProductMode };
160
+ };
161
+ template <>
162
+ struct product_type_selector<Small, Small, Large> {
163
+ enum { ret = GemmProduct };
164
+ };
165
+ template <>
166
+ struct product_type_selector<Large, Small, Large> {
167
+ enum { ret = GemmProduct };
168
+ };
169
+ template <>
170
+ struct product_type_selector<Small, Large, Large> {
171
+ enum { ret = GemmProduct };
172
+ };
173
+ template <>
174
+ struct product_type_selector<Large, Large, Large> {
175
+ enum { ret = GemmProduct };
176
+ };
177
+ template <>
178
+ struct product_type_selector<Large, Small, Small> {
179
+ enum { ret = CoeffBasedProductMode };
180
+ };
181
+ template <>
182
+ struct product_type_selector<Small, Large, Small> {
183
+ enum { ret = CoeffBasedProductMode };
184
+ };
185
+ template <>
186
+ struct product_type_selector<Large, Large, Small> {
187
+ enum { ret = GemmProduct };
188
+ };
189
+
190
+ } // end namespace internal
115
191
 
116
192
  /***********************************************************************
117
- * Implementation of Inner Vector Vector Product
118
- ***********************************************************************/
193
+ * Implementation of Inner Vector Vector Product
194
+ ***********************************************************************/
119
195
 
120
196
  // FIXME : maybe the "inner product" could return a Scalar
121
197
  // instead of a 1x1 matrix ??
@@ -125,12 +201,12 @@ template<> struct product_type_selector<Large,Large,Small> { enum
125
201
  // case, we could have a specialization for Block<MatrixType,1,1> with: operator=(Scalar x);
126
202
 
127
203
  /***********************************************************************
128
- * Implementation of Outer Vector Vector Product
129
- ***********************************************************************/
204
+ * Implementation of Outer Vector Vector Product
205
+ ***********************************************************************/
130
206
 
131
207
  /***********************************************************************
132
- * Implementation of General Matrix Vector Product
133
- ***********************************************************************/
208
+ * Implementation of General Matrix Vector Product
209
+ ***********************************************************************/
134
210
 
135
211
  /* According to the shape/flags of the matrix we have to distinghish 3 different cases:
136
212
  * 1 - the matrix is col-major, BLAS compatible and M is large => call fast BLAS-like colmajor routine
@@ -141,149 +217,137 @@ template<> struct product_type_selector<Large,Large,Small> { enum
141
217
  */
142
218
  namespace internal {
143
219
 
144
- template<int Side, int StorageOrder, bool BlasCompatible>
220
+ template <int Side, int StorageOrder, bool BlasCompatible>
145
221
  struct gemv_dense_selector;
146
222
 
147
- } // end namespace internal
223
+ } // end namespace internal
148
224
 
149
225
  namespace internal {
150
226
 
151
- template<typename Scalar,int Size,int MaxSize,bool Cond> struct gemv_static_vector_if;
227
+ template <typename Scalar, int Size, int MaxSize, bool Cond>
228
+ struct gemv_static_vector_if;
152
229
 
153
- template<typename Scalar,int Size,int MaxSize>
154
- struct gemv_static_vector_if<Scalar,Size,MaxSize,false>
155
- {
156
- EIGEN_STRONG_INLINE Scalar* data() { eigen_internal_assert(false && "should never be called"); return 0; }
230
+ template <typename Scalar, int Size, int MaxSize>
231
+ struct gemv_static_vector_if<Scalar, Size, MaxSize, false> {
232
+ EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC constexpr Scalar* data() {
233
+ eigen_internal_assert(false && "should never be called");
234
+ return 0;
235
+ }
157
236
  };
158
237
 
159
- template<typename Scalar,int Size>
160
- struct gemv_static_vector_if<Scalar,Size,Dynamic,true>
161
- {
162
- EIGEN_STRONG_INLINE Scalar* data() { return 0; }
238
+ template <typename Scalar, int Size>
239
+ struct gemv_static_vector_if<Scalar, Size, Dynamic, true> {
240
+ EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC constexpr Scalar* data() { return 0; }
163
241
  };
164
242
 
165
- template<typename Scalar,int Size,int MaxSize>
166
- struct gemv_static_vector_if<Scalar,Size,MaxSize,true>
167
- {
168
- enum {
169
- ForceAlignment = internal::packet_traits<Scalar>::Vectorizable,
170
- PacketSize = internal::packet_traits<Scalar>::size
171
- };
172
- #if EIGEN_MAX_STATIC_ALIGN_BYTES!=0
173
- internal::plain_array<Scalar,EIGEN_SIZE_MIN_PREFER_FIXED(Size,MaxSize),0,EIGEN_PLAIN_ENUM_MIN(AlignedMax,PacketSize)> m_data;
174
- EIGEN_STRONG_INLINE Scalar* data() { return m_data.array; }
175
- #else
243
+ template <typename Scalar, int Size, int MaxSize>
244
+ struct gemv_static_vector_if<Scalar, Size, MaxSize, true> {
245
+ #if EIGEN_MAX_STATIC_ALIGN_BYTES != 0
246
+ internal::plain_array<Scalar, internal::min_size_prefer_fixed(Size, MaxSize), 0, AlignedMax> m_data;
247
+ EIGEN_STRONG_INLINE constexpr Scalar* data() { return m_data.array; }
248
+ #else
176
249
  // Some architectures cannot align on the stack,
177
250
  // => let's manually enforce alignment by allocating more data and return the address of the first aligned element.
178
- internal::plain_array<Scalar,EIGEN_SIZE_MIN_PREFER_FIXED(Size,MaxSize)+(ForceAlignment?EIGEN_MAX_ALIGN_BYTES:0),0> m_data;
179
- EIGEN_STRONG_INLINE Scalar* data() {
180
- return ForceAlignment
181
- ? reinterpret_cast<Scalar*>((internal::UIntPtr(m_data.array) & ~(std::size_t(EIGEN_MAX_ALIGN_BYTES-1))) + EIGEN_MAX_ALIGN_BYTES)
182
- : m_data.array;
251
+ internal::plain_array<Scalar, internal::min_size_prefer_fixed(Size, MaxSize) + EIGEN_MAX_ALIGN_BYTES, 0> m_data;
252
+ EIGEN_STRONG_INLINE constexpr Scalar* data() {
253
+ return reinterpret_cast<Scalar*>((std::uintptr_t(m_data.array) & ~(std::size_t(EIGEN_MAX_ALIGN_BYTES - 1))) +
254
+ EIGEN_MAX_ALIGN_BYTES);
183
255
  }
184
- #endif
256
+ #endif
185
257
  };
186
258
 
187
259
  // The vector is on the left => transposition
188
- template<int StorageOrder, bool BlasCompatible>
189
- struct gemv_dense_selector<OnTheLeft,StorageOrder,BlasCompatible>
190
- {
191
- template<typename Lhs, typename Rhs, typename Dest>
192
- static void run(const Lhs &lhs, const Rhs &rhs, Dest& dest, const typename Dest::Scalar& alpha)
193
- {
260
+ template <int StorageOrder, bool BlasCompatible>
261
+ struct gemv_dense_selector<OnTheLeft, StorageOrder, BlasCompatible> {
262
+ template <typename Lhs, typename Rhs, typename Dest>
263
+ static void run(const Lhs& lhs, const Rhs& rhs, Dest& dest, const typename Dest::Scalar& alpha) {
194
264
  Transpose<Dest> destT(dest);
195
265
  enum { OtherStorageOrder = StorageOrder == RowMajor ? ColMajor : RowMajor };
196
- gemv_dense_selector<OnTheRight,OtherStorageOrder,BlasCompatible>
197
- ::run(rhs.transpose(), lhs.transpose(), destT, alpha);
266
+ gemv_dense_selector<OnTheRight, OtherStorageOrder, BlasCompatible>::run(rhs.transpose(), lhs.transpose(), destT,
267
+ alpha);
198
268
  }
199
269
  };
200
270
 
201
- template<> struct gemv_dense_selector<OnTheRight,ColMajor,true>
202
- {
203
- template<typename Lhs, typename Rhs, typename Dest>
204
- static inline void run(const Lhs &lhs, const Rhs &rhs, Dest& dest, const typename Dest::Scalar& alpha)
205
- {
206
- typedef typename Lhs::Scalar LhsScalar;
207
- typedef typename Rhs::Scalar RhsScalar;
208
- typedef typename Dest::Scalar ResScalar;
209
- typedef typename Dest::RealScalar RealScalar;
210
-
271
+ template <>
272
+ struct gemv_dense_selector<OnTheRight, ColMajor, true> {
273
+ template <typename Lhs, typename Rhs, typename Dest>
274
+ static inline void run(const Lhs& lhs, const Rhs& rhs, Dest& dest, const typename Dest::Scalar& alpha) {
275
+ typedef typename Lhs::Scalar LhsScalar;
276
+ typedef typename Rhs::Scalar RhsScalar;
277
+ typedef typename Dest::Scalar ResScalar;
278
+
211
279
  typedef internal::blas_traits<Lhs> LhsBlasTraits;
212
280
  typedef typename LhsBlasTraits::DirectLinearAccessType ActualLhsType;
213
281
  typedef internal::blas_traits<Rhs> RhsBlasTraits;
214
282
  typedef typename RhsBlasTraits::DirectLinearAccessType ActualRhsType;
215
-
216
- typedef Map<Matrix<ResScalar,Dynamic,1>, EIGEN_PLAIN_ENUM_MIN(AlignedMax,internal::packet_traits<ResScalar>::size)> MappedDest;
283
+
284
+ typedef Map<Matrix<ResScalar, Dynamic, 1>, plain_enum_min(AlignedMax, internal::packet_traits<ResScalar>::size)>
285
+ MappedDest;
217
286
 
218
287
  ActualLhsType actualLhs = LhsBlasTraits::extract(lhs);
219
288
  ActualRhsType actualRhs = RhsBlasTraits::extract(rhs);
220
289
 
221
- ResScalar actualAlpha = alpha * LhsBlasTraits::extractScalarFactor(lhs)
222
- * RhsBlasTraits::extractScalarFactor(rhs);
290
+ ResScalar actualAlpha = combine_scalar_factors(alpha, lhs, rhs);
223
291
 
224
292
  // make sure Dest is a compile-time vector type (bug 1166)
225
- typedef typename conditional<Dest::IsVectorAtCompileTime, Dest, typename Dest::ColXpr>::type ActualDest;
293
+ typedef std::conditional_t<Dest::IsVectorAtCompileTime, Dest, typename Dest::ColXpr> ActualDest;
226
294
 
227
295
  enum {
228
296
  // FIXME find a way to allow an inner stride on the result if packet_traits<Scalar>::size==1
229
297
  // on, the other hand it is good for the cache to pack the vector anyways...
230
- EvalToDestAtCompileTime = (ActualDest::InnerStrideAtCompileTime==1),
298
+ EvalToDestAtCompileTime = (ActualDest::InnerStrideAtCompileTime == 1),
231
299
  ComplexByReal = (NumTraits<LhsScalar>::IsComplex) && (!NumTraits<RhsScalar>::IsComplex),
232
- MightCannotUseDest = (!EvalToDestAtCompileTime) || ComplexByReal
300
+ MightCannotUseDest = ((!EvalToDestAtCompileTime) || ComplexByReal) && (ActualDest::MaxSizeAtCompileTime != 0)
233
301
  };
234
302
 
235
- typedef const_blas_data_mapper<LhsScalar,Index,ColMajor> LhsMapper;
236
- typedef const_blas_data_mapper<RhsScalar,Index,RowMajor> RhsMapper;
237
- RhsScalar compatibleAlpha = get_factor<ResScalar,RhsScalar>::run(actualAlpha);
303
+ typedef const_blas_data_mapper<LhsScalar, Index, ColMajor> LhsMapper;
304
+ typedef const_blas_data_mapper<RhsScalar, Index, RowMajor> RhsMapper;
305
+ RhsScalar compatibleAlpha = get_factor<ResScalar, RhsScalar>::run(actualAlpha);
238
306
 
239
- if(!MightCannotUseDest)
240
- {
307
+ if (!MightCannotUseDest) {
241
308
  // shortcut if we are sure to be able to use dest directly,
242
309
  // this ease the compiler to generate cleaner and more optimzized code for most common cases
243
- general_matrix_vector_product
244
- <Index,LhsScalar,LhsMapper,ColMajor,LhsBlasTraits::NeedToConjugate,RhsScalar,RhsMapper,RhsBlasTraits::NeedToConjugate>::run(
245
- actualLhs.rows(), actualLhs.cols(),
246
- LhsMapper(actualLhs.data(), actualLhs.outerStride()),
247
- RhsMapper(actualRhs.data(), actualRhs.innerStride()),
248
- dest.data(), 1,
249
- compatibleAlpha);
250
- }
251
- else
252
- {
253
- gemv_static_vector_if<ResScalar,ActualDest::SizeAtCompileTime,ActualDest::MaxSizeAtCompileTime,MightCannotUseDest> static_dest;
254
-
255
- const bool alphaIsCompatible = (!ComplexByReal) || (numext::imag(actualAlpha)==RealScalar(0));
310
+ general_matrix_vector_product<Index, LhsScalar, LhsMapper, ColMajor, LhsBlasTraits::NeedToConjugate, RhsScalar,
311
+ RhsMapper, RhsBlasTraits::NeedToConjugate>::run(actualLhs.rows(), actualLhs.cols(),
312
+ LhsMapper(actualLhs.data(),
313
+ actualLhs.outerStride()),
314
+ RhsMapper(actualRhs.data(),
315
+ actualRhs.innerStride()),
316
+ dest.data(), 1, compatibleAlpha);
317
+ } else {
318
+ gemv_static_vector_if<ResScalar, ActualDest::SizeAtCompileTime, ActualDest::MaxSizeAtCompileTime,
319
+ MightCannotUseDest>
320
+ static_dest;
321
+
322
+ const bool alphaIsCompatible = (!ComplexByReal) || (numext::is_exactly_zero(numext::imag(actualAlpha)));
256
323
  const bool evalToDest = EvalToDestAtCompileTime && alphaIsCompatible;
257
324
 
258
- ei_declare_aligned_stack_constructed_variable(ResScalar,actualDestPtr,dest.size(),
325
+ ei_declare_aligned_stack_constructed_variable(ResScalar, actualDestPtr, dest.size(),
259
326
  evalToDest ? dest.data() : static_dest.data());
260
327
 
261
- if(!evalToDest)
262
- {
263
- #ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN
328
+ if (!evalToDest) {
329
+ #ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN
330
+ constexpr int Size = Dest::SizeAtCompileTime;
264
331
  Index size = dest.size();
265
332
  EIGEN_DENSE_STORAGE_CTOR_PLUGIN
266
- #endif
267
- if(!alphaIsCompatible)
268
- {
333
+ #endif
334
+ if (!alphaIsCompatible) {
269
335
  MappedDest(actualDestPtr, dest.size()).setZero();
270
336
  compatibleAlpha = RhsScalar(1);
271
- }
272
- else
337
+ } else
273
338
  MappedDest(actualDestPtr, dest.size()) = dest;
274
339
  }
275
340
 
276
- general_matrix_vector_product
277
- <Index,LhsScalar,LhsMapper,ColMajor,LhsBlasTraits::NeedToConjugate,RhsScalar,RhsMapper,RhsBlasTraits::NeedToConjugate>::run(
278
- actualLhs.rows(), actualLhs.cols(),
279
- LhsMapper(actualLhs.data(), actualLhs.outerStride()),
280
- RhsMapper(actualRhs.data(), actualRhs.innerStride()),
281
- actualDestPtr, 1,
282
- compatibleAlpha);
283
-
284
- if (!evalToDest)
285
- {
286
- if(!alphaIsCompatible)
341
+ general_matrix_vector_product<Index, LhsScalar, LhsMapper, ColMajor, LhsBlasTraits::NeedToConjugate, RhsScalar,
342
+ RhsMapper, RhsBlasTraits::NeedToConjugate>::run(actualLhs.rows(), actualLhs.cols(),
343
+ LhsMapper(actualLhs.data(),
344
+ actualLhs.outerStride()),
345
+ RhsMapper(actualRhs.data(),
346
+ actualRhs.innerStride()),
347
+ actualDestPtr, 1, compatibleAlpha);
348
+
349
+ if (!evalToDest) {
350
+ if (!alphaIsCompatible)
287
351
  dest.matrix() += actualAlpha * MappedDest(actualDestPtr, dest.size());
288
352
  else
289
353
  dest = MappedDest(actualDestPtr, dest.size());
@@ -292,164 +356,164 @@ template<> struct gemv_dense_selector<OnTheRight,ColMajor,true>
292
356
  }
293
357
  };
294
358
 
295
- template<> struct gemv_dense_selector<OnTheRight,RowMajor,true>
296
- {
297
- template<typename Lhs, typename Rhs, typename Dest>
298
- static void run(const Lhs &lhs, const Rhs &rhs, Dest& dest, const typename Dest::Scalar& alpha)
299
- {
300
- typedef typename Lhs::Scalar LhsScalar;
301
- typedef typename Rhs::Scalar RhsScalar;
302
- typedef typename Dest::Scalar ResScalar;
303
-
359
+ template <>
360
+ struct gemv_dense_selector<OnTheRight, RowMajor, true> {
361
+ template <typename Lhs, typename Rhs, typename Dest>
362
+ static void run(const Lhs& lhs, const Rhs& rhs, Dest& dest, const typename Dest::Scalar& alpha) {
363
+ typedef typename Lhs::Scalar LhsScalar;
364
+ typedef typename Rhs::Scalar RhsScalar;
365
+ typedef typename Dest::Scalar ResScalar;
366
+
304
367
  typedef internal::blas_traits<Lhs> LhsBlasTraits;
305
368
  typedef typename LhsBlasTraits::DirectLinearAccessType ActualLhsType;
306
369
  typedef internal::blas_traits<Rhs> RhsBlasTraits;
307
370
  typedef typename RhsBlasTraits::DirectLinearAccessType ActualRhsType;
308
- typedef typename internal::remove_all<ActualRhsType>::type ActualRhsTypeCleaned;
371
+ typedef internal::remove_all_t<ActualRhsType> ActualRhsTypeCleaned;
309
372
 
310
- typename add_const<ActualLhsType>::type actualLhs = LhsBlasTraits::extract(lhs);
311
- typename add_const<ActualRhsType>::type actualRhs = RhsBlasTraits::extract(rhs);
373
+ std::add_const_t<ActualLhsType> actualLhs = LhsBlasTraits::extract(lhs);
374
+ std::add_const_t<ActualRhsType> actualRhs = RhsBlasTraits::extract(rhs);
312
375
 
313
- ResScalar actualAlpha = alpha * LhsBlasTraits::extractScalarFactor(lhs)
314
- * RhsBlasTraits::extractScalarFactor(rhs);
376
+ ResScalar actualAlpha = combine_scalar_factors(alpha, lhs, rhs);
315
377
 
316
378
  enum {
317
379
  // FIXME find a way to allow an inner stride on the result if packet_traits<Scalar>::size==1
318
380
  // on, the other hand it is good for the cache to pack the vector anyways...
319
- DirectlyUseRhs = ActualRhsTypeCleaned::InnerStrideAtCompileTime==1
381
+ DirectlyUseRhs =
382
+ ActualRhsTypeCleaned::InnerStrideAtCompileTime == 1 || ActualRhsTypeCleaned::MaxSizeAtCompileTime == 0
320
383
  };
321
384
 
322
- gemv_static_vector_if<RhsScalar,ActualRhsTypeCleaned::SizeAtCompileTime,ActualRhsTypeCleaned::MaxSizeAtCompileTime,!DirectlyUseRhs> static_rhs;
385
+ gemv_static_vector_if<RhsScalar, ActualRhsTypeCleaned::SizeAtCompileTime,
386
+ ActualRhsTypeCleaned::MaxSizeAtCompileTime, !DirectlyUseRhs>
387
+ static_rhs;
323
388
 
324
- ei_declare_aligned_stack_constructed_variable(RhsScalar,actualRhsPtr,actualRhs.size(),
389
+ ei_declare_aligned_stack_constructed_variable(
390
+ RhsScalar, actualRhsPtr, actualRhs.size(),
325
391
  DirectlyUseRhs ? const_cast<RhsScalar*>(actualRhs.data()) : static_rhs.data());
326
392
 
327
- if(!DirectlyUseRhs)
328
- {
329
- #ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN
393
+ if (!DirectlyUseRhs) {
394
+ #ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN
395
+ constexpr int Size = ActualRhsTypeCleaned::SizeAtCompileTime;
330
396
  Index size = actualRhs.size();
331
397
  EIGEN_DENSE_STORAGE_CTOR_PLUGIN
332
- #endif
398
+ #endif
333
399
  Map<typename ActualRhsTypeCleaned::PlainObject>(actualRhsPtr, actualRhs.size()) = actualRhs;
334
400
  }
335
401
 
336
- typedef const_blas_data_mapper<LhsScalar,Index,RowMajor> LhsMapper;
337
- typedef const_blas_data_mapper<RhsScalar,Index,ColMajor> RhsMapper;
338
- general_matrix_vector_product
339
- <Index,LhsScalar,LhsMapper,RowMajor,LhsBlasTraits::NeedToConjugate,RhsScalar,RhsMapper,RhsBlasTraits::NeedToConjugate>::run(
340
- actualLhs.rows(), actualLhs.cols(),
341
- LhsMapper(actualLhs.data(), actualLhs.outerStride()),
342
- RhsMapper(actualRhsPtr, 1),
343
- dest.data(), dest.col(0).innerStride(), //NOTE if dest is not a vector at compile-time, then dest.innerStride() might be wrong. (bug 1166)
344
- actualAlpha);
402
+ typedef const_blas_data_mapper<LhsScalar, Index, RowMajor> LhsMapper;
403
+ typedef const_blas_data_mapper<RhsScalar, Index, ColMajor> RhsMapper;
404
+ general_matrix_vector_product<Index, LhsScalar, LhsMapper, RowMajor, LhsBlasTraits::NeedToConjugate, RhsScalar,
405
+ RhsMapper, RhsBlasTraits::NeedToConjugate>::
406
+ run(actualLhs.rows(), actualLhs.cols(), LhsMapper(actualLhs.data(), actualLhs.outerStride()),
407
+ RhsMapper(actualRhsPtr, 1), dest.data(),
408
+ dest.col(0).innerStride(), // NOTE if dest is not a vector at compile-time, then dest.innerStride() might
409
+ // be wrong. (bug 1166)
410
+ actualAlpha);
345
411
  }
346
412
  };
347
413
 
348
- template<> struct gemv_dense_selector<OnTheRight,ColMajor,false>
349
- {
350
- template<typename Lhs, typename Rhs, typename Dest>
351
- static void run(const Lhs &lhs, const Rhs &rhs, Dest& dest, const typename Dest::Scalar& alpha)
352
- {
353
- EIGEN_STATIC_ASSERT((!nested_eval<Lhs,1>::Evaluate),EIGEN_INTERNAL_COMPILATION_ERROR_OR_YOU_MADE_A_PROGRAMMING_MISTAKE);
354
- // TODO if rhs is large enough it might be beneficial to make sure that dest is sequentially stored in memory, otherwise use a temp
355
- typename nested_eval<Rhs,1>::type actual_rhs(rhs);
414
+ template <>
415
+ struct gemv_dense_selector<OnTheRight, ColMajor, false> {
416
+ template <typename Lhs, typename Rhs, typename Dest>
417
+ static void run(const Lhs& lhs, const Rhs& rhs, Dest& dest, const typename Dest::Scalar& alpha) {
418
+ EIGEN_STATIC_ASSERT((!nested_eval<Lhs, 1>::Evaluate),
419
+ EIGEN_INTERNAL_COMPILATION_ERROR_OR_YOU_MADE_A_PROGRAMMING_MISTAKE);
420
+ // TODO if rhs is large enough it might be beneficial to make sure that dest is sequentially stored in memory,
421
+ // otherwise use a temp
422
+ typename nested_eval<Rhs, 1>::type actual_rhs(rhs);
356
423
  const Index size = rhs.rows();
357
- for(Index k=0; k<size; ++k)
358
- dest += (alpha*actual_rhs.coeff(k)) * lhs.col(k);
424
+ for (Index k = 0; k < size; ++k) dest += (alpha * actual_rhs.coeff(k)) * lhs.col(k);
359
425
  }
360
426
  };
361
427
 
362
- template<> struct gemv_dense_selector<OnTheRight,RowMajor,false>
363
- {
364
- template<typename Lhs, typename Rhs, typename Dest>
365
- static void run(const Lhs &lhs, const Rhs &rhs, Dest& dest, const typename Dest::Scalar& alpha)
366
- {
367
- EIGEN_STATIC_ASSERT((!nested_eval<Lhs,1>::Evaluate),EIGEN_INTERNAL_COMPILATION_ERROR_OR_YOU_MADE_A_PROGRAMMING_MISTAKE);
368
- typename nested_eval<Rhs,Lhs::RowsAtCompileTime>::type actual_rhs(rhs);
428
+ template <>
429
+ struct gemv_dense_selector<OnTheRight, RowMajor, false> {
430
+ template <typename Lhs, typename Rhs, typename Dest>
431
+ static void run(const Lhs& lhs, const Rhs& rhs, Dest& dest, const typename Dest::Scalar& alpha) {
432
+ EIGEN_STATIC_ASSERT((!nested_eval<Lhs, 1>::Evaluate),
433
+ EIGEN_INTERNAL_COMPILATION_ERROR_OR_YOU_MADE_A_PROGRAMMING_MISTAKE);
434
+ typename nested_eval<Rhs, Lhs::RowsAtCompileTime>::type actual_rhs(rhs);
369
435
  const Index rows = dest.rows();
370
- for(Index i=0; i<rows; ++i)
436
+ for (Index i = 0; i < rows; ++i)
371
437
  dest.coeffRef(i) += alpha * (lhs.row(i).cwiseProduct(actual_rhs.transpose())).sum();
372
438
  }
373
439
  };
374
440
 
375
- } // end namespace internal
441
+ } // end namespace internal
376
442
 
377
443
  /***************************************************************************
378
- * Implementation of matrix base methods
379
- ***************************************************************************/
444
+ * Implementation of matrix base methods
445
+ ***************************************************************************/
380
446
 
381
447
  /** \returns the matrix product of \c *this and \a other.
382
- *
383
- * \note If instead of the matrix product you want the coefficient-wise product, see Cwise::operator*().
384
- *
385
- * \sa lazyProduct(), operator*=(const MatrixBase&), Cwise::operator*()
386
- */
387
- template<typename Derived>
388
- template<typename OtherDerived>
389
- inline const Product<Derived, OtherDerived>
390
- MatrixBase<Derived>::operator*(const MatrixBase<OtherDerived> &other) const
391
- {
448
+ *
449
+ * \note If instead of the matrix product you want the coefficient-wise product, see Cwise::operator*().
450
+ *
451
+ * \sa lazyProduct(), operator*=(const MatrixBase&), Cwise::operator*()
452
+ */
453
+ template <typename Derived>
454
+ template <typename OtherDerived>
455
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Product<Derived, OtherDerived> MatrixBase<Derived>::operator*(
456
+ const MatrixBase<OtherDerived>& other) const {
392
457
  // A note regarding the function declaration: In MSVC, this function will sometimes
393
458
  // not be inlined since DenseStorage is an unwindable object for dynamic
394
459
  // matrices and product types are holding a member to store the result.
395
460
  // Thus it does not help tagging this function with EIGEN_STRONG_INLINE.
396
461
  enum {
397
- ProductIsValid = Derived::ColsAtCompileTime==Dynamic
398
- || OtherDerived::RowsAtCompileTime==Dynamic
399
- || int(Derived::ColsAtCompileTime)==int(OtherDerived::RowsAtCompileTime),
462
+ ProductIsValid = Derived::ColsAtCompileTime == Dynamic || OtherDerived::RowsAtCompileTime == Dynamic ||
463
+ int(Derived::ColsAtCompileTime) == int(OtherDerived::RowsAtCompileTime),
400
464
  AreVectors = Derived::IsVectorAtCompileTime && OtherDerived::IsVectorAtCompileTime,
401
- SameSizes = EIGEN_PREDICATE_SAME_MATRIX_SIZE(Derived,OtherDerived)
465
+ SameSizes = EIGEN_PREDICATE_SAME_MATRIX_SIZE(Derived, OtherDerived)
402
466
  };
403
467
  // note to the lost user:
404
468
  // * for a dot product use: v1.dot(v2)
405
469
  // * for a coeff-wise product use: v1.cwiseProduct(v2)
406
- EIGEN_STATIC_ASSERT(ProductIsValid || !(AreVectors && SameSizes),
407
- INVALID_VECTOR_VECTOR_PRODUCT__IF_YOU_WANTED_A_DOT_OR_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTIONS)
470
+ EIGEN_STATIC_ASSERT(
471
+ ProductIsValid || !(AreVectors && SameSizes),
472
+ INVALID_VECTOR_VECTOR_PRODUCT__IF_YOU_WANTED_A_DOT_OR_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTIONS)
408
473
  EIGEN_STATIC_ASSERT(ProductIsValid || !(SameSizes && !AreVectors),
409
- INVALID_MATRIX_PRODUCT__IF_YOU_WANTED_A_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTION)
474
+ INVALID_MATRIX_PRODUCT__IF_YOU_WANTED_A_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTION)
410
475
  EIGEN_STATIC_ASSERT(ProductIsValid || SameSizes, INVALID_MATRIX_PRODUCT)
411
476
  #ifdef EIGEN_DEBUG_PRODUCT
412
- internal::product_type<Derived,OtherDerived>::debug();
477
+ internal::product_type<Derived, OtherDerived>::debug();
413
478
  #endif
414
479
 
415
480
  return Product<Derived, OtherDerived>(derived(), other.derived());
416
481
  }
417
482
 
418
483
  /** \returns an expression of the matrix product of \c *this and \a other without implicit evaluation.
419
- *
420
- * The returned product will behave like any other expressions: the coefficients of the product will be
421
- * computed once at a time as requested. This might be useful in some extremely rare cases when only
422
- * a small and no coherent fraction of the result's coefficients have to be computed.
423
- *
424
- * \warning This version of the matrix product can be much much slower. So use it only if you know
425
- * what you are doing and that you measured a true speed improvement.
426
- *
427
- * \sa operator*(const MatrixBase&)
428
- */
429
- template<typename Derived>
430
- template<typename OtherDerived>
431
- const Product<Derived,OtherDerived,LazyProduct>
432
- MatrixBase<Derived>::lazyProduct(const MatrixBase<OtherDerived> &other) const
433
- {
484
+ *
485
+ * The returned product will behave like any other expressions: the coefficients of the product will be
486
+ * computed once at a time as requested. This might be useful in some extremely rare cases when only
487
+ * a small and no coherent fraction of the result's coefficients have to be computed.
488
+ *
489
+ * \warning This version of the matrix product can be much much slower. So use it only if you know
490
+ * what you are doing and that you measured a true speed improvement.
491
+ *
492
+ * \sa operator*(const MatrixBase&)
493
+ */
494
+ template <typename Derived>
495
+ template <typename OtherDerived>
496
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Product<Derived, OtherDerived, LazyProduct>
497
+ MatrixBase<Derived>::lazyProduct(const MatrixBase<OtherDerived>& other) const {
434
498
  enum {
435
- ProductIsValid = Derived::ColsAtCompileTime==Dynamic
436
- || OtherDerived::RowsAtCompileTime==Dynamic
437
- || int(Derived::ColsAtCompileTime)==int(OtherDerived::RowsAtCompileTime),
499
+ ProductIsValid = Derived::ColsAtCompileTime == Dynamic || OtherDerived::RowsAtCompileTime == Dynamic ||
500
+ int(Derived::ColsAtCompileTime) == int(OtherDerived::RowsAtCompileTime),
438
501
  AreVectors = Derived::IsVectorAtCompileTime && OtherDerived::IsVectorAtCompileTime,
439
- SameSizes = EIGEN_PREDICATE_SAME_MATRIX_SIZE(Derived,OtherDerived)
502
+ SameSizes = EIGEN_PREDICATE_SAME_MATRIX_SIZE(Derived, OtherDerived)
440
503
  };
441
504
  // note to the lost user:
442
505
  // * for a dot product use: v1.dot(v2)
443
506
  // * for a coeff-wise product use: v1.cwiseProduct(v2)
444
- EIGEN_STATIC_ASSERT(ProductIsValid || !(AreVectors && SameSizes),
445
- INVALID_VECTOR_VECTOR_PRODUCT__IF_YOU_WANTED_A_DOT_OR_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTIONS)
507
+ EIGEN_STATIC_ASSERT(
508
+ ProductIsValid || !(AreVectors && SameSizes),
509
+ INVALID_VECTOR_VECTOR_PRODUCT__IF_YOU_WANTED_A_DOT_OR_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTIONS)
446
510
  EIGEN_STATIC_ASSERT(ProductIsValid || !(SameSizes && !AreVectors),
447
- INVALID_MATRIX_PRODUCT__IF_YOU_WANTED_A_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTION)
511
+ INVALID_MATRIX_PRODUCT__IF_YOU_WANTED_A_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTION)
448
512
  EIGEN_STATIC_ASSERT(ProductIsValid || SameSizes, INVALID_MATRIX_PRODUCT)
449
513
 
450
- return Product<Derived,OtherDerived,LazyProduct>(derived(), other.derived());
514
+ return Product<Derived, OtherDerived, LazyProduct>(derived(), other.derived());
451
515
  }
452
516
 
453
- } // end namespace Eigen
517
+ } // end namespace Eigen
454
518
 
455
- #endif // EIGEN_PRODUCT_H
519
+ #endif // EIGEN_PRODUCT_H