@smake/eigen 1.1.0 → 1.1.1

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 (431) hide show
  1. package/README.md +1 -1
  2. package/eigen/Eigen/AccelerateSupport +52 -0
  3. package/eigen/Eigen/Cholesky +18 -20
  4. package/eigen/Eigen/CholmodSupport +28 -28
  5. package/eigen/Eigen/Core +187 -120
  6. package/eigen/Eigen/Eigenvalues +16 -13
  7. package/eigen/Eigen/Geometry +18 -18
  8. package/eigen/Eigen/Householder +9 -7
  9. package/eigen/Eigen/IterativeLinearSolvers +8 -4
  10. package/eigen/Eigen/Jacobi +14 -13
  11. package/eigen/Eigen/KLUSupport +23 -21
  12. package/eigen/Eigen/LU +15 -16
  13. package/eigen/Eigen/MetisSupport +12 -12
  14. package/eigen/Eigen/OrderingMethods +54 -51
  15. package/eigen/Eigen/PaStiXSupport +23 -21
  16. package/eigen/Eigen/PardisoSupport +17 -14
  17. package/eigen/Eigen/QR +18 -20
  18. package/eigen/Eigen/QtAlignedMalloc +5 -12
  19. package/eigen/Eigen/SPQRSupport +21 -14
  20. package/eigen/Eigen/SVD +23 -17
  21. package/eigen/Eigen/Sparse +1 -2
  22. package/eigen/Eigen/SparseCholesky +18 -15
  23. package/eigen/Eigen/SparseCore +18 -17
  24. package/eigen/Eigen/SparseLU +9 -9
  25. package/eigen/Eigen/SparseQR +16 -14
  26. package/eigen/Eigen/StdDeque +5 -2
  27. package/eigen/Eigen/StdList +5 -2
  28. package/eigen/Eigen/StdVector +5 -2
  29. package/eigen/Eigen/SuperLUSupport +30 -24
  30. package/eigen/Eigen/ThreadPool +80 -0
  31. package/eigen/Eigen/UmfPackSupport +19 -17
  32. package/eigen/Eigen/Version +14 -0
  33. package/eigen/Eigen/src/AccelerateSupport/AccelerateSupport.h +423 -0
  34. package/eigen/Eigen/src/AccelerateSupport/InternalHeaderCheck.h +3 -0
  35. package/eigen/Eigen/src/Cholesky/InternalHeaderCheck.h +3 -0
  36. package/eigen/Eigen/src/Cholesky/LDLT.h +366 -405
  37. package/eigen/Eigen/src/Cholesky/LLT.h +323 -367
  38. package/eigen/Eigen/src/Cholesky/LLT_LAPACKE.h +81 -56
  39. package/eigen/Eigen/src/CholmodSupport/CholmodSupport.h +585 -529
  40. package/eigen/Eigen/src/CholmodSupport/InternalHeaderCheck.h +3 -0
  41. package/eigen/Eigen/src/Core/ArithmeticSequence.h +143 -317
  42. package/eigen/Eigen/src/Core/Array.h +329 -370
  43. package/eigen/Eigen/src/Core/ArrayBase.h +190 -203
  44. package/eigen/Eigen/src/Core/ArrayWrapper.h +126 -170
  45. package/eigen/Eigen/src/Core/Assign.h +30 -40
  46. package/eigen/Eigen/src/Core/AssignEvaluator.h +651 -604
  47. package/eigen/Eigen/src/Core/Assign_MKL.h +125 -120
  48. package/eigen/Eigen/src/Core/BandMatrix.h +267 -282
  49. package/eigen/Eigen/src/Core/Block.h +371 -390
  50. package/eigen/Eigen/src/Core/CommaInitializer.h +85 -100
  51. package/eigen/Eigen/src/Core/ConditionEstimator.h +51 -53
  52. package/eigen/Eigen/src/Core/CoreEvaluators.h +1214 -937
  53. package/eigen/Eigen/src/Core/CoreIterators.h +72 -63
  54. package/eigen/Eigen/src/Core/CwiseBinaryOp.h +112 -129
  55. package/eigen/Eigen/src/Core/CwiseNullaryOp.h +676 -702
  56. package/eigen/Eigen/src/Core/CwiseTernaryOp.h +77 -103
  57. package/eigen/Eigen/src/Core/CwiseUnaryOp.h +55 -67
  58. package/eigen/Eigen/src/Core/CwiseUnaryView.h +127 -92
  59. package/eigen/Eigen/src/Core/DenseBase.h +630 -658
  60. package/eigen/Eigen/src/Core/DenseCoeffsBase.h +511 -628
  61. package/eigen/Eigen/src/Core/DenseStorage.h +511 -590
  62. package/eigen/Eigen/src/Core/DeviceWrapper.h +153 -0
  63. package/eigen/Eigen/src/Core/Diagonal.h +168 -207
  64. package/eigen/Eigen/src/Core/DiagonalMatrix.h +346 -317
  65. package/eigen/Eigen/src/Core/DiagonalProduct.h +12 -10
  66. package/eigen/Eigen/src/Core/Dot.h +167 -217
  67. package/eigen/Eigen/src/Core/EigenBase.h +74 -85
  68. package/eigen/Eigen/src/Core/Fill.h +138 -0
  69. package/eigen/Eigen/src/Core/FindCoeff.h +464 -0
  70. package/eigen/Eigen/src/Core/ForceAlignedAccess.h +90 -113
  71. package/eigen/Eigen/src/Core/Fuzzy.h +82 -105
  72. package/eigen/Eigen/src/Core/GeneralProduct.h +315 -261
  73. package/eigen/Eigen/src/Core/GenericPacketMath.h +1182 -520
  74. package/eigen/Eigen/src/Core/GlobalFunctions.h +193 -157
  75. package/eigen/Eigen/src/Core/IO.h +131 -156
  76. package/eigen/Eigen/src/Core/IndexedView.h +209 -125
  77. package/eigen/Eigen/src/Core/InnerProduct.h +260 -0
  78. package/eigen/Eigen/src/Core/InternalHeaderCheck.h +3 -0
  79. package/eigen/Eigen/src/Core/Inverse.h +50 -59
  80. package/eigen/Eigen/src/Core/Map.h +123 -141
  81. package/eigen/Eigen/src/Core/MapBase.h +255 -282
  82. package/eigen/Eigen/src/Core/MathFunctions.h +1247 -1201
  83. package/eigen/Eigen/src/Core/MathFunctionsImpl.h +162 -99
  84. package/eigen/Eigen/src/Core/Matrix.h +463 -494
  85. package/eigen/Eigen/src/Core/MatrixBase.h +468 -470
  86. package/eigen/Eigen/src/Core/NestByValue.h +58 -52
  87. package/eigen/Eigen/src/Core/NoAlias.h +79 -86
  88. package/eigen/Eigen/src/Core/NumTraits.h +206 -206
  89. package/eigen/Eigen/src/Core/PartialReduxEvaluator.h +163 -142
  90. package/eigen/Eigen/src/Core/PermutationMatrix.h +461 -511
  91. package/eigen/Eigen/src/Core/PlainObjectBase.h +858 -972
  92. package/eigen/Eigen/src/Core/Product.h +246 -130
  93. package/eigen/Eigen/src/Core/ProductEvaluators.h +779 -671
  94. package/eigen/Eigen/src/Core/Random.h +153 -164
  95. package/eigen/Eigen/src/Core/RandomImpl.h +262 -0
  96. package/eigen/Eigen/src/Core/RealView.h +250 -0
  97. package/eigen/Eigen/src/Core/Redux.h +334 -314
  98. package/eigen/Eigen/src/Core/Ref.h +259 -257
  99. package/eigen/Eigen/src/Core/Replicate.h +92 -104
  100. package/eigen/Eigen/src/Core/Reshaped.h +215 -271
  101. package/eigen/Eigen/src/Core/ReturnByValue.h +47 -55
  102. package/eigen/Eigen/src/Core/Reverse.h +133 -148
  103. package/eigen/Eigen/src/Core/Select.h +68 -140
  104. package/eigen/Eigen/src/Core/SelfAdjointView.h +254 -290
  105. package/eigen/Eigen/src/Core/SelfCwiseBinaryOp.h +23 -20
  106. package/eigen/Eigen/src/Core/SkewSymmetricMatrix3.h +382 -0
  107. package/eigen/Eigen/src/Core/Solve.h +88 -102
  108. package/eigen/Eigen/src/Core/SolveTriangular.h +126 -124
  109. package/eigen/Eigen/src/Core/SolverBase.h +132 -133
  110. package/eigen/Eigen/src/Core/StableNorm.h +113 -147
  111. package/eigen/Eigen/src/Core/StlIterators.h +404 -248
  112. package/eigen/Eigen/src/Core/Stride.h +90 -92
  113. package/eigen/Eigen/src/Core/Swap.h +70 -39
  114. package/eigen/Eigen/src/Core/Transpose.h +258 -295
  115. package/eigen/Eigen/src/Core/Transpositions.h +270 -333
  116. package/eigen/Eigen/src/Core/TriangularMatrix.h +642 -743
  117. package/eigen/Eigen/src/Core/VectorBlock.h +59 -72
  118. package/eigen/Eigen/src/Core/VectorwiseOp.h +653 -704
  119. package/eigen/Eigen/src/Core/Visitor.h +464 -308
  120. package/eigen/Eigen/src/Core/arch/AVX/Complex.h +380 -187
  121. package/eigen/Eigen/src/Core/arch/AVX/MathFunctions.h +65 -163
  122. package/eigen/Eigen/src/Core/arch/AVX/PacketMath.h +2145 -638
  123. package/eigen/Eigen/src/Core/arch/AVX/Reductions.h +353 -0
  124. package/eigen/Eigen/src/Core/arch/AVX/TypeCasting.h +253 -60
  125. package/eigen/Eigen/src/Core/arch/AVX512/Complex.h +278 -228
  126. package/eigen/Eigen/src/Core/arch/AVX512/GemmKernel.h +1245 -0
  127. package/eigen/Eigen/src/Core/arch/AVX512/MathFunctions.h +48 -269
  128. package/eigen/Eigen/src/Core/arch/AVX512/MathFunctionsFP16.h +75 -0
  129. package/eigen/Eigen/src/Core/arch/AVX512/PacketMath.h +1597 -754
  130. package/eigen/Eigen/src/Core/arch/AVX512/PacketMathFP16.h +1413 -0
  131. package/eigen/Eigen/src/Core/arch/AVX512/Reductions.h +297 -0
  132. package/eigen/Eigen/src/Core/arch/AVX512/TrsmKernel.h +1167 -0
  133. package/eigen/Eigen/src/Core/arch/AVX512/TrsmUnrolls.inc +1219 -0
  134. package/eigen/Eigen/src/Core/arch/AVX512/TypeCasting.h +229 -41
  135. package/eigen/Eigen/src/Core/arch/AVX512/TypeCastingFP16.h +130 -0
  136. package/eigen/Eigen/src/Core/arch/AltiVec/Complex.h +420 -184
  137. package/eigen/Eigen/src/Core/arch/AltiVec/MathFunctions.h +40 -49
  138. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProduct.h +2962 -2213
  139. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h +196 -212
  140. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductMMA.h +713 -441
  141. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductMMAbfloat16.h +742 -0
  142. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixVectorProduct.inc +2818 -0
  143. package/eigen/Eigen/src/Core/arch/AltiVec/PacketMath.h +2380 -1362
  144. package/eigen/Eigen/src/Core/arch/AltiVec/TypeCasting.h +153 -0
  145. package/eigen/Eigen/src/Core/arch/Default/BFloat16.h +390 -224
  146. package/eigen/Eigen/src/Core/arch/Default/ConjHelper.h +78 -67
  147. package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h +1784 -799
  148. package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h +167 -50
  149. package/eigen/Eigen/src/Core/arch/Default/Half.h +528 -379
  150. package/eigen/Eigen/src/Core/arch/Default/Settings.h +10 -12
  151. package/eigen/Eigen/src/Core/arch/GPU/Complex.h +244 -0
  152. package/eigen/Eigen/src/Core/arch/GPU/MathFunctions.h +41 -40
  153. package/eigen/Eigen/src/Core/arch/GPU/PacketMath.h +550 -523
  154. package/eigen/Eigen/src/Core/arch/GPU/Tuple.h +268 -0
  155. package/eigen/Eigen/src/Core/arch/GPU/TypeCasting.h +27 -30
  156. package/eigen/Eigen/src/Core/arch/HIP/hcc/math_constants.h +8 -8
  157. package/eigen/Eigen/src/Core/arch/HVX/PacketMath.h +1088 -0
  158. package/eigen/Eigen/src/Core/arch/LSX/Complex.h +520 -0
  159. package/eigen/Eigen/src/Core/arch/LSX/GeneralBlockPanelKernel.h +23 -0
  160. package/eigen/Eigen/src/Core/arch/LSX/MathFunctions.h +43 -0
  161. package/eigen/Eigen/src/Core/arch/LSX/PacketMath.h +2866 -0
  162. package/eigen/Eigen/src/Core/arch/LSX/TypeCasting.h +526 -0
  163. package/eigen/Eigen/src/Core/arch/MSA/Complex.h +54 -82
  164. package/eigen/Eigen/src/Core/arch/MSA/MathFunctions.h +84 -92
  165. package/eigen/Eigen/src/Core/arch/MSA/PacketMath.h +51 -47
  166. package/eigen/Eigen/src/Core/arch/NEON/Complex.h +454 -306
  167. package/eigen/Eigen/src/Core/arch/NEON/GeneralBlockPanelKernel.h +175 -115
  168. package/eigen/Eigen/src/Core/arch/NEON/MathFunctions.h +23 -30
  169. package/eigen/Eigen/src/Core/arch/NEON/PacketMath.h +4366 -2857
  170. package/eigen/Eigen/src/Core/arch/NEON/TypeCasting.h +616 -393
  171. package/eigen/Eigen/src/Core/arch/NEON/UnaryFunctors.h +57 -0
  172. package/eigen/Eigen/src/Core/arch/SSE/Complex.h +350 -198
  173. package/eigen/Eigen/src/Core/arch/SSE/MathFunctions.h +38 -149
  174. package/eigen/Eigen/src/Core/arch/SSE/PacketMath.h +1791 -912
  175. package/eigen/Eigen/src/Core/arch/SSE/Reductions.h +324 -0
  176. package/eigen/Eigen/src/Core/arch/SSE/TypeCasting.h +128 -40
  177. package/eigen/Eigen/src/Core/arch/SVE/MathFunctions.h +10 -6
  178. package/eigen/Eigen/src/Core/arch/SVE/PacketMath.h +156 -234
  179. package/eigen/Eigen/src/Core/arch/SVE/TypeCasting.h +6 -3
  180. package/eigen/Eigen/src/Core/arch/SYCL/InteropHeaders.h +27 -32
  181. package/eigen/Eigen/src/Core/arch/SYCL/MathFunctions.h +119 -117
  182. package/eigen/Eigen/src/Core/arch/SYCL/PacketMath.h +325 -419
  183. package/eigen/Eigen/src/Core/arch/SYCL/TypeCasting.h +15 -17
  184. package/eigen/Eigen/src/Core/arch/ZVector/Complex.h +325 -181
  185. package/eigen/Eigen/src/Core/arch/ZVector/MathFunctions.h +94 -83
  186. package/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h +811 -458
  187. package/eigen/Eigen/src/Core/functors/AssignmentFunctors.h +121 -124
  188. package/eigen/Eigen/src/Core/functors/BinaryFunctors.h +576 -370
  189. package/eigen/Eigen/src/Core/functors/NullaryFunctors.h +194 -109
  190. package/eigen/Eigen/src/Core/functors/StlFunctors.h +95 -112
  191. package/eigen/Eigen/src/Core/functors/TernaryFunctors.h +34 -7
  192. package/eigen/Eigen/src/Core/functors/UnaryFunctors.h +1038 -749
  193. package/eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h +1883 -1375
  194. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix.h +312 -370
  195. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +189 -176
  196. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h +84 -81
  197. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix_BLAS.h +154 -73
  198. package/eigen/Eigen/src/Core/products/GeneralMatrixVector.h +292 -337
  199. package/eigen/Eigen/src/Core/products/GeneralMatrixVector_BLAS.h +80 -77
  200. package/eigen/Eigen/src/Core/products/Parallelizer.h +207 -105
  201. package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +327 -388
  202. package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix_BLAS.h +206 -224
  203. package/eigen/Eigen/src/Core/products/SelfadjointMatrixVector.h +138 -147
  204. package/eigen/Eigen/src/Core/products/SelfadjointMatrixVector_BLAS.h +58 -61
  205. package/eigen/Eigen/src/Core/products/SelfadjointProduct.h +71 -71
  206. package/eigen/Eigen/src/Core/products/SelfadjointRank2Update.h +48 -47
  207. package/eigen/Eigen/src/Core/products/TriangularMatrixMatrix.h +294 -369
  208. package/eigen/Eigen/src/Core/products/TriangularMatrixMatrix_BLAS.h +246 -238
  209. package/eigen/Eigen/src/Core/products/TriangularMatrixVector.h +244 -247
  210. package/eigen/Eigen/src/Core/products/TriangularMatrixVector_BLAS.h +212 -192
  211. package/eigen/Eigen/src/Core/products/TriangularSolverMatrix.h +328 -277
  212. package/eigen/Eigen/src/Core/products/TriangularSolverMatrix_BLAS.h +108 -109
  213. package/eigen/Eigen/src/Core/products/TriangularSolverVector.h +68 -94
  214. package/eigen/Eigen/src/Core/util/Assert.h +158 -0
  215. package/eigen/Eigen/src/Core/util/BlasUtil.h +342 -303
  216. package/eigen/Eigen/src/Core/util/ConfigureVectorization.h +348 -317
  217. package/eigen/Eigen/src/Core/util/Constants.h +297 -262
  218. package/eigen/Eigen/src/Core/util/DisableStupidWarnings.h +130 -90
  219. package/eigen/Eigen/src/Core/util/EmulateArray.h +270 -0
  220. package/eigen/Eigen/src/Core/util/ForwardDeclarations.h +449 -247
  221. package/eigen/Eigen/src/Core/util/GpuHipCudaDefines.inc +101 -0
  222. package/eigen/Eigen/src/Core/util/GpuHipCudaUndefines.inc +45 -0
  223. package/eigen/Eigen/src/Core/util/IndexedViewHelper.h +417 -116
  224. package/eigen/Eigen/src/Core/util/IntegralConstant.h +211 -204
  225. package/eigen/Eigen/src/Core/util/MKL_support.h +39 -37
  226. package/eigen/Eigen/src/Core/util/Macros.h +655 -773
  227. package/eigen/Eigen/src/Core/util/MaxSizeVector.h +139 -0
  228. package/eigen/Eigen/src/Core/util/Memory.h +970 -748
  229. package/eigen/Eigen/src/Core/util/Meta.h +581 -633
  230. package/eigen/Eigen/src/Core/util/MoreMeta.h +638 -0
  231. package/eigen/Eigen/src/Core/util/ReenableStupidWarnings.h +32 -19
  232. package/eigen/Eigen/src/Core/util/ReshapedHelper.h +17 -17
  233. package/eigen/Eigen/src/Core/util/Serializer.h +209 -0
  234. package/eigen/Eigen/src/Core/util/StaticAssert.h +50 -166
  235. package/eigen/Eigen/src/Core/util/SymbolicIndex.h +377 -225
  236. package/eigen/Eigen/src/Core/util/XprHelper.h +784 -547
  237. package/eigen/Eigen/src/Eigenvalues/ComplexEigenSolver.h +246 -277
  238. package/eigen/Eigen/src/Eigenvalues/ComplexSchur.h +299 -319
  239. package/eigen/Eigen/src/Eigenvalues/ComplexSchur_LAPACKE.h +52 -48
  240. package/eigen/Eigen/src/Eigenvalues/EigenSolver.h +413 -456
  241. package/eigen/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h +309 -325
  242. package/eigen/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h +157 -171
  243. package/eigen/Eigen/src/Eigenvalues/HessenbergDecomposition.h +292 -310
  244. package/eigen/Eigen/src/Eigenvalues/InternalHeaderCheck.h +3 -0
  245. package/eigen/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h +89 -105
  246. package/eigen/Eigen/src/Eigenvalues/RealQZ.h +537 -607
  247. package/eigen/Eigen/src/Eigenvalues/RealSchur.h +342 -381
  248. package/eigen/Eigen/src/Eigenvalues/RealSchur_LAPACKE.h +41 -35
  249. package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +541 -595
  250. package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_LAPACKE.h +47 -44
  251. package/eigen/Eigen/src/Eigenvalues/Tridiagonalization.h +430 -462
  252. package/eigen/Eigen/src/Geometry/AlignedBox.h +226 -227
  253. package/eigen/Eigen/src/Geometry/AngleAxis.h +131 -133
  254. package/eigen/Eigen/src/Geometry/EulerAngles.h +163 -74
  255. package/eigen/Eigen/src/Geometry/Homogeneous.h +285 -333
  256. package/eigen/Eigen/src/Geometry/Hyperplane.h +151 -160
  257. package/eigen/Eigen/src/Geometry/InternalHeaderCheck.h +3 -0
  258. package/eigen/Eigen/src/Geometry/OrthoMethods.h +168 -146
  259. package/eigen/Eigen/src/Geometry/ParametrizedLine.h +127 -127
  260. package/eigen/Eigen/src/Geometry/Quaternion.h +566 -506
  261. package/eigen/Eigen/src/Geometry/Rotation2D.h +107 -105
  262. package/eigen/Eigen/src/Geometry/RotationBase.h +148 -145
  263. package/eigen/Eigen/src/Geometry/Scaling.h +113 -106
  264. package/eigen/Eigen/src/Geometry/Transform.h +858 -936
  265. package/eigen/Eigen/src/Geometry/Translation.h +94 -92
  266. package/eigen/Eigen/src/Geometry/Umeyama.h +79 -84
  267. package/eigen/Eigen/src/Geometry/arch/Geometry_SIMD.h +90 -104
  268. package/eigen/Eigen/src/Householder/BlockHouseholder.h +51 -46
  269. package/eigen/Eigen/src/Householder/Householder.h +102 -124
  270. package/eigen/Eigen/src/Householder/HouseholderSequence.h +412 -453
  271. package/eigen/Eigen/src/Householder/InternalHeaderCheck.h +3 -0
  272. package/eigen/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +149 -162
  273. package/eigen/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +124 -119
  274. package/eigen/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +92 -104
  275. package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h +251 -243
  276. package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h +224 -228
  277. package/eigen/Eigen/src/IterativeLinearSolvers/InternalHeaderCheck.h +3 -0
  278. package/eigen/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +178 -227
  279. package/eigen/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h +79 -84
  280. package/eigen/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h +54 -60
  281. package/eigen/Eigen/src/Jacobi/InternalHeaderCheck.h +3 -0
  282. package/eigen/Eigen/src/Jacobi/Jacobi.h +252 -308
  283. package/eigen/Eigen/src/KLUSupport/InternalHeaderCheck.h +3 -0
  284. package/eigen/Eigen/src/KLUSupport/KLUSupport.h +208 -227
  285. package/eigen/Eigen/src/LU/Determinant.h +50 -69
  286. package/eigen/Eigen/src/LU/FullPivLU.h +545 -596
  287. package/eigen/Eigen/src/LU/InternalHeaderCheck.h +3 -0
  288. package/eigen/Eigen/src/LU/InverseImpl.h +206 -285
  289. package/eigen/Eigen/src/LU/PartialPivLU.h +390 -428
  290. package/eigen/Eigen/src/LU/PartialPivLU_LAPACKE.h +54 -40
  291. package/eigen/Eigen/src/LU/arch/InverseSize4.h +72 -70
  292. package/eigen/Eigen/src/MetisSupport/InternalHeaderCheck.h +3 -0
  293. package/eigen/Eigen/src/MetisSupport/MetisSupport.h +81 -93
  294. package/eigen/Eigen/src/OrderingMethods/Amd.h +243 -265
  295. package/eigen/Eigen/src/OrderingMethods/Eigen_Colamd.h +831 -1004
  296. package/eigen/Eigen/src/OrderingMethods/InternalHeaderCheck.h +3 -0
  297. package/eigen/Eigen/src/OrderingMethods/Ordering.h +112 -119
  298. package/eigen/Eigen/src/PaStiXSupport/InternalHeaderCheck.h +3 -0
  299. package/eigen/Eigen/src/PaStiXSupport/PaStiXSupport.h +524 -570
  300. package/eigen/Eigen/src/PardisoSupport/InternalHeaderCheck.h +3 -0
  301. package/eigen/Eigen/src/PardisoSupport/PardisoSupport.h +385 -430
  302. package/eigen/Eigen/src/QR/ColPivHouseholderQR.h +479 -479
  303. package/eigen/Eigen/src/QR/ColPivHouseholderQR_LAPACKE.h +120 -56
  304. package/eigen/Eigen/src/QR/CompleteOrthogonalDecomposition.h +166 -153
  305. package/eigen/Eigen/src/QR/FullPivHouseholderQR.h +495 -475
  306. package/eigen/Eigen/src/QR/HouseholderQR.h +394 -285
  307. package/eigen/Eigen/src/QR/HouseholderQR_LAPACKE.h +32 -23
  308. package/eigen/Eigen/src/QR/InternalHeaderCheck.h +3 -0
  309. package/eigen/Eigen/src/SPQRSupport/InternalHeaderCheck.h +3 -0
  310. package/eigen/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h +244 -264
  311. package/eigen/Eigen/src/SVD/BDCSVD.h +817 -713
  312. package/eigen/Eigen/src/SVD/BDCSVD_LAPACKE.h +174 -0
  313. package/eigen/Eigen/src/SVD/InternalHeaderCheck.h +3 -0
  314. package/eigen/Eigen/src/SVD/JacobiSVD.h +577 -543
  315. package/eigen/Eigen/src/SVD/JacobiSVD_LAPACKE.h +85 -49
  316. package/eigen/Eigen/src/SVD/SVDBase.h +242 -182
  317. package/eigen/Eigen/src/SVD/UpperBidiagonalization.h +200 -235
  318. package/eigen/Eigen/src/SparseCholesky/InternalHeaderCheck.h +3 -0
  319. package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky.h +765 -594
  320. package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h +308 -94
  321. package/eigen/Eigen/src/SparseCore/AmbiVector.h +202 -251
  322. package/eigen/Eigen/src/SparseCore/CompressedStorage.h +184 -252
  323. package/eigen/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h +134 -178
  324. package/eigen/Eigen/src/SparseCore/InternalHeaderCheck.h +3 -0
  325. package/eigen/Eigen/src/SparseCore/SparseAssign.h +149 -140
  326. package/eigen/Eigen/src/SparseCore/SparseBlock.h +403 -440
  327. package/eigen/Eigen/src/SparseCore/SparseColEtree.h +100 -112
  328. package/eigen/Eigen/src/SparseCore/SparseCompressedBase.h +525 -303
  329. package/eigen/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +555 -339
  330. package/eigen/Eigen/src/SparseCore/SparseCwiseUnaryOp.h +100 -108
  331. package/eigen/Eigen/src/SparseCore/SparseDenseProduct.h +169 -197
  332. package/eigen/Eigen/src/SparseCore/SparseDiagonalProduct.h +71 -71
  333. package/eigen/Eigen/src/SparseCore/SparseDot.h +49 -47
  334. package/eigen/Eigen/src/SparseCore/SparseFuzzy.h +13 -11
  335. package/eigen/Eigen/src/SparseCore/SparseMap.h +243 -253
  336. package/eigen/Eigen/src/SparseCore/SparseMatrix.h +1603 -1245
  337. package/eigen/Eigen/src/SparseCore/SparseMatrixBase.h +403 -350
  338. package/eigen/Eigen/src/SparseCore/SparsePermutation.h +186 -115
  339. package/eigen/Eigen/src/SparseCore/SparseProduct.h +94 -97
  340. package/eigen/Eigen/src/SparseCore/SparseRedux.h +22 -24
  341. package/eigen/Eigen/src/SparseCore/SparseRef.h +268 -295
  342. package/eigen/Eigen/src/SparseCore/SparseSelfAdjointView.h +370 -416
  343. package/eigen/Eigen/src/SparseCore/SparseSolverBase.h +78 -87
  344. package/eigen/Eigen/src/SparseCore/SparseSparseProductWithPruning.h +81 -95
  345. package/eigen/Eigen/src/SparseCore/SparseTranspose.h +62 -71
  346. package/eigen/Eigen/src/SparseCore/SparseTriangularView.h +132 -144
  347. package/eigen/Eigen/src/SparseCore/SparseUtil.h +138 -115
  348. package/eigen/Eigen/src/SparseCore/SparseVector.h +426 -372
  349. package/eigen/Eigen/src/SparseCore/SparseView.h +164 -193
  350. package/eigen/Eigen/src/SparseCore/TriangularSolver.h +129 -170
  351. package/eigen/Eigen/src/SparseLU/InternalHeaderCheck.h +3 -0
  352. package/eigen/Eigen/src/SparseLU/SparseLU.h +756 -710
  353. package/eigen/Eigen/src/SparseLU/SparseLUImpl.h +61 -48
  354. package/eigen/Eigen/src/SparseLU/SparseLU_Memory.h +102 -118
  355. package/eigen/Eigen/src/SparseLU/SparseLU_Structs.h +38 -35
  356. package/eigen/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h +245 -301
  357. package/eigen/Eigen/src/SparseLU/SparseLU_Utils.h +44 -49
  358. package/eigen/Eigen/src/SparseLU/SparseLU_column_bmod.h +104 -108
  359. package/eigen/Eigen/src/SparseLU/SparseLU_column_dfs.h +89 -100
  360. package/eigen/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h +57 -58
  361. package/eigen/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h +43 -55
  362. package/eigen/Eigen/src/SparseLU/SparseLU_kernel_bmod.h +74 -71
  363. package/eigen/Eigen/src/SparseLU/SparseLU_panel_bmod.h +124 -132
  364. package/eigen/Eigen/src/SparseLU/SparseLU_panel_dfs.h +136 -159
  365. package/eigen/Eigen/src/SparseLU/SparseLU_pivotL.h +51 -52
  366. package/eigen/Eigen/src/SparseLU/SparseLU_pruneL.h +67 -73
  367. package/eigen/Eigen/src/SparseLU/SparseLU_relax_snode.h +24 -26
  368. package/eigen/Eigen/src/SparseQR/InternalHeaderCheck.h +3 -0
  369. package/eigen/Eigen/src/SparseQR/SparseQR.h +450 -502
  370. package/eigen/Eigen/src/StlSupport/StdDeque.h +28 -93
  371. package/eigen/Eigen/src/StlSupport/StdList.h +28 -84
  372. package/eigen/Eigen/src/StlSupport/StdVector.h +28 -108
  373. package/eigen/Eigen/src/StlSupport/details.h +48 -50
  374. package/eigen/Eigen/src/SuperLUSupport/InternalHeaderCheck.h +3 -0
  375. package/eigen/Eigen/src/SuperLUSupport/SuperLUSupport.h +634 -730
  376. package/eigen/Eigen/src/ThreadPool/Barrier.h +70 -0
  377. package/eigen/Eigen/src/ThreadPool/CoreThreadPoolDevice.h +336 -0
  378. package/eigen/Eigen/src/ThreadPool/EventCount.h +241 -0
  379. package/eigen/Eigen/src/ThreadPool/ForkJoin.h +140 -0
  380. package/eigen/Eigen/src/ThreadPool/InternalHeaderCheck.h +4 -0
  381. package/eigen/Eigen/src/ThreadPool/NonBlockingThreadPool.h +587 -0
  382. package/eigen/Eigen/src/ThreadPool/RunQueue.h +230 -0
  383. package/eigen/Eigen/src/ThreadPool/ThreadCancel.h +21 -0
  384. package/eigen/Eigen/src/ThreadPool/ThreadEnvironment.h +43 -0
  385. package/eigen/Eigen/src/ThreadPool/ThreadLocal.h +289 -0
  386. package/eigen/Eigen/src/ThreadPool/ThreadPoolInterface.h +50 -0
  387. package/eigen/Eigen/src/ThreadPool/ThreadYield.h +16 -0
  388. package/eigen/Eigen/src/UmfPackSupport/InternalHeaderCheck.h +3 -0
  389. package/eigen/Eigen/src/UmfPackSupport/UmfPackSupport.h +428 -464
  390. package/eigen/Eigen/src/misc/Image.h +41 -43
  391. package/eigen/Eigen/src/misc/InternalHeaderCheck.h +3 -0
  392. package/eigen/Eigen/src/misc/Kernel.h +39 -41
  393. package/eigen/Eigen/src/misc/RealSvd2x2.h +19 -21
  394. package/eigen/Eigen/src/misc/blas.h +83 -426
  395. package/eigen/Eigen/src/misc/lapacke.h +9972 -16179
  396. package/eigen/Eigen/src/misc/lapacke_helpers.h +163 -0
  397. package/eigen/Eigen/src/misc/lapacke_mangling.h +4 -5
  398. package/eigen/Eigen/src/plugins/ArrayCwiseBinaryOps.inc +344 -0
  399. package/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.inc +544 -0
  400. package/eigen/Eigen/src/plugins/{BlockMethods.h → BlockMethods.inc} +434 -506
  401. package/eigen/Eigen/src/plugins/CommonCwiseBinaryOps.inc +116 -0
  402. package/eigen/Eigen/src/plugins/{CommonCwiseUnaryOps.h → CommonCwiseUnaryOps.inc} +58 -68
  403. package/eigen/Eigen/src/plugins/IndexedViewMethods.inc +192 -0
  404. package/eigen/Eigen/src/plugins/InternalHeaderCheck.inc +3 -0
  405. package/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.inc +331 -0
  406. package/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.inc +118 -0
  407. package/eigen/Eigen/src/plugins/ReshapedMethods.inc +133 -0
  408. package/package.json +1 -1
  409. package/eigen/COPYING.APACHE +0 -203
  410. package/eigen/COPYING.BSD +0 -26
  411. package/eigen/COPYING.GPL +0 -674
  412. package/eigen/COPYING.LGPL +0 -502
  413. package/eigen/COPYING.MINPACK +0 -51
  414. package/eigen/COPYING.MPL2 +0 -373
  415. package/eigen/COPYING.README +0 -18
  416. package/eigen/Eigen/src/Core/BooleanRedux.h +0 -162
  417. package/eigen/Eigen/src/Core/arch/CUDA/Complex.h +0 -258
  418. package/eigen/Eigen/src/Core/arch/Default/TypeCasting.h +0 -120
  419. package/eigen/Eigen/src/Core/arch/SYCL/SyclMemoryModel.h +0 -694
  420. package/eigen/Eigen/src/Core/util/NonMPL2.h +0 -3
  421. package/eigen/Eigen/src/SparseCore/MappedSparseMatrix.h +0 -67
  422. package/eigen/Eigen/src/SparseLU/SparseLU_gemm_kernel.h +0 -280
  423. package/eigen/Eigen/src/misc/lapack.h +0 -152
  424. package/eigen/Eigen/src/plugins/ArrayCwiseBinaryOps.h +0 -358
  425. package/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.h +0 -696
  426. package/eigen/Eigen/src/plugins/CommonCwiseBinaryOps.h +0 -115
  427. package/eigen/Eigen/src/plugins/IndexedViewMethods.h +0 -262
  428. package/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.h +0 -152
  429. package/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.h +0 -95
  430. package/eigen/Eigen/src/plugins/ReshapedMethods.h +0 -149
  431. package/eigen/README.md +0 -5
@@ -10,372 +10,528 @@
10
10
  #ifndef EIGEN_VISITOR_H
11
11
  #define EIGEN_VISITOR_H
12
12
 
13
+ // IWYU pragma: private
14
+ #include "./InternalHeaderCheck.h"
15
+
13
16
  namespace Eigen {
14
17
 
15
18
  namespace internal {
16
19
 
17
- template<typename Visitor, typename Derived, int UnrollCount>
18
- struct visitor_impl
19
- {
20
- enum {
21
- col = (UnrollCount-1) / Derived::RowsAtCompileTime,
22
- row = (UnrollCount-1) % Derived::RowsAtCompileTime
23
- };
24
-
25
- EIGEN_DEVICE_FUNC
26
- static inline void run(const Derived &mat, Visitor& visitor)
27
- {
28
- visitor_impl<Visitor, Derived, UnrollCount-1>::run(mat, visitor);
29
- visitor(mat.coeff(row, col), row, col);
30
- }
31
- };
20
+ template <typename Visitor, typename Derived, int UnrollCount,
21
+ bool Vectorize = (Derived::PacketAccess && functor_traits<Visitor>::PacketAccess), bool LinearAccess = false,
22
+ bool ShortCircuitEvaluation = false>
23
+ struct visitor_impl;
32
24
 
33
- template<typename Visitor, typename Derived>
34
- struct visitor_impl<Visitor, Derived, 1>
35
- {
36
- EIGEN_DEVICE_FUNC
37
- static inline void run(const Derived &mat, Visitor& visitor)
38
- {
39
- return visitor.init(mat.coeff(0, 0), 0, 0);
40
- }
25
+ template <typename Visitor, bool ShortCircuitEvaluation = false>
26
+ struct short_circuit_eval_impl {
27
+ // if short circuit evaluation is not used, do nothing
28
+ static constexpr EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool run(const Visitor&) { return false; }
41
29
  };
42
-
43
- // This specialization enables visitors on empty matrices at compile-time
44
- template<typename Visitor, typename Derived>
45
- struct visitor_impl<Visitor, Derived, 0> {
46
- EIGEN_DEVICE_FUNC
47
- static inline void run(const Derived &/*mat*/, Visitor& /*visitor*/)
48
- {}
30
+ template <typename Visitor>
31
+ struct short_circuit_eval_impl<Visitor, true> {
32
+ // if short circuit evaluation is used, check the visitor
33
+ static constexpr EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool run(const Visitor& visitor) { return visitor.done(); }
49
34
  };
50
35
 
51
- template<typename Visitor, typename Derived>
52
- struct visitor_impl<Visitor, Derived, Dynamic>
53
- {
54
- EIGEN_DEVICE_FUNC
55
- static inline void run(const Derived& mat, Visitor& visitor)
56
- {
57
- visitor.init(mat.coeff(0,0), 0, 0);
58
- for(Index i = 1; i < mat.rows(); ++i)
59
- visitor(mat.coeff(i, 0), i, 0);
60
- for(Index j = 1; j < mat.cols(); ++j)
61
- for(Index i = 0; i < mat.rows(); ++i)
62
- visitor(mat.coeff(i, j), i, j);
36
+ // unrolled inner-outer traversal
37
+ template <typename Visitor, typename Derived, int UnrollCount, bool Vectorize, bool ShortCircuitEvaluation>
38
+ struct visitor_impl<Visitor, Derived, UnrollCount, Vectorize, false, ShortCircuitEvaluation> {
39
+ // don't use short circuit evaluation for unrolled version
40
+ using Scalar = typename Derived::Scalar;
41
+ using Packet = typename packet_traits<Scalar>::type;
42
+ static constexpr bool RowMajor = Derived::IsRowMajor;
43
+ static constexpr int RowsAtCompileTime = Derived::RowsAtCompileTime;
44
+ static constexpr int ColsAtCompileTime = Derived::ColsAtCompileTime;
45
+ static constexpr int PacketSize = packet_traits<Scalar>::size;
46
+
47
+ static constexpr bool CanVectorize(int K) {
48
+ constexpr int InnerSizeAtCompileTime = RowMajor ? ColsAtCompileTime : RowsAtCompileTime;
49
+ if (InnerSizeAtCompileTime < PacketSize) return false;
50
+ return Vectorize && (InnerSizeAtCompileTime - (K % InnerSizeAtCompileTime) >= PacketSize);
63
51
  }
64
- };
65
-
66
- // evaluator adaptor
67
- template<typename XprType>
68
- class visitor_evaluator
69
- {
70
- public:
71
- EIGEN_DEVICE_FUNC
72
- explicit visitor_evaluator(const XprType &xpr) : m_evaluator(xpr), m_xpr(xpr) {}
73
52
 
74
- typedef typename XprType::Scalar Scalar;
75
- typedef typename XprType::CoeffReturnType CoeffReturnType;
53
+ template <int K = 0, bool Empty = (K == UnrollCount), std::enable_if_t<Empty, bool> = true>
54
+ static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(const Derived&, Visitor&) {}
76
55
 
77
- enum {
78
- RowsAtCompileTime = XprType::RowsAtCompileTime,
79
- CoeffReadCost = internal::evaluator<XprType>::CoeffReadCost
80
- };
56
+ template <int K = 0, bool Empty = (K == UnrollCount), bool Initialize = (K == 0), bool DoVectorOp = CanVectorize(K),
57
+ std::enable_if_t<!Empty && Initialize && !DoVectorOp, bool> = true>
58
+ static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(const Derived& mat, Visitor& visitor) {
59
+ visitor.init(mat.coeff(0, 0), 0, 0);
60
+ run<1>(mat, visitor);
61
+ }
81
62
 
82
- EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT { return m_xpr.rows(); }
83
- EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT { return m_xpr.cols(); }
84
- EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index size() const EIGEN_NOEXCEPT { return m_xpr.size(); }
63
+ template <int K = 0, bool Empty = (K == UnrollCount), bool Initialize = (K == 0), bool DoVectorOp = CanVectorize(K),
64
+ std::enable_if_t<!Empty && !Initialize && !DoVectorOp, bool> = true>
65
+ static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(const Derived& mat, Visitor& visitor) {
66
+ static constexpr int R = RowMajor ? (K / ColsAtCompileTime) : (K % RowsAtCompileTime);
67
+ static constexpr int C = RowMajor ? (K % ColsAtCompileTime) : (K / RowsAtCompileTime);
68
+ visitor(mat.coeff(R, C), R, C);
69
+ run<K + 1>(mat, visitor);
70
+ }
85
71
 
86
- EIGEN_DEVICE_FUNC CoeffReturnType coeff(Index row, Index col) const
87
- { return m_evaluator.coeff(row, col); }
72
+ template <int K = 0, bool Empty = (K == UnrollCount), bool Initialize = (K == 0), bool DoVectorOp = CanVectorize(K),
73
+ std::enable_if_t<!Empty && Initialize && DoVectorOp, bool> = true>
74
+ static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(const Derived& mat, Visitor& visitor) {
75
+ Packet P = mat.template packet<Packet>(0, 0);
76
+ visitor.initpacket(P, 0, 0);
77
+ run<PacketSize>(mat, visitor);
78
+ }
88
79
 
89
- protected:
90
- internal::evaluator<XprType> m_evaluator;
91
- const XprType &m_xpr;
80
+ template <int K = 0, bool Empty = (K == UnrollCount), bool Initialize = (K == 0), bool DoVectorOp = CanVectorize(K),
81
+ std::enable_if_t<!Empty && !Initialize && DoVectorOp, bool> = true>
82
+ static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(const Derived& mat, Visitor& visitor) {
83
+ static constexpr int R = RowMajor ? (K / ColsAtCompileTime) : (K % RowsAtCompileTime);
84
+ static constexpr int C = RowMajor ? (K % ColsAtCompileTime) : (K / RowsAtCompileTime);
85
+ Packet P = mat.template packet<Packet>(R, C);
86
+ visitor.packet(P, R, C);
87
+ run<K + PacketSize>(mat, visitor);
88
+ }
92
89
  };
93
- } // end namespace internal
94
90
 
95
- /** Applies the visitor \a visitor to the whole coefficients of the matrix or vector.
96
- *
97
- * The template parameter \a Visitor is the type of the visitor and provides the following interface:
98
- * \code
99
- * struct MyVisitor {
100
- * // called for the first coefficient
101
- * void init(const Scalar& value, Index i, Index j);
102
- * // called for all other coefficients
103
- * void operator() (const Scalar& value, Index i, Index j);
104
- * };
105
- * \endcode
106
- *
107
- * \note compared to one or two \em for \em loops, visitors offer automatic
108
- * unrolling for small fixed size matrix.
109
- *
110
- * \note if the matrix is empty, then the visitor is left unchanged.
111
- *
112
- * \sa minCoeff(Index*,Index*), maxCoeff(Index*,Index*), DenseBase::redux()
113
- */
114
- template<typename Derived>
115
- template<typename Visitor>
116
- EIGEN_DEVICE_FUNC
117
- void DenseBase<Derived>::visit(Visitor& visitor) const
118
- {
119
- if(size()==0)
120
- return;
121
-
122
- typedef typename internal::visitor_evaluator<Derived> ThisEvaluator;
123
- ThisEvaluator thisEval(derived());
91
+ // unrolled linear traversal
92
+ template <typename Visitor, typename Derived, int UnrollCount, bool Vectorize, bool ShortCircuitEvaluation>
93
+ struct visitor_impl<Visitor, Derived, UnrollCount, Vectorize, true, ShortCircuitEvaluation> {
94
+ // don't use short circuit evaluation for unrolled version
95
+ using Scalar = typename Derived::Scalar;
96
+ using Packet = typename packet_traits<Scalar>::type;
97
+ static constexpr int PacketSize = packet_traits<Scalar>::size;
98
+
99
+ static constexpr bool CanVectorize(int K) { return Vectorize && ((UnrollCount - K) >= PacketSize); }
100
+
101
+ // empty
102
+ template <int K = 0, bool Empty = (K == UnrollCount), std::enable_if_t<Empty, bool> = true>
103
+ static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(const Derived&, Visitor&) {}
104
+
105
+ // scalar initialization
106
+ template <int K = 0, bool Empty = (K == UnrollCount), bool Initialize = (K == 0), bool DoVectorOp = CanVectorize(K),
107
+ std::enable_if_t<!Empty && Initialize && !DoVectorOp, bool> = true>
108
+ static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(const Derived& mat, Visitor& visitor) {
109
+ visitor.init(mat.coeff(0), 0);
110
+ run<1>(mat, visitor);
111
+ }
124
112
 
125
- enum {
126
- unroll = SizeAtCompileTime != Dynamic
127
- && SizeAtCompileTime * int(ThisEvaluator::CoeffReadCost) + (SizeAtCompileTime-1) * int(internal::functor_traits<Visitor>::Cost) <= EIGEN_UNROLLING_LIMIT
128
- };
129
- return internal::visitor_impl<Visitor, ThisEvaluator, unroll ? int(SizeAtCompileTime) : Dynamic>::run(thisEval, visitor);
130
- }
113
+ // scalar iteration
114
+ template <int K = 0, bool Empty = (K == UnrollCount), bool Initialize = (K == 0), bool DoVectorOp = CanVectorize(K),
115
+ std::enable_if_t<!Empty && !Initialize && !DoVectorOp, bool> = true>
116
+ static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(const Derived& mat, Visitor& visitor) {
117
+ visitor(mat.coeff(K), K);
118
+ run<K + 1>(mat, visitor);
119
+ }
131
120
 
132
- namespace internal {
121
+ // vector initialization
122
+ template <int K = 0, bool Empty = (K == UnrollCount), bool Initialize = (K == 0), bool DoVectorOp = CanVectorize(K),
123
+ std::enable_if_t<!Empty && Initialize && DoVectorOp, bool> = true>
124
+ static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(const Derived& mat, Visitor& visitor) {
125
+ Packet P = mat.template packet<Packet>(0);
126
+ visitor.initpacket(P, 0);
127
+ run<PacketSize>(mat, visitor);
128
+ }
133
129
 
134
- /** \internal
135
- * \brief Base class to implement min and max visitors
136
- */
137
- template <typename Derived>
138
- struct coeff_visitor
139
- {
140
- // default initialization to avoid countless invalid maybe-uninitialized warnings by gcc
141
- EIGEN_DEVICE_FUNC
142
- coeff_visitor() : row(-1), col(-1), res(0) {}
143
- typedef typename Derived::Scalar Scalar;
144
- Index row, col;
145
- Scalar res;
146
- EIGEN_DEVICE_FUNC
147
- inline void init(const Scalar& value, Index i, Index j)
148
- {
149
- res = value;
150
- row = i;
151
- col = j;
130
+ // vector iteration
131
+ template <int K = 0, bool Empty = (K == UnrollCount), bool Initialize = (K == 0), bool DoVectorOp = CanVectorize(K),
132
+ std::enable_if_t<!Empty && !Initialize && DoVectorOp, bool> = true>
133
+ static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(const Derived& mat, Visitor& visitor) {
134
+ Packet P = mat.template packet<Packet>(K);
135
+ visitor.packet(P, K);
136
+ run<K + PacketSize>(mat, visitor);
152
137
  }
153
138
  };
154
139
 
155
- /** \internal
156
- * \brief Visitor computing the min coefficient with its value and coordinates
157
- *
158
- * \sa DenseBase::minCoeff(Index*, Index*)
159
- */
160
- template <typename Derived, int NaNPropagation>
161
- struct min_coeff_visitor : coeff_visitor<Derived>
162
- {
163
- typedef typename Derived::Scalar Scalar;
164
- EIGEN_DEVICE_FUNC
165
- void operator() (const Scalar& value, Index i, Index j)
166
- {
167
- if(value < this->res)
140
+ // dynamic scalar outer-inner traversal
141
+ template <typename Visitor, typename Derived, bool ShortCircuitEvaluation>
142
+ struct visitor_impl<Visitor, Derived, Dynamic, /*Vectorize=*/false, /*LinearAccess=*/false, ShortCircuitEvaluation> {
143
+ using short_circuit = short_circuit_eval_impl<Visitor, ShortCircuitEvaluation>;
144
+ static constexpr bool RowMajor = Derived::IsRowMajor;
145
+
146
+ static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(const Derived& mat, Visitor& visitor) {
147
+ const Index innerSize = RowMajor ? mat.cols() : mat.rows();
148
+ const Index outerSize = RowMajor ? mat.rows() : mat.cols();
149
+ if (innerSize == 0 || outerSize == 0) return;
168
150
  {
169
- this->res = value;
170
- this->row = i;
171
- this->col = j;
151
+ visitor.init(mat.coeff(0, 0), 0, 0);
152
+ if (short_circuit::run(visitor)) return;
153
+ for (Index i = 1; i < innerSize; ++i) {
154
+ Index r = RowMajor ? 0 : i;
155
+ Index c = RowMajor ? i : 0;
156
+ visitor(mat.coeff(r, c), r, c);
157
+ if EIGEN_PREDICT_FALSE (short_circuit::run(visitor)) return;
158
+ }
159
+ }
160
+ for (Index j = 1; j < outerSize; j++) {
161
+ for (Index i = 0; i < innerSize; ++i) {
162
+ Index r = RowMajor ? j : i;
163
+ Index c = RowMajor ? i : j;
164
+ visitor(mat.coeff(r, c), r, c);
165
+ if EIGEN_PREDICT_FALSE (short_circuit::run(visitor)) return;
166
+ }
172
167
  }
173
168
  }
174
169
  };
175
170
 
176
- template <typename Derived>
177
- struct min_coeff_visitor<Derived, PropagateNumbers> : coeff_visitor<Derived>
178
- {
179
- typedef typename Derived::Scalar Scalar;
180
- EIGEN_DEVICE_FUNC
181
- void operator() (const Scalar& value, Index i, Index j)
182
- {
183
- if((numext::isnan)(this->res) || (!(numext::isnan)(value) && value < this->res))
171
+ // dynamic vectorized outer-inner traversal
172
+ template <typename Visitor, typename Derived, bool ShortCircuitEvaluation>
173
+ struct visitor_impl<Visitor, Derived, Dynamic, /*Vectorize=*/true, /*LinearAccess=*/false, ShortCircuitEvaluation> {
174
+ using Scalar = typename Derived::Scalar;
175
+ using Packet = typename packet_traits<Scalar>::type;
176
+ static constexpr int PacketSize = packet_traits<Scalar>::size;
177
+ using short_circuit = short_circuit_eval_impl<Visitor, ShortCircuitEvaluation>;
178
+ static constexpr bool RowMajor = Derived::IsRowMajor;
179
+
180
+ static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(const Derived& mat, Visitor& visitor) {
181
+ const Index innerSize = RowMajor ? mat.cols() : mat.rows();
182
+ const Index outerSize = RowMajor ? mat.rows() : mat.cols();
183
+ if (innerSize == 0 || outerSize == 0) return;
184
184
  {
185
- this->res = value;
186
- this->row = i;
187
- this->col = j;
185
+ Index i = 0;
186
+ if (innerSize < PacketSize) {
187
+ visitor.init(mat.coeff(0, 0), 0, 0);
188
+ i = 1;
189
+ } else {
190
+ Packet p = mat.template packet<Packet>(0, 0);
191
+ visitor.initpacket(p, 0, 0);
192
+ i = PacketSize;
193
+ }
194
+ if EIGEN_PREDICT_FALSE (short_circuit::run(visitor)) return;
195
+ for (; i + PacketSize - 1 < innerSize; i += PacketSize) {
196
+ Index r = RowMajor ? 0 : i;
197
+ Index c = RowMajor ? i : 0;
198
+ Packet p = mat.template packet<Packet>(r, c);
199
+ visitor.packet(p, r, c);
200
+ if EIGEN_PREDICT_FALSE (short_circuit::run(visitor)) return;
201
+ }
202
+ for (; i < innerSize; ++i) {
203
+ Index r = RowMajor ? 0 : i;
204
+ Index c = RowMajor ? i : 0;
205
+ visitor(mat.coeff(r, c), r, c);
206
+ if EIGEN_PREDICT_FALSE (short_circuit::run(visitor)) return;
207
+ }
208
+ }
209
+ for (Index j = 1; j < outerSize; j++) {
210
+ Index i = 0;
211
+ for (; i + PacketSize - 1 < innerSize; i += PacketSize) {
212
+ Index r = RowMajor ? j : i;
213
+ Index c = RowMajor ? i : j;
214
+ Packet p = mat.template packet<Packet>(r, c);
215
+ visitor.packet(p, r, c);
216
+ if EIGEN_PREDICT_FALSE (short_circuit::run(visitor)) return;
217
+ }
218
+ for (; i < innerSize; ++i) {
219
+ Index r = RowMajor ? j : i;
220
+ Index c = RowMajor ? i : j;
221
+ visitor(mat.coeff(r, c), r, c);
222
+ if EIGEN_PREDICT_FALSE (short_circuit::run(visitor)) return;
223
+ }
188
224
  }
189
225
  }
190
226
  };
191
227
 
192
- template <typename Derived>
193
- struct min_coeff_visitor<Derived, PropagateNaN> : coeff_visitor<Derived>
194
- {
195
- typedef typename Derived::Scalar Scalar;
196
- EIGEN_DEVICE_FUNC
197
- void operator() (const Scalar& value, Index i, Index j)
198
- {
199
- if((numext::isnan)(value) || value < this->res)
200
- {
201
- this->res = value;
202
- this->row = i;
203
- this->col = j;
228
+ // dynamic scalar linear traversal
229
+ template <typename Visitor, typename Derived, bool ShortCircuitEvaluation>
230
+ struct visitor_impl<Visitor, Derived, Dynamic, /*Vectorize=*/false, /*LinearAccess=*/true, ShortCircuitEvaluation> {
231
+ using short_circuit = short_circuit_eval_impl<Visitor, ShortCircuitEvaluation>;
232
+
233
+ static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(const Derived& mat, Visitor& visitor) {
234
+ const Index size = mat.size();
235
+ if (size == 0) return;
236
+ visitor.init(mat.coeff(0), 0);
237
+ if EIGEN_PREDICT_FALSE (short_circuit::run(visitor)) return;
238
+ for (Index k = 1; k < size; k++) {
239
+ visitor(mat.coeff(k), k);
240
+ if EIGEN_PREDICT_FALSE (short_circuit::run(visitor)) return;
204
241
  }
205
242
  }
206
243
  };
207
244
 
208
- template<typename Scalar, int NaNPropagation>
209
- struct functor_traits<min_coeff_visitor<Scalar, NaNPropagation> > {
210
- enum {
211
- Cost = NumTraits<Scalar>::AddCost
212
- };
245
+ // dynamic vectorized linear traversal
246
+ template <typename Visitor, typename Derived, bool ShortCircuitEvaluation>
247
+ struct visitor_impl<Visitor, Derived, Dynamic, /*Vectorize=*/true, /*LinearAccess=*/true, ShortCircuitEvaluation> {
248
+ using Scalar = typename Derived::Scalar;
249
+ using Packet = typename packet_traits<Scalar>::type;
250
+ static constexpr int PacketSize = packet_traits<Scalar>::size;
251
+ using short_circuit = short_circuit_eval_impl<Visitor, ShortCircuitEvaluation>;
252
+
253
+ static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(const Derived& mat, Visitor& visitor) {
254
+ const Index size = mat.size();
255
+ if (size == 0) return;
256
+ Index k = 0;
257
+ if (size < PacketSize) {
258
+ visitor.init(mat.coeff(0), 0);
259
+ k = 1;
260
+ } else {
261
+ Packet p = mat.template packet<Packet>(k);
262
+ visitor.initpacket(p, k);
263
+ k = PacketSize;
264
+ }
265
+ if EIGEN_PREDICT_FALSE (short_circuit::run(visitor)) return;
266
+ for (; k + PacketSize - 1 < size; k += PacketSize) {
267
+ Packet p = mat.template packet<Packet>(k);
268
+ visitor.packet(p, k);
269
+ if EIGEN_PREDICT_FALSE (short_circuit::run(visitor)) return;
270
+ }
271
+ for (; k < size; k++) {
272
+ visitor(mat.coeff(k), k);
273
+ if EIGEN_PREDICT_FALSE (short_circuit::run(visitor)) return;
274
+ }
275
+ }
213
276
  };
214
277
 
215
- /** \internal
216
- * \brief Visitor computing the max coefficient with its value and coordinates
217
- *
218
- * \sa DenseBase::maxCoeff(Index*, Index*)
219
- */
220
- template <typename Derived, int NaNPropagation>
221
- struct max_coeff_visitor : coeff_visitor<Derived>
222
- {
223
- typedef typename Derived::Scalar Scalar;
224
- EIGEN_DEVICE_FUNC
225
- void operator() (const Scalar& value, Index i, Index j)
226
- {
227
- if(value > this->res)
228
- {
229
- this->res = value;
230
- this->row = i;
231
- this->col = j;
232
- }
278
+ // evaluator adaptor
279
+ template <typename XprType>
280
+ class visitor_evaluator {
281
+ public:
282
+ typedef evaluator<XprType> Evaluator;
283
+ typedef typename XprType::Scalar Scalar;
284
+ using Packet = typename packet_traits<Scalar>::type;
285
+ typedef std::remove_const_t<typename XprType::CoeffReturnType> CoeffReturnType;
286
+
287
+ static constexpr bool PacketAccess = static_cast<bool>(Evaluator::Flags & PacketAccessBit);
288
+ static constexpr bool LinearAccess = static_cast<bool>(Evaluator::Flags & LinearAccessBit);
289
+ static constexpr bool IsRowMajor = static_cast<bool>(XprType::IsRowMajor);
290
+ static constexpr int RowsAtCompileTime = XprType::RowsAtCompileTime;
291
+ static constexpr int ColsAtCompileTime = XprType::ColsAtCompileTime;
292
+ static constexpr int XprAlignment = Evaluator::Alignment;
293
+ static constexpr int CoeffReadCost = Evaluator::CoeffReadCost;
294
+
295
+ EIGEN_DEVICE_FUNC explicit visitor_evaluator(const XprType& xpr) : m_evaluator(xpr), m_xpr(xpr) {}
296
+
297
+ EIGEN_DEVICE_FUNC constexpr Index rows() const noexcept { return m_xpr.rows(); }
298
+ EIGEN_DEVICE_FUNC constexpr Index cols() const noexcept { return m_xpr.cols(); }
299
+ EIGEN_DEVICE_FUNC constexpr Index size() const noexcept { return m_xpr.size(); }
300
+ // outer-inner access
301
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index row, Index col) const {
302
+ return m_evaluator.coeff(row, col);
303
+ }
304
+ template <typename Packet, int Alignment = Unaligned>
305
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packet(Index row, Index col) const {
306
+ return m_evaluator.template packet<Alignment, Packet>(row, col);
233
307
  }
308
+ // linear access
309
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const { return m_evaluator.coeff(index); }
310
+ template <typename Packet, int Alignment = XprAlignment>
311
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packet(Index index) const {
312
+ return m_evaluator.template packet<Alignment, Packet>(index);
313
+ }
314
+
315
+ protected:
316
+ Evaluator m_evaluator;
317
+ const XprType& m_xpr;
234
318
  };
235
319
 
236
- template <typename Derived>
237
- struct max_coeff_visitor<Derived, PropagateNumbers> : coeff_visitor<Derived>
238
- {
239
- typedef typename Derived::Scalar Scalar;
240
- EIGEN_DEVICE_FUNC
241
- void operator() (const Scalar& value, Index i, Index j)
242
- {
243
- if((numext::isnan)(this->res) || (!(numext::isnan)(value) && value > this->res))
244
- {
245
- this->res = value;
246
- this->row = i;
247
- this->col = j;
248
- }
320
+ template <typename Derived, typename Visitor, bool ShortCircuitEvaulation>
321
+ struct visit_impl {
322
+ using Evaluator = visitor_evaluator<Derived>;
323
+ using Scalar = typename DenseBase<Derived>::Scalar;
324
+
325
+ static constexpr bool IsRowMajor = DenseBase<Derived>::IsRowMajor;
326
+ static constexpr int SizeAtCompileTime = DenseBase<Derived>::SizeAtCompileTime;
327
+ static constexpr int RowsAtCompileTime = DenseBase<Derived>::RowsAtCompileTime;
328
+ static constexpr int ColsAtCompileTime = DenseBase<Derived>::ColsAtCompileTime;
329
+ static constexpr int InnerSizeAtCompileTime = IsRowMajor ? ColsAtCompileTime : RowsAtCompileTime;
330
+ static constexpr int OuterSizeAtCompileTime = IsRowMajor ? RowsAtCompileTime : ColsAtCompileTime;
331
+
332
+ static constexpr bool LinearAccess =
333
+ Evaluator::LinearAccess && static_cast<bool>(functor_traits<Visitor>::LinearAccess);
334
+ static constexpr bool Vectorize = Evaluator::PacketAccess && static_cast<bool>(functor_traits<Visitor>::PacketAccess);
335
+
336
+ static constexpr int PacketSize = packet_traits<Scalar>::size;
337
+ static constexpr int VectorOps =
338
+ Vectorize ? (LinearAccess ? (SizeAtCompileTime / PacketSize)
339
+ : (OuterSizeAtCompileTime * (InnerSizeAtCompileTime / PacketSize)))
340
+ : 0;
341
+ static constexpr int ScalarOps = SizeAtCompileTime - (VectorOps * PacketSize);
342
+ // treat vector op and scalar op as same cost for unroll logic
343
+ static constexpr int TotalOps = VectorOps + ScalarOps;
344
+
345
+ static constexpr int UnrollCost = int(Evaluator::CoeffReadCost) + int(functor_traits<Visitor>::Cost);
346
+ static constexpr bool Unroll = (SizeAtCompileTime != Dynamic) && ((TotalOps * UnrollCost) <= EIGEN_UNROLLING_LIMIT);
347
+ static constexpr int UnrollCount = Unroll ? int(SizeAtCompileTime) : Dynamic;
348
+
349
+ using impl = visitor_impl<Visitor, Evaluator, UnrollCount, Vectorize, LinearAccess, ShortCircuitEvaulation>;
350
+
351
+ static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(const DenseBase<Derived>& mat, Visitor& visitor) {
352
+ Evaluator evaluator(mat.derived());
353
+ impl::run(evaluator, visitor);
249
354
  }
250
355
  };
251
356
 
357
+ } // end namespace internal
358
+
359
+ /** Applies the visitor \a visitor to the whole coefficients of the matrix or vector.
360
+ *
361
+ * The template parameter \a Visitor is the type of the visitor and provides the following interface:
362
+ * \code
363
+ * struct MyVisitor {
364
+ * // called for the first coefficient
365
+ * void init(const Scalar& value, Index i, Index j);
366
+ * // called for all other coefficients
367
+ * void operator() (const Scalar& value, Index i, Index j);
368
+ * };
369
+ * \endcode
370
+ *
371
+ * \note compared to one or two \em for \em loops, visitors offer automatic
372
+ * unrolling for small fixed size matrix.
373
+ *
374
+ * \note if the matrix is empty, then the visitor is left unchanged.
375
+ *
376
+ * \sa minCoeff(Index*,Index*), maxCoeff(Index*,Index*), DenseBase::redux()
377
+ */
252
378
  template <typename Derived>
253
- struct max_coeff_visitor<Derived, PropagateNaN> : coeff_visitor<Derived>
254
- {
255
- typedef typename Derived::Scalar Scalar;
256
- EIGEN_DEVICE_FUNC
257
- void operator() (const Scalar& value, Index i, Index j)
258
- {
259
- if((numext::isnan)(value) || value > this->res)
260
- {
261
- this->res = value;
262
- this->row = i;
263
- this->col = j;
264
- }
379
+ template <typename Visitor>
380
+ EIGEN_DEVICE_FUNC void DenseBase<Derived>::visit(Visitor& visitor) const {
381
+ using impl = internal::visit_impl<Derived, Visitor, /*ShortCircuitEvaulation*/ false>;
382
+ impl::run(derived(), visitor);
383
+ }
384
+
385
+ namespace internal {
386
+
387
+ template <typename Scalar>
388
+ struct all_visitor {
389
+ using result_type = bool;
390
+ using Packet = typename packet_traits<Scalar>::type;
391
+ EIGEN_DEVICE_FUNC inline void init(const Scalar& value, Index, Index) { res = (value != Scalar(0)); }
392
+ EIGEN_DEVICE_FUNC inline void init(const Scalar& value, Index) { res = (value != Scalar(0)); }
393
+ EIGEN_DEVICE_FUNC inline bool all_predux(const Packet& p) const { return !predux_any(pcmp_eq(p, pzero(p))); }
394
+ EIGEN_DEVICE_FUNC inline void initpacket(const Packet& p, Index, Index) { res = all_predux(p); }
395
+ EIGEN_DEVICE_FUNC inline void initpacket(const Packet& p, Index) { res = all_predux(p); }
396
+ EIGEN_DEVICE_FUNC inline void operator()(const Scalar& value, Index, Index) { res = res && (value != Scalar(0)); }
397
+ EIGEN_DEVICE_FUNC inline void operator()(const Scalar& value, Index) { res = res && (value != Scalar(0)); }
398
+ EIGEN_DEVICE_FUNC inline void packet(const Packet& p, Index, Index) { res = res && all_predux(p); }
399
+ EIGEN_DEVICE_FUNC inline void packet(const Packet& p, Index) { res = res && all_predux(p); }
400
+ EIGEN_DEVICE_FUNC inline bool done() const { return !res; }
401
+ bool res = true;
402
+ };
403
+ template <typename Scalar>
404
+ struct functor_traits<all_visitor<Scalar>> {
405
+ enum { Cost = NumTraits<Scalar>::ReadCost, LinearAccess = true, PacketAccess = packet_traits<Scalar>::HasCmp };
406
+ };
407
+
408
+ template <typename Scalar>
409
+ struct any_visitor {
410
+ using result_type = bool;
411
+ using Packet = typename packet_traits<Scalar>::type;
412
+ EIGEN_DEVICE_FUNC inline void init(const Scalar& value, Index, Index) { res = (value != Scalar(0)); }
413
+ EIGEN_DEVICE_FUNC inline void init(const Scalar& value, Index) { res = (value != Scalar(0)); }
414
+ EIGEN_DEVICE_FUNC inline bool any_predux(const Packet& p) const {
415
+ return predux_any(pandnot(ptrue(p), pcmp_eq(p, pzero(p))));
416
+ }
417
+ EIGEN_DEVICE_FUNC inline void initpacket(const Packet& p, Index, Index) { res = any_predux(p); }
418
+ EIGEN_DEVICE_FUNC inline void initpacket(const Packet& p, Index) { res = any_predux(p); }
419
+ EIGEN_DEVICE_FUNC inline void operator()(const Scalar& value, Index, Index) { res = res || (value != Scalar(0)); }
420
+ EIGEN_DEVICE_FUNC inline void operator()(const Scalar& value, Index) { res = res || (value != Scalar(0)); }
421
+ EIGEN_DEVICE_FUNC inline void packet(const Packet& p, Index, Index) { res = res || any_predux(p); }
422
+ EIGEN_DEVICE_FUNC inline void packet(const Packet& p, Index) { res = res || any_predux(p); }
423
+ EIGEN_DEVICE_FUNC inline bool done() const { return res; }
424
+ bool res = false;
425
+ };
426
+ template <typename Scalar>
427
+ struct functor_traits<any_visitor<Scalar>> {
428
+ enum { Cost = NumTraits<Scalar>::ReadCost, LinearAccess = true, PacketAccess = packet_traits<Scalar>::HasCmp };
429
+ };
430
+
431
+ template <typename Scalar>
432
+ struct count_visitor {
433
+ using result_type = Index;
434
+ using Packet = typename packet_traits<Scalar>::type;
435
+ EIGEN_DEVICE_FUNC inline void init(const Scalar& value, Index, Index) { res = value != Scalar(0) ? 1 : 0; }
436
+ EIGEN_DEVICE_FUNC inline void init(const Scalar& value, Index) { res = value != Scalar(0) ? 1 : 0; }
437
+ EIGEN_DEVICE_FUNC inline Index count_redux(const Packet& p) const {
438
+ const Packet cst_one = pset1<Packet>(Scalar(1));
439
+ Packet true_vals = pandnot(cst_one, pcmp_eq(p, pzero(p)));
440
+ Scalar num_true = predux(true_vals);
441
+ return static_cast<Index>(num_true);
265
442
  }
443
+ EIGEN_DEVICE_FUNC inline void initpacket(const Packet& p, Index, Index) { res = count_redux(p); }
444
+ EIGEN_DEVICE_FUNC inline void initpacket(const Packet& p, Index) { res = count_redux(p); }
445
+ EIGEN_DEVICE_FUNC inline void operator()(const Scalar& value, Index, Index) {
446
+ if (value != Scalar(0)) res++;
447
+ }
448
+ EIGEN_DEVICE_FUNC inline void operator()(const Scalar& value, Index) {
449
+ if (value != Scalar(0)) res++;
450
+ }
451
+ EIGEN_DEVICE_FUNC inline void packet(const Packet& p, Index, Index) { res += count_redux(p); }
452
+ EIGEN_DEVICE_FUNC inline void packet(const Packet& p, Index) { res += count_redux(p); }
453
+ Index res = 0;
266
454
  };
267
455
 
268
- template<typename Scalar, int NaNPropagation>
269
- struct functor_traits<max_coeff_visitor<Scalar, NaNPropagation> > {
456
+ template <typename Scalar>
457
+ struct functor_traits<count_visitor<Scalar>> {
270
458
  enum {
271
- Cost = NumTraits<Scalar>::AddCost
459
+ Cost = NumTraits<Scalar>::AddCost,
460
+ LinearAccess = true,
461
+ // predux is problematic for bool
462
+ PacketAccess = packet_traits<Scalar>::HasCmp && packet_traits<Scalar>::HasAdd && !is_same<Scalar, bool>::value
272
463
  };
273
464
  };
274
465
 
275
- } // end namespace internal
276
-
277
- /** \fn DenseBase<Derived>::minCoeff(IndexType* rowId, IndexType* colId) const
278
- * \returns the minimum of all coefficients of *this and puts in *row and *col its location.
279
- *
280
- * In case \c *this contains NaN, NaNPropagation determines the behavior:
281
- * NaNPropagation == PropagateFast : undefined
282
- * NaNPropagation == PropagateNaN : result is NaN
283
- * NaNPropagation == PropagateNumbers : result is maximum of elements that are not NaN
284
- * \warning the matrix must be not empty, otherwise an assertion is triggered.
285
- *
286
- * \sa DenseBase::minCoeff(Index*), DenseBase::maxCoeff(Index*,Index*), DenseBase::visit(), DenseBase::minCoeff()
287
- */
288
- template<typename Derived>
289
- template<int NaNPropagation, typename IndexType>
290
- EIGEN_DEVICE_FUNC
291
- typename internal::traits<Derived>::Scalar
292
- DenseBase<Derived>::minCoeff(IndexType* rowId, IndexType* colId) const
293
- {
294
- eigen_assert(this->rows()>0 && this->cols()>0 && "you are using an empty matrix");
295
-
296
- internal::min_coeff_visitor<Derived, NaNPropagation> minVisitor;
297
- this->visit(minVisitor);
298
- *rowId = minVisitor.row;
299
- if (colId) *colId = minVisitor.col;
300
- return minVisitor.res;
466
+ template <typename Derived, bool AlwaysTrue = NumTraits<typename traits<Derived>::Scalar>::IsInteger>
467
+ struct all_finite_impl {
468
+ static EIGEN_DEVICE_FUNC inline bool run(const Derived& /*derived*/) { return true; }
469
+ };
470
+ #if !defined(__FINITE_MATH_ONLY__) || !(__FINITE_MATH_ONLY__)
471
+ template <typename Derived>
472
+ struct all_finite_impl<Derived, false> {
473
+ static EIGEN_DEVICE_FUNC inline bool run(const Derived& derived) { return derived.array().isFiniteTyped().all(); }
474
+ };
475
+ #endif
476
+
477
+ } // end namespace internal
478
+
479
+ /** \returns true if all coefficients are true
480
+ *
481
+ * Example: \include MatrixBase_all.cpp
482
+ * Output: \verbinclude MatrixBase_all.out
483
+ *
484
+ * \sa any(), Cwise::operator<()
485
+ */
486
+ template <typename Derived>
487
+ EIGEN_DEVICE_FUNC inline bool DenseBase<Derived>::all() const {
488
+ using Visitor = internal::all_visitor<Scalar>;
489
+ using impl = internal::visit_impl<Derived, Visitor, /*ShortCircuitEvaulation*/ true>;
490
+ Visitor visitor;
491
+ impl::run(derived(), visitor);
492
+ return visitor.res;
301
493
  }
302
494
 
303
- /** \returns the minimum of all coefficients of *this and puts in *index its location.
304
- *
305
- * In case \c *this contains NaN, NaNPropagation determines the behavior:
306
- * NaNPropagation == PropagateFast : undefined
307
- * NaNPropagation == PropagateNaN : result is NaN
308
- * NaNPropagation == PropagateNumbers : result is maximum of elements that are not NaN
309
- * \warning the matrix must be not empty, otherwise an assertion is triggered.
310
- *
311
- * \sa DenseBase::minCoeff(IndexType*,IndexType*), DenseBase::maxCoeff(IndexType*,IndexType*), DenseBase::visit(), DenseBase::minCoeff()
312
- */
313
- template<typename Derived>
314
- template<int NaNPropagation, typename IndexType>
315
- EIGEN_DEVICE_FUNC
316
- typename internal::traits<Derived>::Scalar
317
- DenseBase<Derived>::minCoeff(IndexType* index) const
318
- {
319
- eigen_assert(this->rows()>0 && this->cols()>0 && "you are using an empty matrix");
320
-
321
- EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
322
- internal::min_coeff_visitor<Derived, NaNPropagation> minVisitor;
323
- this->visit(minVisitor);
324
- *index = IndexType((RowsAtCompileTime==1) ? minVisitor.col : minVisitor.row);
325
- return minVisitor.res;
495
+ /** \returns true if at least one coefficient is true
496
+ *
497
+ * \sa all()
498
+ */
499
+ template <typename Derived>
500
+ EIGEN_DEVICE_FUNC inline bool DenseBase<Derived>::any() const {
501
+ using Visitor = internal::any_visitor<Scalar>;
502
+ using impl = internal::visit_impl<Derived, Visitor, /*ShortCircuitEvaulation*/ true>;
503
+ Visitor visitor;
504
+ impl::run(derived(), visitor);
505
+ return visitor.res;
326
506
  }
327
507
 
328
- /** \fn DenseBase<Derived>::maxCoeff(IndexType* rowId, IndexType* colId) const
329
- * \returns the maximum of all coefficients of *this and puts in *row and *col its location.
330
- *
331
- * In case \c *this contains NaN, NaNPropagation determines the behavior:
332
- * NaNPropagation == PropagateFast : undefined
333
- * NaNPropagation == PropagateNaN : result is NaN
334
- * NaNPropagation == PropagateNumbers : result is maximum of elements that are not NaN
335
- * \warning the matrix must be not empty, otherwise an assertion is triggered.
336
- *
337
- * \sa DenseBase::minCoeff(IndexType*,IndexType*), DenseBase::visit(), DenseBase::maxCoeff()
338
- */
339
- template<typename Derived>
340
- template<int NaNPropagation, typename IndexType>
341
- EIGEN_DEVICE_FUNC
342
- typename internal::traits<Derived>::Scalar
343
- DenseBase<Derived>::maxCoeff(IndexType* rowPtr, IndexType* colPtr) const
344
- {
345
- eigen_assert(this->rows()>0 && this->cols()>0 && "you are using an empty matrix");
346
-
347
- internal::max_coeff_visitor<Derived, NaNPropagation> maxVisitor;
348
- this->visit(maxVisitor);
349
- *rowPtr = maxVisitor.row;
350
- if (colPtr) *colPtr = maxVisitor.col;
351
- return maxVisitor.res;
508
+ /** \returns the number of coefficients which evaluate to true
509
+ *
510
+ * \sa all(), any()
511
+ */
512
+ template <typename Derived>
513
+ EIGEN_DEVICE_FUNC Index DenseBase<Derived>::count() const {
514
+ using Visitor = internal::count_visitor<Scalar>;
515
+ using impl = internal::visit_impl<Derived, Visitor, /*ShortCircuitEvaulation*/ false>;
516
+ Visitor visitor;
517
+ impl::run(derived(), visitor);
518
+ return visitor.res;
352
519
  }
353
520
 
354
- /** \returns the maximum of all coefficients of *this and puts in *index its location.
355
- *
356
- * In case \c *this contains NaN, NaNPropagation determines the behavior:
357
- * NaNPropagation == PropagateFast : undefined
358
- * NaNPropagation == PropagateNaN : result is NaN
359
- * NaNPropagation == PropagateNumbers : result is maximum of elements that are not NaN
360
- * \warning the matrix must be not empty, otherwise an assertion is triggered.
361
- *
362
- * \sa DenseBase::maxCoeff(IndexType*,IndexType*), DenseBase::minCoeff(IndexType*,IndexType*), DenseBase::visitor(), DenseBase::maxCoeff()
363
- */
364
- template<typename Derived>
365
- template<int NaNPropagation, typename IndexType>
366
- EIGEN_DEVICE_FUNC
367
- typename internal::traits<Derived>::Scalar
368
- DenseBase<Derived>::maxCoeff(IndexType* index) const
369
- {
370
- eigen_assert(this->rows()>0 && this->cols()>0 && "you are using an empty matrix");
371
-
372
- EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
373
- internal::max_coeff_visitor<Derived, NaNPropagation> maxVisitor;
374
- this->visit(maxVisitor);
375
- *index = (RowsAtCompileTime==1) ? maxVisitor.col : maxVisitor.row;
376
- return maxVisitor.res;
521
+ template <typename Derived>
522
+ EIGEN_DEVICE_FUNC inline bool DenseBase<Derived>::hasNaN() const {
523
+ return derived().cwiseTypedNotEqual(derived()).any();
524
+ }
525
+
526
+ /** \returns true if \c *this contains only finite numbers, i.e., no NaN and no +/-INF values.
527
+ *
528
+ * \sa hasNaN()
529
+ */
530
+ template <typename Derived>
531
+ EIGEN_DEVICE_FUNC inline bool DenseBase<Derived>::allFinite() const {
532
+ return internal::all_finite_impl<Derived>::run(derived());
377
533
  }
378
534
 
379
- } // end namespace Eigen
535
+ } // end namespace Eigen
380
536
 
381
- #endif // EIGEN_VISITOR_H
537
+ #endif // EIGEN_VISITOR_H