@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
@@ -10,645 +10,578 @@
10
10
  #ifndef EIGEN_REAL_QZ_H
11
11
  #define EIGEN_REAL_QZ_H
12
12
 
13
+ // IWYU pragma: private
14
+ #include "./InternalHeaderCheck.h"
15
+
13
16
  namespace Eigen {
14
17
 
15
- /** \eigenvalues_module \ingroup Eigenvalues_Module
16
- *
17
- *
18
- * \class RealQZ
19
- *
20
- * \brief Performs a real QZ decomposition of a pair of square matrices
21
- *
22
- * \tparam _MatrixType the type of the matrix of which we are computing the
23
- * real QZ decomposition; this is expected to be an instantiation of the
24
- * Matrix class template.
25
- *
26
- * Given a real square matrices A and B, this class computes the real QZ
27
- * decomposition: \f$ A = Q S Z \f$, \f$ B = Q T Z \f$ where Q and Z are
28
- * real orthogonal matrixes, T is upper-triangular matrix, and S is upper
29
- * quasi-triangular matrix. An orthogonal matrix is a matrix whose
30
- * inverse is equal to its transpose, \f$ U^{-1} = U^T \f$. A quasi-triangular
31
- * matrix is a block-triangular matrix whose diagonal consists of 1-by-1
32
- * blocks and 2-by-2 blocks where further reduction is impossible due to
33
- * complex eigenvalues.
18
+ /** \eigenvalues_module \ingroup Eigenvalues_Module
19
+ *
20
+ *
21
+ * \class RealQZ
22
+ *
23
+ * \brief Performs a real QZ decomposition of a pair of square matrices
24
+ *
25
+ * \tparam MatrixType_ the type of the matrix of which we are computing the
26
+ * real QZ decomposition; this is expected to be an instantiation of the
27
+ * Matrix class template.
28
+ *
29
+ * Given a real square matrices A and B, this class computes the real QZ
30
+ * decomposition: \f$ A = Q S Z \f$, \f$ B = Q T Z \f$ where Q and Z are
31
+ * real orthogonal matrixes, T is upper-triangular matrix, and S is upper
32
+ * quasi-triangular matrix. An orthogonal matrix is a matrix whose
33
+ * inverse is equal to its transpose, \f$ U^{-1} = U^T \f$. A quasi-triangular
34
+ * matrix is a block-triangular matrix whose diagonal consists of 1-by-1
35
+ * blocks and 2-by-2 blocks where further reduction is impossible due to
36
+ * complex eigenvalues.
37
+ *
38
+ * The eigenvalues of the pencil \f$ A - z B \f$ can be obtained from
39
+ * 1x1 and 2x2 blocks on the diagonals of S and T.
40
+ *
41
+ * Call the function compute() to compute the real QZ decomposition of a
42
+ * given pair of matrices. Alternatively, you can use the
43
+ * RealQZ(const MatrixType& B, const MatrixType& B, bool computeQZ)
44
+ * constructor which computes the real QZ decomposition at construction
45
+ * time. Once the decomposition is computed, you can use the matrixS(),
46
+ * matrixT(), matrixQ() and matrixZ() functions to retrieve the matrices
47
+ * S, T, Q and Z in the decomposition. If computeQZ==false, some time
48
+ * is saved by not computing matrices Q and Z.
49
+ *
50
+ * Example: \include RealQZ_compute.cpp
51
+ * Output: \include RealQZ_compute.out
52
+ *
53
+ * \note The implementation is based on the algorithm in "Matrix Computations"
54
+ * by Gene H. Golub and Charles F. Van Loan, and a paper "An algorithm for
55
+ * generalized eigenvalue problems" by C.B.Moler and G.W.Stewart.
56
+ *
57
+ * \sa class RealSchur, class ComplexSchur, class EigenSolver, class ComplexEigenSolver
58
+ */
59
+
60
+ template <typename MatrixType_>
61
+ class RealQZ {
62
+ public:
63
+ typedef MatrixType_ MatrixType;
64
+ enum {
65
+ RowsAtCompileTime = MatrixType::RowsAtCompileTime,
66
+ ColsAtCompileTime = MatrixType::ColsAtCompileTime,
67
+ Options = internal::traits<MatrixType>::Options,
68
+ MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
69
+ MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
70
+ };
71
+ typedef typename MatrixType::Scalar Scalar;
72
+ typedef internal::make_complex_t<Scalar> ComplexScalar;
73
+ typedef Eigen::Index Index; ///< \deprecated since Eigen 3.3
74
+
75
+ typedef Matrix<ComplexScalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> EigenvalueType;
76
+ typedef Matrix<Scalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> ColumnVectorType;
77
+
78
+ /** \brief Default constructor.
34
79
  *
35
- * The eigenvalues of the pencil \f$ A - z B \f$ can be obtained from
36
- * 1x1 and 2x2 blocks on the diagonals of S and T.
80
+ * \param [in] size Positive integer, size of the matrix whose QZ decomposition will be computed.
37
81
  *
38
- * Call the function compute() to compute the real QZ decomposition of a
39
- * given pair of matrices. Alternatively, you can use the
40
- * RealQZ(const MatrixType& B, const MatrixType& B, bool computeQZ)
41
- * constructor which computes the real QZ decomposition at construction
42
- * time. Once the decomposition is computed, you can use the matrixS(),
43
- * matrixT(), matrixQ() and matrixZ() functions to retrieve the matrices
44
- * S, T, Q and Z in the decomposition. If computeQZ==false, some time
45
- * is saved by not computing matrices Q and Z.
82
+ * The default constructor is useful in cases in which the user intends to
83
+ * perform decompositions via compute(). The \p size parameter is only
84
+ * used as a hint. It is not an error to give a wrong \p size, but it may
85
+ * impair performance.
46
86
  *
47
- * Example: \include RealQZ_compute.cpp
48
- * Output: \include RealQZ_compute.out
49
- *
50
- * \note The implementation is based on the algorithm in "Matrix Computations"
51
- * by Gene H. Golub and Charles F. Van Loan, and a paper "An algorithm for
52
- * generalized eigenvalue problems" by C.B.Moler and G.W.Stewart.
53
- *
54
- * \sa class RealSchur, class ComplexSchur, class EigenSolver, class ComplexEigenSolver
87
+ * \sa compute() for an example.
55
88
  */
56
-
57
- template<typename _MatrixType> class RealQZ
58
- {
59
- public:
60
- typedef _MatrixType MatrixType;
61
- enum {
62
- RowsAtCompileTime = MatrixType::RowsAtCompileTime,
63
- ColsAtCompileTime = MatrixType::ColsAtCompileTime,
64
- Options = MatrixType::Options,
65
- MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
66
- MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
67
- };
68
- typedef typename MatrixType::Scalar Scalar;
69
- typedef std::complex<typename NumTraits<Scalar>::Real> ComplexScalar;
70
- typedef Eigen::Index Index; ///< \deprecated since Eigen 3.3
71
-
72
- typedef Matrix<ComplexScalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> EigenvalueType;
73
- typedef Matrix<Scalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> ColumnVectorType;
74
-
75
- /** \brief Default constructor.
76
- *
77
- * \param [in] size Positive integer, size of the matrix whose QZ decomposition will be computed.
78
- *
79
- * The default constructor is useful in cases in which the user intends to
80
- * perform decompositions via compute(). The \p size parameter is only
81
- * used as a hint. It is not an error to give a wrong \p size, but it may
82
- * impair performance.
83
- *
84
- * \sa compute() for an example.
85
- */
86
- explicit RealQZ(Index size = RowsAtCompileTime==Dynamic ? 1 : RowsAtCompileTime) :
87
- m_S(size, size),
89
+ explicit RealQZ(Index size = RowsAtCompileTime == Dynamic ? 1 : RowsAtCompileTime)
90
+ : m_S(size, size),
88
91
  m_T(size, size),
89
92
  m_Q(size, size),
90
93
  m_Z(size, size),
91
- m_workspace(size*2),
94
+ m_workspace(size * 2),
92
95
  m_maxIters(400),
93
- m_isInitialized(false)
94
- { }
95
-
96
- /** \brief Constructor; computes real QZ decomposition of given matrices
97
- *
98
- * \param[in] A Matrix A.
99
- * \param[in] B Matrix B.
100
- * \param[in] computeQZ If false, A and Z are not computed.
101
- *
102
- * This constructor calls compute() to compute the QZ decomposition.
103
- */
104
- RealQZ(const MatrixType& A, const MatrixType& B, bool computeQZ = true) :
105
- m_S(A.rows(),A.cols()),
106
- m_T(A.rows(),A.cols()),
107
- m_Q(A.rows(),A.cols()),
108
- m_Z(A.rows(),A.cols()),
109
- m_workspace(A.rows()*2),
110
- m_maxIters(400),
111
- m_isInitialized(false) {
112
- compute(A, B, computeQZ);
113
- }
96
+ m_isInitialized(false),
97
+ m_computeQZ(true) {}
114
98
 
115
- /** \brief Returns matrix Q in the QZ decomposition.
116
- *
117
- * \returns A const reference to the matrix Q.
118
- */
119
- const MatrixType& matrixQ() const {
120
- eigen_assert(m_isInitialized && "RealQZ is not initialized.");
121
- eigen_assert(m_computeQZ && "The matrices Q and Z have not been computed during the QZ decomposition.");
122
- return m_Q;
123
- }
99
+ /** \brief Constructor; computes real QZ decomposition of given matrices
100
+ *
101
+ * \param[in] A Matrix A.
102
+ * \param[in] B Matrix B.
103
+ * \param[in] computeQZ If false, A and Z are not computed.
104
+ *
105
+ * This constructor calls compute() to compute the QZ decomposition.
106
+ */
107
+ RealQZ(const MatrixType& A, const MatrixType& B, bool computeQZ = true)
108
+ : m_S(A.rows(), A.cols()),
109
+ m_T(A.rows(), A.cols()),
110
+ m_Q(A.rows(), A.cols()),
111
+ m_Z(A.rows(), A.cols()),
112
+ m_workspace(A.rows() * 2),
113
+ m_maxIters(400),
114
+ m_isInitialized(false),
115
+ m_computeQZ(true) {
116
+ compute(A, B, computeQZ);
117
+ }
124
118
 
125
- /** \brief Returns matrix Z in the QZ decomposition.
126
- *
127
- * \returns A const reference to the matrix Z.
128
- */
129
- const MatrixType& matrixZ() const {
130
- eigen_assert(m_isInitialized && "RealQZ is not initialized.");
131
- eigen_assert(m_computeQZ && "The matrices Q and Z have not been computed during the QZ decomposition.");
132
- return m_Z;
133
- }
119
+ /** \brief Returns matrix Q in the QZ decomposition.
120
+ *
121
+ * \returns A const reference to the matrix Q.
122
+ */
123
+ const MatrixType& matrixQ() const {
124
+ eigen_assert(m_isInitialized && "RealQZ is not initialized.");
125
+ eigen_assert(m_computeQZ && "The matrices Q and Z have not been computed during the QZ decomposition.");
126
+ return m_Q;
127
+ }
134
128
 
135
- /** \brief Returns matrix S in the QZ decomposition.
136
- *
137
- * \returns A const reference to the matrix S.
138
- */
139
- const MatrixType& matrixS() const {
140
- eigen_assert(m_isInitialized && "RealQZ is not initialized.");
141
- return m_S;
142
- }
129
+ /** \brief Returns matrix Z in the QZ decomposition.
130
+ *
131
+ * \returns A const reference to the matrix Z.
132
+ */
133
+ const MatrixType& matrixZ() const {
134
+ eigen_assert(m_isInitialized && "RealQZ is not initialized.");
135
+ eigen_assert(m_computeQZ && "The matrices Q and Z have not been computed during the QZ decomposition.");
136
+ return m_Z;
137
+ }
143
138
 
144
- /** \brief Returns matrix S in the QZ decomposition.
145
- *
146
- * \returns A const reference to the matrix S.
147
- */
148
- const MatrixType& matrixT() const {
149
- eigen_assert(m_isInitialized && "RealQZ is not initialized.");
150
- return m_T;
151
- }
139
+ /** \brief Returns matrix S in the QZ decomposition.
140
+ *
141
+ * \returns A const reference to the matrix S.
142
+ */
143
+ const MatrixType& matrixS() const {
144
+ eigen_assert(m_isInitialized && "RealQZ is not initialized.");
145
+ return m_S;
146
+ }
152
147
 
153
- /** \brief Computes QZ decomposition of given matrix.
154
- *
155
- * \param[in] A Matrix A.
156
- * \param[in] B Matrix B.
157
- * \param[in] computeQZ If false, A and Z are not computed.
158
- * \returns Reference to \c *this
159
- */
160
- RealQZ& compute(const MatrixType& A, const MatrixType& B, bool computeQZ = true);
161
-
162
- /** \brief Reports whether previous computation was successful.
163
- *
164
- * \returns \c Success if computation was succesful, \c NoConvergence otherwise.
165
- */
166
- ComputationInfo info() const
167
- {
168
- eigen_assert(m_isInitialized && "RealQZ is not initialized.");
169
- return m_info;
170
- }
148
+ /** \brief Returns matrix S in the QZ decomposition.
149
+ *
150
+ * \returns A const reference to the matrix S.
151
+ */
152
+ const MatrixType& matrixT() const {
153
+ eigen_assert(m_isInitialized && "RealQZ is not initialized.");
154
+ return m_T;
155
+ }
171
156
 
172
- /** \brief Returns number of performed QR-like iterations.
173
- */
174
- Index iterations() const
175
- {
176
- eigen_assert(m_isInitialized && "RealQZ is not initialized.");
177
- return m_global_iter;
178
- }
157
+ /** \brief Computes QZ decomposition of given matrix.
158
+ *
159
+ * \param[in] A Matrix A.
160
+ * \param[in] B Matrix B.
161
+ * \param[in] computeQZ If false, A and Z are not computed.
162
+ * \returns Reference to \c *this
163
+ */
164
+ RealQZ& compute(const MatrixType& A, const MatrixType& B, bool computeQZ = true);
179
165
 
180
- /** Sets the maximal number of iterations allowed to converge to one eigenvalue
181
- * or decouple the problem.
182
- */
183
- RealQZ& setMaxIterations(Index maxIters)
184
- {
185
- m_maxIters = maxIters;
186
- return *this;
187
- }
166
+ /** \brief Reports whether previous computation was successful.
167
+ *
168
+ * \returns \c Success if computation was successful, \c NoConvergence otherwise.
169
+ */
170
+ ComputationInfo info() const {
171
+ eigen_assert(m_isInitialized && "RealQZ is not initialized.");
172
+ return m_info;
173
+ }
188
174
 
189
- private:
190
-
191
- MatrixType m_S, m_T, m_Q, m_Z;
192
- Matrix<Scalar,Dynamic,1> m_workspace;
193
- ComputationInfo m_info;
194
- Index m_maxIters;
195
- bool m_isInitialized;
196
- bool m_computeQZ;
197
- Scalar m_normOfT, m_normOfS;
198
- Index m_global_iter;
199
-
200
- typedef Matrix<Scalar,3,1> Vector3s;
201
- typedef Matrix<Scalar,2,1> Vector2s;
202
- typedef Matrix<Scalar,2,2> Matrix2s;
203
- typedef JacobiRotation<Scalar> JRs;
204
-
205
- void hessenbergTriangular();
206
- void computeNorms();
207
- Index findSmallSubdiagEntry(Index iu);
208
- Index findSmallDiagEntry(Index f, Index l);
209
- void splitOffTwoRows(Index i);
210
- void pushDownZero(Index z, Index f, Index l);
211
- void step(Index f, Index l, Index iter);
212
-
213
- }; // RealQZ
214
-
215
- /** \internal Reduces S and T to upper Hessenberg - triangular form */
216
- template<typename MatrixType>
217
- void RealQZ<MatrixType>::hessenbergTriangular()
218
- {
175
+ /** \brief Returns number of performed QR-like iterations.
176
+ */
177
+ Index iterations() const {
178
+ eigen_assert(m_isInitialized && "RealQZ is not initialized.");
179
+ return m_global_iter;
180
+ }
219
181
 
220
- const Index dim = m_S.cols();
221
-
222
- // perform QR decomposition of T, overwrite T with R, save Q
223
- HouseholderQR<MatrixType> qrT(m_T);
224
- m_T = qrT.matrixQR();
225
- m_T.template triangularView<StrictlyLower>().setZero();
226
- m_Q = qrT.householderQ();
227
- // overwrite S with Q* S
228
- m_S.applyOnTheLeft(m_Q.adjoint());
229
- // init Z as Identity
230
- if (m_computeQZ)
231
- m_Z = MatrixType::Identity(dim,dim);
232
- // reduce S to upper Hessenberg with Givens rotations
233
- for (Index j=0; j<=dim-3; j++) {
234
- for (Index i=dim-1; i>=j+2; i--) {
235
- JRs G;
236
- // kill S(i,j)
237
- if(m_S.coeff(i,j) != 0)
238
- {
239
- G.makeGivens(m_S.coeff(i-1,j), m_S.coeff(i,j), &m_S.coeffRef(i-1, j));
240
- m_S.coeffRef(i,j) = Scalar(0.0);
241
- m_S.rightCols(dim-j-1).applyOnTheLeft(i-1,i,G.adjoint());
242
- m_T.rightCols(dim-i+1).applyOnTheLeft(i-1,i,G.adjoint());
243
- // update Q
244
- if (m_computeQZ)
245
- m_Q.applyOnTheRight(i-1,i,G);
246
- }
247
- // kill T(i,i-1)
248
- if(m_T.coeff(i,i-1)!=Scalar(0))
249
- {
250
- G.makeGivens(m_T.coeff(i,i), m_T.coeff(i,i-1), &m_T.coeffRef(i,i));
251
- m_T.coeffRef(i,i-1) = Scalar(0.0);
252
- m_S.applyOnTheRight(i,i-1,G);
253
- m_T.topRows(i).applyOnTheRight(i,i-1,G);
254
- // update Z
255
- if (m_computeQZ)
256
- m_Z.applyOnTheLeft(i,i-1,G.adjoint());
257
- }
258
- }
182
+ /** Sets the maximal number of iterations allowed to converge to one eigenvalue
183
+ * or decouple the problem.
184
+ */
185
+ RealQZ& setMaxIterations(Index maxIters) {
186
+ m_maxIters = maxIters;
187
+ return *this;
188
+ }
189
+
190
+ private:
191
+ MatrixType m_S, m_T, m_Q, m_Z;
192
+ Matrix<Scalar, Dynamic, 1> m_workspace;
193
+ ComputationInfo m_info;
194
+ Index m_maxIters;
195
+ bool m_isInitialized;
196
+ bool m_computeQZ;
197
+ Scalar m_normOfT, m_normOfS;
198
+ Index m_global_iter;
199
+
200
+ typedef Matrix<Scalar, 3, 1> Vector3s;
201
+ typedef Matrix<Scalar, 2, 1> Vector2s;
202
+ typedef Matrix<Scalar, 2, 2> Matrix2s;
203
+ typedef JacobiRotation<Scalar> JRs;
204
+
205
+ void hessenbergTriangular();
206
+ void computeNorms();
207
+ Index findSmallSubdiagEntry(Index iu);
208
+ Index findSmallDiagEntry(Index f, Index l);
209
+ void splitOffTwoRows(Index i);
210
+ void pushDownZero(Index z, Index f, Index l);
211
+ void step(Index f, Index l, Index iter);
212
+
213
+ }; // RealQZ
214
+
215
+ /** \internal Reduces S and T to upper Hessenberg - triangular form */
216
+ template <typename MatrixType>
217
+ void RealQZ<MatrixType>::hessenbergTriangular() {
218
+ const Index dim = m_S.cols();
219
+
220
+ // perform QR decomposition of T, overwrite T with R, save Q
221
+ HouseholderQR<MatrixType> qrT(m_T);
222
+ m_T = qrT.matrixQR();
223
+ m_T.template triangularView<StrictlyLower>().setZero();
224
+ m_Q = qrT.householderQ();
225
+ // overwrite S with Q* S
226
+ m_S.applyOnTheLeft(m_Q.adjoint());
227
+ // init Z as Identity
228
+ if (m_computeQZ) m_Z = MatrixType::Identity(dim, dim);
229
+ // reduce S to upper Hessenberg with Givens rotations
230
+ for (Index j = 0; j <= dim - 3; j++) {
231
+ for (Index i = dim - 1; i >= j + 2; i--) {
232
+ JRs G;
233
+ // kill S(i,j)
234
+ if (!numext::is_exactly_zero(m_S.coeff(i, j))) {
235
+ G.makeGivens(m_S.coeff(i - 1, j), m_S.coeff(i, j), &m_S.coeffRef(i - 1, j));
236
+ m_S.coeffRef(i, j) = Scalar(0.0);
237
+ m_S.rightCols(dim - j - 1).applyOnTheLeft(i - 1, i, G.adjoint());
238
+ m_T.rightCols(dim - i + 1).applyOnTheLeft(i - 1, i, G.adjoint());
239
+ // update Q
240
+ if (m_computeQZ) m_Q.applyOnTheRight(i - 1, i, G);
259
241
  }
260
- }
261
-
262
- /** \internal Computes vector L1 norms of S and T when in Hessenberg-Triangular form already */
263
- template<typename MatrixType>
264
- inline void RealQZ<MatrixType>::computeNorms()
265
- {
266
- const Index size = m_S.cols();
267
- m_normOfS = Scalar(0.0);
268
- m_normOfT = Scalar(0.0);
269
- for (Index j = 0; j < size; ++j)
270
- {
271
- m_normOfS += m_S.col(j).segment(0, (std::min)(size,j+2)).cwiseAbs().sum();
272
- m_normOfT += m_T.row(j).segment(j, size - j).cwiseAbs().sum();
242
+ // kill T(i,i-1)
243
+ if (!numext::is_exactly_zero(m_T.coeff(i, i - 1))) {
244
+ G.makeGivens(m_T.coeff(i, i), m_T.coeff(i, i - 1), &m_T.coeffRef(i, i));
245
+ m_T.coeffRef(i, i - 1) = Scalar(0.0);
246
+ m_S.applyOnTheRight(i, i - 1, G);
247
+ m_T.topRows(i).applyOnTheRight(i, i - 1, G);
248
+ // update Z
249
+ if (m_computeQZ) m_Z.applyOnTheLeft(i, i - 1, G.adjoint());
273
250
  }
274
251
  }
252
+ }
253
+ }
254
+
255
+ /** \internal Computes vector L1 norms of S and T when in Hessenberg-Triangular form already */
256
+ template <typename MatrixType>
257
+ inline void RealQZ<MatrixType>::computeNorms() {
258
+ const Index size = m_S.cols();
259
+ m_normOfS = Scalar(0.0);
260
+ m_normOfT = Scalar(0.0);
261
+ for (Index j = 0; j < size; ++j) {
262
+ m_normOfS += m_S.col(j).segment(0, (std::min)(size, j + 2)).cwiseAbs().sum();
263
+ m_normOfT += m_T.row(j).segment(j, size - j).cwiseAbs().sum();
264
+ }
265
+ }
266
+
267
+ /** \internal Look for single small sub-diagonal element S(res, res-1) and return res (or 0) */
268
+ template <typename MatrixType>
269
+ inline Index RealQZ<MatrixType>::findSmallSubdiagEntry(Index iu) {
270
+ using std::abs;
271
+ Index res = iu;
272
+ while (res > 0) {
273
+ Scalar s = abs(m_S.coeff(res - 1, res - 1)) + abs(m_S.coeff(res, res));
274
+ if (numext::is_exactly_zero(s)) s = m_normOfS;
275
+ if (abs(m_S.coeff(res, res - 1)) < NumTraits<Scalar>::epsilon() * s) break;
276
+ res--;
277
+ }
278
+ return res;
279
+ }
280
+
281
+ /** \internal Look for single small diagonal element T(res, res) for res between f and l, and return res (or f-1) */
282
+ template <typename MatrixType>
283
+ inline Index RealQZ<MatrixType>::findSmallDiagEntry(Index f, Index l) {
284
+ using std::abs;
285
+ Index res = l;
286
+ while (res >= f) {
287
+ if (abs(m_T.coeff(res, res)) <= NumTraits<Scalar>::epsilon() * m_normOfT) break;
288
+ res--;
289
+ }
290
+ return res;
291
+ }
292
+
293
+ /** \internal decouple 2x2 diagonal block in rows i, i+1 if eigenvalues are real */
294
+ template <typename MatrixType>
295
+ inline void RealQZ<MatrixType>::splitOffTwoRows(Index i) {
296
+ using std::abs;
297
+ using std::sqrt;
298
+ const Index dim = m_S.cols();
299
+ if (numext::is_exactly_zero(abs(m_S.coeff(i + 1, i)))) return;
300
+ Index j = findSmallDiagEntry(i, i + 1);
301
+ if (j == i - 1) {
302
+ // block of (S T^{-1})
303
+ Matrix2s STi = m_T.template block<2, 2>(i, i).template triangularView<Upper>().template solve<OnTheRight>(
304
+ m_S.template block<2, 2>(i, i));
305
+ Scalar p = Scalar(0.5) * (STi(0, 0) - STi(1, 1));
306
+ Scalar q = p * p + STi(1, 0) * STi(0, 1);
307
+ if (q >= 0) {
308
+ Scalar z = sqrt(q);
309
+ // one QR-like iteration for ABi - lambda I
310
+ // is enough - when we know exact eigenvalue in advance,
311
+ // convergence is immediate
312
+ JRs G;
313
+ if (p >= 0)
314
+ G.makeGivens(p + z, STi(1, 0));
315
+ else
316
+ G.makeGivens(p - z, STi(1, 0));
317
+ m_S.rightCols(dim - i).applyOnTheLeft(i, i + 1, G.adjoint());
318
+ m_T.rightCols(dim - i).applyOnTheLeft(i, i + 1, G.adjoint());
319
+ // update Q
320
+ if (m_computeQZ) m_Q.applyOnTheRight(i, i + 1, G);
321
+
322
+ G.makeGivens(m_T.coeff(i + 1, i + 1), m_T.coeff(i + 1, i));
323
+ m_S.topRows(i + 2).applyOnTheRight(i + 1, i, G);
324
+ m_T.topRows(i + 2).applyOnTheRight(i + 1, i, G);
325
+ // update Z
326
+ if (m_computeQZ) m_Z.applyOnTheLeft(i + 1, i, G.adjoint());
275
327
 
276
-
277
- /** \internal Look for single small sub-diagonal element S(res, res-1) and return res (or 0) */
278
- template<typename MatrixType>
279
- inline Index RealQZ<MatrixType>::findSmallSubdiagEntry(Index iu)
280
- {
281
- using std::abs;
282
- Index res = iu;
283
- while (res > 0)
284
- {
285
- Scalar s = abs(m_S.coeff(res-1,res-1)) + abs(m_S.coeff(res,res));
286
- if (s == Scalar(0.0))
287
- s = m_normOfS;
288
- if (abs(m_S.coeff(res,res-1)) < NumTraits<Scalar>::epsilon() * s)
289
- break;
290
- res--;
291
- }
292
- return res;
328
+ m_S.coeffRef(i + 1, i) = Scalar(0.0);
329
+ m_T.coeffRef(i + 1, i) = Scalar(0.0);
293
330
  }
294
-
295
- /** \internal Look for single small diagonal element T(res, res) for res between f and l, and return res (or f-1) */
296
- template<typename MatrixType>
297
- inline Index RealQZ<MatrixType>::findSmallDiagEntry(Index f, Index l)
298
- {
299
- using std::abs;
300
- Index res = l;
301
- while (res >= f) {
302
- if (abs(m_T.coeff(res,res)) <= NumTraits<Scalar>::epsilon() * m_normOfT)
303
- break;
304
- res--;
305
- }
306
- return res;
331
+ } else {
332
+ pushDownZero(j, i, i + 1);
333
+ }
334
+ }
335
+
336
+ /** \internal use zero in T(z,z) to zero S(l,l-1), working in block f..l */
337
+ template <typename MatrixType>
338
+ inline void RealQZ<MatrixType>::pushDownZero(Index z, Index f, Index l) {
339
+ JRs G;
340
+ const Index dim = m_S.cols();
341
+ for (Index zz = z; zz < l; zz++) {
342
+ // push 0 down
343
+ Index firstColS = zz > f ? (zz - 1) : zz;
344
+ G.makeGivens(m_T.coeff(zz, zz + 1), m_T.coeff(zz + 1, zz + 1));
345
+ m_S.rightCols(dim - firstColS).applyOnTheLeft(zz, zz + 1, G.adjoint());
346
+ m_T.rightCols(dim - zz).applyOnTheLeft(zz, zz + 1, G.adjoint());
347
+ m_T.coeffRef(zz + 1, zz + 1) = Scalar(0.0);
348
+ // update Q
349
+ if (m_computeQZ) m_Q.applyOnTheRight(zz, zz + 1, G);
350
+ // kill S(zz+1, zz-1)
351
+ if (zz > f) {
352
+ G.makeGivens(m_S.coeff(zz + 1, zz), m_S.coeff(zz + 1, zz - 1));
353
+ m_S.topRows(zz + 2).applyOnTheRight(zz, zz - 1, G);
354
+ m_T.topRows(zz + 1).applyOnTheRight(zz, zz - 1, G);
355
+ m_S.coeffRef(zz + 1, zz - 1) = Scalar(0.0);
356
+ // update Z
357
+ if (m_computeQZ) m_Z.applyOnTheLeft(zz, zz - 1, G.adjoint());
307
358
  }
308
-
309
- /** \internal decouple 2x2 diagonal block in rows i, i+1 if eigenvalues are real */
310
- template<typename MatrixType>
311
- inline void RealQZ<MatrixType>::splitOffTwoRows(Index i)
359
+ }
360
+ // finally kill S(l,l-1)
361
+ G.makeGivens(m_S.coeff(l, l), m_S.coeff(l, l - 1));
362
+ m_S.applyOnTheRight(l, l - 1, G);
363
+ m_T.applyOnTheRight(l, l - 1, G);
364
+ m_S.coeffRef(l, l - 1) = Scalar(0.0);
365
+ // update Z
366
+ if (m_computeQZ) m_Z.applyOnTheLeft(l, l - 1, G.adjoint());
367
+ }
368
+
369
+ /** \internal QR-like iterative step for block f..l */
370
+ template <typename MatrixType>
371
+ inline void RealQZ<MatrixType>::step(Index f, Index l, Index iter) {
372
+ using std::abs;
373
+ const Index dim = m_S.cols();
374
+
375
+ // x, y, z
376
+ Scalar x, y, z;
377
+ if (iter == 10) {
378
+ // Wilkinson ad hoc shift
379
+ const Scalar a11 = m_S.coeff(f + 0, f + 0), a12 = m_S.coeff(f + 0, f + 1), a21 = m_S.coeff(f + 1, f + 0),
380
+ a22 = m_S.coeff(f + 1, f + 1), a32 = m_S.coeff(f + 2, f + 1), b12 = m_T.coeff(f + 0, f + 1),
381
+ b11i = Scalar(1.0) / m_T.coeff(f + 0, f + 0), b22i = Scalar(1.0) / m_T.coeff(f + 1, f + 1),
382
+ a87 = m_S.coeff(l - 1, l - 2), a98 = m_S.coeff(l - 0, l - 1),
383
+ b77i = Scalar(1.0) / m_T.coeff(l - 2, l - 2), b88i = Scalar(1.0) / m_T.coeff(l - 1, l - 1);
384
+ Scalar ss = abs(a87 * b77i) + abs(a98 * b88i), lpl = Scalar(1.5) * ss, ll = ss * ss;
385
+ x = ll + a11 * a11 * b11i * b11i - lpl * a11 * b11i + a12 * a21 * b11i * b22i -
386
+ a11 * a21 * b12 * b11i * b11i * b22i;
387
+ y = a11 * a21 * b11i * b11i - lpl * a21 * b11i + a21 * a22 * b11i * b22i - a21 * a21 * b12 * b11i * b11i * b22i;
388
+ z = a21 * a32 * b11i * b22i;
389
+ } else if (iter == 16) {
390
+ // another exceptional shift
391
+ x = m_S.coeff(f, f) / m_T.coeff(f, f) - m_S.coeff(l, l) / m_T.coeff(l, l) +
392
+ m_S.coeff(l, l - 1) * m_T.coeff(l - 1, l) / (m_T.coeff(l - 1, l - 1) * m_T.coeff(l, l));
393
+ y = m_S.coeff(f + 1, f) / m_T.coeff(f, f);
394
+ z = 0;
395
+ } else if (iter > 23 && !(iter % 8)) {
396
+ // extremely exceptional shift
397
+ x = internal::random<Scalar>(-1.0, 1.0);
398
+ y = internal::random<Scalar>(-1.0, 1.0);
399
+ z = internal::random<Scalar>(-1.0, 1.0);
400
+ } else {
401
+ // Compute the shifts: (x,y,z,0...) = (AB^-1 - l1 I) (AB^-1 - l2 I) e1
402
+ // where l1 and l2 are the eigenvalues of the 2x2 matrix C = U V^-1 where
403
+ // U and V are 2x2 bottom right sub matrices of A and B. Thus:
404
+ // = AB^-1AB^-1 + l1 l2 I - (l1+l2)(AB^-1)
405
+ // = AB^-1AB^-1 + det(M) - tr(M)(AB^-1)
406
+ // Since we are only interested in having x, y, z with a correct ratio, we have:
407
+ const Scalar a11 = m_S.coeff(f, f), a12 = m_S.coeff(f, f + 1), a21 = m_S.coeff(f + 1, f),
408
+ a22 = m_S.coeff(f + 1, f + 1), a32 = m_S.coeff(f + 2, f + 1),
409
+
410
+ a88 = m_S.coeff(l - 1, l - 1), a89 = m_S.coeff(l - 1, l), a98 = m_S.coeff(l, l - 1),
411
+ a99 = m_S.coeff(l, l),
412
+
413
+ b11 = m_T.coeff(f, f), b12 = m_T.coeff(f, f + 1), b22 = m_T.coeff(f + 1, f + 1),
414
+
415
+ b88 = m_T.coeff(l - 1, l - 1), b89 = m_T.coeff(l - 1, l), b99 = m_T.coeff(l, l);
416
+
417
+ x = ((a88 / b88 - a11 / b11) * (a99 / b99 - a11 / b11) - (a89 / b99) * (a98 / b88) +
418
+ (a98 / b88) * (b89 / b99) * (a11 / b11)) *
419
+ (b11 / a21) +
420
+ a12 / b22 - (a11 / b11) * (b12 / b22);
421
+ y = (a22 / b22 - a11 / b11) - (a21 / b11) * (b12 / b22) - (a88 / b88 - a11 / b11) - (a99 / b99 - a11 / b11) +
422
+ (a98 / b88) * (b89 / b99);
423
+ z = a32 / b22;
424
+ }
425
+
426
+ JRs G;
427
+
428
+ for (Index k = f; k <= l - 2; k++) {
429
+ // variables for Householder reflections
430
+ Vector2s essential2;
431
+ Scalar tau, beta;
432
+
433
+ Vector3s hr(x, y, z);
434
+
435
+ // Q_k to annihilate S(k+1,k-1) and S(k+2,k-1)
436
+ hr.makeHouseholderInPlace(tau, beta);
437
+ essential2 = hr.template bottomRows<2>();
438
+ Index fc = (std::max)(k - 1, Index(0)); // first col to update
439
+ m_S.template middleRows<3>(k).rightCols(dim - fc).applyHouseholderOnTheLeft(essential2, tau, m_workspace.data());
440
+ m_T.template middleRows<3>(k).rightCols(dim - fc).applyHouseholderOnTheLeft(essential2, tau, m_workspace.data());
441
+ if (m_computeQZ) m_Q.template middleCols<3>(k).applyHouseholderOnTheRight(essential2, tau, m_workspace.data());
442
+ if (k > f) m_S.coeffRef(k + 2, k - 1) = m_S.coeffRef(k + 1, k - 1) = Scalar(0.0);
443
+
444
+ // Z_{k1} to annihilate T(k+2,k+1) and T(k+2,k)
445
+ hr << m_T.coeff(k + 2, k + 2), m_T.coeff(k + 2, k), m_T.coeff(k + 2, k + 1);
446
+ hr.makeHouseholderInPlace(tau, beta);
447
+ essential2 = hr.template bottomRows<2>();
312
448
  {
313
- using std::abs;
314
- using std::sqrt;
315
- const Index dim=m_S.cols();
316
- if (abs(m_S.coeff(i+1,i))==Scalar(0))
317
- return;
318
- Index j = findSmallDiagEntry(i,i+1);
319
- if (j==i-1)
320
- {
321
- // block of (S T^{-1})
322
- Matrix2s STi = m_T.template block<2,2>(i,i).template triangularView<Upper>().
323
- template solve<OnTheRight>(m_S.template block<2,2>(i,i));
324
- Scalar p = Scalar(0.5)*(STi(0,0)-STi(1,1));
325
- Scalar q = p*p + STi(1,0)*STi(0,1);
326
- if (q>=0) {
327
- Scalar z = sqrt(q);
328
- // one QR-like iteration for ABi - lambda I
329
- // is enough - when we know exact eigenvalue in advance,
330
- // convergence is immediate
331
- JRs G;
332
- if (p>=0)
333
- G.makeGivens(p + z, STi(1,0));
334
- else
335
- G.makeGivens(p - z, STi(1,0));
336
- m_S.rightCols(dim-i).applyOnTheLeft(i,i+1,G.adjoint());
337
- m_T.rightCols(dim-i).applyOnTheLeft(i,i+1,G.adjoint());
338
- // update Q
339
- if (m_computeQZ)
340
- m_Q.applyOnTheRight(i,i+1,G);
341
-
342
- G.makeGivens(m_T.coeff(i+1,i+1), m_T.coeff(i+1,i));
343
- m_S.topRows(i+2).applyOnTheRight(i+1,i,G);
344
- m_T.topRows(i+2).applyOnTheRight(i+1,i,G);
345
- // update Z
346
- if (m_computeQZ)
347
- m_Z.applyOnTheLeft(i+1,i,G.adjoint());
348
-
349
- m_S.coeffRef(i+1,i) = Scalar(0.0);
350
- m_T.coeffRef(i+1,i) = Scalar(0.0);
351
- }
352
- }
353
- else
354
- {
355
- pushDownZero(j,i,i+1);
356
- }
449
+ Index lr = (std::min)(k + 4, dim); // last row to update
450
+ Map<Matrix<Scalar, Dynamic, 1> > tmp(m_workspace.data(), lr);
451
+ // S
452
+ tmp.noalias() = m_S.template middleCols<2>(k).topRows(lr) * essential2;
453
+ tmp += m_S.col(k + 2).head(lr);
454
+ m_S.col(k + 2).head(lr) -= tau * tmp;
455
+ m_S.template middleCols<2>(k).topRows(lr).noalias() -= (tau * tmp) * essential2.adjoint();
456
+ // T
457
+ tmp = m_T.template middleCols<2>(k).topRows(lr) * essential2;
458
+ tmp += m_T.col(k + 2).head(lr);
459
+ m_T.col(k + 2).head(lr) -= tau * tmp;
460
+ m_T.template middleCols<2>(k).topRows(lr).noalias() -= (tau * tmp) * essential2.adjoint();
357
461
  }
358
-
359
- /** \internal use zero in T(z,z) to zero S(l,l-1), working in block f..l */
360
- template<typename MatrixType>
361
- inline void RealQZ<MatrixType>::pushDownZero(Index z, Index f, Index l)
362
- {
363
- JRs G;
364
- const Index dim = m_S.cols();
365
- for (Index zz=z; zz<l; zz++)
366
- {
367
- // push 0 down
368
- Index firstColS = zz>f ? (zz-1) : zz;
369
- G.makeGivens(m_T.coeff(zz, zz+1), m_T.coeff(zz+1, zz+1));
370
- m_S.rightCols(dim-firstColS).applyOnTheLeft(zz,zz+1,G.adjoint());
371
- m_T.rightCols(dim-zz).applyOnTheLeft(zz,zz+1,G.adjoint());
372
- m_T.coeffRef(zz+1,zz+1) = Scalar(0.0);
373
- // update Q
374
- if (m_computeQZ)
375
- m_Q.applyOnTheRight(zz,zz+1,G);
376
- // kill S(zz+1, zz-1)
377
- if (zz>f)
378
- {
379
- G.makeGivens(m_S.coeff(zz+1, zz), m_S.coeff(zz+1,zz-1));
380
- m_S.topRows(zz+2).applyOnTheRight(zz, zz-1,G);
381
- m_T.topRows(zz+1).applyOnTheRight(zz, zz-1,G);
382
- m_S.coeffRef(zz+1,zz-1) = Scalar(0.0);
383
- // update Z
384
- if (m_computeQZ)
385
- m_Z.applyOnTheLeft(zz,zz-1,G.adjoint());
386
- }
387
- }
388
- // finally kill S(l,l-1)
389
- G.makeGivens(m_S.coeff(l,l), m_S.coeff(l,l-1));
390
- m_S.applyOnTheRight(l,l-1,G);
391
- m_T.applyOnTheRight(l,l-1,G);
392
- m_S.coeffRef(l,l-1)=Scalar(0.0);
393
- // update Z
394
- if (m_computeQZ)
395
- m_Z.applyOnTheLeft(l,l-1,G.adjoint());
462
+ if (m_computeQZ) {
463
+ // Z
464
+ Map<Matrix<Scalar, 1, Dynamic> > tmp(m_workspace.data(), dim);
465
+ tmp.noalias() = essential2.adjoint() * (m_Z.template middleRows<2>(k));
466
+ tmp += m_Z.row(k + 2);
467
+ m_Z.row(k + 2) -= tau * tmp;
468
+ m_Z.template middleRows<2>(k).noalias() -= essential2 * (tau * tmp);
396
469
  }
397
-
398
- /** \internal QR-like iterative step for block f..l */
399
- template<typename MatrixType>
400
- inline void RealQZ<MatrixType>::step(Index f, Index l, Index iter)
470
+ m_T.coeffRef(k + 2, k) = m_T.coeffRef(k + 2, k + 1) = Scalar(0.0);
471
+
472
+ // Z_{k2} to annihilate T(k+1,k)
473
+ G.makeGivens(m_T.coeff(k + 1, k + 1), m_T.coeff(k + 1, k));
474
+ m_S.applyOnTheRight(k + 1, k, G);
475
+ m_T.applyOnTheRight(k + 1, k, G);
476
+ // update Z
477
+ if (m_computeQZ) m_Z.applyOnTheLeft(k + 1, k, G.adjoint());
478
+ m_T.coeffRef(k + 1, k) = Scalar(0.0);
479
+
480
+ // update x,y,z
481
+ x = m_S.coeff(k + 1, k);
482
+ y = m_S.coeff(k + 2, k);
483
+ if (k < l - 2) z = m_S.coeff(k + 3, k);
484
+ } // loop over k
485
+
486
+ // Q_{n-1} to annihilate y = S(l,l-2)
487
+ G.makeGivens(x, y);
488
+ m_S.applyOnTheLeft(l - 1, l, G.adjoint());
489
+ m_T.applyOnTheLeft(l - 1, l, G.adjoint());
490
+ if (m_computeQZ) m_Q.applyOnTheRight(l - 1, l, G);
491
+ m_S.coeffRef(l, l - 2) = Scalar(0.0);
492
+
493
+ // Z_{n-1} to annihilate T(l,l-1)
494
+ G.makeGivens(m_T.coeff(l, l), m_T.coeff(l, l - 1));
495
+ m_S.applyOnTheRight(l, l - 1, G);
496
+ m_T.applyOnTheRight(l, l - 1, G);
497
+ if (m_computeQZ) m_Z.applyOnTheLeft(l, l - 1, G.adjoint());
498
+ m_T.coeffRef(l, l - 1) = Scalar(0.0);
499
+ }
500
+
501
+ template <typename MatrixType>
502
+ RealQZ<MatrixType>& RealQZ<MatrixType>::compute(const MatrixType& A_in, const MatrixType& B_in, bool computeQZ) {
503
+ const Index dim = A_in.cols();
504
+
505
+ eigen_assert(A_in.rows() == dim && A_in.cols() == dim && B_in.rows() == dim && B_in.cols() == dim &&
506
+ "Need square matrices of the same dimension");
507
+
508
+ m_isInitialized = true;
509
+ m_computeQZ = computeQZ;
510
+ m_S = A_in;
511
+ m_T = B_in;
512
+ m_workspace.resize(dim * 2);
513
+ m_global_iter = 0;
514
+
515
+ // entrance point: hessenberg triangular decomposition
516
+ hessenbergTriangular();
517
+ // compute L1 vector norms of T, S into m_normOfS, m_normOfT
518
+ computeNorms();
519
+
520
+ Index l = dim - 1, f, local_iter = 0;
521
+
522
+ while (l > 0 && local_iter < m_maxIters) {
523
+ f = findSmallSubdiagEntry(l);
524
+ // now rows and columns f..l (including) decouple from the rest of the problem
525
+ if (f > 0) m_S.coeffRef(f, f - 1) = Scalar(0.0);
526
+ if (f == l) // One root found
401
527
  {
402
- using std::abs;
403
- const Index dim = m_S.cols();
404
-
405
- // x, y, z
406
- Scalar x, y, z;
407
- if (iter==10)
408
- {
409
- // Wilkinson ad hoc shift
410
- const Scalar
411
- a11=m_S.coeff(f+0,f+0), a12=m_S.coeff(f+0,f+1),
412
- a21=m_S.coeff(f+1,f+0), a22=m_S.coeff(f+1,f+1), a32=m_S.coeff(f+2,f+1),
413
- b12=m_T.coeff(f+0,f+1),
414
- b11i=Scalar(1.0)/m_T.coeff(f+0,f+0),
415
- b22i=Scalar(1.0)/m_T.coeff(f+1,f+1),
416
- a87=m_S.coeff(l-1,l-2),
417
- a98=m_S.coeff(l-0,l-1),
418
- b77i=Scalar(1.0)/m_T.coeff(l-2,l-2),
419
- b88i=Scalar(1.0)/m_T.coeff(l-1,l-1);
420
- Scalar ss = abs(a87*b77i) + abs(a98*b88i),
421
- lpl = Scalar(1.5)*ss,
422
- ll = ss*ss;
423
- x = ll + a11*a11*b11i*b11i - lpl*a11*b11i + a12*a21*b11i*b22i
424
- - a11*a21*b12*b11i*b11i*b22i;
425
- y = a11*a21*b11i*b11i - lpl*a21*b11i + a21*a22*b11i*b22i
426
- - a21*a21*b12*b11i*b11i*b22i;
427
- z = a21*a32*b11i*b22i;
428
- }
429
- else if (iter==16)
430
- {
431
- // another exceptional shift
432
- x = m_S.coeff(f,f)/m_T.coeff(f,f)-m_S.coeff(l,l)/m_T.coeff(l,l) + m_S.coeff(l,l-1)*m_T.coeff(l-1,l) /
433
- (m_T.coeff(l-1,l-1)*m_T.coeff(l,l));
434
- y = m_S.coeff(f+1,f)/m_T.coeff(f,f);
435
- z = 0;
436
- }
437
- else if (iter>23 && !(iter%8))
438
- {
439
- // extremely exceptional shift
440
- x = internal::random<Scalar>(-1.0,1.0);
441
- y = internal::random<Scalar>(-1.0,1.0);
442
- z = internal::random<Scalar>(-1.0,1.0);
443
- }
444
- else
445
- {
446
- // Compute the shifts: (x,y,z,0...) = (AB^-1 - l1 I) (AB^-1 - l2 I) e1
447
- // where l1 and l2 are the eigenvalues of the 2x2 matrix C = U V^-1 where
448
- // U and V are 2x2 bottom right sub matrices of A and B. Thus:
449
- // = AB^-1AB^-1 + l1 l2 I - (l1+l2)(AB^-1)
450
- // = AB^-1AB^-1 + det(M) - tr(M)(AB^-1)
451
- // Since we are only interested in having x, y, z with a correct ratio, we have:
452
- const Scalar
453
- a11 = m_S.coeff(f,f), a12 = m_S.coeff(f,f+1),
454
- a21 = m_S.coeff(f+1,f), a22 = m_S.coeff(f+1,f+1),
455
- a32 = m_S.coeff(f+2,f+1),
456
-
457
- a88 = m_S.coeff(l-1,l-1), a89 = m_S.coeff(l-1,l),
458
- a98 = m_S.coeff(l,l-1), a99 = m_S.coeff(l,l),
459
-
460
- b11 = m_T.coeff(f,f), b12 = m_T.coeff(f,f+1),
461
- b22 = m_T.coeff(f+1,f+1),
462
-
463
- b88 = m_T.coeff(l-1,l-1), b89 = m_T.coeff(l-1,l),
464
- b99 = m_T.coeff(l,l);
465
-
466
- x = ( (a88/b88 - a11/b11)*(a99/b99 - a11/b11) - (a89/b99)*(a98/b88) + (a98/b88)*(b89/b99)*(a11/b11) ) * (b11/a21)
467
- + a12/b22 - (a11/b11)*(b12/b22);
468
- y = (a22/b22-a11/b11) - (a21/b11)*(b12/b22) - (a88/b88-a11/b11) - (a99/b99-a11/b11) + (a98/b88)*(b89/b99);
469
- z = a32/b22;
470
- }
471
-
472
- JRs G;
473
-
474
- for (Index k=f; k<=l-2; k++)
475
- {
476
- // variables for Householder reflections
477
- Vector2s essential2;
478
- Scalar tau, beta;
479
-
480
- Vector3s hr(x,y,z);
481
-
482
- // Q_k to annihilate S(k+1,k-1) and S(k+2,k-1)
483
- hr.makeHouseholderInPlace(tau, beta);
484
- essential2 = hr.template bottomRows<2>();
485
- Index fc=(std::max)(k-1,Index(0)); // first col to update
486
- m_S.template middleRows<3>(k).rightCols(dim-fc).applyHouseholderOnTheLeft(essential2, tau, m_workspace.data());
487
- m_T.template middleRows<3>(k).rightCols(dim-fc).applyHouseholderOnTheLeft(essential2, tau, m_workspace.data());
488
- if (m_computeQZ)
489
- m_Q.template middleCols<3>(k).applyHouseholderOnTheRight(essential2, tau, m_workspace.data());
490
- if (k>f)
491
- m_S.coeffRef(k+2,k-1) = m_S.coeffRef(k+1,k-1) = Scalar(0.0);
492
-
493
- // Z_{k1} to annihilate T(k+2,k+1) and T(k+2,k)
494
- hr << m_T.coeff(k+2,k+2),m_T.coeff(k+2,k),m_T.coeff(k+2,k+1);
495
- hr.makeHouseholderInPlace(tau, beta);
496
- essential2 = hr.template bottomRows<2>();
497
- {
498
- Index lr = (std::min)(k+4,dim); // last row to update
499
- Map<Matrix<Scalar,Dynamic,1> > tmp(m_workspace.data(),lr);
500
- // S
501
- tmp = m_S.template middleCols<2>(k).topRows(lr) * essential2;
502
- tmp += m_S.col(k+2).head(lr);
503
- m_S.col(k+2).head(lr) -= tau*tmp;
504
- m_S.template middleCols<2>(k).topRows(lr) -= (tau*tmp) * essential2.adjoint();
505
- // T
506
- tmp = m_T.template middleCols<2>(k).topRows(lr) * essential2;
507
- tmp += m_T.col(k+2).head(lr);
508
- m_T.col(k+2).head(lr) -= tau*tmp;
509
- m_T.template middleCols<2>(k).topRows(lr) -= (tau*tmp) * essential2.adjoint();
510
- }
511
- if (m_computeQZ)
512
- {
513
- // Z
514
- Map<Matrix<Scalar,1,Dynamic> > tmp(m_workspace.data(),dim);
515
- tmp = essential2.adjoint()*(m_Z.template middleRows<2>(k));
516
- tmp += m_Z.row(k+2);
517
- m_Z.row(k+2) -= tau*tmp;
518
- m_Z.template middleRows<2>(k) -= essential2 * (tau*tmp);
519
- }
520
- m_T.coeffRef(k+2,k) = m_T.coeffRef(k+2,k+1) = Scalar(0.0);
521
-
522
- // Z_{k2} to annihilate T(k+1,k)
523
- G.makeGivens(m_T.coeff(k+1,k+1), m_T.coeff(k+1,k));
524
- m_S.applyOnTheRight(k+1,k,G);
525
- m_T.applyOnTheRight(k+1,k,G);
526
- // update Z
527
- if (m_computeQZ)
528
- m_Z.applyOnTheLeft(k+1,k,G.adjoint());
529
- m_T.coeffRef(k+1,k) = Scalar(0.0);
530
-
531
- // update x,y,z
532
- x = m_S.coeff(k+1,k);
533
- y = m_S.coeff(k+2,k);
534
- if (k < l-2)
535
- z = m_S.coeff(k+3,k);
536
- } // loop over k
537
-
538
- // Q_{n-1} to annihilate y = S(l,l-2)
539
- G.makeGivens(x,y);
540
- m_S.applyOnTheLeft(l-1,l,G.adjoint());
541
- m_T.applyOnTheLeft(l-1,l,G.adjoint());
542
- if (m_computeQZ)
543
- m_Q.applyOnTheRight(l-1,l,G);
544
- m_S.coeffRef(l,l-2) = Scalar(0.0);
545
-
546
- // Z_{n-1} to annihilate T(l,l-1)
547
- G.makeGivens(m_T.coeff(l,l),m_T.coeff(l,l-1));
548
- m_S.applyOnTheRight(l,l-1,G);
549
- m_T.applyOnTheRight(l,l-1,G);
550
- if (m_computeQZ)
551
- m_Z.applyOnTheLeft(l,l-1,G.adjoint());
552
- m_T.coeffRef(l,l-1) = Scalar(0.0);
553
- }
554
-
555
- template<typename MatrixType>
556
- RealQZ<MatrixType>& RealQZ<MatrixType>::compute(const MatrixType& A_in, const MatrixType& B_in, bool computeQZ)
528
+ l--;
529
+ local_iter = 0;
530
+ } else if (f == l - 1) // Two roots found
557
531
  {
558
-
559
- const Index dim = A_in.cols();
560
-
561
- eigen_assert (A_in.rows()==dim && A_in.cols()==dim
562
- && B_in.rows()==dim && B_in.cols()==dim
563
- && "Need square matrices of the same dimension");
564
-
565
- m_isInitialized = true;
566
- m_computeQZ = computeQZ;
567
- m_S = A_in; m_T = B_in;
568
- m_workspace.resize(dim*2);
569
- m_global_iter = 0;
570
-
571
- // entrance point: hessenberg triangular decomposition
572
- hessenbergTriangular();
573
- // compute L1 vector norms of T, S into m_normOfS, m_normOfT
574
- computeNorms();
575
-
576
- Index l = dim-1,
577
- f,
578
- local_iter = 0;
579
-
580
- while (l>0 && local_iter<m_maxIters)
581
- {
582
- f = findSmallSubdiagEntry(l);
583
- // now rows and columns f..l (including) decouple from the rest of the problem
584
- if (f>0) m_S.coeffRef(f,f-1) = Scalar(0.0);
585
- if (f == l) // One root found
586
- {
587
- l--;
588
- local_iter = 0;
589
- }
590
- else if (f == l-1) // Two roots found
591
- {
592
- splitOffTwoRows(f);
593
- l -= 2;
594
- local_iter = 0;
595
- }
596
- else // No convergence yet
597
- {
598
- // if there's zero on diagonal of T, we can isolate an eigenvalue with Givens rotations
599
- Index z = findSmallDiagEntry(f,l);
600
- if (z>=f)
601
- {
602
- // zero found
603
- pushDownZero(z,f,l);
604
- }
605
- else
606
- {
607
- // We are sure now that S.block(f,f, l-f+1,l-f+1) is underuced upper-Hessenberg
608
- // and T.block(f,f, l-f+1,l-f+1) is invertible uper-triangular, which allows to
609
- // apply a QR-like iteration to rows and columns f..l.
610
- step(f,l, local_iter);
611
- local_iter++;
612
- m_global_iter++;
613
- }
614
- }
532
+ splitOffTwoRows(f);
533
+ l -= 2;
534
+ local_iter = 0;
535
+ } else // No convergence yet
536
+ {
537
+ // if there's zero on diagonal of T, we can isolate an eigenvalue with Givens rotations
538
+ Index z = findSmallDiagEntry(f, l);
539
+ if (z >= f) {
540
+ // zero found
541
+ pushDownZero(z, f, l);
542
+ } else {
543
+ // We are sure now that S.block(f,f, l-f+1,l-f+1) is underuced upper-Hessenberg
544
+ // and T.block(f,f, l-f+1,l-f+1) is invertible uper-triangular, which allows to
545
+ // apply a QR-like iteration to rows and columns f..l.
546
+ step(f, l, local_iter);
547
+ local_iter++;
548
+ m_global_iter++;
615
549
  }
616
- // check if we converged before reaching iterations limit
617
- m_info = (local_iter<m_maxIters) ? Success : NoConvergence;
618
-
619
- // For each non triangular 2x2 diagonal block of S,
620
- // reduce the respective 2x2 diagonal block of T to positive diagonal form using 2x2 SVD.
621
- // This step is not mandatory for QZ, but it does help further extraction of eigenvalues/eigenvectors,
622
- // and is in par with Lapack/Matlab QZ.
623
- if(m_info==Success)
624
- {
625
- for(Index i=0; i<dim-1; ++i)
626
- {
627
- if(m_S.coeff(i+1, i) != Scalar(0))
628
- {
629
- JacobiRotation<Scalar> j_left, j_right;
630
- internal::real_2x2_jacobi_svd(m_T, i, i+1, &j_left, &j_right);
631
-
632
- // Apply resulting Jacobi rotations
633
- m_S.applyOnTheLeft(i,i+1,j_left);
634
- m_S.applyOnTheRight(i,i+1,j_right);
635
- m_T.applyOnTheLeft(i,i+1,j_left);
636
- m_T.applyOnTheRight(i,i+1,j_right);
637
- m_T(i+1,i) = m_T(i,i+1) = Scalar(0);
638
-
639
- if(m_computeQZ) {
640
- m_Q.applyOnTheRight(i,i+1,j_left.transpose());
641
- m_Z.applyOnTheLeft(i,i+1,j_right.transpose());
642
- }
643
-
644
- i++;
645
- }
550
+ }
551
+ }
552
+ // check if we converged before reaching iterations limit
553
+ m_info = (local_iter < m_maxIters) ? Success : NoConvergence;
554
+
555
+ // For each non triangular 2x2 diagonal block of S,
556
+ // reduce the respective 2x2 diagonal block of T to positive diagonal form using 2x2 SVD.
557
+ // This step is not mandatory for QZ, but it does help further extraction of eigenvalues/eigenvectors,
558
+ // and is in par with Lapack/Matlab QZ.
559
+ if (m_info == Success) {
560
+ for (Index i = 0; i < dim - 1; ++i) {
561
+ if (!numext::is_exactly_zero(m_S.coeff(i + 1, i))) {
562
+ JacobiRotation<Scalar> j_left, j_right;
563
+ internal::real_2x2_jacobi_svd(m_T, i, i + 1, &j_left, &j_right);
564
+
565
+ // Apply resulting Jacobi rotations
566
+ m_S.applyOnTheLeft(i, i + 1, j_left);
567
+ m_S.applyOnTheRight(i, i + 1, j_right);
568
+ m_T.applyOnTheLeft(i, i + 1, j_left);
569
+ m_T.applyOnTheRight(i, i + 1, j_right);
570
+ m_T(i + 1, i) = m_T(i, i + 1) = Scalar(0);
571
+
572
+ if (m_computeQZ) {
573
+ m_Q.applyOnTheRight(i, i + 1, j_left.transpose());
574
+ m_Z.applyOnTheLeft(i, i + 1, j_right.transpose());
646
575
  }
576
+
577
+ i++;
647
578
  }
579
+ }
580
+ }
648
581
 
649
- return *this;
650
- } // end compute
582
+ return *this;
583
+ } // end compute
651
584
 
652
- } // end namespace Eigen
585
+ } // end namespace Eigen
653
586
 
654
- #endif //EIGEN_REAL_QZ
587
+ #endif // EIGEN_REAL_QZ