@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
@@ -11,82 +11,94 @@
11
11
  #ifndef EIGEN_FULLPIVOTINGHOUSEHOLDERQR_H
12
12
  #define EIGEN_FULLPIVOTINGHOUSEHOLDERQR_H
13
13
 
14
- namespace Eigen {
14
+ // IWYU pragma: private
15
+ #include "./InternalHeaderCheck.h"
16
+
17
+ namespace Eigen {
15
18
 
16
19
  namespace internal {
17
20
 
18
- template<typename _MatrixType> struct traits<FullPivHouseholderQR<_MatrixType> >
19
- : traits<_MatrixType>
20
- {
21
+ template <typename MatrixType_, typename PermutationIndex_>
22
+ struct traits<FullPivHouseholderQR<MatrixType_, PermutationIndex_> > : traits<MatrixType_> {
21
23
  typedef MatrixXpr XprKind;
22
24
  typedef SolverStorage StorageKind;
23
- typedef int StorageIndex;
25
+ typedef PermutationIndex_ PermutationIndex;
24
26
  enum { Flags = 0 };
25
27
  };
26
28
 
27
- template<typename MatrixType> struct FullPivHouseholderQRMatrixQReturnType;
29
+ template <typename MatrixType, typename PermutationIndex>
30
+ struct FullPivHouseholderQRMatrixQReturnType;
28
31
 
29
- template<typename MatrixType>
30
- struct traits<FullPivHouseholderQRMatrixQReturnType<MatrixType> >
31
- {
32
+ template <typename MatrixType, typename PermutationIndex>
33
+ struct traits<FullPivHouseholderQRMatrixQReturnType<MatrixType, PermutationIndex> > {
32
34
  typedef typename MatrixType::PlainObject ReturnType;
33
35
  };
34
36
 
35
- } // end namespace internal
37
+ } // end namespace internal
36
38
 
37
39
  /** \ingroup QR_Module
38
- *
39
- * \class FullPivHouseholderQR
40
- *
41
- * \brief Householder rank-revealing QR decomposition of a matrix with full pivoting
42
- *
43
- * \tparam _MatrixType the type of the matrix of which we are computing the QR decomposition
44
- *
45
- * This class performs a rank-revealing QR decomposition of a matrix \b A into matrices \b P, \b P', \b Q and \b R
46
- * such that
47
- * \f[
48
- * \mathbf{P} \, \mathbf{A} \, \mathbf{P}' = \mathbf{Q} \, \mathbf{R}
49
- * \f]
50
- * by using Householder transformations. Here, \b P and \b P' are permutation matrices, \b Q a unitary matrix
51
- * and \b R an upper triangular matrix.
52
- *
53
- * This decomposition performs a very prudent full pivoting in order to be rank-revealing and achieve optimal
54
- * numerical stability. The trade-off is that it is slower than HouseholderQR and ColPivHouseholderQR.
55
- *
56
- * This class supports the \link InplaceDecomposition inplace decomposition \endlink mechanism.
57
- *
58
- * \sa MatrixBase::fullPivHouseholderQr()
59
- */
60
- template<typename _MatrixType> class FullPivHouseholderQR
61
- : public SolverBase<FullPivHouseholderQR<_MatrixType> >
62
- {
63
- public:
64
-
65
- typedef _MatrixType MatrixType;
66
- typedef SolverBase<FullPivHouseholderQR> Base;
67
- friend class SolverBase<FullPivHouseholderQR>;
68
-
69
- EIGEN_GENERIC_PUBLIC_INTERFACE(FullPivHouseholderQR)
70
- enum {
71
- MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
72
- MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
73
- };
74
- typedef internal::FullPivHouseholderQRMatrixQReturnType<MatrixType> MatrixQReturnType;
75
- typedef typename internal::plain_diag_type<MatrixType>::type HCoeffsType;
76
- typedef Matrix<StorageIndex, 1,
77
- EIGEN_SIZE_MIN_PREFER_DYNAMIC(ColsAtCompileTime,RowsAtCompileTime), RowMajor, 1,
78
- EIGEN_SIZE_MIN_PREFER_FIXED(MaxColsAtCompileTime,MaxRowsAtCompileTime)> IntDiagSizeVectorType;
79
- typedef PermutationMatrix<ColsAtCompileTime, MaxColsAtCompileTime> PermutationType;
80
- typedef typename internal::plain_row_type<MatrixType>::type RowVectorType;
81
- typedef typename internal::plain_col_type<MatrixType>::type ColVectorType;
82
- typedef typename MatrixType::PlainObject PlainObject;
83
-
84
- /** \brief Default Constructor.
85
- *
86
- * The default constructor is useful in cases in which the user intends to
87
- * perform decompositions via FullPivHouseholderQR::compute(const MatrixType&).
88
- */
89
- FullPivHouseholderQR()
40
+ *
41
+ * \class FullPivHouseholderQR
42
+ *
43
+ * \brief Householder rank-revealing QR decomposition of a matrix with full pivoting
44
+ *
45
+ * \tparam MatrixType_ the type of the matrix of which we are computing the QR decomposition
46
+ *
47
+ * This class performs a rank-revealing QR decomposition of a matrix \b A into matrices \b P, \b P', \b Q and \b R
48
+ * such that
49
+ * \f[
50
+ * \mathbf{P} \, \mathbf{A} \, \mathbf{P}' = \mathbf{Q} \, \mathbf{R}
51
+ * \f]
52
+ * by using Householder transformations. Here, \b P and \b P' are permutation matrices, \b Q a unitary matrix
53
+ * and \b R an upper triangular matrix.
54
+ *
55
+ * This decomposition performs a very prudent full pivoting in order to be rank-revealing and achieve optimal
56
+ * numerical stability. The trade-off is that it is slower than HouseholderQR and ColPivHouseholderQR.
57
+ *
58
+ * This class supports the \link InplaceDecomposition inplace decomposition \endlink mechanism.
59
+ *
60
+ * \sa MatrixBase::fullPivHouseholderQr()
61
+ */
62
+ template <typename MatrixType_, typename PermutationIndex_>
63
+ class FullPivHouseholderQR : public SolverBase<FullPivHouseholderQR<MatrixType_, PermutationIndex_> > {
64
+ public:
65
+ typedef MatrixType_ MatrixType;
66
+ typedef SolverBase<FullPivHouseholderQR> Base;
67
+ friend class SolverBase<FullPivHouseholderQR>;
68
+ typedef PermutationIndex_ PermutationIndex;
69
+ EIGEN_GENERIC_PUBLIC_INTERFACE(FullPivHouseholderQR)
70
+
71
+ enum {
72
+ MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
73
+ MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
74
+ };
75
+ typedef internal::FullPivHouseholderQRMatrixQReturnType<MatrixType, PermutationIndex> MatrixQReturnType;
76
+ typedef typename internal::plain_diag_type<MatrixType>::type HCoeffsType;
77
+ typedef Matrix<PermutationIndex, 1, internal::min_size_prefer_dynamic(ColsAtCompileTime, RowsAtCompileTime), RowMajor,
78
+ 1, internal::min_size_prefer_fixed(MaxColsAtCompileTime, MaxRowsAtCompileTime)>
79
+ IntDiagSizeVectorType;
80
+ typedef PermutationMatrix<ColsAtCompileTime, MaxColsAtCompileTime, PermutationIndex> PermutationType;
81
+ typedef typename internal::plain_row_type<MatrixType>::type RowVectorType;
82
+ typedef typename internal::plain_col_type<MatrixType>::type ColVectorType;
83
+ typedef typename MatrixType::PlainObject PlainObject;
84
+
85
+ /** \brief Reports whether the QR factorization was successful.
86
+ *
87
+ * \note This function always returns \c Success. It is provided for compatibility
88
+ * with other factorization routines.
89
+ * \returns \c Success
90
+ */
91
+ ComputationInfo info() const {
92
+ eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
93
+ return Success;
94
+ }
95
+
96
+ /** \brief Default Constructor.
97
+ *
98
+ * The default constructor is useful in cases in which the user intends to
99
+ * perform decompositions via FullPivHouseholderQR::compute(const MatrixType&).
100
+ */
101
+ FullPivHouseholderQR()
90
102
  : m_qr(),
91
103
  m_hCoeffs(),
92
104
  m_rows_transpositions(),
@@ -96,36 +108,36 @@ template<typename _MatrixType> class FullPivHouseholderQR
96
108
  m_isInitialized(false),
97
109
  m_usePrescribedThreshold(false) {}
98
110
 
99
- /** \brief Default Constructor with memory preallocation
100
- *
101
- * Like the default constructor but with preallocation of the internal data
102
- * according to the specified problem \a size.
103
- * \sa FullPivHouseholderQR()
104
- */
105
- FullPivHouseholderQR(Index rows, Index cols)
111
+ /** \brief Default Constructor with memory preallocation
112
+ *
113
+ * Like the default constructor but with preallocation of the internal data
114
+ * according to the specified problem \a size.
115
+ * \sa FullPivHouseholderQR()
116
+ */
117
+ FullPivHouseholderQR(Index rows, Index cols)
106
118
  : m_qr(rows, cols),
107
- m_hCoeffs((std::min)(rows,cols)),
108
- m_rows_transpositions((std::min)(rows,cols)),
109
- m_cols_transpositions((std::min)(rows,cols)),
119
+ m_hCoeffs((std::min)(rows, cols)),
120
+ m_rows_transpositions((std::min)(rows, cols)),
121
+ m_cols_transpositions((std::min)(rows, cols)),
110
122
  m_cols_permutation(cols),
111
123
  m_temp(cols),
112
124
  m_isInitialized(false),
113
125
  m_usePrescribedThreshold(false) {}
114
126
 
115
- /** \brief Constructs a QR factorization from a given matrix
116
- *
117
- * This constructor computes the QR factorization of the matrix \a matrix by calling
118
- * the method compute(). It is a short cut for:
119
- *
120
- * \code
121
- * FullPivHouseholderQR<MatrixType> qr(matrix.rows(), matrix.cols());
122
- * qr.compute(matrix);
123
- * \endcode
124
- *
125
- * \sa compute()
126
- */
127
- template<typename InputType>
128
- explicit FullPivHouseholderQR(const EigenBase<InputType>& matrix)
127
+ /** \brief Constructs a QR factorization from a given matrix
128
+ *
129
+ * This constructor computes the QR factorization of the matrix \a matrix by calling
130
+ * the method compute(). It is a short cut for:
131
+ *
132
+ * \code
133
+ * FullPivHouseholderQR<MatrixType> qr(matrix.rows(), matrix.cols());
134
+ * qr.compute(matrix);
135
+ * \endcode
136
+ *
137
+ * \sa compute()
138
+ */
139
+ template <typename InputType>
140
+ explicit FullPivHouseholderQR(const EigenBase<InputType>& matrix)
129
141
  : m_qr(matrix.rows(), matrix.cols()),
130
142
  m_hCoeffs((std::min)(matrix.rows(), matrix.cols())),
131
143
  m_rows_transpositions((std::min)(matrix.rows(), matrix.cols())),
@@ -133,19 +145,19 @@ template<typename _MatrixType> class FullPivHouseholderQR
133
145
  m_cols_permutation(matrix.cols()),
134
146
  m_temp(matrix.cols()),
135
147
  m_isInitialized(false),
136
- m_usePrescribedThreshold(false)
137
- {
138
- compute(matrix.derived());
139
- }
148
+ m_usePrescribedThreshold(false) {
149
+ compute(matrix.derived());
150
+ }
140
151
 
141
- /** \brief Constructs a QR factorization from a given matrix
142
- *
143
- * This overloaded constructor is provided for \link InplaceDecomposition inplace decomposition \endlink when \c MatrixType is a Eigen::Ref.
144
- *
145
- * \sa FullPivHouseholderQR(const EigenBase&)
146
- */
147
- template<typename InputType>
148
- explicit FullPivHouseholderQR(EigenBase<InputType>& matrix)
152
+ /** \brief Constructs a QR factorization from a given matrix
153
+ *
154
+ * This overloaded constructor is provided for \link InplaceDecomposition inplace decomposition \endlink when \c
155
+ * MatrixType is a Eigen::Ref.
156
+ *
157
+ * \sa FullPivHouseholderQR(const EigenBase&)
158
+ */
159
+ template <typename InputType>
160
+ explicit FullPivHouseholderQR(EigenBase<InputType>& matrix)
149
161
  : m_qr(matrix.derived()),
150
162
  m_hCoeffs((std::min)(matrix.rows(), matrix.cols())),
151
163
  m_rows_transpositions((std::min)(matrix.rows(), matrix.cols())),
@@ -153,319 +165,341 @@ template<typename _MatrixType> class FullPivHouseholderQR
153
165
  m_cols_permutation(matrix.cols()),
154
166
  m_temp(matrix.cols()),
155
167
  m_isInitialized(false),
156
- m_usePrescribedThreshold(false)
157
- {
158
- computeInPlace();
159
- }
168
+ m_usePrescribedThreshold(false) {
169
+ computeInPlace();
170
+ }
160
171
 
161
- #ifdef EIGEN_PARSED_BY_DOXYGEN
162
- /** This method finds a solution x to the equation Ax=b, where A is the matrix of which
163
- * \c *this is the QR decomposition.
164
- *
165
- * \param b the right-hand-side of the equation to solve.
166
- *
167
- * \returns the exact or least-square solution if the rank is greater or equal to the number of columns of A,
168
- * and an arbitrary solution otherwise.
169
- *
170
- * \note_about_checking_solutions
171
- *
172
- * \note_about_arbitrary_choice_of_solution
173
- *
174
- * Example: \include FullPivHouseholderQR_solve.cpp
175
- * Output: \verbinclude FullPivHouseholderQR_solve.out
176
- */
177
- template<typename Rhs>
178
- inline const Solve<FullPivHouseholderQR, Rhs>
179
- solve(const MatrixBase<Rhs>& b) const;
180
- #endif
181
-
182
- /** \returns Expression object representing the matrix Q
183
- */
184
- MatrixQReturnType matrixQ(void) const;
185
-
186
- /** \returns a reference to the matrix where the Householder QR decomposition is stored
187
- */
188
- const MatrixType& matrixQR() const
189
- {
190
- eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
191
- return m_qr;
192
- }
172
+ #ifdef EIGEN_PARSED_BY_DOXYGEN
173
+ /** This method finds a solution x to the equation Ax=b, where A is the matrix of which
174
+ * \c *this is the QR decomposition.
175
+ *
176
+ * \param b the right-hand-side of the equation to solve.
177
+ *
178
+ * \returns the exact or least-square solution if the rank is greater or equal to the number of columns of A,
179
+ * and an arbitrary solution otherwise.
180
+ *
181
+ * \note_about_checking_solutions
182
+ *
183
+ * \note_about_arbitrary_choice_of_solution
184
+ *
185
+ * Example: \include FullPivHouseholderQR_solve.cpp
186
+ * Output: \verbinclude FullPivHouseholderQR_solve.out
187
+ */
188
+ template <typename Rhs>
189
+ inline const Solve<FullPivHouseholderQR, Rhs> solve(const MatrixBase<Rhs>& b) const;
190
+ #endif
193
191
 
194
- template<typename InputType>
195
- FullPivHouseholderQR& compute(const EigenBase<InputType>& matrix);
192
+ /** \returns Expression object representing the matrix Q
193
+ */
194
+ MatrixQReturnType matrixQ(void) const;
196
195
 
197
- /** \returns a const reference to the column permutation matrix */
198
- const PermutationType& colsPermutation() const
199
- {
200
- eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
201
- return m_cols_permutation;
202
- }
196
+ /** \returns a reference to the matrix where the Householder QR decomposition is stored
197
+ */
198
+ const MatrixType& matrixQR() const {
199
+ eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
200
+ return m_qr;
201
+ }
203
202
 
204
- /** \returns a const reference to the vector of indices representing the rows transpositions */
205
- const IntDiagSizeVectorType& rowsTranspositions() const
206
- {
207
- eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
208
- return m_rows_transpositions;
209
- }
203
+ template <typename InputType>
204
+ FullPivHouseholderQR& compute(const EigenBase<InputType>& matrix);
210
205
 
211
- /** \returns the absolute value of the determinant of the matrix of which
212
- * *this is the QR decomposition. It has only linear complexity
213
- * (that is, O(n) where n is the dimension of the square matrix)
214
- * as the QR decomposition has already been computed.
215
- *
216
- * \note This is only for square matrices.
217
- *
218
- * \warning a determinant can be very big or small, so for matrices
219
- * of large enough dimension, there is a risk of overflow/underflow.
220
- * One way to work around that is to use logAbsDeterminant() instead.
221
- *
222
- * \sa logAbsDeterminant(), MatrixBase::determinant()
223
- */
224
- typename MatrixType::RealScalar absDeterminant() const;
225
-
226
- /** \returns the natural log of the absolute value of the determinant of the matrix of which
227
- * *this is the QR decomposition. It has only linear complexity
228
- * (that is, O(n) where n is the dimension of the square matrix)
229
- * as the QR decomposition has already been computed.
230
- *
231
- * \note This is only for square matrices.
232
- *
233
- * \note This method is useful to work around the risk of overflow/underflow that's inherent
234
- * to determinant computation.
235
- *
236
- * \sa absDeterminant(), MatrixBase::determinant()
237
- */
238
- typename MatrixType::RealScalar logAbsDeterminant() const;
239
-
240
- /** \returns the rank of the matrix of which *this is the QR decomposition.
241
- *
242
- * \note This method has to determine which pivots should be considered nonzero.
243
- * For that, it uses the threshold value that you can control by calling
244
- * setThreshold(const RealScalar&).
245
- */
246
- inline Index rank() const
247
- {
248
- using std::abs;
249
- eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
250
- RealScalar premultiplied_threshold = abs(m_maxpivot) * threshold();
251
- Index result = 0;
252
- for(Index i = 0; i < m_nonzero_pivots; ++i)
253
- result += (abs(m_qr.coeff(i,i)) > premultiplied_threshold);
254
- return result;
255
- }
206
+ /** \returns a const reference to the column permutation matrix */
207
+ const PermutationType& colsPermutation() const {
208
+ eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
209
+ return m_cols_permutation;
210
+ }
256
211
 
257
- /** \returns the dimension of the kernel of the matrix of which *this is the QR decomposition.
258
- *
259
- * \note This method has to determine which pivots should be considered nonzero.
260
- * For that, it uses the threshold value that you can control by calling
261
- * setThreshold(const RealScalar&).
262
- */
263
- inline Index dimensionOfKernel() const
264
- {
265
- eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
266
- return cols() - rank();
267
- }
212
+ /** \returns a const reference to the vector of indices representing the rows transpositions */
213
+ const IntDiagSizeVectorType& rowsTranspositions() const {
214
+ eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
215
+ return m_rows_transpositions;
216
+ }
268
217
 
269
- /** \returns true if the matrix of which *this is the QR decomposition represents an injective
270
- * linear map, i.e. has trivial kernel; false otherwise.
271
- *
272
- * \note This method has to determine which pivots should be considered nonzero.
273
- * For that, it uses the threshold value that you can control by calling
274
- * setThreshold(const RealScalar&).
275
- */
276
- inline bool isInjective() const
277
- {
278
- eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
279
- return rank() == cols();
280
- }
218
+ /** \returns the determinant of the matrix of which
219
+ * *this is the QR decomposition. It has only linear complexity
220
+ * (that is, O(n) where n is the dimension of the square matrix)
221
+ * as the QR decomposition has already been computed.
222
+ *
223
+ * \note This is only for square matrices.
224
+ *
225
+ * \warning a determinant can be very big or small, so for matrices
226
+ * of large enough dimension, there is a risk of overflow/underflow.
227
+ * One way to work around that is to use logAbsDeterminant() instead.
228
+ *
229
+ * \sa absDeterminant(), logAbsDeterminant(), MatrixBase::determinant()
230
+ */
231
+ typename MatrixType::Scalar determinant() const;
232
+
233
+ /** \returns the absolute value of the determinant of the matrix of which
234
+ * *this is the QR decomposition. It has only linear complexity
235
+ * (that is, O(n) where n is the dimension of the square matrix)
236
+ * as the QR decomposition has already been computed.
237
+ *
238
+ * \note This is only for square matrices.
239
+ *
240
+ * \warning a determinant can be very big or small, so for matrices
241
+ * of large enough dimension, there is a risk of overflow/underflow.
242
+ * One way to work around that is to use logAbsDeterminant() instead.
243
+ *
244
+ * \sa determinant(), logAbsDeterminant(), MatrixBase::determinant()
245
+ */
246
+ typename MatrixType::RealScalar absDeterminant() const;
247
+
248
+ /** \returns the natural log of the absolute value of the determinant of the matrix of which
249
+ * *this is the QR decomposition. It has only linear complexity
250
+ * (that is, O(n) where n is the dimension of the square matrix)
251
+ * as the QR decomposition has already been computed.
252
+ *
253
+ * \note This is only for square matrices.
254
+ *
255
+ * \note This method is useful to work around the risk of overflow/underflow that's inherent
256
+ * to determinant computation.
257
+ *
258
+ * \sa determinant(), absDeterminant(), MatrixBase::determinant()
259
+ */
260
+ typename MatrixType::RealScalar logAbsDeterminant() const;
261
+
262
+ /** \returns the sign of the determinant of the matrix of which
263
+ * *this is the QR decomposition. It has only linear complexity
264
+ * (that is, O(n) where n is the dimension of the square matrix)
265
+ * as the QR decomposition has already been computed.
266
+ *
267
+ * \note This is only for square matrices.
268
+ *
269
+ * \note This method is useful to work around the risk of overflow/underflow that's inherent
270
+ * to determinant computation.
271
+ *
272
+ * \sa determinant(), absDeterminant(), logAbsDeterminant(), MatrixBase::determinant()
273
+ */
274
+ typename MatrixType::Scalar signDeterminant() const;
275
+
276
+ /** \returns the rank of the matrix of which *this is the QR decomposition.
277
+ *
278
+ * \note This method has to determine which pivots should be considered nonzero.
279
+ * For that, it uses the threshold value that you can control by calling
280
+ * setThreshold(const RealScalar&).
281
+ */
282
+ inline Index rank() const {
283
+ using std::abs;
284
+ eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
285
+ RealScalar premultiplied_threshold = abs(m_maxpivot) * threshold();
286
+ Index result = 0;
287
+ for (Index i = 0; i < m_nonzero_pivots; ++i) result += (abs(m_qr.coeff(i, i)) > premultiplied_threshold);
288
+ return result;
289
+ }
281
290
 
282
- /** \returns true if the matrix of which *this is the QR decomposition represents a surjective
283
- * linear map; false otherwise.
284
- *
285
- * \note This method has to determine which pivots should be considered nonzero.
286
- * For that, it uses the threshold value that you can control by calling
287
- * setThreshold(const RealScalar&).
288
- */
289
- inline bool isSurjective() const
290
- {
291
- eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
292
- return rank() == rows();
293
- }
291
+ /** \returns the dimension of the kernel of the matrix of which *this is the QR decomposition.
292
+ *
293
+ * \note This method has to determine which pivots should be considered nonzero.
294
+ * For that, it uses the threshold value that you can control by calling
295
+ * setThreshold(const RealScalar&).
296
+ */
297
+ inline Index dimensionOfKernel() const {
298
+ eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
299
+ return cols() - rank();
300
+ }
294
301
 
295
- /** \returns true if the matrix of which *this is the QR decomposition is invertible.
296
- *
297
- * \note This method has to determine which pivots should be considered nonzero.
298
- * For that, it uses the threshold value that you can control by calling
299
- * setThreshold(const RealScalar&).
300
- */
301
- inline bool isInvertible() const
302
- {
303
- eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
304
- return isInjective() && isSurjective();
305
- }
302
+ /** \returns true if the matrix of which *this is the QR decomposition represents an injective
303
+ * linear map, i.e. has trivial kernel; false otherwise.
304
+ *
305
+ * \note This method has to determine which pivots should be considered nonzero.
306
+ * For that, it uses the threshold value that you can control by calling
307
+ * setThreshold(const RealScalar&).
308
+ */
309
+ inline bool isInjective() const {
310
+ eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
311
+ return rank() == cols();
312
+ }
306
313
 
307
- /** \returns the inverse of the matrix of which *this is the QR decomposition.
308
- *
309
- * \note If this matrix is not invertible, the returned matrix has undefined coefficients.
310
- * Use isInvertible() to first determine whether this matrix is invertible.
311
- */
312
- inline const Inverse<FullPivHouseholderQR> inverse() const
313
- {
314
- eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
315
- return Inverse<FullPivHouseholderQR>(*this);
316
- }
314
+ /** \returns true if the matrix of which *this is the QR decomposition represents a surjective
315
+ * linear map; false otherwise.
316
+ *
317
+ * \note This method has to determine which pivots should be considered nonzero.
318
+ * For that, it uses the threshold value that you can control by calling
319
+ * setThreshold(const RealScalar&).
320
+ */
321
+ inline bool isSurjective() const {
322
+ eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
323
+ return rank() == rows();
324
+ }
317
325
 
318
- inline Index rows() const { return m_qr.rows(); }
319
- inline Index cols() const { return m_qr.cols(); }
320
-
321
- /** \returns a const reference to the vector of Householder coefficients used to represent the factor \c Q.
322
- *
323
- * For advanced uses only.
324
- */
325
- const HCoeffsType& hCoeffs() const { return m_hCoeffs; }
326
-
327
- /** Allows to prescribe a threshold to be used by certain methods, such as rank(),
328
- * who need to determine when pivots are to be considered nonzero. This is not used for the
329
- * QR decomposition itself.
330
- *
331
- * When it needs to get the threshold value, Eigen calls threshold(). By default, this
332
- * uses a formula to automatically determine a reasonable threshold.
333
- * Once you have called the present method setThreshold(const RealScalar&),
334
- * your value is used instead.
335
- *
336
- * \param threshold The new value to use as the threshold.
337
- *
338
- * A pivot will be considered nonzero if its absolute value is strictly greater than
339
- * \f$ \vert pivot \vert \leqslant threshold \times \vert maxpivot \vert \f$
340
- * where maxpivot is the biggest pivot.
341
- *
342
- * If you want to come back to the default behavior, call setThreshold(Default_t)
343
- */
344
- FullPivHouseholderQR& setThreshold(const RealScalar& threshold)
345
- {
346
- m_usePrescribedThreshold = true;
347
- m_prescribedThreshold = threshold;
348
- return *this;
349
- }
326
+ /** \returns true if the matrix of which *this is the QR decomposition is invertible.
327
+ *
328
+ * \note This method has to determine which pivots should be considered nonzero.
329
+ * For that, it uses the threshold value that you can control by calling
330
+ * setThreshold(const RealScalar&).
331
+ */
332
+ inline bool isInvertible() const {
333
+ eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
334
+ return isInjective() && isSurjective();
335
+ }
350
336
 
351
- /** Allows to come back to the default behavior, letting Eigen use its default formula for
352
- * determining the threshold.
353
- *
354
- * You should pass the special object Eigen::Default as parameter here.
355
- * \code qr.setThreshold(Eigen::Default); \endcode
356
- *
357
- * See the documentation of setThreshold(const RealScalar&).
358
- */
359
- FullPivHouseholderQR& setThreshold(Default_t)
360
- {
361
- m_usePrescribedThreshold = false;
362
- return *this;
363
- }
337
+ /** \returns the inverse of the matrix of which *this is the QR decomposition.
338
+ *
339
+ * \note If this matrix is not invertible, the returned matrix has undefined coefficients.
340
+ * Use isInvertible() to first determine whether this matrix is invertible.
341
+ */
342
+ inline const Inverse<FullPivHouseholderQR> inverse() const {
343
+ eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
344
+ return Inverse<FullPivHouseholderQR>(*this);
345
+ }
364
346
 
365
- /** Returns the threshold that will be used by certain methods such as rank().
366
- *
367
- * See the documentation of setThreshold(const RealScalar&).
368
- */
369
- RealScalar threshold() const
370
- {
371
- eigen_assert(m_isInitialized || m_usePrescribedThreshold);
372
- return m_usePrescribedThreshold ? m_prescribedThreshold
373
- // this formula comes from experimenting (see "LU precision tuning" thread on the list)
374
- // and turns out to be identical to Higham's formula used already in LDLt.
375
- : NumTraits<Scalar>::epsilon() * RealScalar(m_qr.diagonalSize());
376
- }
347
+ inline Index rows() const { return m_qr.rows(); }
348
+ inline Index cols() const { return m_qr.cols(); }
349
+
350
+ /** \returns a const reference to the vector of Householder coefficients used to represent the factor \c Q.
351
+ *
352
+ * For advanced uses only.
353
+ */
354
+ const HCoeffsType& hCoeffs() const { return m_hCoeffs; }
355
+
356
+ /** Allows to prescribe a threshold to be used by certain methods, such as rank(),
357
+ * who need to determine when pivots are to be considered nonzero. This is not used for the
358
+ * QR decomposition itself.
359
+ *
360
+ * When it needs to get the threshold value, Eigen calls threshold(). By default, this
361
+ * uses a formula to automatically determine a reasonable threshold.
362
+ * Once you have called the present method setThreshold(const RealScalar&),
363
+ * your value is used instead.
364
+ *
365
+ * \param threshold The new value to use as the threshold.
366
+ *
367
+ * A pivot will be considered nonzero if its absolute value is strictly greater than
368
+ * \f$ \vert pivot \vert \leqslant threshold \times \vert maxpivot \vert \f$
369
+ * where maxpivot is the biggest pivot.
370
+ *
371
+ * If you want to come back to the default behavior, call setThreshold(Default_t)
372
+ */
373
+ FullPivHouseholderQR& setThreshold(const RealScalar& threshold) {
374
+ m_usePrescribedThreshold = true;
375
+ m_prescribedThreshold = threshold;
376
+ return *this;
377
+ }
377
378
 
378
- /** \returns the number of nonzero pivots in the QR decomposition.
379
- * Here nonzero is meant in the exact sense, not in a fuzzy sense.
380
- * So that notion isn't really intrinsically interesting, but it is
381
- * still useful when implementing algorithms.
382
- *
383
- * \sa rank()
384
- */
385
- inline Index nonzeroPivots() const
386
- {
387
- eigen_assert(m_isInitialized && "LU is not initialized.");
388
- return m_nonzero_pivots;
389
- }
379
+ /** Allows to come back to the default behavior, letting Eigen use its default formula for
380
+ * determining the threshold.
381
+ *
382
+ * You should pass the special object Eigen::Default as parameter here.
383
+ * \code qr.setThreshold(Eigen::Default); \endcode
384
+ *
385
+ * See the documentation of setThreshold(const RealScalar&).
386
+ */
387
+ FullPivHouseholderQR& setThreshold(Default_t) {
388
+ m_usePrescribedThreshold = false;
389
+ return *this;
390
+ }
390
391
 
391
- /** \returns the absolute value of the biggest pivot, i.e. the biggest
392
- * diagonal coefficient of U.
393
- */
394
- RealScalar maxPivot() const { return m_maxpivot; }
392
+ /** Returns the threshold that will be used by certain methods such as rank().
393
+ *
394
+ * See the documentation of setThreshold(const RealScalar&).
395
+ */
396
+ RealScalar threshold() const {
397
+ eigen_assert(m_isInitialized || m_usePrescribedThreshold);
398
+ return m_usePrescribedThreshold ? m_prescribedThreshold
399
+ // this formula comes from experimenting (see "LU precision tuning" thread on the
400
+ // list) and turns out to be identical to Higham's formula used already in LDLt.
401
+ : NumTraits<Scalar>::epsilon() * RealScalar(m_qr.diagonalSize());
402
+ }
395
403
 
396
- #ifndef EIGEN_PARSED_BY_DOXYGEN
397
- template<typename RhsType, typename DstType>
398
- void _solve_impl(const RhsType &rhs, DstType &dst) const;
404
+ /** \returns the number of nonzero pivots in the QR decomposition.
405
+ * Here nonzero is meant in the exact sense, not in a fuzzy sense.
406
+ * So that notion isn't really intrinsically interesting, but it is
407
+ * still useful when implementing algorithms.
408
+ *
409
+ * \sa rank()
410
+ */
411
+ inline Index nonzeroPivots() const {
412
+ eigen_assert(m_isInitialized && "LU is not initialized.");
413
+ return m_nonzero_pivots;
414
+ }
399
415
 
400
- template<bool Conjugate, typename RhsType, typename DstType>
401
- void _solve_impl_transposed(const RhsType &rhs, DstType &dst) const;
402
- #endif
416
+ /** \returns the absolute value of the biggest pivot, i.e. the biggest
417
+ * diagonal coefficient of U.
418
+ */
419
+ RealScalar maxPivot() const { return m_maxpivot; }
403
420
 
404
- protected:
421
+ #ifndef EIGEN_PARSED_BY_DOXYGEN
422
+ template <typename RhsType, typename DstType>
423
+ void _solve_impl(const RhsType& rhs, DstType& dst) const;
405
424
 
406
- static void check_template_parameters()
407
- {
408
- EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar);
409
- }
425
+ template <bool Conjugate, typename RhsType, typename DstType>
426
+ void _solve_impl_transposed(const RhsType& rhs, DstType& dst) const;
427
+ #endif
410
428
 
411
- void computeInPlace();
412
-
413
- MatrixType m_qr;
414
- HCoeffsType m_hCoeffs;
415
- IntDiagSizeVectorType m_rows_transpositions;
416
- IntDiagSizeVectorType m_cols_transpositions;
417
- PermutationType m_cols_permutation;
418
- RowVectorType m_temp;
419
- bool m_isInitialized, m_usePrescribedThreshold;
420
- RealScalar m_prescribedThreshold, m_maxpivot;
421
- Index m_nonzero_pivots;
422
- RealScalar m_precision;
423
- Index m_det_pq;
429
+ protected:
430
+ EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
431
+
432
+ void computeInPlace();
433
+
434
+ MatrixType m_qr;
435
+ HCoeffsType m_hCoeffs;
436
+ IntDiagSizeVectorType m_rows_transpositions;
437
+ IntDiagSizeVectorType m_cols_transpositions;
438
+ PermutationType m_cols_permutation;
439
+ RowVectorType m_temp;
440
+ bool m_isInitialized, m_usePrescribedThreshold;
441
+ RealScalar m_prescribedThreshold, m_maxpivot;
442
+ Index m_nonzero_pivots;
443
+ RealScalar m_precision;
444
+ Index m_det_p;
424
445
  };
425
446
 
426
- template<typename MatrixType>
427
- typename MatrixType::RealScalar FullPivHouseholderQR<MatrixType>::absDeterminant() const
428
- {
447
+ template <typename MatrixType, typename PermutationIndex>
448
+ typename MatrixType::Scalar FullPivHouseholderQR<MatrixType, PermutationIndex>::determinant() const {
449
+ eigen_assert(m_isInitialized && "HouseholderQR is not initialized.");
450
+ eigen_assert(m_qr.rows() == m_qr.cols() && "You can't take the determinant of a non-square matrix!");
451
+ Scalar detQ;
452
+ internal::householder_determinant<HCoeffsType, Scalar, NumTraits<Scalar>::IsComplex>::run(m_hCoeffs, detQ);
453
+ return isInjective() ? (detQ * Scalar(m_det_p)) * m_qr.diagonal().prod() : Scalar(0);
454
+ }
455
+
456
+ template <typename MatrixType, typename PermutationIndex>
457
+ typename MatrixType::RealScalar FullPivHouseholderQR<MatrixType, PermutationIndex>::absDeterminant() const {
429
458
  using std::abs;
430
459
  eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
431
460
  eigen_assert(m_qr.rows() == m_qr.cols() && "You can't take the determinant of a non-square matrix!");
432
- return abs(m_qr.diagonal().prod());
461
+ return isInjective() ? abs(m_qr.diagonal().prod()) : RealScalar(0);
433
462
  }
434
463
 
435
- template<typename MatrixType>
436
- typename MatrixType::RealScalar FullPivHouseholderQR<MatrixType>::logAbsDeterminant() const
437
- {
464
+ template <typename MatrixType, typename PermutationIndex>
465
+ typename MatrixType::RealScalar FullPivHouseholderQR<MatrixType, PermutationIndex>::logAbsDeterminant() const {
438
466
  eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
439
467
  eigen_assert(m_qr.rows() == m_qr.cols() && "You can't take the determinant of a non-square matrix!");
440
- return m_qr.diagonal().cwiseAbs().array().log().sum();
468
+ return isInjective() ? m_qr.diagonal().cwiseAbs().array().log().sum() : -NumTraits<RealScalar>::infinity();
469
+ }
470
+
471
+ template <typename MatrixType, typename PermutationIndex>
472
+ typename MatrixType::Scalar FullPivHouseholderQR<MatrixType, PermutationIndex>::signDeterminant() const {
473
+ eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
474
+ eigen_assert(m_qr.rows() == m_qr.cols() && "You can't take the determinant of a non-square matrix!");
475
+ Scalar detQ;
476
+ internal::householder_determinant<HCoeffsType, Scalar, NumTraits<Scalar>::IsComplex>::run(m_hCoeffs, detQ);
477
+ return isInjective() ? (detQ * Scalar(m_det_p)) * m_qr.diagonal().array().sign().prod() : Scalar(0);
441
478
  }
442
479
 
443
480
  /** Performs the QR factorization of the given matrix \a matrix. The result of
444
- * the factorization is stored into \c *this, and a reference to \c *this
445
- * is returned.
446
- *
447
- * \sa class FullPivHouseholderQR, FullPivHouseholderQR(const MatrixType&)
448
- */
449
- template<typename MatrixType>
450
- template<typename InputType>
451
- FullPivHouseholderQR<MatrixType>& FullPivHouseholderQR<MatrixType>::compute(const EigenBase<InputType>& matrix)
452
- {
481
+ * the factorization is stored into \c *this, and a reference to \c *this
482
+ * is returned.
483
+ *
484
+ * \sa class FullPivHouseholderQR, FullPivHouseholderQR(const MatrixType&)
485
+ */
486
+ template <typename MatrixType, typename PermutationIndex>
487
+ template <typename InputType>
488
+ FullPivHouseholderQR<MatrixType, PermutationIndex>& FullPivHouseholderQR<MatrixType, PermutationIndex>::compute(
489
+ const EigenBase<InputType>& matrix) {
453
490
  m_qr = matrix.derived();
454
491
  computeInPlace();
455
492
  return *this;
456
493
  }
457
494
 
458
- template<typename MatrixType>
459
- void FullPivHouseholderQR<MatrixType>::computeInPlace()
460
- {
461
- check_template_parameters();
462
-
495
+ template <typename MatrixType, typename PermutationIndex>
496
+ void FullPivHouseholderQR<MatrixType, PermutationIndex>::computeInPlace() {
497
+ eigen_assert(m_qr.cols() <= NumTraits<PermutationIndex>::highest());
463
498
  using std::abs;
464
499
  Index rows = m_qr.rows();
465
500
  Index cols = m_qr.cols();
466
- Index size = (std::min)(rows,cols);
501
+ Index size = (std::min)(rows, cols);
467
502
 
468
-
469
503
  m_hCoeffs.resize(size);
470
504
 
471
505
  m_temp.resize(cols);
@@ -478,132 +512,122 @@ void FullPivHouseholderQR<MatrixType>::computeInPlace()
478
512
 
479
513
  RealScalar biggest(0);
480
514
 
481
- m_nonzero_pivots = size; // the generic case is that in which all pivots are nonzero (invertible case)
515
+ m_nonzero_pivots = size; // the generic case is that in which all pivots are nonzero (invertible case)
482
516
  m_maxpivot = RealScalar(0);
483
517
 
484
- for (Index k = 0; k < size; ++k)
485
- {
518
+ for (Index k = 0; k < size; ++k) {
486
519
  Index row_of_biggest_in_corner, col_of_biggest_in_corner;
487
520
  typedef internal::scalar_score_coeff_op<Scalar> Scoring;
488
521
  typedef typename Scoring::result_type Score;
489
522
 
490
- Score score = m_qr.bottomRightCorner(rows-k, cols-k)
523
+ Score score = m_qr.bottomRightCorner(rows - k, cols - k)
491
524
  .unaryExpr(Scoring())
492
525
  .maxCoeff(&row_of_biggest_in_corner, &col_of_biggest_in_corner);
493
526
  row_of_biggest_in_corner += k;
494
527
  col_of_biggest_in_corner += k;
495
- RealScalar biggest_in_corner = internal::abs_knowing_score<Scalar>()(m_qr(row_of_biggest_in_corner, col_of_biggest_in_corner), score);
496
- if(k==0) biggest = biggest_in_corner;
528
+ RealScalar biggest_in_corner =
529
+ internal::abs_knowing_score<Scalar>()(m_qr(row_of_biggest_in_corner, col_of_biggest_in_corner), score);
530
+ if (k == 0) biggest = biggest_in_corner;
497
531
 
498
532
  // if the corner is negligible, then we have less than full rank, and we can finish early
499
- if(internal::isMuchSmallerThan(biggest_in_corner, biggest, m_precision))
500
- {
533
+ if (internal::isMuchSmallerThan(biggest_in_corner, biggest, m_precision)) {
501
534
  m_nonzero_pivots = k;
502
- for(Index i = k; i < size; i++)
503
- {
504
- m_rows_transpositions.coeffRef(i) = internal::convert_index<StorageIndex>(i);
505
- m_cols_transpositions.coeffRef(i) = internal::convert_index<StorageIndex>(i);
535
+ for (Index i = k; i < size; i++) {
536
+ m_rows_transpositions.coeffRef(i) = internal::convert_index<PermutationIndex>(i);
537
+ m_cols_transpositions.coeffRef(i) = internal::convert_index<PermutationIndex>(i);
506
538
  m_hCoeffs.coeffRef(i) = Scalar(0);
507
539
  }
508
540
  break;
509
541
  }
510
542
 
511
- m_rows_transpositions.coeffRef(k) = internal::convert_index<StorageIndex>(row_of_biggest_in_corner);
512
- m_cols_transpositions.coeffRef(k) = internal::convert_index<StorageIndex>(col_of_biggest_in_corner);
513
- if(k != row_of_biggest_in_corner) {
514
- m_qr.row(k).tail(cols-k).swap(m_qr.row(row_of_biggest_in_corner).tail(cols-k));
543
+ m_rows_transpositions.coeffRef(k) = internal::convert_index<PermutationIndex>(row_of_biggest_in_corner);
544
+ m_cols_transpositions.coeffRef(k) = internal::convert_index<PermutationIndex>(col_of_biggest_in_corner);
545
+ if (k != row_of_biggest_in_corner) {
546
+ m_qr.row(k).tail(cols - k).swap(m_qr.row(row_of_biggest_in_corner).tail(cols - k));
515
547
  ++number_of_transpositions;
516
548
  }
517
- if(k != col_of_biggest_in_corner) {
549
+ if (k != col_of_biggest_in_corner) {
518
550
  m_qr.col(k).swap(m_qr.col(col_of_biggest_in_corner));
519
551
  ++number_of_transpositions;
520
552
  }
521
553
 
522
554
  RealScalar beta;
523
- m_qr.col(k).tail(rows-k).makeHouseholderInPlace(m_hCoeffs.coeffRef(k), beta);
524
- m_qr.coeffRef(k,k) = beta;
555
+ m_qr.col(k).tail(rows - k).makeHouseholderInPlace(m_hCoeffs.coeffRef(k), beta);
556
+ m_qr.coeffRef(k, k) = beta;
525
557
 
526
558
  // remember the maximum absolute value of diagonal coefficients
527
- if(abs(beta) > m_maxpivot) m_maxpivot = abs(beta);
559
+ if (abs(beta) > m_maxpivot) m_maxpivot = abs(beta);
528
560
 
529
- m_qr.bottomRightCorner(rows-k, cols-k-1)
530
- .applyHouseholderOnTheLeft(m_qr.col(k).tail(rows-k-1), m_hCoeffs.coeffRef(k), &m_temp.coeffRef(k+1));
561
+ m_qr.bottomRightCorner(rows - k, cols - k - 1)
562
+ .applyHouseholderOnTheLeft(m_qr.col(k).tail(rows - k - 1), m_hCoeffs.coeffRef(k), &m_temp.coeffRef(k + 1));
531
563
  }
532
564
 
533
565
  m_cols_permutation.setIdentity(cols);
534
- for(Index k = 0; k < size; ++k)
535
- m_cols_permutation.applyTranspositionOnTheRight(k, m_cols_transpositions.coeff(k));
566
+ for (Index k = 0; k < size; ++k) m_cols_permutation.applyTranspositionOnTheRight(k, m_cols_transpositions.coeff(k));
536
567
 
537
- m_det_pq = (number_of_transpositions%2) ? -1 : 1;
568
+ m_det_p = (number_of_transpositions % 2) ? -1 : 1;
538
569
  m_isInitialized = true;
539
570
  }
540
571
 
541
572
  #ifndef EIGEN_PARSED_BY_DOXYGEN
542
- template<typename _MatrixType>
543
- template<typename RhsType, typename DstType>
544
- void FullPivHouseholderQR<_MatrixType>::_solve_impl(const RhsType &rhs, DstType &dst) const
545
- {
573
+ template <typename MatrixType_, typename PermutationIndex_>
574
+ template <typename RhsType, typename DstType>
575
+ void FullPivHouseholderQR<MatrixType_, PermutationIndex_>::_solve_impl(const RhsType& rhs, DstType& dst) const {
546
576
  const Index l_rank = rank();
547
577
 
548
578
  // FIXME introduce nonzeroPivots() and use it here. and more generally,
549
579
  // make the same improvements in this dec as in FullPivLU.
550
- if(l_rank==0)
551
- {
580
+ if (l_rank == 0) {
552
581
  dst.setZero();
553
582
  return;
554
583
  }
555
584
 
556
585
  typename RhsType::PlainObject c(rhs);
557
586
 
558
- Matrix<typename RhsType::Scalar,1,RhsType::ColsAtCompileTime> temp(rhs.cols());
559
- for (Index k = 0; k < l_rank; ++k)
560
- {
561
- Index remainingSize = rows()-k;
587
+ Matrix<typename RhsType::Scalar, 1, RhsType::ColsAtCompileTime> temp(rhs.cols());
588
+ for (Index k = 0; k < l_rank; ++k) {
589
+ Index remainingSize = rows() - k;
562
590
  c.row(k).swap(c.row(m_rows_transpositions.coeff(k)));
563
591
  c.bottomRightCorner(remainingSize, rhs.cols())
564
- .applyHouseholderOnTheLeft(m_qr.col(k).tail(remainingSize-1),
565
- m_hCoeffs.coeff(k), &temp.coeffRef(0));
592
+ .applyHouseholderOnTheLeft(m_qr.col(k).tail(remainingSize - 1), m_hCoeffs.coeff(k), &temp.coeffRef(0));
566
593
  }
567
594
 
568
- m_qr.topLeftCorner(l_rank, l_rank)
569
- .template triangularView<Upper>()
570
- .solveInPlace(c.topRows(l_rank));
595
+ m_qr.topLeftCorner(l_rank, l_rank).template triangularView<Upper>().solveInPlace(c.topRows(l_rank));
571
596
 
572
- for(Index i = 0; i < l_rank; ++i) dst.row(m_cols_permutation.indices().coeff(i)) = c.row(i);
573
- for(Index i = l_rank; i < cols(); ++i) dst.row(m_cols_permutation.indices().coeff(i)).setZero();
597
+ for (Index i = 0; i < l_rank; ++i) dst.row(m_cols_permutation.indices().coeff(i)) = c.row(i);
598
+ for (Index i = l_rank; i < cols(); ++i) dst.row(m_cols_permutation.indices().coeff(i)).setZero();
574
599
  }
575
600
 
576
- template<typename _MatrixType>
577
- template<bool Conjugate, typename RhsType, typename DstType>
578
- void FullPivHouseholderQR<_MatrixType>::_solve_impl_transposed(const RhsType &rhs, DstType &dst) const
579
- {
601
+ template <typename MatrixType_, typename PermutationIndex_>
602
+ template <bool Conjugate, typename RhsType, typename DstType>
603
+ void FullPivHouseholderQR<MatrixType_, PermutationIndex_>::_solve_impl_transposed(const RhsType& rhs,
604
+ DstType& dst) const {
580
605
  const Index l_rank = rank();
581
606
 
582
- if(l_rank == 0)
583
- {
607
+ if (l_rank == 0) {
584
608
  dst.setZero();
585
609
  return;
586
610
  }
587
611
 
588
- typename RhsType::PlainObject c(m_cols_permutation.transpose()*rhs);
612
+ typename RhsType::PlainObject c(m_cols_permutation.transpose() * rhs);
589
613
 
590
614
  m_qr.topLeftCorner(l_rank, l_rank)
591
- .template triangularView<Upper>()
592
- .transpose().template conjugateIf<Conjugate>()
593
- .solveInPlace(c.topRows(l_rank));
615
+ .template triangularView<Upper>()
616
+ .transpose()
617
+ .template conjugateIf<Conjugate>()
618
+ .solveInPlace(c.topRows(l_rank));
594
619
 
595
620
  dst.topRows(l_rank) = c.topRows(l_rank);
596
- dst.bottomRows(rows()-l_rank).setZero();
621
+ dst.bottomRows(rows() - l_rank).setZero();
597
622
 
598
623
  Matrix<Scalar, 1, DstType::ColsAtCompileTime> temp(dst.cols());
599
624
  const Index size = (std::min)(rows(), cols());
600
- for (Index k = size-1; k >= 0; --k)
601
- {
602
- Index remainingSize = rows()-k;
625
+ for (Index k = size - 1; k >= 0; --k) {
626
+ Index remainingSize = rows() - k;
603
627
 
604
628
  dst.bottomRightCorner(remainingSize, dst.cols())
605
- .applyHouseholderOnTheLeft(m_qr.col(k).tail(remainingSize-1).template conjugateIf<!Conjugate>(),
606
- m_hCoeffs.template conjugateIf<Conjugate>().coeff(k), &temp.coeffRef(0));
629
+ .applyHouseholderOnTheLeft(m_qr.col(k).tail(remainingSize - 1).template conjugateIf<!Conjugate>(),
630
+ m_hCoeffs.template conjugateIf<Conjugate>().coeff(k), &temp.coeffRef(0));
607
631
 
608
632
  dst.row(k).swap(dst.row(m_rows_transpositions.coeff(k)));
609
633
  }
@@ -611,52 +635,49 @@ void FullPivHouseholderQR<_MatrixType>::_solve_impl_transposed(const RhsType &rh
611
635
  #endif
612
636
 
613
637
  namespace internal {
614
-
615
- template<typename DstXprType, typename MatrixType>
616
- struct Assignment<DstXprType, Inverse<FullPivHouseholderQR<MatrixType> >, internal::assign_op<typename DstXprType::Scalar,typename FullPivHouseholderQR<MatrixType>::Scalar>, Dense2Dense>
617
- {
618
- typedef FullPivHouseholderQR<MatrixType> QrType;
638
+
639
+ template <typename DstXprType, typename MatrixType, typename PermutationIndex>
640
+ struct Assignment<DstXprType, Inverse<FullPivHouseholderQR<MatrixType, PermutationIndex> >,
641
+ internal::assign_op<typename DstXprType::Scalar,
642
+ typename FullPivHouseholderQR<MatrixType, PermutationIndex>::Scalar>,
643
+ Dense2Dense> {
644
+ typedef FullPivHouseholderQR<MatrixType, PermutationIndex> QrType;
619
645
  typedef Inverse<QrType> SrcXprType;
620
- static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<typename DstXprType::Scalar,typename QrType::Scalar> &)
621
- {
646
+ static void run(DstXprType& dst, const SrcXprType& src,
647
+ const internal::assign_op<typename DstXprType::Scalar, typename QrType::Scalar>&) {
622
648
  dst = src.nestedExpression().solve(MatrixType::Identity(src.rows(), src.cols()));
623
649
  }
624
650
  };
625
651
 
626
652
  /** \ingroup QR_Module
627
- *
628
- * \brief Expression type for return value of FullPivHouseholderQR::matrixQ()
629
- *
630
- * \tparam MatrixType type of underlying dense matrix
631
- */
632
- template<typename MatrixType> struct FullPivHouseholderQRMatrixQReturnType
633
- : public ReturnByValue<FullPivHouseholderQRMatrixQReturnType<MatrixType> >
634
- {
635
- public:
636
- typedef typename FullPivHouseholderQR<MatrixType>::IntDiagSizeVectorType IntDiagSizeVectorType;
653
+ *
654
+ * \brief Expression type for return value of FullPivHouseholderQR::matrixQ()
655
+ *
656
+ * \tparam MatrixType type of underlying dense matrix
657
+ */
658
+ template <typename MatrixType, typename PermutationIndex>
659
+ struct FullPivHouseholderQRMatrixQReturnType
660
+ : public ReturnByValue<FullPivHouseholderQRMatrixQReturnType<MatrixType, PermutationIndex> > {
661
+ public:
662
+ typedef typename FullPivHouseholderQR<MatrixType, PermutationIndex>::IntDiagSizeVectorType IntDiagSizeVectorType;
637
663
  typedef typename internal::plain_diag_type<MatrixType>::type HCoeffsType;
638
664
  typedef Matrix<typename MatrixType::Scalar, 1, MatrixType::RowsAtCompileTime, RowMajor, 1,
639
- MatrixType::MaxRowsAtCompileTime> WorkVectorType;
665
+ MatrixType::MaxRowsAtCompileTime>
666
+ WorkVectorType;
640
667
 
641
- FullPivHouseholderQRMatrixQReturnType(const MatrixType& qr,
642
- const HCoeffsType& hCoeffs,
668
+ FullPivHouseholderQRMatrixQReturnType(const MatrixType& qr, const HCoeffsType& hCoeffs,
643
669
  const IntDiagSizeVectorType& rowsTranspositions)
644
- : m_qr(qr),
645
- m_hCoeffs(hCoeffs),
646
- m_rowsTranspositions(rowsTranspositions)
647
- {}
670
+ : m_qr(qr), m_hCoeffs(hCoeffs), m_rowsTranspositions(rowsTranspositions) {}
648
671
 
649
672
  template <typename ResultType>
650
- void evalTo(ResultType& result) const
651
- {
673
+ void evalTo(ResultType& result) const {
652
674
  const Index rows = m_qr.rows();
653
675
  WorkVectorType workspace(rows);
654
676
  evalTo(result, workspace);
655
677
  }
656
678
 
657
679
  template <typename ResultType>
658
- void evalTo(ResultType& result, WorkVectorType& workspace) const
659
- {
680
+ void evalTo(ResultType& result, WorkVectorType& workspace) const {
660
681
  using numext::conj;
661
682
  // compute the product H'_0 H'_1 ... H'_n-1,
662
683
  // where H_k is the k-th Householder transformation I - h_k v_k v_k'
@@ -666,10 +687,9 @@ public:
666
687
  const Index size = (std::min)(rows, cols);
667
688
  workspace.resize(rows);
668
689
  result.setIdentity(rows, rows);
669
- for (Index k = size-1; k >= 0; k--)
670
- {
671
- result.block(k, k, rows-k, rows-k)
672
- .applyHouseholderOnTheLeft(m_qr.col(k).tail(rows-k-1), conj(m_hCoeffs.coeff(k)), &workspace.coeffRef(k));
690
+ for (Index k = size - 1; k >= 0; k--) {
691
+ result.block(k, k, rows - k, rows - k)
692
+ .applyHouseholderOnTheLeft(m_qr.col(k).tail(rows - k - 1), conj(m_hCoeffs.coeff(k)), &workspace.coeffRef(k));
673
693
  result.row(k).swap(result.row(m_rowsTranspositions.coeff(k)));
674
694
  }
675
695
  }
@@ -677,7 +697,7 @@ public:
677
697
  Index rows() const { return m_qr.rows(); }
678
698
  Index cols() const { return m_qr.rows(); }
679
699
 
680
- protected:
700
+ protected:
681
701
  typename MatrixType::Nested m_qr;
682
702
  typename HCoeffsType::Nested m_hCoeffs;
683
703
  typename IntDiagSizeVectorType::Nested m_rowsTranspositions;
@@ -688,26 +708,26 @@ protected:
688
708
  // : public evaluator<ReturnByValue<FullPivHouseholderQRMatrixQReturnType<MatrixType> > >
689
709
  // {};
690
710
 
691
- } // end namespace internal
711
+ } // end namespace internal
692
712
 
693
- template<typename MatrixType>
694
- inline typename FullPivHouseholderQR<MatrixType>::MatrixQReturnType FullPivHouseholderQR<MatrixType>::matrixQ() const
695
- {
713
+ template <typename MatrixType, typename PermutationIndex>
714
+ inline typename FullPivHouseholderQR<MatrixType, PermutationIndex>::MatrixQReturnType
715
+ FullPivHouseholderQR<MatrixType, PermutationIndex>::matrixQ() const {
696
716
  eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
697
717
  return MatrixQReturnType(m_qr, m_hCoeffs, m_rows_transpositions);
698
718
  }
699
719
 
700
720
  /** \return the full-pivoting Householder QR decomposition of \c *this.
701
- *
702
- * \sa class FullPivHouseholderQR
703
- */
704
- template<typename Derived>
705
- const FullPivHouseholderQR<typename MatrixBase<Derived>::PlainObject>
706
- MatrixBase<Derived>::fullPivHouseholderQr() const
707
- {
708
- return FullPivHouseholderQR<PlainObject>(eval());
721
+ *
722
+ * \sa class FullPivHouseholderQR
723
+ */
724
+ template <typename Derived>
725
+ template <typename PermutationIndex>
726
+ const FullPivHouseholderQR<typename MatrixBase<Derived>::PlainObject, PermutationIndex>
727
+ MatrixBase<Derived>::fullPivHouseholderQr() const {
728
+ return FullPivHouseholderQR<PlainObject, PermutationIndex>(eval());
709
729
  }
710
730
 
711
- } // end namespace Eigen
731
+ } // end namespace Eigen
712
732
 
713
- #endif // EIGEN_FULLPIVOTINGHOUSEHOLDERQR_H
733
+ #endif // EIGEN_FULLPIVOTINGHOUSEHOLDERQR_H