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,501 @@
1
+ // This file is part of Eigen, a lightweight C++ template library
2
+ // for linear algebra.
3
+ //
4
+ // Copyright (C) 2008 Konstantinos Margaritis <markos@codex.gr>
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_PACKET_MATH_ALTIVEC_H
11
+ #define EIGEN_PACKET_MATH_ALTIVEC_H
12
+
13
+ namespace Eigen {
14
+
15
+ namespace internal {
16
+
17
+ #ifndef EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD
18
+ #define EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD 4
19
+ #endif
20
+
21
+ #ifndef EIGEN_HAS_FUSE_CJMADD
22
+ #define EIGEN_HAS_FUSE_CJMADD 1
23
+ #endif
24
+
25
+ // NOTE Altivec has 32 registers, but Eigen only accepts a value of 8 or 16
26
+ #ifndef EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS
27
+ #define EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS 16
28
+ #endif
29
+
30
+ typedef __vector float Packet4f;
31
+ typedef __vector int Packet4i;
32
+ typedef __vector unsigned int Packet4ui;
33
+ typedef __vector __bool int Packet4bi;
34
+ typedef __vector short int Packet8i;
35
+ typedef __vector unsigned char Packet16uc;
36
+
37
+ // We don't want to write the same code all the time, but we need to reuse the constants
38
+ // and it doesn't really work to declare them global, so we define macros instead
39
+
40
+ #define _EIGEN_DECLARE_CONST_FAST_Packet4f(NAME,X) \
41
+ Packet4f p4f_##NAME = (Packet4f) vec_splat_s32(X)
42
+
43
+ #define _EIGEN_DECLARE_CONST_FAST_Packet4i(NAME,X) \
44
+ Packet4i p4i_##NAME = vec_splat_s32(X)
45
+
46
+ #define _EIGEN_DECLARE_CONST_Packet4f(NAME,X) \
47
+ Packet4f p4f_##NAME = pset1<Packet4f>(X)
48
+
49
+ #define _EIGEN_DECLARE_CONST_Packet4f_FROM_INT(NAME,X) \
50
+ Packet4f p4f_##NAME = vreinterpretq_f32_u32(pset1<int>(X))
51
+
52
+ #define _EIGEN_DECLARE_CONST_Packet4i(NAME,X) \
53
+ Packet4i p4i_##NAME = pset1<Packet4i>(X)
54
+
55
+ #define DST_CHAN 1
56
+ #define DST_CTRL(size, count, stride) (((size) << 24) | ((count) << 16) | (stride))
57
+
58
+ // Define global static constants:
59
+ static Packet4f p4f_COUNTDOWN = { 3.0, 2.0, 1.0, 0.0 };
60
+ static Packet4i p4i_COUNTDOWN = { 3, 2, 1, 0 };
61
+ static Packet16uc p16uc_REVERSE = {12,13,14,15, 8,9,10,11, 4,5,6,7, 0,1,2,3};
62
+ static Packet16uc p16uc_FORWARD = vec_lvsl(0, (float*)0);
63
+ static Packet16uc p16uc_DUPLICATE = {0,1,2,3, 0,1,2,3, 4,5,6,7, 4,5,6,7};
64
+
65
+ static _EIGEN_DECLARE_CONST_FAST_Packet4f(ZERO, 0);
66
+ static _EIGEN_DECLARE_CONST_FAST_Packet4i(ZERO, 0);
67
+ static _EIGEN_DECLARE_CONST_FAST_Packet4i(ONE,1);
68
+ static _EIGEN_DECLARE_CONST_FAST_Packet4i(MINUS16,-16);
69
+ static _EIGEN_DECLARE_CONST_FAST_Packet4i(MINUS1,-1);
70
+ static Packet4f p4f_ONE = vec_ctf(p4i_ONE, 0);
71
+ static Packet4f p4f_ZERO_ = (Packet4f) vec_sl((Packet4ui)p4i_MINUS1, (Packet4ui)p4i_MINUS1);
72
+
73
+ template<> struct packet_traits<float> : default_packet_traits
74
+ {
75
+ typedef Packet4f type;
76
+ enum {
77
+ Vectorizable = 1,
78
+ AlignedOnScalar = 1,
79
+ size=4,
80
+
81
+ // FIXME check the Has*
82
+ HasSin = 0,
83
+ HasCos = 0,
84
+ HasLog = 0,
85
+ HasExp = 0,
86
+ HasSqrt = 0
87
+ };
88
+ };
89
+ template<> struct packet_traits<int> : default_packet_traits
90
+ {
91
+ typedef Packet4i type;
92
+ enum {
93
+ // FIXME check the Has*
94
+ Vectorizable = 1,
95
+ AlignedOnScalar = 1,
96
+ size=4
97
+ };
98
+ };
99
+
100
+ template<> struct unpacket_traits<Packet4f> { typedef float type; enum {size=4}; };
101
+ template<> struct unpacket_traits<Packet4i> { typedef int type; enum {size=4}; };
102
+ /*
103
+ inline std::ostream & operator <<(std::ostream & s, const Packet4f & v)
104
+ {
105
+ union {
106
+ Packet4f v;
107
+ float n[4];
108
+ } vt;
109
+ vt.v = v;
110
+ s << vt.n[0] << ", " << vt.n[1] << ", " << vt.n[2] << ", " << vt.n[3];
111
+ return s;
112
+ }
113
+
114
+ inline std::ostream & operator <<(std::ostream & s, const Packet4i & v)
115
+ {
116
+ union {
117
+ Packet4i v;
118
+ int n[4];
119
+ } vt;
120
+ vt.v = v;
121
+ s << vt.n[0] << ", " << vt.n[1] << ", " << vt.n[2] << ", " << vt.n[3];
122
+ return s;
123
+ }
124
+
125
+ inline std::ostream & operator <<(std::ostream & s, const Packet4ui & v)
126
+ {
127
+ union {
128
+ Packet4ui v;
129
+ unsigned int n[4];
130
+ } vt;
131
+ vt.v = v;
132
+ s << vt.n[0] << ", " << vt.n[1] << ", " << vt.n[2] << ", " << vt.n[3];
133
+ return s;
134
+ }
135
+
136
+ inline std::ostream & operator <<(std::ostream & s, const Packetbi & v)
137
+ {
138
+ union {
139
+ Packet4bi v;
140
+ unsigned int n[4];
141
+ } vt;
142
+ vt.v = v;
143
+ s << vt.n[0] << ", " << vt.n[1] << ", " << vt.n[2] << ", " << vt.n[3];
144
+ return s;
145
+ }
146
+ */
147
+ template<> EIGEN_STRONG_INLINE Packet4f pset1<Packet4f>(const float& from) {
148
+ // Taken from http://developer.apple.com/hardwaredrivers/ve/alignment.html
149
+ float EIGEN_ALIGN16 af[4];
150
+ af[0] = from;
151
+ Packet4f vc = vec_ld(0, af);
152
+ vc = vec_splat(vc, 0);
153
+ return vc;
154
+ }
155
+
156
+ template<> EIGEN_STRONG_INLINE Packet4i pset1<Packet4i>(const int& from) {
157
+ int EIGEN_ALIGN16 ai[4];
158
+ ai[0] = from;
159
+ Packet4i vc = vec_ld(0, ai);
160
+ vc = vec_splat(vc, 0);
161
+ return vc;
162
+ }
163
+
164
+ template<> EIGEN_STRONG_INLINE Packet4f plset<float>(const float& a) { return vec_add(pset1<Packet4f>(a), p4f_COUNTDOWN); }
165
+ template<> EIGEN_STRONG_INLINE Packet4i plset<int>(const int& a) { return vec_add(pset1<Packet4i>(a), p4i_COUNTDOWN); }
166
+
167
+ template<> EIGEN_STRONG_INLINE Packet4f padd<Packet4f>(const Packet4f& a, const Packet4f& b) { return vec_add(a,b); }
168
+ template<> EIGEN_STRONG_INLINE Packet4i padd<Packet4i>(const Packet4i& a, const Packet4i& b) { return vec_add(a,b); }
169
+
170
+ template<> EIGEN_STRONG_INLINE Packet4f psub<Packet4f>(const Packet4f& a, const Packet4f& b) { return vec_sub(a,b); }
171
+ template<> EIGEN_STRONG_INLINE Packet4i psub<Packet4i>(const Packet4i& a, const Packet4i& b) { return vec_sub(a,b); }
172
+
173
+ template<> EIGEN_STRONG_INLINE Packet4f pnegate(const Packet4f& a) { return psub<Packet4f>(p4f_ZERO, a); }
174
+ template<> EIGEN_STRONG_INLINE Packet4i pnegate(const Packet4i& a) { return psub<Packet4i>(p4i_ZERO, a); }
175
+
176
+ template<> EIGEN_STRONG_INLINE Packet4f pconj(const Packet4f& a) { return a; }
177
+ template<> EIGEN_STRONG_INLINE Packet4i pconj(const Packet4i& a) { return a; }
178
+
179
+ template<> EIGEN_STRONG_INLINE Packet4f pmul<Packet4f>(const Packet4f& a, const Packet4f& b) { return vec_madd(a,b,p4f_ZERO); }
180
+ /* Commented out: it's actually slower than processing it scalar
181
+ *
182
+ template<> EIGEN_STRONG_INLINE Packet4i pmul<Packet4i>(const Packet4i& a, const Packet4i& b)
183
+ {
184
+ // Detailed in: http://freevec.org/content/32bit_signed_integer_multiplication_altivec
185
+ //Set up constants, variables
186
+ Packet4i a1, b1, bswap, low_prod, high_prod, prod, prod_, v1sel;
187
+
188
+ // Get the absolute values
189
+ a1 = vec_abs(a);
190
+ b1 = vec_abs(b);
191
+
192
+ // Get the signs using xor
193
+ Packet4bi sgn = (Packet4bi) vec_cmplt(vec_xor(a, b), p4i_ZERO);
194
+
195
+ // Do the multiplication for the asbolute values.
196
+ bswap = (Packet4i) vec_rl((Packet4ui) b1, (Packet4ui) p4i_MINUS16 );
197
+ low_prod = vec_mulo((Packet8i) a1, (Packet8i)b1);
198
+ high_prod = vec_msum((Packet8i) a1, (Packet8i) bswap, p4i_ZERO);
199
+ high_prod = (Packet4i) vec_sl((Packet4ui) high_prod, (Packet4ui) p4i_MINUS16);
200
+ prod = vec_add( low_prod, high_prod );
201
+
202
+ // NOR the product and select only the negative elements according to the sign mask
203
+ prod_ = vec_nor(prod, prod);
204
+ prod_ = vec_sel(p4i_ZERO, prod_, sgn);
205
+
206
+ // Add 1 to the result to get the negative numbers
207
+ v1sel = vec_sel(p4i_ZERO, p4i_ONE, sgn);
208
+ prod_ = vec_add(prod_, v1sel);
209
+
210
+ // Merge the results back to the final vector.
211
+ prod = vec_sel(prod, prod_, sgn);
212
+
213
+ return prod;
214
+ }
215
+ */
216
+ template<> EIGEN_STRONG_INLINE Packet4f pdiv<Packet4f>(const Packet4f& a, const Packet4f& b)
217
+ {
218
+ Packet4f t, y_0, y_1, res;
219
+
220
+ // Altivec does not offer a divide instruction, we have to do a reciprocal approximation
221
+ y_0 = vec_re(b);
222
+
223
+ // Do one Newton-Raphson iteration to get the needed accuracy
224
+ t = vec_nmsub(y_0, b, p4f_ONE);
225
+ y_1 = vec_madd(y_0, t, y_0);
226
+
227
+ res = vec_madd(a, y_1, p4f_ZERO);
228
+ return res;
229
+ }
230
+
231
+ template<> EIGEN_STRONG_INLINE Packet4i pdiv<Packet4i>(const Packet4i& /*a*/, const Packet4i& /*b*/)
232
+ { eigen_assert(false && "packet integer division are not supported by AltiVec");
233
+ return pset1<Packet4i>(0);
234
+ }
235
+
236
+ // for some weird raisons, it has to be overloaded for packet of integers
237
+ template<> EIGEN_STRONG_INLINE Packet4f pmadd(const Packet4f& a, const Packet4f& b, const Packet4f& c) { return vec_madd(a, b, c); }
238
+ template<> EIGEN_STRONG_INLINE Packet4i pmadd(const Packet4i& a, const Packet4i& b, const Packet4i& c) { return padd(pmul(a,b), c); }
239
+
240
+ template<> EIGEN_STRONG_INLINE Packet4f pmin<Packet4f>(const Packet4f& a, const Packet4f& b) { return vec_min(a, b); }
241
+ template<> EIGEN_STRONG_INLINE Packet4i pmin<Packet4i>(const Packet4i& a, const Packet4i& b) { return vec_min(a, b); }
242
+
243
+ template<> EIGEN_STRONG_INLINE Packet4f pmax<Packet4f>(const Packet4f& a, const Packet4f& b) { return vec_max(a, b); }
244
+ template<> EIGEN_STRONG_INLINE Packet4i pmax<Packet4i>(const Packet4i& a, const Packet4i& b) { return vec_max(a, b); }
245
+
246
+ // Logical Operations are not supported for float, so we have to reinterpret casts using NEON intrinsics
247
+ template<> EIGEN_STRONG_INLINE Packet4f pand<Packet4f>(const Packet4f& a, const Packet4f& b) { return vec_and(a, b); }
248
+ template<> EIGEN_STRONG_INLINE Packet4i pand<Packet4i>(const Packet4i& a, const Packet4i& b) { return vec_and(a, b); }
249
+
250
+ template<> EIGEN_STRONG_INLINE Packet4f por<Packet4f>(const Packet4f& a, const Packet4f& b) { return vec_or(a, b); }
251
+ template<> EIGEN_STRONG_INLINE Packet4i por<Packet4i>(const Packet4i& a, const Packet4i& b) { return vec_or(a, b); }
252
+
253
+ template<> EIGEN_STRONG_INLINE Packet4f pxor<Packet4f>(const Packet4f& a, const Packet4f& b) { return vec_xor(a, b); }
254
+ template<> EIGEN_STRONG_INLINE Packet4i pxor<Packet4i>(const Packet4i& a, const Packet4i& b) { return vec_xor(a, b); }
255
+
256
+ template<> EIGEN_STRONG_INLINE Packet4f pandnot<Packet4f>(const Packet4f& a, const Packet4f& b) { return vec_and(a, vec_nor(b, b)); }
257
+ template<> EIGEN_STRONG_INLINE Packet4i pandnot<Packet4i>(const Packet4i& a, const Packet4i& b) { return vec_and(a, vec_nor(b, b)); }
258
+
259
+ template<> EIGEN_STRONG_INLINE Packet4f pload<Packet4f>(const float* from) { EIGEN_DEBUG_ALIGNED_LOAD return vec_ld(0, from); }
260
+ template<> EIGEN_STRONG_INLINE Packet4i pload<Packet4i>(const int* from) { EIGEN_DEBUG_ALIGNED_LOAD return vec_ld(0, from); }
261
+
262
+ template<> EIGEN_STRONG_INLINE Packet4f ploadu<Packet4f>(const float* from)
263
+ {
264
+ EIGEN_DEBUG_ALIGNED_LOAD
265
+ // Taken from http://developer.apple.com/hardwaredrivers/ve/alignment.html
266
+ Packet16uc MSQ, LSQ;
267
+ Packet16uc mask;
268
+ MSQ = vec_ld(0, (unsigned char *)from); // most significant quadword
269
+ LSQ = vec_ld(15, (unsigned char *)from); // least significant quadword
270
+ mask = vec_lvsl(0, from); // create the permute mask
271
+ return (Packet4f) vec_perm(MSQ, LSQ, mask); // align the data
272
+
273
+ }
274
+ template<> EIGEN_STRONG_INLINE Packet4i ploadu<Packet4i>(const int* from)
275
+ {
276
+ EIGEN_DEBUG_ALIGNED_LOAD
277
+ // Taken from http://developer.apple.com/hardwaredrivers/ve/alignment.html
278
+ Packet16uc MSQ, LSQ;
279
+ Packet16uc mask;
280
+ MSQ = vec_ld(0, (unsigned char *)from); // most significant quadword
281
+ LSQ = vec_ld(15, (unsigned char *)from); // least significant quadword
282
+ mask = vec_lvsl(0, from); // create the permute mask
283
+ return (Packet4i) vec_perm(MSQ, LSQ, mask); // align the data
284
+ }
285
+
286
+ template<> EIGEN_STRONG_INLINE Packet4f ploaddup<Packet4f>(const float* from)
287
+ {
288
+ Packet4f p;
289
+ if((ptrdiff_t(&from) % 16) == 0) p = pload<Packet4f>(from);
290
+ else p = ploadu<Packet4f>(from);
291
+ return vec_perm(p, p, p16uc_DUPLICATE);
292
+ }
293
+ template<> EIGEN_STRONG_INLINE Packet4i ploaddup<Packet4i>(const int* from)
294
+ {
295
+ Packet4i p;
296
+ if((ptrdiff_t(&from) % 16) == 0) p = pload<Packet4i>(from);
297
+ else p = ploadu<Packet4i>(from);
298
+ return vec_perm(p, p, p16uc_DUPLICATE);
299
+ }
300
+
301
+ template<> EIGEN_STRONG_INLINE void pstore<float>(float* to, const Packet4f& from) { EIGEN_DEBUG_ALIGNED_STORE vec_st(from, 0, to); }
302
+ template<> EIGEN_STRONG_INLINE void pstore<int>(int* to, const Packet4i& from) { EIGEN_DEBUG_ALIGNED_STORE vec_st(from, 0, to); }
303
+
304
+ template<> EIGEN_STRONG_INLINE void pstoreu<float>(float* to, const Packet4f& from)
305
+ {
306
+ EIGEN_DEBUG_UNALIGNED_STORE
307
+ // Taken from http://developer.apple.com/hardwaredrivers/ve/alignment.html
308
+ // Warning: not thread safe!
309
+ Packet16uc MSQ, LSQ, edges;
310
+ Packet16uc edgeAlign, align;
311
+
312
+ MSQ = vec_ld(0, (unsigned char *)to); // most significant quadword
313
+ LSQ = vec_ld(15, (unsigned char *)to); // least significant quadword
314
+ edgeAlign = vec_lvsl(0, to); // permute map to extract edges
315
+ edges=vec_perm(LSQ,MSQ,edgeAlign); // extract the edges
316
+ align = vec_lvsr( 0, to ); // permute map to misalign data
317
+ MSQ = vec_perm(edges,(Packet16uc)from,align); // misalign the data (MSQ)
318
+ LSQ = vec_perm((Packet16uc)from,edges,align); // misalign the data (LSQ)
319
+ vec_st( LSQ, 15, (unsigned char *)to ); // Store the LSQ part first
320
+ vec_st( MSQ, 0, (unsigned char *)to ); // Store the MSQ part
321
+ }
322
+ template<> EIGEN_STRONG_INLINE void pstoreu<int>(int* to, const Packet4i& from)
323
+ {
324
+ EIGEN_DEBUG_UNALIGNED_STORE
325
+ // Taken from http://developer.apple.com/hardwaredrivers/ve/alignment.html
326
+ // Warning: not thread safe!
327
+ Packet16uc MSQ, LSQ, edges;
328
+ Packet16uc edgeAlign, align;
329
+
330
+ MSQ = vec_ld(0, (unsigned char *)to); // most significant quadword
331
+ LSQ = vec_ld(15, (unsigned char *)to); // least significant quadword
332
+ edgeAlign = vec_lvsl(0, to); // permute map to extract edges
333
+ edges=vec_perm(LSQ, MSQ, edgeAlign); // extract the edges
334
+ align = vec_lvsr( 0, to ); // permute map to misalign data
335
+ MSQ = vec_perm(edges, (Packet16uc) from, align); // misalign the data (MSQ)
336
+ LSQ = vec_perm((Packet16uc) from, edges, align); // misalign the data (LSQ)
337
+ vec_st( LSQ, 15, (unsigned char *)to ); // Store the LSQ part first
338
+ vec_st( MSQ, 0, (unsigned char *)to ); // Store the MSQ part
339
+ }
340
+
341
+ template<> EIGEN_STRONG_INLINE void prefetch<float>(const float* addr) { vec_dstt(addr, DST_CTRL(2,2,32), DST_CHAN); }
342
+ template<> EIGEN_STRONG_INLINE void prefetch<int>(const int* addr) { vec_dstt(addr, DST_CTRL(2,2,32), DST_CHAN); }
343
+
344
+ template<> EIGEN_STRONG_INLINE float pfirst<Packet4f>(const Packet4f& a) { float EIGEN_ALIGN16 x[4]; vec_st(a, 0, x); return x[0]; }
345
+ template<> EIGEN_STRONG_INLINE int pfirst<Packet4i>(const Packet4i& a) { int EIGEN_ALIGN16 x[4]; vec_st(a, 0, x); return x[0]; }
346
+
347
+ template<> EIGEN_STRONG_INLINE Packet4f preverse(const Packet4f& a) { return (Packet4f)vec_perm((Packet16uc)a,(Packet16uc)a, p16uc_REVERSE); }
348
+ template<> EIGEN_STRONG_INLINE Packet4i preverse(const Packet4i& a) { return (Packet4i)vec_perm((Packet16uc)a,(Packet16uc)a, p16uc_REVERSE); }
349
+
350
+ template<> EIGEN_STRONG_INLINE Packet4f pabs(const Packet4f& a) { return vec_abs(a); }
351
+ template<> EIGEN_STRONG_INLINE Packet4i pabs(const Packet4i& a) { return vec_abs(a); }
352
+
353
+ template<> EIGEN_STRONG_INLINE float predux<Packet4f>(const Packet4f& a)
354
+ {
355
+ Packet4f b, sum;
356
+ b = (Packet4f) vec_sld(a, a, 8);
357
+ sum = vec_add(a, b);
358
+ b = (Packet4f) vec_sld(sum, sum, 4);
359
+ sum = vec_add(sum, b);
360
+ return pfirst(sum);
361
+ }
362
+
363
+ template<> EIGEN_STRONG_INLINE Packet4f preduxp<Packet4f>(const Packet4f* vecs)
364
+ {
365
+ Packet4f v[4], sum[4];
366
+
367
+ // It's easier and faster to transpose then add as columns
368
+ // Check: http://www.freevec.org/function/matrix_4x4_transpose_floats for explanation
369
+ // Do the transpose, first set of moves
370
+ v[0] = vec_mergeh(vecs[0], vecs[2]);
371
+ v[1] = vec_mergel(vecs[0], vecs[2]);
372
+ v[2] = vec_mergeh(vecs[1], vecs[3]);
373
+ v[3] = vec_mergel(vecs[1], vecs[3]);
374
+ // Get the resulting vectors
375
+ sum[0] = vec_mergeh(v[0], v[2]);
376
+ sum[1] = vec_mergel(v[0], v[2]);
377
+ sum[2] = vec_mergeh(v[1], v[3]);
378
+ sum[3] = vec_mergel(v[1], v[3]);
379
+
380
+ // Now do the summation:
381
+ // Lines 0+1
382
+ sum[0] = vec_add(sum[0], sum[1]);
383
+ // Lines 2+3
384
+ sum[1] = vec_add(sum[2], sum[3]);
385
+ // Add the results
386
+ sum[0] = vec_add(sum[0], sum[1]);
387
+
388
+ return sum[0];
389
+ }
390
+
391
+ template<> EIGEN_STRONG_INLINE int predux<Packet4i>(const Packet4i& a)
392
+ {
393
+ Packet4i sum;
394
+ sum = vec_sums(a, p4i_ZERO);
395
+ sum = vec_sld(sum, p4i_ZERO, 12);
396
+ return pfirst(sum);
397
+ }
398
+
399
+ template<> EIGEN_STRONG_INLINE Packet4i preduxp<Packet4i>(const Packet4i* vecs)
400
+ {
401
+ Packet4i v[4], sum[4];
402
+
403
+ // It's easier and faster to transpose then add as columns
404
+ // Check: http://www.freevec.org/function/matrix_4x4_transpose_floats for explanation
405
+ // Do the transpose, first set of moves
406
+ v[0] = vec_mergeh(vecs[0], vecs[2]);
407
+ v[1] = vec_mergel(vecs[0], vecs[2]);
408
+ v[2] = vec_mergeh(vecs[1], vecs[3]);
409
+ v[3] = vec_mergel(vecs[1], vecs[3]);
410
+ // Get the resulting vectors
411
+ sum[0] = vec_mergeh(v[0], v[2]);
412
+ sum[1] = vec_mergel(v[0], v[2]);
413
+ sum[2] = vec_mergeh(v[1], v[3]);
414
+ sum[3] = vec_mergel(v[1], v[3]);
415
+
416
+ // Now do the summation:
417
+ // Lines 0+1
418
+ sum[0] = vec_add(sum[0], sum[1]);
419
+ // Lines 2+3
420
+ sum[1] = vec_add(sum[2], sum[3]);
421
+ // Add the results
422
+ sum[0] = vec_add(sum[0], sum[1]);
423
+
424
+ return sum[0];
425
+ }
426
+
427
+ // Other reduction functions:
428
+ // mul
429
+ template<> EIGEN_STRONG_INLINE float predux_mul<Packet4f>(const Packet4f& a)
430
+ {
431
+ Packet4f prod;
432
+ prod = pmul(a, (Packet4f)vec_sld(a, a, 8));
433
+ return pfirst(pmul(prod, (Packet4f)vec_sld(prod, prod, 4)));
434
+ }
435
+
436
+ template<> EIGEN_STRONG_INLINE int predux_mul<Packet4i>(const Packet4i& a)
437
+ {
438
+ EIGEN_ALIGN16 int aux[4];
439
+ pstore(aux, a);
440
+ return aux[0] * aux[1] * aux[2] * aux[3];
441
+ }
442
+
443
+ // min
444
+ template<> EIGEN_STRONG_INLINE float predux_min<Packet4f>(const Packet4f& a)
445
+ {
446
+ Packet4f b, res;
447
+ b = vec_min(a, vec_sld(a, a, 8));
448
+ res = vec_min(b, vec_sld(b, b, 4));
449
+ return pfirst(res);
450
+ }
451
+
452
+ template<> EIGEN_STRONG_INLINE int predux_min<Packet4i>(const Packet4i& a)
453
+ {
454
+ Packet4i b, res;
455
+ b = vec_min(a, vec_sld(a, a, 8));
456
+ res = vec_min(b, vec_sld(b, b, 4));
457
+ return pfirst(res);
458
+ }
459
+
460
+ // max
461
+ template<> EIGEN_STRONG_INLINE float predux_max<Packet4f>(const Packet4f& a)
462
+ {
463
+ Packet4f b, res;
464
+ b = vec_max(a, vec_sld(a, a, 8));
465
+ res = vec_max(b, vec_sld(b, b, 4));
466
+ return pfirst(res);
467
+ }
468
+
469
+ template<> EIGEN_STRONG_INLINE int predux_max<Packet4i>(const Packet4i& a)
470
+ {
471
+ Packet4i b, res;
472
+ b = vec_max(a, vec_sld(a, a, 8));
473
+ res = vec_max(b, vec_sld(b, b, 4));
474
+ return pfirst(res);
475
+ }
476
+
477
+ template<int Offset>
478
+ struct palign_impl<Offset,Packet4f>
479
+ {
480
+ static EIGEN_STRONG_INLINE void run(Packet4f& first, const Packet4f& second)
481
+ {
482
+ if (Offset!=0)
483
+ first = vec_sld(first, second, Offset*4);
484
+ }
485
+ };
486
+
487
+ template<int Offset>
488
+ struct palign_impl<Offset,Packet4i>
489
+ {
490
+ static EIGEN_STRONG_INLINE void run(Packet4i& first, const Packet4i& second)
491
+ {
492
+ if (Offset!=0)
493
+ first = vec_sld(first, second, Offset*4);
494
+ }
495
+ };
496
+
497
+ } // end namespace internal
498
+
499
+ } // end namespace Eigen
500
+
501
+ #endif // EIGEN_PACKET_MATH_ALTIVEC_H