@smake/eigen 1.0.1 → 1.1.0

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 (283) hide show
  1. package/README.md +1 -1
  2. package/eigen/COPYING.APACHE +203 -0
  3. package/eigen/COPYING.BSD +1 -1
  4. package/eigen/COPYING.MINPACK +51 -52
  5. package/eigen/Eigen/Cholesky +0 -1
  6. package/eigen/Eigen/Core +108 -266
  7. package/eigen/Eigen/Eigenvalues +0 -1
  8. package/eigen/Eigen/Geometry +3 -6
  9. package/eigen/Eigen/Householder +0 -1
  10. package/eigen/Eigen/Jacobi +0 -1
  11. package/eigen/Eigen/KLUSupport +41 -0
  12. package/eigen/Eigen/LU +2 -5
  13. package/eigen/Eigen/OrderingMethods +0 -3
  14. package/eigen/Eigen/PaStiXSupport +1 -0
  15. package/eigen/Eigen/PardisoSupport +0 -0
  16. package/eigen/Eigen/QR +0 -1
  17. package/eigen/Eigen/QtAlignedMalloc +0 -1
  18. package/eigen/Eigen/SVD +0 -1
  19. package/eigen/Eigen/Sparse +0 -2
  20. package/eigen/Eigen/SparseCholesky +0 -8
  21. package/eigen/Eigen/SparseLU +4 -0
  22. package/eigen/Eigen/src/Cholesky/LDLT.h +42 -27
  23. package/eigen/Eigen/src/Cholesky/LLT.h +39 -23
  24. package/eigen/Eigen/src/CholmodSupport/CholmodSupport.h +90 -47
  25. package/eigen/Eigen/src/Core/ArithmeticSequence.h +413 -0
  26. package/eigen/Eigen/src/Core/Array.h +99 -11
  27. package/eigen/Eigen/src/Core/ArrayBase.h +1 -1
  28. package/eigen/Eigen/src/Core/ArrayWrapper.h +21 -21
  29. package/eigen/Eigen/src/Core/Assign.h +1 -1
  30. package/eigen/Eigen/src/Core/AssignEvaluator.h +125 -50
  31. package/eigen/Eigen/src/Core/Assign_MKL.h +10 -10
  32. package/eigen/Eigen/src/Core/BandMatrix.h +16 -16
  33. package/eigen/Eigen/src/Core/Block.h +56 -60
  34. package/eigen/Eigen/src/Core/BooleanRedux.h +29 -31
  35. package/eigen/Eigen/src/Core/CommaInitializer.h +7 -3
  36. package/eigen/Eigen/src/Core/CoreEvaluators.h +325 -272
  37. package/eigen/Eigen/src/Core/CoreIterators.h +5 -0
  38. package/eigen/Eigen/src/Core/CwiseBinaryOp.h +21 -22
  39. package/eigen/Eigen/src/Core/CwiseNullaryOp.h +153 -18
  40. package/eigen/Eigen/src/Core/CwiseUnaryOp.h +6 -6
  41. package/eigen/Eigen/src/Core/CwiseUnaryView.h +12 -10
  42. package/eigen/Eigen/src/Core/DenseBase.h +128 -39
  43. package/eigen/Eigen/src/Core/DenseCoeffsBase.h +25 -21
  44. package/eigen/Eigen/src/Core/DenseStorage.h +150 -68
  45. package/eigen/Eigen/src/Core/Diagonal.h +21 -23
  46. package/eigen/Eigen/src/Core/DiagonalMatrix.h +50 -2
  47. package/eigen/Eigen/src/Core/DiagonalProduct.h +1 -1
  48. package/eigen/Eigen/src/Core/Dot.h +10 -10
  49. package/eigen/Eigen/src/Core/EigenBase.h +10 -9
  50. package/eigen/Eigen/src/Core/ForceAlignedAccess.h +8 -4
  51. package/eigen/Eigen/src/Core/Fuzzy.h +3 -3
  52. package/eigen/Eigen/src/Core/GeneralProduct.h +20 -10
  53. package/eigen/Eigen/src/Core/GenericPacketMath.h +597 -147
  54. package/eigen/Eigen/src/Core/GlobalFunctions.h +40 -33
  55. package/eigen/Eigen/src/Core/IO.h +40 -7
  56. package/eigen/Eigen/src/Core/IndexedView.h +237 -0
  57. package/eigen/Eigen/src/Core/Inverse.h +9 -10
  58. package/eigen/Eigen/src/Core/Map.h +7 -7
  59. package/eigen/Eigen/src/Core/MapBase.h +5 -3
  60. package/eigen/Eigen/src/Core/MathFunctions.h +756 -120
  61. package/eigen/Eigen/src/Core/MathFunctionsImpl.h +118 -19
  62. package/eigen/Eigen/src/Core/Matrix.h +131 -25
  63. package/eigen/Eigen/src/Core/MatrixBase.h +19 -2
  64. package/eigen/Eigen/src/Core/NestByValue.h +25 -50
  65. package/eigen/Eigen/src/Core/NoAlias.h +4 -3
  66. package/eigen/Eigen/src/Core/NumTraits.h +107 -20
  67. package/eigen/Eigen/src/Core/PartialReduxEvaluator.h +232 -0
  68. package/eigen/Eigen/src/Core/PermutationMatrix.h +3 -3
  69. package/eigen/Eigen/src/Core/PlainObjectBase.h +145 -54
  70. package/eigen/Eigen/src/Core/Product.h +30 -25
  71. package/eigen/Eigen/src/Core/ProductEvaluators.h +183 -142
  72. package/eigen/Eigen/src/Core/Random.h +37 -1
  73. package/eigen/Eigen/src/Core/Redux.h +180 -170
  74. package/eigen/Eigen/src/Core/Ref.h +118 -21
  75. package/eigen/Eigen/src/Core/Replicate.h +8 -8
  76. package/eigen/Eigen/src/Core/Reshaped.h +454 -0
  77. package/eigen/Eigen/src/Core/ReturnByValue.h +7 -5
  78. package/eigen/Eigen/src/Core/Reverse.h +18 -12
  79. package/eigen/Eigen/src/Core/Select.h +8 -6
  80. package/eigen/Eigen/src/Core/SelfAdjointView.h +33 -20
  81. package/eigen/Eigen/src/Core/Solve.h +14 -14
  82. package/eigen/Eigen/src/Core/SolveTriangular.h +13 -13
  83. package/eigen/Eigen/src/Core/SolverBase.h +41 -3
  84. package/eigen/Eigen/src/Core/StableNorm.h +100 -70
  85. package/eigen/Eigen/src/Core/StlIterators.h +463 -0
  86. package/eigen/Eigen/src/Core/Stride.h +9 -4
  87. package/eigen/Eigen/src/Core/Swap.h +5 -4
  88. package/eigen/Eigen/src/Core/Transpose.h +86 -27
  89. package/eigen/Eigen/src/Core/Transpositions.h +26 -8
  90. package/eigen/Eigen/src/Core/TriangularMatrix.h +88 -72
  91. package/eigen/Eigen/src/Core/VectorBlock.h +5 -5
  92. package/eigen/Eigen/src/Core/VectorwiseOp.h +159 -70
  93. package/eigen/Eigen/src/Core/Visitor.h +137 -29
  94. package/eigen/Eigen/src/Core/arch/AVX/Complex.h +50 -129
  95. package/eigen/Eigen/src/Core/arch/AVX/MathFunctions.h +126 -337
  96. package/eigen/Eigen/src/Core/arch/AVX/PacketMath.h +1092 -155
  97. package/eigen/Eigen/src/Core/arch/AVX/TypeCasting.h +65 -1
  98. package/eigen/Eigen/src/Core/arch/AVX512/Complex.h +422 -0
  99. package/eigen/Eigen/src/Core/arch/AVX512/MathFunctions.h +186 -213
  100. package/eigen/Eigen/src/Core/arch/AVX512/PacketMath.h +1250 -252
  101. package/eigen/Eigen/src/Core/arch/AVX512/TypeCasting.h +89 -0
  102. package/eigen/Eigen/src/Core/arch/AltiVec/Complex.h +152 -165
  103. package/eigen/Eigen/src/Core/arch/AltiVec/MathFunctions.h +19 -251
  104. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProduct.h +2937 -0
  105. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h +221 -0
  106. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductMMA.h +629 -0
  107. package/eigen/Eigen/src/Core/arch/AltiVec/PacketMath.h +2042 -392
  108. package/eigen/Eigen/src/Core/arch/CUDA/Complex.h +235 -80
  109. package/eigen/Eigen/src/Core/arch/Default/BFloat16.h +700 -0
  110. package/eigen/Eigen/src/Core/arch/Default/ConjHelper.h +102 -14
  111. package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h +1649 -0
  112. package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h +110 -0
  113. package/eigen/Eigen/src/Core/arch/Default/Half.h +942 -0
  114. package/eigen/Eigen/src/Core/arch/Default/Settings.h +1 -1
  115. package/eigen/Eigen/src/Core/arch/Default/TypeCasting.h +120 -0
  116. package/eigen/Eigen/src/Core/arch/{CUDA → GPU}/MathFunctions.h +16 -4
  117. package/eigen/Eigen/src/Core/arch/GPU/PacketMath.h +1685 -0
  118. package/eigen/Eigen/src/Core/arch/GPU/TypeCasting.h +80 -0
  119. package/eigen/Eigen/src/Core/arch/HIP/hcc/math_constants.h +23 -0
  120. package/eigen/Eigen/src/Core/arch/MSA/Complex.h +648 -0
  121. package/eigen/Eigen/src/Core/arch/MSA/MathFunctions.h +387 -0
  122. package/eigen/Eigen/src/Core/arch/MSA/PacketMath.h +1233 -0
  123. package/eigen/Eigen/src/Core/arch/NEON/Complex.h +313 -219
  124. package/eigen/Eigen/src/Core/arch/NEON/GeneralBlockPanelKernel.h +183 -0
  125. package/eigen/Eigen/src/Core/arch/NEON/MathFunctions.h +54 -70
  126. package/eigen/Eigen/src/Core/arch/NEON/PacketMath.h +4376 -549
  127. package/eigen/Eigen/src/Core/arch/NEON/TypeCasting.h +1419 -0
  128. package/eigen/Eigen/src/Core/arch/SSE/Complex.h +59 -179
  129. package/eigen/Eigen/src/Core/arch/SSE/MathFunctions.h +65 -428
  130. package/eigen/Eigen/src/Core/arch/SSE/PacketMath.h +893 -283
  131. package/eigen/Eigen/src/Core/arch/SSE/TypeCasting.h +65 -0
  132. package/eigen/Eigen/src/Core/arch/SVE/MathFunctions.h +44 -0
  133. package/eigen/Eigen/src/Core/arch/SVE/PacketMath.h +752 -0
  134. package/eigen/Eigen/src/Core/arch/SVE/TypeCasting.h +49 -0
  135. package/eigen/Eigen/src/Core/arch/SYCL/InteropHeaders.h +232 -0
  136. package/eigen/Eigen/src/Core/arch/SYCL/MathFunctions.h +301 -0
  137. package/eigen/Eigen/src/Core/arch/SYCL/PacketMath.h +670 -0
  138. package/eigen/Eigen/src/Core/arch/SYCL/SyclMemoryModel.h +694 -0
  139. package/eigen/Eigen/src/Core/arch/SYCL/TypeCasting.h +85 -0
  140. package/eigen/Eigen/src/Core/arch/ZVector/Complex.h +212 -183
  141. package/eigen/Eigen/src/Core/arch/ZVector/MathFunctions.h +101 -5
  142. package/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h +510 -395
  143. package/eigen/Eigen/src/Core/functors/AssignmentFunctors.h +11 -2
  144. package/eigen/Eigen/src/Core/functors/BinaryFunctors.h +112 -46
  145. package/eigen/Eigen/src/Core/functors/NullaryFunctors.h +31 -30
  146. package/eigen/Eigen/src/Core/functors/StlFunctors.h +32 -2
  147. package/eigen/Eigen/src/Core/functors/UnaryFunctors.h +354 -15
  148. package/eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h +1073 -585
  149. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix.h +29 -7
  150. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +4 -4
  151. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h +1 -1
  152. package/eigen/Eigen/src/Core/products/GeneralMatrixVector.h +382 -483
  153. package/eigen/Eigen/src/Core/products/Parallelizer.h +23 -9
  154. package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +23 -6
  155. package/eigen/Eigen/src/Core/products/SelfadjointMatrixVector.h +8 -6
  156. package/eigen/Eigen/src/Core/products/SelfadjointProduct.h +2 -2
  157. package/eigen/Eigen/src/Core/products/SelfadjointRank2Update.h +5 -4
  158. package/eigen/Eigen/src/Core/products/TriangularMatrixMatrix.h +3 -3
  159. package/eigen/Eigen/src/Core/products/TriangularSolverMatrix.h +5 -3
  160. package/eigen/Eigen/src/Core/products/TriangularSolverVector.h +13 -10
  161. package/eigen/Eigen/src/Core/util/BlasUtil.h +208 -124
  162. package/eigen/Eigen/src/Core/util/ConfigureVectorization.h +512 -0
  163. package/eigen/Eigen/src/Core/util/Constants.h +25 -9
  164. package/eigen/Eigen/src/Core/util/DisableStupidWarnings.h +14 -2
  165. package/eigen/Eigen/src/Core/util/ForwardDeclarations.h +28 -4
  166. package/eigen/Eigen/src/Core/util/IndexedViewHelper.h +186 -0
  167. package/eigen/Eigen/src/Core/util/IntegralConstant.h +272 -0
  168. package/eigen/Eigen/src/Core/util/MKL_support.h +8 -1
  169. package/eigen/Eigen/src/Core/util/Macros.h +661 -250
  170. package/eigen/Eigen/src/Core/util/Memory.h +222 -52
  171. package/eigen/Eigen/src/Core/util/Meta.h +349 -105
  172. package/eigen/Eigen/src/Core/util/ReshapedHelper.h +51 -0
  173. package/eigen/Eigen/src/Core/util/StaticAssert.h +8 -5
  174. package/eigen/Eigen/src/Core/util/SymbolicIndex.h +293 -0
  175. package/eigen/Eigen/src/Core/util/XprHelper.h +48 -30
  176. package/eigen/Eigen/src/Eigenvalues/ComplexEigenSolver.h +1 -1
  177. package/eigen/Eigen/src/Eigenvalues/ComplexSchur.h +1 -1
  178. package/eigen/Eigen/src/Eigenvalues/EigenSolver.h +2 -2
  179. package/eigen/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h +1 -1
  180. package/eigen/Eigen/src/Eigenvalues/HessenbergDecomposition.h +2 -2
  181. package/eigen/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h +2 -2
  182. package/eigen/Eigen/src/Eigenvalues/RealQZ.h +9 -6
  183. package/eigen/Eigen/src/Eigenvalues/RealSchur.h +10 -5
  184. package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +75 -42
  185. package/eigen/Eigen/src/Eigenvalues/Tridiagonalization.h +20 -15
  186. package/eigen/Eigen/src/Geometry/AlignedBox.h +99 -5
  187. package/eigen/Eigen/src/Geometry/AngleAxis.h +4 -4
  188. package/eigen/Eigen/src/Geometry/EulerAngles.h +3 -3
  189. package/eigen/Eigen/src/Geometry/Homogeneous.h +15 -11
  190. package/eigen/Eigen/src/Geometry/Hyperplane.h +1 -1
  191. package/eigen/Eigen/src/Geometry/OrthoMethods.h +3 -2
  192. package/eigen/Eigen/src/Geometry/ParametrizedLine.h +39 -2
  193. package/eigen/Eigen/src/Geometry/Quaternion.h +52 -14
  194. package/eigen/Eigen/src/Geometry/Rotation2D.h +3 -3
  195. package/eigen/Eigen/src/Geometry/Scaling.h +22 -4
  196. package/eigen/Eigen/src/Geometry/Transform.h +86 -65
  197. package/eigen/Eigen/src/Geometry/Translation.h +6 -6
  198. package/eigen/Eigen/src/Geometry/arch/Geometry_SIMD.h +168 -0
  199. package/eigen/Eigen/src/Householder/BlockHouseholder.h +9 -2
  200. package/eigen/Eigen/src/Householder/Householder.h +8 -4
  201. package/eigen/Eigen/src/Householder/HouseholderSequence.h +123 -48
  202. package/eigen/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +15 -15
  203. package/eigen/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +7 -23
  204. package/eigen/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +5 -22
  205. package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h +41 -47
  206. package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h +51 -60
  207. package/eigen/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +70 -20
  208. package/eigen/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h +2 -20
  209. package/eigen/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h +11 -9
  210. package/eigen/Eigen/src/Jacobi/Jacobi.h +31 -10
  211. package/eigen/Eigen/src/KLUSupport/KLUSupport.h +358 -0
  212. package/eigen/Eigen/src/LU/Determinant.h +35 -19
  213. package/eigen/Eigen/src/LU/FullPivLU.h +29 -43
  214. package/eigen/Eigen/src/LU/InverseImpl.h +25 -8
  215. package/eigen/Eigen/src/LU/PartialPivLU.h +67 -57
  216. package/eigen/Eigen/src/LU/arch/InverseSize4.h +351 -0
  217. package/eigen/Eigen/src/OrderingMethods/Amd.h +7 -17
  218. package/eigen/Eigen/src/OrderingMethods/Eigen_Colamd.h +297 -277
  219. package/eigen/Eigen/src/OrderingMethods/Ordering.h +6 -10
  220. package/eigen/Eigen/src/PaStiXSupport/PaStiXSupport.h +1 -1
  221. package/eigen/Eigen/src/PardisoSupport/PardisoSupport.h +10 -9
  222. package/eigen/Eigen/src/QR/ColPivHouseholderQR.h +41 -20
  223. package/eigen/Eigen/src/QR/CompleteOrthogonalDecomposition.h +100 -27
  224. package/eigen/Eigen/src/QR/FullPivHouseholderQR.h +59 -22
  225. package/eigen/Eigen/src/QR/HouseholderQR.h +48 -23
  226. package/eigen/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h +25 -3
  227. package/eigen/Eigen/src/SVD/BDCSVD.h +137 -48
  228. package/eigen/Eigen/src/SVD/JacobiSVD.h +22 -14
  229. package/eigen/Eigen/src/SVD/SVDBase.h +82 -21
  230. package/eigen/Eigen/src/SVD/UpperBidiagonalization.h +3 -3
  231. package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky.h +16 -8
  232. package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h +11 -36
  233. package/eigen/Eigen/src/SparseCore/CompressedStorage.h +16 -0
  234. package/eigen/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h +6 -6
  235. package/eigen/Eigen/src/SparseCore/SparseAssign.h +81 -27
  236. package/eigen/Eigen/src/SparseCore/SparseBlock.h +25 -57
  237. package/eigen/Eigen/src/SparseCore/SparseCompressedBase.h +40 -11
  238. package/eigen/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +11 -15
  239. package/eigen/Eigen/src/SparseCore/SparseCwiseUnaryOp.h +2 -2
  240. package/eigen/Eigen/src/SparseCore/SparseDenseProduct.h +30 -8
  241. package/eigen/Eigen/src/SparseCore/SparseMatrix.h +124 -10
  242. package/eigen/Eigen/src/SparseCore/SparseMatrixBase.h +5 -12
  243. package/eigen/Eigen/src/SparseCore/SparseProduct.h +13 -1
  244. package/eigen/Eigen/src/SparseCore/SparseRef.h +7 -7
  245. package/eigen/Eigen/src/SparseCore/SparseSelfAdjointView.h +3 -0
  246. package/eigen/Eigen/src/SparseCore/SparseUtil.h +8 -0
  247. package/eigen/Eigen/src/SparseCore/SparseVector.h +1 -1
  248. package/eigen/Eigen/src/SparseLU/SparseLU.h +160 -10
  249. package/eigen/Eigen/src/SparseLU/SparseLU_Memory.h +1 -1
  250. package/eigen/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h +76 -2
  251. package/eigen/Eigen/src/SparseLU/SparseLU_column_dfs.h +2 -2
  252. package/eigen/Eigen/src/SparseLU/SparseLU_gemm_kernel.h +1 -1
  253. package/eigen/Eigen/src/SparseLU/SparseLU_panel_bmod.h +1 -1
  254. package/eigen/Eigen/src/SparseQR/SparseQR.h +19 -6
  255. package/eigen/Eigen/src/StlSupport/StdDeque.h +2 -14
  256. package/eigen/Eigen/src/StlSupport/StdList.h +2 -2
  257. package/eigen/Eigen/src/StlSupport/StdVector.h +2 -2
  258. package/eigen/Eigen/src/SuperLUSupport/SuperLUSupport.h +6 -8
  259. package/eigen/Eigen/src/UmfPackSupport/UmfPackSupport.h +175 -39
  260. package/eigen/Eigen/src/misc/lapacke.h +5 -4
  261. package/eigen/Eigen/src/plugins/ArrayCwiseBinaryOps.h +27 -1
  262. package/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.h +155 -11
  263. package/eigen/Eigen/src/plugins/BlockMethods.h +626 -242
  264. package/eigen/Eigen/src/plugins/CommonCwiseUnaryOps.h +14 -0
  265. package/eigen/Eigen/src/plugins/IndexedViewMethods.h +262 -0
  266. package/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.h +4 -4
  267. package/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.h +10 -0
  268. package/eigen/Eigen/src/plugins/ReshapedMethods.h +149 -0
  269. package/eigen/README.md +2 -0
  270. package/lib/LibEigen.d.ts +4 -0
  271. package/lib/LibEigen.js +14 -0
  272. package/lib/index.d.ts +1 -1
  273. package/lib/index.js +7 -3
  274. package/package.json +2 -10
  275. package/eigen/Eigen/CMakeLists.txt +0 -19
  276. package/eigen/Eigen/src/Core/arch/CUDA/Half.h +0 -675
  277. package/eigen/Eigen/src/Core/arch/CUDA/PacketMath.h +0 -333
  278. package/eigen/Eigen/src/Core/arch/CUDA/PacketMathHalf.h +0 -1124
  279. package/eigen/Eigen/src/Core/arch/CUDA/TypeCasting.h +0 -212
  280. package/eigen/Eigen/src/Geometry/arch/Geometry_SSE.h +0 -161
  281. package/eigen/Eigen/src/LU/arch/Inverse_SSE.h +0 -338
  282. package/lib/eigen.d.ts +0 -2
  283. package/lib/eigen.js +0 -15
@@ -1,7 +1,7 @@
1
1
  // This file is part of Eigen, a lightweight C++ template library
2
2
  // for linear algebra.
3
3
  //
4
- // Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>
4
+ // Copyright (C) 2008-2019 Gael Guennebaud <gael.guennebaud@inria.fr>
5
5
  // Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>
6
6
  //
7
7
  // This Source Code Form is subject to the terms of the Mozilla
@@ -65,10 +65,10 @@ class PartialReduxExpr : public internal::dense_xpr_base< PartialReduxExpr<Matri
65
65
  explicit PartialReduxExpr(const MatrixType& mat, const MemberOp& func = MemberOp())
66
66
  : m_matrix(mat), m_functor(func) {}
67
67
 
68
- EIGEN_DEVICE_FUNC
69
- Index rows() const { return (Direction==Vertical ? 1 : m_matrix.rows()); }
70
- EIGEN_DEVICE_FUNC
71
- Index cols() const { return (Direction==Horizontal ? 1 : m_matrix.cols()); }
68
+ EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
69
+ Index rows() const EIGEN_NOEXCEPT { return (Direction==Vertical ? 1 : m_matrix.rows()); }
70
+ EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
71
+ Index cols() const EIGEN_NOEXCEPT { return (Direction==Horizontal ? 1 : m_matrix.cols()); }
72
72
 
73
73
  EIGEN_DEVICE_FUNC
74
74
  typename MatrixType::Nested nestedExpression() const { return m_matrix; }
@@ -81,39 +81,46 @@ class PartialReduxExpr : public internal::dense_xpr_base< PartialReduxExpr<Matri
81
81
  const MemberOp m_functor;
82
82
  };
83
83
 
84
- #define EIGEN_MEMBER_FUNCTOR(MEMBER,COST) \
85
- template <typename ResultType> \
86
- struct member_##MEMBER { \
87
- EIGEN_EMPTY_STRUCT_CTOR(member_##MEMBER) \
88
- typedef ResultType result_type; \
89
- template<typename Scalar, int Size> struct Cost \
90
- { enum { value = COST }; }; \
91
- template<typename XprType> \
92
- EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE \
93
- ResultType operator()(const XprType& mat) const \
94
- { return mat.MEMBER(); } \
84
+ template<typename A,typename B> struct partial_redux_dummy_func;
85
+
86
+ #define EIGEN_MAKE_PARTIAL_REDUX_FUNCTOR(MEMBER,COST,VECTORIZABLE,BINARYOP) \
87
+ template <typename ResultType,typename Scalar> \
88
+ struct member_##MEMBER { \
89
+ EIGEN_EMPTY_STRUCT_CTOR(member_##MEMBER) \
90
+ typedef ResultType result_type; \
91
+ typedef BINARYOP<Scalar,Scalar> BinaryOp; \
92
+ template<int Size> struct Cost { enum { value = COST }; }; \
93
+ enum { Vectorizable = VECTORIZABLE }; \
94
+ template<typename XprType> \
95
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE \
96
+ ResultType operator()(const XprType& mat) const \
97
+ { return mat.MEMBER(); } \
98
+ BinaryOp binaryFunc() const { return BinaryOp(); } \
95
99
  }
96
100
 
101
+ #define EIGEN_MEMBER_FUNCTOR(MEMBER,COST) \
102
+ EIGEN_MAKE_PARTIAL_REDUX_FUNCTOR(MEMBER,COST,0,partial_redux_dummy_func)
103
+
97
104
  namespace internal {
98
105
 
99
- EIGEN_MEMBER_FUNCTOR(squaredNorm, Size * NumTraits<Scalar>::MulCost + (Size-1)*NumTraits<Scalar>::AddCost);
100
106
  EIGEN_MEMBER_FUNCTOR(norm, (Size+5) * NumTraits<Scalar>::MulCost + (Size-1)*NumTraits<Scalar>::AddCost);
101
107
  EIGEN_MEMBER_FUNCTOR(stableNorm, (Size+5) * NumTraits<Scalar>::MulCost + (Size-1)*NumTraits<Scalar>::AddCost);
102
108
  EIGEN_MEMBER_FUNCTOR(blueNorm, (Size+5) * NumTraits<Scalar>::MulCost + (Size-1)*NumTraits<Scalar>::AddCost);
103
109
  EIGEN_MEMBER_FUNCTOR(hypotNorm, (Size-1) * functor_traits<scalar_hypot_op<Scalar> >::Cost );
104
- EIGEN_MEMBER_FUNCTOR(sum, (Size-1)*NumTraits<Scalar>::AddCost);
105
- EIGEN_MEMBER_FUNCTOR(mean, (Size-1)*NumTraits<Scalar>::AddCost + NumTraits<Scalar>::MulCost);
106
- EIGEN_MEMBER_FUNCTOR(minCoeff, (Size-1)*NumTraits<Scalar>::AddCost);
107
- EIGEN_MEMBER_FUNCTOR(maxCoeff, (Size-1)*NumTraits<Scalar>::AddCost);
108
110
  EIGEN_MEMBER_FUNCTOR(all, (Size-1)*NumTraits<Scalar>::AddCost);
109
111
  EIGEN_MEMBER_FUNCTOR(any, (Size-1)*NumTraits<Scalar>::AddCost);
110
112
  EIGEN_MEMBER_FUNCTOR(count, (Size-1)*NumTraits<Scalar>::AddCost);
111
- EIGEN_MEMBER_FUNCTOR(prod, (Size-1)*NumTraits<Scalar>::MulCost);
112
113
 
113
- template <int p, typename ResultType>
114
+ EIGEN_MAKE_PARTIAL_REDUX_FUNCTOR(sum, (Size-1)*NumTraits<Scalar>::AddCost, 1, internal::scalar_sum_op);
115
+ EIGEN_MAKE_PARTIAL_REDUX_FUNCTOR(minCoeff, (Size-1)*NumTraits<Scalar>::AddCost, 1, internal::scalar_min_op);
116
+ EIGEN_MAKE_PARTIAL_REDUX_FUNCTOR(maxCoeff, (Size-1)*NumTraits<Scalar>::AddCost, 1, internal::scalar_max_op);
117
+ EIGEN_MAKE_PARTIAL_REDUX_FUNCTOR(prod, (Size-1)*NumTraits<Scalar>::MulCost, 1, internal::scalar_product_op);
118
+
119
+ template <int p, typename ResultType,typename Scalar>
114
120
  struct member_lpnorm {
115
121
  typedef ResultType result_type;
116
- template<typename Scalar, int Size> struct Cost
122
+ enum { Vectorizable = 0 };
123
+ template<int Size> struct Cost
117
124
  { enum { value = (Size+5) * NumTraits<Scalar>::MulCost + (Size-1)*NumTraits<Scalar>::AddCost }; };
118
125
  EIGEN_DEVICE_FUNC member_lpnorm() {}
119
126
  template<typename XprType>
@@ -121,17 +128,20 @@ struct member_lpnorm {
121
128
  { return mat.template lpNorm<p>(); }
122
129
  };
123
130
 
124
- template <typename BinaryOp, typename Scalar>
131
+ template <typename BinaryOpT, typename Scalar>
125
132
  struct member_redux {
133
+ typedef BinaryOpT BinaryOp;
126
134
  typedef typename result_of<
127
135
  BinaryOp(const Scalar&,const Scalar&)
128
136
  >::type result_type;
129
- template<typename _Scalar, int Size> struct Cost
130
- { enum { value = (Size-1) * functor_traits<BinaryOp>::Cost }; };
137
+
138
+ enum { Vectorizable = functor_traits<BinaryOp>::PacketAccess };
139
+ template<int Size> struct Cost { enum { value = (Size-1) * functor_traits<BinaryOp>::Cost }; };
131
140
  EIGEN_DEVICE_FUNC explicit member_redux(const BinaryOp func) : m_functor(func) {}
132
141
  template<typename Derived>
133
142
  EIGEN_DEVICE_FUNC inline result_type operator()(const DenseBase<Derived>& mat) const
134
143
  { return mat.redux(m_functor); }
144
+ const BinaryOp& binaryFunc() const { return m_functor; }
135
145
  const BinaryOp m_functor;
136
146
  };
137
147
  }
@@ -139,18 +149,38 @@ struct member_redux {
139
149
  /** \class VectorwiseOp
140
150
  * \ingroup Core_Module
141
151
  *
142
- * \brief Pseudo expression providing partial reduction operations
152
+ * \brief Pseudo expression providing broadcasting and partial reduction operations
143
153
  *
144
154
  * \tparam ExpressionType the type of the object on which to do partial reductions
145
- * \tparam Direction indicates the direction of the redux (#Vertical or #Horizontal)
155
+ * \tparam Direction indicates whether to operate on columns (#Vertical) or rows (#Horizontal)
146
156
  *
147
- * This class represents a pseudo expression with partial reduction features.
157
+ * This class represents a pseudo expression with broadcasting and partial reduction features.
148
158
  * It is the return type of DenseBase::colwise() and DenseBase::rowwise()
149
- * and most of the time this is the only way it is used.
159
+ * and most of the time this is the only way it is explicitly used.
160
+ *
161
+ * To understand the logic of rowwise/colwise expression, let's consider a generic case `A.colwise().foo()`
162
+ * where `foo` is any method of `VectorwiseOp`. This expression is equivalent to applying `foo()` to each
163
+ * column of `A` and then re-assemble the outputs in a matrix expression:
164
+ * \code [A.col(0).foo(), A.col(1).foo(), ..., A.col(A.cols()-1).foo()] \endcode
150
165
  *
151
166
  * Example: \include MatrixBase_colwise.cpp
152
167
  * Output: \verbinclude MatrixBase_colwise.out
153
168
  *
169
+ * The begin() and end() methods are obviously exceptions to the previous rule as they
170
+ * return STL-compatible begin/end iterators to the rows or columns of the nested expression.
171
+ * Typical use cases include for-range-loop and calls to STL algorithms:
172
+ *
173
+ * Example: \include MatrixBase_colwise_iterator_cxx11.cpp
174
+ * Output: \verbinclude MatrixBase_colwise_iterator_cxx11.out
175
+ *
176
+ * For a partial reduction on an empty input, some rules apply.
177
+ * For the sake of clarity, let's consider a vertical reduction:
178
+ * - If the number of columns is zero, then a 1x0 row-major vector expression is returned.
179
+ * - Otherwise, if the number of rows is zero, then
180
+ * - a row vector of zeros is returned for sum-like reductions (sum, squaredNorm, norm, etc.)
181
+ * - a row vector of ones is returned for a product reduction (e.g., <code>MatrixXd(n,0).colwise().prod()</code>)
182
+ * - an assert is triggered for all other reductions (minCoeff,maxCoeff,redux(bin_op))
183
+ *
154
184
  * \sa DenseBase::colwise(), DenseBase::rowwise(), class PartialReduxExpr
155
185
  */
156
186
  template<typename ExpressionType, int Direction> class VectorwiseOp
@@ -163,11 +193,11 @@ template<typename ExpressionType, int Direction> class VectorwiseOp
163
193
  typedef typename internal::ref_selector<ExpressionType>::non_const_type ExpressionTypeNested;
164
194
  typedef typename internal::remove_all<ExpressionTypeNested>::type ExpressionTypeNestedCleaned;
165
195
 
166
- template<template<typename _Scalar> class Functor,
167
- typename Scalar_=Scalar> struct ReturnType
196
+ template<template<typename OutScalar,typename InputScalar> class Functor,
197
+ typename ReturnScalar=Scalar> struct ReturnType
168
198
  {
169
199
  typedef PartialReduxExpr<ExpressionType,
170
- Functor<Scalar_>,
200
+ Functor<ReturnScalar,Scalar>,
171
201
  Direction
172
202
  > Type;
173
203
  };
@@ -187,23 +217,6 @@ template<typename ExpressionType, int Direction> class VectorwiseOp
187
217
 
188
218
  protected:
189
219
 
190
- typedef typename internal::conditional<isVertical,
191
- typename ExpressionType::ColXpr,
192
- typename ExpressionType::RowXpr>::type SubVector;
193
- /** \internal
194
- * \returns the i-th subvector according to the \c Direction */
195
- EIGEN_DEVICE_FUNC
196
- SubVector subVector(Index i)
197
- {
198
- return SubVector(m_matrix.derived(),i);
199
- }
200
-
201
- /** \internal
202
- * \returns the number of subvectors in the direction \c Direction */
203
- EIGEN_DEVICE_FUNC
204
- Index subVectors() const
205
- { return isVertical?m_matrix.cols():m_matrix.rows(); }
206
-
207
220
  template<typename OtherDerived> struct ExtendedType {
208
221
  typedef Replicate<OtherDerived,
209
222
  isVertical ? 1 : ExpressionType::RowsAtCompileTime,
@@ -258,42 +271,101 @@ template<typename ExpressionType, int Direction> class VectorwiseOp
258
271
  EIGEN_DEVICE_FUNC
259
272
  inline const ExpressionType& _expression() const { return m_matrix; }
260
273
 
274
+ #ifdef EIGEN_PARSED_BY_DOXYGEN
275
+ /** STL-like <a href="https://en.cppreference.com/w/cpp/named_req/RandomAccessIterator">RandomAccessIterator</a>
276
+ * iterator type over the columns or rows as returned by the begin() and end() methods.
277
+ */
278
+ random_access_iterator_type iterator;
279
+ /** This is the const version of iterator (aka read-only) */
280
+ random_access_iterator_type const_iterator;
281
+ #else
282
+ typedef internal::subvector_stl_iterator<ExpressionType, DirectionType(Direction)> iterator;
283
+ typedef internal::subvector_stl_iterator<const ExpressionType, DirectionType(Direction)> const_iterator;
284
+ typedef internal::subvector_stl_reverse_iterator<ExpressionType, DirectionType(Direction)> reverse_iterator;
285
+ typedef internal::subvector_stl_reverse_iterator<const ExpressionType, DirectionType(Direction)> const_reverse_iterator;
286
+ #endif
287
+
288
+ /** returns an iterator to the first row (rowwise) or column (colwise) of the nested expression.
289
+ * \sa end(), cbegin()
290
+ */
291
+ iterator begin() { return iterator (m_matrix, 0); }
292
+ /** const version of begin() */
293
+ const_iterator begin() const { return const_iterator(m_matrix, 0); }
294
+ /** const version of begin() */
295
+ const_iterator cbegin() const { return const_iterator(m_matrix, 0); }
296
+
297
+ /** returns a reverse iterator to the last row (rowwise) or column (colwise) of the nested expression.
298
+ * \sa rend(), crbegin()
299
+ */
300
+ reverse_iterator rbegin() { return reverse_iterator (m_matrix, m_matrix.template subVectors<DirectionType(Direction)>()-1); }
301
+ /** const version of rbegin() */
302
+ const_reverse_iterator rbegin() const { return const_reverse_iterator (m_matrix, m_matrix.template subVectors<DirectionType(Direction)>()-1); }
303
+ /** const version of rbegin() */
304
+ const_reverse_iterator crbegin() const { return const_reverse_iterator (m_matrix, m_matrix.template subVectors<DirectionType(Direction)>()-1); }
305
+
306
+ /** returns an iterator to the row (resp. column) following the last row (resp. column) of the nested expression
307
+ * \sa begin(), cend()
308
+ */
309
+ iterator end() { return iterator (m_matrix, m_matrix.template subVectors<DirectionType(Direction)>()); }
310
+ /** const version of end() */
311
+ const_iterator end() const { return const_iterator(m_matrix, m_matrix.template subVectors<DirectionType(Direction)>()); }
312
+ /** const version of end() */
313
+ const_iterator cend() const { return const_iterator(m_matrix, m_matrix.template subVectors<DirectionType(Direction)>()); }
314
+
315
+ /** returns a reverse iterator to the row (resp. column) before the first row (resp. column) of the nested expression
316
+ * \sa begin(), cend()
317
+ */
318
+ reverse_iterator rend() { return reverse_iterator (m_matrix, -1); }
319
+ /** const version of rend() */
320
+ const_reverse_iterator rend() const { return const_reverse_iterator (m_matrix, -1); }
321
+ /** const version of rend() */
322
+ const_reverse_iterator crend() const { return const_reverse_iterator (m_matrix, -1); }
323
+
261
324
  /** \returns a row or column vector expression of \c *this reduxed by \a func
262
325
  *
263
326
  * The template parameter \a BinaryOp is the type of the functor
264
327
  * of the custom redux operator. Note that func must be an associative operator.
265
328
  *
329
+ * \warning the size along the reduction direction must be strictly positive,
330
+ * otherwise an assertion is triggered.
331
+ *
266
332
  * \sa class VectorwiseOp, DenseBase::colwise(), DenseBase::rowwise()
267
333
  */
268
334
  template<typename BinaryOp>
269
335
  EIGEN_DEVICE_FUNC
270
336
  const typename ReduxReturnType<BinaryOp>::Type
271
337
  redux(const BinaryOp& func = BinaryOp()) const
272
- { return typename ReduxReturnType<BinaryOp>::Type(_expression(), internal::member_redux<BinaryOp,Scalar>(func)); }
338
+ {
339
+ eigen_assert(redux_length()>0 && "you are using an empty matrix");
340
+ return typename ReduxReturnType<BinaryOp>::Type(_expression(), internal::member_redux<BinaryOp,Scalar>(func));
341
+ }
273
342
 
274
343
  typedef typename ReturnType<internal::member_minCoeff>::Type MinCoeffReturnType;
275
344
  typedef typename ReturnType<internal::member_maxCoeff>::Type MaxCoeffReturnType;
276
- typedef typename ReturnType<internal::member_squaredNorm,RealScalar>::Type SquaredNormReturnType;
277
- typedef typename ReturnType<internal::member_norm,RealScalar>::Type NormReturnType;
345
+ typedef PartialReduxExpr<const CwiseUnaryOp<internal::scalar_abs2_op<Scalar>, const ExpressionTypeNestedCleaned>,internal::member_sum<RealScalar,RealScalar>,Direction> SquaredNormReturnType;
346
+ typedef CwiseUnaryOp<internal::scalar_sqrt_op<RealScalar>, const SquaredNormReturnType> NormReturnType;
278
347
  typedef typename ReturnType<internal::member_blueNorm,RealScalar>::Type BlueNormReturnType;
279
348
  typedef typename ReturnType<internal::member_stableNorm,RealScalar>::Type StableNormReturnType;
280
349
  typedef typename ReturnType<internal::member_hypotNorm,RealScalar>::Type HypotNormReturnType;
281
350
  typedef typename ReturnType<internal::member_sum>::Type SumReturnType;
282
- typedef typename ReturnType<internal::member_mean>::Type MeanReturnType;
351
+ typedef EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(SumReturnType,Scalar,quotient) MeanReturnType;
283
352
  typedef typename ReturnType<internal::member_all>::Type AllReturnType;
284
353
  typedef typename ReturnType<internal::member_any>::Type AnyReturnType;
285
- typedef PartialReduxExpr<ExpressionType, internal::member_count<Index>, Direction> CountReturnType;
354
+ typedef PartialReduxExpr<ExpressionType, internal::member_count<Index,Scalar>, Direction> CountReturnType;
286
355
  typedef typename ReturnType<internal::member_prod>::Type ProdReturnType;
287
356
  typedef Reverse<const ExpressionType, Direction> ConstReverseReturnType;
288
357
  typedef Reverse<ExpressionType, Direction> ReverseReturnType;
289
358
 
290
359
  template<int p> struct LpNormReturnType {
291
- typedef PartialReduxExpr<ExpressionType, internal::member_lpnorm<p,RealScalar>,Direction> Type;
360
+ typedef PartialReduxExpr<ExpressionType, internal::member_lpnorm<p,RealScalar,Scalar>,Direction> Type;
292
361
  };
293
362
 
294
363
  /** \returns a row (or column) vector expression of the smallest coefficient
295
364
  * of each column (or row) of the referenced expression.
296
365
  *
366
+ * \warning the size along the reduction direction must be strictly positive,
367
+ * otherwise an assertion is triggered.
368
+ *
297
369
  * \warning the result is undefined if \c *this contains NaN.
298
370
  *
299
371
  * Example: \include PartialRedux_minCoeff.cpp
@@ -302,11 +374,17 @@ template<typename ExpressionType, int Direction> class VectorwiseOp
302
374
  * \sa DenseBase::minCoeff() */
303
375
  EIGEN_DEVICE_FUNC
304
376
  const MinCoeffReturnType minCoeff() const
305
- { return MinCoeffReturnType(_expression()); }
377
+ {
378
+ eigen_assert(redux_length()>0 && "you are using an empty matrix");
379
+ return MinCoeffReturnType(_expression());
380
+ }
306
381
 
307
382
  /** \returns a row (or column) vector expression of the largest coefficient
308
383
  * of each column (or row) of the referenced expression.
309
384
  *
385
+ * \warning the size along the reduction direction must be strictly positive,
386
+ * otherwise an assertion is triggered.
387
+ *
310
388
  * \warning the result is undefined if \c *this contains NaN.
311
389
  *
312
390
  * Example: \include PartialRedux_maxCoeff.cpp
@@ -315,7 +393,10 @@ template<typename ExpressionType, int Direction> class VectorwiseOp
315
393
  * \sa DenseBase::maxCoeff() */
316
394
  EIGEN_DEVICE_FUNC
317
395
  const MaxCoeffReturnType maxCoeff() const
318
- { return MaxCoeffReturnType(_expression()); }
396
+ {
397
+ eigen_assert(redux_length()>0 && "you are using an empty matrix");
398
+ return MaxCoeffReturnType(_expression());
399
+ }
319
400
 
320
401
  /** \returns a row (or column) vector expression of the squared norm
321
402
  * of each column (or row) of the referenced expression.
@@ -327,7 +408,7 @@ template<typename ExpressionType, int Direction> class VectorwiseOp
327
408
  * \sa DenseBase::squaredNorm() */
328
409
  EIGEN_DEVICE_FUNC
329
410
  const SquaredNormReturnType squaredNorm() const
330
- { return SquaredNormReturnType(_expression()); }
411
+ { return SquaredNormReturnType(m_matrix.cwiseAbs2()); }
331
412
 
332
413
  /** \returns a row (or column) vector expression of the norm
333
414
  * of each column (or row) of the referenced expression.
@@ -339,7 +420,7 @@ template<typename ExpressionType, int Direction> class VectorwiseOp
339
420
  * \sa DenseBase::norm() */
340
421
  EIGEN_DEVICE_FUNC
341
422
  const NormReturnType norm() const
342
- { return NormReturnType(_expression()); }
423
+ { return NormReturnType(squaredNorm()); }
343
424
 
344
425
  /** \returns a row (or column) vector expression of the norm
345
426
  * of each column (or row) of the referenced expression.
@@ -404,7 +485,7 @@ template<typename ExpressionType, int Direction> class VectorwiseOp
404
485
  * \sa DenseBase::mean() */
405
486
  EIGEN_DEVICE_FUNC
406
487
  const MeanReturnType mean() const
407
- { return MeanReturnType(_expression()); }
488
+ { return sum() / Scalar(Direction==Vertical?m_matrix.rows():m_matrix.cols()); }
408
489
 
409
490
  /** \returns a row (or column) vector expression representing
410
491
  * whether \b all coefficients of each respective column (or row) are \c true.
@@ -500,7 +581,7 @@ template<typename ExpressionType, int Direction> class VectorwiseOp
500
581
  EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
501
582
  EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
502
583
  //eigen_assert((m_matrix.isNull()) == (other.isNull())); FIXME
503
- return const_cast<ExpressionType&>(m_matrix = extendedTo(other.derived()));
584
+ return m_matrix = extendedTo(other.derived());
504
585
  }
505
586
 
506
587
  /** Adds the vector \a other to each subvector of \c *this */
@@ -510,7 +591,7 @@ template<typename ExpressionType, int Direction> class VectorwiseOp
510
591
  {
511
592
  EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
512
593
  EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
513
- return const_cast<ExpressionType&>(m_matrix += extendedTo(other.derived()));
594
+ return m_matrix += extendedTo(other.derived());
514
595
  }
515
596
 
516
597
  /** Substracts the vector \a other to each subvector of \c *this */
@@ -520,7 +601,7 @@ template<typename ExpressionType, int Direction> class VectorwiseOp
520
601
  {
521
602
  EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
522
603
  EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
523
- return const_cast<ExpressionType&>(m_matrix -= extendedTo(other.derived()));
604
+ return m_matrix -= extendedTo(other.derived());
524
605
  }
525
606
 
526
607
  /** Multiples each subvector of \c *this by the vector \a other */
@@ -532,7 +613,7 @@ template<typename ExpressionType, int Direction> class VectorwiseOp
532
613
  EIGEN_STATIC_ASSERT_ARRAYXPR(ExpressionType)
533
614
  EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
534
615
  m_matrix *= extendedTo(other.derived());
535
- return const_cast<ExpressionType&>(m_matrix);
616
+ return m_matrix;
536
617
  }
537
618
 
538
619
  /** Divides each subvector of \c *this by the vector \a other */
@@ -544,7 +625,7 @@ template<typename ExpressionType, int Direction> class VectorwiseOp
544
625
  EIGEN_STATIC_ASSERT_ARRAYXPR(ExpressionType)
545
626
  EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
546
627
  m_matrix /= extendedTo(other.derived());
547
- return const_cast<ExpressionType&>(m_matrix);
628
+ return m_matrix;
548
629
  }
549
630
 
550
631
  /** Returns the expression of the sum of the vector \a other to each subvector of \c *this */
@@ -609,7 +690,7 @@ template<typename ExpressionType, int Direction> class VectorwiseOp
609
690
  EIGEN_DEVICE_FUNC
610
691
  CwiseBinaryOp<internal::scalar_quotient_op<Scalar>,
611
692
  const ExpressionTypeNestedCleaned,
612
- const typename OppositeExtendedType<typename ReturnType<internal::member_norm,RealScalar>::Type>::Type>
693
+ const typename OppositeExtendedType<NormReturnType>::Type>
613
694
  normalized() const { return m_matrix.cwiseQuotient(extendedToOpposite(this->norm())); }
614
695
 
615
696
 
@@ -658,7 +739,15 @@ template<typename ExpressionType, int Direction> class VectorwiseOp
658
739
  EIGEN_DEVICE_FUNC
659
740
  const HNormalizedReturnType hnormalized() const;
660
741
 
742
+ # ifdef EIGEN_VECTORWISEOP_PLUGIN
743
+ # include EIGEN_VECTORWISEOP_PLUGIN
744
+ # endif
745
+
661
746
  protected:
747
+ Index redux_length() const
748
+ {
749
+ return Direction==Vertical ? m_matrix.rows() : m_matrix.cols();
750
+ }
662
751
  ExpressionTypeNested m_matrix;
663
752
  };
664
753
 
@@ -670,7 +759,7 @@ template<typename ExpressionType, int Direction> class VectorwiseOp
670
759
  * \sa rowwise(), class VectorwiseOp, \ref TutorialReductionsVisitorsBroadcasting
671
760
  */
672
761
  template<typename Derived>
673
- inline typename DenseBase<Derived>::ColwiseReturnType
762
+ EIGEN_DEVICE_FUNC inline typename DenseBase<Derived>::ColwiseReturnType
674
763
  DenseBase<Derived>::colwise()
675
764
  {
676
765
  return ColwiseReturnType(derived());
@@ -684,7 +773,7 @@ DenseBase<Derived>::colwise()
684
773
  * \sa colwise(), class VectorwiseOp, \ref TutorialReductionsVisitorsBroadcasting
685
774
  */
686
775
  template<typename Derived>
687
- inline typename DenseBase<Derived>::RowwiseReturnType
776
+ EIGEN_DEVICE_FUNC inline typename DenseBase<Derived>::RowwiseReturnType
688
777
  DenseBase<Derived>::rowwise()
689
778
  {
690
779
  return RowwiseReturnType(derived());