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