@smake/eigen 1.0.2 → 1.1.0

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 (287) hide show
  1. package/README.md +1 -1
  2. package/eigen/COPYING.APACHE +203 -0
  3. package/eigen/COPYING.BSD +26 -0
  4. package/eigen/COPYING.GPL +674 -0
  5. package/eigen/COPYING.LGPL +502 -0
  6. package/eigen/COPYING.MINPACK +51 -0
  7. package/eigen/COPYING.MPL2 +373 -0
  8. package/eigen/COPYING.README +18 -0
  9. package/eigen/Eigen/Cholesky +0 -1
  10. package/eigen/Eigen/Core +108 -266
  11. package/eigen/Eigen/Eigenvalues +0 -1
  12. package/eigen/Eigen/Geometry +3 -6
  13. package/eigen/Eigen/Householder +0 -1
  14. package/eigen/Eigen/Jacobi +0 -1
  15. package/eigen/Eigen/KLUSupport +41 -0
  16. package/eigen/Eigen/LU +2 -5
  17. package/eigen/Eigen/OrderingMethods +0 -3
  18. package/eigen/Eigen/PaStiXSupport +1 -0
  19. package/eigen/Eigen/PardisoSupport +0 -0
  20. package/eigen/Eigen/QR +0 -1
  21. package/eigen/Eigen/QtAlignedMalloc +0 -1
  22. package/eigen/Eigen/SVD +0 -1
  23. package/eigen/Eigen/Sparse +0 -2
  24. package/eigen/Eigen/SparseCholesky +0 -8
  25. package/eigen/Eigen/SparseLU +4 -0
  26. package/eigen/Eigen/src/Cholesky/LDLT.h +42 -27
  27. package/eigen/Eigen/src/Cholesky/LLT.h +39 -23
  28. package/eigen/Eigen/src/CholmodSupport/CholmodSupport.h +90 -47
  29. package/eigen/Eigen/src/Core/ArithmeticSequence.h +413 -0
  30. package/eigen/Eigen/src/Core/Array.h +99 -11
  31. package/eigen/Eigen/src/Core/ArrayBase.h +1 -1
  32. package/eigen/Eigen/src/Core/ArrayWrapper.h +21 -21
  33. package/eigen/Eigen/src/Core/Assign.h +1 -1
  34. package/eigen/Eigen/src/Core/AssignEvaluator.h +125 -50
  35. package/eigen/Eigen/src/Core/Assign_MKL.h +10 -10
  36. package/eigen/Eigen/src/Core/BandMatrix.h +16 -16
  37. package/eigen/Eigen/src/Core/Block.h +56 -60
  38. package/eigen/Eigen/src/Core/BooleanRedux.h +29 -31
  39. package/eigen/Eigen/src/Core/CommaInitializer.h +7 -3
  40. package/eigen/Eigen/src/Core/CoreEvaluators.h +325 -272
  41. package/eigen/Eigen/src/Core/CoreIterators.h +5 -0
  42. package/eigen/Eigen/src/Core/CwiseBinaryOp.h +21 -22
  43. package/eigen/Eigen/src/Core/CwiseNullaryOp.h +153 -18
  44. package/eigen/Eigen/src/Core/CwiseUnaryOp.h +6 -6
  45. package/eigen/Eigen/src/Core/CwiseUnaryView.h +12 -10
  46. package/eigen/Eigen/src/Core/DenseBase.h +128 -39
  47. package/eigen/Eigen/src/Core/DenseCoeffsBase.h +25 -21
  48. package/eigen/Eigen/src/Core/DenseStorage.h +150 -68
  49. package/eigen/Eigen/src/Core/Diagonal.h +21 -23
  50. package/eigen/Eigen/src/Core/DiagonalMatrix.h +50 -2
  51. package/eigen/Eigen/src/Core/DiagonalProduct.h +1 -1
  52. package/eigen/Eigen/src/Core/Dot.h +10 -10
  53. package/eigen/Eigen/src/Core/EigenBase.h +10 -9
  54. package/eigen/Eigen/src/Core/ForceAlignedAccess.h +8 -4
  55. package/eigen/Eigen/src/Core/Fuzzy.h +3 -3
  56. package/eigen/Eigen/src/Core/GeneralProduct.h +20 -10
  57. package/eigen/Eigen/src/Core/GenericPacketMath.h +597 -147
  58. package/eigen/Eigen/src/Core/GlobalFunctions.h +40 -33
  59. package/eigen/Eigen/src/Core/IO.h +40 -7
  60. package/eigen/Eigen/src/Core/IndexedView.h +237 -0
  61. package/eigen/Eigen/src/Core/Inverse.h +9 -10
  62. package/eigen/Eigen/src/Core/Map.h +7 -7
  63. package/eigen/Eigen/src/Core/MapBase.h +5 -3
  64. package/eigen/Eigen/src/Core/MathFunctions.h +756 -120
  65. package/eigen/Eigen/src/Core/MathFunctionsImpl.h +118 -19
  66. package/eigen/Eigen/src/Core/Matrix.h +131 -25
  67. package/eigen/Eigen/src/Core/MatrixBase.h +19 -2
  68. package/eigen/Eigen/src/Core/NestByValue.h +25 -50
  69. package/eigen/Eigen/src/Core/NoAlias.h +4 -3
  70. package/eigen/Eigen/src/Core/NumTraits.h +107 -20
  71. package/eigen/Eigen/src/Core/PartialReduxEvaluator.h +232 -0
  72. package/eigen/Eigen/src/Core/PermutationMatrix.h +3 -3
  73. package/eigen/Eigen/src/Core/PlainObjectBase.h +145 -54
  74. package/eigen/Eigen/src/Core/Product.h +30 -25
  75. package/eigen/Eigen/src/Core/ProductEvaluators.h +183 -142
  76. package/eigen/Eigen/src/Core/Random.h +37 -1
  77. package/eigen/Eigen/src/Core/Redux.h +180 -170
  78. package/eigen/Eigen/src/Core/Ref.h +118 -21
  79. package/eigen/Eigen/src/Core/Replicate.h +8 -8
  80. package/eigen/Eigen/src/Core/Reshaped.h +454 -0
  81. package/eigen/Eigen/src/Core/ReturnByValue.h +7 -5
  82. package/eigen/Eigen/src/Core/Reverse.h +18 -12
  83. package/eigen/Eigen/src/Core/Select.h +8 -6
  84. package/eigen/Eigen/src/Core/SelfAdjointView.h +33 -20
  85. package/eigen/Eigen/src/Core/Solve.h +14 -14
  86. package/eigen/Eigen/src/Core/SolveTriangular.h +13 -13
  87. package/eigen/Eigen/src/Core/SolverBase.h +41 -3
  88. package/eigen/Eigen/src/Core/StableNorm.h +100 -70
  89. package/eigen/Eigen/src/Core/StlIterators.h +463 -0
  90. package/eigen/Eigen/src/Core/Stride.h +9 -4
  91. package/eigen/Eigen/src/Core/Swap.h +5 -4
  92. package/eigen/Eigen/src/Core/Transpose.h +86 -27
  93. package/eigen/Eigen/src/Core/Transpositions.h +26 -8
  94. package/eigen/Eigen/src/Core/TriangularMatrix.h +88 -72
  95. package/eigen/Eigen/src/Core/VectorBlock.h +5 -5
  96. package/eigen/Eigen/src/Core/VectorwiseOp.h +159 -70
  97. package/eigen/Eigen/src/Core/Visitor.h +137 -29
  98. package/eigen/Eigen/src/Core/arch/AVX/Complex.h +50 -129
  99. package/eigen/Eigen/src/Core/arch/AVX/MathFunctions.h +126 -337
  100. package/eigen/Eigen/src/Core/arch/AVX/PacketMath.h +1092 -155
  101. package/eigen/Eigen/src/Core/arch/AVX/TypeCasting.h +65 -1
  102. package/eigen/Eigen/src/Core/arch/AVX512/Complex.h +422 -0
  103. package/eigen/Eigen/src/Core/arch/AVX512/MathFunctions.h +186 -213
  104. package/eigen/Eigen/src/Core/arch/AVX512/PacketMath.h +1250 -252
  105. package/eigen/Eigen/src/Core/arch/AVX512/TypeCasting.h +89 -0
  106. package/eigen/Eigen/src/Core/arch/AltiVec/Complex.h +152 -165
  107. package/eigen/Eigen/src/Core/arch/AltiVec/MathFunctions.h +19 -251
  108. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProduct.h +2937 -0
  109. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h +221 -0
  110. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductMMA.h +629 -0
  111. package/eigen/Eigen/src/Core/arch/AltiVec/PacketMath.h +2042 -392
  112. package/eigen/Eigen/src/Core/arch/CUDA/Complex.h +235 -80
  113. package/eigen/Eigen/src/Core/arch/Default/BFloat16.h +700 -0
  114. package/eigen/Eigen/src/Core/arch/Default/ConjHelper.h +102 -14
  115. package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h +1649 -0
  116. package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h +110 -0
  117. package/eigen/Eigen/src/Core/arch/Default/Half.h +942 -0
  118. package/eigen/Eigen/src/Core/arch/Default/Settings.h +1 -1
  119. package/eigen/Eigen/src/Core/arch/Default/TypeCasting.h +120 -0
  120. package/eigen/Eigen/src/Core/arch/{CUDA → GPU}/MathFunctions.h +16 -4
  121. package/eigen/Eigen/src/Core/arch/GPU/PacketMath.h +1685 -0
  122. package/eigen/Eigen/src/Core/arch/GPU/TypeCasting.h +80 -0
  123. package/eigen/Eigen/src/Core/arch/HIP/hcc/math_constants.h +23 -0
  124. package/eigen/Eigen/src/Core/arch/MSA/Complex.h +648 -0
  125. package/eigen/Eigen/src/Core/arch/MSA/MathFunctions.h +387 -0
  126. package/eigen/Eigen/src/Core/arch/MSA/PacketMath.h +1233 -0
  127. package/eigen/Eigen/src/Core/arch/NEON/Complex.h +313 -219
  128. package/eigen/Eigen/src/Core/arch/NEON/GeneralBlockPanelKernel.h +183 -0
  129. package/eigen/Eigen/src/Core/arch/NEON/MathFunctions.h +54 -70
  130. package/eigen/Eigen/src/Core/arch/NEON/PacketMath.h +4376 -549
  131. package/eigen/Eigen/src/Core/arch/NEON/TypeCasting.h +1419 -0
  132. package/eigen/Eigen/src/Core/arch/SSE/Complex.h +59 -179
  133. package/eigen/Eigen/src/Core/arch/SSE/MathFunctions.h +65 -428
  134. package/eigen/Eigen/src/Core/arch/SSE/PacketMath.h +893 -283
  135. package/eigen/Eigen/src/Core/arch/SSE/TypeCasting.h +65 -0
  136. package/eigen/Eigen/src/Core/arch/SVE/MathFunctions.h +44 -0
  137. package/eigen/Eigen/src/Core/arch/SVE/PacketMath.h +752 -0
  138. package/eigen/Eigen/src/Core/arch/SVE/TypeCasting.h +49 -0
  139. package/eigen/Eigen/src/Core/arch/SYCL/InteropHeaders.h +232 -0
  140. package/eigen/Eigen/src/Core/arch/SYCL/MathFunctions.h +301 -0
  141. package/eigen/Eigen/src/Core/arch/SYCL/PacketMath.h +670 -0
  142. package/eigen/Eigen/src/Core/arch/SYCL/SyclMemoryModel.h +694 -0
  143. package/eigen/Eigen/src/Core/arch/SYCL/TypeCasting.h +85 -0
  144. package/eigen/Eigen/src/Core/arch/ZVector/Complex.h +212 -183
  145. package/eigen/Eigen/src/Core/arch/ZVector/MathFunctions.h +101 -5
  146. package/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h +510 -395
  147. package/eigen/Eigen/src/Core/functors/AssignmentFunctors.h +11 -2
  148. package/eigen/Eigen/src/Core/functors/BinaryFunctors.h +112 -46
  149. package/eigen/Eigen/src/Core/functors/NullaryFunctors.h +31 -30
  150. package/eigen/Eigen/src/Core/functors/StlFunctors.h +32 -2
  151. package/eigen/Eigen/src/Core/functors/UnaryFunctors.h +354 -15
  152. package/eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h +1073 -585
  153. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix.h +29 -7
  154. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +4 -4
  155. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h +1 -1
  156. package/eigen/Eigen/src/Core/products/GeneralMatrixVector.h +382 -483
  157. package/eigen/Eigen/src/Core/products/Parallelizer.h +23 -9
  158. package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +23 -6
  159. package/eigen/Eigen/src/Core/products/SelfadjointMatrixVector.h +8 -6
  160. package/eigen/Eigen/src/Core/products/SelfadjointProduct.h +2 -2
  161. package/eigen/Eigen/src/Core/products/SelfadjointRank2Update.h +5 -4
  162. package/eigen/Eigen/src/Core/products/TriangularMatrixMatrix.h +3 -3
  163. package/eigen/Eigen/src/Core/products/TriangularSolverMatrix.h +5 -3
  164. package/eigen/Eigen/src/Core/products/TriangularSolverVector.h +13 -10
  165. package/eigen/Eigen/src/Core/util/BlasUtil.h +208 -124
  166. package/eigen/Eigen/src/Core/util/ConfigureVectorization.h +512 -0
  167. package/eigen/Eigen/src/Core/util/Constants.h +25 -9
  168. package/eigen/Eigen/src/Core/util/DisableStupidWarnings.h +14 -2
  169. package/eigen/Eigen/src/Core/util/ForwardDeclarations.h +28 -4
  170. package/eigen/Eigen/src/Core/util/IndexedViewHelper.h +186 -0
  171. package/eigen/Eigen/src/Core/util/IntegralConstant.h +272 -0
  172. package/eigen/Eigen/src/Core/util/MKL_support.h +8 -1
  173. package/eigen/Eigen/src/Core/util/Macros.h +661 -250
  174. package/eigen/Eigen/src/Core/util/Memory.h +222 -52
  175. package/eigen/Eigen/src/Core/util/Meta.h +349 -105
  176. package/eigen/Eigen/src/Core/util/ReshapedHelper.h +51 -0
  177. package/eigen/Eigen/src/Core/util/StaticAssert.h +8 -5
  178. package/eigen/Eigen/src/Core/util/SymbolicIndex.h +293 -0
  179. package/eigen/Eigen/src/Core/util/XprHelper.h +48 -30
  180. package/eigen/Eigen/src/Eigenvalues/ComplexEigenSolver.h +1 -1
  181. package/eigen/Eigen/src/Eigenvalues/ComplexSchur.h +1 -1
  182. package/eigen/Eigen/src/Eigenvalues/EigenSolver.h +2 -2
  183. package/eigen/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h +1 -1
  184. package/eigen/Eigen/src/Eigenvalues/HessenbergDecomposition.h +2 -2
  185. package/eigen/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h +2 -2
  186. package/eigen/Eigen/src/Eigenvalues/RealQZ.h +9 -6
  187. package/eigen/Eigen/src/Eigenvalues/RealSchur.h +10 -5
  188. package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +75 -42
  189. package/eigen/Eigen/src/Eigenvalues/Tridiagonalization.h +20 -15
  190. package/eigen/Eigen/src/Geometry/AlignedBox.h +99 -5
  191. package/eigen/Eigen/src/Geometry/AngleAxis.h +4 -4
  192. package/eigen/Eigen/src/Geometry/EulerAngles.h +3 -3
  193. package/eigen/Eigen/src/Geometry/Homogeneous.h +15 -11
  194. package/eigen/Eigen/src/Geometry/Hyperplane.h +1 -1
  195. package/eigen/Eigen/src/Geometry/OrthoMethods.h +3 -2
  196. package/eigen/Eigen/src/Geometry/ParametrizedLine.h +39 -2
  197. package/eigen/Eigen/src/Geometry/Quaternion.h +52 -14
  198. package/eigen/Eigen/src/Geometry/Rotation2D.h +3 -3
  199. package/eigen/Eigen/src/Geometry/Scaling.h +22 -4
  200. package/eigen/Eigen/src/Geometry/Transform.h +86 -65
  201. package/eigen/Eigen/src/Geometry/Translation.h +6 -6
  202. package/eigen/Eigen/src/Geometry/arch/Geometry_SIMD.h +168 -0
  203. package/eigen/Eigen/src/Householder/BlockHouseholder.h +9 -2
  204. package/eigen/Eigen/src/Householder/Householder.h +8 -4
  205. package/eigen/Eigen/src/Householder/HouseholderSequence.h +123 -48
  206. package/eigen/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +15 -15
  207. package/eigen/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +7 -23
  208. package/eigen/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +5 -22
  209. package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h +41 -47
  210. package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h +51 -60
  211. package/eigen/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +70 -20
  212. package/eigen/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h +2 -20
  213. package/eigen/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h +11 -9
  214. package/eigen/Eigen/src/Jacobi/Jacobi.h +31 -10
  215. package/eigen/Eigen/src/KLUSupport/KLUSupport.h +358 -0
  216. package/eigen/Eigen/src/LU/Determinant.h +35 -19
  217. package/eigen/Eigen/src/LU/FullPivLU.h +29 -43
  218. package/eigen/Eigen/src/LU/InverseImpl.h +25 -8
  219. package/eigen/Eigen/src/LU/PartialPivLU.h +67 -57
  220. package/eigen/Eigen/src/LU/arch/InverseSize4.h +351 -0
  221. package/eigen/Eigen/src/OrderingMethods/Amd.h +7 -17
  222. package/eigen/Eigen/src/OrderingMethods/Eigen_Colamd.h +297 -277
  223. package/eigen/Eigen/src/OrderingMethods/Ordering.h +6 -10
  224. package/eigen/Eigen/src/PaStiXSupport/PaStiXSupport.h +1 -1
  225. package/eigen/Eigen/src/PardisoSupport/PardisoSupport.h +10 -9
  226. package/eigen/Eigen/src/QR/ColPivHouseholderQR.h +41 -20
  227. package/eigen/Eigen/src/QR/CompleteOrthogonalDecomposition.h +100 -27
  228. package/eigen/Eigen/src/QR/FullPivHouseholderQR.h +59 -22
  229. package/eigen/Eigen/src/QR/HouseholderQR.h +48 -23
  230. package/eigen/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h +25 -3
  231. package/eigen/Eigen/src/SVD/BDCSVD.h +137 -48
  232. package/eigen/Eigen/src/SVD/JacobiSVD.h +22 -14
  233. package/eigen/Eigen/src/SVD/SVDBase.h +82 -21
  234. package/eigen/Eigen/src/SVD/UpperBidiagonalization.h +3 -3
  235. package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky.h +16 -8
  236. package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h +11 -36
  237. package/eigen/Eigen/src/SparseCore/CompressedStorage.h +16 -0
  238. package/eigen/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h +6 -6
  239. package/eigen/Eigen/src/SparseCore/SparseAssign.h +81 -27
  240. package/eigen/Eigen/src/SparseCore/SparseBlock.h +25 -57
  241. package/eigen/Eigen/src/SparseCore/SparseCompressedBase.h +40 -11
  242. package/eigen/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +11 -15
  243. package/eigen/Eigen/src/SparseCore/SparseCwiseUnaryOp.h +2 -2
  244. package/eigen/Eigen/src/SparseCore/SparseDenseProduct.h +30 -8
  245. package/eigen/Eigen/src/SparseCore/SparseMatrix.h +124 -10
  246. package/eigen/Eigen/src/SparseCore/SparseMatrixBase.h +5 -12
  247. package/eigen/Eigen/src/SparseCore/SparseProduct.h +13 -1
  248. package/eigen/Eigen/src/SparseCore/SparseRef.h +7 -7
  249. package/eigen/Eigen/src/SparseCore/SparseSelfAdjointView.h +3 -0
  250. package/eigen/Eigen/src/SparseCore/SparseUtil.h +8 -0
  251. package/eigen/Eigen/src/SparseCore/SparseVector.h +1 -1
  252. package/eigen/Eigen/src/SparseLU/SparseLU.h +160 -10
  253. package/eigen/Eigen/src/SparseLU/SparseLU_Memory.h +1 -1
  254. package/eigen/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h +76 -2
  255. package/eigen/Eigen/src/SparseLU/SparseLU_column_dfs.h +2 -2
  256. package/eigen/Eigen/src/SparseLU/SparseLU_gemm_kernel.h +1 -1
  257. package/eigen/Eigen/src/SparseLU/SparseLU_panel_bmod.h +1 -1
  258. package/eigen/Eigen/src/SparseQR/SparseQR.h +19 -6
  259. package/eigen/Eigen/src/StlSupport/StdDeque.h +2 -14
  260. package/eigen/Eigen/src/StlSupport/StdList.h +2 -2
  261. package/eigen/Eigen/src/StlSupport/StdVector.h +2 -2
  262. package/eigen/Eigen/src/SuperLUSupport/SuperLUSupport.h +6 -8
  263. package/eigen/Eigen/src/UmfPackSupport/UmfPackSupport.h +175 -39
  264. package/eigen/Eigen/src/misc/lapacke.h +5 -4
  265. package/eigen/Eigen/src/plugins/ArrayCwiseBinaryOps.h +27 -1
  266. package/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.h +155 -11
  267. package/eigen/Eigen/src/plugins/BlockMethods.h +626 -242
  268. package/eigen/Eigen/src/plugins/CommonCwiseUnaryOps.h +14 -0
  269. package/eigen/Eigen/src/plugins/IndexedViewMethods.h +262 -0
  270. package/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.h +4 -4
  271. package/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.h +10 -0
  272. package/eigen/Eigen/src/plugins/ReshapedMethods.h +149 -0
  273. package/eigen/README.md +5 -0
  274. package/lib/LibEigen.d.ts +4 -0
  275. package/lib/LibEigen.js +14 -0
  276. package/lib/index.d.ts +1 -1
  277. package/lib/index.js +7 -3
  278. package/package.json +2 -10
  279. package/eigen/Eigen/CMakeLists.txt +0 -19
  280. package/eigen/Eigen/src/Core/arch/CUDA/Half.h +0 -675
  281. package/eigen/Eigen/src/Core/arch/CUDA/PacketMath.h +0 -333
  282. package/eigen/Eigen/src/Core/arch/CUDA/PacketMathHalf.h +0 -1124
  283. package/eigen/Eigen/src/Core/arch/CUDA/TypeCasting.h +0 -212
  284. package/eigen/Eigen/src/Geometry/arch/Geometry_SSE.h +0 -161
  285. package/eigen/Eigen/src/LU/arch/Inverse_SSE.h +0 -338
  286. package/lib/eigen.d.ts +0 -2
  287. package/lib/eigen.js +0 -15
@@ -24,7 +24,7 @@ struct gebp_kernel;
24
24
  template<typename Scalar, typename Index, typename DataMapper, int nr, int StorageOrder, bool Conjugate = false, bool PanelMode=false>
25
25
  struct gemm_pack_rhs;
26
26
 
27
- template<typename Scalar, typename Index, typename DataMapper, int Pack1, int Pack2, int StorageOrder, bool Conjugate = false, bool PanelMode = false>
27
+ template<typename Scalar, typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, int StorageOrder, bool Conjugate = false, bool PanelMode = false>
28
28
  struct gemm_pack_lhs;
29
29
 
30
30
  template<
@@ -39,90 +39,6 @@ template<typename Index,
39
39
  typename RhsScalar, typename RhsMapper, bool ConjugateRhs, int Version=Specialized>
40
40
  struct general_matrix_vector_product;
41
41
 
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
42
  template<typename From,typename To> struct get_factor {
127
43
  EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE To run(const From& x) { return To(x); }
128
44
  };
@@ -159,11 +75,9 @@ template<typename Scalar, typename Index, int AlignmentType, int Incr=1>
159
75
  class BlasLinearMapper;
160
76
 
161
77
  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
-
78
+ class BlasLinearMapper<Scalar,Index,AlignmentType>
79
+ {
80
+ public:
167
81
  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE BlasLinearMapper(Scalar *data, Index incr=1)
168
82
  : m_data(data)
169
83
  {
@@ -179,19 +93,17 @@ class BlasLinearMapper<Scalar,Index,AlignmentType,1> {
179
93
  return m_data[i];
180
94
  }
181
95
 
182
- EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet loadPacket(Index i) const {
183
- return ploadt<Packet, AlignmentType>(m_data + i);
184
- }
185
-
186
- EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE HalfPacket loadHalfPacket(Index i) const {
187
- return ploadt<HalfPacket, AlignmentType>(m_data + i);
96
+ template<typename PacketType>
97
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketType loadPacket(Index i) const {
98
+ return ploadt<PacketType, AlignmentType>(m_data + i);
188
99
  }
189
100
 
190
- EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacket(Index i, const Packet &p) const {
191
- pstoret<Scalar, Packet, AlignmentType>(m_data + i, p);
101
+ template<typename PacketType>
102
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacket(Index i, const PacketType &p) const {
103
+ pstoret<Scalar, PacketType, AlignmentType>(m_data + i, p);
192
104
  }
193
105
 
194
- protected:
106
+ protected:
195
107
  Scalar *m_data;
196
108
  };
197
109
 
@@ -199,13 +111,59 @@ class BlasLinearMapper<Scalar,Index,AlignmentType,1> {
199
111
  template<typename Scalar, typename Index, int StorageOrder, int AlignmentType = Unaligned, int Incr = 1>
200
112
  class blas_data_mapper;
201
113
 
114
+ // TMP to help PacketBlock store implementation.
115
+ // There's currently no known use case for PacketBlock load.
116
+ // The default implementation assumes ColMajor order.
117
+ // It always store each packet sequentially one `stride` apart.
118
+ template<typename Index, typename Scalar, typename Packet, int n, int idx, int StorageOrder>
119
+ struct PacketBlockManagement
120
+ {
121
+ PacketBlockManagement<Index, Scalar, Packet, n, idx - 1, StorageOrder> pbm;
122
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(Scalar *to, const Index stride, Index i, Index j, const PacketBlock<Packet, n> &block) const {
123
+ pbm.store(to, stride, i, j, block);
124
+ pstoreu<Scalar>(to + i + (j + idx)*stride, block.packet[idx]);
125
+ }
126
+ };
127
+
128
+ // PacketBlockManagement specialization to take care of RowMajor order without ifs.
129
+ template<typename Index, typename Scalar, typename Packet, int n, int idx>
130
+ struct PacketBlockManagement<Index, Scalar, Packet, n, idx, RowMajor>
131
+ {
132
+ PacketBlockManagement<Index, Scalar, Packet, n, idx - 1, RowMajor> pbm;
133
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(Scalar *to, const Index stride, Index i, Index j, const PacketBlock<Packet, n> &block) const {
134
+ pbm.store(to, stride, i, j, block);
135
+ pstoreu<Scalar>(to + j + (i + idx)*stride, block.packet[idx]);
136
+ }
137
+ };
138
+
139
+ template<typename Index, typename Scalar, typename Packet, int n, int StorageOrder>
140
+ struct PacketBlockManagement<Index, Scalar, Packet, n, -1, StorageOrder>
141
+ {
142
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(Scalar *to, const Index stride, Index i, Index j, const PacketBlock<Packet, n> &block) const {
143
+ EIGEN_UNUSED_VARIABLE(to);
144
+ EIGEN_UNUSED_VARIABLE(stride);
145
+ EIGEN_UNUSED_VARIABLE(i);
146
+ EIGEN_UNUSED_VARIABLE(j);
147
+ EIGEN_UNUSED_VARIABLE(block);
148
+ }
149
+ };
150
+
151
+ template<typename Index, typename Scalar, typename Packet, int n>
152
+ struct PacketBlockManagement<Index, Scalar, Packet, n, -1, RowMajor>
153
+ {
154
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(Scalar *to, const Index stride, Index i, Index j, const PacketBlock<Packet, n> &block) const {
155
+ EIGEN_UNUSED_VARIABLE(to);
156
+ EIGEN_UNUSED_VARIABLE(stride);
157
+ EIGEN_UNUSED_VARIABLE(i);
158
+ EIGEN_UNUSED_VARIABLE(j);
159
+ EIGEN_UNUSED_VARIABLE(block);
160
+ }
161
+ };
162
+
202
163
  template<typename Scalar, typename Index, int StorageOrder, int AlignmentType>
203
164
  class blas_data_mapper<Scalar,Index,StorageOrder,AlignmentType,1>
204
165
  {
205
166
  public:
206
- typedef typename packet_traits<Scalar>::type Packet;
207
- typedef typename packet_traits<Scalar>::half HalfPacket;
208
-
209
167
  typedef BlasLinearMapper<Scalar, Index, AlignmentType> LinearMapper;
210
168
  typedef BlasVectorMapper<Scalar, Index> VectorMapper;
211
169
 
@@ -235,12 +193,14 @@ public:
235
193
  return m_data[StorageOrder==RowMajor ? j + i*m_stride : i + j*m_stride];
236
194
  }
237
195
 
238
- EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet loadPacket(Index i, Index j) const {
239
- return ploadt<Packet, AlignmentType>(&operator()(i, j));
196
+ template<typename PacketType>
197
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketType loadPacket(Index i, Index j) const {
198
+ return ploadt<PacketType, AlignmentType>(&operator()(i, j));
240
199
  }
241
200
 
242
- EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE HalfPacket loadHalfPacket(Index i, Index j) const {
243
- return ploadt<HalfPacket, AlignmentType>(&operator()(i, j));
201
+ template <typename PacketT, int AlignmentT>
202
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketT load(Index i, Index j) const {
203
+ return ploadt<PacketT, AlignmentT>(&operator()(i, j));
244
204
  }
245
205
 
246
206
  template<typename SubPacket>
@@ -263,7 +223,12 @@ public:
263
223
  return internal::first_default_aligned(m_data, size);
264
224
  }
265
225
 
266
- protected:
226
+ template<typename SubPacket, int n>
227
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacketBlock(Index i, Index j, const PacketBlock<SubPacket, n> &block) const {
228
+ PacketBlockManagement<Index, Scalar, SubPacket, n, n-1, StorageOrder> pbm;
229
+ pbm.store(m_data, m_stride, i, j, block);
230
+ }
231
+ protected:
267
232
  Scalar* EIGEN_RESTRICT m_data;
268
233
  const Index m_stride;
269
234
  };
@@ -275,9 +240,6 @@ template<typename Scalar, typename Index, int AlignmentType, int Incr>
275
240
  class BlasLinearMapper
276
241
  {
277
242
  public:
278
- typedef typename packet_traits<Scalar>::type Packet;
279
- typedef typename packet_traits<Scalar>::half HalfPacket;
280
-
281
243
  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE BlasLinearMapper(Scalar *data,Index incr) : m_data(data), m_incr(incr) {}
282
244
 
283
245
  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void prefetch(int i) const {
@@ -288,8 +250,9 @@ public:
288
250
  return m_data[i*m_incr.value()];
289
251
  }
290
252
 
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());
253
+ template<typename PacketType>
254
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketType loadPacket(Index i) const {
255
+ return pgather<Scalar,PacketType>(m_data + i*m_incr.value(), m_incr.value());
293
256
  }
294
257
 
295
258
  template<typename PacketType>
@@ -306,9 +269,6 @@ template<typename Scalar, typename Index, int StorageOrder, int AlignmentType,in
306
269
  class blas_data_mapper
307
270
  {
308
271
  public:
309
- typedef typename packet_traits<Scalar>::type Packet;
310
- typedef typename packet_traits<Scalar>::half HalfPacket;
311
-
312
272
  typedef BlasLinearMapper<Scalar, Index, AlignmentType,Incr> LinearMapper;
313
273
 
314
274
  EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE blas_data_mapper(Scalar* data, Index stride, Index incr) : m_data(data), m_stride(stride), m_incr(incr) {}
@@ -327,8 +287,9 @@ public:
327
287
  return m_data[StorageOrder==RowMajor ? j*m_incr.value() + i*m_stride : i*m_incr.value() + j*m_stride];
328
288
  }
329
289
 
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());
290
+ template<typename PacketType>
291
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketType loadPacket(Index i, Index j) const {
292
+ return pgather<Scalar,PacketType>(&operator()(i, j),m_incr.value());
332
293
  }
333
294
 
334
295
  template <typename PacketT, int AlignmentT>
@@ -346,6 +307,77 @@ public:
346
307
  return pgather<Scalar, SubPacket>(&operator()(i, j), m_stride);
347
308
  }
348
309
 
310
+ // storePacketBlock_helper defines a way to access values inside the PacketBlock, this is essentially required by the Complex types.
311
+ template<typename SubPacket, typename ScalarT, int n, int idx>
312
+ struct storePacketBlock_helper
313
+ {
314
+ storePacketBlock_helper<SubPacket, ScalarT, n, idx-1> spbh;
315
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(const blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType, Incr>* sup, Index i, Index j, const PacketBlock<SubPacket, n>& block) const {
316
+ spbh.store(sup, i,j,block);
317
+ for(int l = 0; l < unpacket_traits<SubPacket>::size; l++)
318
+ {
319
+ ScalarT *v = &sup->operator()(i+l, j+idx);
320
+ *v = block.packet[idx][l];
321
+ }
322
+ }
323
+ };
324
+
325
+ template<typename SubPacket, int n, int idx>
326
+ struct storePacketBlock_helper<SubPacket, std::complex<float>, n, idx>
327
+ {
328
+ storePacketBlock_helper<SubPacket, std::complex<float>, n, idx-1> spbh;
329
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(const blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType, Incr>* sup, Index i, Index j, const PacketBlock<SubPacket, n>& block) const {
330
+ spbh.store(sup,i,j,block);
331
+ for(int l = 0; l < unpacket_traits<SubPacket>::size; l++)
332
+ {
333
+ std::complex<float> *v = &sup->operator()(i+l, j+idx);
334
+ v->real(block.packet[idx].v[2*l+0]);
335
+ v->imag(block.packet[idx].v[2*l+1]);
336
+ }
337
+ }
338
+ };
339
+
340
+ template<typename SubPacket, int n, int idx>
341
+ struct storePacketBlock_helper<SubPacket, std::complex<double>, n, idx>
342
+ {
343
+ storePacketBlock_helper<SubPacket, std::complex<double>, n, idx-1> spbh;
344
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(const blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType, Incr>* sup, Index i, Index j, const PacketBlock<SubPacket, n>& block) const {
345
+ spbh.store(sup,i,j,block);
346
+ for(int l = 0; l < unpacket_traits<SubPacket>::size; l++)
347
+ {
348
+ std::complex<double> *v = &sup->operator()(i+l, j+idx);
349
+ v->real(block.packet[idx].v[2*l+0]);
350
+ v->imag(block.packet[idx].v[2*l+1]);
351
+ }
352
+ }
353
+ };
354
+
355
+ template<typename SubPacket, typename ScalarT, int n>
356
+ struct storePacketBlock_helper<SubPacket, ScalarT, n, -1>
357
+ {
358
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(const blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType, Incr>*, Index, Index, const PacketBlock<SubPacket, n>& ) const {
359
+ }
360
+ };
361
+
362
+ template<typename SubPacket, int n>
363
+ struct storePacketBlock_helper<SubPacket, std::complex<float>, n, -1>
364
+ {
365
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(const blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType, Incr>*, Index, Index, const PacketBlock<SubPacket, n>& ) const {
366
+ }
367
+ };
368
+
369
+ template<typename SubPacket, int n>
370
+ struct storePacketBlock_helper<SubPacket, std::complex<double>, n, -1>
371
+ {
372
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(const blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType, Incr>*, Index, Index, const PacketBlock<SubPacket, n>& ) const {
373
+ }
374
+ };
375
+ // This function stores a PacketBlock on m_data, this approach is really quite slow compare to Incr=1 and should be avoided when possible.
376
+ template<typename SubPacket, int n>
377
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacketBlock(Index i, Index j, const PacketBlock<SubPacket, n>&block) const {
378
+ storePacketBlock_helper<SubPacket, Scalar, n, n-1> spb;
379
+ spb.store(this, i,j,block);
380
+ }
349
381
  protected:
350
382
  Scalar* EIGEN_RESTRICT m_data;
351
383
  const Index m_stride;
@@ -379,14 +411,15 @@ template<typename XprType> struct blas_traits
379
411
  HasUsableDirectAccess = ( (int(XprType::Flags)&DirectAccessBit)
380
412
  && ( bool(XprType::IsVectorAtCompileTime)
381
413
  || int(inner_stride_at_compile_time<XprType>::ret) == 1)
382
- ) ? 1 : 0
414
+ ) ? 1 : 0,
415
+ HasScalarFactor = false
383
416
  };
384
417
  typedef typename conditional<bool(HasUsableDirectAccess),
385
418
  ExtractType,
386
419
  typename _ExtractType::PlainObject
387
420
  >::type DirectLinearAccessType;
388
- static inline ExtractType extract(const XprType& x) { return x; }
389
- static inline const Scalar extractScalarFactor(const XprType&) { return Scalar(1); }
421
+ static inline EIGEN_DEVICE_FUNC ExtractType extract(const XprType& x) { return x; }
422
+ static inline EIGEN_DEVICE_FUNC const Scalar extractScalarFactor(const XprType&) { return Scalar(1); }
390
423
  };
391
424
 
392
425
  // pop conjugate
@@ -411,17 +444,23 @@ template<typename Scalar, typename NestedXpr, typename Plain>
411
444
  struct blas_traits<CwiseBinaryOp<scalar_product_op<Scalar>, const CwiseNullaryOp<scalar_constant_op<Scalar>,Plain>, NestedXpr> >
412
445
  : blas_traits<NestedXpr>
413
446
  {
447
+ enum {
448
+ HasScalarFactor = true
449
+ };
414
450
  typedef blas_traits<NestedXpr> Base;
415
451
  typedef CwiseBinaryOp<scalar_product_op<Scalar>, const CwiseNullaryOp<scalar_constant_op<Scalar>,Plain>, NestedXpr> XprType;
416
452
  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)
453
+ static inline EIGEN_DEVICE_FUNC ExtractType extract(const XprType& x) { return Base::extract(x.rhs()); }
454
+ static inline EIGEN_DEVICE_FUNC Scalar extractScalarFactor(const XprType& x)
419
455
  { return x.lhs().functor().m_other * Base::extractScalarFactor(x.rhs()); }
420
456
  };
421
457
  template<typename Scalar, typename NestedXpr, typename Plain>
422
458
  struct blas_traits<CwiseBinaryOp<scalar_product_op<Scalar>, NestedXpr, const CwiseNullaryOp<scalar_constant_op<Scalar>,Plain> > >
423
459
  : blas_traits<NestedXpr>
424
460
  {
461
+ enum {
462
+ HasScalarFactor = true
463
+ };
425
464
  typedef blas_traits<NestedXpr> Base;
426
465
  typedef CwiseBinaryOp<scalar_product_op<Scalar>, NestedXpr, const CwiseNullaryOp<scalar_constant_op<Scalar>,Plain> > XprType;
427
466
  typedef typename Base::ExtractType ExtractType;
@@ -440,6 +479,9 @@ template<typename Scalar, typename NestedXpr>
440
479
  struct blas_traits<CwiseUnaryOp<scalar_opposite_op<Scalar>, NestedXpr> >
441
480
  : blas_traits<NestedXpr>
442
481
  {
482
+ enum {
483
+ HasScalarFactor = true
484
+ };
443
485
  typedef blas_traits<NestedXpr> Base;
444
486
  typedef CwiseUnaryOp<scalar_opposite_op<Scalar>, NestedXpr> XprType;
445
487
  typedef typename Base::ExtractType ExtractType;
@@ -476,7 +518,7 @@ struct blas_traits<const T>
476
518
 
477
519
  template<typename T, bool HasUsableDirectAccess=blas_traits<T>::HasUsableDirectAccess>
478
520
  struct extract_data_selector {
479
- static const typename T::Scalar* run(const T& m)
521
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE static const typename T::Scalar* run(const T& m)
480
522
  {
481
523
  return blas_traits<T>::extract(m).data();
482
524
  }
@@ -487,11 +529,53 @@ struct extract_data_selector<T,false> {
487
529
  static typename T::Scalar* run(const T&) { return 0; }
488
530
  };
489
531
 
490
- template<typename T> const typename T::Scalar* extract_data(const T& m)
532
+ template<typename T>
533
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE const typename T::Scalar* extract_data(const T& m)
491
534
  {
492
535
  return extract_data_selector<T>::run(m);
493
536
  }
494
537
 
538
+ /**
539
+ * \c combine_scalar_factors extracts and multiplies factors from GEMM and GEMV products.
540
+ * There is a specialization for booleans
541
+ */
542
+ template<typename ResScalar, typename Lhs, typename Rhs>
543
+ struct combine_scalar_factors_impl
544
+ {
545
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE static ResScalar run(const Lhs& lhs, const Rhs& rhs)
546
+ {
547
+ return blas_traits<Lhs>::extractScalarFactor(lhs) * blas_traits<Rhs>::extractScalarFactor(rhs);
548
+ }
549
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE static ResScalar run(const ResScalar& alpha, const Lhs& lhs, const Rhs& rhs)
550
+ {
551
+ return alpha * blas_traits<Lhs>::extractScalarFactor(lhs) * blas_traits<Rhs>::extractScalarFactor(rhs);
552
+ }
553
+ };
554
+ template<typename Lhs, typename Rhs>
555
+ struct combine_scalar_factors_impl<bool, Lhs, Rhs>
556
+ {
557
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE static bool run(const Lhs& lhs, const Rhs& rhs)
558
+ {
559
+ return blas_traits<Lhs>::extractScalarFactor(lhs) && blas_traits<Rhs>::extractScalarFactor(rhs);
560
+ }
561
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE static bool run(const bool& alpha, const Lhs& lhs, const Rhs& rhs)
562
+ {
563
+ return alpha && blas_traits<Lhs>::extractScalarFactor(lhs) && blas_traits<Rhs>::extractScalarFactor(rhs);
564
+ }
565
+ };
566
+
567
+ template<typename ResScalar, typename Lhs, typename Rhs>
568
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE ResScalar combine_scalar_factors(const ResScalar& alpha, const Lhs& lhs, const Rhs& rhs)
569
+ {
570
+ return combine_scalar_factors_impl<ResScalar,Lhs,Rhs>::run(alpha, lhs, rhs);
571
+ }
572
+ template<typename ResScalar, typename Lhs, typename Rhs>
573
+ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE ResScalar combine_scalar_factors(const Lhs& lhs, const Rhs& rhs)
574
+ {
575
+ return combine_scalar_factors_impl<ResScalar,Lhs,Rhs>::run(lhs, rhs);
576
+ }
577
+
578
+
495
579
  } // end namespace internal
496
580
 
497
581
  } // end namespace Eigen