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,148 @@
1
+ // This file is part of Eigen, a lightweight C++ template library
2
+ // for linear algebra.
3
+ //
4
+ // Copyright (C) 2012 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_SPARSE_PERMUTATION_H
11
+ #define EIGEN_SPARSE_PERMUTATION_H
12
+
13
+ // This file implements sparse * permutation products
14
+
15
+ namespace Eigen {
16
+
17
+ namespace internal {
18
+
19
+ template<typename PermutationType, typename MatrixType, int Side, bool Transposed>
20
+ struct traits<permut_sparsematrix_product_retval<PermutationType, MatrixType, Side, Transposed> >
21
+ {
22
+ typedef typename remove_all<typename MatrixType::Nested>::type MatrixTypeNestedCleaned;
23
+ typedef typename MatrixTypeNestedCleaned::Scalar Scalar;
24
+ typedef typename MatrixTypeNestedCleaned::Index Index;
25
+ enum {
26
+ SrcStorageOrder = MatrixTypeNestedCleaned::Flags&RowMajorBit ? RowMajor : ColMajor,
27
+ MoveOuter = SrcStorageOrder==RowMajor ? Side==OnTheLeft : Side==OnTheRight
28
+ };
29
+
30
+ typedef typename internal::conditional<MoveOuter,
31
+ SparseMatrix<Scalar,SrcStorageOrder,Index>,
32
+ SparseMatrix<Scalar,int(SrcStorageOrder)==RowMajor?ColMajor:RowMajor,Index> >::type ReturnType;
33
+ };
34
+
35
+ template<typename PermutationType, typename MatrixType, int Side, bool Transposed>
36
+ struct permut_sparsematrix_product_retval
37
+ : public ReturnByValue<permut_sparsematrix_product_retval<PermutationType, MatrixType, Side, Transposed> >
38
+ {
39
+ typedef typename remove_all<typename MatrixType::Nested>::type MatrixTypeNestedCleaned;
40
+ typedef typename MatrixTypeNestedCleaned::Scalar Scalar;
41
+ typedef typename MatrixTypeNestedCleaned::Index Index;
42
+
43
+ enum {
44
+ SrcStorageOrder = MatrixTypeNestedCleaned::Flags&RowMajorBit ? RowMajor : ColMajor,
45
+ MoveOuter = SrcStorageOrder==RowMajor ? Side==OnTheLeft : Side==OnTheRight
46
+ };
47
+
48
+ permut_sparsematrix_product_retval(const PermutationType& perm, const MatrixType& matrix)
49
+ : m_permutation(perm), m_matrix(matrix)
50
+ {}
51
+
52
+ inline int rows() const { return m_matrix.rows(); }
53
+ inline int cols() const { return m_matrix.cols(); }
54
+
55
+ template<typename Dest> inline void evalTo(Dest& dst) const
56
+ {
57
+ if(MoveOuter)
58
+ {
59
+ SparseMatrix<Scalar,SrcStorageOrder,Index> tmp(m_matrix.rows(), m_matrix.cols());
60
+ Matrix<Index,Dynamic,1> sizes(m_matrix.outerSize());
61
+ for(Index j=0; j<m_matrix.outerSize(); ++j)
62
+ {
63
+ Index jp = m_permutation.indices().coeff(j);
64
+ sizes[((Side==OnTheLeft) ^ Transposed) ? jp : j] = m_matrix.innerVector(((Side==OnTheRight) ^ Transposed) ? jp : j).nonZeros();
65
+ }
66
+ tmp.reserve(sizes);
67
+ for(Index j=0; j<m_matrix.outerSize(); ++j)
68
+ {
69
+ Index jp = m_permutation.indices().coeff(j);
70
+ Index jsrc = ((Side==OnTheRight) ^ Transposed) ? jp : j;
71
+ Index jdst = ((Side==OnTheLeft) ^ Transposed) ? jp : j;
72
+ for(typename MatrixTypeNestedCleaned::InnerIterator it(m_matrix,jsrc); it; ++it)
73
+ tmp.insertByOuterInner(jdst,it.index()) = it.value();
74
+ }
75
+ dst = tmp;
76
+ }
77
+ else
78
+ {
79
+ SparseMatrix<Scalar,int(SrcStorageOrder)==RowMajor?ColMajor:RowMajor,Index> tmp(m_matrix.rows(), m_matrix.cols());
80
+ Matrix<Index,Dynamic,1> sizes(tmp.outerSize());
81
+ sizes.setZero();
82
+ PermutationMatrix<Dynamic,Dynamic,Index> perm;
83
+ if((Side==OnTheLeft) ^ Transposed)
84
+ perm = m_permutation;
85
+ else
86
+ perm = m_permutation.transpose();
87
+
88
+ for(Index j=0; j<m_matrix.outerSize(); ++j)
89
+ for(typename MatrixTypeNestedCleaned::InnerIterator it(m_matrix,j); it; ++it)
90
+ sizes[perm.indices().coeff(it.index())]++;
91
+ tmp.reserve(sizes);
92
+ for(Index j=0; j<m_matrix.outerSize(); ++j)
93
+ for(typename MatrixTypeNestedCleaned::InnerIterator it(m_matrix,j); it; ++it)
94
+ tmp.insertByOuterInner(perm.indices().coeff(it.index()),j) = it.value();
95
+ dst = tmp;
96
+ }
97
+ }
98
+
99
+ protected:
100
+ const PermutationType& m_permutation;
101
+ typename MatrixType::Nested m_matrix;
102
+ };
103
+
104
+ }
105
+
106
+
107
+
108
+ /** \returns the matrix with the permutation applied to the columns
109
+ */
110
+ template<typename SparseDerived, typename PermDerived>
111
+ inline const internal::permut_sparsematrix_product_retval<PermutationBase<PermDerived>, SparseDerived, OnTheRight, false>
112
+ operator*(const SparseMatrixBase<SparseDerived>& matrix, const PermutationBase<PermDerived>& perm)
113
+ {
114
+ return internal::permut_sparsematrix_product_retval<PermutationBase<PermDerived>, SparseDerived, OnTheRight, false>(perm, matrix.derived());
115
+ }
116
+
117
+ /** \returns the matrix with the permutation applied to the rows
118
+ */
119
+ template<typename SparseDerived, typename PermDerived>
120
+ inline const internal::permut_sparsematrix_product_retval<PermutationBase<PermDerived>, SparseDerived, OnTheLeft, false>
121
+ operator*( const PermutationBase<PermDerived>& perm, const SparseMatrixBase<SparseDerived>& matrix)
122
+ {
123
+ return internal::permut_sparsematrix_product_retval<PermutationBase<PermDerived>, SparseDerived, OnTheLeft, false>(perm, matrix.derived());
124
+ }
125
+
126
+
127
+
128
+ /** \returns the matrix with the inverse permutation applied to the columns.
129
+ */
130
+ template<typename SparseDerived, typename PermDerived>
131
+ inline const internal::permut_sparsematrix_product_retval<PermutationBase<PermDerived>, SparseDerived, OnTheRight, true>
132
+ operator*(const SparseMatrixBase<SparseDerived>& matrix, const Transpose<PermutationBase<PermDerived> >& tperm)
133
+ {
134
+ return internal::permut_sparsematrix_product_retval<PermutationBase<PermDerived>, SparseDerived, OnTheRight, true>(tperm.nestedPermutation(), matrix.derived());
135
+ }
136
+
137
+ /** \returns the matrix with the inverse permutation applied to the rows.
138
+ */
139
+ template<typename SparseDerived, typename PermDerived>
140
+ inline const internal::permut_sparsematrix_product_retval<PermutationBase<PermDerived>, SparseDerived, OnTheLeft, true>
141
+ operator*(const Transpose<PermutationBase<PermDerived> >& tperm, const SparseMatrixBase<SparseDerived>& matrix)
142
+ {
143
+ return internal::permut_sparsematrix_product_retval<PermutationBase<PermDerived>, SparseDerived, OnTheLeft, true>(tperm.nestedPermutation(), matrix.derived());
144
+ }
145
+
146
+ } // end namespace Eigen
147
+
148
+ #endif // EIGEN_SPARSE_SELFADJOINTVIEW_H
@@ -0,0 +1,188 @@
1
+ // This file is part of Eigen, a lightweight C++ template library
2
+ // for linear algebra.
3
+ //
4
+ // Copyright (C) 2008-2010 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_SPARSEPRODUCT_H
11
+ #define EIGEN_SPARSEPRODUCT_H
12
+
13
+ namespace Eigen {
14
+
15
+ template<typename Lhs, typename Rhs>
16
+ struct SparseSparseProductReturnType
17
+ {
18
+ typedef typename internal::traits<Lhs>::Scalar Scalar;
19
+ typedef typename internal::traits<Lhs>::Index Index;
20
+ enum {
21
+ LhsRowMajor = internal::traits<Lhs>::Flags & RowMajorBit,
22
+ RhsRowMajor = internal::traits<Rhs>::Flags & RowMajorBit,
23
+ TransposeRhs = (!LhsRowMajor) && RhsRowMajor,
24
+ TransposeLhs = LhsRowMajor && (!RhsRowMajor)
25
+ };
26
+
27
+ typedef typename internal::conditional<TransposeLhs,
28
+ SparseMatrix<Scalar,0,Index>,
29
+ typename internal::nested<Lhs,Rhs::RowsAtCompileTime>::type>::type LhsNested;
30
+
31
+ typedef typename internal::conditional<TransposeRhs,
32
+ SparseMatrix<Scalar,0,Index>,
33
+ typename internal::nested<Rhs,Lhs::RowsAtCompileTime>::type>::type RhsNested;
34
+
35
+ typedef SparseSparseProduct<LhsNested, RhsNested> Type;
36
+ };
37
+
38
+ namespace internal {
39
+ template<typename LhsNested, typename RhsNested>
40
+ struct traits<SparseSparseProduct<LhsNested, RhsNested> >
41
+ {
42
+ typedef MatrixXpr XprKind;
43
+ // clean the nested types:
44
+ typedef typename remove_all<LhsNested>::type _LhsNested;
45
+ typedef typename remove_all<RhsNested>::type _RhsNested;
46
+ typedef typename _LhsNested::Scalar Scalar;
47
+ typedef typename promote_index_type<typename traits<_LhsNested>::Index,
48
+ typename traits<_RhsNested>::Index>::type Index;
49
+
50
+ enum {
51
+ LhsCoeffReadCost = _LhsNested::CoeffReadCost,
52
+ RhsCoeffReadCost = _RhsNested::CoeffReadCost,
53
+ LhsFlags = _LhsNested::Flags,
54
+ RhsFlags = _RhsNested::Flags,
55
+
56
+ RowsAtCompileTime = _LhsNested::RowsAtCompileTime,
57
+ ColsAtCompileTime = _RhsNested::ColsAtCompileTime,
58
+ MaxRowsAtCompileTime = _LhsNested::MaxRowsAtCompileTime,
59
+ MaxColsAtCompileTime = _RhsNested::MaxColsAtCompileTime,
60
+
61
+ InnerSize = EIGEN_SIZE_MIN_PREFER_FIXED(_LhsNested::ColsAtCompileTime, _RhsNested::RowsAtCompileTime),
62
+
63
+ EvalToRowMajor = (RhsFlags & LhsFlags & RowMajorBit),
64
+
65
+ RemovedBits = ~(EvalToRowMajor ? 0 : RowMajorBit),
66
+
67
+ Flags = (int(LhsFlags | RhsFlags) & HereditaryBits & RemovedBits)
68
+ | EvalBeforeAssigningBit
69
+ | EvalBeforeNestingBit,
70
+
71
+ CoeffReadCost = Dynamic
72
+ };
73
+
74
+ typedef Sparse StorageKind;
75
+ };
76
+
77
+ } // end namespace internal
78
+
79
+ template<typename LhsNested, typename RhsNested>
80
+ class SparseSparseProduct : internal::no_assignment_operator,
81
+ public SparseMatrixBase<SparseSparseProduct<LhsNested, RhsNested> >
82
+ {
83
+ public:
84
+
85
+ typedef SparseMatrixBase<SparseSparseProduct> Base;
86
+ EIGEN_DENSE_PUBLIC_INTERFACE(SparseSparseProduct)
87
+
88
+ private:
89
+
90
+ typedef typename internal::traits<SparseSparseProduct>::_LhsNested _LhsNested;
91
+ typedef typename internal::traits<SparseSparseProduct>::_RhsNested _RhsNested;
92
+
93
+ public:
94
+
95
+ template<typename Lhs, typename Rhs>
96
+ EIGEN_STRONG_INLINE SparseSparseProduct(const Lhs& lhs, const Rhs& rhs)
97
+ : m_lhs(lhs), m_rhs(rhs), m_tolerance(0), m_conservative(true)
98
+ {
99
+ init();
100
+ }
101
+
102
+ template<typename Lhs, typename Rhs>
103
+ EIGEN_STRONG_INLINE SparseSparseProduct(const Lhs& lhs, const Rhs& rhs, const RealScalar& tolerance)
104
+ : m_lhs(lhs), m_rhs(rhs), m_tolerance(tolerance), m_conservative(false)
105
+ {
106
+ init();
107
+ }
108
+
109
+ SparseSparseProduct pruned(const Scalar& reference = 0, const RealScalar& epsilon = NumTraits<RealScalar>::dummy_precision()) const
110
+ {
111
+ using std::abs;
112
+ return SparseSparseProduct(m_lhs,m_rhs,abs(reference)*epsilon);
113
+ }
114
+
115
+ template<typename Dest>
116
+ void evalTo(Dest& result) const
117
+ {
118
+ if(m_conservative)
119
+ internal::conservative_sparse_sparse_product_selector<_LhsNested, _RhsNested, Dest>::run(lhs(),rhs(),result);
120
+ else
121
+ internal::sparse_sparse_product_with_pruning_selector<_LhsNested, _RhsNested, Dest>::run(lhs(),rhs(),result,m_tolerance);
122
+ }
123
+
124
+ EIGEN_STRONG_INLINE Index rows() const { return m_lhs.rows(); }
125
+ EIGEN_STRONG_INLINE Index cols() const { return m_rhs.cols(); }
126
+
127
+ EIGEN_STRONG_INLINE const _LhsNested& lhs() const { return m_lhs; }
128
+ EIGEN_STRONG_INLINE const _RhsNested& rhs() const { return m_rhs; }
129
+
130
+ protected:
131
+ void init()
132
+ {
133
+ eigen_assert(m_lhs.cols() == m_rhs.rows());
134
+
135
+ enum {
136
+ ProductIsValid = _LhsNested::ColsAtCompileTime==Dynamic
137
+ || _RhsNested::RowsAtCompileTime==Dynamic
138
+ || int(_LhsNested::ColsAtCompileTime)==int(_RhsNested::RowsAtCompileTime),
139
+ AreVectors = _LhsNested::IsVectorAtCompileTime && _RhsNested::IsVectorAtCompileTime,
140
+ SameSizes = EIGEN_PREDICATE_SAME_MATRIX_SIZE(_LhsNested,_RhsNested)
141
+ };
142
+ // note to the lost user:
143
+ // * for a dot product use: v1.dot(v2)
144
+ // * for a coeff-wise product use: v1.cwise()*v2
145
+ EIGEN_STATIC_ASSERT(ProductIsValid || !(AreVectors && SameSizes),
146
+ INVALID_VECTOR_VECTOR_PRODUCT__IF_YOU_WANTED_A_DOT_OR_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTIONS)
147
+ EIGEN_STATIC_ASSERT(ProductIsValid || !(SameSizes && !AreVectors),
148
+ INVALID_MATRIX_PRODUCT__IF_YOU_WANTED_A_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTION)
149
+ EIGEN_STATIC_ASSERT(ProductIsValid || SameSizes, INVALID_MATRIX_PRODUCT)
150
+ }
151
+
152
+ LhsNested m_lhs;
153
+ RhsNested m_rhs;
154
+ RealScalar m_tolerance;
155
+ bool m_conservative;
156
+ };
157
+
158
+ // sparse = sparse * sparse
159
+ template<typename Derived>
160
+ template<typename Lhs, typename Rhs>
161
+ inline Derived& SparseMatrixBase<Derived>::operator=(const SparseSparseProduct<Lhs,Rhs>& product)
162
+ {
163
+ product.evalTo(derived());
164
+ return derived();
165
+ }
166
+
167
+ /** \returns an expression of the product of two sparse matrices.
168
+ * By default a conservative product preserving the symbolic non zeros is performed.
169
+ * The automatic pruning of the small values can be achieved by calling the pruned() function
170
+ * in which case a totally different product algorithm is employed:
171
+ * \code
172
+ * C = (A*B).pruned(); // supress numerical zeros (exact)
173
+ * C = (A*B).pruned(ref);
174
+ * C = (A*B).pruned(ref,epsilon);
175
+ * \endcode
176
+ * where \c ref is a meaningful non zero reference value.
177
+ * */
178
+ template<typename Derived>
179
+ template<typename OtherDerived>
180
+ inline const typename SparseSparseProductReturnType<Derived,OtherDerived>::Type
181
+ SparseMatrixBase<Derived>::operator*(const SparseMatrixBase<OtherDerived> &other) const
182
+ {
183
+ return typename SparseSparseProductReturnType<Derived,OtherDerived>::Type(derived(), other.derived());
184
+ }
185
+
186
+ } // end namespace Eigen
187
+
188
+ #endif // EIGEN_SPARSEPRODUCT_H
@@ -0,0 +1,45 @@
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
+ //
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_SPARSEREDUX_H
11
+ #define EIGEN_SPARSEREDUX_H
12
+
13
+ namespace Eigen {
14
+
15
+ template<typename Derived>
16
+ typename internal::traits<Derived>::Scalar
17
+ SparseMatrixBase<Derived>::sum() const
18
+ {
19
+ eigen_assert(rows()>0 && cols()>0 && "you are using a non initialized matrix");
20
+ Scalar res(0);
21
+ for (Index j=0; j<outerSize(); ++j)
22
+ for (typename Derived::InnerIterator iter(derived(),j); iter; ++iter)
23
+ res += iter.value();
24
+ return res;
25
+ }
26
+
27
+ template<typename _Scalar, int _Options, typename _Index>
28
+ typename internal::traits<SparseMatrix<_Scalar,_Options,_Index> >::Scalar
29
+ SparseMatrix<_Scalar,_Options,_Index>::sum() const
30
+ {
31
+ eigen_assert(rows()>0 && cols()>0 && "you are using a non initialized matrix");
32
+ return Matrix<Scalar,1,Dynamic>::Map(&m_data.value(0), m_data.size()).sum();
33
+ }
34
+
35
+ template<typename _Scalar, int _Options, typename _Index>
36
+ typename internal::traits<SparseVector<_Scalar,_Options, _Index> >::Scalar
37
+ SparseVector<_Scalar,_Options,_Index>::sum() const
38
+ {
39
+ eigen_assert(rows()>0 && cols()>0 && "you are using a non initialized matrix");
40
+ return Matrix<Scalar,1,Dynamic>::Map(&m_data.value(0), m_data.size()).sum();
41
+ }
42
+
43
+ } // end namespace Eigen
44
+
45
+ #endif // EIGEN_SPARSEREDUX_H
@@ -0,0 +1,507 @@
1
+ // This file is part of Eigen, a lightweight C++ template library
2
+ // for linear algebra.
3
+ //
4
+ // Copyright (C) 2009 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_SPARSE_SELFADJOINTVIEW_H
11
+ #define EIGEN_SPARSE_SELFADJOINTVIEW_H
12
+
13
+ namespace Eigen {
14
+
15
+ /** \ingroup SparseCore_Module
16
+ * \class SparseSelfAdjointView
17
+ *
18
+ * \brief Pseudo expression to manipulate a triangular sparse matrix as a selfadjoint matrix.
19
+ *
20
+ * \param MatrixType the type of the dense matrix storing the coefficients
21
+ * \param UpLo can be either \c #Lower or \c #Upper
22
+ *
23
+ * This class is an expression of a sefladjoint matrix from a triangular part of a matrix
24
+ * with given dense storage of the coefficients. It is the return type of MatrixBase::selfadjointView()
25
+ * and most of the time this is the only way that it is used.
26
+ *
27
+ * \sa SparseMatrixBase::selfadjointView()
28
+ */
29
+ template<typename Lhs, typename Rhs, int UpLo>
30
+ class SparseSelfAdjointTimeDenseProduct;
31
+
32
+ template<typename Lhs, typename Rhs, int UpLo>
33
+ class DenseTimeSparseSelfAdjointProduct;
34
+
35
+ namespace internal {
36
+
37
+ template<typename MatrixType, unsigned int UpLo>
38
+ struct traits<SparseSelfAdjointView<MatrixType,UpLo> > : traits<MatrixType> {
39
+ };
40
+
41
+ template<int SrcUpLo,int DstUpLo,typename MatrixType,int DestOrder>
42
+ void permute_symm_to_symm(const MatrixType& mat, SparseMatrix<typename MatrixType::Scalar,DestOrder,typename MatrixType::Index>& _dest, const typename MatrixType::Index* perm = 0);
43
+
44
+ template<int UpLo,typename MatrixType,int DestOrder>
45
+ void permute_symm_to_fullsymm(const MatrixType& mat, SparseMatrix<typename MatrixType::Scalar,DestOrder,typename MatrixType::Index>& _dest, const typename MatrixType::Index* perm = 0);
46
+
47
+ }
48
+
49
+ template<typename MatrixType, unsigned int UpLo> class SparseSelfAdjointView
50
+ : public EigenBase<SparseSelfAdjointView<MatrixType,UpLo> >
51
+ {
52
+ public:
53
+
54
+ typedef typename MatrixType::Scalar Scalar;
55
+ typedef typename MatrixType::Index Index;
56
+ typedef Matrix<Index,Dynamic,1> VectorI;
57
+ typedef typename MatrixType::Nested MatrixTypeNested;
58
+ typedef typename internal::remove_all<MatrixTypeNested>::type _MatrixTypeNested;
59
+
60
+ inline SparseSelfAdjointView(const MatrixType& matrix) : m_matrix(matrix)
61
+ {
62
+ eigen_assert(rows()==cols() && "SelfAdjointView is only for squared matrices");
63
+ }
64
+
65
+ inline Index rows() const { return m_matrix.rows(); }
66
+ inline Index cols() const { return m_matrix.cols(); }
67
+
68
+ /** \internal \returns a reference to the nested matrix */
69
+ const _MatrixTypeNested& matrix() const { return m_matrix; }
70
+ _MatrixTypeNested& matrix() { return m_matrix.const_cast_derived(); }
71
+
72
+ /** \returns an expression of the matrix product between a sparse self-adjoint matrix \c *this and a sparse matrix \a rhs.
73
+ *
74
+ * Note that there is no algorithmic advantage of performing such a product compared to a general sparse-sparse matrix product.
75
+ * Indeed, the SparseSelfadjointView operand is first copied into a temporary SparseMatrix before computing the product.
76
+ */
77
+ template<typename OtherDerived>
78
+ SparseSparseProduct<typename OtherDerived::PlainObject, OtherDerived>
79
+ operator*(const SparseMatrixBase<OtherDerived>& rhs) const
80
+ {
81
+ return SparseSparseProduct<typename OtherDerived::PlainObject, OtherDerived>(*this, rhs.derived());
82
+ }
83
+
84
+ /** \returns an expression of the matrix product between a sparse matrix \a lhs and a sparse self-adjoint matrix \a rhs.
85
+ *
86
+ * Note that there is no algorithmic advantage of performing such a product compared to a general sparse-sparse matrix product.
87
+ * Indeed, the SparseSelfadjointView operand is first copied into a temporary SparseMatrix before computing the product.
88
+ */
89
+ template<typename OtherDerived> friend
90
+ SparseSparseProduct<OtherDerived, typename OtherDerived::PlainObject >
91
+ operator*(const SparseMatrixBase<OtherDerived>& lhs, const SparseSelfAdjointView& rhs)
92
+ {
93
+ return SparseSparseProduct<OtherDerived, typename OtherDerived::PlainObject>(lhs.derived(), rhs);
94
+ }
95
+
96
+ /** Efficient sparse self-adjoint matrix times dense vector/matrix product */
97
+ template<typename OtherDerived>
98
+ SparseSelfAdjointTimeDenseProduct<MatrixType,OtherDerived,UpLo>
99
+ operator*(const MatrixBase<OtherDerived>& rhs) const
100
+ {
101
+ return SparseSelfAdjointTimeDenseProduct<MatrixType,OtherDerived,UpLo>(m_matrix, rhs.derived());
102
+ }
103
+
104
+ /** Efficient dense vector/matrix times sparse self-adjoint matrix product */
105
+ template<typename OtherDerived> friend
106
+ DenseTimeSparseSelfAdjointProduct<OtherDerived,MatrixType,UpLo>
107
+ operator*(const MatrixBase<OtherDerived>& lhs, const SparseSelfAdjointView& rhs)
108
+ {
109
+ return DenseTimeSparseSelfAdjointProduct<OtherDerived,_MatrixTypeNested,UpLo>(lhs.derived(), rhs.m_matrix);
110
+ }
111
+
112
+ /** Perform a symmetric rank K update of the selfadjoint matrix \c *this:
113
+ * \f$ this = this + \alpha ( u u^* ) \f$ where \a u is a vector or matrix.
114
+ *
115
+ * \returns a reference to \c *this
116
+ *
117
+ * To perform \f$ this = this + \alpha ( u^* u ) \f$ you can simply
118
+ * call this function with u.adjoint().
119
+ */
120
+ template<typename DerivedU>
121
+ SparseSelfAdjointView& rankUpdate(const SparseMatrixBase<DerivedU>& u, const Scalar& alpha = Scalar(1));
122
+
123
+ /** \internal triggered by sparse_matrix = SparseSelfadjointView; */
124
+ template<typename DestScalar,int StorageOrder> void evalTo(SparseMatrix<DestScalar,StorageOrder,Index>& _dest) const
125
+ {
126
+ internal::permute_symm_to_fullsymm<UpLo>(m_matrix, _dest);
127
+ }
128
+
129
+ template<typename DestScalar> void evalTo(DynamicSparseMatrix<DestScalar,ColMajor,Index>& _dest) const
130
+ {
131
+ // TODO directly evaluate into _dest;
132
+ SparseMatrix<DestScalar,ColMajor,Index> tmp(_dest.rows(),_dest.cols());
133
+ internal::permute_symm_to_fullsymm<UpLo>(m_matrix, tmp);
134
+ _dest = tmp;
135
+ }
136
+
137
+ /** \returns an expression of P H P^-1 */
138
+ SparseSymmetricPermutationProduct<_MatrixTypeNested,UpLo> twistedBy(const PermutationMatrix<Dynamic,Dynamic,Index>& perm) const
139
+ {
140
+ return SparseSymmetricPermutationProduct<_MatrixTypeNested,UpLo>(m_matrix, perm);
141
+ }
142
+
143
+ template<typename SrcMatrixType,int SrcUpLo>
144
+ SparseSelfAdjointView& operator=(const SparseSymmetricPermutationProduct<SrcMatrixType,SrcUpLo>& permutedMatrix)
145
+ {
146
+ permutedMatrix.evalTo(*this);
147
+ return *this;
148
+ }
149
+
150
+
151
+ SparseSelfAdjointView& operator=(const SparseSelfAdjointView& src)
152
+ {
153
+ PermutationMatrix<Dynamic> pnull;
154
+ return *this = src.twistedBy(pnull);
155
+ }
156
+
157
+ template<typename SrcMatrixType,unsigned int SrcUpLo>
158
+ SparseSelfAdjointView& operator=(const SparseSelfAdjointView<SrcMatrixType,SrcUpLo>& src)
159
+ {
160
+ PermutationMatrix<Dynamic> pnull;
161
+ return *this = src.twistedBy(pnull);
162
+ }
163
+
164
+
165
+ // const SparseLLT<PlainObject, UpLo> llt() const;
166
+ // const SparseLDLT<PlainObject, UpLo> ldlt() const;
167
+
168
+ protected:
169
+
170
+ typename MatrixType::Nested m_matrix;
171
+ mutable VectorI m_countPerRow;
172
+ mutable VectorI m_countPerCol;
173
+ };
174
+
175
+ /***************************************************************************
176
+ * Implementation of SparseMatrixBase methods
177
+ ***************************************************************************/
178
+
179
+ template<typename Derived>
180
+ template<unsigned int UpLo>
181
+ const SparseSelfAdjointView<Derived, UpLo> SparseMatrixBase<Derived>::selfadjointView() const
182
+ {
183
+ return derived();
184
+ }
185
+
186
+ template<typename Derived>
187
+ template<unsigned int UpLo>
188
+ SparseSelfAdjointView<Derived, UpLo> SparseMatrixBase<Derived>::selfadjointView()
189
+ {
190
+ return derived();
191
+ }
192
+
193
+ /***************************************************************************
194
+ * Implementation of SparseSelfAdjointView methods
195
+ ***************************************************************************/
196
+
197
+ template<typename MatrixType, unsigned int UpLo>
198
+ template<typename DerivedU>
199
+ SparseSelfAdjointView<MatrixType,UpLo>&
200
+ SparseSelfAdjointView<MatrixType,UpLo>::rankUpdate(const SparseMatrixBase<DerivedU>& u, const Scalar& alpha)
201
+ {
202
+ SparseMatrix<Scalar,MatrixType::Flags&RowMajorBit?RowMajor:ColMajor> tmp = u * u.adjoint();
203
+ if(alpha==Scalar(0))
204
+ m_matrix.const_cast_derived() = tmp.template triangularView<UpLo>();
205
+ else
206
+ m_matrix.const_cast_derived() += alpha * tmp.template triangularView<UpLo>();
207
+
208
+ return *this;
209
+ }
210
+
211
+ /***************************************************************************
212
+ * Implementation of sparse self-adjoint time dense matrix
213
+ ***************************************************************************/
214
+
215
+ namespace internal {
216
+ template<typename Lhs, typename Rhs, int UpLo>
217
+ struct traits<SparseSelfAdjointTimeDenseProduct<Lhs,Rhs,UpLo> >
218
+ : traits<ProductBase<SparseSelfAdjointTimeDenseProduct<Lhs,Rhs,UpLo>, Lhs, Rhs> >
219
+ {
220
+ typedef Dense StorageKind;
221
+ };
222
+ }
223
+
224
+ template<typename Lhs, typename Rhs, int UpLo>
225
+ class SparseSelfAdjointTimeDenseProduct
226
+ : public ProductBase<SparseSelfAdjointTimeDenseProduct<Lhs,Rhs,UpLo>, Lhs, Rhs>
227
+ {
228
+ public:
229
+ EIGEN_PRODUCT_PUBLIC_INTERFACE(SparseSelfAdjointTimeDenseProduct)
230
+
231
+ SparseSelfAdjointTimeDenseProduct(const Lhs& lhs, const Rhs& rhs) : Base(lhs,rhs)
232
+ {}
233
+
234
+ template<typename Dest> void scaleAndAddTo(Dest& dest, const Scalar& alpha) const
235
+ {
236
+ EIGEN_ONLY_USED_FOR_DEBUG(alpha);
237
+ // TODO use alpha
238
+ eigen_assert(alpha==Scalar(1) && "alpha != 1 is not implemented yet, sorry");
239
+ typedef typename internal::remove_all<Lhs>::type _Lhs;
240
+ typedef typename _Lhs::InnerIterator LhsInnerIterator;
241
+ enum {
242
+ LhsIsRowMajor = (_Lhs::Flags&RowMajorBit)==RowMajorBit,
243
+ ProcessFirstHalf =
244
+ ((UpLo&(Upper|Lower))==(Upper|Lower))
245
+ || ( (UpLo&Upper) && !LhsIsRowMajor)
246
+ || ( (UpLo&Lower) && LhsIsRowMajor),
247
+ ProcessSecondHalf = !ProcessFirstHalf
248
+ };
249
+ for (Index j=0; j<m_lhs.outerSize(); ++j)
250
+ {
251
+ LhsInnerIterator i(m_lhs,j);
252
+ if (ProcessSecondHalf)
253
+ {
254
+ while (i && i.index()<j) ++i;
255
+ if(i && i.index()==j)
256
+ {
257
+ dest.row(j) += i.value() * m_rhs.row(j);
258
+ ++i;
259
+ }
260
+ }
261
+ for(; (ProcessFirstHalf ? i && i.index() < j : i) ; ++i)
262
+ {
263
+ Index a = LhsIsRowMajor ? j : i.index();
264
+ Index b = LhsIsRowMajor ? i.index() : j;
265
+ typename Lhs::Scalar v = i.value();
266
+ dest.row(a) += (v) * m_rhs.row(b);
267
+ dest.row(b) += numext::conj(v) * m_rhs.row(a);
268
+ }
269
+ if (ProcessFirstHalf && i && (i.index()==j))
270
+ dest.row(j) += i.value() * m_rhs.row(j);
271
+ }
272
+ }
273
+
274
+ private:
275
+ SparseSelfAdjointTimeDenseProduct& operator=(const SparseSelfAdjointTimeDenseProduct&);
276
+ };
277
+
278
+ namespace internal {
279
+ template<typename Lhs, typename Rhs, int UpLo>
280
+ struct traits<DenseTimeSparseSelfAdjointProduct<Lhs,Rhs,UpLo> >
281
+ : traits<ProductBase<DenseTimeSparseSelfAdjointProduct<Lhs,Rhs,UpLo>, Lhs, Rhs> >
282
+ {};
283
+ }
284
+
285
+ template<typename Lhs, typename Rhs, int UpLo>
286
+ class DenseTimeSparseSelfAdjointProduct
287
+ : public ProductBase<DenseTimeSparseSelfAdjointProduct<Lhs,Rhs,UpLo>, Lhs, Rhs>
288
+ {
289
+ public:
290
+ EIGEN_PRODUCT_PUBLIC_INTERFACE(DenseTimeSparseSelfAdjointProduct)
291
+
292
+ DenseTimeSparseSelfAdjointProduct(const Lhs& lhs, const Rhs& rhs) : Base(lhs,rhs)
293
+ {}
294
+
295
+ template<typename Dest> void scaleAndAddTo(Dest& /*dest*/, const Scalar& /*alpha*/) const
296
+ {
297
+ // TODO
298
+ }
299
+
300
+ private:
301
+ DenseTimeSparseSelfAdjointProduct& operator=(const DenseTimeSparseSelfAdjointProduct&);
302
+ };
303
+
304
+ /***************************************************************************
305
+ * Implementation of symmetric copies and permutations
306
+ ***************************************************************************/
307
+ namespace internal {
308
+
309
+ template<typename MatrixType, int UpLo>
310
+ struct traits<SparseSymmetricPermutationProduct<MatrixType,UpLo> > : traits<MatrixType> {
311
+ };
312
+
313
+ template<int UpLo,typename MatrixType,int DestOrder>
314
+ void permute_symm_to_fullsymm(const MatrixType& mat, SparseMatrix<typename MatrixType::Scalar,DestOrder,typename MatrixType::Index>& _dest, const typename MatrixType::Index* perm)
315
+ {
316
+ typedef typename MatrixType::Index Index;
317
+ typedef typename MatrixType::Scalar Scalar;
318
+ typedef SparseMatrix<Scalar,DestOrder,Index> Dest;
319
+ typedef Matrix<Index,Dynamic,1> VectorI;
320
+
321
+ Dest& dest(_dest.derived());
322
+ enum {
323
+ StorageOrderMatch = int(Dest::IsRowMajor) == int(MatrixType::IsRowMajor)
324
+ };
325
+
326
+ Index size = mat.rows();
327
+ VectorI count;
328
+ count.resize(size);
329
+ count.setZero();
330
+ dest.resize(size,size);
331
+ for(Index j = 0; j<size; ++j)
332
+ {
333
+ Index jp = perm ? perm[j] : j;
334
+ for(typename MatrixType::InnerIterator it(mat,j); it; ++it)
335
+ {
336
+ Index i = it.index();
337
+ Index r = it.row();
338
+ Index c = it.col();
339
+ Index ip = perm ? perm[i] : i;
340
+ if(UpLo==(Upper|Lower))
341
+ count[StorageOrderMatch ? jp : ip]++;
342
+ else if(r==c)
343
+ count[ip]++;
344
+ else if(( UpLo==Lower && r>c) || ( UpLo==Upper && r<c))
345
+ {
346
+ count[ip]++;
347
+ count[jp]++;
348
+ }
349
+ }
350
+ }
351
+ Index nnz = count.sum();
352
+
353
+ // reserve space
354
+ dest.resizeNonZeros(nnz);
355
+ dest.outerIndexPtr()[0] = 0;
356
+ for(Index j=0; j<size; ++j)
357
+ dest.outerIndexPtr()[j+1] = dest.outerIndexPtr()[j] + count[j];
358
+ for(Index j=0; j<size; ++j)
359
+ count[j] = dest.outerIndexPtr()[j];
360
+
361
+ // copy data
362
+ for(Index j = 0; j<size; ++j)
363
+ {
364
+ for(typename MatrixType::InnerIterator it(mat,j); it; ++it)
365
+ {
366
+ Index i = it.index();
367
+ Index r = it.row();
368
+ Index c = it.col();
369
+
370
+ Index jp = perm ? perm[j] : j;
371
+ Index ip = perm ? perm[i] : i;
372
+
373
+ if(UpLo==(Upper|Lower))
374
+ {
375
+ Index k = count[StorageOrderMatch ? jp : ip]++;
376
+ dest.innerIndexPtr()[k] = StorageOrderMatch ? ip : jp;
377
+ dest.valuePtr()[k] = it.value();
378
+ }
379
+ else if(r==c)
380
+ {
381
+ Index k = count[ip]++;
382
+ dest.innerIndexPtr()[k] = ip;
383
+ dest.valuePtr()[k] = it.value();
384
+ }
385
+ else if(( (UpLo&Lower)==Lower && r>c) || ( (UpLo&Upper)==Upper && r<c))
386
+ {
387
+ if(!StorageOrderMatch)
388
+ std::swap(ip,jp);
389
+ Index k = count[jp]++;
390
+ dest.innerIndexPtr()[k] = ip;
391
+ dest.valuePtr()[k] = it.value();
392
+ k = count[ip]++;
393
+ dest.innerIndexPtr()[k] = jp;
394
+ dest.valuePtr()[k] = numext::conj(it.value());
395
+ }
396
+ }
397
+ }
398
+ }
399
+
400
+ template<int _SrcUpLo,int _DstUpLo,typename MatrixType,int DstOrder>
401
+ void permute_symm_to_symm(const MatrixType& mat, SparseMatrix<typename MatrixType::Scalar,DstOrder,typename MatrixType::Index>& _dest, const typename MatrixType::Index* perm)
402
+ {
403
+ typedef typename MatrixType::Index Index;
404
+ typedef typename MatrixType::Scalar Scalar;
405
+ SparseMatrix<Scalar,DstOrder,Index>& dest(_dest.derived());
406
+ typedef Matrix<Index,Dynamic,1> VectorI;
407
+ enum {
408
+ SrcOrder = MatrixType::IsRowMajor ? RowMajor : ColMajor,
409
+ StorageOrderMatch = int(SrcOrder) == int(DstOrder),
410
+ DstUpLo = DstOrder==RowMajor ? (_DstUpLo==Upper ? Lower : Upper) : _DstUpLo,
411
+ SrcUpLo = SrcOrder==RowMajor ? (_SrcUpLo==Upper ? Lower : Upper) : _SrcUpLo
412
+ };
413
+
414
+ Index size = mat.rows();
415
+ VectorI count(size);
416
+ count.setZero();
417
+ dest.resize(size,size);
418
+ for(Index j = 0; j<size; ++j)
419
+ {
420
+ Index jp = perm ? perm[j] : j;
421
+ for(typename MatrixType::InnerIterator it(mat,j); it; ++it)
422
+ {
423
+ Index i = it.index();
424
+ if((int(SrcUpLo)==int(Lower) && i<j) || (int(SrcUpLo)==int(Upper) && i>j))
425
+ continue;
426
+
427
+ Index ip = perm ? perm[i] : i;
428
+ count[int(DstUpLo)==int(Lower) ? (std::min)(ip,jp) : (std::max)(ip,jp)]++;
429
+ }
430
+ }
431
+ dest.outerIndexPtr()[0] = 0;
432
+ for(Index j=0; j<size; ++j)
433
+ dest.outerIndexPtr()[j+1] = dest.outerIndexPtr()[j] + count[j];
434
+ dest.resizeNonZeros(dest.outerIndexPtr()[size]);
435
+ for(Index j=0; j<size; ++j)
436
+ count[j] = dest.outerIndexPtr()[j];
437
+
438
+ for(Index j = 0; j<size; ++j)
439
+ {
440
+
441
+ for(typename MatrixType::InnerIterator it(mat,j); it; ++it)
442
+ {
443
+ Index i = it.index();
444
+ if((int(SrcUpLo)==int(Lower) && i<j) || (int(SrcUpLo)==int(Upper) && i>j))
445
+ continue;
446
+
447
+ Index jp = perm ? perm[j] : j;
448
+ Index ip = perm? perm[i] : i;
449
+
450
+ Index k = count[int(DstUpLo)==int(Lower) ? (std::min)(ip,jp) : (std::max)(ip,jp)]++;
451
+ dest.innerIndexPtr()[k] = int(DstUpLo)==int(Lower) ? (std::max)(ip,jp) : (std::min)(ip,jp);
452
+
453
+ if(!StorageOrderMatch) std::swap(ip,jp);
454
+ if( ((int(DstUpLo)==int(Lower) && ip<jp) || (int(DstUpLo)==int(Upper) && ip>jp)))
455
+ dest.valuePtr()[k] = numext::conj(it.value());
456
+ else
457
+ dest.valuePtr()[k] = it.value();
458
+ }
459
+ }
460
+ }
461
+
462
+ }
463
+
464
+ template<typename MatrixType,int UpLo>
465
+ class SparseSymmetricPermutationProduct
466
+ : public EigenBase<SparseSymmetricPermutationProduct<MatrixType,UpLo> >
467
+ {
468
+ public:
469
+ typedef typename MatrixType::Scalar Scalar;
470
+ typedef typename MatrixType::Index Index;
471
+ protected:
472
+ typedef PermutationMatrix<Dynamic,Dynamic,Index> Perm;
473
+ public:
474
+ typedef Matrix<Index,Dynamic,1> VectorI;
475
+ typedef typename MatrixType::Nested MatrixTypeNested;
476
+ typedef typename internal::remove_all<MatrixTypeNested>::type _MatrixTypeNested;
477
+
478
+ SparseSymmetricPermutationProduct(const MatrixType& mat, const Perm& perm)
479
+ : m_matrix(mat), m_perm(perm)
480
+ {}
481
+
482
+ inline Index rows() const { return m_matrix.rows(); }
483
+ inline Index cols() const { return m_matrix.cols(); }
484
+
485
+ template<typename DestScalar, int Options, typename DstIndex>
486
+ void evalTo(SparseMatrix<DestScalar,Options,DstIndex>& _dest) const
487
+ {
488
+ // internal::permute_symm_to_fullsymm<UpLo>(m_matrix,_dest,m_perm.indices().data());
489
+ SparseMatrix<DestScalar,(Options&RowMajor)==RowMajor ? ColMajor : RowMajor, DstIndex> tmp;
490
+ internal::permute_symm_to_fullsymm<UpLo>(m_matrix,tmp,m_perm.indices().data());
491
+ _dest = tmp;
492
+ }
493
+
494
+ template<typename DestType,unsigned int DestUpLo> void evalTo(SparseSelfAdjointView<DestType,DestUpLo>& dest) const
495
+ {
496
+ internal::permute_symm_to_symm<UpLo,DestUpLo>(m_matrix,dest.matrix(),m_perm.indices().data());
497
+ }
498
+
499
+ protected:
500
+ MatrixTypeNested m_matrix;
501
+ const Perm& m_perm;
502
+
503
+ };
504
+
505
+ } // end namespace Eigen
506
+
507
+ #endif // EIGEN_SPARSE_SELFADJOINTVIEW_H