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,131 @@
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 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_EIGENBASE_H
12
+ #define EIGEN_EIGENBASE_H
13
+
14
+ namespace Eigen {
15
+
16
+ /** Common base class for all classes T such that MatrixBase has an operator=(T) and a constructor MatrixBase(T).
17
+ *
18
+ * In other words, an EigenBase object is an object that can be copied into a MatrixBase.
19
+ *
20
+ * Besides MatrixBase-derived classes, this also includes special matrix classes such as diagonal matrices, etc.
21
+ *
22
+ * Notice that this class is trivial, it is only used to disambiguate overloaded functions.
23
+ *
24
+ * \sa \ref TopicClassHierarchy
25
+ */
26
+ template<typename Derived> struct EigenBase
27
+ {
28
+ // typedef typename internal::plain_matrix_type<Derived>::type PlainObject;
29
+
30
+ typedef typename internal::traits<Derived>::StorageKind StorageKind;
31
+ typedef typename internal::traits<Derived>::Index Index;
32
+
33
+ /** \returns a reference to the derived object */
34
+ Derived& derived() { return *static_cast<Derived*>(this); }
35
+ /** \returns a const reference to the derived object */
36
+ const Derived& derived() const { return *static_cast<const Derived*>(this); }
37
+
38
+ inline Derived& const_cast_derived() const
39
+ { return *static_cast<Derived*>(const_cast<EigenBase*>(this)); }
40
+ inline const Derived& const_derived() const
41
+ { return *static_cast<const Derived*>(this); }
42
+
43
+ /** \returns the number of rows. \sa cols(), RowsAtCompileTime */
44
+ inline Index rows() const { return derived().rows(); }
45
+ /** \returns the number of columns. \sa rows(), ColsAtCompileTime*/
46
+ inline Index cols() const { return derived().cols(); }
47
+ /** \returns the number of coefficients, which is rows()*cols().
48
+ * \sa rows(), cols(), SizeAtCompileTime. */
49
+ inline Index size() const { return rows() * cols(); }
50
+
51
+ /** \internal Don't use it, but do the equivalent: \code dst = *this; \endcode */
52
+ template<typename Dest> inline void evalTo(Dest& dst) const
53
+ { derived().evalTo(dst); }
54
+
55
+ /** \internal Don't use it, but do the equivalent: \code dst += *this; \endcode */
56
+ template<typename Dest> inline void addTo(Dest& dst) const
57
+ {
58
+ // This is the default implementation,
59
+ // derived class can reimplement it in a more optimized way.
60
+ typename Dest::PlainObject res(rows(),cols());
61
+ evalTo(res);
62
+ dst += res;
63
+ }
64
+
65
+ /** \internal Don't use it, but do the equivalent: \code dst -= *this; \endcode */
66
+ template<typename Dest> inline void subTo(Dest& dst) const
67
+ {
68
+ // This is the default implementation,
69
+ // derived class can reimplement it in a more optimized way.
70
+ typename Dest::PlainObject res(rows(),cols());
71
+ evalTo(res);
72
+ dst -= res;
73
+ }
74
+
75
+ /** \internal Don't use it, but do the equivalent: \code dst.applyOnTheRight(*this); \endcode */
76
+ template<typename Dest> inline void applyThisOnTheRight(Dest& dst) const
77
+ {
78
+ // This is the default implementation,
79
+ // derived class can reimplement it in a more optimized way.
80
+ dst = dst * this->derived();
81
+ }
82
+
83
+ /** \internal Don't use it, but do the equivalent: \code dst.applyOnTheLeft(*this); \endcode */
84
+ template<typename Dest> inline void applyThisOnTheLeft(Dest& dst) const
85
+ {
86
+ // This is the default implementation,
87
+ // derived class can reimplement it in a more optimized way.
88
+ dst = this->derived() * dst;
89
+ }
90
+
91
+ };
92
+
93
+ /***************************************************************************
94
+ * Implementation of matrix base methods
95
+ ***************************************************************************/
96
+
97
+ /** \brief Copies the generic expression \a other into *this.
98
+ *
99
+ * \details The expression must provide a (templated) evalTo(Derived& dst) const
100
+ * function which does the actual job. In practice, this allows any user to write
101
+ * its own special matrix without having to modify MatrixBase
102
+ *
103
+ * \returns a reference to *this.
104
+ */
105
+ template<typename Derived>
106
+ template<typename OtherDerived>
107
+ Derived& DenseBase<Derived>::operator=(const EigenBase<OtherDerived> &other)
108
+ {
109
+ other.derived().evalTo(derived());
110
+ return derived();
111
+ }
112
+
113
+ template<typename Derived>
114
+ template<typename OtherDerived>
115
+ Derived& DenseBase<Derived>::operator+=(const EigenBase<OtherDerived> &other)
116
+ {
117
+ other.derived().addTo(derived());
118
+ return derived();
119
+ }
120
+
121
+ template<typename Derived>
122
+ template<typename OtherDerived>
123
+ Derived& DenseBase<Derived>::operator-=(const EigenBase<OtherDerived> &other)
124
+ {
125
+ other.derived().subTo(derived());
126
+ return derived();
127
+ }
128
+
129
+ } // end namespace Eigen
130
+
131
+ #endif // EIGEN_EIGENBASE_H
@@ -0,0 +1,140 @@
1
+ // This file is part of Eigen, a lightweight C++ template library
2
+ // for linear algebra.
3
+ //
4
+ // Copyright (C) 2008 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_FLAGGED_H
11
+ #define EIGEN_FLAGGED_H
12
+
13
+ namespace Eigen {
14
+
15
+ /** \class Flagged
16
+ * \ingroup Core_Module
17
+ *
18
+ * \brief Expression with modified flags
19
+ *
20
+ * \param ExpressionType the type of the object of which we are modifying the flags
21
+ * \param Added the flags added to the expression
22
+ * \param Removed the flags removed from the expression (has priority over Added).
23
+ *
24
+ * This class represents an expression whose flags have been modified.
25
+ * It is the return type of MatrixBase::flagged()
26
+ * and most of the time this is the only way it is used.
27
+ *
28
+ * \sa MatrixBase::flagged()
29
+ */
30
+
31
+ namespace internal {
32
+ template<typename ExpressionType, unsigned int Added, unsigned int Removed>
33
+ struct traits<Flagged<ExpressionType, Added, Removed> > : traits<ExpressionType>
34
+ {
35
+ enum { Flags = (ExpressionType::Flags | Added) & ~Removed };
36
+ };
37
+ }
38
+
39
+ template<typename ExpressionType, unsigned int Added, unsigned int Removed> class Flagged
40
+ : public MatrixBase<Flagged<ExpressionType, Added, Removed> >
41
+ {
42
+ public:
43
+
44
+ typedef MatrixBase<Flagged> Base;
45
+
46
+ EIGEN_DENSE_PUBLIC_INTERFACE(Flagged)
47
+ typedef typename internal::conditional<internal::must_nest_by_value<ExpressionType>::ret,
48
+ ExpressionType, const ExpressionType&>::type ExpressionTypeNested;
49
+ typedef typename ExpressionType::InnerIterator InnerIterator;
50
+
51
+ inline Flagged(const ExpressionType& matrix) : m_matrix(matrix) {}
52
+
53
+ inline Index rows() const { return m_matrix.rows(); }
54
+ inline Index cols() const { return m_matrix.cols(); }
55
+ inline Index outerStride() const { return m_matrix.outerStride(); }
56
+ inline Index innerStride() const { return m_matrix.innerStride(); }
57
+
58
+ inline CoeffReturnType coeff(Index row, Index col) const
59
+ {
60
+ return m_matrix.coeff(row, col);
61
+ }
62
+
63
+ inline CoeffReturnType coeff(Index index) const
64
+ {
65
+ return m_matrix.coeff(index);
66
+ }
67
+
68
+ inline const Scalar& coeffRef(Index row, Index col) const
69
+ {
70
+ return m_matrix.const_cast_derived().coeffRef(row, col);
71
+ }
72
+
73
+ inline const Scalar& coeffRef(Index index) const
74
+ {
75
+ return m_matrix.const_cast_derived().coeffRef(index);
76
+ }
77
+
78
+ inline Scalar& coeffRef(Index row, Index col)
79
+ {
80
+ return m_matrix.const_cast_derived().coeffRef(row, col);
81
+ }
82
+
83
+ inline Scalar& coeffRef(Index index)
84
+ {
85
+ return m_matrix.const_cast_derived().coeffRef(index);
86
+ }
87
+
88
+ template<int LoadMode>
89
+ inline const PacketScalar packet(Index row, Index col) const
90
+ {
91
+ return m_matrix.template packet<LoadMode>(row, col);
92
+ }
93
+
94
+ template<int LoadMode>
95
+ inline void writePacket(Index row, Index col, const PacketScalar& x)
96
+ {
97
+ m_matrix.const_cast_derived().template writePacket<LoadMode>(row, col, x);
98
+ }
99
+
100
+ template<int LoadMode>
101
+ inline const PacketScalar packet(Index index) const
102
+ {
103
+ return m_matrix.template packet<LoadMode>(index);
104
+ }
105
+
106
+ template<int LoadMode>
107
+ inline void writePacket(Index index, const PacketScalar& x)
108
+ {
109
+ m_matrix.const_cast_derived().template writePacket<LoadMode>(index, x);
110
+ }
111
+
112
+ const ExpressionType& _expression() const { return m_matrix; }
113
+
114
+ template<typename OtherDerived>
115
+ typename ExpressionType::PlainObject solveTriangular(const MatrixBase<OtherDerived>& other) const;
116
+
117
+ template<typename OtherDerived>
118
+ void solveTriangularInPlace(const MatrixBase<OtherDerived>& other) const;
119
+
120
+ protected:
121
+ ExpressionTypeNested m_matrix;
122
+ };
123
+
124
+ /** \returns an expression of *this with added and removed flags
125
+ *
126
+ * This is mostly for internal use.
127
+ *
128
+ * \sa class Flagged
129
+ */
130
+ template<typename Derived>
131
+ template<unsigned int Added,unsigned int Removed>
132
+ inline const Flagged<Derived, Added, Removed>
133
+ DenseBase<Derived>::flagged() const
134
+ {
135
+ return derived();
136
+ }
137
+
138
+ } // end namespace Eigen
139
+
140
+ #endif // EIGEN_FLAGGED_H
@@ -0,0 +1,146 @@
1
+ // This file is part of Eigen, a lightweight C++ template library
2
+ // for linear algebra.
3
+ //
4
+ // Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud@inria.fr>
5
+ //
6
+ // This Source Code Form is subject to the terms of the Mozilla
7
+ // Public License v. 2.0. If a copy of the MPL was not distributed
8
+ // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9
+
10
+ #ifndef EIGEN_FORCEALIGNEDACCESS_H
11
+ #define EIGEN_FORCEALIGNEDACCESS_H
12
+
13
+ namespace Eigen {
14
+
15
+ /** \class ForceAlignedAccess
16
+ * \ingroup Core_Module
17
+ *
18
+ * \brief Enforce aligned packet loads and stores regardless of what is requested
19
+ *
20
+ * \param ExpressionType the type of the object of which we are forcing aligned packet access
21
+ *
22
+ * This class is the return type of MatrixBase::forceAlignedAccess()
23
+ * and most of the time this is the only way it is used.
24
+ *
25
+ * \sa MatrixBase::forceAlignedAccess()
26
+ */
27
+
28
+ namespace internal {
29
+ template<typename ExpressionType>
30
+ struct traits<ForceAlignedAccess<ExpressionType> > : public traits<ExpressionType>
31
+ {};
32
+ }
33
+
34
+ template<typename ExpressionType> class ForceAlignedAccess
35
+ : public internal::dense_xpr_base< ForceAlignedAccess<ExpressionType> >::type
36
+ {
37
+ public:
38
+
39
+ typedef typename internal::dense_xpr_base<ForceAlignedAccess>::type Base;
40
+ EIGEN_DENSE_PUBLIC_INTERFACE(ForceAlignedAccess)
41
+
42
+ inline ForceAlignedAccess(const ExpressionType& matrix) : m_expression(matrix) {}
43
+
44
+ inline Index rows() const { return m_expression.rows(); }
45
+ inline Index cols() const { return m_expression.cols(); }
46
+ inline Index outerStride() const { return m_expression.outerStride(); }
47
+ inline Index innerStride() const { return m_expression.innerStride(); }
48
+
49
+ inline const CoeffReturnType coeff(Index row, Index col) const
50
+ {
51
+ return m_expression.coeff(row, col);
52
+ }
53
+
54
+ inline Scalar& coeffRef(Index row, Index col)
55
+ {
56
+ return m_expression.const_cast_derived().coeffRef(row, col);
57
+ }
58
+
59
+ inline const CoeffReturnType coeff(Index index) const
60
+ {
61
+ return m_expression.coeff(index);
62
+ }
63
+
64
+ inline Scalar& coeffRef(Index index)
65
+ {
66
+ return m_expression.const_cast_derived().coeffRef(index);
67
+ }
68
+
69
+ template<int LoadMode>
70
+ inline const PacketScalar packet(Index row, Index col) const
71
+ {
72
+ return m_expression.template packet<Aligned>(row, col);
73
+ }
74
+
75
+ template<int LoadMode>
76
+ inline void writePacket(Index row, Index col, const PacketScalar& x)
77
+ {
78
+ m_expression.const_cast_derived().template writePacket<Aligned>(row, col, x);
79
+ }
80
+
81
+ template<int LoadMode>
82
+ inline const PacketScalar packet(Index index) const
83
+ {
84
+ return m_expression.template packet<Aligned>(index);
85
+ }
86
+
87
+ template<int LoadMode>
88
+ inline void writePacket(Index index, const PacketScalar& x)
89
+ {
90
+ m_expression.const_cast_derived().template writePacket<Aligned>(index, x);
91
+ }
92
+
93
+ operator const ExpressionType&() const { return m_expression; }
94
+
95
+ protected:
96
+ const ExpressionType& m_expression;
97
+
98
+ private:
99
+ ForceAlignedAccess& operator=(const ForceAlignedAccess&);
100
+ };
101
+
102
+ /** \returns an expression of *this with forced aligned access
103
+ * \sa forceAlignedAccessIf(),class ForceAlignedAccess
104
+ */
105
+ template<typename Derived>
106
+ inline const ForceAlignedAccess<Derived>
107
+ MatrixBase<Derived>::forceAlignedAccess() const
108
+ {
109
+ return ForceAlignedAccess<Derived>(derived());
110
+ }
111
+
112
+ /** \returns an expression of *this with forced aligned access
113
+ * \sa forceAlignedAccessIf(), class ForceAlignedAccess
114
+ */
115
+ template<typename Derived>
116
+ inline ForceAlignedAccess<Derived>
117
+ MatrixBase<Derived>::forceAlignedAccess()
118
+ {
119
+ return ForceAlignedAccess<Derived>(derived());
120
+ }
121
+
122
+ /** \returns an expression of *this with forced aligned access if \a Enable is true.
123
+ * \sa forceAlignedAccess(), class ForceAlignedAccess
124
+ */
125
+ template<typename Derived>
126
+ template<bool Enable>
127
+ inline typename internal::add_const_on_value_type<typename internal::conditional<Enable,ForceAlignedAccess<Derived>,Derived&>::type>::type
128
+ MatrixBase<Derived>::forceAlignedAccessIf() const
129
+ {
130
+ return derived();
131
+ }
132
+
133
+ /** \returns an expression of *this with forced aligned access if \a Enable is true.
134
+ * \sa forceAlignedAccess(), class ForceAlignedAccess
135
+ */
136
+ template<typename Derived>
137
+ template<bool Enable>
138
+ inline typename internal::conditional<Enable,ForceAlignedAccess<Derived>,Derived&>::type
139
+ MatrixBase<Derived>::forceAlignedAccessIf()
140
+ {
141
+ return derived();
142
+ }
143
+
144
+ } // end namespace Eigen
145
+
146
+ #endif // EIGEN_FORCEALIGNEDACCESS_H
@@ -0,0 +1,1026 @@
1
+ // This file is part of Eigen, a lightweight C++ template library
2
+ // for linear algebra.
3
+ //
4
+ // Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>
5
+ //
6
+ // This Source Code Form is subject to the terms of the Mozilla
7
+ // Public License v. 2.0. If a copy of the MPL was not distributed
8
+ // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9
+
10
+ #ifndef EIGEN_FUNCTORS_H
11
+ #define EIGEN_FUNCTORS_H
12
+
13
+ namespace Eigen {
14
+
15
+ namespace internal {
16
+
17
+ // associative functors:
18
+
19
+ /** \internal
20
+ * \brief Template functor to compute the sum of two scalars
21
+ *
22
+ * \sa class CwiseBinaryOp, MatrixBase::operator+, class VectorwiseOp, MatrixBase::sum()
23
+ */
24
+ template<typename Scalar> struct scalar_sum_op {
25
+ EIGEN_EMPTY_STRUCT_CTOR(scalar_sum_op)
26
+ EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a, const Scalar& b) const { return a + b; }
27
+ template<typename Packet>
28
+ EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const
29
+ { return internal::padd(a,b); }
30
+ template<typename Packet>
31
+ EIGEN_STRONG_INLINE const Scalar predux(const Packet& a) const
32
+ { return internal::predux(a); }
33
+ };
34
+ template<typename Scalar>
35
+ struct functor_traits<scalar_sum_op<Scalar> > {
36
+ enum {
37
+ Cost = NumTraits<Scalar>::AddCost,
38
+ PacketAccess = packet_traits<Scalar>::HasAdd
39
+ };
40
+ };
41
+
42
+ /** \internal
43
+ * \brief Template functor to compute the product of two scalars
44
+ *
45
+ * \sa class CwiseBinaryOp, Cwise::operator*(), class VectorwiseOp, MatrixBase::redux()
46
+ */
47
+ template<typename LhsScalar,typename RhsScalar> struct scalar_product_op {
48
+ enum {
49
+ // TODO vectorize mixed product
50
+ Vectorizable = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasMul && packet_traits<RhsScalar>::HasMul
51
+ };
52
+ typedef typename scalar_product_traits<LhsScalar,RhsScalar>::ReturnType result_type;
53
+ EIGEN_EMPTY_STRUCT_CTOR(scalar_product_op)
54
+ EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const { return a * b; }
55
+ template<typename Packet>
56
+ EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const
57
+ { return internal::pmul(a,b); }
58
+ template<typename Packet>
59
+ EIGEN_STRONG_INLINE const result_type predux(const Packet& a) const
60
+ { return internal::predux_mul(a); }
61
+ };
62
+ template<typename LhsScalar,typename RhsScalar>
63
+ struct functor_traits<scalar_product_op<LhsScalar,RhsScalar> > {
64
+ enum {
65
+ Cost = (NumTraits<LhsScalar>::MulCost + NumTraits<RhsScalar>::MulCost)/2, // rough estimate!
66
+ PacketAccess = scalar_product_op<LhsScalar,RhsScalar>::Vectorizable
67
+ };
68
+ };
69
+
70
+ /** \internal
71
+ * \brief Template functor to compute the conjugate product of two scalars
72
+ *
73
+ * This is a short cut for conj(x) * y which is needed for optimization purpose; in Eigen2 support mode, this becomes x * conj(y)
74
+ */
75
+ template<typename LhsScalar,typename RhsScalar> struct scalar_conj_product_op {
76
+
77
+ enum {
78
+ Conj = NumTraits<LhsScalar>::IsComplex
79
+ };
80
+
81
+ typedef typename scalar_product_traits<LhsScalar,RhsScalar>::ReturnType result_type;
82
+
83
+ EIGEN_EMPTY_STRUCT_CTOR(scalar_conj_product_op)
84
+ EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const
85
+ { return conj_helper<LhsScalar,RhsScalar,Conj,false>().pmul(a,b); }
86
+
87
+ template<typename Packet>
88
+ EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const
89
+ { return conj_helper<Packet,Packet,Conj,false>().pmul(a,b); }
90
+ };
91
+ template<typename LhsScalar,typename RhsScalar>
92
+ struct functor_traits<scalar_conj_product_op<LhsScalar,RhsScalar> > {
93
+ enum {
94
+ Cost = NumTraits<LhsScalar>::MulCost,
95
+ PacketAccess = internal::is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasMul
96
+ };
97
+ };
98
+
99
+ /** \internal
100
+ * \brief Template functor to compute the min of two scalars
101
+ *
102
+ * \sa class CwiseBinaryOp, MatrixBase::cwiseMin, class VectorwiseOp, MatrixBase::minCoeff()
103
+ */
104
+ template<typename Scalar> struct scalar_min_op {
105
+ EIGEN_EMPTY_STRUCT_CTOR(scalar_min_op)
106
+ EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a, const Scalar& b) const { using std::min; return (min)(a, b); }
107
+ template<typename Packet>
108
+ EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const
109
+ { return internal::pmin(a,b); }
110
+ template<typename Packet>
111
+ EIGEN_STRONG_INLINE const Scalar predux(const Packet& a) const
112
+ { return internal::predux_min(a); }
113
+ };
114
+ template<typename Scalar>
115
+ struct functor_traits<scalar_min_op<Scalar> > {
116
+ enum {
117
+ Cost = NumTraits<Scalar>::AddCost,
118
+ PacketAccess = packet_traits<Scalar>::HasMin
119
+ };
120
+ };
121
+
122
+ /** \internal
123
+ * \brief Template functor to compute the max of two scalars
124
+ *
125
+ * \sa class CwiseBinaryOp, MatrixBase::cwiseMax, class VectorwiseOp, MatrixBase::maxCoeff()
126
+ */
127
+ template<typename Scalar> struct scalar_max_op {
128
+ EIGEN_EMPTY_STRUCT_CTOR(scalar_max_op)
129
+ EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a, const Scalar& b) const { using std::max; return (max)(a, b); }
130
+ template<typename Packet>
131
+ EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const
132
+ { return internal::pmax(a,b); }
133
+ template<typename Packet>
134
+ EIGEN_STRONG_INLINE const Scalar predux(const Packet& a) const
135
+ { return internal::predux_max(a); }
136
+ };
137
+ template<typename Scalar>
138
+ struct functor_traits<scalar_max_op<Scalar> > {
139
+ enum {
140
+ Cost = NumTraits<Scalar>::AddCost,
141
+ PacketAccess = packet_traits<Scalar>::HasMax
142
+ };
143
+ };
144
+
145
+ /** \internal
146
+ * \brief Template functor to compute the hypot of two scalars
147
+ *
148
+ * \sa MatrixBase::stableNorm(), class Redux
149
+ */
150
+ template<typename Scalar> struct scalar_hypot_op {
151
+ EIGEN_EMPTY_STRUCT_CTOR(scalar_hypot_op)
152
+ // typedef typename NumTraits<Scalar>::Real result_type;
153
+ EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& _x, const Scalar& _y) const
154
+ {
155
+ using std::max;
156
+ using std::min;
157
+ using std::sqrt;
158
+ Scalar p = (max)(_x, _y);
159
+ Scalar q = (min)(_x, _y);
160
+ Scalar qp = q/p;
161
+ return p * sqrt(Scalar(1) + qp*qp);
162
+ }
163
+ };
164
+ template<typename Scalar>
165
+ struct functor_traits<scalar_hypot_op<Scalar> > {
166
+ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess=0 };
167
+ };
168
+
169
+ /** \internal
170
+ * \brief Template functor to compute the pow of two scalars
171
+ */
172
+ template<typename Scalar, typename OtherScalar> struct scalar_binary_pow_op {
173
+ EIGEN_EMPTY_STRUCT_CTOR(scalar_binary_pow_op)
174
+ inline Scalar operator() (const Scalar& a, const OtherScalar& b) const { return numext::pow(a, b); }
175
+ };
176
+ template<typename Scalar, typename OtherScalar>
177
+ struct functor_traits<scalar_binary_pow_op<Scalar,OtherScalar> > {
178
+ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = false };
179
+ };
180
+
181
+ // other binary functors:
182
+
183
+ /** \internal
184
+ * \brief Template functor to compute the difference of two scalars
185
+ *
186
+ * \sa class CwiseBinaryOp, MatrixBase::operator-
187
+ */
188
+ template<typename Scalar> struct scalar_difference_op {
189
+ EIGEN_EMPTY_STRUCT_CTOR(scalar_difference_op)
190
+ EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a, const Scalar& b) const { return a - b; }
191
+ template<typename Packet>
192
+ EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const
193
+ { return internal::psub(a,b); }
194
+ };
195
+ template<typename Scalar>
196
+ struct functor_traits<scalar_difference_op<Scalar> > {
197
+ enum {
198
+ Cost = NumTraits<Scalar>::AddCost,
199
+ PacketAccess = packet_traits<Scalar>::HasSub
200
+ };
201
+ };
202
+
203
+ /** \internal
204
+ * \brief Template functor to compute the quotient of two scalars
205
+ *
206
+ * \sa class CwiseBinaryOp, Cwise::operator/()
207
+ */
208
+ template<typename LhsScalar,typename RhsScalar> struct scalar_quotient_op {
209
+ enum {
210
+ // TODO vectorize mixed product
211
+ Vectorizable = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasDiv && packet_traits<RhsScalar>::HasDiv
212
+ };
213
+ typedef typename scalar_product_traits<LhsScalar,RhsScalar>::ReturnType result_type;
214
+ EIGEN_EMPTY_STRUCT_CTOR(scalar_quotient_op)
215
+ EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const { return a / b; }
216
+ template<typename Packet>
217
+ EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const
218
+ { return internal::pdiv(a,b); }
219
+ };
220
+ template<typename LhsScalar,typename RhsScalar>
221
+ struct functor_traits<scalar_quotient_op<LhsScalar,RhsScalar> > {
222
+ enum {
223
+ Cost = (NumTraits<LhsScalar>::MulCost + NumTraits<RhsScalar>::MulCost), // rough estimate!
224
+ PacketAccess = scalar_quotient_op<LhsScalar,RhsScalar>::Vectorizable
225
+ };
226
+ };
227
+
228
+
229
+
230
+ /** \internal
231
+ * \brief Template functor to compute the and of two booleans
232
+ *
233
+ * \sa class CwiseBinaryOp, ArrayBase::operator&&
234
+ */
235
+ struct scalar_boolean_and_op {
236
+ EIGEN_EMPTY_STRUCT_CTOR(scalar_boolean_and_op)
237
+ EIGEN_STRONG_INLINE bool operator() (const bool& a, const bool& b) const { return a && b; }
238
+ };
239
+ template<> struct functor_traits<scalar_boolean_and_op> {
240
+ enum {
241
+ Cost = NumTraits<bool>::AddCost,
242
+ PacketAccess = false
243
+ };
244
+ };
245
+
246
+ /** \internal
247
+ * \brief Template functor to compute the or of two booleans
248
+ *
249
+ * \sa class CwiseBinaryOp, ArrayBase::operator||
250
+ */
251
+ struct scalar_boolean_or_op {
252
+ EIGEN_EMPTY_STRUCT_CTOR(scalar_boolean_or_op)
253
+ EIGEN_STRONG_INLINE bool operator() (const bool& a, const bool& b) const { return a || b; }
254
+ };
255
+ template<> struct functor_traits<scalar_boolean_or_op> {
256
+ enum {
257
+ Cost = NumTraits<bool>::AddCost,
258
+ PacketAccess = false
259
+ };
260
+ };
261
+
262
+ /** \internal
263
+ * \brief Template functors for comparison of two scalars
264
+ * \todo Implement packet-comparisons
265
+ */
266
+ template<typename Scalar, ComparisonName cmp> struct scalar_cmp_op;
267
+
268
+ template<typename Scalar, ComparisonName cmp>
269
+ struct functor_traits<scalar_cmp_op<Scalar, cmp> > {
270
+ enum {
271
+ Cost = NumTraits<Scalar>::AddCost,
272
+ PacketAccess = false
273
+ };
274
+ };
275
+
276
+ template<ComparisonName Cmp, typename Scalar>
277
+ struct result_of<scalar_cmp_op<Scalar, Cmp>(Scalar,Scalar)> {
278
+ typedef bool type;
279
+ };
280
+
281
+
282
+ template<typename Scalar> struct scalar_cmp_op<Scalar, cmp_EQ> {
283
+ EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op)
284
+ EIGEN_STRONG_INLINE bool operator()(const Scalar& a, const Scalar& b) const {return a==b;}
285
+ };
286
+ template<typename Scalar> struct scalar_cmp_op<Scalar, cmp_LT> {
287
+ EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op)
288
+ EIGEN_STRONG_INLINE bool operator()(const Scalar& a, const Scalar& b) const {return a<b;}
289
+ };
290
+ template<typename Scalar> struct scalar_cmp_op<Scalar, cmp_LE> {
291
+ EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op)
292
+ EIGEN_STRONG_INLINE bool operator()(const Scalar& a, const Scalar& b) const {return a<=b;}
293
+ };
294
+ template<typename Scalar> struct scalar_cmp_op<Scalar, cmp_UNORD> {
295
+ EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op)
296
+ EIGEN_STRONG_INLINE bool operator()(const Scalar& a, const Scalar& b) const {return !(a<=b || b<=a);}
297
+ };
298
+ template<typename Scalar> struct scalar_cmp_op<Scalar, cmp_NEQ> {
299
+ EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op)
300
+ EIGEN_STRONG_INLINE bool operator()(const Scalar& a, const Scalar& b) const {return a!=b;}
301
+ };
302
+
303
+ // unary functors:
304
+
305
+ /** \internal
306
+ * \brief Template functor to compute the opposite of a scalar
307
+ *
308
+ * \sa class CwiseUnaryOp, MatrixBase::operator-
309
+ */
310
+ template<typename Scalar> struct scalar_opposite_op {
311
+ EIGEN_EMPTY_STRUCT_CTOR(scalar_opposite_op)
312
+ EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const { return -a; }
313
+ template<typename Packet>
314
+ EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
315
+ { return internal::pnegate(a); }
316
+ };
317
+ template<typename Scalar>
318
+ struct functor_traits<scalar_opposite_op<Scalar> >
319
+ { enum {
320
+ Cost = NumTraits<Scalar>::AddCost,
321
+ PacketAccess = packet_traits<Scalar>::HasNegate };
322
+ };
323
+
324
+ /** \internal
325
+ * \brief Template functor to compute the absolute value of a scalar
326
+ *
327
+ * \sa class CwiseUnaryOp, Cwise::abs
328
+ */
329
+ template<typename Scalar> struct scalar_abs_op {
330
+ EIGEN_EMPTY_STRUCT_CTOR(scalar_abs_op)
331
+ typedef typename NumTraits<Scalar>::Real result_type;
332
+ EIGEN_STRONG_INLINE const result_type operator() (const Scalar& a) const { using std::abs; return abs(a); }
333
+ template<typename Packet>
334
+ EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
335
+ { return internal::pabs(a); }
336
+ };
337
+ template<typename Scalar>
338
+ struct functor_traits<scalar_abs_op<Scalar> >
339
+ {
340
+ enum {
341
+ Cost = NumTraits<Scalar>::AddCost,
342
+ PacketAccess = packet_traits<Scalar>::HasAbs
343
+ };
344
+ };
345
+
346
+ /** \internal
347
+ * \brief Template functor to compute the squared absolute value of a scalar
348
+ *
349
+ * \sa class CwiseUnaryOp, Cwise::abs2
350
+ */
351
+ template<typename Scalar> struct scalar_abs2_op {
352
+ EIGEN_EMPTY_STRUCT_CTOR(scalar_abs2_op)
353
+ typedef typename NumTraits<Scalar>::Real result_type;
354
+ EIGEN_STRONG_INLINE const result_type operator() (const Scalar& a) const { return numext::abs2(a); }
355
+ template<typename Packet>
356
+ EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
357
+ { return internal::pmul(a,a); }
358
+ };
359
+ template<typename Scalar>
360
+ struct functor_traits<scalar_abs2_op<Scalar> >
361
+ { enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasAbs2 }; };
362
+
363
+ /** \internal
364
+ * \brief Template functor to compute the conjugate of a complex value
365
+ *
366
+ * \sa class CwiseUnaryOp, MatrixBase::conjugate()
367
+ */
368
+ template<typename Scalar> struct scalar_conjugate_op {
369
+ EIGEN_EMPTY_STRUCT_CTOR(scalar_conjugate_op)
370
+ EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const { using numext::conj; return conj(a); }
371
+ template<typename Packet>
372
+ EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const { return internal::pconj(a); }
373
+ };
374
+ template<typename Scalar>
375
+ struct functor_traits<scalar_conjugate_op<Scalar> >
376
+ {
377
+ enum {
378
+ Cost = NumTraits<Scalar>::IsComplex ? NumTraits<Scalar>::AddCost : 0,
379
+ PacketAccess = packet_traits<Scalar>::HasConj
380
+ };
381
+ };
382
+
383
+ /** \internal
384
+ * \brief Template functor to cast a scalar to another type
385
+ *
386
+ * \sa class CwiseUnaryOp, MatrixBase::cast()
387
+ */
388
+ template<typename Scalar, typename NewType>
389
+ struct scalar_cast_op {
390
+ EIGEN_EMPTY_STRUCT_CTOR(scalar_cast_op)
391
+ typedef NewType result_type;
392
+ EIGEN_STRONG_INLINE const NewType operator() (const Scalar& a) const { return cast<Scalar, NewType>(a); }
393
+ };
394
+ template<typename Scalar, typename NewType>
395
+ struct functor_traits<scalar_cast_op<Scalar,NewType> >
396
+ { enum { Cost = is_same<Scalar, NewType>::value ? 0 : NumTraits<NewType>::AddCost, PacketAccess = false }; };
397
+
398
+ /** \internal
399
+ * \brief Template functor to extract the real part of a complex
400
+ *
401
+ * \sa class CwiseUnaryOp, MatrixBase::real()
402
+ */
403
+ template<typename Scalar>
404
+ struct scalar_real_op {
405
+ EIGEN_EMPTY_STRUCT_CTOR(scalar_real_op)
406
+ typedef typename NumTraits<Scalar>::Real result_type;
407
+ EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const { return numext::real(a); }
408
+ };
409
+ template<typename Scalar>
410
+ struct functor_traits<scalar_real_op<Scalar> >
411
+ { enum { Cost = 0, PacketAccess = false }; };
412
+
413
+ /** \internal
414
+ * \brief Template functor to extract the imaginary part of a complex
415
+ *
416
+ * \sa class CwiseUnaryOp, MatrixBase::imag()
417
+ */
418
+ template<typename Scalar>
419
+ struct scalar_imag_op {
420
+ EIGEN_EMPTY_STRUCT_CTOR(scalar_imag_op)
421
+ typedef typename NumTraits<Scalar>::Real result_type;
422
+ EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const { return numext::imag(a); }
423
+ };
424
+ template<typename Scalar>
425
+ struct functor_traits<scalar_imag_op<Scalar> >
426
+ { enum { Cost = 0, PacketAccess = false }; };
427
+
428
+ /** \internal
429
+ * \brief Template functor to extract the real part of a complex as a reference
430
+ *
431
+ * \sa class CwiseUnaryOp, MatrixBase::real()
432
+ */
433
+ template<typename Scalar>
434
+ struct scalar_real_ref_op {
435
+ EIGEN_EMPTY_STRUCT_CTOR(scalar_real_ref_op)
436
+ typedef typename NumTraits<Scalar>::Real result_type;
437
+ EIGEN_STRONG_INLINE result_type& operator() (const Scalar& a) const { return numext::real_ref(*const_cast<Scalar*>(&a)); }
438
+ };
439
+ template<typename Scalar>
440
+ struct functor_traits<scalar_real_ref_op<Scalar> >
441
+ { enum { Cost = 0, PacketAccess = false }; };
442
+
443
+ /** \internal
444
+ * \brief Template functor to extract the imaginary part of a complex as a reference
445
+ *
446
+ * \sa class CwiseUnaryOp, MatrixBase::imag()
447
+ */
448
+ template<typename Scalar>
449
+ struct scalar_imag_ref_op {
450
+ EIGEN_EMPTY_STRUCT_CTOR(scalar_imag_ref_op)
451
+ typedef typename NumTraits<Scalar>::Real result_type;
452
+ EIGEN_STRONG_INLINE result_type& operator() (const Scalar& a) const { return numext::imag_ref(*const_cast<Scalar*>(&a)); }
453
+ };
454
+ template<typename Scalar>
455
+ struct functor_traits<scalar_imag_ref_op<Scalar> >
456
+ { enum { Cost = 0, PacketAccess = false }; };
457
+
458
+ /** \internal
459
+ *
460
+ * \brief Template functor to compute the exponential of a scalar
461
+ *
462
+ * \sa class CwiseUnaryOp, Cwise::exp()
463
+ */
464
+ template<typename Scalar> struct scalar_exp_op {
465
+ EIGEN_EMPTY_STRUCT_CTOR(scalar_exp_op)
466
+ inline const Scalar operator() (const Scalar& a) const { using std::exp; return exp(a); }
467
+ typedef typename packet_traits<Scalar>::type Packet;
468
+ inline Packet packetOp(const Packet& a) const { return internal::pexp(a); }
469
+ };
470
+ template<typename Scalar>
471
+ struct functor_traits<scalar_exp_op<Scalar> >
472
+ { enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasExp }; };
473
+
474
+ /** \internal
475
+ *
476
+ * \brief Template functor to compute the logarithm of a scalar
477
+ *
478
+ * \sa class CwiseUnaryOp, Cwise::log()
479
+ */
480
+ template<typename Scalar> struct scalar_log_op {
481
+ EIGEN_EMPTY_STRUCT_CTOR(scalar_log_op)
482
+ inline const Scalar operator() (const Scalar& a) const { using std::log; return log(a); }
483
+ typedef typename packet_traits<Scalar>::type Packet;
484
+ inline Packet packetOp(const Packet& a) const { return internal::plog(a); }
485
+ };
486
+ template<typename Scalar>
487
+ struct functor_traits<scalar_log_op<Scalar> >
488
+ { enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasLog }; };
489
+
490
+ /** \internal
491
+ * \brief Template functor to multiply a scalar by a fixed other one
492
+ *
493
+ * \sa class CwiseUnaryOp, MatrixBase::operator*, MatrixBase::operator/
494
+ */
495
+ /* NOTE why doing the pset1() in packetOp *is* an optimization ?
496
+ * indeed it seems better to declare m_other as a Packet and do the pset1() once
497
+ * in the constructor. However, in practice:
498
+ * - GCC does not like m_other as a Packet and generate a load every time it needs it
499
+ * - on the other hand GCC is able to moves the pset1() outside the loop :)
500
+ * - simpler code ;)
501
+ * (ICC and gcc 4.4 seems to perform well in both cases, the issue is visible with y = a*x + b*y)
502
+ */
503
+ template<typename Scalar>
504
+ struct scalar_multiple_op {
505
+ typedef typename packet_traits<Scalar>::type Packet;
506
+ // FIXME default copy constructors seems bugged with std::complex<>
507
+ EIGEN_STRONG_INLINE scalar_multiple_op(const scalar_multiple_op& other) : m_other(other.m_other) { }
508
+ EIGEN_STRONG_INLINE scalar_multiple_op(const Scalar& other) : m_other(other) { }
509
+ EIGEN_STRONG_INLINE Scalar operator() (const Scalar& a) const { return a * m_other; }
510
+ EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
511
+ { return internal::pmul(a, pset1<Packet>(m_other)); }
512
+ typename add_const_on_value_type<typename NumTraits<Scalar>::Nested>::type m_other;
513
+ };
514
+ template<typename Scalar>
515
+ struct functor_traits<scalar_multiple_op<Scalar> >
516
+ { enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; };
517
+
518
+ template<typename Scalar1, typename Scalar2>
519
+ struct scalar_multiple2_op {
520
+ typedef typename scalar_product_traits<Scalar1,Scalar2>::ReturnType result_type;
521
+ EIGEN_STRONG_INLINE scalar_multiple2_op(const scalar_multiple2_op& other) : m_other(other.m_other) { }
522
+ EIGEN_STRONG_INLINE scalar_multiple2_op(const Scalar2& other) : m_other(other) { }
523
+ EIGEN_STRONG_INLINE result_type operator() (const Scalar1& a) const { return a * m_other; }
524
+ typename add_const_on_value_type<typename NumTraits<Scalar2>::Nested>::type m_other;
525
+ };
526
+ template<typename Scalar1,typename Scalar2>
527
+ struct functor_traits<scalar_multiple2_op<Scalar1,Scalar2> >
528
+ { enum { Cost = NumTraits<Scalar1>::MulCost, PacketAccess = false }; };
529
+
530
+ /** \internal
531
+ * \brief Template functor to divide a scalar by a fixed other one
532
+ *
533
+ * This functor is used to implement the quotient of a matrix by
534
+ * a scalar where the scalar type is not necessarily a floating point type.
535
+ *
536
+ * \sa class CwiseUnaryOp, MatrixBase::operator/
537
+ */
538
+ template<typename Scalar>
539
+ struct scalar_quotient1_op {
540
+ typedef typename packet_traits<Scalar>::type Packet;
541
+ // FIXME default copy constructors seems bugged with std::complex<>
542
+ EIGEN_STRONG_INLINE scalar_quotient1_op(const scalar_quotient1_op& other) : m_other(other.m_other) { }
543
+ EIGEN_STRONG_INLINE scalar_quotient1_op(const Scalar& other) : m_other(other) {}
544
+ EIGEN_STRONG_INLINE Scalar operator() (const Scalar& a) const { return a / m_other; }
545
+ EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
546
+ { return internal::pdiv(a, pset1<Packet>(m_other)); }
547
+ typename add_const_on_value_type<typename NumTraits<Scalar>::Nested>::type m_other;
548
+ };
549
+ template<typename Scalar>
550
+ struct functor_traits<scalar_quotient1_op<Scalar> >
551
+ { enum { Cost = 2 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasDiv }; };
552
+
553
+ // nullary functors
554
+
555
+ template<typename Scalar>
556
+ struct scalar_constant_op {
557
+ typedef typename packet_traits<Scalar>::type Packet;
558
+ EIGEN_STRONG_INLINE scalar_constant_op(const scalar_constant_op& other) : m_other(other.m_other) { }
559
+ EIGEN_STRONG_INLINE scalar_constant_op(const Scalar& other) : m_other(other) { }
560
+ template<typename Index>
561
+ EIGEN_STRONG_INLINE const Scalar operator() (Index, Index = 0) const { return m_other; }
562
+ template<typename Index>
563
+ EIGEN_STRONG_INLINE const Packet packetOp(Index, Index = 0) const { return internal::pset1<Packet>(m_other); }
564
+ const Scalar m_other;
565
+ };
566
+ template<typename Scalar>
567
+ struct functor_traits<scalar_constant_op<Scalar> >
568
+ // FIXME replace this packet test by a safe one
569
+ { enum { Cost = 1, PacketAccess = packet_traits<Scalar>::Vectorizable, IsRepeatable = true }; };
570
+
571
+ template<typename Scalar> struct scalar_identity_op {
572
+ EIGEN_EMPTY_STRUCT_CTOR(scalar_identity_op)
573
+ template<typename Index>
574
+ EIGEN_STRONG_INLINE const Scalar operator() (Index row, Index col) const { return row==col ? Scalar(1) : Scalar(0); }
575
+ };
576
+ template<typename Scalar>
577
+ struct functor_traits<scalar_identity_op<Scalar> >
578
+ { enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = false, IsRepeatable = true }; };
579
+
580
+ template <typename Scalar, bool RandomAccess> struct linspaced_op_impl;
581
+
582
+ // linear access for packet ops:
583
+ // 1) initialization
584
+ // base = [low, ..., low] + ([step, ..., step] * [-size, ..., 0])
585
+ // 2) each step (where size is 1 for coeff access or PacketSize for packet access)
586
+ // base += [size*step, ..., size*step]
587
+ //
588
+ // TODO: Perhaps it's better to initialize lazily (so not in the constructor but in packetOp)
589
+ // in order to avoid the padd() in operator() ?
590
+ template <typename Scalar>
591
+ struct linspaced_op_impl<Scalar,false>
592
+ {
593
+ typedef typename packet_traits<Scalar>::type Packet;
594
+
595
+ linspaced_op_impl(const Scalar& low, const Scalar& step) :
596
+ m_low(low), m_step(step),
597
+ m_packetStep(pset1<Packet>(packet_traits<Scalar>::size*step)),
598
+ m_base(padd(pset1<Packet>(low), pmul(pset1<Packet>(step),plset<Scalar>(-packet_traits<Scalar>::size)))) {}
599
+
600
+ template<typename Index>
601
+ EIGEN_STRONG_INLINE const Scalar operator() (Index i) const
602
+ {
603
+ m_base = padd(m_base, pset1<Packet>(m_step));
604
+ return m_low+Scalar(i)*m_step;
605
+ }
606
+
607
+ template<typename Index>
608
+ EIGEN_STRONG_INLINE const Packet packetOp(Index) const { return m_base = padd(m_base,m_packetStep); }
609
+
610
+ const Scalar m_low;
611
+ const Scalar m_step;
612
+ const Packet m_packetStep;
613
+ mutable Packet m_base;
614
+ };
615
+
616
+ // random access for packet ops:
617
+ // 1) each step
618
+ // [low, ..., low] + ( [step, ..., step] * ( [i, ..., i] + [0, ..., size] ) )
619
+ template <typename Scalar>
620
+ struct linspaced_op_impl<Scalar,true>
621
+ {
622
+ typedef typename packet_traits<Scalar>::type Packet;
623
+
624
+ linspaced_op_impl(const Scalar& low, const Scalar& step) :
625
+ m_low(low), m_step(step),
626
+ m_lowPacket(pset1<Packet>(m_low)), m_stepPacket(pset1<Packet>(m_step)), m_interPacket(plset<Scalar>(0)) {}
627
+
628
+ template<typename Index>
629
+ EIGEN_STRONG_INLINE const Scalar operator() (Index i) const { return m_low+i*m_step; }
630
+
631
+ template<typename Index>
632
+ EIGEN_STRONG_INLINE const Packet packetOp(Index i) const
633
+ { return internal::padd(m_lowPacket, pmul(m_stepPacket, padd(pset1<Packet>(Scalar(i)),m_interPacket))); }
634
+
635
+ const Scalar m_low;
636
+ const Scalar m_step;
637
+ const Packet m_lowPacket;
638
+ const Packet m_stepPacket;
639
+ const Packet m_interPacket;
640
+ };
641
+
642
+ // ----- Linspace functor ----------------------------------------------------------------
643
+
644
+ // Forward declaration (we default to random access which does not really give
645
+ // us a speed gain when using packet access but it allows to use the functor in
646
+ // nested expressions).
647
+ template <typename Scalar, bool RandomAccess = true> struct linspaced_op;
648
+ template <typename Scalar, bool RandomAccess> struct functor_traits< linspaced_op<Scalar,RandomAccess> >
649
+ { enum { Cost = 1, PacketAccess = packet_traits<Scalar>::HasSetLinear, IsRepeatable = true }; };
650
+ template <typename Scalar, bool RandomAccess> struct linspaced_op
651
+ {
652
+ typedef typename packet_traits<Scalar>::type Packet;
653
+ linspaced_op(const Scalar& low, const Scalar& high, DenseIndex num_steps) : impl((num_steps==1 ? high : low), (num_steps==1 ? Scalar() : (high-low)/Scalar(num_steps-1))) {}
654
+
655
+ template<typename Index>
656
+ EIGEN_STRONG_INLINE const Scalar operator() (Index i) const { return impl(i); }
657
+
658
+ // We need this function when assigning e.g. a RowVectorXd to a MatrixXd since
659
+ // there row==0 and col is used for the actual iteration.
660
+ template<typename Index>
661
+ EIGEN_STRONG_INLINE const Scalar operator() (Index row, Index col) const
662
+ {
663
+ eigen_assert(col==0 || row==0);
664
+ return impl(col + row);
665
+ }
666
+
667
+ template<typename Index>
668
+ EIGEN_STRONG_INLINE const Packet packetOp(Index i) const { return impl.packetOp(i); }
669
+
670
+ // We need this function when assigning e.g. a RowVectorXd to a MatrixXd since
671
+ // there row==0 and col is used for the actual iteration.
672
+ template<typename Index>
673
+ EIGEN_STRONG_INLINE const Packet packetOp(Index row, Index col) const
674
+ {
675
+ eigen_assert(col==0 || row==0);
676
+ return impl.packetOp(col + row);
677
+ }
678
+
679
+ // This proxy object handles the actual required temporaries, the different
680
+ // implementations (random vs. sequential access) as well as the
681
+ // correct piping to size 2/4 packet operations.
682
+ const linspaced_op_impl<Scalar,RandomAccess> impl;
683
+ };
684
+
685
+ // all functors allow linear access, except scalar_identity_op. So we fix here a quick meta
686
+ // to indicate whether a functor allows linear access, just always answering 'yes' except for
687
+ // scalar_identity_op.
688
+ // FIXME move this to functor_traits adding a functor_default
689
+ template<typename Functor> struct functor_has_linear_access { enum { ret = 1 }; };
690
+ template<typename Scalar> struct functor_has_linear_access<scalar_identity_op<Scalar> > { enum { ret = 0 }; };
691
+
692
+ // In Eigen, any binary op (Product, CwiseBinaryOp) require the Lhs and Rhs to have the same scalar type, except for multiplication
693
+ // where the mixing of different types is handled by scalar_product_traits
694
+ // In particular, real * complex<real> is allowed.
695
+ // FIXME move this to functor_traits adding a functor_default
696
+ template<typename Functor> struct functor_is_product_like { enum { ret = 0 }; };
697
+ template<typename LhsScalar,typename RhsScalar> struct functor_is_product_like<scalar_product_op<LhsScalar,RhsScalar> > { enum { ret = 1 }; };
698
+ template<typename LhsScalar,typename RhsScalar> struct functor_is_product_like<scalar_conj_product_op<LhsScalar,RhsScalar> > { enum { ret = 1 }; };
699
+ template<typename LhsScalar,typename RhsScalar> struct functor_is_product_like<scalar_quotient_op<LhsScalar,RhsScalar> > { enum { ret = 1 }; };
700
+
701
+
702
+ /** \internal
703
+ * \brief Template functor to add a scalar to a fixed other one
704
+ * \sa class CwiseUnaryOp, Array::operator+
705
+ */
706
+ /* If you wonder why doing the pset1() in packetOp() is an optimization check scalar_multiple_op */
707
+ template<typename Scalar>
708
+ struct scalar_add_op {
709
+ typedef typename packet_traits<Scalar>::type Packet;
710
+ // FIXME default copy constructors seems bugged with std::complex<>
711
+ inline scalar_add_op(const scalar_add_op& other) : m_other(other.m_other) { }
712
+ inline scalar_add_op(const Scalar& other) : m_other(other) { }
713
+ inline Scalar operator() (const Scalar& a) const { return a + m_other; }
714
+ inline const Packet packetOp(const Packet& a) const
715
+ { return internal::padd(a, pset1<Packet>(m_other)); }
716
+ const Scalar m_other;
717
+ };
718
+ template<typename Scalar>
719
+ struct functor_traits<scalar_add_op<Scalar> >
720
+ { enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = packet_traits<Scalar>::HasAdd }; };
721
+
722
+ /** \internal
723
+ * \brief Template functor to compute the square root of a scalar
724
+ * \sa class CwiseUnaryOp, Cwise::sqrt()
725
+ */
726
+ template<typename Scalar> struct scalar_sqrt_op {
727
+ EIGEN_EMPTY_STRUCT_CTOR(scalar_sqrt_op)
728
+ inline const Scalar operator() (const Scalar& a) const { using std::sqrt; return sqrt(a); }
729
+ typedef typename packet_traits<Scalar>::type Packet;
730
+ inline Packet packetOp(const Packet& a) const { return internal::psqrt(a); }
731
+ };
732
+ template<typename Scalar>
733
+ struct functor_traits<scalar_sqrt_op<Scalar> >
734
+ { enum {
735
+ Cost = 5 * NumTraits<Scalar>::MulCost,
736
+ PacketAccess = packet_traits<Scalar>::HasSqrt
737
+ };
738
+ };
739
+
740
+ /** \internal
741
+ * \brief Template functor to compute the cosine of a scalar
742
+ * \sa class CwiseUnaryOp, ArrayBase::cos()
743
+ */
744
+ template<typename Scalar> struct scalar_cos_op {
745
+ EIGEN_EMPTY_STRUCT_CTOR(scalar_cos_op)
746
+ inline Scalar operator() (const Scalar& a) const { using std::cos; return cos(a); }
747
+ typedef typename packet_traits<Scalar>::type Packet;
748
+ inline Packet packetOp(const Packet& a) const { return internal::pcos(a); }
749
+ };
750
+ template<typename Scalar>
751
+ struct functor_traits<scalar_cos_op<Scalar> >
752
+ {
753
+ enum {
754
+ Cost = 5 * NumTraits<Scalar>::MulCost,
755
+ PacketAccess = packet_traits<Scalar>::HasCos
756
+ };
757
+ };
758
+
759
+ /** \internal
760
+ * \brief Template functor to compute the sine of a scalar
761
+ * \sa class CwiseUnaryOp, ArrayBase::sin()
762
+ */
763
+ template<typename Scalar> struct scalar_sin_op {
764
+ EIGEN_EMPTY_STRUCT_CTOR(scalar_sin_op)
765
+ inline const Scalar operator() (const Scalar& a) const { using std::sin; return sin(a); }
766
+ typedef typename packet_traits<Scalar>::type Packet;
767
+ inline Packet packetOp(const Packet& a) const { return internal::psin(a); }
768
+ };
769
+ template<typename Scalar>
770
+ struct functor_traits<scalar_sin_op<Scalar> >
771
+ {
772
+ enum {
773
+ Cost = 5 * NumTraits<Scalar>::MulCost,
774
+ PacketAccess = packet_traits<Scalar>::HasSin
775
+ };
776
+ };
777
+
778
+
779
+ /** \internal
780
+ * \brief Template functor to compute the tan of a scalar
781
+ * \sa class CwiseUnaryOp, ArrayBase::tan()
782
+ */
783
+ template<typename Scalar> struct scalar_tan_op {
784
+ EIGEN_EMPTY_STRUCT_CTOR(scalar_tan_op)
785
+ inline const Scalar operator() (const Scalar& a) const { using std::tan; return tan(a); }
786
+ typedef typename packet_traits<Scalar>::type Packet;
787
+ inline Packet packetOp(const Packet& a) const { return internal::ptan(a); }
788
+ };
789
+ template<typename Scalar>
790
+ struct functor_traits<scalar_tan_op<Scalar> >
791
+ {
792
+ enum {
793
+ Cost = 5 * NumTraits<Scalar>::MulCost,
794
+ PacketAccess = packet_traits<Scalar>::HasTan
795
+ };
796
+ };
797
+
798
+ /** \internal
799
+ * \brief Template functor to compute the arc cosine of a scalar
800
+ * \sa class CwiseUnaryOp, ArrayBase::acos()
801
+ */
802
+ template<typename Scalar> struct scalar_acos_op {
803
+ EIGEN_EMPTY_STRUCT_CTOR(scalar_acos_op)
804
+ inline const Scalar operator() (const Scalar& a) const { using std::acos; return acos(a); }
805
+ typedef typename packet_traits<Scalar>::type Packet;
806
+ inline Packet packetOp(const Packet& a) const { return internal::pacos(a); }
807
+ };
808
+ template<typename Scalar>
809
+ struct functor_traits<scalar_acos_op<Scalar> >
810
+ {
811
+ enum {
812
+ Cost = 5 * NumTraits<Scalar>::MulCost,
813
+ PacketAccess = packet_traits<Scalar>::HasACos
814
+ };
815
+ };
816
+
817
+ /** \internal
818
+ * \brief Template functor to compute the arc sine of a scalar
819
+ * \sa class CwiseUnaryOp, ArrayBase::asin()
820
+ */
821
+ template<typename Scalar> struct scalar_asin_op {
822
+ EIGEN_EMPTY_STRUCT_CTOR(scalar_asin_op)
823
+ inline const Scalar operator() (const Scalar& a) const { using std::asin; return asin(a); }
824
+ typedef typename packet_traits<Scalar>::type Packet;
825
+ inline Packet packetOp(const Packet& a) const { return internal::pasin(a); }
826
+ };
827
+ template<typename Scalar>
828
+ struct functor_traits<scalar_asin_op<Scalar> >
829
+ {
830
+ enum {
831
+ Cost = 5 * NumTraits<Scalar>::MulCost,
832
+ PacketAccess = packet_traits<Scalar>::HasASin
833
+ };
834
+ };
835
+
836
+ /** \internal
837
+ * \brief Template functor to raise a scalar to a power
838
+ * \sa class CwiseUnaryOp, Cwise::pow
839
+ */
840
+ template<typename Scalar>
841
+ struct scalar_pow_op {
842
+ // FIXME default copy constructors seems bugged with std::complex<>
843
+ inline scalar_pow_op(const scalar_pow_op& other) : m_exponent(other.m_exponent) { }
844
+ inline scalar_pow_op(const Scalar& exponent) : m_exponent(exponent) {}
845
+ inline Scalar operator() (const Scalar& a) const { return numext::pow(a, m_exponent); }
846
+ const Scalar m_exponent;
847
+ };
848
+ template<typename Scalar>
849
+ struct functor_traits<scalar_pow_op<Scalar> >
850
+ { enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = false }; };
851
+
852
+ /** \internal
853
+ * \brief Template functor to compute the quotient between a scalar and array entries.
854
+ * \sa class CwiseUnaryOp, Cwise::inverse()
855
+ */
856
+ template<typename Scalar>
857
+ struct scalar_inverse_mult_op {
858
+ scalar_inverse_mult_op(const Scalar& other) : m_other(other) {}
859
+ inline Scalar operator() (const Scalar& a) const { return m_other / a; }
860
+ template<typename Packet>
861
+ inline const Packet packetOp(const Packet& a) const
862
+ { return internal::pdiv(pset1<Packet>(m_other),a); }
863
+ Scalar m_other;
864
+ };
865
+
866
+ /** \internal
867
+ * \brief Template functor to compute the inverse of a scalar
868
+ * \sa class CwiseUnaryOp, Cwise::inverse()
869
+ */
870
+ template<typename Scalar>
871
+ struct scalar_inverse_op {
872
+ EIGEN_EMPTY_STRUCT_CTOR(scalar_inverse_op)
873
+ inline Scalar operator() (const Scalar& a) const { return Scalar(1)/a; }
874
+ template<typename Packet>
875
+ inline const Packet packetOp(const Packet& a) const
876
+ { return internal::pdiv(pset1<Packet>(Scalar(1)),a); }
877
+ };
878
+ template<typename Scalar>
879
+ struct functor_traits<scalar_inverse_op<Scalar> >
880
+ { enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasDiv }; };
881
+
882
+ /** \internal
883
+ * \brief Template functor to compute the square of a scalar
884
+ * \sa class CwiseUnaryOp, Cwise::square()
885
+ */
886
+ template<typename Scalar>
887
+ struct scalar_square_op {
888
+ EIGEN_EMPTY_STRUCT_CTOR(scalar_square_op)
889
+ inline Scalar operator() (const Scalar& a) const { return a*a; }
890
+ template<typename Packet>
891
+ inline const Packet packetOp(const Packet& a) const
892
+ { return internal::pmul(a,a); }
893
+ };
894
+ template<typename Scalar>
895
+ struct functor_traits<scalar_square_op<Scalar> >
896
+ { enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; };
897
+
898
+ /** \internal
899
+ * \brief Template functor to compute the cube of a scalar
900
+ * \sa class CwiseUnaryOp, Cwise::cube()
901
+ */
902
+ template<typename Scalar>
903
+ struct scalar_cube_op {
904
+ EIGEN_EMPTY_STRUCT_CTOR(scalar_cube_op)
905
+ inline Scalar operator() (const Scalar& a) const { return a*a*a; }
906
+ template<typename Packet>
907
+ inline const Packet packetOp(const Packet& a) const
908
+ { return internal::pmul(a,pmul(a,a)); }
909
+ };
910
+ template<typename Scalar>
911
+ struct functor_traits<scalar_cube_op<Scalar> >
912
+ { enum { Cost = 2*NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; };
913
+
914
+ // default functor traits for STL functors:
915
+
916
+ template<typename T>
917
+ struct functor_traits<std::multiplies<T> >
918
+ { enum { Cost = NumTraits<T>::MulCost, PacketAccess = false }; };
919
+
920
+ template<typename T>
921
+ struct functor_traits<std::divides<T> >
922
+ { enum { Cost = NumTraits<T>::MulCost, PacketAccess = false }; };
923
+
924
+ template<typename T>
925
+ struct functor_traits<std::plus<T> >
926
+ { enum { Cost = NumTraits<T>::AddCost, PacketAccess = false }; };
927
+
928
+ template<typename T>
929
+ struct functor_traits<std::minus<T> >
930
+ { enum { Cost = NumTraits<T>::AddCost, PacketAccess = false }; };
931
+
932
+ template<typename T>
933
+ struct functor_traits<std::negate<T> >
934
+ { enum { Cost = NumTraits<T>::AddCost, PacketAccess = false }; };
935
+
936
+ template<typename T>
937
+ struct functor_traits<std::logical_or<T> >
938
+ { enum { Cost = 1, PacketAccess = false }; };
939
+
940
+ template<typename T>
941
+ struct functor_traits<std::logical_and<T> >
942
+ { enum { Cost = 1, PacketAccess = false }; };
943
+
944
+ template<typename T>
945
+ struct functor_traits<std::logical_not<T> >
946
+ { enum { Cost = 1, PacketAccess = false }; };
947
+
948
+ template<typename T>
949
+ struct functor_traits<std::greater<T> >
950
+ { enum { Cost = 1, PacketAccess = false }; };
951
+
952
+ template<typename T>
953
+ struct functor_traits<std::less<T> >
954
+ { enum { Cost = 1, PacketAccess = false }; };
955
+
956
+ template<typename T>
957
+ struct functor_traits<std::greater_equal<T> >
958
+ { enum { Cost = 1, PacketAccess = false }; };
959
+
960
+ template<typename T>
961
+ struct functor_traits<std::less_equal<T> >
962
+ { enum { Cost = 1, PacketAccess = false }; };
963
+
964
+ template<typename T>
965
+ struct functor_traits<std::equal_to<T> >
966
+ { enum { Cost = 1, PacketAccess = false }; };
967
+
968
+ template<typename T>
969
+ struct functor_traits<std::not_equal_to<T> >
970
+ { enum { Cost = 1, PacketAccess = false }; };
971
+
972
+ template<typename T>
973
+ struct functor_traits<std::binder2nd<T> >
974
+ { enum { Cost = functor_traits<T>::Cost, PacketAccess = false }; };
975
+
976
+ template<typename T>
977
+ struct functor_traits<std::binder1st<T> >
978
+ { enum { Cost = functor_traits<T>::Cost, PacketAccess = false }; };
979
+
980
+ template<typename T>
981
+ struct functor_traits<std::unary_negate<T> >
982
+ { enum { Cost = 1 + functor_traits<T>::Cost, PacketAccess = false }; };
983
+
984
+ template<typename T>
985
+ struct functor_traits<std::binary_negate<T> >
986
+ { enum { Cost = 1 + functor_traits<T>::Cost, PacketAccess = false }; };
987
+
988
+ #ifdef EIGEN_STDEXT_SUPPORT
989
+
990
+ template<typename T0,typename T1>
991
+ struct functor_traits<std::project1st<T0,T1> >
992
+ { enum { Cost = 0, PacketAccess = false }; };
993
+
994
+ template<typename T0,typename T1>
995
+ struct functor_traits<std::project2nd<T0,T1> >
996
+ { enum { Cost = 0, PacketAccess = false }; };
997
+
998
+ template<typename T0,typename T1>
999
+ struct functor_traits<std::select2nd<std::pair<T0,T1> > >
1000
+ { enum { Cost = 0, PacketAccess = false }; };
1001
+
1002
+ template<typename T0,typename T1>
1003
+ struct functor_traits<std::select1st<std::pair<T0,T1> > >
1004
+ { enum { Cost = 0, PacketAccess = false }; };
1005
+
1006
+ template<typename T0,typename T1>
1007
+ struct functor_traits<std::unary_compose<T0,T1> >
1008
+ { enum { Cost = functor_traits<T0>::Cost + functor_traits<T1>::Cost, PacketAccess = false }; };
1009
+
1010
+ template<typename T0,typename T1,typename T2>
1011
+ struct functor_traits<std::binary_compose<T0,T1,T2> >
1012
+ { enum { Cost = functor_traits<T0>::Cost + functor_traits<T1>::Cost + functor_traits<T2>::Cost, PacketAccess = false }; };
1013
+
1014
+ #endif // EIGEN_STDEXT_SUPPORT
1015
+
1016
+ // allow to add new functors and specializations of functor_traits from outside Eigen.
1017
+ // this macro is really needed because functor_traits must be specialized after it is declared but before it is used...
1018
+ #ifdef EIGEN_FUNCTORS_PLUGIN
1019
+ #include EIGEN_FUNCTORS_PLUGIN
1020
+ #endif
1021
+
1022
+ } // end namespace internal
1023
+
1024
+ } // end namespace Eigen
1025
+
1026
+ #endif // EIGEN_FUNCTORS_H