@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
@@ -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 succesful, \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,69 +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
- // Step 2. Reduce to real Schur form
274
- computeFromHessenberg(m_hess.matrixH(), m_hess.matrixQ(), computeU);
262
+ // Step 2. Reduce to real Schur form
263
+ // Note: we copy m_hess.matrixQ() into m_matU here and not in computeFromHessenberg
264
+ // to be able to pass our working-space buffer for the Householder to Dense evaluation.
265
+ m_workspaceVector.resize(matrix.cols());
266
+ if (computeU) m_hess.matrixQ().evalTo(m_matU, m_workspaceVector);
267
+ computeFromHessenberg(m_hess.matrixH(), m_matU, computeU);
275
268
 
276
269
  m_matT *= scale;
277
-
270
+
278
271
  return *this;
279
272
  }
280
- template<typename MatrixType>
281
- template<typename HessMatrixType, typename OrthMatrixType>
282
- RealSchur<MatrixType>& RealSchur<MatrixType>::computeFromHessenberg(const HessMatrixType& matrixH, const OrthMatrixType& matrixQ, bool computeU)
283
- {
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) {
284
277
  using std::abs;
285
278
 
286
279
  m_matT = matrixH;
287
- if(computeU)
288
- m_matU = matrixQ;
289
-
290
- Index maxIters = m_maxIters;
291
- if (maxIters == -1)
292
- maxIters = m_maxIterationsPerRow * matrixH.rows();
293
280
  m_workspaceVector.resize(m_matT.cols());
281
+ if (computeU && !internal::is_same_dense(m_matU, matrixQ)) m_matU = matrixQ;
282
+
283
+ Index maxIters = m_maxIters;
284
+ if (maxIters == -1) maxIters = m_maxIterationsPerRow * matrixH.rows();
294
285
  Scalar* workspace = &m_workspaceVector.coeffRef(0);
295
286
 
296
- // The matrix m_matT is divided in three parts.
297
- // 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.
298
289
  // Rows il,...,iu is the part we are working on (the active window).
299
290
  // Rows iu+1,...,end are already brought in triangular form.
300
291
  Index iu = m_matT.cols() - 1;
301
- Index iter = 0; // iteration count for current eigenvalue
302
- Index totalIter = 0; // iteration count for whole matrix
303
- 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
304
295
  Scalar norm = computeNormOfT();
305
296
  // sub-diagonal entries smaller than considerAsZero will be treated as zero.
306
297
  // We use eps^2 to enable more precision in small eigenvalues.
307
- Scalar considerAsZero = numext::maxi<Scalar>( norm * numext::abs2(NumTraits<Scalar>::epsilon()),
308
- (std::numeric_limits<Scalar>::min)() );
298
+ Scalar considerAsZero =
299
+ numext::maxi<Scalar>(norm * numext::abs2(NumTraits<Scalar>::epsilon()), (std::numeric_limits<Scalar>::min)());
309
300
 
310
- if(norm!=Scalar(0))
311
- {
312
- while (iu >= 0)
313
- {
314
- Index il = findSmallSubdiagEntry(iu,considerAsZero);
301
+ if (!numext::is_exactly_zero(norm)) {
302
+ while (iu >= 0) {
303
+ Index il = findSmallSubdiagEntry(iu, considerAsZero);
315
304
 
316
305
  // Check for convergence
317
- if (il == iu) // One root found
306
+ if (il == iu) // One root found
318
307
  {
319
- m_matT.coeffRef(iu,iu) = m_matT.coeff(iu,iu) + exshift;
320
- if (iu > 0)
321
- 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);
322
310
  iu--;
323
311
  iter = 0;
324
- }
325
- else if (il == iu-1) // Two roots found
312
+ } else if (il == iu - 1) // Two roots found
326
313
  {
327
314
  splitOffTwoRows(iu, computeU, exshift);
328
315
  iu -= 2;
329
316
  iter = 0;
330
- }
331
- else // No convergence yet
317
+ } else // No convergence yet
332
318
  {
333
- // 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 )
334
321
  Vector3s firstHouseholderVector = Vector3s::Zero(), shiftInfo;
335
322
  computeShift(iu, iter, exshift, shiftInfo);
336
323
  iter = iter + 1;
@@ -342,7 +329,7 @@ RealSchur<MatrixType>& RealSchur<MatrixType>::computeFromHessenberg(const HessMa
342
329
  }
343
330
  }
344
331
  }
345
- if(totalIter <= maxIters)
332
+ if (totalIter <= maxIters)
346
333
  m_info = Success;
347
334
  else
348
335
  m_info = NoConvergence;
@@ -353,201 +340,180 @@ RealSchur<MatrixType>& RealSchur<MatrixType>::computeFromHessenberg(const HessMa
353
340
  }
354
341
 
355
342
  /** \internal Computes and returns vector L1 norm of T */
356
- template<typename MatrixType>
357
- inline typename MatrixType::Scalar RealSchur<MatrixType>::computeNormOfT()
358
- {
343
+ template <typename MatrixType>
344
+ inline typename MatrixType::Scalar RealSchur<MatrixType>::computeNormOfT() {
359
345
  const Index size = m_matT.cols();
360
346
  // FIXME to be efficient the following would requires a triangular reduxion code
361
- // Scalar norm = m_matT.upper().cwiseAbs().sum()
347
+ // Scalar norm = m_matT.upper().cwiseAbs().sum()
362
348
  // + m_matT.bottomLeftCorner(size-1,size-1).diagonal().cwiseAbs().sum();
363
349
  Scalar norm(0);
364
- for (Index j = 0; j < size; ++j)
365
- 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();
366
351
  return norm;
367
352
  }
368
353
 
369
354
  /** \internal Look for single small sub-diagonal element and returns its index */
370
- template<typename MatrixType>
371
- inline Index RealSchur<MatrixType>::findSmallSubdiagEntry(Index iu, const Scalar& considerAsZero)
372
- {
355
+ template <typename MatrixType>
356
+ inline Index RealSchur<MatrixType>::findSmallSubdiagEntry(Index iu, const Scalar& considerAsZero) {
373
357
  using std::abs;
374
358
  Index res = iu;
375
- while (res > 0)
376
- {
377
- 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));
378
361
 
379
362
  s = numext::maxi<Scalar>(s * NumTraits<Scalar>::epsilon(), considerAsZero);
380
-
381
- if (abs(m_matT.coeff(res,res-1)) <= s)
382
- break;
363
+
364
+ if (abs(m_matT.coeff(res, res - 1)) <= s) break;
383
365
  res--;
384
366
  }
385
367
  return res;
386
368
  }
387
369
 
388
370
  /** \internal Update T given that rows iu-1 and iu decouple from the rest. */
389
- template<typename MatrixType>
390
- inline void RealSchur<MatrixType>::splitOffTwoRows(Index iu, bool computeU, const Scalar& exshift)
391
- {
392
- using std::sqrt;
371
+ template <typename MatrixType>
372
+ inline void RealSchur<MatrixType>::splitOffTwoRows(Index iu, bool computeU, const Scalar& exshift) {
393
373
  using std::abs;
374
+ using std::sqrt;
394
375
  const Index size = m_matT.cols();
395
376
 
396
- // The eigenvalues of the 2x2 matrix [a b; c d] are
377
+ // The eigenvalues of the 2x2 matrix [a b; c d] are
397
378
  // trace +/- sqrt(discr/4) where discr = tr^2 - 4*det, tr = a + d, det = ad - bc
398
- Scalar p = Scalar(0.5) * (m_matT.coeff(iu-1,iu-1) - m_matT.coeff(iu,iu));
399
- Scalar q = p * p + m_matT.coeff(iu,iu-1) * m_matT.coeff(iu-1,iu); // q = tr^2 / 4 - det = discr/4
400
- m_matT.coeffRef(iu,iu) += exshift;
401
- 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;
402
383
 
403
- if (q >= Scalar(0)) // Two real eigenvalues
384
+ if (q >= Scalar(0)) // Two real eigenvalues
404
385
  {
405
386
  Scalar z = sqrt(abs(q));
406
387
  JacobiRotation<Scalar> rot;
407
388
  if (p >= Scalar(0))
408
- rot.makeGivens(p + z, m_matT.coeff(iu, iu-1));
389
+ rot.makeGivens(p + z, m_matT.coeff(iu, iu - 1));
409
390
  else
410
- rot.makeGivens(p - z, m_matT.coeff(iu, iu-1));
391
+ rot.makeGivens(p - z, m_matT.coeff(iu, iu - 1));
411
392
 
412
- m_matT.rightCols(size-iu+1).applyOnTheLeft(iu-1, iu, rot.adjoint());
413
- m_matT.topRows(iu+1).applyOnTheRight(iu-1, iu, rot);
414
- m_matT.coeffRef(iu, iu-1) = Scalar(0);
415
- if (computeU)
416
- 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);
417
397
  }
418
398
 
419
- if (iu > 1)
420
- m_matT.coeffRef(iu-1, iu-2) = Scalar(0);
399
+ if (iu > 1) m_matT.coeffRef(iu - 1, iu - 2) = Scalar(0);
421
400
  }
422
401
 
423
402
  /** \internal Form shift in shiftInfo, and update exshift if an exceptional shift is performed. */
424
- template<typename MatrixType>
425
- inline void RealSchur<MatrixType>::computeShift(Index iu, Index iter, Scalar& exshift, Vector3s& shiftInfo)
426
- {
427
- using std::sqrt;
403
+ template <typename MatrixType>
404
+ inline void RealSchur<MatrixType>::computeShift(Index iu, Index iter, Scalar& exshift, Vector3s& shiftInfo) {
428
405
  using std::abs;
429
- shiftInfo.coeffRef(0) = m_matT.coeff(iu,iu);
430
- shiftInfo.coeffRef(1) = m_matT.coeff(iu-1,iu-1);
431
- shiftInfo.coeffRef(2) = m_matT.coeff(iu,iu-1) * m_matT.coeff(iu-1,iu);
432
-
433
- // Wilkinson's original ad hoc shift
434
- if (iter == 10)
435
- {
436
- exshift += shiftInfo.coeff(0);
437
- for (Index i = 0; i <= iu; ++i)
438
- m_matT.coeffRef(i,i) -= shiftInfo.coeff(0);
439
- Scalar s = abs(m_matT.coeff(iu,iu-1)) + abs(m_matT.coeff(iu-1,iu-2));
440
- shiftInfo.coeffRef(0) = Scalar(0.75) * s;
441
- shiftInfo.coeffRef(1) = Scalar(0.75) * s;
442
- shiftInfo.coeffRef(2) = Scalar(-0.4375) * s * s;
443
- }
444
-
445
- // MATLAB's new ad hoc shift
446
- if (iter == 30)
447
- {
448
- Scalar s = (shiftInfo.coeff(1) - shiftInfo.coeff(0)) / Scalar(2.0);
449
- s = s * s + shiftInfo.coeff(2);
450
- if (s > Scalar(0))
451
- {
452
- s = sqrt(s);
453
- if (shiftInfo.coeff(1) < shiftInfo.coeff(0))
454
- s = -s;
455
- s = s + (shiftInfo.coeff(1) - shiftInfo.coeff(0)) / Scalar(2.0);
456
- s = shiftInfo.coeff(0) - shiftInfo.coeff(2) / s;
457
- exshift += s;
458
- for (Index i = 0; i <= iu; ++i)
459
- m_matT.coeffRef(i,i) -= s;
460
- 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
+ }
461
434
  }
462
435
  }
463
436
  }
464
437
 
465
438
  /** \internal Compute index im at which Francis QR step starts and the first Householder vector. */
466
- template<typename MatrixType>
467
- inline void RealSchur<MatrixType>::initFrancisQRStep(Index il, Index iu, const Vector3s& shiftInfo, Index& im, Vector3s& firstHouseholderVector)
468
- {
439
+ template <typename MatrixType>
440
+ inline void RealSchur<MatrixType>::initFrancisQRStep(Index il, Index iu, const Vector3s& shiftInfo, Index& im,
441
+ Vector3s& firstHouseholderVector) {
469
442
  using std::abs;
470
- Vector3s& v = firstHouseholderVector; // alias to save typing
443
+ Vector3s& v = firstHouseholderVector; // alias to save typing
471
444
 
472
- for (im = iu-2; im >= il; --im)
473
- {
474
- 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);
475
447
  const Scalar r = shiftInfo.coeff(0) - Tmm;
476
448
  const Scalar s = shiftInfo.coeff(1) - Tmm;
477
- v.coeffRef(0) = (r * s - shiftInfo.coeff(2)) / m_matT.coeff(im+1,im) + m_matT.coeff(im,im+1);
478
- v.coeffRef(1) = m_matT.coeff(im+1,im+1) - Tmm - r - s;
479
- 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);
480
452
  if (im == il) {
481
453
  break;
482
454
  }
483
- const Scalar lhs = m_matT.coeff(im,im-1) * (abs(v.coeff(1)) + abs(v.coeff(2)));
484
- const Scalar rhs = v.coeff(0) * (abs(m_matT.coeff(im-1,im-1)) + abs(Tmm) + abs(m_matT.coeff(im+1,im+1)));
485
- if (abs(lhs) < NumTraits<Scalar>::epsilon() * rhs)
486
- 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;
487
458
  }
488
459
  }
489
460
 
490
461
  /** \internal Perform a Francis QR step involving rows il:iu and columns im:iu. */
491
- template<typename MatrixType>
492
- inline void RealSchur<MatrixType>::performFrancisQRStep(Index il, Index im, Index iu, bool computeU, const Vector3s& firstHouseholderVector, Scalar* workspace)
493
- {
462
+ template <typename MatrixType>
463
+ inline void RealSchur<MatrixType>::performFrancisQRStep(Index il, Index im, Index iu, bool computeU,
464
+ const Vector3s& firstHouseholderVector, Scalar* workspace) {
494
465
  eigen_assert(im >= il);
495
- eigen_assert(im <= iu-2);
466
+ eigen_assert(im <= iu - 2);
496
467
 
497
468
  const Index size = m_matT.cols();
498
469
 
499
- for (Index k = im; k <= iu-2; ++k)
500
- {
470
+ for (Index k = im; k <= iu - 2; ++k) {
501
471
  bool firstIteration = (k == im);
502
472
 
503
473
  Vector3s v;
504
474
  if (firstIteration)
505
475
  v = firstHouseholderVector;
506
476
  else
507
- v = m_matT.template block<3,1>(k,k-1);
477
+ v = m_matT.template block<3, 1>(k, k - 1);
508
478
 
509
479
  Scalar tau, beta;
510
480
  Matrix<Scalar, 2, 1> ess;
511
481
  v.makeHouseholder(ess, tau, beta);
512
-
513
- if (beta != Scalar(0)) // if v is not zero
482
+
483
+ if (!numext::is_exactly_zero(beta)) // if v is not zero
514
484
  {
515
485
  if (firstIteration && k > il)
516
- 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);
517
487
  else if (!firstIteration)
518
- m_matT.coeffRef(k,k-1) = beta;
488
+ m_matT.coeffRef(k, k - 1) = beta;
519
489
 
520
490
  // These Householder transformations form the O(n^3) part of the algorithm
521
- m_matT.block(k, k, 3, size-k).applyHouseholderOnTheLeft(ess, tau, workspace);
522
- m_matT.block(0, k, (std::min)(iu,k+3) + 1, 3).applyHouseholderOnTheRight(ess, tau, workspace);
523
- if (computeU)
524
- 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);
525
494
  }
526
495
  }
527
496
 
528
- 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);
529
498
  Scalar tau, beta;
530
499
  Matrix<Scalar, 1, 1> ess;
531
500
  v.makeHouseholder(ess, tau, beta);
532
501
 
533
- if (beta != Scalar(0)) // if v is not zero
502
+ if (!numext::is_exactly_zero(beta)) // if v is not zero
534
503
  {
535
- m_matT.coeffRef(iu-1, iu-2) = beta;
536
- m_matT.block(iu-1, iu-1, 2, size-iu+1).applyHouseholderOnTheLeft(ess, tau, workspace);
537
- m_matT.block(0, iu-1, iu+1, 2).applyHouseholderOnTheRight(ess, tau, workspace);
538
- if (computeU)
539
- 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);
540
508
  }
541
509
 
542
510
  // clean up pollution due to round-off errors
543
- for (Index i = im+2; i <= iu; ++i)
544
- {
545
- m_matT.coeffRef(i,i-2) = Scalar(0);
546
- if (i > im+2)
547
- 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);
548
514
  }
549
515
  }
550
516
 
551
- } // end namespace Eigen
517
+ } // end namespace Eigen
552
518
 
553
- #endif // EIGEN_REAL_SCHUR_H
519
+ #endif // EIGEN_REAL_SCHUR_H