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,111 @@
1
+ // This file is part of Eigen, a lightweight C++ template library
2
+ // for linear algebra.
3
+ //
4
+ // Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>
5
+ // Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>
6
+ //
7
+ // This Source Code Form is subject to the terms of the Mozilla
8
+ // Public License v. 2.0. If a copy of the MPL was not distributed
9
+ // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
10
+
11
+ #ifndef EIGEN_NESTBYVALUE_H
12
+ #define EIGEN_NESTBYVALUE_H
13
+
14
+ namespace Eigen {
15
+
16
+ /** \class NestByValue
17
+ * \ingroup Core_Module
18
+ *
19
+ * \brief Expression which must be nested by value
20
+ *
21
+ * \param ExpressionType the type of the object of which we are requiring nesting-by-value
22
+ *
23
+ * This class is the return type of MatrixBase::nestByValue()
24
+ * and most of the time this is the only way it is used.
25
+ *
26
+ * \sa MatrixBase::nestByValue()
27
+ */
28
+
29
+ namespace internal {
30
+ template<typename ExpressionType>
31
+ struct traits<NestByValue<ExpressionType> > : public traits<ExpressionType>
32
+ {};
33
+ }
34
+
35
+ template<typename ExpressionType> class NestByValue
36
+ : public internal::dense_xpr_base< NestByValue<ExpressionType> >::type
37
+ {
38
+ public:
39
+
40
+ typedef typename internal::dense_xpr_base<NestByValue>::type Base;
41
+ EIGEN_DENSE_PUBLIC_INTERFACE(NestByValue)
42
+
43
+ inline NestByValue(const ExpressionType& matrix) : m_expression(matrix) {}
44
+
45
+ inline Index rows() const { return m_expression.rows(); }
46
+ inline Index cols() const { return m_expression.cols(); }
47
+ inline Index outerStride() const { return m_expression.outerStride(); }
48
+ inline Index innerStride() const { return m_expression.innerStride(); }
49
+
50
+ inline const CoeffReturnType coeff(Index row, Index col) const
51
+ {
52
+ return m_expression.coeff(row, col);
53
+ }
54
+
55
+ inline Scalar& coeffRef(Index row, Index col)
56
+ {
57
+ return m_expression.const_cast_derived().coeffRef(row, col);
58
+ }
59
+
60
+ inline const CoeffReturnType coeff(Index index) const
61
+ {
62
+ return m_expression.coeff(index);
63
+ }
64
+
65
+ inline Scalar& coeffRef(Index index)
66
+ {
67
+ return m_expression.const_cast_derived().coeffRef(index);
68
+ }
69
+
70
+ template<int LoadMode>
71
+ inline const PacketScalar packet(Index row, Index col) const
72
+ {
73
+ return m_expression.template packet<LoadMode>(row, col);
74
+ }
75
+
76
+ template<int LoadMode>
77
+ inline void writePacket(Index row, Index col, const PacketScalar& x)
78
+ {
79
+ m_expression.const_cast_derived().template writePacket<LoadMode>(row, col, x);
80
+ }
81
+
82
+ template<int LoadMode>
83
+ inline const PacketScalar packet(Index index) const
84
+ {
85
+ return m_expression.template packet<LoadMode>(index);
86
+ }
87
+
88
+ template<int LoadMode>
89
+ inline void writePacket(Index index, const PacketScalar& x)
90
+ {
91
+ m_expression.const_cast_derived().template writePacket<LoadMode>(index, x);
92
+ }
93
+
94
+ operator const ExpressionType&() const { return m_expression; }
95
+
96
+ protected:
97
+ const ExpressionType m_expression;
98
+ };
99
+
100
+ /** \returns an expression of the temporary version of *this.
101
+ */
102
+ template<typename Derived>
103
+ inline const NestByValue<Derived>
104
+ DenseBase<Derived>::nestByValue() const
105
+ {
106
+ return NestByValue<Derived>(derived());
107
+ }
108
+
109
+ } // end namespace Eigen
110
+
111
+ #endif // EIGEN_NESTBYVALUE_H
@@ -0,0 +1,134 @@
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_NOALIAS_H
11
+ #define EIGEN_NOALIAS_H
12
+
13
+ namespace Eigen {
14
+
15
+ /** \class NoAlias
16
+ * \ingroup Core_Module
17
+ *
18
+ * \brief Pseudo expression providing an operator = assuming no aliasing
19
+ *
20
+ * \param ExpressionType the type of the object on which to do the lazy assignment
21
+ *
22
+ * This class represents an expression with special assignment operators
23
+ * assuming no aliasing between the target expression and the source expression.
24
+ * More precisely it alloas to bypass the EvalBeforeAssignBit flag of the source expression.
25
+ * It is the return type of MatrixBase::noalias()
26
+ * and most of the time this is the only way it is used.
27
+ *
28
+ * \sa MatrixBase::noalias()
29
+ */
30
+ template<typename ExpressionType, template <typename> class StorageBase>
31
+ class NoAlias
32
+ {
33
+ typedef typename ExpressionType::Scalar Scalar;
34
+ public:
35
+ NoAlias(ExpressionType& expression) : m_expression(expression) {}
36
+
37
+ /** Behaves like MatrixBase::lazyAssign(other)
38
+ * \sa MatrixBase::lazyAssign() */
39
+ template<typename OtherDerived>
40
+ EIGEN_STRONG_INLINE ExpressionType& operator=(const StorageBase<OtherDerived>& other)
41
+ { return internal::assign_selector<ExpressionType,OtherDerived,false>::run(m_expression,other.derived()); }
42
+
43
+ /** \sa MatrixBase::operator+= */
44
+ template<typename OtherDerived>
45
+ EIGEN_STRONG_INLINE ExpressionType& operator+=(const StorageBase<OtherDerived>& other)
46
+ {
47
+ typedef SelfCwiseBinaryOp<internal::scalar_sum_op<Scalar>, ExpressionType, OtherDerived> SelfAdder;
48
+ SelfAdder tmp(m_expression);
49
+ typedef typename internal::nested<OtherDerived>::type OtherDerivedNested;
50
+ typedef typename internal::remove_all<OtherDerivedNested>::type _OtherDerivedNested;
51
+ internal::assign_selector<SelfAdder,_OtherDerivedNested,false>::run(tmp,OtherDerivedNested(other.derived()));
52
+ return m_expression;
53
+ }
54
+
55
+ /** \sa MatrixBase::operator-= */
56
+ template<typename OtherDerived>
57
+ EIGEN_STRONG_INLINE ExpressionType& operator-=(const StorageBase<OtherDerived>& other)
58
+ {
59
+ typedef SelfCwiseBinaryOp<internal::scalar_difference_op<Scalar>, ExpressionType, OtherDerived> SelfAdder;
60
+ SelfAdder tmp(m_expression);
61
+ typedef typename internal::nested<OtherDerived>::type OtherDerivedNested;
62
+ typedef typename internal::remove_all<OtherDerivedNested>::type _OtherDerivedNested;
63
+ internal::assign_selector<SelfAdder,_OtherDerivedNested,false>::run(tmp,OtherDerivedNested(other.derived()));
64
+ return m_expression;
65
+ }
66
+
67
+ #ifndef EIGEN_PARSED_BY_DOXYGEN
68
+ template<typename ProductDerived, typename Lhs, typename Rhs>
69
+ EIGEN_STRONG_INLINE ExpressionType& operator+=(const ProductBase<ProductDerived, Lhs,Rhs>& other)
70
+ { other.derived().addTo(m_expression); return m_expression; }
71
+
72
+ template<typename ProductDerived, typename Lhs, typename Rhs>
73
+ EIGEN_STRONG_INLINE ExpressionType& operator-=(const ProductBase<ProductDerived, Lhs,Rhs>& other)
74
+ { other.derived().subTo(m_expression); return m_expression; }
75
+
76
+ template<typename Lhs, typename Rhs, int NestingFlags>
77
+ EIGEN_STRONG_INLINE ExpressionType& operator+=(const CoeffBasedProduct<Lhs,Rhs,NestingFlags>& other)
78
+ { return m_expression.derived() += CoeffBasedProduct<Lhs,Rhs,NestByRefBit>(other.lhs(), other.rhs()); }
79
+
80
+ template<typename Lhs, typename Rhs, int NestingFlags>
81
+ EIGEN_STRONG_INLINE ExpressionType& operator-=(const CoeffBasedProduct<Lhs,Rhs,NestingFlags>& other)
82
+ { return m_expression.derived() -= CoeffBasedProduct<Lhs,Rhs,NestByRefBit>(other.lhs(), other.rhs()); }
83
+
84
+ template<typename OtherDerived>
85
+ ExpressionType& operator=(const ReturnByValue<OtherDerived>& func)
86
+ { return m_expression = func; }
87
+ #endif
88
+
89
+ ExpressionType& expression() const
90
+ {
91
+ return m_expression;
92
+ }
93
+
94
+ protected:
95
+ ExpressionType& m_expression;
96
+ };
97
+
98
+ /** \returns a pseudo expression of \c *this with an operator= assuming
99
+ * no aliasing between \c *this and the source expression.
100
+ *
101
+ * More precisely, noalias() allows to bypass the EvalBeforeAssignBit flag.
102
+ * Currently, even though several expressions may alias, only product
103
+ * expressions have this flag. Therefore, noalias() is only usefull when
104
+ * the source expression contains a matrix product.
105
+ *
106
+ * Here are some examples where noalias is usefull:
107
+ * \code
108
+ * D.noalias() = A * B;
109
+ * D.noalias() += A.transpose() * B;
110
+ * D.noalias() -= 2 * A * B.adjoint();
111
+ * \endcode
112
+ *
113
+ * On the other hand the following example will lead to a \b wrong result:
114
+ * \code
115
+ * A.noalias() = A * B;
116
+ * \endcode
117
+ * because the result matrix A is also an operand of the matrix product. Therefore,
118
+ * there is no alternative than evaluating A * B in a temporary, that is the default
119
+ * behavior when you write:
120
+ * \code
121
+ * A = A * B;
122
+ * \endcode
123
+ *
124
+ * \sa class NoAlias
125
+ */
126
+ template<typename Derived>
127
+ NoAlias<Derived,MatrixBase> MatrixBase<Derived>::noalias()
128
+ {
129
+ return derived();
130
+ }
131
+
132
+ } // end namespace Eigen
133
+
134
+ #endif // EIGEN_NOALIAS_H
@@ -0,0 +1,150 @@
1
+ // This file is part of Eigen, a lightweight C++ template library
2
+ // for linear algebra.
3
+ //
4
+ // Copyright (C) 2006-2010 Benoit Jacob <jacob.benoit.1@gmail.com>
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_NUMTRAITS_H
11
+ #define EIGEN_NUMTRAITS_H
12
+
13
+ namespace Eigen {
14
+
15
+ /** \class NumTraits
16
+ * \ingroup Core_Module
17
+ *
18
+ * \brief Holds information about the various numeric (i.e. scalar) types allowed by Eigen.
19
+ *
20
+ * \param T the numeric type at hand
21
+ *
22
+ * This class stores enums, typedefs and static methods giving information about a numeric type.
23
+ *
24
+ * The provided data consists of:
25
+ * \li A typedef \a Real, giving the "real part" type of \a T. If \a T is already real,
26
+ * then \a Real is just a typedef to \a T. If \a T is \c std::complex<U> then \a Real
27
+ * is a typedef to \a U.
28
+ * \li A typedef \a NonInteger, giving the type that should be used for operations producing non-integral values,
29
+ * such as quotients, square roots, etc. If \a T is a floating-point type, then this typedef just gives
30
+ * \a T again. Note however that many Eigen functions such as internal::sqrt simply refuse to
31
+ * take integers. Outside of a few cases, Eigen doesn't do automatic type promotion. Thus, this typedef is
32
+ * only intended as a helper for code that needs to explicitly promote types.
33
+ * \li A typedef \a Nested giving the type to use to nest a value inside of the expression tree. If you don't know what
34
+ * this means, just use \a T here.
35
+ * \li An enum value \a IsComplex. It is equal to 1 if \a T is a \c std::complex
36
+ * type, and to 0 otherwise.
37
+ * \li An enum value \a IsInteger. It is equal to \c 1 if \a T is an integer type such as \c int,
38
+ * and to \c 0 otherwise.
39
+ * \li Enum values ReadCost, AddCost and MulCost representing a rough estimate of the number of CPU cycles needed
40
+ * to by move / add / mul instructions respectively, assuming the data is already stored in CPU registers.
41
+ * Stay vague here. No need to do architecture-specific stuff.
42
+ * \li An enum value \a IsSigned. It is equal to \c 1 if \a T is a signed type and to 0 if \a T is unsigned.
43
+ * \li An enum value \a RequireInitialization. It is equal to \c 1 if the constructor of the numeric type \a T must
44
+ * be called, and to 0 if it is safe not to call it. Default is 0 if \a T is an arithmetic type, and 1 otherwise.
45
+ * \li An epsilon() function which, unlike std::numeric_limits::epsilon(), returns a \a Real instead of a \a T.
46
+ * \li A dummy_precision() function returning a weak epsilon value. It is mainly used as a default
47
+ * value by the fuzzy comparison operators.
48
+ * \li highest() and lowest() functions returning the highest and lowest possible values respectively.
49
+ */
50
+
51
+ template<typename T> struct GenericNumTraits
52
+ {
53
+ enum {
54
+ IsInteger = std::numeric_limits<T>::is_integer,
55
+ IsSigned = std::numeric_limits<T>::is_signed,
56
+ IsComplex = 0,
57
+ RequireInitialization = internal::is_arithmetic<T>::value ? 0 : 1,
58
+ ReadCost = 1,
59
+ AddCost = 1,
60
+ MulCost = 1
61
+ };
62
+
63
+ typedef T Real;
64
+ typedef typename internal::conditional<
65
+ IsInteger,
66
+ typename internal::conditional<sizeof(T)<=2, float, double>::type,
67
+ T
68
+ >::type NonInteger;
69
+ typedef T Nested;
70
+
71
+ static inline Real epsilon() { return std::numeric_limits<T>::epsilon(); }
72
+ static inline Real dummy_precision()
73
+ {
74
+ // make sure to override this for floating-point types
75
+ return Real(0);
76
+ }
77
+ static inline T highest() { return (std::numeric_limits<T>::max)(); }
78
+ static inline T lowest() { return IsInteger ? (std::numeric_limits<T>::min)() : (-(std::numeric_limits<T>::max)()); }
79
+
80
+ #ifdef EIGEN2_SUPPORT
81
+ enum {
82
+ HasFloatingPoint = !IsInteger
83
+ };
84
+ typedef NonInteger FloatingPoint;
85
+ #endif
86
+ };
87
+
88
+ template<typename T> struct NumTraits : GenericNumTraits<T>
89
+ {};
90
+
91
+ template<> struct NumTraits<float>
92
+ : GenericNumTraits<float>
93
+ {
94
+ static inline float dummy_precision() { return 1e-5f; }
95
+ };
96
+
97
+ template<> struct NumTraits<double> : GenericNumTraits<double>
98
+ {
99
+ static inline double dummy_precision() { return 1e-12; }
100
+ };
101
+
102
+ template<> struct NumTraits<long double>
103
+ : GenericNumTraits<long double>
104
+ {
105
+ static inline long double dummy_precision() { return 1e-15l; }
106
+ };
107
+
108
+ template<typename _Real> struct NumTraits<std::complex<_Real> >
109
+ : GenericNumTraits<std::complex<_Real> >
110
+ {
111
+ typedef _Real Real;
112
+ enum {
113
+ IsComplex = 1,
114
+ RequireInitialization = NumTraits<_Real>::RequireInitialization,
115
+ ReadCost = 2 * NumTraits<_Real>::ReadCost,
116
+ AddCost = 2 * NumTraits<Real>::AddCost,
117
+ MulCost = 4 * NumTraits<Real>::MulCost + 2 * NumTraits<Real>::AddCost
118
+ };
119
+
120
+ static inline Real epsilon() { return NumTraits<Real>::epsilon(); }
121
+ static inline Real dummy_precision() { return NumTraits<Real>::dummy_precision(); }
122
+ };
123
+
124
+ template<typename Scalar, int Rows, int Cols, int Options, int MaxRows, int MaxCols>
125
+ struct NumTraits<Array<Scalar, Rows, Cols, Options, MaxRows, MaxCols> >
126
+ {
127
+ typedef Array<Scalar, Rows, Cols, Options, MaxRows, MaxCols> ArrayType;
128
+ typedef typename NumTraits<Scalar>::Real RealScalar;
129
+ typedef Array<RealScalar, Rows, Cols, Options, MaxRows, MaxCols> Real;
130
+ typedef typename NumTraits<Scalar>::NonInteger NonIntegerScalar;
131
+ typedef Array<NonIntegerScalar, Rows, Cols, Options, MaxRows, MaxCols> NonInteger;
132
+ typedef ArrayType & Nested;
133
+
134
+ enum {
135
+ IsComplex = NumTraits<Scalar>::IsComplex,
136
+ IsInteger = NumTraits<Scalar>::IsInteger,
137
+ IsSigned = NumTraits<Scalar>::IsSigned,
138
+ RequireInitialization = 1,
139
+ ReadCost = ArrayType::SizeAtCompileTime==Dynamic ? Dynamic : ArrayType::SizeAtCompileTime * NumTraits<Scalar>::ReadCost,
140
+ AddCost = ArrayType::SizeAtCompileTime==Dynamic ? Dynamic : ArrayType::SizeAtCompileTime * NumTraits<Scalar>::AddCost,
141
+ MulCost = ArrayType::SizeAtCompileTime==Dynamic ? Dynamic : ArrayType::SizeAtCompileTime * NumTraits<Scalar>::MulCost
142
+ };
143
+
144
+ static inline RealScalar epsilon() { return NumTraits<RealScalar>::epsilon(); }
145
+ static inline RealScalar dummy_precision() { return NumTraits<RealScalar>::dummy_precision(); }
146
+ };
147
+
148
+ } // end namespace Eigen
149
+
150
+ #endif // EIGEN_NUMTRAITS_H
@@ -0,0 +1,721 @@
1
+ // This file is part of Eigen, a lightweight C++ template library
2
+ // for linear algebra.
3
+ //
4
+ // Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>
5
+ // Copyright (C) 2009-2011 Gael Guennebaud <gael.guennebaud@inria.fr>
6
+ //
7
+ // This Source Code Form is subject to the terms of the Mozilla
8
+ // Public License v. 2.0. If a copy of the MPL was not distributed
9
+ // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
10
+
11
+ #ifndef EIGEN_PERMUTATIONMATRIX_H
12
+ #define EIGEN_PERMUTATIONMATRIX_H
13
+
14
+ namespace Eigen {
15
+
16
+ template<int RowCol,typename IndicesType,typename MatrixType, typename StorageKind> class PermutedImpl;
17
+
18
+ /** \class PermutationBase
19
+ * \ingroup Core_Module
20
+ *
21
+ * \brief Base class for permutations
22
+ *
23
+ * \param Derived the derived class
24
+ *
25
+ * This class is the base class for all expressions representing a permutation matrix,
26
+ * internally stored as a vector of integers.
27
+ * The convention followed here is that if \f$ \sigma \f$ is a permutation, the corresponding permutation matrix
28
+ * \f$ P_\sigma \f$ is such that if \f$ (e_1,\ldots,e_p) \f$ is the canonical basis, we have:
29
+ * \f[ P_\sigma(e_i) = e_{\sigma(i)}. \f]
30
+ * This convention ensures that for any two permutations \f$ \sigma, \tau \f$, we have:
31
+ * \f[ P_{\sigma\circ\tau} = P_\sigma P_\tau. \f]
32
+ *
33
+ * Permutation matrices are square and invertible.
34
+ *
35
+ * Notice that in addition to the member functions and operators listed here, there also are non-member
36
+ * operator* to multiply any kind of permutation object with any kind of matrix expression (MatrixBase)
37
+ * on either side.
38
+ *
39
+ * \sa class PermutationMatrix, class PermutationWrapper
40
+ */
41
+
42
+ namespace internal {
43
+
44
+ template<typename PermutationType, typename MatrixType, int Side, bool Transposed=false>
45
+ struct permut_matrix_product_retval;
46
+ template<typename PermutationType, typename MatrixType, int Side, bool Transposed=false>
47
+ struct permut_sparsematrix_product_retval;
48
+ enum PermPermProduct_t {PermPermProduct};
49
+
50
+ } // end namespace internal
51
+
52
+ template<typename Derived>
53
+ class PermutationBase : public EigenBase<Derived>
54
+ {
55
+ typedef internal::traits<Derived> Traits;
56
+ typedef EigenBase<Derived> Base;
57
+ public:
58
+
59
+ #ifndef EIGEN_PARSED_BY_DOXYGEN
60
+ typedef typename Traits::IndicesType IndicesType;
61
+ enum {
62
+ Flags = Traits::Flags,
63
+ CoeffReadCost = Traits::CoeffReadCost,
64
+ RowsAtCompileTime = Traits::RowsAtCompileTime,
65
+ ColsAtCompileTime = Traits::ColsAtCompileTime,
66
+ MaxRowsAtCompileTime = Traits::MaxRowsAtCompileTime,
67
+ MaxColsAtCompileTime = Traits::MaxColsAtCompileTime
68
+ };
69
+ typedef typename Traits::Scalar Scalar;
70
+ typedef typename Traits::Index Index;
71
+ typedef Matrix<Scalar,RowsAtCompileTime,ColsAtCompileTime,0,MaxRowsAtCompileTime,MaxColsAtCompileTime>
72
+ DenseMatrixType;
73
+ typedef PermutationMatrix<IndicesType::SizeAtCompileTime,IndicesType::MaxSizeAtCompileTime,Index>
74
+ PlainPermutationType;
75
+ using Base::derived;
76
+ #endif
77
+
78
+ /** Copies the other permutation into *this */
79
+ template<typename OtherDerived>
80
+ Derived& operator=(const PermutationBase<OtherDerived>& other)
81
+ {
82
+ indices() = other.indices();
83
+ return derived();
84
+ }
85
+
86
+ /** Assignment from the Transpositions \a tr */
87
+ template<typename OtherDerived>
88
+ Derived& operator=(const TranspositionsBase<OtherDerived>& tr)
89
+ {
90
+ setIdentity(tr.size());
91
+ for(Index k=size()-1; k>=0; --k)
92
+ applyTranspositionOnTheRight(k,tr.coeff(k));
93
+ return derived();
94
+ }
95
+
96
+ #ifndef EIGEN_PARSED_BY_DOXYGEN
97
+ /** This is a special case of the templated operator=. Its purpose is to
98
+ * prevent a default operator= from hiding the templated operator=.
99
+ */
100
+ Derived& operator=(const PermutationBase& other)
101
+ {
102
+ indices() = other.indices();
103
+ return derived();
104
+ }
105
+ #endif
106
+
107
+ /** \returns the number of rows */
108
+ inline Index rows() const { return Index(indices().size()); }
109
+
110
+ /** \returns the number of columns */
111
+ inline Index cols() const { return Index(indices().size()); }
112
+
113
+ /** \returns the size of a side of the respective square matrix, i.e., the number of indices */
114
+ inline Index size() const { return Index(indices().size()); }
115
+
116
+ #ifndef EIGEN_PARSED_BY_DOXYGEN
117
+ template<typename DenseDerived>
118
+ void evalTo(MatrixBase<DenseDerived>& other) const
119
+ {
120
+ other.setZero();
121
+ for (int i=0; i<rows();++i)
122
+ other.coeffRef(indices().coeff(i),i) = typename DenseDerived::Scalar(1);
123
+ }
124
+ #endif
125
+
126
+ /** \returns a Matrix object initialized from this permutation matrix. Notice that it
127
+ * is inefficient to return this Matrix object by value. For efficiency, favor using
128
+ * the Matrix constructor taking EigenBase objects.
129
+ */
130
+ DenseMatrixType toDenseMatrix() const
131
+ {
132
+ return derived();
133
+ }
134
+
135
+ /** const version of indices(). */
136
+ const IndicesType& indices() const { return derived().indices(); }
137
+ /** \returns a reference to the stored array representing the permutation. */
138
+ IndicesType& indices() { return derived().indices(); }
139
+
140
+ /** Resizes to given size.
141
+ */
142
+ inline void resize(Index newSize)
143
+ {
144
+ indices().resize(newSize);
145
+ }
146
+
147
+ /** Sets *this to be the identity permutation matrix */
148
+ void setIdentity()
149
+ {
150
+ for(Index i = 0; i < size(); ++i)
151
+ indices().coeffRef(i) = i;
152
+ }
153
+
154
+ /** Sets *this to be the identity permutation matrix of given size.
155
+ */
156
+ void setIdentity(Index newSize)
157
+ {
158
+ resize(newSize);
159
+ setIdentity();
160
+ }
161
+
162
+ /** Multiplies *this by the transposition \f$(ij)\f$ on the left.
163
+ *
164
+ * \returns a reference to *this.
165
+ *
166
+ * \warning This is much slower than applyTranspositionOnTheRight(int,int):
167
+ * this has linear complexity and requires a lot of branching.
168
+ *
169
+ * \sa applyTranspositionOnTheRight(int,int)
170
+ */
171
+ Derived& applyTranspositionOnTheLeft(Index i, Index j)
172
+ {
173
+ eigen_assert(i>=0 && j>=0 && i<size() && j<size());
174
+ for(Index k = 0; k < size(); ++k)
175
+ {
176
+ if(indices().coeff(k) == i) indices().coeffRef(k) = j;
177
+ else if(indices().coeff(k) == j) indices().coeffRef(k) = i;
178
+ }
179
+ return derived();
180
+ }
181
+
182
+ /** Multiplies *this by the transposition \f$(ij)\f$ on the right.
183
+ *
184
+ * \returns a reference to *this.
185
+ *
186
+ * This is a fast operation, it only consists in swapping two indices.
187
+ *
188
+ * \sa applyTranspositionOnTheLeft(int,int)
189
+ */
190
+ Derived& applyTranspositionOnTheRight(Index i, Index j)
191
+ {
192
+ eigen_assert(i>=0 && j>=0 && i<size() && j<size());
193
+ std::swap(indices().coeffRef(i), indices().coeffRef(j));
194
+ return derived();
195
+ }
196
+
197
+ /** \returns the inverse permutation matrix.
198
+ *
199
+ * \note \note_try_to_help_rvo
200
+ */
201
+ inline Transpose<PermutationBase> inverse() const
202
+ { return derived(); }
203
+ /** \returns the tranpose permutation matrix.
204
+ *
205
+ * \note \note_try_to_help_rvo
206
+ */
207
+ inline Transpose<PermutationBase> transpose() const
208
+ { return derived(); }
209
+
210
+ /**** multiplication helpers to hopefully get RVO ****/
211
+
212
+
213
+ #ifndef EIGEN_PARSED_BY_DOXYGEN
214
+ protected:
215
+ template<typename OtherDerived>
216
+ void assignTranspose(const PermutationBase<OtherDerived>& other)
217
+ {
218
+ for (int i=0; i<rows();++i) indices().coeffRef(other.indices().coeff(i)) = i;
219
+ }
220
+ template<typename Lhs,typename Rhs>
221
+ void assignProduct(const Lhs& lhs, const Rhs& rhs)
222
+ {
223
+ eigen_assert(lhs.cols() == rhs.rows());
224
+ for (int i=0; i<rows();++i) indices().coeffRef(i) = lhs.indices().coeff(rhs.indices().coeff(i));
225
+ }
226
+ #endif
227
+
228
+ public:
229
+
230
+ /** \returns the product permutation matrix.
231
+ *
232
+ * \note \note_try_to_help_rvo
233
+ */
234
+ template<typename Other>
235
+ inline PlainPermutationType operator*(const PermutationBase<Other>& other) const
236
+ { return PlainPermutationType(internal::PermPermProduct, derived(), other.derived()); }
237
+
238
+ /** \returns the product of a permutation with another inverse permutation.
239
+ *
240
+ * \note \note_try_to_help_rvo
241
+ */
242
+ template<typename Other>
243
+ inline PlainPermutationType operator*(const Transpose<PermutationBase<Other> >& other) const
244
+ { return PlainPermutationType(internal::PermPermProduct, *this, other.eval()); }
245
+
246
+ /** \returns the product of an inverse permutation with another permutation.
247
+ *
248
+ * \note \note_try_to_help_rvo
249
+ */
250
+ template<typename Other> friend
251
+ inline PlainPermutationType operator*(const Transpose<PermutationBase<Other> >& other, const PermutationBase& perm)
252
+ { return PlainPermutationType(internal::PermPermProduct, other.eval(), perm); }
253
+
254
+ /** \returns the determinant of the permutation matrix, which is either 1 or -1 depending on the parity of the permutation.
255
+ *
256
+ * This function is O(\c n) procedure allocating a buffer of \c n booleans.
257
+ */
258
+ Index determinant() const
259
+ {
260
+ Index res = 1;
261
+ Index n = size();
262
+ Matrix<bool,RowsAtCompileTime,1,0,MaxRowsAtCompileTime> mask(n);
263
+ mask.fill(false);
264
+ Index r = 0;
265
+ while(r < n)
266
+ {
267
+ // search for the next seed
268
+ while(r<n && mask[r]) r++;
269
+ if(r>=n)
270
+ break;
271
+ // we got one, let's follow it until we are back to the seed
272
+ Index k0 = r++;
273
+ mask.coeffRef(k0) = true;
274
+ for(Index k=indices().coeff(k0); k!=k0; k=indices().coeff(k))
275
+ {
276
+ mask.coeffRef(k) = true;
277
+ res = -res;
278
+ }
279
+ }
280
+ return res;
281
+ }
282
+
283
+ protected:
284
+
285
+ };
286
+
287
+ /** \class PermutationMatrix
288
+ * \ingroup Core_Module
289
+ *
290
+ * \brief Permutation matrix
291
+ *
292
+ * \param SizeAtCompileTime the number of rows/cols, or Dynamic
293
+ * \param MaxSizeAtCompileTime the maximum number of rows/cols, or Dynamic. This optional parameter defaults to SizeAtCompileTime. Most of the time, you should not have to specify it.
294
+ * \param IndexType the interger type of the indices
295
+ *
296
+ * This class represents a permutation matrix, internally stored as a vector of integers.
297
+ *
298
+ * \sa class PermutationBase, class PermutationWrapper, class DiagonalMatrix
299
+ */
300
+
301
+ namespace internal {
302
+ template<int SizeAtCompileTime, int MaxSizeAtCompileTime, typename IndexType>
303
+ struct traits<PermutationMatrix<SizeAtCompileTime, MaxSizeAtCompileTime, IndexType> >
304
+ : traits<Matrix<IndexType,SizeAtCompileTime,SizeAtCompileTime,0,MaxSizeAtCompileTime,MaxSizeAtCompileTime> >
305
+ {
306
+ typedef IndexType Index;
307
+ typedef Matrix<IndexType, SizeAtCompileTime, 1, 0, MaxSizeAtCompileTime, 1> IndicesType;
308
+ };
309
+ }
310
+
311
+ template<int SizeAtCompileTime, int MaxSizeAtCompileTime, typename IndexType>
312
+ class PermutationMatrix : public PermutationBase<PermutationMatrix<SizeAtCompileTime, MaxSizeAtCompileTime, IndexType> >
313
+ {
314
+ typedef PermutationBase<PermutationMatrix> Base;
315
+ typedef internal::traits<PermutationMatrix> Traits;
316
+ public:
317
+
318
+ #ifndef EIGEN_PARSED_BY_DOXYGEN
319
+ typedef typename Traits::IndicesType IndicesType;
320
+ #endif
321
+
322
+ inline PermutationMatrix()
323
+ {}
324
+
325
+ /** Constructs an uninitialized permutation matrix of given size.
326
+ */
327
+ inline PermutationMatrix(int size) : m_indices(size)
328
+ {}
329
+
330
+ /** Copy constructor. */
331
+ template<typename OtherDerived>
332
+ inline PermutationMatrix(const PermutationBase<OtherDerived>& other)
333
+ : m_indices(other.indices()) {}
334
+
335
+ #ifndef EIGEN_PARSED_BY_DOXYGEN
336
+ /** Standard copy constructor. Defined only to prevent a default copy constructor
337
+ * from hiding the other templated constructor */
338
+ inline PermutationMatrix(const PermutationMatrix& other) : m_indices(other.indices()) {}
339
+ #endif
340
+
341
+ /** Generic constructor from expression of the indices. The indices
342
+ * array has the meaning that the permutations sends each integer i to indices[i].
343
+ *
344
+ * \warning It is your responsibility to check that the indices array that you passes actually
345
+ * describes a permutation, i.e., each value between 0 and n-1 occurs exactly once, where n is the
346
+ * array's size.
347
+ */
348
+ template<typename Other>
349
+ explicit inline PermutationMatrix(const MatrixBase<Other>& a_indices) : m_indices(a_indices)
350
+ {}
351
+
352
+ /** Convert the Transpositions \a tr to a permutation matrix */
353
+ template<typename Other>
354
+ explicit PermutationMatrix(const TranspositionsBase<Other>& tr)
355
+ : m_indices(tr.size())
356
+ {
357
+ *this = tr;
358
+ }
359
+
360
+ /** Copies the other permutation into *this */
361
+ template<typename Other>
362
+ PermutationMatrix& operator=(const PermutationBase<Other>& other)
363
+ {
364
+ m_indices = other.indices();
365
+ return *this;
366
+ }
367
+
368
+ /** Assignment from the Transpositions \a tr */
369
+ template<typename Other>
370
+ PermutationMatrix& operator=(const TranspositionsBase<Other>& tr)
371
+ {
372
+ return Base::operator=(tr.derived());
373
+ }
374
+
375
+ #ifndef EIGEN_PARSED_BY_DOXYGEN
376
+ /** This is a special case of the templated operator=. Its purpose is to
377
+ * prevent a default operator= from hiding the templated operator=.
378
+ */
379
+ PermutationMatrix& operator=(const PermutationMatrix& other)
380
+ {
381
+ m_indices = other.m_indices;
382
+ return *this;
383
+ }
384
+ #endif
385
+
386
+ /** const version of indices(). */
387
+ const IndicesType& indices() const { return m_indices; }
388
+ /** \returns a reference to the stored array representing the permutation. */
389
+ IndicesType& indices() { return m_indices; }
390
+
391
+
392
+ /**** multiplication helpers to hopefully get RVO ****/
393
+
394
+ #ifndef EIGEN_PARSED_BY_DOXYGEN
395
+ template<typename Other>
396
+ PermutationMatrix(const Transpose<PermutationBase<Other> >& other)
397
+ : m_indices(other.nestedPermutation().size())
398
+ {
399
+ for (int i=0; i<m_indices.size();++i) m_indices.coeffRef(other.nestedPermutation().indices().coeff(i)) = i;
400
+ }
401
+ template<typename Lhs,typename Rhs>
402
+ PermutationMatrix(internal::PermPermProduct_t, const Lhs& lhs, const Rhs& rhs)
403
+ : m_indices(lhs.indices().size())
404
+ {
405
+ Base::assignProduct(lhs,rhs);
406
+ }
407
+ #endif
408
+
409
+ protected:
410
+
411
+ IndicesType m_indices;
412
+ };
413
+
414
+
415
+ namespace internal {
416
+ template<int SizeAtCompileTime, int MaxSizeAtCompileTime, typename IndexType, int _PacketAccess>
417
+ struct traits<Map<PermutationMatrix<SizeAtCompileTime, MaxSizeAtCompileTime, IndexType>,_PacketAccess> >
418
+ : traits<Matrix<IndexType,SizeAtCompileTime,SizeAtCompileTime,0,MaxSizeAtCompileTime,MaxSizeAtCompileTime> >
419
+ {
420
+ typedef IndexType Index;
421
+ typedef Map<const Matrix<IndexType, SizeAtCompileTime, 1, 0, MaxSizeAtCompileTime, 1>, _PacketAccess> IndicesType;
422
+ };
423
+ }
424
+
425
+ template<int SizeAtCompileTime, int MaxSizeAtCompileTime, typename IndexType, int _PacketAccess>
426
+ class Map<PermutationMatrix<SizeAtCompileTime, MaxSizeAtCompileTime, IndexType>,_PacketAccess>
427
+ : public PermutationBase<Map<PermutationMatrix<SizeAtCompileTime, MaxSizeAtCompileTime, IndexType>,_PacketAccess> >
428
+ {
429
+ typedef PermutationBase<Map> Base;
430
+ typedef internal::traits<Map> Traits;
431
+ public:
432
+
433
+ #ifndef EIGEN_PARSED_BY_DOXYGEN
434
+ typedef typename Traits::IndicesType IndicesType;
435
+ typedef typename IndicesType::Scalar Index;
436
+ #endif
437
+
438
+ inline Map(const Index* indicesPtr)
439
+ : m_indices(indicesPtr)
440
+ {}
441
+
442
+ inline Map(const Index* indicesPtr, Index size)
443
+ : m_indices(indicesPtr,size)
444
+ {}
445
+
446
+ /** Copies the other permutation into *this */
447
+ template<typename Other>
448
+ Map& operator=(const PermutationBase<Other>& other)
449
+ { return Base::operator=(other.derived()); }
450
+
451
+ /** Assignment from the Transpositions \a tr */
452
+ template<typename Other>
453
+ Map& operator=(const TranspositionsBase<Other>& tr)
454
+ { return Base::operator=(tr.derived()); }
455
+
456
+ #ifndef EIGEN_PARSED_BY_DOXYGEN
457
+ /** This is a special case of the templated operator=. Its purpose is to
458
+ * prevent a default operator= from hiding the templated operator=.
459
+ */
460
+ Map& operator=(const Map& other)
461
+ {
462
+ m_indices = other.m_indices;
463
+ return *this;
464
+ }
465
+ #endif
466
+
467
+ /** const version of indices(). */
468
+ const IndicesType& indices() const { return m_indices; }
469
+ /** \returns a reference to the stored array representing the permutation. */
470
+ IndicesType& indices() { return m_indices; }
471
+
472
+ protected:
473
+
474
+ IndicesType m_indices;
475
+ };
476
+
477
+ /** \class PermutationWrapper
478
+ * \ingroup Core_Module
479
+ *
480
+ * \brief Class to view a vector of integers as a permutation matrix
481
+ *
482
+ * \param _IndicesType the type of the vector of integer (can be any compatible expression)
483
+ *
484
+ * This class allows to view any vector expression of integers as a permutation matrix.
485
+ *
486
+ * \sa class PermutationBase, class PermutationMatrix
487
+ */
488
+
489
+ struct PermutationStorage {};
490
+
491
+ template<typename _IndicesType> class TranspositionsWrapper;
492
+ namespace internal {
493
+ template<typename _IndicesType>
494
+ struct traits<PermutationWrapper<_IndicesType> >
495
+ {
496
+ typedef PermutationStorage StorageKind;
497
+ typedef typename _IndicesType::Scalar Scalar;
498
+ typedef typename _IndicesType::Scalar Index;
499
+ typedef _IndicesType IndicesType;
500
+ enum {
501
+ RowsAtCompileTime = _IndicesType::SizeAtCompileTime,
502
+ ColsAtCompileTime = _IndicesType::SizeAtCompileTime,
503
+ MaxRowsAtCompileTime = IndicesType::MaxRowsAtCompileTime,
504
+ MaxColsAtCompileTime = IndicesType::MaxColsAtCompileTime,
505
+ Flags = 0,
506
+ CoeffReadCost = _IndicesType::CoeffReadCost
507
+ };
508
+ };
509
+ }
510
+
511
+ template<typename _IndicesType>
512
+ class PermutationWrapper : public PermutationBase<PermutationWrapper<_IndicesType> >
513
+ {
514
+ typedef PermutationBase<PermutationWrapper> Base;
515
+ typedef internal::traits<PermutationWrapper> Traits;
516
+ public:
517
+
518
+ #ifndef EIGEN_PARSED_BY_DOXYGEN
519
+ typedef typename Traits::IndicesType IndicesType;
520
+ #endif
521
+
522
+ inline PermutationWrapper(const IndicesType& a_indices)
523
+ : m_indices(a_indices)
524
+ {}
525
+
526
+ /** const version of indices(). */
527
+ const typename internal::remove_all<typename IndicesType::Nested>::type&
528
+ indices() const { return m_indices; }
529
+
530
+ protected:
531
+
532
+ typename IndicesType::Nested m_indices;
533
+ };
534
+
535
+ /** \returns the matrix with the permutation applied to the columns.
536
+ */
537
+ template<typename Derived, typename PermutationDerived>
538
+ inline const internal::permut_matrix_product_retval<PermutationDerived, Derived, OnTheRight>
539
+ operator*(const MatrixBase<Derived>& matrix,
540
+ const PermutationBase<PermutationDerived> &permutation)
541
+ {
542
+ return internal::permut_matrix_product_retval
543
+ <PermutationDerived, Derived, OnTheRight>
544
+ (permutation.derived(), matrix.derived());
545
+ }
546
+
547
+ /** \returns the matrix with the permutation applied to the rows.
548
+ */
549
+ template<typename Derived, typename PermutationDerived>
550
+ inline const internal::permut_matrix_product_retval
551
+ <PermutationDerived, Derived, OnTheLeft>
552
+ operator*(const PermutationBase<PermutationDerived> &permutation,
553
+ const MatrixBase<Derived>& matrix)
554
+ {
555
+ return internal::permut_matrix_product_retval
556
+ <PermutationDerived, Derived, OnTheLeft>
557
+ (permutation.derived(), matrix.derived());
558
+ }
559
+
560
+ namespace internal {
561
+
562
+ template<typename PermutationType, typename MatrixType, int Side, bool Transposed>
563
+ struct traits<permut_matrix_product_retval<PermutationType, MatrixType, Side, Transposed> >
564
+ {
565
+ typedef typename MatrixType::PlainObject ReturnType;
566
+ };
567
+
568
+ template<typename PermutationType, typename MatrixType, int Side, bool Transposed>
569
+ struct permut_matrix_product_retval
570
+ : public ReturnByValue<permut_matrix_product_retval<PermutationType, MatrixType, Side, Transposed> >
571
+ {
572
+ typedef typename remove_all<typename MatrixType::Nested>::type MatrixTypeNestedCleaned;
573
+ typedef typename MatrixType::Index Index;
574
+
575
+ permut_matrix_product_retval(const PermutationType& perm, const MatrixType& matrix)
576
+ : m_permutation(perm), m_matrix(matrix)
577
+ {}
578
+
579
+ inline Index rows() const { return m_matrix.rows(); }
580
+ inline Index cols() const { return m_matrix.cols(); }
581
+
582
+ template<typename Dest> inline void evalTo(Dest& dst) const
583
+ {
584
+ const Index n = Side==OnTheLeft ? rows() : cols();
585
+ // FIXME we need an is_same for expression that is not sensitive to constness. For instance
586
+ // is_same_xpr<Block<const Matrix>, Block<Matrix> >::value should be true.
587
+ if( is_same<MatrixTypeNestedCleaned,Dest>::value
588
+ && blas_traits<MatrixTypeNestedCleaned>::HasUsableDirectAccess
589
+ && blas_traits<Dest>::HasUsableDirectAccess
590
+ && extract_data(dst) == extract_data(m_matrix))
591
+ {
592
+ // apply the permutation inplace
593
+ Matrix<bool,PermutationType::RowsAtCompileTime,1,0,PermutationType::MaxRowsAtCompileTime> mask(m_permutation.size());
594
+ mask.fill(false);
595
+ Index r = 0;
596
+ while(r < m_permutation.size())
597
+ {
598
+ // search for the next seed
599
+ while(r<m_permutation.size() && mask[r]) r++;
600
+ if(r>=m_permutation.size())
601
+ break;
602
+ // we got one, let's follow it until we are back to the seed
603
+ Index k0 = r++;
604
+ Index kPrev = k0;
605
+ mask.coeffRef(k0) = true;
606
+ for(Index k=m_permutation.indices().coeff(k0); k!=k0; k=m_permutation.indices().coeff(k))
607
+ {
608
+ Block<Dest, Side==OnTheLeft ? 1 : Dest::RowsAtCompileTime, Side==OnTheRight ? 1 : Dest::ColsAtCompileTime>(dst, k)
609
+ .swap(Block<Dest, Side==OnTheLeft ? 1 : Dest::RowsAtCompileTime, Side==OnTheRight ? 1 : Dest::ColsAtCompileTime>
610
+ (dst,((Side==OnTheLeft) ^ Transposed) ? k0 : kPrev));
611
+
612
+ mask.coeffRef(k) = true;
613
+ kPrev = k;
614
+ }
615
+ }
616
+ }
617
+ else
618
+ {
619
+ for(int i = 0; i < n; ++i)
620
+ {
621
+ Block<Dest, Side==OnTheLeft ? 1 : Dest::RowsAtCompileTime, Side==OnTheRight ? 1 : Dest::ColsAtCompileTime>
622
+ (dst, ((Side==OnTheLeft) ^ Transposed) ? m_permutation.indices().coeff(i) : i)
623
+
624
+ =
625
+
626
+ Block<const MatrixTypeNestedCleaned,Side==OnTheLeft ? 1 : MatrixType::RowsAtCompileTime,Side==OnTheRight ? 1 : MatrixType::ColsAtCompileTime>
627
+ (m_matrix, ((Side==OnTheRight) ^ Transposed) ? m_permutation.indices().coeff(i) : i);
628
+ }
629
+ }
630
+ }
631
+
632
+ protected:
633
+ const PermutationType& m_permutation;
634
+ typename MatrixType::Nested m_matrix;
635
+ };
636
+
637
+ /* Template partial specialization for transposed/inverse permutations */
638
+
639
+ template<typename Derived>
640
+ struct traits<Transpose<PermutationBase<Derived> > >
641
+ : traits<Derived>
642
+ {};
643
+
644
+ } // end namespace internal
645
+
646
+ template<typename Derived>
647
+ class Transpose<PermutationBase<Derived> >
648
+ : public EigenBase<Transpose<PermutationBase<Derived> > >
649
+ {
650
+ typedef Derived PermutationType;
651
+ typedef typename PermutationType::IndicesType IndicesType;
652
+ typedef typename PermutationType::PlainPermutationType PlainPermutationType;
653
+ public:
654
+
655
+ #ifndef EIGEN_PARSED_BY_DOXYGEN
656
+ typedef internal::traits<PermutationType> Traits;
657
+ typedef typename Derived::DenseMatrixType DenseMatrixType;
658
+ enum {
659
+ Flags = Traits::Flags,
660
+ CoeffReadCost = Traits::CoeffReadCost,
661
+ RowsAtCompileTime = Traits::RowsAtCompileTime,
662
+ ColsAtCompileTime = Traits::ColsAtCompileTime,
663
+ MaxRowsAtCompileTime = Traits::MaxRowsAtCompileTime,
664
+ MaxColsAtCompileTime = Traits::MaxColsAtCompileTime
665
+ };
666
+ typedef typename Traits::Scalar Scalar;
667
+ #endif
668
+
669
+ Transpose(const PermutationType& p) : m_permutation(p) {}
670
+
671
+ inline int rows() const { return m_permutation.rows(); }
672
+ inline int cols() const { return m_permutation.cols(); }
673
+
674
+ #ifndef EIGEN_PARSED_BY_DOXYGEN
675
+ template<typename DenseDerived>
676
+ void evalTo(MatrixBase<DenseDerived>& other) const
677
+ {
678
+ other.setZero();
679
+ for (int i=0; i<rows();++i)
680
+ other.coeffRef(i, m_permutation.indices().coeff(i)) = typename DenseDerived::Scalar(1);
681
+ }
682
+ #endif
683
+
684
+ /** \return the equivalent permutation matrix */
685
+ PlainPermutationType eval() const { return *this; }
686
+
687
+ DenseMatrixType toDenseMatrix() const { return *this; }
688
+
689
+ /** \returns the matrix with the inverse permutation applied to the columns.
690
+ */
691
+ template<typename OtherDerived> friend
692
+ inline const internal::permut_matrix_product_retval<PermutationType, OtherDerived, OnTheRight, true>
693
+ operator*(const MatrixBase<OtherDerived>& matrix, const Transpose& trPerm)
694
+ {
695
+ return internal::permut_matrix_product_retval<PermutationType, OtherDerived, OnTheRight, true>(trPerm.m_permutation, matrix.derived());
696
+ }
697
+
698
+ /** \returns the matrix with the inverse permutation applied to the rows.
699
+ */
700
+ template<typename OtherDerived>
701
+ inline const internal::permut_matrix_product_retval<PermutationType, OtherDerived, OnTheLeft, true>
702
+ operator*(const MatrixBase<OtherDerived>& matrix) const
703
+ {
704
+ return internal::permut_matrix_product_retval<PermutationType, OtherDerived, OnTheLeft, true>(m_permutation, matrix.derived());
705
+ }
706
+
707
+ const PermutationType& nestedPermutation() const { return m_permutation; }
708
+
709
+ protected:
710
+ const PermutationType& m_permutation;
711
+ };
712
+
713
+ template<typename Derived>
714
+ const PermutationWrapper<const Derived> MatrixBase<Derived>::asPermutation() const
715
+ {
716
+ return derived();
717
+ }
718
+
719
+ } // end namespace Eigen
720
+
721
+ #endif // EIGEN_PERMUTATIONMATRIX_H