@smake/eigen 1.1.0 → 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 (431) hide show
  1. package/README.md +1 -1
  2. package/eigen/Eigen/AccelerateSupport +52 -0
  3. package/eigen/Eigen/Cholesky +18 -20
  4. package/eigen/Eigen/CholmodSupport +28 -28
  5. package/eigen/Eigen/Core +187 -120
  6. package/eigen/Eigen/Eigenvalues +16 -13
  7. package/eigen/Eigen/Geometry +18 -18
  8. package/eigen/Eigen/Householder +9 -7
  9. package/eigen/Eigen/IterativeLinearSolvers +8 -4
  10. package/eigen/Eigen/Jacobi +14 -13
  11. package/eigen/Eigen/KLUSupport +23 -21
  12. package/eigen/Eigen/LU +15 -16
  13. package/eigen/Eigen/MetisSupport +12 -12
  14. package/eigen/Eigen/OrderingMethods +54 -51
  15. package/eigen/Eigen/PaStiXSupport +23 -21
  16. package/eigen/Eigen/PardisoSupport +17 -14
  17. package/eigen/Eigen/QR +18 -20
  18. package/eigen/Eigen/QtAlignedMalloc +5 -12
  19. package/eigen/Eigen/SPQRSupport +21 -14
  20. package/eigen/Eigen/SVD +23 -17
  21. package/eigen/Eigen/Sparse +1 -2
  22. package/eigen/Eigen/SparseCholesky +18 -15
  23. package/eigen/Eigen/SparseCore +18 -17
  24. package/eigen/Eigen/SparseLU +9 -9
  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 +366 -405
  37. package/eigen/Eigen/src/Cholesky/LLT.h +323 -367
  38. package/eigen/Eigen/src/Cholesky/LLT_LAPACKE.h +81 -56
  39. package/eigen/Eigen/src/CholmodSupport/CholmodSupport.h +585 -529
  40. package/eigen/Eigen/src/CholmodSupport/InternalHeaderCheck.h +3 -0
  41. package/eigen/Eigen/src/Core/ArithmeticSequence.h +143 -317
  42. package/eigen/Eigen/src/Core/Array.h +329 -370
  43. package/eigen/Eigen/src/Core/ArrayBase.h +190 -203
  44. package/eigen/Eigen/src/Core/ArrayWrapper.h +126 -170
  45. package/eigen/Eigen/src/Core/Assign.h +30 -40
  46. package/eigen/Eigen/src/Core/AssignEvaluator.h +651 -604
  47. package/eigen/Eigen/src/Core/Assign_MKL.h +125 -120
  48. package/eigen/Eigen/src/Core/BandMatrix.h +267 -282
  49. package/eigen/Eigen/src/Core/Block.h +371 -390
  50. package/eigen/Eigen/src/Core/CommaInitializer.h +85 -100
  51. package/eigen/Eigen/src/Core/ConditionEstimator.h +51 -53
  52. package/eigen/Eigen/src/Core/CoreEvaluators.h +1214 -937
  53. package/eigen/Eigen/src/Core/CoreIterators.h +72 -63
  54. package/eigen/Eigen/src/Core/CwiseBinaryOp.h +112 -129
  55. package/eigen/Eigen/src/Core/CwiseNullaryOp.h +676 -702
  56. package/eigen/Eigen/src/Core/CwiseTernaryOp.h +77 -103
  57. package/eigen/Eigen/src/Core/CwiseUnaryOp.h +55 -67
  58. package/eigen/Eigen/src/Core/CwiseUnaryView.h +127 -92
  59. package/eigen/Eigen/src/Core/DenseBase.h +630 -658
  60. package/eigen/Eigen/src/Core/DenseCoeffsBase.h +511 -628
  61. package/eigen/Eigen/src/Core/DenseStorage.h +511 -590
  62. package/eigen/Eigen/src/Core/DeviceWrapper.h +153 -0
  63. package/eigen/Eigen/src/Core/Diagonal.h +168 -207
  64. package/eigen/Eigen/src/Core/DiagonalMatrix.h +346 -317
  65. package/eigen/Eigen/src/Core/DiagonalProduct.h +12 -10
  66. package/eigen/Eigen/src/Core/Dot.h +167 -217
  67. package/eigen/Eigen/src/Core/EigenBase.h +74 -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 -113
  71. package/eigen/Eigen/src/Core/Fuzzy.h +82 -105
  72. package/eigen/Eigen/src/Core/GeneralProduct.h +315 -261
  73. package/eigen/Eigen/src/Core/GenericPacketMath.h +1182 -520
  74. package/eigen/Eigen/src/Core/GlobalFunctions.h +193 -157
  75. package/eigen/Eigen/src/Core/IO.h +131 -156
  76. package/eigen/Eigen/src/Core/IndexedView.h +209 -125
  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 +50 -59
  80. package/eigen/Eigen/src/Core/Map.h +123 -141
  81. package/eigen/Eigen/src/Core/MapBase.h +255 -282
  82. package/eigen/Eigen/src/Core/MathFunctions.h +1247 -1201
  83. package/eigen/Eigen/src/Core/MathFunctionsImpl.h +162 -99
  84. package/eigen/Eigen/src/Core/Matrix.h +463 -494
  85. package/eigen/Eigen/src/Core/MatrixBase.h +468 -470
  86. package/eigen/Eigen/src/Core/NestByValue.h +58 -52
  87. package/eigen/Eigen/src/Core/NoAlias.h +79 -86
  88. package/eigen/Eigen/src/Core/NumTraits.h +206 -206
  89. package/eigen/Eigen/src/Core/PartialReduxEvaluator.h +163 -142
  90. package/eigen/Eigen/src/Core/PermutationMatrix.h +461 -511
  91. package/eigen/Eigen/src/Core/PlainObjectBase.h +858 -972
  92. package/eigen/Eigen/src/Core/Product.h +246 -130
  93. package/eigen/Eigen/src/Core/ProductEvaluators.h +779 -671
  94. package/eigen/Eigen/src/Core/Random.h +153 -164
  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 +334 -314
  98. package/eigen/Eigen/src/Core/Ref.h +259 -257
  99. package/eigen/Eigen/src/Core/Replicate.h +92 -104
  100. package/eigen/Eigen/src/Core/Reshaped.h +215 -271
  101. package/eigen/Eigen/src/Core/ReturnByValue.h +47 -55
  102. package/eigen/Eigen/src/Core/Reverse.h +133 -148
  103. package/eigen/Eigen/src/Core/Select.h +68 -140
  104. package/eigen/Eigen/src/Core/SelfAdjointView.h +254 -290
  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 +88 -102
  108. package/eigen/Eigen/src/Core/SolveTriangular.h +126 -124
  109. package/eigen/Eigen/src/Core/SolverBase.h +132 -133
  110. package/eigen/Eigen/src/Core/StableNorm.h +113 -147
  111. package/eigen/Eigen/src/Core/StlIterators.h +404 -248
  112. package/eigen/Eigen/src/Core/Stride.h +90 -92
  113. package/eigen/Eigen/src/Core/Swap.h +70 -39
  114. package/eigen/Eigen/src/Core/Transpose.h +258 -295
  115. package/eigen/Eigen/src/Core/Transpositions.h +270 -333
  116. package/eigen/Eigen/src/Core/TriangularMatrix.h +642 -743
  117. package/eigen/Eigen/src/Core/VectorBlock.h +59 -72
  118. package/eigen/Eigen/src/Core/VectorwiseOp.h +653 -704
  119. package/eigen/Eigen/src/Core/Visitor.h +464 -308
  120. package/eigen/Eigen/src/Core/arch/AVX/Complex.h +380 -187
  121. package/eigen/Eigen/src/Core/arch/AVX/MathFunctions.h +65 -163
  122. package/eigen/Eigen/src/Core/arch/AVX/PacketMath.h +2145 -638
  123. package/eigen/Eigen/src/Core/arch/AVX/Reductions.h +353 -0
  124. package/eigen/Eigen/src/Core/arch/AVX/TypeCasting.h +253 -60
  125. package/eigen/Eigen/src/Core/arch/AVX512/Complex.h +278 -228
  126. package/eigen/Eigen/src/Core/arch/AVX512/GemmKernel.h +1245 -0
  127. package/eigen/Eigen/src/Core/arch/AVX512/MathFunctions.h +48 -269
  128. package/eigen/Eigen/src/Core/arch/AVX512/MathFunctionsFP16.h +75 -0
  129. package/eigen/Eigen/src/Core/arch/AVX512/PacketMath.h +1597 -754
  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 +229 -41
  135. package/eigen/Eigen/src/Core/arch/AVX512/TypeCastingFP16.h +130 -0
  136. package/eigen/Eigen/src/Core/arch/AltiVec/Complex.h +420 -184
  137. package/eigen/Eigen/src/Core/arch/AltiVec/MathFunctions.h +40 -49
  138. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProduct.h +2962 -2213
  139. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h +196 -212
  140. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductMMA.h +713 -441
  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 +2380 -1362
  144. package/eigen/Eigen/src/Core/arch/AltiVec/TypeCasting.h +153 -0
  145. package/eigen/Eigen/src/Core/arch/Default/BFloat16.h +390 -224
  146. package/eigen/Eigen/src/Core/arch/Default/ConjHelper.h +78 -67
  147. package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h +1784 -799
  148. package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h +167 -50
  149. package/eigen/Eigen/src/Core/arch/Default/Half.h +528 -379
  150. package/eigen/Eigen/src/Core/arch/Default/Settings.h +10 -12
  151. package/eigen/Eigen/src/Core/arch/GPU/Complex.h +244 -0
  152. package/eigen/Eigen/src/Core/arch/GPU/MathFunctions.h +41 -40
  153. package/eigen/Eigen/src/Core/arch/GPU/PacketMath.h +550 -523
  154. package/eigen/Eigen/src/Core/arch/GPU/Tuple.h +268 -0
  155. package/eigen/Eigen/src/Core/arch/GPU/TypeCasting.h +27 -30
  156. package/eigen/Eigen/src/Core/arch/HIP/hcc/math_constants.h +8 -8
  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 +54 -82
  164. package/eigen/Eigen/src/Core/arch/MSA/MathFunctions.h +84 -92
  165. package/eigen/Eigen/src/Core/arch/MSA/PacketMath.h +51 -47
  166. package/eigen/Eigen/src/Core/arch/NEON/Complex.h +454 -306
  167. package/eigen/Eigen/src/Core/arch/NEON/GeneralBlockPanelKernel.h +175 -115
  168. package/eigen/Eigen/src/Core/arch/NEON/MathFunctions.h +23 -30
  169. package/eigen/Eigen/src/Core/arch/NEON/PacketMath.h +4366 -2857
  170. package/eigen/Eigen/src/Core/arch/NEON/TypeCasting.h +616 -393
  171. package/eigen/Eigen/src/Core/arch/NEON/UnaryFunctors.h +57 -0
  172. package/eigen/Eigen/src/Core/arch/SSE/Complex.h +350 -198
  173. package/eigen/Eigen/src/Core/arch/SSE/MathFunctions.h +38 -149
  174. package/eigen/Eigen/src/Core/arch/SSE/PacketMath.h +1791 -912
  175. package/eigen/Eigen/src/Core/arch/SSE/Reductions.h +324 -0
  176. package/eigen/Eigen/src/Core/arch/SSE/TypeCasting.h +128 -40
  177. package/eigen/Eigen/src/Core/arch/SVE/MathFunctions.h +10 -6
  178. package/eigen/Eigen/src/Core/arch/SVE/PacketMath.h +156 -234
  179. package/eigen/Eigen/src/Core/arch/SVE/TypeCasting.h +6 -3
  180. package/eigen/Eigen/src/Core/arch/SYCL/InteropHeaders.h +27 -32
  181. package/eigen/Eigen/src/Core/arch/SYCL/MathFunctions.h +119 -117
  182. package/eigen/Eigen/src/Core/arch/SYCL/PacketMath.h +325 -419
  183. package/eigen/Eigen/src/Core/arch/SYCL/TypeCasting.h +15 -17
  184. package/eigen/Eigen/src/Core/arch/ZVector/Complex.h +325 -181
  185. package/eigen/Eigen/src/Core/arch/ZVector/MathFunctions.h +94 -83
  186. package/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h +811 -458
  187. package/eigen/Eigen/src/Core/functors/AssignmentFunctors.h +121 -124
  188. package/eigen/Eigen/src/Core/functors/BinaryFunctors.h +576 -370
  189. package/eigen/Eigen/src/Core/functors/NullaryFunctors.h +194 -109
  190. package/eigen/Eigen/src/Core/functors/StlFunctors.h +95 -112
  191. package/eigen/Eigen/src/Core/functors/TernaryFunctors.h +34 -7
  192. package/eigen/Eigen/src/Core/functors/UnaryFunctors.h +1038 -749
  193. package/eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h +1883 -1375
  194. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix.h +312 -370
  195. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +189 -176
  196. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h +84 -81
  197. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix_BLAS.h +154 -73
  198. package/eigen/Eigen/src/Core/products/GeneralMatrixVector.h +292 -337
  199. package/eigen/Eigen/src/Core/products/GeneralMatrixVector_BLAS.h +80 -77
  200. package/eigen/Eigen/src/Core/products/Parallelizer.h +207 -105
  201. package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +327 -388
  202. package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix_BLAS.h +206 -224
  203. package/eigen/Eigen/src/Core/products/SelfadjointMatrixVector.h +138 -147
  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 -47
  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 -277
  212. package/eigen/Eigen/src/Core/products/TriangularSolverMatrix_BLAS.h +108 -109
  213. package/eigen/Eigen/src/Core/products/TriangularSolverVector.h +68 -94
  214. package/eigen/Eigen/src/Core/util/Assert.h +158 -0
  215. package/eigen/Eigen/src/Core/util/BlasUtil.h +342 -303
  216. package/eigen/Eigen/src/Core/util/ConfigureVectorization.h +348 -317
  217. package/eigen/Eigen/src/Core/util/Constants.h +297 -262
  218. package/eigen/Eigen/src/Core/util/DisableStupidWarnings.h +130 -90
  219. package/eigen/Eigen/src/Core/util/EmulateArray.h +270 -0
  220. package/eigen/Eigen/src/Core/util/ForwardDeclarations.h +449 -247
  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 +417 -116
  224. package/eigen/Eigen/src/Core/util/IntegralConstant.h +211 -204
  225. package/eigen/Eigen/src/Core/util/MKL_support.h +39 -37
  226. package/eigen/Eigen/src/Core/util/Macros.h +655 -773
  227. package/eigen/Eigen/src/Core/util/MaxSizeVector.h +139 -0
  228. package/eigen/Eigen/src/Core/util/Memory.h +970 -748
  229. package/eigen/Eigen/src/Core/util/Meta.h +581 -633
  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 +17 -17
  233. package/eigen/Eigen/src/Core/util/Serializer.h +209 -0
  234. package/eigen/Eigen/src/Core/util/StaticAssert.h +50 -166
  235. package/eigen/Eigen/src/Core/util/SymbolicIndex.h +377 -225
  236. package/eigen/Eigen/src/Core/util/XprHelper.h +784 -547
  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 +89 -105
  246. package/eigen/Eigen/src/Eigenvalues/RealQZ.h +537 -607
  247. package/eigen/Eigen/src/Eigenvalues/RealSchur.h +342 -381
  248. package/eigen/Eigen/src/Eigenvalues/RealSchur_LAPACKE.h +41 -35
  249. package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +541 -595
  250. package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_LAPACKE.h +47 -44
  251. package/eigen/Eigen/src/Eigenvalues/Tridiagonalization.h +430 -462
  252. package/eigen/Eigen/src/Geometry/AlignedBox.h +226 -227
  253. package/eigen/Eigen/src/Geometry/AngleAxis.h +131 -133
  254. package/eigen/Eigen/src/Geometry/EulerAngles.h +163 -74
  255. package/eigen/Eigen/src/Geometry/Homogeneous.h +285 -333
  256. package/eigen/Eigen/src/Geometry/Hyperplane.h +151 -160
  257. package/eigen/Eigen/src/Geometry/InternalHeaderCheck.h +3 -0
  258. package/eigen/Eigen/src/Geometry/OrthoMethods.h +168 -146
  259. package/eigen/Eigen/src/Geometry/ParametrizedLine.h +127 -127
  260. package/eigen/Eigen/src/Geometry/Quaternion.h +566 -506
  261. package/eigen/Eigen/src/Geometry/Rotation2D.h +107 -105
  262. package/eigen/Eigen/src/Geometry/RotationBase.h +148 -145
  263. package/eigen/Eigen/src/Geometry/Scaling.h +113 -106
  264. package/eigen/Eigen/src/Geometry/Transform.h +858 -936
  265. package/eigen/Eigen/src/Geometry/Translation.h +94 -92
  266. package/eigen/Eigen/src/Geometry/Umeyama.h +79 -84
  267. package/eigen/Eigen/src/Geometry/arch/Geometry_SIMD.h +90 -104
  268. package/eigen/Eigen/src/Householder/BlockHouseholder.h +51 -46
  269. package/eigen/Eigen/src/Householder/Householder.h +102 -124
  270. package/eigen/Eigen/src/Householder/HouseholderSequence.h +412 -453
  271. package/eigen/Eigen/src/Householder/InternalHeaderCheck.h +3 -0
  272. package/eigen/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +149 -162
  273. package/eigen/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +124 -119
  274. package/eigen/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +92 -104
  275. package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h +251 -243
  276. package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h +224 -228
  277. package/eigen/Eigen/src/IterativeLinearSolvers/InternalHeaderCheck.h +3 -0
  278. package/eigen/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +178 -227
  279. package/eigen/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h +79 -84
  280. package/eigen/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h +54 -60
  281. package/eigen/Eigen/src/Jacobi/InternalHeaderCheck.h +3 -0
  282. package/eigen/Eigen/src/Jacobi/Jacobi.h +252 -308
  283. package/eigen/Eigen/src/KLUSupport/InternalHeaderCheck.h +3 -0
  284. package/eigen/Eigen/src/KLUSupport/KLUSupport.h +208 -227
  285. package/eigen/Eigen/src/LU/Determinant.h +50 -69
  286. package/eigen/Eigen/src/LU/FullPivLU.h +545 -596
  287. package/eigen/Eigen/src/LU/InternalHeaderCheck.h +3 -0
  288. package/eigen/Eigen/src/LU/InverseImpl.h +206 -285
  289. package/eigen/Eigen/src/LU/PartialPivLU.h +390 -428
  290. package/eigen/Eigen/src/LU/PartialPivLU_LAPACKE.h +54 -40
  291. package/eigen/Eigen/src/LU/arch/InverseSize4.h +72 -70
  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 +243 -265
  295. package/eigen/Eigen/src/OrderingMethods/Eigen_Colamd.h +831 -1004
  296. package/eigen/Eigen/src/OrderingMethods/InternalHeaderCheck.h +3 -0
  297. package/eigen/Eigen/src/OrderingMethods/Ordering.h +112 -119
  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 -430
  302. package/eigen/Eigen/src/QR/ColPivHouseholderQR.h +479 -479
  303. package/eigen/Eigen/src/QR/ColPivHouseholderQR_LAPACKE.h +120 -56
  304. package/eigen/Eigen/src/QR/CompleteOrthogonalDecomposition.h +166 -153
  305. package/eigen/Eigen/src/QR/FullPivHouseholderQR.h +495 -475
  306. package/eigen/Eigen/src/QR/HouseholderQR.h +394 -285
  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 +244 -264
  311. package/eigen/Eigen/src/SVD/BDCSVD.h +817 -713
  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 +577 -543
  315. package/eigen/Eigen/src/SVD/JacobiSVD_LAPACKE.h +85 -49
  316. package/eigen/Eigen/src/SVD/SVDBase.h +242 -182
  317. package/eigen/Eigen/src/SVD/UpperBidiagonalization.h +200 -235
  318. package/eigen/Eigen/src/SparseCholesky/InternalHeaderCheck.h +3 -0
  319. package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky.h +765 -594
  320. package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h +308 -94
  321. package/eigen/Eigen/src/SparseCore/AmbiVector.h +202 -251
  322. package/eigen/Eigen/src/SparseCore/CompressedStorage.h +184 -252
  323. package/eigen/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h +134 -178
  324. package/eigen/Eigen/src/SparseCore/InternalHeaderCheck.h +3 -0
  325. package/eigen/Eigen/src/SparseCore/SparseAssign.h +149 -140
  326. package/eigen/Eigen/src/SparseCore/SparseBlock.h +403 -440
  327. package/eigen/Eigen/src/SparseCore/SparseColEtree.h +100 -112
  328. package/eigen/Eigen/src/SparseCore/SparseCompressedBase.h +525 -303
  329. package/eigen/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +555 -339
  330. package/eigen/Eigen/src/SparseCore/SparseCwiseUnaryOp.h +100 -108
  331. package/eigen/Eigen/src/SparseCore/SparseDenseProduct.h +169 -197
  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 +1603 -1245
  337. package/eigen/Eigen/src/SparseCore/SparseMatrixBase.h +403 -350
  338. package/eigen/Eigen/src/SparseCore/SparsePermutation.h +186 -115
  339. package/eigen/Eigen/src/SparseCore/SparseProduct.h +94 -97
  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 +370 -416
  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 +138 -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 +756 -710
  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 +245 -301
  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 +89 -100
  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 +124 -132
  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 +450 -502
  370. package/eigen/Eigen/src/StlSupport/StdDeque.h +28 -93
  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 -730
  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 +428 -464
  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 +9972 -16179
  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.h → BlockMethods.inc} +434 -506
  401. package/eigen/Eigen/src/plugins/CommonCwiseBinaryOps.inc +116 -0
  402. package/eigen/Eigen/src/plugins/{CommonCwiseUnaryOps.h → CommonCwiseUnaryOps.inc} +58 -68
  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/package.json +1 -1
  409. package/eigen/COPYING.APACHE +0 -203
  410. package/eigen/COPYING.BSD +0 -26
  411. package/eigen/COPYING.GPL +0 -674
  412. package/eigen/COPYING.LGPL +0 -502
  413. package/eigen/COPYING.MINPACK +0 -51
  414. package/eigen/COPYING.MPL2 +0 -373
  415. package/eigen/COPYING.README +0 -18
  416. package/eigen/Eigen/src/Core/BooleanRedux.h +0 -162
  417. package/eigen/Eigen/src/Core/arch/CUDA/Complex.h +0 -258
  418. package/eigen/Eigen/src/Core/arch/Default/TypeCasting.h +0 -120
  419. package/eigen/Eigen/src/Core/arch/SYCL/SyclMemoryModel.h +0 -694
  420. package/eigen/Eigen/src/Core/util/NonMPL2.h +0 -3
  421. package/eigen/Eigen/src/SparseCore/MappedSparseMatrix.h +0 -67
  422. package/eigen/Eigen/src/SparseLU/SparseLU_gemm_kernel.h +0 -280
  423. package/eigen/Eigen/src/misc/lapack.h +0 -152
  424. package/eigen/Eigen/src/plugins/ArrayCwiseBinaryOps.h +0 -358
  425. package/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.h +0 -696
  426. package/eigen/Eigen/src/plugins/CommonCwiseBinaryOps.h +0 -115
  427. package/eigen/Eigen/src/plugins/IndexedViewMethods.h +0 -262
  428. package/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.h +0 -152
  429. package/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.h +0 -95
  430. package/eigen/Eigen/src/plugins/ReshapedMethods.h +0 -149
  431. package/eigen/README.md +0 -5
@@ -10,22 +10,28 @@
10
10
  #ifndef EIGEN_CHOLMODSUPPORT_H
11
11
  #define EIGEN_CHOLMODSUPPORT_H
12
12
 
13
+ // IWYU pragma: private
14
+ #include "./InternalHeaderCheck.h"
15
+
13
16
  namespace Eigen {
14
17
 
15
18
  namespace internal {
16
19
 
17
- template<typename Scalar> struct cholmod_configure_matrix;
20
+ template <typename Scalar>
21
+ struct cholmod_configure_matrix;
18
22
 
19
- template<> struct cholmod_configure_matrix<double> {
20
- template<typename CholmodType>
23
+ template <>
24
+ struct cholmod_configure_matrix<double> {
25
+ template <typename CholmodType>
21
26
  static void run(CholmodType& mat) {
22
27
  mat.xtype = CHOLMOD_REAL;
23
28
  mat.dtype = CHOLMOD_DOUBLE;
24
29
  }
25
30
  };
26
31
 
27
- template<> struct cholmod_configure_matrix<std::complex<double> > {
28
- template<typename CholmodType>
32
+ template <>
33
+ struct cholmod_configure_matrix<std::complex<double> > {
34
+ template <typename CholmodType>
29
35
  static void run(CholmodType& mat) {
30
36
  mat.xtype = CHOLMOD_COMPLEX;
31
37
  mat.dtype = CHOLMOD_DOUBLE;
@@ -49,103 +55,92 @@ template<> struct cholmod_configure_matrix<std::complex<double> > {
49
55
  // }
50
56
  // };
51
57
 
52
- } // namespace internal
58
+ } // namespace internal
53
59
 
54
60
  /** Wraps the Eigen sparse matrix \a mat into a Cholmod sparse matrix object.
55
- * Note that the data are shared.
56
- */
57
- template<typename _Scalar, int _Options, typename _StorageIndex>
58
- cholmod_sparse viewAsCholmod(Ref<SparseMatrix<_Scalar,_Options,_StorageIndex> > mat)
59
- {
61
+ * Note that the data are shared.
62
+ */
63
+ template <typename Scalar_, int Options_, typename StorageIndex_>
64
+ cholmod_sparse viewAsCholmod(Ref<SparseMatrix<Scalar_, Options_, StorageIndex_> > mat) {
60
65
  cholmod_sparse res;
61
- res.nzmax = mat.nonZeros();
62
- res.nrow = mat.rows();
63
- res.ncol = mat.cols();
64
- res.p = mat.outerIndexPtr();
65
- res.i = mat.innerIndexPtr();
66
- res.x = mat.valuePtr();
67
- res.z = 0;
68
- res.sorted = 1;
69
- if(mat.isCompressed())
70
- {
71
- res.packed = 1;
66
+ res.nzmax = mat.nonZeros();
67
+ res.nrow = mat.rows();
68
+ res.ncol = mat.cols();
69
+ res.p = mat.outerIndexPtr();
70
+ res.i = mat.innerIndexPtr();
71
+ res.x = mat.valuePtr();
72
+ res.z = 0;
73
+ res.sorted = 1;
74
+ if (mat.isCompressed()) {
75
+ res.packed = 1;
72
76
  res.nz = 0;
73
- }
74
- else
75
- {
76
- res.packed = 0;
77
+ } else {
78
+ res.packed = 0;
77
79
  res.nz = mat.innerNonZeroPtr();
78
80
  }
79
81
 
80
- res.dtype = 0;
81
- res.stype = -1;
82
+ res.dtype = 0;
83
+ res.stype = -1;
82
84
 
83
- if (internal::is_same<_StorageIndex,int>::value)
84
- {
85
+ if (internal::is_same<StorageIndex_, int>::value) {
85
86
  res.itype = CHOLMOD_INT;
86
- }
87
- else if (internal::is_same<_StorageIndex,SuiteSparse_long>::value)
88
- {
87
+ } else if (internal::is_same<StorageIndex_, SuiteSparse_long>::value) {
89
88
  res.itype = CHOLMOD_LONG;
90
- }
91
- else
92
- {
89
+ } else {
93
90
  eigen_assert(false && "Index type not supported yet");
94
91
  }
95
92
 
96
93
  // setup res.xtype
97
- internal::cholmod_configure_matrix<_Scalar>::run(res);
94
+ internal::cholmod_configure_matrix<Scalar_>::run(res);
98
95
 
99
96
  res.stype = 0;
100
97
 
101
98
  return res;
102
99
  }
103
100
 
104
- template<typename _Scalar, int _Options, typename _Index>
105
- const cholmod_sparse viewAsCholmod(const SparseMatrix<_Scalar,_Options,_Index>& mat)
106
- {
107
- cholmod_sparse res = viewAsCholmod(Ref<SparseMatrix<_Scalar,_Options,_Index> >(mat.const_cast_derived()));
101
+ template <typename Scalar_, int Options_, typename Index_>
102
+ const cholmod_sparse viewAsCholmod(const SparseMatrix<Scalar_, Options_, Index_>& mat) {
103
+ cholmod_sparse res = viewAsCholmod(Ref<SparseMatrix<Scalar_, Options_, Index_> >(mat.const_cast_derived()));
108
104
  return res;
109
105
  }
110
106
 
111
- template<typename _Scalar, int _Options, typename _Index>
112
- const cholmod_sparse viewAsCholmod(const SparseVector<_Scalar,_Options,_Index>& mat)
113
- {
114
- cholmod_sparse res = viewAsCholmod(Ref<SparseMatrix<_Scalar,_Options,_Index> >(mat.const_cast_derived()));
107
+ template <typename Scalar_, int Options_, typename Index_>
108
+ const cholmod_sparse viewAsCholmod(const SparseVector<Scalar_, Options_, Index_>& mat) {
109
+ cholmod_sparse res = viewAsCholmod(Ref<SparseMatrix<Scalar_, Options_, Index_> >(mat.const_cast_derived()));
115
110
  return res;
116
111
  }
117
112
 
118
113
  /** Returns a view of the Eigen sparse matrix \a mat as Cholmod sparse matrix.
119
- * The data are not copied but shared. */
120
- template<typename _Scalar, int _Options, typename _Index, unsigned int UpLo>
121
- cholmod_sparse viewAsCholmod(const SparseSelfAdjointView<const SparseMatrix<_Scalar,_Options,_Index>, UpLo>& mat)
122
- {
123
- cholmod_sparse res = viewAsCholmod(Ref<SparseMatrix<_Scalar,_Options,_Index> >(mat.matrix().const_cast_derived()));
124
-
125
- if(UpLo==Upper) res.stype = 1;
126
- if(UpLo==Lower) res.stype = -1;
114
+ * The data are not copied but shared. */
115
+ template <typename Scalar_, int Options_, typename Index_, unsigned int UpLo>
116
+ cholmod_sparse viewAsCholmod(const SparseSelfAdjointView<const SparseMatrix<Scalar_, Options_, Index_>, UpLo>& mat) {
117
+ cholmod_sparse res = viewAsCholmod(Ref<SparseMatrix<Scalar_, Options_, Index_> >(mat.matrix().const_cast_derived()));
118
+
119
+ if (UpLo == Upper) res.stype = 1;
120
+ if (UpLo == Lower) res.stype = -1;
127
121
  // swap stype for rowmajor matrices (only works for real matrices)
128
- EIGEN_STATIC_ASSERT((_Options & RowMajorBit) == 0 || NumTraits<_Scalar>::IsComplex == 0, THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES);
129
- if(_Options & RowMajorBit) res.stype *=-1;
122
+ EIGEN_STATIC_ASSERT((Options_ & RowMajorBit) == 0 || NumTraits<Scalar_>::IsComplex == 0,
123
+ THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES);
124
+ if (Options_ & RowMajorBit) res.stype *= -1;
130
125
 
131
126
  return res;
132
127
  }
133
128
 
134
129
  /** Returns a view of the Eigen \b dense matrix \a mat as Cholmod dense matrix.
135
- * The data are not copied but shared. */
136
- template<typename Derived>
137
- cholmod_dense viewAsCholmod(MatrixBase<Derived>& mat)
138
- {
139
- EIGEN_STATIC_ASSERT((internal::traits<Derived>::Flags&RowMajorBit)==0,THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES);
130
+ * The data are not copied but shared. */
131
+ template <typename Derived>
132
+ cholmod_dense viewAsCholmod(MatrixBase<Derived>& mat) {
133
+ EIGEN_STATIC_ASSERT((internal::traits<Derived>::Flags & RowMajorBit) == 0,
134
+ THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES);
140
135
  typedef typename Derived::Scalar Scalar;
141
136
 
142
137
  cholmod_dense res;
143
- res.nrow = mat.rows();
144
- res.ncol = mat.cols();
145
- res.nzmax = res.nrow * res.ncol;
146
- res.d = Derived::IsVectorAtCompileTime ? mat.derived().size() : mat.derived().outerStride();
147
- res.x = (void*)(mat.derived().data());
148
- res.z = 0;
138
+ res.nrow = mat.rows();
139
+ res.ncol = mat.cols();
140
+ res.nzmax = res.nrow * res.ncol;
141
+ res.d = Derived::IsVectorAtCompileTime ? mat.derived().size() : mat.derived().outerStride();
142
+ res.x = (void*)(mat.derived().data());
143
+ res.z = 0;
149
144
 
150
145
  internal::cholmod_configure_matrix<Scalar>::run(res);
151
146
 
@@ -153,530 +148,591 @@ cholmod_dense viewAsCholmod(MatrixBase<Derived>& mat)
153
148
  }
154
149
 
155
150
  /** Returns a view of the Cholmod sparse matrix \a cm as an Eigen sparse matrix.
156
- * The data are not copied but shared. */
157
- template<typename Scalar, int Flags, typename StorageIndex>
158
- MappedSparseMatrix<Scalar,Flags,StorageIndex> viewAsEigen(cholmod_sparse& cm)
159
- {
160
- return MappedSparseMatrix<Scalar,Flags,StorageIndex>
161
- (cm.nrow, cm.ncol, static_cast<StorageIndex*>(cm.p)[cm.ncol],
162
- static_cast<StorageIndex*>(cm.p), static_cast<StorageIndex*>(cm.i),static_cast<Scalar*>(cm.x) );
151
+ * The data are not copied but shared. */
152
+ template <typename Scalar, typename StorageIndex>
153
+ Map<const SparseMatrix<Scalar, ColMajor, StorageIndex> > viewAsEigen(cholmod_sparse& cm) {
154
+ return Map<const SparseMatrix<Scalar, ColMajor, StorageIndex> >(
155
+ cm.nrow, cm.ncol, static_cast<StorageIndex*>(cm.p)[cm.ncol], static_cast<StorageIndex*>(cm.p),
156
+ static_cast<StorageIndex*>(cm.i), static_cast<Scalar*>(cm.x));
157
+ }
158
+
159
+ /** Returns a view of the Cholmod sparse matrix factor \a cm as an Eigen sparse matrix.
160
+ * The data are not copied but shared. */
161
+ template <typename Scalar, typename StorageIndex>
162
+ Map<const SparseMatrix<Scalar, ColMajor, StorageIndex> > viewAsEigen(cholmod_factor& cm) {
163
+ return Map<const SparseMatrix<Scalar, ColMajor, StorageIndex> >(
164
+ cm.n, cm.n, static_cast<StorageIndex*>(cm.p)[cm.n], static_cast<StorageIndex*>(cm.p),
165
+ static_cast<StorageIndex*>(cm.i), static_cast<Scalar*>(cm.x));
163
166
  }
164
167
 
165
168
  namespace internal {
166
169
 
167
170
  // template specializations for int and long that call the correct cholmod method
168
171
 
169
- #define EIGEN_CHOLMOD_SPECIALIZE0(ret, name) \
170
- template<typename _StorageIndex> inline ret cm_ ## name (cholmod_common &Common) { return cholmod_ ## name (&Common); } \
171
- template<> inline ret cm_ ## name<SuiteSparse_long> (cholmod_common &Common) { return cholmod_l_ ## name (&Common); }
172
+ #define EIGEN_CHOLMOD_SPECIALIZE0(ret, name) \
173
+ template <typename StorageIndex_> \
174
+ inline ret cm_##name(cholmod_common& Common) { \
175
+ return cholmod_##name(&Common); \
176
+ } \
177
+ template <> \
178
+ inline ret cm_##name<SuiteSparse_long>(cholmod_common & Common) { \
179
+ return cholmod_l_##name(&Common); \
180
+ }
172
181
 
173
- #define EIGEN_CHOLMOD_SPECIALIZE1(ret, name, t1, a1) \
174
- template<typename _StorageIndex> inline ret cm_ ## name (t1& a1, cholmod_common &Common) { return cholmod_ ## name (&a1, &Common); } \
175
- template<> inline ret cm_ ## name<SuiteSparse_long> (t1& a1, cholmod_common &Common) { return cholmod_l_ ## name (&a1, &Common); }
182
+ #define EIGEN_CHOLMOD_SPECIALIZE1(ret, name, t1, a1) \
183
+ template <typename StorageIndex_> \
184
+ inline ret cm_##name(t1& a1, cholmod_common& Common) { \
185
+ return cholmod_##name(&a1, &Common); \
186
+ } \
187
+ template <> \
188
+ inline ret cm_##name<SuiteSparse_long>(t1 & a1, cholmod_common & Common) { \
189
+ return cholmod_l_##name(&a1, &Common); \
190
+ }
176
191
 
177
192
  EIGEN_CHOLMOD_SPECIALIZE0(int, start)
178
193
  EIGEN_CHOLMOD_SPECIALIZE0(int, finish)
179
194
 
180
195
  EIGEN_CHOLMOD_SPECIALIZE1(int, free_factor, cholmod_factor*, L)
181
- EIGEN_CHOLMOD_SPECIALIZE1(int, free_dense, cholmod_dense*, X)
196
+ EIGEN_CHOLMOD_SPECIALIZE1(int, free_dense, cholmod_dense*, X)
182
197
  EIGEN_CHOLMOD_SPECIALIZE1(int, free_sparse, cholmod_sparse*, A)
183
198
 
184
199
  EIGEN_CHOLMOD_SPECIALIZE1(cholmod_factor*, analyze, cholmod_sparse, A)
200
+ EIGEN_CHOLMOD_SPECIALIZE1(cholmod_sparse*, factor_to_sparse, cholmod_factor, L)
185
201
 
186
- template<typename _StorageIndex> inline cholmod_dense* cm_solve (int sys, cholmod_factor& L, cholmod_dense& B, cholmod_common &Common) { return cholmod_solve (sys, &L, &B, &Common); }
187
- template<> inline cholmod_dense* cm_solve<SuiteSparse_long> (int sys, cholmod_factor& L, cholmod_dense& B, cholmod_common &Common) { return cholmod_l_solve (sys, &L, &B, &Common); }
202
+ template <typename StorageIndex_>
203
+ inline cholmod_dense* cm_solve(int sys, cholmod_factor& L, cholmod_dense& B, cholmod_common& Common) {
204
+ return cholmod_solve(sys, &L, &B, &Common);
205
+ }
206
+ template <>
207
+ inline cholmod_dense* cm_solve<SuiteSparse_long>(int sys, cholmod_factor& L, cholmod_dense& B, cholmod_common& Common) {
208
+ return cholmod_l_solve(sys, &L, &B, &Common);
209
+ }
188
210
 
189
- template<typename _StorageIndex> inline cholmod_sparse* cm_spsolve (int sys, cholmod_factor& L, cholmod_sparse& B, cholmod_common &Common) { return cholmod_spsolve (sys, &L, &B, &Common); }
190
- template<> inline cholmod_sparse* cm_spsolve<SuiteSparse_long> (int sys, cholmod_factor& L, cholmod_sparse& B, cholmod_common &Common) { return cholmod_l_spsolve (sys, &L, &B, &Common); }
211
+ template <typename StorageIndex_>
212
+ inline cholmod_sparse* cm_spsolve(int sys, cholmod_factor& L, cholmod_sparse& B, cholmod_common& Common) {
213
+ return cholmod_spsolve(sys, &L, &B, &Common);
214
+ }
215
+ template <>
216
+ inline cholmod_sparse* cm_spsolve<SuiteSparse_long>(int sys, cholmod_factor& L, cholmod_sparse& B,
217
+ cholmod_common& Common) {
218
+ return cholmod_l_spsolve(sys, &L, &B, &Common);
219
+ }
191
220
 
192
- template<typename _StorageIndex>
193
- inline int cm_factorize_p (cholmod_sparse* A, double beta[2], _StorageIndex* fset, std::size_t fsize, cholmod_factor* L, cholmod_common &Common) { return cholmod_factorize_p (A, beta, fset, fsize, L, &Common); }
194
- template<>
195
- inline int cm_factorize_p<SuiteSparse_long> (cholmod_sparse* A, double beta[2], SuiteSparse_long* fset, std::size_t fsize, cholmod_factor* L, cholmod_common &Common) { return cholmod_l_factorize_p (A, beta, fset, fsize, L, &Common); }
221
+ template <typename StorageIndex_>
222
+ inline int cm_factorize_p(cholmod_sparse* A, double beta[2], StorageIndex_* fset, std::size_t fsize, cholmod_factor* L,
223
+ cholmod_common& Common) {
224
+ return cholmod_factorize_p(A, beta, fset, fsize, L, &Common);
225
+ }
226
+ template <>
227
+ inline int cm_factorize_p<SuiteSparse_long>(cholmod_sparse* A, double beta[2], SuiteSparse_long* fset,
228
+ std::size_t fsize, cholmod_factor* L, cholmod_common& Common) {
229
+ return cholmod_l_factorize_p(A, beta, fset, fsize, L, &Common);
230
+ }
196
231
 
197
232
  #undef EIGEN_CHOLMOD_SPECIALIZE0
198
233
  #undef EIGEN_CHOLMOD_SPECIALIZE1
199
234
 
200
235
  } // namespace internal
201
236
 
237
+ enum CholmodMode { CholmodAuto, CholmodSimplicialLLt, CholmodSupernodalLLt, CholmodLDLt };
202
238
 
203
- enum CholmodMode {
204
- CholmodAuto, CholmodSimplicialLLt, CholmodSupernodalLLt, CholmodLDLt
205
- };
239
+ /** \ingroup CholmodSupport_Module
240
+ * \class CholmodBase
241
+ * \brief The base class for the direct Cholesky factorization of Cholmod
242
+ * \sa class CholmodSupernodalLLT, class CholmodSimplicialLDLT, class CholmodSimplicialLLT
243
+ */
244
+ template <typename MatrixType_, int UpLo_, typename Derived>
245
+ class CholmodBase : public SparseSolverBase<Derived> {
246
+ protected:
247
+ typedef SparseSolverBase<Derived> Base;
248
+ using Base::derived;
249
+ using Base::m_isInitialized;
250
+
251
+ public:
252
+ typedef MatrixType_ MatrixType;
253
+ enum { UpLo = UpLo_ };
254
+ typedef typename MatrixType::Scalar Scalar;
255
+ typedef typename MatrixType::RealScalar RealScalar;
256
+ typedef MatrixType CholMatrixType;
257
+ typedef typename MatrixType::StorageIndex StorageIndex;
258
+ enum { ColsAtCompileTime = MatrixType::ColsAtCompileTime, MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime };
259
+
260
+ public:
261
+ CholmodBase() : m_cholmodFactor(0), m_info(Success), m_factorizationIsOk(false), m_analysisIsOk(false) {
262
+ EIGEN_STATIC_ASSERT((internal::is_same<double, RealScalar>::value), CHOLMOD_SUPPORTS_DOUBLE_PRECISION_ONLY);
263
+ m_shiftOffset[0] = m_shiftOffset[1] = 0.0;
264
+ internal::cm_start<StorageIndex>(m_cholmod);
265
+ }
206
266
 
267
+ explicit CholmodBase(const MatrixType& matrix)
268
+ : m_cholmodFactor(0), m_info(Success), m_factorizationIsOk(false), m_analysisIsOk(false) {
269
+ EIGEN_STATIC_ASSERT((internal::is_same<double, RealScalar>::value), CHOLMOD_SUPPORTS_DOUBLE_PRECISION_ONLY);
270
+ m_shiftOffset[0] = m_shiftOffset[1] = 0.0;
271
+ internal::cm_start<StorageIndex>(m_cholmod);
272
+ compute(matrix);
273
+ }
207
274
 
208
- /** \ingroup CholmodSupport_Module
209
- * \class CholmodBase
210
- * \brief The base class for the direct Cholesky factorization of Cholmod
211
- * \sa class CholmodSupernodalLLT, class CholmodSimplicialLDLT, class CholmodSimplicialLLT
212
- */
213
- template<typename _MatrixType, int _UpLo, typename Derived>
214
- class CholmodBase : public SparseSolverBase<Derived>
215
- {
216
- protected:
217
- typedef SparseSolverBase<Derived> Base;
218
- using Base::derived;
219
- using Base::m_isInitialized;
220
- public:
221
- typedef _MatrixType MatrixType;
222
- enum { UpLo = _UpLo };
223
- typedef typename MatrixType::Scalar Scalar;
224
- typedef typename MatrixType::RealScalar RealScalar;
225
- typedef MatrixType CholMatrixType;
226
- typedef typename MatrixType::StorageIndex StorageIndex;
227
- enum {
228
- ColsAtCompileTime = MatrixType::ColsAtCompileTime,
229
- MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
230
- };
231
-
232
- public:
233
-
234
- CholmodBase()
235
- : m_cholmodFactor(0), m_info(Success), m_factorizationIsOk(false), m_analysisIsOk(false)
236
- {
237
- EIGEN_STATIC_ASSERT((internal::is_same<double,RealScalar>::value), CHOLMOD_SUPPORTS_DOUBLE_PRECISION_ONLY);
238
- m_shiftOffset[0] = m_shiftOffset[1] = 0.0;
239
- internal::cm_start<StorageIndex>(m_cholmod);
240
- }
275
+ ~CholmodBase() {
276
+ if (m_cholmodFactor) internal::cm_free_factor<StorageIndex>(m_cholmodFactor, m_cholmod);
277
+ internal::cm_finish<StorageIndex>(m_cholmod);
278
+ }
241
279
 
242
- explicit CholmodBase(const MatrixType& matrix)
243
- : m_cholmodFactor(0), m_info(Success), m_factorizationIsOk(false), m_analysisIsOk(false)
244
- {
245
- EIGEN_STATIC_ASSERT((internal::is_same<double,RealScalar>::value), CHOLMOD_SUPPORTS_DOUBLE_PRECISION_ONLY);
246
- m_shiftOffset[0] = m_shiftOffset[1] = 0.0;
247
- internal::cm_start<StorageIndex>(m_cholmod);
248
- compute(matrix);
249
- }
280
+ inline StorageIndex cols() const { return internal::convert_index<StorageIndex, Index>(m_cholmodFactor->n); }
281
+ inline StorageIndex rows() const { return internal::convert_index<StorageIndex, Index>(m_cholmodFactor->n); }
282
+
283
+ /** \brief Reports whether previous computation was successful.
284
+ *
285
+ * \returns \c Success if computation was successful,
286
+ * \c NumericalIssue if the matrix.appears to be negative.
287
+ */
288
+ ComputationInfo info() const {
289
+ eigen_assert(m_isInitialized && "Decomposition is not initialized.");
290
+ return m_info;
291
+ }
250
292
 
251
- ~CholmodBase()
252
- {
253
- if(m_cholmodFactor)
254
- internal::cm_free_factor<StorageIndex>(m_cholmodFactor, m_cholmod);
255
- internal::cm_finish<StorageIndex>(m_cholmod);
256
- }
293
+ /** Computes the sparse Cholesky decomposition of \a matrix */
294
+ Derived& compute(const MatrixType& matrix) {
295
+ analyzePattern(matrix);
296
+ factorize(matrix);
297
+ return derived();
298
+ }
257
299
 
258
- inline StorageIndex cols() const { return internal::convert_index<StorageIndex, Index>(m_cholmodFactor->n); }
259
- inline StorageIndex rows() const { return internal::convert_index<StorageIndex, Index>(m_cholmodFactor->n); }
260
-
261
- /** \brief Reports whether previous computation was successful.
262
- *
263
- * \returns \c Success if computation was successful,
264
- * \c NumericalIssue if the matrix.appears to be negative.
265
- */
266
- ComputationInfo info() const
267
- {
268
- eigen_assert(m_isInitialized && "Decomposition is not initialized.");
269
- return m_info;
300
+ /** Performs a symbolic decomposition on the sparsity pattern of \a matrix.
301
+ *
302
+ * This function is particularly useful when solving for several problems having the same structure.
303
+ *
304
+ * \sa factorize()
305
+ */
306
+ void analyzePattern(const MatrixType& matrix) {
307
+ if (m_cholmodFactor) {
308
+ internal::cm_free_factor<StorageIndex>(m_cholmodFactor, m_cholmod);
309
+ m_cholmodFactor = 0;
270
310
  }
311
+ cholmod_sparse A = viewAsCholmod(matrix.template selfadjointView<UpLo>());
312
+ m_cholmodFactor = internal::cm_analyze<StorageIndex>(A, m_cholmod);
271
313
 
272
- /** Computes the sparse Cholesky decomposition of \a matrix */
273
- Derived& compute(const MatrixType& matrix)
274
- {
275
- analyzePattern(matrix);
276
- factorize(matrix);
277
- return derived();
278
- }
314
+ this->m_isInitialized = true;
315
+ this->m_info = Success;
316
+ m_analysisIsOk = true;
317
+ m_factorizationIsOk = false;
318
+ }
279
319
 
280
- /** Performs a symbolic decomposition on the sparsity pattern of \a matrix.
281
- *
282
- * This function is particularly useful when solving for several problems having the same structure.
283
- *
284
- * \sa factorize()
285
- */
286
- void analyzePattern(const MatrixType& matrix)
287
- {
288
- if(m_cholmodFactor)
289
- {
290
- internal::cm_free_factor<StorageIndex>(m_cholmodFactor, m_cholmod);
291
- m_cholmodFactor = 0;
292
- }
293
- cholmod_sparse A = viewAsCholmod(matrix.template selfadjointView<UpLo>());
294
- m_cholmodFactor = internal::cm_analyze<StorageIndex>(A, m_cholmod);
320
+ /** Performs a numeric decomposition of \a matrix
321
+ *
322
+ * The given matrix must have the same sparsity pattern as the matrix on which the symbolic decomposition has been
323
+ * performed.
324
+ *
325
+ * \sa analyzePattern()
326
+ */
327
+ void factorize(const MatrixType& matrix) {
328
+ eigen_assert(m_analysisIsOk && "You must first call analyzePattern()");
329
+ cholmod_sparse A = viewAsCholmod(matrix.template selfadjointView<UpLo>());
330
+ internal::cm_factorize_p<StorageIndex>(&A, m_shiftOffset, 0, 0, m_cholmodFactor, m_cholmod);
331
+
332
+ // If the factorization failed, either the input matrix was zero (so m_cholmodFactor == nullptr), or minor is the
333
+ // column at which it failed. On success minor == n.
334
+ this->m_info =
335
+ (m_cholmodFactor != nullptr && m_cholmodFactor->minor == m_cholmodFactor->n ? Success : NumericalIssue);
336
+ m_factorizationIsOk = true;
337
+ }
295
338
 
296
- this->m_isInitialized = true;
297
- this->m_info = Success;
298
- m_analysisIsOk = true;
299
- m_factorizationIsOk = false;
339
+ /** Returns a reference to the Cholmod's configuration structure to get a full control over the performed operations.
340
+ * See the Cholmod user guide for details. */
341
+ cholmod_common& cholmod() { return m_cholmod; }
342
+
343
+ #ifndef EIGEN_PARSED_BY_DOXYGEN
344
+ /** \internal */
345
+ template <typename Rhs, typename Dest>
346
+ void _solve_impl(const MatrixBase<Rhs>& b, MatrixBase<Dest>& dest) const {
347
+ eigen_assert(m_factorizationIsOk &&
348
+ "The decomposition is not in a valid state for solving, you must first call either compute() or "
349
+ "symbolic()/numeric()");
350
+ const Index size = m_cholmodFactor->n;
351
+ EIGEN_UNUSED_VARIABLE(size);
352
+ eigen_assert(size == b.rows());
353
+
354
+ // Cholmod needs column-major storage without inner-stride, which corresponds to the default behavior of Ref.
355
+ Ref<const Matrix<typename Rhs::Scalar, Dynamic, Dynamic, ColMajor> > b_ref(b.derived());
356
+
357
+ cholmod_dense b_cd = viewAsCholmod(b_ref);
358
+ cholmod_dense* x_cd = internal::cm_solve<StorageIndex>(CHOLMOD_A, *m_cholmodFactor, b_cd, m_cholmod);
359
+ if (!x_cd) {
360
+ this->m_info = NumericalIssue;
361
+ return;
300
362
  }
363
+ // TODO optimize this copy by swapping when possible (be careful with alignment, etc.)
364
+ // NOTE Actually, the copy can be avoided by calling cholmod_solve2 instead of cholmod_solve
365
+ dest = Matrix<Scalar, Dest::RowsAtCompileTime, Dest::ColsAtCompileTime>::Map(reinterpret_cast<Scalar*>(x_cd->x),
366
+ b.rows(), b.cols());
367
+ internal::cm_free_dense<StorageIndex>(x_cd, m_cholmod);
368
+ }
301
369
 
302
- /** Performs a numeric decomposition of \a matrix
303
- *
304
- * The given matrix must have the same sparsity pattern as the matrix on which the symbolic decomposition has been performed.
305
- *
306
- * \sa analyzePattern()
307
- */
308
- void factorize(const MatrixType& matrix)
309
- {
310
- eigen_assert(m_analysisIsOk && "You must first call analyzePattern()");
311
- cholmod_sparse A = viewAsCholmod(matrix.template selfadjointView<UpLo>());
312
- internal::cm_factorize_p<StorageIndex>(&A, m_shiftOffset, 0, 0, m_cholmodFactor, m_cholmod);
313
-
314
- // If the factorization failed, minor is the column at which it did. On success minor == n.
315
- this->m_info = (m_cholmodFactor->minor == m_cholmodFactor->n ? Success : NumericalIssue);
316
- m_factorizationIsOk = true;
370
+ /** \internal */
371
+ template <typename RhsDerived, typename DestDerived>
372
+ void _solve_impl(const SparseMatrixBase<RhsDerived>& b, SparseMatrixBase<DestDerived>& dest) const {
373
+ eigen_assert(m_factorizationIsOk &&
374
+ "The decomposition is not in a valid state for solving, you must first call either compute() or "
375
+ "symbolic()/numeric()");
376
+ const Index size = m_cholmodFactor->n;
377
+ EIGEN_UNUSED_VARIABLE(size);
378
+ eigen_assert(size == b.rows());
379
+
380
+ // note: cs stands for Cholmod Sparse
381
+ Ref<SparseMatrix<typename RhsDerived::Scalar, ColMajor, typename RhsDerived::StorageIndex> > b_ref(
382
+ b.const_cast_derived());
383
+ cholmod_sparse b_cs = viewAsCholmod(b_ref);
384
+ cholmod_sparse* x_cs = internal::cm_spsolve<StorageIndex>(CHOLMOD_A, *m_cholmodFactor, b_cs, m_cholmod);
385
+ if (!x_cs) {
386
+ this->m_info = NumericalIssue;
387
+ return;
317
388
  }
389
+ // TODO optimize this copy by swapping when possible (be careful with alignment, etc.)
390
+ // NOTE cholmod_spsolve in fact just calls the dense solver for blocks of 4 columns at a time (similar to Eigen's
391
+ // sparse solver)
392
+ dest.derived() = viewAsEigen<typename DestDerived::Scalar, typename DestDerived::StorageIndex>(*x_cs);
393
+ internal::cm_free_sparse<StorageIndex>(x_cs, m_cholmod);
394
+ }
395
+ #endif // EIGEN_PARSED_BY_DOXYGEN
396
+
397
+ /** Sets the shift parameter that will be used to adjust the diagonal coefficients during the numerical factorization.
398
+ *
399
+ * During the numerical factorization, an offset term is added to the diagonal coefficients:\n
400
+ * \c d_ii = \a offset + \c d_ii
401
+ *
402
+ * The default is \a offset=0.
403
+ *
404
+ * \returns a reference to \c *this.
405
+ */
406
+ Derived& setShift(const RealScalar& offset) {
407
+ m_shiftOffset[0] = double(offset);
408
+ return derived();
409
+ }
318
410
 
319
- /** Returns a reference to the Cholmod's configuration structure to get a full control over the performed operations.
320
- * See the Cholmod user guide for details. */
321
- cholmod_common& cholmod() { return m_cholmod; }
322
-
323
- #ifndef EIGEN_PARSED_BY_DOXYGEN
324
- /** \internal */
325
- template<typename Rhs,typename Dest>
326
- void _solve_impl(const MatrixBase<Rhs> &b, MatrixBase<Dest> &dest) const
327
- {
328
- eigen_assert(m_factorizationIsOk && "The decomposition is not in a valid state for solving, you must first call either compute() or symbolic()/numeric()");
329
- const Index size = m_cholmodFactor->n;
330
- EIGEN_UNUSED_VARIABLE(size);
331
- eigen_assert(size==b.rows());
332
-
333
- // Cholmod needs column-major storage without inner-stride, which corresponds to the default behavior of Ref.
334
- Ref<const Matrix<typename Rhs::Scalar,Dynamic,Dynamic,ColMajor> > b_ref(b.derived());
335
-
336
- cholmod_dense b_cd = viewAsCholmod(b_ref);
337
- cholmod_dense* x_cd = internal::cm_solve<StorageIndex>(CHOLMOD_A, *m_cholmodFactor, b_cd, m_cholmod);
338
- if(!x_cd)
339
- {
340
- this->m_info = NumericalIssue;
341
- return;
342
- }
343
- // TODO optimize this copy by swapping when possible (be careful with alignment, etc.)
344
- // NOTE Actually, the copy can be avoided by calling cholmod_solve2 instead of cholmod_solve
345
- dest = Matrix<Scalar,Dest::RowsAtCompileTime,Dest::ColsAtCompileTime>::Map(reinterpret_cast<Scalar*>(x_cd->x),b.rows(),b.cols());
346
- internal::cm_free_dense<StorageIndex>(x_cd, m_cholmod);
347
- }
411
+ /** \returns the determinant of the underlying matrix from the current factorization */
412
+ Scalar determinant() const {
413
+ using std::exp;
414
+ return exp(logDeterminant());
415
+ }
348
416
 
349
- /** \internal */
350
- template<typename RhsDerived, typename DestDerived>
351
- void _solve_impl(const SparseMatrixBase<RhsDerived> &b, SparseMatrixBase<DestDerived> &dest) const
352
- {
353
- eigen_assert(m_factorizationIsOk && "The decomposition is not in a valid state for solving, you must first call either compute() or symbolic()/numeric()");
354
- const Index size = m_cholmodFactor->n;
355
- EIGEN_UNUSED_VARIABLE(size);
356
- eigen_assert(size==b.rows());
357
-
358
- // note: cs stands for Cholmod Sparse
359
- Ref<SparseMatrix<typename RhsDerived::Scalar,ColMajor,typename RhsDerived::StorageIndex> > b_ref(b.const_cast_derived());
360
- cholmod_sparse b_cs = viewAsCholmod(b_ref);
361
- cholmod_sparse* x_cs = internal::cm_spsolve<StorageIndex>(CHOLMOD_A, *m_cholmodFactor, b_cs, m_cholmod);
362
- if(!x_cs)
363
- {
364
- this->m_info = NumericalIssue;
365
- return;
417
+ /** \returns the log determinant of the underlying matrix from the current factorization */
418
+ Scalar logDeterminant() const {
419
+ using numext::real;
420
+ using std::log;
421
+ eigen_assert(m_factorizationIsOk &&
422
+ "The decomposition is not in a valid state for solving, you must first call either compute() or "
423
+ "symbolic()/numeric()");
424
+
425
+ RealScalar logDet = 0;
426
+ Scalar* x = static_cast<Scalar*>(m_cholmodFactor->x);
427
+ if (m_cholmodFactor->is_super) {
428
+ // Supernodal factorization stored as a packed list of dense column-major blocks,
429
+ // as described by the following structure:
430
+
431
+ // super[k] == index of the first column of the j-th super node
432
+ StorageIndex* super = static_cast<StorageIndex*>(m_cholmodFactor->super);
433
+ // pi[k] == offset to the description of row indices
434
+ StorageIndex* pi = static_cast<StorageIndex*>(m_cholmodFactor->pi);
435
+ // px[k] == offset to the respective dense block
436
+ StorageIndex* px = static_cast<StorageIndex*>(m_cholmodFactor->px);
437
+
438
+ Index nb_super_nodes = m_cholmodFactor->nsuper;
439
+ for (Index k = 0; k < nb_super_nodes; ++k) {
440
+ StorageIndex ncols = super[k + 1] - super[k];
441
+ StorageIndex nrows = pi[k + 1] - pi[k];
442
+
443
+ Map<const Array<Scalar, 1, Dynamic>, 0, InnerStride<> > sk(x + px[k], ncols, InnerStride<>(nrows + 1));
444
+ logDet += sk.real().log().sum();
366
445
  }
367
- // TODO optimize this copy by swapping when possible (be careful with alignment, etc.)
368
- // NOTE cholmod_spsolve in fact just calls the dense solver for blocks of 4 columns at a time (similar to Eigen's sparse solver)
369
- dest.derived() = viewAsEigen<typename DestDerived::Scalar,ColMajor,typename DestDerived::StorageIndex>(*x_cs);
370
- internal::cm_free_sparse<StorageIndex>(x_cs, m_cholmod);
371
- }
372
- #endif // EIGEN_PARSED_BY_DOXYGEN
373
-
374
-
375
- /** Sets the shift parameter that will be used to adjust the diagonal coefficients during the numerical factorization.
376
- *
377
- * During the numerical factorization, an offset term is added to the diagonal coefficients:\n
378
- * \c d_ii = \a offset + \c d_ii
379
- *
380
- * The default is \a offset=0.
381
- *
382
- * \returns a reference to \c *this.
383
- */
384
- Derived& setShift(const RealScalar& offset)
385
- {
386
- m_shiftOffset[0] = double(offset);
387
- return derived();
446
+ } else {
447
+ // Simplicial factorization stored as standard CSC matrix.
448
+ StorageIndex* p = static_cast<StorageIndex*>(m_cholmodFactor->p);
449
+ Index size = m_cholmodFactor->n;
450
+ for (Index k = 0; k < size; ++k) logDet += log(real(x[p[k]]));
388
451
  }
452
+ if (m_cholmodFactor->is_ll) logDet *= 2.0;
453
+ return logDet;
454
+ }
389
455
 
390
- /** \returns the determinant of the underlying matrix from the current factorization */
391
- Scalar determinant() const
392
- {
393
- using std::exp;
394
- return exp(logDeterminant());
395
- }
456
+ template <typename Stream>
457
+ void dumpMemory(Stream& /*s*/) {}
396
458
 
397
- /** \returns the log determinant of the underlying matrix from the current factorization */
398
- Scalar logDeterminant() const
399
- {
400
- using std::log;
401
- using numext::real;
402
- eigen_assert(m_factorizationIsOk && "The decomposition is not in a valid state for solving, you must first call either compute() or symbolic()/numeric()");
403
-
404
- RealScalar logDet = 0;
405
- Scalar *x = static_cast<Scalar*>(m_cholmodFactor->x);
406
- if (m_cholmodFactor->is_super)
407
- {
408
- // Supernodal factorization stored as a packed list of dense column-major blocs,
409
- // as described by the following structure:
410
-
411
- // super[k] == index of the first column of the j-th super node
412
- StorageIndex *super = static_cast<StorageIndex*>(m_cholmodFactor->super);
413
- // pi[k] == offset to the description of row indices
414
- StorageIndex *pi = static_cast<StorageIndex*>(m_cholmodFactor->pi);
415
- // px[k] == offset to the respective dense block
416
- StorageIndex *px = static_cast<StorageIndex*>(m_cholmodFactor->px);
417
-
418
- Index nb_super_nodes = m_cholmodFactor->nsuper;
419
- for (Index k=0; k < nb_super_nodes; ++k)
420
- {
421
- StorageIndex ncols = super[k + 1] - super[k];
422
- StorageIndex nrows = pi[k + 1] - pi[k];
423
-
424
- Map<const Array<Scalar,1,Dynamic>, 0, InnerStride<> > sk(x + px[k], ncols, InnerStride<>(nrows+1));
425
- logDet += sk.real().log().sum();
426
- }
427
- }
428
- else
429
- {
430
- // Simplicial factorization stored as standard CSC matrix.
431
- StorageIndex *p = static_cast<StorageIndex*>(m_cholmodFactor->p);
432
- Index size = m_cholmodFactor->n;
433
- for (Index k=0; k<size; ++k)
434
- logDet += log(real( x[p[k]] ));
435
- }
436
- if (m_cholmodFactor->is_ll)
437
- logDet *= 2.0;
438
- return logDet;
439
- };
440
-
441
- template<typename Stream>
442
- void dumpMemory(Stream& /*s*/)
443
- {}
444
-
445
- protected:
446
- mutable cholmod_common m_cholmod;
447
- cholmod_factor* m_cholmodFactor;
448
- double m_shiftOffset[2];
449
- mutable ComputationInfo m_info;
450
- int m_factorizationIsOk;
451
- int m_analysisIsOk;
459
+ protected:
460
+ mutable cholmod_common m_cholmod;
461
+ cholmod_factor* m_cholmodFactor;
462
+ double m_shiftOffset[2];
463
+ mutable ComputationInfo m_info;
464
+ int m_factorizationIsOk;
465
+ int m_analysisIsOk;
452
466
  };
453
467
 
454
468
  /** \ingroup CholmodSupport_Module
455
- * \class CholmodSimplicialLLT
456
- * \brief A simplicial direct Cholesky (LLT) factorization and solver based on Cholmod
457
- *
458
- * This class allows to solve for A.X = B sparse linear problems via a simplicial LL^T Cholesky factorization
459
- * using the Cholmod library.
460
- * This simplicial variant is equivalent to Eigen's built-in SimplicialLLT class. Therefore, it has little practical interest.
461
- * The sparse matrix A must be selfadjoint and positive definite. The vectors or matrices
462
- * X and B can be either dense or sparse.
463
- *
464
- * \tparam _MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>
465
- * \tparam _UpLo the triangular part that will be used for the computations. It can be Lower
466
- * or Upper. Default is Lower.
467
- *
468
- * \implsparsesolverconcept
469
- *
470
- * This class supports all kind of SparseMatrix<>: row or column major; upper, lower, or both; compressed or non compressed.
471
- *
472
- * \warning Only double precision real and complex scalar types are supported by Cholmod.
473
- *
474
- * \sa \ref TutorialSparseSolverConcept, class CholmodSupernodalLLT, class SimplicialLLT
475
- */
476
- template<typename _MatrixType, int _UpLo = Lower>
477
- class CholmodSimplicialLLT : public CholmodBase<_MatrixType, _UpLo, CholmodSimplicialLLT<_MatrixType, _UpLo> >
478
- {
479
- typedef CholmodBase<_MatrixType, _UpLo, CholmodSimplicialLLT> Base;
480
- using Base::m_cholmod;
481
-
482
- public:
483
-
484
- typedef _MatrixType MatrixType;
485
-
486
- CholmodSimplicialLLT() : Base() { init(); }
487
-
488
- CholmodSimplicialLLT(const MatrixType& matrix) : Base()
489
- {
490
- init();
491
- this->compute(matrix);
492
- }
469
+ * \class CholmodSimplicialLLT
470
+ * \brief A simplicial direct Cholesky (LLT) factorization and solver based on Cholmod
471
+ *
472
+ * This class allows to solve for A.X = B sparse linear problems via a simplicial LL^T Cholesky factorization
473
+ * using the Cholmod library.
474
+ * This simplicial variant is equivalent to Eigen's built-in SimplicialLLT class. Therefore, it has little practical
475
+ * interest. The sparse matrix A must be selfadjoint and positive definite. The vectors or matrices X and B can be
476
+ * either dense or sparse.
477
+ *
478
+ * \tparam MatrixType_ the type of the sparse matrix A, it must be a SparseMatrix<>
479
+ * \tparam UpLo_ the triangular part that will be used for the computations. It can be Lower
480
+ * or Upper. Default is Lower.
481
+ *
482
+ * \implsparsesolverconcept
483
+ *
484
+ * This class supports all kind of SparseMatrix<>: row or column major; upper, lower, or both; compressed or non
485
+ * compressed.
486
+ *
487
+ * \warning Only double precision real and complex scalar types are supported by Cholmod.
488
+ *
489
+ * \sa \ref TutorialSparseSolverConcept, class CholmodSupernodalLLT, class SimplicialLLT
490
+ */
491
+ template <typename MatrixType_, int UpLo_ = Lower>
492
+ class CholmodSimplicialLLT : public CholmodBase<MatrixType_, UpLo_, CholmodSimplicialLLT<MatrixType_, UpLo_> > {
493
+ typedef CholmodBase<MatrixType_, UpLo_, CholmodSimplicialLLT> Base;
494
+ using Base::m_cholmod;
495
+
496
+ public:
497
+ typedef MatrixType_ MatrixType;
498
+ typedef typename MatrixType::Scalar Scalar;
499
+ typedef typename MatrixType::RealScalar RealScalar;
500
+ typedef typename MatrixType::StorageIndex StorageIndex;
501
+ typedef TriangularView<const MatrixType, Eigen::Lower> MatrixL;
502
+ typedef TriangularView<const typename MatrixType::AdjointReturnType, Eigen::Upper> MatrixU;
503
+
504
+ CholmodSimplicialLLT() : Base() { init(); }
505
+
506
+ CholmodSimplicialLLT(const MatrixType& matrix) : Base() {
507
+ init();
508
+ this->compute(matrix);
509
+ }
493
510
 
494
- ~CholmodSimplicialLLT() {}
495
- protected:
496
- void init()
497
- {
498
- m_cholmod.final_asis = 0;
499
- m_cholmod.supernodal = CHOLMOD_SIMPLICIAL;
500
- m_cholmod.final_ll = 1;
501
- }
502
- };
511
+ ~CholmodSimplicialLLT() {}
512
+
513
+ /** \returns an expression of the factor L */
514
+ inline MatrixL matrixL() const { return viewAsEigen<Scalar, StorageIndex>(*Base::m_cholmodFactor); }
503
515
 
516
+ /** \returns an expression of the factor U (= L^*) */
517
+ inline MatrixU matrixU() const { return matrixL().adjoint(); }
518
+
519
+ protected:
520
+ void init() {
521
+ m_cholmod.final_asis = 0;
522
+ m_cholmod.supernodal = CHOLMOD_SIMPLICIAL;
523
+ m_cholmod.final_ll = 1;
524
+ }
525
+ };
504
526
 
505
527
  /** \ingroup CholmodSupport_Module
506
- * \class CholmodSimplicialLDLT
507
- * \brief A simplicial direct Cholesky (LDLT) factorization and solver based on Cholmod
508
- *
509
- * This class allows to solve for A.X = B sparse linear problems via a simplicial LDL^T Cholesky factorization
510
- * using the Cholmod library.
511
- * This simplicial variant is equivalent to Eigen's built-in SimplicialLDLT class. Therefore, it has little practical interest.
512
- * The sparse matrix A must be selfadjoint and positive definite. The vectors or matrices
513
- * X and B can be either dense or sparse.
514
- *
515
- * \tparam _MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>
516
- * \tparam _UpLo the triangular part that will be used for the computations. It can be Lower
517
- * or Upper. Default is Lower.
518
- *
519
- * \implsparsesolverconcept
520
- *
521
- * This class supports all kind of SparseMatrix<>: row or column major; upper, lower, or both; compressed or non compressed.
522
- *
523
- * \warning Only double precision real and complex scalar types are supported by Cholmod.
524
- *
525
- * \sa \ref TutorialSparseSolverConcept, class CholmodSupernodalLLT, class SimplicialLDLT
526
- */
527
- template<typename _MatrixType, int _UpLo = Lower>
528
- class CholmodSimplicialLDLT : public CholmodBase<_MatrixType, _UpLo, CholmodSimplicialLDLT<_MatrixType, _UpLo> >
529
- {
530
- typedef CholmodBase<_MatrixType, _UpLo, CholmodSimplicialLDLT> Base;
531
- using Base::m_cholmod;
532
-
533
- public:
534
-
535
- typedef _MatrixType MatrixType;
536
-
537
- CholmodSimplicialLDLT() : Base() { init(); }
538
-
539
- CholmodSimplicialLDLT(const MatrixType& matrix) : Base()
540
- {
541
- init();
542
- this->compute(matrix);
543
- }
528
+ * \class CholmodSimplicialLDLT
529
+ * \brief A simplicial direct Cholesky (LDLT) factorization and solver based on Cholmod
530
+ *
531
+ * This class allows to solve for A.X = B sparse linear problems via a simplicial LDL^T Cholesky factorization
532
+ * using the Cholmod library.
533
+ * This simplicial variant is equivalent to Eigen's built-in SimplicialLDLT class. Therefore, it has little practical
534
+ * interest. The sparse matrix A must be selfadjoint and positive definite. The vectors or matrices X and B can be
535
+ * either dense or sparse.
536
+ *
537
+ * \tparam MatrixType_ the type of the sparse matrix A, it must be a SparseMatrix<>
538
+ * \tparam UpLo_ the triangular part that will be used for the computations. It can be Lower
539
+ * or Upper. Default is Lower.
540
+ *
541
+ * \implsparsesolverconcept
542
+ *
543
+ * This class supports all kind of SparseMatrix<>: row or column major; upper, lower, or both; compressed or non
544
+ * compressed.
545
+ *
546
+ * \warning Only double precision real and complex scalar types are supported by Cholmod.
547
+ *
548
+ * \sa \ref TutorialSparseSolverConcept, class CholmodSupernodalLLT, class SimplicialLDLT
549
+ */
550
+ template <typename MatrixType_, int UpLo_ = Lower>
551
+ class CholmodSimplicialLDLT : public CholmodBase<MatrixType_, UpLo_, CholmodSimplicialLDLT<MatrixType_, UpLo_> > {
552
+ typedef CholmodBase<MatrixType_, UpLo_, CholmodSimplicialLDLT> Base;
553
+ using Base::m_cholmod;
554
+
555
+ public:
556
+ typedef MatrixType_ MatrixType;
557
+ typedef typename MatrixType::Scalar Scalar;
558
+ typedef typename MatrixType::RealScalar RealScalar;
559
+ typedef typename MatrixType::StorageIndex StorageIndex;
560
+ typedef Matrix<Scalar, Dynamic, 1> VectorType;
561
+ typedef TriangularView<const MatrixType, Eigen::UnitLower> MatrixL;
562
+ typedef TriangularView<const typename MatrixType::AdjointReturnType, Eigen::UnitUpper> MatrixU;
563
+
564
+ CholmodSimplicialLDLT() : Base() { init(); }
565
+
566
+ CholmodSimplicialLDLT(const MatrixType& matrix) : Base() {
567
+ init();
568
+ this->compute(matrix);
569
+ }
570
+
571
+ ~CholmodSimplicialLDLT() {}
572
+
573
+ /** \returns a vector expression of the diagonal D */
574
+ inline VectorType vectorD() const {
575
+ auto cholmodL = viewAsEigen<Scalar, StorageIndex>(*Base::m_cholmodFactor);
544
576
 
545
- ~CholmodSimplicialLDLT() {}
546
- protected:
547
- void init()
548
- {
549
- m_cholmod.final_asis = 1;
550
- m_cholmod.supernodal = CHOLMOD_SIMPLICIAL;
577
+ VectorType D{cholmodL.rows()};
578
+
579
+ for (Index k = 0; k < cholmodL.outerSize(); ++k) {
580
+ typename decltype(cholmodL)::InnerIterator it{cholmodL, k};
581
+ D(k) = it.value();
551
582
  }
583
+
584
+ return D;
585
+ }
586
+
587
+ /** \returns an expression of the factor L */
588
+ inline MatrixL matrixL() const { return viewAsEigen<Scalar, StorageIndex>(*Base::m_cholmodFactor); }
589
+
590
+ /** \returns an expression of the factor U (= L^*) */
591
+ inline MatrixU matrixU() const { return matrixL().adjoint(); }
592
+
593
+ protected:
594
+ void init() {
595
+ m_cholmod.final_asis = 1;
596
+ m_cholmod.supernodal = CHOLMOD_SIMPLICIAL;
597
+ }
552
598
  };
553
599
 
554
600
  /** \ingroup CholmodSupport_Module
555
- * \class CholmodSupernodalLLT
556
- * \brief A supernodal Cholesky (LLT) factorization and solver based on Cholmod
557
- *
558
- * This class allows to solve for A.X = B sparse linear problems via a supernodal LL^T Cholesky factorization
559
- * using the Cholmod library.
560
- * This supernodal variant performs best on dense enough problems, e.g., 3D FEM, or very high order 2D FEM.
561
- * The sparse matrix A must be selfadjoint and positive definite. The vectors or matrices
562
- * X and B can be either dense or sparse.
563
- *
564
- * \tparam _MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>
565
- * \tparam _UpLo the triangular part that will be used for the computations. It can be Lower
566
- * or Upper. Default is Lower.
567
- *
568
- * \implsparsesolverconcept
569
- *
570
- * This class supports all kind of SparseMatrix<>: row or column major; upper, lower, or both; compressed or non compressed.
571
- *
572
- * \warning Only double precision real and complex scalar types are supported by Cholmod.
573
- *
574
- * \sa \ref TutorialSparseSolverConcept
575
- */
576
- template<typename _MatrixType, int _UpLo = Lower>
577
- class CholmodSupernodalLLT : public CholmodBase<_MatrixType, _UpLo, CholmodSupernodalLLT<_MatrixType, _UpLo> >
578
- {
579
- typedef CholmodBase<_MatrixType, _UpLo, CholmodSupernodalLLT> Base;
580
- using Base::m_cholmod;
581
-
582
- public:
583
-
584
- typedef _MatrixType MatrixType;
585
-
586
- CholmodSupernodalLLT() : Base() { init(); }
587
-
588
- CholmodSupernodalLLT(const MatrixType& matrix) : Base()
589
- {
590
- init();
591
- this->compute(matrix);
592
- }
601
+ * \class CholmodSupernodalLLT
602
+ * \brief A supernodal Cholesky (LLT) factorization and solver based on Cholmod
603
+ *
604
+ * This class allows to solve for A.X = B sparse linear problems via a supernodal LL^T Cholesky factorization
605
+ * using the Cholmod library.
606
+ * This supernodal variant performs best on dense enough problems, e.g., 3D FEM, or very high order 2D FEM.
607
+ * The sparse matrix A must be selfadjoint and positive definite. The vectors or matrices
608
+ * X and B can be either dense or sparse.
609
+ *
610
+ * \tparam MatrixType_ the type of the sparse matrix A, it must be a SparseMatrix<>
611
+ * \tparam UpLo_ the triangular part that will be used for the computations. It can be Lower
612
+ * or Upper. Default is Lower.
613
+ *
614
+ * \implsparsesolverconcept
615
+ *
616
+ * This class supports all kind of SparseMatrix<>: row or column major; upper, lower, or both; compressed or non
617
+ * compressed.
618
+ *
619
+ * \warning Only double precision real and complex scalar types are supported by Cholmod.
620
+ *
621
+ * \sa \ref TutorialSparseSolverConcept
622
+ */
623
+ template <typename MatrixType_, int UpLo_ = Lower>
624
+ class CholmodSupernodalLLT : public CholmodBase<MatrixType_, UpLo_, CholmodSupernodalLLT<MatrixType_, UpLo_> > {
625
+ typedef CholmodBase<MatrixType_, UpLo_, CholmodSupernodalLLT> Base;
626
+ using Base::m_cholmod;
627
+
628
+ public:
629
+ typedef MatrixType_ MatrixType;
630
+ typedef typename MatrixType::Scalar Scalar;
631
+ typedef typename MatrixType::RealScalar RealScalar;
632
+ typedef typename MatrixType::StorageIndex StorageIndex;
633
+
634
+ CholmodSupernodalLLT() : Base() { init(); }
635
+
636
+ CholmodSupernodalLLT(const MatrixType& matrix) : Base() {
637
+ init();
638
+ this->compute(matrix);
639
+ }
593
640
 
594
- ~CholmodSupernodalLLT() {}
595
- protected:
596
- void init()
597
- {
598
- m_cholmod.final_asis = 1;
599
- m_cholmod.supernodal = CHOLMOD_SUPERNODAL;
600
- }
641
+ ~CholmodSupernodalLLT() {}
642
+
643
+ /** \returns an expression of the factor L */
644
+ inline MatrixType matrixL() const {
645
+ // Convert Cholmod factor's supernodal storage format to Eigen's CSC storage format
646
+ cholmod_sparse* cholmodL = internal::cm_factor_to_sparse(*Base::m_cholmodFactor, m_cholmod);
647
+ MatrixType L = viewAsEigen<Scalar, StorageIndex>(*cholmodL);
648
+ internal::cm_free_sparse<StorageIndex>(cholmodL, m_cholmod);
649
+
650
+ return L;
651
+ }
652
+
653
+ /** \returns an expression of the factor U (= L^*) */
654
+ inline MatrixType matrixU() const { return matrixL().adjoint(); }
655
+
656
+ protected:
657
+ void init() {
658
+ m_cholmod.final_asis = 1;
659
+ m_cholmod.supernodal = CHOLMOD_SUPERNODAL;
660
+ }
601
661
  };
602
662
 
603
663
  /** \ingroup CholmodSupport_Module
604
- * \class CholmodDecomposition
605
- * \brief A general Cholesky factorization and solver based on Cholmod
606
- *
607
- * This class allows to solve for A.X = B sparse linear problems via a LL^T or LDL^T Cholesky factorization
608
- * using the Cholmod library. The sparse matrix A must be selfadjoint and positive definite. The vectors or matrices
609
- * X and B can be either dense or sparse.
610
- *
611
- * This variant permits to change the underlying Cholesky method at runtime.
612
- * On the other hand, it does not provide access to the result of the factorization.
613
- * The default is to let Cholmod automatically choose between a simplicial and supernodal factorization.
614
- *
615
- * \tparam _MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>
616
- * \tparam _UpLo the triangular part that will be used for the computations. It can be Lower
617
- * or Upper. Default is Lower.
618
- *
619
- * \implsparsesolverconcept
620
- *
621
- * This class supports all kind of SparseMatrix<>: row or column major; upper, lower, or both; compressed or non compressed.
622
- *
623
- * \warning Only double precision real and complex scalar types are supported by Cholmod.
624
- *
625
- * \sa \ref TutorialSparseSolverConcept
626
- */
627
- template<typename _MatrixType, int _UpLo = Lower>
628
- class CholmodDecomposition : public CholmodBase<_MatrixType, _UpLo, CholmodDecomposition<_MatrixType, _UpLo> >
629
- {
630
- typedef CholmodBase<_MatrixType, _UpLo, CholmodDecomposition> Base;
631
- using Base::m_cholmod;
632
-
633
- public:
634
-
635
- typedef _MatrixType MatrixType;
636
-
637
- CholmodDecomposition() : Base() { init(); }
638
-
639
- CholmodDecomposition(const MatrixType& matrix) : Base()
640
- {
641
- init();
642
- this->compute(matrix);
643
- }
664
+ * \class CholmodDecomposition
665
+ * \brief A general Cholesky factorization and solver based on Cholmod
666
+ *
667
+ * This class allows to solve for A.X = B sparse linear problems via a LL^T or LDL^T Cholesky factorization
668
+ * using the Cholmod library. The sparse matrix A must be selfadjoint and positive definite. The vectors or matrices
669
+ * X and B can be either dense or sparse.
670
+ *
671
+ * This variant permits to change the underlying Cholesky method at runtime.
672
+ * On the other hand, it does not provide access to the result of the factorization.
673
+ * The default is to let Cholmod automatically choose between a simplicial and supernodal factorization.
674
+ *
675
+ * \tparam MatrixType_ the type of the sparse matrix A, it must be a SparseMatrix<>
676
+ * \tparam UpLo_ the triangular part that will be used for the computations. It can be Lower
677
+ * or Upper. Default is Lower.
678
+ *
679
+ * \implsparsesolverconcept
680
+ *
681
+ * This class supports all kind of SparseMatrix<>: row or column major; upper, lower, or both; compressed or non
682
+ * compressed.
683
+ *
684
+ * \warning Only double precision real and complex scalar types are supported by Cholmod.
685
+ *
686
+ * \sa \ref TutorialSparseSolverConcept
687
+ */
688
+ template <typename MatrixType_, int UpLo_ = Lower>
689
+ class CholmodDecomposition : public CholmodBase<MatrixType_, UpLo_, CholmodDecomposition<MatrixType_, UpLo_> > {
690
+ typedef CholmodBase<MatrixType_, UpLo_, CholmodDecomposition> Base;
691
+ using Base::m_cholmod;
692
+
693
+ public:
694
+ typedef MatrixType_ MatrixType;
695
+
696
+ CholmodDecomposition() : Base() { init(); }
697
+
698
+ CholmodDecomposition(const MatrixType& matrix) : Base() {
699
+ init();
700
+ this->compute(matrix);
701
+ }
644
702
 
645
- ~CholmodDecomposition() {}
646
-
647
- void setMode(CholmodMode mode)
648
- {
649
- switch(mode)
650
- {
651
- case CholmodAuto:
652
- m_cholmod.final_asis = 1;
653
- m_cholmod.supernodal = CHOLMOD_AUTO;
654
- break;
655
- case CholmodSimplicialLLt:
656
- m_cholmod.final_asis = 0;
657
- m_cholmod.supernodal = CHOLMOD_SIMPLICIAL;
658
- m_cholmod.final_ll = 1;
659
- break;
660
- case CholmodSupernodalLLt:
661
- m_cholmod.final_asis = 1;
662
- m_cholmod.supernodal = CHOLMOD_SUPERNODAL;
663
- break;
664
- case CholmodLDLt:
665
- m_cholmod.final_asis = 1;
666
- m_cholmod.supernodal = CHOLMOD_SIMPLICIAL;
667
- break;
668
- default:
669
- break;
670
- }
671
- }
672
- protected:
673
- void init()
674
- {
675
- m_cholmod.final_asis = 1;
676
- m_cholmod.supernodal = CHOLMOD_AUTO;
703
+ ~CholmodDecomposition() {}
704
+
705
+ void setMode(CholmodMode mode) {
706
+ switch (mode) {
707
+ case CholmodAuto:
708
+ m_cholmod.final_asis = 1;
709
+ m_cholmod.supernodal = CHOLMOD_AUTO;
710
+ break;
711
+ case CholmodSimplicialLLt:
712
+ m_cholmod.final_asis = 0;
713
+ m_cholmod.supernodal = CHOLMOD_SIMPLICIAL;
714
+ m_cholmod.final_ll = 1;
715
+ break;
716
+ case CholmodSupernodalLLt:
717
+ m_cholmod.final_asis = 1;
718
+ m_cholmod.supernodal = CHOLMOD_SUPERNODAL;
719
+ break;
720
+ case CholmodLDLt:
721
+ m_cholmod.final_asis = 1;
722
+ m_cholmod.supernodal = CHOLMOD_SIMPLICIAL;
723
+ break;
724
+ default:
725
+ break;
677
726
  }
727
+ }
728
+
729
+ protected:
730
+ void init() {
731
+ m_cholmod.final_asis = 1;
732
+ m_cholmod.supernodal = CHOLMOD_AUTO;
733
+ }
678
734
  };
679
735
 
680
- } // end namespace Eigen
736
+ } // end namespace Eigen
681
737
 
682
- #endif // EIGEN_CHOLMODSUPPORT_H
738
+ #endif // EIGEN_CHOLMODSUPPORT_H