@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,80 +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_> {
23
+ typedef MatrixXpr XprKind;
24
+ typedef SolverStorage StorageKind;
25
+ typedef PermutationIndex_ PermutationIndex;
21
26
  enum { Flags = 0 };
22
27
  };
23
28
 
24
- template<typename MatrixType> struct FullPivHouseholderQRMatrixQReturnType;
29
+ template <typename MatrixType, typename PermutationIndex>
30
+ struct FullPivHouseholderQRMatrixQReturnType;
25
31
 
26
- template<typename MatrixType>
27
- struct traits<FullPivHouseholderQRMatrixQReturnType<MatrixType> >
28
- {
32
+ template <typename MatrixType, typename PermutationIndex>
33
+ struct traits<FullPivHouseholderQRMatrixQReturnType<MatrixType, PermutationIndex> > {
29
34
  typedef typename MatrixType::PlainObject ReturnType;
30
35
  };
31
36
 
32
- } // end namespace internal
37
+ } // end namespace internal
33
38
 
34
39
  /** \ingroup QR_Module
35
- *
36
- * \class FullPivHouseholderQR
37
- *
38
- * \brief Householder rank-revealing QR decomposition of a matrix with full pivoting
39
- *
40
- * \tparam _MatrixType the type of the matrix of which we are computing the QR decomposition
41
- *
42
- * This class performs a rank-revealing QR decomposition of a matrix \b A into matrices \b P, \b P', \b Q and \b R
43
- * such that
44
- * \f[
45
- * \mathbf{P} \, \mathbf{A} \, \mathbf{P}' = \mathbf{Q} \, \mathbf{R}
46
- * \f]
47
- * by using Householder transformations. Here, \b P and \b P' are permutation matrices, \b Q a unitary matrix
48
- * and \b R an upper triangular matrix.
49
- *
50
- * This decomposition performs a very prudent full pivoting in order to be rank-revealing and achieve optimal
51
- * numerical stability. The trade-off is that it is slower than HouseholderQR and ColPivHouseholderQR.
52
- *
53
- * This class supports the \link InplaceDecomposition inplace decomposition \endlink mechanism.
54
- *
55
- * \sa MatrixBase::fullPivHouseholderQr()
56
- */
57
- template<typename _MatrixType> class FullPivHouseholderQR
58
- {
59
- public:
60
-
61
- typedef _MatrixType MatrixType;
62
- enum {
63
- RowsAtCompileTime = MatrixType::RowsAtCompileTime,
64
- ColsAtCompileTime = MatrixType::ColsAtCompileTime,
65
- MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
66
- MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
67
- };
68
- typedef typename MatrixType::Scalar Scalar;
69
- typedef typename MatrixType::RealScalar RealScalar;
70
- // FIXME should be int
71
- typedef typename MatrixType::StorageIndex StorageIndex;
72
- typedef internal::FullPivHouseholderQRMatrixQReturnType<MatrixType> MatrixQReturnType;
73
- typedef typename internal::plain_diag_type<MatrixType>::type HCoeffsType;
74
- typedef Matrix<StorageIndex, 1,
75
- EIGEN_SIZE_MIN_PREFER_DYNAMIC(ColsAtCompileTime,RowsAtCompileTime), RowMajor, 1,
76
- EIGEN_SIZE_MIN_PREFER_FIXED(MaxColsAtCompileTime,MaxRowsAtCompileTime)> IntDiagSizeVectorType;
77
- typedef PermutationMatrix<ColsAtCompileTime, MaxColsAtCompileTime> PermutationType;
78
- typedef typename internal::plain_row_type<MatrixType>::type RowVectorType;
79
- typedef typename internal::plain_col_type<MatrixType>::type ColVectorType;
80
- typedef typename MatrixType::PlainObject PlainObject;
81
-
82
- /** \brief Default Constructor.
83
- *
84
- * The default constructor is useful in cases in which the user intends to
85
- * perform decompositions via FullPivHouseholderQR::compute(const MatrixType&).
86
- */
87
- 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()
88
102
  : m_qr(),
89
103
  m_hCoeffs(),
90
104
  m_rows_transpositions(),
@@ -94,36 +108,36 @@ template<typename _MatrixType> class FullPivHouseholderQR
94
108
  m_isInitialized(false),
95
109
  m_usePrescribedThreshold(false) {}
96
110
 
97
- /** \brief Default Constructor with memory preallocation
98
- *
99
- * Like the default constructor but with preallocation of the internal data
100
- * according to the specified problem \a size.
101
- * \sa FullPivHouseholderQR()
102
- */
103
- 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)
104
118
  : m_qr(rows, cols),
105
- m_hCoeffs((std::min)(rows,cols)),
106
- m_rows_transpositions((std::min)(rows,cols)),
107
- 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)),
108
122
  m_cols_permutation(cols),
109
123
  m_temp(cols),
110
124
  m_isInitialized(false),
111
125
  m_usePrescribedThreshold(false) {}
112
126
 
113
- /** \brief Constructs a QR factorization from a given matrix
114
- *
115
- * This constructor computes the QR factorization of the matrix \a matrix by calling
116
- * the method compute(). It is a short cut for:
117
- *
118
- * \code
119
- * FullPivHouseholderQR<MatrixType> qr(matrix.rows(), matrix.cols());
120
- * qr.compute(matrix);
121
- * \endcode
122
- *
123
- * \sa compute()
124
- */
125
- template<typename InputType>
126
- 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)
127
141
  : m_qr(matrix.rows(), matrix.cols()),
128
142
  m_hCoeffs((std::min)(matrix.rows(), matrix.cols())),
129
143
  m_rows_transpositions((std::min)(matrix.rows(), matrix.cols())),
@@ -131,19 +145,19 @@ template<typename _MatrixType> class FullPivHouseholderQR
131
145
  m_cols_permutation(matrix.cols()),
132
146
  m_temp(matrix.cols()),
133
147
  m_isInitialized(false),
134
- m_usePrescribedThreshold(false)
135
- {
136
- compute(matrix.derived());
137
- }
148
+ m_usePrescribedThreshold(false) {
149
+ compute(matrix.derived());
150
+ }
138
151
 
139
- /** \brief Constructs a QR factorization from a given matrix
140
- *
141
- * This overloaded constructor is provided for \link InplaceDecomposition inplace decomposition \endlink when \c MatrixType is a Eigen::Ref.
142
- *
143
- * \sa FullPivHouseholderQR(const EigenBase&)
144
- */
145
- template<typename InputType>
146
- 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)
147
161
  : m_qr(matrix.derived()),
148
162
  m_hCoeffs((std::min)(matrix.rows(), matrix.cols())),
149
163
  m_rows_transpositions((std::min)(matrix.rows(), matrix.cols())),
@@ -151,319 +165,341 @@ template<typename _MatrixType> class FullPivHouseholderQR
151
165
  m_cols_permutation(matrix.cols()),
152
166
  m_temp(matrix.cols()),
153
167
  m_isInitialized(false),
154
- m_usePrescribedThreshold(false)
155
- {
156
- computeInPlace();
157
- }
168
+ m_usePrescribedThreshold(false) {
169
+ computeInPlace();
170
+ }
158
171
 
159
- /** This method finds a solution x to the equation Ax=b, where A is the matrix of which
160
- * \c *this is the QR decomposition.
161
- *
162
- * \param b the right-hand-side of the equation to solve.
163
- *
164
- * \returns the exact or least-square solution if the rank is greater or equal to the number of columns of A,
165
- * and an arbitrary solution otherwise.
166
- *
167
- * \note_about_checking_solutions
168
- *
169
- * \note_about_arbitrary_choice_of_solution
170
- *
171
- * Example: \include FullPivHouseholderQR_solve.cpp
172
- * Output: \verbinclude FullPivHouseholderQR_solve.out
173
- */
174
- template<typename Rhs>
175
- inline const Solve<FullPivHouseholderQR, Rhs>
176
- solve(const MatrixBase<Rhs>& b) const
177
- {
178
- eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
179
- return Solve<FullPivHouseholderQR, Rhs>(*this, b.derived());
180
- }
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
181
191
 
182
- /** \returns Expression object representing the matrix Q
183
- */
184
- MatrixQReturnType matrixQ(void) const;
192
+ /** \returns Expression object representing the matrix Q
193
+ */
194
+ MatrixQReturnType matrixQ(void) const;
185
195
 
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
- }
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
+ }
193
202
 
194
- template<typename InputType>
195
- FullPivHouseholderQR& compute(const EigenBase<InputType>& matrix);
203
+ template <typename InputType>
204
+ FullPivHouseholderQR& compute(const EigenBase<InputType>& matrix);
196
205
 
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
- }
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
+ }
203
211
 
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
- }
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
+ }
210
217
 
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
- }
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
+ }
256
290
 
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
- }
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
+ }
268
301
 
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
- }
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
+ }
281
313
 
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
- }
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
+ }
294
325
 
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
- }
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
+ }
306
336
 
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
- }
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
+ }
317
346
 
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
- }
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
+ }
350
378
 
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
- }
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
+ }
364
391
 
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
- }
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
+ }
377
403
 
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
- }
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
+ }
390
415
 
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; }
395
-
396
- #ifndef EIGEN_PARSED_BY_DOXYGEN
397
- template<typename RhsType, typename DstType>
398
- EIGEN_DEVICE_FUNC
399
- void _solve_impl(const RhsType &rhs, DstType &dst) const;
400
- #endif
401
-
402
- protected:
403
-
404
- static void check_template_parameters()
405
- {
406
- EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar);
407
- }
408
-
409
- void computeInPlace();
410
-
411
- MatrixType m_qr;
412
- HCoeffsType m_hCoeffs;
413
- IntDiagSizeVectorType m_rows_transpositions;
414
- IntDiagSizeVectorType m_cols_transpositions;
415
- PermutationType m_cols_permutation;
416
- RowVectorType m_temp;
417
- bool m_isInitialized, m_usePrescribedThreshold;
418
- RealScalar m_prescribedThreshold, m_maxpivot;
419
- Index m_nonzero_pivots;
420
- RealScalar m_precision;
421
- Index m_det_pq;
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; }
420
+
421
+ #ifndef EIGEN_PARSED_BY_DOXYGEN
422
+ template <typename RhsType, typename DstType>
423
+ void _solve_impl(const RhsType& rhs, DstType& dst) const;
424
+
425
+ template <bool Conjugate, typename RhsType, typename DstType>
426
+ void _solve_impl_transposed(const RhsType& rhs, DstType& dst) const;
427
+ #endif
428
+
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;
422
445
  };
423
446
 
424
- template<typename MatrixType>
425
- typename MatrixType::RealScalar FullPivHouseholderQR<MatrixType>::absDeterminant() const
426
- {
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 {
427
458
  using std::abs;
428
459
  eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
429
460
  eigen_assert(m_qr.rows() == m_qr.cols() && "You can't take the determinant of a non-square matrix!");
430
- return abs(m_qr.diagonal().prod());
461
+ return isInjective() ? abs(m_qr.diagonal().prod()) : RealScalar(0);
462
+ }
463
+
464
+ template <typename MatrixType, typename PermutationIndex>
465
+ typename MatrixType::RealScalar FullPivHouseholderQR<MatrixType, PermutationIndex>::logAbsDeterminant() const {
466
+ eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
467
+ eigen_assert(m_qr.rows() == m_qr.cols() && "You can't take the determinant of a non-square matrix!");
468
+ return isInjective() ? m_qr.diagonal().cwiseAbs().array().log().sum() : -NumTraits<RealScalar>::infinity();
431
469
  }
432
470
 
433
- template<typename MatrixType>
434
- typename MatrixType::RealScalar FullPivHouseholderQR<MatrixType>::logAbsDeterminant() const
435
- {
471
+ template <typename MatrixType, typename PermutationIndex>
472
+ typename MatrixType::Scalar FullPivHouseholderQR<MatrixType, PermutationIndex>::signDeterminant() const {
436
473
  eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
437
474
  eigen_assert(m_qr.rows() == m_qr.cols() && "You can't take the determinant of a non-square matrix!");
438
- return m_qr.diagonal().cwiseAbs().array().log().sum();
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);
439
478
  }
440
479
 
441
480
  /** Performs the QR factorization of the given matrix \a matrix. The result of
442
- * the factorization is stored into \c *this, and a reference to \c *this
443
- * is returned.
444
- *
445
- * \sa class FullPivHouseholderQR, FullPivHouseholderQR(const MatrixType&)
446
- */
447
- template<typename MatrixType>
448
- template<typename InputType>
449
- FullPivHouseholderQR<MatrixType>& FullPivHouseholderQR<MatrixType>::compute(const EigenBase<InputType>& matrix)
450
- {
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) {
451
490
  m_qr = matrix.derived();
452
491
  computeInPlace();
453
492
  return *this;
454
493
  }
455
494
 
456
- template<typename MatrixType>
457
- void FullPivHouseholderQR<MatrixType>::computeInPlace()
458
- {
459
- check_template_parameters();
460
-
495
+ template <typename MatrixType, typename PermutationIndex>
496
+ void FullPivHouseholderQR<MatrixType, PermutationIndex>::computeInPlace() {
497
+ eigen_assert(m_qr.cols() <= NumTraits<PermutationIndex>::highest());
461
498
  using std::abs;
462
499
  Index rows = m_qr.rows();
463
500
  Index cols = m_qr.cols();
464
- Index size = (std::min)(rows,cols);
501
+ Index size = (std::min)(rows, cols);
465
502
 
466
-
467
503
  m_hCoeffs.resize(size);
468
504
 
469
505
  m_temp.resize(cols);
@@ -476,150 +512,172 @@ void FullPivHouseholderQR<MatrixType>::computeInPlace()
476
512
 
477
513
  RealScalar biggest(0);
478
514
 
479
- 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)
480
516
  m_maxpivot = RealScalar(0);
481
517
 
482
- for (Index k = 0; k < size; ++k)
483
- {
518
+ for (Index k = 0; k < size; ++k) {
484
519
  Index row_of_biggest_in_corner, col_of_biggest_in_corner;
485
520
  typedef internal::scalar_score_coeff_op<Scalar> Scoring;
486
521
  typedef typename Scoring::result_type Score;
487
522
 
488
- Score score = m_qr.bottomRightCorner(rows-k, cols-k)
523
+ Score score = m_qr.bottomRightCorner(rows - k, cols - k)
489
524
  .unaryExpr(Scoring())
490
525
  .maxCoeff(&row_of_biggest_in_corner, &col_of_biggest_in_corner);
491
526
  row_of_biggest_in_corner += k;
492
527
  col_of_biggest_in_corner += k;
493
- RealScalar biggest_in_corner = internal::abs_knowing_score<Scalar>()(m_qr(row_of_biggest_in_corner, col_of_biggest_in_corner), score);
494
- 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;
495
531
 
496
532
  // if the corner is negligible, then we have less than full rank, and we can finish early
497
- if(internal::isMuchSmallerThan(biggest_in_corner, biggest, m_precision))
498
- {
533
+ if (internal::isMuchSmallerThan(biggest_in_corner, biggest, m_precision)) {
499
534
  m_nonzero_pivots = k;
500
- for(Index i = k; i < size; i++)
501
- {
502
- m_rows_transpositions.coeffRef(i) = i;
503
- m_cols_transpositions.coeffRef(i) = 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);
504
538
  m_hCoeffs.coeffRef(i) = Scalar(0);
505
539
  }
506
540
  break;
507
541
  }
508
542
 
509
- m_rows_transpositions.coeffRef(k) = row_of_biggest_in_corner;
510
- m_cols_transpositions.coeffRef(k) = col_of_biggest_in_corner;
511
- if(k != row_of_biggest_in_corner) {
512
- 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));
513
547
  ++number_of_transpositions;
514
548
  }
515
- if(k != col_of_biggest_in_corner) {
549
+ if (k != col_of_biggest_in_corner) {
516
550
  m_qr.col(k).swap(m_qr.col(col_of_biggest_in_corner));
517
551
  ++number_of_transpositions;
518
552
  }
519
553
 
520
554
  RealScalar beta;
521
- m_qr.col(k).tail(rows-k).makeHouseholderInPlace(m_hCoeffs.coeffRef(k), beta);
522
- 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;
523
557
 
524
558
  // remember the maximum absolute value of diagonal coefficients
525
- if(abs(beta) > m_maxpivot) m_maxpivot = abs(beta);
559
+ if (abs(beta) > m_maxpivot) m_maxpivot = abs(beta);
526
560
 
527
- m_qr.bottomRightCorner(rows-k, cols-k-1)
528
- .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));
529
563
  }
530
564
 
531
565
  m_cols_permutation.setIdentity(cols);
532
- for(Index k = 0; k < size; ++k)
533
- 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));
534
567
 
535
- m_det_pq = (number_of_transpositions%2) ? -1 : 1;
568
+ m_det_p = (number_of_transpositions % 2) ? -1 : 1;
536
569
  m_isInitialized = true;
537
570
  }
538
571
 
539
572
  #ifndef EIGEN_PARSED_BY_DOXYGEN
540
- template<typename _MatrixType>
541
- template<typename RhsType, typename DstType>
542
- void FullPivHouseholderQR<_MatrixType>::_solve_impl(const RhsType &rhs, DstType &dst) const
543
- {
544
- eigen_assert(rhs.rows() == rows());
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 {
545
576
  const Index l_rank = rank();
546
577
 
547
578
  // FIXME introduce nonzeroPivots() and use it here. and more generally,
548
579
  // make the same improvements in this dec as in FullPivLU.
549
- if(l_rank==0)
550
- {
580
+ if (l_rank == 0) {
551
581
  dst.setZero();
552
582
  return;
553
583
  }
554
584
 
555
585
  typename RhsType::PlainObject c(rhs);
556
586
 
557
- Matrix<Scalar,1,RhsType::ColsAtCompileTime> temp(rhs.cols());
558
- for (Index k = 0; k < l_rank; ++k)
559
- {
560
- 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;
561
590
  c.row(k).swap(c.row(m_rows_transpositions.coeff(k)));
562
591
  c.bottomRightCorner(remainingSize, rhs.cols())
563
- .applyHouseholderOnTheLeft(m_qr.col(k).tail(remainingSize-1),
564
- m_hCoeffs.coeff(k), &temp.coeffRef(0));
592
+ .applyHouseholderOnTheLeft(m_qr.col(k).tail(remainingSize - 1), m_hCoeffs.coeff(k), &temp.coeffRef(0));
593
+ }
594
+
595
+ m_qr.topLeftCorner(l_rank, l_rank).template triangularView<Upper>().solveInPlace(c.topRows(l_rank));
596
+
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();
599
+ }
600
+
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 {
605
+ const Index l_rank = rank();
606
+
607
+ if (l_rank == 0) {
608
+ dst.setZero();
609
+ return;
565
610
  }
566
611
 
612
+ typename RhsType::PlainObject c(m_cols_permutation.transpose() * rhs);
613
+
567
614
  m_qr.topLeftCorner(l_rank, l_rank)
568
615
  .template triangularView<Upper>()
616
+ .transpose()
617
+ .template conjugateIf<Conjugate>()
569
618
  .solveInPlace(c.topRows(l_rank));
570
619
 
571
- for(Index i = 0; i < l_rank; ++i) dst.row(m_cols_permutation.indices().coeff(i)) = c.row(i);
572
- for(Index i = l_rank; i < cols(); ++i) dst.row(m_cols_permutation.indices().coeff(i)).setZero();
620
+ dst.topRows(l_rank) = c.topRows(l_rank);
621
+ dst.bottomRows(rows() - l_rank).setZero();
622
+
623
+ Matrix<Scalar, 1, DstType::ColsAtCompileTime> temp(dst.cols());
624
+ const Index size = (std::min)(rows(), cols());
625
+ for (Index k = size - 1; k >= 0; --k) {
626
+ Index remainingSize = rows() - k;
627
+
628
+ dst.bottomRightCorner(remainingSize, dst.cols())
629
+ .applyHouseholderOnTheLeft(m_qr.col(k).tail(remainingSize - 1).template conjugateIf<!Conjugate>(),
630
+ m_hCoeffs.template conjugateIf<Conjugate>().coeff(k), &temp.coeffRef(0));
631
+
632
+ dst.row(k).swap(dst.row(m_rows_transpositions.coeff(k)));
633
+ }
573
634
  }
574
635
  #endif
575
636
 
576
637
  namespace internal {
577
-
578
- template<typename DstXprType, typename MatrixType>
579
- struct Assignment<DstXprType, Inverse<FullPivHouseholderQR<MatrixType> >, internal::assign_op<typename DstXprType::Scalar,typename FullPivHouseholderQR<MatrixType>::Scalar>, Dense2Dense>
580
- {
581
- 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;
582
645
  typedef Inverse<QrType> SrcXprType;
583
- static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<typename DstXprType::Scalar,typename QrType::Scalar> &)
584
- {
646
+ static void run(DstXprType& dst, const SrcXprType& src,
647
+ const internal::assign_op<typename DstXprType::Scalar, typename QrType::Scalar>&) {
585
648
  dst = src.nestedExpression().solve(MatrixType::Identity(src.rows(), src.cols()));
586
649
  }
587
650
  };
588
651
 
589
652
  /** \ingroup QR_Module
590
- *
591
- * \brief Expression type for return value of FullPivHouseholderQR::matrixQ()
592
- *
593
- * \tparam MatrixType type of underlying dense matrix
594
- */
595
- template<typename MatrixType> struct FullPivHouseholderQRMatrixQReturnType
596
- : public ReturnByValue<FullPivHouseholderQRMatrixQReturnType<MatrixType> >
597
- {
598
- public:
599
- 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;
600
663
  typedef typename internal::plain_diag_type<MatrixType>::type HCoeffsType;
601
664
  typedef Matrix<typename MatrixType::Scalar, 1, MatrixType::RowsAtCompileTime, RowMajor, 1,
602
- MatrixType::MaxRowsAtCompileTime> WorkVectorType;
665
+ MatrixType::MaxRowsAtCompileTime>
666
+ WorkVectorType;
603
667
 
604
- FullPivHouseholderQRMatrixQReturnType(const MatrixType& qr,
605
- const HCoeffsType& hCoeffs,
668
+ FullPivHouseholderQRMatrixQReturnType(const MatrixType& qr, const HCoeffsType& hCoeffs,
606
669
  const IntDiagSizeVectorType& rowsTranspositions)
607
- : m_qr(qr),
608
- m_hCoeffs(hCoeffs),
609
- m_rowsTranspositions(rowsTranspositions)
610
- {}
670
+ : m_qr(qr), m_hCoeffs(hCoeffs), m_rowsTranspositions(rowsTranspositions) {}
611
671
 
612
672
  template <typename ResultType>
613
- void evalTo(ResultType& result) const
614
- {
673
+ void evalTo(ResultType& result) const {
615
674
  const Index rows = m_qr.rows();
616
675
  WorkVectorType workspace(rows);
617
676
  evalTo(result, workspace);
618
677
  }
619
678
 
620
679
  template <typename ResultType>
621
- void evalTo(ResultType& result, WorkVectorType& workspace) const
622
- {
680
+ void evalTo(ResultType& result, WorkVectorType& workspace) const {
623
681
  using numext::conj;
624
682
  // compute the product H'_0 H'_1 ... H'_n-1,
625
683
  // where H_k is the k-th Householder transformation I - h_k v_k v_k'
@@ -629,10 +687,9 @@ public:
629
687
  const Index size = (std::min)(rows, cols);
630
688
  workspace.resize(rows);
631
689
  result.setIdentity(rows, rows);
632
- for (Index k = size-1; k >= 0; k--)
633
- {
634
- result.block(k, k, rows-k, rows-k)
635
- .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));
636
693
  result.row(k).swap(result.row(m_rowsTranspositions.coeff(k)));
637
694
  }
638
695
  }
@@ -640,7 +697,7 @@ public:
640
697
  Index rows() const { return m_qr.rows(); }
641
698
  Index cols() const { return m_qr.rows(); }
642
699
 
643
- protected:
700
+ protected:
644
701
  typename MatrixType::Nested m_qr;
645
702
  typename HCoeffsType::Nested m_hCoeffs;
646
703
  typename IntDiagSizeVectorType::Nested m_rowsTranspositions;
@@ -651,26 +708,26 @@ protected:
651
708
  // : public evaluator<ReturnByValue<FullPivHouseholderQRMatrixQReturnType<MatrixType> > >
652
709
  // {};
653
710
 
654
- } // end namespace internal
711
+ } // end namespace internal
655
712
 
656
- template<typename MatrixType>
657
- inline typename FullPivHouseholderQR<MatrixType>::MatrixQReturnType FullPivHouseholderQR<MatrixType>::matrixQ() const
658
- {
713
+ template <typename MatrixType, typename PermutationIndex>
714
+ inline typename FullPivHouseholderQR<MatrixType, PermutationIndex>::MatrixQReturnType
715
+ FullPivHouseholderQR<MatrixType, PermutationIndex>::matrixQ() const {
659
716
  eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
660
717
  return MatrixQReturnType(m_qr, m_hCoeffs, m_rows_transpositions);
661
718
  }
662
719
 
663
720
  /** \return the full-pivoting Householder QR decomposition of \c *this.
664
- *
665
- * \sa class FullPivHouseholderQR
666
- */
667
- template<typename Derived>
668
- const FullPivHouseholderQR<typename MatrixBase<Derived>::PlainObject>
669
- MatrixBase<Derived>::fullPivHouseholderQr() const
670
- {
671
- 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());
672
729
  }
673
730
 
674
- } // end namespace Eigen
731
+ } // end namespace Eigen
675
732
 
676
- #endif // EIGEN_FULLPIVOTINGHOUSEHOLDERQR_H
733
+ #endif // EIGEN_FULLPIVOTINGHOUSEHOLDERQR_H