@smake/eigen 1.0.2 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (435) hide show
  1. package/README.md +1 -1
  2. package/eigen/Eigen/AccelerateSupport +52 -0
  3. package/eigen/Eigen/Cholesky +18 -21
  4. package/eigen/Eigen/CholmodSupport +28 -28
  5. package/eigen/Eigen/Core +235 -326
  6. package/eigen/Eigen/Eigenvalues +16 -14
  7. package/eigen/Eigen/Geometry +21 -24
  8. package/eigen/Eigen/Householder +9 -8
  9. package/eigen/Eigen/IterativeLinearSolvers +8 -4
  10. package/eigen/Eigen/Jacobi +14 -14
  11. package/eigen/Eigen/KLUSupport +43 -0
  12. package/eigen/Eigen/LU +16 -20
  13. package/eigen/Eigen/MetisSupport +12 -12
  14. package/eigen/Eigen/OrderingMethods +54 -54
  15. package/eigen/Eigen/PaStiXSupport +23 -20
  16. package/eigen/Eigen/PardisoSupport +17 -14
  17. package/eigen/Eigen/QR +18 -21
  18. package/eigen/Eigen/QtAlignedMalloc +5 -13
  19. package/eigen/Eigen/SPQRSupport +21 -14
  20. package/eigen/Eigen/SVD +23 -18
  21. package/eigen/Eigen/Sparse +1 -4
  22. package/eigen/Eigen/SparseCholesky +18 -23
  23. package/eigen/Eigen/SparseCore +18 -17
  24. package/eigen/Eigen/SparseLU +12 -8
  25. package/eigen/Eigen/SparseQR +16 -14
  26. package/eigen/Eigen/StdDeque +5 -2
  27. package/eigen/Eigen/StdList +5 -2
  28. package/eigen/Eigen/StdVector +5 -2
  29. package/eigen/Eigen/SuperLUSupport +30 -24
  30. package/eigen/Eigen/ThreadPool +80 -0
  31. package/eigen/Eigen/UmfPackSupport +19 -17
  32. package/eigen/Eigen/Version +14 -0
  33. package/eigen/Eigen/src/AccelerateSupport/AccelerateSupport.h +423 -0
  34. package/eigen/Eigen/src/AccelerateSupport/InternalHeaderCheck.h +3 -0
  35. package/eigen/Eigen/src/Cholesky/InternalHeaderCheck.h +3 -0
  36. package/eigen/Eigen/src/Cholesky/LDLT.h +377 -401
  37. package/eigen/Eigen/src/Cholesky/LLT.h +332 -360
  38. package/eigen/Eigen/src/Cholesky/LLT_LAPACKE.h +81 -56
  39. package/eigen/Eigen/src/CholmodSupport/CholmodSupport.h +620 -521
  40. package/eigen/Eigen/src/CholmodSupport/InternalHeaderCheck.h +3 -0
  41. package/eigen/Eigen/src/Core/ArithmeticSequence.h +239 -0
  42. package/eigen/Eigen/src/Core/Array.h +341 -294
  43. package/eigen/Eigen/src/Core/ArrayBase.h +190 -203
  44. package/eigen/Eigen/src/Core/ArrayWrapper.h +127 -171
  45. package/eigen/Eigen/src/Core/Assign.h +30 -40
  46. package/eigen/Eigen/src/Core/AssignEvaluator.h +711 -589
  47. package/eigen/Eigen/src/Core/Assign_MKL.h +130 -125
  48. package/eigen/Eigen/src/Core/BandMatrix.h +268 -283
  49. package/eigen/Eigen/src/Core/Block.h +375 -398
  50. package/eigen/Eigen/src/Core/CommaInitializer.h +86 -97
  51. package/eigen/Eigen/src/Core/ConditionEstimator.h +51 -53
  52. package/eigen/Eigen/src/Core/CoreEvaluators.h +1356 -1026
  53. package/eigen/Eigen/src/Core/CoreIterators.h +73 -59
  54. package/eigen/Eigen/src/Core/CwiseBinaryOp.h +114 -132
  55. package/eigen/Eigen/src/Core/CwiseNullaryOp.h +726 -617
  56. package/eigen/Eigen/src/Core/CwiseTernaryOp.h +77 -103
  57. package/eigen/Eigen/src/Core/CwiseUnaryOp.h +56 -68
  58. package/eigen/Eigen/src/Core/CwiseUnaryView.h +132 -95
  59. package/eigen/Eigen/src/Core/DenseBase.h +632 -571
  60. package/eigen/Eigen/src/Core/DenseCoeffsBase.h +511 -624
  61. package/eigen/Eigen/src/Core/DenseStorage.h +512 -509
  62. package/eigen/Eigen/src/Core/DeviceWrapper.h +153 -0
  63. package/eigen/Eigen/src/Core/Diagonal.h +169 -210
  64. package/eigen/Eigen/src/Core/DiagonalMatrix.h +351 -274
  65. package/eigen/Eigen/src/Core/DiagonalProduct.h +12 -10
  66. package/eigen/Eigen/src/Core/Dot.h +172 -222
  67. package/eigen/Eigen/src/Core/EigenBase.h +75 -85
  68. package/eigen/Eigen/src/Core/Fill.h +138 -0
  69. package/eigen/Eigen/src/Core/FindCoeff.h +464 -0
  70. package/eigen/Eigen/src/Core/ForceAlignedAccess.h +90 -109
  71. package/eigen/Eigen/src/Core/Fuzzy.h +82 -105
  72. package/eigen/Eigen/src/Core/GeneralProduct.h +327 -263
  73. package/eigen/Eigen/src/Core/GenericPacketMath.h +1472 -360
  74. package/eigen/Eigen/src/Core/GlobalFunctions.h +194 -151
  75. package/eigen/Eigen/src/Core/IO.h +147 -139
  76. package/eigen/Eigen/src/Core/IndexedView.h +321 -0
  77. package/eigen/Eigen/src/Core/InnerProduct.h +260 -0
  78. package/eigen/Eigen/src/Core/InternalHeaderCheck.h +3 -0
  79. package/eigen/Eigen/src/Core/Inverse.h +56 -66
  80. package/eigen/Eigen/src/Core/Map.h +124 -142
  81. package/eigen/Eigen/src/Core/MapBase.h +256 -281
  82. package/eigen/Eigen/src/Core/MathFunctions.h +1620 -938
  83. package/eigen/Eigen/src/Core/MathFunctionsImpl.h +233 -71
  84. package/eigen/Eigen/src/Core/Matrix.h +491 -416
  85. package/eigen/Eigen/src/Core/MatrixBase.h +468 -453
  86. package/eigen/Eigen/src/Core/NestByValue.h +66 -85
  87. package/eigen/Eigen/src/Core/NoAlias.h +79 -85
  88. package/eigen/Eigen/src/Core/NumTraits.h +235 -148
  89. package/eigen/Eigen/src/Core/PartialReduxEvaluator.h +253 -0
  90. package/eigen/Eigen/src/Core/PermutationMatrix.h +461 -511
  91. package/eigen/Eigen/src/Core/PlainObjectBase.h +871 -894
  92. package/eigen/Eigen/src/Core/Product.h +260 -139
  93. package/eigen/Eigen/src/Core/ProductEvaluators.h +863 -714
  94. package/eigen/Eigen/src/Core/Random.h +161 -136
  95. package/eigen/Eigen/src/Core/RandomImpl.h +262 -0
  96. package/eigen/Eigen/src/Core/RealView.h +250 -0
  97. package/eigen/Eigen/src/Core/Redux.h +366 -336
  98. package/eigen/Eigen/src/Core/Ref.h +308 -209
  99. package/eigen/Eigen/src/Core/Replicate.h +94 -106
  100. package/eigen/Eigen/src/Core/Reshaped.h +398 -0
  101. package/eigen/Eigen/src/Core/ReturnByValue.h +49 -55
  102. package/eigen/Eigen/src/Core/Reverse.h +136 -145
  103. package/eigen/Eigen/src/Core/Select.h +70 -140
  104. package/eigen/Eigen/src/Core/SelfAdjointView.h +262 -285
  105. package/eigen/Eigen/src/Core/SelfCwiseBinaryOp.h +23 -20
  106. package/eigen/Eigen/src/Core/SkewSymmetricMatrix3.h +382 -0
  107. package/eigen/Eigen/src/Core/Solve.h +97 -111
  108. package/eigen/Eigen/src/Core/SolveTriangular.h +131 -129
  109. package/eigen/Eigen/src/Core/SolverBase.h +138 -101
  110. package/eigen/Eigen/src/Core/StableNorm.h +156 -160
  111. package/eigen/Eigen/src/Core/StlIterators.h +619 -0
  112. package/eigen/Eigen/src/Core/Stride.h +91 -88
  113. package/eigen/Eigen/src/Core/Swap.h +70 -38
  114. package/eigen/Eigen/src/Core/Transpose.h +295 -273
  115. package/eigen/Eigen/src/Core/Transpositions.h +272 -317
  116. package/eigen/Eigen/src/Core/TriangularMatrix.h +670 -755
  117. package/eigen/Eigen/src/Core/VectorBlock.h +59 -72
  118. package/eigen/Eigen/src/Core/VectorwiseOp.h +668 -630
  119. package/eigen/Eigen/src/Core/Visitor.h +480 -216
  120. package/eigen/Eigen/src/Core/arch/AVX/Complex.h +407 -293
  121. package/eigen/Eigen/src/Core/arch/AVX/MathFunctions.h +79 -388
  122. package/eigen/Eigen/src/Core/arch/AVX/PacketMath.h +2935 -491
  123. package/eigen/Eigen/src/Core/arch/AVX/Reductions.h +353 -0
  124. package/eigen/Eigen/src/Core/arch/AVX/TypeCasting.h +279 -22
  125. package/eigen/Eigen/src/Core/arch/AVX512/Complex.h +472 -0
  126. package/eigen/Eigen/src/Core/arch/AVX512/GemmKernel.h +1245 -0
  127. package/eigen/Eigen/src/Core/arch/AVX512/MathFunctions.h +85 -333
  128. package/eigen/Eigen/src/Core/arch/AVX512/MathFunctionsFP16.h +75 -0
  129. package/eigen/Eigen/src/Core/arch/AVX512/PacketMath.h +2490 -649
  130. package/eigen/Eigen/src/Core/arch/AVX512/PacketMathFP16.h +1413 -0
  131. package/eigen/Eigen/src/Core/arch/AVX512/Reductions.h +297 -0
  132. package/eigen/Eigen/src/Core/arch/AVX512/TrsmKernel.h +1167 -0
  133. package/eigen/Eigen/src/Core/arch/AVX512/TrsmUnrolls.inc +1219 -0
  134. package/eigen/Eigen/src/Core/arch/AVX512/TypeCasting.h +277 -0
  135. package/eigen/Eigen/src/Core/arch/AVX512/TypeCastingFP16.h +130 -0
  136. package/eigen/Eigen/src/Core/arch/AltiVec/Complex.h +521 -298
  137. package/eigen/Eigen/src/Core/arch/AltiVec/MathFunctions.h +39 -280
  138. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProduct.h +3686 -0
  139. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h +205 -0
  140. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductMMA.h +901 -0
  141. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductMMAbfloat16.h +742 -0
  142. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixVectorProduct.inc +2818 -0
  143. package/eigen/Eigen/src/Core/arch/AltiVec/PacketMath.h +3391 -723
  144. package/eigen/Eigen/src/Core/arch/AltiVec/TypeCasting.h +153 -0
  145. package/eigen/Eigen/src/Core/arch/Default/BFloat16.h +866 -0
  146. package/eigen/Eigen/src/Core/arch/Default/ConjHelper.h +113 -14
  147. package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h +2634 -0
  148. package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h +227 -0
  149. package/eigen/Eigen/src/Core/arch/Default/Half.h +1091 -0
  150. package/eigen/Eigen/src/Core/arch/Default/Settings.h +11 -13
  151. package/eigen/Eigen/src/Core/arch/GPU/Complex.h +244 -0
  152. package/eigen/Eigen/src/Core/arch/GPU/MathFunctions.h +104 -0
  153. package/eigen/Eigen/src/Core/arch/GPU/PacketMath.h +1712 -0
  154. package/eigen/Eigen/src/Core/arch/GPU/Tuple.h +268 -0
  155. package/eigen/Eigen/src/Core/arch/GPU/TypeCasting.h +77 -0
  156. package/eigen/Eigen/src/Core/arch/HIP/hcc/math_constants.h +23 -0
  157. package/eigen/Eigen/src/Core/arch/HVX/PacketMath.h +1088 -0
  158. package/eigen/Eigen/src/Core/arch/LSX/Complex.h +520 -0
  159. package/eigen/Eigen/src/Core/arch/LSX/GeneralBlockPanelKernel.h +23 -0
  160. package/eigen/Eigen/src/Core/arch/LSX/MathFunctions.h +43 -0
  161. package/eigen/Eigen/src/Core/arch/LSX/PacketMath.h +2866 -0
  162. package/eigen/Eigen/src/Core/arch/LSX/TypeCasting.h +526 -0
  163. package/eigen/Eigen/src/Core/arch/MSA/Complex.h +620 -0
  164. package/eigen/Eigen/src/Core/arch/MSA/MathFunctions.h +379 -0
  165. package/eigen/Eigen/src/Core/arch/MSA/PacketMath.h +1237 -0
  166. package/eigen/Eigen/src/Core/arch/NEON/Complex.h +531 -289
  167. package/eigen/Eigen/src/Core/arch/NEON/GeneralBlockPanelKernel.h +243 -0
  168. package/eigen/Eigen/src/Core/arch/NEON/MathFunctions.h +50 -73
  169. package/eigen/Eigen/src/Core/arch/NEON/PacketMath.h +5915 -579
  170. package/eigen/Eigen/src/Core/arch/NEON/TypeCasting.h +1642 -0
  171. package/eigen/Eigen/src/Core/arch/NEON/UnaryFunctors.h +57 -0
  172. package/eigen/Eigen/src/Core/arch/SSE/Complex.h +366 -334
  173. package/eigen/Eigen/src/Core/arch/SSE/MathFunctions.h +40 -514
  174. package/eigen/Eigen/src/Core/arch/SSE/PacketMath.h +2164 -675
  175. package/eigen/Eigen/src/Core/arch/SSE/Reductions.h +324 -0
  176. package/eigen/Eigen/src/Core/arch/SSE/TypeCasting.h +188 -35
  177. package/eigen/Eigen/src/Core/arch/SVE/MathFunctions.h +48 -0
  178. package/eigen/Eigen/src/Core/arch/SVE/PacketMath.h +674 -0
  179. package/eigen/Eigen/src/Core/arch/SVE/TypeCasting.h +52 -0
  180. package/eigen/Eigen/src/Core/arch/SYCL/InteropHeaders.h +227 -0
  181. package/eigen/Eigen/src/Core/arch/SYCL/MathFunctions.h +303 -0
  182. package/eigen/Eigen/src/Core/arch/SYCL/PacketMath.h +576 -0
  183. package/eigen/Eigen/src/Core/arch/SYCL/TypeCasting.h +83 -0
  184. package/eigen/Eigen/src/Core/arch/ZVector/Complex.h +434 -261
  185. package/eigen/Eigen/src/Core/arch/ZVector/MathFunctions.h +160 -53
  186. package/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h +1073 -605
  187. package/eigen/Eigen/src/Core/functors/AssignmentFunctors.h +123 -117
  188. package/eigen/Eigen/src/Core/functors/BinaryFunctors.h +594 -322
  189. package/eigen/Eigen/src/Core/functors/NullaryFunctors.h +204 -118
  190. package/eigen/Eigen/src/Core/functors/StlFunctors.h +110 -97
  191. package/eigen/Eigen/src/Core/functors/TernaryFunctors.h +34 -7
  192. package/eigen/Eigen/src/Core/functors/UnaryFunctors.h +1158 -530
  193. package/eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h +2329 -1333
  194. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix.h +328 -364
  195. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +191 -178
  196. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h +85 -82
  197. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix_BLAS.h +154 -73
  198. package/eigen/Eigen/src/Core/products/GeneralMatrixVector.h +396 -542
  199. package/eigen/Eigen/src/Core/products/GeneralMatrixVector_BLAS.h +80 -77
  200. package/eigen/Eigen/src/Core/products/Parallelizer.h +208 -92
  201. package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +331 -375
  202. package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix_BLAS.h +206 -224
  203. package/eigen/Eigen/src/Core/products/SelfadjointMatrixVector.h +139 -146
  204. package/eigen/Eigen/src/Core/products/SelfadjointMatrixVector_BLAS.h +58 -61
  205. package/eigen/Eigen/src/Core/products/SelfadjointProduct.h +71 -71
  206. package/eigen/Eigen/src/Core/products/SelfadjointRank2Update.h +48 -46
  207. package/eigen/Eigen/src/Core/products/TriangularMatrixMatrix.h +294 -369
  208. package/eigen/Eigen/src/Core/products/TriangularMatrixMatrix_BLAS.h +246 -238
  209. package/eigen/Eigen/src/Core/products/TriangularMatrixVector.h +244 -247
  210. package/eigen/Eigen/src/Core/products/TriangularMatrixVector_BLAS.h +212 -192
  211. package/eigen/Eigen/src/Core/products/TriangularSolverMatrix.h +328 -275
  212. package/eigen/Eigen/src/Core/products/TriangularSolverMatrix_BLAS.h +108 -109
  213. package/eigen/Eigen/src/Core/products/TriangularSolverVector.h +70 -93
  214. package/eigen/Eigen/src/Core/util/Assert.h +158 -0
  215. package/eigen/Eigen/src/Core/util/BlasUtil.h +413 -290
  216. package/eigen/Eigen/src/Core/util/ConfigureVectorization.h +543 -0
  217. package/eigen/Eigen/src/Core/util/Constants.h +314 -263
  218. package/eigen/Eigen/src/Core/util/DisableStupidWarnings.h +130 -78
  219. package/eigen/Eigen/src/Core/util/EmulateArray.h +270 -0
  220. package/eigen/Eigen/src/Core/util/ForwardDeclarations.h +450 -224
  221. package/eigen/Eigen/src/Core/util/GpuHipCudaDefines.inc +101 -0
  222. package/eigen/Eigen/src/Core/util/GpuHipCudaUndefines.inc +45 -0
  223. package/eigen/Eigen/src/Core/util/IndexedViewHelper.h +487 -0
  224. package/eigen/Eigen/src/Core/util/IntegralConstant.h +279 -0
  225. package/eigen/Eigen/src/Core/util/MKL_support.h +39 -30
  226. package/eigen/Eigen/src/Core/util/Macros.h +939 -646
  227. package/eigen/Eigen/src/Core/util/MaxSizeVector.h +139 -0
  228. package/eigen/Eigen/src/Core/util/Memory.h +1042 -650
  229. package/eigen/Eigen/src/Core/util/Meta.h +618 -426
  230. package/eigen/Eigen/src/Core/util/MoreMeta.h +638 -0
  231. package/eigen/Eigen/src/Core/util/ReenableStupidWarnings.h +32 -19
  232. package/eigen/Eigen/src/Core/util/ReshapedHelper.h +51 -0
  233. package/eigen/Eigen/src/Core/util/Serializer.h +209 -0
  234. package/eigen/Eigen/src/Core/util/StaticAssert.h +51 -164
  235. package/eigen/Eigen/src/Core/util/SymbolicIndex.h +445 -0
  236. package/eigen/Eigen/src/Core/util/XprHelper.h +793 -538
  237. package/eigen/Eigen/src/Eigenvalues/ComplexEigenSolver.h +246 -277
  238. package/eigen/Eigen/src/Eigenvalues/ComplexSchur.h +299 -319
  239. package/eigen/Eigen/src/Eigenvalues/ComplexSchur_LAPACKE.h +52 -48
  240. package/eigen/Eigen/src/Eigenvalues/EigenSolver.h +413 -456
  241. package/eigen/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h +309 -325
  242. package/eigen/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h +157 -171
  243. package/eigen/Eigen/src/Eigenvalues/HessenbergDecomposition.h +292 -310
  244. package/eigen/Eigen/src/Eigenvalues/InternalHeaderCheck.h +3 -0
  245. package/eigen/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h +91 -107
  246. package/eigen/Eigen/src/Eigenvalues/RealQZ.h +539 -606
  247. package/eigen/Eigen/src/Eigenvalues/RealSchur.h +348 -382
  248. package/eigen/Eigen/src/Eigenvalues/RealSchur_LAPACKE.h +41 -35
  249. package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +579 -600
  250. package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_LAPACKE.h +47 -44
  251. package/eigen/Eigen/src/Eigenvalues/Tridiagonalization.h +434 -461
  252. package/eigen/Eigen/src/Geometry/AlignedBox.h +307 -214
  253. package/eigen/Eigen/src/Geometry/AngleAxis.h +135 -137
  254. package/eigen/Eigen/src/Geometry/EulerAngles.h +163 -74
  255. package/eigen/Eigen/src/Geometry/Homogeneous.h +289 -333
  256. package/eigen/Eigen/src/Geometry/Hyperplane.h +152 -161
  257. package/eigen/Eigen/src/Geometry/InternalHeaderCheck.h +3 -0
  258. package/eigen/Eigen/src/Geometry/OrthoMethods.h +168 -145
  259. package/eigen/Eigen/src/Geometry/ParametrizedLine.h +141 -104
  260. package/eigen/Eigen/src/Geometry/Quaternion.h +595 -497
  261. package/eigen/Eigen/src/Geometry/Rotation2D.h +110 -108
  262. package/eigen/Eigen/src/Geometry/RotationBase.h +148 -145
  263. package/eigen/Eigen/src/Geometry/Scaling.h +115 -90
  264. package/eigen/Eigen/src/Geometry/Transform.h +896 -953
  265. package/eigen/Eigen/src/Geometry/Translation.h +100 -98
  266. package/eigen/Eigen/src/Geometry/Umeyama.h +79 -84
  267. package/eigen/Eigen/src/Geometry/arch/Geometry_SIMD.h +154 -0
  268. package/eigen/Eigen/src/Householder/BlockHouseholder.h +54 -42
  269. package/eigen/Eigen/src/Householder/Householder.h +104 -122
  270. package/eigen/Eigen/src/Householder/HouseholderSequence.h +416 -382
  271. package/eigen/Eigen/src/Householder/InternalHeaderCheck.h +3 -0
  272. package/eigen/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +153 -166
  273. package/eigen/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +127 -138
  274. package/eigen/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +95 -124
  275. package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h +269 -267
  276. package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h +246 -259
  277. package/eigen/Eigen/src/IterativeLinearSolvers/InternalHeaderCheck.h +3 -0
  278. package/eigen/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +218 -217
  279. package/eigen/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h +80 -103
  280. package/eigen/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h +59 -63
  281. package/eigen/Eigen/src/Jacobi/InternalHeaderCheck.h +3 -0
  282. package/eigen/Eigen/src/Jacobi/Jacobi.h +256 -291
  283. package/eigen/Eigen/src/KLUSupport/InternalHeaderCheck.h +3 -0
  284. package/eigen/Eigen/src/KLUSupport/KLUSupport.h +339 -0
  285. package/eigen/Eigen/src/LU/Determinant.h +60 -63
  286. package/eigen/Eigen/src/LU/FullPivLU.h +561 -626
  287. package/eigen/Eigen/src/LU/InternalHeaderCheck.h +3 -0
  288. package/eigen/Eigen/src/LU/InverseImpl.h +213 -275
  289. package/eigen/Eigen/src/LU/PartialPivLU.h +407 -435
  290. package/eigen/Eigen/src/LU/PartialPivLU_LAPACKE.h +54 -40
  291. package/eigen/Eigen/src/LU/arch/InverseSize4.h +353 -0
  292. package/eigen/Eigen/src/MetisSupport/InternalHeaderCheck.h +3 -0
  293. package/eigen/Eigen/src/MetisSupport/MetisSupport.h +81 -93
  294. package/eigen/Eigen/src/OrderingMethods/Amd.h +250 -282
  295. package/eigen/Eigen/src/OrderingMethods/Eigen_Colamd.h +950 -1103
  296. package/eigen/Eigen/src/OrderingMethods/InternalHeaderCheck.h +3 -0
  297. package/eigen/Eigen/src/OrderingMethods/Ordering.h +111 -122
  298. package/eigen/Eigen/src/PaStiXSupport/InternalHeaderCheck.h +3 -0
  299. package/eigen/Eigen/src/PaStiXSupport/PaStiXSupport.h +524 -570
  300. package/eigen/Eigen/src/PardisoSupport/InternalHeaderCheck.h +3 -0
  301. package/eigen/Eigen/src/PardisoSupport/PardisoSupport.h +385 -429
  302. package/eigen/Eigen/src/QR/ColPivHouseholderQR.h +494 -473
  303. package/eigen/Eigen/src/QR/ColPivHouseholderQR_LAPACKE.h +120 -56
  304. package/eigen/Eigen/src/QR/CompleteOrthogonalDecomposition.h +223 -137
  305. package/eigen/Eigen/src/QR/FullPivHouseholderQR.h +517 -460
  306. package/eigen/Eigen/src/QR/HouseholderQR.h +412 -278
  307. package/eigen/Eigen/src/QR/HouseholderQR_LAPACKE.h +32 -23
  308. package/eigen/Eigen/src/QR/InternalHeaderCheck.h +3 -0
  309. package/eigen/Eigen/src/SPQRSupport/InternalHeaderCheck.h +3 -0
  310. package/eigen/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h +263 -261
  311. package/eigen/Eigen/src/SVD/BDCSVD.h +872 -679
  312. package/eigen/Eigen/src/SVD/BDCSVD_LAPACKE.h +174 -0
  313. package/eigen/Eigen/src/SVD/InternalHeaderCheck.h +3 -0
  314. package/eigen/Eigen/src/SVD/JacobiSVD.h +585 -543
  315. package/eigen/Eigen/src/SVD/JacobiSVD_LAPACKE.h +85 -49
  316. package/eigen/Eigen/src/SVD/SVDBase.h +281 -160
  317. package/eigen/Eigen/src/SVD/UpperBidiagonalization.h +202 -237
  318. package/eigen/Eigen/src/SparseCholesky/InternalHeaderCheck.h +3 -0
  319. package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky.h +769 -590
  320. package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h +318 -129
  321. package/eigen/Eigen/src/SparseCore/AmbiVector.h +202 -251
  322. package/eigen/Eigen/src/SparseCore/CompressedStorage.h +184 -236
  323. package/eigen/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h +140 -184
  324. package/eigen/Eigen/src/SparseCore/InternalHeaderCheck.h +3 -0
  325. package/eigen/Eigen/src/SparseCore/SparseAssign.h +174 -111
  326. package/eigen/Eigen/src/SparseCore/SparseBlock.h +408 -477
  327. package/eigen/Eigen/src/SparseCore/SparseColEtree.h +100 -112
  328. package/eigen/Eigen/src/SparseCore/SparseCompressedBase.h +531 -280
  329. package/eigen/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +559 -347
  330. package/eigen/Eigen/src/SparseCore/SparseCwiseUnaryOp.h +100 -108
  331. package/eigen/Eigen/src/SparseCore/SparseDenseProduct.h +185 -191
  332. package/eigen/Eigen/src/SparseCore/SparseDiagonalProduct.h +71 -71
  333. package/eigen/Eigen/src/SparseCore/SparseDot.h +49 -47
  334. package/eigen/Eigen/src/SparseCore/SparseFuzzy.h +13 -11
  335. package/eigen/Eigen/src/SparseCore/SparseMap.h +243 -253
  336. package/eigen/Eigen/src/SparseCore/SparseMatrix.h +1614 -1142
  337. package/eigen/Eigen/src/SparseCore/SparseMatrixBase.h +403 -357
  338. package/eigen/Eigen/src/SparseCore/SparsePermutation.h +186 -115
  339. package/eigen/Eigen/src/SparseCore/SparseProduct.h +100 -91
  340. package/eigen/Eigen/src/SparseCore/SparseRedux.h +22 -24
  341. package/eigen/Eigen/src/SparseCore/SparseRef.h +268 -295
  342. package/eigen/Eigen/src/SparseCore/SparseSelfAdjointView.h +371 -414
  343. package/eigen/Eigen/src/SparseCore/SparseSolverBase.h +78 -87
  344. package/eigen/Eigen/src/SparseCore/SparseSparseProductWithPruning.h +81 -95
  345. package/eigen/Eigen/src/SparseCore/SparseTranspose.h +62 -71
  346. package/eigen/Eigen/src/SparseCore/SparseTriangularView.h +132 -144
  347. package/eigen/Eigen/src/SparseCore/SparseUtil.h +146 -115
  348. package/eigen/Eigen/src/SparseCore/SparseVector.h +426 -372
  349. package/eigen/Eigen/src/SparseCore/SparseView.h +164 -193
  350. package/eigen/Eigen/src/SparseCore/TriangularSolver.h +129 -170
  351. package/eigen/Eigen/src/SparseLU/InternalHeaderCheck.h +3 -0
  352. package/eigen/Eigen/src/SparseLU/SparseLU.h +814 -618
  353. package/eigen/Eigen/src/SparseLU/SparseLUImpl.h +61 -48
  354. package/eigen/Eigen/src/SparseLU/SparseLU_Memory.h +102 -118
  355. package/eigen/Eigen/src/SparseLU/SparseLU_Structs.h +38 -35
  356. package/eigen/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h +273 -255
  357. package/eigen/Eigen/src/SparseLU/SparseLU_Utils.h +44 -49
  358. package/eigen/Eigen/src/SparseLU/SparseLU_column_bmod.h +104 -108
  359. package/eigen/Eigen/src/SparseLU/SparseLU_column_dfs.h +90 -101
  360. package/eigen/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h +57 -58
  361. package/eigen/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h +43 -55
  362. package/eigen/Eigen/src/SparseLU/SparseLU_kernel_bmod.h +74 -71
  363. package/eigen/Eigen/src/SparseLU/SparseLU_panel_bmod.h +125 -133
  364. package/eigen/Eigen/src/SparseLU/SparseLU_panel_dfs.h +136 -159
  365. package/eigen/Eigen/src/SparseLU/SparseLU_pivotL.h +51 -52
  366. package/eigen/Eigen/src/SparseLU/SparseLU_pruneL.h +67 -73
  367. package/eigen/Eigen/src/SparseLU/SparseLU_relax_snode.h +24 -26
  368. package/eigen/Eigen/src/SparseQR/InternalHeaderCheck.h +3 -0
  369. package/eigen/Eigen/src/SparseQR/SparseQR.h +451 -490
  370. package/eigen/Eigen/src/StlSupport/StdDeque.h +28 -105
  371. package/eigen/Eigen/src/StlSupport/StdList.h +28 -84
  372. package/eigen/Eigen/src/StlSupport/StdVector.h +28 -108
  373. package/eigen/Eigen/src/StlSupport/details.h +48 -50
  374. package/eigen/Eigen/src/SuperLUSupport/InternalHeaderCheck.h +3 -0
  375. package/eigen/Eigen/src/SuperLUSupport/SuperLUSupport.h +634 -732
  376. package/eigen/Eigen/src/ThreadPool/Barrier.h +70 -0
  377. package/eigen/Eigen/src/ThreadPool/CoreThreadPoolDevice.h +336 -0
  378. package/eigen/Eigen/src/ThreadPool/EventCount.h +241 -0
  379. package/eigen/Eigen/src/ThreadPool/ForkJoin.h +140 -0
  380. package/eigen/Eigen/src/ThreadPool/InternalHeaderCheck.h +4 -0
  381. package/eigen/Eigen/src/ThreadPool/NonBlockingThreadPool.h +587 -0
  382. package/eigen/Eigen/src/ThreadPool/RunQueue.h +230 -0
  383. package/eigen/Eigen/src/ThreadPool/ThreadCancel.h +21 -0
  384. package/eigen/Eigen/src/ThreadPool/ThreadEnvironment.h +43 -0
  385. package/eigen/Eigen/src/ThreadPool/ThreadLocal.h +289 -0
  386. package/eigen/Eigen/src/ThreadPool/ThreadPoolInterface.h +50 -0
  387. package/eigen/Eigen/src/ThreadPool/ThreadYield.h +16 -0
  388. package/eigen/Eigen/src/UmfPackSupport/InternalHeaderCheck.h +3 -0
  389. package/eigen/Eigen/src/UmfPackSupport/UmfPackSupport.h +480 -380
  390. package/eigen/Eigen/src/misc/Image.h +41 -43
  391. package/eigen/Eigen/src/misc/InternalHeaderCheck.h +3 -0
  392. package/eigen/Eigen/src/misc/Kernel.h +39 -41
  393. package/eigen/Eigen/src/misc/RealSvd2x2.h +19 -21
  394. package/eigen/Eigen/src/misc/blas.h +83 -426
  395. package/eigen/Eigen/src/misc/lapacke.h +9976 -16182
  396. package/eigen/Eigen/src/misc/lapacke_helpers.h +163 -0
  397. package/eigen/Eigen/src/misc/lapacke_mangling.h +4 -5
  398. package/eigen/Eigen/src/plugins/ArrayCwiseBinaryOps.inc +344 -0
  399. package/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.inc +544 -0
  400. package/eigen/Eigen/src/plugins/BlockMethods.inc +1370 -0
  401. package/eigen/Eigen/src/plugins/CommonCwiseBinaryOps.inc +116 -0
  402. package/eigen/Eigen/src/plugins/CommonCwiseUnaryOps.inc +167 -0
  403. package/eigen/Eigen/src/plugins/IndexedViewMethods.inc +192 -0
  404. package/eigen/Eigen/src/plugins/InternalHeaderCheck.inc +3 -0
  405. package/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.inc +331 -0
  406. package/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.inc +118 -0
  407. package/eigen/Eigen/src/plugins/ReshapedMethods.inc +133 -0
  408. package/lib/LibEigen.d.ts +4 -0
  409. package/lib/LibEigen.js +14 -0
  410. package/lib/index.d.ts +1 -1
  411. package/lib/index.js +7 -3
  412. package/package.json +2 -10
  413. package/eigen/Eigen/CMakeLists.txt +0 -19
  414. package/eigen/Eigen/src/Core/BooleanRedux.h +0 -164
  415. package/eigen/Eigen/src/Core/arch/CUDA/Complex.h +0 -103
  416. package/eigen/Eigen/src/Core/arch/CUDA/Half.h +0 -675
  417. package/eigen/Eigen/src/Core/arch/CUDA/MathFunctions.h +0 -91
  418. package/eigen/Eigen/src/Core/arch/CUDA/PacketMath.h +0 -333
  419. package/eigen/Eigen/src/Core/arch/CUDA/PacketMathHalf.h +0 -1124
  420. package/eigen/Eigen/src/Core/arch/CUDA/TypeCasting.h +0 -212
  421. package/eigen/Eigen/src/Core/util/NonMPL2.h +0 -3
  422. package/eigen/Eigen/src/Geometry/arch/Geometry_SSE.h +0 -161
  423. package/eigen/Eigen/src/LU/arch/Inverse_SSE.h +0 -338
  424. package/eigen/Eigen/src/SparseCore/MappedSparseMatrix.h +0 -67
  425. package/eigen/Eigen/src/SparseLU/SparseLU_gemm_kernel.h +0 -280
  426. package/eigen/Eigen/src/misc/lapack.h +0 -152
  427. package/eigen/Eigen/src/plugins/ArrayCwiseBinaryOps.h +0 -332
  428. package/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.h +0 -552
  429. package/eigen/Eigen/src/plugins/BlockMethods.h +0 -1058
  430. package/eigen/Eigen/src/plugins/CommonCwiseBinaryOps.h +0 -115
  431. package/eigen/Eigen/src/plugins/CommonCwiseUnaryOps.h +0 -163
  432. package/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.h +0 -152
  433. package/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.h +0 -85
  434. package/lib/eigen.d.ts +0 -2
  435. package/lib/eigen.js +0 -15
@@ -11,457 +11,459 @@
11
11
  #ifndef EIGEN_SPARSE_QR_H
12
12
  #define EIGEN_SPARSE_QR_H
13
13
 
14
+ // IWYU pragma: private
15
+ #include "./InternalHeaderCheck.h"
16
+
14
17
  namespace Eigen {
15
18
 
16
- template<typename MatrixType, typename OrderingType> class SparseQR;
17
- template<typename SparseQRType> struct SparseQRMatrixQReturnType;
18
- template<typename SparseQRType> struct SparseQRMatrixQTransposeReturnType;
19
- template<typename SparseQRType, typename Derived> struct SparseQR_QProduct;
19
+ template <typename MatrixType, typename OrderingType>
20
+ class SparseQR;
21
+ template <typename SparseQRType>
22
+ struct SparseQRMatrixQReturnType;
23
+ template <typename SparseQRType>
24
+ struct SparseQRMatrixQTransposeReturnType;
25
+ template <typename SparseQRType, typename Derived>
26
+ struct SparseQR_QProduct;
20
27
  namespace internal {
21
- template <typename SparseQRType> struct traits<SparseQRMatrixQReturnType<SparseQRType> >
22
- {
23
- typedef typename SparseQRType::MatrixType ReturnType;
24
- typedef typename ReturnType::StorageIndex StorageIndex;
25
- typedef typename ReturnType::StorageKind StorageKind;
26
- enum {
27
- RowsAtCompileTime = Dynamic,
28
- ColsAtCompileTime = Dynamic
29
- };
30
- };
31
- template <typename SparseQRType> struct traits<SparseQRMatrixQTransposeReturnType<SparseQRType> >
32
- {
33
- typedef typename SparseQRType::MatrixType ReturnType;
34
- };
35
- template <typename SparseQRType, typename Derived> struct traits<SparseQR_QProduct<SparseQRType, Derived> >
36
- {
37
- typedef typename Derived::PlainObject ReturnType;
38
- };
39
- } // End namespace internal
28
+ template <typename SparseQRType>
29
+ struct traits<SparseQRMatrixQReturnType<SparseQRType> > {
30
+ typedef typename SparseQRType::MatrixType ReturnType;
31
+ typedef typename ReturnType::StorageIndex StorageIndex;
32
+ typedef typename ReturnType::StorageKind StorageKind;
33
+ enum { RowsAtCompileTime = Dynamic, ColsAtCompileTime = Dynamic };
34
+ };
35
+ template <typename SparseQRType>
36
+ struct traits<SparseQRMatrixQTransposeReturnType<SparseQRType> > {
37
+ typedef typename SparseQRType::MatrixType ReturnType;
38
+ };
39
+ template <typename SparseQRType, typename Derived>
40
+ struct traits<SparseQR_QProduct<SparseQRType, Derived> > {
41
+ typedef typename Derived::PlainObject ReturnType;
42
+ };
43
+ } // End namespace internal
40
44
 
41
45
  /**
42
- * \ingroup SparseQR_Module
43
- * \class SparseQR
44
- * \brief Sparse left-looking rank-revealing QR factorization
45
- *
46
- * This class implements a left-looking rank-revealing QR decomposition
47
- * of sparse matrices. When a column has a norm less than a given tolerance
48
- * it is implicitly permuted to the end. The QR factorization thus obtained is
49
- * given by A*P = Q*R where R is upper triangular or trapezoidal.
50
- *
51
- * P is the column permutation which is the product of the fill-reducing and the
52
- * rank-revealing permutations. Use colsPermutation() to get it.
53
- *
54
- * Q is the orthogonal matrix represented as products of Householder reflectors.
55
- * Use matrixQ() to get an expression and matrixQ().adjoint() to get the adjoint.
56
- * You can then apply it to a vector.
57
- *
58
- * R is the sparse triangular or trapezoidal matrix. The later occurs when A is rank-deficient.
59
- * matrixR().topLeftCorner(rank(), rank()) always returns a triangular factor of full rank.
60
- *
61
- * \tparam _MatrixType The type of the sparse matrix A, must be a column-major SparseMatrix<>
62
- * \tparam _OrderingType The fill-reducing ordering method. See the \link OrderingMethods_Module
63
- * OrderingMethods \endlink module for the list of built-in and external ordering methods.
64
- *
65
- * \implsparsesolverconcept
66
- *
67
- * \warning The input sparse matrix A must be in compressed mode (see SparseMatrix::makeCompressed()).
68
- * \warning For complex matrices matrixQ().transpose() will actually return the adjoint matrix.
69
- *
70
- */
71
- template<typename _MatrixType, typename _OrderingType>
72
- class SparseQR : public SparseSolverBase<SparseQR<_MatrixType,_OrderingType> >
73
- {
74
- protected:
75
- typedef SparseSolverBase<SparseQR<_MatrixType,_OrderingType> > Base;
76
- using Base::m_isInitialized;
77
- public:
78
- using Base::_solve_impl;
79
- typedef _MatrixType MatrixType;
80
- typedef _OrderingType OrderingType;
81
- typedef typename MatrixType::Scalar Scalar;
82
- typedef typename MatrixType::RealScalar RealScalar;
83
- typedef typename MatrixType::StorageIndex StorageIndex;
84
- typedef SparseMatrix<Scalar,ColMajor,StorageIndex> QRMatrixType;
85
- typedef Matrix<StorageIndex, Dynamic, 1> IndexVector;
86
- typedef Matrix<Scalar, Dynamic, 1> ScalarVector;
87
- typedef PermutationMatrix<Dynamic, Dynamic, StorageIndex> PermutationType;
88
-
89
- enum {
90
- ColsAtCompileTime = MatrixType::ColsAtCompileTime,
91
- MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
92
- };
93
-
94
- public:
95
- SparseQR () : m_analysisIsok(false), m_lastError(""), m_useDefaultThreshold(true),m_isQSorted(false),m_isEtreeOk(false)
96
- { }
97
-
98
- /** Construct a QR factorization of the matrix \a mat.
99
- *
100
- * \warning The matrix \a mat must be in compressed mode (see SparseMatrix::makeCompressed()).
101
- *
102
- * \sa compute()
103
- */
104
- explicit SparseQR(const MatrixType& mat) : m_analysisIsok(false), m_lastError(""), m_useDefaultThreshold(true),m_isQSorted(false),m_isEtreeOk(false)
105
- {
106
- compute(mat);
107
- }
108
-
109
- /** Computes the QR factorization of the sparse matrix \a mat.
110
- *
111
- * \warning The matrix \a mat must be in compressed mode (see SparseMatrix::makeCompressed()).
112
- *
113
- * \sa analyzePattern(), factorize()
114
- */
115
- void compute(const MatrixType& mat)
116
- {
117
- analyzePattern(mat);
118
- factorize(mat);
119
- }
120
- void analyzePattern(const MatrixType& mat);
121
- void factorize(const MatrixType& mat);
122
-
123
- /** \returns the number of rows of the represented matrix.
124
- */
125
- inline Index rows() const { return m_pmat.rows(); }
126
-
127
- /** \returns the number of columns of the represented matrix.
128
- */
129
- inline Index cols() const { return m_pmat.cols();}
130
-
131
- /** \returns a const reference to the \b sparse upper triangular matrix R of the QR factorization.
132
- * \warning The entries of the returned matrix are not sorted. This means that using it in algorithms
133
- * expecting sorted entries will fail. This include random coefficient accesses (SpaseMatrix::coeff()),
134
- * and coefficient-wise operations. Matrix products and triangular solves are fine though.
135
- *
136
- * To sort the entries, you can assign it to a row-major matrix, and if a column-major matrix
137
- * is required, you can copy it again:
138
- * \code
139
- * SparseMatrix<double> R = qr.matrixR(); // column-major, not sorted!
140
- * SparseMatrix<double,RowMajor> Rr = qr.matrixR(); // row-major, sorted
141
- * SparseMatrix<double> Rc = Rr; // column-major, sorted
142
- * \endcode
143
- */
144
- const QRMatrixType& matrixR() const { return m_R; }
145
-
146
- /** \returns the number of non linearly dependent columns as determined by the pivoting threshold.
147
- *
148
- * \sa setPivotThreshold()
149
- */
150
- Index rank() const
151
- {
152
- eigen_assert(m_isInitialized && "The factorization should be called first, use compute()");
153
- return m_nonzeropivots;
154
- }
155
-
156
- /** \returns an expression of the matrix Q as products of sparse Householder reflectors.
157
- * The common usage of this function is to apply it to a dense matrix or vector
158
- * \code
159
- * VectorXd B1, B2;
160
- * // Initialize B1
161
- * B2 = matrixQ() * B1;
162
- * \endcode
163
- *
164
- * To get a plain SparseMatrix representation of Q:
165
- * \code
166
- * SparseMatrix<double> Q;
167
- * Q = SparseQR<SparseMatrix<double> >(A).matrixQ();
168
- * \endcode
169
- * Internally, this call simply performs a sparse product between the matrix Q
170
- * and a sparse identity matrix. However, due to the fact that the sparse
171
- * reflectors are stored unsorted, two transpositions are needed to sort
172
- * them before performing the product.
173
- */
174
- SparseQRMatrixQReturnType<SparseQR> matrixQ() const
175
- { return SparseQRMatrixQReturnType<SparseQR>(*this); }
176
-
177
- /** \returns a const reference to the column permutation P that was applied to A such that A*P = Q*R
178
- * It is the combination of the fill-in reducing permutation and numerical column pivoting.
179
- */
180
- const PermutationType& colsPermutation() const
181
- {
182
- eigen_assert(m_isInitialized && "Decomposition is not initialized.");
183
- return m_outputPerm_c;
184
- }
185
-
186
- /** \returns A string describing the type of error.
187
- * This method is provided to ease debugging, not to handle errors.
188
- */
189
- std::string lastErrorMessage() const { return m_lastError; }
190
-
191
- /** \internal */
192
- template<typename Rhs, typename Dest>
193
- bool _solve_impl(const MatrixBase<Rhs> &B, MatrixBase<Dest> &dest) const
194
- {
195
- eigen_assert(m_isInitialized && "The factorization should be called first, use compute()");
196
- eigen_assert(this->rows() == B.rows() && "SparseQR::solve() : invalid number of rows in the right hand side matrix");
197
-
198
- Index rank = this->rank();
199
-
200
- // Compute Q^* * b;
201
- typename Dest::PlainObject y, b;
202
- y = this->matrixQ().adjoint() * B;
203
- b = y;
204
-
205
- // Solve with the triangular matrix R
206
- y.resize((std::max<Index>)(cols(),y.rows()),y.cols());
207
- y.topRows(rank) = this->matrixR().topLeftCorner(rank, rank).template triangularView<Upper>().solve(b.topRows(rank));
208
- y.bottomRows(y.rows()-rank).setZero();
209
-
210
- // Apply the column permutation
211
- if (m_perm_c.size()) dest = colsPermutation() * y.topRows(cols());
212
- else dest = y.topRows(cols());
213
-
214
- m_info = Success;
215
- return true;
216
- }
46
+ * \ingroup SparseQR_Module
47
+ * \class SparseQR
48
+ * \brief Sparse left-looking QR factorization with numerical column pivoting
49
+ *
50
+ * This class implements a left-looking QR decomposition of sparse matrices
51
+ * with numerical column pivoting.
52
+ * When a column has a norm less than a given tolerance
53
+ * it is implicitly permuted to the end. The QR factorization thus obtained is
54
+ * given by A*P = Q*R where R is upper triangular or trapezoidal.
55
+ *
56
+ * P is the column permutation which is the product of the fill-reducing and the
57
+ * numerical permutations. Use colsPermutation() to get it.
58
+ *
59
+ * Q is the orthogonal matrix represented as products of Householder reflectors.
60
+ * Use matrixQ() to get an expression and matrixQ().adjoint() to get the adjoint.
61
+ * You can then apply it to a vector.
62
+ *
63
+ * R is the sparse triangular or trapezoidal matrix. The later occurs when A is rank-deficient.
64
+ * matrixR().topLeftCorner(rank(), rank()) always returns a triangular factor of full rank.
65
+ *
66
+ * \tparam MatrixType_ The type of the sparse matrix A, must be a column-major SparseMatrix<>
67
+ * \tparam OrderingType_ The fill-reducing ordering method. See the \link OrderingMethods_Module
68
+ * OrderingMethods \endlink module for the list of built-in and external ordering methods.
69
+ *
70
+ * \implsparsesolverconcept
71
+ *
72
+ * The numerical pivoting strategy and default threshold are the same as in SuiteSparse QR, and
73
+ * detailed in the following paper:
74
+ * <i>
75
+ * Tim Davis, "Algorithm 915, SuiteSparseQR: Multifrontal Multithreaded Rank-Revealing
76
+ * Sparse QR Factorization", ACM Trans. on Math. Soft. 38(1), 2011.
77
+ * </i>
78
+ * Even though it is qualified as "rank-revealing", this strategy might fail for some
79
+ * rank deficient problems. When this class is used to solve linear or least-square problems
80
+ * it is thus strongly recommended to check the accuracy of the computed solution. If it
81
+ * failed, it usually helps to increase the threshold with setPivotThreshold.
82
+ *
83
+ * \warning The input sparse matrix A must be in compressed mode (see SparseMatrix::makeCompressed()).
84
+ * \warning For complex matrices matrixQ().transpose() will actually return the adjoint matrix.
85
+ *
86
+ */
87
+ template <typename MatrixType_, typename OrderingType_>
88
+ class SparseQR : public SparseSolverBase<SparseQR<MatrixType_, OrderingType_> > {
89
+ protected:
90
+ typedef SparseSolverBase<SparseQR<MatrixType_, OrderingType_> > Base;
91
+ using Base::m_isInitialized;
92
+
93
+ public:
94
+ using Base::_solve_impl;
95
+ typedef MatrixType_ MatrixType;
96
+ typedef OrderingType_ OrderingType;
97
+ typedef typename MatrixType::Scalar Scalar;
98
+ typedef typename MatrixType::RealScalar RealScalar;
99
+ typedef typename MatrixType::StorageIndex StorageIndex;
100
+ typedef SparseMatrix<Scalar, ColMajor, StorageIndex> QRMatrixType;
101
+ typedef Matrix<StorageIndex, Dynamic, 1> IndexVector;
102
+ typedef Matrix<Scalar, Dynamic, 1> ScalarVector;
103
+ typedef PermutationMatrix<Dynamic, Dynamic, StorageIndex> PermutationType;
104
+
105
+ enum { ColsAtCompileTime = MatrixType::ColsAtCompileTime, MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime };
106
+
107
+ public:
108
+ SparseQR()
109
+ : m_analysisIsok(false), m_lastError(""), m_useDefaultThreshold(true), m_isQSorted(false), m_isEtreeOk(false) {}
110
+
111
+ /** Construct a QR factorization of the matrix \a mat.
112
+ *
113
+ * \warning The matrix \a mat must be in compressed mode (see SparseMatrix::makeCompressed()).
114
+ *
115
+ * \sa compute()
116
+ */
117
+ explicit SparseQR(const MatrixType& mat)
118
+ : m_analysisIsok(false), m_lastError(""), m_useDefaultThreshold(true), m_isQSorted(false), m_isEtreeOk(false) {
119
+ compute(mat);
120
+ }
217
121
 
218
- /** Sets the threshold that is used to determine linearly dependent columns during the factorization.
219
- *
220
- * In practice, if during the factorization the norm of the column that has to be eliminated is below
221
- * this threshold, then the entire column is treated as zero, and it is moved at the end.
222
- */
223
- void setPivotThreshold(const RealScalar& threshold)
224
- {
225
- m_useDefaultThreshold = false;
226
- m_threshold = threshold;
227
- }
228
-
229
- /** \returns the solution X of \f$ A X = B \f$ using the current decomposition of A.
230
- *
231
- * \sa compute()
232
- */
233
- template<typename Rhs>
234
- inline const Solve<SparseQR, Rhs> solve(const MatrixBase<Rhs>& B) const
235
- {
236
- eigen_assert(m_isInitialized && "The factorization should be called first, use compute()");
237
- eigen_assert(this->rows() == B.rows() && "SparseQR::solve() : invalid number of rows in the right hand side matrix");
238
- return Solve<SparseQR, Rhs>(*this, B.derived());
239
- }
240
- template<typename Rhs>
241
- inline const Solve<SparseQR, Rhs> solve(const SparseMatrixBase<Rhs>& B) const
242
- {
243
- eigen_assert(m_isInitialized && "The factorization should be called first, use compute()");
244
- eigen_assert(this->rows() == B.rows() && "SparseQR::solve() : invalid number of rows in the right hand side matrix");
245
- return Solve<SparseQR, Rhs>(*this, B.derived());
246
- }
247
-
248
- /** \brief Reports whether previous computation was successful.
249
- *
250
- * \returns \c Success if computation was successful,
251
- * \c NumericalIssue if the QR factorization reports a numerical problem
252
- * \c InvalidInput if the input matrix is invalid
253
- *
254
- * \sa iparm()
255
- */
256
- ComputationInfo info() const
257
- {
258
- eigen_assert(m_isInitialized && "Decomposition is not initialized.");
259
- return m_info;
260
- }
122
+ /** Computes the QR factorization of the sparse matrix \a mat.
123
+ *
124
+ * \warning The matrix \a mat must be in compressed mode (see SparseMatrix::makeCompressed()).
125
+ *
126
+ * \sa analyzePattern(), factorize()
127
+ */
128
+ void compute(const MatrixType& mat) {
129
+ analyzePattern(mat);
130
+ factorize(mat);
131
+ }
132
+ void analyzePattern(const MatrixType& mat);
133
+ void factorize(const MatrixType& mat);
261
134
 
135
+ /** \returns the number of rows of the represented matrix.
136
+ */
137
+ inline Index rows() const { return m_pmat.rows(); }
262
138
 
263
- /** \internal */
264
- inline void _sort_matrix_Q()
265
- {
266
- if(this->m_isQSorted) return;
267
- // The matrix Q is sorted during the transposition
268
- SparseMatrix<Scalar, RowMajor, Index> mQrm(this->m_Q);
269
- this->m_Q = mQrm;
270
- this->m_isQSorted = true;
271
- }
139
+ /** \returns the number of columns of the represented matrix.
140
+ */
141
+ inline Index cols() const { return m_pmat.cols(); }
142
+
143
+ /** \returns a const reference to the \b sparse upper triangular matrix R of the QR factorization.
144
+ * \warning The entries of the returned matrix are not sorted. This means that using it in algorithms
145
+ * expecting sorted entries will fail. This include random coefficient accesses (SpaseMatrix::coeff()),
146
+ * and coefficient-wise operations. Matrix products and triangular solves are fine though.
147
+ *
148
+ * To sort the entries, you can assign it to a row-major matrix, and if a column-major matrix
149
+ * is required, you can copy it again:
150
+ * \code
151
+ * SparseMatrix<double> R = qr.matrixR(); // column-major, not sorted!
152
+ * SparseMatrix<double,RowMajor> Rr = qr.matrixR(); // row-major, sorted
153
+ * SparseMatrix<double> Rc = Rr; // column-major, sorted
154
+ * \endcode
155
+ */
156
+ const QRMatrixType& matrixR() const { return m_R; }
157
+
158
+ /** \returns the number of non linearly dependent columns as determined by the pivoting threshold.
159
+ *
160
+ * \sa setPivotThreshold()
161
+ */
162
+ Index rank() const {
163
+ eigen_assert(m_isInitialized && "The factorization should be called first, use compute()");
164
+ return m_nonzeropivots;
165
+ }
272
166
 
273
-
274
- protected:
275
- bool m_analysisIsok;
276
- bool m_factorizationIsok;
277
- mutable ComputationInfo m_info;
278
- std::string m_lastError;
279
- QRMatrixType m_pmat; // Temporary matrix
280
- QRMatrixType m_R; // The triangular factor matrix
281
- QRMatrixType m_Q; // The orthogonal reflectors
282
- ScalarVector m_hcoeffs; // The Householder coefficients
283
- PermutationType m_perm_c; // Fill-reducing Column permutation
284
- PermutationType m_pivotperm; // The permutation for rank revealing
285
- PermutationType m_outputPerm_c; // The final column permutation
286
- RealScalar m_threshold; // Threshold to determine null Householder reflections
287
- bool m_useDefaultThreshold; // Use default threshold
288
- Index m_nonzeropivots; // Number of non zero pivots found
289
- IndexVector m_etree; // Column elimination tree
290
- IndexVector m_firstRowElt; // First element in each row
291
- bool m_isQSorted; // whether Q is sorted or not
292
- bool m_isEtreeOk; // whether the elimination tree match the initial input matrix
293
-
294
- template <typename, typename > friend struct SparseQR_QProduct;
295
-
167
+ /** \returns an expression of the matrix Q as products of sparse Householder reflectors.
168
+ * The common usage of this function is to apply it to a dense matrix or vector
169
+ * \code
170
+ * VectorXd B1, B2;
171
+ * // Initialize B1
172
+ * B2 = matrixQ() * B1;
173
+ * \endcode
174
+ *
175
+ * To get a plain SparseMatrix representation of Q:
176
+ * \code
177
+ * SparseMatrix<double> Q;
178
+ * Q = SparseQR<SparseMatrix<double> >(A).matrixQ();
179
+ * \endcode
180
+ * Internally, this call simply performs a sparse product between the matrix Q
181
+ * and a sparse identity matrix. However, due to the fact that the sparse
182
+ * reflectors are stored unsorted, two transpositions are needed to sort
183
+ * them before performing the product.
184
+ */
185
+ SparseQRMatrixQReturnType<SparseQR> matrixQ() const { return SparseQRMatrixQReturnType<SparseQR>(*this); }
186
+
187
+ /** \returns a const reference to the column permutation P that was applied to A such that A*P = Q*R
188
+ * It is the combination of the fill-in reducing permutation and numerical column pivoting.
189
+ */
190
+ const PermutationType& colsPermutation() const {
191
+ eigen_assert(m_isInitialized && "Decomposition is not initialized.");
192
+ return m_outputPerm_c;
193
+ }
194
+
195
+ /** \returns A string describing the type of error.
196
+ * This method is provided to ease debugging, not to handle errors.
197
+ */
198
+ std::string lastErrorMessage() const { return m_lastError; }
199
+
200
+ /** \internal */
201
+ template <typename Rhs, typename Dest>
202
+ bool _solve_impl(const MatrixBase<Rhs>& B, MatrixBase<Dest>& dest) const {
203
+ eigen_assert(m_isInitialized && "The factorization should be called first, use compute()");
204
+ eigen_assert(this->rows() == B.rows() &&
205
+ "SparseQR::solve() : invalid number of rows in the right hand side matrix");
206
+
207
+ Index rank = this->rank();
208
+
209
+ // Compute Q^* * b;
210
+ typename Dest::PlainObject y, b;
211
+ y = this->matrixQ().adjoint() * B;
212
+ b = y;
213
+
214
+ // Solve with the triangular matrix R
215
+ y.resize((std::max<Index>)(cols(), y.rows()), y.cols());
216
+ y.topRows(rank) = this->matrixR().topLeftCorner(rank, rank).template triangularView<Upper>().solve(b.topRows(rank));
217
+ y.bottomRows(y.rows() - rank).setZero();
218
+
219
+ // Apply the column permutation
220
+ if (m_perm_c.size())
221
+ dest = colsPermutation() * y.topRows(cols());
222
+ else
223
+ dest = y.topRows(cols());
224
+
225
+ m_info = Success;
226
+ return true;
227
+ }
228
+
229
+ /** Sets the threshold that is used to determine linearly dependent columns during the factorization.
230
+ *
231
+ * In practice, if during the factorization the norm of the column that has to be eliminated is below
232
+ * this threshold, then the entire column is treated as zero, and it is moved at the end.
233
+ */
234
+ void setPivotThreshold(const RealScalar& threshold) {
235
+ m_useDefaultThreshold = false;
236
+ m_threshold = threshold;
237
+ }
238
+
239
+ /** \returns the solution X of \f$ A X = B \f$ using the current decomposition of A.
240
+ *
241
+ * \sa compute()
242
+ */
243
+ template <typename Rhs>
244
+ inline const Solve<SparseQR, Rhs> solve(const MatrixBase<Rhs>& B) const {
245
+ eigen_assert(m_isInitialized && "The factorization should be called first, use compute()");
246
+ eigen_assert(this->rows() == B.rows() &&
247
+ "SparseQR::solve() : invalid number of rows in the right hand side matrix");
248
+ return Solve<SparseQR, Rhs>(*this, B.derived());
249
+ }
250
+ template <typename Rhs>
251
+ inline const Solve<SparseQR, Rhs> solve(const SparseMatrixBase<Rhs>& B) const {
252
+ eigen_assert(m_isInitialized && "The factorization should be called first, use compute()");
253
+ eigen_assert(this->rows() == B.rows() &&
254
+ "SparseQR::solve() : invalid number of rows in the right hand side matrix");
255
+ return Solve<SparseQR, Rhs>(*this, B.derived());
256
+ }
257
+
258
+ /** \brief Reports whether previous computation was successful.
259
+ *
260
+ * \returns \c Success if computation was successful,
261
+ * \c NumericalIssue if the QR factorization reports a numerical problem
262
+ * \c InvalidInput if the input matrix is invalid
263
+ *
264
+ * \sa iparm()
265
+ */
266
+ ComputationInfo info() const {
267
+ eigen_assert(m_isInitialized && "Decomposition is not initialized.");
268
+ return m_info;
269
+ }
270
+
271
+ /** \internal */
272
+ inline void _sort_matrix_Q() {
273
+ if (this->m_isQSorted) return;
274
+ // The matrix Q is sorted during the transposition
275
+ SparseMatrix<Scalar, RowMajor, Index> mQrm(this->m_Q);
276
+ this->m_Q = mQrm;
277
+ this->m_isQSorted = true;
278
+ }
279
+
280
+ protected:
281
+ bool m_analysisIsok;
282
+ bool m_factorizationIsok;
283
+ mutable ComputationInfo m_info;
284
+ std::string m_lastError;
285
+ QRMatrixType m_pmat; // Temporary matrix
286
+ QRMatrixType m_R; // The triangular factor matrix
287
+ QRMatrixType m_Q; // The orthogonal reflectors
288
+ ScalarVector m_hcoeffs; // The Householder coefficients
289
+ PermutationType m_perm_c; // Fill-reducing Column permutation
290
+ PermutationType m_pivotperm; // The permutation for rank revealing
291
+ PermutationType m_outputPerm_c; // The final column permutation
292
+ RealScalar m_threshold; // Threshold to determine null Householder reflections
293
+ bool m_useDefaultThreshold; // Use default threshold
294
+ Index m_nonzeropivots; // Number of non zero pivots found
295
+ IndexVector m_etree; // Column elimination tree
296
+ IndexVector m_firstRowElt; // First element in each row
297
+ bool m_isQSorted; // whether Q is sorted or not
298
+ bool m_isEtreeOk; // whether the elimination tree match the initial input matrix
299
+
300
+ template <typename, typename>
301
+ friend struct SparseQR_QProduct;
296
302
  };
297
303
 
298
- /** \brief Preprocessing step of a QR factorization
299
- *
300
- * \warning The matrix \a mat must be in compressed mode (see SparseMatrix::makeCompressed()).
301
- *
302
- * In this step, the fill-reducing permutation is computed and applied to the columns of A
303
- * and the column elimination tree is computed as well. Only the sparsity pattern of \a mat is exploited.
304
- *
305
- * \note In this step it is assumed that there is no empty row in the matrix \a mat.
306
- */
304
+ /** \brief Preprocessing step of a QR factorization
305
+ *
306
+ * \warning The matrix \a mat must be in compressed mode (see SparseMatrix::makeCompressed()).
307
+ *
308
+ * In this step, the fill-reducing permutation is computed and applied to the columns of A
309
+ * and the column elimination tree is computed as well. Only the sparsity pattern of \a mat is exploited.
310
+ *
311
+ * \note In this step it is assumed that there is no empty row in the matrix \a mat.
312
+ */
307
313
  template <typename MatrixType, typename OrderingType>
308
- void SparseQR<MatrixType,OrderingType>::analyzePattern(const MatrixType& mat)
309
- {
310
- eigen_assert(mat.isCompressed() && "SparseQR requires a sparse matrix in compressed mode. Call .makeCompressed() before passing it to SparseQR");
314
+ void SparseQR<MatrixType, OrderingType>::analyzePattern(const MatrixType& mat) {
315
+ eigen_assert(
316
+ mat.isCompressed() &&
317
+ "SparseQR requires a sparse matrix in compressed mode. Call .makeCompressed() before passing it to SparseQR");
311
318
  // Copy to a column major matrix if the input is rowmajor
312
- typename internal::conditional<MatrixType::IsRowMajor,QRMatrixType,const MatrixType&>::type matCpy(mat);
319
+ std::conditional_t<MatrixType::IsRowMajor, QRMatrixType, const MatrixType&> matCpy(mat);
313
320
  // Compute the column fill reducing ordering
314
- OrderingType ord;
315
- ord(matCpy, m_perm_c);
321
+ OrderingType ord;
322
+ ord(matCpy, m_perm_c);
316
323
  Index n = mat.cols();
317
324
  Index m = mat.rows();
318
- Index diagSize = (std::min)(m,n);
319
-
320
- if (!m_perm_c.size())
321
- {
325
+ Index diagSize = (std::min)(m, n);
326
+
327
+ if (!m_perm_c.size()) {
322
328
  m_perm_c.resize(n);
323
- m_perm_c.indices().setLinSpaced(n, 0,StorageIndex(n-1));
329
+ m_perm_c.indices().setLinSpaced(n, 0, StorageIndex(n - 1));
324
330
  }
325
-
331
+
326
332
  // Compute the column elimination tree of the permuted matrix
327
333
  m_outputPerm_c = m_perm_c.inverse();
328
334
  internal::coletree(matCpy, m_etree, m_firstRowElt, m_outputPerm_c.indices().data());
329
335
  m_isEtreeOk = true;
330
-
336
+
331
337
  m_R.resize(m, n);
332
338
  m_Q.resize(m, diagSize);
333
-
334
- // Allocate space for nonzero elements : rough estimation
335
- m_R.reserve(2*mat.nonZeros()); //FIXME Get a more accurate estimation through symbolic factorization with the etree
336
- m_Q.reserve(2*mat.nonZeros());
339
+
340
+ // Allocate space for nonzero elements: rough estimation
341
+ m_R.reserve(2 * mat.nonZeros()); // FIXME Get a more accurate estimation through symbolic factorization with the
342
+ // etree
343
+ m_Q.reserve(2 * mat.nonZeros());
337
344
  m_hcoeffs.resize(diagSize);
338
345
  m_analysisIsok = true;
339
346
  }
340
347
 
341
348
  /** \brief Performs the numerical QR factorization of the input matrix
342
- *
343
- * The function SparseQR::analyzePattern(const MatrixType&) must have been called beforehand with
344
- * a matrix having the same sparsity pattern than \a mat.
345
- *
346
- * \param mat The sparse column-major matrix
347
- */
349
+ *
350
+ * The function SparseQR::analyzePattern(const MatrixType&) must have been called beforehand with
351
+ * a matrix having the same sparsity pattern than \a mat.
352
+ *
353
+ * \param mat The sparse column-major matrix
354
+ */
348
355
  template <typename MatrixType, typename OrderingType>
349
- void SparseQR<MatrixType,OrderingType>::factorize(const MatrixType& mat)
350
- {
356
+ void SparseQR<MatrixType, OrderingType>::factorize(const MatrixType& mat) {
351
357
  using std::abs;
352
-
358
+
353
359
  eigen_assert(m_analysisIsok && "analyzePattern() should be called before this step");
354
360
  StorageIndex m = StorageIndex(mat.rows());
355
361
  StorageIndex n = StorageIndex(mat.cols());
356
- StorageIndex diagSize = (std::min)(m,n);
357
- IndexVector mark((std::max)(m,n)); mark.setConstant(-1); // Record the visited nodes
358
- IndexVector Ridx(n), Qidx(m); // Store temporarily the row indexes for the current column of R and Q
359
- Index nzcolR, nzcolQ; // Number of nonzero for the current column of R and Q
360
- ScalarVector tval(m); // The dense vector used to compute the current column
361
- RealScalar pivotThreshold = m_threshold;
362
-
362
+ StorageIndex diagSize = (std::min)(m, n);
363
+ IndexVector mark((std::max)(m, n));
364
+ mark.setConstant(-1); // Record the visited nodes
365
+ IndexVector Ridx(n), Qidx(m); // Store temporarily the row indexes for the current column of R and Q
366
+ Index nzcolR, nzcolQ; // Number of nonzero for the current column of R and Q
367
+ ScalarVector tval(m); // The dense vector used to compute the current column
368
+
363
369
  m_R.setZero();
364
370
  m_Q.setZero();
365
371
  m_pmat = mat;
366
- if(!m_isEtreeOk)
367
- {
372
+ if (!m_isEtreeOk) {
368
373
  m_outputPerm_c = m_perm_c.inverse();
369
374
  internal::coletree(m_pmat, m_etree, m_firstRowElt, m_outputPerm_c.indices().data());
370
375
  m_isEtreeOk = true;
371
376
  }
372
377
 
373
- m_pmat.uncompress(); // To have the innerNonZeroPtr allocated
374
-
378
+ m_pmat.uncompress(); // To have the innerNonZeroPtr allocated
379
+
375
380
  // Apply the fill-in reducing permutation lazily:
376
381
  {
377
382
  // If the input is row major, copy the original column indices,
378
383
  // otherwise directly use the input matrix
379
- //
384
+ //
380
385
  IndexVector originalOuterIndicesCpy;
381
- const StorageIndex *originalOuterIndices = mat.outerIndexPtr();
382
- if(MatrixType::IsRowMajor)
383
- {
384
- originalOuterIndicesCpy = IndexVector::Map(m_pmat.outerIndexPtr(),n+1);
386
+ const StorageIndex* originalOuterIndices = mat.outerIndexPtr();
387
+ if (MatrixType::IsRowMajor) {
388
+ originalOuterIndicesCpy = IndexVector::Map(m_pmat.outerIndexPtr(), n + 1);
385
389
  originalOuterIndices = originalOuterIndicesCpy.data();
386
390
  }
387
-
388
- for (int i = 0; i < n; i++)
389
- {
391
+
392
+ for (int i = 0; i < n; i++) {
390
393
  Index p = m_perm_c.size() ? m_perm_c.indices()(i) : i;
391
- m_pmat.outerIndexPtr()[p] = originalOuterIndices[i];
392
- m_pmat.innerNonZeroPtr()[p] = originalOuterIndices[i+1] - originalOuterIndices[i];
394
+ m_pmat.outerIndexPtr()[p] = originalOuterIndices[i];
395
+ m_pmat.innerNonZeroPtr()[p] = originalOuterIndices[i + 1] - originalOuterIndices[i];
393
396
  }
394
397
  }
395
-
398
+
396
399
  /* Compute the default threshold as in MatLab, see:
397
400
  * Tim Davis, "Algorithm 915, SuiteSparseQR: Multifrontal Multithreaded Rank-Revealing
398
- * Sparse QR Factorization, ACM Trans. on Math. Soft. 38(1), 2011, Page 8:3
401
+ * Sparse QR Factorization, ACM Trans. on Math. Soft. 38(1), 2011, Page 8:3
399
402
  */
400
- if(m_useDefaultThreshold)
401
- {
403
+ RealScalar pivotThreshold;
404
+ if (m_useDefaultThreshold) {
402
405
  RealScalar max2Norm = 0.0;
403
406
  for (int j = 0; j < n; j++) max2Norm = numext::maxi(max2Norm, m_pmat.col(j).norm());
404
- if(max2Norm==RealScalar(0))
405
- max2Norm = RealScalar(1);
407
+ if (max2Norm == RealScalar(0)) max2Norm = RealScalar(1);
406
408
  pivotThreshold = 20 * (m + n) * max2Norm * NumTraits<RealScalar>::epsilon();
409
+ } else {
410
+ pivotThreshold = m_threshold;
407
411
  }
408
-
412
+
409
413
  // Initialize the numerical permutation
410
414
  m_pivotperm.setIdentity(n);
411
-
412
- StorageIndex nonzeroCol = 0; // Record the number of valid pivots
415
+
416
+ StorageIndex nonzeroCol = 0; // Record the number of valid pivots
413
417
  m_Q.startVec(0);
414
418
 
415
419
  // Left looking rank-revealing QR factorization: compute a column of R and Q at a time
416
- for (StorageIndex col = 0; col < n; ++col)
417
- {
420
+ for (StorageIndex col = 0; col < n; ++col) {
418
421
  mark.setConstant(-1);
419
422
  m_R.startVec(col);
420
423
  mark(nonzeroCol) = col;
421
424
  Qidx(0) = nonzeroCol;
422
- nzcolR = 0; nzcolQ = 1;
423
- bool found_diag = nonzeroCol>=m;
424
- tval.setZero();
425
-
425
+ nzcolR = 0;
426
+ nzcolQ = 1;
427
+ bool found_diag = nonzeroCol >= m;
428
+ tval.setZero();
429
+
426
430
  // Symbolic factorization: find the nonzero locations of the column k of the factors R and Q, i.e.,
427
- // all the nodes (with indexes lower than rank) reachable through the column elimination tree (etree) rooted at node k.
428
- // Note: if the diagonal entry does not exist, then its contribution must be explicitly added,
429
- // thus the trick with found_diag that permits to do one more iteration on the diagonal element if this one has not been found.
430
- for (typename QRMatrixType::InnerIterator itp(m_pmat, col); itp || !found_diag; ++itp)
431
- {
431
+ // all the nodes (with indexes lower than rank) reachable through the column elimination tree (etree) rooted at node
432
+ // k. Note: if the diagonal entry does not exist, then its contribution must be explicitly added, thus the trick
433
+ // with found_diag that permits to do one more iteration on the diagonal element if this one has not been found.
434
+ for (typename QRMatrixType::InnerIterator itp(m_pmat, col); itp || !found_diag; ++itp) {
432
435
  StorageIndex curIdx = nonzeroCol;
433
- if(itp) curIdx = StorageIndex(itp.row());
434
- if(curIdx == nonzeroCol) found_diag = true;
435
-
436
+ if (itp) curIdx = StorageIndex(itp.row());
437
+ if (curIdx == nonzeroCol) found_diag = true;
438
+
436
439
  // Get the nonzeros indexes of the current column of R
437
- StorageIndex st = m_firstRowElt(curIdx); // The traversal of the etree starts here
438
- if (st < 0 )
439
- {
440
+ StorageIndex st = m_firstRowElt(curIdx); // The traversal of the etree starts here
441
+ if (st < 0) {
440
442
  m_lastError = "Empty row found during numerical factorization";
441
443
  m_info = InvalidInput;
442
444
  return;
443
445
  }
444
446
 
445
- // Traverse the etree
447
+ // Traverse the etree
446
448
  Index bi = nzcolR;
447
- for (; mark(st) != col; st = m_etree(st))
448
- {
449
+ for (; mark(st) != col; st = m_etree(st)) {
449
450
  Ridx(nzcolR) = st; // Add this row to the list,
450
451
  mark(st) = col; // and mark this row as visited
451
452
  nzcolR++;
452
453
  }
453
454
 
454
455
  // Reverse the list to get the topological ordering
455
- Index nt = nzcolR-bi;
456
- for(Index i = 0; i < nt/2; i++) std::swap(Ridx(bi+i), Ridx(nzcolR-i-1));
457
-
456
+ Index nt = nzcolR - bi;
457
+ for (Index i = 0; i < nt / 2; i++) std::swap(Ridx(bi + i), Ridx(nzcolR - i - 1));
458
+
458
459
  // Copy the current (curIdx,pcol) value of the input matrix
459
- if(itp) tval(curIdx) = itp.value();
460
- else tval(curIdx) = Scalar(0);
461
-
460
+ if (itp)
461
+ tval(curIdx) = itp.value();
462
+ else
463
+ tval(curIdx) = Scalar(0);
464
+
462
465
  // Compute the pattern of Q(:,k)
463
- if(curIdx > nonzeroCol && mark(curIdx) != col )
464
- {
466
+ if (curIdx > nonzeroCol && mark(curIdx) != col) {
465
467
  Qidx(nzcolQ) = curIdx; // Add this row to the pattern of Q,
466
468
  mark(curIdx) = col; // and mark it as visited
467
469
  nzcolQ++;
@@ -469,110 +471,89 @@ void SparseQR<MatrixType,OrderingType>::factorize(const MatrixType& mat)
469
471
  }
470
472
 
471
473
  // Browse all the indexes of R(:,col) in reverse order
472
- for (Index i = nzcolR-1; i >= 0; i--)
473
- {
474
+ for (Index i = nzcolR - 1; i >= 0; i--) {
474
475
  Index curIdx = Ridx(i);
475
-
476
+
476
477
  // Apply the curIdx-th householder vector to the current column (temporarily stored into tval)
477
478
  Scalar tdot(0);
478
-
479
+
479
480
  // First compute q' * tval
480
481
  tdot = m_Q.col(curIdx).dot(tval);
481
482
 
482
483
  tdot *= m_hcoeffs(curIdx);
483
-
484
+
484
485
  // Then update tval = tval - q * tau
485
- // FIXME: tval -= tdot * m_Q.col(curIdx) should amount to the same (need to check/add support for efficient "dense ?= sparse")
486
- for (typename QRMatrixType::InnerIterator itq(m_Q, curIdx); itq; ++itq)
487
- tval(itq.row()) -= itq.value() * tdot;
486
+ tval -= tdot * m_Q.col(curIdx);
488
487
 
489
488
  // Detect fill-in for the current column of Q
490
- if(m_etree(Ridx(i)) == nonzeroCol)
491
- {
492
- for (typename QRMatrixType::InnerIterator itq(m_Q, curIdx); itq; ++itq)
493
- {
489
+ if (m_etree(Ridx(i)) == nonzeroCol) {
490
+ for (typename QRMatrixType::InnerIterator itq(m_Q, curIdx); itq; ++itq) {
494
491
  StorageIndex iQ = StorageIndex(itq.row());
495
- if (mark(iQ) != col)
496
- {
492
+ if (mark(iQ) != col) {
497
493
  Qidx(nzcolQ++) = iQ; // Add this row to the pattern of Q,
498
494
  mark(iQ) = col; // and mark it as visited
499
495
  }
500
496
  }
501
497
  }
502
- } // End update current column
503
-
498
+ } // End update current column
499
+
504
500
  Scalar tau = RealScalar(0);
505
501
  RealScalar beta = 0;
506
-
507
- if(nonzeroCol < diagSize)
508
- {
502
+
503
+ if (nonzeroCol < diagSize) {
509
504
  // Compute the Householder reflection that eliminate the current column
510
505
  // FIXME this step should call the Householder module.
511
506
  Scalar c0 = nzcolQ ? tval(Qidx(0)) : Scalar(0);
512
-
507
+
513
508
  // First, the squared norm of Q((col+1):m, col)
514
509
  RealScalar sqrNorm = 0.;
515
510
  for (Index itq = 1; itq < nzcolQ; ++itq) sqrNorm += numext::abs2(tval(Qidx(itq)));
516
- if(sqrNorm == RealScalar(0) && numext::imag(c0) == RealScalar(0))
517
- {
511
+ if (sqrNorm == RealScalar(0) && numext::imag(c0) == RealScalar(0)) {
518
512
  beta = numext::real(c0);
519
513
  tval(Qidx(0)) = 1;
520
- }
521
- else
522
- {
514
+ } else {
523
515
  using std::sqrt;
524
516
  beta = sqrt(numext::abs2(c0) + sqrNorm);
525
- if(numext::real(c0) >= RealScalar(0))
526
- beta = -beta;
517
+ if (numext::real(c0) >= RealScalar(0)) beta = -beta;
527
518
  tval(Qidx(0)) = 1;
528
- for (Index itq = 1; itq < nzcolQ; ++itq)
529
- tval(Qidx(itq)) /= (c0 - beta);
530
- tau = numext::conj((beta-c0) / beta);
531
-
519
+ for (Index itq = 1; itq < nzcolQ; ++itq) tval(Qidx(itq)) /= (c0 - beta);
520
+ tau = numext::conj((beta - c0) / beta);
532
521
  }
533
522
  }
534
523
 
535
524
  // Insert values in R
536
- for (Index i = nzcolR-1; i >= 0; i--)
537
- {
525
+ for (Index i = nzcolR - 1; i >= 0; i--) {
538
526
  Index curIdx = Ridx(i);
539
- if(curIdx < nonzeroCol)
540
- {
527
+ if (curIdx < nonzeroCol) {
541
528
  m_R.insertBackByOuterInnerUnordered(col, curIdx) = tval(curIdx);
542
529
  tval(curIdx) = Scalar(0.);
543
530
  }
544
531
  }
545
532
 
546
- if(nonzeroCol < diagSize && abs(beta) >= pivotThreshold)
547
- {
533
+ if (nonzeroCol < diagSize && abs(beta) >= pivotThreshold) {
548
534
  m_R.insertBackByOuterInner(col, nonzeroCol) = beta;
549
535
  // The householder coefficient
550
536
  m_hcoeffs(nonzeroCol) = tau;
551
537
  // Record the householder reflections
552
- for (Index itq = 0; itq < nzcolQ; ++itq)
553
- {
538
+ for (Index itq = 0; itq < nzcolQ; ++itq) {
554
539
  Index iQ = Qidx(itq);
555
- m_Q.insertBackByOuterInnerUnordered(nonzeroCol,iQ) = tval(iQ);
540
+ m_Q.insertBackByOuterInnerUnordered(nonzeroCol, iQ) = tval(iQ);
556
541
  tval(iQ) = Scalar(0.);
557
542
  }
558
543
  nonzeroCol++;
559
- if(nonzeroCol<diagSize)
560
- m_Q.startVec(nonzeroCol);
561
- }
562
- else
563
- {
544
+ if (nonzeroCol < diagSize) m_Q.startVec(nonzeroCol);
545
+ } else {
564
546
  // Zero pivot found: move implicitly this column to the end
565
- for (Index j = nonzeroCol; j < n-1; j++)
566
- std::swap(m_pivotperm.indices()(j), m_pivotperm.indices()[j+1]);
567
-
547
+ for (Index j = nonzeroCol; j < n - 1; j++) std::swap(m_pivotperm.indices()(j), m_pivotperm.indices()[j + 1]);
548
+
568
549
  // Recompute the column elimination tree
569
550
  internal::coletree(m_pmat, m_etree, m_firstRowElt, m_pivotperm.indices().data());
570
551
  m_isEtreeOk = false;
571
552
  }
572
553
  }
573
-
574
- m_hcoeffs.tail(diagSize-nonzeroCol).setZero();
575
-
554
+
555
+ m_hcoeffs.tail(diagSize - nonzeroCol).setZero();
556
+
576
557
  // Finalize the column pointers of the sparse matrices R and Q
577
558
  m_Q.finalize();
578
559
  m_Q.makeCompressed();
@@ -581,165 +562,145 @@ void SparseQR<MatrixType,OrderingType>::factorize(const MatrixType& mat)
581
562
  m_isQSorted = false;
582
563
 
583
564
  m_nonzeropivots = nonzeroCol;
584
-
585
- if(nonzeroCol<n)
586
- {
565
+
566
+ if (nonzeroCol < n) {
587
567
  // Permute the triangular factor to put the 'dead' columns to the end
588
568
  QRMatrixType tempR(m_R);
589
569
  m_R = tempR * m_pivotperm;
590
-
570
+
591
571
  // Update the column permutation
592
572
  m_outputPerm_c = m_outputPerm_c * m_pivotperm;
593
573
  }
594
-
595
- m_isInitialized = true;
574
+
575
+ m_isInitialized = true;
596
576
  m_factorizationIsok = true;
597
577
  m_info = Success;
598
578
  }
599
579
 
600
580
  template <typename SparseQRType, typename Derived>
601
- struct SparseQR_QProduct : ReturnByValue<SparseQR_QProduct<SparseQRType, Derived> >
602
- {
581
+ struct SparseQR_QProduct : ReturnByValue<SparseQR_QProduct<SparseQRType, Derived> > {
603
582
  typedef typename SparseQRType::QRMatrixType MatrixType;
604
583
  typedef typename SparseQRType::Scalar Scalar;
605
- // Get the references
606
- SparseQR_QProduct(const SparseQRType& qr, const Derived& other, bool transpose) :
607
- m_qr(qr),m_other(other),m_transpose(transpose) {}
584
+ // Get the references
585
+ SparseQR_QProduct(const SparseQRType& qr, const Derived& other, bool transpose)
586
+ : m_qr(qr), m_other(other), m_transpose(transpose) {}
608
587
  inline Index rows() const { return m_qr.matrixQ().rows(); }
609
588
  inline Index cols() const { return m_other.cols(); }
610
-
589
+
611
590
  // Assign to a vector
612
- template<typename DesType>
613
- void evalTo(DesType& res) const
614
- {
591
+ template <typename DesType>
592
+ void evalTo(DesType& res) const {
615
593
  Index m = m_qr.rows();
616
594
  Index n = m_qr.cols();
617
- Index diagSize = (std::min)(m,n);
595
+ Index diagSize = (std::min)(m, n);
618
596
  res = m_other;
619
- if (m_transpose)
620
- {
597
+ if (m_transpose) {
621
598
  eigen_assert(m_qr.m_Q.rows() == m_other.rows() && "Non conforming object sizes");
622
- //Compute res = Q' * other column by column
623
- for(Index j = 0; j < res.cols(); j++){
624
- for (Index k = 0; k < diagSize; k++)
625
- {
599
+ // Compute res = Q' * other column by column
600
+ for (Index j = 0; j < res.cols(); j++) {
601
+ for (Index k = 0; k < diagSize; k++) {
626
602
  Scalar tau = Scalar(0);
627
603
  tau = m_qr.m_Q.col(k).dot(res.col(j));
628
- if(tau==Scalar(0)) continue;
604
+ if (tau == Scalar(0)) continue;
629
605
  tau = tau * m_qr.m_hcoeffs(k);
630
606
  res.col(j) -= tau * m_qr.m_Q.col(k);
631
607
  }
632
608
  }
633
- }
634
- else
635
- {
609
+ } else {
636
610
  eigen_assert(m_qr.matrixQ().cols() == m_other.rows() && "Non conforming object sizes");
637
611
 
638
612
  res.conservativeResize(rows(), cols());
639
613
 
640
614
  // Compute res = Q * other column by column
641
- for(Index j = 0; j < res.cols(); j++)
642
- {
643
- for (Index k = diagSize-1; k >=0; k--)
644
- {
615
+ for (Index j = 0; j < res.cols(); j++) {
616
+ Index start_k = internal::is_identity<Derived>::value ? numext::mini(j, diagSize - 1) : diagSize - 1;
617
+ for (Index k = start_k; k >= 0; k--) {
645
618
  Scalar tau = Scalar(0);
646
619
  tau = m_qr.m_Q.col(k).dot(res.col(j));
647
- if(tau==Scalar(0)) continue;
620
+ if (tau == Scalar(0)) continue;
648
621
  tau = tau * numext::conj(m_qr.m_hcoeffs(k));
649
622
  res.col(j) -= tau * m_qr.m_Q.col(k);
650
623
  }
651
624
  }
652
625
  }
653
626
  }
654
-
627
+
655
628
  const SparseQRType& m_qr;
656
629
  const Derived& m_other;
657
- bool m_transpose; // TODO this actually means adjoint
630
+ bool m_transpose; // TODO this actually means adjoint
658
631
  };
659
632
 
660
- template<typename SparseQRType>
661
- struct SparseQRMatrixQReturnType : public EigenBase<SparseQRMatrixQReturnType<SparseQRType> >
662
- {
633
+ template <typename SparseQRType>
634
+ struct SparseQRMatrixQReturnType : public EigenBase<SparseQRMatrixQReturnType<SparseQRType> > {
663
635
  typedef typename SparseQRType::Scalar Scalar;
664
- typedef Matrix<Scalar,Dynamic,Dynamic> DenseMatrix;
665
- enum {
666
- RowsAtCompileTime = Dynamic,
667
- ColsAtCompileTime = Dynamic
668
- };
636
+ typedef Matrix<Scalar, Dynamic, Dynamic> DenseMatrix;
637
+ enum { RowsAtCompileTime = Dynamic, ColsAtCompileTime = Dynamic };
669
638
  explicit SparseQRMatrixQReturnType(const SparseQRType& qr) : m_qr(qr) {}
670
- template<typename Derived>
671
- SparseQR_QProduct<SparseQRType, Derived> operator*(const MatrixBase<Derived>& other)
672
- {
673
- return SparseQR_QProduct<SparseQRType,Derived>(m_qr,other.derived(),false);
639
+ template <typename Derived>
640
+ SparseQR_QProduct<SparseQRType, Derived> operator*(const MatrixBase<Derived>& other) {
641
+ return SparseQR_QProduct<SparseQRType, Derived>(m_qr, other.derived(), false);
674
642
  }
675
643
  // To use for operations with the adjoint of Q
676
- SparseQRMatrixQTransposeReturnType<SparseQRType> adjoint() const
677
- {
644
+ SparseQRMatrixQTransposeReturnType<SparseQRType> adjoint() const {
678
645
  return SparseQRMatrixQTransposeReturnType<SparseQRType>(m_qr);
679
646
  }
680
647
  inline Index rows() const { return m_qr.rows(); }
681
648
  inline Index cols() const { return m_qr.rows(); }
682
649
  // To use for operations with the transpose of Q FIXME this is the same as adjoint at the moment
683
- SparseQRMatrixQTransposeReturnType<SparseQRType> transpose() const
684
- {
650
+ SparseQRMatrixQTransposeReturnType<SparseQRType> transpose() const {
685
651
  return SparseQRMatrixQTransposeReturnType<SparseQRType>(m_qr);
686
652
  }
687
653
  const SparseQRType& m_qr;
688
654
  };
689
655
 
690
656
  // TODO this actually represents the adjoint of Q
691
- template<typename SparseQRType>
692
- struct SparseQRMatrixQTransposeReturnType
693
- {
657
+ template <typename SparseQRType>
658
+ struct SparseQRMatrixQTransposeReturnType {
694
659
  explicit SparseQRMatrixQTransposeReturnType(const SparseQRType& qr) : m_qr(qr) {}
695
- template<typename Derived>
696
- SparseQR_QProduct<SparseQRType,Derived> operator*(const MatrixBase<Derived>& other)
697
- {
698
- return SparseQR_QProduct<SparseQRType,Derived>(m_qr,other.derived(), true);
660
+ template <typename Derived>
661
+ SparseQR_QProduct<SparseQRType, Derived> operator*(const MatrixBase<Derived>& other) {
662
+ return SparseQR_QProduct<SparseQRType, Derived>(m_qr, other.derived(), true);
699
663
  }
700
664
  const SparseQRType& m_qr;
701
665
  };
702
666
 
703
667
  namespace internal {
704
-
705
- template<typename SparseQRType>
706
- struct evaluator_traits<SparseQRMatrixQReturnType<SparseQRType> >
707
- {
668
+
669
+ template <typename SparseQRType>
670
+ struct evaluator_traits<SparseQRMatrixQReturnType<SparseQRType> > {
708
671
  typedef typename SparseQRType::MatrixType MatrixType;
709
672
  typedef typename storage_kind_to_evaluator_kind<typename MatrixType::StorageKind>::Kind Kind;
710
673
  typedef SparseShape Shape;
711
674
  };
712
675
 
713
- template< typename DstXprType, typename SparseQRType>
714
- struct Assignment<DstXprType, SparseQRMatrixQReturnType<SparseQRType>, internal::assign_op<typename DstXprType::Scalar,typename DstXprType::Scalar>, Sparse2Sparse>
715
- {
676
+ template <typename DstXprType, typename SparseQRType>
677
+ struct Assignment<DstXprType, SparseQRMatrixQReturnType<SparseQRType>,
678
+ internal::assign_op<typename DstXprType::Scalar, typename DstXprType::Scalar>, Sparse2Sparse> {
716
679
  typedef SparseQRMatrixQReturnType<SparseQRType> SrcXprType;
717
680
  typedef typename DstXprType::Scalar Scalar;
718
681
  typedef typename DstXprType::StorageIndex StorageIndex;
719
- static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<Scalar,Scalar> &/*func*/)
720
- {
682
+ static void run(DstXprType& dst, const SrcXprType& src, const internal::assign_op<Scalar, Scalar>& /*func*/) {
721
683
  typename DstXprType::PlainObject idMat(src.rows(), src.cols());
722
684
  idMat.setIdentity();
723
685
  // Sort the sparse householder reflectors if needed
724
- const_cast<SparseQRType *>(&src.m_qr)->_sort_matrix_Q();
686
+ const_cast<SparseQRType*>(&src.m_qr)->_sort_matrix_Q();
725
687
  dst = SparseQR_QProduct<SparseQRType, DstXprType>(src.m_qr, idMat, false);
726
688
  }
727
689
  };
728
690
 
729
- template< typename DstXprType, typename SparseQRType>
730
- struct Assignment<DstXprType, SparseQRMatrixQReturnType<SparseQRType>, internal::assign_op<typename DstXprType::Scalar,typename DstXprType::Scalar>, Sparse2Dense>
731
- {
691
+ template <typename DstXprType, typename SparseQRType>
692
+ struct Assignment<DstXprType, SparseQRMatrixQReturnType<SparseQRType>,
693
+ internal::assign_op<typename DstXprType::Scalar, typename DstXprType::Scalar>, Sparse2Dense> {
732
694
  typedef SparseQRMatrixQReturnType<SparseQRType> SrcXprType;
733
695
  typedef typename DstXprType::Scalar Scalar;
734
696
  typedef typename DstXprType::StorageIndex StorageIndex;
735
- static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<Scalar,Scalar> &/*func*/)
736
- {
697
+ static void run(DstXprType& dst, const SrcXprType& src, const internal::assign_op<Scalar, Scalar>& /*func*/) {
737
698
  dst = src.m_qr.matrixQ() * DstXprType::Identity(src.m_qr.rows(), src.m_qr.rows());
738
699
  }
739
700
  };
740
701
 
741
- } // end namespace internal
702
+ } // end namespace internal
742
703
 
743
- } // end namespace Eigen
704
+ } // end namespace Eigen
744
705
 
745
706
  #endif