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,436 @@
1
+ // This file is part of Eigen, a lightweight C++ template library
2
+ // for linear algebra.
3
+ //
4
+ // Copyright (C) 2010-2011 Gael Guennebaud <gael.guennebaud@inria.fr>
5
+ //
6
+ // This Source Code Form is subject to the terms of the Mozilla
7
+ // Public License v. 2.0. If a copy of the MPL was not distributed
8
+ // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9
+
10
+ #ifndef EIGEN_TRANSPOSITIONS_H
11
+ #define EIGEN_TRANSPOSITIONS_H
12
+
13
+ namespace Eigen {
14
+
15
+ /** \class Transpositions
16
+ * \ingroup Core_Module
17
+ *
18
+ * \brief Represents a sequence of transpositions (row/column interchange)
19
+ *
20
+ * \param SizeAtCompileTime the number of transpositions, or Dynamic
21
+ * \param MaxSizeAtCompileTime the maximum number of transpositions, or Dynamic. This optional parameter defaults to SizeAtCompileTime. Most of the time, you should not have to specify it.
22
+ *
23
+ * This class represents a permutation transformation as a sequence of \em n transpositions
24
+ * \f$[T_{n-1} \ldots T_{i} \ldots T_{0}]\f$. It is internally stored as a vector of integers \c indices.
25
+ * Each transposition \f$ T_{i} \f$ applied on the left of a matrix (\f$ T_{i} M\f$) interchanges
26
+ * the rows \c i and \c indices[i] of the matrix \c M.
27
+ * A transposition applied on the right (e.g., \f$ M T_{i}\f$) yields a column interchange.
28
+ *
29
+ * Compared to the class PermutationMatrix, such a sequence of transpositions is what is
30
+ * computed during a decomposition with pivoting, and it is faster when applying the permutation in-place.
31
+ *
32
+ * To apply a sequence of transpositions to a matrix, simply use the operator * as in the following example:
33
+ * \code
34
+ * Transpositions tr;
35
+ * MatrixXf mat;
36
+ * mat = tr * mat;
37
+ * \endcode
38
+ * In this example, we detect that the matrix appears on both side, and so the transpositions
39
+ * are applied in-place without any temporary or extra copy.
40
+ *
41
+ * \sa class PermutationMatrix
42
+ */
43
+
44
+ namespace internal {
45
+ template<typename TranspositionType, typename MatrixType, int Side, bool Transposed=false> struct transposition_matrix_product_retval;
46
+ }
47
+
48
+ template<typename Derived>
49
+ class TranspositionsBase
50
+ {
51
+ typedef internal::traits<Derived> Traits;
52
+
53
+ public:
54
+
55
+ typedef typename Traits::IndicesType IndicesType;
56
+ typedef typename IndicesType::Scalar Index;
57
+
58
+ Derived& derived() { return *static_cast<Derived*>(this); }
59
+ const Derived& derived() const { return *static_cast<const Derived*>(this); }
60
+
61
+ /** Copies the \a other transpositions into \c *this */
62
+ template<typename OtherDerived>
63
+ Derived& operator=(const TranspositionsBase<OtherDerived>& other)
64
+ {
65
+ indices() = other.indices();
66
+ return derived();
67
+ }
68
+
69
+ #ifndef EIGEN_PARSED_BY_DOXYGEN
70
+ /** This is a special case of the templated operator=. Its purpose is to
71
+ * prevent a default operator= from hiding the templated operator=.
72
+ */
73
+ Derived& operator=(const TranspositionsBase& other)
74
+ {
75
+ indices() = other.indices();
76
+ return derived();
77
+ }
78
+ #endif
79
+
80
+ /** \returns the number of transpositions */
81
+ inline Index size() const { return indices().size(); }
82
+
83
+ /** Direct access to the underlying index vector */
84
+ inline const Index& coeff(Index i) const { return indices().coeff(i); }
85
+ /** Direct access to the underlying index vector */
86
+ inline Index& coeffRef(Index i) { return indices().coeffRef(i); }
87
+ /** Direct access to the underlying index vector */
88
+ inline const Index& operator()(Index i) const { return indices()(i); }
89
+ /** Direct access to the underlying index vector */
90
+ inline Index& operator()(Index i) { return indices()(i); }
91
+ /** Direct access to the underlying index vector */
92
+ inline const Index& operator[](Index i) const { return indices()(i); }
93
+ /** Direct access to the underlying index vector */
94
+ inline Index& operator[](Index i) { return indices()(i); }
95
+
96
+ /** const version of indices(). */
97
+ const IndicesType& indices() const { return derived().indices(); }
98
+ /** \returns a reference to the stored array representing the transpositions. */
99
+ IndicesType& indices() { return derived().indices(); }
100
+
101
+ /** Resizes to given size. */
102
+ inline void resize(int newSize)
103
+ {
104
+ indices().resize(newSize);
105
+ }
106
+
107
+ /** Sets \c *this to represents an identity transformation */
108
+ void setIdentity()
109
+ {
110
+ for(int i = 0; i < indices().size(); ++i)
111
+ coeffRef(i) = i;
112
+ }
113
+
114
+ // FIXME: do we want such methods ?
115
+ // might be usefull when the target matrix expression is complex, e.g.:
116
+ // object.matrix().block(..,..,..,..) = trans * object.matrix().block(..,..,..,..);
117
+ /*
118
+ template<typename MatrixType>
119
+ void applyForwardToRows(MatrixType& mat) const
120
+ {
121
+ for(Index k=0 ; k<size() ; ++k)
122
+ if(m_indices(k)!=k)
123
+ mat.row(k).swap(mat.row(m_indices(k)));
124
+ }
125
+
126
+ template<typename MatrixType>
127
+ void applyBackwardToRows(MatrixType& mat) const
128
+ {
129
+ for(Index k=size()-1 ; k>=0 ; --k)
130
+ if(m_indices(k)!=k)
131
+ mat.row(k).swap(mat.row(m_indices(k)));
132
+ }
133
+ */
134
+
135
+ /** \returns the inverse transformation */
136
+ inline Transpose<TranspositionsBase> inverse() const
137
+ { return Transpose<TranspositionsBase>(derived()); }
138
+
139
+ /** \returns the tranpose transformation */
140
+ inline Transpose<TranspositionsBase> transpose() const
141
+ { return Transpose<TranspositionsBase>(derived()); }
142
+
143
+ protected:
144
+ };
145
+
146
+ namespace internal {
147
+ template<int SizeAtCompileTime, int MaxSizeAtCompileTime, typename IndexType>
148
+ struct traits<Transpositions<SizeAtCompileTime,MaxSizeAtCompileTime,IndexType> >
149
+ {
150
+ typedef IndexType Index;
151
+ typedef Matrix<Index, SizeAtCompileTime, 1, 0, MaxSizeAtCompileTime, 1> IndicesType;
152
+ };
153
+ }
154
+
155
+ template<int SizeAtCompileTime, int MaxSizeAtCompileTime, typename IndexType>
156
+ class Transpositions : public TranspositionsBase<Transpositions<SizeAtCompileTime,MaxSizeAtCompileTime,IndexType> >
157
+ {
158
+ typedef internal::traits<Transpositions> Traits;
159
+ public:
160
+
161
+ typedef TranspositionsBase<Transpositions> Base;
162
+ typedef typename Traits::IndicesType IndicesType;
163
+ typedef typename IndicesType::Scalar Index;
164
+
165
+ inline Transpositions() {}
166
+
167
+ /** Copy constructor. */
168
+ template<typename OtherDerived>
169
+ inline Transpositions(const TranspositionsBase<OtherDerived>& other)
170
+ : m_indices(other.indices()) {}
171
+
172
+ #ifndef EIGEN_PARSED_BY_DOXYGEN
173
+ /** Standard copy constructor. Defined only to prevent a default copy constructor
174
+ * from hiding the other templated constructor */
175
+ inline Transpositions(const Transpositions& other) : m_indices(other.indices()) {}
176
+ #endif
177
+
178
+ /** Generic constructor from expression of the transposition indices. */
179
+ template<typename Other>
180
+ explicit inline Transpositions(const MatrixBase<Other>& a_indices) : m_indices(a_indices)
181
+ {}
182
+
183
+ /** Copies the \a other transpositions into \c *this */
184
+ template<typename OtherDerived>
185
+ Transpositions& operator=(const TranspositionsBase<OtherDerived>& other)
186
+ {
187
+ return Base::operator=(other);
188
+ }
189
+
190
+ #ifndef EIGEN_PARSED_BY_DOXYGEN
191
+ /** This is a special case of the templated operator=. Its purpose is to
192
+ * prevent a default operator= from hiding the templated operator=.
193
+ */
194
+ Transpositions& operator=(const Transpositions& other)
195
+ {
196
+ m_indices = other.m_indices;
197
+ return *this;
198
+ }
199
+ #endif
200
+
201
+ /** Constructs an uninitialized permutation matrix of given size.
202
+ */
203
+ inline Transpositions(Index size) : m_indices(size)
204
+ {}
205
+
206
+ /** const version of indices(). */
207
+ const IndicesType& indices() const { return m_indices; }
208
+ /** \returns a reference to the stored array representing the transpositions. */
209
+ IndicesType& indices() { return m_indices; }
210
+
211
+ protected:
212
+
213
+ IndicesType m_indices;
214
+ };
215
+
216
+
217
+ namespace internal {
218
+ template<int SizeAtCompileTime, int MaxSizeAtCompileTime, typename IndexType, int _PacketAccess>
219
+ struct traits<Map<Transpositions<SizeAtCompileTime,MaxSizeAtCompileTime,IndexType>,_PacketAccess> >
220
+ {
221
+ typedef IndexType Index;
222
+ typedef Map<const Matrix<Index,SizeAtCompileTime,1,0,MaxSizeAtCompileTime,1>, _PacketAccess> IndicesType;
223
+ };
224
+ }
225
+
226
+ template<int SizeAtCompileTime, int MaxSizeAtCompileTime, typename IndexType, int PacketAccess>
227
+ class Map<Transpositions<SizeAtCompileTime,MaxSizeAtCompileTime,IndexType>,PacketAccess>
228
+ : public TranspositionsBase<Map<Transpositions<SizeAtCompileTime,MaxSizeAtCompileTime,IndexType>,PacketAccess> >
229
+ {
230
+ typedef internal::traits<Map> Traits;
231
+ public:
232
+
233
+ typedef TranspositionsBase<Map> Base;
234
+ typedef typename Traits::IndicesType IndicesType;
235
+ typedef typename IndicesType::Scalar Index;
236
+
237
+ inline Map(const Index* indicesPtr)
238
+ : m_indices(indicesPtr)
239
+ {}
240
+
241
+ inline Map(const Index* indicesPtr, Index size)
242
+ : m_indices(indicesPtr,size)
243
+ {}
244
+
245
+ /** Copies the \a other transpositions into \c *this */
246
+ template<typename OtherDerived>
247
+ Map& operator=(const TranspositionsBase<OtherDerived>& other)
248
+ {
249
+ return Base::operator=(other);
250
+ }
251
+
252
+ #ifndef EIGEN_PARSED_BY_DOXYGEN
253
+ /** This is a special case of the templated operator=. Its purpose is to
254
+ * prevent a default operator= from hiding the templated operator=.
255
+ */
256
+ Map& operator=(const Map& other)
257
+ {
258
+ m_indices = other.m_indices;
259
+ return *this;
260
+ }
261
+ #endif
262
+
263
+ /** const version of indices(). */
264
+ const IndicesType& indices() const { return m_indices; }
265
+
266
+ /** \returns a reference to the stored array representing the transpositions. */
267
+ IndicesType& indices() { return m_indices; }
268
+
269
+ protected:
270
+
271
+ IndicesType m_indices;
272
+ };
273
+
274
+ namespace internal {
275
+ template<typename _IndicesType>
276
+ struct traits<TranspositionsWrapper<_IndicesType> >
277
+ {
278
+ typedef typename _IndicesType::Scalar Index;
279
+ typedef _IndicesType IndicesType;
280
+ };
281
+ }
282
+
283
+ template<typename _IndicesType>
284
+ class TranspositionsWrapper
285
+ : public TranspositionsBase<TranspositionsWrapper<_IndicesType> >
286
+ {
287
+ typedef internal::traits<TranspositionsWrapper> Traits;
288
+ public:
289
+
290
+ typedef TranspositionsBase<TranspositionsWrapper> Base;
291
+ typedef typename Traits::IndicesType IndicesType;
292
+ typedef typename IndicesType::Scalar Index;
293
+
294
+ inline TranspositionsWrapper(IndicesType& a_indices)
295
+ : m_indices(a_indices)
296
+ {}
297
+
298
+ /** Copies the \a other transpositions into \c *this */
299
+ template<typename OtherDerived>
300
+ TranspositionsWrapper& operator=(const TranspositionsBase<OtherDerived>& other)
301
+ {
302
+ return Base::operator=(other);
303
+ }
304
+
305
+ #ifndef EIGEN_PARSED_BY_DOXYGEN
306
+ /** This is a special case of the templated operator=. Its purpose is to
307
+ * prevent a default operator= from hiding the templated operator=.
308
+ */
309
+ TranspositionsWrapper& operator=(const TranspositionsWrapper& other)
310
+ {
311
+ m_indices = other.m_indices;
312
+ return *this;
313
+ }
314
+ #endif
315
+
316
+ /** const version of indices(). */
317
+ const IndicesType& indices() const { return m_indices; }
318
+
319
+ /** \returns a reference to the stored array representing the transpositions. */
320
+ IndicesType& indices() { return m_indices; }
321
+
322
+ protected:
323
+
324
+ const typename IndicesType::Nested m_indices;
325
+ };
326
+
327
+ /** \returns the \a matrix with the \a transpositions applied to the columns.
328
+ */
329
+ template<typename Derived, typename TranspositionsDerived>
330
+ inline const internal::transposition_matrix_product_retval<TranspositionsDerived, Derived, OnTheRight>
331
+ operator*(const MatrixBase<Derived>& matrix,
332
+ const TranspositionsBase<TranspositionsDerived> &transpositions)
333
+ {
334
+ return internal::transposition_matrix_product_retval
335
+ <TranspositionsDerived, Derived, OnTheRight>
336
+ (transpositions.derived(), matrix.derived());
337
+ }
338
+
339
+ /** \returns the \a matrix with the \a transpositions applied to the rows.
340
+ */
341
+ template<typename Derived, typename TranspositionDerived>
342
+ inline const internal::transposition_matrix_product_retval
343
+ <TranspositionDerived, Derived, OnTheLeft>
344
+ operator*(const TranspositionsBase<TranspositionDerived> &transpositions,
345
+ const MatrixBase<Derived>& matrix)
346
+ {
347
+ return internal::transposition_matrix_product_retval
348
+ <TranspositionDerived, Derived, OnTheLeft>
349
+ (transpositions.derived(), matrix.derived());
350
+ }
351
+
352
+ namespace internal {
353
+
354
+ template<typename TranspositionType, typename MatrixType, int Side, bool Transposed>
355
+ struct traits<transposition_matrix_product_retval<TranspositionType, MatrixType, Side, Transposed> >
356
+ {
357
+ typedef typename MatrixType::PlainObject ReturnType;
358
+ };
359
+
360
+ template<typename TranspositionType, typename MatrixType, int Side, bool Transposed>
361
+ struct transposition_matrix_product_retval
362
+ : public ReturnByValue<transposition_matrix_product_retval<TranspositionType, MatrixType, Side, Transposed> >
363
+ {
364
+ typedef typename remove_all<typename MatrixType::Nested>::type MatrixTypeNestedCleaned;
365
+ typedef typename TranspositionType::Index Index;
366
+
367
+ transposition_matrix_product_retval(const TranspositionType& tr, const MatrixType& matrix)
368
+ : m_transpositions(tr), m_matrix(matrix)
369
+ {}
370
+
371
+ inline int rows() const { return m_matrix.rows(); }
372
+ inline int cols() const { return m_matrix.cols(); }
373
+
374
+ template<typename Dest> inline void evalTo(Dest& dst) const
375
+ {
376
+ const int size = m_transpositions.size();
377
+ Index j = 0;
378
+
379
+ if(!(is_same<MatrixTypeNestedCleaned,Dest>::value && extract_data(dst) == extract_data(m_matrix)))
380
+ dst = m_matrix;
381
+
382
+ for(int k=(Transposed?size-1:0) ; Transposed?k>=0:k<size ; Transposed?--k:++k)
383
+ if((j=m_transpositions.coeff(k))!=k)
384
+ {
385
+ if(Side==OnTheLeft)
386
+ dst.row(k).swap(dst.row(j));
387
+ else if(Side==OnTheRight)
388
+ dst.col(k).swap(dst.col(j));
389
+ }
390
+ }
391
+
392
+ protected:
393
+ const TranspositionType& m_transpositions;
394
+ typename MatrixType::Nested m_matrix;
395
+ };
396
+
397
+ } // end namespace internal
398
+
399
+ /* Template partial specialization for transposed/inverse transpositions */
400
+
401
+ template<typename TranspositionsDerived>
402
+ class Transpose<TranspositionsBase<TranspositionsDerived> >
403
+ {
404
+ typedef TranspositionsDerived TranspositionType;
405
+ typedef typename TranspositionType::IndicesType IndicesType;
406
+ public:
407
+
408
+ Transpose(const TranspositionType& t) : m_transpositions(t) {}
409
+
410
+ inline int size() const { return m_transpositions.size(); }
411
+
412
+ /** \returns the \a matrix with the inverse transpositions applied to the columns.
413
+ */
414
+ template<typename Derived> friend
415
+ inline const internal::transposition_matrix_product_retval<TranspositionType, Derived, OnTheRight, true>
416
+ operator*(const MatrixBase<Derived>& matrix, const Transpose& trt)
417
+ {
418
+ return internal::transposition_matrix_product_retval<TranspositionType, Derived, OnTheRight, true>(trt.m_transpositions, matrix.derived());
419
+ }
420
+
421
+ /** \returns the \a matrix with the inverse transpositions applied to the rows.
422
+ */
423
+ template<typename Derived>
424
+ inline const internal::transposition_matrix_product_retval<TranspositionType, Derived, OnTheLeft, true>
425
+ operator*(const MatrixBase<Derived>& matrix) const
426
+ {
427
+ return internal::transposition_matrix_product_retval<TranspositionType, Derived, OnTheLeft, true>(m_transpositions, matrix.derived());
428
+ }
429
+
430
+ protected:
431
+ const TranspositionType& m_transpositions;
432
+ };
433
+
434
+ } // end namespace Eigen
435
+
436
+ #endif // EIGEN_TRANSPOSITIONS_H
@@ -0,0 +1,839 @@
1
+ // This file is part of Eigen, a lightweight C++ template library
2
+ // for linear algebra.
3
+ //
4
+ // Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>
5
+ // Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>
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_TRIANGULARMATRIX_H
12
+ #define EIGEN_TRIANGULARMATRIX_H
13
+
14
+ namespace Eigen {
15
+
16
+ namespace internal {
17
+
18
+ template<int Side, typename TriangularType, typename Rhs> struct triangular_solve_retval;
19
+
20
+ }
21
+
22
+ /** \internal
23
+ *
24
+ * \class TriangularBase
25
+ * \ingroup Core_Module
26
+ *
27
+ * \brief Base class for triangular part in a matrix
28
+ */
29
+ template<typename Derived> class TriangularBase : public EigenBase<Derived>
30
+ {
31
+ public:
32
+
33
+ enum {
34
+ Mode = internal::traits<Derived>::Mode,
35
+ CoeffReadCost = internal::traits<Derived>::CoeffReadCost,
36
+ RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,
37
+ ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,
38
+ MaxRowsAtCompileTime = internal::traits<Derived>::MaxRowsAtCompileTime,
39
+ MaxColsAtCompileTime = internal::traits<Derived>::MaxColsAtCompileTime
40
+ };
41
+ typedef typename internal::traits<Derived>::Scalar Scalar;
42
+ typedef typename internal::traits<Derived>::StorageKind StorageKind;
43
+ typedef typename internal::traits<Derived>::Index Index;
44
+ typedef typename internal::traits<Derived>::DenseMatrixType DenseMatrixType;
45
+ typedef DenseMatrixType DenseType;
46
+
47
+ inline TriangularBase() { eigen_assert(!((Mode&UnitDiag) && (Mode&ZeroDiag))); }
48
+
49
+ inline Index rows() const { return derived().rows(); }
50
+ inline Index cols() const { return derived().cols(); }
51
+ inline Index outerStride() const { return derived().outerStride(); }
52
+ inline Index innerStride() const { return derived().innerStride(); }
53
+
54
+ inline Scalar coeff(Index row, Index col) const { return derived().coeff(row,col); }
55
+ inline Scalar& coeffRef(Index row, Index col) { return derived().coeffRef(row,col); }
56
+
57
+ /** \see MatrixBase::copyCoeff(row,col)
58
+ */
59
+ template<typename Other>
60
+ EIGEN_STRONG_INLINE void copyCoeff(Index row, Index col, Other& other)
61
+ {
62
+ derived().coeffRef(row, col) = other.coeff(row, col);
63
+ }
64
+
65
+ inline Scalar operator()(Index row, Index col) const
66
+ {
67
+ check_coordinates(row, col);
68
+ return coeff(row,col);
69
+ }
70
+ inline Scalar& operator()(Index row, Index col)
71
+ {
72
+ check_coordinates(row, col);
73
+ return coeffRef(row,col);
74
+ }
75
+
76
+ #ifndef EIGEN_PARSED_BY_DOXYGEN
77
+ inline const Derived& derived() const { return *static_cast<const Derived*>(this); }
78
+ inline Derived& derived() { return *static_cast<Derived*>(this); }
79
+ #endif // not EIGEN_PARSED_BY_DOXYGEN
80
+
81
+ template<typename DenseDerived>
82
+ void evalTo(MatrixBase<DenseDerived> &other) const;
83
+ template<typename DenseDerived>
84
+ void evalToLazy(MatrixBase<DenseDerived> &other) const;
85
+
86
+ DenseMatrixType toDenseMatrix() const
87
+ {
88
+ DenseMatrixType res(rows(), cols());
89
+ evalToLazy(res);
90
+ return res;
91
+ }
92
+
93
+ protected:
94
+
95
+ void check_coordinates(Index row, Index col) const
96
+ {
97
+ EIGEN_ONLY_USED_FOR_DEBUG(row);
98
+ EIGEN_ONLY_USED_FOR_DEBUG(col);
99
+ eigen_assert(col>=0 && col<cols() && row>=0 && row<rows());
100
+ const int mode = int(Mode) & ~SelfAdjoint;
101
+ EIGEN_ONLY_USED_FOR_DEBUG(mode);
102
+ eigen_assert((mode==Upper && col>=row)
103
+ || (mode==Lower && col<=row)
104
+ || ((mode==StrictlyUpper || mode==UnitUpper) && col>row)
105
+ || ((mode==StrictlyLower || mode==UnitLower) && col<row));
106
+ }
107
+
108
+ #ifdef EIGEN_INTERNAL_DEBUGGING
109
+ void check_coordinates_internal(Index row, Index col) const
110
+ {
111
+ check_coordinates(row, col);
112
+ }
113
+ #else
114
+ void check_coordinates_internal(Index , Index ) const {}
115
+ #endif
116
+
117
+ };
118
+
119
+ /** \class TriangularView
120
+ * \ingroup Core_Module
121
+ *
122
+ * \brief Base class for triangular part in a matrix
123
+ *
124
+ * \param MatrixType the type of the object in which we are taking the triangular part
125
+ * \param Mode the kind of triangular matrix expression to construct. Can be #Upper,
126
+ * #Lower, #UnitUpper, #UnitLower, #StrictlyUpper, or #StrictlyLower.
127
+ * This is in fact a bit field; it must have either #Upper or #Lower,
128
+ * and additionnaly it may have #UnitDiag or #ZeroDiag or neither.
129
+ *
130
+ * This class represents a triangular part of a matrix, not necessarily square. Strictly speaking, for rectangular
131
+ * matrices one should speak of "trapezoid" parts. This class is the return type
132
+ * of MatrixBase::triangularView() and most of the time this is the only way it is used.
133
+ *
134
+ * \sa MatrixBase::triangularView()
135
+ */
136
+ namespace internal {
137
+ template<typename MatrixType, unsigned int _Mode>
138
+ struct traits<TriangularView<MatrixType, _Mode> > : traits<MatrixType>
139
+ {
140
+ typedef typename nested<MatrixType>::type MatrixTypeNested;
141
+ typedef typename remove_reference<MatrixTypeNested>::type MatrixTypeNestedNonRef;
142
+ typedef typename remove_all<MatrixTypeNested>::type MatrixTypeNestedCleaned;
143
+ typedef MatrixType ExpressionType;
144
+ typedef typename MatrixType::PlainObject DenseMatrixType;
145
+ enum {
146
+ Mode = _Mode,
147
+ Flags = (MatrixTypeNestedCleaned::Flags & (HereditaryBits) & (~(PacketAccessBit | DirectAccessBit | LinearAccessBit))) | Mode,
148
+ CoeffReadCost = MatrixTypeNestedCleaned::CoeffReadCost
149
+ };
150
+ };
151
+ }
152
+
153
+ template<int Mode, bool LhsIsTriangular,
154
+ typename Lhs, bool LhsIsVector,
155
+ typename Rhs, bool RhsIsVector>
156
+ struct TriangularProduct;
157
+
158
+ template<typename _MatrixType, unsigned int _Mode> class TriangularView
159
+ : public TriangularBase<TriangularView<_MatrixType, _Mode> >
160
+ {
161
+ public:
162
+
163
+ typedef TriangularBase<TriangularView> Base;
164
+ typedef typename internal::traits<TriangularView>::Scalar Scalar;
165
+
166
+ typedef _MatrixType MatrixType;
167
+ typedef typename internal::traits<TriangularView>::DenseMatrixType DenseMatrixType;
168
+ typedef DenseMatrixType PlainObject;
169
+
170
+ protected:
171
+ typedef typename internal::traits<TriangularView>::MatrixTypeNested MatrixTypeNested;
172
+ typedef typename internal::traits<TriangularView>::MatrixTypeNestedNonRef MatrixTypeNestedNonRef;
173
+ typedef typename internal::traits<TriangularView>::MatrixTypeNestedCleaned MatrixTypeNestedCleaned;
174
+
175
+ typedef typename internal::remove_all<typename MatrixType::ConjugateReturnType>::type MatrixConjugateReturnType;
176
+
177
+ public:
178
+ using Base::evalToLazy;
179
+
180
+
181
+ typedef typename internal::traits<TriangularView>::StorageKind StorageKind;
182
+ typedef typename internal::traits<TriangularView>::Index Index;
183
+
184
+ enum {
185
+ Mode = _Mode,
186
+ TransposeMode = (Mode & Upper ? Lower : 0)
187
+ | (Mode & Lower ? Upper : 0)
188
+ | (Mode & (UnitDiag))
189
+ | (Mode & (ZeroDiag))
190
+ };
191
+
192
+ inline TriangularView(const MatrixType& matrix) : m_matrix(matrix)
193
+ {}
194
+
195
+ inline Index rows() const { return m_matrix.rows(); }
196
+ inline Index cols() const { return m_matrix.cols(); }
197
+ inline Index outerStride() const { return m_matrix.outerStride(); }
198
+ inline Index innerStride() const { return m_matrix.innerStride(); }
199
+
200
+ /** \sa MatrixBase::operator+=() */
201
+ template<typename Other> TriangularView& operator+=(const DenseBase<Other>& other) { return *this = m_matrix + other.derived(); }
202
+ /** \sa MatrixBase::operator-=() */
203
+ template<typename Other> TriangularView& operator-=(const DenseBase<Other>& other) { return *this = m_matrix - other.derived(); }
204
+ /** \sa MatrixBase::operator*=() */
205
+ TriangularView& operator*=(const typename internal::traits<MatrixType>::Scalar& other) { return *this = m_matrix * other; }
206
+ /** \sa MatrixBase::operator/=() */
207
+ TriangularView& operator/=(const typename internal::traits<MatrixType>::Scalar& other) { return *this = m_matrix / other; }
208
+
209
+ /** \sa MatrixBase::fill() */
210
+ void fill(const Scalar& value) { setConstant(value); }
211
+ /** \sa MatrixBase::setConstant() */
212
+ TriangularView& setConstant(const Scalar& value)
213
+ { return *this = MatrixType::Constant(rows(), cols(), value); }
214
+ /** \sa MatrixBase::setZero() */
215
+ TriangularView& setZero() { return setConstant(Scalar(0)); }
216
+ /** \sa MatrixBase::setOnes() */
217
+ TriangularView& setOnes() { return setConstant(Scalar(1)); }
218
+
219
+ /** \sa MatrixBase::coeff()
220
+ * \warning the coordinates must fit into the referenced triangular part
221
+ */
222
+ inline Scalar coeff(Index row, Index col) const
223
+ {
224
+ Base::check_coordinates_internal(row, col);
225
+ return m_matrix.coeff(row, col);
226
+ }
227
+
228
+ /** \sa MatrixBase::coeffRef()
229
+ * \warning the coordinates must fit into the referenced triangular part
230
+ */
231
+ inline Scalar& coeffRef(Index row, Index col)
232
+ {
233
+ Base::check_coordinates_internal(row, col);
234
+ return m_matrix.const_cast_derived().coeffRef(row, col);
235
+ }
236
+
237
+ const MatrixTypeNestedCleaned& nestedExpression() const { return m_matrix; }
238
+ MatrixTypeNestedCleaned& nestedExpression() { return *const_cast<MatrixTypeNestedCleaned*>(&m_matrix); }
239
+
240
+ /** Assigns a triangular matrix to a triangular part of a dense matrix */
241
+ template<typename OtherDerived>
242
+ TriangularView& operator=(const TriangularBase<OtherDerived>& other);
243
+
244
+ template<typename OtherDerived>
245
+ TriangularView& operator=(const MatrixBase<OtherDerived>& other);
246
+
247
+ TriangularView& operator=(const TriangularView& other)
248
+ { return *this = other.nestedExpression(); }
249
+
250
+ template<typename OtherDerived>
251
+ void lazyAssign(const TriangularBase<OtherDerived>& other);
252
+
253
+ template<typename OtherDerived>
254
+ void lazyAssign(const MatrixBase<OtherDerived>& other);
255
+
256
+ /** \sa MatrixBase::conjugate() */
257
+ inline TriangularView<MatrixConjugateReturnType,Mode> conjugate()
258
+ { return m_matrix.conjugate(); }
259
+ /** \sa MatrixBase::conjugate() const */
260
+ inline const TriangularView<MatrixConjugateReturnType,Mode> conjugate() const
261
+ { return m_matrix.conjugate(); }
262
+
263
+ /** \sa MatrixBase::adjoint() const */
264
+ inline const TriangularView<const typename MatrixType::AdjointReturnType,TransposeMode> adjoint() const
265
+ { return m_matrix.adjoint(); }
266
+
267
+ /** \sa MatrixBase::transpose() */
268
+ inline TriangularView<Transpose<MatrixType>,TransposeMode> transpose()
269
+ {
270
+ EIGEN_STATIC_ASSERT_LVALUE(MatrixType)
271
+ return m_matrix.const_cast_derived().transpose();
272
+ }
273
+ /** \sa MatrixBase::transpose() const */
274
+ inline const TriangularView<Transpose<MatrixType>,TransposeMode> transpose() const
275
+ {
276
+ return m_matrix.transpose();
277
+ }
278
+
279
+ /** Efficient triangular matrix times vector/matrix product */
280
+ template<typename OtherDerived>
281
+ TriangularProduct<Mode, true, MatrixType, false, OtherDerived, OtherDerived::ColsAtCompileTime==1>
282
+ operator*(const MatrixBase<OtherDerived>& rhs) const
283
+ {
284
+ return TriangularProduct
285
+ <Mode, true, MatrixType, false, OtherDerived, OtherDerived::ColsAtCompileTime==1>
286
+ (m_matrix, rhs.derived());
287
+ }
288
+
289
+ /** Efficient vector/matrix times triangular matrix product */
290
+ template<typename OtherDerived> friend
291
+ TriangularProduct<Mode, false, OtherDerived, OtherDerived::RowsAtCompileTime==1, MatrixType, false>
292
+ operator*(const MatrixBase<OtherDerived>& lhs, const TriangularView& rhs)
293
+ {
294
+ return TriangularProduct
295
+ <Mode, false, OtherDerived, OtherDerived::RowsAtCompileTime==1, MatrixType, false>
296
+ (lhs.derived(),rhs.m_matrix);
297
+ }
298
+
299
+ #ifdef EIGEN2_SUPPORT
300
+ template<typename OtherDerived>
301
+ struct eigen2_product_return_type
302
+ {
303
+ typedef typename TriangularView<MatrixType,Mode>::DenseMatrixType DenseMatrixType;
304
+ typedef typename OtherDerived::PlainObject::DenseType OtherPlainObject;
305
+ typedef typename ProductReturnType<DenseMatrixType, OtherPlainObject>::Type ProdRetType;
306
+ typedef typename ProdRetType::PlainObject type;
307
+ };
308
+ template<typename OtherDerived>
309
+ const typename eigen2_product_return_type<OtherDerived>::type
310
+ operator*(const EigenBase<OtherDerived>& rhs) const
311
+ {
312
+ typename OtherDerived::PlainObject::DenseType rhsPlainObject;
313
+ rhs.evalTo(rhsPlainObject);
314
+ return this->toDenseMatrix() * rhsPlainObject;
315
+ }
316
+ template<typename OtherMatrixType>
317
+ bool isApprox(const TriangularView<OtherMatrixType, Mode>& other, typename NumTraits<Scalar>::Real precision = NumTraits<Scalar>::dummy_precision()) const
318
+ {
319
+ return this->toDenseMatrix().isApprox(other.toDenseMatrix(), precision);
320
+ }
321
+ template<typename OtherDerived>
322
+ bool isApprox(const MatrixBase<OtherDerived>& other, typename NumTraits<Scalar>::Real precision = NumTraits<Scalar>::dummy_precision()) const
323
+ {
324
+ return this->toDenseMatrix().isApprox(other, precision);
325
+ }
326
+ #endif // EIGEN2_SUPPORT
327
+
328
+ template<int Side, typename Other>
329
+ inline const internal::triangular_solve_retval<Side,TriangularView, Other>
330
+ solve(const MatrixBase<Other>& other) const;
331
+
332
+ template<int Side, typename OtherDerived>
333
+ void solveInPlace(const MatrixBase<OtherDerived>& other) const;
334
+
335
+ template<typename Other>
336
+ inline const internal::triangular_solve_retval<OnTheLeft,TriangularView, Other>
337
+ solve(const MatrixBase<Other>& other) const
338
+ { return solve<OnTheLeft>(other); }
339
+
340
+ template<typename OtherDerived>
341
+ void solveInPlace(const MatrixBase<OtherDerived>& other) const
342
+ { return solveInPlace<OnTheLeft>(other); }
343
+
344
+ const SelfAdjointView<MatrixTypeNestedNonRef,Mode> selfadjointView() const
345
+ {
346
+ EIGEN_STATIC_ASSERT((Mode&UnitDiag)==0,PROGRAMMING_ERROR);
347
+ return SelfAdjointView<MatrixTypeNestedNonRef,Mode>(m_matrix);
348
+ }
349
+ SelfAdjointView<MatrixTypeNestedNonRef,Mode> selfadjointView()
350
+ {
351
+ EIGEN_STATIC_ASSERT((Mode&UnitDiag)==0,PROGRAMMING_ERROR);
352
+ return SelfAdjointView<MatrixTypeNestedNonRef,Mode>(m_matrix);
353
+ }
354
+
355
+ template<typename OtherDerived>
356
+ void swap(TriangularBase<OtherDerived> const & other)
357
+ {
358
+ TriangularView<SwapWrapper<MatrixType>,Mode>(const_cast<MatrixType&>(m_matrix)).lazyAssign(other.derived());
359
+ }
360
+
361
+ template<typename OtherDerived>
362
+ void swap(MatrixBase<OtherDerived> const & other)
363
+ {
364
+ SwapWrapper<MatrixType> swaper(const_cast<MatrixType&>(m_matrix));
365
+ TriangularView<SwapWrapper<MatrixType>,Mode>(swaper).lazyAssign(other.derived());
366
+ }
367
+
368
+ Scalar determinant() const
369
+ {
370
+ if (Mode & UnitDiag)
371
+ return 1;
372
+ else if (Mode & ZeroDiag)
373
+ return 0;
374
+ else
375
+ return m_matrix.diagonal().prod();
376
+ }
377
+
378
+ // TODO simplify the following:
379
+ template<typename ProductDerived, typename Lhs, typename Rhs>
380
+ EIGEN_STRONG_INLINE TriangularView& operator=(const ProductBase<ProductDerived, Lhs,Rhs>& other)
381
+ {
382
+ setZero();
383
+ return assignProduct(other.derived(),1);
384
+ }
385
+
386
+ template<typename ProductDerived, typename Lhs, typename Rhs>
387
+ EIGEN_STRONG_INLINE TriangularView& operator+=(const ProductBase<ProductDerived, Lhs,Rhs>& other)
388
+ {
389
+ return assignProduct(other.derived(),1);
390
+ }
391
+
392
+ template<typename ProductDerived, typename Lhs, typename Rhs>
393
+ EIGEN_STRONG_INLINE TriangularView& operator-=(const ProductBase<ProductDerived, Lhs,Rhs>& other)
394
+ {
395
+ return assignProduct(other.derived(),-1);
396
+ }
397
+
398
+
399
+ template<typename ProductDerived>
400
+ EIGEN_STRONG_INLINE TriangularView& operator=(const ScaledProduct<ProductDerived>& other)
401
+ {
402
+ setZero();
403
+ return assignProduct(other.derived(),other.alpha());
404
+ }
405
+
406
+ template<typename ProductDerived>
407
+ EIGEN_STRONG_INLINE TriangularView& operator+=(const ScaledProduct<ProductDerived>& other)
408
+ {
409
+ return assignProduct(other.derived(),other.alpha());
410
+ }
411
+
412
+ template<typename ProductDerived>
413
+ EIGEN_STRONG_INLINE TriangularView& operator-=(const ScaledProduct<ProductDerived>& other)
414
+ {
415
+ return assignProduct(other.derived(),-other.alpha());
416
+ }
417
+
418
+ protected:
419
+
420
+ template<typename ProductDerived, typename Lhs, typename Rhs>
421
+ EIGEN_STRONG_INLINE TriangularView& assignProduct(const ProductBase<ProductDerived, Lhs,Rhs>& prod, const Scalar& alpha);
422
+
423
+ template<int Mode, bool LhsIsTriangular,
424
+ typename Lhs, bool LhsIsVector,
425
+ typename Rhs, bool RhsIsVector>
426
+ EIGEN_STRONG_INLINE TriangularView& assignProduct(const TriangularProduct<Mode, LhsIsTriangular, Lhs, LhsIsVector, Rhs, RhsIsVector>& prod, const Scalar& alpha)
427
+ {
428
+ lazyAssign(alpha*prod.eval());
429
+ return *this;
430
+ }
431
+
432
+ MatrixTypeNested m_matrix;
433
+ };
434
+
435
+ /***************************************************************************
436
+ * Implementation of triangular evaluation/assignment
437
+ ***************************************************************************/
438
+
439
+ namespace internal {
440
+
441
+ template<typename Derived1, typename Derived2, unsigned int Mode, int UnrollCount, bool ClearOpposite>
442
+ struct triangular_assignment_selector
443
+ {
444
+ enum {
445
+ col = (UnrollCount-1) / Derived1::RowsAtCompileTime,
446
+ row = (UnrollCount-1) % Derived1::RowsAtCompileTime
447
+ };
448
+
449
+ typedef typename Derived1::Scalar Scalar;
450
+
451
+ static inline void run(Derived1 &dst, const Derived2 &src)
452
+ {
453
+ triangular_assignment_selector<Derived1, Derived2, Mode, UnrollCount-1, ClearOpposite>::run(dst, src);
454
+
455
+ eigen_assert( Mode == Upper || Mode == Lower
456
+ || Mode == StrictlyUpper || Mode == StrictlyLower
457
+ || Mode == UnitUpper || Mode == UnitLower);
458
+ if((Mode == Upper && row <= col)
459
+ || (Mode == Lower && row >= col)
460
+ || (Mode == StrictlyUpper && row < col)
461
+ || (Mode == StrictlyLower && row > col)
462
+ || (Mode == UnitUpper && row < col)
463
+ || (Mode == UnitLower && row > col))
464
+ dst.copyCoeff(row, col, src);
465
+ else if(ClearOpposite)
466
+ {
467
+ if (Mode&UnitDiag && row==col)
468
+ dst.coeffRef(row, col) = Scalar(1);
469
+ else
470
+ dst.coeffRef(row, col) = Scalar(0);
471
+ }
472
+ }
473
+ };
474
+
475
+ // prevent buggy user code from causing an infinite recursion
476
+ template<typename Derived1, typename Derived2, unsigned int Mode, bool ClearOpposite>
477
+ struct triangular_assignment_selector<Derived1, Derived2, Mode, 0, ClearOpposite>
478
+ {
479
+ static inline void run(Derived1 &, const Derived2 &) {}
480
+ };
481
+
482
+ template<typename Derived1, typename Derived2, bool ClearOpposite>
483
+ struct triangular_assignment_selector<Derived1, Derived2, Upper, Dynamic, ClearOpposite>
484
+ {
485
+ typedef typename Derived1::Index Index;
486
+ typedef typename Derived1::Scalar Scalar;
487
+ static inline void run(Derived1 &dst, const Derived2 &src)
488
+ {
489
+ for(Index j = 0; j < dst.cols(); ++j)
490
+ {
491
+ Index maxi = (std::min)(j, dst.rows()-1);
492
+ for(Index i = 0; i <= maxi; ++i)
493
+ dst.copyCoeff(i, j, src);
494
+ if (ClearOpposite)
495
+ for(Index i = maxi+1; i < dst.rows(); ++i)
496
+ dst.coeffRef(i, j) = Scalar(0);
497
+ }
498
+ }
499
+ };
500
+
501
+ template<typename Derived1, typename Derived2, bool ClearOpposite>
502
+ struct triangular_assignment_selector<Derived1, Derived2, Lower, Dynamic, ClearOpposite>
503
+ {
504
+ typedef typename Derived1::Index Index;
505
+ static inline void run(Derived1 &dst, const Derived2 &src)
506
+ {
507
+ for(Index j = 0; j < dst.cols(); ++j)
508
+ {
509
+ for(Index i = j; i < dst.rows(); ++i)
510
+ dst.copyCoeff(i, j, src);
511
+ Index maxi = (std::min)(j, dst.rows());
512
+ if (ClearOpposite)
513
+ for(Index i = 0; i < maxi; ++i)
514
+ dst.coeffRef(i, j) = static_cast<typename Derived1::Scalar>(0);
515
+ }
516
+ }
517
+ };
518
+
519
+ template<typename Derived1, typename Derived2, bool ClearOpposite>
520
+ struct triangular_assignment_selector<Derived1, Derived2, StrictlyUpper, Dynamic, ClearOpposite>
521
+ {
522
+ typedef typename Derived1::Index Index;
523
+ typedef typename Derived1::Scalar Scalar;
524
+ static inline void run(Derived1 &dst, const Derived2 &src)
525
+ {
526
+ for(Index j = 0; j < dst.cols(); ++j)
527
+ {
528
+ Index maxi = (std::min)(j, dst.rows());
529
+ for(Index i = 0; i < maxi; ++i)
530
+ dst.copyCoeff(i, j, src);
531
+ if (ClearOpposite)
532
+ for(Index i = maxi; i < dst.rows(); ++i)
533
+ dst.coeffRef(i, j) = Scalar(0);
534
+ }
535
+ }
536
+ };
537
+
538
+ template<typename Derived1, typename Derived2, bool ClearOpposite>
539
+ struct triangular_assignment_selector<Derived1, Derived2, StrictlyLower, Dynamic, ClearOpposite>
540
+ {
541
+ typedef typename Derived1::Index Index;
542
+ static inline void run(Derived1 &dst, const Derived2 &src)
543
+ {
544
+ for(Index j = 0; j < dst.cols(); ++j)
545
+ {
546
+ for(Index i = j+1; i < dst.rows(); ++i)
547
+ dst.copyCoeff(i, j, src);
548
+ Index maxi = (std::min)(j, dst.rows()-1);
549
+ if (ClearOpposite)
550
+ for(Index i = 0; i <= maxi; ++i)
551
+ dst.coeffRef(i, j) = static_cast<typename Derived1::Scalar>(0);
552
+ }
553
+ }
554
+ };
555
+
556
+ template<typename Derived1, typename Derived2, bool ClearOpposite>
557
+ struct triangular_assignment_selector<Derived1, Derived2, UnitUpper, Dynamic, ClearOpposite>
558
+ {
559
+ typedef typename Derived1::Index Index;
560
+ static inline void run(Derived1 &dst, const Derived2 &src)
561
+ {
562
+ for(Index j = 0; j < dst.cols(); ++j)
563
+ {
564
+ Index maxi = (std::min)(j, dst.rows());
565
+ for(Index i = 0; i < maxi; ++i)
566
+ dst.copyCoeff(i, j, src);
567
+ if (ClearOpposite)
568
+ {
569
+ for(Index i = maxi+1; i < dst.rows(); ++i)
570
+ dst.coeffRef(i, j) = 0;
571
+ }
572
+ }
573
+ dst.diagonal().setOnes();
574
+ }
575
+ };
576
+ template<typename Derived1, typename Derived2, bool ClearOpposite>
577
+ struct triangular_assignment_selector<Derived1, Derived2, UnitLower, Dynamic, ClearOpposite>
578
+ {
579
+ typedef typename Derived1::Index Index;
580
+ static inline void run(Derived1 &dst, const Derived2 &src)
581
+ {
582
+ for(Index j = 0; j < dst.cols(); ++j)
583
+ {
584
+ Index maxi = (std::min)(j, dst.rows());
585
+ for(Index i = maxi+1; i < dst.rows(); ++i)
586
+ dst.copyCoeff(i, j, src);
587
+ if (ClearOpposite)
588
+ {
589
+ for(Index i = 0; i < maxi; ++i)
590
+ dst.coeffRef(i, j) = 0;
591
+ }
592
+ }
593
+ dst.diagonal().setOnes();
594
+ }
595
+ };
596
+
597
+ } // end namespace internal
598
+
599
+ // FIXME should we keep that possibility
600
+ template<typename MatrixType, unsigned int Mode>
601
+ template<typename OtherDerived>
602
+ inline TriangularView<MatrixType, Mode>&
603
+ TriangularView<MatrixType, Mode>::operator=(const MatrixBase<OtherDerived>& other)
604
+ {
605
+ if(OtherDerived::Flags & EvalBeforeAssigningBit)
606
+ {
607
+ typename internal::plain_matrix_type<OtherDerived>::type other_evaluated(other.rows(), other.cols());
608
+ other_evaluated.template triangularView<Mode>().lazyAssign(other.derived());
609
+ lazyAssign(other_evaluated);
610
+ }
611
+ else
612
+ lazyAssign(other.derived());
613
+ return *this;
614
+ }
615
+
616
+ // FIXME should we keep that possibility
617
+ template<typename MatrixType, unsigned int Mode>
618
+ template<typename OtherDerived>
619
+ void TriangularView<MatrixType, Mode>::lazyAssign(const MatrixBase<OtherDerived>& other)
620
+ {
621
+ enum {
622
+ unroll = MatrixType::SizeAtCompileTime != Dynamic
623
+ && internal::traits<OtherDerived>::CoeffReadCost != Dynamic
624
+ && MatrixType::SizeAtCompileTime*internal::traits<OtherDerived>::CoeffReadCost/2 <= EIGEN_UNROLLING_LIMIT
625
+ };
626
+ eigen_assert(m_matrix.rows() == other.rows() && m_matrix.cols() == other.cols());
627
+
628
+ internal::triangular_assignment_selector
629
+ <MatrixType, OtherDerived, int(Mode),
630
+ unroll ? int(MatrixType::SizeAtCompileTime) : Dynamic,
631
+ false // do not change the opposite triangular part
632
+ >::run(m_matrix.const_cast_derived(), other.derived());
633
+ }
634
+
635
+
636
+
637
+ template<typename MatrixType, unsigned int Mode>
638
+ template<typename OtherDerived>
639
+ inline TriangularView<MatrixType, Mode>&
640
+ TriangularView<MatrixType, Mode>::operator=(const TriangularBase<OtherDerived>& other)
641
+ {
642
+ eigen_assert(Mode == int(OtherDerived::Mode));
643
+ if(internal::traits<OtherDerived>::Flags & EvalBeforeAssigningBit)
644
+ {
645
+ typename OtherDerived::DenseMatrixType other_evaluated(other.rows(), other.cols());
646
+ other_evaluated.template triangularView<Mode>().lazyAssign(other.derived().nestedExpression());
647
+ lazyAssign(other_evaluated);
648
+ }
649
+ else
650
+ lazyAssign(other.derived().nestedExpression());
651
+ return *this;
652
+ }
653
+
654
+ template<typename MatrixType, unsigned int Mode>
655
+ template<typename OtherDerived>
656
+ void TriangularView<MatrixType, Mode>::lazyAssign(const TriangularBase<OtherDerived>& other)
657
+ {
658
+ enum {
659
+ unroll = MatrixType::SizeAtCompileTime != Dynamic
660
+ && internal::traits<OtherDerived>::CoeffReadCost != Dynamic
661
+ && MatrixType::SizeAtCompileTime * internal::traits<OtherDerived>::CoeffReadCost / 2
662
+ <= EIGEN_UNROLLING_LIMIT
663
+ };
664
+ eigen_assert(m_matrix.rows() == other.rows() && m_matrix.cols() == other.cols());
665
+
666
+ internal::triangular_assignment_selector
667
+ <MatrixType, OtherDerived, int(Mode),
668
+ unroll ? int(MatrixType::SizeAtCompileTime) : Dynamic,
669
+ false // preserve the opposite triangular part
670
+ >::run(m_matrix.const_cast_derived(), other.derived().nestedExpression());
671
+ }
672
+
673
+ /***************************************************************************
674
+ * Implementation of TriangularBase methods
675
+ ***************************************************************************/
676
+
677
+ /** Assigns a triangular or selfadjoint matrix to a dense matrix.
678
+ * If the matrix is triangular, the opposite part is set to zero. */
679
+ template<typename Derived>
680
+ template<typename DenseDerived>
681
+ void TriangularBase<Derived>::evalTo(MatrixBase<DenseDerived> &other) const
682
+ {
683
+ if(internal::traits<Derived>::Flags & EvalBeforeAssigningBit)
684
+ {
685
+ typename internal::plain_matrix_type<Derived>::type other_evaluated(rows(), cols());
686
+ evalToLazy(other_evaluated);
687
+ other.derived().swap(other_evaluated);
688
+ }
689
+ else
690
+ evalToLazy(other.derived());
691
+ }
692
+
693
+ /** Assigns a triangular or selfadjoint matrix to a dense matrix.
694
+ * If the matrix is triangular, the opposite part is set to zero. */
695
+ template<typename Derived>
696
+ template<typename DenseDerived>
697
+ void TriangularBase<Derived>::evalToLazy(MatrixBase<DenseDerived> &other) const
698
+ {
699
+ enum {
700
+ unroll = DenseDerived::SizeAtCompileTime != Dynamic
701
+ && internal::traits<Derived>::CoeffReadCost != Dynamic
702
+ && DenseDerived::SizeAtCompileTime * internal::traits<Derived>::CoeffReadCost / 2
703
+ <= EIGEN_UNROLLING_LIMIT
704
+ };
705
+ other.derived().resize(this->rows(), this->cols());
706
+
707
+ internal::triangular_assignment_selector
708
+ <DenseDerived, typename internal::traits<Derived>::MatrixTypeNestedCleaned, Derived::Mode,
709
+ unroll ? int(DenseDerived::SizeAtCompileTime) : Dynamic,
710
+ true // clear the opposite triangular part
711
+ >::run(other.derived(), derived().nestedExpression());
712
+ }
713
+
714
+ /***************************************************************************
715
+ * Implementation of TriangularView methods
716
+ ***************************************************************************/
717
+
718
+ /***************************************************************************
719
+ * Implementation of MatrixBase methods
720
+ ***************************************************************************/
721
+
722
+ #ifdef EIGEN2_SUPPORT
723
+
724
+ // implementation of part<>(), including the SelfAdjoint case.
725
+
726
+ namespace internal {
727
+ template<typename MatrixType, unsigned int Mode>
728
+ struct eigen2_part_return_type
729
+ {
730
+ typedef TriangularView<MatrixType, Mode> type;
731
+ };
732
+
733
+ template<typename MatrixType>
734
+ struct eigen2_part_return_type<MatrixType, SelfAdjoint>
735
+ {
736
+ typedef SelfAdjointView<MatrixType, Upper> type;
737
+ };
738
+ }
739
+
740
+ /** \deprecated use MatrixBase::triangularView() */
741
+ template<typename Derived>
742
+ template<unsigned int Mode>
743
+ const typename internal::eigen2_part_return_type<Derived, Mode>::type MatrixBase<Derived>::part() const
744
+ {
745
+ return derived();
746
+ }
747
+
748
+ /** \deprecated use MatrixBase::triangularView() */
749
+ template<typename Derived>
750
+ template<unsigned int Mode>
751
+ typename internal::eigen2_part_return_type<Derived, Mode>::type MatrixBase<Derived>::part()
752
+ {
753
+ return derived();
754
+ }
755
+ #endif
756
+
757
+ /**
758
+ * \returns an expression of a triangular view extracted from the current matrix
759
+ *
760
+ * The parameter \a Mode can have the following values: \c #Upper, \c #StrictlyUpper, \c #UnitUpper,
761
+ * \c #Lower, \c #StrictlyLower, \c #UnitLower.
762
+ *
763
+ * Example: \include MatrixBase_extract.cpp
764
+ * Output: \verbinclude MatrixBase_extract.out
765
+ *
766
+ * \sa class TriangularView
767
+ */
768
+ template<typename Derived>
769
+ template<unsigned int Mode>
770
+ typename MatrixBase<Derived>::template TriangularViewReturnType<Mode>::Type
771
+ MatrixBase<Derived>::triangularView()
772
+ {
773
+ return derived();
774
+ }
775
+
776
+ /** This is the const version of MatrixBase::triangularView() */
777
+ template<typename Derived>
778
+ template<unsigned int Mode>
779
+ typename MatrixBase<Derived>::template ConstTriangularViewReturnType<Mode>::Type
780
+ MatrixBase<Derived>::triangularView() const
781
+ {
782
+ return derived();
783
+ }
784
+
785
+ /** \returns true if *this is approximately equal to an upper triangular matrix,
786
+ * within the precision given by \a prec.
787
+ *
788
+ * \sa isLowerTriangular()
789
+ */
790
+ template<typename Derived>
791
+ bool MatrixBase<Derived>::isUpperTriangular(const RealScalar& prec) const
792
+ {
793
+ using std::abs;
794
+ RealScalar maxAbsOnUpperPart = static_cast<RealScalar>(-1);
795
+ for(Index j = 0; j < cols(); ++j)
796
+ {
797
+ Index maxi = (std::min)(j, rows()-1);
798
+ for(Index i = 0; i <= maxi; ++i)
799
+ {
800
+ RealScalar absValue = abs(coeff(i,j));
801
+ if(absValue > maxAbsOnUpperPart) maxAbsOnUpperPart = absValue;
802
+ }
803
+ }
804
+ RealScalar threshold = maxAbsOnUpperPart * prec;
805
+ for(Index j = 0; j < cols(); ++j)
806
+ for(Index i = j+1; i < rows(); ++i)
807
+ if(abs(coeff(i, j)) > threshold) return false;
808
+ return true;
809
+ }
810
+
811
+ /** \returns true if *this is approximately equal to a lower triangular matrix,
812
+ * within the precision given by \a prec.
813
+ *
814
+ * \sa isUpperTriangular()
815
+ */
816
+ template<typename Derived>
817
+ bool MatrixBase<Derived>::isLowerTriangular(const RealScalar& prec) const
818
+ {
819
+ using std::abs;
820
+ RealScalar maxAbsOnLowerPart = static_cast<RealScalar>(-1);
821
+ for(Index j = 0; j < cols(); ++j)
822
+ for(Index i = j; i < rows(); ++i)
823
+ {
824
+ RealScalar absValue = abs(coeff(i,j));
825
+ if(absValue > maxAbsOnLowerPart) maxAbsOnLowerPart = absValue;
826
+ }
827
+ RealScalar threshold = maxAbsOnLowerPart * prec;
828
+ for(Index j = 1; j < cols(); ++j)
829
+ {
830
+ Index maxi = (std::min)(j, rows()-1);
831
+ for(Index i = 0; i < maxi; ++i)
832
+ if(abs(coeff(i, j)) > threshold) return false;
833
+ }
834
+ return true;
835
+ }
836
+
837
+ } // end namespace Eigen
838
+
839
+ #endif // EIGEN_TRIANGULARMATRIX_H