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,247 @@
1
+ /*
2
+ Copyright (c) 2011, Intel Corporation. All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without modification,
5
+ are permitted provided that the following conditions are met:
6
+
7
+ * Redistributions of source code must retain the above copyright notice, this
8
+ list of conditions and the following disclaimer.
9
+ * Redistributions in binary form must reproduce the above copyright notice,
10
+ this list of conditions and the following disclaimer in the documentation
11
+ and/or other materials provided with the distribution.
12
+ * Neither the name of Intel Corporation nor the names of its contributors may
13
+ be used to endorse or promote products derived from this software without
14
+ specific prior written permission.
15
+
16
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
20
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
23
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
+
27
+ ********************************************************************************
28
+ * Content : Eigen bindings to Intel(R) MKL
29
+ * Triangular matrix-vector product functionality based on ?TRMV.
30
+ ********************************************************************************
31
+ */
32
+
33
+ #ifndef EIGEN_TRIANGULAR_MATRIX_VECTOR_MKL_H
34
+ #define EIGEN_TRIANGULAR_MATRIX_VECTOR_MKL_H
35
+
36
+ namespace Eigen {
37
+
38
+ namespace internal {
39
+
40
+ /**********************************************************************
41
+ * This file implements triangular matrix-vector multiplication using BLAS
42
+ **********************************************************************/
43
+
44
+ // trmv/hemv specialization
45
+
46
+ template<typename Index, int Mode, typename LhsScalar, bool ConjLhs, typename RhsScalar, bool ConjRhs, int StorageOrder>
47
+ struct triangular_matrix_vector_product_trmv :
48
+ triangular_matrix_vector_product<Index,Mode,LhsScalar,ConjLhs,RhsScalar,ConjRhs,StorageOrder,BuiltIn> {};
49
+
50
+ #define EIGEN_MKL_TRMV_SPECIALIZE(Scalar) \
51
+ template<typename Index, int Mode, bool ConjLhs, bool ConjRhs> \
52
+ struct triangular_matrix_vector_product<Index,Mode,Scalar,ConjLhs,Scalar,ConjRhs,ColMajor,Specialized> { \
53
+ static void run(Index _rows, Index _cols, const Scalar* _lhs, Index lhsStride, \
54
+ const Scalar* _rhs, Index rhsIncr, Scalar* _res, Index resIncr, Scalar alpha) { \
55
+ triangular_matrix_vector_product_trmv<Index,Mode,Scalar,ConjLhs,Scalar,ConjRhs,ColMajor>::run( \
56
+ _rows, _cols, _lhs, lhsStride, _rhs, rhsIncr, _res, resIncr, alpha); \
57
+ } \
58
+ }; \
59
+ template<typename Index, int Mode, bool ConjLhs, bool ConjRhs> \
60
+ struct triangular_matrix_vector_product<Index,Mode,Scalar,ConjLhs,Scalar,ConjRhs,RowMajor,Specialized> { \
61
+ static void run(Index _rows, Index _cols, const Scalar* _lhs, Index lhsStride, \
62
+ const Scalar* _rhs, Index rhsIncr, Scalar* _res, Index resIncr, Scalar alpha) { \
63
+ triangular_matrix_vector_product_trmv<Index,Mode,Scalar,ConjLhs,Scalar,ConjRhs,RowMajor>::run( \
64
+ _rows, _cols, _lhs, lhsStride, _rhs, rhsIncr, _res, resIncr, alpha); \
65
+ } \
66
+ };
67
+
68
+ EIGEN_MKL_TRMV_SPECIALIZE(double)
69
+ EIGEN_MKL_TRMV_SPECIALIZE(float)
70
+ EIGEN_MKL_TRMV_SPECIALIZE(dcomplex)
71
+ EIGEN_MKL_TRMV_SPECIALIZE(scomplex)
72
+
73
+ // implements col-major: res += alpha * op(triangular) * vector
74
+ #define EIGEN_MKL_TRMV_CM(EIGTYPE, MKLTYPE, EIGPREFIX, MKLPREFIX) \
75
+ template<typename Index, int Mode, bool ConjLhs, bool ConjRhs> \
76
+ struct triangular_matrix_vector_product_trmv<Index,Mode,EIGTYPE,ConjLhs,EIGTYPE,ConjRhs,ColMajor> { \
77
+ enum { \
78
+ IsLower = (Mode&Lower) == Lower, \
79
+ SetDiag = (Mode&(ZeroDiag|UnitDiag)) ? 0 : 1, \
80
+ IsUnitDiag = (Mode&UnitDiag) ? 1 : 0, \
81
+ IsZeroDiag = (Mode&ZeroDiag) ? 1 : 0, \
82
+ LowUp = IsLower ? Lower : Upper \
83
+ }; \
84
+ static void run(Index _rows, Index _cols, const EIGTYPE* _lhs, Index lhsStride, \
85
+ const EIGTYPE* _rhs, Index rhsIncr, EIGTYPE* _res, Index resIncr, EIGTYPE alpha) \
86
+ { \
87
+ if (ConjLhs || IsZeroDiag) { \
88
+ triangular_matrix_vector_product<Index,Mode,EIGTYPE,ConjLhs,EIGTYPE,ConjRhs,ColMajor,BuiltIn>::run( \
89
+ _rows, _cols, _lhs, lhsStride, _rhs, rhsIncr, _res, resIncr, alpha); \
90
+ return; \
91
+ }\
92
+ Index size = (std::min)(_rows,_cols); \
93
+ Index rows = IsLower ? _rows : size; \
94
+ Index cols = IsLower ? size : _cols; \
95
+ \
96
+ typedef VectorX##EIGPREFIX VectorRhs; \
97
+ EIGTYPE *x, *y;\
98
+ \
99
+ /* Set x*/ \
100
+ Map<const VectorRhs, 0, InnerStride<> > rhs(_rhs,cols,InnerStride<>(rhsIncr)); \
101
+ VectorRhs x_tmp; \
102
+ if (ConjRhs) x_tmp = rhs.conjugate(); else x_tmp = rhs; \
103
+ x = x_tmp.data(); \
104
+ \
105
+ /* Square part handling */\
106
+ \
107
+ char trans, uplo, diag; \
108
+ MKL_INT m, n, lda, incx, incy; \
109
+ EIGTYPE const *a; \
110
+ MKLTYPE alpha_, beta_; \
111
+ assign_scalar_eig2mkl<MKLTYPE, EIGTYPE>(alpha_, alpha); \
112
+ assign_scalar_eig2mkl<MKLTYPE, EIGTYPE>(beta_, EIGTYPE(1)); \
113
+ \
114
+ /* Set m, n */ \
115
+ n = (MKL_INT)size; \
116
+ lda = lhsStride; \
117
+ incx = 1; \
118
+ incy = resIncr; \
119
+ \
120
+ /* Set uplo, trans and diag*/ \
121
+ trans = 'N'; \
122
+ uplo = IsLower ? 'L' : 'U'; \
123
+ diag = IsUnitDiag ? 'U' : 'N'; \
124
+ \
125
+ /* call ?TRMV*/ \
126
+ MKLPREFIX##trmv(&uplo, &trans, &diag, &n, (const MKLTYPE*)_lhs, &lda, (MKLTYPE*)x, &incx); \
127
+ \
128
+ /* Add op(a_tr)rhs into res*/ \
129
+ MKLPREFIX##axpy(&n, &alpha_,(const MKLTYPE*)x, &incx, (MKLTYPE*)_res, &incy); \
130
+ /* Non-square case - doesn't fit to MKL ?TRMV. Fall to default triangular product*/ \
131
+ if (size<(std::max)(rows,cols)) { \
132
+ typedef Matrix<EIGTYPE, Dynamic, Dynamic> MatrixLhs; \
133
+ if (ConjRhs) x_tmp = rhs.conjugate(); else x_tmp = rhs; \
134
+ x = x_tmp.data(); \
135
+ if (size<rows) { \
136
+ y = _res + size*resIncr; \
137
+ a = _lhs + size; \
138
+ m = rows-size; \
139
+ n = size; \
140
+ } \
141
+ else { \
142
+ x += size; \
143
+ y = _res; \
144
+ a = _lhs + size*lda; \
145
+ m = size; \
146
+ n = cols-size; \
147
+ } \
148
+ MKLPREFIX##gemv(&trans, &m, &n, &alpha_, (const MKLTYPE*)a, &lda, (const MKLTYPE*)x, &incx, &beta_, (MKLTYPE*)y, &incy); \
149
+ } \
150
+ } \
151
+ };
152
+
153
+ EIGEN_MKL_TRMV_CM(double, double, d, d)
154
+ EIGEN_MKL_TRMV_CM(dcomplex, MKL_Complex16, cd, z)
155
+ EIGEN_MKL_TRMV_CM(float, float, f, s)
156
+ EIGEN_MKL_TRMV_CM(scomplex, MKL_Complex8, cf, c)
157
+
158
+ // implements row-major: res += alpha * op(triangular) * vector
159
+ #define EIGEN_MKL_TRMV_RM(EIGTYPE, MKLTYPE, EIGPREFIX, MKLPREFIX) \
160
+ template<typename Index, int Mode, bool ConjLhs, bool ConjRhs> \
161
+ struct triangular_matrix_vector_product_trmv<Index,Mode,EIGTYPE,ConjLhs,EIGTYPE,ConjRhs,RowMajor> { \
162
+ enum { \
163
+ IsLower = (Mode&Lower) == Lower, \
164
+ SetDiag = (Mode&(ZeroDiag|UnitDiag)) ? 0 : 1, \
165
+ IsUnitDiag = (Mode&UnitDiag) ? 1 : 0, \
166
+ IsZeroDiag = (Mode&ZeroDiag) ? 1 : 0, \
167
+ LowUp = IsLower ? Lower : Upper \
168
+ }; \
169
+ static void run(Index _rows, Index _cols, const EIGTYPE* _lhs, Index lhsStride, \
170
+ const EIGTYPE* _rhs, Index rhsIncr, EIGTYPE* _res, Index resIncr, EIGTYPE alpha) \
171
+ { \
172
+ if (IsZeroDiag) { \
173
+ triangular_matrix_vector_product<Index,Mode,EIGTYPE,ConjLhs,EIGTYPE,ConjRhs,RowMajor,BuiltIn>::run( \
174
+ _rows, _cols, _lhs, lhsStride, _rhs, rhsIncr, _res, resIncr, alpha); \
175
+ return; \
176
+ }\
177
+ Index size = (std::min)(_rows,_cols); \
178
+ Index rows = IsLower ? _rows : size; \
179
+ Index cols = IsLower ? size : _cols; \
180
+ \
181
+ typedef VectorX##EIGPREFIX VectorRhs; \
182
+ EIGTYPE *x, *y;\
183
+ \
184
+ /* Set x*/ \
185
+ Map<const VectorRhs, 0, InnerStride<> > rhs(_rhs,cols,InnerStride<>(rhsIncr)); \
186
+ VectorRhs x_tmp; \
187
+ if (ConjRhs) x_tmp = rhs.conjugate(); else x_tmp = rhs; \
188
+ x = x_tmp.data(); \
189
+ \
190
+ /* Square part handling */\
191
+ \
192
+ char trans, uplo, diag; \
193
+ MKL_INT m, n, lda, incx, incy; \
194
+ EIGTYPE const *a; \
195
+ MKLTYPE alpha_, beta_; \
196
+ assign_scalar_eig2mkl<MKLTYPE, EIGTYPE>(alpha_, alpha); \
197
+ assign_scalar_eig2mkl<MKLTYPE, EIGTYPE>(beta_, EIGTYPE(1)); \
198
+ \
199
+ /* Set m, n */ \
200
+ n = (MKL_INT)size; \
201
+ lda = lhsStride; \
202
+ incx = 1; \
203
+ incy = resIncr; \
204
+ \
205
+ /* Set uplo, trans and diag*/ \
206
+ trans = ConjLhs ? 'C' : 'T'; \
207
+ uplo = IsLower ? 'U' : 'L'; \
208
+ diag = IsUnitDiag ? 'U' : 'N'; \
209
+ \
210
+ /* call ?TRMV*/ \
211
+ MKLPREFIX##trmv(&uplo, &trans, &diag, &n, (const MKLTYPE*)_lhs, &lda, (MKLTYPE*)x, &incx); \
212
+ \
213
+ /* Add op(a_tr)rhs into res*/ \
214
+ MKLPREFIX##axpy(&n, &alpha_,(const MKLTYPE*)x, &incx, (MKLTYPE*)_res, &incy); \
215
+ /* Non-square case - doesn't fit to MKL ?TRMV. Fall to default triangular product*/ \
216
+ if (size<(std::max)(rows,cols)) { \
217
+ typedef Matrix<EIGTYPE, Dynamic, Dynamic> MatrixLhs; \
218
+ if (ConjRhs) x_tmp = rhs.conjugate(); else x_tmp = rhs; \
219
+ x = x_tmp.data(); \
220
+ if (size<rows) { \
221
+ y = _res + size*resIncr; \
222
+ a = _lhs + size*lda; \
223
+ m = rows-size; \
224
+ n = size; \
225
+ } \
226
+ else { \
227
+ x += size; \
228
+ y = _res; \
229
+ a = _lhs + size; \
230
+ m = size; \
231
+ n = cols-size; \
232
+ } \
233
+ MKLPREFIX##gemv(&trans, &n, &m, &alpha_, (const MKLTYPE*)a, &lda, (const MKLTYPE*)x, &incx, &beta_, (MKLTYPE*)y, &incy); \
234
+ } \
235
+ } \
236
+ };
237
+
238
+ EIGEN_MKL_TRMV_RM(double, double, d, d)
239
+ EIGEN_MKL_TRMV_RM(dcomplex, MKL_Complex16, cd, z)
240
+ EIGEN_MKL_TRMV_RM(float, float, f, s)
241
+ EIGEN_MKL_TRMV_RM(scomplex, MKL_Complex8, cf, c)
242
+
243
+ } // end namespase internal
244
+
245
+ } // end namespace Eigen
246
+
247
+ #endif // EIGEN_TRIANGULAR_MATRIX_VECTOR_MKL_H
@@ -0,0 +1,332 @@
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_TRIANGULAR_SOLVER_MATRIX_H
11
+ #define EIGEN_TRIANGULAR_SOLVER_MATRIX_H
12
+
13
+ namespace Eigen {
14
+
15
+ namespace internal {
16
+
17
+ // if the rhs is row major, let's transpose the product
18
+ template <typename Scalar, typename Index, int Side, int Mode, bool Conjugate, int TriStorageOrder>
19
+ struct triangular_solve_matrix<Scalar,Index,Side,Mode,Conjugate,TriStorageOrder,RowMajor>
20
+ {
21
+ static void run(
22
+ Index size, Index cols,
23
+ const Scalar* tri, Index triStride,
24
+ Scalar* _other, Index otherStride,
25
+ level3_blocking<Scalar,Scalar>& blocking)
26
+ {
27
+ triangular_solve_matrix<
28
+ Scalar, Index, Side==OnTheLeft?OnTheRight:OnTheLeft,
29
+ (Mode&UnitDiag) | ((Mode&Upper) ? Lower : Upper),
30
+ NumTraits<Scalar>::IsComplex && Conjugate,
31
+ TriStorageOrder==RowMajor ? ColMajor : RowMajor, ColMajor>
32
+ ::run(size, cols, tri, triStride, _other, otherStride, blocking);
33
+ }
34
+ };
35
+
36
+ /* Optimized triangular solver with multiple right hand side and the triangular matrix on the left
37
+ */
38
+ template <typename Scalar, typename Index, int Mode, bool Conjugate, int TriStorageOrder>
39
+ struct triangular_solve_matrix<Scalar,Index,OnTheLeft,Mode,Conjugate,TriStorageOrder,ColMajor>
40
+ {
41
+ static EIGEN_DONT_INLINE void run(
42
+ Index size, Index otherSize,
43
+ const Scalar* _tri, Index triStride,
44
+ Scalar* _other, Index otherStride,
45
+ level3_blocking<Scalar,Scalar>& blocking);
46
+ };
47
+ template <typename Scalar, typename Index, int Mode, bool Conjugate, int TriStorageOrder>
48
+ EIGEN_DONT_INLINE void triangular_solve_matrix<Scalar,Index,OnTheLeft,Mode,Conjugate,TriStorageOrder,ColMajor>::run(
49
+ Index size, Index otherSize,
50
+ const Scalar* _tri, Index triStride,
51
+ Scalar* _other, Index otherStride,
52
+ level3_blocking<Scalar,Scalar>& blocking)
53
+ {
54
+ Index cols = otherSize;
55
+ const_blas_data_mapper<Scalar, Index, TriStorageOrder> tri(_tri,triStride);
56
+ blas_data_mapper<Scalar, Index, ColMajor> other(_other,otherStride);
57
+
58
+ typedef gebp_traits<Scalar,Scalar> Traits;
59
+ enum {
60
+ SmallPanelWidth = EIGEN_PLAIN_ENUM_MAX(Traits::mr,Traits::nr),
61
+ IsLower = (Mode&Lower) == Lower
62
+ };
63
+
64
+ Index kc = blocking.kc(); // cache block size along the K direction
65
+ Index mc = (std::min)(size,blocking.mc()); // cache block size along the M direction
66
+
67
+ std::size_t sizeA = kc*mc;
68
+ std::size_t sizeB = kc*cols;
69
+ std::size_t sizeW = kc*Traits::WorkSpaceFactor;
70
+
71
+ ei_declare_aligned_stack_constructed_variable(Scalar, blockA, sizeA, blocking.blockA());
72
+ ei_declare_aligned_stack_constructed_variable(Scalar, blockB, sizeB, blocking.blockB());
73
+ ei_declare_aligned_stack_constructed_variable(Scalar, blockW, sizeW, blocking.blockW());
74
+
75
+ conj_if<Conjugate> conj;
76
+ gebp_kernel<Scalar, Scalar, Index, Traits::mr, Traits::nr, Conjugate, false> gebp_kernel;
77
+ gemm_pack_lhs<Scalar, Index, Traits::mr, Traits::LhsProgress, TriStorageOrder> pack_lhs;
78
+ gemm_pack_rhs<Scalar, Index, Traits::nr, ColMajor, false, true> pack_rhs;
79
+
80
+ // the goal here is to subdivise the Rhs panels such that we keep some cache
81
+ // coherence when accessing the rhs elements
82
+ std::ptrdiff_t l1, l2;
83
+ manage_caching_sizes(GetAction, &l1, &l2);
84
+ Index subcols = cols>0 ? l2/(4 * sizeof(Scalar) * otherStride) : 0;
85
+ subcols = std::max<Index>((subcols/Traits::nr)*Traits::nr, Traits::nr);
86
+
87
+ for(Index k2=IsLower ? 0 : size;
88
+ IsLower ? k2<size : k2>0;
89
+ IsLower ? k2+=kc : k2-=kc)
90
+ {
91
+ const Index actual_kc = (std::min)(IsLower ? size-k2 : k2, kc);
92
+
93
+ // We have selected and packed a big horizontal panel R1 of rhs. Let B be the packed copy of this panel,
94
+ // and R2 the remaining part of rhs. The corresponding vertical panel of lhs is split into
95
+ // A11 (the triangular part) and A21 the remaining rectangular part.
96
+ // Then the high level algorithm is:
97
+ // - B = R1 => general block copy (done during the next step)
98
+ // - R1 = A11^-1 B => tricky part
99
+ // - update B from the new R1 => actually this has to be performed continuously during the above step
100
+ // - R2 -= A21 * B => GEPP
101
+
102
+ // The tricky part: compute R1 = A11^-1 B while updating B from R1
103
+ // The idea is to split A11 into multiple small vertical panels.
104
+ // Each panel can be split into a small triangular part T1k which is processed without optimization,
105
+ // and the remaining small part T2k which is processed using gebp with appropriate block strides
106
+ for(Index j2=0; j2<cols; j2+=subcols)
107
+ {
108
+ Index actual_cols = (std::min)(cols-j2,subcols);
109
+ // for each small vertical panels [T1k^T, T2k^T]^T of lhs
110
+ for (Index k1=0; k1<actual_kc; k1+=SmallPanelWidth)
111
+ {
112
+ Index actualPanelWidth = std::min<Index>(actual_kc-k1, SmallPanelWidth);
113
+ // tr solve
114
+ for (Index k=0; k<actualPanelWidth; ++k)
115
+ {
116
+ // TODO write a small kernel handling this (can be shared with trsv)
117
+ Index i = IsLower ? k2+k1+k : k2-k1-k-1;
118
+ Index s = IsLower ? k2+k1 : i+1;
119
+ Index rs = actualPanelWidth - k - 1; // remaining size
120
+
121
+ Scalar a = (Mode & UnitDiag) ? Scalar(1) : Scalar(1)/conj(tri(i,i));
122
+ for (Index j=j2; j<j2+actual_cols; ++j)
123
+ {
124
+ if (TriStorageOrder==RowMajor)
125
+ {
126
+ Scalar b(0);
127
+ const Scalar* l = &tri(i,s);
128
+ Scalar* r = &other(s,j);
129
+ for (Index i3=0; i3<k; ++i3)
130
+ b += conj(l[i3]) * r[i3];
131
+
132
+ other(i,j) = (other(i,j) - b)*a;
133
+ }
134
+ else
135
+ {
136
+ Index s = IsLower ? i+1 : i-rs;
137
+ Scalar b = (other(i,j) *= a);
138
+ Scalar* r = &other(s,j);
139
+ const Scalar* l = &tri(s,i);
140
+ for (Index i3=0;i3<rs;++i3)
141
+ r[i3] -= b * conj(l[i3]);
142
+ }
143
+ }
144
+ }
145
+
146
+ Index lengthTarget = actual_kc-k1-actualPanelWidth;
147
+ Index startBlock = IsLower ? k2+k1 : k2-k1-actualPanelWidth;
148
+ Index blockBOffset = IsLower ? k1 : lengthTarget;
149
+
150
+ // update the respective rows of B from other
151
+ pack_rhs(blockB+actual_kc*j2, &other(startBlock,j2), otherStride, actualPanelWidth, actual_cols, actual_kc, blockBOffset);
152
+
153
+ // GEBP
154
+ if (lengthTarget>0)
155
+ {
156
+ Index startTarget = IsLower ? k2+k1+actualPanelWidth : k2-actual_kc;
157
+
158
+ pack_lhs(blockA, &tri(startTarget,startBlock), triStride, actualPanelWidth, lengthTarget);
159
+
160
+ gebp_kernel(&other(startTarget,j2), otherStride, blockA, blockB+actual_kc*j2, lengthTarget, actualPanelWidth, actual_cols, Scalar(-1),
161
+ actualPanelWidth, actual_kc, 0, blockBOffset, blockW);
162
+ }
163
+ }
164
+ }
165
+
166
+ // R2 -= A21 * B => GEPP
167
+ {
168
+ Index start = IsLower ? k2+kc : 0;
169
+ Index end = IsLower ? size : k2-kc;
170
+ for(Index i2=start; i2<end; i2+=mc)
171
+ {
172
+ const Index actual_mc = (std::min)(mc,end-i2);
173
+ if (actual_mc>0)
174
+ {
175
+ pack_lhs(blockA, &tri(i2, IsLower ? k2 : k2-kc), triStride, actual_kc, actual_mc);
176
+
177
+ gebp_kernel(_other+i2, otherStride, blockA, blockB, actual_mc, actual_kc, cols, Scalar(-1), -1, -1, 0, 0, blockW);
178
+ }
179
+ }
180
+ }
181
+ }
182
+ }
183
+
184
+ /* Optimized triangular solver with multiple left hand sides and the trinagular matrix on the right
185
+ */
186
+ template <typename Scalar, typename Index, int Mode, bool Conjugate, int TriStorageOrder>
187
+ struct triangular_solve_matrix<Scalar,Index,OnTheRight,Mode,Conjugate,TriStorageOrder,ColMajor>
188
+ {
189
+ static EIGEN_DONT_INLINE void run(
190
+ Index size, Index otherSize,
191
+ const Scalar* _tri, Index triStride,
192
+ Scalar* _other, Index otherStride,
193
+ level3_blocking<Scalar,Scalar>& blocking);
194
+ };
195
+ template <typename Scalar, typename Index, int Mode, bool Conjugate, int TriStorageOrder>
196
+ EIGEN_DONT_INLINE void triangular_solve_matrix<Scalar,Index,OnTheRight,Mode,Conjugate,TriStorageOrder,ColMajor>::run(
197
+ Index size, Index otherSize,
198
+ const Scalar* _tri, Index triStride,
199
+ Scalar* _other, Index otherStride,
200
+ level3_blocking<Scalar,Scalar>& blocking)
201
+ {
202
+ Index rows = otherSize;
203
+ const_blas_data_mapper<Scalar, Index, TriStorageOrder> rhs(_tri,triStride);
204
+ blas_data_mapper<Scalar, Index, ColMajor> lhs(_other,otherStride);
205
+
206
+ typedef gebp_traits<Scalar,Scalar> Traits;
207
+ enum {
208
+ RhsStorageOrder = TriStorageOrder,
209
+ SmallPanelWidth = EIGEN_PLAIN_ENUM_MAX(Traits::mr,Traits::nr),
210
+ IsLower = (Mode&Lower) == Lower
211
+ };
212
+
213
+ Index kc = blocking.kc(); // cache block size along the K direction
214
+ Index mc = (std::min)(rows,blocking.mc()); // cache block size along the M direction
215
+
216
+ std::size_t sizeA = kc*mc;
217
+ std::size_t sizeB = kc*size;
218
+ std::size_t sizeW = kc*Traits::WorkSpaceFactor;
219
+
220
+ ei_declare_aligned_stack_constructed_variable(Scalar, blockA, sizeA, blocking.blockA());
221
+ ei_declare_aligned_stack_constructed_variable(Scalar, blockB, sizeB, blocking.blockB());
222
+ ei_declare_aligned_stack_constructed_variable(Scalar, blockW, sizeW, blocking.blockW());
223
+
224
+ conj_if<Conjugate> conj;
225
+ gebp_kernel<Scalar,Scalar, Index, Traits::mr, Traits::nr, false, Conjugate> gebp_kernel;
226
+ gemm_pack_rhs<Scalar, Index, Traits::nr,RhsStorageOrder> pack_rhs;
227
+ gemm_pack_rhs<Scalar, Index, Traits::nr,RhsStorageOrder,false,true> pack_rhs_panel;
228
+ gemm_pack_lhs<Scalar, Index, Traits::mr, Traits::LhsProgress, ColMajor, false, true> pack_lhs_panel;
229
+
230
+ for(Index k2=IsLower ? size : 0;
231
+ IsLower ? k2>0 : k2<size;
232
+ IsLower ? k2-=kc : k2+=kc)
233
+ {
234
+ const Index actual_kc = (std::min)(IsLower ? k2 : size-k2, kc);
235
+ Index actual_k2 = IsLower ? k2-actual_kc : k2 ;
236
+
237
+ Index startPanel = IsLower ? 0 : k2+actual_kc;
238
+ Index rs = IsLower ? actual_k2 : size - actual_k2 - actual_kc;
239
+ Scalar* geb = blockB+actual_kc*actual_kc;
240
+
241
+ if (rs>0) pack_rhs(geb, &rhs(actual_k2,startPanel), triStride, actual_kc, rs);
242
+
243
+ // triangular packing (we only pack the panels off the diagonal,
244
+ // neglecting the blocks overlapping the diagonal
245
+ {
246
+ for (Index j2=0; j2<actual_kc; j2+=SmallPanelWidth)
247
+ {
248
+ Index actualPanelWidth = std::min<Index>(actual_kc-j2, SmallPanelWidth);
249
+ Index actual_j2 = actual_k2 + j2;
250
+ Index panelOffset = IsLower ? j2+actualPanelWidth : 0;
251
+ Index panelLength = IsLower ? actual_kc-j2-actualPanelWidth : j2;
252
+
253
+ if (panelLength>0)
254
+ pack_rhs_panel(blockB+j2*actual_kc,
255
+ &rhs(actual_k2+panelOffset, actual_j2), triStride,
256
+ panelLength, actualPanelWidth,
257
+ actual_kc, panelOffset);
258
+ }
259
+ }
260
+
261
+ for(Index i2=0; i2<rows; i2+=mc)
262
+ {
263
+ const Index actual_mc = (std::min)(mc,rows-i2);
264
+
265
+ // triangular solver kernel
266
+ {
267
+ // for each small block of the diagonal (=> vertical panels of rhs)
268
+ for (Index j2 = IsLower
269
+ ? (actual_kc - ((actual_kc%SmallPanelWidth) ? Index(actual_kc%SmallPanelWidth)
270
+ : Index(SmallPanelWidth)))
271
+ : 0;
272
+ IsLower ? j2>=0 : j2<actual_kc;
273
+ IsLower ? j2-=SmallPanelWidth : j2+=SmallPanelWidth)
274
+ {
275
+ Index actualPanelWidth = std::min<Index>(actual_kc-j2, SmallPanelWidth);
276
+ Index absolute_j2 = actual_k2 + j2;
277
+ Index panelOffset = IsLower ? j2+actualPanelWidth : 0;
278
+ Index panelLength = IsLower ? actual_kc - j2 - actualPanelWidth : j2;
279
+
280
+ // GEBP
281
+ if(panelLength>0)
282
+ {
283
+ gebp_kernel(&lhs(i2,absolute_j2), otherStride,
284
+ blockA, blockB+j2*actual_kc,
285
+ actual_mc, panelLength, actualPanelWidth,
286
+ Scalar(-1),
287
+ actual_kc, actual_kc, // strides
288
+ panelOffset, panelOffset, // offsets
289
+ blockW); // workspace
290
+ }
291
+
292
+ // unblocked triangular solve
293
+ for (Index k=0; k<actualPanelWidth; ++k)
294
+ {
295
+ Index j = IsLower ? absolute_j2+actualPanelWidth-k-1 : absolute_j2+k;
296
+
297
+ Scalar* r = &lhs(i2,j);
298
+ for (Index k3=0; k3<k; ++k3)
299
+ {
300
+ Scalar b = conj(rhs(IsLower ? j+1+k3 : absolute_j2+k3,j));
301
+ Scalar* a = &lhs(i2,IsLower ? j+1+k3 : absolute_j2+k3);
302
+ for (Index i=0; i<actual_mc; ++i)
303
+ r[i] -= a[i] * b;
304
+ }
305
+ if((Mode & UnitDiag)==0)
306
+ {
307
+ Scalar b = conj(rhs(j,j));
308
+ for (Index i=0; i<actual_mc; ++i)
309
+ r[i] /= b;
310
+ }
311
+ }
312
+
313
+ // pack the just computed part of lhs to A
314
+ pack_lhs_panel(blockA, _other+absolute_j2*otherStride+i2, otherStride,
315
+ actualPanelWidth, actual_mc,
316
+ actual_kc, j2);
317
+ }
318
+ }
319
+
320
+ if (rs>0)
321
+ gebp_kernel(_other+i2+startPanel*otherStride, otherStride, blockA, geb,
322
+ actual_mc, actual_kc, rs, Scalar(-1),
323
+ -1, -1, 0, 0, blockW);
324
+ }
325
+ }
326
+ }
327
+
328
+ } // end namespace internal
329
+
330
+ } // end namespace Eigen
331
+
332
+ #endif // EIGEN_TRIANGULAR_SOLVER_MATRIX_H