@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.
- package/README.md +1 -1
- package/eigen/Eigen/AccelerateSupport +52 -0
- package/eigen/Eigen/Cholesky +18 -21
- package/eigen/Eigen/CholmodSupport +28 -28
- package/eigen/Eigen/Core +235 -326
- package/eigen/Eigen/Eigenvalues +16 -14
- package/eigen/Eigen/Geometry +21 -24
- package/eigen/Eigen/Householder +9 -8
- package/eigen/Eigen/IterativeLinearSolvers +8 -4
- package/eigen/Eigen/Jacobi +14 -14
- package/eigen/Eigen/KLUSupport +43 -0
- package/eigen/Eigen/LU +16 -20
- package/eigen/Eigen/MetisSupport +12 -12
- package/eigen/Eigen/OrderingMethods +54 -54
- package/eigen/Eigen/PaStiXSupport +23 -20
- package/eigen/Eigen/PardisoSupport +17 -14
- package/eigen/Eigen/QR +18 -21
- package/eigen/Eigen/QtAlignedMalloc +5 -13
- package/eigen/Eigen/SPQRSupport +21 -14
- package/eigen/Eigen/SVD +23 -18
- package/eigen/Eigen/Sparse +1 -4
- package/eigen/Eigen/SparseCholesky +18 -23
- package/eigen/Eigen/SparseCore +18 -17
- package/eigen/Eigen/SparseLU +12 -8
- package/eigen/Eigen/SparseQR +16 -14
- package/eigen/Eigen/StdDeque +5 -2
- package/eigen/Eigen/StdList +5 -2
- package/eigen/Eigen/StdVector +5 -2
- package/eigen/Eigen/SuperLUSupport +30 -24
- package/eigen/Eigen/ThreadPool +80 -0
- package/eigen/Eigen/UmfPackSupport +19 -17
- package/eigen/Eigen/Version +14 -0
- package/eigen/Eigen/src/AccelerateSupport/AccelerateSupport.h +423 -0
- package/eigen/Eigen/src/AccelerateSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Cholesky/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Cholesky/LDLT.h +377 -401
- package/eigen/Eigen/src/Cholesky/LLT.h +332 -360
- package/eigen/Eigen/src/Cholesky/LLT_LAPACKE.h +81 -56
- package/eigen/Eigen/src/CholmodSupport/CholmodSupport.h +620 -521
- package/eigen/Eigen/src/CholmodSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Core/ArithmeticSequence.h +239 -0
- package/eigen/Eigen/src/Core/Array.h +341 -294
- package/eigen/Eigen/src/Core/ArrayBase.h +190 -203
- package/eigen/Eigen/src/Core/ArrayWrapper.h +127 -171
- package/eigen/Eigen/src/Core/Assign.h +30 -40
- package/eigen/Eigen/src/Core/AssignEvaluator.h +711 -589
- package/eigen/Eigen/src/Core/Assign_MKL.h +130 -125
- package/eigen/Eigen/src/Core/BandMatrix.h +268 -283
- package/eigen/Eigen/src/Core/Block.h +375 -398
- package/eigen/Eigen/src/Core/CommaInitializer.h +86 -97
- package/eigen/Eigen/src/Core/ConditionEstimator.h +51 -53
- package/eigen/Eigen/src/Core/CoreEvaluators.h +1356 -1026
- package/eigen/Eigen/src/Core/CoreIterators.h +73 -59
- package/eigen/Eigen/src/Core/CwiseBinaryOp.h +114 -132
- package/eigen/Eigen/src/Core/CwiseNullaryOp.h +726 -617
- package/eigen/Eigen/src/Core/CwiseTernaryOp.h +77 -103
- package/eigen/Eigen/src/Core/CwiseUnaryOp.h +56 -68
- package/eigen/Eigen/src/Core/CwiseUnaryView.h +132 -95
- package/eigen/Eigen/src/Core/DenseBase.h +632 -571
- package/eigen/Eigen/src/Core/DenseCoeffsBase.h +511 -624
- package/eigen/Eigen/src/Core/DenseStorage.h +512 -509
- package/eigen/Eigen/src/Core/DeviceWrapper.h +153 -0
- package/eigen/Eigen/src/Core/Diagonal.h +169 -210
- package/eigen/Eigen/src/Core/DiagonalMatrix.h +351 -274
- package/eigen/Eigen/src/Core/DiagonalProduct.h +12 -10
- package/eigen/Eigen/src/Core/Dot.h +172 -222
- package/eigen/Eigen/src/Core/EigenBase.h +75 -85
- package/eigen/Eigen/src/Core/Fill.h +138 -0
- package/eigen/Eigen/src/Core/FindCoeff.h +464 -0
- package/eigen/Eigen/src/Core/ForceAlignedAccess.h +90 -109
- package/eigen/Eigen/src/Core/Fuzzy.h +82 -105
- package/eigen/Eigen/src/Core/GeneralProduct.h +327 -263
- package/eigen/Eigen/src/Core/GenericPacketMath.h +1472 -360
- package/eigen/Eigen/src/Core/GlobalFunctions.h +194 -151
- package/eigen/Eigen/src/Core/IO.h +147 -139
- package/eigen/Eigen/src/Core/IndexedView.h +321 -0
- package/eigen/Eigen/src/Core/InnerProduct.h +260 -0
- package/eigen/Eigen/src/Core/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Core/Inverse.h +56 -66
- package/eigen/Eigen/src/Core/Map.h +124 -142
- package/eigen/Eigen/src/Core/MapBase.h +256 -281
- package/eigen/Eigen/src/Core/MathFunctions.h +1620 -938
- package/eigen/Eigen/src/Core/MathFunctionsImpl.h +233 -71
- package/eigen/Eigen/src/Core/Matrix.h +491 -416
- package/eigen/Eigen/src/Core/MatrixBase.h +468 -453
- package/eigen/Eigen/src/Core/NestByValue.h +66 -85
- package/eigen/Eigen/src/Core/NoAlias.h +79 -85
- package/eigen/Eigen/src/Core/NumTraits.h +235 -148
- package/eigen/Eigen/src/Core/PartialReduxEvaluator.h +253 -0
- package/eigen/Eigen/src/Core/PermutationMatrix.h +461 -511
- package/eigen/Eigen/src/Core/PlainObjectBase.h +871 -894
- package/eigen/Eigen/src/Core/Product.h +260 -139
- package/eigen/Eigen/src/Core/ProductEvaluators.h +863 -714
- package/eigen/Eigen/src/Core/Random.h +161 -136
- package/eigen/Eigen/src/Core/RandomImpl.h +262 -0
- package/eigen/Eigen/src/Core/RealView.h +250 -0
- package/eigen/Eigen/src/Core/Redux.h +366 -336
- package/eigen/Eigen/src/Core/Ref.h +308 -209
- package/eigen/Eigen/src/Core/Replicate.h +94 -106
- package/eigen/Eigen/src/Core/Reshaped.h +398 -0
- package/eigen/Eigen/src/Core/ReturnByValue.h +49 -55
- package/eigen/Eigen/src/Core/Reverse.h +136 -145
- package/eigen/Eigen/src/Core/Select.h +70 -140
- package/eigen/Eigen/src/Core/SelfAdjointView.h +262 -285
- package/eigen/Eigen/src/Core/SelfCwiseBinaryOp.h +23 -20
- package/eigen/Eigen/src/Core/SkewSymmetricMatrix3.h +382 -0
- package/eigen/Eigen/src/Core/Solve.h +97 -111
- package/eigen/Eigen/src/Core/SolveTriangular.h +131 -129
- package/eigen/Eigen/src/Core/SolverBase.h +138 -101
- package/eigen/Eigen/src/Core/StableNorm.h +156 -160
- package/eigen/Eigen/src/Core/StlIterators.h +619 -0
- package/eigen/Eigen/src/Core/Stride.h +91 -88
- package/eigen/Eigen/src/Core/Swap.h +70 -38
- package/eigen/Eigen/src/Core/Transpose.h +295 -273
- package/eigen/Eigen/src/Core/Transpositions.h +272 -317
- package/eigen/Eigen/src/Core/TriangularMatrix.h +670 -755
- package/eigen/Eigen/src/Core/VectorBlock.h +59 -72
- package/eigen/Eigen/src/Core/VectorwiseOp.h +668 -630
- package/eigen/Eigen/src/Core/Visitor.h +480 -216
- package/eigen/Eigen/src/Core/arch/AVX/Complex.h +407 -293
- package/eigen/Eigen/src/Core/arch/AVX/MathFunctions.h +79 -388
- package/eigen/Eigen/src/Core/arch/AVX/PacketMath.h +2935 -491
- package/eigen/Eigen/src/Core/arch/AVX/Reductions.h +353 -0
- package/eigen/Eigen/src/Core/arch/AVX/TypeCasting.h +279 -22
- package/eigen/Eigen/src/Core/arch/AVX512/Complex.h +472 -0
- package/eigen/Eigen/src/Core/arch/AVX512/GemmKernel.h +1245 -0
- package/eigen/Eigen/src/Core/arch/AVX512/MathFunctions.h +85 -333
- package/eigen/Eigen/src/Core/arch/AVX512/MathFunctionsFP16.h +75 -0
- package/eigen/Eigen/src/Core/arch/AVX512/PacketMath.h +2490 -649
- package/eigen/Eigen/src/Core/arch/AVX512/PacketMathFP16.h +1413 -0
- package/eigen/Eigen/src/Core/arch/AVX512/Reductions.h +297 -0
- package/eigen/Eigen/src/Core/arch/AVX512/TrsmKernel.h +1167 -0
- package/eigen/Eigen/src/Core/arch/AVX512/TrsmUnrolls.inc +1219 -0
- package/eigen/Eigen/src/Core/arch/AVX512/TypeCasting.h +277 -0
- package/eigen/Eigen/src/Core/arch/AVX512/TypeCastingFP16.h +130 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/Complex.h +521 -298
- package/eigen/Eigen/src/Core/arch/AltiVec/MathFunctions.h +39 -280
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProduct.h +3686 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h +205 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductMMA.h +901 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductMMAbfloat16.h +742 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixVectorProduct.inc +2818 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/PacketMath.h +3391 -723
- package/eigen/Eigen/src/Core/arch/AltiVec/TypeCasting.h +153 -0
- package/eigen/Eigen/src/Core/arch/Default/BFloat16.h +866 -0
- package/eigen/Eigen/src/Core/arch/Default/ConjHelper.h +113 -14
- package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h +2634 -0
- package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h +227 -0
- package/eigen/Eigen/src/Core/arch/Default/Half.h +1091 -0
- package/eigen/Eigen/src/Core/arch/Default/Settings.h +11 -13
- package/eigen/Eigen/src/Core/arch/GPU/Complex.h +244 -0
- package/eigen/Eigen/src/Core/arch/GPU/MathFunctions.h +104 -0
- package/eigen/Eigen/src/Core/arch/GPU/PacketMath.h +1712 -0
- package/eigen/Eigen/src/Core/arch/GPU/Tuple.h +268 -0
- package/eigen/Eigen/src/Core/arch/GPU/TypeCasting.h +77 -0
- package/eigen/Eigen/src/Core/arch/HIP/hcc/math_constants.h +23 -0
- package/eigen/Eigen/src/Core/arch/HVX/PacketMath.h +1088 -0
- package/eigen/Eigen/src/Core/arch/LSX/Complex.h +520 -0
- package/eigen/Eigen/src/Core/arch/LSX/GeneralBlockPanelKernel.h +23 -0
- package/eigen/Eigen/src/Core/arch/LSX/MathFunctions.h +43 -0
- package/eigen/Eigen/src/Core/arch/LSX/PacketMath.h +2866 -0
- package/eigen/Eigen/src/Core/arch/LSX/TypeCasting.h +526 -0
- package/eigen/Eigen/src/Core/arch/MSA/Complex.h +620 -0
- package/eigen/Eigen/src/Core/arch/MSA/MathFunctions.h +379 -0
- package/eigen/Eigen/src/Core/arch/MSA/PacketMath.h +1237 -0
- package/eigen/Eigen/src/Core/arch/NEON/Complex.h +531 -289
- package/eigen/Eigen/src/Core/arch/NEON/GeneralBlockPanelKernel.h +243 -0
- package/eigen/Eigen/src/Core/arch/NEON/MathFunctions.h +50 -73
- package/eigen/Eigen/src/Core/arch/NEON/PacketMath.h +5915 -579
- package/eigen/Eigen/src/Core/arch/NEON/TypeCasting.h +1642 -0
- package/eigen/Eigen/src/Core/arch/NEON/UnaryFunctors.h +57 -0
- package/eigen/Eigen/src/Core/arch/SSE/Complex.h +366 -334
- package/eigen/Eigen/src/Core/arch/SSE/MathFunctions.h +40 -514
- package/eigen/Eigen/src/Core/arch/SSE/PacketMath.h +2164 -675
- package/eigen/Eigen/src/Core/arch/SSE/Reductions.h +324 -0
- package/eigen/Eigen/src/Core/arch/SSE/TypeCasting.h +188 -35
- package/eigen/Eigen/src/Core/arch/SVE/MathFunctions.h +48 -0
- package/eigen/Eigen/src/Core/arch/SVE/PacketMath.h +674 -0
- package/eigen/Eigen/src/Core/arch/SVE/TypeCasting.h +52 -0
- package/eigen/Eigen/src/Core/arch/SYCL/InteropHeaders.h +227 -0
- package/eigen/Eigen/src/Core/arch/SYCL/MathFunctions.h +303 -0
- package/eigen/Eigen/src/Core/arch/SYCL/PacketMath.h +576 -0
- package/eigen/Eigen/src/Core/arch/SYCL/TypeCasting.h +83 -0
- package/eigen/Eigen/src/Core/arch/ZVector/Complex.h +434 -261
- package/eigen/Eigen/src/Core/arch/ZVector/MathFunctions.h +160 -53
- package/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h +1073 -605
- package/eigen/Eigen/src/Core/functors/AssignmentFunctors.h +123 -117
- package/eigen/Eigen/src/Core/functors/BinaryFunctors.h +594 -322
- package/eigen/Eigen/src/Core/functors/NullaryFunctors.h +204 -118
- package/eigen/Eigen/src/Core/functors/StlFunctors.h +110 -97
- package/eigen/Eigen/src/Core/functors/TernaryFunctors.h +34 -7
- package/eigen/Eigen/src/Core/functors/UnaryFunctors.h +1158 -530
- package/eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h +2329 -1333
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix.h +328 -364
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +191 -178
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h +85 -82
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix_BLAS.h +154 -73
- package/eigen/Eigen/src/Core/products/GeneralMatrixVector.h +396 -542
- package/eigen/Eigen/src/Core/products/GeneralMatrixVector_BLAS.h +80 -77
- package/eigen/Eigen/src/Core/products/Parallelizer.h +208 -92
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +331 -375
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix_BLAS.h +206 -224
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixVector.h +139 -146
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixVector_BLAS.h +58 -61
- package/eigen/Eigen/src/Core/products/SelfadjointProduct.h +71 -71
- package/eigen/Eigen/src/Core/products/SelfadjointRank2Update.h +48 -46
- package/eigen/Eigen/src/Core/products/TriangularMatrixMatrix.h +294 -369
- package/eigen/Eigen/src/Core/products/TriangularMatrixMatrix_BLAS.h +246 -238
- package/eigen/Eigen/src/Core/products/TriangularMatrixVector.h +244 -247
- package/eigen/Eigen/src/Core/products/TriangularMatrixVector_BLAS.h +212 -192
- package/eigen/Eigen/src/Core/products/TriangularSolverMatrix.h +328 -275
- package/eigen/Eigen/src/Core/products/TriangularSolverMatrix_BLAS.h +108 -109
- package/eigen/Eigen/src/Core/products/TriangularSolverVector.h +70 -93
- package/eigen/Eigen/src/Core/util/Assert.h +158 -0
- package/eigen/Eigen/src/Core/util/BlasUtil.h +413 -290
- package/eigen/Eigen/src/Core/util/ConfigureVectorization.h +543 -0
- package/eigen/Eigen/src/Core/util/Constants.h +314 -263
- package/eigen/Eigen/src/Core/util/DisableStupidWarnings.h +130 -78
- package/eigen/Eigen/src/Core/util/EmulateArray.h +270 -0
- package/eigen/Eigen/src/Core/util/ForwardDeclarations.h +450 -224
- package/eigen/Eigen/src/Core/util/GpuHipCudaDefines.inc +101 -0
- package/eigen/Eigen/src/Core/util/GpuHipCudaUndefines.inc +45 -0
- package/eigen/Eigen/src/Core/util/IndexedViewHelper.h +487 -0
- package/eigen/Eigen/src/Core/util/IntegralConstant.h +279 -0
- package/eigen/Eigen/src/Core/util/MKL_support.h +39 -30
- package/eigen/Eigen/src/Core/util/Macros.h +939 -646
- package/eigen/Eigen/src/Core/util/MaxSizeVector.h +139 -0
- package/eigen/Eigen/src/Core/util/Memory.h +1042 -650
- package/eigen/Eigen/src/Core/util/Meta.h +618 -426
- package/eigen/Eigen/src/Core/util/MoreMeta.h +638 -0
- package/eigen/Eigen/src/Core/util/ReenableStupidWarnings.h +32 -19
- package/eigen/Eigen/src/Core/util/ReshapedHelper.h +51 -0
- package/eigen/Eigen/src/Core/util/Serializer.h +209 -0
- package/eigen/Eigen/src/Core/util/StaticAssert.h +51 -164
- package/eigen/Eigen/src/Core/util/SymbolicIndex.h +445 -0
- package/eigen/Eigen/src/Core/util/XprHelper.h +793 -538
- package/eigen/Eigen/src/Eigenvalues/ComplexEigenSolver.h +246 -277
- package/eigen/Eigen/src/Eigenvalues/ComplexSchur.h +299 -319
- package/eigen/Eigen/src/Eigenvalues/ComplexSchur_LAPACKE.h +52 -48
- package/eigen/Eigen/src/Eigenvalues/EigenSolver.h +413 -456
- package/eigen/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h +309 -325
- package/eigen/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h +157 -171
- package/eigen/Eigen/src/Eigenvalues/HessenbergDecomposition.h +292 -310
- package/eigen/Eigen/src/Eigenvalues/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h +91 -107
- package/eigen/Eigen/src/Eigenvalues/RealQZ.h +539 -606
- package/eigen/Eigen/src/Eigenvalues/RealSchur.h +348 -382
- package/eigen/Eigen/src/Eigenvalues/RealSchur_LAPACKE.h +41 -35
- package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +579 -600
- package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_LAPACKE.h +47 -44
- package/eigen/Eigen/src/Eigenvalues/Tridiagonalization.h +434 -461
- package/eigen/Eigen/src/Geometry/AlignedBox.h +307 -214
- package/eigen/Eigen/src/Geometry/AngleAxis.h +135 -137
- package/eigen/Eigen/src/Geometry/EulerAngles.h +163 -74
- package/eigen/Eigen/src/Geometry/Homogeneous.h +289 -333
- package/eigen/Eigen/src/Geometry/Hyperplane.h +152 -161
- package/eigen/Eigen/src/Geometry/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Geometry/OrthoMethods.h +168 -145
- package/eigen/Eigen/src/Geometry/ParametrizedLine.h +141 -104
- package/eigen/Eigen/src/Geometry/Quaternion.h +595 -497
- package/eigen/Eigen/src/Geometry/Rotation2D.h +110 -108
- package/eigen/Eigen/src/Geometry/RotationBase.h +148 -145
- package/eigen/Eigen/src/Geometry/Scaling.h +115 -90
- package/eigen/Eigen/src/Geometry/Transform.h +896 -953
- package/eigen/Eigen/src/Geometry/Translation.h +100 -98
- package/eigen/Eigen/src/Geometry/Umeyama.h +79 -84
- package/eigen/Eigen/src/Geometry/arch/Geometry_SIMD.h +154 -0
- package/eigen/Eigen/src/Householder/BlockHouseholder.h +54 -42
- package/eigen/Eigen/src/Householder/Householder.h +104 -122
- package/eigen/Eigen/src/Householder/HouseholderSequence.h +416 -382
- package/eigen/Eigen/src/Householder/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +153 -166
- package/eigen/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +127 -138
- package/eigen/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +95 -124
- package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h +269 -267
- package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h +246 -259
- package/eigen/Eigen/src/IterativeLinearSolvers/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +218 -217
- package/eigen/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h +80 -103
- package/eigen/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h +59 -63
- package/eigen/Eigen/src/Jacobi/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Jacobi/Jacobi.h +256 -291
- package/eigen/Eigen/src/KLUSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/KLUSupport/KLUSupport.h +339 -0
- package/eigen/Eigen/src/LU/Determinant.h +60 -63
- package/eigen/Eigen/src/LU/FullPivLU.h +561 -626
- package/eigen/Eigen/src/LU/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/LU/InverseImpl.h +213 -275
- package/eigen/Eigen/src/LU/PartialPivLU.h +407 -435
- package/eigen/Eigen/src/LU/PartialPivLU_LAPACKE.h +54 -40
- package/eigen/Eigen/src/LU/arch/InverseSize4.h +353 -0
- package/eigen/Eigen/src/MetisSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/MetisSupport/MetisSupport.h +81 -93
- package/eigen/Eigen/src/OrderingMethods/Amd.h +250 -282
- package/eigen/Eigen/src/OrderingMethods/Eigen_Colamd.h +950 -1103
- package/eigen/Eigen/src/OrderingMethods/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/OrderingMethods/Ordering.h +111 -122
- package/eigen/Eigen/src/PaStiXSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/PaStiXSupport/PaStiXSupport.h +524 -570
- package/eigen/Eigen/src/PardisoSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/PardisoSupport/PardisoSupport.h +385 -429
- package/eigen/Eigen/src/QR/ColPivHouseholderQR.h +494 -473
- package/eigen/Eigen/src/QR/ColPivHouseholderQR_LAPACKE.h +120 -56
- package/eigen/Eigen/src/QR/CompleteOrthogonalDecomposition.h +223 -137
- package/eigen/Eigen/src/QR/FullPivHouseholderQR.h +517 -460
- package/eigen/Eigen/src/QR/HouseholderQR.h +412 -278
- package/eigen/Eigen/src/QR/HouseholderQR_LAPACKE.h +32 -23
- package/eigen/Eigen/src/QR/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SPQRSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h +263 -261
- package/eigen/Eigen/src/SVD/BDCSVD.h +872 -679
- package/eigen/Eigen/src/SVD/BDCSVD_LAPACKE.h +174 -0
- package/eigen/Eigen/src/SVD/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SVD/JacobiSVD.h +585 -543
- package/eigen/Eigen/src/SVD/JacobiSVD_LAPACKE.h +85 -49
- package/eigen/Eigen/src/SVD/SVDBase.h +281 -160
- package/eigen/Eigen/src/SVD/UpperBidiagonalization.h +202 -237
- package/eigen/Eigen/src/SparseCholesky/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky.h +769 -590
- package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h +318 -129
- package/eigen/Eigen/src/SparseCore/AmbiVector.h +202 -251
- package/eigen/Eigen/src/SparseCore/CompressedStorage.h +184 -236
- package/eigen/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h +140 -184
- package/eigen/Eigen/src/SparseCore/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SparseCore/SparseAssign.h +174 -111
- package/eigen/Eigen/src/SparseCore/SparseBlock.h +408 -477
- package/eigen/Eigen/src/SparseCore/SparseColEtree.h +100 -112
- package/eigen/Eigen/src/SparseCore/SparseCompressedBase.h +531 -280
- package/eigen/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +559 -347
- package/eigen/Eigen/src/SparseCore/SparseCwiseUnaryOp.h +100 -108
- package/eigen/Eigen/src/SparseCore/SparseDenseProduct.h +185 -191
- package/eigen/Eigen/src/SparseCore/SparseDiagonalProduct.h +71 -71
- package/eigen/Eigen/src/SparseCore/SparseDot.h +49 -47
- package/eigen/Eigen/src/SparseCore/SparseFuzzy.h +13 -11
- package/eigen/Eigen/src/SparseCore/SparseMap.h +243 -253
- package/eigen/Eigen/src/SparseCore/SparseMatrix.h +1614 -1142
- package/eigen/Eigen/src/SparseCore/SparseMatrixBase.h +403 -357
- package/eigen/Eigen/src/SparseCore/SparsePermutation.h +186 -115
- package/eigen/Eigen/src/SparseCore/SparseProduct.h +100 -91
- package/eigen/Eigen/src/SparseCore/SparseRedux.h +22 -24
- package/eigen/Eigen/src/SparseCore/SparseRef.h +268 -295
- package/eigen/Eigen/src/SparseCore/SparseSelfAdjointView.h +371 -414
- package/eigen/Eigen/src/SparseCore/SparseSolverBase.h +78 -87
- package/eigen/Eigen/src/SparseCore/SparseSparseProductWithPruning.h +81 -95
- package/eigen/Eigen/src/SparseCore/SparseTranspose.h +62 -71
- package/eigen/Eigen/src/SparseCore/SparseTriangularView.h +132 -144
- package/eigen/Eigen/src/SparseCore/SparseUtil.h +146 -115
- package/eigen/Eigen/src/SparseCore/SparseVector.h +426 -372
- package/eigen/Eigen/src/SparseCore/SparseView.h +164 -193
- package/eigen/Eigen/src/SparseCore/TriangularSolver.h +129 -170
- package/eigen/Eigen/src/SparseLU/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SparseLU/SparseLU.h +814 -618
- package/eigen/Eigen/src/SparseLU/SparseLUImpl.h +61 -48
- package/eigen/Eigen/src/SparseLU/SparseLU_Memory.h +102 -118
- package/eigen/Eigen/src/SparseLU/SparseLU_Structs.h +38 -35
- package/eigen/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h +273 -255
- package/eigen/Eigen/src/SparseLU/SparseLU_Utils.h +44 -49
- package/eigen/Eigen/src/SparseLU/SparseLU_column_bmod.h +104 -108
- package/eigen/Eigen/src/SparseLU/SparseLU_column_dfs.h +90 -101
- package/eigen/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h +57 -58
- package/eigen/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h +43 -55
- package/eigen/Eigen/src/SparseLU/SparseLU_kernel_bmod.h +74 -71
- package/eigen/Eigen/src/SparseLU/SparseLU_panel_bmod.h +125 -133
- package/eigen/Eigen/src/SparseLU/SparseLU_panel_dfs.h +136 -159
- package/eigen/Eigen/src/SparseLU/SparseLU_pivotL.h +51 -52
- package/eigen/Eigen/src/SparseLU/SparseLU_pruneL.h +67 -73
- package/eigen/Eigen/src/SparseLU/SparseLU_relax_snode.h +24 -26
- package/eigen/Eigen/src/SparseQR/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SparseQR/SparseQR.h +451 -490
- package/eigen/Eigen/src/StlSupport/StdDeque.h +28 -105
- package/eigen/Eigen/src/StlSupport/StdList.h +28 -84
- package/eigen/Eigen/src/StlSupport/StdVector.h +28 -108
- package/eigen/Eigen/src/StlSupport/details.h +48 -50
- package/eigen/Eigen/src/SuperLUSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SuperLUSupport/SuperLUSupport.h +634 -732
- package/eigen/Eigen/src/ThreadPool/Barrier.h +70 -0
- package/eigen/Eigen/src/ThreadPool/CoreThreadPoolDevice.h +336 -0
- package/eigen/Eigen/src/ThreadPool/EventCount.h +241 -0
- package/eigen/Eigen/src/ThreadPool/ForkJoin.h +140 -0
- package/eigen/Eigen/src/ThreadPool/InternalHeaderCheck.h +4 -0
- package/eigen/Eigen/src/ThreadPool/NonBlockingThreadPool.h +587 -0
- package/eigen/Eigen/src/ThreadPool/RunQueue.h +230 -0
- package/eigen/Eigen/src/ThreadPool/ThreadCancel.h +21 -0
- package/eigen/Eigen/src/ThreadPool/ThreadEnvironment.h +43 -0
- package/eigen/Eigen/src/ThreadPool/ThreadLocal.h +289 -0
- package/eigen/Eigen/src/ThreadPool/ThreadPoolInterface.h +50 -0
- package/eigen/Eigen/src/ThreadPool/ThreadYield.h +16 -0
- package/eigen/Eigen/src/UmfPackSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/UmfPackSupport/UmfPackSupport.h +480 -380
- package/eigen/Eigen/src/misc/Image.h +41 -43
- package/eigen/Eigen/src/misc/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/misc/Kernel.h +39 -41
- package/eigen/Eigen/src/misc/RealSvd2x2.h +19 -21
- package/eigen/Eigen/src/misc/blas.h +83 -426
- package/eigen/Eigen/src/misc/lapacke.h +9976 -16182
- package/eigen/Eigen/src/misc/lapacke_helpers.h +163 -0
- package/eigen/Eigen/src/misc/lapacke_mangling.h +4 -5
- package/eigen/Eigen/src/plugins/ArrayCwiseBinaryOps.inc +344 -0
- package/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.inc +544 -0
- package/eigen/Eigen/src/plugins/BlockMethods.inc +1370 -0
- package/eigen/Eigen/src/plugins/CommonCwiseBinaryOps.inc +116 -0
- package/eigen/Eigen/src/plugins/CommonCwiseUnaryOps.inc +167 -0
- package/eigen/Eigen/src/plugins/IndexedViewMethods.inc +192 -0
- package/eigen/Eigen/src/plugins/InternalHeaderCheck.inc +3 -0
- package/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.inc +331 -0
- package/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.inc +118 -0
- package/eigen/Eigen/src/plugins/ReshapedMethods.inc +133 -0
- package/lib/LibEigen.d.ts +4 -0
- package/lib/LibEigen.js +14 -0
- package/lib/index.d.ts +1 -1
- package/lib/index.js +7 -3
- package/package.json +2 -10
- package/eigen/Eigen/CMakeLists.txt +0 -19
- package/eigen/Eigen/src/Core/BooleanRedux.h +0 -164
- package/eigen/Eigen/src/Core/arch/CUDA/Complex.h +0 -103
- package/eigen/Eigen/src/Core/arch/CUDA/Half.h +0 -675
- package/eigen/Eigen/src/Core/arch/CUDA/MathFunctions.h +0 -91
- package/eigen/Eigen/src/Core/arch/CUDA/PacketMath.h +0 -333
- package/eigen/Eigen/src/Core/arch/CUDA/PacketMathHalf.h +0 -1124
- package/eigen/Eigen/src/Core/arch/CUDA/TypeCasting.h +0 -212
- package/eigen/Eigen/src/Core/util/NonMPL2.h +0 -3
- package/eigen/Eigen/src/Geometry/arch/Geometry_SSE.h +0 -161
- package/eigen/Eigen/src/LU/arch/Inverse_SSE.h +0 -338
- package/eigen/Eigen/src/SparseCore/MappedSparseMatrix.h +0 -67
- package/eigen/Eigen/src/SparseLU/SparseLU_gemm_kernel.h +0 -280
- package/eigen/Eigen/src/misc/lapack.h +0 -152
- package/eigen/Eigen/src/plugins/ArrayCwiseBinaryOps.h +0 -332
- package/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.h +0 -552
- package/eigen/Eigen/src/plugins/BlockMethods.h +0 -1058
- package/eigen/Eigen/src/plugins/CommonCwiseBinaryOps.h +0 -115
- package/eigen/Eigen/src/plugins/CommonCwiseUnaryOps.h +0 -163
- package/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.h +0 -152
- package/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.h +0 -85
- package/lib/eigen.d.ts +0 -2
- package/lib/eigen.js +0 -15
|
@@ -10,344 +10,525 @@
|
|
|
10
10
|
#ifndef EIGEN_UNARY_FUNCTORS_H
|
|
11
11
|
#define EIGEN_UNARY_FUNCTORS_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
20
|
/** \internal
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
template<typename Scalar>
|
|
23
|
-
|
|
24
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()
|
|
25
|
-
template<typename Packet>
|
|
26
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
|
|
27
|
-
|
|
21
|
+
* \brief Template functor to compute the opposite of a scalar
|
|
22
|
+
*
|
|
23
|
+
* \sa class CwiseUnaryOp, MatrixBase::operator-
|
|
24
|
+
*/
|
|
25
|
+
template <typename Scalar>
|
|
26
|
+
struct scalar_opposite_op {
|
|
27
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& a) const { return numext::negate(a); }
|
|
28
|
+
template <typename Packet>
|
|
29
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const {
|
|
30
|
+
return internal::pnegate(a);
|
|
31
|
+
}
|
|
28
32
|
};
|
|
29
|
-
template<typename Scalar>
|
|
30
|
-
struct functor_traits<scalar_opposite_op<Scalar
|
|
31
|
-
{
|
|
32
|
-
Cost = NumTraits<Scalar>::AddCost,
|
|
33
|
-
PacketAccess = packet_traits<Scalar>::HasNegate };
|
|
33
|
+
template <typename Scalar>
|
|
34
|
+
struct functor_traits<scalar_opposite_op<Scalar>> {
|
|
35
|
+
enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = packet_traits<Scalar>::HasNegate };
|
|
34
36
|
};
|
|
35
37
|
|
|
36
38
|
/** \internal
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
template<typename Scalar>
|
|
42
|
-
|
|
39
|
+
* \brief Template functor to compute the absolute value of a scalar
|
|
40
|
+
*
|
|
41
|
+
* \sa class CwiseUnaryOp, Cwise::abs
|
|
42
|
+
*/
|
|
43
|
+
template <typename Scalar>
|
|
44
|
+
struct scalar_abs_op {
|
|
43
45
|
typedef typename NumTraits<Scalar>::Real result_type;
|
|
44
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator()
|
|
45
|
-
template<typename Packet>
|
|
46
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
|
|
47
|
-
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
{
|
|
52
|
-
enum {
|
|
53
|
-
Cost = NumTraits<Scalar>::AddCost,
|
|
54
|
-
PacketAccess = packet_traits<Scalar>::HasAbs
|
|
55
|
-
};
|
|
46
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator()(const Scalar& a) const { return numext::abs(a); }
|
|
47
|
+
template <typename Packet>
|
|
48
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const {
|
|
49
|
+
return internal::pabs(a);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
template <typename Scalar>
|
|
53
|
+
struct functor_traits<scalar_abs_op<Scalar>> {
|
|
54
|
+
enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = packet_traits<Scalar>::HasAbs };
|
|
56
55
|
};
|
|
57
56
|
|
|
58
57
|
/** \internal
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
template<typename Scalar>
|
|
64
|
-
{
|
|
58
|
+
* \brief Template functor to compute the score of a scalar, to chose a pivot
|
|
59
|
+
*
|
|
60
|
+
* \sa class CwiseUnaryOp
|
|
61
|
+
*/
|
|
62
|
+
template <typename Scalar>
|
|
63
|
+
struct scalar_score_coeff_op : scalar_abs_op<Scalar> {
|
|
65
64
|
typedef void Score_is_abs;
|
|
66
65
|
};
|
|
67
|
-
template<typename Scalar>
|
|
68
|
-
struct functor_traits<scalar_score_coeff_op<Scalar
|
|
66
|
+
template <typename Scalar>
|
|
67
|
+
struct functor_traits<scalar_score_coeff_op<Scalar>> : functor_traits<scalar_abs_op<Scalar>> {};
|
|
69
68
|
|
|
70
69
|
/* Avoid recomputing abs when we know the score and they are the same. Not a true Eigen functor. */
|
|
71
|
-
template<typename Scalar, typename=void>
|
|
72
|
-
{
|
|
73
|
-
EIGEN_EMPTY_STRUCT_CTOR(abs_knowing_score)
|
|
70
|
+
template <typename Scalar, typename = void>
|
|
71
|
+
struct abs_knowing_score {
|
|
74
72
|
typedef typename NumTraits<Scalar>::Real result_type;
|
|
75
|
-
template<typename Score>
|
|
76
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator()
|
|
73
|
+
template <typename Score>
|
|
74
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator()(const Scalar& a, const Score&) const {
|
|
75
|
+
return numext::abs(a);
|
|
76
|
+
}
|
|
77
77
|
};
|
|
78
|
-
template
|
|
79
|
-
{
|
|
80
|
-
EIGEN_EMPTY_STRUCT_CTOR(abs_knowing_score)
|
|
78
|
+
template <typename Scalar>
|
|
79
|
+
struct abs_knowing_score<Scalar, typename scalar_score_coeff_op<Scalar>::Score_is_abs> {
|
|
81
80
|
typedef typename NumTraits<Scalar>::Real result_type;
|
|
82
|
-
template<typename Scal>
|
|
83
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator()
|
|
81
|
+
template <typename Scal>
|
|
82
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator()(const Scal&, const result_type& a) const {
|
|
83
|
+
return a;
|
|
84
|
+
}
|
|
84
85
|
};
|
|
85
86
|
|
|
86
87
|
/** \internal
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
template<typename Scalar>
|
|
92
|
-
|
|
88
|
+
* \brief Template functor to compute the squared absolute value of a scalar
|
|
89
|
+
*
|
|
90
|
+
* \sa class CwiseUnaryOp, Cwise::abs2
|
|
91
|
+
*/
|
|
92
|
+
template <typename Scalar>
|
|
93
|
+
struct scalar_abs2_op {
|
|
93
94
|
typedef typename NumTraits<Scalar>::Real result_type;
|
|
94
|
-
EIGEN_DEVICE_FUNC
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
};
|
|
100
|
-
template<typename Scalar>
|
|
101
|
-
struct functor_traits<scalar_abs2_op<Scalar
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
EIGEN_STRONG_INLINE const
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
};
|
|
116
|
-
template<typename Scalar>
|
|
117
|
-
struct
|
|
118
|
-
|
|
95
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator()(const Scalar& a) const { return numext::abs2(a); }
|
|
96
|
+
template <typename Packet>
|
|
97
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const {
|
|
98
|
+
return internal::pmul(a, a);
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
template <typename Scalar>
|
|
102
|
+
struct functor_traits<scalar_abs2_op<Scalar>> {
|
|
103
|
+
enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasAbs2 };
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
template <typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
|
|
107
|
+
struct squared_norm_functor {
|
|
108
|
+
typedef Scalar result_type;
|
|
109
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& a) const {
|
|
110
|
+
return Scalar(numext::real(a) * numext::real(a), numext::imag(a) * numext::imag(a));
|
|
111
|
+
}
|
|
112
|
+
template <typename Packet>
|
|
113
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const {
|
|
114
|
+
return Packet(pmul(a.v, a.v));
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
template <typename Scalar>
|
|
118
|
+
struct squared_norm_functor<Scalar, false> : scalar_abs2_op<Scalar> {};
|
|
119
|
+
|
|
120
|
+
template <typename Scalar>
|
|
121
|
+
struct functor_traits<squared_norm_functor<Scalar>> {
|
|
122
|
+
using Real = typename NumTraits<Scalar>::Real;
|
|
123
|
+
enum { Cost = NumTraits<Real>::MulCost, PacketAccess = packet_traits<Real>::HasMul };
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
/** \internal
|
|
127
|
+
* \brief Template functor to compute the conjugate of a complex value
|
|
128
|
+
*
|
|
129
|
+
* \sa class CwiseUnaryOp, MatrixBase::conjugate()
|
|
130
|
+
*/
|
|
131
|
+
template <typename Scalar>
|
|
132
|
+
struct scalar_conjugate_op {
|
|
133
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& a) const { return numext::conj(a); }
|
|
134
|
+
template <typename Packet>
|
|
135
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const {
|
|
136
|
+
return internal::pconj(a);
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
template <typename Scalar>
|
|
140
|
+
struct functor_traits<scalar_conjugate_op<Scalar>> {
|
|
119
141
|
enum {
|
|
120
|
-
Cost =
|
|
142
|
+
Cost = 0,
|
|
143
|
+
// Yes the cost is zero even for complexes because in most cases for which
|
|
144
|
+
// the cost is used, conjugation turns to be a no-op. Some examples:
|
|
145
|
+
// cost(a*conj(b)) == cost(a*b)
|
|
146
|
+
// cost(a+conj(b)) == cost(a+b)
|
|
147
|
+
// <etc.
|
|
148
|
+
// If we don't set it to zero, then:
|
|
149
|
+
// A.conjugate().lazyProduct(B.conjugate())
|
|
150
|
+
// will bake its operands. We definitely don't want that!
|
|
121
151
|
PacketAccess = packet_traits<Scalar>::HasConj
|
|
122
152
|
};
|
|
123
153
|
};
|
|
124
154
|
|
|
125
155
|
/** \internal
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
template<typename Scalar>
|
|
131
|
-
|
|
156
|
+
* \brief Template functor to compute the phase angle of a complex
|
|
157
|
+
*
|
|
158
|
+
* \sa class CwiseUnaryOp, Cwise::arg
|
|
159
|
+
*/
|
|
160
|
+
template <typename Scalar>
|
|
161
|
+
struct scalar_arg_op {
|
|
132
162
|
typedef typename NumTraits<Scalar>::Real result_type;
|
|
133
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator()
|
|
134
|
-
template<typename Packet>
|
|
135
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
|
|
136
|
-
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
{
|
|
163
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator()(const Scalar& a) const { return numext::arg(a); }
|
|
164
|
+
template <typename Packet>
|
|
165
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const {
|
|
166
|
+
return internal::parg(a);
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
template <typename Scalar>
|
|
170
|
+
struct functor_traits<scalar_arg_op<Scalar>> {
|
|
141
171
|
enum {
|
|
142
172
|
Cost = NumTraits<Scalar>::IsComplex ? 5 * NumTraits<Scalar>::MulCost : NumTraits<Scalar>::AddCost,
|
|
143
173
|
PacketAccess = packet_traits<Scalar>::HasArg
|
|
144
174
|
};
|
|
145
175
|
};
|
|
176
|
+
|
|
146
177
|
/** \internal
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
template<typename Scalar
|
|
178
|
+
* \brief Template functor to compute the complex argument, returned as a complex type
|
|
179
|
+
*
|
|
180
|
+
* \sa class CwiseUnaryOp, Cwise::carg
|
|
181
|
+
*/
|
|
182
|
+
template <typename Scalar>
|
|
183
|
+
struct scalar_carg_op {
|
|
184
|
+
using result_type = Scalar;
|
|
185
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& a) const {
|
|
186
|
+
return Scalar(numext::arg(a));
|
|
187
|
+
}
|
|
188
|
+
template <typename Packet>
|
|
189
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const {
|
|
190
|
+
return pcarg(a);
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
template <typename Scalar>
|
|
194
|
+
struct functor_traits<scalar_carg_op<Scalar>> {
|
|
195
|
+
using RealScalar = typename NumTraits<Scalar>::Real;
|
|
196
|
+
enum { Cost = functor_traits<scalar_atan2_op<RealScalar>>::Cost, PacketAccess = packet_traits<RealScalar>::HasATan };
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
/** \internal
|
|
200
|
+
* \brief Template functor to cast a scalar to another type
|
|
201
|
+
*
|
|
202
|
+
* \sa class CwiseUnaryOp, MatrixBase::cast()
|
|
203
|
+
*/
|
|
204
|
+
template <typename Scalar, typename NewType>
|
|
152
205
|
struct scalar_cast_op {
|
|
153
|
-
EIGEN_EMPTY_STRUCT_CTOR(scalar_cast_op)
|
|
154
206
|
typedef NewType result_type;
|
|
155
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const NewType operator()
|
|
207
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const NewType operator()(const Scalar& a) const {
|
|
208
|
+
return cast<Scalar, NewType>(a);
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
template <typename Scalar, typename NewType>
|
|
213
|
+
struct functor_traits<scalar_cast_op<Scalar, NewType>> {
|
|
214
|
+
enum { Cost = is_same<Scalar, NewType>::value ? 0 : NumTraits<NewType>::AddCost, PacketAccess = false };
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
/** \internal
|
|
218
|
+
* `core_cast_op` serves to distinguish the vectorized implementation from that of the legacy `scalar_cast_op` for
|
|
219
|
+
* backwards compatibility. The manner in which packet ops are handled is defined by the specialized unary_evaluator:
|
|
220
|
+
* `unary_evaluator<CwiseUnaryOp<core_cast_op<SrcType, DstType>, ArgType>, IndexBased>` in CoreEvaluators.h
|
|
221
|
+
* Otherwise, the non-vectorized behavior is identical to that of `scalar_cast_op`
|
|
222
|
+
*/
|
|
223
|
+
template <typename SrcType, typename DstType>
|
|
224
|
+
struct core_cast_op : scalar_cast_op<SrcType, DstType> {};
|
|
225
|
+
|
|
226
|
+
template <typename SrcType, typename DstType>
|
|
227
|
+
struct functor_traits<core_cast_op<SrcType, DstType>> {
|
|
228
|
+
using CastingTraits = type_casting_traits<SrcType, DstType>;
|
|
229
|
+
enum {
|
|
230
|
+
Cost = is_same<SrcType, DstType>::value ? 0 : NumTraits<DstType>::AddCost,
|
|
231
|
+
PacketAccess = CastingTraits::VectorizedCast && (CastingTraits::SrcCoeffRatio <= 8)
|
|
232
|
+
};
|
|
233
|
+
};
|
|
234
|
+
|
|
235
|
+
/** \internal
|
|
236
|
+
* \brief Template functor to arithmetically shift a scalar right by a number of bits
|
|
237
|
+
*
|
|
238
|
+
* \sa class CwiseUnaryOp, MatrixBase::shift_right()
|
|
239
|
+
*/
|
|
240
|
+
template <typename Scalar, int N>
|
|
241
|
+
struct scalar_shift_right_op {
|
|
242
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& a) const {
|
|
243
|
+
return numext::arithmetic_shift_right(a);
|
|
244
|
+
}
|
|
245
|
+
template <typename Packet>
|
|
246
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const {
|
|
247
|
+
return internal::parithmetic_shift_right<N>(a);
|
|
248
|
+
}
|
|
249
|
+
};
|
|
250
|
+
template <typename Scalar, int N>
|
|
251
|
+
struct functor_traits<scalar_shift_right_op<Scalar, N>> {
|
|
252
|
+
enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = packet_traits<Scalar>::HasShift };
|
|
253
|
+
};
|
|
254
|
+
|
|
255
|
+
/** \internal
|
|
256
|
+
* \brief Template functor to logically shift a scalar left by a number of bits
|
|
257
|
+
*
|
|
258
|
+
* \sa class CwiseUnaryOp, MatrixBase::shift_left()
|
|
259
|
+
*/
|
|
260
|
+
template <typename Scalar, int N>
|
|
261
|
+
struct scalar_shift_left_op {
|
|
262
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& a) const {
|
|
263
|
+
return numext::logical_shift_left(a);
|
|
264
|
+
}
|
|
265
|
+
template <typename Packet>
|
|
266
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const {
|
|
267
|
+
return internal::plogical_shift_left<N>(a);
|
|
268
|
+
}
|
|
269
|
+
};
|
|
270
|
+
template <typename Scalar, int N>
|
|
271
|
+
struct functor_traits<scalar_shift_left_op<Scalar, N>> {
|
|
272
|
+
enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = packet_traits<Scalar>::HasShift };
|
|
156
273
|
};
|
|
157
|
-
template<typename Scalar, typename NewType>
|
|
158
|
-
struct functor_traits<scalar_cast_op<Scalar,NewType> >
|
|
159
|
-
{ enum { Cost = is_same<Scalar, NewType>::value ? 0 : NumTraits<NewType>::AddCost, PacketAccess = false }; };
|
|
160
274
|
|
|
161
275
|
/** \internal
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
template<typename Scalar>
|
|
276
|
+
* \brief Template functor to extract the real part of a complex
|
|
277
|
+
*
|
|
278
|
+
* \sa class CwiseUnaryOp, MatrixBase::real()
|
|
279
|
+
*/
|
|
280
|
+
template <typename Scalar>
|
|
167
281
|
struct scalar_real_op {
|
|
168
|
-
EIGEN_EMPTY_STRUCT_CTOR(scalar_real_op)
|
|
169
282
|
typedef typename NumTraits<Scalar>::Real result_type;
|
|
170
|
-
EIGEN_DEVICE_FUNC
|
|
171
|
-
|
|
283
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator()(const Scalar& a) const { return numext::real(a); }
|
|
284
|
+
};
|
|
285
|
+
template <typename Scalar>
|
|
286
|
+
struct functor_traits<scalar_real_op<Scalar>> {
|
|
287
|
+
enum { Cost = 0, PacketAccess = false };
|
|
172
288
|
};
|
|
173
|
-
template<typename Scalar>
|
|
174
|
-
struct functor_traits<scalar_real_op<Scalar> >
|
|
175
|
-
{ enum { Cost = 0, PacketAccess = false }; };
|
|
176
289
|
|
|
177
290
|
/** \internal
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
template<typename Scalar>
|
|
291
|
+
* \brief Template functor to extract the imaginary part of a complex
|
|
292
|
+
*
|
|
293
|
+
* \sa class CwiseUnaryOp, MatrixBase::imag()
|
|
294
|
+
*/
|
|
295
|
+
template <typename Scalar>
|
|
183
296
|
struct scalar_imag_op {
|
|
184
|
-
EIGEN_EMPTY_STRUCT_CTOR(scalar_imag_op)
|
|
185
297
|
typedef typename NumTraits<Scalar>::Real result_type;
|
|
186
|
-
EIGEN_DEVICE_FUNC
|
|
187
|
-
|
|
298
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator()(const Scalar& a) const { return numext::imag(a); }
|
|
299
|
+
};
|
|
300
|
+
template <typename Scalar>
|
|
301
|
+
struct functor_traits<scalar_imag_op<Scalar>> {
|
|
302
|
+
enum { Cost = 0, PacketAccess = false };
|
|
188
303
|
};
|
|
189
|
-
template<typename Scalar>
|
|
190
|
-
struct functor_traits<scalar_imag_op<Scalar> >
|
|
191
|
-
{ enum { Cost = 0, PacketAccess = false }; };
|
|
192
304
|
|
|
193
305
|
/** \internal
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
template<typename Scalar>
|
|
306
|
+
* \brief Template functor to extract the real part of a complex as a reference
|
|
307
|
+
*
|
|
308
|
+
* \sa class CwiseUnaryOp, MatrixBase::real()
|
|
309
|
+
*/
|
|
310
|
+
template <typename Scalar>
|
|
199
311
|
struct scalar_real_ref_op {
|
|
200
|
-
EIGEN_EMPTY_STRUCT_CTOR(scalar_real_ref_op)
|
|
201
312
|
typedef typename NumTraits<Scalar>::Real result_type;
|
|
202
|
-
EIGEN_DEVICE_FUNC
|
|
203
|
-
|
|
313
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type& operator()(const Scalar& a) const {
|
|
314
|
+
return numext::real_ref(a);
|
|
315
|
+
}
|
|
316
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type& operator()(Scalar& a) const { return numext::real_ref(a); }
|
|
317
|
+
};
|
|
318
|
+
template <typename Scalar>
|
|
319
|
+
struct functor_traits<scalar_real_ref_op<Scalar>> {
|
|
320
|
+
enum { Cost = 0, PacketAccess = false };
|
|
204
321
|
};
|
|
205
|
-
template<typename Scalar>
|
|
206
|
-
struct functor_traits<scalar_real_ref_op<Scalar> >
|
|
207
|
-
{ enum { Cost = 0, PacketAccess = false }; };
|
|
208
322
|
|
|
209
323
|
/** \internal
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
template<typename Scalar>
|
|
324
|
+
* \brief Template functor to extract the imaginary part of a complex as a reference
|
|
325
|
+
*
|
|
326
|
+
* \sa class CwiseUnaryOp, MatrixBase::imag()
|
|
327
|
+
*/
|
|
328
|
+
template <typename Scalar>
|
|
215
329
|
struct scalar_imag_ref_op {
|
|
216
|
-
EIGEN_EMPTY_STRUCT_CTOR(scalar_imag_ref_op)
|
|
217
330
|
typedef typename NumTraits<Scalar>::Real result_type;
|
|
218
|
-
EIGEN_DEVICE_FUNC
|
|
219
|
-
EIGEN_STRONG_INLINE result_type& operator()
|
|
331
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type& operator()(Scalar& a) const { return numext::imag_ref(a); }
|
|
332
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type& operator()(const Scalar& a) const {
|
|
333
|
+
return numext::imag_ref(a);
|
|
334
|
+
}
|
|
335
|
+
};
|
|
336
|
+
template <typename Scalar>
|
|
337
|
+
struct functor_traits<scalar_imag_ref_op<Scalar>> {
|
|
338
|
+
enum { Cost = 0, PacketAccess = false };
|
|
220
339
|
};
|
|
221
|
-
template<typename Scalar>
|
|
222
|
-
struct functor_traits<scalar_imag_ref_op<Scalar> >
|
|
223
|
-
{ enum { Cost = 0, PacketAccess = false }; };
|
|
224
340
|
|
|
225
341
|
/** \internal
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
template<typename Scalar>
|
|
232
|
-
|
|
233
|
-
EIGEN_DEVICE_FUNC inline const Scalar operator()
|
|
342
|
+
*
|
|
343
|
+
* \brief Template functor to compute the exponential of a scalar
|
|
344
|
+
*
|
|
345
|
+
* \sa class CwiseUnaryOp, Cwise::exp()
|
|
346
|
+
*/
|
|
347
|
+
template <typename Scalar>
|
|
348
|
+
struct scalar_exp_op {
|
|
349
|
+
EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return internal::pexp(a); }
|
|
234
350
|
template <typename Packet>
|
|
235
|
-
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
351
|
+
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
352
|
+
return internal::pexp(a);
|
|
353
|
+
}
|
|
236
354
|
};
|
|
237
355
|
template <typename Scalar>
|
|
238
|
-
struct functor_traits<scalar_exp_op<Scalar
|
|
356
|
+
struct functor_traits<scalar_exp_op<Scalar>> {
|
|
239
357
|
enum {
|
|
240
358
|
PacketAccess = packet_traits<Scalar>::HasExp,
|
|
241
|
-
|
|
359
|
+
// The following numbers are based on the AVX implementation.
|
|
242
360
|
#ifdef EIGEN_VECTORIZE_FMA
|
|
243
361
|
// Haswell can issue 2 add/mul/madd per cycle.
|
|
244
|
-
Cost =
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
6 * NumTraits<Scalar>::MulCost +
|
|
251
|
-
scalar_div_cost<Scalar,packet_traits<Scalar>::HasDiv>::value))
|
|
362
|
+
Cost = (sizeof(Scalar) == 4
|
|
363
|
+
// float: 8 pmadd, 4 pmul, 2 padd/psub, 6 other
|
|
364
|
+
? (8 * NumTraits<Scalar>::AddCost + 6 * NumTraits<Scalar>::MulCost)
|
|
365
|
+
// double: 7 pmadd, 5 pmul, 3 padd/psub, 1 div, 13 other
|
|
366
|
+
: (14 * NumTraits<Scalar>::AddCost + 6 * NumTraits<Scalar>::MulCost +
|
|
367
|
+
scalar_div_cost<Scalar, packet_traits<Scalar>::HasDiv>::value))
|
|
252
368
|
#else
|
|
253
|
-
Cost =
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
12 * NumTraits<Scalar>::MulCost +
|
|
260
|
-
scalar_div_cost<Scalar,packet_traits<Scalar>::HasDiv>::value))
|
|
369
|
+
Cost = (sizeof(Scalar) == 4
|
|
370
|
+
// float: 7 pmadd, 6 pmul, 4 padd/psub, 10 other
|
|
371
|
+
? (21 * NumTraits<Scalar>::AddCost + 13 * NumTraits<Scalar>::MulCost)
|
|
372
|
+
// double: 7 pmadd, 5 pmul, 3 padd/psub, 1 div, 13 other
|
|
373
|
+
: (23 * NumTraits<Scalar>::AddCost + 12 * NumTraits<Scalar>::MulCost +
|
|
374
|
+
scalar_div_cost<Scalar, packet_traits<Scalar>::HasDiv>::value))
|
|
261
375
|
#endif
|
|
262
376
|
};
|
|
263
377
|
};
|
|
264
378
|
|
|
379
|
+
template <typename Scalar>
|
|
380
|
+
struct scalar_exp2_op {
|
|
381
|
+
EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return internal::pexp2(a); }
|
|
382
|
+
template <typename Packet>
|
|
383
|
+
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
384
|
+
return internal::pexp2(a);
|
|
385
|
+
}
|
|
386
|
+
};
|
|
387
|
+
template <typename Scalar>
|
|
388
|
+
struct functor_traits<scalar_exp2_op<Scalar>> {
|
|
389
|
+
enum {
|
|
390
|
+
PacketAccess = packet_traits<Scalar>::HasExp,
|
|
391
|
+
Cost = functor_traits<scalar_exp_op<Scalar>>::Cost // TODO measure cost of exp2
|
|
392
|
+
};
|
|
393
|
+
};
|
|
394
|
+
|
|
395
|
+
/** \internal
|
|
396
|
+
*
|
|
397
|
+
* \brief Template functor to compute the exponential of a scalar - 1.
|
|
398
|
+
*
|
|
399
|
+
* \sa class CwiseUnaryOp, ArrayBase::expm1()
|
|
400
|
+
*/
|
|
401
|
+
template <typename Scalar>
|
|
402
|
+
struct scalar_expm1_op {
|
|
403
|
+
EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::expm1(a); }
|
|
404
|
+
template <typename Packet>
|
|
405
|
+
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
406
|
+
return internal::pexpm1(a);
|
|
407
|
+
}
|
|
408
|
+
};
|
|
409
|
+
template <typename Scalar>
|
|
410
|
+
struct functor_traits<scalar_expm1_op<Scalar>> {
|
|
411
|
+
enum {
|
|
412
|
+
PacketAccess = packet_traits<Scalar>::HasExpm1,
|
|
413
|
+
Cost = functor_traits<scalar_exp_op<Scalar>>::Cost // TODO measure cost of expm1
|
|
414
|
+
};
|
|
415
|
+
};
|
|
416
|
+
|
|
265
417
|
/** \internal
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
template<typename Scalar>
|
|
272
|
-
|
|
273
|
-
EIGEN_DEVICE_FUNC inline const Scalar operator()
|
|
418
|
+
*
|
|
419
|
+
* \brief Template functor to compute the logarithm of a scalar
|
|
420
|
+
*
|
|
421
|
+
* \sa class CwiseUnaryOp, ArrayBase::log()
|
|
422
|
+
*/
|
|
423
|
+
template <typename Scalar>
|
|
424
|
+
struct scalar_log_op {
|
|
425
|
+
EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::log(a); }
|
|
274
426
|
template <typename Packet>
|
|
275
|
-
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
427
|
+
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
428
|
+
return internal::plog(a);
|
|
429
|
+
}
|
|
276
430
|
};
|
|
277
431
|
template <typename Scalar>
|
|
278
|
-
struct functor_traits<scalar_log_op<Scalar
|
|
432
|
+
struct functor_traits<scalar_log_op<Scalar>> {
|
|
279
433
|
enum {
|
|
280
434
|
PacketAccess = packet_traits<Scalar>::HasLog,
|
|
281
|
-
Cost =
|
|
282
|
-
|
|
283
|
-
// The following numbers are based on the AVX implementation.
|
|
435
|
+
Cost = (PacketAccess
|
|
436
|
+
// The following numbers are based on the AVX implementation.
|
|
284
437
|
#ifdef EIGEN_VECTORIZE_FMA
|
|
285
|
-
|
|
286
|
-
|
|
438
|
+
// 8 pmadd, 6 pmul, 8 padd/psub, 16 other, can issue 2 add/mul/madd per cycle.
|
|
439
|
+
? (20 * NumTraits<Scalar>::AddCost + 7 * NumTraits<Scalar>::MulCost)
|
|
287
440
|
#else
|
|
288
|
-
|
|
289
|
-
|
|
441
|
+
// 8 pmadd, 6 pmul, 8 padd/psub, 20 other
|
|
442
|
+
? (36 * NumTraits<Scalar>::AddCost + 14 * NumTraits<Scalar>::MulCost)
|
|
290
443
|
#endif
|
|
291
|
-
|
|
292
|
-
|
|
444
|
+
// Measured cost of std::log.
|
|
445
|
+
: sizeof(Scalar) == 4 ? 40 : 85)
|
|
293
446
|
};
|
|
294
447
|
};
|
|
295
448
|
|
|
296
449
|
/** \internal
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
template<typename Scalar>
|
|
303
|
-
|
|
304
|
-
EIGEN_DEVICE_FUNC inline const Scalar operator()
|
|
450
|
+
*
|
|
451
|
+
* \brief Template functor to compute the logarithm of 1 plus a scalar value
|
|
452
|
+
*
|
|
453
|
+
* \sa class CwiseUnaryOp, ArrayBase::log1p()
|
|
454
|
+
*/
|
|
455
|
+
template <typename Scalar>
|
|
456
|
+
struct scalar_log1p_op {
|
|
457
|
+
EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::log1p(a); }
|
|
305
458
|
template <typename Packet>
|
|
306
|
-
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
459
|
+
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
460
|
+
return internal::plog1p(a);
|
|
461
|
+
}
|
|
307
462
|
};
|
|
308
463
|
template <typename Scalar>
|
|
309
|
-
struct functor_traits<scalar_log1p_op<Scalar
|
|
464
|
+
struct functor_traits<scalar_log1p_op<Scalar>> {
|
|
310
465
|
enum {
|
|
311
466
|
PacketAccess = packet_traits<Scalar>::HasLog1p,
|
|
312
|
-
Cost = functor_traits<scalar_log_op<Scalar
|
|
467
|
+
Cost = functor_traits<scalar_log_op<Scalar>>::Cost // TODO measure cost of log1p
|
|
313
468
|
};
|
|
314
469
|
};
|
|
315
470
|
|
|
316
471
|
/** \internal
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
template<typename Scalar>
|
|
323
|
-
|
|
324
|
-
EIGEN_DEVICE_FUNC inline const Scalar operator()
|
|
472
|
+
*
|
|
473
|
+
* \brief Template functor to compute the base-10 logarithm of a scalar
|
|
474
|
+
*
|
|
475
|
+
* \sa class CwiseUnaryOp, Cwise::log10()
|
|
476
|
+
*/
|
|
477
|
+
template <typename Scalar>
|
|
478
|
+
struct scalar_log10_op {
|
|
479
|
+
EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { EIGEN_USING_STD(log10) return log10(a); }
|
|
480
|
+
template <typename Packet>
|
|
481
|
+
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
482
|
+
return internal::plog10(a);
|
|
483
|
+
}
|
|
484
|
+
};
|
|
485
|
+
template <typename Scalar>
|
|
486
|
+
struct functor_traits<scalar_log10_op<Scalar>> {
|
|
487
|
+
enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasLog10 };
|
|
488
|
+
};
|
|
489
|
+
|
|
490
|
+
/** \internal
|
|
491
|
+
*
|
|
492
|
+
* \brief Template functor to compute the base-2 logarithm of a scalar
|
|
493
|
+
*
|
|
494
|
+
* \sa class CwiseUnaryOp, Cwise::log2()
|
|
495
|
+
*/
|
|
496
|
+
template <typename Scalar>
|
|
497
|
+
struct scalar_log2_op {
|
|
498
|
+
using RealScalar = typename NumTraits<Scalar>::Real;
|
|
499
|
+
EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const {
|
|
500
|
+
return Scalar(RealScalar(EIGEN_LOG2E)) * numext::log(a);
|
|
501
|
+
}
|
|
325
502
|
template <typename Packet>
|
|
326
|
-
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
503
|
+
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
504
|
+
return internal::plog2(a);
|
|
505
|
+
}
|
|
506
|
+
};
|
|
507
|
+
template <typename Scalar>
|
|
508
|
+
struct functor_traits<scalar_log2_op<Scalar>> {
|
|
509
|
+
enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasLog };
|
|
327
510
|
};
|
|
328
|
-
template<typename Scalar>
|
|
329
|
-
struct functor_traits<scalar_log10_op<Scalar> >
|
|
330
|
-
{ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasLog10 }; };
|
|
331
511
|
|
|
332
512
|
/** \internal
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
template<typename Scalar>
|
|
337
|
-
|
|
338
|
-
EIGEN_DEVICE_FUNC inline const Scalar operator()
|
|
513
|
+
* \brief Template functor to compute the square root of a scalar
|
|
514
|
+
* \sa class CwiseUnaryOp, Cwise::sqrt()
|
|
515
|
+
*/
|
|
516
|
+
template <typename Scalar>
|
|
517
|
+
struct scalar_sqrt_op {
|
|
518
|
+
EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::sqrt(a); }
|
|
339
519
|
template <typename Packet>
|
|
340
|
-
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
520
|
+
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
521
|
+
return internal::psqrt(a);
|
|
522
|
+
}
|
|
341
523
|
};
|
|
342
524
|
template <typename Scalar>
|
|
343
|
-
struct functor_traits<scalar_sqrt_op<Scalar
|
|
525
|
+
struct functor_traits<scalar_sqrt_op<Scalar>> {
|
|
344
526
|
enum {
|
|
345
527
|
#if EIGEN_FAST_MATH
|
|
346
528
|
// The following numbers are based on the AVX implementation.
|
|
347
529
|
Cost = (sizeof(Scalar) == 8 ? 28
|
|
348
530
|
// 4 pmul, 1 pmadd, 3 other
|
|
349
|
-
: (3 * NumTraits<Scalar>::AddCost +
|
|
350
|
-
5 * NumTraits<Scalar>::MulCost)),
|
|
531
|
+
: (3 * NumTraits<Scalar>::AddCost + 5 * NumTraits<Scalar>::MulCost)),
|
|
351
532
|
#else
|
|
352
533
|
// The following numbers are based on min VSQRT throughput on Haswell.
|
|
353
534
|
Cost = (sizeof(Scalar) == 8 ? 28 : 14),
|
|
@@ -356,437 +537,884 @@ struct functor_traits<scalar_sqrt_op<Scalar> > {
|
|
|
356
537
|
};
|
|
357
538
|
};
|
|
358
539
|
|
|
540
|
+
// Boolean specialization to eliminate -Wimplicit-conversion-floating-point-to-bool warnings.
|
|
541
|
+
template <>
|
|
542
|
+
struct scalar_sqrt_op<bool> {
|
|
543
|
+
EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline bool operator()(const bool& a) const { return a; }
|
|
544
|
+
template <typename Packet>
|
|
545
|
+
EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
546
|
+
return a;
|
|
547
|
+
}
|
|
548
|
+
};
|
|
549
|
+
template <>
|
|
550
|
+
struct functor_traits<scalar_sqrt_op<bool>> {
|
|
551
|
+
enum { Cost = 1, PacketAccess = packet_traits<bool>::Vectorizable };
|
|
552
|
+
};
|
|
553
|
+
|
|
359
554
|
/** \internal
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
template<typename Scalar>
|
|
364
|
-
|
|
365
|
-
EIGEN_DEVICE_FUNC inline const Scalar operator()
|
|
555
|
+
* \brief Template functor to compute the cube root of a scalar
|
|
556
|
+
* \sa class CwiseUnaryOp, Cwise::sqrt()
|
|
557
|
+
*/
|
|
558
|
+
template <typename Scalar>
|
|
559
|
+
struct scalar_cbrt_op {
|
|
560
|
+
EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::cbrt(a); }
|
|
366
561
|
template <typename Packet>
|
|
367
|
-
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
562
|
+
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
563
|
+
return internal::pcbrt(a);
|
|
564
|
+
}
|
|
368
565
|
};
|
|
369
566
|
|
|
370
|
-
template<typename Scalar>
|
|
371
|
-
struct functor_traits<
|
|
372
|
-
{
|
|
373
|
-
Cost = 5 * NumTraits<Scalar>::MulCost,
|
|
374
|
-
PacketAccess = packet_traits<Scalar>::HasRsqrt
|
|
375
|
-
};
|
|
567
|
+
template <typename Scalar>
|
|
568
|
+
struct functor_traits<scalar_cbrt_op<Scalar>> {
|
|
569
|
+
enum { Cost = 20 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasCbrt };
|
|
376
570
|
};
|
|
377
571
|
|
|
378
572
|
/** \internal
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
template<typename Scalar>
|
|
383
|
-
|
|
384
|
-
EIGEN_DEVICE_FUNC inline Scalar operator()
|
|
573
|
+
* \brief Template functor to compute the reciprocal square root of a scalar
|
|
574
|
+
* \sa class CwiseUnaryOp, Cwise::rsqrt()
|
|
575
|
+
*/
|
|
576
|
+
template <typename Scalar>
|
|
577
|
+
struct scalar_rsqrt_op {
|
|
578
|
+
EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::rsqrt(a); }
|
|
385
579
|
template <typename Packet>
|
|
386
|
-
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
580
|
+
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
581
|
+
return internal::prsqrt(a);
|
|
582
|
+
}
|
|
387
583
|
};
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
{
|
|
391
|
-
enum {
|
|
392
|
-
Cost = 5 * NumTraits<Scalar>::MulCost,
|
|
393
|
-
PacketAccess = packet_traits<Scalar>::HasCos
|
|
394
|
-
};
|
|
584
|
+
|
|
585
|
+
template <typename Scalar>
|
|
586
|
+
struct functor_traits<scalar_rsqrt_op<Scalar>> {
|
|
587
|
+
enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasRsqrt };
|
|
395
588
|
};
|
|
396
589
|
|
|
397
590
|
/** \internal
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
template<typename Scalar>
|
|
402
|
-
|
|
403
|
-
EIGEN_DEVICE_FUNC inline
|
|
591
|
+
* \brief Template functor to compute the cosine of a scalar
|
|
592
|
+
* \sa class CwiseUnaryOp, ArrayBase::cos()
|
|
593
|
+
*/
|
|
594
|
+
template <typename Scalar>
|
|
595
|
+
struct scalar_cos_op {
|
|
596
|
+
EIGEN_DEVICE_FUNC inline Scalar operator()(const Scalar& a) const { return numext::cos(a); }
|
|
404
597
|
template <typename Packet>
|
|
405
|
-
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
598
|
+
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
599
|
+
return internal::pcos(a);
|
|
600
|
+
}
|
|
406
601
|
};
|
|
407
|
-
template<typename Scalar>
|
|
408
|
-
struct functor_traits<
|
|
409
|
-
{
|
|
410
|
-
enum {
|
|
411
|
-
Cost = 5 * NumTraits<Scalar>::MulCost,
|
|
412
|
-
PacketAccess = packet_traits<Scalar>::HasSin
|
|
413
|
-
};
|
|
602
|
+
template <typename Scalar>
|
|
603
|
+
struct functor_traits<scalar_cos_op<Scalar>> {
|
|
604
|
+
enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasCos };
|
|
414
605
|
};
|
|
415
606
|
|
|
416
|
-
|
|
417
607
|
/** \internal
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
template<typename Scalar>
|
|
422
|
-
|
|
423
|
-
EIGEN_DEVICE_FUNC inline const Scalar operator()
|
|
608
|
+
* \brief Template functor to compute the sine of a scalar
|
|
609
|
+
* \sa class CwiseUnaryOp, ArrayBase::sin()
|
|
610
|
+
*/
|
|
611
|
+
template <typename Scalar>
|
|
612
|
+
struct scalar_sin_op {
|
|
613
|
+
EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::sin(a); }
|
|
424
614
|
template <typename Packet>
|
|
425
|
-
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
615
|
+
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
616
|
+
return internal::psin(a);
|
|
617
|
+
}
|
|
426
618
|
};
|
|
427
|
-
template<typename Scalar>
|
|
428
|
-
struct functor_traits<
|
|
429
|
-
{
|
|
430
|
-
enum {
|
|
431
|
-
Cost = 5 * NumTraits<Scalar>::MulCost,
|
|
432
|
-
PacketAccess = packet_traits<Scalar>::HasTan
|
|
433
|
-
};
|
|
619
|
+
template <typename Scalar>
|
|
620
|
+
struct functor_traits<scalar_sin_op<Scalar>> {
|
|
621
|
+
enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasSin };
|
|
434
622
|
};
|
|
435
623
|
|
|
436
624
|
/** \internal
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
template<typename Scalar>
|
|
441
|
-
|
|
442
|
-
EIGEN_DEVICE_FUNC inline const Scalar operator()
|
|
625
|
+
* \brief Template functor to compute the tan of a scalar
|
|
626
|
+
* \sa class CwiseUnaryOp, ArrayBase::tan()
|
|
627
|
+
*/
|
|
628
|
+
template <typename Scalar>
|
|
629
|
+
struct scalar_tan_op {
|
|
630
|
+
EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::tan(a); }
|
|
443
631
|
template <typename Packet>
|
|
444
|
-
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
632
|
+
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
633
|
+
return internal::ptan(a);
|
|
634
|
+
}
|
|
445
635
|
};
|
|
446
|
-
template<typename Scalar>
|
|
447
|
-
struct functor_traits<
|
|
448
|
-
{
|
|
449
|
-
enum {
|
|
450
|
-
Cost = 5 * NumTraits<Scalar>::MulCost,
|
|
451
|
-
PacketAccess = packet_traits<Scalar>::HasACos
|
|
452
|
-
};
|
|
636
|
+
template <typename Scalar>
|
|
637
|
+
struct functor_traits<scalar_tan_op<Scalar>> {
|
|
638
|
+
enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasTan };
|
|
453
639
|
};
|
|
454
640
|
|
|
455
641
|
/** \internal
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
template<typename Scalar>
|
|
460
|
-
|
|
461
|
-
EIGEN_DEVICE_FUNC inline const Scalar operator()
|
|
642
|
+
* \brief Template functor to compute the arc cosine of a scalar
|
|
643
|
+
* \sa class CwiseUnaryOp, ArrayBase::acos()
|
|
644
|
+
*/
|
|
645
|
+
template <typename Scalar>
|
|
646
|
+
struct scalar_acos_op {
|
|
647
|
+
EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::acos(a); }
|
|
462
648
|
template <typename Packet>
|
|
463
|
-
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
649
|
+
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
650
|
+
return internal::pacos(a);
|
|
651
|
+
}
|
|
464
652
|
};
|
|
465
|
-
template<typename Scalar>
|
|
466
|
-
struct functor_traits<
|
|
467
|
-
{
|
|
468
|
-
enum {
|
|
469
|
-
Cost = 5 * NumTraits<Scalar>::MulCost,
|
|
470
|
-
PacketAccess = packet_traits<Scalar>::HasASin
|
|
471
|
-
};
|
|
653
|
+
template <typename Scalar>
|
|
654
|
+
struct functor_traits<scalar_acos_op<Scalar>> {
|
|
655
|
+
enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasACos };
|
|
472
656
|
};
|
|
473
657
|
|
|
658
|
+
/** \internal
|
|
659
|
+
* \brief Template functor to compute the arc sine of a scalar
|
|
660
|
+
* \sa class CwiseUnaryOp, ArrayBase::asin()
|
|
661
|
+
*/
|
|
662
|
+
template <typename Scalar>
|
|
663
|
+
struct scalar_asin_op {
|
|
664
|
+
EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::asin(a); }
|
|
665
|
+
template <typename Packet>
|
|
666
|
+
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
667
|
+
return internal::pasin(a);
|
|
668
|
+
}
|
|
669
|
+
};
|
|
670
|
+
template <typename Scalar>
|
|
671
|
+
struct functor_traits<scalar_asin_op<Scalar>> {
|
|
672
|
+
enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasASin };
|
|
673
|
+
};
|
|
474
674
|
|
|
475
675
|
/** \internal
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
template<typename Scalar>
|
|
480
|
-
|
|
481
|
-
EIGEN_DEVICE_FUNC inline const Scalar operator()
|
|
676
|
+
* \brief Template functor to compute the atan of a scalar
|
|
677
|
+
* \sa class CwiseUnaryOp, ArrayBase::atan()
|
|
678
|
+
*/
|
|
679
|
+
template <typename Scalar>
|
|
680
|
+
struct scalar_atan_op {
|
|
681
|
+
EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::atan(a); }
|
|
482
682
|
template <typename Packet>
|
|
483
|
-
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
683
|
+
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
684
|
+
return internal::patan(a);
|
|
685
|
+
}
|
|
484
686
|
};
|
|
485
|
-
template<typename Scalar>
|
|
486
|
-
struct functor_traits<scalar_atan_op<Scalar
|
|
487
|
-
{
|
|
488
|
-
enum {
|
|
489
|
-
Cost = 5 * NumTraits<Scalar>::MulCost,
|
|
490
|
-
PacketAccess = packet_traits<Scalar>::HasATan
|
|
491
|
-
};
|
|
687
|
+
template <typename Scalar>
|
|
688
|
+
struct functor_traits<scalar_atan_op<Scalar>> {
|
|
689
|
+
enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasATan };
|
|
492
690
|
};
|
|
493
691
|
|
|
494
692
|
/** \internal
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
693
|
+
* \brief Template functor to compute the tanh of a scalar
|
|
694
|
+
* \sa class CwiseUnaryOp, ArrayBase::tanh()
|
|
695
|
+
*/
|
|
498
696
|
template <typename Scalar>
|
|
499
697
|
struct scalar_tanh_op {
|
|
500
|
-
EIGEN_EMPTY_STRUCT_CTOR(scalar_tanh_op)
|
|
501
698
|
EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::tanh(a); }
|
|
502
699
|
template <typename Packet>
|
|
503
|
-
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& x) const {
|
|
700
|
+
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& x) const {
|
|
701
|
+
return ptanh(x);
|
|
702
|
+
}
|
|
504
703
|
};
|
|
505
704
|
|
|
506
705
|
template <typename Scalar>
|
|
507
|
-
struct functor_traits<scalar_tanh_op<Scalar
|
|
706
|
+
struct functor_traits<scalar_tanh_op<Scalar>> {
|
|
508
707
|
enum {
|
|
509
708
|
PacketAccess = packet_traits<Scalar>::HasTanh,
|
|
510
|
-
Cost = (
|
|
709
|
+
Cost = ((EIGEN_FAST_MATH && is_same<Scalar, float>::value)
|
|
511
710
|
// The following numbers are based on the AVX implementation,
|
|
512
711
|
#ifdef EIGEN_VECTORIZE_FMA
|
|
513
712
|
// Haswell can issue 2 add/mul/madd per cycle.
|
|
514
713
|
// 9 pmadd, 2 pmul, 1 div, 2 other
|
|
515
|
-
? (2 * NumTraits<Scalar>::AddCost +
|
|
516
|
-
|
|
517
|
-
scalar_div_cost<Scalar,packet_traits<Scalar>::HasDiv>::value)
|
|
714
|
+
? (2 * NumTraits<Scalar>::AddCost + 6 * NumTraits<Scalar>::MulCost +
|
|
715
|
+
scalar_div_cost<Scalar, packet_traits<Scalar>::HasDiv>::value)
|
|
518
716
|
#else
|
|
519
|
-
? (11 * NumTraits<Scalar>::AddCost +
|
|
520
|
-
|
|
521
|
-
scalar_div_cost<Scalar,packet_traits<Scalar>::HasDiv>::value)
|
|
717
|
+
? (11 * NumTraits<Scalar>::AddCost + 11 * NumTraits<Scalar>::MulCost +
|
|
718
|
+
scalar_div_cost<Scalar, packet_traits<Scalar>::HasDiv>::value)
|
|
522
719
|
#endif
|
|
523
720
|
// This number assumes a naive implementation of tanh
|
|
524
|
-
: (6 * NumTraits<Scalar>::AddCost +
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
functor_traits<scalar_exp_op<Scalar> >::Cost))
|
|
721
|
+
: (6 * NumTraits<Scalar>::AddCost + 3 * NumTraits<Scalar>::MulCost +
|
|
722
|
+
2 * scalar_div_cost<Scalar, packet_traits<Scalar>::HasDiv>::value +
|
|
723
|
+
functor_traits<scalar_exp_op<Scalar>>::Cost))
|
|
528
724
|
};
|
|
529
725
|
};
|
|
530
726
|
|
|
531
727
|
/** \internal
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
template<typename Scalar>
|
|
536
|
-
|
|
537
|
-
EIGEN_DEVICE_FUNC inline const Scalar operator()
|
|
728
|
+
* \brief Template functor to compute the atanh of a scalar
|
|
729
|
+
* \sa class CwiseUnaryOp, ArrayBase::atanh()
|
|
730
|
+
*/
|
|
731
|
+
template <typename Scalar>
|
|
732
|
+
struct scalar_atanh_op {
|
|
733
|
+
EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::atanh(a); }
|
|
538
734
|
template <typename Packet>
|
|
539
|
-
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet&
|
|
735
|
+
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& x) const {
|
|
736
|
+
return patanh(x);
|
|
737
|
+
}
|
|
540
738
|
};
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
{
|
|
544
|
-
enum {
|
|
545
|
-
Cost = 5 * NumTraits<Scalar>::MulCost,
|
|
546
|
-
PacketAccess = packet_traits<Scalar>::HasSinh
|
|
547
|
-
};
|
|
739
|
+
|
|
740
|
+
template <typename Scalar>
|
|
741
|
+
struct functor_traits<scalar_atanh_op<Scalar>> {
|
|
742
|
+
enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasATanh };
|
|
548
743
|
};
|
|
549
744
|
|
|
550
745
|
/** \internal
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
template<typename Scalar>
|
|
555
|
-
|
|
556
|
-
EIGEN_DEVICE_FUNC inline const Scalar operator()
|
|
746
|
+
* \brief Template functor to compute the sinh of a scalar
|
|
747
|
+
* \sa class CwiseUnaryOp, ArrayBase::sinh()
|
|
748
|
+
*/
|
|
749
|
+
template <typename Scalar>
|
|
750
|
+
struct scalar_sinh_op {
|
|
751
|
+
EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::sinh(a); }
|
|
557
752
|
template <typename Packet>
|
|
558
|
-
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
753
|
+
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
754
|
+
return internal::psinh(a);
|
|
755
|
+
}
|
|
559
756
|
};
|
|
560
|
-
template<typename Scalar>
|
|
561
|
-
struct functor_traits<
|
|
562
|
-
{
|
|
563
|
-
enum {
|
|
564
|
-
Cost = 5 * NumTraits<Scalar>::MulCost,
|
|
565
|
-
PacketAccess = packet_traits<Scalar>::HasCosh
|
|
566
|
-
};
|
|
757
|
+
template <typename Scalar>
|
|
758
|
+
struct functor_traits<scalar_sinh_op<Scalar>> {
|
|
759
|
+
enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasSinh };
|
|
567
760
|
};
|
|
568
761
|
|
|
569
762
|
/** \internal
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
template<typename Scalar>
|
|
763
|
+
* \brief Template functor to compute the asinh of a scalar
|
|
764
|
+
* \sa class CwiseUnaryOp, ArrayBase::asinh()
|
|
765
|
+
*/
|
|
766
|
+
template <typename Scalar>
|
|
767
|
+
struct scalar_asinh_op {
|
|
768
|
+
EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::asinh(a); }
|
|
769
|
+
};
|
|
770
|
+
|
|
771
|
+
template <typename Scalar>
|
|
772
|
+
struct functor_traits<scalar_asinh_op<Scalar>> {
|
|
773
|
+
enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = false };
|
|
774
|
+
};
|
|
775
|
+
|
|
776
|
+
/** \internal
|
|
777
|
+
* \brief Template functor to compute the cosh of a scalar
|
|
778
|
+
* \sa class CwiseUnaryOp, ArrayBase::cosh()
|
|
779
|
+
*/
|
|
780
|
+
template <typename Scalar>
|
|
781
|
+
struct scalar_cosh_op {
|
|
782
|
+
EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::cosh(a); }
|
|
783
|
+
template <typename Packet>
|
|
784
|
+
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
785
|
+
return internal::pcosh(a);
|
|
786
|
+
}
|
|
787
|
+
};
|
|
788
|
+
template <typename Scalar>
|
|
789
|
+
struct functor_traits<scalar_cosh_op<Scalar>> {
|
|
790
|
+
enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasCosh };
|
|
791
|
+
};
|
|
792
|
+
|
|
793
|
+
/** \internal
|
|
794
|
+
* \brief Template functor to compute the acosh of a scalar
|
|
795
|
+
* \sa class CwiseUnaryOp, ArrayBase::acosh()
|
|
796
|
+
*/
|
|
797
|
+
template <typename Scalar>
|
|
798
|
+
struct scalar_acosh_op {
|
|
799
|
+
EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::acosh(a); }
|
|
800
|
+
};
|
|
801
|
+
|
|
802
|
+
template <typename Scalar>
|
|
803
|
+
struct functor_traits<scalar_acosh_op<Scalar>> {
|
|
804
|
+
enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = false };
|
|
805
|
+
};
|
|
806
|
+
|
|
807
|
+
/** \internal
|
|
808
|
+
* \brief Template functor to compute the inverse of a scalar
|
|
809
|
+
* \sa class CwiseUnaryOp, Cwise::inverse()
|
|
810
|
+
*/
|
|
811
|
+
template <typename Scalar>
|
|
574
812
|
struct scalar_inverse_op {
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
813
|
+
EIGEN_DEVICE_FUNC inline Scalar operator()(const Scalar& a) const { return Scalar(1) / a; }
|
|
814
|
+
template <typename Packet>
|
|
815
|
+
EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const {
|
|
816
|
+
return internal::preciprocal(a);
|
|
817
|
+
}
|
|
818
|
+
};
|
|
819
|
+
template <typename Scalar>
|
|
820
|
+
struct functor_traits<scalar_inverse_op<Scalar>> {
|
|
821
|
+
enum {
|
|
822
|
+
PacketAccess = packet_traits<Scalar>::HasDiv,
|
|
823
|
+
// If packet_traits<Scalar>::HasReciprocal then the Estimated cost is that
|
|
824
|
+
// of computing an approximation plus a single Newton-Raphson step, which
|
|
825
|
+
// consists of 1 pmul + 1 pmadd.
|
|
826
|
+
Cost = (packet_traits<Scalar>::HasReciprocal ? 4 * NumTraits<Scalar>::MulCost
|
|
827
|
+
: scalar_div_cost<Scalar, PacketAccess>::value)
|
|
828
|
+
};
|
|
580
829
|
};
|
|
581
|
-
template<typename Scalar>
|
|
582
|
-
struct functor_traits<scalar_inverse_op<Scalar> >
|
|
583
|
-
{ enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasDiv }; };
|
|
584
830
|
|
|
585
831
|
/** \internal
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
template<typename Scalar>
|
|
832
|
+
* \brief Template functor to compute the square of a scalar
|
|
833
|
+
* \sa class CwiseUnaryOp, Cwise::square()
|
|
834
|
+
*/
|
|
835
|
+
template <typename Scalar>
|
|
590
836
|
struct scalar_square_op {
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
837
|
+
EIGEN_DEVICE_FUNC inline Scalar operator()(const Scalar& a) const { return a * a; }
|
|
838
|
+
template <typename Packet>
|
|
839
|
+
EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const {
|
|
840
|
+
return internal::pmul(a, a);
|
|
841
|
+
}
|
|
842
|
+
};
|
|
843
|
+
template <typename Scalar>
|
|
844
|
+
struct functor_traits<scalar_square_op<Scalar>> {
|
|
845
|
+
enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul };
|
|
846
|
+
};
|
|
847
|
+
|
|
848
|
+
// Boolean specialization to avoid -Wint-in-bool-context warnings on GCC.
|
|
849
|
+
template <>
|
|
850
|
+
struct scalar_square_op<bool> {
|
|
851
|
+
EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline bool operator()(const bool& a) const { return a; }
|
|
852
|
+
template <typename Packet>
|
|
853
|
+
EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const {
|
|
854
|
+
return a;
|
|
855
|
+
}
|
|
856
|
+
};
|
|
857
|
+
template <>
|
|
858
|
+
struct functor_traits<scalar_square_op<bool>> {
|
|
859
|
+
enum { Cost = 0, PacketAccess = packet_traits<bool>::Vectorizable };
|
|
596
860
|
};
|
|
597
|
-
template<typename Scalar>
|
|
598
|
-
struct functor_traits<scalar_square_op<Scalar> >
|
|
599
|
-
{ enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; };
|
|
600
861
|
|
|
601
862
|
/** \internal
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
template<typename Scalar>
|
|
863
|
+
* \brief Template functor to compute the cube of a scalar
|
|
864
|
+
* \sa class CwiseUnaryOp, Cwise::cube()
|
|
865
|
+
*/
|
|
866
|
+
template <typename Scalar>
|
|
606
867
|
struct scalar_cube_op {
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
868
|
+
EIGEN_DEVICE_FUNC inline Scalar operator()(const Scalar& a) const { return a * a * a; }
|
|
869
|
+
template <typename Packet>
|
|
870
|
+
EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const {
|
|
871
|
+
return internal::pmul(a, pmul(a, a));
|
|
872
|
+
}
|
|
873
|
+
};
|
|
874
|
+
template <typename Scalar>
|
|
875
|
+
struct functor_traits<scalar_cube_op<Scalar>> {
|
|
876
|
+
enum { Cost = 2 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul };
|
|
877
|
+
};
|
|
878
|
+
|
|
879
|
+
// Boolean specialization to avoid -Wint-in-bool-context warnings on GCC.
|
|
880
|
+
template <>
|
|
881
|
+
struct scalar_cube_op<bool> {
|
|
882
|
+
EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline bool operator()(const bool& a) const { return a; }
|
|
883
|
+
template <typename Packet>
|
|
884
|
+
EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const {
|
|
885
|
+
return a;
|
|
886
|
+
}
|
|
887
|
+
};
|
|
888
|
+
template <>
|
|
889
|
+
struct functor_traits<scalar_cube_op<bool>> {
|
|
890
|
+
enum { Cost = 0, PacketAccess = packet_traits<bool>::Vectorizable };
|
|
612
891
|
};
|
|
613
|
-
template<typename Scalar>
|
|
614
|
-
struct functor_traits<scalar_cube_op<Scalar> >
|
|
615
|
-
{ enum { Cost = 2*NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; };
|
|
616
892
|
|
|
617
893
|
/** \internal
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
template<typename Scalar>
|
|
622
|
-
|
|
623
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()
|
|
894
|
+
* \brief Template functor to compute the rounded value of a scalar
|
|
895
|
+
* \sa class CwiseUnaryOp, ArrayBase::round()
|
|
896
|
+
*/
|
|
897
|
+
template <typename Scalar>
|
|
898
|
+
struct scalar_round_op {
|
|
899
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& a) const { return numext::round(a); }
|
|
624
900
|
template <typename Packet>
|
|
625
|
-
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
901
|
+
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
902
|
+
return internal::pround(a);
|
|
903
|
+
}
|
|
626
904
|
};
|
|
627
|
-
template<typename Scalar>
|
|
628
|
-
struct functor_traits<scalar_round_op<Scalar
|
|
629
|
-
{
|
|
905
|
+
template <typename Scalar>
|
|
906
|
+
struct functor_traits<scalar_round_op<Scalar>> {
|
|
630
907
|
enum {
|
|
631
908
|
Cost = NumTraits<Scalar>::MulCost,
|
|
632
|
-
PacketAccess = packet_traits<Scalar>::HasRound
|
|
909
|
+
PacketAccess = packet_traits<Scalar>::HasRound || NumTraits<Scalar>::IsInteger
|
|
633
910
|
};
|
|
634
911
|
};
|
|
635
912
|
|
|
636
913
|
/** \internal
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
template<typename Scalar>
|
|
641
|
-
|
|
642
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()
|
|
914
|
+
* \brief Template functor to compute the floor of a scalar
|
|
915
|
+
* \sa class CwiseUnaryOp, ArrayBase::floor()
|
|
916
|
+
*/
|
|
917
|
+
template <typename Scalar>
|
|
918
|
+
struct scalar_floor_op {
|
|
919
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& a) const { return numext::floor(a); }
|
|
643
920
|
template <typename Packet>
|
|
644
|
-
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
921
|
+
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
922
|
+
return internal::pfloor(a);
|
|
923
|
+
}
|
|
645
924
|
};
|
|
646
|
-
template<typename Scalar>
|
|
647
|
-
struct functor_traits<scalar_floor_op<Scalar
|
|
648
|
-
{
|
|
925
|
+
template <typename Scalar>
|
|
926
|
+
struct functor_traits<scalar_floor_op<Scalar>> {
|
|
649
927
|
enum {
|
|
650
928
|
Cost = NumTraits<Scalar>::MulCost,
|
|
651
|
-
PacketAccess = packet_traits<Scalar>::
|
|
929
|
+
PacketAccess = packet_traits<Scalar>::HasRound || NumTraits<Scalar>::IsInteger
|
|
652
930
|
};
|
|
653
931
|
};
|
|
654
932
|
|
|
655
933
|
/** \internal
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
template<typename Scalar>
|
|
660
|
-
|
|
661
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()
|
|
934
|
+
* \brief Template functor to compute the rounded (with current rounding mode) value of a scalar
|
|
935
|
+
* \sa class CwiseUnaryOp, ArrayBase::rint()
|
|
936
|
+
*/
|
|
937
|
+
template <typename Scalar>
|
|
938
|
+
struct scalar_rint_op {
|
|
939
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& a) const { return numext::rint(a); }
|
|
662
940
|
template <typename Packet>
|
|
663
|
-
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
941
|
+
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
942
|
+
return internal::print(a);
|
|
943
|
+
}
|
|
664
944
|
};
|
|
665
|
-
template<typename Scalar>
|
|
666
|
-
struct functor_traits<
|
|
667
|
-
{
|
|
945
|
+
template <typename Scalar>
|
|
946
|
+
struct functor_traits<scalar_rint_op<Scalar>> {
|
|
668
947
|
enum {
|
|
669
948
|
Cost = NumTraits<Scalar>::MulCost,
|
|
670
|
-
PacketAccess = packet_traits<Scalar>::
|
|
949
|
+
PacketAccess = packet_traits<Scalar>::HasRound || NumTraits<Scalar>::IsInteger
|
|
671
950
|
};
|
|
672
951
|
};
|
|
673
952
|
|
|
674
953
|
/** \internal
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
template<typename Scalar>
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
954
|
+
* \brief Template functor to compute the ceil of a scalar
|
|
955
|
+
* \sa class CwiseUnaryOp, ArrayBase::ceil()
|
|
956
|
+
*/
|
|
957
|
+
template <typename Scalar>
|
|
958
|
+
struct scalar_ceil_op {
|
|
959
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& a) const { return numext::ceil(a); }
|
|
960
|
+
template <typename Packet>
|
|
961
|
+
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
962
|
+
return internal::pceil(a);
|
|
963
|
+
}
|
|
682
964
|
};
|
|
683
|
-
template<typename Scalar>
|
|
684
|
-
struct functor_traits<
|
|
685
|
-
{
|
|
965
|
+
template <typename Scalar>
|
|
966
|
+
struct functor_traits<scalar_ceil_op<Scalar>> {
|
|
686
967
|
enum {
|
|
687
968
|
Cost = NumTraits<Scalar>::MulCost,
|
|
688
|
-
PacketAccess =
|
|
969
|
+
PacketAccess = packet_traits<Scalar>::HasRound || NumTraits<Scalar>::IsInteger
|
|
689
970
|
};
|
|
690
971
|
};
|
|
691
972
|
|
|
692
973
|
/** \internal
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
template<typename Scalar>
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
974
|
+
* \brief Template functor to compute the truncation of a scalar
|
|
975
|
+
* \sa class CwiseUnaryOp, ArrayBase::floor()
|
|
976
|
+
*/
|
|
977
|
+
template <typename Scalar>
|
|
978
|
+
struct scalar_trunc_op {
|
|
979
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& a) const { return numext::trunc(a); }
|
|
980
|
+
template <typename Packet>
|
|
981
|
+
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
982
|
+
return internal::ptrunc(a);
|
|
983
|
+
}
|
|
700
984
|
};
|
|
701
|
-
template<typename Scalar>
|
|
702
|
-
struct functor_traits<
|
|
703
|
-
{
|
|
985
|
+
template <typename Scalar>
|
|
986
|
+
struct functor_traits<scalar_trunc_op<Scalar>> {
|
|
704
987
|
enum {
|
|
705
988
|
Cost = NumTraits<Scalar>::MulCost,
|
|
706
|
-
PacketAccess =
|
|
989
|
+
PacketAccess = packet_traits<Scalar>::HasRound || NumTraits<Scalar>::IsInteger
|
|
707
990
|
};
|
|
708
991
|
};
|
|
709
992
|
|
|
710
993
|
/** \internal
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
template<typename Scalar
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
994
|
+
* \brief Template functor to compute whether a scalar is NaN
|
|
995
|
+
* \sa class CwiseUnaryOp, ArrayBase::isnan()
|
|
996
|
+
*/
|
|
997
|
+
template <typename Scalar, bool UseTypedPredicate = false>
|
|
998
|
+
struct scalar_isnan_op {
|
|
999
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator()(const Scalar& a) const {
|
|
1000
|
+
#if defined(SYCL_DEVICE_ONLY)
|
|
1001
|
+
return numext::isnan(a);
|
|
1002
|
+
#else
|
|
1003
|
+
return numext::isnan EIGEN_NOT_A_MACRO(a);
|
|
1004
|
+
#endif
|
|
1005
|
+
}
|
|
1006
|
+
};
|
|
1007
|
+
|
|
1008
|
+
template <typename Scalar>
|
|
1009
|
+
struct scalar_isnan_op<Scalar, true> {
|
|
1010
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar& a) const {
|
|
1011
|
+
#if defined(SYCL_DEVICE_ONLY)
|
|
1012
|
+
return (numext::isnan(a) ? ptrue(a) : pzero(a));
|
|
1013
|
+
#else
|
|
1014
|
+
return (numext::isnan EIGEN_NOT_A_MACRO(a) ? ptrue(a) : pzero(a));
|
|
1015
|
+
#endif
|
|
1016
|
+
}
|
|
1017
|
+
template <typename Packet>
|
|
1018
|
+
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
1019
|
+
return pisnan(a);
|
|
1020
|
+
}
|
|
1021
|
+
};
|
|
1022
|
+
|
|
1023
|
+
template <typename Scalar, bool UseTypedPredicate>
|
|
1024
|
+
struct functor_traits<scalar_isnan_op<Scalar, UseTypedPredicate>> {
|
|
1025
|
+
enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasCmp && UseTypedPredicate };
|
|
1026
|
+
};
|
|
1027
|
+
|
|
1028
|
+
/** \internal
|
|
1029
|
+
* \brief Template functor to check whether a scalar is +/-inf
|
|
1030
|
+
* \sa class CwiseUnaryOp, ArrayBase::isinf()
|
|
1031
|
+
*/
|
|
1032
|
+
template <typename Scalar, bool UseTypedPredicate = false>
|
|
1033
|
+
struct scalar_isinf_op {
|
|
1034
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator()(const Scalar& a) const {
|
|
1035
|
+
#if defined(SYCL_DEVICE_ONLY)
|
|
1036
|
+
return numext::isinf(a);
|
|
1037
|
+
#else
|
|
1038
|
+
return (numext::isinf)(a);
|
|
1039
|
+
#endif
|
|
1040
|
+
}
|
|
718
1041
|
};
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
{
|
|
1042
|
+
|
|
1043
|
+
template <typename Scalar>
|
|
1044
|
+
struct scalar_isinf_op<Scalar, true> {
|
|
1045
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar& a) const {
|
|
1046
|
+
#if defined(SYCL_DEVICE_ONLY)
|
|
1047
|
+
return (numext::isinf(a) ? ptrue(a) : pzero(a));
|
|
1048
|
+
#else
|
|
1049
|
+
return (numext::isinf EIGEN_NOT_A_MACRO(a) ? ptrue(a) : pzero(a));
|
|
1050
|
+
#endif
|
|
1051
|
+
}
|
|
1052
|
+
template <typename Packet>
|
|
1053
|
+
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
1054
|
+
return pisinf(a);
|
|
1055
|
+
}
|
|
1056
|
+
};
|
|
1057
|
+
template <typename Scalar, bool UseTypedPredicate>
|
|
1058
|
+
struct functor_traits<scalar_isinf_op<Scalar, UseTypedPredicate>> {
|
|
1059
|
+
enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasCmp && UseTypedPredicate };
|
|
1060
|
+
};
|
|
1061
|
+
|
|
1062
|
+
/** \internal
|
|
1063
|
+
* \brief Template functor to check whether a scalar has a finite value
|
|
1064
|
+
* \sa class CwiseUnaryOp, ArrayBase::isfinite()
|
|
1065
|
+
*/
|
|
1066
|
+
template <typename Scalar, bool UseTypedPredicate = false>
|
|
1067
|
+
struct scalar_isfinite_op {
|
|
1068
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator()(const Scalar& a) const {
|
|
1069
|
+
#if defined(SYCL_DEVICE_ONLY)
|
|
1070
|
+
return numext::isfinite(a);
|
|
1071
|
+
#else
|
|
1072
|
+
return (numext::isfinite)(a);
|
|
1073
|
+
#endif
|
|
1074
|
+
}
|
|
1075
|
+
};
|
|
1076
|
+
|
|
1077
|
+
template <typename Scalar>
|
|
1078
|
+
struct scalar_isfinite_op<Scalar, true> {
|
|
1079
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar& a) const {
|
|
1080
|
+
#if defined(SYCL_DEVICE_ONLY)
|
|
1081
|
+
return (numext::isfinite(a) ? ptrue(a) : pzero(a));
|
|
1082
|
+
#else
|
|
1083
|
+
return (numext::isfinite EIGEN_NOT_A_MACRO(a) ? ptrue(a) : pzero(a));
|
|
1084
|
+
#endif
|
|
1085
|
+
}
|
|
1086
|
+
template <typename Packet>
|
|
1087
|
+
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
1088
|
+
constexpr Scalar inf = NumTraits<Scalar>::infinity();
|
|
1089
|
+
return pcmp_lt(pabs(a), pset1<Packet>(inf));
|
|
1090
|
+
}
|
|
1091
|
+
};
|
|
1092
|
+
template <typename Scalar, bool UseTypedPredicate>
|
|
1093
|
+
struct functor_traits<scalar_isfinite_op<Scalar, UseTypedPredicate>> {
|
|
1094
|
+
enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasCmp && UseTypedPredicate };
|
|
1095
|
+
};
|
|
1096
|
+
|
|
1097
|
+
/** \internal
|
|
1098
|
+
* \brief Template functor to compute the logical not of a scalar as if it were a boolean
|
|
1099
|
+
*
|
|
1100
|
+
* \sa class CwiseUnaryOp, ArrayBase::operator!
|
|
1101
|
+
*/
|
|
1102
|
+
template <typename Scalar>
|
|
1103
|
+
struct scalar_boolean_not_op {
|
|
1104
|
+
using result_type = Scalar;
|
|
1105
|
+
// `false` any value `a` that satisfies `a == Scalar(0)`
|
|
1106
|
+
// `true` is the complement of `false`
|
|
1107
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar& a) const {
|
|
1108
|
+
return a == Scalar(0) ? Scalar(1) : Scalar(0);
|
|
1109
|
+
}
|
|
1110
|
+
template <typename Packet>
|
|
1111
|
+
EIGEN_STRONG_INLINE Packet packetOp(const Packet& a) const {
|
|
1112
|
+
const Packet cst_one = pset1<Packet>(Scalar(1));
|
|
1113
|
+
Packet not_a = pcmp_eq(a, pzero(a));
|
|
1114
|
+
return pand(not_a, cst_one);
|
|
1115
|
+
}
|
|
1116
|
+
};
|
|
1117
|
+
template <typename Scalar>
|
|
1118
|
+
struct functor_traits<scalar_boolean_not_op<Scalar>> {
|
|
1119
|
+
enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = packet_traits<Scalar>::HasCmp };
|
|
1120
|
+
};
|
|
1121
|
+
|
|
1122
|
+
template <typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
|
|
1123
|
+
struct bitwise_unary_impl {
|
|
1124
|
+
static constexpr size_t Size = sizeof(Scalar);
|
|
1125
|
+
using uint_t = typename numext::get_integer_by_size<Size>::unsigned_type;
|
|
1126
|
+
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_not(const Scalar& a) {
|
|
1127
|
+
uint_t a_as_uint = numext::bit_cast<uint_t, Scalar>(a);
|
|
1128
|
+
uint_t result = ~a_as_uint;
|
|
1129
|
+
return numext::bit_cast<Scalar, uint_t>(result);
|
|
1130
|
+
}
|
|
1131
|
+
};
|
|
1132
|
+
|
|
1133
|
+
template <typename Scalar>
|
|
1134
|
+
struct bitwise_unary_impl<Scalar, true> {
|
|
1135
|
+
using Real = typename NumTraits<Scalar>::Real;
|
|
1136
|
+
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_not(const Scalar& a) {
|
|
1137
|
+
Real real_result = bitwise_unary_impl<Real>::run_not(numext::real(a));
|
|
1138
|
+
Real imag_result = bitwise_unary_impl<Real>::run_not(numext::imag(a));
|
|
1139
|
+
return Scalar(real_result, imag_result);
|
|
1140
|
+
}
|
|
1141
|
+
};
|
|
1142
|
+
|
|
1143
|
+
/** \internal
|
|
1144
|
+
* \brief Template functor to compute the bitwise not of a scalar
|
|
1145
|
+
*
|
|
1146
|
+
* \sa class CwiseUnaryOp, ArrayBase::operator~
|
|
1147
|
+
*/
|
|
1148
|
+
template <typename Scalar>
|
|
1149
|
+
struct scalar_bitwise_not_op {
|
|
1150
|
+
EIGEN_STATIC_ASSERT(!NumTraits<Scalar>::RequireInitialization,
|
|
1151
|
+
BITWISE OPERATIONS MAY ONLY BE PERFORMED ON PLAIN DATA TYPES)
|
|
1152
|
+
EIGEN_STATIC_ASSERT((!internal::is_same<Scalar, bool>::value), DONT USE BITWISE OPS ON BOOLEAN TYPES)
|
|
1153
|
+
using result_type = Scalar;
|
|
1154
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar& a) const {
|
|
1155
|
+
return bitwise_unary_impl<Scalar>::run_not(a);
|
|
1156
|
+
}
|
|
1157
|
+
template <typename Packet>
|
|
1158
|
+
EIGEN_STRONG_INLINE Packet packetOp(const Packet& a) const {
|
|
1159
|
+
return pandnot(ptrue(a), a);
|
|
1160
|
+
}
|
|
1161
|
+
};
|
|
1162
|
+
template <typename Scalar>
|
|
1163
|
+
struct functor_traits<scalar_bitwise_not_op<Scalar>> {
|
|
1164
|
+
enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = true };
|
|
1165
|
+
};
|
|
1166
|
+
|
|
1167
|
+
/** \internal
|
|
1168
|
+
* \brief Template functor to compute the signum of a scalar
|
|
1169
|
+
* \sa class CwiseUnaryOp, Cwise::sign()
|
|
1170
|
+
*/
|
|
1171
|
+
template <typename Scalar>
|
|
1172
|
+
struct scalar_sign_op {
|
|
1173
|
+
EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::sign(a); }
|
|
1174
|
+
|
|
1175
|
+
template <typename Packet>
|
|
1176
|
+
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
1177
|
+
return internal::psign(a);
|
|
1178
|
+
}
|
|
1179
|
+
};
|
|
1180
|
+
|
|
1181
|
+
template <typename Scalar>
|
|
1182
|
+
struct functor_traits<scalar_sign_op<Scalar>> {
|
|
722
1183
|
enum {
|
|
723
|
-
Cost = NumTraits<Scalar>::MulCost
|
|
724
|
-
|
|
1184
|
+
Cost = NumTraits<Scalar>::IsComplex ? (8 * NumTraits<Scalar>::MulCost) // roughly
|
|
1185
|
+
: (3 * NumTraits<Scalar>::AddCost),
|
|
1186
|
+
PacketAccess = packet_traits<Scalar>::HasSign && packet_traits<Scalar>::Vectorizable
|
|
725
1187
|
};
|
|
726
1188
|
};
|
|
727
1189
|
|
|
1190
|
+
// Real-valued implementation.
|
|
1191
|
+
template <typename T, typename EnableIf = void>
|
|
1192
|
+
struct scalar_logistic_op_impl {
|
|
1193
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T operator()(const T& x) const { return packetOp(x); }
|
|
1194
|
+
|
|
1195
|
+
template <typename Packet>
|
|
1196
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x) const {
|
|
1197
|
+
const Packet one = pset1<Packet>(T(1));
|
|
1198
|
+
const Packet inf = pset1<Packet>(NumTraits<T>::infinity());
|
|
1199
|
+
const Packet e = pexp(x);
|
|
1200
|
+
const Packet inf_mask = pcmp_eq(e, inf);
|
|
1201
|
+
return pselect(inf_mask, one, pdiv(e, padd(one, e)));
|
|
1202
|
+
}
|
|
1203
|
+
};
|
|
1204
|
+
|
|
1205
|
+
// Complex-valud implementation.
|
|
1206
|
+
template <typename T>
|
|
1207
|
+
struct scalar_logistic_op_impl<T, std::enable_if_t<NumTraits<T>::IsComplex>> {
|
|
1208
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T operator()(const T& x) const {
|
|
1209
|
+
const T e = numext::exp(x);
|
|
1210
|
+
return (numext::isinf)(numext::real(e)) ? T(1) : e / (e + T(1));
|
|
1211
|
+
}
|
|
1212
|
+
};
|
|
1213
|
+
|
|
1214
|
+
/** \internal
|
|
1215
|
+
* \brief Template functor to compute the logistic function of a scalar
|
|
1216
|
+
* \sa class CwiseUnaryOp, ArrayBase::logistic()
|
|
1217
|
+
*/
|
|
1218
|
+
template <typename T>
|
|
1219
|
+
struct scalar_logistic_op : scalar_logistic_op_impl<T> {};
|
|
1220
|
+
|
|
1221
|
+
// TODO(rmlarsen): Enable the following on host when integer_packet is defined
|
|
1222
|
+
// for the relevant packet types.
|
|
1223
|
+
#ifndef EIGEN_GPUCC
|
|
1224
|
+
|
|
728
1225
|
/** \internal
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
1226
|
+
* \brief Template specialization of the logistic function for float.
|
|
1227
|
+
* Computes S(x) = exp(x) / (1 + exp(x)), where exp(x) is implemented
|
|
1228
|
+
* using an algorithm partly adopted from the implementation of
|
|
1229
|
+
* pexp_float. See the individual steps described in the code below.
|
|
1230
|
+
* Note that compared to pexp, we use an additional outer multiplicative
|
|
1231
|
+
* range reduction step using the identity exp(x) = exp(x/2)^2.
|
|
1232
|
+
* This prevert us from having to call ldexp on values that could produce
|
|
1233
|
+
* a denormal result, which allows us to call the faster implementation in
|
|
1234
|
+
* pldexp_fast_impl<Packet>::run(p, m).
|
|
1235
|
+
* The final squaring, however, doubles the error bound on the final
|
|
1236
|
+
* approximation. Exhaustive testing shows that we have a worst case error
|
|
1237
|
+
* of 4.5 ulps (compared to computing S(x) in double precision), which is
|
|
1238
|
+
* acceptable.
|
|
1239
|
+
*/
|
|
1240
|
+
template <>
|
|
1241
|
+
struct scalar_logistic_op<float> {
|
|
1242
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float operator()(const float& x) const {
|
|
1243
|
+
// Truncate at the first point where the interpolant is exactly one.
|
|
1244
|
+
const float cst_exp_hi = 16.6355324f;
|
|
1245
|
+
const float e = numext::exp(numext::mini(x, cst_exp_hi));
|
|
1246
|
+
return e / (1.0f + e);
|
|
1247
|
+
}
|
|
1248
|
+
|
|
1249
|
+
template <typename Packet>
|
|
1250
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& _x) const {
|
|
1251
|
+
const Packet cst_zero = pset1<Packet>(0.0f);
|
|
1252
|
+
const Packet cst_one = pset1<Packet>(1.0f);
|
|
1253
|
+
const Packet cst_half = pset1<Packet>(0.5f);
|
|
1254
|
+
// Truncate at the first point where the interpolant is exactly one.
|
|
1255
|
+
const Packet cst_exp_hi = pset1<Packet>(16.6355324f);
|
|
1256
|
+
const Packet cst_exp_lo = pset1<Packet>(-104.f);
|
|
1257
|
+
|
|
1258
|
+
// Clamp x to the non-trivial range where S(x). Outside this
|
|
1259
|
+
// interval the correctly rounded value of S(x) is either zero
|
|
1260
|
+
// or one.
|
|
1261
|
+
Packet zero_mask = pcmp_lt(_x, cst_exp_lo);
|
|
1262
|
+
Packet x = pmin(_x, cst_exp_hi);
|
|
1263
|
+
|
|
1264
|
+
// 1. Multiplicative range reduction:
|
|
1265
|
+
// Reduce the range of x by a factor of 2. This avoids having
|
|
1266
|
+
// to compute exp(x) accurately where the result is a denormalized
|
|
1267
|
+
// value.
|
|
1268
|
+
x = pmul(x, cst_half);
|
|
1269
|
+
|
|
1270
|
+
// 2. Subtractive range reduction:
|
|
1271
|
+
// Express exp(x) as exp(m*ln(2) + r) = 2^m*exp(r), start by extracting
|
|
1272
|
+
// m = floor(x/ln(2) + 0.5), such that x = m*ln(2) + r.
|
|
1273
|
+
const Packet cst_cephes_LOG2EF = pset1<Packet>(1.44269504088896341f);
|
|
1274
|
+
Packet m = pfloor(pmadd(x, cst_cephes_LOG2EF, cst_half));
|
|
1275
|
+
// Get r = x - m*ln(2). We use a trick from Cephes where the term
|
|
1276
|
+
// m*ln(2) is subtracted out in two parts, m*C1+m*C2 = m*ln(2),
|
|
1277
|
+
// to avoid accumulating truncation errors.
|
|
1278
|
+
const Packet cst_cephes_exp_C1 = pset1<Packet>(-0.693359375f);
|
|
1279
|
+
const Packet cst_cephes_exp_C2 = pset1<Packet>(2.12194440e-4f);
|
|
1280
|
+
Packet r = pmadd(m, cst_cephes_exp_C1, x);
|
|
1281
|
+
r = pmadd(m, cst_cephes_exp_C2, r);
|
|
1282
|
+
|
|
1283
|
+
// 3. Compute an approximation to exp(r) using a degree 5 minimax polynomial.
|
|
1284
|
+
// We compute even and odd terms separately to increase instruction level
|
|
1285
|
+
// parallelism.
|
|
1286
|
+
Packet r2 = pmul(r, r);
|
|
1287
|
+
const Packet cst_p2 = pset1<Packet>(0.49999141693115234375f);
|
|
1288
|
+
const Packet cst_p3 = pset1<Packet>(0.16666877269744873046875f);
|
|
1289
|
+
const Packet cst_p4 = pset1<Packet>(4.1898667812347412109375e-2f);
|
|
1290
|
+
const Packet cst_p5 = pset1<Packet>(8.33471305668354034423828125e-3f);
|
|
1291
|
+
|
|
1292
|
+
const Packet p_even = pmadd(r2, cst_p4, cst_p2);
|
|
1293
|
+
const Packet p_odd = pmadd(r2, cst_p5, cst_p3);
|
|
1294
|
+
const Packet p_low = padd(r, cst_one);
|
|
1295
|
+
Packet p = pmadd(r, p_odd, p_even);
|
|
1296
|
+
p = pmadd(r2, p, p_low);
|
|
1297
|
+
|
|
1298
|
+
// 4. Undo subtractive range reduction exp(m*ln(2) + r) = 2^m * exp(r).
|
|
1299
|
+
Packet e = pldexp_fast(p, m);
|
|
1300
|
+
|
|
1301
|
+
// 5. Undo multiplicative range reduction by using exp(r) = exp(r/2)^2.
|
|
1302
|
+
e = pmul(e, e);
|
|
1303
|
+
|
|
1304
|
+
// Return exp(x) / (1 + exp(x))
|
|
1305
|
+
return pselect(zero_mask, cst_zero, pdiv(e, padd(cst_one, e)));
|
|
1306
|
+
}
|
|
736
1307
|
};
|
|
737
|
-
|
|
738
|
-
|
|
1308
|
+
#endif // #ifndef EIGEN_GPU_COMPILE_PHASE
|
|
1309
|
+
|
|
1310
|
+
template <typename T>
|
|
1311
|
+
struct functor_traits<scalar_logistic_op<T>> {
|
|
739
1312
|
enum {
|
|
740
|
-
|
|
741
|
-
|
|
1313
|
+
// The cost estimate for float here here is for the common(?) case where
|
|
1314
|
+
// all arguments are greater than -9.
|
|
1315
|
+
Cost = scalar_div_cost<T, packet_traits<T>::HasDiv>::value +
|
|
1316
|
+
(internal::is_same<T, float>::value ? NumTraits<T>::AddCost * 15 + NumTraits<T>::MulCost * 11
|
|
1317
|
+
: NumTraits<T>::AddCost * 2 + functor_traits<scalar_exp_op<T>>::Cost),
|
|
1318
|
+
PacketAccess = !NumTraits<T>::IsComplex && packet_traits<T>::HasAdd && packet_traits<T>::HasDiv &&
|
|
1319
|
+
(internal::is_same<T, float>::value
|
|
1320
|
+
? packet_traits<T>::HasMul && packet_traits<T>::HasMax && packet_traits<T>::HasMin
|
|
1321
|
+
: packet_traits<T>::HasNegate && packet_traits<T>::HasExp)
|
|
742
1322
|
};
|
|
743
1323
|
};
|
|
744
1324
|
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
//TODO
|
|
774
|
-
//
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
1325
|
+
template <typename Scalar, typename ExponentScalar, bool IsBaseInteger = NumTraits<Scalar>::IsInteger,
|
|
1326
|
+
bool IsExponentInteger = NumTraits<ExponentScalar>::IsInteger,
|
|
1327
|
+
bool IsBaseComplex = NumTraits<Scalar>::IsComplex,
|
|
1328
|
+
bool IsExponentComplex = NumTraits<ExponentScalar>::IsComplex>
|
|
1329
|
+
struct scalar_unary_pow_op {
|
|
1330
|
+
typedef typename internal::promote_scalar_arg<
|
|
1331
|
+
Scalar, ExponentScalar,
|
|
1332
|
+
internal::has_ReturnType<ScalarBinaryOpTraits<Scalar, ExponentScalar, scalar_unary_pow_op>>::value>::type
|
|
1333
|
+
PromotedExponent;
|
|
1334
|
+
typedef typename ScalarBinaryOpTraits<Scalar, PromotedExponent, scalar_unary_pow_op>::ReturnType result_type;
|
|
1335
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE scalar_unary_pow_op(const ExponentScalar& exponent) : m_exponent(exponent) {}
|
|
1336
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator()(const Scalar& a) const {
|
|
1337
|
+
EIGEN_USING_STD(pow);
|
|
1338
|
+
return static_cast<result_type>(pow(a, m_exponent));
|
|
1339
|
+
}
|
|
1340
|
+
|
|
1341
|
+
private:
|
|
1342
|
+
const ExponentScalar m_exponent;
|
|
1343
|
+
scalar_unary_pow_op() {}
|
|
1344
|
+
};
|
|
1345
|
+
|
|
1346
|
+
template <typename T>
|
|
1347
|
+
constexpr int exponent_digits() {
|
|
1348
|
+
return CHAR_BIT * sizeof(T) - NumTraits<T>::digits() - NumTraits<T>::IsSigned;
|
|
1349
|
+
}
|
|
1350
|
+
|
|
1351
|
+
template <typename From, typename To>
|
|
1352
|
+
struct is_floating_exactly_representable {
|
|
1353
|
+
// TODO(rmlarsen): Add radix to NumTraits and enable this check.
|
|
1354
|
+
// (NumTraits<To>::radix == NumTraits<From>::radix) &&
|
|
1355
|
+
static constexpr bool value =
|
|
1356
|
+
(exponent_digits<To>() >= exponent_digits<From>() && NumTraits<To>::digits() >= NumTraits<From>::digits());
|
|
1357
|
+
};
|
|
1358
|
+
|
|
1359
|
+
// Specialization for real, non-integer types, non-complex types.
|
|
1360
|
+
template <typename Scalar, typename ExponentScalar>
|
|
1361
|
+
struct scalar_unary_pow_op<Scalar, ExponentScalar, false, false, false, false> {
|
|
1362
|
+
template <bool IsExactlyRepresentable = is_floating_exactly_representable<ExponentScalar, Scalar>::value>
|
|
1363
|
+
std::enable_if_t<IsExactlyRepresentable, void> check_is_representable() const {}
|
|
1364
|
+
|
|
1365
|
+
// Issue a deprecation warning if we do a narrowing conversion on the exponent.
|
|
1366
|
+
template <bool IsExactlyRepresentable = is_floating_exactly_representable<ExponentScalar, Scalar>::value>
|
|
1367
|
+
EIGEN_DEPRECATED std::enable_if_t<!IsExactlyRepresentable, void> check_is_representable() const {}
|
|
1368
|
+
|
|
1369
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE scalar_unary_pow_op(const ExponentScalar& exponent)
|
|
1370
|
+
: m_exponent(static_cast<Scalar>(exponent)) {
|
|
1371
|
+
check_is_representable();
|
|
1372
|
+
}
|
|
1373
|
+
|
|
1374
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar& a) const {
|
|
1375
|
+
EIGEN_USING_STD(pow);
|
|
1376
|
+
return static_cast<Scalar>(pow(a, m_exponent));
|
|
1377
|
+
}
|
|
1378
|
+
template <typename Packet>
|
|
1379
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a) const {
|
|
1380
|
+
return unary_pow_impl<Packet, Scalar>::run(a, m_exponent);
|
|
1381
|
+
}
|
|
1382
|
+
|
|
1383
|
+
private:
|
|
1384
|
+
const Scalar m_exponent;
|
|
1385
|
+
scalar_unary_pow_op() {}
|
|
1386
|
+
};
|
|
1387
|
+
|
|
1388
|
+
template <typename Scalar, typename ExponentScalar, bool BaseIsInteger>
|
|
1389
|
+
struct scalar_unary_pow_op<Scalar, ExponentScalar, BaseIsInteger, true, false, false> {
|
|
1390
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE scalar_unary_pow_op(const ExponentScalar& exponent) : m_exponent(exponent) {}
|
|
1391
|
+
// TODO: error handling logic for complex^real_integer
|
|
1392
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar& a) const {
|
|
1393
|
+
return unary_pow_impl<Scalar, ExponentScalar>::run(a, m_exponent);
|
|
1394
|
+
}
|
|
1395
|
+
template <typename Packet>
|
|
1396
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a) const {
|
|
1397
|
+
return unary_pow_impl<Packet, ExponentScalar>::run(a, m_exponent);
|
|
1398
|
+
}
|
|
1399
|
+
|
|
1400
|
+
private:
|
|
1401
|
+
const ExponentScalar m_exponent;
|
|
1402
|
+
scalar_unary_pow_op() {}
|
|
1403
|
+
};
|
|
1404
|
+
|
|
1405
|
+
template <typename Scalar, typename ExponentScalar>
|
|
1406
|
+
struct functor_traits<scalar_unary_pow_op<Scalar, ExponentScalar>> {
|
|
1407
|
+
enum {
|
|
1408
|
+
GenPacketAccess = functor_traits<scalar_pow_op<Scalar, ExponentScalar>>::PacketAccess,
|
|
1409
|
+
IntPacketAccess = !NumTraits<Scalar>::IsComplex && packet_traits<Scalar>::HasMul &&
|
|
1410
|
+
(packet_traits<Scalar>::HasDiv || NumTraits<Scalar>::IsInteger) && packet_traits<Scalar>::HasCmp,
|
|
1411
|
+
PacketAccess = NumTraits<ExponentScalar>::IsInteger ? IntPacketAccess : (IntPacketAccess && GenPacketAccess),
|
|
1412
|
+
Cost = functor_traits<scalar_pow_op<Scalar, ExponentScalar>>::Cost
|
|
785
1413
|
};
|
|
786
1414
|
};
|
|
787
1415
|
|
|
788
|
-
}
|
|
1416
|
+
} // end namespace internal
|
|
789
1417
|
|
|
790
|
-
}
|
|
1418
|
+
} // end namespace Eigen
|
|
791
1419
|
|
|
792
|
-
#endif
|
|
1420
|
+
#endif // EIGEN_FUNCTORS_H
|