ruby-eigen 0.0.9 → 0.0.10.pre1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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