ruby-eigen 0.0.9 → 0.0.10.pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (293) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +22 -0
  3. data/README.md +21 -0
  4. data/ext/eigen/eigen3/COPYING.BSD +26 -0
  5. data/ext/eigen/eigen3/COPYING.MPL2 +373 -0
  6. data/ext/eigen/eigen3/COPYING.README +18 -0
  7. data/ext/eigen/eigen3/Eigen/Array +11 -0
  8. data/ext/eigen/eigen3/Eigen/Cholesky +32 -0
  9. data/ext/eigen/eigen3/Eigen/CholmodSupport +45 -0
  10. data/ext/eigen/eigen3/Eigen/Core +376 -0
  11. data/ext/eigen/eigen3/Eigen/Dense +7 -0
  12. data/ext/eigen/eigen3/Eigen/Eigen +2 -0
  13. data/ext/eigen/eigen3/Eigen/Eigen2Support +95 -0
  14. data/ext/eigen/eigen3/Eigen/Eigenvalues +48 -0
  15. data/ext/eigen/eigen3/Eigen/Geometry +63 -0
  16. data/ext/eigen/eigen3/Eigen/Householder +23 -0
  17. data/ext/eigen/eigen3/Eigen/IterativeLinearSolvers +40 -0
  18. data/ext/eigen/eigen3/Eigen/Jacobi +26 -0
  19. data/ext/eigen/eigen3/Eigen/LU +41 -0
  20. data/ext/eigen/eigen3/Eigen/LeastSquares +32 -0
  21. data/ext/eigen/eigen3/Eigen/MetisSupport +28 -0
  22. data/ext/eigen/eigen3/Eigen/PaStiXSupport +46 -0
  23. data/ext/eigen/eigen3/Eigen/PardisoSupport +30 -0
  24. data/ext/eigen/eigen3/Eigen/QR +45 -0
  25. data/ext/eigen/eigen3/Eigen/QtAlignedMalloc +34 -0
  26. data/ext/eigen/eigen3/Eigen/SPQRSupport +29 -0
  27. data/ext/eigen/eigen3/Eigen/SVD +37 -0
  28. data/ext/eigen/eigen3/Eigen/Sparse +27 -0
  29. data/ext/eigen/eigen3/Eigen/SparseCore +64 -0
  30. data/ext/eigen/eigen3/Eigen/SparseLU +49 -0
  31. data/ext/eigen/eigen3/Eigen/SparseQR +33 -0
  32. data/ext/eigen/eigen3/Eigen/StdDeque +27 -0
  33. data/ext/eigen/eigen3/Eigen/StdList +26 -0
  34. data/ext/eigen/eigen3/Eigen/StdVector +27 -0
  35. data/ext/eigen/eigen3/Eigen/SuperLUSupport +59 -0
  36. data/ext/eigen/eigen3/Eigen/UmfPackSupport +36 -0
  37. data/ext/eigen/eigen3/Eigen/src/Cholesky/LDLT.h +611 -0
  38. data/ext/eigen/eigen3/Eigen/src/Cholesky/LLT.h +498 -0
  39. data/ext/eigen/eigen3/Eigen/src/Cholesky/LLT_MKL.h +102 -0
  40. data/ext/eigen/eigen3/Eigen/src/CholmodSupport/CholmodSupport.h +607 -0
  41. data/ext/eigen/eigen3/Eigen/src/Core/Array.h +323 -0
  42. data/ext/eigen/eigen3/Eigen/src/Core/ArrayBase.h +226 -0
  43. data/ext/eigen/eigen3/Eigen/src/Core/ArrayWrapper.h +264 -0
  44. data/ext/eigen/eigen3/Eigen/src/Core/Assign.h +590 -0
  45. data/ext/eigen/eigen3/Eigen/src/Core/Assign_MKL.h +224 -0
  46. data/ext/eigen/eigen3/Eigen/src/Core/BandMatrix.h +334 -0
  47. data/ext/eigen/eigen3/Eigen/src/Core/Block.h +406 -0
  48. data/ext/eigen/eigen3/Eigen/src/Core/BooleanRedux.h +154 -0
  49. data/ext/eigen/eigen3/Eigen/src/Core/CommaInitializer.h +154 -0
  50. data/ext/eigen/eigen3/Eigen/src/Core/CoreIterators.h +61 -0
  51. data/ext/eigen/eigen3/Eigen/src/Core/CwiseBinaryOp.h +230 -0
  52. data/ext/eigen/eigen3/Eigen/src/Core/CwiseNullaryOp.h +864 -0
  53. data/ext/eigen/eigen3/Eigen/src/Core/CwiseUnaryOp.h +126 -0
  54. data/ext/eigen/eigen3/Eigen/src/Core/CwiseUnaryView.h +139 -0
  55. data/ext/eigen/eigen3/Eigen/src/Core/DenseBase.h +521 -0
  56. data/ext/eigen/eigen3/Eigen/src/Core/DenseCoeffsBase.h +754 -0
  57. data/ext/eigen/eigen3/Eigen/src/Core/DenseStorage.h +434 -0
  58. data/ext/eigen/eigen3/Eigen/src/Core/Diagonal.h +237 -0
  59. data/ext/eigen/eigen3/Eigen/src/Core/DiagonalMatrix.h +313 -0
  60. data/ext/eigen/eigen3/Eigen/src/Core/DiagonalProduct.h +131 -0
  61. data/ext/eigen/eigen3/Eigen/src/Core/Dot.h +263 -0
  62. data/ext/eigen/eigen3/Eigen/src/Core/EigenBase.h +131 -0
  63. data/ext/eigen/eigen3/Eigen/src/Core/Flagged.h +140 -0
  64. data/ext/eigen/eigen3/Eigen/src/Core/ForceAlignedAccess.h +146 -0
  65. data/ext/eigen/eigen3/Eigen/src/Core/Functors.h +1026 -0
  66. data/ext/eigen/eigen3/Eigen/src/Core/Fuzzy.h +150 -0
  67. data/ext/eigen/eigen3/Eigen/src/Core/GeneralProduct.h +635 -0
  68. data/ext/eigen/eigen3/Eigen/src/Core/GenericPacketMath.h +350 -0
  69. data/ext/eigen/eigen3/Eigen/src/Core/GlobalFunctions.h +92 -0
  70. data/ext/eigen/eigen3/Eigen/src/Core/IO.h +250 -0
  71. data/ext/eigen/eigen3/Eigen/src/Core/Map.h +192 -0
  72. data/ext/eigen/eigen3/Eigen/src/Core/MapBase.h +247 -0
  73. data/ext/eigen/eigen3/Eigen/src/Core/MathFunctions.h +768 -0
  74. data/ext/eigen/eigen3/Eigen/src/Core/Matrix.h +420 -0
  75. data/ext/eigen/eigen3/Eigen/src/Core/MatrixBase.h +563 -0
  76. data/ext/eigen/eigen3/Eigen/src/Core/NestByValue.h +111 -0
  77. data/ext/eigen/eigen3/Eigen/src/Core/NoAlias.h +134 -0
  78. data/ext/eigen/eigen3/Eigen/src/Core/NumTraits.h +150 -0
  79. data/ext/eigen/eigen3/Eigen/src/Core/PermutationMatrix.h +721 -0
  80. data/ext/eigen/eigen3/Eigen/src/Core/PlainObjectBase.h +822 -0
  81. data/ext/eigen/eigen3/Eigen/src/Core/ProductBase.h +290 -0
  82. data/ext/eigen/eigen3/Eigen/src/Core/Random.h +152 -0
  83. data/ext/eigen/eigen3/Eigen/src/Core/Redux.h +409 -0
  84. data/ext/eigen/eigen3/Eigen/src/Core/Ref.h +278 -0
  85. data/ext/eigen/eigen3/Eigen/src/Core/Replicate.h +177 -0
  86. data/ext/eigen/eigen3/Eigen/src/Core/ReturnByValue.h +99 -0
  87. data/ext/eigen/eigen3/Eigen/src/Core/Reverse.h +224 -0
  88. data/ext/eigen/eigen3/Eigen/src/Core/Select.h +162 -0
  89. data/ext/eigen/eigen3/Eigen/src/Core/SelfAdjointView.h +314 -0
  90. data/ext/eigen/eigen3/Eigen/src/Core/SelfCwiseBinaryOp.h +191 -0
  91. data/ext/eigen/eigen3/Eigen/src/Core/SolveTriangular.h +260 -0
  92. data/ext/eigen/eigen3/Eigen/src/Core/StableNorm.h +203 -0
  93. data/ext/eigen/eigen3/Eigen/src/Core/Stride.h +108 -0
  94. data/ext/eigen/eigen3/Eigen/src/Core/Swap.h +126 -0
  95. data/ext/eigen/eigen3/Eigen/src/Core/Transpose.h +419 -0
  96. data/ext/eigen/eigen3/Eigen/src/Core/Transpositions.h +436 -0
  97. data/ext/eigen/eigen3/Eigen/src/Core/TriangularMatrix.h +839 -0
  98. data/ext/eigen/eigen3/Eigen/src/Core/VectorBlock.h +95 -0
  99. data/ext/eigen/eigen3/Eigen/src/Core/VectorwiseOp.h +642 -0
  100. data/ext/eigen/eigen3/Eigen/src/Core/Visitor.h +237 -0
  101. data/ext/eigen/eigen3/Eigen/src/Core/arch/AltiVec/Complex.h +217 -0
  102. data/ext/eigen/eigen3/Eigen/src/Core/arch/AltiVec/PacketMath.h +501 -0
  103. data/ext/eigen/eigen3/Eigen/src/Core/arch/Default/Settings.h +49 -0
  104. data/ext/eigen/eigen3/Eigen/src/Core/arch/NEON/Complex.h +253 -0
  105. data/ext/eigen/eigen3/Eigen/src/Core/arch/NEON/PacketMath.h +420 -0
  106. data/ext/eigen/eigen3/Eigen/src/Core/arch/SSE/Complex.h +442 -0
  107. data/ext/eigen/eigen3/Eigen/src/Core/arch/SSE/MathFunctions.h +475 -0
  108. data/ext/eigen/eigen3/Eigen/src/Core/arch/SSE/PacketMath.h +649 -0
  109. data/ext/eigen/eigen3/Eigen/src/Core/products/CoeffBasedProduct.h +476 -0
  110. data/ext/eigen/eigen3/Eigen/src/Core/products/GeneralBlockPanelKernel.h +1341 -0
  111. data/ext/eigen/eigen3/Eigen/src/Core/products/GeneralMatrixMatrix.h +427 -0
  112. data/ext/eigen/eigen3/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +278 -0
  113. data/ext/eigen/eigen3/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_MKL.h +146 -0
  114. data/ext/eigen/eigen3/Eigen/src/Core/products/GeneralMatrixMatrix_MKL.h +118 -0
  115. data/ext/eigen/eigen3/Eigen/src/Core/products/GeneralMatrixVector.h +566 -0
  116. data/ext/eigen/eigen3/Eigen/src/Core/products/GeneralMatrixVector_MKL.h +131 -0
  117. data/ext/eigen/eigen3/Eigen/src/Core/products/Parallelizer.h +162 -0
  118. data/ext/eigen/eigen3/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +436 -0
  119. data/ext/eigen/eigen3/Eigen/src/Core/products/SelfadjointMatrixMatrix_MKL.h +295 -0
  120. data/ext/eigen/eigen3/Eigen/src/Core/products/SelfadjointMatrixVector.h +281 -0
  121. data/ext/eigen/eigen3/Eigen/src/Core/products/SelfadjointMatrixVector_MKL.h +114 -0
  122. data/ext/eigen/eigen3/Eigen/src/Core/products/SelfadjointProduct.h +123 -0
  123. data/ext/eigen/eigen3/Eigen/src/Core/products/SelfadjointRank2Update.h +93 -0
  124. data/ext/eigen/eigen3/Eigen/src/Core/products/TriangularMatrixMatrix.h +427 -0
  125. data/ext/eigen/eigen3/Eigen/src/Core/products/TriangularMatrixMatrix_MKL.h +309 -0
  126. data/ext/eigen/eigen3/Eigen/src/Core/products/TriangularMatrixVector.h +348 -0
  127. data/ext/eigen/eigen3/Eigen/src/Core/products/TriangularMatrixVector_MKL.h +247 -0
  128. data/ext/eigen/eigen3/Eigen/src/Core/products/TriangularSolverMatrix.h +332 -0
  129. data/ext/eigen/eigen3/Eigen/src/Core/products/TriangularSolverMatrix_MKL.h +155 -0
  130. data/ext/eigen/eigen3/Eigen/src/Core/products/TriangularSolverVector.h +139 -0
  131. data/ext/eigen/eigen3/Eigen/src/Core/util/BlasUtil.h +264 -0
  132. data/ext/eigen/eigen3/Eigen/src/Core/util/Constants.h +451 -0
  133. data/ext/eigen/eigen3/Eigen/src/Core/util/DisableStupidWarnings.h +40 -0
  134. data/ext/eigen/eigen3/Eigen/src/Core/util/ForwardDeclarations.h +302 -0
  135. data/ext/eigen/eigen3/Eigen/src/Core/util/MKL_support.h +158 -0
  136. data/ext/eigen/eigen3/Eigen/src/Core/util/Macros.h +451 -0
  137. data/ext/eigen/eigen3/Eigen/src/Core/util/Memory.h +977 -0
  138. data/ext/eigen/eigen3/Eigen/src/Core/util/Meta.h +243 -0
  139. data/ext/eigen/eigen3/Eigen/src/Core/util/NonMPL2.h +3 -0
  140. data/ext/eigen/eigen3/Eigen/src/Core/util/ReenableStupidWarnings.h +14 -0
  141. data/ext/eigen/eigen3/Eigen/src/Core/util/StaticAssert.h +208 -0
  142. data/ext/eigen/eigen3/Eigen/src/Core/util/XprHelper.h +469 -0
  143. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Block.h +126 -0
  144. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Cwise.h +192 -0
  145. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/CwiseOperators.h +298 -0
  146. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/AlignedBox.h +159 -0
  147. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/All.h +115 -0
  148. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/AngleAxis.h +214 -0
  149. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/Hyperplane.h +254 -0
  150. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/ParametrizedLine.h +141 -0
  151. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/Quaternion.h +495 -0
  152. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/Rotation2D.h +145 -0
  153. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/RotationBase.h +123 -0
  154. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/Scaling.h +167 -0
  155. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/Transform.h +786 -0
  156. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Geometry/Translation.h +184 -0
  157. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/LU.h +120 -0
  158. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Lazy.h +71 -0
  159. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/LeastSquares.h +169 -0
  160. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Macros.h +20 -0
  161. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/MathFunctions.h +57 -0
  162. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Memory.h +45 -0
  163. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Meta.h +75 -0
  164. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/Minor.h +117 -0
  165. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/QR.h +67 -0
  166. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/SVD.h +637 -0
  167. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/TriangularSolver.h +42 -0
  168. data/ext/eigen/eigen3/Eigen/src/Eigen2Support/VectorBlock.h +94 -0
  169. data/ext/eigen/eigen3/Eigen/src/Eigenvalues/ComplexEigenSolver.h +341 -0
  170. data/ext/eigen/eigen3/Eigen/src/Eigenvalues/ComplexSchur.h +456 -0
  171. data/ext/eigen/eigen3/Eigen/src/Eigenvalues/ComplexSchur_MKL.h +94 -0
  172. data/ext/eigen/eigen3/Eigen/src/Eigenvalues/EigenSolver.h +607 -0
  173. data/ext/eigen/eigen3/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h +350 -0
  174. data/ext/eigen/eigen3/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h +227 -0
  175. data/ext/eigen/eigen3/Eigen/src/Eigenvalues/HessenbergDecomposition.h +373 -0
  176. data/ext/eigen/eigen3/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h +160 -0
  177. data/ext/eigen/eigen3/Eigen/src/Eigenvalues/RealQZ.h +624 -0
  178. data/ext/eigen/eigen3/Eigen/src/Eigenvalues/RealSchur.h +525 -0
  179. data/ext/eigen/eigen3/Eigen/src/Eigenvalues/RealSchur_MKL.h +83 -0
  180. data/ext/eigen/eigen3/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +801 -0
  181. data/ext/eigen/eigen3/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_MKL.h +92 -0
  182. data/ext/eigen/eigen3/Eigen/src/Eigenvalues/Tridiagonalization.h +557 -0
  183. data/ext/eigen/eigen3/Eigen/src/Geometry/AlignedBox.h +392 -0
  184. data/ext/eigen/eigen3/Eigen/src/Geometry/AngleAxis.h +233 -0
  185. data/ext/eigen/eigen3/Eigen/src/Geometry/EulerAngles.h +104 -0
  186. data/ext/eigen/eigen3/Eigen/src/Geometry/Homogeneous.h +307 -0
  187. data/ext/eigen/eigen3/Eigen/src/Geometry/Hyperplane.h +280 -0
  188. data/ext/eigen/eigen3/Eigen/src/Geometry/OrthoMethods.h +218 -0
  189. data/ext/eigen/eigen3/Eigen/src/Geometry/ParametrizedLine.h +195 -0
  190. data/ext/eigen/eigen3/Eigen/src/Geometry/Quaternion.h +776 -0
  191. data/ext/eigen/eigen3/Eigen/src/Geometry/Rotation2D.h +160 -0
  192. data/ext/eigen/eigen3/Eigen/src/Geometry/RotationBase.h +206 -0
  193. data/ext/eigen/eigen3/Eigen/src/Geometry/Scaling.h +166 -0
  194. data/ext/eigen/eigen3/Eigen/src/Geometry/Transform.h +1455 -0
  195. data/ext/eigen/eigen3/Eigen/src/Geometry/Translation.h +206 -0
  196. data/ext/eigen/eigen3/Eigen/src/Geometry/Umeyama.h +177 -0
  197. data/ext/eigen/eigen3/Eigen/src/Geometry/arch/Geometry_SSE.h +115 -0
  198. data/ext/eigen/eigen3/Eigen/src/Householder/BlockHouseholder.h +68 -0
  199. data/ext/eigen/eigen3/Eigen/src/Householder/Householder.h +171 -0
  200. data/ext/eigen/eigen3/Eigen/src/Householder/HouseholderSequence.h +441 -0
  201. data/ext/eigen/eigen3/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +149 -0
  202. data/ext/eigen/eigen3/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +263 -0
  203. data/ext/eigen/eigen3/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +256 -0
  204. data/ext/eigen/eigen3/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +282 -0
  205. data/ext/eigen/eigen3/Eigen/src/Jacobi/Jacobi.h +433 -0
  206. data/ext/eigen/eigen3/Eigen/src/LU/Determinant.h +101 -0
  207. data/ext/eigen/eigen3/Eigen/src/LU/FullPivLU.h +751 -0
  208. data/ext/eigen/eigen3/Eigen/src/LU/Inverse.h +400 -0
  209. data/ext/eigen/eigen3/Eigen/src/LU/PartialPivLU.h +509 -0
  210. data/ext/eigen/eigen3/Eigen/src/LU/PartialPivLU_MKL.h +85 -0
  211. data/ext/eigen/eigen3/Eigen/src/LU/arch/Inverse_SSE.h +329 -0
  212. data/ext/eigen/eigen3/Eigen/src/MetisSupport/MetisSupport.h +137 -0
  213. data/ext/eigen/eigen3/Eigen/src/OrderingMethods/Amd.h +444 -0
  214. data/ext/eigen/eigen3/Eigen/src/OrderingMethods/Eigen_Colamd.h +1850 -0
  215. data/ext/eigen/eigen3/Eigen/src/PaStiXSupport/PaStiXSupport.h +721 -0
  216. data/ext/eigen/eigen3/Eigen/src/PardisoSupport/PardisoSupport.h +592 -0
  217. data/ext/eigen/eigen3/Eigen/src/QR/ColPivHouseholderQR.h +580 -0
  218. data/ext/eigen/eigen3/Eigen/src/QR/ColPivHouseholderQR_MKL.h +99 -0
  219. data/ext/eigen/eigen3/Eigen/src/QR/FullPivHouseholderQR.h +622 -0
  220. data/ext/eigen/eigen3/Eigen/src/QR/HouseholderQR.h +388 -0
  221. data/ext/eigen/eigen3/Eigen/src/QR/HouseholderQR_MKL.h +71 -0
  222. data/ext/eigen/eigen3/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h +338 -0
  223. data/ext/eigen/eigen3/Eigen/src/SVD/JacobiSVD.h +976 -0
  224. data/ext/eigen/eigen3/Eigen/src/SVD/JacobiSVD_MKL.h +92 -0
  225. data/ext/eigen/eigen3/Eigen/src/SVD/UpperBidiagonalization.h +148 -0
  226. data/ext/eigen/eigen3/Eigen/src/SparseCholesky/SimplicialCholesky.h +671 -0
  227. data/ext/eigen/eigen3/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h +199 -0
  228. data/ext/eigen/eigen3/Eigen/src/SparseCore/AmbiVector.h +373 -0
  229. data/ext/eigen/eigen3/Eigen/src/SparseCore/CompressedStorage.h +233 -0
  230. data/ext/eigen/eigen3/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h +245 -0
  231. data/ext/eigen/eigen3/Eigen/src/SparseCore/MappedSparseMatrix.h +181 -0
  232. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseBlock.h +537 -0
  233. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseColEtree.h +206 -0
  234. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +325 -0
  235. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseCwiseUnaryOp.h +163 -0
  236. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseDenseProduct.h +311 -0
  237. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseDiagonalProduct.h +196 -0
  238. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseDot.h +101 -0
  239. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseFuzzy.h +26 -0
  240. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseMatrix.h +1262 -0
  241. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseMatrixBase.h +461 -0
  242. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparsePermutation.h +148 -0
  243. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseProduct.h +188 -0
  244. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseRedux.h +45 -0
  245. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseSelfAdjointView.h +507 -0
  246. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseSparseProductWithPruning.h +150 -0
  247. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseTranspose.h +63 -0
  248. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseTriangularView.h +179 -0
  249. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseUtil.h +172 -0
  250. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseVector.h +448 -0
  251. data/ext/eigen/eigen3/Eigen/src/SparseCore/SparseView.h +99 -0
  252. data/ext/eigen/eigen3/Eigen/src/SparseCore/TriangularSolver.h +334 -0
  253. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU.h +806 -0
  254. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLUImpl.h +66 -0
  255. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_Memory.h +227 -0
  256. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_Structs.h +111 -0
  257. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h +298 -0
  258. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_Utils.h +80 -0
  259. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_column_bmod.h +180 -0
  260. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_column_dfs.h +177 -0
  261. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h +106 -0
  262. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_gemm_kernel.h +279 -0
  263. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h +127 -0
  264. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_kernel_bmod.h +130 -0
  265. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_panel_bmod.h +223 -0
  266. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_panel_dfs.h +258 -0
  267. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_pivotL.h +137 -0
  268. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_pruneL.h +135 -0
  269. data/ext/eigen/eigen3/Eigen/src/SparseLU/SparseLU_relax_snode.h +83 -0
  270. data/ext/eigen/eigen3/Eigen/src/SparseQR/SparseQR.h +714 -0
  271. data/ext/eigen/eigen3/Eigen/src/StlSupport/StdDeque.h +134 -0
  272. data/ext/eigen/eigen3/Eigen/src/StlSupport/StdList.h +114 -0
  273. data/ext/eigen/eigen3/Eigen/src/StlSupport/StdVector.h +126 -0
  274. data/ext/eigen/eigen3/Eigen/src/StlSupport/details.h +84 -0
  275. data/ext/eigen/eigen3/Eigen/src/SuperLUSupport/SuperLUSupport.h +1026 -0
  276. data/ext/eigen/eigen3/Eigen/src/UmfPackSupport/UmfPackSupport.h +474 -0
  277. data/ext/eigen/eigen3/Eigen/src/misc/Image.h +84 -0
  278. data/ext/eigen/eigen3/Eigen/src/misc/Kernel.h +81 -0
  279. data/ext/eigen/eigen3/Eigen/src/misc/Solve.h +76 -0
  280. data/ext/eigen/eigen3/Eigen/src/misc/SparseSolve.h +128 -0
  281. data/ext/eigen/eigen3/Eigen/src/misc/blas.h +658 -0
  282. data/ext/eigen/eigen3/Eigen/src/plugins/ArrayCwiseBinaryOps.h +253 -0
  283. data/ext/eigen/eigen3/Eigen/src/plugins/ArrayCwiseUnaryOps.h +187 -0
  284. data/ext/eigen/eigen3/Eigen/src/plugins/BlockMethods.h +935 -0
  285. data/ext/eigen/eigen3/Eigen/src/plugins/CommonCwiseBinaryOps.h +46 -0
  286. data/ext/eigen/eigen3/Eigen/src/plugins/CommonCwiseUnaryOps.h +172 -0
  287. data/ext/eigen/eigen3/Eigen/src/plugins/MatrixCwiseBinaryOps.h +143 -0
  288. data/ext/eigen/eigen3/Eigen/src/plugins/MatrixCwiseUnaryOps.h +52 -0
  289. data/ext/eigen/eigen3/signature_of_eigen3_matrix_library +1 -0
  290. data/ext/eigen/eigen_wrap.cxx +19420 -10396
  291. data/ext/eigen/extconf.rb +37 -2
  292. data/lib/eigen.rb +146 -3
  293. metadata +294 -7
@@ -0,0 +1,94 @@
1
+ /*
2
+ Copyright (c) 2011, Intel Corporation. All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without modification,
5
+ are permitted provided that the following conditions are met:
6
+
7
+ * Redistributions of source code must retain the above copyright notice, this
8
+ list of conditions and the following disclaimer.
9
+ * Redistributions in binary form must reproduce the above copyright notice,
10
+ this list of conditions and the following disclaimer in the documentation
11
+ and/or other materials provided with the distribution.
12
+ * Neither the name of Intel Corporation nor the names of its contributors may
13
+ be used to endorse or promote products derived from this software without
14
+ specific prior written permission.
15
+
16
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
20
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
23
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
+
27
+ ********************************************************************************
28
+ * Content : Eigen bindings to Intel(R) MKL
29
+ * Complex Schur needed to complex unsymmetrical eigenvalues/eigenvectors.
30
+ ********************************************************************************
31
+ */
32
+
33
+ #ifndef EIGEN_COMPLEX_SCHUR_MKL_H
34
+ #define EIGEN_COMPLEX_SCHUR_MKL_H
35
+
36
+ #include "Eigen/src/Core/util/MKL_support.h"
37
+
38
+ namespace Eigen {
39
+
40
+ /** \internal Specialization for the data types supported by MKL */
41
+
42
+ #define EIGEN_MKL_SCHUR_COMPLEX(EIGTYPE, MKLTYPE, MKLPREFIX, MKLPREFIX_U, EIGCOLROW, MKLCOLROW) \
43
+ template<> inline \
44
+ ComplexSchur<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW> >& \
45
+ ComplexSchur<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW> >::compute(const Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW>& matrix, bool computeU) \
46
+ { \
47
+ typedef Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW> MatrixType; \
48
+ typedef MatrixType::Scalar Scalar; \
49
+ typedef MatrixType::RealScalar RealScalar; \
50
+ typedef std::complex<RealScalar> ComplexScalar; \
51
+ \
52
+ eigen_assert(matrix.cols() == matrix.rows()); \
53
+ \
54
+ m_matUisUptodate = false; \
55
+ if(matrix.cols() == 1) \
56
+ { \
57
+ m_matT = matrix.cast<ComplexScalar>(); \
58
+ if(computeU) m_matU = ComplexMatrixType::Identity(1,1); \
59
+ m_info = Success; \
60
+ m_isInitialized = true; \
61
+ m_matUisUptodate = computeU; \
62
+ return *this; \
63
+ } \
64
+ lapack_int n = matrix.cols(), sdim, info; \
65
+ lapack_int lda = matrix.outerStride(); \
66
+ lapack_int matrix_order = MKLCOLROW; \
67
+ char jobvs, sort='N'; \
68
+ LAPACK_##MKLPREFIX_U##_SELECT1 select = 0; \
69
+ jobvs = (computeU) ? 'V' : 'N'; \
70
+ m_matU.resize(n, n); \
71
+ lapack_int ldvs = m_matU.outerStride(); \
72
+ m_matT = matrix; \
73
+ Matrix<EIGTYPE, Dynamic, Dynamic> w; \
74
+ w.resize(n, 1);\
75
+ info = LAPACKE_##MKLPREFIX##gees( matrix_order, jobvs, sort, select, n, (MKLTYPE*)m_matT.data(), lda, &sdim, (MKLTYPE*)w.data(), (MKLTYPE*)m_matU.data(), ldvs ); \
76
+ if(info == 0) \
77
+ m_info = Success; \
78
+ else \
79
+ m_info = NoConvergence; \
80
+ \
81
+ m_isInitialized = true; \
82
+ m_matUisUptodate = computeU; \
83
+ return *this; \
84
+ \
85
+ }
86
+
87
+ EIGEN_MKL_SCHUR_COMPLEX(dcomplex, MKL_Complex16, z, Z, ColMajor, LAPACK_COL_MAJOR)
88
+ EIGEN_MKL_SCHUR_COMPLEX(scomplex, MKL_Complex8, c, C, ColMajor, LAPACK_COL_MAJOR)
89
+ EIGEN_MKL_SCHUR_COMPLEX(dcomplex, MKL_Complex16, z, Z, RowMajor, LAPACK_ROW_MAJOR)
90
+ EIGEN_MKL_SCHUR_COMPLEX(scomplex, MKL_Complex8, c, C, RowMajor, LAPACK_ROW_MAJOR)
91
+
92
+ } // end namespace Eigen
93
+
94
+ #endif // EIGEN_COMPLEX_SCHUR_MKL_H
@@ -0,0 +1,607 @@
1
+ // This file is part of Eigen, a lightweight C++ template library
2
+ // for linear algebra.
3
+ //
4
+ // Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>
5
+ // Copyright (C) 2010,2012 Jitse Niesen <jitse@maths.leeds.ac.uk>
6
+ //
7
+ // This Source Code Form is subject to the terms of the Mozilla
8
+ // Public License v. 2.0. If a copy of the MPL was not distributed
9
+ // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
10
+
11
+ #ifndef EIGEN_EIGENSOLVER_H
12
+ #define EIGEN_EIGENSOLVER_H
13
+
14
+ #include "./RealSchur.h"
15
+
16
+ namespace Eigen {
17
+
18
+ /** \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 typename MatrixType::Index Index;
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
+ EigenSolver(Index size)
122
+ : m_eivec(size, size),
123
+ m_eivalues(size),
124
+ m_isInitialized(false),
125
+ m_eigenvectorsOk(false),
126
+ 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
+ EigenSolver(const MatrixType& matrix, bool computeEigenvectors = true)
147
+ : m_eivec(matrix.rows(), matrix.cols()),
148
+ m_eivalues(matrix.cols()),
149
+ m_isInitialized(false),
150
+ m_eigenvectorsOk(false),
151
+ m_realSchur(matrix.cols()),
152
+ m_matT(matrix.rows(), matrix.cols()),
153
+ m_tmp(matrix.cols())
154
+ {
155
+ compute(matrix, computeEigenvectors);
156
+ }
157
+
158
+ /** \brief Returns the eigenvectors of given matrix.
159
+ *
160
+ * \returns %Matrix whose columns are the (possibly complex) eigenvectors.
161
+ *
162
+ * \pre Either the constructor
163
+ * EigenSolver(const MatrixType&,bool) or the member function
164
+ * compute(const MatrixType&, bool) has been called before, and
165
+ * \p computeEigenvectors was set to true (the default).
166
+ *
167
+ * Column \f$ k \f$ of the returned matrix is an eigenvector corresponding
168
+ * to eigenvalue number \f$ k \f$ as returned by eigenvalues(). The
169
+ * eigenvectors are normalized to have (Euclidean) norm equal to one. The
170
+ * matrix returned by this function is the matrix \f$ V \f$ in the
171
+ * eigendecomposition \f$ A = V D V^{-1} \f$, if it exists.
172
+ *
173
+ * Example: \include EigenSolver_eigenvectors.cpp
174
+ * Output: \verbinclude EigenSolver_eigenvectors.out
175
+ *
176
+ * \sa eigenvalues(), pseudoEigenvectors()
177
+ */
178
+ EigenvectorsType eigenvectors() const;
179
+
180
+ /** \brief Returns the pseudo-eigenvectors of given matrix.
181
+ *
182
+ * \returns Const reference to matrix whose columns are the pseudo-eigenvectors.
183
+ *
184
+ * \pre Either the constructor
185
+ * EigenSolver(const MatrixType&,bool) or the member function
186
+ * compute(const MatrixType&, bool) has been called before, and
187
+ * \p computeEigenvectors was set to true (the default).
188
+ *
189
+ * The real matrix \f$ V \f$ returned by this function and the
190
+ * block-diagonal matrix \f$ D \f$ returned by pseudoEigenvalueMatrix()
191
+ * satisfy \f$ AV = VD \f$.
192
+ *
193
+ * Example: \include EigenSolver_pseudoEigenvectors.cpp
194
+ * Output: \verbinclude EigenSolver_pseudoEigenvectors.out
195
+ *
196
+ * \sa pseudoEigenvalueMatrix(), eigenvectors()
197
+ */
198
+ const MatrixType& pseudoEigenvectors() const
199
+ {
200
+ eigen_assert(m_isInitialized && "EigenSolver is not initialized.");
201
+ eigen_assert(m_eigenvectorsOk && "The eigenvectors have not been computed together with the eigenvalues.");
202
+ return m_eivec;
203
+ }
204
+
205
+ /** \brief Returns the block-diagonal matrix in the pseudo-eigendecomposition.
206
+ *
207
+ * \returns A block-diagonal matrix.
208
+ *
209
+ * \pre Either the constructor
210
+ * EigenSolver(const MatrixType&,bool) or the member function
211
+ * compute(const MatrixType&, bool) has been called before.
212
+ *
213
+ * The matrix \f$ D \f$ returned by this function is real and
214
+ * block-diagonal. The blocks on the diagonal are either 1-by-1 or 2-by-2
215
+ * blocks of the form
216
+ * \f$ \begin{bmatrix} u & v \\ -v & u \end{bmatrix} \f$.
217
+ * These blocks are not sorted in any particular order.
218
+ * The matrix \f$ D \f$ and the matrix \f$ V \f$ returned by
219
+ * pseudoEigenvectors() satisfy \f$ AV = VD \f$.
220
+ *
221
+ * \sa pseudoEigenvectors() for an example, eigenvalues()
222
+ */
223
+ MatrixType pseudoEigenvalueMatrix() const;
224
+
225
+ /** \brief Returns the eigenvalues of given matrix.
226
+ *
227
+ * \returns A const reference to the column vector containing the eigenvalues.
228
+ *
229
+ * \pre Either the constructor
230
+ * EigenSolver(const MatrixType&,bool) or the member function
231
+ * compute(const MatrixType&, bool) has been called before.
232
+ *
233
+ * The eigenvalues are repeated according to their algebraic multiplicity,
234
+ * so there are as many eigenvalues as rows in the matrix. The eigenvalues
235
+ * are not sorted in any particular order.
236
+ *
237
+ * Example: \include EigenSolver_eigenvalues.cpp
238
+ * Output: \verbinclude EigenSolver_eigenvalues.out
239
+ *
240
+ * \sa eigenvectors(), pseudoEigenvalueMatrix(),
241
+ * MatrixBase::eigenvalues()
242
+ */
243
+ const EigenvalueType& eigenvalues() const
244
+ {
245
+ eigen_assert(m_isInitialized && "EigenSolver is not initialized.");
246
+ return m_eivalues;
247
+ }
248
+
249
+ /** \brief Computes eigendecomposition of given matrix.
250
+ *
251
+ * \param[in] matrix Square matrix whose eigendecomposition is to be computed.
252
+ * \param[in] computeEigenvectors If true, both the eigenvectors and the
253
+ * eigenvalues are computed; if false, only the eigenvalues are
254
+ * computed.
255
+ * \returns Reference to \c *this
256
+ *
257
+ * This function computes the eigenvalues of the real matrix \p matrix.
258
+ * The eigenvalues() function can be used to retrieve them. If
259
+ * \p computeEigenvectors is true, then the eigenvectors are also computed
260
+ * and can be retrieved by calling eigenvectors().
261
+ *
262
+ * The matrix is first reduced to real Schur form using the RealSchur
263
+ * class. The Schur decomposition is then used to compute the eigenvalues
264
+ * and eigenvectors.
265
+ *
266
+ * The cost of the computation is dominated by the cost of the
267
+ * Schur decomposition, which is very approximately \f$ 25n^3 \f$
268
+ * (where \f$ n \f$ is the size of the matrix) if \p computeEigenvectors
269
+ * is true, and \f$ 10n^3 \f$ if \p computeEigenvectors is false.
270
+ *
271
+ * This method reuses of the allocated data in the EigenSolver object.
272
+ *
273
+ * Example: \include EigenSolver_compute.cpp
274
+ * Output: \verbinclude EigenSolver_compute.out
275
+ */
276
+ EigenSolver& compute(const MatrixType& matrix, bool computeEigenvectors = true);
277
+
278
+ ComputationInfo info() const
279
+ {
280
+ eigen_assert(m_isInitialized && "EigenSolver is not initialized.");
281
+ return m_realSchur.info();
282
+ }
283
+
284
+ /** \brief Sets the maximum number of iterations allowed. */
285
+ EigenSolver& setMaxIterations(Index maxIters)
286
+ {
287
+ m_realSchur.setMaxIterations(maxIters);
288
+ return *this;
289
+ }
290
+
291
+ /** \brief Returns the maximum number of iterations. */
292
+ Index getMaxIterations()
293
+ {
294
+ return m_realSchur.getMaxIterations();
295
+ }
296
+
297
+ private:
298
+ void doComputeEigenvectors();
299
+
300
+ protected:
301
+
302
+ static void check_template_parameters()
303
+ {
304
+ EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar);
305
+ EIGEN_STATIC_ASSERT(!NumTraits<Scalar>::IsComplex, NUMERIC_TYPE_MUST_BE_REAL);
306
+ }
307
+
308
+ MatrixType m_eivec;
309
+ EigenvalueType m_eivalues;
310
+ bool m_isInitialized;
311
+ bool m_eigenvectorsOk;
312
+ RealSchur<MatrixType> m_realSchur;
313
+ MatrixType m_matT;
314
+
315
+ typedef Matrix<Scalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> ColumnVectorType;
316
+ ColumnVectorType m_tmp;
317
+ };
318
+
319
+ template<typename MatrixType>
320
+ MatrixType EigenSolver<MatrixType>::pseudoEigenvalueMatrix() const
321
+ {
322
+ eigen_assert(m_isInitialized && "EigenSolver is not initialized.");
323
+ Index n = m_eivalues.rows();
324
+ MatrixType matD = MatrixType::Zero(n,n);
325
+ for (Index i=0; i<n; ++i)
326
+ {
327
+ if (internal::isMuchSmallerThan(numext::imag(m_eivalues.coeff(i)), numext::real(m_eivalues.coeff(i))))
328
+ matD.coeffRef(i,i) = numext::real(m_eivalues.coeff(i));
329
+ else
330
+ {
331
+ matD.template block<2,2>(i,i) << numext::real(m_eivalues.coeff(i)), numext::imag(m_eivalues.coeff(i)),
332
+ -numext::imag(m_eivalues.coeff(i)), numext::real(m_eivalues.coeff(i));
333
+ ++i;
334
+ }
335
+ }
336
+ return matD;
337
+ }
338
+
339
+ template<typename MatrixType>
340
+ typename EigenSolver<MatrixType>::EigenvectorsType EigenSolver<MatrixType>::eigenvectors() const
341
+ {
342
+ eigen_assert(m_isInitialized && "EigenSolver is not initialized.");
343
+ eigen_assert(m_eigenvectorsOk && "The eigenvectors have not been computed together with the eigenvalues.");
344
+ Index n = m_eivec.cols();
345
+ EigenvectorsType matV(n,n);
346
+ for (Index j=0; j<n; ++j)
347
+ {
348
+ if (internal::isMuchSmallerThan(numext::imag(m_eivalues.coeff(j)), numext::real(m_eivalues.coeff(j))) || j+1==n)
349
+ {
350
+ // we have a real eigen value
351
+ matV.col(j) = m_eivec.col(j).template cast<ComplexScalar>();
352
+ matV.col(j).normalize();
353
+ }
354
+ else
355
+ {
356
+ // we have a pair of complex eigen values
357
+ for (Index i=0; i<n; ++i)
358
+ {
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));
361
+ }
362
+ matV.col(j).normalize();
363
+ matV.col(j+1).normalize();
364
+ ++j;
365
+ }
366
+ }
367
+ return matV;
368
+ }
369
+
370
+ template<typename MatrixType>
371
+ EigenSolver<MatrixType>&
372
+ EigenSolver<MatrixType>::compute(const MatrixType& matrix, bool computeEigenvectors)
373
+ {
374
+ check_template_parameters();
375
+
376
+ using std::sqrt;
377
+ using std::abs;
378
+ eigen_assert(matrix.cols() == matrix.rows());
379
+
380
+ // Reduce to real Schur form.
381
+ m_realSchur.compute(matrix, computeEigenvectors);
382
+
383
+ if (m_realSchur.info() == Success)
384
+ {
385
+ m_matT = m_realSchur.matrixT();
386
+ if (computeEigenvectors)
387
+ m_eivec = m_realSchur.matrixU();
388
+
389
+ // Compute eigenvalues from matT
390
+ m_eivalues.resize(matrix.cols());
391
+ Index i = 0;
392
+ while (i < matrix.cols())
393
+ {
394
+ if (i == matrix.cols() - 1 || m_matT.coeff(i+1, i) == Scalar(0))
395
+ {
396
+ m_eivalues.coeffRef(i) = m_matT.coeff(i, i);
397
+ ++i;
398
+ }
399
+ else
400
+ {
401
+ Scalar p = Scalar(0.5) * (m_matT.coeff(i, i) - m_matT.coeff(i+1, i+1));
402
+ Scalar z = sqrt(abs(p * p + m_matT.coeff(i+1, i) * m_matT.coeff(i, i+1)));
403
+ m_eivalues.coeffRef(i) = ComplexScalar(m_matT.coeff(i+1, i+1) + p, z);
404
+ m_eivalues.coeffRef(i+1) = ComplexScalar(m_matT.coeff(i+1, i+1) + p, -z);
405
+ i += 2;
406
+ }
407
+ }
408
+
409
+ // Compute eigenvectors.
410
+ if (computeEigenvectors)
411
+ doComputeEigenvectors();
412
+ }
413
+
414
+ m_isInitialized = true;
415
+ m_eigenvectorsOk = computeEigenvectors;
416
+
417
+ return *this;
418
+ }
419
+
420
+ // Complex scalar division.
421
+ template<typename Scalar>
422
+ std::complex<Scalar> cdiv(const Scalar& xr, const Scalar& xi, const Scalar& yr, const Scalar& yi)
423
+ {
424
+ using std::abs;
425
+ Scalar r,d;
426
+ if (abs(yr) > abs(yi))
427
+ {
428
+ r = yi/yr;
429
+ d = yr + r*yi;
430
+ return std::complex<Scalar>((xr + r*xi)/d, (xi - r*xr)/d);
431
+ }
432
+ else
433
+ {
434
+ r = yr/yi;
435
+ d = yi + r*yr;
436
+ return std::complex<Scalar>((r*xr + xi)/d, (r*xi - xr)/d);
437
+ }
438
+ }
439
+
440
+
441
+ template<typename MatrixType>
442
+ void EigenSolver<MatrixType>::doComputeEigenvectors()
443
+ {
444
+ using std::abs;
445
+ const Index size = m_eivec.cols();
446
+ const Scalar eps = NumTraits<Scalar>::epsilon();
447
+
448
+ // inefficient! this is already computed in RealSchur
449
+ Scalar norm(0);
450
+ for (Index j = 0; j < size; ++j)
451
+ {
452
+ norm += m_matT.row(j).segment((std::max)(j-1,Index(0)), size-(std::max)(j-1,Index(0))).cwiseAbs().sum();
453
+ }
454
+
455
+ // Backsubstitute to find vectors of upper triangular form
456
+ if (norm == 0.0)
457
+ {
458
+ return;
459
+ }
460
+
461
+ for (Index n = size-1; n >= 0; n--)
462
+ {
463
+ Scalar p = m_eivalues.coeff(n).real();
464
+ Scalar q = m_eivalues.coeff(n).imag();
465
+
466
+ // Scalar vector
467
+ if (q == Scalar(0))
468
+ {
469
+ Scalar lastr(0), lastw(0);
470
+ Index l = n;
471
+
472
+ m_matT.coeffRef(n,n) = 1.0;
473
+ for (Index i = n-1; i >= 0; i--)
474
+ {
475
+ Scalar w = m_matT.coeff(i,i) - p;
476
+ Scalar r = m_matT.row(i).segment(l,n-l+1).dot(m_matT.col(n).segment(l, n-l+1));
477
+
478
+ if (m_eivalues.coeff(i).imag() < 0.0)
479
+ {
480
+ lastw = w;
481
+ lastr = r;
482
+ }
483
+ else
484
+ {
485
+ l = i;
486
+ if (m_eivalues.coeff(i).imag() == 0.0)
487
+ {
488
+ if (w != 0.0)
489
+ m_matT.coeffRef(i,n) = -r / w;
490
+ else
491
+ m_matT.coeffRef(i,n) = -r / (eps * norm);
492
+ }
493
+ else // Solve real equations
494
+ {
495
+ Scalar x = m_matT.coeff(i,i+1);
496
+ Scalar y = m_matT.coeff(i+1,i);
497
+ Scalar denom = (m_eivalues.coeff(i).real() - p) * (m_eivalues.coeff(i).real() - p) + m_eivalues.coeff(i).imag() * m_eivalues.coeff(i).imag();
498
+ Scalar t = (x * lastr - lastw * r) / denom;
499
+ m_matT.coeffRef(i,n) = t;
500
+ if (abs(x) > abs(lastw))
501
+ m_matT.coeffRef(i+1,n) = (-r - w * t) / x;
502
+ else
503
+ m_matT.coeffRef(i+1,n) = (-lastr - y * t) / lastw;
504
+ }
505
+
506
+ // Overflow control
507
+ Scalar t = abs(m_matT.coeff(i,n));
508
+ if ((eps * t) * t > Scalar(1))
509
+ m_matT.col(n).tail(size-i) /= t;
510
+ }
511
+ }
512
+ }
513
+ else if (q < Scalar(0) && n > 0) // Complex vector
514
+ {
515
+ Scalar lastra(0), lastsa(0), lastw(0);
516
+ Index l = n-1;
517
+
518
+ // Last vector component imaginary so matrix is triangular
519
+ if (abs(m_matT.coeff(n,n-1)) > abs(m_matT.coeff(n-1,n)))
520
+ {
521
+ m_matT.coeffRef(n-1,n-1) = q / m_matT.coeff(n,n-1);
522
+ m_matT.coeffRef(n-1,n) = -(m_matT.coeff(n,n) - p) / m_matT.coeff(n,n-1);
523
+ }
524
+ else
525
+ {
526
+ std::complex<Scalar> cc = cdiv<Scalar>(0.0,-m_matT.coeff(n-1,n),m_matT.coeff(n-1,n-1)-p,q);
527
+ m_matT.coeffRef(n-1,n-1) = numext::real(cc);
528
+ m_matT.coeffRef(n-1,n) = numext::imag(cc);
529
+ }
530
+ m_matT.coeffRef(n,n-1) = 0.0;
531
+ m_matT.coeffRef(n,n) = 1.0;
532
+ for (Index i = n-2; i >= 0; i--)
533
+ {
534
+ Scalar ra = m_matT.row(i).segment(l, n-l+1).dot(m_matT.col(n-1).segment(l, n-l+1));
535
+ Scalar sa = m_matT.row(i).segment(l, n-l+1).dot(m_matT.col(n).segment(l, n-l+1));
536
+ Scalar w = m_matT.coeff(i,i) - p;
537
+
538
+ if (m_eivalues.coeff(i).imag() < 0.0)
539
+ {
540
+ lastw = w;
541
+ lastra = ra;
542
+ lastsa = sa;
543
+ }
544
+ else
545
+ {
546
+ l = i;
547
+ if (m_eivalues.coeff(i).imag() == RealScalar(0))
548
+ {
549
+ std::complex<Scalar> cc = cdiv(-ra,-sa,w,q);
550
+ m_matT.coeffRef(i,n-1) = numext::real(cc);
551
+ m_matT.coeffRef(i,n) = numext::imag(cc);
552
+ }
553
+ else
554
+ {
555
+ // Solve complex equations
556
+ Scalar x = m_matT.coeff(i,i+1);
557
+ Scalar y = m_matT.coeff(i+1,i);
558
+ 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;
559
+ Scalar vi = (m_eivalues.coeff(i).real() - p) * Scalar(2) * q;
560
+ if ((vr == 0.0) && (vi == 0.0))
561
+ vr = eps * norm * (abs(w) + abs(q) + abs(x) + abs(y) + abs(lastw));
562
+
563
+ std::complex<Scalar> cc = cdiv(x*lastra-lastw*ra+q*sa,x*lastsa-lastw*sa-q*ra,vr,vi);
564
+ m_matT.coeffRef(i,n-1) = numext::real(cc);
565
+ m_matT.coeffRef(i,n) = numext::imag(cc);
566
+ if (abs(x) > (abs(lastw) + abs(q)))
567
+ {
568
+ m_matT.coeffRef(i+1,n-1) = (-ra - w * m_matT.coeff(i,n-1) + q * m_matT.coeff(i,n)) / x;
569
+ m_matT.coeffRef(i+1,n) = (-sa - w * m_matT.coeff(i,n) - q * m_matT.coeff(i,n-1)) / x;
570
+ }
571
+ else
572
+ {
573
+ cc = cdiv(-lastra-y*m_matT.coeff(i,n-1),-lastsa-y*m_matT.coeff(i,n),lastw,q);
574
+ m_matT.coeffRef(i+1,n-1) = numext::real(cc);
575
+ m_matT.coeffRef(i+1,n) = numext::imag(cc);
576
+ }
577
+ }
578
+
579
+ // Overflow control
580
+ using std::max;
581
+ Scalar t = (max)(abs(m_matT.coeff(i,n-1)),abs(m_matT.coeff(i,n)));
582
+ if ((eps * t) * t > Scalar(1))
583
+ m_matT.block(i, n-1, size-i, 2) /= t;
584
+
585
+ }
586
+ }
587
+
588
+ // We handled a pair of complex conjugate eigenvalues, so need to skip them both
589
+ n--;
590
+ }
591
+ else
592
+ {
593
+ eigen_assert(0 && "Internal bug in EigenSolver"); // this should not happen
594
+ }
595
+ }
596
+
597
+ // Back transformation to get eigenvectors of original matrix
598
+ for (Index j = size-1; j >= 0; j--)
599
+ {
600
+ m_tmp.noalias() = m_eivec.leftCols(j+1) * m_matT.col(j).segment(0, j+1);
601
+ m_eivec.col(j) = m_tmp;
602
+ }
603
+ }
604
+
605
+ } // end namespace Eigen
606
+
607
+ #endif // EIGEN_EIGENSOLVER_H