@smake/eigen 1.1.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/eigen/Eigen/AccelerateSupport +52 -0
- package/eigen/Eigen/Cholesky +18 -20
- package/eigen/Eigen/CholmodSupport +28 -28
- package/eigen/Eigen/Core +187 -120
- package/eigen/Eigen/Eigenvalues +16 -13
- package/eigen/Eigen/Geometry +18 -18
- package/eigen/Eigen/Householder +9 -7
- package/eigen/Eigen/IterativeLinearSolvers +8 -4
- package/eigen/Eigen/Jacobi +14 -13
- package/eigen/Eigen/KLUSupport +23 -21
- package/eigen/Eigen/LU +15 -16
- package/eigen/Eigen/MetisSupport +12 -12
- package/eigen/Eigen/OrderingMethods +54 -51
- package/eigen/Eigen/PaStiXSupport +23 -21
- package/eigen/Eigen/PardisoSupport +17 -14
- package/eigen/Eigen/QR +18 -20
- package/eigen/Eigen/QtAlignedMalloc +5 -12
- package/eigen/Eigen/SPQRSupport +21 -14
- package/eigen/Eigen/SVD +23 -17
- package/eigen/Eigen/Sparse +1 -2
- package/eigen/Eigen/SparseCholesky +18 -15
- package/eigen/Eigen/SparseCore +18 -17
- package/eigen/Eigen/SparseLU +9 -9
- 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 +366 -405
- package/eigen/Eigen/src/Cholesky/LLT.h +323 -367
- package/eigen/Eigen/src/Cholesky/LLT_LAPACKE.h +81 -56
- package/eigen/Eigen/src/CholmodSupport/CholmodSupport.h +585 -529
- package/eigen/Eigen/src/CholmodSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Core/ArithmeticSequence.h +143 -317
- package/eigen/Eigen/src/Core/Array.h +329 -370
- package/eigen/Eigen/src/Core/ArrayBase.h +190 -203
- package/eigen/Eigen/src/Core/ArrayWrapper.h +126 -170
- package/eigen/Eigen/src/Core/Assign.h +30 -40
- package/eigen/Eigen/src/Core/AssignEvaluator.h +651 -604
- package/eigen/Eigen/src/Core/Assign_MKL.h +125 -120
- package/eigen/Eigen/src/Core/BandMatrix.h +267 -282
- package/eigen/Eigen/src/Core/Block.h +371 -390
- package/eigen/Eigen/src/Core/CommaInitializer.h +85 -100
- package/eigen/Eigen/src/Core/ConditionEstimator.h +51 -53
- package/eigen/Eigen/src/Core/CoreEvaluators.h +1214 -937
- package/eigen/Eigen/src/Core/CoreIterators.h +72 -63
- package/eigen/Eigen/src/Core/CwiseBinaryOp.h +112 -129
- package/eigen/Eigen/src/Core/CwiseNullaryOp.h +676 -702
- package/eigen/Eigen/src/Core/CwiseTernaryOp.h +77 -103
- package/eigen/Eigen/src/Core/CwiseUnaryOp.h +55 -67
- package/eigen/Eigen/src/Core/CwiseUnaryView.h +127 -92
- package/eigen/Eigen/src/Core/DenseBase.h +630 -658
- package/eigen/Eigen/src/Core/DenseCoeffsBase.h +511 -628
- package/eigen/Eigen/src/Core/DenseStorage.h +511 -590
- package/eigen/Eigen/src/Core/DeviceWrapper.h +153 -0
- package/eigen/Eigen/src/Core/Diagonal.h +168 -207
- package/eigen/Eigen/src/Core/DiagonalMatrix.h +346 -317
- package/eigen/Eigen/src/Core/DiagonalProduct.h +12 -10
- package/eigen/Eigen/src/Core/Dot.h +167 -217
- package/eigen/Eigen/src/Core/EigenBase.h +74 -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 -113
- package/eigen/Eigen/src/Core/Fuzzy.h +82 -105
- package/eigen/Eigen/src/Core/GeneralProduct.h +315 -261
- package/eigen/Eigen/src/Core/GenericPacketMath.h +1182 -520
- package/eigen/Eigen/src/Core/GlobalFunctions.h +193 -157
- package/eigen/Eigen/src/Core/IO.h +131 -156
- package/eigen/Eigen/src/Core/IndexedView.h +209 -125
- 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 +50 -59
- package/eigen/Eigen/src/Core/Map.h +123 -141
- package/eigen/Eigen/src/Core/MapBase.h +255 -282
- package/eigen/Eigen/src/Core/MathFunctions.h +1247 -1201
- package/eigen/Eigen/src/Core/MathFunctionsImpl.h +162 -99
- package/eigen/Eigen/src/Core/Matrix.h +463 -494
- package/eigen/Eigen/src/Core/MatrixBase.h +468 -470
- package/eigen/Eigen/src/Core/NestByValue.h +58 -52
- package/eigen/Eigen/src/Core/NoAlias.h +79 -86
- package/eigen/Eigen/src/Core/NumTraits.h +206 -206
- package/eigen/Eigen/src/Core/PartialReduxEvaluator.h +163 -142
- package/eigen/Eigen/src/Core/PermutationMatrix.h +461 -511
- package/eigen/Eigen/src/Core/PlainObjectBase.h +858 -972
- package/eigen/Eigen/src/Core/Product.h +246 -130
- package/eigen/Eigen/src/Core/ProductEvaluators.h +779 -671
- package/eigen/Eigen/src/Core/Random.h +153 -164
- 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 +334 -314
- package/eigen/Eigen/src/Core/Ref.h +259 -257
- package/eigen/Eigen/src/Core/Replicate.h +92 -104
- package/eigen/Eigen/src/Core/Reshaped.h +215 -271
- package/eigen/Eigen/src/Core/ReturnByValue.h +47 -55
- package/eigen/Eigen/src/Core/Reverse.h +133 -148
- package/eigen/Eigen/src/Core/Select.h +68 -140
- package/eigen/Eigen/src/Core/SelfAdjointView.h +254 -290
- 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 +88 -102
- package/eigen/Eigen/src/Core/SolveTriangular.h +126 -124
- package/eigen/Eigen/src/Core/SolverBase.h +132 -133
- package/eigen/Eigen/src/Core/StableNorm.h +113 -147
- package/eigen/Eigen/src/Core/StlIterators.h +404 -248
- package/eigen/Eigen/src/Core/Stride.h +90 -92
- package/eigen/Eigen/src/Core/Swap.h +70 -39
- package/eigen/Eigen/src/Core/Transpose.h +258 -295
- package/eigen/Eigen/src/Core/Transpositions.h +270 -333
- package/eigen/Eigen/src/Core/TriangularMatrix.h +642 -743
- package/eigen/Eigen/src/Core/VectorBlock.h +59 -72
- package/eigen/Eigen/src/Core/VectorwiseOp.h +653 -704
- package/eigen/Eigen/src/Core/Visitor.h +464 -308
- package/eigen/Eigen/src/Core/arch/AVX/Complex.h +380 -187
- package/eigen/Eigen/src/Core/arch/AVX/MathFunctions.h +65 -163
- package/eigen/Eigen/src/Core/arch/AVX/PacketMath.h +2145 -638
- package/eigen/Eigen/src/Core/arch/AVX/Reductions.h +353 -0
- package/eigen/Eigen/src/Core/arch/AVX/TypeCasting.h +253 -60
- package/eigen/Eigen/src/Core/arch/AVX512/Complex.h +278 -228
- package/eigen/Eigen/src/Core/arch/AVX512/GemmKernel.h +1245 -0
- package/eigen/Eigen/src/Core/arch/AVX512/MathFunctions.h +48 -269
- package/eigen/Eigen/src/Core/arch/AVX512/MathFunctionsFP16.h +75 -0
- package/eigen/Eigen/src/Core/arch/AVX512/PacketMath.h +1597 -754
- 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 +229 -41
- package/eigen/Eigen/src/Core/arch/AVX512/TypeCastingFP16.h +130 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/Complex.h +420 -184
- package/eigen/Eigen/src/Core/arch/AltiVec/MathFunctions.h +40 -49
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProduct.h +2962 -2213
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h +196 -212
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductMMA.h +713 -441
- 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 +2380 -1362
- package/eigen/Eigen/src/Core/arch/AltiVec/TypeCasting.h +153 -0
- package/eigen/Eigen/src/Core/arch/Default/BFloat16.h +390 -224
- package/eigen/Eigen/src/Core/arch/Default/ConjHelper.h +78 -67
- package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h +1784 -799
- package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h +167 -50
- package/eigen/Eigen/src/Core/arch/Default/Half.h +528 -379
- package/eigen/Eigen/src/Core/arch/Default/Settings.h +10 -12
- package/eigen/Eigen/src/Core/arch/GPU/Complex.h +244 -0
- package/eigen/Eigen/src/Core/arch/GPU/MathFunctions.h +41 -40
- package/eigen/Eigen/src/Core/arch/GPU/PacketMath.h +550 -523
- package/eigen/Eigen/src/Core/arch/GPU/Tuple.h +268 -0
- package/eigen/Eigen/src/Core/arch/GPU/TypeCasting.h +27 -30
- package/eigen/Eigen/src/Core/arch/HIP/hcc/math_constants.h +8 -8
- 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 +54 -82
- package/eigen/Eigen/src/Core/arch/MSA/MathFunctions.h +84 -92
- package/eigen/Eigen/src/Core/arch/MSA/PacketMath.h +51 -47
- package/eigen/Eigen/src/Core/arch/NEON/Complex.h +454 -306
- package/eigen/Eigen/src/Core/arch/NEON/GeneralBlockPanelKernel.h +175 -115
- package/eigen/Eigen/src/Core/arch/NEON/MathFunctions.h +23 -30
- package/eigen/Eigen/src/Core/arch/NEON/PacketMath.h +4366 -2857
- package/eigen/Eigen/src/Core/arch/NEON/TypeCasting.h +616 -393
- package/eigen/Eigen/src/Core/arch/NEON/UnaryFunctors.h +57 -0
- package/eigen/Eigen/src/Core/arch/SSE/Complex.h +350 -198
- package/eigen/Eigen/src/Core/arch/SSE/MathFunctions.h +38 -149
- package/eigen/Eigen/src/Core/arch/SSE/PacketMath.h +1791 -912
- package/eigen/Eigen/src/Core/arch/SSE/Reductions.h +324 -0
- package/eigen/Eigen/src/Core/arch/SSE/TypeCasting.h +128 -40
- package/eigen/Eigen/src/Core/arch/SVE/MathFunctions.h +10 -6
- package/eigen/Eigen/src/Core/arch/SVE/PacketMath.h +156 -234
- package/eigen/Eigen/src/Core/arch/SVE/TypeCasting.h +6 -3
- package/eigen/Eigen/src/Core/arch/SYCL/InteropHeaders.h +27 -32
- package/eigen/Eigen/src/Core/arch/SYCL/MathFunctions.h +119 -117
- package/eigen/Eigen/src/Core/arch/SYCL/PacketMath.h +325 -419
- package/eigen/Eigen/src/Core/arch/SYCL/TypeCasting.h +15 -17
- package/eigen/Eigen/src/Core/arch/ZVector/Complex.h +325 -181
- package/eigen/Eigen/src/Core/arch/ZVector/MathFunctions.h +94 -83
- package/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h +811 -458
- package/eigen/Eigen/src/Core/functors/AssignmentFunctors.h +121 -124
- package/eigen/Eigen/src/Core/functors/BinaryFunctors.h +576 -370
- package/eigen/Eigen/src/Core/functors/NullaryFunctors.h +194 -109
- package/eigen/Eigen/src/Core/functors/StlFunctors.h +95 -112
- package/eigen/Eigen/src/Core/functors/TernaryFunctors.h +34 -7
- package/eigen/Eigen/src/Core/functors/UnaryFunctors.h +1038 -749
- package/eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h +1883 -1375
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix.h +312 -370
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +189 -176
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h +84 -81
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix_BLAS.h +154 -73
- package/eigen/Eigen/src/Core/products/GeneralMatrixVector.h +292 -337
- package/eigen/Eigen/src/Core/products/GeneralMatrixVector_BLAS.h +80 -77
- package/eigen/Eigen/src/Core/products/Parallelizer.h +207 -105
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +327 -388
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix_BLAS.h +206 -224
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixVector.h +138 -147
- 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 -47
- 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 -277
- package/eigen/Eigen/src/Core/products/TriangularSolverMatrix_BLAS.h +108 -109
- package/eigen/Eigen/src/Core/products/TriangularSolverVector.h +68 -94
- package/eigen/Eigen/src/Core/util/Assert.h +158 -0
- package/eigen/Eigen/src/Core/util/BlasUtil.h +342 -303
- package/eigen/Eigen/src/Core/util/ConfigureVectorization.h +348 -317
- package/eigen/Eigen/src/Core/util/Constants.h +297 -262
- package/eigen/Eigen/src/Core/util/DisableStupidWarnings.h +130 -90
- package/eigen/Eigen/src/Core/util/EmulateArray.h +270 -0
- package/eigen/Eigen/src/Core/util/ForwardDeclarations.h +449 -247
- 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 +417 -116
- package/eigen/Eigen/src/Core/util/IntegralConstant.h +211 -204
- package/eigen/Eigen/src/Core/util/MKL_support.h +39 -37
- package/eigen/Eigen/src/Core/util/Macros.h +655 -773
- package/eigen/Eigen/src/Core/util/MaxSizeVector.h +139 -0
- package/eigen/Eigen/src/Core/util/Memory.h +970 -748
- package/eigen/Eigen/src/Core/util/Meta.h +581 -633
- 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 +17 -17
- package/eigen/Eigen/src/Core/util/Serializer.h +209 -0
- package/eigen/Eigen/src/Core/util/StaticAssert.h +50 -166
- package/eigen/Eigen/src/Core/util/SymbolicIndex.h +377 -225
- package/eigen/Eigen/src/Core/util/XprHelper.h +784 -547
- 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 +89 -105
- package/eigen/Eigen/src/Eigenvalues/RealQZ.h +537 -607
- package/eigen/Eigen/src/Eigenvalues/RealSchur.h +342 -381
- package/eigen/Eigen/src/Eigenvalues/RealSchur_LAPACKE.h +41 -35
- package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +541 -595
- package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_LAPACKE.h +47 -44
- package/eigen/Eigen/src/Eigenvalues/Tridiagonalization.h +430 -462
- package/eigen/Eigen/src/Geometry/AlignedBox.h +226 -227
- package/eigen/Eigen/src/Geometry/AngleAxis.h +131 -133
- package/eigen/Eigen/src/Geometry/EulerAngles.h +163 -74
- package/eigen/Eigen/src/Geometry/Homogeneous.h +285 -333
- package/eigen/Eigen/src/Geometry/Hyperplane.h +151 -160
- package/eigen/Eigen/src/Geometry/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Geometry/OrthoMethods.h +168 -146
- package/eigen/Eigen/src/Geometry/ParametrizedLine.h +127 -127
- package/eigen/Eigen/src/Geometry/Quaternion.h +566 -506
- package/eigen/Eigen/src/Geometry/Rotation2D.h +107 -105
- package/eigen/Eigen/src/Geometry/RotationBase.h +148 -145
- package/eigen/Eigen/src/Geometry/Scaling.h +113 -106
- package/eigen/Eigen/src/Geometry/Transform.h +858 -936
- package/eigen/Eigen/src/Geometry/Translation.h +94 -92
- package/eigen/Eigen/src/Geometry/Umeyama.h +79 -84
- package/eigen/Eigen/src/Geometry/arch/Geometry_SIMD.h +90 -104
- package/eigen/Eigen/src/Householder/BlockHouseholder.h +51 -46
- package/eigen/Eigen/src/Householder/Householder.h +102 -124
- package/eigen/Eigen/src/Householder/HouseholderSequence.h +412 -453
- package/eigen/Eigen/src/Householder/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +149 -162
- package/eigen/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +124 -119
- package/eigen/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +92 -104
- package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h +251 -243
- package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h +224 -228
- package/eigen/Eigen/src/IterativeLinearSolvers/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +178 -227
- package/eigen/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h +79 -84
- package/eigen/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h +54 -60
- package/eigen/Eigen/src/Jacobi/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Jacobi/Jacobi.h +252 -308
- package/eigen/Eigen/src/KLUSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/KLUSupport/KLUSupport.h +208 -227
- package/eigen/Eigen/src/LU/Determinant.h +50 -69
- package/eigen/Eigen/src/LU/FullPivLU.h +545 -596
- package/eigen/Eigen/src/LU/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/LU/InverseImpl.h +206 -285
- package/eigen/Eigen/src/LU/PartialPivLU.h +390 -428
- package/eigen/Eigen/src/LU/PartialPivLU_LAPACKE.h +54 -40
- package/eigen/Eigen/src/LU/arch/InverseSize4.h +72 -70
- 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 +243 -265
- package/eigen/Eigen/src/OrderingMethods/Eigen_Colamd.h +831 -1004
- package/eigen/Eigen/src/OrderingMethods/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/OrderingMethods/Ordering.h +112 -119
- 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 -430
- package/eigen/Eigen/src/QR/ColPivHouseholderQR.h +479 -479
- package/eigen/Eigen/src/QR/ColPivHouseholderQR_LAPACKE.h +120 -56
- package/eigen/Eigen/src/QR/CompleteOrthogonalDecomposition.h +166 -153
- package/eigen/Eigen/src/QR/FullPivHouseholderQR.h +495 -475
- package/eigen/Eigen/src/QR/HouseholderQR.h +394 -285
- 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 +244 -264
- package/eigen/Eigen/src/SVD/BDCSVD.h +817 -713
- 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 +577 -543
- package/eigen/Eigen/src/SVD/JacobiSVD_LAPACKE.h +85 -49
- package/eigen/Eigen/src/SVD/SVDBase.h +242 -182
- package/eigen/Eigen/src/SVD/UpperBidiagonalization.h +200 -235
- package/eigen/Eigen/src/SparseCholesky/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky.h +765 -594
- package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h +308 -94
- package/eigen/Eigen/src/SparseCore/AmbiVector.h +202 -251
- package/eigen/Eigen/src/SparseCore/CompressedStorage.h +184 -252
- package/eigen/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h +134 -178
- package/eigen/Eigen/src/SparseCore/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SparseCore/SparseAssign.h +149 -140
- package/eigen/Eigen/src/SparseCore/SparseBlock.h +403 -440
- package/eigen/Eigen/src/SparseCore/SparseColEtree.h +100 -112
- package/eigen/Eigen/src/SparseCore/SparseCompressedBase.h +525 -303
- package/eigen/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +555 -339
- package/eigen/Eigen/src/SparseCore/SparseCwiseUnaryOp.h +100 -108
- package/eigen/Eigen/src/SparseCore/SparseDenseProduct.h +169 -197
- 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 +1603 -1245
- package/eigen/Eigen/src/SparseCore/SparseMatrixBase.h +403 -350
- package/eigen/Eigen/src/SparseCore/SparsePermutation.h +186 -115
- package/eigen/Eigen/src/SparseCore/SparseProduct.h +94 -97
- 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 +370 -416
- 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 +138 -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 +756 -710
- 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 +245 -301
- 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 +89 -100
- 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 +124 -132
- 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 +450 -502
- package/eigen/Eigen/src/StlSupport/StdDeque.h +28 -93
- 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 -730
- 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 +428 -464
- 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 +9972 -16179
- 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.h → BlockMethods.inc} +434 -506
- package/eigen/Eigen/src/plugins/CommonCwiseBinaryOps.inc +116 -0
- package/eigen/Eigen/src/plugins/{CommonCwiseUnaryOps.h → CommonCwiseUnaryOps.inc} +58 -68
- 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/package.json +1 -1
- package/eigen/COPYING.APACHE +0 -203
- package/eigen/COPYING.BSD +0 -26
- package/eigen/COPYING.GPL +0 -674
- package/eigen/COPYING.LGPL +0 -502
- package/eigen/COPYING.MINPACK +0 -51
- package/eigen/COPYING.MPL2 +0 -373
- package/eigen/COPYING.README +0 -18
- package/eigen/Eigen/src/Core/BooleanRedux.h +0 -162
- package/eigen/Eigen/src/Core/arch/CUDA/Complex.h +0 -258
- package/eigen/Eigen/src/Core/arch/Default/TypeCasting.h +0 -120
- package/eigen/Eigen/src/Core/arch/SYCL/SyclMemoryModel.h +0 -694
- package/eigen/Eigen/src/Core/util/NonMPL2.h +0 -3
- 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 -358
- package/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.h +0 -696
- package/eigen/Eigen/src/plugins/CommonCwiseBinaryOps.h +0 -115
- package/eigen/Eigen/src/plugins/IndexedViewMethods.h +0 -262
- package/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.h +0 -152
- package/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.h +0 -95
- package/eigen/Eigen/src/plugins/ReshapedMethods.h +0 -149
- package/eigen/README.md +0 -5
|
@@ -10,112 +10,134 @@
|
|
|
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
|
-
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
PacketAccess = packet_traits<Scalar>::HasNegate };
|
|
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
|
+
}
|
|
32
|
+
};
|
|
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
|
-
|
|
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 };
|
|
99
124
|
};
|
|
100
|
-
template<typename Scalar>
|
|
101
|
-
struct functor_traits<scalar_abs2_op<Scalar> >
|
|
102
|
-
{ enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasAbs2 }; };
|
|
103
125
|
|
|
104
126
|
/** \internal
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
template<typename Scalar>
|
|
110
|
-
|
|
111
|
-
EIGEN_DEVICE_FUNC
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
{
|
|
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
142
|
Cost = 0,
|
|
121
143
|
// Yes the cost is zero even for complexes because in most cases for which
|
|
@@ -131,305 +153,382 @@ struct functor_traits<scalar_conjugate_op<Scalar> >
|
|
|
131
153
|
};
|
|
132
154
|
|
|
133
155
|
/** \internal
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
template<typename Scalar>
|
|
139
|
-
|
|
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 {
|
|
140
162
|
typedef typename NumTraits<Scalar>::Real result_type;
|
|
141
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator()
|
|
142
|
-
template<typename Packet>
|
|
143
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
|
|
144
|
-
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
{
|
|
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>> {
|
|
149
171
|
enum {
|
|
150
172
|
Cost = NumTraits<Scalar>::IsComplex ? 5 * NumTraits<Scalar>::MulCost : NumTraits<Scalar>::AddCost,
|
|
151
173
|
PacketAccess = packet_traits<Scalar>::HasArg
|
|
152
174
|
};
|
|
153
175
|
};
|
|
176
|
+
|
|
154
177
|
/** \internal
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
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>
|
|
160
205
|
struct scalar_cast_op {
|
|
161
|
-
EIGEN_EMPTY_STRUCT_CTOR(scalar_cast_op)
|
|
162
206
|
typedef NewType result_type;
|
|
163
|
-
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 };
|
|
164
215
|
};
|
|
165
|
-
template<typename Scalar, typename NewType>
|
|
166
|
-
struct functor_traits<scalar_cast_op<Scalar,NewType> >
|
|
167
|
-
{ enum { Cost = is_same<Scalar, NewType>::value ? 0 : NumTraits<NewType>::AddCost, PacketAccess = false }; };
|
|
168
216
|
|
|
169
217
|
/** \internal
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
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
|
+
};
|
|
177
234
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
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 };
|
|
183
253
|
};
|
|
184
|
-
template<typename Scalar, int N>
|
|
185
|
-
struct functor_traits<scalar_shift_right_op<Scalar,N> >
|
|
186
|
-
{ enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = packet_traits<Scalar>::HasShift }; };
|
|
187
254
|
|
|
188
255
|
/** \internal
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
template<typename Scalar, int N>
|
|
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>
|
|
194
261
|
struct scalar_shift_left_op {
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
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 };
|
|
202
273
|
};
|
|
203
|
-
template<typename Scalar, int N>
|
|
204
|
-
struct functor_traits<scalar_shift_left_op<Scalar,N> >
|
|
205
|
-
{ enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = packet_traits<Scalar>::HasShift }; };
|
|
206
274
|
|
|
207
275
|
/** \internal
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
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>
|
|
213
281
|
struct scalar_real_op {
|
|
214
|
-
EIGEN_EMPTY_STRUCT_CTOR(scalar_real_op)
|
|
215
282
|
typedef typename NumTraits<Scalar>::Real result_type;
|
|
216
|
-
EIGEN_DEVICE_FUNC
|
|
217
|
-
|
|
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 };
|
|
218
288
|
};
|
|
219
|
-
template<typename Scalar>
|
|
220
|
-
struct functor_traits<scalar_real_op<Scalar> >
|
|
221
|
-
{ enum { Cost = 0, PacketAccess = false }; };
|
|
222
289
|
|
|
223
290
|
/** \internal
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
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>
|
|
229
296
|
struct scalar_imag_op {
|
|
230
|
-
EIGEN_EMPTY_STRUCT_CTOR(scalar_imag_op)
|
|
231
297
|
typedef typename NumTraits<Scalar>::Real result_type;
|
|
232
|
-
EIGEN_DEVICE_FUNC
|
|
233
|
-
|
|
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 };
|
|
234
303
|
};
|
|
235
|
-
template<typename Scalar>
|
|
236
|
-
struct functor_traits<scalar_imag_op<Scalar> >
|
|
237
|
-
{ enum { Cost = 0, PacketAccess = false }; };
|
|
238
304
|
|
|
239
305
|
/** \internal
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
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>
|
|
245
311
|
struct scalar_real_ref_op {
|
|
246
|
-
EIGEN_EMPTY_STRUCT_CTOR(scalar_real_ref_op)
|
|
247
312
|
typedef typename NumTraits<Scalar>::Real result_type;
|
|
248
|
-
EIGEN_DEVICE_FUNC
|
|
249
|
-
|
|
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 };
|
|
250
321
|
};
|
|
251
|
-
template<typename Scalar>
|
|
252
|
-
struct functor_traits<scalar_real_ref_op<Scalar> >
|
|
253
|
-
{ enum { Cost = 0, PacketAccess = false }; };
|
|
254
322
|
|
|
255
323
|
/** \internal
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
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>
|
|
261
329
|
struct scalar_imag_ref_op {
|
|
262
|
-
EIGEN_EMPTY_STRUCT_CTOR(scalar_imag_ref_op)
|
|
263
330
|
typedef typename NumTraits<Scalar>::Real result_type;
|
|
264
|
-
EIGEN_DEVICE_FUNC
|
|
265
|
-
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 };
|
|
266
339
|
};
|
|
267
|
-
template<typename Scalar>
|
|
268
|
-
struct functor_traits<scalar_imag_ref_op<Scalar> >
|
|
269
|
-
{ enum { Cost = 0, PacketAccess = false }; };
|
|
270
340
|
|
|
271
341
|
/** \internal
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
template<typename Scalar>
|
|
278
|
-
|
|
279
|
-
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); }
|
|
280
350
|
template <typename Packet>
|
|
281
|
-
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
|
+
}
|
|
282
354
|
};
|
|
283
355
|
template <typename Scalar>
|
|
284
|
-
struct functor_traits<scalar_exp_op<Scalar
|
|
356
|
+
struct functor_traits<scalar_exp_op<Scalar>> {
|
|
285
357
|
enum {
|
|
286
358
|
PacketAccess = packet_traits<Scalar>::HasExp,
|
|
287
|
-
|
|
359
|
+
// The following numbers are based on the AVX implementation.
|
|
288
360
|
#ifdef EIGEN_VECTORIZE_FMA
|
|
289
361
|
// Haswell can issue 2 add/mul/madd per cycle.
|
|
290
|
-
Cost =
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
6 * NumTraits<Scalar>::MulCost +
|
|
297
|
-
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))
|
|
298
368
|
#else
|
|
299
|
-
Cost =
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
12 * NumTraits<Scalar>::MulCost +
|
|
306
|
-
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))
|
|
307
375
|
#endif
|
|
308
376
|
};
|
|
309
377
|
};
|
|
310
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
|
+
|
|
311
395
|
/** \internal
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
template<typename Scalar>
|
|
318
|
-
|
|
319
|
-
EIGEN_DEVICE_FUNC inline const Scalar operator()
|
|
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); }
|
|
320
404
|
template <typename Packet>
|
|
321
|
-
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
405
|
+
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
406
|
+
return internal::pexpm1(a);
|
|
407
|
+
}
|
|
322
408
|
};
|
|
323
409
|
template <typename Scalar>
|
|
324
|
-
struct functor_traits<scalar_expm1_op<Scalar
|
|
410
|
+
struct functor_traits<scalar_expm1_op<Scalar>> {
|
|
325
411
|
enum {
|
|
326
412
|
PacketAccess = packet_traits<Scalar>::HasExpm1,
|
|
327
|
-
Cost = functor_traits<scalar_exp_op<Scalar
|
|
413
|
+
Cost = functor_traits<scalar_exp_op<Scalar>>::Cost // TODO measure cost of expm1
|
|
328
414
|
};
|
|
329
415
|
};
|
|
330
416
|
|
|
331
417
|
/** \internal
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
template<typename Scalar>
|
|
338
|
-
|
|
339
|
-
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); }
|
|
340
426
|
template <typename Packet>
|
|
341
|
-
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
|
+
}
|
|
342
430
|
};
|
|
343
431
|
template <typename Scalar>
|
|
344
|
-
struct functor_traits<scalar_log_op<Scalar
|
|
432
|
+
struct functor_traits<scalar_log_op<Scalar>> {
|
|
345
433
|
enum {
|
|
346
434
|
PacketAccess = packet_traits<Scalar>::HasLog,
|
|
347
|
-
Cost =
|
|
348
|
-
|
|
349
|
-
// The following numbers are based on the AVX implementation.
|
|
435
|
+
Cost = (PacketAccess
|
|
436
|
+
// The following numbers are based on the AVX implementation.
|
|
350
437
|
#ifdef EIGEN_VECTORIZE_FMA
|
|
351
|
-
|
|
352
|
-
|
|
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)
|
|
353
440
|
#else
|
|
354
|
-
|
|
355
|
-
|
|
441
|
+
// 8 pmadd, 6 pmul, 8 padd/psub, 20 other
|
|
442
|
+
? (36 * NumTraits<Scalar>::AddCost + 14 * NumTraits<Scalar>::MulCost)
|
|
356
443
|
#endif
|
|
357
|
-
|
|
358
|
-
|
|
444
|
+
// Measured cost of std::log.
|
|
445
|
+
: sizeof(Scalar) == 4 ? 40 : 85)
|
|
359
446
|
};
|
|
360
447
|
};
|
|
361
448
|
|
|
362
449
|
/** \internal
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
template<typename Scalar>
|
|
369
|
-
|
|
370
|
-
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); }
|
|
371
458
|
template <typename Packet>
|
|
372
|
-
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
|
+
}
|
|
373
462
|
};
|
|
374
463
|
template <typename Scalar>
|
|
375
|
-
struct functor_traits<scalar_log1p_op<Scalar
|
|
464
|
+
struct functor_traits<scalar_log1p_op<Scalar>> {
|
|
376
465
|
enum {
|
|
377
466
|
PacketAccess = packet_traits<Scalar>::HasLog1p,
|
|
378
|
-
Cost = functor_traits<scalar_log_op<Scalar
|
|
467
|
+
Cost = functor_traits<scalar_log_op<Scalar>>::Cost // TODO measure cost of log1p
|
|
379
468
|
};
|
|
380
469
|
};
|
|
381
470
|
|
|
382
471
|
/** \internal
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
template<typename Scalar>
|
|
389
|
-
|
|
390
|
-
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); }
|
|
391
480
|
template <typename Packet>
|
|
392
|
-
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
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 };
|
|
393
488
|
};
|
|
394
|
-
template<typename Scalar>
|
|
395
|
-
struct functor_traits<scalar_log10_op<Scalar> >
|
|
396
|
-
{ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasLog10 }; };
|
|
397
489
|
|
|
398
490
|
/** \internal
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
template<typename Scalar>
|
|
405
|
-
|
|
406
|
-
|
|
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
|
+
}
|
|
407
502
|
template <typename Packet>
|
|
408
|
-
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 };
|
|
409
510
|
};
|
|
410
|
-
template<typename Scalar>
|
|
411
|
-
struct functor_traits<scalar_log2_op<Scalar> >
|
|
412
|
-
{ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasLog }; };
|
|
413
511
|
|
|
414
512
|
/** \internal
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
template<typename Scalar>
|
|
419
|
-
|
|
420
|
-
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); }
|
|
421
519
|
template <typename Packet>
|
|
422
|
-
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
|
+
}
|
|
423
523
|
};
|
|
424
524
|
template <typename Scalar>
|
|
425
|
-
struct functor_traits<scalar_sqrt_op<Scalar
|
|
525
|
+
struct functor_traits<scalar_sqrt_op<Scalar>> {
|
|
426
526
|
enum {
|
|
427
527
|
#if EIGEN_FAST_MATH
|
|
428
528
|
// The following numbers are based on the AVX implementation.
|
|
429
529
|
Cost = (sizeof(Scalar) == 8 ? 28
|
|
430
530
|
// 4 pmul, 1 pmadd, 3 other
|
|
431
|
-
: (3 * NumTraits<Scalar>::AddCost +
|
|
432
|
-
5 * NumTraits<Scalar>::MulCost)),
|
|
531
|
+
: (3 * NumTraits<Scalar>::AddCost + 5 * NumTraits<Scalar>::MulCost)),
|
|
433
532
|
#else
|
|
434
533
|
// The following numbers are based on min VSQRT throughput on Haswell.
|
|
435
534
|
Cost = (sizeof(Scalar) == 8 ? 28 : 14),
|
|
@@ -439,464 +538,500 @@ struct functor_traits<scalar_sqrt_op<Scalar> > {
|
|
|
439
538
|
};
|
|
440
539
|
|
|
441
540
|
// Boolean specialization to eliminate -Wimplicit-conversion-floating-point-to-bool warnings.
|
|
442
|
-
template<>
|
|
443
|
-
|
|
444
|
-
EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline bool operator()
|
|
541
|
+
template <>
|
|
542
|
+
struct scalar_sqrt_op<bool> {
|
|
543
|
+
EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline bool operator()(const bool& a) const { return a; }
|
|
445
544
|
template <typename Packet>
|
|
446
|
-
EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
545
|
+
EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
546
|
+
return a;
|
|
547
|
+
}
|
|
447
548
|
};
|
|
448
549
|
template <>
|
|
449
|
-
struct functor_traits<scalar_sqrt_op<bool
|
|
550
|
+
struct functor_traits<scalar_sqrt_op<bool>> {
|
|
450
551
|
enum { Cost = 1, PacketAccess = packet_traits<bool>::Vectorizable };
|
|
451
552
|
};
|
|
452
553
|
|
|
453
554
|
/** \internal
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
template<typename Scalar>
|
|
458
|
-
|
|
459
|
-
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); }
|
|
460
561
|
template <typename Packet>
|
|
461
|
-
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
|
+
}
|
|
462
565
|
};
|
|
463
566
|
|
|
464
|
-
template<typename Scalar>
|
|
465
|
-
struct functor_traits<
|
|
466
|
-
{
|
|
467
|
-
Cost = 5 * NumTraits<Scalar>::MulCost,
|
|
468
|
-
PacketAccess = packet_traits<Scalar>::HasRsqrt
|
|
469
|
-
};
|
|
567
|
+
template <typename Scalar>
|
|
568
|
+
struct functor_traits<scalar_cbrt_op<Scalar>> {
|
|
569
|
+
enum { Cost = 20 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasCbrt };
|
|
470
570
|
};
|
|
471
571
|
|
|
472
572
|
/** \internal
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
template<typename Scalar>
|
|
477
|
-
|
|
478
|
-
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); }
|
|
479
579
|
template <typename Packet>
|
|
480
|
-
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
|
+
}
|
|
481
583
|
};
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
{
|
|
485
|
-
enum {
|
|
486
|
-
Cost = 5 * NumTraits<Scalar>::MulCost,
|
|
487
|
-
PacketAccess = packet_traits<Scalar>::HasCos
|
|
488
|
-
};
|
|
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 };
|
|
489
588
|
};
|
|
490
589
|
|
|
491
590
|
/** \internal
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
template<typename Scalar>
|
|
496
|
-
|
|
497
|
-
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); }
|
|
498
597
|
template <typename Packet>
|
|
499
|
-
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
|
+
}
|
|
500
601
|
};
|
|
501
|
-
template<typename Scalar>
|
|
502
|
-
struct functor_traits<
|
|
503
|
-
{
|
|
504
|
-
enum {
|
|
505
|
-
Cost = 5 * NumTraits<Scalar>::MulCost,
|
|
506
|
-
PacketAccess = packet_traits<Scalar>::HasSin
|
|
507
|
-
};
|
|
602
|
+
template <typename Scalar>
|
|
603
|
+
struct functor_traits<scalar_cos_op<Scalar>> {
|
|
604
|
+
enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasCos };
|
|
508
605
|
};
|
|
509
606
|
|
|
510
|
-
|
|
511
607
|
/** \internal
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
template<typename Scalar>
|
|
516
|
-
|
|
517
|
-
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); }
|
|
518
614
|
template <typename Packet>
|
|
519
|
-
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
|
+
}
|
|
520
618
|
};
|
|
521
|
-
template<typename Scalar>
|
|
522
|
-
struct functor_traits<
|
|
523
|
-
{
|
|
524
|
-
enum {
|
|
525
|
-
Cost = 5 * NumTraits<Scalar>::MulCost,
|
|
526
|
-
PacketAccess = packet_traits<Scalar>::HasTan
|
|
527
|
-
};
|
|
619
|
+
template <typename Scalar>
|
|
620
|
+
struct functor_traits<scalar_sin_op<Scalar>> {
|
|
621
|
+
enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasSin };
|
|
528
622
|
};
|
|
529
623
|
|
|
530
624
|
/** \internal
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
template<typename Scalar>
|
|
535
|
-
|
|
536
|
-
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); }
|
|
537
631
|
template <typename Packet>
|
|
538
|
-
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
|
+
}
|
|
539
635
|
};
|
|
540
|
-
template<typename Scalar>
|
|
541
|
-
struct functor_traits<
|
|
542
|
-
{
|
|
543
|
-
enum {
|
|
544
|
-
Cost = 5 * NumTraits<Scalar>::MulCost,
|
|
545
|
-
PacketAccess = packet_traits<Scalar>::HasACos
|
|
546
|
-
};
|
|
636
|
+
template <typename Scalar>
|
|
637
|
+
struct functor_traits<scalar_tan_op<Scalar>> {
|
|
638
|
+
enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasTan };
|
|
547
639
|
};
|
|
548
640
|
|
|
549
641
|
/** \internal
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
template<typename Scalar>
|
|
554
|
-
|
|
555
|
-
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); }
|
|
556
648
|
template <typename Packet>
|
|
557
|
-
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
|
+
}
|
|
558
652
|
};
|
|
559
|
-
template<typename Scalar>
|
|
560
|
-
struct functor_traits<
|
|
561
|
-
{
|
|
562
|
-
enum {
|
|
563
|
-
Cost = 5 * NumTraits<Scalar>::MulCost,
|
|
564
|
-
PacketAccess = packet_traits<Scalar>::HasASin
|
|
565
|
-
};
|
|
653
|
+
template <typename Scalar>
|
|
654
|
+
struct functor_traits<scalar_acos_op<Scalar>> {
|
|
655
|
+
enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasACos };
|
|
566
656
|
};
|
|
567
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
|
+
};
|
|
568
674
|
|
|
569
675
|
/** \internal
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
template<typename Scalar>
|
|
574
|
-
|
|
575
|
-
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); }
|
|
576
682
|
template <typename Packet>
|
|
577
|
-
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
|
+
}
|
|
578
686
|
};
|
|
579
|
-
template<typename Scalar>
|
|
580
|
-
struct functor_traits<scalar_atan_op<Scalar
|
|
581
|
-
{
|
|
582
|
-
enum {
|
|
583
|
-
Cost = 5 * NumTraits<Scalar>::MulCost,
|
|
584
|
-
PacketAccess = packet_traits<Scalar>::HasATan
|
|
585
|
-
};
|
|
687
|
+
template <typename Scalar>
|
|
688
|
+
struct functor_traits<scalar_atan_op<Scalar>> {
|
|
689
|
+
enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasATan };
|
|
586
690
|
};
|
|
587
691
|
|
|
588
692
|
/** \internal
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
693
|
+
* \brief Template functor to compute the tanh of a scalar
|
|
694
|
+
* \sa class CwiseUnaryOp, ArrayBase::tanh()
|
|
695
|
+
*/
|
|
592
696
|
template <typename Scalar>
|
|
593
697
|
struct scalar_tanh_op {
|
|
594
|
-
EIGEN_EMPTY_STRUCT_CTOR(scalar_tanh_op)
|
|
595
698
|
EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::tanh(a); }
|
|
596
699
|
template <typename Packet>
|
|
597
|
-
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
|
+
}
|
|
598
703
|
};
|
|
599
704
|
|
|
600
705
|
template <typename Scalar>
|
|
601
|
-
struct functor_traits<scalar_tanh_op<Scalar
|
|
706
|
+
struct functor_traits<scalar_tanh_op<Scalar>> {
|
|
602
707
|
enum {
|
|
603
708
|
PacketAccess = packet_traits<Scalar>::HasTanh,
|
|
604
|
-
Cost = (
|
|
709
|
+
Cost = ((EIGEN_FAST_MATH && is_same<Scalar, float>::value)
|
|
605
710
|
// The following numbers are based on the AVX implementation,
|
|
606
711
|
#ifdef EIGEN_VECTORIZE_FMA
|
|
607
712
|
// Haswell can issue 2 add/mul/madd per cycle.
|
|
608
713
|
// 9 pmadd, 2 pmul, 1 div, 2 other
|
|
609
|
-
? (2 * NumTraits<Scalar>::AddCost +
|
|
610
|
-
|
|
611
|
-
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)
|
|
612
716
|
#else
|
|
613
|
-
? (11 * NumTraits<Scalar>::AddCost +
|
|
614
|
-
|
|
615
|
-
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)
|
|
616
719
|
#endif
|
|
617
720
|
// This number assumes a naive implementation of tanh
|
|
618
|
-
: (6 * NumTraits<Scalar>::AddCost +
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
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))
|
|
622
724
|
};
|
|
623
725
|
};
|
|
624
726
|
|
|
625
|
-
#if EIGEN_HAS_CXX11_MATH
|
|
626
727
|
/** \internal
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
728
|
+
* \brief Template functor to compute the atanh of a scalar
|
|
729
|
+
* \sa class CwiseUnaryOp, ArrayBase::atanh()
|
|
730
|
+
*/
|
|
630
731
|
template <typename Scalar>
|
|
631
732
|
struct scalar_atanh_op {
|
|
632
|
-
EIGEN_EMPTY_STRUCT_CTOR(scalar_atanh_op)
|
|
633
733
|
EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::atanh(a); }
|
|
734
|
+
template <typename Packet>
|
|
735
|
+
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& x) const {
|
|
736
|
+
return patanh(x);
|
|
737
|
+
}
|
|
634
738
|
};
|
|
635
739
|
|
|
636
740
|
template <typename Scalar>
|
|
637
|
-
struct functor_traits<scalar_atanh_op<Scalar
|
|
638
|
-
enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess =
|
|
741
|
+
struct functor_traits<scalar_atanh_op<Scalar>> {
|
|
742
|
+
enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasATanh };
|
|
639
743
|
};
|
|
640
|
-
#endif
|
|
641
744
|
|
|
642
745
|
/** \internal
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
template<typename Scalar>
|
|
647
|
-
|
|
648
|
-
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); }
|
|
649
752
|
template <typename Packet>
|
|
650
|
-
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
|
+
}
|
|
651
756
|
};
|
|
652
|
-
template<typename Scalar>
|
|
653
|
-
struct functor_traits<scalar_sinh_op<Scalar
|
|
654
|
-
{
|
|
655
|
-
enum {
|
|
656
|
-
Cost = 5 * NumTraits<Scalar>::MulCost,
|
|
657
|
-
PacketAccess = packet_traits<Scalar>::HasSinh
|
|
658
|
-
};
|
|
757
|
+
template <typename Scalar>
|
|
758
|
+
struct functor_traits<scalar_sinh_op<Scalar>> {
|
|
759
|
+
enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasSinh };
|
|
659
760
|
};
|
|
660
761
|
|
|
661
|
-
#if EIGEN_HAS_CXX11_MATH
|
|
662
762
|
/** \internal
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
763
|
+
* \brief Template functor to compute the asinh of a scalar
|
|
764
|
+
* \sa class CwiseUnaryOp, ArrayBase::asinh()
|
|
765
|
+
*/
|
|
666
766
|
template <typename Scalar>
|
|
667
767
|
struct scalar_asinh_op {
|
|
668
|
-
EIGEN_EMPTY_STRUCT_CTOR(scalar_asinh_op)
|
|
669
768
|
EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::asinh(a); }
|
|
670
769
|
};
|
|
671
770
|
|
|
672
771
|
template <typename Scalar>
|
|
673
|
-
struct functor_traits<scalar_asinh_op<Scalar
|
|
772
|
+
struct functor_traits<scalar_asinh_op<Scalar>> {
|
|
674
773
|
enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = false };
|
|
675
774
|
};
|
|
676
|
-
#endif
|
|
677
775
|
|
|
678
776
|
/** \internal
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
template<typename Scalar>
|
|
683
|
-
|
|
684
|
-
EIGEN_DEVICE_FUNC inline const Scalar operator()
|
|
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); }
|
|
685
783
|
template <typename Packet>
|
|
686
|
-
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
784
|
+
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
785
|
+
return internal::pcosh(a);
|
|
786
|
+
}
|
|
687
787
|
};
|
|
688
|
-
template<typename Scalar>
|
|
689
|
-
struct functor_traits<scalar_cosh_op<Scalar
|
|
690
|
-
{
|
|
691
|
-
enum {
|
|
692
|
-
Cost = 5 * NumTraits<Scalar>::MulCost,
|
|
693
|
-
PacketAccess = packet_traits<Scalar>::HasCosh
|
|
694
|
-
};
|
|
788
|
+
template <typename Scalar>
|
|
789
|
+
struct functor_traits<scalar_cosh_op<Scalar>> {
|
|
790
|
+
enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasCosh };
|
|
695
791
|
};
|
|
696
792
|
|
|
697
|
-
#if EIGEN_HAS_CXX11_MATH
|
|
698
793
|
/** \internal
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
794
|
+
* \brief Template functor to compute the acosh of a scalar
|
|
795
|
+
* \sa class CwiseUnaryOp, ArrayBase::acosh()
|
|
796
|
+
*/
|
|
702
797
|
template <typename Scalar>
|
|
703
798
|
struct scalar_acosh_op {
|
|
704
|
-
EIGEN_EMPTY_STRUCT_CTOR(scalar_acosh_op)
|
|
705
799
|
EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::acosh(a); }
|
|
706
800
|
};
|
|
707
801
|
|
|
708
802
|
template <typename Scalar>
|
|
709
|
-
struct functor_traits<scalar_acosh_op<Scalar
|
|
803
|
+
struct functor_traits<scalar_acosh_op<Scalar>> {
|
|
710
804
|
enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = false };
|
|
711
805
|
};
|
|
712
|
-
#endif
|
|
713
806
|
|
|
714
807
|
/** \internal
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
template<typename Scalar>
|
|
808
|
+
* \brief Template functor to compute the inverse of a scalar
|
|
809
|
+
* \sa class CwiseUnaryOp, Cwise::inverse()
|
|
810
|
+
*/
|
|
811
|
+
template <typename Scalar>
|
|
719
812
|
struct scalar_inverse_op {
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
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
|
+
}
|
|
725
818
|
};
|
|
726
819
|
template <typename Scalar>
|
|
727
|
-
struct functor_traits<scalar_inverse_op<Scalar
|
|
820
|
+
struct functor_traits<scalar_inverse_op<Scalar>> {
|
|
728
821
|
enum {
|
|
729
822
|
PacketAccess = packet_traits<Scalar>::HasDiv,
|
|
730
|
-
|
|
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)
|
|
731
828
|
};
|
|
732
829
|
};
|
|
733
830
|
|
|
734
831
|
/** \internal
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
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>
|
|
739
836
|
struct scalar_square_op {
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
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 };
|
|
745
846
|
};
|
|
746
|
-
template<typename Scalar>
|
|
747
|
-
struct functor_traits<scalar_square_op<Scalar> >
|
|
748
|
-
{ enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; };
|
|
749
847
|
|
|
750
848
|
// Boolean specialization to avoid -Wint-in-bool-context warnings on GCC.
|
|
751
|
-
template<>
|
|
849
|
+
template <>
|
|
752
850
|
struct scalar_square_op<bool> {
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
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 };
|
|
758
860
|
};
|
|
759
|
-
template<>
|
|
760
|
-
struct functor_traits<scalar_square_op<bool> >
|
|
761
|
-
{ enum { Cost = 0, PacketAccess = packet_traits<bool>::Vectorizable }; };
|
|
762
861
|
|
|
763
862
|
/** \internal
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
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>
|
|
768
867
|
struct scalar_cube_op {
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
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 };
|
|
774
877
|
};
|
|
775
|
-
template<typename Scalar>
|
|
776
|
-
struct functor_traits<scalar_cube_op<Scalar> >
|
|
777
|
-
{ enum { Cost = 2*NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; };
|
|
778
878
|
|
|
779
879
|
// Boolean specialization to avoid -Wint-in-bool-context warnings on GCC.
|
|
780
|
-
template<>
|
|
880
|
+
template <>
|
|
781
881
|
struct scalar_cube_op<bool> {
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
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 };
|
|
891
|
+
};
|
|
892
|
+
|
|
893
|
+
/** \internal
|
|
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); }
|
|
900
|
+
template <typename Packet>
|
|
901
|
+
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
902
|
+
return internal::pround(a);
|
|
903
|
+
}
|
|
904
|
+
};
|
|
905
|
+
template <typename Scalar>
|
|
906
|
+
struct functor_traits<scalar_round_op<Scalar>> {
|
|
907
|
+
enum {
|
|
908
|
+
Cost = NumTraits<Scalar>::MulCost,
|
|
909
|
+
PacketAccess = packet_traits<Scalar>::HasRound || NumTraits<Scalar>::IsInteger
|
|
910
|
+
};
|
|
787
911
|
};
|
|
788
|
-
template<>
|
|
789
|
-
struct functor_traits<scalar_cube_op<bool> >
|
|
790
|
-
{ enum { Cost = 0, PacketAccess = packet_traits<bool>::Vectorizable }; };
|
|
791
912
|
|
|
792
913
|
/** \internal
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
template<typename Scalar>
|
|
797
|
-
|
|
798
|
-
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); }
|
|
799
920
|
template <typename Packet>
|
|
800
|
-
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
|
+
}
|
|
801
924
|
};
|
|
802
|
-
template<typename Scalar>
|
|
803
|
-
struct functor_traits<
|
|
804
|
-
{
|
|
925
|
+
template <typename Scalar>
|
|
926
|
+
struct functor_traits<scalar_floor_op<Scalar>> {
|
|
805
927
|
enum {
|
|
806
928
|
Cost = NumTraits<Scalar>::MulCost,
|
|
807
|
-
PacketAccess = packet_traits<Scalar>::HasRound
|
|
929
|
+
PacketAccess = packet_traits<Scalar>::HasRound || NumTraits<Scalar>::IsInteger
|
|
808
930
|
};
|
|
809
931
|
};
|
|
810
932
|
|
|
811
933
|
/** \internal
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
template<typename Scalar>
|
|
816
|
-
|
|
817
|
-
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); }
|
|
818
940
|
template <typename Packet>
|
|
819
|
-
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
|
+
}
|
|
820
944
|
};
|
|
821
|
-
template<typename Scalar>
|
|
822
|
-
struct functor_traits<
|
|
823
|
-
{
|
|
945
|
+
template <typename Scalar>
|
|
946
|
+
struct functor_traits<scalar_rint_op<Scalar>> {
|
|
824
947
|
enum {
|
|
825
948
|
Cost = NumTraits<Scalar>::MulCost,
|
|
826
|
-
PacketAccess = packet_traits<Scalar>::
|
|
949
|
+
PacketAccess = packet_traits<Scalar>::HasRound || NumTraits<Scalar>::IsInteger
|
|
827
950
|
};
|
|
828
951
|
};
|
|
829
952
|
|
|
830
953
|
/** \internal
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
template<typename Scalar>
|
|
835
|
-
|
|
836
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()
|
|
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); }
|
|
837
960
|
template <typename Packet>
|
|
838
|
-
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
961
|
+
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
962
|
+
return internal::pceil(a);
|
|
963
|
+
}
|
|
839
964
|
};
|
|
840
|
-
template<typename Scalar>
|
|
841
|
-
struct functor_traits<
|
|
842
|
-
{
|
|
965
|
+
template <typename Scalar>
|
|
966
|
+
struct functor_traits<scalar_ceil_op<Scalar>> {
|
|
843
967
|
enum {
|
|
844
968
|
Cost = NumTraits<Scalar>::MulCost,
|
|
845
|
-
PacketAccess = packet_traits<Scalar>::
|
|
969
|
+
PacketAccess = packet_traits<Scalar>::HasRound || NumTraits<Scalar>::IsInteger
|
|
846
970
|
};
|
|
847
971
|
};
|
|
848
972
|
|
|
849
973
|
/** \internal
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
template<typename Scalar>
|
|
854
|
-
|
|
855
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()
|
|
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); }
|
|
856
980
|
template <typename Packet>
|
|
857
|
-
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
981
|
+
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const {
|
|
982
|
+
return internal::ptrunc(a);
|
|
983
|
+
}
|
|
858
984
|
};
|
|
859
|
-
template<typename Scalar>
|
|
860
|
-
struct functor_traits<
|
|
861
|
-
{
|
|
985
|
+
template <typename Scalar>
|
|
986
|
+
struct functor_traits<scalar_trunc_op<Scalar>> {
|
|
862
987
|
enum {
|
|
863
988
|
Cost = NumTraits<Scalar>::MulCost,
|
|
864
|
-
PacketAccess = packet_traits<Scalar>::
|
|
989
|
+
PacketAccess = packet_traits<Scalar>::HasRound || NumTraits<Scalar>::IsInteger
|
|
865
990
|
};
|
|
866
991
|
};
|
|
867
992
|
|
|
868
993
|
/** \internal
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
template<typename Scalar
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const {
|
|
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 {
|
|
876
1000
|
#if defined(SYCL_DEVICE_ONLY)
|
|
877
1001
|
return numext::isnan(a);
|
|
878
1002
|
#else
|
|
879
|
-
return
|
|
1003
|
+
return numext::isnan EIGEN_NOT_A_MACRO(a);
|
|
880
1004
|
#endif
|
|
881
1005
|
}
|
|
882
1006
|
};
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
{
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
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 };
|
|
890
1026
|
};
|
|
891
1027
|
|
|
892
1028
|
/** \internal
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
template<typename Scalar
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const {
|
|
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 {
|
|
900
1035
|
#if defined(SYCL_DEVICE_ONLY)
|
|
901
1036
|
return numext::isinf(a);
|
|
902
1037
|
#else
|
|
@@ -904,23 +1039,33 @@ template<typename Scalar> struct scalar_isinf_op {
|
|
|
904
1039
|
#endif
|
|
905
1040
|
}
|
|
906
1041
|
};
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
{
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
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 };
|
|
914
1060
|
};
|
|
915
1061
|
|
|
916
1062
|
/** \internal
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
template<typename Scalar
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const {
|
|
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 {
|
|
924
1069
|
#if defined(SYCL_DEVICE_ONLY)
|
|
925
1070
|
return numext::isfinite(a);
|
|
926
1071
|
#else
|
|
@@ -928,204 +1073,348 @@ template<typename Scalar> struct scalar_isfinite_op {
|
|
|
928
1073
|
#endif
|
|
929
1074
|
}
|
|
930
1075
|
};
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
{
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
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 };
|
|
938
1095
|
};
|
|
939
1096
|
|
|
940
1097
|
/** \internal
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
template<typename Scalar>
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
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
|
+
}
|
|
955
1141
|
};
|
|
956
1142
|
|
|
957
1143
|
/** \internal
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
template<typename Scalar>
|
|
963
|
-
struct
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
{
|
|
979
|
-
return (numext::isnan)(a) ? a : Scalar( (a>Scalar(0)) - (a<Scalar(0)) );
|
|
980
|
-
}
|
|
981
|
-
//TODO
|
|
982
|
-
//template <typename Packet>
|
|
983
|
-
//EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::psign(a); }
|
|
984
|
-
};
|
|
985
|
-
|
|
986
|
-
template<typename Scalar, bool is_integer>
|
|
987
|
-
struct scalar_sign_op<Scalar,true, is_integer> {
|
|
988
|
-
EIGEN_EMPTY_STRUCT_CTOR(scalar_sign_op)
|
|
989
|
-
EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const
|
|
990
|
-
{
|
|
991
|
-
typedef typename NumTraits<Scalar>::Real real_type;
|
|
992
|
-
real_type aa = numext::abs(a);
|
|
993
|
-
if (aa==real_type(0))
|
|
994
|
-
return Scalar(0);
|
|
995
|
-
aa = real_type(1)/aa;
|
|
996
|
-
return Scalar(a.real()*aa, a.imag()*aa );
|
|
997
|
-
}
|
|
998
|
-
//TODO
|
|
999
|
-
//template <typename Packet>
|
|
1000
|
-
//EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::psign(a); }
|
|
1001
|
-
};
|
|
1002
|
-
template<typename Scalar>
|
|
1003
|
-
struct functor_traits<scalar_sign_op<Scalar> >
|
|
1004
|
-
{ enum {
|
|
1005
|
-
Cost =
|
|
1006
|
-
NumTraits<Scalar>::IsComplex
|
|
1007
|
-
? ( 8*NumTraits<Scalar>::MulCost ) // roughly
|
|
1008
|
-
: ( 3*NumTraits<Scalar>::AddCost),
|
|
1009
|
-
PacketAccess = packet_traits<Scalar>::HasSign
|
|
1010
|
-
};
|
|
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 };
|
|
1011
1165
|
};
|
|
1012
1166
|
|
|
1013
1167
|
/** \internal
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
template <typename
|
|
1018
|
-
struct
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
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);
|
|
1022
1178
|
}
|
|
1179
|
+
};
|
|
1180
|
+
|
|
1181
|
+
template <typename Scalar>
|
|
1182
|
+
struct functor_traits<scalar_sign_op<Scalar>> {
|
|
1183
|
+
enum {
|
|
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
|
|
1187
|
+
};
|
|
1188
|
+
};
|
|
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); }
|
|
1023
1194
|
|
|
1024
|
-
template <typename Packet>
|
|
1025
|
-
Packet packetOp(const Packet& x) const {
|
|
1195
|
+
template <typename Packet>
|
|
1196
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& x) const {
|
|
1026
1197
|
const Packet one = pset1<Packet>(T(1));
|
|
1027
|
-
|
|
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));
|
|
1028
1211
|
}
|
|
1029
1212
|
};
|
|
1030
1213
|
|
|
1031
|
-
#ifndef EIGEN_GPU_COMPILE_PHASE
|
|
1032
1214
|
/** \internal
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
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
|
+
|
|
1225
|
+
/** \internal
|
|
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
|
+
*/
|
|
1043
1240
|
template <>
|
|
1044
1241
|
struct scalar_logistic_op<float> {
|
|
1045
|
-
EIGEN_EMPTY_STRUCT_CTOR(scalar_logistic_op)
|
|
1046
1242
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float operator()(const float& x) const {
|
|
1047
|
-
|
|
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);
|
|
1048
1247
|
}
|
|
1049
1248
|
|
|
1050
|
-
template <typename Packet>
|
|
1051
|
-
Packet packetOp(const Packet& _x) const {
|
|
1052
|
-
const Packet
|
|
1053
|
-
const Packet
|
|
1054
|
-
const
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
//
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
//
|
|
1073
|
-
|
|
1074
|
-
const Packet
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
Packet
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
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)));
|
|
1104
1306
|
}
|
|
1105
1307
|
};
|
|
1106
1308
|
#endif // #ifndef EIGEN_GPU_COMPILE_PHASE
|
|
1107
1309
|
|
|
1108
1310
|
template <typename T>
|
|
1109
|
-
struct functor_traits<scalar_logistic_op<T
|
|
1311
|
+
struct functor_traits<scalar_logistic_op<T>> {
|
|
1110
1312
|
enum {
|
|
1111
1313
|
// The cost estimate for float here here is for the common(?) case where
|
|
1112
1314
|
// all arguments are greater than -9.
|
|
1113
1315
|
Cost = scalar_div_cost<T, packet_traits<T>::HasDiv>::value +
|
|
1114
|
-
(internal::is_same<T, float>::value
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
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)
|
|
1322
|
+
};
|
|
1323
|
+
};
|
|
1324
|
+
|
|
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
|
|
1124
1413
|
};
|
|
1125
1414
|
};
|
|
1126
1415
|
|
|
1127
|
-
}
|
|
1416
|
+
} // end namespace internal
|
|
1128
1417
|
|
|
1129
|
-
}
|
|
1418
|
+
} // end namespace Eigen
|
|
1130
1419
|
|
|
1131
|
-
#endif
|
|
1420
|
+
#endif // EIGEN_FUNCTORS_H
|