@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,426 +13,411 @@
13
13
 
14
14
  #include "./RealSchur.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 EigenSolver
22
- *
23
- * \brief Computes eigenvalues and eigenvectors of general matrices
24
- *
25
- * \tparam _MatrixType the type of the matrix of which we are computing the
26
- * eigendecomposition; this is expected to be an instantiation of the Matrix
27
- * class template. Currently, only real matrices are supported.
28
- *
29
- * The eigenvalues and eigenvectors of a matrix \f$ A \f$ are scalars
30
- * \f$ \lambda \f$ and vectors \f$ v \f$ such that \f$ Av = \lambda v \f$. If
31
- * \f$ D \f$ is a diagonal matrix with the eigenvalues on the diagonal, and
32
- * \f$ V \f$ is a matrix with the eigenvectors as its columns, then \f$ A V =
33
- * V D \f$. The matrix \f$ V \f$ is almost always invertible, in which case we
34
- * have \f$ A = V D V^{-1} \f$. This is called the eigendecomposition.
35
- *
36
- * The eigenvalues and eigenvectors of a matrix may be complex, even when the
37
- * matrix is real. However, we can choose real matrices \f$ V \f$ and \f$ D
38
- * \f$ satisfying \f$ A V = V D \f$, just like the eigendecomposition, if the
39
- * matrix \f$ D \f$ is not required to be diagonal, but if it is allowed to
40
- * have blocks of the form
41
- * \f[ \begin{bmatrix} u & v \\ -v & u \end{bmatrix} \f]
42
- * (where \f$ u \f$ and \f$ v \f$ are real numbers) on the diagonal. These
43
- * blocks correspond to complex eigenvalue pairs \f$ u \pm iv \f$. We call
44
- * this variant of the eigendecomposition the pseudo-eigendecomposition.
45
- *
46
- * Call the function compute() to compute the eigenvalues and eigenvectors of
47
- * a given matrix. Alternatively, you can use the
48
- * EigenSolver(const MatrixType&, bool) constructor which computes the
49
- * eigenvalues and eigenvectors at construction time. Once the eigenvalue and
50
- * eigenvectors are computed, they can be retrieved with the eigenvalues() and
51
- * eigenvectors() functions. The pseudoEigenvalueMatrix() and
52
- * pseudoEigenvectors() methods allow the construction of the
53
- * pseudo-eigendecomposition.
54
- *
55
- * The documentation for EigenSolver(const MatrixType&, bool) contains an
56
- * example of the typical use of this class.
57
- *
58
- * \note The implementation is adapted from
59
- * <a href="http://math.nist.gov/javanumerics/jama/">JAMA</a> (public domain).
60
- * Their code is based on EISPACK.
61
- *
62
- * \sa MatrixBase::eigenvalues(), class ComplexEigenSolver, class SelfAdjointEigenSolver
63
- */
64
- template<typename _MatrixType> class EigenSolver
65
- {
66
- public:
67
-
68
- /** \brief Synonym for the template parameter \p _MatrixType. */
69
- typedef _MatrixType MatrixType;
70
-
71
- enum {
72
- RowsAtCompileTime = MatrixType::RowsAtCompileTime,
73
- ColsAtCompileTime = MatrixType::ColsAtCompileTime,
74
- Options = MatrixType::Options,
75
- MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
76
- MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
77
- };
78
-
79
- /** \brief Scalar type for matrices of type #MatrixType. */
80
- typedef typename MatrixType::Scalar Scalar;
81
- typedef typename NumTraits<Scalar>::Real RealScalar;
82
- typedef Eigen::Index Index; ///< \deprecated since Eigen 3.3
83
-
84
- /** \brief Complex scalar type for #MatrixType.
85
- *
86
- * This is \c std::complex<Scalar> if #Scalar is real (e.g.,
87
- * \c float or \c double) and just \c Scalar if #Scalar is
88
- * complex.
89
- */
90
- typedef std::complex<RealScalar> ComplexScalar;
91
-
92
- /** \brief Type for vector of eigenvalues as returned by eigenvalues().
93
- *
94
- * This is a column vector with entries of type #ComplexScalar.
95
- * The length of the vector is the size of #MatrixType.
96
- */
97
- typedef Matrix<ComplexScalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> EigenvalueType;
98
-
99
- /** \brief Type for matrix of eigenvectors as returned by eigenvectors().
100
- *
101
- * This is a square matrix with entries of type #ComplexScalar.
102
- * The size is the same as the size of #MatrixType.
103
- */
104
- typedef Matrix<ComplexScalar, RowsAtCompileTime, ColsAtCompileTime, Options, MaxRowsAtCompileTime, MaxColsAtCompileTime> EigenvectorsType;
105
-
106
- /** \brief Default constructor.
107
- *
108
- * The default constructor is useful in cases in which the user intends to
109
- * perform decompositions via EigenSolver::compute(const MatrixType&, bool).
110
- *
111
- * \sa compute() for an example.
112
- */
113
- EigenSolver() : m_eivec(), m_eivalues(), m_isInitialized(false), m_realSchur(), m_matT(), m_tmp() {}
114
-
115
- /** \brief Default constructor with memory preallocation
116
- *
117
- * Like the default constructor but with preallocation of the internal data
118
- * according to the specified problem \a size.
119
- * \sa EigenSolver()
120
- */
121
- explicit EigenSolver(Index size)
22
+ *
23
+ *
24
+ * \class EigenSolver
25
+ *
26
+ * \brief Computes eigenvalues and eigenvectors of general matrices
27
+ *
28
+ * \tparam MatrixType_ the type of the matrix of which we are computing the
29
+ * eigendecomposition; this is expected to be an instantiation of the Matrix
30
+ * class template. Currently, only real matrices are supported.
31
+ *
32
+ * The eigenvalues and eigenvectors of a matrix \f$ A \f$ are scalars
33
+ * \f$ \lambda \f$ and vectors \f$ v \f$ such that \f$ Av = \lambda v \f$. If
34
+ * \f$ D \f$ is a diagonal matrix with the eigenvalues on the diagonal, and
35
+ * \f$ V \f$ is a matrix with the eigenvectors as its columns, then \f$ A V =
36
+ * V D \f$. The matrix \f$ V \f$ is almost always invertible, in which case we
37
+ * have \f$ A = V D V^{-1} \f$. This is called the eigendecomposition.
38
+ *
39
+ * The eigenvalues and eigenvectors of a matrix may be complex, even when the
40
+ * matrix is real. However, we can choose real matrices \f$ V \f$ and \f$ D
41
+ * \f$ satisfying \f$ A V = V D \f$, just like the eigendecomposition, if the
42
+ * matrix \f$ D \f$ is not required to be diagonal, but if it is allowed to
43
+ * have blocks of the form
44
+ * \f[ \begin{bmatrix} u & v \\ -v & u \end{bmatrix} \f]
45
+ * (where \f$ u \f$ and \f$ v \f$ are real numbers) on the diagonal. These
46
+ * blocks correspond to complex eigenvalue pairs \f$ u \pm iv \f$. We call
47
+ * this variant of the eigendecomposition the pseudo-eigendecomposition.
48
+ *
49
+ * Call the function compute() to compute the eigenvalues and eigenvectors of
50
+ * a given matrix. Alternatively, you can use the
51
+ * EigenSolver(const MatrixType&, bool) constructor which computes the
52
+ * eigenvalues and eigenvectors at construction time. Once the eigenvalue and
53
+ * eigenvectors are computed, they can be retrieved with the eigenvalues() and
54
+ * eigenvectors() functions. The pseudoEigenvalueMatrix() and
55
+ * pseudoEigenvectors() methods allow the construction of the
56
+ * pseudo-eigendecomposition.
57
+ *
58
+ * The documentation for EigenSolver(const MatrixType&, bool) contains an
59
+ * example of the typical use of this class.
60
+ *
61
+ * \note The implementation is adapted from
62
+ * <a href="http://math.nist.gov/javanumerics/jama/">JAMA</a> (public domain).
63
+ * Their code is based on EISPACK.
64
+ *
65
+ * \sa MatrixBase::eigenvalues(), class ComplexEigenSolver, class SelfAdjointEigenSolver
66
+ */
67
+ template <typename MatrixType_>
68
+ class EigenSolver {
69
+ public:
70
+ /** \brief Synonym for the template parameter \p MatrixType_. */
71
+ typedef MatrixType_ MatrixType;
72
+
73
+ enum {
74
+ RowsAtCompileTime = MatrixType::RowsAtCompileTime,
75
+ ColsAtCompileTime = MatrixType::ColsAtCompileTime,
76
+ Options = internal::traits<MatrixType>::Options,
77
+ MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
78
+ MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
79
+ };
80
+
81
+ /** \brief Scalar type for matrices of type #MatrixType. */
82
+ typedef typename MatrixType::Scalar Scalar;
83
+ typedef typename NumTraits<Scalar>::Real RealScalar;
84
+ typedef Eigen::Index Index; ///< \deprecated since Eigen 3.3
85
+
86
+ /** \brief Complex scalar type for #MatrixType.
87
+ *
88
+ * This is \c std::complex<Scalar> if #Scalar is real (e.g.,
89
+ * \c float or \c double) and just \c Scalar if #Scalar is
90
+ * complex.
91
+ */
92
+ typedef internal::make_complex_t<Scalar> ComplexScalar;
93
+
94
+ /** \brief Type for vector of eigenvalues as returned by eigenvalues().
95
+ *
96
+ * This is a column vector with entries of type #ComplexScalar.
97
+ * The length of the vector is the size of #MatrixType.
98
+ */
99
+ typedef Matrix<ComplexScalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> EigenvalueType;
100
+
101
+ /** \brief Type for matrix of eigenvectors as returned by eigenvectors().
102
+ *
103
+ * This is a square matrix with entries of type #ComplexScalar.
104
+ * The size is the same as the size of #MatrixType.
105
+ */
106
+ typedef Matrix<ComplexScalar, RowsAtCompileTime, ColsAtCompileTime, Options, MaxRowsAtCompileTime,
107
+ MaxColsAtCompileTime>
108
+ EigenvectorsType;
109
+
110
+ /** \brief Default constructor.
111
+ *
112
+ * The default constructor is useful in cases in which the user intends to
113
+ * perform decompositions via EigenSolver::compute(const MatrixType&, bool).
114
+ *
115
+ * \sa compute() for an example.
116
+ */
117
+ EigenSolver()
118
+ : m_eivec(), m_eivalues(), m_isInitialized(false), m_eigenvectorsOk(false), m_realSchur(), m_matT(), m_tmp() {}
119
+
120
+ /** \brief Default constructor with memory preallocation
121
+ *
122
+ * Like the default constructor but with preallocation of the internal data
123
+ * according to the specified problem \a size.
124
+ * \sa EigenSolver()
125
+ */
126
+ explicit EigenSolver(Index size)
122
127
  : m_eivec(size, size),
123
128
  m_eivalues(size),
124
129
  m_isInitialized(false),
125
130
  m_eigenvectorsOk(false),
126
131
  m_realSchur(size),
127
- m_matT(size, size),
128
- m_tmp(size)
129
- {}
130
-
131
- /** \brief Constructor; computes eigendecomposition of given matrix.
132
- *
133
- * \param[in] matrix Square matrix whose eigendecomposition is to be computed.
134
- * \param[in] computeEigenvectors If true, both the eigenvectors and the
135
- * eigenvalues are computed; if false, only the eigenvalues are
136
- * computed.
137
- *
138
- * This constructor calls compute() to compute the eigenvalues
139
- * and eigenvectors.
140
- *
141
- * Example: \include EigenSolver_EigenSolver_MatrixType.cpp
142
- * Output: \verbinclude EigenSolver_EigenSolver_MatrixType.out
143
- *
144
- * \sa compute()
145
- */
146
- template<typename InputType>
147
- explicit EigenSolver(const EigenBase<InputType>& matrix, bool computeEigenvectors = true)
132
+ m_matT(size, size),
133
+ m_tmp(size) {}
134
+
135
+ /** \brief Constructor; computes eigendecomposition of given matrix.
136
+ *
137
+ * \param[in] matrix Square matrix whose eigendecomposition is to be computed.
138
+ * \param[in] computeEigenvectors If true, both the eigenvectors and the
139
+ * eigenvalues are computed; if false, only the eigenvalues are
140
+ * computed.
141
+ *
142
+ * This constructor calls compute() to compute the eigenvalues
143
+ * and eigenvectors.
144
+ *
145
+ * Example: \include EigenSolver_EigenSolver_MatrixType.cpp
146
+ * Output: \verbinclude EigenSolver_EigenSolver_MatrixType.out
147
+ *
148
+ * \sa compute()
149
+ */
150
+ template <typename InputType>
151
+ explicit EigenSolver(const EigenBase<InputType>& matrix, bool computeEigenvectors = true)
148
152
  : m_eivec(matrix.rows(), matrix.cols()),
149
153
  m_eivalues(matrix.cols()),
150
154
  m_isInitialized(false),
151
155
  m_eigenvectorsOk(false),
152
156
  m_realSchur(matrix.cols()),
153
- m_matT(matrix.rows(), matrix.cols()),
154
- m_tmp(matrix.cols())
155
- {
156
- compute(matrix.derived(), computeEigenvectors);
157
- }
157
+ m_matT(matrix.rows(), matrix.cols()),
158
+ m_tmp(matrix.cols()) {
159
+ compute(matrix.derived(), computeEigenvectors);
160
+ }
158
161
 
159
- /** \brief Returns the eigenvectors of given matrix.
160
- *
161
- * \returns %Matrix whose columns are the (possibly complex) eigenvectors.
162
- *
163
- * \pre Either the constructor
164
- * EigenSolver(const MatrixType&,bool) or the member function
165
- * compute(const MatrixType&, bool) has been called before, and
166
- * \p computeEigenvectors was set to true (the default).
167
- *
168
- * Column \f$ k \f$ of the returned matrix is an eigenvector corresponding
169
- * to eigenvalue number \f$ k \f$ as returned by eigenvalues(). The
170
- * eigenvectors are normalized to have (Euclidean) norm equal to one. The
171
- * matrix returned by this function is the matrix \f$ V \f$ in the
172
- * eigendecomposition \f$ A = V D V^{-1} \f$, if it exists.
173
- *
174
- * Example: \include EigenSolver_eigenvectors.cpp
175
- * Output: \verbinclude EigenSolver_eigenvectors.out
176
- *
177
- * \sa eigenvalues(), pseudoEigenvectors()
178
- */
179
- EigenvectorsType eigenvectors() const;
180
-
181
- /** \brief Returns the pseudo-eigenvectors of given matrix.
182
- *
183
- * \returns Const reference to matrix whose columns are the pseudo-eigenvectors.
184
- *
185
- * \pre Either the constructor
186
- * EigenSolver(const MatrixType&,bool) or the member function
187
- * compute(const MatrixType&, bool) has been called before, and
188
- * \p computeEigenvectors was set to true (the default).
189
- *
190
- * The real matrix \f$ V \f$ returned by this function and the
191
- * block-diagonal matrix \f$ D \f$ returned by pseudoEigenvalueMatrix()
192
- * satisfy \f$ AV = VD \f$.
193
- *
194
- * Example: \include EigenSolver_pseudoEigenvectors.cpp
195
- * Output: \verbinclude EigenSolver_pseudoEigenvectors.out
196
- *
197
- * \sa pseudoEigenvalueMatrix(), eigenvectors()
198
- */
199
- const MatrixType& pseudoEigenvectors() const
200
- {
201
- eigen_assert(m_isInitialized && "EigenSolver is not initialized.");
202
- eigen_assert(m_eigenvectorsOk && "The eigenvectors have not been computed together with the eigenvalues.");
203
- return m_eivec;
204
- }
162
+ /** \brief Returns the eigenvectors of given matrix.
163
+ *
164
+ * \returns %Matrix whose columns are the (possibly complex) eigenvectors.
165
+ *
166
+ * \pre Either the constructor
167
+ * EigenSolver(const MatrixType&,bool) or the member function
168
+ * compute(const MatrixType&, bool) has been called before, and
169
+ * \p computeEigenvectors was set to true (the default).
170
+ *
171
+ * Column \f$ k \f$ of the returned matrix is an eigenvector corresponding
172
+ * to eigenvalue number \f$ k \f$ as returned by eigenvalues(). The
173
+ * eigenvectors are normalized to have (Euclidean) norm equal to one. The
174
+ * matrix returned by this function is the matrix \f$ V \f$ in the
175
+ * eigendecomposition \f$ A = V D V^{-1} \f$, if it exists.
176
+ *
177
+ * Example: \include EigenSolver_eigenvectors.cpp
178
+ * Output: \verbinclude EigenSolver_eigenvectors.out
179
+ *
180
+ * \sa eigenvalues(), pseudoEigenvectors()
181
+ */
182
+ EigenvectorsType eigenvectors() const;
183
+
184
+ /** \brief Returns the pseudo-eigenvectors of given matrix.
185
+ *
186
+ * \returns Const reference to matrix whose columns are the pseudo-eigenvectors.
187
+ *
188
+ * \pre Either the constructor
189
+ * EigenSolver(const MatrixType&,bool) or the member function
190
+ * compute(const MatrixType&, bool) has been called before, and
191
+ * \p computeEigenvectors was set to true (the default).
192
+ *
193
+ * The real matrix \f$ V \f$ returned by this function and the
194
+ * block-diagonal matrix \f$ D \f$ returned by pseudoEigenvalueMatrix()
195
+ * satisfy \f$ AV = VD \f$.
196
+ *
197
+ * Example: \include EigenSolver_pseudoEigenvectors.cpp
198
+ * Output: \verbinclude EigenSolver_pseudoEigenvectors.out
199
+ *
200
+ * \sa pseudoEigenvalueMatrix(), eigenvectors()
201
+ */
202
+ const MatrixType& pseudoEigenvectors() const {
203
+ eigen_assert(m_isInitialized && "EigenSolver is not initialized.");
204
+ eigen_assert(m_eigenvectorsOk && "The eigenvectors have not been computed together with the eigenvalues.");
205
+ return m_eivec;
206
+ }
205
207
 
206
- /** \brief Returns the block-diagonal matrix in the pseudo-eigendecomposition.
207
- *
208
- * \returns A block-diagonal matrix.
209
- *
210
- * \pre Either the constructor
211
- * EigenSolver(const MatrixType&,bool) or the member function
212
- * compute(const MatrixType&, bool) has been called before.
213
- *
214
- * The matrix \f$ D \f$ returned by this function is real and
215
- * block-diagonal. The blocks on the diagonal are either 1-by-1 or 2-by-2
216
- * blocks of the form
217
- * \f$ \begin{bmatrix} u & v \\ -v & u \end{bmatrix} \f$.
218
- * These blocks are not sorted in any particular order.
219
- * The matrix \f$ D \f$ and the matrix \f$ V \f$ returned by
220
- * pseudoEigenvectors() satisfy \f$ AV = VD \f$.
221
- *
222
- * \sa pseudoEigenvectors() for an example, eigenvalues()
223
- */
224
- MatrixType pseudoEigenvalueMatrix() const;
225
-
226
- /** \brief Returns the eigenvalues of given matrix.
227
- *
228
- * \returns A const reference to the column vector containing the eigenvalues.
229
- *
230
- * \pre Either the constructor
231
- * EigenSolver(const MatrixType&,bool) or the member function
232
- * compute(const MatrixType&, bool) has been called before.
233
- *
234
- * The eigenvalues are repeated according to their algebraic multiplicity,
235
- * so there are as many eigenvalues as rows in the matrix. The eigenvalues
236
- * are not sorted in any particular order.
237
- *
238
- * Example: \include EigenSolver_eigenvalues.cpp
239
- * Output: \verbinclude EigenSolver_eigenvalues.out
240
- *
241
- * \sa eigenvectors(), pseudoEigenvalueMatrix(),
242
- * MatrixBase::eigenvalues()
243
- */
244
- const EigenvalueType& eigenvalues() const
245
- {
246
- eigen_assert(m_isInitialized && "EigenSolver is not initialized.");
247
- return m_eivalues;
248
- }
208
+ /** \brief Returns the block-diagonal matrix in the pseudo-eigendecomposition.
209
+ *
210
+ * \returns A block-diagonal matrix.
211
+ *
212
+ * \pre Either the constructor
213
+ * EigenSolver(const MatrixType&,bool) or the member function
214
+ * compute(const MatrixType&, bool) has been called before.
215
+ *
216
+ * The matrix \f$ D \f$ returned by this function is real and
217
+ * block-diagonal. The blocks on the diagonal are either 1-by-1 or 2-by-2
218
+ * blocks of the form
219
+ * \f$ \begin{bmatrix} u & v \\ -v & u \end{bmatrix} \f$.
220
+ * These blocks are not sorted in any particular order.
221
+ * The matrix \f$ D \f$ and the matrix \f$ V \f$ returned by
222
+ * pseudoEigenvectors() satisfy \f$ AV = VD \f$.
223
+ *
224
+ * \sa pseudoEigenvectors() for an example, eigenvalues()
225
+ */
226
+ MatrixType pseudoEigenvalueMatrix() const;
227
+
228
+ /** \brief Returns the eigenvalues of given matrix.
229
+ *
230
+ * \returns A const reference to the column vector containing the eigenvalues.
231
+ *
232
+ * \pre Either the constructor
233
+ * EigenSolver(const MatrixType&,bool) or the member function
234
+ * compute(const MatrixType&, bool) has been called before.
235
+ *
236
+ * The eigenvalues are repeated according to their algebraic multiplicity,
237
+ * so there are as many eigenvalues as rows in the matrix. The eigenvalues
238
+ * are not sorted in any particular order.
239
+ *
240
+ * Example: \include EigenSolver_eigenvalues.cpp
241
+ * Output: \verbinclude EigenSolver_eigenvalues.out
242
+ *
243
+ * \sa eigenvectors(), pseudoEigenvalueMatrix(),
244
+ * MatrixBase::eigenvalues()
245
+ */
246
+ const EigenvalueType& eigenvalues() const {
247
+ eigen_assert(m_isInitialized && "EigenSolver is not initialized.");
248
+ return m_eivalues;
249
+ }
249
250
 
250
- /** \brief Computes eigendecomposition of given matrix.
251
- *
252
- * \param[in] matrix Square matrix whose eigendecomposition is to be computed.
253
- * \param[in] computeEigenvectors If true, both the eigenvectors and the
254
- * eigenvalues are computed; if false, only the eigenvalues are
255
- * computed.
256
- * \returns Reference to \c *this
257
- *
258
- * This function computes the eigenvalues of the real matrix \p matrix.
259
- * The eigenvalues() function can be used to retrieve them. If
260
- * \p computeEigenvectors is true, then the eigenvectors are also computed
261
- * and can be retrieved by calling eigenvectors().
262
- *
263
- * The matrix is first reduced to real Schur form using the RealSchur
264
- * class. The Schur decomposition is then used to compute the eigenvalues
265
- * and eigenvectors.
266
- *
267
- * The cost of the computation is dominated by the cost of the
268
- * Schur decomposition, which is very approximately \f$ 25n^3 \f$
269
- * (where \f$ n \f$ is the size of the matrix) if \p computeEigenvectors
270
- * is true, and \f$ 10n^3 \f$ if \p computeEigenvectors is false.
271
- *
272
- * This method reuses of the allocated data in the EigenSolver object.
273
- *
274
- * Example: \include EigenSolver_compute.cpp
275
- * Output: \verbinclude EigenSolver_compute.out
276
- */
277
- template<typename InputType>
278
- EigenSolver& compute(const EigenBase<InputType>& matrix, bool computeEigenvectors = true);
279
-
280
- /** \returns NumericalIssue if the input contains INF or NaN values or overflow occured. Returns Success otherwise. */
281
- ComputationInfo info() const
282
- {
283
- eigen_assert(m_isInitialized && "EigenSolver is not initialized.");
284
- return m_info;
285
- }
251
+ /** \brief Computes eigendecomposition of given matrix.
252
+ *
253
+ * \param[in] matrix Square matrix whose eigendecomposition is to be computed.
254
+ * \param[in] computeEigenvectors If true, both the eigenvectors and the
255
+ * eigenvalues are computed; if false, only the eigenvalues are
256
+ * computed.
257
+ * \returns Reference to \c *this
258
+ *
259
+ * This function computes the eigenvalues of the real matrix \p matrix.
260
+ * The eigenvalues() function can be used to retrieve them. If
261
+ * \p computeEigenvectors is true, then the eigenvectors are also computed
262
+ * and can be retrieved by calling eigenvectors().
263
+ *
264
+ * The matrix is first reduced to real Schur form using the RealSchur
265
+ * class. The Schur decomposition is then used to compute the eigenvalues
266
+ * and eigenvectors.
267
+ *
268
+ * The cost of the computation is dominated by the cost of the
269
+ * Schur decomposition, which is very approximately \f$ 25n^3 \f$
270
+ * (where \f$ n \f$ is the size of the matrix) if \p computeEigenvectors
271
+ * is true, and \f$ 10n^3 \f$ if \p computeEigenvectors is false.
272
+ *
273
+ * This method reuses of the allocated data in the EigenSolver object.
274
+ *
275
+ * Example: \include EigenSolver_compute.cpp
276
+ * Output: \verbinclude EigenSolver_compute.out
277
+ */
278
+ template <typename InputType>
279
+ EigenSolver& compute(const EigenBase<InputType>& matrix, bool computeEigenvectors = true);
280
+
281
+ /** \returns NumericalIssue if the input contains INF or NaN values or overflow occurred. Returns Success otherwise.
282
+ */
283
+ ComputationInfo info() const {
284
+ eigen_assert(m_isInitialized && "EigenSolver is not initialized.");
285
+ return m_info;
286
+ }
286
287
 
287
- /** \brief Sets the maximum number of iterations allowed. */
288
- EigenSolver& setMaxIterations(Index maxIters)
289
- {
290
- m_realSchur.setMaxIterations(maxIters);
291
- return *this;
292
- }
288
+ /** \brief Sets the maximum number of iterations allowed. */
289
+ EigenSolver& setMaxIterations(Index maxIters) {
290
+ m_realSchur.setMaxIterations(maxIters);
291
+ return *this;
292
+ }
293
293
 
294
- /** \brief Returns the maximum number of iterations. */
295
- Index getMaxIterations()
296
- {
297
- return m_realSchur.getMaxIterations();
298
- }
294
+ /** \brief Returns the maximum number of iterations. */
295
+ Index getMaxIterations() { return m_realSchur.getMaxIterations(); }
299
296
 
300
- private:
301
- void doComputeEigenvectors();
297
+ private:
298
+ void doComputeEigenvectors();
302
299
 
303
- protected:
304
-
305
- static void check_template_parameters()
306
- {
307
- EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar);
308
- EIGEN_STATIC_ASSERT(!NumTraits<Scalar>::IsComplex, NUMERIC_TYPE_MUST_BE_REAL);
309
- }
310
-
311
- MatrixType m_eivec;
312
- EigenvalueType m_eivalues;
313
- bool m_isInitialized;
314
- bool m_eigenvectorsOk;
315
- ComputationInfo m_info;
316
- RealSchur<MatrixType> m_realSchur;
317
- MatrixType m_matT;
318
-
319
- typedef Matrix<Scalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> ColumnVectorType;
320
- ColumnVectorType m_tmp;
300
+ protected:
301
+ static void check_template_parameters() {
302
+ EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar);
303
+ EIGEN_STATIC_ASSERT(!NumTraits<Scalar>::IsComplex, NUMERIC_TYPE_MUST_BE_REAL);
304
+ }
305
+
306
+ MatrixType m_eivec;
307
+ EigenvalueType m_eivalues;
308
+ bool m_isInitialized;
309
+ bool m_eigenvectorsOk;
310
+ ComputationInfo m_info;
311
+ RealSchur<MatrixType> m_realSchur;
312
+ MatrixType m_matT;
313
+
314
+ typedef Matrix<Scalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> ColumnVectorType;
315
+ ColumnVectorType m_tmp;
321
316
  };
322
317
 
323
- template<typename MatrixType>
324
- MatrixType EigenSolver<MatrixType>::pseudoEigenvalueMatrix() const
325
- {
318
+ template <typename MatrixType>
319
+ MatrixType EigenSolver<MatrixType>::pseudoEigenvalueMatrix() const {
326
320
  eigen_assert(m_isInitialized && "EigenSolver is not initialized.");
327
- const RealScalar precision = RealScalar(2)*NumTraits<RealScalar>::epsilon();
328
- Index n = m_eivalues.rows();
329
- MatrixType matD = MatrixType::Zero(n,n);
330
- for (Index i=0; i<n; ++i)
331
- {
332
- if (internal::isMuchSmallerThan(numext::imag(m_eivalues.coeff(i)), numext::real(m_eivalues.coeff(i)), precision))
333
- matD.coeffRef(i,i) = numext::real(m_eivalues.coeff(i));
334
- else
335
- {
336
- matD.template block<2,2>(i,i) << numext::real(m_eivalues.coeff(i)), numext::imag(m_eivalues.coeff(i)),
337
- -numext::imag(m_eivalues.coeff(i)), numext::real(m_eivalues.coeff(i));
321
+ const RealScalar precision = RealScalar(2) * NumTraits<RealScalar>::epsilon();
322
+ const Index n = m_eivalues.rows();
323
+ MatrixType matD = MatrixType::Zero(n, n);
324
+ Index i = 0;
325
+ for (; i < n - 1; ++i) {
326
+ RealScalar real = numext::real(m_eivalues.coeff(i));
327
+ RealScalar imag = numext::imag(m_eivalues.coeff(i));
328
+ matD.coeffRef(i, i) = real;
329
+ if (!internal::isMuchSmallerThan(imag, real, precision)) {
330
+ matD.coeffRef(i, i + 1) = imag;
331
+ matD.coeffRef(i + 1, i) = -imag;
332
+ matD.coeffRef(i + 1, i + 1) = real;
338
333
  ++i;
339
334
  }
340
335
  }
336
+ if (i == n - 1) {
337
+ matD.coeffRef(i, i) = numext::real(m_eivalues.coeff(i));
338
+ }
339
+
341
340
  return matD;
342
341
  }
343
342
 
344
- template<typename MatrixType>
345
- typename EigenSolver<MatrixType>::EigenvectorsType EigenSolver<MatrixType>::eigenvectors() const
346
- {
343
+ template <typename MatrixType>
344
+ typename EigenSolver<MatrixType>::EigenvectorsType EigenSolver<MatrixType>::eigenvectors() const {
347
345
  eigen_assert(m_isInitialized && "EigenSolver is not initialized.");
348
346
  eigen_assert(m_eigenvectorsOk && "The eigenvectors have not been computed together with the eigenvalues.");
349
- const RealScalar precision = RealScalar(2)*NumTraits<RealScalar>::epsilon();
347
+ const RealScalar precision = RealScalar(2) * NumTraits<RealScalar>::epsilon();
350
348
  Index n = m_eivec.cols();
351
- EigenvectorsType matV(n,n);
352
- for (Index j=0; j<n; ++j)
353
- {
354
- if (internal::isMuchSmallerThan(numext::imag(m_eivalues.coeff(j)), numext::real(m_eivalues.coeff(j)), precision) || j+1==n)
355
- {
349
+ EigenvectorsType matV(n, n);
350
+ for (Index j = 0; j < n; ++j) {
351
+ if (internal::isMuchSmallerThan(numext::imag(m_eivalues.coeff(j)), numext::real(m_eivalues.coeff(j)), precision) ||
352
+ j + 1 == n) {
356
353
  // we have a real eigen value
357
354
  matV.col(j) = m_eivec.col(j).template cast<ComplexScalar>();
358
355
  matV.col(j).normalize();
359
- }
360
- else
361
- {
356
+ } else {
362
357
  // we have a pair of complex eigen values
363
- for (Index i=0; i<n; ++i)
364
- {
365
- matV.coeffRef(i,j) = ComplexScalar(m_eivec.coeff(i,j), m_eivec.coeff(i,j+1));
366
- matV.coeffRef(i,j+1) = ComplexScalar(m_eivec.coeff(i,j), -m_eivec.coeff(i,j+1));
358
+ for (Index i = 0; i < n; ++i) {
359
+ matV.coeffRef(i, j) = ComplexScalar(m_eivec.coeff(i, j), m_eivec.coeff(i, j + 1));
360
+ matV.coeffRef(i, j + 1) = ComplexScalar(m_eivec.coeff(i, j), -m_eivec.coeff(i, j + 1));
367
361
  }
368
362
  matV.col(j).normalize();
369
- matV.col(j+1).normalize();
363
+ matV.col(j + 1).normalize();
370
364
  ++j;
371
365
  }
372
366
  }
373
367
  return matV;
374
368
  }
375
369
 
376
- template<typename MatrixType>
377
- template<typename InputType>
378
- EigenSolver<MatrixType>&
379
- EigenSolver<MatrixType>::compute(const EigenBase<InputType>& matrix, bool computeEigenvectors)
380
- {
370
+ template <typename MatrixType>
371
+ template <typename InputType>
372
+ EigenSolver<MatrixType>& EigenSolver<MatrixType>::compute(const EigenBase<InputType>& matrix,
373
+ bool computeEigenvectors) {
381
374
  check_template_parameters();
382
-
383
- using std::sqrt;
384
- using std::abs;
375
+
385
376
  using numext::isfinite;
377
+ using std::abs;
378
+ using std::sqrt;
386
379
  eigen_assert(matrix.cols() == matrix.rows());
387
380
 
388
381
  // Reduce to real Schur form.
389
382
  m_realSchur.compute(matrix.derived(), computeEigenvectors);
390
-
383
+
391
384
  m_info = m_realSchur.info();
392
385
 
393
- if (m_info == Success)
394
- {
386
+ if (m_info == Success) {
395
387
  m_matT = m_realSchur.matrixT();
396
- if (computeEigenvectors)
397
- m_eivec = m_realSchur.matrixU();
398
-
388
+ if (computeEigenvectors) m_eivec = m_realSchur.matrixU();
389
+
399
390
  // Compute eigenvalues from matT
400
391
  m_eivalues.resize(matrix.cols());
401
392
  Index i = 0;
402
- while (i < matrix.cols())
403
- {
404
- if (i == matrix.cols() - 1 || m_matT.coeff(i+1, i) == Scalar(0))
405
- {
393
+ while (i < matrix.cols()) {
394
+ if (i == matrix.cols() - 1 || m_matT.coeff(i + 1, i) == Scalar(0)) {
406
395
  m_eivalues.coeffRef(i) = m_matT.coeff(i, i);
407
- if(!(isfinite)(m_eivalues.coeffRef(i)))
408
- {
396
+ if (!(isfinite)(m_eivalues.coeffRef(i))) {
409
397
  m_isInitialized = true;
410
398
  m_eigenvectorsOk = false;
411
399
  m_info = NumericalIssue;
412
400
  return *this;
413
401
  }
414
402
  ++i;
415
- }
416
- else
417
- {
418
- Scalar p = Scalar(0.5) * (m_matT.coeff(i, i) - m_matT.coeff(i+1, i+1));
403
+ } else {
404
+ Scalar p = Scalar(0.5) * (m_matT.coeff(i, i) - m_matT.coeff(i + 1, i + 1));
419
405
  Scalar z;
420
406
  // Compute z = sqrt(abs(p * p + m_matT.coeff(i+1, i) * m_matT.coeff(i, i+1)));
421
407
  // without overflow
422
408
  {
423
- Scalar t0 = m_matT.coeff(i+1, i);
424
- Scalar t1 = m_matT.coeff(i, i+1);
425
- Scalar maxval = numext::maxi<Scalar>(abs(p),numext::maxi<Scalar>(abs(t0),abs(t1)));
409
+ Scalar t0 = m_matT.coeff(i + 1, i);
410
+ Scalar t1 = m_matT.coeff(i, i + 1);
411
+ Scalar maxval = numext::maxi<Scalar>(abs(p), numext::maxi<Scalar>(abs(t0), abs(t1)));
426
412
  t0 /= maxval;
427
413
  t1 /= maxval;
428
- Scalar p0 = p/maxval;
414
+ Scalar p0 = p / maxval;
429
415
  z = maxval * sqrt(abs(p0 * p0 + t0 * t1));
430
416
  }
431
-
432
- m_eivalues.coeffRef(i) = ComplexScalar(m_matT.coeff(i+1, i+1) + p, z);
433
- m_eivalues.coeffRef(i+1) = ComplexScalar(m_matT.coeff(i+1, i+1) + p, -z);
434
- if(!((isfinite)(m_eivalues.coeffRef(i)) && (isfinite)(m_eivalues.coeffRef(i+1))))
435
- {
417
+
418
+ m_eivalues.coeffRef(i) = ComplexScalar(m_matT.coeff(i + 1, i + 1) + p, z);
419
+ m_eivalues.coeffRef(i + 1) = ComplexScalar(m_matT.coeff(i + 1, i + 1) + p, -z);
420
+ if (!((isfinite)(m_eivalues.coeffRef(i)) && (isfinite)(m_eivalues.coeffRef(i + 1)))) {
436
421
  m_isInitialized = true;
437
422
  m_eigenvectorsOk = false;
438
423
  m_info = NumericalIssue;
@@ -441,10 +426,9 @@ EigenSolver<MatrixType>::compute(const EigenBase<InputType>& matrix, bool comput
441
426
  i += 2;
442
427
  }
443
428
  }
444
-
429
+
445
430
  // Compute eigenvectors.
446
- if (computeEigenvectors)
447
- doComputeEigenvectors();
431
+ if (computeEigenvectors) doComputeEigenvectors();
448
432
  }
449
433
 
450
434
  m_isInitialized = true;
@@ -453,170 +437,143 @@ EigenSolver<MatrixType>::compute(const EigenBase<InputType>& matrix, bool comput
453
437
  return *this;
454
438
  }
455
439
 
456
-
457
- template<typename MatrixType>
458
- void EigenSolver<MatrixType>::doComputeEigenvectors()
459
- {
440
+ template <typename MatrixType>
441
+ void EigenSolver<MatrixType>::doComputeEigenvectors() {
460
442
  using std::abs;
461
443
  const Index size = m_eivec.cols();
462
444
  const Scalar eps = NumTraits<Scalar>::epsilon();
463
445
 
464
446
  // inefficient! this is already computed in RealSchur
465
447
  Scalar norm(0);
466
- for (Index j = 0; j < size; ++j)
467
- {
468
- norm += m_matT.row(j).segment((std::max)(j-1,Index(0)), size-(std::max)(j-1,Index(0))).cwiseAbs().sum();
448
+ for (Index j = 0; j < size; ++j) {
449
+ norm += m_matT.row(j).segment((std::max)(j - 1, Index(0)), size - (std::max)(j - 1, Index(0))).cwiseAbs().sum();
469
450
  }
470
-
451
+
471
452
  // Backsubstitute to find vectors of upper triangular form
472
- if (norm == Scalar(0))
473
- {
453
+ if (norm == Scalar(0)) {
474
454
  return;
475
455
  }
476
456
 
477
- for (Index n = size-1; n >= 0; n--)
478
- {
457
+ for (Index n = size - 1; n >= 0; n--) {
479
458
  Scalar p = m_eivalues.coeff(n).real();
480
459
  Scalar q = m_eivalues.coeff(n).imag();
481
460
 
482
461
  // Scalar vector
483
- if (q == Scalar(0))
484
- {
462
+ if (q == Scalar(0)) {
485
463
  Scalar lastr(0), lastw(0);
486
464
  Index l = n;
487
465
 
488
- m_matT.coeffRef(n,n) = Scalar(1);
489
- for (Index i = n-1; i >= 0; i--)
490
- {
491
- Scalar w = m_matT.coeff(i,i) - p;
492
- Scalar r = m_matT.row(i).segment(l,n-l+1).dot(m_matT.col(n).segment(l, n-l+1));
466
+ m_matT.coeffRef(n, n) = Scalar(1);
467
+ for (Index i = n - 1; i >= 0; i--) {
468
+ Scalar w = m_matT.coeff(i, i) - p;
469
+ Scalar r = m_matT.row(i).segment(l, n - l + 1).dot(m_matT.col(n).segment(l, n - l + 1));
493
470
 
494
- if (m_eivalues.coeff(i).imag() < Scalar(0))
495
- {
471
+ if (m_eivalues.coeff(i).imag() < Scalar(0)) {
496
472
  lastw = w;
497
473
  lastr = r;
498
- }
499
- else
500
- {
474
+ } else {
501
475
  l = i;
502
- if (m_eivalues.coeff(i).imag() == Scalar(0))
503
- {
476
+ if (m_eivalues.coeff(i).imag() == Scalar(0)) {
504
477
  if (w != Scalar(0))
505
- m_matT.coeffRef(i,n) = -r / w;
478
+ m_matT.coeffRef(i, n) = -r / w;
506
479
  else
507
- m_matT.coeffRef(i,n) = -r / (eps * norm);
508
- }
509
- else // Solve real equations
480
+ m_matT.coeffRef(i, n) = -r / (eps * norm);
481
+ } else // Solve real equations
510
482
  {
511
- Scalar x = m_matT.coeff(i,i+1);
512
- Scalar y = m_matT.coeff(i+1,i);
513
- Scalar denom = (m_eivalues.coeff(i).real() - p) * (m_eivalues.coeff(i).real() - p) + m_eivalues.coeff(i).imag() * m_eivalues.coeff(i).imag();
483
+ Scalar x = m_matT.coeff(i, i + 1);
484
+ Scalar y = m_matT.coeff(i + 1, i);
485
+ Scalar denom = (m_eivalues.coeff(i).real() - p) * (m_eivalues.coeff(i).real() - p) +
486
+ m_eivalues.coeff(i).imag() * m_eivalues.coeff(i).imag();
514
487
  Scalar t = (x * lastr - lastw * r) / denom;
515
- m_matT.coeffRef(i,n) = t;
488
+ m_matT.coeffRef(i, n) = t;
516
489
  if (abs(x) > abs(lastw))
517
- m_matT.coeffRef(i+1,n) = (-r - w * t) / x;
490
+ m_matT.coeffRef(i + 1, n) = (-r - w * t) / x;
518
491
  else
519
- m_matT.coeffRef(i+1,n) = (-lastr - y * t) / lastw;
492
+ m_matT.coeffRef(i + 1, n) = (-lastr - y * t) / lastw;
520
493
  }
521
494
 
522
495
  // Overflow control
523
- Scalar t = abs(m_matT.coeff(i,n));
524
- if ((eps * t) * t > Scalar(1))
525
- m_matT.col(n).tail(size-i) /= t;
496
+ Scalar t = abs(m_matT.coeff(i, n));
497
+ if ((eps * t) * t > Scalar(1)) m_matT.col(n).tail(size - i) /= t;
526
498
  }
527
499
  }
528
- }
529
- else if (q < Scalar(0) && n > 0) // Complex vector
500
+ } else if (q < Scalar(0) && n > 0) // Complex vector
530
501
  {
531
502
  Scalar lastra(0), lastsa(0), lastw(0);
532
- Index l = n-1;
503
+ Index l = n - 1;
533
504
 
534
505
  // Last vector component imaginary so matrix is triangular
535
- if (abs(m_matT.coeff(n,n-1)) > abs(m_matT.coeff(n-1,n)))
536
- {
537
- m_matT.coeffRef(n-1,n-1) = q / m_matT.coeff(n,n-1);
538
- m_matT.coeffRef(n-1,n) = -(m_matT.coeff(n,n) - p) / m_matT.coeff(n,n-1);
539
- }
540
- else
541
- {
542
- ComplexScalar cc = ComplexScalar(Scalar(0),-m_matT.coeff(n-1,n)) / ComplexScalar(m_matT.coeff(n-1,n-1)-p,q);
543
- m_matT.coeffRef(n-1,n-1) = numext::real(cc);
544
- m_matT.coeffRef(n-1,n) = numext::imag(cc);
506
+ if (abs(m_matT.coeff(n, n - 1)) > abs(m_matT.coeff(n - 1, n))) {
507
+ m_matT.coeffRef(n - 1, n - 1) = q / m_matT.coeff(n, n - 1);
508
+ m_matT.coeffRef(n - 1, n) = -(m_matT.coeff(n, n) - p) / m_matT.coeff(n, n - 1);
509
+ } else {
510
+ ComplexScalar cc =
511
+ ComplexScalar(Scalar(0), -m_matT.coeff(n - 1, n)) / ComplexScalar(m_matT.coeff(n - 1, n - 1) - p, q);
512
+ m_matT.coeffRef(n - 1, n - 1) = numext::real(cc);
513
+ m_matT.coeffRef(n - 1, n) = numext::imag(cc);
545
514
  }
546
- m_matT.coeffRef(n,n-1) = Scalar(0);
547
- m_matT.coeffRef(n,n) = Scalar(1);
548
- for (Index i = n-2; i >= 0; i--)
549
- {
550
- Scalar ra = m_matT.row(i).segment(l, n-l+1).dot(m_matT.col(n-1).segment(l, n-l+1));
551
- Scalar sa = m_matT.row(i).segment(l, n-l+1).dot(m_matT.col(n).segment(l, n-l+1));
552
- Scalar w = m_matT.coeff(i,i) - p;
553
-
554
- if (m_eivalues.coeff(i).imag() < Scalar(0))
555
- {
515
+ m_matT.coeffRef(n, n - 1) = Scalar(0);
516
+ m_matT.coeffRef(n, n) = Scalar(1);
517
+ for (Index i = n - 2; i >= 0; i--) {
518
+ Scalar ra = m_matT.row(i).segment(l, n - l + 1).dot(m_matT.col(n - 1).segment(l, n - l + 1));
519
+ Scalar sa = m_matT.row(i).segment(l, n - l + 1).dot(m_matT.col(n).segment(l, n - l + 1));
520
+ Scalar w = m_matT.coeff(i, i) - p;
521
+
522
+ if (m_eivalues.coeff(i).imag() < Scalar(0)) {
556
523
  lastw = w;
557
524
  lastra = ra;
558
525
  lastsa = sa;
559
- }
560
- else
561
- {
526
+ } else {
562
527
  l = i;
563
- if (m_eivalues.coeff(i).imag() == RealScalar(0))
564
- {
565
- ComplexScalar cc = ComplexScalar(-ra,-sa) / ComplexScalar(w,q);
566
- m_matT.coeffRef(i,n-1) = numext::real(cc);
567
- m_matT.coeffRef(i,n) = numext::imag(cc);
568
- }
569
- else
570
- {
528
+ if (m_eivalues.coeff(i).imag() == RealScalar(0)) {
529
+ ComplexScalar cc = ComplexScalar(-ra, -sa) / ComplexScalar(w, q);
530
+ m_matT.coeffRef(i, n - 1) = numext::real(cc);
531
+ m_matT.coeffRef(i, n) = numext::imag(cc);
532
+ } else {
571
533
  // Solve complex equations
572
- Scalar x = m_matT.coeff(i,i+1);
573
- Scalar y = m_matT.coeff(i+1,i);
574
- Scalar vr = (m_eivalues.coeff(i).real() - p) * (m_eivalues.coeff(i).real() - p) + m_eivalues.coeff(i).imag() * m_eivalues.coeff(i).imag() - q * q;
534
+ Scalar x = m_matT.coeff(i, i + 1);
535
+ Scalar y = m_matT.coeff(i + 1, i);
536
+ Scalar vr = (m_eivalues.coeff(i).real() - p) * (m_eivalues.coeff(i).real() - p) +
537
+ m_eivalues.coeff(i).imag() * m_eivalues.coeff(i).imag() - q * q;
575
538
  Scalar vi = (m_eivalues.coeff(i).real() - p) * Scalar(2) * q;
576
539
  if ((vr == Scalar(0)) && (vi == Scalar(0)))
577
540
  vr = eps * norm * (abs(w) + abs(q) + abs(x) + abs(y) + abs(lastw));
578
541
 
579
- ComplexScalar cc = ComplexScalar(x*lastra-lastw*ra+q*sa,x*lastsa-lastw*sa-q*ra) / ComplexScalar(vr,vi);
580
- m_matT.coeffRef(i,n-1) = numext::real(cc);
581
- m_matT.coeffRef(i,n) = numext::imag(cc);
582
- if (abs(x) > (abs(lastw) + abs(q)))
583
- {
584
- m_matT.coeffRef(i+1,n-1) = (-ra - w * m_matT.coeff(i,n-1) + q * m_matT.coeff(i,n)) / x;
585
- m_matT.coeffRef(i+1,n) = (-sa - w * m_matT.coeff(i,n) - q * m_matT.coeff(i,n-1)) / x;
586
- }
587
- else
588
- {
589
- cc = ComplexScalar(-lastra-y*m_matT.coeff(i,n-1),-lastsa-y*m_matT.coeff(i,n)) / ComplexScalar(lastw,q);
590
- m_matT.coeffRef(i+1,n-1) = numext::real(cc);
591
- m_matT.coeffRef(i+1,n) = numext::imag(cc);
542
+ ComplexScalar cc = ComplexScalar(x * lastra - lastw * ra + q * sa, x * lastsa - lastw * sa - q * ra) /
543
+ ComplexScalar(vr, vi);
544
+ m_matT.coeffRef(i, n - 1) = numext::real(cc);
545
+ m_matT.coeffRef(i, n) = numext::imag(cc);
546
+ if (abs(x) > (abs(lastw) + abs(q))) {
547
+ m_matT.coeffRef(i + 1, n - 1) = (-ra - w * m_matT.coeff(i, n - 1) + q * m_matT.coeff(i, n)) / x;
548
+ m_matT.coeffRef(i + 1, n) = (-sa - w * m_matT.coeff(i, n) - q * m_matT.coeff(i, n - 1)) / x;
549
+ } else {
550
+ cc = ComplexScalar(-lastra - y * m_matT.coeff(i, n - 1), -lastsa - y * m_matT.coeff(i, n)) /
551
+ ComplexScalar(lastw, q);
552
+ m_matT.coeffRef(i + 1, n - 1) = numext::real(cc);
553
+ m_matT.coeffRef(i + 1, n) = numext::imag(cc);
592
554
  }
593
555
  }
594
556
 
595
557
  // Overflow control
596
- Scalar t = numext::maxi<Scalar>(abs(m_matT.coeff(i,n-1)),abs(m_matT.coeff(i,n)));
597
- if ((eps * t) * t > Scalar(1))
598
- m_matT.block(i, n-1, size-i, 2) /= t;
599
-
558
+ Scalar t = numext::maxi<Scalar>(abs(m_matT.coeff(i, n - 1)), abs(m_matT.coeff(i, n)));
559
+ if ((eps * t) * t > Scalar(1)) m_matT.block(i, n - 1, size - i, 2) /= t;
600
560
  }
601
561
  }
602
-
562
+
603
563
  // We handled a pair of complex conjugate eigenvalues, so need to skip them both
604
564
  n--;
605
- }
606
- else
607
- {
608
- eigen_assert(0 && "Internal bug in EigenSolver (INF or NaN has not been detected)"); // this should not happen
565
+ } else {
566
+ eigen_assert(0 && "Internal bug in EigenSolver (INF or NaN has not been detected)"); // this should not happen
609
567
  }
610
568
  }
611
569
 
612
570
  // Back transformation to get eigenvectors of original matrix
613
- for (Index j = size-1; j >= 0; j--)
614
- {
615
- m_tmp.noalias() = m_eivec.leftCols(j+1) * m_matT.col(j).segment(0, j+1);
571
+ for (Index j = size - 1; j >= 0; j--) {
572
+ m_tmp.noalias() = m_eivec.leftCols(j + 1) * m_matT.col(j).segment(0, j + 1);
616
573
  m_eivec.col(j) = m_tmp;
617
574
  }
618
575
  }
619
576
 
620
- } // end namespace Eigen
577
+ } // end namespace Eigen
621
578
 
622
- #endif // EIGEN_EIGENSOLVER_H
579
+ #endif // EIGEN_EIGENSOLVER_H