@smake/eigen 1.0.2 → 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 (435) hide show
  1. package/README.md +1 -1
  2. package/eigen/Eigen/AccelerateSupport +52 -0
  3. package/eigen/Eigen/Cholesky +18 -21
  4. package/eigen/Eigen/CholmodSupport +28 -28
  5. package/eigen/Eigen/Core +235 -326
  6. package/eigen/Eigen/Eigenvalues +16 -14
  7. package/eigen/Eigen/Geometry +21 -24
  8. package/eigen/Eigen/Householder +9 -8
  9. package/eigen/Eigen/IterativeLinearSolvers +8 -4
  10. package/eigen/Eigen/Jacobi +14 -14
  11. package/eigen/Eigen/KLUSupport +43 -0
  12. package/eigen/Eigen/LU +16 -20
  13. package/eigen/Eigen/MetisSupport +12 -12
  14. package/eigen/Eigen/OrderingMethods +54 -54
  15. package/eigen/Eigen/PaStiXSupport +23 -20
  16. package/eigen/Eigen/PardisoSupport +17 -14
  17. package/eigen/Eigen/QR +18 -21
  18. package/eigen/Eigen/QtAlignedMalloc +5 -13
  19. package/eigen/Eigen/SPQRSupport +21 -14
  20. package/eigen/Eigen/SVD +23 -18
  21. package/eigen/Eigen/Sparse +1 -4
  22. package/eigen/Eigen/SparseCholesky +18 -23
  23. package/eigen/Eigen/SparseCore +18 -17
  24. package/eigen/Eigen/SparseLU +12 -8
  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 +377 -401
  37. package/eigen/Eigen/src/Cholesky/LLT.h +332 -360
  38. package/eigen/Eigen/src/Cholesky/LLT_LAPACKE.h +81 -56
  39. package/eigen/Eigen/src/CholmodSupport/CholmodSupport.h +620 -521
  40. package/eigen/Eigen/src/CholmodSupport/InternalHeaderCheck.h +3 -0
  41. package/eigen/Eigen/src/Core/ArithmeticSequence.h +239 -0
  42. package/eigen/Eigen/src/Core/Array.h +341 -294
  43. package/eigen/Eigen/src/Core/ArrayBase.h +190 -203
  44. package/eigen/Eigen/src/Core/ArrayWrapper.h +127 -171
  45. package/eigen/Eigen/src/Core/Assign.h +30 -40
  46. package/eigen/Eigen/src/Core/AssignEvaluator.h +711 -589
  47. package/eigen/Eigen/src/Core/Assign_MKL.h +130 -125
  48. package/eigen/Eigen/src/Core/BandMatrix.h +268 -283
  49. package/eigen/Eigen/src/Core/Block.h +375 -398
  50. package/eigen/Eigen/src/Core/CommaInitializer.h +86 -97
  51. package/eigen/Eigen/src/Core/ConditionEstimator.h +51 -53
  52. package/eigen/Eigen/src/Core/CoreEvaluators.h +1356 -1026
  53. package/eigen/Eigen/src/Core/CoreIterators.h +73 -59
  54. package/eigen/Eigen/src/Core/CwiseBinaryOp.h +114 -132
  55. package/eigen/Eigen/src/Core/CwiseNullaryOp.h +726 -617
  56. package/eigen/Eigen/src/Core/CwiseTernaryOp.h +77 -103
  57. package/eigen/Eigen/src/Core/CwiseUnaryOp.h +56 -68
  58. package/eigen/Eigen/src/Core/CwiseUnaryView.h +132 -95
  59. package/eigen/Eigen/src/Core/DenseBase.h +632 -571
  60. package/eigen/Eigen/src/Core/DenseCoeffsBase.h +511 -624
  61. package/eigen/Eigen/src/Core/DenseStorage.h +512 -509
  62. package/eigen/Eigen/src/Core/DeviceWrapper.h +153 -0
  63. package/eigen/Eigen/src/Core/Diagonal.h +169 -210
  64. package/eigen/Eigen/src/Core/DiagonalMatrix.h +351 -274
  65. package/eigen/Eigen/src/Core/DiagonalProduct.h +12 -10
  66. package/eigen/Eigen/src/Core/Dot.h +172 -222
  67. package/eigen/Eigen/src/Core/EigenBase.h +75 -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 -109
  71. package/eigen/Eigen/src/Core/Fuzzy.h +82 -105
  72. package/eigen/Eigen/src/Core/GeneralProduct.h +327 -263
  73. package/eigen/Eigen/src/Core/GenericPacketMath.h +1472 -360
  74. package/eigen/Eigen/src/Core/GlobalFunctions.h +194 -151
  75. package/eigen/Eigen/src/Core/IO.h +147 -139
  76. package/eigen/Eigen/src/Core/IndexedView.h +321 -0
  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 +56 -66
  80. package/eigen/Eigen/src/Core/Map.h +124 -142
  81. package/eigen/Eigen/src/Core/MapBase.h +256 -281
  82. package/eigen/Eigen/src/Core/MathFunctions.h +1620 -938
  83. package/eigen/Eigen/src/Core/MathFunctionsImpl.h +233 -71
  84. package/eigen/Eigen/src/Core/Matrix.h +491 -416
  85. package/eigen/Eigen/src/Core/MatrixBase.h +468 -453
  86. package/eigen/Eigen/src/Core/NestByValue.h +66 -85
  87. package/eigen/Eigen/src/Core/NoAlias.h +79 -85
  88. package/eigen/Eigen/src/Core/NumTraits.h +235 -148
  89. package/eigen/Eigen/src/Core/PartialReduxEvaluator.h +253 -0
  90. package/eigen/Eigen/src/Core/PermutationMatrix.h +461 -511
  91. package/eigen/Eigen/src/Core/PlainObjectBase.h +871 -894
  92. package/eigen/Eigen/src/Core/Product.h +260 -139
  93. package/eigen/Eigen/src/Core/ProductEvaluators.h +863 -714
  94. package/eigen/Eigen/src/Core/Random.h +161 -136
  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 +366 -336
  98. package/eigen/Eigen/src/Core/Ref.h +308 -209
  99. package/eigen/Eigen/src/Core/Replicate.h +94 -106
  100. package/eigen/Eigen/src/Core/Reshaped.h +398 -0
  101. package/eigen/Eigen/src/Core/ReturnByValue.h +49 -55
  102. package/eigen/Eigen/src/Core/Reverse.h +136 -145
  103. package/eigen/Eigen/src/Core/Select.h +70 -140
  104. package/eigen/Eigen/src/Core/SelfAdjointView.h +262 -285
  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 +97 -111
  108. package/eigen/Eigen/src/Core/SolveTriangular.h +131 -129
  109. package/eigen/Eigen/src/Core/SolverBase.h +138 -101
  110. package/eigen/Eigen/src/Core/StableNorm.h +156 -160
  111. package/eigen/Eigen/src/Core/StlIterators.h +619 -0
  112. package/eigen/Eigen/src/Core/Stride.h +91 -88
  113. package/eigen/Eigen/src/Core/Swap.h +70 -38
  114. package/eigen/Eigen/src/Core/Transpose.h +295 -273
  115. package/eigen/Eigen/src/Core/Transpositions.h +272 -317
  116. package/eigen/Eigen/src/Core/TriangularMatrix.h +670 -755
  117. package/eigen/Eigen/src/Core/VectorBlock.h +59 -72
  118. package/eigen/Eigen/src/Core/VectorwiseOp.h +668 -630
  119. package/eigen/Eigen/src/Core/Visitor.h +480 -216
  120. package/eigen/Eigen/src/Core/arch/AVX/Complex.h +407 -293
  121. package/eigen/Eigen/src/Core/arch/AVX/MathFunctions.h +79 -388
  122. package/eigen/Eigen/src/Core/arch/AVX/PacketMath.h +2935 -491
  123. package/eigen/Eigen/src/Core/arch/AVX/Reductions.h +353 -0
  124. package/eigen/Eigen/src/Core/arch/AVX/TypeCasting.h +279 -22
  125. package/eigen/Eigen/src/Core/arch/AVX512/Complex.h +472 -0
  126. package/eigen/Eigen/src/Core/arch/AVX512/GemmKernel.h +1245 -0
  127. package/eigen/Eigen/src/Core/arch/AVX512/MathFunctions.h +85 -333
  128. package/eigen/Eigen/src/Core/arch/AVX512/MathFunctionsFP16.h +75 -0
  129. package/eigen/Eigen/src/Core/arch/AVX512/PacketMath.h +2490 -649
  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 +277 -0
  135. package/eigen/Eigen/src/Core/arch/AVX512/TypeCastingFP16.h +130 -0
  136. package/eigen/Eigen/src/Core/arch/AltiVec/Complex.h +521 -298
  137. package/eigen/Eigen/src/Core/arch/AltiVec/MathFunctions.h +39 -280
  138. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProduct.h +3686 -0
  139. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h +205 -0
  140. package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductMMA.h +901 -0
  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 +3391 -723
  144. package/eigen/Eigen/src/Core/arch/AltiVec/TypeCasting.h +153 -0
  145. package/eigen/Eigen/src/Core/arch/Default/BFloat16.h +866 -0
  146. package/eigen/Eigen/src/Core/arch/Default/ConjHelper.h +113 -14
  147. package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h +2634 -0
  148. package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h +227 -0
  149. package/eigen/Eigen/src/Core/arch/Default/Half.h +1091 -0
  150. package/eigen/Eigen/src/Core/arch/Default/Settings.h +11 -13
  151. package/eigen/Eigen/src/Core/arch/GPU/Complex.h +244 -0
  152. package/eigen/Eigen/src/Core/arch/GPU/MathFunctions.h +104 -0
  153. package/eigen/Eigen/src/Core/arch/GPU/PacketMath.h +1712 -0
  154. package/eigen/Eigen/src/Core/arch/GPU/Tuple.h +268 -0
  155. package/eigen/Eigen/src/Core/arch/GPU/TypeCasting.h +77 -0
  156. package/eigen/Eigen/src/Core/arch/HIP/hcc/math_constants.h +23 -0
  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 +620 -0
  164. package/eigen/Eigen/src/Core/arch/MSA/MathFunctions.h +379 -0
  165. package/eigen/Eigen/src/Core/arch/MSA/PacketMath.h +1237 -0
  166. package/eigen/Eigen/src/Core/arch/NEON/Complex.h +531 -289
  167. package/eigen/Eigen/src/Core/arch/NEON/GeneralBlockPanelKernel.h +243 -0
  168. package/eigen/Eigen/src/Core/arch/NEON/MathFunctions.h +50 -73
  169. package/eigen/Eigen/src/Core/arch/NEON/PacketMath.h +5915 -579
  170. package/eigen/Eigen/src/Core/arch/NEON/TypeCasting.h +1642 -0
  171. package/eigen/Eigen/src/Core/arch/NEON/UnaryFunctors.h +57 -0
  172. package/eigen/Eigen/src/Core/arch/SSE/Complex.h +366 -334
  173. package/eigen/Eigen/src/Core/arch/SSE/MathFunctions.h +40 -514
  174. package/eigen/Eigen/src/Core/arch/SSE/PacketMath.h +2164 -675
  175. package/eigen/Eigen/src/Core/arch/SSE/Reductions.h +324 -0
  176. package/eigen/Eigen/src/Core/arch/SSE/TypeCasting.h +188 -35
  177. package/eigen/Eigen/src/Core/arch/SVE/MathFunctions.h +48 -0
  178. package/eigen/Eigen/src/Core/arch/SVE/PacketMath.h +674 -0
  179. package/eigen/Eigen/src/Core/arch/SVE/TypeCasting.h +52 -0
  180. package/eigen/Eigen/src/Core/arch/SYCL/InteropHeaders.h +227 -0
  181. package/eigen/Eigen/src/Core/arch/SYCL/MathFunctions.h +303 -0
  182. package/eigen/Eigen/src/Core/arch/SYCL/PacketMath.h +576 -0
  183. package/eigen/Eigen/src/Core/arch/SYCL/TypeCasting.h +83 -0
  184. package/eigen/Eigen/src/Core/arch/ZVector/Complex.h +434 -261
  185. package/eigen/Eigen/src/Core/arch/ZVector/MathFunctions.h +160 -53
  186. package/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h +1073 -605
  187. package/eigen/Eigen/src/Core/functors/AssignmentFunctors.h +123 -117
  188. package/eigen/Eigen/src/Core/functors/BinaryFunctors.h +594 -322
  189. package/eigen/Eigen/src/Core/functors/NullaryFunctors.h +204 -118
  190. package/eigen/Eigen/src/Core/functors/StlFunctors.h +110 -97
  191. package/eigen/Eigen/src/Core/functors/TernaryFunctors.h +34 -7
  192. package/eigen/Eigen/src/Core/functors/UnaryFunctors.h +1158 -530
  193. package/eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h +2329 -1333
  194. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix.h +328 -364
  195. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +191 -178
  196. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h +85 -82
  197. package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix_BLAS.h +154 -73
  198. package/eigen/Eigen/src/Core/products/GeneralMatrixVector.h +396 -542
  199. package/eigen/Eigen/src/Core/products/GeneralMatrixVector_BLAS.h +80 -77
  200. package/eigen/Eigen/src/Core/products/Parallelizer.h +208 -92
  201. package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +331 -375
  202. package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix_BLAS.h +206 -224
  203. package/eigen/Eigen/src/Core/products/SelfadjointMatrixVector.h +139 -146
  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 -46
  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 -275
  212. package/eigen/Eigen/src/Core/products/TriangularSolverMatrix_BLAS.h +108 -109
  213. package/eigen/Eigen/src/Core/products/TriangularSolverVector.h +70 -93
  214. package/eigen/Eigen/src/Core/util/Assert.h +158 -0
  215. package/eigen/Eigen/src/Core/util/BlasUtil.h +413 -290
  216. package/eigen/Eigen/src/Core/util/ConfigureVectorization.h +543 -0
  217. package/eigen/Eigen/src/Core/util/Constants.h +314 -263
  218. package/eigen/Eigen/src/Core/util/DisableStupidWarnings.h +130 -78
  219. package/eigen/Eigen/src/Core/util/EmulateArray.h +270 -0
  220. package/eigen/Eigen/src/Core/util/ForwardDeclarations.h +450 -224
  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 +487 -0
  224. package/eigen/Eigen/src/Core/util/IntegralConstant.h +279 -0
  225. package/eigen/Eigen/src/Core/util/MKL_support.h +39 -30
  226. package/eigen/Eigen/src/Core/util/Macros.h +939 -646
  227. package/eigen/Eigen/src/Core/util/MaxSizeVector.h +139 -0
  228. package/eigen/Eigen/src/Core/util/Memory.h +1042 -650
  229. package/eigen/Eigen/src/Core/util/Meta.h +618 -426
  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 +51 -0
  233. package/eigen/Eigen/src/Core/util/Serializer.h +209 -0
  234. package/eigen/Eigen/src/Core/util/StaticAssert.h +51 -164
  235. package/eigen/Eigen/src/Core/util/SymbolicIndex.h +445 -0
  236. package/eigen/Eigen/src/Core/util/XprHelper.h +793 -538
  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 +91 -107
  246. package/eigen/Eigen/src/Eigenvalues/RealQZ.h +539 -606
  247. package/eigen/Eigen/src/Eigenvalues/RealSchur.h +348 -382
  248. package/eigen/Eigen/src/Eigenvalues/RealSchur_LAPACKE.h +41 -35
  249. package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +579 -600
  250. package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_LAPACKE.h +47 -44
  251. package/eigen/Eigen/src/Eigenvalues/Tridiagonalization.h +434 -461
  252. package/eigen/Eigen/src/Geometry/AlignedBox.h +307 -214
  253. package/eigen/Eigen/src/Geometry/AngleAxis.h +135 -137
  254. package/eigen/Eigen/src/Geometry/EulerAngles.h +163 -74
  255. package/eigen/Eigen/src/Geometry/Homogeneous.h +289 -333
  256. package/eigen/Eigen/src/Geometry/Hyperplane.h +152 -161
  257. package/eigen/Eigen/src/Geometry/InternalHeaderCheck.h +3 -0
  258. package/eigen/Eigen/src/Geometry/OrthoMethods.h +168 -145
  259. package/eigen/Eigen/src/Geometry/ParametrizedLine.h +141 -104
  260. package/eigen/Eigen/src/Geometry/Quaternion.h +595 -497
  261. package/eigen/Eigen/src/Geometry/Rotation2D.h +110 -108
  262. package/eigen/Eigen/src/Geometry/RotationBase.h +148 -145
  263. package/eigen/Eigen/src/Geometry/Scaling.h +115 -90
  264. package/eigen/Eigen/src/Geometry/Transform.h +896 -953
  265. package/eigen/Eigen/src/Geometry/Translation.h +100 -98
  266. package/eigen/Eigen/src/Geometry/Umeyama.h +79 -84
  267. package/eigen/Eigen/src/Geometry/arch/Geometry_SIMD.h +154 -0
  268. package/eigen/Eigen/src/Householder/BlockHouseholder.h +54 -42
  269. package/eigen/Eigen/src/Householder/Householder.h +104 -122
  270. package/eigen/Eigen/src/Householder/HouseholderSequence.h +416 -382
  271. package/eigen/Eigen/src/Householder/InternalHeaderCheck.h +3 -0
  272. package/eigen/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +153 -166
  273. package/eigen/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +127 -138
  274. package/eigen/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +95 -124
  275. package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h +269 -267
  276. package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h +246 -259
  277. package/eigen/Eigen/src/IterativeLinearSolvers/InternalHeaderCheck.h +3 -0
  278. package/eigen/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +218 -217
  279. package/eigen/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h +80 -103
  280. package/eigen/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h +59 -63
  281. package/eigen/Eigen/src/Jacobi/InternalHeaderCheck.h +3 -0
  282. package/eigen/Eigen/src/Jacobi/Jacobi.h +256 -291
  283. package/eigen/Eigen/src/KLUSupport/InternalHeaderCheck.h +3 -0
  284. package/eigen/Eigen/src/KLUSupport/KLUSupport.h +339 -0
  285. package/eigen/Eigen/src/LU/Determinant.h +60 -63
  286. package/eigen/Eigen/src/LU/FullPivLU.h +561 -626
  287. package/eigen/Eigen/src/LU/InternalHeaderCheck.h +3 -0
  288. package/eigen/Eigen/src/LU/InverseImpl.h +213 -275
  289. package/eigen/Eigen/src/LU/PartialPivLU.h +407 -435
  290. package/eigen/Eigen/src/LU/PartialPivLU_LAPACKE.h +54 -40
  291. package/eigen/Eigen/src/LU/arch/InverseSize4.h +353 -0
  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 +250 -282
  295. package/eigen/Eigen/src/OrderingMethods/Eigen_Colamd.h +950 -1103
  296. package/eigen/Eigen/src/OrderingMethods/InternalHeaderCheck.h +3 -0
  297. package/eigen/Eigen/src/OrderingMethods/Ordering.h +111 -122
  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 -429
  302. package/eigen/Eigen/src/QR/ColPivHouseholderQR.h +494 -473
  303. package/eigen/Eigen/src/QR/ColPivHouseholderQR_LAPACKE.h +120 -56
  304. package/eigen/Eigen/src/QR/CompleteOrthogonalDecomposition.h +223 -137
  305. package/eigen/Eigen/src/QR/FullPivHouseholderQR.h +517 -460
  306. package/eigen/Eigen/src/QR/HouseholderQR.h +412 -278
  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 +263 -261
  311. package/eigen/Eigen/src/SVD/BDCSVD.h +872 -679
  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 +585 -543
  315. package/eigen/Eigen/src/SVD/JacobiSVD_LAPACKE.h +85 -49
  316. package/eigen/Eigen/src/SVD/SVDBase.h +281 -160
  317. package/eigen/Eigen/src/SVD/UpperBidiagonalization.h +202 -237
  318. package/eigen/Eigen/src/SparseCholesky/InternalHeaderCheck.h +3 -0
  319. package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky.h +769 -590
  320. package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h +318 -129
  321. package/eigen/Eigen/src/SparseCore/AmbiVector.h +202 -251
  322. package/eigen/Eigen/src/SparseCore/CompressedStorage.h +184 -236
  323. package/eigen/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h +140 -184
  324. package/eigen/Eigen/src/SparseCore/InternalHeaderCheck.h +3 -0
  325. package/eigen/Eigen/src/SparseCore/SparseAssign.h +174 -111
  326. package/eigen/Eigen/src/SparseCore/SparseBlock.h +408 -477
  327. package/eigen/Eigen/src/SparseCore/SparseColEtree.h +100 -112
  328. package/eigen/Eigen/src/SparseCore/SparseCompressedBase.h +531 -280
  329. package/eigen/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +559 -347
  330. package/eigen/Eigen/src/SparseCore/SparseCwiseUnaryOp.h +100 -108
  331. package/eigen/Eigen/src/SparseCore/SparseDenseProduct.h +185 -191
  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 +1614 -1142
  337. package/eigen/Eigen/src/SparseCore/SparseMatrixBase.h +403 -357
  338. package/eigen/Eigen/src/SparseCore/SparsePermutation.h +186 -115
  339. package/eigen/Eigen/src/SparseCore/SparseProduct.h +100 -91
  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 +371 -414
  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 +146 -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 +814 -618
  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 +273 -255
  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 +90 -101
  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 +125 -133
  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 +451 -490
  370. package/eigen/Eigen/src/StlSupport/StdDeque.h +28 -105
  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 -732
  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 +480 -380
  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 +9976 -16182
  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.inc +1370 -0
  401. package/eigen/Eigen/src/plugins/CommonCwiseBinaryOps.inc +116 -0
  402. package/eigen/Eigen/src/plugins/CommonCwiseUnaryOps.inc +167 -0
  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/lib/LibEigen.d.ts +4 -0
  409. package/lib/LibEigen.js +14 -0
  410. package/lib/index.d.ts +1 -1
  411. package/lib/index.js +7 -3
  412. package/package.json +2 -10
  413. package/eigen/Eigen/CMakeLists.txt +0 -19
  414. package/eigen/Eigen/src/Core/BooleanRedux.h +0 -164
  415. package/eigen/Eigen/src/Core/arch/CUDA/Complex.h +0 -103
  416. package/eigen/Eigen/src/Core/arch/CUDA/Half.h +0 -675
  417. package/eigen/Eigen/src/Core/arch/CUDA/MathFunctions.h +0 -91
  418. package/eigen/Eigen/src/Core/arch/CUDA/PacketMath.h +0 -333
  419. package/eigen/Eigen/src/Core/arch/CUDA/PacketMathHalf.h +0 -1124
  420. package/eigen/Eigen/src/Core/arch/CUDA/TypeCasting.h +0 -212
  421. package/eigen/Eigen/src/Core/util/NonMPL2.h +0 -3
  422. package/eigen/Eigen/src/Geometry/arch/Geometry_SSE.h +0 -161
  423. package/eigen/Eigen/src/LU/arch/Inverse_SSE.h +0 -338
  424. package/eigen/Eigen/src/SparseCore/MappedSparseMatrix.h +0 -67
  425. package/eigen/Eigen/src/SparseLU/SparseLU_gemm_kernel.h +0 -280
  426. package/eigen/Eigen/src/misc/lapack.h +0 -152
  427. package/eigen/Eigen/src/plugins/ArrayCwiseBinaryOps.h +0 -332
  428. package/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.h +0 -552
  429. package/eigen/Eigen/src/plugins/BlockMethods.h +0 -1058
  430. package/eigen/Eigen/src/plugins/CommonCwiseBinaryOps.h +0 -115
  431. package/eigen/Eigen/src/plugins/CommonCwiseUnaryOps.h +0 -163
  432. package/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.h +0 -152
  433. package/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.h +0 -85
  434. package/lib/eigen.d.ts +0 -2
  435. package/lib/eigen.js +0 -15
@@ -11,15 +11,65 @@
11
11
  #ifndef EIGEN_META_H
12
12
  #define EIGEN_META_H
13
13
 
14
- #if defined(__CUDA_ARCH__)
14
+ // IWYU pragma: private
15
+ #include "../InternalHeaderCheck.h"
16
+
17
+ #if defined(EIGEN_GPU_COMPILE_PHASE)
18
+
15
19
  #include <cfloat>
20
+
21
+ #if defined(EIGEN_CUDA_ARCH)
16
22
  #include <math_constants.h>
17
23
  #endif
18
24
 
19
- #if EIGEN_COMP_ICC>=1600 && __cplusplus >= 201103L
20
- #include <cstdint>
25
+ #if defined(EIGEN_HIP_DEVICE_COMPILE)
26
+ #include "Eigen/src/Core/arch/HIP/hcc/math_constants.h"
21
27
  #endif
22
28
 
29
+ #endif
30
+
31
+ // Define portable (u)int{32,64} types
32
+ #include <cstdint>
33
+
34
+ namespace Eigen {
35
+ namespace numext {
36
+ typedef std::uint8_t uint8_t;
37
+ typedef std::int8_t int8_t;
38
+ typedef std::uint16_t uint16_t;
39
+ typedef std::int16_t int16_t;
40
+ typedef std::uint32_t uint32_t;
41
+ typedef std::int32_t int32_t;
42
+ typedef std::uint64_t uint64_t;
43
+ typedef std::int64_t int64_t;
44
+
45
+ template <size_t Size>
46
+ struct get_integer_by_size {
47
+ typedef void signed_type;
48
+ typedef void unsigned_type;
49
+ };
50
+ template <>
51
+ struct get_integer_by_size<1> {
52
+ typedef int8_t signed_type;
53
+ typedef uint8_t unsigned_type;
54
+ };
55
+ template <>
56
+ struct get_integer_by_size<2> {
57
+ typedef int16_t signed_type;
58
+ typedef uint16_t unsigned_type;
59
+ };
60
+ template <>
61
+ struct get_integer_by_size<4> {
62
+ typedef int32_t signed_type;
63
+ typedef uint32_t unsigned_type;
64
+ };
65
+ template <>
66
+ struct get_integer_by_size<8> {
67
+ typedef int64_t signed_type;
68
+ typedef uint64_t unsigned_type;
69
+ };
70
+ } // namespace numext
71
+ } // namespace Eigen
72
+
23
73
  namespace Eigen {
24
74
 
25
75
  typedef EIGEN_DEFAULT_DENSE_INDEX_TYPE DenseIndex;
@@ -29,540 +79,682 @@ typedef EIGEN_DEFAULT_DENSE_INDEX_TYPE DenseIndex;
29
79
  * \details To change this, \c \#define the preprocessor symbol \c EIGEN_DEFAULT_DENSE_INDEX_TYPE.
30
80
  * \sa \blank \ref TopicPreprocessorDirectives, StorageIndex.
31
81
  */
32
-
33
82
  typedef EIGEN_DEFAULT_DENSE_INDEX_TYPE Index;
34
83
 
35
84
  namespace internal {
36
85
 
37
86
  /** \internal
38
- * \file Meta.h
39
- * This file contains generic metaprogramming classes which are not specifically related to Eigen.
40
- * \note In case you wonder, yes we're aware that Boost already provides all these features,
41
- * we however don't want to add a dependency to Boost.
42
- */
43
-
44
- // Only recent versions of ICC complain about using ptrdiff_t to hold pointers,
45
- // and older versions do not provide *intptr_t types.
46
- #if EIGEN_COMP_ICC>=1600 && __cplusplus >= 201103L
47
- typedef std::intptr_t IntPtr;
48
- typedef std::uintptr_t UIntPtr;
49
- #else
50
- typedef std::ptrdiff_t IntPtr;
51
- typedef std::size_t UIntPtr;
52
- #endif
53
-
54
- struct true_type { enum { value = 1 }; };
55
- struct false_type { enum { value = 0 }; };
56
-
57
- template<bool Condition, typename Then, typename Else>
58
- struct conditional { typedef Then type; };
59
-
60
- template<typename Then, typename Else>
61
- struct conditional <false, Then, Else> { typedef Else type; };
62
-
63
- template<typename T, typename U> struct is_same { enum { value = 0 }; };
64
- template<typename T> struct is_same<T,T> { enum { value = 1 }; };
65
-
66
- template<typename T> struct remove_reference { typedef T type; };
67
- template<typename T> struct remove_reference<T&> { typedef T type; };
68
-
69
- template<typename T> struct remove_pointer { typedef T type; };
70
- template<typename T> struct remove_pointer<T*> { typedef T type; };
71
- template<typename T> struct remove_pointer<T*const> { typedef T type; };
72
-
73
- template <class T> struct remove_const { typedef T type; };
74
- template <class T> struct remove_const<const T> { typedef T type; };
75
- template <class T> struct remove_const<const T[]> { typedef T type[]; };
76
- template <class T, unsigned int Size> struct remove_const<const T[Size]> { typedef T type[Size]; };
77
-
78
- template<typename T> struct remove_all { typedef T type; };
79
- template<typename T> struct remove_all<const T> { typedef typename remove_all<T>::type type; };
80
- template<typename T> struct remove_all<T const&> { typedef typename remove_all<T>::type type; };
81
- template<typename T> struct remove_all<T&> { typedef typename remove_all<T>::type type; };
82
- template<typename T> struct remove_all<T const*> { typedef typename remove_all<T>::type type; };
83
- template<typename T> struct remove_all<T*> { typedef typename remove_all<T>::type type; };
84
-
85
- template<typename T> struct is_arithmetic { enum { value = false }; };
86
- template<> struct is_arithmetic<float> { enum { value = true }; };
87
- template<> struct is_arithmetic<double> { enum { value = true }; };
88
- template<> struct is_arithmetic<long double> { enum { value = true }; };
89
- template<> struct is_arithmetic<bool> { enum { value = true }; };
90
- template<> struct is_arithmetic<char> { enum { value = true }; };
91
- template<> struct is_arithmetic<signed char> { enum { value = true }; };
92
- template<> struct is_arithmetic<unsigned char> { enum { value = true }; };
93
- template<> struct is_arithmetic<signed short> { enum { value = true }; };
94
- template<> struct is_arithmetic<unsigned short>{ enum { value = true }; };
95
- template<> struct is_arithmetic<signed int> { enum { value = true }; };
96
- template<> struct is_arithmetic<unsigned int> { enum { value = true }; };
97
- template<> struct is_arithmetic<signed long> { enum { value = true }; };
98
- template<> struct is_arithmetic<unsigned long> { enum { value = true }; };
99
-
100
- #if EIGEN_HAS_CXX11
101
- using std::is_integral;
102
- #else
103
- template<typename T> struct is_integral { enum { value = false }; };
104
- template<> struct is_integral<bool> { enum { value = true }; };
105
- template<> struct is_integral<char> { enum { value = true }; };
106
- template<> struct is_integral<signed char> { enum { value = true }; };
107
- template<> struct is_integral<unsigned char> { enum { value = true }; };
108
- template<> struct is_integral<signed short> { enum { value = true }; };
109
- template<> struct is_integral<unsigned short> { enum { value = true }; };
110
- template<> struct is_integral<signed int> { enum { value = true }; };
111
- template<> struct is_integral<unsigned int> { enum { value = true }; };
112
- template<> struct is_integral<signed long> { enum { value = true }; };
113
- template<> struct is_integral<unsigned long> { enum { value = true }; };
114
- #if EIGEN_COMP_MSVC
115
- template<> struct is_integral<signed __int64> { enum { value = true }; };
116
- template<> struct is_integral<unsigned __int64>{ enum { value = true }; };
117
- #endif
118
- #endif
87
+ * \file Meta.h
88
+ * This file contains generic metaprogramming classes which are not specifically related to Eigen.
89
+ * \note In case you wonder, yes we're aware that Boost already provides all these features,
90
+ * we however don't want to add a dependency to Boost.
91
+ */
119
92
 
120
- #if EIGEN_HAS_CXX11
121
- using std::make_unsigned;
122
- #else
123
- // TODO: Possibly improve this implementation of make_unsigned.
124
- // It is currently used only by
125
- // template<typename Scalar> struct random_default_impl<Scalar, false, true>.
126
- template<typename> struct make_unsigned;
127
- template<> struct make_unsigned<char> { typedef unsigned char type; };
128
- template<> struct make_unsigned<signed char> { typedef unsigned char type; };
129
- template<> struct make_unsigned<unsigned char> { typedef unsigned char type; };
130
- template<> struct make_unsigned<signed short> { typedef unsigned short type; };
131
- template<> struct make_unsigned<unsigned short> { typedef unsigned short type; };
132
- template<> struct make_unsigned<signed int> { typedef unsigned int type; };
133
- template<> struct make_unsigned<unsigned int> { typedef unsigned int type; };
134
- template<> struct make_unsigned<signed long> { typedef unsigned long type; };
135
- template<> struct make_unsigned<unsigned long> { typedef unsigned long type; };
136
- #if EIGEN_COMP_MSVC
137
- template<> struct make_unsigned<signed __int64> { typedef unsigned __int64 type; };
138
- template<> struct make_unsigned<unsigned __int64> { typedef unsigned __int64 type; };
139
- #endif
140
- #endif
93
+ using std::false_type;
94
+ using std::true_type;
141
95
 
142
- template <typename T> struct add_const { typedef const T type; };
143
- template <typename T> struct add_const<T&> { typedef T& type; };
96
+ template <bool Condition>
97
+ struct bool_constant;
144
98
 
145
- template <typename T> struct is_const { enum { value = 0 }; };
146
- template <typename T> struct is_const<T const> { enum { value = 1 }; };
99
+ template <>
100
+ struct bool_constant<true> : true_type {};
147
101
 
148
- template<typename T> struct add_const_on_value_type { typedef const T type; };
149
- template<typename T> struct add_const_on_value_type<T&> { typedef T const& type; };
150
- template<typename T> struct add_const_on_value_type<T*> { typedef T const* type; };
151
- template<typename T> struct add_const_on_value_type<T* const> { typedef T const* const type; };
152
- template<typename T> struct add_const_on_value_type<T const* const> { typedef T const* const type; };
102
+ template <>
103
+ struct bool_constant<false> : false_type {};
153
104
 
105
+ // Third-party libraries rely on these.
106
+ using std::conditional;
107
+ using std::remove_const;
108
+ using std::remove_pointer;
109
+ using std::remove_reference;
154
110
 
155
- template<typename From, typename To>
156
- struct is_convertible_impl
157
- {
158
- private:
159
- struct any_conversion
160
- {
161
- template <typename T> any_conversion(const volatile T&);
162
- template <typename T> any_conversion(T&);
163
- };
164
- struct yes {int a[1];};
165
- struct no {int a[2];};
111
+ template <typename T>
112
+ struct remove_all {
113
+ typedef T type;
114
+ };
115
+ template <typename T>
116
+ struct remove_all<const T> {
117
+ typedef typename remove_all<T>::type type;
118
+ };
119
+ template <typename T>
120
+ struct remove_all<T const&> {
121
+ typedef typename remove_all<T>::type type;
122
+ };
123
+ template <typename T>
124
+ struct remove_all<T&> {
125
+ typedef typename remove_all<T>::type type;
126
+ };
127
+ template <typename T>
128
+ struct remove_all<T const*> {
129
+ typedef typename remove_all<T>::type type;
130
+ };
131
+ template <typename T>
132
+ struct remove_all<T*> {
133
+ typedef typename remove_all<T>::type type;
134
+ };
166
135
 
167
- static yes test(const To&, int);
168
- static no test(any_conversion, ...);
136
+ template <typename T>
137
+ using remove_all_t = typename remove_all<T>::type;
169
138
 
170
- public:
171
- static From ms_from;
172
- #ifdef __INTEL_COMPILER
173
- #pragma warning push
174
- #pragma warning ( disable : 2259 )
175
- #endif
176
- enum { value = sizeof(test(ms_from, 0))==sizeof(yes) };
177
- #ifdef __INTEL_COMPILER
178
- #pragma warning pop
139
+ template <typename T>
140
+ struct is_arithmetic {
141
+ enum { value = false };
142
+ };
143
+ template <>
144
+ struct is_arithmetic<float> {
145
+ enum { value = true };
146
+ };
147
+ template <>
148
+ struct is_arithmetic<double> {
149
+ enum { value = true };
150
+ };
151
+ // GPU devices treat `long double` as `double`.
152
+ #ifndef EIGEN_GPU_COMPILE_PHASE
153
+ template <>
154
+ struct is_arithmetic<long double> {
155
+ enum { value = true };
156
+ };
179
157
  #endif
158
+ template <>
159
+ struct is_arithmetic<bool> {
160
+ enum { value = true };
180
161
  };
181
-
182
- template<typename From, typename To>
183
- struct is_convertible
184
- {
185
- enum { value = is_convertible_impl<typename remove_all<From>::type,
186
- typename remove_all<To >::type>::value };
162
+ template <>
163
+ struct is_arithmetic<char> {
164
+ enum { value = true };
165
+ };
166
+ template <>
167
+ struct is_arithmetic<signed char> {
168
+ enum { value = true };
169
+ };
170
+ template <>
171
+ struct is_arithmetic<unsigned char> {
172
+ enum { value = true };
173
+ };
174
+ template <>
175
+ struct is_arithmetic<signed short> {
176
+ enum { value = true };
177
+ };
178
+ template <>
179
+ struct is_arithmetic<unsigned short> {
180
+ enum { value = true };
181
+ };
182
+ template <>
183
+ struct is_arithmetic<signed int> {
184
+ enum { value = true };
185
+ };
186
+ template <>
187
+ struct is_arithmetic<unsigned int> {
188
+ enum { value = true };
189
+ };
190
+ template <>
191
+ struct is_arithmetic<signed long> {
192
+ enum { value = true };
193
+ };
194
+ template <>
195
+ struct is_arithmetic<unsigned long> {
196
+ enum { value = true };
187
197
  };
188
198
 
189
- /** \internal Allows to enable/disable an overload
190
- * according to a compile time condition.
191
- */
192
- template<bool Condition, typename T=void> struct enable_if;
199
+ template <typename T, typename U>
200
+ struct is_same {
201
+ enum { value = 0 };
202
+ };
203
+ template <typename T>
204
+ struct is_same<T, T> {
205
+ enum { value = 1 };
206
+ };
193
207
 
194
- template<typename T> struct enable_if<true,T>
195
- { typedef T type; };
208
+ template <class T>
209
+ struct is_void : is_same<void, std::remove_const_t<T>> {};
196
210
 
197
- #if defined(__CUDA_ARCH__)
198
- #if !defined(__FLT_EPSILON__)
199
- #define __FLT_EPSILON__ FLT_EPSILON
200
- #define __DBL_EPSILON__ DBL_EPSILON
211
+ /** \internal
212
+ * Implementation of std::void_t for SFINAE.
213
+ *
214
+ * Pre C++17:
215
+ * Custom implementation.
216
+ *
217
+ * Post C++17: Uses std::void_t
218
+ */
219
+ #if EIGEN_COMP_CXXVER >= 17 && defined(__cpp_lib_void_t) && __cpp_lib_void_t >= 201411L
220
+ using std::void_t;
221
+ #else
222
+ template <typename...>
223
+ using void_t = void;
201
224
  #endif
202
225
 
203
- namespace device {
204
-
205
- template<typename T> struct numeric_limits
206
- {
207
- EIGEN_DEVICE_FUNC
208
- static T epsilon() { return 0; }
209
- static T (max)() { assert(false && "Highest not supported for this type"); }
210
- static T (min)() { assert(false && "Lowest not supported for this type"); }
211
- static T infinity() { assert(false && "Infinity not supported for this type"); }
212
- static T quiet_NaN() { assert(false && "quiet_NaN not supported for this type"); }
213
- };
214
- template<> struct numeric_limits<float>
215
- {
216
- EIGEN_DEVICE_FUNC
217
- static float epsilon() { return __FLT_EPSILON__; }
218
- EIGEN_DEVICE_FUNC
219
- static float (max)() { return CUDART_MAX_NORMAL_F; }
220
- EIGEN_DEVICE_FUNC
221
- static float (min)() { return FLT_MIN; }
222
- EIGEN_DEVICE_FUNC
223
- static float infinity() { return CUDART_INF_F; }
224
- EIGEN_DEVICE_FUNC
225
- static float quiet_NaN() { return CUDART_NAN_F; }
226
- };
227
- template<> struct numeric_limits<double>
228
- {
229
- EIGEN_DEVICE_FUNC
230
- static double epsilon() { return __DBL_EPSILON__; }
231
- EIGEN_DEVICE_FUNC
232
- static double (max)() { return DBL_MAX; }
233
- EIGEN_DEVICE_FUNC
234
- static double (min)() { return DBL_MIN; }
235
- EIGEN_DEVICE_FUNC
236
- static double infinity() { return CUDART_INF; }
237
- EIGEN_DEVICE_FUNC
238
- static double quiet_NaN() { return CUDART_NAN; }
239
- };
240
- template<> struct numeric_limits<int>
241
- {
242
- EIGEN_DEVICE_FUNC
243
- static int epsilon() { return 0; }
244
- EIGEN_DEVICE_FUNC
245
- static int (max)() { return INT_MAX; }
246
- EIGEN_DEVICE_FUNC
247
- static int (min)() { return INT_MIN; }
248
- };
249
- template<> struct numeric_limits<unsigned int>
250
- {
251
- EIGEN_DEVICE_FUNC
252
- static unsigned int epsilon() { return 0; }
253
- EIGEN_DEVICE_FUNC
254
- static unsigned int (max)() { return UINT_MAX; }
255
- EIGEN_DEVICE_FUNC
256
- static unsigned int (min)() { return 0; }
257
- };
258
- template<> struct numeric_limits<long>
259
- {
260
- EIGEN_DEVICE_FUNC
261
- static long epsilon() { return 0; }
262
- EIGEN_DEVICE_FUNC
263
- static long (max)() { return LONG_MAX; }
264
- EIGEN_DEVICE_FUNC
265
- static long (min)() { return LONG_MIN; }
266
- };
267
- template<> struct numeric_limits<unsigned long>
268
- {
269
- EIGEN_DEVICE_FUNC
270
- static unsigned long epsilon() { return 0; }
271
- EIGEN_DEVICE_FUNC
272
- static unsigned long (max)() { return ULONG_MAX; }
273
- EIGEN_DEVICE_FUNC
274
- static unsigned long (min)() { return 0; }
275
- };
276
- template<> struct numeric_limits<long long>
277
- {
278
- EIGEN_DEVICE_FUNC
279
- static long long epsilon() { return 0; }
280
- EIGEN_DEVICE_FUNC
281
- static long long (max)() { return LLONG_MAX; }
282
- EIGEN_DEVICE_FUNC
283
- static long long (min)() { return LLONG_MIN; }
284
- };
285
- template<> struct numeric_limits<unsigned long long>
286
- {
287
- EIGEN_DEVICE_FUNC
288
- static unsigned long long epsilon() { return 0; }
289
- EIGEN_DEVICE_FUNC
290
- static unsigned long long (max)() { return ULLONG_MAX; }
291
- EIGEN_DEVICE_FUNC
292
- static unsigned long long (min)() { return 0; }
226
+ template <>
227
+ struct is_arithmetic<signed long long> {
228
+ enum { value = true };
229
+ };
230
+ template <>
231
+ struct is_arithmetic<unsigned long long> {
232
+ enum { value = true };
293
233
  };
234
+ using std::is_integral;
294
235
 
295
- }
236
+ using std::make_unsigned;
296
237
 
297
- #endif
238
+ template <typename T>
239
+ struct is_const {
240
+ enum { value = 0 };
241
+ };
242
+ template <typename T>
243
+ struct is_const<T const> {
244
+ enum { value = 1 };
245
+ };
246
+
247
+ template <typename T>
248
+ struct add_const_on_value_type {
249
+ typedef const T type;
250
+ };
251
+ template <typename T>
252
+ struct add_const_on_value_type<T&> {
253
+ typedef T const& type;
254
+ };
255
+ template <typename T>
256
+ struct add_const_on_value_type<T*> {
257
+ typedef T const* type;
258
+ };
259
+ template <typename T>
260
+ struct add_const_on_value_type<T* const> {
261
+ typedef T const* const type;
262
+ };
263
+ template <typename T>
264
+ struct add_const_on_value_type<T const* const> {
265
+ typedef T const* const type;
266
+ };
267
+
268
+ template <typename T>
269
+ using add_const_on_value_type_t = typename add_const_on_value_type<T>::type;
270
+
271
+ using std::is_convertible;
298
272
 
299
273
  /** \internal
300
- * A base class do disable default copy ctor and copy assignement operator.
301
- */
302
- class noncopyable
303
- {
274
+ * A base class do disable default copy ctor and copy assignment operator.
275
+ */
276
+ class noncopyable {
304
277
  EIGEN_DEVICE_FUNC noncopyable(const noncopyable&);
305
278
  EIGEN_DEVICE_FUNC const noncopyable& operator=(const noncopyable&);
306
- protected:
279
+
280
+ protected:
307
281
  EIGEN_DEVICE_FUNC noncopyable() {}
308
282
  EIGEN_DEVICE_FUNC ~noncopyable() {}
309
283
  };
310
284
 
311
285
  /** \internal
312
- * Convenient struct to get the result type of a unary or binary functor.
313
- *
314
- * It supports both the current STL mechanism (using the result_type member) as well as
315
- * upcoming next STL generation (using a templated result member).
316
- * If none of these members is provided, then the type of the first argument is returned. FIXME, that behavior is a pretty bad hack.
317
- */
318
- #if EIGEN_HAS_STD_RESULT_OF
319
- template<typename T> struct result_of {
320
- typedef typename std::result_of<T>::type type1;
321
- typedef typename remove_all<type1>::type type;
286
+ * Provides access to the number of elements in the object of as a compile-time constant expression.
287
+ * It "returns" Eigen::Dynamic if the size cannot be resolved at compile-time (default).
288
+ *
289
+ * Similar to std::tuple_size, but more general.
290
+ *
291
+ * It currently supports:
292
+ * - any types T defining T::SizeAtCompileTime
293
+ * - plain C arrays as T[N]
294
+ * - std::array (c++11)
295
+ * - some internal types such as SingleRange and AllRange
296
+ *
297
+ * The second template parameter eases SFINAE-based specializations.
298
+ */
299
+ template <typename T, typename EnableIf = void>
300
+ struct array_size {
301
+ static constexpr Index value = Dynamic;
322
302
  };
323
- #else
324
- template<typename T> struct result_of { };
325
-
326
- struct has_none {int a[1];};
327
- struct has_std_result_type {int a[2];};
328
- struct has_tr1_result {int a[3];};
329
303
 
330
- template<typename Func, typename ArgType, int SizeOf=sizeof(has_none)>
331
- struct unary_result_of_select {typedef typename internal::remove_all<ArgType>::type type;};
304
+ template <typename T>
305
+ struct array_size<T, std::enable_if_t<((T::SizeAtCompileTime & 0) == 0)>> {
306
+ static constexpr Index value = T::SizeAtCompileTime;
307
+ };
332
308
 
333
- template<typename Func, typename ArgType>
334
- struct unary_result_of_select<Func, ArgType, sizeof(has_std_result_type)> {typedef typename Func::result_type type;};
309
+ template <typename T, int N>
310
+ struct array_size<const T (&)[N]> {
311
+ static constexpr Index value = N;
312
+ };
313
+ template <typename T, int N>
314
+ struct array_size<T (&)[N]> {
315
+ static constexpr Index value = N;
316
+ };
335
317
 
336
- template<typename Func, typename ArgType>
337
- struct unary_result_of_select<Func, ArgType, sizeof(has_tr1_result)> {typedef typename Func::template result<Func(ArgType)>::type type;};
318
+ template <typename T, std::size_t N>
319
+ struct array_size<const std::array<T, N>> {
320
+ static constexpr Index value = N;
321
+ };
322
+ template <typename T, std::size_t N>
323
+ struct array_size<std::array<T, N>> {
324
+ static constexpr Index value = N;
325
+ };
338
326
 
339
- template<typename Func, typename ArgType>
340
- struct result_of<Func(ArgType)> {
341
- template<typename T>
342
- static has_std_result_type testFunctor(T const *, typename T::result_type const * = 0);
343
- template<typename T>
344
- static has_tr1_result testFunctor(T const *, typename T::template result<T(ArgType)>::type const * = 0);
345
- static has_none testFunctor(...);
327
+ /** \internal
328
+ * Analogue of the std::ssize free function.
329
+ * It returns the signed size of the container or view \a x of type \c T
330
+ *
331
+ * It currently supports:
332
+ * - any types T defining a member T::size() const
333
+ * - plain C arrays as T[N]
334
+ *
335
+ * For C++20, this function just forwards to `std::ssize`, or any ADL discoverable `ssize` function.
336
+ */
337
+ #if EIGEN_COMP_CXXVER >= 20 && defined(__cpp_lib_ssize) && __cpp_lib_ssize >= 201902L
346
338
 
347
- // note that the following indirection is needed for gcc-3.3
348
- enum {FunctorType = sizeof(testFunctor(static_cast<Func*>(0)))};
349
- typedef typename unary_result_of_select<Func, ArgType, FunctorType>::type type;
350
- };
339
+ template <typename T>
340
+ constexpr auto index_list_size(T&& x) {
341
+ using std::ssize;
342
+ return ssize(std::forward<T>(x));
343
+ }
351
344
 
352
- template<typename Func, typename ArgType0, typename ArgType1, int SizeOf=sizeof(has_none)>
353
- struct binary_result_of_select {typedef typename internal::remove_all<ArgType0>::type type;};
345
+ #else
354
346
 
355
- template<typename Func, typename ArgType0, typename ArgType1>
356
- struct binary_result_of_select<Func, ArgType0, ArgType1, sizeof(has_std_result_type)>
357
- {typedef typename Func::result_type type;};
347
+ template <typename T>
348
+ constexpr auto index_list_size(const T& x) {
349
+ using R = std::common_type_t<std::ptrdiff_t, std::make_signed_t<decltype(x.size())>>;
350
+ return static_cast<R>(x.size());
351
+ }
358
352
 
359
- template<typename Func, typename ArgType0, typename ArgType1>
360
- struct binary_result_of_select<Func, ArgType0, ArgType1, sizeof(has_tr1_result)>
361
- {typedef typename Func::template result<Func(ArgType0,ArgType1)>::type type;};
353
+ template <typename T, std::ptrdiff_t N>
354
+ constexpr std::ptrdiff_t index_list_size(const T (&)[N]) {
355
+ return N;
356
+ }
357
+ #endif
362
358
 
363
- template<typename Func, typename ArgType0, typename ArgType1>
364
- struct result_of<Func(ArgType0,ArgType1)> {
365
- template<typename T>
366
- static has_std_result_type testFunctor(T const *, typename T::result_type const * = 0);
367
- template<typename T>
368
- static has_tr1_result testFunctor(T const *, typename T::template result<T(ArgType0,ArgType1)>::type const * = 0);
369
- static has_none testFunctor(...);
359
+ /** \internal
360
+ * Convenient struct to get the result type of a nullary, unary, binary, or
361
+ * ternary functor.
362
+ *
363
+ * Pre C++17:
364
+ * This uses std::result_of. However, note the `type` member removes
365
+ * const and converts references/pointers to their corresponding value type.
366
+ *
367
+ * Post C++17: Uses std::invoke_result
368
+ */
369
+ #if EIGEN_HAS_STD_INVOKE_RESULT
370
+ template <typename T>
371
+ struct result_of;
370
372
 
371
- // note that the following indirection is needed for gcc-3.3
372
- enum {FunctorType = sizeof(testFunctor(static_cast<Func*>(0)))};
373
- typedef typename binary_result_of_select<Func, ArgType0, ArgType1, FunctorType>::type type;
373
+ template <typename F, typename... ArgTypes>
374
+ struct result_of<F(ArgTypes...)> {
375
+ typedef typename std::invoke_result<F, ArgTypes...>::type type1;
376
+ typedef remove_all_t<type1> type;
374
377
  };
375
378
 
376
- template<typename Func, typename ArgType0, typename ArgType1, typename ArgType2, int SizeOf=sizeof(has_none)>
377
- struct ternary_result_of_select {typedef typename internal::remove_all<ArgType0>::type type;};
379
+ template <typename F, typename... ArgTypes>
380
+ struct invoke_result {
381
+ typedef typename std::invoke_result<F, ArgTypes...>::type type1;
382
+ typedef remove_all_t<type1> type;
383
+ };
384
+ #else
385
+ template <typename T>
386
+ struct result_of {
387
+ typedef typename std::result_of<T>::type type1;
388
+ typedef remove_all_t<type1> type;
389
+ };
378
390
 
379
- template<typename Func, typename ArgType0, typename ArgType1, typename ArgType2>
380
- struct ternary_result_of_select<Func, ArgType0, ArgType1, ArgType2, sizeof(has_std_result_type)>
381
- {typedef typename Func::result_type type;};
391
+ template <typename F, typename... ArgTypes>
392
+ struct invoke_result {
393
+ typedef typename result_of<F(ArgTypes...)>::type type1;
394
+ typedef remove_all_t<type1> type;
395
+ };
396
+ #endif
382
397
 
383
- template<typename Func, typename ArgType0, typename ArgType1, typename ArgType2>
384
- struct ternary_result_of_select<Func, ArgType0, ArgType1, ArgType2, sizeof(has_tr1_result)>
385
- {typedef typename Func::template result<Func(ArgType0,ArgType1,ArgType2)>::type type;};
398
+ // Reduces a sequence of bools to true if all are true, false otherwise.
399
+ template <bool... values>
400
+ using reduce_all =
401
+ std::is_same<std::integer_sequence<bool, values..., true>, std::integer_sequence<bool, true, values...>>;
386
402
 
387
- template<typename Func, typename ArgType0, typename ArgType1, typename ArgType2>
388
- struct result_of<Func(ArgType0,ArgType1,ArgType2)> {
389
- template<typename T>
390
- static has_std_result_type testFunctor(T const *, typename T::result_type const * = 0);
391
- template<typename T>
392
- static has_tr1_result testFunctor(T const *, typename T::template result<T(ArgType0,ArgType1,ArgType2)>::type const * = 0);
393
- static has_none testFunctor(...);
403
+ // Reduces a sequence of bools to true if any are true, false if all false.
404
+ template <bool... values>
405
+ using reduce_any = std::integral_constant<bool, !std::is_same<std::integer_sequence<bool, values..., false>,
406
+ std::integer_sequence<bool, false, values...>>::value>;
394
407
 
395
- // note that the following indirection is needed for gcc-3.3
396
- enum {FunctorType = sizeof(testFunctor(static_cast<Func*>(0)))};
397
- typedef typename ternary_result_of_select<Func, ArgType0, ArgType1, ArgType2, FunctorType>::type type;
408
+ struct meta_yes {
409
+ char a[1];
410
+ };
411
+ struct meta_no {
412
+ char a[2];
398
413
  };
399
- #endif
400
-
401
- struct meta_yes { char a[1]; };
402
- struct meta_no { char a[2]; };
403
414
 
404
415
  // Check whether T::ReturnType does exist
405
416
  template <typename T>
406
- struct has_ReturnType
407
- {
408
- template <typename C> static meta_yes testFunctor(typename C::ReturnType const *);
409
- template <typename C> static meta_no testFunctor(...);
417
+ struct has_ReturnType {
418
+ template <typename C>
419
+ static meta_yes testFunctor(C const*, typename C::ReturnType const* = 0);
420
+ template <typename C>
421
+ static meta_no testFunctor(...);
410
422
 
411
- enum { value = sizeof(testFunctor<T>(0)) == sizeof(meta_yes) };
423
+ enum { value = sizeof(testFunctor<T>(static_cast<T*>(0))) == sizeof(meta_yes) };
412
424
  };
413
425
 
414
- template<typename T> const T* return_ptr();
426
+ template <typename T>
427
+ const T* return_ptr();
415
428
 
416
- template <typename T, typename IndexType=Index>
417
- struct has_nullary_operator
418
- {
419
- template <typename C> static meta_yes testFunctor(C const *,typename enable_if<(sizeof(return_ptr<C>()->operator()())>0)>::type * = 0);
429
+ template <typename T, typename IndexType = Index>
430
+ struct has_nullary_operator {
431
+ template <typename C>
432
+ static meta_yes testFunctor(C const*, std::enable_if_t<(sizeof(return_ptr<C>()->operator()()) > 0)>* = 0);
420
433
  static meta_no testFunctor(...);
421
434
 
422
435
  enum { value = sizeof(testFunctor(static_cast<T*>(0))) == sizeof(meta_yes) };
423
436
  };
424
437
 
425
- template <typename T, typename IndexType=Index>
426
- struct has_unary_operator
427
- {
428
- template <typename C> static meta_yes testFunctor(C const *,typename enable_if<(sizeof(return_ptr<C>()->operator()(IndexType(0)))>0)>::type * = 0);
438
+ template <typename T, typename IndexType = Index>
439
+ struct has_unary_operator {
440
+ template <typename C>
441
+ static meta_yes testFunctor(C const*, std::enable_if_t<(sizeof(return_ptr<C>()->operator()(IndexType(0))) > 0)>* = 0);
429
442
  static meta_no testFunctor(...);
430
443
 
431
444
  enum { value = sizeof(testFunctor(static_cast<T*>(0))) == sizeof(meta_yes) };
432
445
  };
433
446
 
434
- template <typename T, typename IndexType=Index>
435
- struct has_binary_operator
436
- {
437
- template <typename C> static meta_yes testFunctor(C const *,typename enable_if<(sizeof(return_ptr<C>()->operator()(IndexType(0),IndexType(0)))>0)>::type * = 0);
447
+ template <typename T, typename IndexType = Index>
448
+ struct has_binary_operator {
449
+ template <typename C>
450
+ static meta_yes testFunctor(
451
+ C const*, std::enable_if_t<(sizeof(return_ptr<C>()->operator()(IndexType(0), IndexType(0))) > 0)>* = 0);
438
452
  static meta_no testFunctor(...);
439
453
 
440
454
  enum { value = sizeof(testFunctor(static_cast<T*>(0))) == sizeof(meta_yes) };
441
455
  };
442
456
 
443
457
  /** \internal In short, it computes int(sqrt(\a Y)) with \a Y an integer.
444
- * Usage example: \code meta_sqrt<1023>::ret \endcode
445
- */
446
- template<int Y,
447
- int InfX = 0,
448
- int SupX = ((Y==1) ? 1 : Y/2),
449
- bool Done = ((SupX-InfX)<=1 ? true : ((SupX*SupX <= Y) && ((SupX+1)*(SupX+1) > Y))) >
450
- // use ?: instead of || just to shut up a stupid gcc 4.3 warning
451
- class meta_sqrt
452
- {
453
- enum {
454
- MidX = (InfX+SupX)/2,
455
- TakeInf = MidX*MidX > Y ? 1 : 0,
456
- NewInf = int(TakeInf) ? InfX : int(MidX),
457
- NewSup = int(TakeInf) ? int(MidX) : SupX
458
- };
459
- public:
460
- enum { ret = meta_sqrt<Y,NewInf,NewSup>::ret };
461
- };
462
-
463
- template<int Y, int InfX, int SupX>
464
- class meta_sqrt<Y, InfX, SupX, true> { public: enum { ret = (SupX*SupX <= Y) ? SupX : InfX }; };
458
+ * Usage example: \code meta_sqrt<1023>::ret \endcode
459
+ */
460
+ template <int Y, int InfX = 0, int SupX = ((Y == 1) ? 1 : Y / 2),
461
+ bool Done = ((SupX - InfX) <= 1 || ((SupX * SupX <= Y) && ((SupX + 1) * (SupX + 1) > Y)))>
462
+ class meta_sqrt {
463
+ enum {
464
+ MidX = (InfX + SupX) / 2,
465
+ TakeInf = MidX * MidX > Y ? 1 : 0,
466
+ NewInf = int(TakeInf) ? InfX : int(MidX),
467
+ NewSup = int(TakeInf) ? int(MidX) : SupX
468
+ };
465
469
 
470
+ public:
471
+ enum { ret = meta_sqrt<Y, NewInf, NewSup>::ret };
472
+ };
473
+
474
+ template <int Y, int InfX, int SupX>
475
+ class meta_sqrt<Y, InfX, SupX, true> {
476
+ public:
477
+ enum { ret = (SupX * SupX <= Y) ? SupX : InfX };
478
+ };
466
479
 
467
480
  /** \internal Computes the least common multiple of two positive integer A and B
468
- * at compile-time. It implements a naive algorithm testing all multiples of A.
469
- * It thus works better if A>=B.
470
- */
471
- template<int A, int B, int K=1, bool Done = ((A*K)%B)==0>
472
- struct meta_least_common_multiple
473
- {
474
- enum { ret = meta_least_common_multiple<A,B,K+1>::ret };
481
+ * at compile-time.
482
+ */
483
+ template <int A, int B, int K = 1, bool Done = ((A * K) % B) == 0, bool Big = (A >= B)>
484
+ struct meta_least_common_multiple {
485
+ enum { ret = meta_least_common_multiple<A, B, K + 1>::ret };
486
+ };
487
+ template <int A, int B, int K, bool Done>
488
+ struct meta_least_common_multiple<A, B, K, Done, false> {
489
+ enum { ret = meta_least_common_multiple<B, A, K>::ret };
475
490
  };
476
- template<int A, int B, int K>
477
- struct meta_least_common_multiple<A,B,K,true>
478
- {
479
- enum { ret = A*K };
491
+ template <int A, int B, int K>
492
+ struct meta_least_common_multiple<A, B, K, true, true> {
493
+ enum { ret = A * K };
480
494
  };
481
495
 
482
496
  /** \internal determines whether the product of two numeric types is allowed and what the return type is */
483
- template<typename T, typename U> struct scalar_product_traits
484
- {
497
+ template <typename T, typename U>
498
+ struct scalar_product_traits {
485
499
  enum { Defined = 0 };
486
500
  };
487
501
 
488
502
  // FIXME quick workaround around current limitation of result_of
489
503
  // template<typename Scalar, typename ArgType0, typename ArgType1>
490
504
  // struct result_of<scalar_product_op<Scalar>(ArgType0,ArgType1)> {
491
- // typedef typename scalar_product_traits<typename remove_all<ArgType0>::type, typename remove_all<ArgType1>::type>::ReturnType type;
505
+ // typedef typename scalar_product_traits<remove_all_t<ArgType0>, remove_all_t<ArgType1>>::ReturnType type;
492
506
  // };
493
507
 
494
- } // end namespace internal
508
+ /** \internal Obtains a POD type suitable to use as storage for an object of a size
509
+ * of at most Len bytes, aligned as specified by \c Align.
510
+ */
511
+ template <unsigned Len, unsigned Align>
512
+ struct aligned_storage {
513
+ struct type {
514
+ EIGEN_ALIGN_TO_BOUNDARY(Align) unsigned char data[Len];
515
+ };
516
+ };
517
+
518
+ } // end namespace internal
519
+
520
+ template <typename T>
521
+ struct NumTraits;
495
522
 
496
523
  namespace numext {
497
-
498
- #if defined(__CUDA_ARCH__)
499
- template<typename T> EIGEN_DEVICE_FUNC void swap(T &a, T &b) { T tmp = b; b = a; a = tmp; }
524
+
525
+ #if defined(EIGEN_GPU_COMPILE_PHASE)
526
+ template <typename T>
527
+ EIGEN_DEVICE_FUNC void swap(T& a, T& b) {
528
+ T tmp = b;
529
+ b = a;
530
+ a = tmp;
531
+ }
500
532
  #else
501
- template<typename T> EIGEN_STRONG_INLINE void swap(T &a, T &b) { std::swap(a,b); }
533
+ template <typename T>
534
+ EIGEN_STRONG_INLINE void swap(T& a, T& b) {
535
+ std::swap(a, b);
536
+ }
502
537
  #endif
503
538
 
504
- #if defined(__CUDA_ARCH__)
505
- using internal::device::numeric_limits;
506
- #else
507
539
  using std::numeric_limits;
508
- #endif
509
540
 
510
- // Integer division with rounding up.
511
- // T is assumed to be an integer type with a>=0, and b>0
512
- template<typename T>
513
- T div_ceil(const T &a, const T &b)
514
- {
515
- return (a+b-1) / b;
516
- }
541
+ // Handle integer comparisons of different signedness.
542
+ template <typename X, typename Y, bool XIsInteger = NumTraits<X>::IsInteger, bool XIsSigned = NumTraits<X>::IsSigned,
543
+ bool YIsInteger = NumTraits<Y>::IsInteger, bool YIsSigned = NumTraits<Y>::IsSigned>
544
+ struct equal_strict_impl {
545
+ static EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool run(const X& x, const Y& y) { return x == y; }
546
+ };
547
+ template <typename X, typename Y>
548
+ struct equal_strict_impl<X, Y, true, false, true, true> {
549
+ // X is an unsigned integer
550
+ // Y is a signed integer
551
+ // if Y is non-negative, it may be represented exactly as its unsigned counterpart.
552
+ using UnsignedY = typename internal::make_unsigned<Y>::type;
553
+ static EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool run(const X& x, const Y& y) {
554
+ return y < Y(0) ? false : (x == static_cast<UnsignedY>(y));
555
+ }
556
+ };
557
+ template <typename X, typename Y>
558
+ struct equal_strict_impl<X, Y, true, true, true, false> {
559
+ // X is a signed integer
560
+ // Y is an unsigned integer
561
+ static EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool run(const X& x, const Y& y) {
562
+ return equal_strict_impl<Y, X>::run(y, x);
563
+ }
564
+ };
517
565
 
518
566
  // The aim of the following functions is to bypass -Wfloat-equal warnings
519
567
  // when we really want a strict equality comparison on floating points.
520
- template<typename X, typename Y> EIGEN_STRONG_INLINE
521
- bool equal_strict(const X& x,const Y& y) { return x == y; }
568
+ template <typename X, typename Y>
569
+ EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool equal_strict(const X& x, const Y& y) {
570
+ return equal_strict_impl<X, Y>::run(x, y);
571
+ }
572
+
573
+ #if !defined(EIGEN_GPU_COMPILE_PHASE) || (!defined(EIGEN_CUDA_ARCH) && defined(EIGEN_CONSTEXPR_ARE_DEVICE_FUNC))
574
+ template <>
575
+ EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool equal_strict(const float& x, const float& y) {
576
+ return std::equal_to<float>()(x, y);
577
+ }
578
+
579
+ template <>
580
+ EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool equal_strict(const double& x, const double& y) {
581
+ return std::equal_to<double>()(x, y);
582
+ }
583
+ #endif
584
+
585
+ /**
586
+ * \internal Performs an exact comparison of x to zero, e.g. to decide whether a term can be ignored.
587
+ * Use this to to bypass -Wfloat-equal warnings when exact zero is what needs to be tested.
588
+ */
589
+ template <typename X>
590
+ EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool is_exactly_zero(const X& x) {
591
+ return equal_strict(x, typename NumTraits<X>::Literal{0});
592
+ }
522
593
 
523
- template<> EIGEN_STRONG_INLINE
524
- bool equal_strict(const float& x,const float& y) { return std::equal_to<float>()(x,y); }
594
+ /**
595
+ * \internal Performs an exact comparison of x to one, e.g. to decide whether a factor needs to be multiplied.
596
+ * Use this to to bypass -Wfloat-equal warnings when exact one is what needs to be tested.
597
+ */
598
+ template <typename X>
599
+ EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool is_exactly_one(const X& x) {
600
+ return equal_strict(x, typename NumTraits<X>::Literal{1});
601
+ }
525
602
 
526
- template<> EIGEN_STRONG_INLINE
527
- bool equal_strict(const double& x,const double& y) { return std::equal_to<double>()(x,y); }
603
+ template <typename X, typename Y>
604
+ EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool not_equal_strict(const X& x, const Y& y) {
605
+ return !equal_strict_impl<X, Y>::run(x, y);
606
+ }
528
607
 
529
- template<typename X, typename Y> EIGEN_STRONG_INLINE
530
- bool not_equal_strict(const X& x,const Y& y) { return x != y; }
608
+ #if !defined(EIGEN_GPU_COMPILE_PHASE) || (!defined(EIGEN_CUDA_ARCH) && defined(EIGEN_CONSTEXPR_ARE_DEVICE_FUNC))
609
+ template <>
610
+ EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool not_equal_strict(const float& x, const float& y) {
611
+ return std::not_equal_to<float>()(x, y);
612
+ }
531
613
 
532
- template<> EIGEN_STRONG_INLINE
533
- bool not_equal_strict(const float& x,const float& y) { return std::not_equal_to<float>()(x,y); }
614
+ template <>
615
+ EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool not_equal_strict(const double& x, const double& y) {
616
+ return std::not_equal_to<double>()(x, y);
617
+ }
618
+ #endif
534
619
 
535
- template<> EIGEN_STRONG_INLINE
536
- bool not_equal_strict(const double& x,const double& y) { return std::not_equal_to<double>()(x,y); }
620
+ } // end namespace numext
537
621
 
538
- } // end namespace numext
622
+ namespace internal {
539
623
 
540
- } // end namespace Eigen
624
+ template <typename Scalar>
625
+ struct is_identically_zero_impl {
626
+ static inline bool run(const Scalar& s) { return numext::is_exactly_zero(s); }
627
+ };
541
628
 
542
- // Define portable (u)int{32,64} types
543
- #if EIGEN_HAS_CXX11
544
- #include <cstdint>
545
- namespace Eigen {
546
- namespace numext {
547
- typedef std::uint32_t uint32_t;
548
- typedef std::int32_t int32_t;
549
- typedef std::uint64_t uint64_t;
550
- typedef std::int64_t int64_t;
629
+ template <typename Scalar>
630
+ EIGEN_STRONG_INLINE bool is_identically_zero(const Scalar& s) {
631
+ return is_identically_zero_impl<Scalar>::run(s);
551
632
  }
633
+
634
+ /// \internal Returns true if its argument is of integer or enum type.
635
+ /// FIXME this has the same purpose as `is_valid_index_type` in XprHelper.h
636
+ template <typename A>
637
+ constexpr bool is_int_or_enum_v = std::is_enum<A>::value || std::is_integral<A>::value;
638
+
639
+ template <typename A, typename B>
640
+ constexpr void plain_enum_asserts(A, B) {
641
+ static_assert(is_int_or_enum_v<A>, "Argument a must be an integer or enum");
642
+ static_assert(is_int_or_enum_v<B>, "Argument b must be an integer or enum");
552
643
  }
553
- #else
554
- // Without c++11, all compilers able to compile Eigen also
555
- // provides the C99 stdint.h header file.
556
- #include <stdint.h>
557
- namespace Eigen {
558
- namespace numext {
559
- typedef ::uint32_t uint32_t;
560
- typedef ::int32_t int32_t;
561
- typedef ::uint64_t uint64_t;
562
- typedef ::int64_t int64_t;
644
+
645
+ /// \internal Gets the minimum of two values which may be integers or enums
646
+ template <typename A, typename B>
647
+ constexpr int plain_enum_min(A a, B b) {
648
+ plain_enum_asserts(a, b);
649
+ return ((int)a <= (int)b) ? (int)a : (int)b;
563
650
  }
651
+
652
+ /// \internal Gets the maximum of two values which may be integers or enums
653
+ template <typename A, typename B>
654
+ constexpr int plain_enum_max(A a, B b) {
655
+ plain_enum_asserts(a, b);
656
+ return ((int)a >= (int)b) ? (int)a : (int)b;
564
657
  }
658
+
659
+ /**
660
+ * \internal
661
+ * `min_size_prefer_dynamic` gives the min between compile-time sizes. 0 has absolute priority, followed by 1,
662
+ * followed by Dynamic, followed by other finite values. The reason for giving Dynamic the priority over
663
+ * finite values is that min(3, Dynamic) should be Dynamic, since that could be anything between 0 and 3.
664
+ */
665
+ template <typename A, typename B>
666
+ constexpr int min_size_prefer_dynamic(A a, B b) {
667
+ plain_enum_asserts(a, b);
668
+ if ((int)a == 0 || (int)b == 0) return 0;
669
+ if ((int)a == 1 || (int)b == 1) return 1;
670
+ if ((int)a == Dynamic || (int)b == Dynamic) return Dynamic;
671
+ return plain_enum_min(a, b);
672
+ }
673
+
674
+ /**
675
+ * \internal
676
+ * min_size_prefer_fixed is a variant of `min_size_prefer_dynamic` comparing MaxSizes. The difference is that finite
677
+ * values now have priority over Dynamic, so that min(3, Dynamic) gives 3. Indeed, whatever the actual value is (between
678
+ * 0 and 3), it is not more than 3.
679
+ */
680
+ template <typename A, typename B>
681
+ constexpr int min_size_prefer_fixed(A a, B b) {
682
+ plain_enum_asserts(a, b);
683
+ if ((int)a == 0 || (int)b == 0) return 0;
684
+ if ((int)a == 1 || (int)b == 1) return 1;
685
+ if ((int)a == Dynamic && (int)b == Dynamic) return Dynamic;
686
+ if ((int)a == Dynamic) return (int)b;
687
+ if ((int)b == Dynamic) return (int)a;
688
+ return plain_enum_min(a, b);
689
+ }
690
+
691
+ /// \internal see `min_size_prefer_fixed`. No need for a separate variant for MaxSizes here.
692
+ template <typename A, typename B>
693
+ constexpr int max_size_prefer_dynamic(A a, B b) {
694
+ plain_enum_asserts(a, b);
695
+ if ((int)a == Dynamic || (int)b == Dynamic) return Dynamic;
696
+ return plain_enum_max(a, b);
697
+ }
698
+
699
+ template <typename A, typename B>
700
+ inline constexpr int size_prefer_fixed(A a, B b) {
701
+ plain_enum_asserts(a, b);
702
+ return int(a) == Dynamic ? int(b) : int(a);
703
+ }
704
+
705
+ template <typename A, typename B>
706
+ inline constexpr bool enum_eq_not_dynamic(A a, B b) {
707
+ plain_enum_asserts(a, b);
708
+ if ((int)a == Dynamic || (int)b == Dynamic) return false;
709
+ return (int)a == (int)b;
710
+ }
711
+
712
+ template <typename A, typename B>
713
+ constexpr bool enum_lt_not_dynamic(A a, B b) {
714
+ plain_enum_asserts(a, b);
715
+ if ((int)a == Dynamic || (int)b == Dynamic) return false;
716
+ return (int)a < (int)b;
717
+ }
718
+
719
+ template <typename A, typename B>
720
+ constexpr bool enum_le_not_dynamic(A a, B b) {
721
+ plain_enum_asserts(a, b);
722
+ if ((int)a == Dynamic || (int)b == Dynamic) return false;
723
+ return (int)a <= (int)b;
724
+ }
725
+
726
+ template <typename A, typename B>
727
+ constexpr bool enum_gt_not_dynamic(A a, B b) {
728
+ plain_enum_asserts(a, b);
729
+ if ((int)a == Dynamic || (int)b == Dynamic) return false;
730
+ return (int)a > (int)b;
731
+ }
732
+
733
+ template <typename A, typename B>
734
+ constexpr bool enum_ge_not_dynamic(A a, B b) {
735
+ plain_enum_asserts(a, b);
736
+ if ((int)a == Dynamic || (int)b == Dynamic) return false;
737
+ return (int)a >= (int)b;
738
+ }
739
+
740
+ /// \internal Calculate logical XOR at compile time
741
+ constexpr bool logical_xor(bool a, bool b) { return a != b; }
742
+
743
+ /// \internal Calculate logical IMPLIES at compile time
744
+ constexpr bool check_implication(bool a, bool b) { return !a || b; }
745
+
746
+ /// \internal Provide fallback for std::is_constant_evaluated for pre-C++20.
747
+ #if EIGEN_COMP_CXXVER >= 20 && defined(__cpp_lib_is_constant_evaluated) && __cpp_lib_is_constant_evaluated >= 201811L
748
+ using std::is_constant_evaluated;
749
+ #else
750
+ constexpr bool is_constant_evaluated() { return false; }
565
751
  #endif
566
752
 
753
+ template <typename Scalar>
754
+ using make_complex_t = std::conditional_t<NumTraits<Scalar>::IsComplex, Scalar, std::complex<Scalar>>;
755
+
756
+ } // end namespace internal
757
+
758
+ } // end namespace Eigen
567
759
 
568
- #endif // EIGEN_META_H
760
+ #endif // EIGEN_META_H