@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,566 +10,497 @@
10
10
  #ifndef EIGEN_SPARSE_BLOCK_H
11
11
  #define EIGEN_SPARSE_BLOCK_H
12
12
 
13
+ // IWYU pragma: private
14
+ #include "./InternalHeaderCheck.h"
15
+
13
16
  namespace Eigen {
14
17
 
15
18
  // Subset of columns or rows
16
- template<typename XprType, int BlockRows, int BlockCols>
17
- class BlockImpl<XprType,BlockRows,BlockCols,true,Sparse>
18
- : public SparseMatrixBase<Block<XprType,BlockRows,BlockCols,true> >
19
- {
20
- typedef typename internal::remove_all<typename XprType::Nested>::type _MatrixTypeNested;
21
- typedef Block<XprType, BlockRows, BlockCols, true> BlockType;
22
- public:
23
- enum { IsRowMajor = internal::traits<BlockType>::IsRowMajor };
24
- protected:
25
- enum { OuterSize = IsRowMajor ? BlockRows : BlockCols };
26
- typedef SparseMatrixBase<BlockType> Base;
27
- using Base::convert_index;
28
- public:
29
- EIGEN_SPARSE_PUBLIC_INTERFACE(BlockType)
30
-
31
- inline BlockImpl(XprType& xpr, Index i)
32
- : m_matrix(xpr), m_outerStart(convert_index(i)), m_outerSize(OuterSize)
33
- {}
34
-
35
- inline BlockImpl(XprType& xpr, Index startRow, Index startCol, Index blockRows, Index blockCols)
36
- : m_matrix(xpr), m_outerStart(convert_index(IsRowMajor ? startRow : startCol)), m_outerSize(convert_index(IsRowMajor ? blockRows : blockCols))
37
- {}
38
-
39
- EIGEN_STRONG_INLINE Index rows() const { return IsRowMajor ? m_outerSize.value() : m_matrix.rows(); }
40
- EIGEN_STRONG_INLINE Index cols() const { return IsRowMajor ? m_matrix.cols() : m_outerSize.value(); }
41
-
42
- Index nonZeros() const
43
- {
44
- typedef internal::evaluator<XprType> EvaluatorType;
45
- EvaluatorType matEval(m_matrix);
46
- Index nnz = 0;
47
- Index end = m_outerStart + m_outerSize.value();
48
- for(Index j=m_outerStart; j<end; ++j)
49
- for(typename EvaluatorType::InnerIterator it(matEval, j); it; ++it)
50
- ++nnz;
51
- return nnz;
52
- }
19
+ template <typename XprType, int BlockRows, int BlockCols>
20
+ class BlockImpl<XprType, BlockRows, BlockCols, true, Sparse>
21
+ : public SparseMatrixBase<Block<XprType, BlockRows, BlockCols, true> > {
22
+ typedef internal::remove_all_t<typename XprType::Nested> MatrixTypeNested_;
23
+ typedef Block<XprType, BlockRows, BlockCols, true> BlockType;
53
24
 
54
- inline const Scalar coeff(Index row, Index col) const
55
- {
56
- return m_matrix.coeff(row + (IsRowMajor ? m_outerStart : 0), col + (IsRowMajor ? 0 : m_outerStart));
57
- }
25
+ public:
26
+ enum { IsRowMajor = internal::traits<BlockType>::IsRowMajor };
58
27
 
59
- inline const Scalar coeff(Index index) const
60
- {
61
- return m_matrix.coeff(IsRowMajor ? m_outerStart : index, IsRowMajor ? index : m_outerStart);
62
- }
28
+ protected:
29
+ enum { OuterSize = IsRowMajor ? BlockRows : BlockCols };
30
+ typedef SparseMatrixBase<BlockType> Base;
31
+ using Base::convert_index;
63
32
 
64
- inline const XprType& nestedExpression() const { return m_matrix; }
65
- inline XprType& nestedExpression() { return m_matrix; }
66
- Index startRow() const { return IsRowMajor ? m_outerStart : 0; }
67
- Index startCol() const { return IsRowMajor ? 0 : m_outerStart; }
68
- Index blockRows() const { return IsRowMajor ? m_outerSize.value() : m_matrix.rows(); }
69
- Index blockCols() const { return IsRowMajor ? m_matrix.cols() : m_outerSize.value(); }
70
-
71
- protected:
72
-
73
- typename internal::ref_selector<XprType>::non_const_type m_matrix;
74
- Index m_outerStart;
75
- const internal::variable_if_dynamic<Index, OuterSize> m_outerSize;
76
-
77
- protected:
78
- // Disable assignment with clear error message.
79
- // Note that simply removing operator= yields compilation errors with ICC+MSVC
80
- template<typename T>
81
- BlockImpl& operator=(const T&)
82
- {
83
- EIGEN_STATIC_ASSERT(sizeof(T)==0, THIS_SPARSE_BLOCK_SUBEXPRESSION_IS_READ_ONLY);
84
- return *this;
85
- }
86
- };
33
+ public:
34
+ EIGEN_SPARSE_PUBLIC_INTERFACE(BlockType)
35
+
36
+ inline BlockImpl(XprType& xpr, Index i) : m_matrix(xpr), m_outerStart(convert_index(i)), m_outerSize(OuterSize) {}
87
37
 
38
+ inline BlockImpl(XprType& xpr, Index startRow, Index startCol, Index blockRows, Index blockCols)
39
+ : m_matrix(xpr),
40
+ m_outerStart(convert_index(IsRowMajor ? startRow : startCol)),
41
+ m_outerSize(convert_index(IsRowMajor ? blockRows : blockCols)) {}
42
+
43
+ EIGEN_STRONG_INLINE Index rows() const { return IsRowMajor ? m_outerSize.value() : m_matrix.rows(); }
44
+ EIGEN_STRONG_INLINE Index cols() const { return IsRowMajor ? m_matrix.cols() : m_outerSize.value(); }
45
+
46
+ Index nonZeros() const {
47
+ typedef internal::evaluator<XprType> EvaluatorType;
48
+ EvaluatorType matEval(m_matrix);
49
+ Index nnz = 0;
50
+ Index end = m_outerStart + m_outerSize.value();
51
+ for (Index j = m_outerStart; j < end; ++j)
52
+ for (typename EvaluatorType::InnerIterator it(matEval, j); it; ++it) ++nnz;
53
+ return nnz;
54
+ }
55
+
56
+ inline const Scalar coeff(Index row, Index col) const {
57
+ return m_matrix.coeff(row + (IsRowMajor ? m_outerStart : 0), col + (IsRowMajor ? 0 : m_outerStart));
58
+ }
59
+
60
+ inline const Scalar coeff(Index index) const {
61
+ return m_matrix.coeff(IsRowMajor ? m_outerStart : index, IsRowMajor ? index : m_outerStart);
62
+ }
63
+
64
+ inline const XprType& nestedExpression() const { return m_matrix; }
65
+ inline XprType& nestedExpression() { return m_matrix; }
66
+ Index startRow() const { return IsRowMajor ? m_outerStart : 0; }
67
+ Index startCol() const { return IsRowMajor ? 0 : m_outerStart; }
68
+ Index blockRows() const { return IsRowMajor ? m_outerSize.value() : m_matrix.rows(); }
69
+ Index blockCols() const { return IsRowMajor ? m_matrix.cols() : m_outerSize.value(); }
70
+
71
+ protected:
72
+ typename internal::ref_selector<XprType>::non_const_type m_matrix;
73
+ Index m_outerStart;
74
+ const internal::variable_if_dynamic<Index, OuterSize> m_outerSize;
75
+
76
+ protected:
77
+ // Disable assignment with clear error message.
78
+ // Note that simply removing operator= yields compilation errors with ICC+MSVC
79
+ template <typename T>
80
+ BlockImpl& operator=(const T&) {
81
+ EIGEN_STATIC_ASSERT(sizeof(T) == 0, THIS_SPARSE_BLOCK_SUBEXPRESSION_IS_READ_ONLY);
82
+ return *this;
83
+ }
84
+ };
88
85
 
89
86
  /***************************************************************************
90
- * specialization for SparseMatrix
91
- ***************************************************************************/
87
+ * specialization for SparseMatrix
88
+ ***************************************************************************/
92
89
 
93
90
  namespace internal {
94
91
 
95
- template<typename SparseMatrixType, int BlockRows, int BlockCols>
96
- class sparse_matrix_block_impl
97
- : public SparseCompressedBase<Block<SparseMatrixType,BlockRows,BlockCols,true> >
98
- {
99
- typedef typename internal::remove_all<typename SparseMatrixType::Nested>::type _MatrixTypeNested;
100
- typedef Block<SparseMatrixType, BlockRows, BlockCols, true> BlockType;
101
- typedef SparseCompressedBase<Block<SparseMatrixType,BlockRows,BlockCols,true> > Base;
102
- using Base::convert_index;
103
- public:
104
- enum { IsRowMajor = internal::traits<BlockType>::IsRowMajor };
105
- EIGEN_SPARSE_PUBLIC_INTERFACE(BlockType)
106
- protected:
107
- typedef typename Base::IndexVector IndexVector;
108
- enum { OuterSize = IsRowMajor ? BlockRows : BlockCols };
109
- public:
110
-
111
- inline sparse_matrix_block_impl(SparseMatrixType& xpr, Index i)
112
- : m_matrix(xpr), m_outerStart(convert_index(i)), m_outerSize(OuterSize)
113
- {}
114
-
115
- inline sparse_matrix_block_impl(SparseMatrixType& xpr, Index startRow, Index startCol, Index blockRows, Index blockCols)
116
- : m_matrix(xpr), m_outerStart(convert_index(IsRowMajor ? startRow : startCol)), m_outerSize(convert_index(IsRowMajor ? blockRows : blockCols))
117
- {}
118
-
119
- template<typename OtherDerived>
120
- inline BlockType& operator=(const SparseMatrixBase<OtherDerived>& other)
121
- {
122
- typedef typename internal::remove_all<typename SparseMatrixType::Nested>::type _NestedMatrixType;
123
- _NestedMatrixType& matrix = m_matrix;
124
- // This assignment is slow if this vector set is not empty
125
- // and/or it is not at the end of the nonzeros of the underlying matrix.
126
-
127
- // 1 - eval to a temporary to avoid transposition and/or aliasing issues
128
- Ref<const SparseMatrix<Scalar, IsRowMajor ? RowMajor : ColMajor, StorageIndex> > tmp(other.derived());
129
- eigen_internal_assert(tmp.outerSize()==m_outerSize.value());
130
-
131
- // 2 - let's check whether there is enough allocated memory
132
- Index nnz = tmp.nonZeros();
133
- Index start = m_outerStart==0 ? 0 : m_matrix.outerIndexPtr()[m_outerStart]; // starting position of the current block
134
- Index end = m_matrix.outerIndexPtr()[m_outerStart+m_outerSize.value()]; // ending position of the current block
135
- Index block_size = end - start; // available room in the current block
136
- Index tail_size = m_matrix.outerIndexPtr()[m_matrix.outerSize()] - end;
137
-
138
- Index free_size = m_matrix.isCompressed()
139
- ? Index(matrix.data().allocatedSize()) + block_size
140
- : block_size;
141
-
142
- Index tmp_start = tmp.outerIndexPtr()[0];
143
-
144
- bool update_trailing_pointers = false;
145
- if(nnz>free_size)
146
- {
147
- // realloc manually to reduce copies
148
- typename SparseMatrixType::Storage newdata(m_matrix.data().allocatedSize() - block_size + nnz);
149
-
150
- internal::smart_copy(m_matrix.valuePtr(), m_matrix.valuePtr() + start, newdata.valuePtr());
151
- internal::smart_copy(m_matrix.innerIndexPtr(), m_matrix.innerIndexPtr() + start, newdata.indexPtr());
152
-
153
- internal::smart_copy(tmp.valuePtr() + tmp_start, tmp.valuePtr() + tmp_start + nnz, newdata.valuePtr() + start);
154
- internal::smart_copy(tmp.innerIndexPtr() + tmp_start, tmp.innerIndexPtr() + tmp_start + nnz, newdata.indexPtr() + start);
155
-
156
- internal::smart_copy(matrix.valuePtr()+end, matrix.valuePtr()+end + tail_size, newdata.valuePtr()+start+nnz);
157
- internal::smart_copy(matrix.innerIndexPtr()+end, matrix.innerIndexPtr()+end + tail_size, newdata.indexPtr()+start+nnz);
158
-
159
- newdata.resize(m_matrix.outerIndexPtr()[m_matrix.outerSize()] - block_size + nnz);
160
-
161
- matrix.data().swap(newdata);
92
+ template <typename SparseMatrixType, int BlockRows, int BlockCols>
93
+ class sparse_matrix_block_impl : public SparseCompressedBase<Block<SparseMatrixType, BlockRows, BlockCols, true> > {
94
+ typedef internal::remove_all_t<typename SparseMatrixType::Nested> MatrixTypeNested_;
95
+ typedef Block<SparseMatrixType, BlockRows, BlockCols, true> BlockType;
96
+ typedef SparseCompressedBase<Block<SparseMatrixType, BlockRows, BlockCols, true> > Base;
97
+ using Base::convert_index;
98
+
99
+ public:
100
+ enum { IsRowMajor = internal::traits<BlockType>::IsRowMajor };
101
+ EIGEN_SPARSE_PUBLIC_INTERFACE(BlockType)
102
+ protected:
103
+ typedef typename Base::IndexVector IndexVector;
104
+ enum { OuterSize = IsRowMajor ? BlockRows : BlockCols };
105
+
106
+ public:
107
+ inline sparse_matrix_block_impl(SparseMatrixType& xpr, Index i)
108
+ : m_matrix(xpr), m_outerStart(convert_index(i)), m_outerSize(OuterSize) {}
109
+
110
+ inline sparse_matrix_block_impl(SparseMatrixType& xpr, Index startRow, Index startCol, Index blockRows,
111
+ Index blockCols)
112
+ : m_matrix(xpr),
113
+ m_outerStart(convert_index(IsRowMajor ? startRow : startCol)),
114
+ m_outerSize(convert_index(IsRowMajor ? blockRows : blockCols)) {}
162
115
 
163
- update_trailing_pointers = true;
164
- }
165
- else
166
- {
167
- if(m_matrix.isCompressed())
168
- {
169
- // no need to realloc, simply copy the tail at its respective position and insert tmp
170
- matrix.data().resize(start + nnz + tail_size);
116
+ template <typename OtherDerived>
117
+ inline BlockType& operator=(const SparseMatrixBase<OtherDerived>& other) {
118
+ typedef internal::remove_all_t<typename SparseMatrixType::Nested> NestedMatrixType_;
119
+ NestedMatrixType_& matrix = m_matrix;
120
+ // This assignment is slow if this vector set is not empty
121
+ // and/or it is not at the end of the nonzeros of the underlying matrix.
171
122
 
172
- internal::smart_memmove(matrix.valuePtr()+end, matrix.valuePtr() + end+tail_size, matrix.valuePtr() + start+nnz);
173
- internal::smart_memmove(matrix.innerIndexPtr()+end, matrix.innerIndexPtr() + end+tail_size, matrix.innerIndexPtr() + start+nnz);
123
+ // 1 - eval to a temporary to avoid transposition and/or aliasing issues
124
+ Ref<const SparseMatrix<Scalar, IsRowMajor ? RowMajor : ColMajor, StorageIndex> > tmp(other.derived());
125
+ eigen_internal_assert(tmp.outerSize() == m_outerSize.value());
174
126
 
175
- update_trailing_pointers = true;
176
- }
127
+ // 2 - let's check whether there is enough allocated memory
128
+ Index nnz = tmp.nonZeros();
129
+ Index start =
130
+ m_outerStart == 0 ? 0 : m_matrix.outerIndexPtr()[m_outerStart]; // starting position of the current block
131
+ Index end = m_matrix.outerIndexPtr()[m_outerStart + m_outerSize.value()]; // ending position of the current block
132
+ Index block_size = end - start; // available room in the current block
133
+ Index tail_size = m_matrix.outerIndexPtr()[m_matrix.outerSize()] - end;
177
134
 
178
- internal::smart_copy(tmp.valuePtr() + tmp_start, tmp.valuePtr() + tmp_start + nnz, matrix.valuePtr() + start);
179
- internal::smart_copy(tmp.innerIndexPtr() + tmp_start, tmp.innerIndexPtr() + tmp_start + nnz, matrix.innerIndexPtr() + start);
180
- }
135
+ Index free_size = m_matrix.isCompressed() ? Index(matrix.data().allocatedSize()) + block_size : block_size;
181
136
 
182
- // update outer index pointers and innerNonZeros
183
- if(IsVectorAtCompileTime)
184
- {
185
- if(!m_matrix.isCompressed())
186
- matrix.innerNonZeroPtr()[m_outerStart] = StorageIndex(nnz);
187
- matrix.outerIndexPtr()[m_outerStart] = StorageIndex(start);
188
- }
189
- else
190
- {
191
- StorageIndex p = StorageIndex(start);
192
- for(Index k=0; k<m_outerSize.value(); ++k)
193
- {
194
- StorageIndex nnz_k = internal::convert_index<StorageIndex>(tmp.innerVector(k).nonZeros());
195
- if(!m_matrix.isCompressed())
196
- matrix.innerNonZeroPtr()[m_outerStart+k] = nnz_k;
197
- matrix.outerIndexPtr()[m_outerStart+k] = p;
198
- p += nnz_k;
199
- }
200
- }
137
+ Index tmp_start = tmp.outerIndexPtr()[0];
201
138
 
202
- if(update_trailing_pointers)
203
- {
204
- StorageIndex offset = internal::convert_index<StorageIndex>(nnz - block_size);
205
- for(Index k = m_outerStart + m_outerSize.value(); k<=matrix.outerSize(); ++k)
206
- {
207
- matrix.outerIndexPtr()[k] += offset;
208
- }
209
- }
139
+ bool update_trailing_pointers = false;
140
+ if (nnz > free_size) {
141
+ // realloc manually to reduce copies
142
+ typename SparseMatrixType::Storage newdata(m_matrix.data().allocatedSize() - block_size + nnz);
210
143
 
211
- return derived();
212
- }
144
+ internal::smart_copy(m_matrix.valuePtr(), m_matrix.valuePtr() + start, newdata.valuePtr());
145
+ internal::smart_copy(m_matrix.innerIndexPtr(), m_matrix.innerIndexPtr() + start, newdata.indexPtr());
213
146
 
214
- inline BlockType& operator=(const BlockType& other)
215
- {
216
- return operator=<BlockType>(other);
217
- }
147
+ internal::smart_copy(tmp.valuePtr() + tmp_start, tmp.valuePtr() + tmp_start + nnz, newdata.valuePtr() + start);
148
+ internal::smart_copy(tmp.innerIndexPtr() + tmp_start, tmp.innerIndexPtr() + tmp_start + nnz,
149
+ newdata.indexPtr() + start);
218
150
 
219
- inline const Scalar* valuePtr() const
220
- { return m_matrix.valuePtr(); }
221
- inline Scalar* valuePtr()
222
- { return m_matrix.valuePtr(); }
151
+ internal::smart_copy(matrix.valuePtr() + end, matrix.valuePtr() + end + tail_size,
152
+ newdata.valuePtr() + start + nnz);
153
+ internal::smart_copy(matrix.innerIndexPtr() + end, matrix.innerIndexPtr() + end + tail_size,
154
+ newdata.indexPtr() + start + nnz);
223
155
 
224
- inline const StorageIndex* innerIndexPtr() const
225
- { return m_matrix.innerIndexPtr(); }
226
- inline StorageIndex* innerIndexPtr()
227
- { return m_matrix.innerIndexPtr(); }
156
+ newdata.resize(m_matrix.outerIndexPtr()[m_matrix.outerSize()] - block_size + nnz);
228
157
 
229
- inline const StorageIndex* outerIndexPtr() const
230
- { return m_matrix.outerIndexPtr() + m_outerStart; }
231
- inline StorageIndex* outerIndexPtr()
232
- { return m_matrix.outerIndexPtr() + m_outerStart; }
158
+ matrix.data().swap(newdata);
233
159
 
234
- inline const StorageIndex* innerNonZeroPtr() const
235
- { return isCompressed() ? 0 : (m_matrix.innerNonZeroPtr()+m_outerStart); }
236
- inline StorageIndex* innerNonZeroPtr()
237
- { return isCompressed() ? 0 : (m_matrix.innerNonZeroPtr()+m_outerStart); }
160
+ update_trailing_pointers = true;
161
+ } else {
162
+ if (m_matrix.isCompressed() && nnz != block_size) {
163
+ // no need to realloc, simply copy the tail at its respective position and insert tmp
164
+ matrix.data().resize(start + nnz + tail_size);
238
165
 
239
- bool isCompressed() const { return m_matrix.innerNonZeroPtr()==0; }
166
+ internal::smart_memmove(matrix.valuePtr() + end, matrix.valuePtr() + end + tail_size,
167
+ matrix.valuePtr() + start + nnz);
168
+ internal::smart_memmove(matrix.innerIndexPtr() + end, matrix.innerIndexPtr() + end + tail_size,
169
+ matrix.innerIndexPtr() + start + nnz);
240
170
 
241
- inline Scalar& coeffRef(Index row, Index col)
242
- {
243
- return m_matrix.coeffRef(row + (IsRowMajor ? m_outerStart : 0), col + (IsRowMajor ? 0 : m_outerStart));
244
- }
171
+ update_trailing_pointers = true;
172
+ }
245
173
 
246
- inline const Scalar coeff(Index row, Index col) const
247
- {
248
- return m_matrix.coeff(row + (IsRowMajor ? m_outerStart : 0), col + (IsRowMajor ? 0 : m_outerStart));
174
+ internal::smart_copy(tmp.valuePtr() + tmp_start, tmp.valuePtr() + tmp_start + nnz, matrix.valuePtr() + start);
175
+ internal::smart_copy(tmp.innerIndexPtr() + tmp_start, tmp.innerIndexPtr() + tmp_start + nnz,
176
+ matrix.innerIndexPtr() + start);
249
177
  }
250
178
 
251
- inline const Scalar coeff(Index index) const
252
- {
253
- return m_matrix.coeff(IsRowMajor ? m_outerStart : index, IsRowMajor ? index : m_outerStart);
179
+ // update outer index pointers and innerNonZeros
180
+ if (IsVectorAtCompileTime) {
181
+ if (!m_matrix.isCompressed()) matrix.innerNonZeroPtr()[m_outerStart] = StorageIndex(nnz);
182
+ matrix.outerIndexPtr()[m_outerStart] = StorageIndex(start);
183
+ } else {
184
+ StorageIndex p = StorageIndex(start);
185
+ for (Index k = 0; k < m_outerSize.value(); ++k) {
186
+ StorageIndex nnz_k = internal::convert_index<StorageIndex>(tmp.innerVector(k).nonZeros());
187
+ if (!m_matrix.isCompressed()) matrix.innerNonZeroPtr()[m_outerStart + k] = nnz_k;
188
+ matrix.outerIndexPtr()[m_outerStart + k] = p;
189
+ p += nnz_k;
190
+ }
254
191
  }
255
192
 
256
- const Scalar& lastCoeff() const
257
- {
258
- EIGEN_STATIC_ASSERT_VECTOR_ONLY(sparse_matrix_block_impl);
259
- eigen_assert(Base::nonZeros()>0);
260
- if(m_matrix.isCompressed())
261
- return m_matrix.valuePtr()[m_matrix.outerIndexPtr()[m_outerStart+1]-1];
262
- else
263
- return m_matrix.valuePtr()[m_matrix.outerIndexPtr()[m_outerStart]+m_matrix.innerNonZeroPtr()[m_outerStart]-1];
193
+ if (update_trailing_pointers) {
194
+ StorageIndex offset = internal::convert_index<StorageIndex>(nnz - block_size);
195
+ for (Index k = m_outerStart + m_outerSize.value(); k <= matrix.outerSize(); ++k) {
196
+ matrix.outerIndexPtr()[k] += offset;
197
+ }
264
198
  }
265
199
 
266
- EIGEN_STRONG_INLINE Index rows() const { return IsRowMajor ? m_outerSize.value() : m_matrix.rows(); }
267
- EIGEN_STRONG_INLINE Index cols() const { return IsRowMajor ? m_matrix.cols() : m_outerSize.value(); }
200
+ return derived();
201
+ }
202
+
203
+ inline BlockType& operator=(const BlockType& other) { return operator= <BlockType>(other); }
268
204
 
269
- inline const SparseMatrixType& nestedExpression() const { return m_matrix; }
270
- inline SparseMatrixType& nestedExpression() { return m_matrix; }
271
- Index startRow() const { return IsRowMajor ? m_outerStart : 0; }
272
- Index startCol() const { return IsRowMajor ? 0 : m_outerStart; }
273
- Index blockRows() const { return IsRowMajor ? m_outerSize.value() : m_matrix.rows(); }
274
- Index blockCols() const { return IsRowMajor ? m_matrix.cols() : m_outerSize.value(); }
205
+ inline const Scalar* valuePtr() const { return m_matrix.valuePtr(); }
206
+ inline Scalar* valuePtr() { return m_matrix.valuePtr(); }
275
207
 
276
- protected:
208
+ inline const StorageIndex* innerIndexPtr() const { return m_matrix.innerIndexPtr(); }
209
+ inline StorageIndex* innerIndexPtr() { return m_matrix.innerIndexPtr(); }
277
210
 
278
- typename internal::ref_selector<SparseMatrixType>::non_const_type m_matrix;
279
- Index m_outerStart;
280
- const internal::variable_if_dynamic<Index, OuterSize> m_outerSize;
211
+ inline const StorageIndex* outerIndexPtr() const { return m_matrix.outerIndexPtr() + m_outerStart; }
212
+ inline StorageIndex* outerIndexPtr() { return m_matrix.outerIndexPtr() + m_outerStart; }
281
213
 
214
+ inline const StorageIndex* innerNonZeroPtr() const {
215
+ return isCompressed() ? 0 : (m_matrix.innerNonZeroPtr() + m_outerStart);
216
+ }
217
+ inline StorageIndex* innerNonZeroPtr() { return isCompressed() ? 0 : (m_matrix.innerNonZeroPtr() + m_outerStart); }
218
+
219
+ bool isCompressed() const { return m_matrix.innerNonZeroPtr() == 0; }
220
+
221
+ inline Scalar& coeffRef(Index row, Index col) {
222
+ return m_matrix.coeffRef(row + (IsRowMajor ? m_outerStart : 0), col + (IsRowMajor ? 0 : m_outerStart));
223
+ }
224
+
225
+ inline const Scalar coeff(Index row, Index col) const {
226
+ return m_matrix.coeff(row + (IsRowMajor ? m_outerStart : 0), col + (IsRowMajor ? 0 : m_outerStart));
227
+ }
228
+
229
+ inline const Scalar coeff(Index index) const {
230
+ return m_matrix.coeff(IsRowMajor ? m_outerStart : index, IsRowMajor ? index : m_outerStart);
231
+ }
232
+
233
+ const Scalar& lastCoeff() const {
234
+ EIGEN_STATIC_ASSERT_VECTOR_ONLY(sparse_matrix_block_impl);
235
+ eigen_assert(Base::nonZeros() > 0);
236
+ if (m_matrix.isCompressed())
237
+ return m_matrix.valuePtr()[m_matrix.outerIndexPtr()[m_outerStart + 1] - 1];
238
+ else
239
+ return m_matrix.valuePtr()[m_matrix.outerIndexPtr()[m_outerStart] + m_matrix.innerNonZeroPtr()[m_outerStart] - 1];
240
+ }
241
+
242
+ EIGEN_STRONG_INLINE Index rows() const { return IsRowMajor ? m_outerSize.value() : m_matrix.rows(); }
243
+ EIGEN_STRONG_INLINE Index cols() const { return IsRowMajor ? m_matrix.cols() : m_outerSize.value(); }
244
+
245
+ inline const SparseMatrixType& nestedExpression() const { return m_matrix; }
246
+ inline SparseMatrixType& nestedExpression() { return m_matrix; }
247
+ Index startRow() const { return IsRowMajor ? m_outerStart : 0; }
248
+ Index startCol() const { return IsRowMajor ? 0 : m_outerStart; }
249
+ Index blockRows() const { return IsRowMajor ? m_outerSize.value() : m_matrix.rows(); }
250
+ Index blockCols() const { return IsRowMajor ? m_matrix.cols() : m_outerSize.value(); }
251
+
252
+ protected:
253
+ typename internal::ref_selector<SparseMatrixType>::non_const_type m_matrix;
254
+ Index m_outerStart;
255
+ const internal::variable_if_dynamic<Index, OuterSize> m_outerSize;
282
256
  };
283
257
 
284
- } // namespace internal
258
+ } // namespace internal
285
259
 
286
- template<typename _Scalar, int _Options, typename _StorageIndex, int BlockRows, int BlockCols>
287
- class BlockImpl<SparseMatrix<_Scalar, _Options, _StorageIndex>,BlockRows,BlockCols,true,Sparse>
288
- : public internal::sparse_matrix_block_impl<SparseMatrix<_Scalar, _Options, _StorageIndex>,BlockRows,BlockCols>
289
- {
290
- public:
291
- typedef _StorageIndex StorageIndex;
292
- typedef SparseMatrix<_Scalar, _Options, _StorageIndex> SparseMatrixType;
293
- typedef internal::sparse_matrix_block_impl<SparseMatrixType,BlockRows,BlockCols> Base;
294
- inline BlockImpl(SparseMatrixType& xpr, Index i)
295
- : Base(xpr, i)
296
- {}
260
+ template <typename Scalar_, int Options_, typename StorageIndex_, int BlockRows, int BlockCols>
261
+ class BlockImpl<SparseMatrix<Scalar_, Options_, StorageIndex_>, BlockRows, BlockCols, true, Sparse>
262
+ : public internal::sparse_matrix_block_impl<SparseMatrix<Scalar_, Options_, StorageIndex_>, BlockRows, BlockCols> {
263
+ public:
264
+ typedef StorageIndex_ StorageIndex;
265
+ typedef SparseMatrix<Scalar_, Options_, StorageIndex_> SparseMatrixType;
266
+ typedef internal::sparse_matrix_block_impl<SparseMatrixType, BlockRows, BlockCols> Base;
267
+ inline BlockImpl(SparseMatrixType& xpr, Index i) : Base(xpr, i) {}
297
268
 
298
269
  inline BlockImpl(SparseMatrixType& xpr, Index startRow, Index startCol, Index blockRows, Index blockCols)
299
- : Base(xpr, startRow, startCol, blockRows, blockCols)
300
- {}
270
+ : Base(xpr, startRow, startCol, blockRows, blockCols) {}
301
271
 
302
272
  using Base::operator=;
303
273
  };
304
274
 
305
- template<typename _Scalar, int _Options, typename _StorageIndex, int BlockRows, int BlockCols>
306
- class BlockImpl<const SparseMatrix<_Scalar, _Options, _StorageIndex>,BlockRows,BlockCols,true,Sparse>
307
- : public internal::sparse_matrix_block_impl<const SparseMatrix<_Scalar, _Options, _StorageIndex>,BlockRows,BlockCols>
308
- {
309
- public:
310
- typedef _StorageIndex StorageIndex;
311
- typedef const SparseMatrix<_Scalar, _Options, _StorageIndex> SparseMatrixType;
312
- typedef internal::sparse_matrix_block_impl<SparseMatrixType,BlockRows,BlockCols> Base;
313
- inline BlockImpl(SparseMatrixType& xpr, Index i)
314
- : Base(xpr, i)
315
- {}
275
+ template <typename Scalar_, int Options_, typename StorageIndex_, int BlockRows, int BlockCols>
276
+ class BlockImpl<const SparseMatrix<Scalar_, Options_, StorageIndex_>, BlockRows, BlockCols, true, Sparse>
277
+ : public internal::sparse_matrix_block_impl<const SparseMatrix<Scalar_, Options_, StorageIndex_>, BlockRows,
278
+ BlockCols> {
279
+ public:
280
+ typedef StorageIndex_ StorageIndex;
281
+ typedef const SparseMatrix<Scalar_, Options_, StorageIndex_> SparseMatrixType;
282
+ typedef internal::sparse_matrix_block_impl<SparseMatrixType, BlockRows, BlockCols> Base;
283
+ inline BlockImpl(SparseMatrixType& xpr, Index i) : Base(xpr, i) {}
316
284
 
317
285
  inline BlockImpl(SparseMatrixType& xpr, Index startRow, Index startCol, Index blockRows, Index blockCols)
318
- : Base(xpr, startRow, startCol, blockRows, blockCols)
319
- {}
286
+ : Base(xpr, startRow, startCol, blockRows, blockCols) {}
320
287
 
321
288
  using Base::operator=;
322
- private:
323
- template<typename Derived> BlockImpl(const SparseMatrixBase<Derived>& xpr, Index i);
324
- template<typename Derived> BlockImpl(const SparseMatrixBase<Derived>& xpr);
289
+
290
+ private:
291
+ template <typename Derived>
292
+ BlockImpl(const SparseMatrixBase<Derived>& xpr, Index i);
293
+ template <typename Derived>
294
+ BlockImpl(const SparseMatrixBase<Derived>& xpr);
325
295
  };
326
296
 
327
297
  //----------
328
298
 
329
- /** \returns the \a outer -th column (resp. row) of the matrix \c *this if \c *this
330
- * is col-major (resp. row-major).
331
- */
332
- template<typename Derived>
333
- typename SparseMatrixBase<Derived>::InnerVectorReturnType SparseMatrixBase<Derived>::innerVector(Index outer)
334
- { return InnerVectorReturnType(derived(), outer); }
335
-
336
- /** \returns the \a outer -th column (resp. row) of the matrix \c *this if \c *this
337
- * is col-major (resp. row-major). Read-only.
338
- */
339
- template<typename Derived>
340
- const typename SparseMatrixBase<Derived>::ConstInnerVectorReturnType SparseMatrixBase<Derived>::innerVector(Index outer) const
341
- { return ConstInnerVectorReturnType(derived(), outer); }
342
-
343
- /** \returns the \a outer -th column (resp. row) of the matrix \c *this if \c *this
344
- * is col-major (resp. row-major).
345
- */
346
- template<typename Derived>
347
- typename SparseMatrixBase<Derived>::InnerVectorsReturnType
348
- SparseMatrixBase<Derived>::innerVectors(Index outerStart, Index outerSize)
349
- {
350
- return Block<Derived,Dynamic,Dynamic,true>(derived(),
351
- IsRowMajor ? outerStart : 0, IsRowMajor ? 0 : outerStart,
352
- IsRowMajor ? outerSize : rows(), IsRowMajor ? cols() : outerSize);
353
-
354
- }
355
-
356
- /** \returns the \a outer -th column (resp. row) of the matrix \c *this if \c *this
357
- * is col-major (resp. row-major). Read-only.
358
- */
359
- template<typename Derived>
360
- const typename SparseMatrixBase<Derived>::ConstInnerVectorsReturnType
361
- SparseMatrixBase<Derived>::innerVectors(Index outerStart, Index outerSize) const
362
- {
363
- return Block<const Derived,Dynamic,Dynamic,true>(derived(),
364
- IsRowMajor ? outerStart : 0, IsRowMajor ? 0 : outerStart,
365
- IsRowMajor ? outerSize : rows(), IsRowMajor ? cols() : outerSize);
366
-
367
- }
368
-
369
299
  /** Generic implementation of sparse Block expression.
370
- * Real-only.
371
- */
372
- template<typename XprType, int BlockRows, int BlockCols, bool InnerPanel>
373
- class BlockImpl<XprType,BlockRows,BlockCols,InnerPanel,Sparse>
374
- : public SparseMatrixBase<Block<XprType,BlockRows,BlockCols,InnerPanel> >, internal::no_assignment_operator
375
- {
376
- typedef Block<XprType, BlockRows, BlockCols, InnerPanel> BlockType;
377
- typedef SparseMatrixBase<BlockType> Base;
378
- using Base::convert_index;
379
- public:
380
- enum { IsRowMajor = internal::traits<BlockType>::IsRowMajor };
381
- EIGEN_SPARSE_PUBLIC_INTERFACE(BlockType)
382
-
383
- typedef typename internal::remove_all<typename XprType::Nested>::type _MatrixTypeNested;
384
-
385
- /** Column or Row constructor
386
- */
387
- inline BlockImpl(XprType& xpr, Index i)
300
+ * Real-only.
301
+ */
302
+ template <typename XprType, int BlockRows, int BlockCols, bool InnerPanel>
303
+ class BlockImpl<XprType, BlockRows, BlockCols, InnerPanel, Sparse>
304
+ : public SparseMatrixBase<Block<XprType, BlockRows, BlockCols, InnerPanel> >, internal::no_assignment_operator {
305
+ typedef Block<XprType, BlockRows, BlockCols, InnerPanel> BlockType;
306
+ typedef SparseMatrixBase<BlockType> Base;
307
+ using Base::convert_index;
308
+
309
+ public:
310
+ enum { IsRowMajor = internal::traits<BlockType>::IsRowMajor };
311
+ EIGEN_SPARSE_PUBLIC_INTERFACE(BlockType)
312
+
313
+ typedef internal::remove_all_t<typename XprType::Nested> MatrixTypeNested_;
314
+
315
+ /** Column or Row constructor
316
+ */
317
+ inline BlockImpl(XprType& xpr, Index i)
388
318
  : m_matrix(xpr),
389
- m_startRow( (BlockRows==1) && (BlockCols==XprType::ColsAtCompileTime) ? convert_index(i) : 0),
390
- m_startCol( (BlockRows==XprType::RowsAtCompileTime) && (BlockCols==1) ? convert_index(i) : 0),
391
- m_blockRows(BlockRows==1 ? 1 : xpr.rows()),
392
- m_blockCols(BlockCols==1 ? 1 : xpr.cols())
393
- {}
394
-
395
- /** Dynamic-size constructor
396
- */
397
- inline BlockImpl(XprType& xpr, Index startRow, Index startCol, Index blockRows, Index blockCols)
398
- : m_matrix(xpr), m_startRow(convert_index(startRow)), m_startCol(convert_index(startCol)), m_blockRows(convert_index(blockRows)), m_blockCols(convert_index(blockCols))
399
- {}
400
-
401
- inline Index rows() const { return m_blockRows.value(); }
402
- inline Index cols() const { return m_blockCols.value(); }
403
-
404
- inline Scalar& coeffRef(Index row, Index col)
405
- {
406
- return m_matrix.coeffRef(row + m_startRow.value(), col + m_startCol.value());
407
- }
319
+ m_startRow((BlockRows == 1) && (BlockCols == XprType::ColsAtCompileTime) ? convert_index(i) : 0),
320
+ m_startCol((BlockRows == XprType::RowsAtCompileTime) && (BlockCols == 1) ? convert_index(i) : 0),
321
+ m_blockRows(BlockRows == 1 ? 1 : xpr.rows()),
322
+ m_blockCols(BlockCols == 1 ? 1 : xpr.cols()) {}
323
+
324
+ /** Dynamic-size constructor
325
+ */
326
+ inline BlockImpl(XprType& xpr, Index startRow, Index startCol, Index blockRows, Index blockCols)
327
+ : m_matrix(xpr),
328
+ m_startRow(convert_index(startRow)),
329
+ m_startCol(convert_index(startCol)),
330
+ m_blockRows(convert_index(blockRows)),
331
+ m_blockCols(convert_index(blockCols)) {}
408
332
 
409
- inline const Scalar coeff(Index row, Index col) const
410
- {
411
- return m_matrix.coeff(row + m_startRow.value(), col + m_startCol.value());
412
- }
333
+ inline Index rows() const { return m_blockRows.value(); }
334
+ inline Index cols() const { return m_blockCols.value(); }
413
335
 
414
- inline Scalar& coeffRef(Index index)
415
- {
416
- return m_matrix.coeffRef(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),
417
- m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0));
418
- }
336
+ inline Scalar& coeffRef(Index row, Index col) {
337
+ return m_matrix.coeffRef(row + m_startRow.value(), col + m_startCol.value());
338
+ }
419
339
 
420
- inline const Scalar coeff(Index index) const
421
- {
422
- return m_matrix.coeff(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),
423
- m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0));
424
- }
340
+ inline const Scalar coeff(Index row, Index col) const {
341
+ return m_matrix.coeff(row + m_startRow.value(), col + m_startCol.value());
342
+ }
425
343
 
426
- inline const XprType& nestedExpression() const { return m_matrix; }
427
- inline XprType& nestedExpression() { return m_matrix; }
428
- Index startRow() const { return m_startRow.value(); }
429
- Index startCol() const { return m_startCol.value(); }
430
- Index blockRows() const { return m_blockRows.value(); }
431
- Index blockCols() const { return m_blockCols.value(); }
432
-
433
- protected:
434
- // friend class internal::GenericSparseBlockInnerIteratorImpl<XprType,BlockRows,BlockCols,InnerPanel>;
435
- friend struct internal::unary_evaluator<Block<XprType,BlockRows,BlockCols,InnerPanel>, internal::IteratorBased, Scalar >;
436
-
437
- Index nonZeros() const { return Dynamic; }
438
-
439
- typename internal::ref_selector<XprType>::non_const_type m_matrix;
440
- const internal::variable_if_dynamic<Index, XprType::RowsAtCompileTime == 1 ? 0 : Dynamic> m_startRow;
441
- const internal::variable_if_dynamic<Index, XprType::ColsAtCompileTime == 1 ? 0 : Dynamic> m_startCol;
442
- const internal::variable_if_dynamic<Index, RowsAtCompileTime> m_blockRows;
443
- const internal::variable_if_dynamic<Index, ColsAtCompileTime> m_blockCols;
444
-
445
- protected:
446
- // Disable assignment with clear error message.
447
- // Note that simply removing operator= yields compilation errors with ICC+MSVC
448
- template<typename T>
449
- BlockImpl& operator=(const T&)
450
- {
451
- EIGEN_STATIC_ASSERT(sizeof(T)==0, THIS_SPARSE_BLOCK_SUBEXPRESSION_IS_READ_ONLY);
452
- return *this;
453
- }
344
+ inline Scalar& coeffRef(Index index) {
345
+ return m_matrix.coeffRef(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),
346
+ m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0));
347
+ }
348
+
349
+ inline const Scalar coeff(Index index) const {
350
+ return m_matrix.coeff(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),
351
+ m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0));
352
+ }
454
353
 
354
+ inline const XprType& nestedExpression() const { return m_matrix; }
355
+ inline XprType& nestedExpression() { return m_matrix; }
356
+ Index startRow() const { return m_startRow.value(); }
357
+ Index startCol() const { return m_startCol.value(); }
358
+ Index blockRows() const { return m_blockRows.value(); }
359
+ Index blockCols() const { return m_blockCols.value(); }
360
+
361
+ protected:
362
+ // friend class internal::GenericSparseBlockInnerIteratorImpl<XprType,BlockRows,BlockCols,InnerPanel>;
363
+ friend struct internal::unary_evaluator<Block<XprType, BlockRows, BlockCols, InnerPanel>, internal::IteratorBased,
364
+ Scalar>;
365
+
366
+ Index nonZeros() const { return Dynamic; }
367
+
368
+ typename internal::ref_selector<XprType>::non_const_type m_matrix;
369
+ const internal::variable_if_dynamic<Index, XprType::RowsAtCompileTime == 1 ? 0 : Dynamic> m_startRow;
370
+ const internal::variable_if_dynamic<Index, XprType::ColsAtCompileTime == 1 ? 0 : Dynamic> m_startCol;
371
+ const internal::variable_if_dynamic<Index, RowsAtCompileTime> m_blockRows;
372
+ const internal::variable_if_dynamic<Index, ColsAtCompileTime> m_blockCols;
373
+
374
+ protected:
375
+ // Disable assignment with clear error message.
376
+ // Note that simply removing operator= yields compilation errors with ICC+MSVC
377
+ template <typename T>
378
+ BlockImpl& operator=(const T&) {
379
+ EIGEN_STATIC_ASSERT(sizeof(T) == 0, THIS_SPARSE_BLOCK_SUBEXPRESSION_IS_READ_ONLY);
380
+ return *this;
381
+ }
455
382
  };
456
383
 
457
384
  namespace internal {
458
385
 
459
- template<typename ArgType, int BlockRows, int BlockCols, bool InnerPanel>
460
- struct unary_evaluator<Block<ArgType,BlockRows,BlockCols,InnerPanel>, IteratorBased >
461
- : public evaluator_base<Block<ArgType,BlockRows,BlockCols,InnerPanel> >
462
- {
463
- class InnerVectorInnerIterator;
464
- class OuterVectorInnerIterator;
465
- public:
466
- typedef Block<ArgType,BlockRows,BlockCols,InnerPanel> XprType;
467
- typedef typename XprType::StorageIndex StorageIndex;
468
- typedef typename XprType::Scalar Scalar;
469
-
470
- enum {
471
- IsRowMajor = XprType::IsRowMajor,
472
-
473
- OuterVector = (BlockCols==1 && ArgType::IsRowMajor)
474
- | // FIXME | instead of || to please GCC 4.4.0 stupid warning "suggest parentheses around &&".
475
- // revert to || as soon as not needed anymore.
476
- (BlockRows==1 && !ArgType::IsRowMajor),
477
-
478
- CoeffReadCost = evaluator<ArgType>::CoeffReadCost,
479
- Flags = XprType::Flags
480
- };
481
-
482
- typedef typename internal::conditional<OuterVector,OuterVectorInnerIterator,InnerVectorInnerIterator>::type InnerIterator;
483
-
484
- explicit unary_evaluator(const XprType& op)
485
- : m_argImpl(op.nestedExpression()), m_block(op)
486
- {}
487
-
488
- inline Index nonZerosEstimate() const {
489
- Index nnz = m_block.nonZeros();
490
- if(nnz<0)
491
- return m_argImpl.nonZerosEstimate() * m_block.size() / m_block.nestedExpression().size();
492
- return nnz;
386
+ template <typename ArgType, int BlockRows, int BlockCols, bool InnerPanel>
387
+ struct unary_evaluator<Block<ArgType, BlockRows, BlockCols, InnerPanel>, IteratorBased>
388
+ : public evaluator_base<Block<ArgType, BlockRows, BlockCols, InnerPanel> > {
389
+ class InnerVectorInnerIterator;
390
+ class OuterVectorInnerIterator;
391
+
392
+ public:
393
+ typedef Block<ArgType, BlockRows, BlockCols, InnerPanel> XprType;
394
+ typedef typename XprType::StorageIndex StorageIndex;
395
+ typedef typename XprType::Scalar Scalar;
396
+
397
+ enum {
398
+ IsRowMajor = XprType::IsRowMajor,
399
+ OuterVector = (BlockCols == 1 && ArgType::IsRowMajor) || (BlockRows == 1 && !ArgType::IsRowMajor),
400
+ CoeffReadCost = evaluator<ArgType>::CoeffReadCost,
401
+ Flags = XprType::Flags
402
+ };
403
+
404
+ typedef std::conditional_t<OuterVector, OuterVectorInnerIterator, InnerVectorInnerIterator> InnerIterator;
405
+
406
+ explicit unary_evaluator(const XprType& op) : m_argImpl(op.nestedExpression()), m_block(op) {}
407
+
408
+ inline Index nonZerosEstimate() const {
409
+ const Index nnz = m_block.nonZeros();
410
+ if (nnz < 0) {
411
+ // Scale the non-zero estimate for the underlying expression linearly with block size.
412
+ // Return zero if the underlying block is empty.
413
+ const Index nested_sz = m_block.nestedExpression().size();
414
+ return nested_sz == 0 ? 0 : m_argImpl.nonZerosEstimate() * m_block.size() / nested_sz;
493
415
  }
416
+ return nnz;
417
+ }
494
418
 
495
- protected:
496
- typedef typename evaluator<ArgType>::InnerIterator EvalIterator;
419
+ protected:
420
+ typedef typename evaluator<ArgType>::InnerIterator EvalIterator;
497
421
 
498
- evaluator<ArgType> m_argImpl;
499
- const XprType &m_block;
422
+ evaluator<ArgType> m_argImpl;
423
+ const XprType& m_block;
500
424
  };
501
425
 
502
- template<typename ArgType, int BlockRows, int BlockCols, bool InnerPanel>
503
- class unary_evaluator<Block<ArgType,BlockRows,BlockCols,InnerPanel>, IteratorBased>::InnerVectorInnerIterator
504
- : public EvalIterator
505
- {
506
- enum { IsRowMajor = unary_evaluator::IsRowMajor };
426
+ template <typename ArgType, int BlockRows, int BlockCols, bool InnerPanel>
427
+ class unary_evaluator<Block<ArgType, BlockRows, BlockCols, InnerPanel>, IteratorBased>::InnerVectorInnerIterator
428
+ : public EvalIterator {
429
+ // NOTE MSVC fails to compile if we don't explicitly "import" IsRowMajor from unary_evaluator
430
+ // because the base class EvalIterator has a private IsRowMajor enum too. (bug #1786)
431
+ // NOTE We cannot call it IsRowMajor because it would shadow unary_evaluator::IsRowMajor
432
+ enum { XprIsRowMajor = unary_evaluator::IsRowMajor };
507
433
  const XprType& m_block;
508
434
  Index m_end;
509
- public:
510
435
 
436
+ public:
511
437
  EIGEN_STRONG_INLINE InnerVectorInnerIterator(const unary_evaluator& aEval, Index outer)
512
- : EvalIterator(aEval.m_argImpl, outer + (IsRowMajor ? aEval.m_block.startRow() : aEval.m_block.startCol())),
513
- m_block(aEval.m_block),
514
- m_end(IsRowMajor ? aEval.m_block.startCol()+aEval.m_block.blockCols() : aEval.m_block.startRow()+aEval.m_block.blockRows())
515
- {
516
- while( (EvalIterator::operator bool()) && (EvalIterator::index() < (IsRowMajor ? m_block.startCol() : m_block.startRow())) )
438
+ : EvalIterator(aEval.m_argImpl, outer + (XprIsRowMajor ? aEval.m_block.startRow() : aEval.m_block.startCol())),
439
+ m_block(aEval.m_block),
440
+ m_end(XprIsRowMajor ? aEval.m_block.startCol() + aEval.m_block.blockCols()
441
+ : aEval.m_block.startRow() + aEval.m_block.blockRows()) {
442
+ while ((EvalIterator::operator bool()) &&
443
+ (EvalIterator::index() < (XprIsRowMajor ? m_block.startCol() : m_block.startRow())))
517
444
  EvalIterator::operator++();
518
445
  }
519
446
 
520
- inline StorageIndex index() const { return EvalIterator::index() - convert_index<StorageIndex>(IsRowMajor ? m_block.startCol() : m_block.startRow()); }
521
- inline Index outer() const { return EvalIterator::outer() - (IsRowMajor ? m_block.startRow() : m_block.startCol()); }
522
- inline Index row() const { return EvalIterator::row() - m_block.startRow(); }
523
- inline Index col() const { return EvalIterator::col() - m_block.startCol(); }
447
+ inline StorageIndex index() const {
448
+ return EvalIterator::index() - convert_index<StorageIndex>(XprIsRowMajor ? m_block.startCol() : m_block.startRow());
449
+ }
450
+ inline Index outer() const {
451
+ return EvalIterator::outer() - (XprIsRowMajor ? m_block.startRow() : m_block.startCol());
452
+ }
453
+ inline Index row() const { return EvalIterator::row() - m_block.startRow(); }
454
+ inline Index col() const { return EvalIterator::col() - m_block.startCol(); }
524
455
 
525
456
  inline operator bool() const { return EvalIterator::operator bool() && EvalIterator::index() < m_end; }
526
457
  };
527
458
 
528
- template<typename ArgType, int BlockRows, int BlockCols, bool InnerPanel>
529
- class unary_evaluator<Block<ArgType,BlockRows,BlockCols,InnerPanel>, IteratorBased>::OuterVectorInnerIterator
530
- {
531
- enum { IsRowMajor = unary_evaluator::IsRowMajor };
459
+ template <typename ArgType, int BlockRows, int BlockCols, bool InnerPanel>
460
+ class unary_evaluator<Block<ArgType, BlockRows, BlockCols, InnerPanel>, IteratorBased>::OuterVectorInnerIterator {
461
+ // NOTE see above
462
+ enum { XprIsRowMajor = unary_evaluator::IsRowMajor };
532
463
  const unary_evaluator& m_eval;
533
464
  Index m_outerPos;
534
465
  const Index m_innerIndex;
535
466
  Index m_end;
536
467
  EvalIterator m_it;
537
- public:
538
468
 
469
+ public:
539
470
  EIGEN_STRONG_INLINE OuterVectorInnerIterator(const unary_evaluator& aEval, Index outer)
540
- : m_eval(aEval),
541
- m_outerPos( (IsRowMajor ? aEval.m_block.startCol() : aEval.m_block.startRow()) ),
542
- m_innerIndex(IsRowMajor ? aEval.m_block.startRow() : aEval.m_block.startCol()),
543
- m_end(IsRowMajor ? aEval.m_block.startCol()+aEval.m_block.blockCols() : aEval.m_block.startRow()+aEval.m_block.blockRows()),
544
- m_it(m_eval.m_argImpl, m_outerPos)
545
- {
471
+ : m_eval(aEval),
472
+ m_outerPos((XprIsRowMajor ? aEval.m_block.startCol() : aEval.m_block.startRow())),
473
+ m_innerIndex(XprIsRowMajor ? aEval.m_block.startRow() : aEval.m_block.startCol()),
474
+ m_end(XprIsRowMajor ? aEval.m_block.startCol() + aEval.m_block.blockCols()
475
+ : aEval.m_block.startRow() + aEval.m_block.blockRows()),
476
+ m_it(m_eval.m_argImpl, m_outerPos) {
546
477
  EIGEN_UNUSED_VARIABLE(outer);
547
- eigen_assert(outer==0);
478
+ eigen_assert(outer == 0);
548
479
 
549
- while(m_it && m_it.index() < m_innerIndex) ++m_it;
550
- if((!m_it) || (m_it.index()!=m_innerIndex))
551
- ++(*this);
480
+ while (m_it && m_it.index() < m_innerIndex) ++m_it;
481
+ if ((!m_it) || (m_it.index() != m_innerIndex)) ++(*this);
552
482
  }
553
483
 
554
- inline StorageIndex index() const { return convert_index<StorageIndex>(m_outerPos - (IsRowMajor ? m_eval.m_block.startCol() : m_eval.m_block.startRow())); }
555
- inline Index outer() const { return 0; }
556
- inline Index row() const { return IsRowMajor ? 0 : index(); }
557
- inline Index col() const { return IsRowMajor ? index() : 0; }
484
+ inline StorageIndex index() const {
485
+ return convert_index<StorageIndex>(m_outerPos -
486
+ (XprIsRowMajor ? m_eval.m_block.startCol() : m_eval.m_block.startRow()));
487
+ }
488
+ inline Index outer() const { return 0; }
489
+ inline Index row() const { return XprIsRowMajor ? 0 : index(); }
490
+ inline Index col() const { return XprIsRowMajor ? index() : 0; }
558
491
 
559
492
  inline Scalar value() const { return m_it.value(); }
560
493
  inline Scalar& valueRef() { return m_it.valueRef(); }
561
494
 
562
- inline OuterVectorInnerIterator& operator++()
563
- {
495
+ inline OuterVectorInnerIterator& operator++() {
564
496
  // search next non-zero entry
565
- while(++m_outerPos<m_end)
566
- {
497
+ while (++m_outerPos < m_end) {
567
498
  // Restart iterator at the next inner-vector:
568
- m_it.~EvalIterator();
569
- ::new (&m_it) EvalIterator(m_eval.m_argImpl, m_outerPos);
499
+ internal::destroy_at(&m_it);
500
+ internal::construct_at(&m_it, m_eval.m_argImpl, m_outerPos);
570
501
  // search for the key m_innerIndex in the current outer-vector
571
- while(m_it && m_it.index() < m_innerIndex) ++m_it;
572
- if(m_it && m_it.index()==m_innerIndex) break;
502
+ while (m_it && m_it.index() < m_innerIndex) ++m_it;
503
+ if (m_it && m_it.index() == m_innerIndex) break;
573
504
  }
574
505
  return *this;
575
506
  }
@@ -577,27 +508,27 @@ public:
577
508
  inline operator bool() const { return m_outerPos < m_end; }
578
509
  };
579
510
 
580
- template<typename _Scalar, int _Options, typename _StorageIndex, int BlockRows, int BlockCols>
581
- struct unary_evaluator<Block<SparseMatrix<_Scalar, _Options, _StorageIndex>,BlockRows,BlockCols,true>, IteratorBased>
582
- : evaluator<SparseCompressedBase<Block<SparseMatrix<_Scalar, _Options, _StorageIndex>,BlockRows,BlockCols,true> > >
583
- {
584
- typedef Block<SparseMatrix<_Scalar, _Options, _StorageIndex>,BlockRows,BlockCols,true> XprType;
511
+ template <typename Scalar_, int Options_, typename StorageIndex_, int BlockRows, int BlockCols>
512
+ struct unary_evaluator<Block<SparseMatrix<Scalar_, Options_, StorageIndex_>, BlockRows, BlockCols, true>, IteratorBased>
513
+ : evaluator<
514
+ SparseCompressedBase<Block<SparseMatrix<Scalar_, Options_, StorageIndex_>, BlockRows, BlockCols, true> > > {
515
+ typedef Block<SparseMatrix<Scalar_, Options_, StorageIndex_>, BlockRows, BlockCols, true> XprType;
585
516
  typedef evaluator<SparseCompressedBase<XprType> > Base;
586
- explicit unary_evaluator(const XprType &xpr) : Base(xpr) {}
517
+ explicit unary_evaluator(const XprType& xpr) : Base(xpr) {}
587
518
  };
588
519
 
589
- template<typename _Scalar, int _Options, typename _StorageIndex, int BlockRows, int BlockCols>
590
- struct unary_evaluator<Block<const SparseMatrix<_Scalar, _Options, _StorageIndex>,BlockRows,BlockCols,true>, IteratorBased>
591
- : evaluator<SparseCompressedBase<Block<const SparseMatrix<_Scalar, _Options, _StorageIndex>,BlockRows,BlockCols,true> > >
592
- {
593
- typedef Block<const SparseMatrix<_Scalar, _Options, _StorageIndex>,BlockRows,BlockCols,true> XprType;
520
+ template <typename Scalar_, int Options_, typename StorageIndex_, int BlockRows, int BlockCols>
521
+ struct unary_evaluator<Block<const SparseMatrix<Scalar_, Options_, StorageIndex_>, BlockRows, BlockCols, true>,
522
+ IteratorBased>
523
+ : evaluator<SparseCompressedBase<
524
+ Block<const SparseMatrix<Scalar_, Options_, StorageIndex_>, BlockRows, BlockCols, true> > > {
525
+ typedef Block<const SparseMatrix<Scalar_, Options_, StorageIndex_>, BlockRows, BlockCols, true> XprType;
594
526
  typedef evaluator<SparseCompressedBase<XprType> > Base;
595
- explicit unary_evaluator(const XprType &xpr) : Base(xpr) {}
527
+ explicit unary_evaluator(const XprType& xpr) : Base(xpr) {}
596
528
  };
597
529
 
598
- } // end namespace internal
599
-
530
+ } // end namespace internal
600
531
 
601
- } // end namespace Eigen
532
+ } // end namespace Eigen
602
533
 
603
- #endif // EIGEN_SPARSE_BLOCK_H
534
+ #endif // EIGEN_SPARSE_BLOCK_H