@smake/eigen 1.1.0 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (431) hide show
  1. package/README.md +1 -1
  2. package/eigen/Eigen/AccelerateSupport +52 -0
  3. package/eigen/Eigen/Cholesky +18 -20
  4. package/eigen/Eigen/CholmodSupport +28 -28
  5. package/eigen/Eigen/Core +187 -120
  6. package/eigen/Eigen/Eigenvalues +16 -13
  7. package/eigen/Eigen/Geometry +18 -18
  8. package/eigen/Eigen/Householder +9 -7
  9. package/eigen/Eigen/IterativeLinearSolvers +8 -4
  10. package/eigen/Eigen/Jacobi +14 -13
  11. package/eigen/Eigen/KLUSupport +23 -21
  12. package/eigen/Eigen/LU +15 -16
  13. package/eigen/Eigen/MetisSupport +12 -12
  14. package/eigen/Eigen/OrderingMethods +54 -51
  15. package/eigen/Eigen/PaStiXSupport +23 -21
  16. package/eigen/Eigen/PardisoSupport +17 -14
  17. package/eigen/Eigen/QR +18 -20
  18. package/eigen/Eigen/QtAlignedMalloc +5 -12
  19. package/eigen/Eigen/SPQRSupport +21 -14
  20. package/eigen/Eigen/SVD +23 -17
  21. package/eigen/Eigen/Sparse +1 -2
  22. package/eigen/Eigen/SparseCholesky +18 -15
  23. package/eigen/Eigen/SparseCore +18 -17
  24. package/eigen/Eigen/SparseLU +9 -9
  25. package/eigen/Eigen/SparseQR +16 -14
  26. package/eigen/Eigen/StdDeque +5 -2
  27. package/eigen/Eigen/StdList +5 -2
  28. package/eigen/Eigen/StdVector +5 -2
  29. package/eigen/Eigen/SuperLUSupport +30 -24
  30. package/eigen/Eigen/ThreadPool +80 -0
  31. package/eigen/Eigen/UmfPackSupport +19 -17
  32. package/eigen/Eigen/Version +14 -0
  33. package/eigen/Eigen/src/AccelerateSupport/AccelerateSupport.h +423 -0
  34. package/eigen/Eigen/src/AccelerateSupport/InternalHeaderCheck.h +3 -0
  35. package/eigen/Eigen/src/Cholesky/InternalHeaderCheck.h +3 -0
  36. package/eigen/Eigen/src/Cholesky/LDLT.h +366 -405
  37. package/eigen/Eigen/src/Cholesky/LLT.h +323 -367
  38. package/eigen/Eigen/src/Cholesky/LLT_LAPACKE.h +81 -56
  39. package/eigen/Eigen/src/CholmodSupport/CholmodSupport.h +585 -529
  40. package/eigen/Eigen/src/CholmodSupport/InternalHeaderCheck.h +3 -0
  41. package/eigen/Eigen/src/Core/ArithmeticSequence.h +143 -317
  42. package/eigen/Eigen/src/Core/Array.h +329 -370
  43. package/eigen/Eigen/src/Core/ArrayBase.h +190 -203
  44. package/eigen/Eigen/src/Core/ArrayWrapper.h +126 -170
  45. package/eigen/Eigen/src/Core/Assign.h +30 -40
  46. package/eigen/Eigen/src/Core/AssignEvaluator.h +651 -604
  47. package/eigen/Eigen/src/Core/Assign_MKL.h +125 -120
  48. package/eigen/Eigen/src/Core/BandMatrix.h +267 -282
  49. package/eigen/Eigen/src/Core/Block.h +371 -390
  50. package/eigen/Eigen/src/Core/CommaInitializer.h +85 -100
  51. package/eigen/Eigen/src/Core/ConditionEstimator.h +51 -53
  52. package/eigen/Eigen/src/Core/CoreEvaluators.h +1214 -937
  53. package/eigen/Eigen/src/Core/CoreIterators.h +72 -63
  54. package/eigen/Eigen/src/Core/CwiseBinaryOp.h +112 -129
  55. package/eigen/Eigen/src/Core/CwiseNullaryOp.h +676 -702
  56. package/eigen/Eigen/src/Core/CwiseTernaryOp.h +77 -103
  57. package/eigen/Eigen/src/Core/CwiseUnaryOp.h +55 -67
  58. package/eigen/Eigen/src/Core/CwiseUnaryView.h +127 -92
  59. package/eigen/Eigen/src/Core/DenseBase.h +630 -658
  60. package/eigen/Eigen/src/Core/DenseCoeffsBase.h +511 -628
  61. package/eigen/Eigen/src/Core/DenseStorage.h +511 -590
  62. package/eigen/Eigen/src/Core/DeviceWrapper.h +153 -0
  63. package/eigen/Eigen/src/Core/Diagonal.h +168 -207
  64. package/eigen/Eigen/src/Core/DiagonalMatrix.h +346 -317
  65. package/eigen/Eigen/src/Core/DiagonalProduct.h +12 -10
  66. package/eigen/Eigen/src/Core/Dot.h +167 -217
  67. package/eigen/Eigen/src/Core/EigenBase.h +74 -85
  68. package/eigen/Eigen/src/Core/Fill.h +138 -0
  69. package/eigen/Eigen/src/Core/FindCoeff.h +464 -0
  70. package/eigen/Eigen/src/Core/ForceAlignedAccess.h +90 -113
  71. package/eigen/Eigen/src/Core/Fuzzy.h +82 -105
  72. package/eigen/Eigen/src/Core/GeneralProduct.h +315 -261
  73. package/eigen/Eigen/src/Core/GenericPacketMath.h +1182 -520
  74. package/eigen/Eigen/src/Core/GlobalFunctions.h +193 -157
  75. package/eigen/Eigen/src/Core/IO.h +131 -156
  76. package/eigen/Eigen/src/Core/IndexedView.h +209 -125
  77. package/eigen/Eigen/src/Core/InnerProduct.h +260 -0
  78. package/eigen/Eigen/src/Core/InternalHeaderCheck.h +3 -0
  79. package/eigen/Eigen/src/Core/Inverse.h +50 -59
  80. package/eigen/Eigen/src/Core/Map.h +123 -141
  81. package/eigen/Eigen/src/Core/MapBase.h +255 -282
  82. package/eigen/Eigen/src/Core/MathFunctions.h +1247 -1201
  83. package/eigen/Eigen/src/Core/MathFunctionsImpl.h +162 -99
  84. package/eigen/Eigen/src/Core/Matrix.h +463 -494
  85. package/eigen/Eigen/src/Core/MatrixBase.h +468 -470
  86. package/eigen/Eigen/src/Core/NestByValue.h +58 -52
  87. package/eigen/Eigen/src/Core/NoAlias.h +79 -86
  88. package/eigen/Eigen/src/Core/NumTraits.h +206 -206
  89. package/eigen/Eigen/src/Core/PartialReduxEvaluator.h +163 -142
  90. package/eigen/Eigen/src/Core/PermutationMatrix.h +461 -511
  91. package/eigen/Eigen/src/Core/PlainObjectBase.h +858 -972
  92. package/eigen/Eigen/src/Core/Product.h +246 -130
  93. package/eigen/Eigen/src/Core/ProductEvaluators.h +779 -671
  94. package/eigen/Eigen/src/Core/Random.h +153 -164
  95. package/eigen/Eigen/src/Core/RandomImpl.h +262 -0
  96. package/eigen/Eigen/src/Core/RealView.h +250 -0
  97. package/eigen/Eigen/src/Core/Redux.h +334 -314
  98. package/eigen/Eigen/src/Core/Ref.h +259 -257
  99. package/eigen/Eigen/src/Core/Replicate.h +92 -104
  100. package/eigen/Eigen/src/Core/Reshaped.h +215 -271
  101. package/eigen/Eigen/src/Core/ReturnByValue.h +47 -55
  102. package/eigen/Eigen/src/Core/Reverse.h +133 -148
  103. package/eigen/Eigen/src/Core/Select.h +68 -140
  104. package/eigen/Eigen/src/Core/SelfAdjointView.h +254 -290
  105. package/eigen/Eigen/src/Core/SelfCwiseBinaryOp.h +23 -20
  106. package/eigen/Eigen/src/Core/SkewSymmetricMatrix3.h +382 -0
  107. package/eigen/Eigen/src/Core/Solve.h +88 -102
  108. package/eigen/Eigen/src/Core/SolveTriangular.h +126 -124
  109. package/eigen/Eigen/src/Core/SolverBase.h +132 -133
  110. package/eigen/Eigen/src/Core/StableNorm.h +113 -147
  111. package/eigen/Eigen/src/Core/StlIterators.h +404 -248
  112. package/eigen/Eigen/src/Core/Stride.h +90 -92
  113. package/eigen/Eigen/src/Core/Swap.h +70 -39
  114. package/eigen/Eigen/src/Core/Transpose.h +258 -295
  115. package/eigen/Eigen/src/Core/Transpositions.h +270 -333
  116. package/eigen/Eigen/src/Core/TriangularMatrix.h +642 -743
  117. package/eigen/Eigen/src/Core/VectorBlock.h +59 -72
  118. package/eigen/Eigen/src/Core/VectorwiseOp.h +653 -704
  119. package/eigen/Eigen/src/Core/Visitor.h +464 -308
  120. package/eigen/Eigen/src/Core/arch/AVX/Complex.h +380 -187
  121. package/eigen/Eigen/src/Core/arch/AVX/MathFunctions.h +65 -163
  122. package/eigen/Eigen/src/Core/arch/AVX/PacketMath.h +2145 -638
  123. package/eigen/Eigen/src/Core/arch/AVX/Reductions.h +353 -0
  124. package/eigen/Eigen/src/Core/arch/AVX/TypeCasting.h +253 -60
  125. package/eigen/Eigen/src/Core/arch/AVX512/Complex.h +278 -228
  126. package/eigen/Eigen/src/Core/arch/AVX512/GemmKernel.h +1245 -0
  127. package/eigen/Eigen/src/Core/arch/AVX512/MathFunctions.h +48 -269
  128. package/eigen/Eigen/src/Core/arch/AVX512/MathFunctionsFP16.h +75 -0
  129. package/eigen/Eigen/src/Core/arch/AVX512/PacketMath.h +1597 -754
  130. package/eigen/Eigen/src/Core/arch/AVX512/PacketMathFP16.h +1413 -0
  131. package/eigen/Eigen/src/Core/arch/AVX512/Reductions.h +297 -0
  132. package/eigen/Eigen/src/Core/arch/AVX512/TrsmKernel.h +1167 -0
  133. package/eigen/Eigen/src/Core/arch/AVX512/TrsmUnrolls.inc +1219 -0
  134. package/eigen/Eigen/src/Core/arch/AVX512/TypeCasting.h +229 -41
  135. package/eigen/Eigen/src/Core/arch/AVX512/TypeCastingFP16.h +130 -0
  136. package/eigen/Eigen/src/Core/arch/AltiVec/Complex.h +420 -184
  137. package/eigen/Eigen/src/Core/arch/AltiVec/MathFunctions.h +40 -49
  138. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProduct.h +2962 -2213
  139. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h +196 -212
  140. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductMMA.h +713 -441
  141. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductMMAbfloat16.h +742 -0
  142. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixVectorProduct.inc +2818 -0
  143. package/eigen/Eigen/src/Core/arch/AltiVec/PacketMath.h +2380 -1362
  144. package/eigen/Eigen/src/Core/arch/AltiVec/TypeCasting.h +153 -0
  145. package/eigen/Eigen/src/Core/arch/Default/BFloat16.h +390 -224
  146. package/eigen/Eigen/src/Core/arch/Default/ConjHelper.h +78 -67
  147. package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h +1784 -799
  148. package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h +167 -50
  149. package/eigen/Eigen/src/Core/arch/Default/Half.h +528 -379
  150. package/eigen/Eigen/src/Core/arch/Default/Settings.h +10 -12
  151. package/eigen/Eigen/src/Core/arch/GPU/Complex.h +244 -0
  152. package/eigen/Eigen/src/Core/arch/GPU/MathFunctions.h +41 -40
  153. package/eigen/Eigen/src/Core/arch/GPU/PacketMath.h +550 -523
  154. package/eigen/Eigen/src/Core/arch/GPU/Tuple.h +268 -0
  155. package/eigen/Eigen/src/Core/arch/GPU/TypeCasting.h +27 -30
  156. package/eigen/Eigen/src/Core/arch/HIP/hcc/math_constants.h +8 -8
  157. package/eigen/Eigen/src/Core/arch/HVX/PacketMath.h +1088 -0
  158. package/eigen/Eigen/src/Core/arch/LSX/Complex.h +520 -0
  159. package/eigen/Eigen/src/Core/arch/LSX/GeneralBlockPanelKernel.h +23 -0
  160. package/eigen/Eigen/src/Core/arch/LSX/MathFunctions.h +43 -0
  161. package/eigen/Eigen/src/Core/arch/LSX/PacketMath.h +2866 -0
  162. package/eigen/Eigen/src/Core/arch/LSX/TypeCasting.h +526 -0
  163. package/eigen/Eigen/src/Core/arch/MSA/Complex.h +54 -82
  164. package/eigen/Eigen/src/Core/arch/MSA/MathFunctions.h +84 -92
  165. package/eigen/Eigen/src/Core/arch/MSA/PacketMath.h +51 -47
  166. package/eigen/Eigen/src/Core/arch/NEON/Complex.h +454 -306
  167. package/eigen/Eigen/src/Core/arch/NEON/GeneralBlockPanelKernel.h +175 -115
  168. package/eigen/Eigen/src/Core/arch/NEON/MathFunctions.h +23 -30
  169. package/eigen/Eigen/src/Core/arch/NEON/PacketMath.h +4366 -2857
  170. package/eigen/Eigen/src/Core/arch/NEON/TypeCasting.h +616 -393
  171. package/eigen/Eigen/src/Core/arch/NEON/UnaryFunctors.h +57 -0
  172. package/eigen/Eigen/src/Core/arch/SSE/Complex.h +350 -198
  173. package/eigen/Eigen/src/Core/arch/SSE/MathFunctions.h +38 -149
  174. package/eigen/Eigen/src/Core/arch/SSE/PacketMath.h +1791 -912
  175. package/eigen/Eigen/src/Core/arch/SSE/Reductions.h +324 -0
  176. package/eigen/Eigen/src/Core/arch/SSE/TypeCasting.h +128 -40
  177. package/eigen/Eigen/src/Core/arch/SVE/MathFunctions.h +10 -6
  178. package/eigen/Eigen/src/Core/arch/SVE/PacketMath.h +156 -234
  179. package/eigen/Eigen/src/Core/arch/SVE/TypeCasting.h +6 -3
  180. package/eigen/Eigen/src/Core/arch/SYCL/InteropHeaders.h +27 -32
  181. package/eigen/Eigen/src/Core/arch/SYCL/MathFunctions.h +119 -117
  182. package/eigen/Eigen/src/Core/arch/SYCL/PacketMath.h +325 -419
  183. package/eigen/Eigen/src/Core/arch/SYCL/TypeCasting.h +15 -17
  184. package/eigen/Eigen/src/Core/arch/ZVector/Complex.h +325 -181
  185. package/eigen/Eigen/src/Core/arch/ZVector/MathFunctions.h +94 -83
  186. package/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h +811 -458
  187. package/eigen/Eigen/src/Core/functors/AssignmentFunctors.h +121 -124
  188. package/eigen/Eigen/src/Core/functors/BinaryFunctors.h +576 -370
  189. package/eigen/Eigen/src/Core/functors/NullaryFunctors.h +194 -109
  190. package/eigen/Eigen/src/Core/functors/StlFunctors.h +95 -112
  191. package/eigen/Eigen/src/Core/functors/TernaryFunctors.h +34 -7
  192. package/eigen/Eigen/src/Core/functors/UnaryFunctors.h +1038 -749
  193. package/eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h +1883 -1375
  194. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix.h +312 -370
  195. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +189 -176
  196. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h +84 -81
  197. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix_BLAS.h +154 -73
  198. package/eigen/Eigen/src/Core/products/GeneralMatrixVector.h +292 -337
  199. package/eigen/Eigen/src/Core/products/GeneralMatrixVector_BLAS.h +80 -77
  200. package/eigen/Eigen/src/Core/products/Parallelizer.h +207 -105
  201. package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +327 -388
  202. package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix_BLAS.h +206 -224
  203. package/eigen/Eigen/src/Core/products/SelfadjointMatrixVector.h +138 -147
  204. package/eigen/Eigen/src/Core/products/SelfadjointMatrixVector_BLAS.h +58 -61
  205. package/eigen/Eigen/src/Core/products/SelfadjointProduct.h +71 -71
  206. package/eigen/Eigen/src/Core/products/SelfadjointRank2Update.h +48 -47
  207. package/eigen/Eigen/src/Core/products/TriangularMatrixMatrix.h +294 -369
  208. package/eigen/Eigen/src/Core/products/TriangularMatrixMatrix_BLAS.h +246 -238
  209. package/eigen/Eigen/src/Core/products/TriangularMatrixVector.h +244 -247
  210. package/eigen/Eigen/src/Core/products/TriangularMatrixVector_BLAS.h +212 -192
  211. package/eigen/Eigen/src/Core/products/TriangularSolverMatrix.h +328 -277
  212. package/eigen/Eigen/src/Core/products/TriangularSolverMatrix_BLAS.h +108 -109
  213. package/eigen/Eigen/src/Core/products/TriangularSolverVector.h +68 -94
  214. package/eigen/Eigen/src/Core/util/Assert.h +158 -0
  215. package/eigen/Eigen/src/Core/util/BlasUtil.h +342 -303
  216. package/eigen/Eigen/src/Core/util/ConfigureVectorization.h +348 -317
  217. package/eigen/Eigen/src/Core/util/Constants.h +297 -262
  218. package/eigen/Eigen/src/Core/util/DisableStupidWarnings.h +130 -90
  219. package/eigen/Eigen/src/Core/util/EmulateArray.h +270 -0
  220. package/eigen/Eigen/src/Core/util/ForwardDeclarations.h +449 -247
  221. package/eigen/Eigen/src/Core/util/GpuHipCudaDefines.inc +101 -0
  222. package/eigen/Eigen/src/Core/util/GpuHipCudaUndefines.inc +45 -0
  223. package/eigen/Eigen/src/Core/util/IndexedViewHelper.h +417 -116
  224. package/eigen/Eigen/src/Core/util/IntegralConstant.h +211 -204
  225. package/eigen/Eigen/src/Core/util/MKL_support.h +39 -37
  226. package/eigen/Eigen/src/Core/util/Macros.h +655 -773
  227. package/eigen/Eigen/src/Core/util/MaxSizeVector.h +139 -0
  228. package/eigen/Eigen/src/Core/util/Memory.h +970 -748
  229. package/eigen/Eigen/src/Core/util/Meta.h +581 -633
  230. package/eigen/Eigen/src/Core/util/MoreMeta.h +638 -0
  231. package/eigen/Eigen/src/Core/util/ReenableStupidWarnings.h +32 -19
  232. package/eigen/Eigen/src/Core/util/ReshapedHelper.h +17 -17
  233. package/eigen/Eigen/src/Core/util/Serializer.h +209 -0
  234. package/eigen/Eigen/src/Core/util/StaticAssert.h +50 -166
  235. package/eigen/Eigen/src/Core/util/SymbolicIndex.h +377 -225
  236. package/eigen/Eigen/src/Core/util/XprHelper.h +784 -547
  237. package/eigen/Eigen/src/Eigenvalues/ComplexEigenSolver.h +246 -277
  238. package/eigen/Eigen/src/Eigenvalues/ComplexSchur.h +299 -319
  239. package/eigen/Eigen/src/Eigenvalues/ComplexSchur_LAPACKE.h +52 -48
  240. package/eigen/Eigen/src/Eigenvalues/EigenSolver.h +413 -456
  241. package/eigen/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h +309 -325
  242. package/eigen/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h +157 -171
  243. package/eigen/Eigen/src/Eigenvalues/HessenbergDecomposition.h +292 -310
  244. package/eigen/Eigen/src/Eigenvalues/InternalHeaderCheck.h +3 -0
  245. package/eigen/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h +89 -105
  246. package/eigen/Eigen/src/Eigenvalues/RealQZ.h +537 -607
  247. package/eigen/Eigen/src/Eigenvalues/RealSchur.h +342 -381
  248. package/eigen/Eigen/src/Eigenvalues/RealSchur_LAPACKE.h +41 -35
  249. package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +541 -595
  250. package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_LAPACKE.h +47 -44
  251. package/eigen/Eigen/src/Eigenvalues/Tridiagonalization.h +430 -462
  252. package/eigen/Eigen/src/Geometry/AlignedBox.h +226 -227
  253. package/eigen/Eigen/src/Geometry/AngleAxis.h +131 -133
  254. package/eigen/Eigen/src/Geometry/EulerAngles.h +163 -74
  255. package/eigen/Eigen/src/Geometry/Homogeneous.h +285 -333
  256. package/eigen/Eigen/src/Geometry/Hyperplane.h +151 -160
  257. package/eigen/Eigen/src/Geometry/InternalHeaderCheck.h +3 -0
  258. package/eigen/Eigen/src/Geometry/OrthoMethods.h +168 -146
  259. package/eigen/Eigen/src/Geometry/ParametrizedLine.h +127 -127
  260. package/eigen/Eigen/src/Geometry/Quaternion.h +566 -506
  261. package/eigen/Eigen/src/Geometry/Rotation2D.h +107 -105
  262. package/eigen/Eigen/src/Geometry/RotationBase.h +148 -145
  263. package/eigen/Eigen/src/Geometry/Scaling.h +113 -106
  264. package/eigen/Eigen/src/Geometry/Transform.h +858 -936
  265. package/eigen/Eigen/src/Geometry/Translation.h +94 -92
  266. package/eigen/Eigen/src/Geometry/Umeyama.h +79 -84
  267. package/eigen/Eigen/src/Geometry/arch/Geometry_SIMD.h +90 -104
  268. package/eigen/Eigen/src/Householder/BlockHouseholder.h +51 -46
  269. package/eigen/Eigen/src/Householder/Householder.h +102 -124
  270. package/eigen/Eigen/src/Householder/HouseholderSequence.h +412 -453
  271. package/eigen/Eigen/src/Householder/InternalHeaderCheck.h +3 -0
  272. package/eigen/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +149 -162
  273. package/eigen/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +124 -119
  274. package/eigen/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +92 -104
  275. package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h +251 -243
  276. package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h +224 -228
  277. package/eigen/Eigen/src/IterativeLinearSolvers/InternalHeaderCheck.h +3 -0
  278. package/eigen/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +178 -227
  279. package/eigen/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h +79 -84
  280. package/eigen/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h +54 -60
  281. package/eigen/Eigen/src/Jacobi/InternalHeaderCheck.h +3 -0
  282. package/eigen/Eigen/src/Jacobi/Jacobi.h +252 -308
  283. package/eigen/Eigen/src/KLUSupport/InternalHeaderCheck.h +3 -0
  284. package/eigen/Eigen/src/KLUSupport/KLUSupport.h +208 -227
  285. package/eigen/Eigen/src/LU/Determinant.h +50 -69
  286. package/eigen/Eigen/src/LU/FullPivLU.h +545 -596
  287. package/eigen/Eigen/src/LU/InternalHeaderCheck.h +3 -0
  288. package/eigen/Eigen/src/LU/InverseImpl.h +206 -285
  289. package/eigen/Eigen/src/LU/PartialPivLU.h +390 -428
  290. package/eigen/Eigen/src/LU/PartialPivLU_LAPACKE.h +54 -40
  291. package/eigen/Eigen/src/LU/arch/InverseSize4.h +72 -70
  292. package/eigen/Eigen/src/MetisSupport/InternalHeaderCheck.h +3 -0
  293. package/eigen/Eigen/src/MetisSupport/MetisSupport.h +81 -93
  294. package/eigen/Eigen/src/OrderingMethods/Amd.h +243 -265
  295. package/eigen/Eigen/src/OrderingMethods/Eigen_Colamd.h +831 -1004
  296. package/eigen/Eigen/src/OrderingMethods/InternalHeaderCheck.h +3 -0
  297. package/eigen/Eigen/src/OrderingMethods/Ordering.h +112 -119
  298. package/eigen/Eigen/src/PaStiXSupport/InternalHeaderCheck.h +3 -0
  299. package/eigen/Eigen/src/PaStiXSupport/PaStiXSupport.h +524 -570
  300. package/eigen/Eigen/src/PardisoSupport/InternalHeaderCheck.h +3 -0
  301. package/eigen/Eigen/src/PardisoSupport/PardisoSupport.h +385 -430
  302. package/eigen/Eigen/src/QR/ColPivHouseholderQR.h +479 -479
  303. package/eigen/Eigen/src/QR/ColPivHouseholderQR_LAPACKE.h +120 -56
  304. package/eigen/Eigen/src/QR/CompleteOrthogonalDecomposition.h +166 -153
  305. package/eigen/Eigen/src/QR/FullPivHouseholderQR.h +495 -475
  306. package/eigen/Eigen/src/QR/HouseholderQR.h +394 -285
  307. package/eigen/Eigen/src/QR/HouseholderQR_LAPACKE.h +32 -23
  308. package/eigen/Eigen/src/QR/InternalHeaderCheck.h +3 -0
  309. package/eigen/Eigen/src/SPQRSupport/InternalHeaderCheck.h +3 -0
  310. package/eigen/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h +244 -264
  311. package/eigen/Eigen/src/SVD/BDCSVD.h +817 -713
  312. package/eigen/Eigen/src/SVD/BDCSVD_LAPACKE.h +174 -0
  313. package/eigen/Eigen/src/SVD/InternalHeaderCheck.h +3 -0
  314. package/eigen/Eigen/src/SVD/JacobiSVD.h +577 -543
  315. package/eigen/Eigen/src/SVD/JacobiSVD_LAPACKE.h +85 -49
  316. package/eigen/Eigen/src/SVD/SVDBase.h +242 -182
  317. package/eigen/Eigen/src/SVD/UpperBidiagonalization.h +200 -235
  318. package/eigen/Eigen/src/SparseCholesky/InternalHeaderCheck.h +3 -0
  319. package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky.h +765 -594
  320. package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h +308 -94
  321. package/eigen/Eigen/src/SparseCore/AmbiVector.h +202 -251
  322. package/eigen/Eigen/src/SparseCore/CompressedStorage.h +184 -252
  323. package/eigen/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h +134 -178
  324. package/eigen/Eigen/src/SparseCore/InternalHeaderCheck.h +3 -0
  325. package/eigen/Eigen/src/SparseCore/SparseAssign.h +149 -140
  326. package/eigen/Eigen/src/SparseCore/SparseBlock.h +403 -440
  327. package/eigen/Eigen/src/SparseCore/SparseColEtree.h +100 -112
  328. package/eigen/Eigen/src/SparseCore/SparseCompressedBase.h +525 -303
  329. package/eigen/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +555 -339
  330. package/eigen/Eigen/src/SparseCore/SparseCwiseUnaryOp.h +100 -108
  331. package/eigen/Eigen/src/SparseCore/SparseDenseProduct.h +169 -197
  332. package/eigen/Eigen/src/SparseCore/SparseDiagonalProduct.h +71 -71
  333. package/eigen/Eigen/src/SparseCore/SparseDot.h +49 -47
  334. package/eigen/Eigen/src/SparseCore/SparseFuzzy.h +13 -11
  335. package/eigen/Eigen/src/SparseCore/SparseMap.h +243 -253
  336. package/eigen/Eigen/src/SparseCore/SparseMatrix.h +1603 -1245
  337. package/eigen/Eigen/src/SparseCore/SparseMatrixBase.h +403 -350
  338. package/eigen/Eigen/src/SparseCore/SparsePermutation.h +186 -115
  339. package/eigen/Eigen/src/SparseCore/SparseProduct.h +94 -97
  340. package/eigen/Eigen/src/SparseCore/SparseRedux.h +22 -24
  341. package/eigen/Eigen/src/SparseCore/SparseRef.h +268 -295
  342. package/eigen/Eigen/src/SparseCore/SparseSelfAdjointView.h +370 -416
  343. package/eigen/Eigen/src/SparseCore/SparseSolverBase.h +78 -87
  344. package/eigen/Eigen/src/SparseCore/SparseSparseProductWithPruning.h +81 -95
  345. package/eigen/Eigen/src/SparseCore/SparseTranspose.h +62 -71
  346. package/eigen/Eigen/src/SparseCore/SparseTriangularView.h +132 -144
  347. package/eigen/Eigen/src/SparseCore/SparseUtil.h +138 -115
  348. package/eigen/Eigen/src/SparseCore/SparseVector.h +426 -372
  349. package/eigen/Eigen/src/SparseCore/SparseView.h +164 -193
  350. package/eigen/Eigen/src/SparseCore/TriangularSolver.h +129 -170
  351. package/eigen/Eigen/src/SparseLU/InternalHeaderCheck.h +3 -0
  352. package/eigen/Eigen/src/SparseLU/SparseLU.h +756 -710
  353. package/eigen/Eigen/src/SparseLU/SparseLUImpl.h +61 -48
  354. package/eigen/Eigen/src/SparseLU/SparseLU_Memory.h +102 -118
  355. package/eigen/Eigen/src/SparseLU/SparseLU_Structs.h +38 -35
  356. package/eigen/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h +245 -301
  357. package/eigen/Eigen/src/SparseLU/SparseLU_Utils.h +44 -49
  358. package/eigen/Eigen/src/SparseLU/SparseLU_column_bmod.h +104 -108
  359. package/eigen/Eigen/src/SparseLU/SparseLU_column_dfs.h +89 -100
  360. package/eigen/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h +57 -58
  361. package/eigen/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h +43 -55
  362. package/eigen/Eigen/src/SparseLU/SparseLU_kernel_bmod.h +74 -71
  363. package/eigen/Eigen/src/SparseLU/SparseLU_panel_bmod.h +124 -132
  364. package/eigen/Eigen/src/SparseLU/SparseLU_panel_dfs.h +136 -159
  365. package/eigen/Eigen/src/SparseLU/SparseLU_pivotL.h +51 -52
  366. package/eigen/Eigen/src/SparseLU/SparseLU_pruneL.h +67 -73
  367. package/eigen/Eigen/src/SparseLU/SparseLU_relax_snode.h +24 -26
  368. package/eigen/Eigen/src/SparseQR/InternalHeaderCheck.h +3 -0
  369. package/eigen/Eigen/src/SparseQR/SparseQR.h +450 -502
  370. package/eigen/Eigen/src/StlSupport/StdDeque.h +28 -93
  371. package/eigen/Eigen/src/StlSupport/StdList.h +28 -84
  372. package/eigen/Eigen/src/StlSupport/StdVector.h +28 -108
  373. package/eigen/Eigen/src/StlSupport/details.h +48 -50
  374. package/eigen/Eigen/src/SuperLUSupport/InternalHeaderCheck.h +3 -0
  375. package/eigen/Eigen/src/SuperLUSupport/SuperLUSupport.h +634 -730
  376. package/eigen/Eigen/src/ThreadPool/Barrier.h +70 -0
  377. package/eigen/Eigen/src/ThreadPool/CoreThreadPoolDevice.h +336 -0
  378. package/eigen/Eigen/src/ThreadPool/EventCount.h +241 -0
  379. package/eigen/Eigen/src/ThreadPool/ForkJoin.h +140 -0
  380. package/eigen/Eigen/src/ThreadPool/InternalHeaderCheck.h +4 -0
  381. package/eigen/Eigen/src/ThreadPool/NonBlockingThreadPool.h +587 -0
  382. package/eigen/Eigen/src/ThreadPool/RunQueue.h +230 -0
  383. package/eigen/Eigen/src/ThreadPool/ThreadCancel.h +21 -0
  384. package/eigen/Eigen/src/ThreadPool/ThreadEnvironment.h +43 -0
  385. package/eigen/Eigen/src/ThreadPool/ThreadLocal.h +289 -0
  386. package/eigen/Eigen/src/ThreadPool/ThreadPoolInterface.h +50 -0
  387. package/eigen/Eigen/src/ThreadPool/ThreadYield.h +16 -0
  388. package/eigen/Eigen/src/UmfPackSupport/InternalHeaderCheck.h +3 -0
  389. package/eigen/Eigen/src/UmfPackSupport/UmfPackSupport.h +428 -464
  390. package/eigen/Eigen/src/misc/Image.h +41 -43
  391. package/eigen/Eigen/src/misc/InternalHeaderCheck.h +3 -0
  392. package/eigen/Eigen/src/misc/Kernel.h +39 -41
  393. package/eigen/Eigen/src/misc/RealSvd2x2.h +19 -21
  394. package/eigen/Eigen/src/misc/blas.h +83 -426
  395. package/eigen/Eigen/src/misc/lapacke.h +9972 -16179
  396. package/eigen/Eigen/src/misc/lapacke_helpers.h +163 -0
  397. package/eigen/Eigen/src/misc/lapacke_mangling.h +4 -5
  398. package/eigen/Eigen/src/plugins/ArrayCwiseBinaryOps.inc +344 -0
  399. package/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.inc +544 -0
  400. package/eigen/Eigen/src/plugins/{BlockMethods.h → BlockMethods.inc} +434 -506
  401. package/eigen/Eigen/src/plugins/CommonCwiseBinaryOps.inc +116 -0
  402. package/eigen/Eigen/src/plugins/{CommonCwiseUnaryOps.h → CommonCwiseUnaryOps.inc} +58 -68
  403. package/eigen/Eigen/src/plugins/IndexedViewMethods.inc +192 -0
  404. package/eigen/Eigen/src/plugins/InternalHeaderCheck.inc +3 -0
  405. package/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.inc +331 -0
  406. package/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.inc +118 -0
  407. package/eigen/Eigen/src/plugins/ReshapedMethods.inc +133 -0
  408. package/package.json +1 -1
  409. package/eigen/COPYING.APACHE +0 -203
  410. package/eigen/COPYING.BSD +0 -26
  411. package/eigen/COPYING.GPL +0 -674
  412. package/eigen/COPYING.LGPL +0 -502
  413. package/eigen/COPYING.MINPACK +0 -51
  414. package/eigen/COPYING.MPL2 +0 -373
  415. package/eigen/COPYING.README +0 -18
  416. package/eigen/Eigen/src/Core/BooleanRedux.h +0 -162
  417. package/eigen/Eigen/src/Core/arch/CUDA/Complex.h +0 -258
  418. package/eigen/Eigen/src/Core/arch/Default/TypeCasting.h +0 -120
  419. package/eigen/Eigen/src/Core/arch/SYCL/SyclMemoryModel.h +0 -694
  420. package/eigen/Eigen/src/Core/util/NonMPL2.h +0 -3
  421. package/eigen/Eigen/src/SparseCore/MappedSparseMatrix.h +0 -67
  422. package/eigen/Eigen/src/SparseLU/SparseLU_gemm_kernel.h +0 -280
  423. package/eigen/Eigen/src/misc/lapack.h +0 -152
  424. package/eigen/Eigen/src/plugins/ArrayCwiseBinaryOps.h +0 -358
  425. package/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.h +0 -696
  426. package/eigen/Eigen/src/plugins/CommonCwiseBinaryOps.h +0 -115
  427. package/eigen/Eigen/src/plugins/IndexedViewMethods.h +0 -262
  428. package/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.h +0 -152
  429. package/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.h +0 -95
  430. package/eigen/Eigen/src/plugins/ReshapedMethods.h +0 -149
  431. package/eigen/README.md +0 -5
@@ -13,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_eigenvectorsOk(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 occurred. 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