@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
@@ -10,191 +10,192 @@
10
10
  #ifndef EIGEN_SPARSE_SELFADJOINTVIEW_H
11
11
  #define EIGEN_SPARSE_SELFADJOINTVIEW_H
12
12
 
13
- namespace Eigen {
14
-
13
+ // IWYU pragma: private
14
+ #include "./InternalHeaderCheck.h"
15
+
16
+ namespace Eigen {
17
+
15
18
  /** \ingroup SparseCore_Module
16
- * \class SparseSelfAdjointView
17
- *
18
- * \brief Pseudo expression to manipulate a triangular sparse matrix as a selfadjoint matrix.
19
- *
20
- * \param MatrixType the type of the dense matrix storing the coefficients
21
- * \param Mode can be either \c #Lower or \c #Upper
22
- *
23
- * This class is an expression of a sefladjoint matrix from a triangular part of a matrix
24
- * with given dense storage of the coefficients. It is the return type of MatrixBase::selfadjointView()
25
- * and most of the time this is the only way that it is used.
26
- *
27
- * \sa SparseMatrixBase::selfadjointView()
28
- */
19
+ * \class SparseSelfAdjointView
20
+ *
21
+ * \brief Pseudo expression to manipulate a triangular sparse matrix as a selfadjoint matrix.
22
+ *
23
+ * \param MatrixType the type of the dense matrix storing the coefficients
24
+ * \param Mode can be either \c #Lower or \c #Upper
25
+ *
26
+ * This class is an expression of a sefladjoint matrix from a triangular part of a matrix
27
+ * with given dense storage of the coefficients. It is the return type of MatrixBase::selfadjointView()
28
+ * and most of the time this is the only way that it is used.
29
+ *
30
+ * \sa SparseMatrixBase::selfadjointView()
31
+ */
29
32
  namespace internal {
30
-
31
- template<typename MatrixType, unsigned int Mode>
32
- struct traits<SparseSelfAdjointView<MatrixType,Mode> > : traits<MatrixType> {
33
- };
34
33
 
35
- template<int SrcMode,int DstMode,typename MatrixType,int DestOrder>
36
- void permute_symm_to_symm(const MatrixType& mat, SparseMatrix<typename MatrixType::Scalar,DestOrder,typename MatrixType::StorageIndex>& _dest, const typename MatrixType::StorageIndex* perm = 0);
34
+ template <typename MatrixType, unsigned int Mode>
35
+ struct traits<SparseSelfAdjointView<MatrixType, Mode> > : traits<MatrixType> {};
37
36
 
38
- template<int Mode,typename MatrixType,int DestOrder>
39
- void permute_symm_to_fullsymm(const MatrixType& mat, SparseMatrix<typename MatrixType::Scalar,DestOrder,typename MatrixType::StorageIndex>& _dest, const typename MatrixType::StorageIndex* perm = 0);
37
+ template <int SrcMode, int DstMode, bool NonHermitian, typename MatrixType, int DestOrder>
38
+ void permute_symm_to_symm(
39
+ const MatrixType& mat,
40
+ SparseMatrix<typename MatrixType::Scalar, DestOrder, typename MatrixType::StorageIndex>& _dest,
41
+ const typename MatrixType::StorageIndex* perm = 0);
40
42
 
41
- }
43
+ template <int Mode, bool NonHermitian, typename MatrixType, int DestOrder>
44
+ void permute_symm_to_fullsymm(
45
+ const MatrixType& mat,
46
+ SparseMatrix<typename MatrixType::Scalar, DestOrder, typename MatrixType::StorageIndex>& _dest,
47
+ const typename MatrixType::StorageIndex* perm = 0);
42
48
 
43
- template<typename MatrixType, unsigned int _Mode> class SparseSelfAdjointView
44
- : public EigenBase<SparseSelfAdjointView<MatrixType,_Mode> >
45
- {
46
- public:
47
-
48
- enum {
49
- Mode = _Mode,
50
- TransposeMode = ((Mode & Upper) ? Lower : 0) | ((Mode & Lower) ? Upper : 0),
51
- RowsAtCompileTime = internal::traits<SparseSelfAdjointView>::RowsAtCompileTime,
52
- ColsAtCompileTime = internal::traits<SparseSelfAdjointView>::ColsAtCompileTime
53
- };
54
-
55
- typedef EigenBase<SparseSelfAdjointView> Base;
56
- typedef typename MatrixType::Scalar Scalar;
57
- typedef typename MatrixType::StorageIndex StorageIndex;
58
- typedef Matrix<StorageIndex,Dynamic,1> VectorI;
59
- typedef typename internal::ref_selector<MatrixType>::non_const_type MatrixTypeNested;
60
- typedef typename internal::remove_all<MatrixTypeNested>::type _MatrixTypeNested;
61
-
62
- explicit inline SparseSelfAdjointView(MatrixType& matrix) : m_matrix(matrix)
63
- {
64
- eigen_assert(rows()==cols() && "SelfAdjointView is only for squared matrices");
65
- }
49
+ } // namespace internal
66
50
 
67
- inline Index rows() const { return m_matrix.rows(); }
68
- inline Index cols() const { return m_matrix.cols(); }
69
-
70
- /** \internal \returns a reference to the nested matrix */
71
- const _MatrixTypeNested& matrix() const { return m_matrix; }
72
- typename internal::remove_reference<MatrixTypeNested>::type& matrix() { return m_matrix; }
73
-
74
- /** \returns an expression of the matrix product between a sparse self-adjoint matrix \c *this and a sparse matrix \a rhs.
75
- *
76
- * Note that there is no algorithmic advantage of performing such a product compared to a general sparse-sparse matrix product.
77
- * Indeed, the SparseSelfadjointView operand is first copied into a temporary SparseMatrix before computing the product.
78
- */
79
- template<typename OtherDerived>
80
- Product<SparseSelfAdjointView, OtherDerived>
81
- operator*(const SparseMatrixBase<OtherDerived>& rhs) const
82
- {
83
- return Product<SparseSelfAdjointView, OtherDerived>(*this, rhs.derived());
84
- }
51
+ template <typename MatrixType, unsigned int Mode_>
52
+ class SparseSelfAdjointView : public EigenBase<SparseSelfAdjointView<MatrixType, Mode_> > {
53
+ public:
54
+ enum {
55
+ Mode = Mode_,
56
+ TransposeMode = ((int(Mode) & int(Upper)) ? Lower : 0) | ((int(Mode) & int(Lower)) ? Upper : 0),
57
+ RowsAtCompileTime = internal::traits<SparseSelfAdjointView>::RowsAtCompileTime,
58
+ ColsAtCompileTime = internal::traits<SparseSelfAdjointView>::ColsAtCompileTime
59
+ };
85
60
 
86
- /** \returns an expression of the matrix product between a sparse matrix \a lhs and a sparse self-adjoint matrix \a rhs.
87
- *
88
- * Note that there is no algorithmic advantage of performing such a product compared to a general sparse-sparse matrix product.
89
- * Indeed, the SparseSelfadjointView operand is first copied into a temporary SparseMatrix before computing the product.
90
- */
91
- template<typename OtherDerived> friend
92
- Product<OtherDerived, SparseSelfAdjointView>
93
- operator*(const SparseMatrixBase<OtherDerived>& lhs, const SparseSelfAdjointView& rhs)
94
- {
95
- return Product<OtherDerived, SparseSelfAdjointView>(lhs.derived(), rhs);
96
- }
97
-
98
- /** Efficient sparse self-adjoint matrix times dense vector/matrix product */
99
- template<typename OtherDerived>
100
- Product<SparseSelfAdjointView,OtherDerived>
101
- operator*(const MatrixBase<OtherDerived>& rhs) const
102
- {
103
- return Product<SparseSelfAdjointView,OtherDerived>(*this, rhs.derived());
104
- }
61
+ typedef EigenBase<SparseSelfAdjointView> Base;
62
+ typedef typename MatrixType::Scalar Scalar;
63
+ typedef typename MatrixType::StorageIndex StorageIndex;
64
+ typedef Matrix<StorageIndex, Dynamic, 1> VectorI;
65
+ typedef typename internal::ref_selector<MatrixType>::non_const_type MatrixTypeNested;
66
+ typedef internal::remove_all_t<MatrixTypeNested> MatrixTypeNested_;
105
67
 
106
- /** Efficient dense vector/matrix times sparse self-adjoint matrix product */
107
- template<typename OtherDerived> friend
108
- Product<OtherDerived,SparseSelfAdjointView>
109
- operator*(const MatrixBase<OtherDerived>& lhs, const SparseSelfAdjointView& rhs)
110
- {
111
- return Product<OtherDerived,SparseSelfAdjointView>(lhs.derived(), rhs);
112
- }
68
+ explicit inline SparseSelfAdjointView(MatrixType& matrix) : m_matrix(matrix) {
69
+ eigen_assert(rows() == cols() && "SelfAdjointView is only for squared matrices");
70
+ }
113
71
 
114
- /** Perform a symmetric rank K update of the selfadjoint matrix \c *this:
115
- * \f$ this = this + \alpha ( u u^* ) \f$ where \a u is a vector or matrix.
116
- *
117
- * \returns a reference to \c *this
118
- *
119
- * To perform \f$ this = this + \alpha ( u^* u ) \f$ you can simply
120
- * call this function with u.adjoint().
121
- */
122
- template<typename DerivedU>
123
- SparseSelfAdjointView& rankUpdate(const SparseMatrixBase<DerivedU>& u, const Scalar& alpha = Scalar(1));
124
-
125
- /** \returns an expression of P H P^-1 */
126
- // TODO implement twists in a more evaluator friendly fashion
127
- SparseSymmetricPermutationProduct<_MatrixTypeNested,Mode> twistedBy(const PermutationMatrix<Dynamic,Dynamic,StorageIndex>& perm) const
128
- {
129
- return SparseSymmetricPermutationProduct<_MatrixTypeNested,Mode>(m_matrix, perm);
130
- }
72
+ inline Index rows() const { return m_matrix.rows(); }
73
+ inline Index cols() const { return m_matrix.cols(); }
74
+
75
+ /** \internal \returns a reference to the nested matrix */
76
+ const MatrixTypeNested_& matrix() const { return m_matrix; }
77
+ std::remove_reference_t<MatrixTypeNested>& matrix() { return m_matrix; }
78
+
79
+ /** \returns an expression of the matrix product between a sparse self-adjoint matrix \c *this and a sparse matrix \a
80
+ * rhs.
81
+ *
82
+ * Note that there is no algorithmic advantage of performing such a product compared to a general sparse-sparse matrix
83
+ * product. Indeed, the SparseSelfadjointView operand is first copied into a temporary SparseMatrix before computing
84
+ * the product.
85
+ */
86
+ template <typename OtherDerived>
87
+ Product<SparseSelfAdjointView, OtherDerived> operator*(const SparseMatrixBase<OtherDerived>& rhs) const {
88
+ return Product<SparseSelfAdjointView, OtherDerived>(*this, rhs.derived());
89
+ }
131
90
 
132
- template<typename SrcMatrixType,int SrcMode>
133
- SparseSelfAdjointView& operator=(const SparseSymmetricPermutationProduct<SrcMatrixType,SrcMode>& permutedMatrix)
134
- {
135
- internal::call_assignment_no_alias_no_transpose(*this, permutedMatrix);
136
- return *this;
137
- }
91
+ /** \returns an expression of the matrix product between a sparse matrix \a lhs and a sparse self-adjoint matrix \a
92
+ * rhs.
93
+ *
94
+ * Note that there is no algorithmic advantage of performing such a product compared to a general sparse-sparse matrix
95
+ * product. Indeed, the SparseSelfadjointView operand is first copied into a temporary SparseMatrix before computing
96
+ * the product.
97
+ */
98
+ template <typename OtherDerived>
99
+ friend Product<OtherDerived, SparseSelfAdjointView> operator*(const SparseMatrixBase<OtherDerived>& lhs,
100
+ const SparseSelfAdjointView& rhs) {
101
+ return Product<OtherDerived, SparseSelfAdjointView>(lhs.derived(), rhs);
102
+ }
138
103
 
139
- SparseSelfAdjointView& operator=(const SparseSelfAdjointView& src)
140
- {
141
- PermutationMatrix<Dynamic,Dynamic,StorageIndex> pnull;
142
- return *this = src.twistedBy(pnull);
143
- }
104
+ /** Efficient sparse self-adjoint matrix times dense vector/matrix product */
105
+ template <typename OtherDerived>
106
+ Product<SparseSelfAdjointView, OtherDerived> operator*(const MatrixBase<OtherDerived>& rhs) const {
107
+ return Product<SparseSelfAdjointView, OtherDerived>(*this, rhs.derived());
108
+ }
144
109
 
145
- template<typename SrcMatrixType,unsigned int SrcMode>
146
- SparseSelfAdjointView& operator=(const SparseSelfAdjointView<SrcMatrixType,SrcMode>& src)
147
- {
148
- PermutationMatrix<Dynamic,Dynamic,StorageIndex> pnull;
149
- return *this = src.twistedBy(pnull);
150
- }
151
-
152
- void resize(Index rows, Index cols)
153
- {
154
- EIGEN_ONLY_USED_FOR_DEBUG(rows);
155
- EIGEN_ONLY_USED_FOR_DEBUG(cols);
156
- eigen_assert(rows == this->rows() && cols == this->cols()
157
- && "SparseSelfadjointView::resize() does not actually allow to resize.");
158
- }
159
-
160
- protected:
161
-
162
- MatrixTypeNested m_matrix;
163
- //mutable VectorI m_countPerRow;
164
- //mutable VectorI m_countPerCol;
165
- private:
166
- template<typename Dest> void evalTo(Dest &) const;
110
+ /** Efficient dense vector/matrix times sparse self-adjoint matrix product */
111
+ template <typename OtherDerived>
112
+ friend Product<OtherDerived, SparseSelfAdjointView> operator*(const MatrixBase<OtherDerived>& lhs,
113
+ const SparseSelfAdjointView& rhs) {
114
+ return Product<OtherDerived, SparseSelfAdjointView>(lhs.derived(), rhs);
115
+ }
116
+
117
+ /** Perform a symmetric rank K update of the selfadjoint matrix \c *this:
118
+ * \f$ this = this + \alpha ( u u^* ) \f$ where \a u is a vector or matrix.
119
+ *
120
+ * \returns a reference to \c *this
121
+ *
122
+ * To perform \f$ this = this + \alpha ( u^* u ) \f$ you can simply
123
+ * call this function with u.adjoint().
124
+ */
125
+ template <typename DerivedU>
126
+ SparseSelfAdjointView& rankUpdate(const SparseMatrixBase<DerivedU>& u, const Scalar& alpha = Scalar(1));
127
+
128
+ /** \returns an expression of P H P^-1 */
129
+ // TODO implement twists in a more evaluator friendly fashion
130
+ SparseSymmetricPermutationProduct<MatrixTypeNested_, Mode> twistedBy(
131
+ const PermutationMatrix<Dynamic, Dynamic, StorageIndex>& perm) const {
132
+ return SparseSymmetricPermutationProduct<MatrixTypeNested_, Mode>(m_matrix, perm);
133
+ }
134
+
135
+ template <typename SrcMatrixType, int SrcMode>
136
+ SparseSelfAdjointView& operator=(const SparseSymmetricPermutationProduct<SrcMatrixType, SrcMode>& permutedMatrix) {
137
+ internal::call_assignment_no_alias_no_transpose(*this, permutedMatrix);
138
+ return *this;
139
+ }
140
+
141
+ SparseSelfAdjointView& operator=(const SparseSelfAdjointView& src) {
142
+ PermutationMatrix<Dynamic, Dynamic, StorageIndex> pnull;
143
+ return *this = src.twistedBy(pnull);
144
+ }
145
+
146
+ // Since we override the copy-assignment operator, we need to explicitly redeclare the copy-constructor
147
+ EIGEN_DEFAULT_COPY_CONSTRUCTOR(SparseSelfAdjointView)
148
+
149
+ template <typename SrcMatrixType, unsigned int SrcMode>
150
+ SparseSelfAdjointView& operator=(const SparseSelfAdjointView<SrcMatrixType, SrcMode>& src) {
151
+ PermutationMatrix<Dynamic, Dynamic, StorageIndex> pnull;
152
+ return *this = src.twistedBy(pnull);
153
+ }
154
+
155
+ void resize(Index rows, Index cols) {
156
+ EIGEN_ONLY_USED_FOR_DEBUG(rows);
157
+ EIGEN_ONLY_USED_FOR_DEBUG(cols);
158
+ eigen_assert(rows == this->rows() && cols == this->cols() &&
159
+ "SparseSelfadjointView::resize() does not actually allow to resize.");
160
+ }
161
+
162
+ protected:
163
+ MatrixTypeNested m_matrix;
164
+ // mutable VectorI m_countPerRow;
165
+ // mutable VectorI m_countPerCol;
166
+ private:
167
+ template <typename Dest>
168
+ void evalTo(Dest&) const;
167
169
  };
168
170
 
169
171
  /***************************************************************************
170
- * Implementation of SparseMatrixBase methods
171
- ***************************************************************************/
172
+ * Implementation of SparseMatrixBase methods
173
+ ***************************************************************************/
172
174
 
173
- template<typename Derived>
174
- template<unsigned int UpLo>
175
- typename SparseMatrixBase<Derived>::template ConstSelfAdjointViewReturnType<UpLo>::Type SparseMatrixBase<Derived>::selfadjointView() const
176
- {
175
+ template <typename Derived>
176
+ template <unsigned int UpLo>
177
+ typename SparseMatrixBase<Derived>::template ConstSelfAdjointViewReturnType<UpLo>::Type
178
+ SparseMatrixBase<Derived>::selfadjointView() const {
177
179
  return SparseSelfAdjointView<const Derived, UpLo>(derived());
178
180
  }
179
181
 
180
- template<typename Derived>
181
- template<unsigned int UpLo>
182
- typename SparseMatrixBase<Derived>::template SelfAdjointViewReturnType<UpLo>::Type SparseMatrixBase<Derived>::selfadjointView()
183
- {
182
+ template <typename Derived>
183
+ template <unsigned int UpLo>
184
+ typename SparseMatrixBase<Derived>::template SelfAdjointViewReturnType<UpLo>::Type
185
+ SparseMatrixBase<Derived>::selfadjointView() {
184
186
  return SparseSelfAdjointView<Derived, UpLo>(derived());
185
187
  }
186
188
 
187
189
  /***************************************************************************
188
- * Implementation of SparseSelfAdjointView methods
189
- ***************************************************************************/
190
-
191
- template<typename MatrixType, unsigned int Mode>
192
- template<typename DerivedU>
193
- SparseSelfAdjointView<MatrixType,Mode>&
194
- SparseSelfAdjointView<MatrixType,Mode>::rankUpdate(const SparseMatrixBase<DerivedU>& u, const Scalar& alpha)
195
- {
196
- SparseMatrix<Scalar,(MatrixType::Flags&RowMajorBit)?RowMajor:ColMajor> tmp = u * u.adjoint();
197
- if(alpha==Scalar(0))
190
+ * Implementation of SparseSelfAdjointView methods
191
+ ***************************************************************************/
192
+
193
+ template <typename MatrixType, unsigned int Mode>
194
+ template <typename DerivedU>
195
+ SparseSelfAdjointView<MatrixType, Mode>& SparseSelfAdjointView<MatrixType, Mode>::rankUpdate(
196
+ const SparseMatrixBase<DerivedU>& u, const Scalar& alpha) {
197
+ SparseMatrix<Scalar, (MatrixType::Flags & RowMajorBit) ? RowMajor : ColMajor> tmp = u * u.adjoint();
198
+ if (alpha == Scalar(0))
198
199
  m_matrix = tmp.template triangularView<Mode>();
199
200
  else
200
201
  m_matrix += alpha * tmp.template triangularView<Mode>();
@@ -203,454 +204,410 @@ SparseSelfAdjointView<MatrixType,Mode>::rankUpdate(const SparseMatrixBase<Derive
203
204
  }
204
205
 
205
206
  namespace internal {
206
-
207
+
207
208
  // TODO currently a selfadjoint expression has the form SelfAdjointView<.,.>
208
209
  // in the future selfadjoint-ness should be defined by the expression traits
209
- // such that Transpose<SelfAdjointView<.,.> > is valid. (currently TriangularBase::transpose() is overloaded to make it work)
210
- template<typename MatrixType, unsigned int Mode>
211
- struct evaluator_traits<SparseSelfAdjointView<MatrixType,Mode> >
212
- {
210
+ // such that Transpose<SelfAdjointView<.,.> > is valid. (currently TriangularBase::transpose() is overloaded to
211
+ // make it work)
212
+ template <typename MatrixType, unsigned int Mode>
213
+ struct evaluator_traits<SparseSelfAdjointView<MatrixType, Mode> > {
213
214
  typedef typename storage_kind_to_evaluator_kind<typename MatrixType::StorageKind>::Kind Kind;
214
215
  typedef SparseSelfAdjointShape Shape;
215
216
  };
216
217
 
217
218
  struct SparseSelfAdjoint2Sparse {};
218
219
 
219
- template<> struct AssignmentKind<SparseShape,SparseSelfAdjointShape> { typedef SparseSelfAdjoint2Sparse Kind; };
220
- template<> struct AssignmentKind<SparseSelfAdjointShape,SparseShape> { typedef Sparse2Sparse Kind; };
220
+ template <>
221
+ struct AssignmentKind<SparseShape, SparseSelfAdjointShape> {
222
+ typedef SparseSelfAdjoint2Sparse Kind;
223
+ };
224
+ template <>
225
+ struct AssignmentKind<SparseSelfAdjointShape, SparseShape> {
226
+ typedef Sparse2Sparse Kind;
227
+ };
221
228
 
222
- template< typename DstXprType, typename SrcXprType, typename Functor>
223
- struct Assignment<DstXprType, SrcXprType, Functor, SparseSelfAdjoint2Sparse>
224
- {
229
+ template <typename DstXprType, typename SrcXprType, typename Functor>
230
+ struct Assignment<DstXprType, SrcXprType, Functor, SparseSelfAdjoint2Sparse> {
225
231
  typedef typename DstXprType::StorageIndex StorageIndex;
226
- typedef internal::assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar> AssignOpType;
232
+ typedef internal::assign_op<typename DstXprType::Scalar, typename SrcXprType::Scalar> AssignOpType;
227
233
 
228
- template<typename DestScalar,int StorageOrder>
229
- static void run(SparseMatrix<DestScalar,StorageOrder,StorageIndex> &dst, const SrcXprType &src, const AssignOpType&/*func*/)
230
- {
231
- internal::permute_symm_to_fullsymm<SrcXprType::Mode>(src.matrix(), dst);
234
+ template <typename DestScalar, int StorageOrder>
235
+ static void run(SparseMatrix<DestScalar, StorageOrder, StorageIndex>& dst, const SrcXprType& src,
236
+ const AssignOpType& /*func*/) {
237
+ internal::permute_symm_to_fullsymm<SrcXprType::Mode, false>(src.matrix(), dst);
232
238
  }
233
239
 
234
- // FIXME: the handling of += and -= in sparse matrices should be cleanup so that next two overloads could be reduced to:
235
- template<typename DestScalar,int StorageOrder,typename AssignFunc>
236
- static void run(SparseMatrix<DestScalar,StorageOrder,StorageIndex> &dst, const SrcXprType &src, const AssignFunc& func)
237
- {
238
- SparseMatrix<DestScalar,StorageOrder,StorageIndex> tmp(src.rows(),src.cols());
240
+ // FIXME: the handling of += and -= in sparse matrices should be cleanup so that next two overloads could be reduced
241
+ // to:
242
+ template <typename DestScalar, int StorageOrder, typename AssignFunc>
243
+ static void run(SparseMatrix<DestScalar, StorageOrder, StorageIndex>& dst, const SrcXprType& src,
244
+ const AssignFunc& func) {
245
+ SparseMatrix<DestScalar, StorageOrder, StorageIndex> tmp(src.rows(), src.cols());
239
246
  run(tmp, src, AssignOpType());
240
247
  call_assignment_no_alias_no_transpose(dst, tmp, func);
241
248
  }
242
249
 
243
- template<typename DestScalar,int StorageOrder>
244
- static void run(SparseMatrix<DestScalar,StorageOrder,StorageIndex> &dst, const SrcXprType &src,
245
- const internal::add_assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar>& /* func */)
246
- {
247
- SparseMatrix<DestScalar,StorageOrder,StorageIndex> tmp(src.rows(),src.cols());
250
+ template <typename DestScalar, int StorageOrder>
251
+ static void run(SparseMatrix<DestScalar, StorageOrder, StorageIndex>& dst, const SrcXprType& src,
252
+ const internal::add_assign_op<typename DstXprType::Scalar, typename SrcXprType::Scalar>& /* func */) {
253
+ SparseMatrix<DestScalar, StorageOrder, StorageIndex> tmp(src.rows(), src.cols());
248
254
  run(tmp, src, AssignOpType());
249
255
  dst += tmp;
250
256
  }
251
257
 
252
- template<typename DestScalar,int StorageOrder>
253
- static void run(SparseMatrix<DestScalar,StorageOrder,StorageIndex> &dst, const SrcXprType &src,
254
- const internal::sub_assign_op<typename DstXprType::Scalar,typename SrcXprType::Scalar>& /* func */)
255
- {
256
- SparseMatrix<DestScalar,StorageOrder,StorageIndex> tmp(src.rows(),src.cols());
258
+ template <typename DestScalar, int StorageOrder>
259
+ static void run(SparseMatrix<DestScalar, StorageOrder, StorageIndex>& dst, const SrcXprType& src,
260
+ const internal::sub_assign_op<typename DstXprType::Scalar, typename SrcXprType::Scalar>& /* func */) {
261
+ SparseMatrix<DestScalar, StorageOrder, StorageIndex> tmp(src.rows(), src.cols());
257
262
  run(tmp, src, AssignOpType());
258
263
  dst -= tmp;
259
264
  }
260
-
261
- template<typename DestScalar>
262
- static void run(DynamicSparseMatrix<DestScalar,ColMajor,StorageIndex>& dst, const SrcXprType &src, const AssignOpType&/*func*/)
263
- {
264
- // TODO directly evaluate into dst;
265
- SparseMatrix<DestScalar,ColMajor,StorageIndex> tmp(dst.rows(),dst.cols());
266
- internal::permute_symm_to_fullsymm<SrcXprType::Mode>(src.matrix(), tmp);
267
- dst = tmp;
268
- }
269
265
  };
270
266
 
271
- } // end namespace internal
267
+ } // end namespace internal
272
268
 
273
269
  /***************************************************************************
274
- * Implementation of sparse self-adjoint time dense matrix
275
- ***************************************************************************/
270
+ * Implementation of sparse self-adjoint time dense matrix
271
+ ***************************************************************************/
276
272
 
277
273
  namespace internal {
278
274
 
279
- template<int Mode, typename SparseLhsType, typename DenseRhsType, typename DenseResType, typename AlphaType>
280
- inline void sparse_selfadjoint_time_dense_product(const SparseLhsType& lhs, const DenseRhsType& rhs, DenseResType& res, const AlphaType& alpha)
281
- {
275
+ template <int Mode, typename SparseLhsType, typename DenseRhsType, typename DenseResType, typename AlphaType>
276
+ inline void sparse_selfadjoint_time_dense_product(const SparseLhsType& lhs, const DenseRhsType& rhs, DenseResType& res,
277
+ const AlphaType& alpha) {
282
278
  EIGEN_ONLY_USED_FOR_DEBUG(alpha);
283
-
284
- typedef typename internal::nested_eval<SparseLhsType,DenseRhsType::MaxColsAtCompileTime>::type SparseLhsTypeNested;
285
- typedef typename internal::remove_all<SparseLhsTypeNested>::type SparseLhsTypeNestedCleaned;
279
+
280
+ typedef typename internal::nested_eval<SparseLhsType, DenseRhsType::MaxColsAtCompileTime>::type SparseLhsTypeNested;
281
+ typedef internal::remove_all_t<SparseLhsTypeNested> SparseLhsTypeNestedCleaned;
286
282
  typedef evaluator<SparseLhsTypeNestedCleaned> LhsEval;
287
283
  typedef typename LhsEval::InnerIterator LhsIterator;
288
284
  typedef typename SparseLhsType::Scalar LhsScalar;
289
-
285
+
290
286
  enum {
291
- LhsIsRowMajor = (LhsEval::Flags&RowMajorBit)==RowMajorBit,
292
- ProcessFirstHalf =
293
- ((Mode&(Upper|Lower))==(Upper|Lower))
294
- || ( (Mode&Upper) && !LhsIsRowMajor)
295
- || ( (Mode&Lower) && LhsIsRowMajor),
287
+ LhsIsRowMajor = (LhsEval::Flags & RowMajorBit) == RowMajorBit,
288
+ ProcessFirstHalf = ((Mode & (Upper | Lower)) == (Upper | Lower)) || ((Mode & Upper) && !LhsIsRowMajor) ||
289
+ ((Mode & Lower) && LhsIsRowMajor),
296
290
  ProcessSecondHalf = !ProcessFirstHalf
297
291
  };
298
-
292
+
299
293
  SparseLhsTypeNested lhs_nested(lhs);
300
294
  LhsEval lhsEval(lhs_nested);
301
295
 
302
296
  // work on one column at once
303
- for (Index k=0; k<rhs.cols(); ++k)
304
- {
305
- for (Index j=0; j<lhs.outerSize(); ++j)
306
- {
307
- LhsIterator i(lhsEval,j);
297
+ for (Index k = 0; k < rhs.cols(); ++k) {
298
+ for (Index j = 0; j < lhs.outerSize(); ++j) {
299
+ LhsIterator i(lhsEval, j);
308
300
  // handle diagonal coeff
309
- if (ProcessSecondHalf)
310
- {
311
- while (i && i.index()<j) ++i;
312
- if(i && i.index()==j)
313
- {
314
- res.coeffRef(j,k) += alpha * i.value() * rhs.coeff(j,k);
301
+ if (ProcessSecondHalf) {
302
+ while (i && i.index() < j) ++i;
303
+ if (i && i.index() == j) {
304
+ res.coeffRef(j, k) += alpha * i.value() * rhs.coeff(j, k);
315
305
  ++i;
316
306
  }
317
307
  }
318
308
 
319
309
  // premultiplied rhs for scatters
320
- typename ScalarBinaryOpTraits<AlphaType, typename DenseRhsType::Scalar>::ReturnType rhs_j(alpha*rhs(j,k));
310
+ typename ScalarBinaryOpTraits<AlphaType, typename DenseRhsType::Scalar>::ReturnType rhs_j(alpha * rhs(j, k));
321
311
  // accumulator for partial scalar product
322
312
  typename DenseResType::Scalar res_j(0);
323
- for(; (ProcessFirstHalf ? i && i.index() < j : i) ; ++i)
324
- {
313
+ for (; (ProcessFirstHalf ? i && i.index() < j : i); ++i) {
325
314
  LhsScalar lhs_ij = i.value();
326
- if(!LhsIsRowMajor) lhs_ij = numext::conj(lhs_ij);
327
- res_j += lhs_ij * rhs.coeff(i.index(),k);
328
- res(i.index(),k) += numext::conj(lhs_ij) * rhs_j;
315
+ if (!LhsIsRowMajor) lhs_ij = numext::conj(lhs_ij);
316
+ res_j += lhs_ij * rhs.coeff(i.index(), k);
317
+ res(i.index(), k) += numext::conj(lhs_ij) * rhs_j;
329
318
  }
330
- res.coeffRef(j,k) += alpha * res_j;
319
+ res.coeffRef(j, k) += alpha * res_j;
331
320
 
332
321
  // handle diagonal coeff
333
- if (ProcessFirstHalf && i && (i.index()==j))
334
- res.coeffRef(j,k) += alpha * i.value() * rhs.coeff(j,k);
322
+ if (ProcessFirstHalf && i && (i.index() == j)) res.coeffRef(j, k) += alpha * i.value() * rhs.coeff(j, k);
335
323
  }
336
324
  }
337
325
  }
338
326
 
339
-
340
- template<typename LhsView, typename Rhs, int ProductType>
327
+ template <typename LhsView, typename Rhs, int ProductType>
341
328
  struct generic_product_impl<LhsView, Rhs, SparseSelfAdjointShape, DenseShape, ProductType>
342
- : generic_product_impl_base<LhsView, Rhs, generic_product_impl<LhsView, Rhs, SparseSelfAdjointShape, DenseShape, ProductType> >
343
- {
344
- template<typename Dest>
345
- static void scaleAndAddTo(Dest& dst, const LhsView& lhsView, const Rhs& rhs, const typename Dest::Scalar& alpha)
346
- {
347
- typedef typename LhsView::_MatrixTypeNested Lhs;
348
- typedef typename nested_eval<Lhs,Dynamic>::type LhsNested;
349
- typedef typename nested_eval<Rhs,Dynamic>::type RhsNested;
329
+ : generic_product_impl_base<LhsView, Rhs,
330
+ generic_product_impl<LhsView, Rhs, SparseSelfAdjointShape, DenseShape, ProductType> > {
331
+ template <typename Dest>
332
+ static void scaleAndAddTo(Dest& dst, const LhsView& lhsView, const Rhs& rhs, const typename Dest::Scalar& alpha) {
333
+ typedef typename LhsView::MatrixTypeNested_ Lhs;
334
+ typedef typename nested_eval<Lhs, Dynamic>::type LhsNested;
335
+ typedef typename nested_eval<Rhs, Dynamic>::type RhsNested;
350
336
  LhsNested lhsNested(lhsView.matrix());
351
337
  RhsNested rhsNested(rhs);
352
-
338
+
353
339
  internal::sparse_selfadjoint_time_dense_product<LhsView::Mode>(lhsNested, rhsNested, dst, alpha);
354
340
  }
355
341
  };
356
342
 
357
- template<typename Lhs, typename RhsView, int ProductType>
343
+ template <typename Lhs, typename RhsView, int ProductType>
358
344
  struct generic_product_impl<Lhs, RhsView, DenseShape, SparseSelfAdjointShape, ProductType>
359
- : generic_product_impl_base<Lhs, RhsView, generic_product_impl<Lhs, RhsView, DenseShape, SparseSelfAdjointShape, ProductType> >
360
- {
361
- template<typename Dest>
362
- static void scaleAndAddTo(Dest& dst, const Lhs& lhs, const RhsView& rhsView, const typename Dest::Scalar& alpha)
363
- {
364
- typedef typename RhsView::_MatrixTypeNested Rhs;
365
- typedef typename nested_eval<Lhs,Dynamic>::type LhsNested;
366
- typedef typename nested_eval<Rhs,Dynamic>::type RhsNested;
345
+ : generic_product_impl_base<Lhs, RhsView,
346
+ generic_product_impl<Lhs, RhsView, DenseShape, SparseSelfAdjointShape, ProductType> > {
347
+ template <typename Dest>
348
+ static void scaleAndAddTo(Dest& dst, const Lhs& lhs, const RhsView& rhsView, const typename Dest::Scalar& alpha) {
349
+ typedef typename RhsView::MatrixTypeNested_ Rhs;
350
+ typedef typename nested_eval<Lhs, Dynamic>::type LhsNested;
351
+ typedef typename nested_eval<Rhs, Dynamic>::type RhsNested;
367
352
  LhsNested lhsNested(lhs);
368
353
  RhsNested rhsNested(rhsView.matrix());
369
-
354
+
370
355
  // transpose everything
371
356
  Transpose<Dest> dstT(dst);
372
- internal::sparse_selfadjoint_time_dense_product<RhsView::TransposeMode>(rhsNested.transpose(), lhsNested.transpose(), dstT, alpha);
357
+ internal::sparse_selfadjoint_time_dense_product<RhsView::TransposeMode>(rhsNested.transpose(),
358
+ lhsNested.transpose(), dstT, alpha);
373
359
  }
374
360
  };
375
361
 
376
362
  // NOTE: these two overloads are needed to evaluate the sparse selfadjoint view into a full sparse matrix
377
363
  // TODO: maybe the copy could be handled by generic_product_impl so that these overloads would not be needed anymore
378
364
 
379
- template<typename LhsView, typename Rhs, int ProductTag>
365
+ template <typename LhsView, typename Rhs, int ProductTag>
380
366
  struct product_evaluator<Product<LhsView, Rhs, DefaultProduct>, ProductTag, SparseSelfAdjointShape, SparseShape>
381
- : public evaluator<typename Product<typename Rhs::PlainObject, Rhs, DefaultProduct>::PlainObject>
382
- {
367
+ : public evaluator<typename Product<typename Rhs::PlainObject, Rhs, DefaultProduct>::PlainObject> {
383
368
  typedef Product<LhsView, Rhs, DefaultProduct> XprType;
384
369
  typedef typename XprType::PlainObject PlainObject;
385
370
  typedef evaluator<PlainObject> Base;
386
371
 
387
- product_evaluator(const XprType& xpr)
388
- : m_lhs(xpr.lhs()), m_result(xpr.rows(), xpr.cols())
389
- {
390
- ::new (static_cast<Base*>(this)) Base(m_result);
391
- generic_product_impl<typename Rhs::PlainObject, Rhs, SparseShape, SparseShape, ProductTag>::evalTo(m_result, m_lhs, xpr.rhs());
372
+ product_evaluator(const XprType& xpr) : m_lhs(xpr.lhs()), m_result(xpr.rows(), xpr.cols()) {
373
+ internal::construct_at<Base>(this, m_result);
374
+ generic_product_impl<typename Rhs::PlainObject, Rhs, SparseShape, SparseShape, ProductTag>::evalTo(m_result, m_lhs,
375
+ xpr.rhs());
392
376
  }
393
-
394
- protected:
377
+
378
+ protected:
395
379
  typename Rhs::PlainObject m_lhs;
396
380
  PlainObject m_result;
397
381
  };
398
382
 
399
- template<typename Lhs, typename RhsView, int ProductTag>
383
+ template <typename Lhs, typename RhsView, int ProductTag>
400
384
  struct product_evaluator<Product<Lhs, RhsView, DefaultProduct>, ProductTag, SparseShape, SparseSelfAdjointShape>
401
- : public evaluator<typename Product<Lhs, typename Lhs::PlainObject, DefaultProduct>::PlainObject>
402
- {
385
+ : public evaluator<typename Product<Lhs, typename Lhs::PlainObject, DefaultProduct>::PlainObject> {
403
386
  typedef Product<Lhs, RhsView, DefaultProduct> XprType;
404
387
  typedef typename XprType::PlainObject PlainObject;
405
388
  typedef evaluator<PlainObject> Base;
406
389
 
407
- product_evaluator(const XprType& xpr)
408
- : m_rhs(xpr.rhs()), m_result(xpr.rows(), xpr.cols())
409
- {
390
+ product_evaluator(const XprType& xpr) : m_rhs(xpr.rhs()), m_result(xpr.rows(), xpr.cols()) {
410
391
  ::new (static_cast<Base*>(this)) Base(m_result);
411
- generic_product_impl<Lhs, typename Lhs::PlainObject, SparseShape, SparseShape, ProductTag>::evalTo(m_result, xpr.lhs(), m_rhs);
392
+ generic_product_impl<Lhs, typename Lhs::PlainObject, SparseShape, SparseShape, ProductTag>::evalTo(
393
+ m_result, xpr.lhs(), m_rhs);
412
394
  }
413
-
414
- protected:
395
+
396
+ protected:
415
397
  typename Lhs::PlainObject m_rhs;
416
398
  PlainObject m_result;
417
399
  };
418
400
 
419
- } // namespace internal
401
+ } // namespace internal
420
402
 
421
403
  /***************************************************************************
422
- * Implementation of symmetric copies and permutations
423
- ***************************************************************************/
404
+ * Implementation of symmetric copies and permutations
405
+ ***************************************************************************/
424
406
  namespace internal {
425
407
 
426
- template<int Mode,typename MatrixType,int DestOrder>
427
- void permute_symm_to_fullsymm(const MatrixType& mat, SparseMatrix<typename MatrixType::Scalar,DestOrder,typename MatrixType::StorageIndex>& _dest, const typename MatrixType::StorageIndex* perm)
428
- {
408
+ template <int Mode, bool NonHermitian, typename MatrixType, int DestOrder>
409
+ void permute_symm_to_fullsymm(
410
+ const MatrixType& mat,
411
+ SparseMatrix<typename MatrixType::Scalar, DestOrder, typename MatrixType::StorageIndex>& _dest,
412
+ const typename MatrixType::StorageIndex* perm) {
429
413
  typedef typename MatrixType::StorageIndex StorageIndex;
430
414
  typedef typename MatrixType::Scalar Scalar;
431
- typedef SparseMatrix<Scalar,DestOrder,StorageIndex> Dest;
432
- typedef Matrix<StorageIndex,Dynamic,1> VectorI;
415
+ typedef SparseMatrix<Scalar, DestOrder, StorageIndex> Dest;
416
+ typedef Matrix<StorageIndex, Dynamic, 1> VectorI;
433
417
  typedef evaluator<MatrixType> MatEval;
434
418
  typedef typename evaluator<MatrixType>::InnerIterator MatIterator;
435
-
419
+
436
420
  MatEval matEval(mat);
437
421
  Dest& dest(_dest.derived());
438
- enum {
439
- StorageOrderMatch = int(Dest::IsRowMajor) == int(MatrixType::IsRowMajor)
440
- };
441
-
422
+ enum { StorageOrderMatch = int(Dest::IsRowMajor) == int(MatrixType::IsRowMajor) };
423
+
442
424
  Index size = mat.rows();
443
425
  VectorI count;
444
426
  count.resize(size);
445
427
  count.setZero();
446
- dest.resize(size,size);
447
- for(Index j = 0; j<size; ++j)
448
- {
428
+ dest.resize(size, size);
429
+ for (Index j = 0; j < size; ++j) {
449
430
  Index jp = perm ? perm[j] : j;
450
- for(MatIterator it(matEval,j); it; ++it)
451
- {
431
+ for (MatIterator it(matEval, j); it; ++it) {
452
432
  Index i = it.index();
453
433
  Index r = it.row();
454
434
  Index c = it.col();
455
435
  Index ip = perm ? perm[i] : i;
456
- if(Mode==int(Upper|Lower))
436
+ if (Mode == int(Upper | Lower))
457
437
  count[StorageOrderMatch ? jp : ip]++;
458
- else if(r==c)
438
+ else if (r == c)
459
439
  count[ip]++;
460
- else if(( Mode==Lower && r>c) || ( Mode==Upper && r<c))
461
- {
440
+ else if ((Mode == Lower && r > c) || (Mode == Upper && r < c)) {
462
441
  count[ip]++;
463
442
  count[jp]++;
464
443
  }
465
444
  }
466
445
  }
467
446
  Index nnz = count.sum();
468
-
447
+
469
448
  // reserve space
470
449
  dest.resizeNonZeros(nnz);
471
450
  dest.outerIndexPtr()[0] = 0;
472
- for(Index j=0; j<size; ++j)
473
- dest.outerIndexPtr()[j+1] = dest.outerIndexPtr()[j] + count[j];
474
- for(Index j=0; j<size; ++j)
475
- count[j] = dest.outerIndexPtr()[j];
476
-
451
+ for (Index j = 0; j < size; ++j) dest.outerIndexPtr()[j + 1] = dest.outerIndexPtr()[j] + count[j];
452
+ for (Index j = 0; j < size; ++j) count[j] = dest.outerIndexPtr()[j];
453
+
477
454
  // copy data
478
- for(StorageIndex j = 0; j<size; ++j)
479
- {
480
- for(MatIterator it(matEval,j); it; ++it)
481
- {
455
+ for (StorageIndex j = 0; j < size; ++j) {
456
+ for (MatIterator it(matEval, j); it; ++it) {
482
457
  StorageIndex i = internal::convert_index<StorageIndex>(it.index());
483
458
  Index r = it.row();
484
459
  Index c = it.col();
485
-
460
+
486
461
  StorageIndex jp = perm ? perm[j] : j;
487
462
  StorageIndex ip = perm ? perm[i] : i;
488
-
489
- if(Mode==int(Upper|Lower))
490
- {
463
+
464
+ if (Mode == int(Upper | Lower)) {
491
465
  Index k = count[StorageOrderMatch ? jp : ip]++;
492
466
  dest.innerIndexPtr()[k] = StorageOrderMatch ? ip : jp;
493
467
  dest.valuePtr()[k] = it.value();
494
- }
495
- else if(r==c)
496
- {
468
+ } else if (r == c) {
497
469
  Index k = count[ip]++;
498
470
  dest.innerIndexPtr()[k] = ip;
499
471
  dest.valuePtr()[k] = it.value();
500
- }
501
- else if(( (Mode&Lower)==Lower && r>c) || ( (Mode&Upper)==Upper && r<c))
502
- {
503
- if(!StorageOrderMatch)
504
- std::swap(ip,jp);
472
+ } else if (((Mode & Lower) == Lower && r > c) || ((Mode & Upper) == Upper && r < c)) {
473
+ if (!StorageOrderMatch) std::swap(ip, jp);
505
474
  Index k = count[jp]++;
506
475
  dest.innerIndexPtr()[k] = ip;
507
476
  dest.valuePtr()[k] = it.value();
508
477
  k = count[ip]++;
509
478
  dest.innerIndexPtr()[k] = jp;
510
- dest.valuePtr()[k] = numext::conj(it.value());
479
+ dest.valuePtr()[k] = (NonHermitian ? it.value() : numext::conj(it.value()));
511
480
  }
512
481
  }
513
482
  }
514
483
  }
515
484
 
516
- template<int _SrcMode,int _DstMode,typename MatrixType,int DstOrder>
517
- void permute_symm_to_symm(const MatrixType& mat, SparseMatrix<typename MatrixType::Scalar,DstOrder,typename MatrixType::StorageIndex>& _dest, const typename MatrixType::StorageIndex* perm)
518
- {
485
+ template <int SrcMode_, int DstMode_, bool NonHermitian, typename MatrixType, int DstOrder>
486
+ void permute_symm_to_symm(const MatrixType& mat,
487
+ SparseMatrix<typename MatrixType::Scalar, DstOrder, typename MatrixType::StorageIndex>& _dest,
488
+ const typename MatrixType::StorageIndex* perm) {
519
489
  typedef typename MatrixType::StorageIndex StorageIndex;
520
490
  typedef typename MatrixType::Scalar Scalar;
521
- SparseMatrix<Scalar,DstOrder,StorageIndex>& dest(_dest.derived());
522
- typedef Matrix<StorageIndex,Dynamic,1> VectorI;
491
+ SparseMatrix<Scalar, DstOrder, StorageIndex>& dest(_dest.derived());
492
+ typedef Matrix<StorageIndex, Dynamic, 1> VectorI;
523
493
  typedef evaluator<MatrixType> MatEval;
524
494
  typedef typename evaluator<MatrixType>::InnerIterator MatIterator;
525
495
 
526
496
  enum {
527
497
  SrcOrder = MatrixType::IsRowMajor ? RowMajor : ColMajor,
528
498
  StorageOrderMatch = int(SrcOrder) == int(DstOrder),
529
- DstMode = DstOrder==RowMajor ? (_DstMode==Upper ? Lower : Upper) : _DstMode,
530
- SrcMode = SrcOrder==RowMajor ? (_SrcMode==Upper ? Lower : Upper) : _SrcMode
499
+ DstMode = DstOrder == RowMajor ? (DstMode_ == Upper ? Lower : Upper) : DstMode_,
500
+ SrcMode = SrcOrder == RowMajor ? (SrcMode_ == Upper ? Lower : Upper) : SrcMode_
531
501
  };
532
502
 
533
503
  MatEval matEval(mat);
534
-
504
+
535
505
  Index size = mat.rows();
536
506
  VectorI count(size);
537
507
  count.setZero();
538
- dest.resize(size,size);
539
- for(StorageIndex j = 0; j<size; ++j)
540
- {
508
+ dest.resize(size, size);
509
+ for (StorageIndex j = 0; j < size; ++j) {
541
510
  StorageIndex jp = perm ? perm[j] : j;
542
- for(MatIterator it(matEval,j); it; ++it)
543
- {
511
+ for (MatIterator it(matEval, j); it; ++it) {
544
512
  StorageIndex i = it.index();
545
- if((int(SrcMode)==int(Lower) && i<j) || (int(SrcMode)==int(Upper) && i>j))
546
- continue;
547
-
513
+ if ((int(SrcMode) == int(Lower) && i < j) || (int(SrcMode) == int(Upper) && i > j)) continue;
514
+
548
515
  StorageIndex ip = perm ? perm[i] : i;
549
- count[int(DstMode)==int(Lower) ? (std::min)(ip,jp) : (std::max)(ip,jp)]++;
516
+ count[int(DstMode) == int(Lower) ? (std::min)(ip, jp) : (std::max)(ip, jp)]++;
550
517
  }
551
518
  }
552
519
  dest.outerIndexPtr()[0] = 0;
553
- for(Index j=0; j<size; ++j)
554
- dest.outerIndexPtr()[j+1] = dest.outerIndexPtr()[j] + count[j];
520
+ for (Index j = 0; j < size; ++j) dest.outerIndexPtr()[j + 1] = dest.outerIndexPtr()[j] + count[j];
555
521
  dest.resizeNonZeros(dest.outerIndexPtr()[size]);
556
- for(Index j=0; j<size; ++j)
557
- count[j] = dest.outerIndexPtr()[j];
558
-
559
- for(StorageIndex j = 0; j<size; ++j)
560
- {
561
-
562
- for(MatIterator it(matEval,j); it; ++it)
563
- {
522
+ for (Index j = 0; j < size; ++j) count[j] = dest.outerIndexPtr()[j];
523
+
524
+ for (StorageIndex j = 0; j < size; ++j) {
525
+ for (MatIterator it(matEval, j); it; ++it) {
564
526
  StorageIndex i = it.index();
565
- if((int(SrcMode)==int(Lower) && i<j) || (int(SrcMode)==int(Upper) && i>j))
566
- continue;
567
-
527
+ if ((int(SrcMode) == int(Lower) && i < j) || (int(SrcMode) == int(Upper) && i > j)) continue;
528
+
568
529
  StorageIndex jp = perm ? perm[j] : j;
569
- StorageIndex ip = perm? perm[i] : i;
570
-
571
- Index k = count[int(DstMode)==int(Lower) ? (std::min)(ip,jp) : (std::max)(ip,jp)]++;
572
- dest.innerIndexPtr()[k] = int(DstMode)==int(Lower) ? (std::max)(ip,jp) : (std::min)(ip,jp);
573
-
574
- if(!StorageOrderMatch) std::swap(ip,jp);
575
- if( ((int(DstMode)==int(Lower) && ip<jp) || (int(DstMode)==int(Upper) && ip>jp)))
576
- dest.valuePtr()[k] = numext::conj(it.value());
530
+ StorageIndex ip = perm ? perm[i] : i;
531
+
532
+ Index k = count[int(DstMode) == int(Lower) ? (std::min)(ip, jp) : (std::max)(ip, jp)]++;
533
+ dest.innerIndexPtr()[k] = int(DstMode) == int(Lower) ? (std::max)(ip, jp) : (std::min)(ip, jp);
534
+
535
+ if (!StorageOrderMatch) std::swap(ip, jp);
536
+ if (((int(DstMode) == int(Lower) && ip < jp) || (int(DstMode) == int(Upper) && ip > jp)))
537
+ dest.valuePtr()[k] = (NonHermitian ? it.value() : numext::conj(it.value()));
577
538
  else
578
539
  dest.valuePtr()[k] = it.value();
579
540
  }
580
541
  }
581
542
  }
582
543
 
583
- }
544
+ } // namespace internal
584
545
 
585
546
  // TODO implement twists in a more evaluator friendly fashion
586
547
 
587
548
  namespace internal {
588
549
 
589
- template<typename MatrixType, int Mode>
590
- struct traits<SparseSymmetricPermutationProduct<MatrixType,Mode> > : traits<MatrixType> {
591
- };
550
+ template <typename MatrixType, int Mode>
551
+ struct traits<SparseSymmetricPermutationProduct<MatrixType, Mode> > : traits<MatrixType> {};
592
552
 
593
- }
553
+ } // namespace internal
554
+
555
+ template <typename MatrixType, int Mode>
556
+ class SparseSymmetricPermutationProduct : public EigenBase<SparseSymmetricPermutationProduct<MatrixType, Mode> > {
557
+ public:
558
+ typedef typename MatrixType::Scalar Scalar;
559
+ typedef typename MatrixType::StorageIndex StorageIndex;
560
+ enum {
561
+ RowsAtCompileTime = internal::traits<SparseSymmetricPermutationProduct>::RowsAtCompileTime,
562
+ ColsAtCompileTime = internal::traits<SparseSymmetricPermutationProduct>::ColsAtCompileTime
563
+ };
564
+
565
+ protected:
566
+ typedef PermutationMatrix<Dynamic, Dynamic, StorageIndex> Perm;
594
567
 
595
- template<typename MatrixType,int Mode>
596
- class SparseSymmetricPermutationProduct
597
- : public EigenBase<SparseSymmetricPermutationProduct<MatrixType,Mode> >
598
- {
599
- public:
600
- typedef typename MatrixType::Scalar Scalar;
601
- typedef typename MatrixType::StorageIndex StorageIndex;
602
- enum {
603
- RowsAtCompileTime = internal::traits<SparseSymmetricPermutationProduct>::RowsAtCompileTime,
604
- ColsAtCompileTime = internal::traits<SparseSymmetricPermutationProduct>::ColsAtCompileTime
605
- };
606
- protected:
607
- typedef PermutationMatrix<Dynamic,Dynamic,StorageIndex> Perm;
608
- public:
609
- typedef Matrix<StorageIndex,Dynamic,1> VectorI;
610
- typedef typename MatrixType::Nested MatrixTypeNested;
611
- typedef typename internal::remove_all<MatrixTypeNested>::type NestedExpression;
612
-
613
- SparseSymmetricPermutationProduct(const MatrixType& mat, const Perm& perm)
614
- : m_matrix(mat), m_perm(perm)
615
- {}
616
-
617
- inline Index rows() const { return m_matrix.rows(); }
618
- inline Index cols() const { return m_matrix.cols(); }
619
-
620
- const NestedExpression& matrix() const { return m_matrix; }
621
- const Perm& perm() const { return m_perm; }
622
-
623
- protected:
624
- MatrixTypeNested m_matrix;
625
- const Perm& m_perm;
568
+ public:
569
+ typedef Matrix<StorageIndex, Dynamic, 1> VectorI;
570
+ typedef typename MatrixType::Nested MatrixTypeNested;
571
+ typedef internal::remove_all_t<MatrixTypeNested> NestedExpression;
626
572
 
573
+ SparseSymmetricPermutationProduct(const MatrixType& mat, const Perm& perm) : m_matrix(mat), m_perm(perm) {}
574
+
575
+ inline Index rows() const { return m_matrix.rows(); }
576
+ inline Index cols() const { return m_matrix.cols(); }
577
+
578
+ const NestedExpression& matrix() const { return m_matrix; }
579
+ const Perm& perm() const { return m_perm; }
580
+
581
+ protected:
582
+ MatrixTypeNested m_matrix;
583
+ const Perm& m_perm;
627
584
  };
628
585
 
629
586
  namespace internal {
630
-
631
- template<typename DstXprType, typename MatrixType, int Mode, typename Scalar>
632
- struct Assignment<DstXprType, SparseSymmetricPermutationProduct<MatrixType,Mode>, internal::assign_op<Scalar,typename MatrixType::Scalar>, Sparse2Sparse>
633
- {
634
- typedef SparseSymmetricPermutationProduct<MatrixType,Mode> SrcXprType;
587
+
588
+ template <typename DstXprType, typename MatrixType, int Mode, typename Scalar>
589
+ struct Assignment<DstXprType, SparseSymmetricPermutationProduct<MatrixType, Mode>,
590
+ internal::assign_op<Scalar, typename MatrixType::Scalar>, Sparse2Sparse> {
591
+ typedef SparseSymmetricPermutationProduct<MatrixType, Mode> SrcXprType;
635
592
  typedef typename DstXprType::StorageIndex DstIndex;
636
- template<int Options>
637
- static void run(SparseMatrix<Scalar,Options,DstIndex> &dst, const SrcXprType &src, const internal::assign_op<Scalar,typename MatrixType::Scalar> &)
638
- {
593
+ template <int Options>
594
+ static void run(SparseMatrix<Scalar, Options, DstIndex>& dst, const SrcXprType& src,
595
+ const internal::assign_op<Scalar, typename MatrixType::Scalar>&) {
639
596
  // internal::permute_symm_to_fullsymm<Mode>(m_matrix,_dest,m_perm.indices().data());
640
- SparseMatrix<Scalar,(Options&RowMajor)==RowMajor ? ColMajor : RowMajor, DstIndex> tmp;
641
- internal::permute_symm_to_fullsymm<Mode>(src.matrix(),tmp,src.perm().indices().data());
597
+ SparseMatrix<Scalar, (Options & RowMajor) == RowMajor ? ColMajor : RowMajor, DstIndex> tmp;
598
+ internal::permute_symm_to_fullsymm<Mode, false>(src.matrix(), tmp, src.perm().indices().data());
642
599
  dst = tmp;
643
600
  }
644
-
645
- template<typename DestType,unsigned int DestMode>
646
- static void run(SparseSelfAdjointView<DestType,DestMode>& dst, const SrcXprType &src, const internal::assign_op<Scalar,typename MatrixType::Scalar> &)
647
- {
648
- internal::permute_symm_to_symm<Mode,DestMode>(src.matrix(),dst.matrix(),src.perm().indices().data());
601
+
602
+ template <typename DestType, unsigned int DestMode>
603
+ static void run(SparseSelfAdjointView<DestType, DestMode>& dst, const SrcXprType& src,
604
+ const internal::assign_op<Scalar, typename MatrixType::Scalar>&) {
605
+ internal::permute_symm_to_symm<Mode, DestMode, false>(src.matrix(), dst.matrix(), src.perm().indices().data());
649
606
  }
650
607
  };
651
608
 
652
- } // end namespace internal
609
+ } // end namespace internal
653
610
 
654
- } // end namespace Eigen
611
+ } // end namespace Eigen
655
612
 
656
- #endif // EIGEN_SPARSE_SELFADJOINTVIEW_H
613
+ #endif // EIGEN_SPARSE_SELFADJOINTVIEW_H