@smake/eigen 1.1.0 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (431) hide show
  1. package/README.md +1 -1
  2. package/eigen/Eigen/AccelerateSupport +52 -0
  3. package/eigen/Eigen/Cholesky +18 -20
  4. package/eigen/Eigen/CholmodSupport +28 -28
  5. package/eigen/Eigen/Core +187 -120
  6. package/eigen/Eigen/Eigenvalues +16 -13
  7. package/eigen/Eigen/Geometry +18 -18
  8. package/eigen/Eigen/Householder +9 -7
  9. package/eigen/Eigen/IterativeLinearSolvers +8 -4
  10. package/eigen/Eigen/Jacobi +14 -13
  11. package/eigen/Eigen/KLUSupport +23 -21
  12. package/eigen/Eigen/LU +15 -16
  13. package/eigen/Eigen/MetisSupport +12 -12
  14. package/eigen/Eigen/OrderingMethods +54 -51
  15. package/eigen/Eigen/PaStiXSupport +23 -21
  16. package/eigen/Eigen/PardisoSupport +17 -14
  17. package/eigen/Eigen/QR +18 -20
  18. package/eigen/Eigen/QtAlignedMalloc +5 -12
  19. package/eigen/Eigen/SPQRSupport +21 -14
  20. package/eigen/Eigen/SVD +23 -17
  21. package/eigen/Eigen/Sparse +1 -2
  22. package/eigen/Eigen/SparseCholesky +18 -15
  23. package/eigen/Eigen/SparseCore +18 -17
  24. package/eigen/Eigen/SparseLU +9 -9
  25. package/eigen/Eigen/SparseQR +16 -14
  26. package/eigen/Eigen/StdDeque +5 -2
  27. package/eigen/Eigen/StdList +5 -2
  28. package/eigen/Eigen/StdVector +5 -2
  29. package/eigen/Eigen/SuperLUSupport +30 -24
  30. package/eigen/Eigen/ThreadPool +80 -0
  31. package/eigen/Eigen/UmfPackSupport +19 -17
  32. package/eigen/Eigen/Version +14 -0
  33. package/eigen/Eigen/src/AccelerateSupport/AccelerateSupport.h +423 -0
  34. package/eigen/Eigen/src/AccelerateSupport/InternalHeaderCheck.h +3 -0
  35. package/eigen/Eigen/src/Cholesky/InternalHeaderCheck.h +3 -0
  36. package/eigen/Eigen/src/Cholesky/LDLT.h +366 -405
  37. package/eigen/Eigen/src/Cholesky/LLT.h +323 -367
  38. package/eigen/Eigen/src/Cholesky/LLT_LAPACKE.h +81 -56
  39. package/eigen/Eigen/src/CholmodSupport/CholmodSupport.h +585 -529
  40. package/eigen/Eigen/src/CholmodSupport/InternalHeaderCheck.h +3 -0
  41. package/eigen/Eigen/src/Core/ArithmeticSequence.h +143 -317
  42. package/eigen/Eigen/src/Core/Array.h +329 -370
  43. package/eigen/Eigen/src/Core/ArrayBase.h +190 -203
  44. package/eigen/Eigen/src/Core/ArrayWrapper.h +126 -170
  45. package/eigen/Eigen/src/Core/Assign.h +30 -40
  46. package/eigen/Eigen/src/Core/AssignEvaluator.h +651 -604
  47. package/eigen/Eigen/src/Core/Assign_MKL.h +125 -120
  48. package/eigen/Eigen/src/Core/BandMatrix.h +267 -282
  49. package/eigen/Eigen/src/Core/Block.h +371 -390
  50. package/eigen/Eigen/src/Core/CommaInitializer.h +85 -100
  51. package/eigen/Eigen/src/Core/ConditionEstimator.h +51 -53
  52. package/eigen/Eigen/src/Core/CoreEvaluators.h +1214 -937
  53. package/eigen/Eigen/src/Core/CoreIterators.h +72 -63
  54. package/eigen/Eigen/src/Core/CwiseBinaryOp.h +112 -129
  55. package/eigen/Eigen/src/Core/CwiseNullaryOp.h +676 -702
  56. package/eigen/Eigen/src/Core/CwiseTernaryOp.h +77 -103
  57. package/eigen/Eigen/src/Core/CwiseUnaryOp.h +55 -67
  58. package/eigen/Eigen/src/Core/CwiseUnaryView.h +127 -92
  59. package/eigen/Eigen/src/Core/DenseBase.h +630 -658
  60. package/eigen/Eigen/src/Core/DenseCoeffsBase.h +511 -628
  61. package/eigen/Eigen/src/Core/DenseStorage.h +511 -590
  62. package/eigen/Eigen/src/Core/DeviceWrapper.h +153 -0
  63. package/eigen/Eigen/src/Core/Diagonal.h +168 -207
  64. package/eigen/Eigen/src/Core/DiagonalMatrix.h +346 -317
  65. package/eigen/Eigen/src/Core/DiagonalProduct.h +12 -10
  66. package/eigen/Eigen/src/Core/Dot.h +167 -217
  67. package/eigen/Eigen/src/Core/EigenBase.h +74 -85
  68. package/eigen/Eigen/src/Core/Fill.h +138 -0
  69. package/eigen/Eigen/src/Core/FindCoeff.h +464 -0
  70. package/eigen/Eigen/src/Core/ForceAlignedAccess.h +90 -113
  71. package/eigen/Eigen/src/Core/Fuzzy.h +82 -105
  72. package/eigen/Eigen/src/Core/GeneralProduct.h +315 -261
  73. package/eigen/Eigen/src/Core/GenericPacketMath.h +1182 -520
  74. package/eigen/Eigen/src/Core/GlobalFunctions.h +193 -157
  75. package/eigen/Eigen/src/Core/IO.h +131 -156
  76. package/eigen/Eigen/src/Core/IndexedView.h +209 -125
  77. package/eigen/Eigen/src/Core/InnerProduct.h +260 -0
  78. package/eigen/Eigen/src/Core/InternalHeaderCheck.h +3 -0
  79. package/eigen/Eigen/src/Core/Inverse.h +50 -59
  80. package/eigen/Eigen/src/Core/Map.h +123 -141
  81. package/eigen/Eigen/src/Core/MapBase.h +255 -282
  82. package/eigen/Eigen/src/Core/MathFunctions.h +1247 -1201
  83. package/eigen/Eigen/src/Core/MathFunctionsImpl.h +162 -99
  84. package/eigen/Eigen/src/Core/Matrix.h +463 -494
  85. package/eigen/Eigen/src/Core/MatrixBase.h +468 -470
  86. package/eigen/Eigen/src/Core/NestByValue.h +58 -52
  87. package/eigen/Eigen/src/Core/NoAlias.h +79 -86
  88. package/eigen/Eigen/src/Core/NumTraits.h +206 -206
  89. package/eigen/Eigen/src/Core/PartialReduxEvaluator.h +163 -142
  90. package/eigen/Eigen/src/Core/PermutationMatrix.h +461 -511
  91. package/eigen/Eigen/src/Core/PlainObjectBase.h +858 -972
  92. package/eigen/Eigen/src/Core/Product.h +246 -130
  93. package/eigen/Eigen/src/Core/ProductEvaluators.h +779 -671
  94. package/eigen/Eigen/src/Core/Random.h +153 -164
  95. package/eigen/Eigen/src/Core/RandomImpl.h +262 -0
  96. package/eigen/Eigen/src/Core/RealView.h +250 -0
  97. package/eigen/Eigen/src/Core/Redux.h +334 -314
  98. package/eigen/Eigen/src/Core/Ref.h +259 -257
  99. package/eigen/Eigen/src/Core/Replicate.h +92 -104
  100. package/eigen/Eigen/src/Core/Reshaped.h +215 -271
  101. package/eigen/Eigen/src/Core/ReturnByValue.h +47 -55
  102. package/eigen/Eigen/src/Core/Reverse.h +133 -148
  103. package/eigen/Eigen/src/Core/Select.h +68 -140
  104. package/eigen/Eigen/src/Core/SelfAdjointView.h +254 -290
  105. package/eigen/Eigen/src/Core/SelfCwiseBinaryOp.h +23 -20
  106. package/eigen/Eigen/src/Core/SkewSymmetricMatrix3.h +382 -0
  107. package/eigen/Eigen/src/Core/Solve.h +88 -102
  108. package/eigen/Eigen/src/Core/SolveTriangular.h +126 -124
  109. package/eigen/Eigen/src/Core/SolverBase.h +132 -133
  110. package/eigen/Eigen/src/Core/StableNorm.h +113 -147
  111. package/eigen/Eigen/src/Core/StlIterators.h +404 -248
  112. package/eigen/Eigen/src/Core/Stride.h +90 -92
  113. package/eigen/Eigen/src/Core/Swap.h +70 -39
  114. package/eigen/Eigen/src/Core/Transpose.h +258 -295
  115. package/eigen/Eigen/src/Core/Transpositions.h +270 -333
  116. package/eigen/Eigen/src/Core/TriangularMatrix.h +642 -743
  117. package/eigen/Eigen/src/Core/VectorBlock.h +59 -72
  118. package/eigen/Eigen/src/Core/VectorwiseOp.h +653 -704
  119. package/eigen/Eigen/src/Core/Visitor.h +464 -308
  120. package/eigen/Eigen/src/Core/arch/AVX/Complex.h +380 -187
  121. package/eigen/Eigen/src/Core/arch/AVX/MathFunctions.h +65 -163
  122. package/eigen/Eigen/src/Core/arch/AVX/PacketMath.h +2145 -638
  123. package/eigen/Eigen/src/Core/arch/AVX/Reductions.h +353 -0
  124. package/eigen/Eigen/src/Core/arch/AVX/TypeCasting.h +253 -60
  125. package/eigen/Eigen/src/Core/arch/AVX512/Complex.h +278 -228
  126. package/eigen/Eigen/src/Core/arch/AVX512/GemmKernel.h +1245 -0
  127. package/eigen/Eigen/src/Core/arch/AVX512/MathFunctions.h +48 -269
  128. package/eigen/Eigen/src/Core/arch/AVX512/MathFunctionsFP16.h +75 -0
  129. package/eigen/Eigen/src/Core/arch/AVX512/PacketMath.h +1597 -754
  130. package/eigen/Eigen/src/Core/arch/AVX512/PacketMathFP16.h +1413 -0
  131. package/eigen/Eigen/src/Core/arch/AVX512/Reductions.h +297 -0
  132. package/eigen/Eigen/src/Core/arch/AVX512/TrsmKernel.h +1167 -0
  133. package/eigen/Eigen/src/Core/arch/AVX512/TrsmUnrolls.inc +1219 -0
  134. package/eigen/Eigen/src/Core/arch/AVX512/TypeCasting.h +229 -41
  135. package/eigen/Eigen/src/Core/arch/AVX512/TypeCastingFP16.h +130 -0
  136. package/eigen/Eigen/src/Core/arch/AltiVec/Complex.h +420 -184
  137. package/eigen/Eigen/src/Core/arch/AltiVec/MathFunctions.h +40 -49
  138. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProduct.h +2962 -2213
  139. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h +196 -212
  140. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductMMA.h +713 -441
  141. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductMMAbfloat16.h +742 -0
  142. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixVectorProduct.inc +2818 -0
  143. package/eigen/Eigen/src/Core/arch/AltiVec/PacketMath.h +2380 -1362
  144. package/eigen/Eigen/src/Core/arch/AltiVec/TypeCasting.h +153 -0
  145. package/eigen/Eigen/src/Core/arch/Default/BFloat16.h +390 -224
  146. package/eigen/Eigen/src/Core/arch/Default/ConjHelper.h +78 -67
  147. package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h +1784 -799
  148. package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h +167 -50
  149. package/eigen/Eigen/src/Core/arch/Default/Half.h +528 -379
  150. package/eigen/Eigen/src/Core/arch/Default/Settings.h +10 -12
  151. package/eigen/Eigen/src/Core/arch/GPU/Complex.h +244 -0
  152. package/eigen/Eigen/src/Core/arch/GPU/MathFunctions.h +41 -40
  153. package/eigen/Eigen/src/Core/arch/GPU/PacketMath.h +550 -523
  154. package/eigen/Eigen/src/Core/arch/GPU/Tuple.h +268 -0
  155. package/eigen/Eigen/src/Core/arch/GPU/TypeCasting.h +27 -30
  156. package/eigen/Eigen/src/Core/arch/HIP/hcc/math_constants.h +8 -8
  157. package/eigen/Eigen/src/Core/arch/HVX/PacketMath.h +1088 -0
  158. package/eigen/Eigen/src/Core/arch/LSX/Complex.h +520 -0
  159. package/eigen/Eigen/src/Core/arch/LSX/GeneralBlockPanelKernel.h +23 -0
  160. package/eigen/Eigen/src/Core/arch/LSX/MathFunctions.h +43 -0
  161. package/eigen/Eigen/src/Core/arch/LSX/PacketMath.h +2866 -0
  162. package/eigen/Eigen/src/Core/arch/LSX/TypeCasting.h +526 -0
  163. package/eigen/Eigen/src/Core/arch/MSA/Complex.h +54 -82
  164. package/eigen/Eigen/src/Core/arch/MSA/MathFunctions.h +84 -92
  165. package/eigen/Eigen/src/Core/arch/MSA/PacketMath.h +51 -47
  166. package/eigen/Eigen/src/Core/arch/NEON/Complex.h +454 -306
  167. package/eigen/Eigen/src/Core/arch/NEON/GeneralBlockPanelKernel.h +175 -115
  168. package/eigen/Eigen/src/Core/arch/NEON/MathFunctions.h +23 -30
  169. package/eigen/Eigen/src/Core/arch/NEON/PacketMath.h +4366 -2857
  170. package/eigen/Eigen/src/Core/arch/NEON/TypeCasting.h +616 -393
  171. package/eigen/Eigen/src/Core/arch/NEON/UnaryFunctors.h +57 -0
  172. package/eigen/Eigen/src/Core/arch/SSE/Complex.h +350 -198
  173. package/eigen/Eigen/src/Core/arch/SSE/MathFunctions.h +38 -149
  174. package/eigen/Eigen/src/Core/arch/SSE/PacketMath.h +1791 -912
  175. package/eigen/Eigen/src/Core/arch/SSE/Reductions.h +324 -0
  176. package/eigen/Eigen/src/Core/arch/SSE/TypeCasting.h +128 -40
  177. package/eigen/Eigen/src/Core/arch/SVE/MathFunctions.h +10 -6
  178. package/eigen/Eigen/src/Core/arch/SVE/PacketMath.h +156 -234
  179. package/eigen/Eigen/src/Core/arch/SVE/TypeCasting.h +6 -3
  180. package/eigen/Eigen/src/Core/arch/SYCL/InteropHeaders.h +27 -32
  181. package/eigen/Eigen/src/Core/arch/SYCL/MathFunctions.h +119 -117
  182. package/eigen/Eigen/src/Core/arch/SYCL/PacketMath.h +325 -419
  183. package/eigen/Eigen/src/Core/arch/SYCL/TypeCasting.h +15 -17
  184. package/eigen/Eigen/src/Core/arch/ZVector/Complex.h +325 -181
  185. package/eigen/Eigen/src/Core/arch/ZVector/MathFunctions.h +94 -83
  186. package/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h +811 -458
  187. package/eigen/Eigen/src/Core/functors/AssignmentFunctors.h +121 -124
  188. package/eigen/Eigen/src/Core/functors/BinaryFunctors.h +576 -370
  189. package/eigen/Eigen/src/Core/functors/NullaryFunctors.h +194 -109
  190. package/eigen/Eigen/src/Core/functors/StlFunctors.h +95 -112
  191. package/eigen/Eigen/src/Core/functors/TernaryFunctors.h +34 -7
  192. package/eigen/Eigen/src/Core/functors/UnaryFunctors.h +1038 -749
  193. package/eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h +1883 -1375
  194. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix.h +312 -370
  195. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +189 -176
  196. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h +84 -81
  197. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix_BLAS.h +154 -73
  198. package/eigen/Eigen/src/Core/products/GeneralMatrixVector.h +292 -337
  199. package/eigen/Eigen/src/Core/products/GeneralMatrixVector_BLAS.h +80 -77
  200. package/eigen/Eigen/src/Core/products/Parallelizer.h +207 -105
  201. package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +327 -388
  202. package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix_BLAS.h +206 -224
  203. package/eigen/Eigen/src/Core/products/SelfadjointMatrixVector.h +138 -147
  204. package/eigen/Eigen/src/Core/products/SelfadjointMatrixVector_BLAS.h +58 -61
  205. package/eigen/Eigen/src/Core/products/SelfadjointProduct.h +71 -71
  206. package/eigen/Eigen/src/Core/products/SelfadjointRank2Update.h +48 -47
  207. package/eigen/Eigen/src/Core/products/TriangularMatrixMatrix.h +294 -369
  208. package/eigen/Eigen/src/Core/products/TriangularMatrixMatrix_BLAS.h +246 -238
  209. package/eigen/Eigen/src/Core/products/TriangularMatrixVector.h +244 -247
  210. package/eigen/Eigen/src/Core/products/TriangularMatrixVector_BLAS.h +212 -192
  211. package/eigen/Eigen/src/Core/products/TriangularSolverMatrix.h +328 -277
  212. package/eigen/Eigen/src/Core/products/TriangularSolverMatrix_BLAS.h +108 -109
  213. package/eigen/Eigen/src/Core/products/TriangularSolverVector.h +68 -94
  214. package/eigen/Eigen/src/Core/util/Assert.h +158 -0
  215. package/eigen/Eigen/src/Core/util/BlasUtil.h +342 -303
  216. package/eigen/Eigen/src/Core/util/ConfigureVectorization.h +348 -317
  217. package/eigen/Eigen/src/Core/util/Constants.h +297 -262
  218. package/eigen/Eigen/src/Core/util/DisableStupidWarnings.h +130 -90
  219. package/eigen/Eigen/src/Core/util/EmulateArray.h +270 -0
  220. package/eigen/Eigen/src/Core/util/ForwardDeclarations.h +449 -247
  221. package/eigen/Eigen/src/Core/util/GpuHipCudaDefines.inc +101 -0
  222. package/eigen/Eigen/src/Core/util/GpuHipCudaUndefines.inc +45 -0
  223. package/eigen/Eigen/src/Core/util/IndexedViewHelper.h +417 -116
  224. package/eigen/Eigen/src/Core/util/IntegralConstant.h +211 -204
  225. package/eigen/Eigen/src/Core/util/MKL_support.h +39 -37
  226. package/eigen/Eigen/src/Core/util/Macros.h +655 -773
  227. package/eigen/Eigen/src/Core/util/MaxSizeVector.h +139 -0
  228. package/eigen/Eigen/src/Core/util/Memory.h +970 -748
  229. package/eigen/Eigen/src/Core/util/Meta.h +581 -633
  230. package/eigen/Eigen/src/Core/util/MoreMeta.h +638 -0
  231. package/eigen/Eigen/src/Core/util/ReenableStupidWarnings.h +32 -19
  232. package/eigen/Eigen/src/Core/util/ReshapedHelper.h +17 -17
  233. package/eigen/Eigen/src/Core/util/Serializer.h +209 -0
  234. package/eigen/Eigen/src/Core/util/StaticAssert.h +50 -166
  235. package/eigen/Eigen/src/Core/util/SymbolicIndex.h +377 -225
  236. package/eigen/Eigen/src/Core/util/XprHelper.h +784 -547
  237. package/eigen/Eigen/src/Eigenvalues/ComplexEigenSolver.h +246 -277
  238. package/eigen/Eigen/src/Eigenvalues/ComplexSchur.h +299 -319
  239. package/eigen/Eigen/src/Eigenvalues/ComplexSchur_LAPACKE.h +52 -48
  240. package/eigen/Eigen/src/Eigenvalues/EigenSolver.h +413 -456
  241. package/eigen/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h +309 -325
  242. package/eigen/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h +157 -171
  243. package/eigen/Eigen/src/Eigenvalues/HessenbergDecomposition.h +292 -310
  244. package/eigen/Eigen/src/Eigenvalues/InternalHeaderCheck.h +3 -0
  245. package/eigen/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h +89 -105
  246. package/eigen/Eigen/src/Eigenvalues/RealQZ.h +537 -607
  247. package/eigen/Eigen/src/Eigenvalues/RealSchur.h +342 -381
  248. package/eigen/Eigen/src/Eigenvalues/RealSchur_LAPACKE.h +41 -35
  249. package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +541 -595
  250. package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_LAPACKE.h +47 -44
  251. package/eigen/Eigen/src/Eigenvalues/Tridiagonalization.h +430 -462
  252. package/eigen/Eigen/src/Geometry/AlignedBox.h +226 -227
  253. package/eigen/Eigen/src/Geometry/AngleAxis.h +131 -133
  254. package/eigen/Eigen/src/Geometry/EulerAngles.h +163 -74
  255. package/eigen/Eigen/src/Geometry/Homogeneous.h +285 -333
  256. package/eigen/Eigen/src/Geometry/Hyperplane.h +151 -160
  257. package/eigen/Eigen/src/Geometry/InternalHeaderCheck.h +3 -0
  258. package/eigen/Eigen/src/Geometry/OrthoMethods.h +168 -146
  259. package/eigen/Eigen/src/Geometry/ParametrizedLine.h +127 -127
  260. package/eigen/Eigen/src/Geometry/Quaternion.h +566 -506
  261. package/eigen/Eigen/src/Geometry/Rotation2D.h +107 -105
  262. package/eigen/Eigen/src/Geometry/RotationBase.h +148 -145
  263. package/eigen/Eigen/src/Geometry/Scaling.h +113 -106
  264. package/eigen/Eigen/src/Geometry/Transform.h +858 -936
  265. package/eigen/Eigen/src/Geometry/Translation.h +94 -92
  266. package/eigen/Eigen/src/Geometry/Umeyama.h +79 -84
  267. package/eigen/Eigen/src/Geometry/arch/Geometry_SIMD.h +90 -104
  268. package/eigen/Eigen/src/Householder/BlockHouseholder.h +51 -46
  269. package/eigen/Eigen/src/Householder/Householder.h +102 -124
  270. package/eigen/Eigen/src/Householder/HouseholderSequence.h +412 -453
  271. package/eigen/Eigen/src/Householder/InternalHeaderCheck.h +3 -0
  272. package/eigen/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +149 -162
  273. package/eigen/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +124 -119
  274. package/eigen/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +92 -104
  275. package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h +251 -243
  276. package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h +224 -228
  277. package/eigen/Eigen/src/IterativeLinearSolvers/InternalHeaderCheck.h +3 -0
  278. package/eigen/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +178 -227
  279. package/eigen/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h +79 -84
  280. package/eigen/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h +54 -60
  281. package/eigen/Eigen/src/Jacobi/InternalHeaderCheck.h +3 -0
  282. package/eigen/Eigen/src/Jacobi/Jacobi.h +252 -308
  283. package/eigen/Eigen/src/KLUSupport/InternalHeaderCheck.h +3 -0
  284. package/eigen/Eigen/src/KLUSupport/KLUSupport.h +208 -227
  285. package/eigen/Eigen/src/LU/Determinant.h +50 -69
  286. package/eigen/Eigen/src/LU/FullPivLU.h +545 -596
  287. package/eigen/Eigen/src/LU/InternalHeaderCheck.h +3 -0
  288. package/eigen/Eigen/src/LU/InverseImpl.h +206 -285
  289. package/eigen/Eigen/src/LU/PartialPivLU.h +390 -428
  290. package/eigen/Eigen/src/LU/PartialPivLU_LAPACKE.h +54 -40
  291. package/eigen/Eigen/src/LU/arch/InverseSize4.h +72 -70
  292. package/eigen/Eigen/src/MetisSupport/InternalHeaderCheck.h +3 -0
  293. package/eigen/Eigen/src/MetisSupport/MetisSupport.h +81 -93
  294. package/eigen/Eigen/src/OrderingMethods/Amd.h +243 -265
  295. package/eigen/Eigen/src/OrderingMethods/Eigen_Colamd.h +831 -1004
  296. package/eigen/Eigen/src/OrderingMethods/InternalHeaderCheck.h +3 -0
  297. package/eigen/Eigen/src/OrderingMethods/Ordering.h +112 -119
  298. package/eigen/Eigen/src/PaStiXSupport/InternalHeaderCheck.h +3 -0
  299. package/eigen/Eigen/src/PaStiXSupport/PaStiXSupport.h +524 -570
  300. package/eigen/Eigen/src/PardisoSupport/InternalHeaderCheck.h +3 -0
  301. package/eigen/Eigen/src/PardisoSupport/PardisoSupport.h +385 -430
  302. package/eigen/Eigen/src/QR/ColPivHouseholderQR.h +479 -479
  303. package/eigen/Eigen/src/QR/ColPivHouseholderQR_LAPACKE.h +120 -56
  304. package/eigen/Eigen/src/QR/CompleteOrthogonalDecomposition.h +166 -153
  305. package/eigen/Eigen/src/QR/FullPivHouseholderQR.h +495 -475
  306. package/eigen/Eigen/src/QR/HouseholderQR.h +394 -285
  307. package/eigen/Eigen/src/QR/HouseholderQR_LAPACKE.h +32 -23
  308. package/eigen/Eigen/src/QR/InternalHeaderCheck.h +3 -0
  309. package/eigen/Eigen/src/SPQRSupport/InternalHeaderCheck.h +3 -0
  310. package/eigen/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h +244 -264
  311. package/eigen/Eigen/src/SVD/BDCSVD.h +817 -713
  312. package/eigen/Eigen/src/SVD/BDCSVD_LAPACKE.h +174 -0
  313. package/eigen/Eigen/src/SVD/InternalHeaderCheck.h +3 -0
  314. package/eigen/Eigen/src/SVD/JacobiSVD.h +577 -543
  315. package/eigen/Eigen/src/SVD/JacobiSVD_LAPACKE.h +85 -49
  316. package/eigen/Eigen/src/SVD/SVDBase.h +242 -182
  317. package/eigen/Eigen/src/SVD/UpperBidiagonalization.h +200 -235
  318. package/eigen/Eigen/src/SparseCholesky/InternalHeaderCheck.h +3 -0
  319. package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky.h +765 -594
  320. package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h +308 -94
  321. package/eigen/Eigen/src/SparseCore/AmbiVector.h +202 -251
  322. package/eigen/Eigen/src/SparseCore/CompressedStorage.h +184 -252
  323. package/eigen/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h +134 -178
  324. package/eigen/Eigen/src/SparseCore/InternalHeaderCheck.h +3 -0
  325. package/eigen/Eigen/src/SparseCore/SparseAssign.h +149 -140
  326. package/eigen/Eigen/src/SparseCore/SparseBlock.h +403 -440
  327. package/eigen/Eigen/src/SparseCore/SparseColEtree.h +100 -112
  328. package/eigen/Eigen/src/SparseCore/SparseCompressedBase.h +525 -303
  329. package/eigen/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +555 -339
  330. package/eigen/Eigen/src/SparseCore/SparseCwiseUnaryOp.h +100 -108
  331. package/eigen/Eigen/src/SparseCore/SparseDenseProduct.h +169 -197
  332. package/eigen/Eigen/src/SparseCore/SparseDiagonalProduct.h +71 -71
  333. package/eigen/Eigen/src/SparseCore/SparseDot.h +49 -47
  334. package/eigen/Eigen/src/SparseCore/SparseFuzzy.h +13 -11
  335. package/eigen/Eigen/src/SparseCore/SparseMap.h +243 -253
  336. package/eigen/Eigen/src/SparseCore/SparseMatrix.h +1603 -1245
  337. package/eigen/Eigen/src/SparseCore/SparseMatrixBase.h +403 -350
  338. package/eigen/Eigen/src/SparseCore/SparsePermutation.h +186 -115
  339. package/eigen/Eigen/src/SparseCore/SparseProduct.h +94 -97
  340. package/eigen/Eigen/src/SparseCore/SparseRedux.h +22 -24
  341. package/eigen/Eigen/src/SparseCore/SparseRef.h +268 -295
  342. package/eigen/Eigen/src/SparseCore/SparseSelfAdjointView.h +370 -416
  343. package/eigen/Eigen/src/SparseCore/SparseSolverBase.h +78 -87
  344. package/eigen/Eigen/src/SparseCore/SparseSparseProductWithPruning.h +81 -95
  345. package/eigen/Eigen/src/SparseCore/SparseTranspose.h +62 -71
  346. package/eigen/Eigen/src/SparseCore/SparseTriangularView.h +132 -144
  347. package/eigen/Eigen/src/SparseCore/SparseUtil.h +138 -115
  348. package/eigen/Eigen/src/SparseCore/SparseVector.h +426 -372
  349. package/eigen/Eigen/src/SparseCore/SparseView.h +164 -193
  350. package/eigen/Eigen/src/SparseCore/TriangularSolver.h +129 -170
  351. package/eigen/Eigen/src/SparseLU/InternalHeaderCheck.h +3 -0
  352. package/eigen/Eigen/src/SparseLU/SparseLU.h +756 -710
  353. package/eigen/Eigen/src/SparseLU/SparseLUImpl.h +61 -48
  354. package/eigen/Eigen/src/SparseLU/SparseLU_Memory.h +102 -118
  355. package/eigen/Eigen/src/SparseLU/SparseLU_Structs.h +38 -35
  356. package/eigen/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h +245 -301
  357. package/eigen/Eigen/src/SparseLU/SparseLU_Utils.h +44 -49
  358. package/eigen/Eigen/src/SparseLU/SparseLU_column_bmod.h +104 -108
  359. package/eigen/Eigen/src/SparseLU/SparseLU_column_dfs.h +89 -100
  360. package/eigen/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h +57 -58
  361. package/eigen/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h +43 -55
  362. package/eigen/Eigen/src/SparseLU/SparseLU_kernel_bmod.h +74 -71
  363. package/eigen/Eigen/src/SparseLU/SparseLU_panel_bmod.h +124 -132
  364. package/eigen/Eigen/src/SparseLU/SparseLU_panel_dfs.h +136 -159
  365. package/eigen/Eigen/src/SparseLU/SparseLU_pivotL.h +51 -52
  366. package/eigen/Eigen/src/SparseLU/SparseLU_pruneL.h +67 -73
  367. package/eigen/Eigen/src/SparseLU/SparseLU_relax_snode.h +24 -26
  368. package/eigen/Eigen/src/SparseQR/InternalHeaderCheck.h +3 -0
  369. package/eigen/Eigen/src/SparseQR/SparseQR.h +450 -502
  370. package/eigen/Eigen/src/StlSupport/StdDeque.h +28 -93
  371. package/eigen/Eigen/src/StlSupport/StdList.h +28 -84
  372. package/eigen/Eigen/src/StlSupport/StdVector.h +28 -108
  373. package/eigen/Eigen/src/StlSupport/details.h +48 -50
  374. package/eigen/Eigen/src/SuperLUSupport/InternalHeaderCheck.h +3 -0
  375. package/eigen/Eigen/src/SuperLUSupport/SuperLUSupport.h +634 -730
  376. package/eigen/Eigen/src/ThreadPool/Barrier.h +70 -0
  377. package/eigen/Eigen/src/ThreadPool/CoreThreadPoolDevice.h +336 -0
  378. package/eigen/Eigen/src/ThreadPool/EventCount.h +241 -0
  379. package/eigen/Eigen/src/ThreadPool/ForkJoin.h +140 -0
  380. package/eigen/Eigen/src/ThreadPool/InternalHeaderCheck.h +4 -0
  381. package/eigen/Eigen/src/ThreadPool/NonBlockingThreadPool.h +587 -0
  382. package/eigen/Eigen/src/ThreadPool/RunQueue.h +230 -0
  383. package/eigen/Eigen/src/ThreadPool/ThreadCancel.h +21 -0
  384. package/eigen/Eigen/src/ThreadPool/ThreadEnvironment.h +43 -0
  385. package/eigen/Eigen/src/ThreadPool/ThreadLocal.h +289 -0
  386. package/eigen/Eigen/src/ThreadPool/ThreadPoolInterface.h +50 -0
  387. package/eigen/Eigen/src/ThreadPool/ThreadYield.h +16 -0
  388. package/eigen/Eigen/src/UmfPackSupport/InternalHeaderCheck.h +3 -0
  389. package/eigen/Eigen/src/UmfPackSupport/UmfPackSupport.h +428 -464
  390. package/eigen/Eigen/src/misc/Image.h +41 -43
  391. package/eigen/Eigen/src/misc/InternalHeaderCheck.h +3 -0
  392. package/eigen/Eigen/src/misc/Kernel.h +39 -41
  393. package/eigen/Eigen/src/misc/RealSvd2x2.h +19 -21
  394. package/eigen/Eigen/src/misc/blas.h +83 -426
  395. package/eigen/Eigen/src/misc/lapacke.h +9972 -16179
  396. package/eigen/Eigen/src/misc/lapacke_helpers.h +163 -0
  397. package/eigen/Eigen/src/misc/lapacke_mangling.h +4 -5
  398. package/eigen/Eigen/src/plugins/ArrayCwiseBinaryOps.inc +344 -0
  399. package/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.inc +544 -0
  400. package/eigen/Eigen/src/plugins/{BlockMethods.h → BlockMethods.inc} +434 -506
  401. package/eigen/Eigen/src/plugins/CommonCwiseBinaryOps.inc +116 -0
  402. package/eigen/Eigen/src/plugins/{CommonCwiseUnaryOps.h → CommonCwiseUnaryOps.inc} +58 -68
  403. package/eigen/Eigen/src/plugins/IndexedViewMethods.inc +192 -0
  404. package/eigen/Eigen/src/plugins/InternalHeaderCheck.inc +3 -0
  405. package/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.inc +331 -0
  406. package/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.inc +118 -0
  407. package/eigen/Eigen/src/plugins/ReshapedMethods.inc +133 -0
  408. package/package.json +1 -1
  409. package/eigen/COPYING.APACHE +0 -203
  410. package/eigen/COPYING.BSD +0 -26
  411. package/eigen/COPYING.GPL +0 -674
  412. package/eigen/COPYING.LGPL +0 -502
  413. package/eigen/COPYING.MINPACK +0 -51
  414. package/eigen/COPYING.MPL2 +0 -373
  415. package/eigen/COPYING.README +0 -18
  416. package/eigen/Eigen/src/Core/BooleanRedux.h +0 -162
  417. package/eigen/Eigen/src/Core/arch/CUDA/Complex.h +0 -258
  418. package/eigen/Eigen/src/Core/arch/Default/TypeCasting.h +0 -120
  419. package/eigen/Eigen/src/Core/arch/SYCL/SyclMemoryModel.h +0 -694
  420. package/eigen/Eigen/src/Core/util/NonMPL2.h +0 -3
  421. package/eigen/Eigen/src/SparseCore/MappedSparseMatrix.h +0 -67
  422. package/eigen/Eigen/src/SparseLU/SparseLU_gemm_kernel.h +0 -280
  423. package/eigen/Eigen/src/misc/lapack.h +0 -152
  424. package/eigen/Eigen/src/plugins/ArrayCwiseBinaryOps.h +0 -358
  425. package/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.h +0 -696
  426. package/eigen/Eigen/src/plugins/CommonCwiseBinaryOps.h +0 -115
  427. package/eigen/Eigen/src/plugins/IndexedViewMethods.h +0 -262
  428. package/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.h +0 -152
  429. package/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.h +0 -95
  430. package/eigen/Eigen/src/plugins/ReshapedMethods.h +0 -149
  431. package/eigen/README.md +0 -5
@@ -13,254 +13,243 @@
13
13
 
14
14
  #include "./HessenbergDecomposition.h"
15
15
 
16
- namespace Eigen {
16
+ // IWYU pragma: private
17
+ #include "./InternalHeaderCheck.h"
18
+
19
+ namespace Eigen {
17
20
 
18
21
  /** \eigenvalues_module \ingroup Eigenvalues_Module
19
- *
20
- *
21
- * \class RealSchur
22
- *
23
- * \brief Performs a real Schur decomposition of a square matrix
24
- *
25
- * \tparam _MatrixType the type of the matrix of which we are computing the
26
- * real Schur decomposition; this is expected to be an instantiation of the
27
- * Matrix class template.
28
- *
29
- * Given a real square matrix A, this class computes the real Schur
30
- * decomposition: \f$ A = U T U^T \f$ where U is a real orthogonal matrix and
31
- * T is a real quasi-triangular matrix. An orthogonal matrix is a matrix whose
32
- * inverse is equal to its transpose, \f$ U^{-1} = U^T \f$. A quasi-triangular
33
- * matrix is a block-triangular matrix whose diagonal consists of 1-by-1
34
- * blocks and 2-by-2 blocks with complex eigenvalues. The eigenvalues of the
35
- * blocks on the diagonal of T are the same as the eigenvalues of the matrix
36
- * A, and thus the real Schur decomposition is used in EigenSolver to compute
37
- * the eigendecomposition of a matrix.
38
- *
39
- * Call the function compute() to compute the real Schur decomposition of a
40
- * given matrix. Alternatively, you can use the RealSchur(const MatrixType&, bool)
41
- * constructor which computes the real Schur decomposition at construction
42
- * time. Once the decomposition is computed, you can use the matrixU() and
43
- * matrixT() functions to retrieve the matrices U and T in the decomposition.
44
- *
45
- * The documentation of RealSchur(const MatrixType&, bool) contains an example
46
- * of the typical use of this class.
47
- *
48
- * \note The implementation is adapted from
49
- * <a href="http://math.nist.gov/javanumerics/jama/">JAMA</a> (public domain).
50
- * Their code is based on EISPACK.
51
- *
52
- * \sa class ComplexSchur, class EigenSolver, class ComplexEigenSolver
53
- */
54
- template<typename _MatrixType> class RealSchur
55
- {
56
- public:
57
- typedef _MatrixType MatrixType;
58
- enum {
59
- RowsAtCompileTime = MatrixType::RowsAtCompileTime,
60
- ColsAtCompileTime = MatrixType::ColsAtCompileTime,
61
- Options = MatrixType::Options,
62
- MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
63
- MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
64
- };
65
- typedef typename MatrixType::Scalar Scalar;
66
- typedef std::complex<typename NumTraits<Scalar>::Real> ComplexScalar;
67
- typedef Eigen::Index Index; ///< \deprecated since Eigen 3.3
68
-
69
- typedef Matrix<ComplexScalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> EigenvalueType;
70
- typedef Matrix<Scalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> ColumnVectorType;
71
-
72
- /** \brief Default constructor.
73
- *
74
- * \param [in] size Positive integer, size of the matrix whose Schur decomposition will be computed.
75
- *
76
- * The default constructor is useful in cases in which the user intends to
77
- * perform decompositions via compute(). The \p size parameter is only
78
- * used as a hint. It is not an error to give a wrong \p size, but it may
79
- * impair performance.
80
- *
81
- * \sa compute() for an example.
82
- */
83
- explicit RealSchur(Index size = RowsAtCompileTime==Dynamic ? 1 : RowsAtCompileTime)
84
- : m_matT(size, size),
85
- m_matU(size, size),
86
- m_workspaceVector(size),
87
- m_hess(size),
88
- m_isInitialized(false),
89
- m_matUisUptodate(false),
90
- m_maxIters(-1)
91
- { }
92
-
93
- /** \brief Constructor; computes real Schur decomposition of given matrix.
94
- *
95
- * \param[in] matrix Square matrix whose Schur decomposition is to be computed.
96
- * \param[in] computeU If true, both T and U are computed; if false, only T is computed.
97
- *
98
- * This constructor calls compute() to compute the Schur decomposition.
99
- *
100
- * Example: \include RealSchur_RealSchur_MatrixType.cpp
101
- * Output: \verbinclude RealSchur_RealSchur_MatrixType.out
102
- */
103
- template<typename InputType>
104
- explicit RealSchur(const EigenBase<InputType>& matrix, bool computeU = true)
105
- : m_matT(matrix.rows(),matrix.cols()),
106
- m_matU(matrix.rows(),matrix.cols()),
107
- m_workspaceVector(matrix.rows()),
108
- m_hess(matrix.rows()),
109
- m_isInitialized(false),
110
- m_matUisUptodate(false),
111
- m_maxIters(-1)
112
- {
113
- compute(matrix.derived(), computeU);
114
- }
22
+ *
23
+ *
24
+ * \class RealSchur
25
+ *
26
+ * \brief Performs a real Schur decomposition of a square matrix
27
+ *
28
+ * \tparam MatrixType_ the type of the matrix of which we are computing the
29
+ * real Schur decomposition; this is expected to be an instantiation of the
30
+ * Matrix class template.
31
+ *
32
+ * Given a real square matrix A, this class computes the real Schur
33
+ * decomposition: \f$ A = U T U^T \f$ where U is a real orthogonal matrix and
34
+ * T is a real quasi-triangular matrix. An orthogonal matrix is a matrix whose
35
+ * inverse is equal to its transpose, \f$ U^{-1} = U^T \f$. A quasi-triangular
36
+ * matrix is a block-triangular matrix whose diagonal consists of 1-by-1
37
+ * blocks and 2-by-2 blocks with complex eigenvalues. The eigenvalues of the
38
+ * blocks on the diagonal of T are the same as the eigenvalues of the matrix
39
+ * A, and thus the real Schur decomposition is used in EigenSolver to compute
40
+ * the eigendecomposition of a matrix.
41
+ *
42
+ * Call the function compute() to compute the real Schur decomposition of a
43
+ * given matrix. Alternatively, you can use the RealSchur(const MatrixType&, bool)
44
+ * constructor which computes the real Schur decomposition at construction
45
+ * time. Once the decomposition is computed, you can use the matrixU() and
46
+ * matrixT() functions to retrieve the matrices U and T in the decomposition.
47
+ *
48
+ * The documentation of RealSchur(const MatrixType&, bool) contains an example
49
+ * of the typical use of this class.
50
+ *
51
+ * \note The implementation is adapted from
52
+ * <a href="http://math.nist.gov/javanumerics/jama/">JAMA</a> (public domain).
53
+ * Their code is based on EISPACK.
54
+ *
55
+ * \sa class ComplexSchur, class EigenSolver, class ComplexEigenSolver
56
+ */
57
+ template <typename MatrixType_>
58
+ class RealSchur {
59
+ public:
60
+ typedef MatrixType_ MatrixType;
61
+ enum {
62
+ RowsAtCompileTime = MatrixType::RowsAtCompileTime,
63
+ ColsAtCompileTime = MatrixType::ColsAtCompileTime,
64
+ Options = internal::traits<MatrixType>::Options,
65
+ MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
66
+ MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
67
+ };
68
+ typedef typename MatrixType::Scalar Scalar;
69
+ typedef internal::make_complex_t<Scalar> 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 Schur 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 RealSchur(Index size = RowsAtCompileTime == Dynamic ? 1 : RowsAtCompileTime)
87
+ : m_matT(size, size),
88
+ m_matU(size, size),
89
+ m_workspaceVector(size),
90
+ m_hess(size),
91
+ m_isInitialized(false),
92
+ m_matUisUptodate(false),
93
+ m_maxIters(-1) {}
94
+
95
+ /** \brief Constructor; computes real Schur decomposition of given matrix.
96
+ *
97
+ * \param[in] matrix Square matrix whose Schur decomposition is to be computed.
98
+ * \param[in] computeU If true, both T and U are computed; if false, only T is computed.
99
+ *
100
+ * This constructor calls compute() to compute the Schur decomposition.
101
+ *
102
+ * Example: \include RealSchur_RealSchur_MatrixType.cpp
103
+ * Output: \verbinclude RealSchur_RealSchur_MatrixType.out
104
+ */
105
+ template <typename InputType>
106
+ explicit RealSchur(const EigenBase<InputType>& matrix, bool computeU = true)
107
+ : m_matT(matrix.rows(), matrix.cols()),
108
+ m_matU(matrix.rows(), matrix.cols()),
109
+ m_workspaceVector(matrix.rows()),
110
+ m_hess(matrix.rows()),
111
+ m_isInitialized(false),
112
+ m_matUisUptodate(false),
113
+ m_maxIters(-1) {
114
+ compute(matrix.derived(), computeU);
115
+ }
115
116
 
116
- /** \brief Returns the orthogonal matrix in the Schur decomposition.
117
- *
118
- * \returns A const reference to the matrix U.
119
- *
120
- * \pre Either the constructor RealSchur(const MatrixType&, bool) or the
121
- * member function compute(const MatrixType&, bool) has been called before
122
- * to compute the Schur decomposition of a matrix, and \p computeU was set
123
- * to true (the default value).
124
- *
125
- * \sa RealSchur(const MatrixType&, bool) for an example
126
- */
127
- const MatrixType& matrixU() const
128
- {
129
- eigen_assert(m_isInitialized && "RealSchur is not initialized.");
130
- eigen_assert(m_matUisUptodate && "The matrix U has not been computed during the RealSchur decomposition.");
131
- return m_matU;
132
- }
117
+ /** \brief Returns the orthogonal matrix in the Schur decomposition.
118
+ *
119
+ * \returns A const reference to the matrix U.
120
+ *
121
+ * \pre Either the constructor RealSchur(const MatrixType&, bool) or the
122
+ * member function compute(const MatrixType&, bool) has been called before
123
+ * to compute the Schur decomposition of a matrix, and \p computeU was set
124
+ * to true (the default value).
125
+ *
126
+ * \sa RealSchur(const MatrixType&, bool) for an example
127
+ */
128
+ const MatrixType& matrixU() const {
129
+ eigen_assert(m_isInitialized && "RealSchur is not initialized.");
130
+ eigen_assert(m_matUisUptodate && "The matrix U has not been computed during the RealSchur decomposition.");
131
+ return m_matU;
132
+ }
133
133
 
134
- /** \brief Returns the quasi-triangular matrix in the Schur decomposition.
135
- *
136
- * \returns A const reference to the matrix T.
137
- *
138
- * \pre Either the constructor RealSchur(const MatrixType&, bool) or the
139
- * member function compute(const MatrixType&, bool) has been called before
140
- * to compute the Schur decomposition of a matrix.
141
- *
142
- * \sa RealSchur(const MatrixType&, bool) for an example
143
- */
144
- const MatrixType& matrixT() const
145
- {
146
- eigen_assert(m_isInitialized && "RealSchur is not initialized.");
147
- return m_matT;
148
- }
149
-
150
- /** \brief Computes Schur decomposition of given matrix.
151
- *
152
- * \param[in] matrix Square matrix whose Schur decomposition is to be computed.
153
- * \param[in] computeU If true, both T and U are computed; if false, only T is computed.
154
- * \returns Reference to \c *this
155
- *
156
- * The Schur decomposition is computed by first reducing the matrix to
157
- * Hessenberg form using the class HessenbergDecomposition. The Hessenberg
158
- * matrix is then reduced to triangular form by performing Francis QR
159
- * iterations with implicit double shift. The cost of computing the Schur
160
- * decomposition depends on the number of iterations; as a rough guide, it
161
- * may be taken to be \f$25n^3\f$ flops if \a computeU is true and
162
- * \f$10n^3\f$ flops if \a computeU is false.
163
- *
164
- * Example: \include RealSchur_compute.cpp
165
- * Output: \verbinclude RealSchur_compute.out
166
- *
167
- * \sa compute(const MatrixType&, bool, Index)
168
- */
169
- template<typename InputType>
170
- RealSchur& compute(const EigenBase<InputType>& matrix, bool computeU = true);
171
-
172
- /** \brief Computes Schur decomposition of a Hessenberg matrix H = Z T Z^T
173
- * \param[in] matrixH Matrix in Hessenberg form H
174
- * \param[in] matrixQ orthogonal matrix Q that transform a matrix A to H : A = Q H Q^T
175
- * \param computeU Computes the matriX U of the Schur vectors
176
- * \return Reference to \c *this
177
- *
178
- * This routine assumes that the matrix is already reduced in Hessenberg form matrixH
179
- * using either the class HessenbergDecomposition or another mean.
180
- * It computes the upper quasi-triangular matrix T of the Schur decomposition of H
181
- * When computeU is true, this routine computes the matrix U such that
182
- * A = U T U^T = (QZ) T (QZ)^T = Q H Q^T where A is the initial matrix
183
- *
184
- * NOTE Q is referenced if computeU is true; so, if the initial orthogonal matrix
185
- * is not available, the user should give an identity matrix (Q.setIdentity())
186
- *
187
- * \sa compute(const MatrixType&, bool)
188
- */
189
- template<typename HessMatrixType, typename OrthMatrixType>
190
- RealSchur& computeFromHessenberg(const HessMatrixType& matrixH, const OrthMatrixType& matrixQ, bool computeU);
191
- /** \brief Reports whether previous computation was successful.
192
- *
193
- * \returns \c Success if computation was successful, \c NoConvergence otherwise.
194
- */
195
- ComputationInfo info() const
196
- {
197
- eigen_assert(m_isInitialized && "RealSchur is not initialized.");
198
- return m_info;
199
- }
134
+ /** \brief Returns the quasi-triangular matrix in the Schur decomposition.
135
+ *
136
+ * \returns A const reference to the matrix T.
137
+ *
138
+ * \pre Either the constructor RealSchur(const MatrixType&, bool) or the
139
+ * member function compute(const MatrixType&, bool) has been called before
140
+ * to compute the Schur decomposition of a matrix.
141
+ *
142
+ * \sa RealSchur(const MatrixType&, bool) for an example
143
+ */
144
+ const MatrixType& matrixT() const {
145
+ eigen_assert(m_isInitialized && "RealSchur is not initialized.");
146
+ return m_matT;
147
+ }
200
148
 
201
- /** \brief Sets the maximum number of iterations allowed.
202
- *
203
- * If not specified by the user, the maximum number of iterations is m_maxIterationsPerRow times the size
204
- * of the matrix.
205
- */
206
- RealSchur& setMaxIterations(Index maxIters)
207
- {
208
- m_maxIters = maxIters;
209
- return *this;
210
- }
149
+ /** \brief Computes Schur decomposition of given matrix.
150
+ *
151
+ * \param[in] matrix Square matrix whose Schur decomposition is to be computed.
152
+ * \param[in] computeU If true, both T and U are computed; if false, only T is computed.
153
+ * \returns Reference to \c *this
154
+ *
155
+ * The Schur decomposition is computed by first reducing the matrix to
156
+ * Hessenberg form using the class HessenbergDecomposition. The Hessenberg
157
+ * matrix is then reduced to triangular form by performing Francis QR
158
+ * iterations with implicit double shift. The cost of computing the Schur
159
+ * decomposition depends on the number of iterations; as a rough guide, it
160
+ * may be taken to be \f$25n^3\f$ flops if \a computeU is true and
161
+ * \f$10n^3\f$ flops if \a computeU is false.
162
+ *
163
+ * Example: \include RealSchur_compute.cpp
164
+ * Output: \verbinclude RealSchur_compute.out
165
+ *
166
+ * \sa compute(const MatrixType&, bool, Index)
167
+ */
168
+ template <typename InputType>
169
+ RealSchur& compute(const EigenBase<InputType>& matrix, bool computeU = true);
170
+
171
+ /** \brief Computes Schur decomposition of a Hessenberg matrix H = Z T Z^T
172
+ * \param[in] matrixH Matrix in Hessenberg form H
173
+ * \param[in] matrixQ orthogonal matrix Q that transform a matrix A to H : A = Q H Q^T
174
+ * \param computeU Computes the matriX U of the Schur vectors
175
+ * \return Reference to \c *this
176
+ *
177
+ * This routine assumes that the matrix is already reduced in Hessenberg form matrixH
178
+ * using either the class HessenbergDecomposition or another mean.
179
+ * It computes the upper quasi-triangular matrix T of the Schur decomposition of H
180
+ * When computeU is true, this routine computes the matrix U such that
181
+ * A = U T U^T = (QZ) T (QZ)^T = Q H Q^T where A is the initial matrix
182
+ *
183
+ * NOTE Q is referenced if computeU is true; so, if the initial orthogonal matrix
184
+ * is not available, the user should give an identity matrix (Q.setIdentity())
185
+ *
186
+ * \sa compute(const MatrixType&, bool)
187
+ */
188
+ template <typename HessMatrixType, typename OrthMatrixType>
189
+ RealSchur& computeFromHessenberg(const HessMatrixType& matrixH, const OrthMatrixType& matrixQ, bool computeU);
190
+ /** \brief Reports whether previous computation was successful.
191
+ *
192
+ * \returns \c Success if computation was successful, \c NoConvergence otherwise.
193
+ */
194
+ ComputationInfo info() const {
195
+ eigen_assert(m_isInitialized && "RealSchur is not initialized.");
196
+ return m_info;
197
+ }
211
198
 
212
- /** \brief Returns the maximum number of iterations. */
213
- Index getMaxIterations()
214
- {
215
- return m_maxIters;
216
- }
199
+ /** \brief Sets the maximum number of iterations allowed.
200
+ *
201
+ * If not specified by the user, the maximum number of iterations is m_maxIterationsPerRow times the size
202
+ * of the matrix.
203
+ */
204
+ RealSchur& setMaxIterations(Index maxIters) {
205
+ m_maxIters = maxIters;
206
+ return *this;
207
+ }
217
208
 
218
- /** \brief Maximum number of iterations per row.
219
- *
220
- * If not otherwise specified, the maximum number of iterations is this number times the size of the
221
- * matrix. It is currently set to 40.
222
- */
223
- static const int m_maxIterationsPerRow = 40;
224
-
225
- private:
226
-
227
- MatrixType m_matT;
228
- MatrixType m_matU;
229
- ColumnVectorType m_workspaceVector;
230
- HessenbergDecomposition<MatrixType> m_hess;
231
- ComputationInfo m_info;
232
- bool m_isInitialized;
233
- bool m_matUisUptodate;
234
- Index m_maxIters;
235
-
236
- typedef Matrix<Scalar,3,1> Vector3s;
237
-
238
- Scalar computeNormOfT();
239
- Index findSmallSubdiagEntry(Index iu, const Scalar& considerAsZero);
240
- void splitOffTwoRows(Index iu, bool computeU, const Scalar& exshift);
241
- void computeShift(Index iu, Index iter, Scalar& exshift, Vector3s& shiftInfo);
242
- void initFrancisQRStep(Index il, Index iu, const Vector3s& shiftInfo, Index& im, Vector3s& firstHouseholderVector);
243
- void performFrancisQRStep(Index il, Index im, Index iu, bool computeU, const Vector3s& firstHouseholderVector, Scalar* workspace);
209
+ /** \brief Returns the maximum number of iterations. */
210
+ Index getMaxIterations() { return m_maxIters; }
211
+
212
+ /** \brief Maximum number of iterations per row.
213
+ *
214
+ * If not otherwise specified, the maximum number of iterations is this number times the size of the
215
+ * matrix. It is currently set to 40.
216
+ */
217
+ static const int m_maxIterationsPerRow = 40;
218
+
219
+ private:
220
+ MatrixType m_matT;
221
+ MatrixType m_matU;
222
+ ColumnVectorType m_workspaceVector;
223
+ HessenbergDecomposition<MatrixType> m_hess;
224
+ ComputationInfo m_info;
225
+ bool m_isInitialized;
226
+ bool m_matUisUptodate;
227
+ Index m_maxIters;
228
+
229
+ typedef Matrix<Scalar, 3, 1> Vector3s;
230
+
231
+ Scalar computeNormOfT();
232
+ Index findSmallSubdiagEntry(Index iu, const Scalar& considerAsZero);
233
+ void splitOffTwoRows(Index iu, bool computeU, const Scalar& exshift);
234
+ void computeShift(Index iu, Index iter, Scalar& exshift, Vector3s& shiftInfo);
235
+ void initFrancisQRStep(Index il, Index iu, const Vector3s& shiftInfo, Index& im, Vector3s& firstHouseholderVector);
236
+ void performFrancisQRStep(Index il, Index im, Index iu, bool computeU, const Vector3s& firstHouseholderVector,
237
+ Scalar* workspace);
244
238
  };
245
239
 
246
-
247
- template<typename MatrixType>
248
- template<typename InputType>
249
- RealSchur<MatrixType>& RealSchur<MatrixType>::compute(const EigenBase<InputType>& matrix, bool computeU)
250
- {
240
+ template <typename MatrixType>
241
+ template <typename InputType>
242
+ RealSchur<MatrixType>& RealSchur<MatrixType>::compute(const EigenBase<InputType>& matrix, bool computeU) {
251
243
  const Scalar considerAsZero = (std::numeric_limits<Scalar>::min)();
252
244
 
253
245
  eigen_assert(matrix.cols() == matrix.rows());
254
246
  Index maxIters = m_maxIters;
255
- if (maxIters == -1)
256
- maxIters = m_maxIterationsPerRow * matrix.rows();
247
+ if (maxIters == -1) maxIters = m_maxIterationsPerRow * matrix.rows();
257
248
 
258
249
  Scalar scale = matrix.derived().cwiseAbs().maxCoeff();
259
- if(scale<considerAsZero)
260
- {
261
- m_matT.setZero(matrix.rows(),matrix.cols());
262
- if(computeU)
263
- m_matU.setIdentity(matrix.rows(),matrix.cols());
250
+ if (scale < considerAsZero) {
251
+ m_matT.setZero(matrix.rows(), matrix.cols());
252
+ if (computeU) m_matU.setIdentity(matrix.rows(), matrix.cols());
264
253
  m_info = Success;
265
254
  m_isInitialized = true;
266
255
  m_matUisUptodate = computeU;
@@ -268,74 +257,67 @@ RealSchur<MatrixType>& RealSchur<MatrixType>::compute(const EigenBase<InputType>
268
257
  }
269
258
 
270
259
  // Step 1. Reduce to Hessenberg form
271
- m_hess.compute(matrix.derived()/scale);
260
+ m_hess.compute(matrix.derived() / scale);
272
261
 
273
262
  // Step 2. Reduce to real Schur form
274
263
  // Note: we copy m_hess.matrixQ() into m_matU here and not in computeFromHessenberg
275
264
  // to be able to pass our working-space buffer for the Householder to Dense evaluation.
276
265
  m_workspaceVector.resize(matrix.cols());
277
- if(computeU)
278
- m_hess.matrixQ().evalTo(m_matU, m_workspaceVector);
266
+ if (computeU) m_hess.matrixQ().evalTo(m_matU, m_workspaceVector);
279
267
  computeFromHessenberg(m_hess.matrixH(), m_matU, computeU);
280
268
 
281
269
  m_matT *= scale;
282
-
270
+
283
271
  return *this;
284
272
  }
285
- template<typename MatrixType>
286
- template<typename HessMatrixType, typename OrthMatrixType>
287
- RealSchur<MatrixType>& RealSchur<MatrixType>::computeFromHessenberg(const HessMatrixType& matrixH, const OrthMatrixType& matrixQ, bool computeU)
288
- {
273
+ template <typename MatrixType>
274
+ template <typename HessMatrixType, typename OrthMatrixType>
275
+ RealSchur<MatrixType>& RealSchur<MatrixType>::computeFromHessenberg(const HessMatrixType& matrixH,
276
+ const OrthMatrixType& matrixQ, bool computeU) {
289
277
  using std::abs;
290
278
 
291
279
  m_matT = matrixH;
292
280
  m_workspaceVector.resize(m_matT.cols());
293
- if(computeU && !internal::is_same_dense(m_matU,matrixQ))
294
- m_matU = matrixQ;
295
-
281
+ if (computeU && !internal::is_same_dense(m_matU, matrixQ)) m_matU = matrixQ;
282
+
296
283
  Index maxIters = m_maxIters;
297
- if (maxIters == -1)
298
- maxIters = m_maxIterationsPerRow * matrixH.rows();
284
+ if (maxIters == -1) maxIters = m_maxIterationsPerRow * matrixH.rows();
299
285
  Scalar* workspace = &m_workspaceVector.coeffRef(0);
300
286
 
301
- // The matrix m_matT is divided in three parts.
302
- // Rows 0,...,il-1 are decoupled from the rest because m_matT(il,il-1) is zero.
287
+ // The matrix m_matT is divided in three parts.
288
+ // Rows 0,...,il-1 are decoupled from the rest because m_matT(il,il-1) is zero.
303
289
  // Rows il,...,iu is the part we are working on (the active window).
304
290
  // Rows iu+1,...,end are already brought in triangular form.
305
291
  Index iu = m_matT.cols() - 1;
306
- Index iter = 0; // iteration count for current eigenvalue
307
- Index totalIter = 0; // iteration count for whole matrix
308
- Scalar exshift(0); // sum of exceptional shifts
292
+ Index iter = 0; // iteration count for current eigenvalue
293
+ Index totalIter = 0; // iteration count for whole matrix
294
+ Scalar exshift(0); // sum of exceptional shifts
309
295
  Scalar norm = computeNormOfT();
310
296
  // sub-diagonal entries smaller than considerAsZero will be treated as zero.
311
297
  // We use eps^2 to enable more precision in small eigenvalues.
312
- Scalar considerAsZero = numext::maxi<Scalar>( norm * numext::abs2(NumTraits<Scalar>::epsilon()),
313
- (std::numeric_limits<Scalar>::min)() );
298
+ Scalar considerAsZero =
299
+ numext::maxi<Scalar>(norm * numext::abs2(NumTraits<Scalar>::epsilon()), (std::numeric_limits<Scalar>::min)());
314
300
 
315
- if(norm!=Scalar(0))
316
- {
317
- while (iu >= 0)
318
- {
319
- Index il = findSmallSubdiagEntry(iu,considerAsZero);
301
+ if (!numext::is_exactly_zero(norm)) {
302
+ while (iu >= 0) {
303
+ Index il = findSmallSubdiagEntry(iu, considerAsZero);
320
304
 
321
305
  // Check for convergence
322
- if (il == iu) // One root found
306
+ if (il == iu) // One root found
323
307
  {
324
- m_matT.coeffRef(iu,iu) = m_matT.coeff(iu,iu) + exshift;
325
- if (iu > 0)
326
- m_matT.coeffRef(iu, iu-1) = Scalar(0);
308
+ m_matT.coeffRef(iu, iu) = m_matT.coeff(iu, iu) + exshift;
309
+ if (iu > 0) m_matT.coeffRef(iu, iu - 1) = Scalar(0);
327
310
  iu--;
328
311
  iter = 0;
329
- }
330
- else if (il == iu-1) // Two roots found
312
+ } else if (il == iu - 1) // Two roots found
331
313
  {
332
314
  splitOffTwoRows(iu, computeU, exshift);
333
315
  iu -= 2;
334
316
  iter = 0;
335
- }
336
- else // No convergence yet
317
+ } else // No convergence yet
337
318
  {
338
- // The firstHouseholderVector vector has to be initialized to something to get rid of a silly GCC warning (-O1 -Wall -DNDEBUG )
319
+ // The firstHouseholderVector vector has to be initialized to something to get rid of a silly GCC warning (-O1
320
+ // -Wall -DNDEBUG )
339
321
  Vector3s firstHouseholderVector = Vector3s::Zero(), shiftInfo;
340
322
  computeShift(iu, iter, exshift, shiftInfo);
341
323
  iter = iter + 1;
@@ -347,7 +329,7 @@ RealSchur<MatrixType>& RealSchur<MatrixType>::computeFromHessenberg(const HessMa
347
329
  }
348
330
  }
349
331
  }
350
- if(totalIter <= maxIters)
332
+ if (totalIter <= maxIters)
351
333
  m_info = Success;
352
334
  else
353
335
  m_info = NoConvergence;
@@ -358,201 +340,180 @@ RealSchur<MatrixType>& RealSchur<MatrixType>::computeFromHessenberg(const HessMa
358
340
  }
359
341
 
360
342
  /** \internal Computes and returns vector L1 norm of T */
361
- template<typename MatrixType>
362
- inline typename MatrixType::Scalar RealSchur<MatrixType>::computeNormOfT()
363
- {
343
+ template <typename MatrixType>
344
+ inline typename MatrixType::Scalar RealSchur<MatrixType>::computeNormOfT() {
364
345
  const Index size = m_matT.cols();
365
346
  // FIXME to be efficient the following would requires a triangular reduxion code
366
- // Scalar norm = m_matT.upper().cwiseAbs().sum()
347
+ // Scalar norm = m_matT.upper().cwiseAbs().sum()
367
348
  // + m_matT.bottomLeftCorner(size-1,size-1).diagonal().cwiseAbs().sum();
368
349
  Scalar norm(0);
369
- for (Index j = 0; j < size; ++j)
370
- norm += m_matT.col(j).segment(0, (std::min)(size,j+2)).cwiseAbs().sum();
350
+ for (Index j = 0; j < size; ++j) norm += m_matT.col(j).segment(0, (std::min)(size, j + 2)).cwiseAbs().sum();
371
351
  return norm;
372
352
  }
373
353
 
374
354
  /** \internal Look for single small sub-diagonal element and returns its index */
375
- template<typename MatrixType>
376
- inline Index RealSchur<MatrixType>::findSmallSubdiagEntry(Index iu, const Scalar& considerAsZero)
377
- {
355
+ template <typename MatrixType>
356
+ inline Index RealSchur<MatrixType>::findSmallSubdiagEntry(Index iu, const Scalar& considerAsZero) {
378
357
  using std::abs;
379
358
  Index res = iu;
380
- while (res > 0)
381
- {
382
- Scalar s = abs(m_matT.coeff(res-1,res-1)) + abs(m_matT.coeff(res,res));
359
+ while (res > 0) {
360
+ Scalar s = abs(m_matT.coeff(res - 1, res - 1)) + abs(m_matT.coeff(res, res));
383
361
 
384
362
  s = numext::maxi<Scalar>(s * NumTraits<Scalar>::epsilon(), considerAsZero);
385
-
386
- if (abs(m_matT.coeff(res,res-1)) <= s)
387
- break;
363
+
364
+ if (abs(m_matT.coeff(res, res - 1)) <= s) break;
388
365
  res--;
389
366
  }
390
367
  return res;
391
368
  }
392
369
 
393
370
  /** \internal Update T given that rows iu-1 and iu decouple from the rest. */
394
- template<typename MatrixType>
395
- inline void RealSchur<MatrixType>::splitOffTwoRows(Index iu, bool computeU, const Scalar& exshift)
396
- {
397
- using std::sqrt;
371
+ template <typename MatrixType>
372
+ inline void RealSchur<MatrixType>::splitOffTwoRows(Index iu, bool computeU, const Scalar& exshift) {
398
373
  using std::abs;
374
+ using std::sqrt;
399
375
  const Index size = m_matT.cols();
400
376
 
401
- // The eigenvalues of the 2x2 matrix [a b; c d] are
377
+ // The eigenvalues of the 2x2 matrix [a b; c d] are
402
378
  // trace +/- sqrt(discr/4) where discr = tr^2 - 4*det, tr = a + d, det = ad - bc
403
- Scalar p = Scalar(0.5) * (m_matT.coeff(iu-1,iu-1) - m_matT.coeff(iu,iu));
404
- Scalar q = p * p + m_matT.coeff(iu,iu-1) * m_matT.coeff(iu-1,iu); // q = tr^2 / 4 - det = discr/4
405
- m_matT.coeffRef(iu,iu) += exshift;
406
- m_matT.coeffRef(iu-1,iu-1) += exshift;
379
+ Scalar p = Scalar(0.5) * (m_matT.coeff(iu - 1, iu - 1) - m_matT.coeff(iu, iu));
380
+ Scalar q = p * p + m_matT.coeff(iu, iu - 1) * m_matT.coeff(iu - 1, iu); // q = tr^2 / 4 - det = discr/4
381
+ m_matT.coeffRef(iu, iu) += exshift;
382
+ m_matT.coeffRef(iu - 1, iu - 1) += exshift;
407
383
 
408
- if (q >= Scalar(0)) // Two real eigenvalues
384
+ if (q >= Scalar(0)) // Two real eigenvalues
409
385
  {
410
386
  Scalar z = sqrt(abs(q));
411
387
  JacobiRotation<Scalar> rot;
412
388
  if (p >= Scalar(0))
413
- rot.makeGivens(p + z, m_matT.coeff(iu, iu-1));
389
+ rot.makeGivens(p + z, m_matT.coeff(iu, iu - 1));
414
390
  else
415
- rot.makeGivens(p - z, m_matT.coeff(iu, iu-1));
391
+ rot.makeGivens(p - z, m_matT.coeff(iu, iu - 1));
416
392
 
417
- m_matT.rightCols(size-iu+1).applyOnTheLeft(iu-1, iu, rot.adjoint());
418
- m_matT.topRows(iu+1).applyOnTheRight(iu-1, iu, rot);
419
- m_matT.coeffRef(iu, iu-1) = Scalar(0);
420
- if (computeU)
421
- m_matU.applyOnTheRight(iu-1, iu, rot);
393
+ m_matT.rightCols(size - iu + 1).applyOnTheLeft(iu - 1, iu, rot.adjoint());
394
+ m_matT.topRows(iu + 1).applyOnTheRight(iu - 1, iu, rot);
395
+ m_matT.coeffRef(iu, iu - 1) = Scalar(0);
396
+ if (computeU) m_matU.applyOnTheRight(iu - 1, iu, rot);
422
397
  }
423
398
 
424
- if (iu > 1)
425
- m_matT.coeffRef(iu-1, iu-2) = Scalar(0);
399
+ if (iu > 1) m_matT.coeffRef(iu - 1, iu - 2) = Scalar(0);
426
400
  }
427
401
 
428
402
  /** \internal Form shift in shiftInfo, and update exshift if an exceptional shift is performed. */
429
- template<typename MatrixType>
430
- inline void RealSchur<MatrixType>::computeShift(Index iu, Index iter, Scalar& exshift, Vector3s& shiftInfo)
431
- {
432
- using std::sqrt;
403
+ template <typename MatrixType>
404
+ inline void RealSchur<MatrixType>::computeShift(Index iu, Index iter, Scalar& exshift, Vector3s& shiftInfo) {
433
405
  using std::abs;
434
- shiftInfo.coeffRef(0) = m_matT.coeff(iu,iu);
435
- shiftInfo.coeffRef(1) = m_matT.coeff(iu-1,iu-1);
436
- shiftInfo.coeffRef(2) = m_matT.coeff(iu,iu-1) * m_matT.coeff(iu-1,iu);
437
-
438
- // Wilkinson's original ad hoc shift
439
- if (iter == 10)
440
- {
441
- exshift += shiftInfo.coeff(0);
442
- for (Index i = 0; i <= iu; ++i)
443
- m_matT.coeffRef(i,i) -= shiftInfo.coeff(0);
444
- Scalar s = abs(m_matT.coeff(iu,iu-1)) + abs(m_matT.coeff(iu-1,iu-2));
445
- shiftInfo.coeffRef(0) = Scalar(0.75) * s;
446
- shiftInfo.coeffRef(1) = Scalar(0.75) * s;
447
- shiftInfo.coeffRef(2) = Scalar(-0.4375) * s * s;
448
- }
449
-
450
- // MATLAB's new ad hoc shift
451
- if (iter == 30)
452
- {
453
- Scalar s = (shiftInfo.coeff(1) - shiftInfo.coeff(0)) / Scalar(2.0);
454
- s = s * s + shiftInfo.coeff(2);
455
- if (s > Scalar(0))
456
- {
457
- s = sqrt(s);
458
- if (shiftInfo.coeff(1) < shiftInfo.coeff(0))
459
- s = -s;
460
- s = s + (shiftInfo.coeff(1) - shiftInfo.coeff(0)) / Scalar(2.0);
461
- s = shiftInfo.coeff(0) - shiftInfo.coeff(2) / s;
462
- exshift += s;
463
- for (Index i = 0; i <= iu; ++i)
464
- m_matT.coeffRef(i,i) -= s;
465
- shiftInfo.setConstant(Scalar(0.964));
406
+ using std::sqrt;
407
+ shiftInfo.coeffRef(0) = m_matT.coeff(iu, iu);
408
+ shiftInfo.coeffRef(1) = m_matT.coeff(iu - 1, iu - 1);
409
+ shiftInfo.coeffRef(2) = m_matT.coeff(iu, iu - 1) * m_matT.coeff(iu - 1, iu);
410
+
411
+ // Alternate exceptional shifting strategy every 16 iterations.
412
+ if (iter > 0 && iter % 16 == 0) {
413
+ // Wilkinson's original ad hoc shift
414
+ if (iter % 32 != 0) {
415
+ exshift += shiftInfo.coeff(0);
416
+ for (Index i = 0; i <= iu; ++i) m_matT.coeffRef(i, i) -= shiftInfo.coeff(0);
417
+ Scalar s = abs(m_matT.coeff(iu, iu - 1)) + abs(m_matT.coeff(iu - 1, iu - 2));
418
+ shiftInfo.coeffRef(0) = Scalar(0.75) * s;
419
+ shiftInfo.coeffRef(1) = Scalar(0.75) * s;
420
+ shiftInfo.coeffRef(2) = Scalar(-0.4375) * s * s;
421
+ } else {
422
+ // MATLAB's new ad hoc shift
423
+ Scalar s = (shiftInfo.coeff(1) - shiftInfo.coeff(0)) / Scalar(2.0);
424
+ s = s * s + shiftInfo.coeff(2);
425
+ if (s > Scalar(0)) {
426
+ s = sqrt(s);
427
+ if (shiftInfo.coeff(1) < shiftInfo.coeff(0)) s = -s;
428
+ s = s + (shiftInfo.coeff(1) - shiftInfo.coeff(0)) / Scalar(2.0);
429
+ s = shiftInfo.coeff(0) - shiftInfo.coeff(2) / s;
430
+ exshift += s;
431
+ for (Index i = 0; i <= iu; ++i) m_matT.coeffRef(i, i) -= s;
432
+ shiftInfo.setConstant(Scalar(0.964));
433
+ }
466
434
  }
467
435
  }
468
436
  }
469
437
 
470
438
  /** \internal Compute index im at which Francis QR step starts and the first Householder vector. */
471
- template<typename MatrixType>
472
- inline void RealSchur<MatrixType>::initFrancisQRStep(Index il, Index iu, const Vector3s& shiftInfo, Index& im, Vector3s& firstHouseholderVector)
473
- {
439
+ template <typename MatrixType>
440
+ inline void RealSchur<MatrixType>::initFrancisQRStep(Index il, Index iu, const Vector3s& shiftInfo, Index& im,
441
+ Vector3s& firstHouseholderVector) {
474
442
  using std::abs;
475
- Vector3s& v = firstHouseholderVector; // alias to save typing
443
+ Vector3s& v = firstHouseholderVector; // alias to save typing
476
444
 
477
- for (im = iu-2; im >= il; --im)
478
- {
479
- const Scalar Tmm = m_matT.coeff(im,im);
445
+ for (im = iu - 2; im >= il; --im) {
446
+ const Scalar Tmm = m_matT.coeff(im, im);
480
447
  const Scalar r = shiftInfo.coeff(0) - Tmm;
481
448
  const Scalar s = shiftInfo.coeff(1) - Tmm;
482
- v.coeffRef(0) = (r * s - shiftInfo.coeff(2)) / m_matT.coeff(im+1,im) + m_matT.coeff(im,im+1);
483
- v.coeffRef(1) = m_matT.coeff(im+1,im+1) - Tmm - r - s;
484
- v.coeffRef(2) = m_matT.coeff(im+2,im+1);
449
+ v.coeffRef(0) = (r * s - shiftInfo.coeff(2)) / m_matT.coeff(im + 1, im) + m_matT.coeff(im, im + 1);
450
+ v.coeffRef(1) = m_matT.coeff(im + 1, im + 1) - Tmm - r - s;
451
+ v.coeffRef(2) = m_matT.coeff(im + 2, im + 1);
485
452
  if (im == il) {
486
453
  break;
487
454
  }
488
- const Scalar lhs = m_matT.coeff(im,im-1) * (abs(v.coeff(1)) + abs(v.coeff(2)));
489
- const Scalar rhs = v.coeff(0) * (abs(m_matT.coeff(im-1,im-1)) + abs(Tmm) + abs(m_matT.coeff(im+1,im+1)));
490
- if (abs(lhs) < NumTraits<Scalar>::epsilon() * rhs)
491
- break;
455
+ const Scalar lhs = m_matT.coeff(im, im - 1) * (abs(v.coeff(1)) + abs(v.coeff(2)));
456
+ const Scalar rhs = v.coeff(0) * (abs(m_matT.coeff(im - 1, im - 1)) + abs(Tmm) + abs(m_matT.coeff(im + 1, im + 1)));
457
+ if (abs(lhs) < NumTraits<Scalar>::epsilon() * rhs) break;
492
458
  }
493
459
  }
494
460
 
495
461
  /** \internal Perform a Francis QR step involving rows il:iu and columns im:iu. */
496
- template<typename MatrixType>
497
- inline void RealSchur<MatrixType>::performFrancisQRStep(Index il, Index im, Index iu, bool computeU, const Vector3s& firstHouseholderVector, Scalar* workspace)
498
- {
462
+ template <typename MatrixType>
463
+ inline void RealSchur<MatrixType>::performFrancisQRStep(Index il, Index im, Index iu, bool computeU,
464
+ const Vector3s& firstHouseholderVector, Scalar* workspace) {
499
465
  eigen_assert(im >= il);
500
- eigen_assert(im <= iu-2);
466
+ eigen_assert(im <= iu - 2);
501
467
 
502
468
  const Index size = m_matT.cols();
503
469
 
504
- for (Index k = im; k <= iu-2; ++k)
505
- {
470
+ for (Index k = im; k <= iu - 2; ++k) {
506
471
  bool firstIteration = (k == im);
507
472
 
508
473
  Vector3s v;
509
474
  if (firstIteration)
510
475
  v = firstHouseholderVector;
511
476
  else
512
- v = m_matT.template block<3,1>(k,k-1);
477
+ v = m_matT.template block<3, 1>(k, k - 1);
513
478
 
514
479
  Scalar tau, beta;
515
480
  Matrix<Scalar, 2, 1> ess;
516
481
  v.makeHouseholder(ess, tau, beta);
517
-
518
- if (beta != Scalar(0)) // if v is not zero
482
+
483
+ if (!numext::is_exactly_zero(beta)) // if v is not zero
519
484
  {
520
485
  if (firstIteration && k > il)
521
- m_matT.coeffRef(k,k-1) = -m_matT.coeff(k,k-1);
486
+ m_matT.coeffRef(k, k - 1) = -m_matT.coeff(k, k - 1);
522
487
  else if (!firstIteration)
523
- m_matT.coeffRef(k,k-1) = beta;
488
+ m_matT.coeffRef(k, k - 1) = beta;
524
489
 
525
490
  // These Householder transformations form the O(n^3) part of the algorithm
526
- m_matT.block(k, k, 3, size-k).applyHouseholderOnTheLeft(ess, tau, workspace);
527
- m_matT.block(0, k, (std::min)(iu,k+3) + 1, 3).applyHouseholderOnTheRight(ess, tau, workspace);
528
- if (computeU)
529
- m_matU.block(0, k, size, 3).applyHouseholderOnTheRight(ess, tau, workspace);
491
+ m_matT.block(k, k, 3, size - k).applyHouseholderOnTheLeft(ess, tau, workspace);
492
+ m_matT.block(0, k, (std::min)(iu, k + 3) + 1, 3).applyHouseholderOnTheRight(ess, tau, workspace);
493
+ if (computeU) m_matU.block(0, k, size, 3).applyHouseholderOnTheRight(ess, tau, workspace);
530
494
  }
531
495
  }
532
496
 
533
- Matrix<Scalar, 2, 1> v = m_matT.template block<2,1>(iu-1, iu-2);
497
+ Matrix<Scalar, 2, 1> v = m_matT.template block<2, 1>(iu - 1, iu - 2);
534
498
  Scalar tau, beta;
535
499
  Matrix<Scalar, 1, 1> ess;
536
500
  v.makeHouseholder(ess, tau, beta);
537
501
 
538
- if (beta != Scalar(0)) // if v is not zero
502
+ if (!numext::is_exactly_zero(beta)) // if v is not zero
539
503
  {
540
- m_matT.coeffRef(iu-1, iu-2) = beta;
541
- m_matT.block(iu-1, iu-1, 2, size-iu+1).applyHouseholderOnTheLeft(ess, tau, workspace);
542
- m_matT.block(0, iu-1, iu+1, 2).applyHouseholderOnTheRight(ess, tau, workspace);
543
- if (computeU)
544
- m_matU.block(0, iu-1, size, 2).applyHouseholderOnTheRight(ess, tau, workspace);
504
+ m_matT.coeffRef(iu - 1, iu - 2) = beta;
505
+ m_matT.block(iu - 1, iu - 1, 2, size - iu + 1).applyHouseholderOnTheLeft(ess, tau, workspace);
506
+ m_matT.block(0, iu - 1, iu + 1, 2).applyHouseholderOnTheRight(ess, tau, workspace);
507
+ if (computeU) m_matU.block(0, iu - 1, size, 2).applyHouseholderOnTheRight(ess, tau, workspace);
545
508
  }
546
509
 
547
510
  // clean up pollution due to round-off errors
548
- for (Index i = im+2; i <= iu; ++i)
549
- {
550
- m_matT.coeffRef(i,i-2) = Scalar(0);
551
- if (i > im+2)
552
- m_matT.coeffRef(i,i-3) = Scalar(0);
511
+ for (Index i = im + 2; i <= iu; ++i) {
512
+ m_matT.coeffRef(i, i - 2) = Scalar(0);
513
+ if (i > im + 2) m_matT.coeffRef(i, i - 3) = Scalar(0);
553
514
  }
554
515
  }
555
516
 
556
- } // end namespace Eigen
517
+ } // end namespace Eigen
557
518
 
558
- #endif // EIGEN_REAL_SCHUR_H
519
+ #endif // EIGEN_REAL_SCHUR_H