@smake/eigen 1.0.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/eigen/COPYING.APACHE +203 -0
- package/eigen/COPYING.BSD +1 -1
- package/eigen/COPYING.MINPACK +51 -52
- package/eigen/Eigen/Cholesky +0 -1
- package/eigen/Eigen/Core +108 -266
- package/eigen/Eigen/Eigenvalues +0 -1
- package/eigen/Eigen/Geometry +3 -6
- package/eigen/Eigen/Householder +0 -1
- package/eigen/Eigen/Jacobi +0 -1
- package/eigen/Eigen/KLUSupport +41 -0
- package/eigen/Eigen/LU +2 -5
- package/eigen/Eigen/OrderingMethods +0 -3
- package/eigen/Eigen/PaStiXSupport +1 -0
- package/eigen/Eigen/PardisoSupport +0 -0
- package/eigen/Eigen/QR +0 -1
- package/eigen/Eigen/QtAlignedMalloc +0 -1
- package/eigen/Eigen/SVD +0 -1
- package/eigen/Eigen/Sparse +0 -2
- package/eigen/Eigen/SparseCholesky +0 -8
- package/eigen/Eigen/SparseLU +4 -0
- package/eigen/Eigen/src/Cholesky/LDLT.h +42 -27
- package/eigen/Eigen/src/Cholesky/LLT.h +39 -23
- package/eigen/Eigen/src/CholmodSupport/CholmodSupport.h +90 -47
- package/eigen/Eigen/src/Core/ArithmeticSequence.h +413 -0
- package/eigen/Eigen/src/Core/Array.h +99 -11
- package/eigen/Eigen/src/Core/ArrayBase.h +1 -1
- package/eigen/Eigen/src/Core/ArrayWrapper.h +21 -21
- package/eigen/Eigen/src/Core/Assign.h +1 -1
- package/eigen/Eigen/src/Core/AssignEvaluator.h +125 -50
- package/eigen/Eigen/src/Core/Assign_MKL.h +10 -10
- package/eigen/Eigen/src/Core/BandMatrix.h +16 -16
- package/eigen/Eigen/src/Core/Block.h +56 -60
- package/eigen/Eigen/src/Core/BooleanRedux.h +29 -31
- package/eigen/Eigen/src/Core/CommaInitializer.h +7 -3
- package/eigen/Eigen/src/Core/CoreEvaluators.h +325 -272
- package/eigen/Eigen/src/Core/CoreIterators.h +5 -0
- package/eigen/Eigen/src/Core/CwiseBinaryOp.h +21 -22
- package/eigen/Eigen/src/Core/CwiseNullaryOp.h +153 -18
- package/eigen/Eigen/src/Core/CwiseUnaryOp.h +6 -6
- package/eigen/Eigen/src/Core/CwiseUnaryView.h +12 -10
- package/eigen/Eigen/src/Core/DenseBase.h +128 -39
- package/eigen/Eigen/src/Core/DenseCoeffsBase.h +25 -21
- package/eigen/Eigen/src/Core/DenseStorage.h +150 -68
- package/eigen/Eigen/src/Core/Diagonal.h +21 -23
- package/eigen/Eigen/src/Core/DiagonalMatrix.h +50 -2
- package/eigen/Eigen/src/Core/DiagonalProduct.h +1 -1
- package/eigen/Eigen/src/Core/Dot.h +10 -10
- package/eigen/Eigen/src/Core/EigenBase.h +10 -9
- package/eigen/Eigen/src/Core/ForceAlignedAccess.h +8 -4
- package/eigen/Eigen/src/Core/Fuzzy.h +3 -3
- package/eigen/Eigen/src/Core/GeneralProduct.h +20 -10
- package/eigen/Eigen/src/Core/GenericPacketMath.h +597 -147
- package/eigen/Eigen/src/Core/GlobalFunctions.h +40 -33
- package/eigen/Eigen/src/Core/IO.h +40 -7
- package/eigen/Eigen/src/Core/IndexedView.h +237 -0
- package/eigen/Eigen/src/Core/Inverse.h +9 -10
- package/eigen/Eigen/src/Core/Map.h +7 -7
- package/eigen/Eigen/src/Core/MapBase.h +5 -3
- package/eigen/Eigen/src/Core/MathFunctions.h +756 -120
- package/eigen/Eigen/src/Core/MathFunctionsImpl.h +118 -19
- package/eigen/Eigen/src/Core/Matrix.h +131 -25
- package/eigen/Eigen/src/Core/MatrixBase.h +19 -2
- package/eigen/Eigen/src/Core/NestByValue.h +25 -50
- package/eigen/Eigen/src/Core/NoAlias.h +4 -3
- package/eigen/Eigen/src/Core/NumTraits.h +107 -20
- package/eigen/Eigen/src/Core/PartialReduxEvaluator.h +232 -0
- package/eigen/Eigen/src/Core/PermutationMatrix.h +3 -3
- package/eigen/Eigen/src/Core/PlainObjectBase.h +145 -54
- package/eigen/Eigen/src/Core/Product.h +30 -25
- package/eigen/Eigen/src/Core/ProductEvaluators.h +183 -142
- package/eigen/Eigen/src/Core/Random.h +37 -1
- package/eigen/Eigen/src/Core/Redux.h +180 -170
- package/eigen/Eigen/src/Core/Ref.h +118 -21
- package/eigen/Eigen/src/Core/Replicate.h +8 -8
- package/eigen/Eigen/src/Core/Reshaped.h +454 -0
- package/eigen/Eigen/src/Core/ReturnByValue.h +7 -5
- package/eigen/Eigen/src/Core/Reverse.h +18 -12
- package/eigen/Eigen/src/Core/Select.h +8 -6
- package/eigen/Eigen/src/Core/SelfAdjointView.h +33 -20
- package/eigen/Eigen/src/Core/Solve.h +14 -14
- package/eigen/Eigen/src/Core/SolveTriangular.h +13 -13
- package/eigen/Eigen/src/Core/SolverBase.h +41 -3
- package/eigen/Eigen/src/Core/StableNorm.h +100 -70
- package/eigen/Eigen/src/Core/StlIterators.h +463 -0
- package/eigen/Eigen/src/Core/Stride.h +9 -4
- package/eigen/Eigen/src/Core/Swap.h +5 -4
- package/eigen/Eigen/src/Core/Transpose.h +86 -27
- package/eigen/Eigen/src/Core/Transpositions.h +26 -8
- package/eigen/Eigen/src/Core/TriangularMatrix.h +88 -72
- package/eigen/Eigen/src/Core/VectorBlock.h +5 -5
- package/eigen/Eigen/src/Core/VectorwiseOp.h +159 -70
- package/eigen/Eigen/src/Core/Visitor.h +137 -29
- package/eigen/Eigen/src/Core/arch/AVX/Complex.h +50 -129
- package/eigen/Eigen/src/Core/arch/AVX/MathFunctions.h +126 -337
- package/eigen/Eigen/src/Core/arch/AVX/PacketMath.h +1092 -155
- package/eigen/Eigen/src/Core/arch/AVX/TypeCasting.h +65 -1
- package/eigen/Eigen/src/Core/arch/AVX512/Complex.h +422 -0
- package/eigen/Eigen/src/Core/arch/AVX512/MathFunctions.h +186 -213
- package/eigen/Eigen/src/Core/arch/AVX512/PacketMath.h +1250 -252
- package/eigen/Eigen/src/Core/arch/AVX512/TypeCasting.h +89 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/Complex.h +152 -165
- package/eigen/Eigen/src/Core/arch/AltiVec/MathFunctions.h +19 -251
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProduct.h +2937 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h +221 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductMMA.h +629 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/PacketMath.h +2042 -392
- package/eigen/Eigen/src/Core/arch/CUDA/Complex.h +235 -80
- package/eigen/Eigen/src/Core/arch/Default/BFloat16.h +700 -0
- package/eigen/Eigen/src/Core/arch/Default/ConjHelper.h +102 -14
- package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h +1649 -0
- package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h +110 -0
- package/eigen/Eigen/src/Core/arch/Default/Half.h +942 -0
- package/eigen/Eigen/src/Core/arch/Default/Settings.h +1 -1
- package/eigen/Eigen/src/Core/arch/Default/TypeCasting.h +120 -0
- package/eigen/Eigen/src/Core/arch/{CUDA → GPU}/MathFunctions.h +16 -4
- package/eigen/Eigen/src/Core/arch/GPU/PacketMath.h +1685 -0
- package/eigen/Eigen/src/Core/arch/GPU/TypeCasting.h +80 -0
- package/eigen/Eigen/src/Core/arch/HIP/hcc/math_constants.h +23 -0
- package/eigen/Eigen/src/Core/arch/MSA/Complex.h +648 -0
- package/eigen/Eigen/src/Core/arch/MSA/MathFunctions.h +387 -0
- package/eigen/Eigen/src/Core/arch/MSA/PacketMath.h +1233 -0
- package/eigen/Eigen/src/Core/arch/NEON/Complex.h +313 -219
- package/eigen/Eigen/src/Core/arch/NEON/GeneralBlockPanelKernel.h +183 -0
- package/eigen/Eigen/src/Core/arch/NEON/MathFunctions.h +54 -70
- package/eigen/Eigen/src/Core/arch/NEON/PacketMath.h +4376 -549
- package/eigen/Eigen/src/Core/arch/NEON/TypeCasting.h +1419 -0
- package/eigen/Eigen/src/Core/arch/SSE/Complex.h +59 -179
- package/eigen/Eigen/src/Core/arch/SSE/MathFunctions.h +65 -428
- package/eigen/Eigen/src/Core/arch/SSE/PacketMath.h +893 -283
- package/eigen/Eigen/src/Core/arch/SSE/TypeCasting.h +65 -0
- package/eigen/Eigen/src/Core/arch/SVE/MathFunctions.h +44 -0
- package/eigen/Eigen/src/Core/arch/SVE/PacketMath.h +752 -0
- package/eigen/Eigen/src/Core/arch/SVE/TypeCasting.h +49 -0
- package/eigen/Eigen/src/Core/arch/SYCL/InteropHeaders.h +232 -0
- package/eigen/Eigen/src/Core/arch/SYCL/MathFunctions.h +301 -0
- package/eigen/Eigen/src/Core/arch/SYCL/PacketMath.h +670 -0
- package/eigen/Eigen/src/Core/arch/SYCL/SyclMemoryModel.h +694 -0
- package/eigen/Eigen/src/Core/arch/SYCL/TypeCasting.h +85 -0
- package/eigen/Eigen/src/Core/arch/ZVector/Complex.h +212 -183
- package/eigen/Eigen/src/Core/arch/ZVector/MathFunctions.h +101 -5
- package/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h +510 -395
- package/eigen/Eigen/src/Core/functors/AssignmentFunctors.h +11 -2
- package/eigen/Eigen/src/Core/functors/BinaryFunctors.h +112 -46
- package/eigen/Eigen/src/Core/functors/NullaryFunctors.h +31 -30
- package/eigen/Eigen/src/Core/functors/StlFunctors.h +32 -2
- package/eigen/Eigen/src/Core/functors/UnaryFunctors.h +354 -15
- package/eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h +1073 -585
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix.h +29 -7
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +4 -4
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h +1 -1
- package/eigen/Eigen/src/Core/products/GeneralMatrixVector.h +382 -483
- package/eigen/Eigen/src/Core/products/Parallelizer.h +23 -9
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +23 -6
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixVector.h +8 -6
- package/eigen/Eigen/src/Core/products/SelfadjointProduct.h +2 -2
- package/eigen/Eigen/src/Core/products/SelfadjointRank2Update.h +5 -4
- package/eigen/Eigen/src/Core/products/TriangularMatrixMatrix.h +3 -3
- package/eigen/Eigen/src/Core/products/TriangularSolverMatrix.h +5 -3
- package/eigen/Eigen/src/Core/products/TriangularSolverVector.h +13 -10
- package/eigen/Eigen/src/Core/util/BlasUtil.h +208 -124
- package/eigen/Eigen/src/Core/util/ConfigureVectorization.h +512 -0
- package/eigen/Eigen/src/Core/util/Constants.h +25 -9
- package/eigen/Eigen/src/Core/util/DisableStupidWarnings.h +14 -2
- package/eigen/Eigen/src/Core/util/ForwardDeclarations.h +28 -4
- package/eigen/Eigen/src/Core/util/IndexedViewHelper.h +186 -0
- package/eigen/Eigen/src/Core/util/IntegralConstant.h +272 -0
- package/eigen/Eigen/src/Core/util/MKL_support.h +8 -1
- package/eigen/Eigen/src/Core/util/Macros.h +661 -250
- package/eigen/Eigen/src/Core/util/Memory.h +222 -52
- package/eigen/Eigen/src/Core/util/Meta.h +349 -105
- package/eigen/Eigen/src/Core/util/ReshapedHelper.h +51 -0
- package/eigen/Eigen/src/Core/util/StaticAssert.h +8 -5
- package/eigen/Eigen/src/Core/util/SymbolicIndex.h +293 -0
- package/eigen/Eigen/src/Core/util/XprHelper.h +48 -30
- package/eigen/Eigen/src/Eigenvalues/ComplexEigenSolver.h +1 -1
- package/eigen/Eigen/src/Eigenvalues/ComplexSchur.h +1 -1
- package/eigen/Eigen/src/Eigenvalues/EigenSolver.h +2 -2
- package/eigen/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h +1 -1
- package/eigen/Eigen/src/Eigenvalues/HessenbergDecomposition.h +2 -2
- package/eigen/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h +2 -2
- package/eigen/Eigen/src/Eigenvalues/RealQZ.h +9 -6
- package/eigen/Eigen/src/Eigenvalues/RealSchur.h +10 -5
- package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +75 -42
- package/eigen/Eigen/src/Eigenvalues/Tridiagonalization.h +20 -15
- package/eigen/Eigen/src/Geometry/AlignedBox.h +99 -5
- package/eigen/Eigen/src/Geometry/AngleAxis.h +4 -4
- package/eigen/Eigen/src/Geometry/EulerAngles.h +3 -3
- package/eigen/Eigen/src/Geometry/Homogeneous.h +15 -11
- package/eigen/Eigen/src/Geometry/Hyperplane.h +1 -1
- package/eigen/Eigen/src/Geometry/OrthoMethods.h +3 -2
- package/eigen/Eigen/src/Geometry/ParametrizedLine.h +39 -2
- package/eigen/Eigen/src/Geometry/Quaternion.h +52 -14
- package/eigen/Eigen/src/Geometry/Rotation2D.h +3 -3
- package/eigen/Eigen/src/Geometry/Scaling.h +22 -4
- package/eigen/Eigen/src/Geometry/Transform.h +86 -65
- package/eigen/Eigen/src/Geometry/Translation.h +6 -6
- package/eigen/Eigen/src/Geometry/arch/Geometry_SIMD.h +168 -0
- package/eigen/Eigen/src/Householder/BlockHouseholder.h +9 -2
- package/eigen/Eigen/src/Householder/Householder.h +8 -4
- package/eigen/Eigen/src/Householder/HouseholderSequence.h +123 -48
- package/eigen/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +15 -15
- package/eigen/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +7 -23
- package/eigen/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +5 -22
- package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h +41 -47
- package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h +51 -60
- package/eigen/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +70 -20
- package/eigen/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h +2 -20
- package/eigen/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h +11 -9
- package/eigen/Eigen/src/Jacobi/Jacobi.h +31 -10
- package/eigen/Eigen/src/KLUSupport/KLUSupport.h +358 -0
- package/eigen/Eigen/src/LU/Determinant.h +35 -19
- package/eigen/Eigen/src/LU/FullPivLU.h +29 -43
- package/eigen/Eigen/src/LU/InverseImpl.h +25 -8
- package/eigen/Eigen/src/LU/PartialPivLU.h +67 -57
- package/eigen/Eigen/src/LU/arch/InverseSize4.h +351 -0
- package/eigen/Eigen/src/OrderingMethods/Amd.h +7 -17
- package/eigen/Eigen/src/OrderingMethods/Eigen_Colamd.h +297 -277
- package/eigen/Eigen/src/OrderingMethods/Ordering.h +6 -10
- package/eigen/Eigen/src/PaStiXSupport/PaStiXSupport.h +1 -1
- package/eigen/Eigen/src/PardisoSupport/PardisoSupport.h +10 -9
- package/eigen/Eigen/src/QR/ColPivHouseholderQR.h +41 -20
- package/eigen/Eigen/src/QR/CompleteOrthogonalDecomposition.h +100 -27
- package/eigen/Eigen/src/QR/FullPivHouseholderQR.h +59 -22
- package/eigen/Eigen/src/QR/HouseholderQR.h +48 -23
- package/eigen/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h +25 -3
- package/eigen/Eigen/src/SVD/BDCSVD.h +137 -48
- package/eigen/Eigen/src/SVD/JacobiSVD.h +22 -14
- package/eigen/Eigen/src/SVD/SVDBase.h +82 -21
- package/eigen/Eigen/src/SVD/UpperBidiagonalization.h +3 -3
- package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky.h +16 -8
- package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h +11 -36
- package/eigen/Eigen/src/SparseCore/CompressedStorage.h +16 -0
- package/eigen/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h +6 -6
- package/eigen/Eigen/src/SparseCore/SparseAssign.h +81 -27
- package/eigen/Eigen/src/SparseCore/SparseBlock.h +25 -57
- package/eigen/Eigen/src/SparseCore/SparseCompressedBase.h +40 -11
- package/eigen/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +11 -15
- package/eigen/Eigen/src/SparseCore/SparseCwiseUnaryOp.h +2 -2
- package/eigen/Eigen/src/SparseCore/SparseDenseProduct.h +30 -8
- package/eigen/Eigen/src/SparseCore/SparseMatrix.h +124 -10
- package/eigen/Eigen/src/SparseCore/SparseMatrixBase.h +5 -12
- package/eigen/Eigen/src/SparseCore/SparseProduct.h +13 -1
- package/eigen/Eigen/src/SparseCore/SparseRef.h +7 -7
- package/eigen/Eigen/src/SparseCore/SparseSelfAdjointView.h +3 -0
- package/eigen/Eigen/src/SparseCore/SparseUtil.h +8 -0
- package/eigen/Eigen/src/SparseCore/SparseVector.h +1 -1
- package/eigen/Eigen/src/SparseLU/SparseLU.h +160 -10
- package/eigen/Eigen/src/SparseLU/SparseLU_Memory.h +1 -1
- package/eigen/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h +76 -2
- package/eigen/Eigen/src/SparseLU/SparseLU_column_dfs.h +2 -2
- package/eigen/Eigen/src/SparseLU/SparseLU_gemm_kernel.h +1 -1
- package/eigen/Eigen/src/SparseLU/SparseLU_panel_bmod.h +1 -1
- package/eigen/Eigen/src/SparseQR/SparseQR.h +19 -6
- package/eigen/Eigen/src/StlSupport/StdDeque.h +2 -14
- package/eigen/Eigen/src/StlSupport/StdList.h +2 -2
- package/eigen/Eigen/src/StlSupport/StdVector.h +2 -2
- package/eigen/Eigen/src/SuperLUSupport/SuperLUSupport.h +6 -8
- package/eigen/Eigen/src/UmfPackSupport/UmfPackSupport.h +175 -39
- package/eigen/Eigen/src/misc/lapacke.h +5 -4
- package/eigen/Eigen/src/plugins/ArrayCwiseBinaryOps.h +27 -1
- package/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.h +155 -11
- package/eigen/Eigen/src/plugins/BlockMethods.h +626 -242
- package/eigen/Eigen/src/plugins/CommonCwiseUnaryOps.h +14 -0
- package/eigen/Eigen/src/plugins/IndexedViewMethods.h +262 -0
- package/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.h +4 -4
- package/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.h +10 -0
- package/eigen/Eigen/src/plugins/ReshapedMethods.h +149 -0
- package/eigen/README.md +2 -0
- package/lib/LibEigen.d.ts +4 -0
- package/lib/LibEigen.js +14 -0
- package/lib/index.d.ts +1 -1
- package/lib/index.js +7 -3
- package/package.json +2 -10
- package/eigen/Eigen/CMakeLists.txt +0 -19
- package/eigen/Eigen/src/Core/arch/CUDA/Half.h +0 -675
- package/eigen/Eigen/src/Core/arch/CUDA/PacketMath.h +0 -333
- package/eigen/Eigen/src/Core/arch/CUDA/PacketMathHalf.h +0 -1124
- package/eigen/Eigen/src/Core/arch/CUDA/TypeCasting.h +0 -212
- package/eigen/Eigen/src/Geometry/arch/Geometry_SSE.h +0 -161
- package/eigen/Eigen/src/LU/arch/Inverse_SSE.h +0 -338
- package/lib/eigen.d.ts +0 -2
- package/lib/eigen.js +0 -15
|
@@ -109,7 +109,7 @@ struct functor_traits<scalar_abs2_op<Scalar> >
|
|
|
109
109
|
template<typename Scalar> struct scalar_conjugate_op {
|
|
110
110
|
EIGEN_EMPTY_STRUCT_CTOR(scalar_conjugate_op)
|
|
111
111
|
EIGEN_DEVICE_FUNC
|
|
112
|
-
EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const {
|
|
112
|
+
EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const { return numext::conj(a); }
|
|
113
113
|
template<typename Packet>
|
|
114
114
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const { return internal::pconj(a); }
|
|
115
115
|
};
|
|
@@ -117,7 +117,15 @@ template<typename Scalar>
|
|
|
117
117
|
struct functor_traits<scalar_conjugate_op<Scalar> >
|
|
118
118
|
{
|
|
119
119
|
enum {
|
|
120
|
-
Cost =
|
|
120
|
+
Cost = 0,
|
|
121
|
+
// Yes the cost is zero even for complexes because in most cases for which
|
|
122
|
+
// the cost is used, conjugation turns to be a no-op. Some examples:
|
|
123
|
+
// cost(a*conj(b)) == cost(a*b)
|
|
124
|
+
// cost(a+conj(b)) == cost(a+b)
|
|
125
|
+
// <etc.
|
|
126
|
+
// If we don't set it to zero, then:
|
|
127
|
+
// A.conjugate().lazyProduct(B.conjugate())
|
|
128
|
+
// will bake its operands. We definitely don't want that!
|
|
121
129
|
PacketAccess = packet_traits<Scalar>::HasConj
|
|
122
130
|
};
|
|
123
131
|
};
|
|
@@ -130,7 +138,7 @@ struct functor_traits<scalar_conjugate_op<Scalar> >
|
|
|
130
138
|
template<typename Scalar> struct scalar_arg_op {
|
|
131
139
|
EIGEN_EMPTY_STRUCT_CTOR(scalar_arg_op)
|
|
132
140
|
typedef typename NumTraits<Scalar>::Real result_type;
|
|
133
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const Scalar& a) const {
|
|
141
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const Scalar& a) const { return numext::arg(a); }
|
|
134
142
|
template<typename Packet>
|
|
135
143
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
|
|
136
144
|
{ return internal::parg(a); }
|
|
@@ -158,6 +166,44 @@ template<typename Scalar, typename NewType>
|
|
|
158
166
|
struct functor_traits<scalar_cast_op<Scalar,NewType> >
|
|
159
167
|
{ enum { Cost = is_same<Scalar, NewType>::value ? 0 : NumTraits<NewType>::AddCost, PacketAccess = false }; };
|
|
160
168
|
|
|
169
|
+
/** \internal
|
|
170
|
+
* \brief Template functor to arithmetically shift a scalar right by a number of bits
|
|
171
|
+
*
|
|
172
|
+
* \sa class CwiseUnaryOp, MatrixBase::shift_right()
|
|
173
|
+
*/
|
|
174
|
+
template<typename Scalar, int N>
|
|
175
|
+
struct scalar_shift_right_op {
|
|
176
|
+
EIGEN_EMPTY_STRUCT_CTOR(scalar_shift_right_op)
|
|
177
|
+
|
|
178
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const
|
|
179
|
+
{ return a >> N; }
|
|
180
|
+
template<typename Packet>
|
|
181
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
|
|
182
|
+
{ return internal::parithmetic_shift_right<N>(a); }
|
|
183
|
+
};
|
|
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
|
+
|
|
188
|
+
/** \internal
|
|
189
|
+
* \brief Template functor to logically shift a scalar left by a number of bits
|
|
190
|
+
*
|
|
191
|
+
* \sa class CwiseUnaryOp, MatrixBase::shift_left()
|
|
192
|
+
*/
|
|
193
|
+
template<typename Scalar, int N>
|
|
194
|
+
struct scalar_shift_left_op {
|
|
195
|
+
EIGEN_EMPTY_STRUCT_CTOR(scalar_shift_left_op)
|
|
196
|
+
|
|
197
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const
|
|
198
|
+
{ return a << N; }
|
|
199
|
+
template<typename Packet>
|
|
200
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
|
|
201
|
+
{ return internal::plogical_shift_left<N>(a); }
|
|
202
|
+
};
|
|
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
|
+
|
|
161
207
|
/** \internal
|
|
162
208
|
* \brief Template functor to extract the real part of a complex
|
|
163
209
|
*
|
|
@@ -262,6 +308,26 @@ struct functor_traits<scalar_exp_op<Scalar> > {
|
|
|
262
308
|
};
|
|
263
309
|
};
|
|
264
310
|
|
|
311
|
+
/** \internal
|
|
312
|
+
*
|
|
313
|
+
* \brief Template functor to compute the exponential of a scalar - 1.
|
|
314
|
+
*
|
|
315
|
+
* \sa class CwiseUnaryOp, ArrayBase::expm1()
|
|
316
|
+
*/
|
|
317
|
+
template<typename Scalar> struct scalar_expm1_op {
|
|
318
|
+
EIGEN_EMPTY_STRUCT_CTOR(scalar_expm1_op)
|
|
319
|
+
EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return numext::expm1(a); }
|
|
320
|
+
template <typename Packet>
|
|
321
|
+
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pexpm1(a); }
|
|
322
|
+
};
|
|
323
|
+
template <typename Scalar>
|
|
324
|
+
struct functor_traits<scalar_expm1_op<Scalar> > {
|
|
325
|
+
enum {
|
|
326
|
+
PacketAccess = packet_traits<Scalar>::HasExpm1,
|
|
327
|
+
Cost = functor_traits<scalar_exp_op<Scalar> >::Cost // TODO measure cost of expm1
|
|
328
|
+
};
|
|
329
|
+
};
|
|
330
|
+
|
|
265
331
|
/** \internal
|
|
266
332
|
*
|
|
267
333
|
* \brief Template functor to compute the logarithm of a scalar
|
|
@@ -321,7 +387,7 @@ struct functor_traits<scalar_log1p_op<Scalar> > {
|
|
|
321
387
|
*/
|
|
322
388
|
template<typename Scalar> struct scalar_log10_op {
|
|
323
389
|
EIGEN_EMPTY_STRUCT_CTOR(scalar_log10_op)
|
|
324
|
-
EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const {
|
|
390
|
+
EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { EIGEN_USING_STD(log10) return log10(a); }
|
|
325
391
|
template <typename Packet>
|
|
326
392
|
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::plog10(a); }
|
|
327
393
|
};
|
|
@@ -329,6 +395,22 @@ template<typename Scalar>
|
|
|
329
395
|
struct functor_traits<scalar_log10_op<Scalar> >
|
|
330
396
|
{ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasLog10 }; };
|
|
331
397
|
|
|
398
|
+
/** \internal
|
|
399
|
+
*
|
|
400
|
+
* \brief Template functor to compute the base-2 logarithm of a scalar
|
|
401
|
+
*
|
|
402
|
+
* \sa class CwiseUnaryOp, Cwise::log2()
|
|
403
|
+
*/
|
|
404
|
+
template<typename Scalar> struct scalar_log2_op {
|
|
405
|
+
EIGEN_EMPTY_STRUCT_CTOR(scalar_log2_op)
|
|
406
|
+
EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return Scalar(EIGEN_LOG2E) * numext::log(a); }
|
|
407
|
+
template <typename Packet>
|
|
408
|
+
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::plog2(a); }
|
|
409
|
+
};
|
|
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
|
+
|
|
332
414
|
/** \internal
|
|
333
415
|
* \brief Template functor to compute the square root of a scalar
|
|
334
416
|
* \sa class CwiseUnaryOp, Cwise::sqrt()
|
|
@@ -356,13 +438,25 @@ struct functor_traits<scalar_sqrt_op<Scalar> > {
|
|
|
356
438
|
};
|
|
357
439
|
};
|
|
358
440
|
|
|
441
|
+
// Boolean specialization to eliminate -Wimplicit-conversion-floating-point-to-bool warnings.
|
|
442
|
+
template<> struct scalar_sqrt_op<bool> {
|
|
443
|
+
EIGEN_EMPTY_STRUCT_CTOR(scalar_sqrt_op)
|
|
444
|
+
EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline bool operator() (const bool& a) const { return a; }
|
|
445
|
+
template <typename Packet>
|
|
446
|
+
EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return a; }
|
|
447
|
+
};
|
|
448
|
+
template <>
|
|
449
|
+
struct functor_traits<scalar_sqrt_op<bool> > {
|
|
450
|
+
enum { Cost = 1, PacketAccess = packet_traits<bool>::Vectorizable };
|
|
451
|
+
};
|
|
452
|
+
|
|
359
453
|
/** \internal
|
|
360
454
|
* \brief Template functor to compute the reciprocal square root of a scalar
|
|
361
455
|
* \sa class CwiseUnaryOp, Cwise::rsqrt()
|
|
362
456
|
*/
|
|
363
457
|
template<typename Scalar> struct scalar_rsqrt_op {
|
|
364
458
|
EIGEN_EMPTY_STRUCT_CTOR(scalar_rsqrt_op)
|
|
365
|
-
EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return
|
|
459
|
+
EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return numext::rsqrt(a); }
|
|
366
460
|
template <typename Packet>
|
|
367
461
|
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::prsqrt(a); }
|
|
368
462
|
};
|
|
@@ -528,6 +622,23 @@ struct functor_traits<scalar_tanh_op<Scalar> > {
|
|
|
528
622
|
};
|
|
529
623
|
};
|
|
530
624
|
|
|
625
|
+
#if EIGEN_HAS_CXX11_MATH
|
|
626
|
+
/** \internal
|
|
627
|
+
* \brief Template functor to compute the atanh of a scalar
|
|
628
|
+
* \sa class CwiseUnaryOp, ArrayBase::atanh()
|
|
629
|
+
*/
|
|
630
|
+
template <typename Scalar>
|
|
631
|
+
struct scalar_atanh_op {
|
|
632
|
+
EIGEN_EMPTY_STRUCT_CTOR(scalar_atanh_op)
|
|
633
|
+
EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::atanh(a); }
|
|
634
|
+
};
|
|
635
|
+
|
|
636
|
+
template <typename Scalar>
|
|
637
|
+
struct functor_traits<scalar_atanh_op<Scalar> > {
|
|
638
|
+
enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = false };
|
|
639
|
+
};
|
|
640
|
+
#endif
|
|
641
|
+
|
|
531
642
|
/** \internal
|
|
532
643
|
* \brief Template functor to compute the sinh of a scalar
|
|
533
644
|
* \sa class CwiseUnaryOp, ArrayBase::sinh()
|
|
@@ -547,6 +658,23 @@ struct functor_traits<scalar_sinh_op<Scalar> >
|
|
|
547
658
|
};
|
|
548
659
|
};
|
|
549
660
|
|
|
661
|
+
#if EIGEN_HAS_CXX11_MATH
|
|
662
|
+
/** \internal
|
|
663
|
+
* \brief Template functor to compute the asinh of a scalar
|
|
664
|
+
* \sa class CwiseUnaryOp, ArrayBase::asinh()
|
|
665
|
+
*/
|
|
666
|
+
template <typename Scalar>
|
|
667
|
+
struct scalar_asinh_op {
|
|
668
|
+
EIGEN_EMPTY_STRUCT_CTOR(scalar_asinh_op)
|
|
669
|
+
EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::asinh(a); }
|
|
670
|
+
};
|
|
671
|
+
|
|
672
|
+
template <typename Scalar>
|
|
673
|
+
struct functor_traits<scalar_asinh_op<Scalar> > {
|
|
674
|
+
enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = false };
|
|
675
|
+
};
|
|
676
|
+
#endif
|
|
677
|
+
|
|
550
678
|
/** \internal
|
|
551
679
|
* \brief Template functor to compute the cosh of a scalar
|
|
552
680
|
* \sa class CwiseUnaryOp, ArrayBase::cosh()
|
|
@@ -566,6 +694,23 @@ struct functor_traits<scalar_cosh_op<Scalar> >
|
|
|
566
694
|
};
|
|
567
695
|
};
|
|
568
696
|
|
|
697
|
+
#if EIGEN_HAS_CXX11_MATH
|
|
698
|
+
/** \internal
|
|
699
|
+
* \brief Template functor to compute the acosh of a scalar
|
|
700
|
+
* \sa class CwiseUnaryOp, ArrayBase::acosh()
|
|
701
|
+
*/
|
|
702
|
+
template <typename Scalar>
|
|
703
|
+
struct scalar_acosh_op {
|
|
704
|
+
EIGEN_EMPTY_STRUCT_CTOR(scalar_acosh_op)
|
|
705
|
+
EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::acosh(a); }
|
|
706
|
+
};
|
|
707
|
+
|
|
708
|
+
template <typename Scalar>
|
|
709
|
+
struct functor_traits<scalar_acosh_op<Scalar> > {
|
|
710
|
+
enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = false };
|
|
711
|
+
};
|
|
712
|
+
#endif
|
|
713
|
+
|
|
569
714
|
/** \internal
|
|
570
715
|
* \brief Template functor to compute the inverse of a scalar
|
|
571
716
|
* \sa class CwiseUnaryOp, Cwise::inverse()
|
|
@@ -578,9 +723,13 @@ struct scalar_inverse_op {
|
|
|
578
723
|
EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const
|
|
579
724
|
{ return internal::pdiv(pset1<Packet>(Scalar(1)),a); }
|
|
580
725
|
};
|
|
581
|
-
template<typename Scalar>
|
|
582
|
-
struct functor_traits<scalar_inverse_op<Scalar> >
|
|
583
|
-
|
|
726
|
+
template <typename Scalar>
|
|
727
|
+
struct functor_traits<scalar_inverse_op<Scalar> > {
|
|
728
|
+
enum {
|
|
729
|
+
PacketAccess = packet_traits<Scalar>::HasDiv,
|
|
730
|
+
Cost = scalar_div_cost<Scalar, PacketAccess>::value
|
|
731
|
+
};
|
|
732
|
+
};
|
|
584
733
|
|
|
585
734
|
/** \internal
|
|
586
735
|
* \brief Template functor to compute the square of a scalar
|
|
@@ -598,6 +747,19 @@ template<typename Scalar>
|
|
|
598
747
|
struct functor_traits<scalar_square_op<Scalar> >
|
|
599
748
|
{ enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; };
|
|
600
749
|
|
|
750
|
+
// Boolean specialization to avoid -Wint-in-bool-context warnings on GCC.
|
|
751
|
+
template<>
|
|
752
|
+
struct scalar_square_op<bool> {
|
|
753
|
+
EIGEN_EMPTY_STRUCT_CTOR(scalar_square_op)
|
|
754
|
+
EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline bool operator() (const bool& a) const { return a; }
|
|
755
|
+
template<typename Packet>
|
|
756
|
+
EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const
|
|
757
|
+
{ return a; }
|
|
758
|
+
};
|
|
759
|
+
template<>
|
|
760
|
+
struct functor_traits<scalar_square_op<bool> >
|
|
761
|
+
{ enum { Cost = 0, PacketAccess = packet_traits<bool>::Vectorizable }; };
|
|
762
|
+
|
|
601
763
|
/** \internal
|
|
602
764
|
* \brief Template functor to compute the cube of a scalar
|
|
603
765
|
* \sa class CwiseUnaryOp, Cwise::cube()
|
|
@@ -614,6 +776,19 @@ template<typename Scalar>
|
|
|
614
776
|
struct functor_traits<scalar_cube_op<Scalar> >
|
|
615
777
|
{ enum { Cost = 2*NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; };
|
|
616
778
|
|
|
779
|
+
// Boolean specialization to avoid -Wint-in-bool-context warnings on GCC.
|
|
780
|
+
template<>
|
|
781
|
+
struct scalar_cube_op<bool> {
|
|
782
|
+
EIGEN_EMPTY_STRUCT_CTOR(scalar_cube_op)
|
|
783
|
+
EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline bool operator() (const bool& a) const { return a; }
|
|
784
|
+
template<typename Packet>
|
|
785
|
+
EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const
|
|
786
|
+
{ return a; }
|
|
787
|
+
};
|
|
788
|
+
template<>
|
|
789
|
+
struct functor_traits<scalar_cube_op<bool> >
|
|
790
|
+
{ enum { Cost = 0, PacketAccess = packet_traits<bool>::Vectorizable }; };
|
|
791
|
+
|
|
617
792
|
/** \internal
|
|
618
793
|
* \brief Template functor to compute the rounded value of a scalar
|
|
619
794
|
* \sa class CwiseUnaryOp, ArrayBase::round()
|
|
@@ -652,6 +827,25 @@ struct functor_traits<scalar_floor_op<Scalar> >
|
|
|
652
827
|
};
|
|
653
828
|
};
|
|
654
829
|
|
|
830
|
+
/** \internal
|
|
831
|
+
* \brief Template functor to compute the rounded (with current rounding mode) value of a scalar
|
|
832
|
+
* \sa class CwiseUnaryOp, ArrayBase::rint()
|
|
833
|
+
*/
|
|
834
|
+
template<typename Scalar> struct scalar_rint_op {
|
|
835
|
+
EIGEN_EMPTY_STRUCT_CTOR(scalar_rint_op)
|
|
836
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const { return numext::rint(a); }
|
|
837
|
+
template <typename Packet>
|
|
838
|
+
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::print(a); }
|
|
839
|
+
};
|
|
840
|
+
template<typename Scalar>
|
|
841
|
+
struct functor_traits<scalar_rint_op<Scalar> >
|
|
842
|
+
{
|
|
843
|
+
enum {
|
|
844
|
+
Cost = NumTraits<Scalar>::MulCost,
|
|
845
|
+
PacketAccess = packet_traits<Scalar>::HasRint
|
|
846
|
+
};
|
|
847
|
+
};
|
|
848
|
+
|
|
655
849
|
/** \internal
|
|
656
850
|
* \brief Template functor to compute the ceil of a scalar
|
|
657
851
|
* \sa class CwiseUnaryOp, ArrayBase::ceil()
|
|
@@ -678,7 +872,13 @@ struct functor_traits<scalar_ceil_op<Scalar> >
|
|
|
678
872
|
template<typename Scalar> struct scalar_isnan_op {
|
|
679
873
|
EIGEN_EMPTY_STRUCT_CTOR(scalar_isnan_op)
|
|
680
874
|
typedef bool result_type;
|
|
681
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const {
|
|
875
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const {
|
|
876
|
+
#if defined(SYCL_DEVICE_ONLY)
|
|
877
|
+
return numext::isnan(a);
|
|
878
|
+
#else
|
|
879
|
+
return (numext::isnan)(a);
|
|
880
|
+
#endif
|
|
881
|
+
}
|
|
682
882
|
};
|
|
683
883
|
template<typename Scalar>
|
|
684
884
|
struct functor_traits<scalar_isnan_op<Scalar> >
|
|
@@ -696,7 +896,13 @@ struct functor_traits<scalar_isnan_op<Scalar> >
|
|
|
696
896
|
template<typename Scalar> struct scalar_isinf_op {
|
|
697
897
|
EIGEN_EMPTY_STRUCT_CTOR(scalar_isinf_op)
|
|
698
898
|
typedef bool result_type;
|
|
699
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const {
|
|
899
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const {
|
|
900
|
+
#if defined(SYCL_DEVICE_ONLY)
|
|
901
|
+
return numext::isinf(a);
|
|
902
|
+
#else
|
|
903
|
+
return (numext::isinf)(a);
|
|
904
|
+
#endif
|
|
905
|
+
}
|
|
700
906
|
};
|
|
701
907
|
template<typename Scalar>
|
|
702
908
|
struct functor_traits<scalar_isinf_op<Scalar> >
|
|
@@ -714,7 +920,13 @@ struct functor_traits<scalar_isinf_op<Scalar> >
|
|
|
714
920
|
template<typename Scalar> struct scalar_isfinite_op {
|
|
715
921
|
EIGEN_EMPTY_STRUCT_CTOR(scalar_isfinite_op)
|
|
716
922
|
typedef bool result_type;
|
|
717
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const {
|
|
923
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const {
|
|
924
|
+
#if defined(SYCL_DEVICE_ONLY)
|
|
925
|
+
return numext::isfinite(a);
|
|
926
|
+
#else
|
|
927
|
+
return (numext::isfinite)(a);
|
|
928
|
+
#endif
|
|
929
|
+
}
|
|
718
930
|
};
|
|
719
931
|
template<typename Scalar>
|
|
720
932
|
struct functor_traits<scalar_isfinite_op<Scalar> >
|
|
@@ -746,9 +958,9 @@ struct functor_traits<scalar_boolean_not_op<Scalar> > {
|
|
|
746
958
|
* \brief Template functor to compute the signum of a scalar
|
|
747
959
|
* \sa class CwiseUnaryOp, Cwise::sign()
|
|
748
960
|
*/
|
|
749
|
-
template<typename Scalar,bool
|
|
961
|
+
template<typename Scalar,bool is_complex=(NumTraits<Scalar>::IsComplex!=0), bool is_integer=(NumTraits<Scalar>::IsInteger!=0) > struct scalar_sign_op;
|
|
750
962
|
template<typename Scalar>
|
|
751
|
-
struct scalar_sign_op<Scalar,false> {
|
|
963
|
+
struct scalar_sign_op<Scalar, false, true> {
|
|
752
964
|
EIGEN_EMPTY_STRUCT_CTOR(scalar_sign_op)
|
|
753
965
|
EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const
|
|
754
966
|
{
|
|
@@ -758,8 +970,21 @@ struct scalar_sign_op<Scalar,false> {
|
|
|
758
970
|
//template <typename Packet>
|
|
759
971
|
//EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::psign(a); }
|
|
760
972
|
};
|
|
973
|
+
|
|
761
974
|
template<typename Scalar>
|
|
762
|
-
struct scalar_sign_op<Scalar,
|
|
975
|
+
struct scalar_sign_op<Scalar, false, false> {
|
|
976
|
+
EIGEN_EMPTY_STRUCT_CTOR(scalar_sign_op)
|
|
977
|
+
EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const
|
|
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> {
|
|
763
988
|
EIGEN_EMPTY_STRUCT_CTOR(scalar_sign_op)
|
|
764
989
|
EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const
|
|
765
990
|
{
|
|
@@ -777,7 +1002,7 @@ struct scalar_sign_op<Scalar,true> {
|
|
|
777
1002
|
template<typename Scalar>
|
|
778
1003
|
struct functor_traits<scalar_sign_op<Scalar> >
|
|
779
1004
|
{ enum {
|
|
780
|
-
Cost =
|
|
1005
|
+
Cost =
|
|
781
1006
|
NumTraits<Scalar>::IsComplex
|
|
782
1007
|
? ( 8*NumTraits<Scalar>::MulCost ) // roughly
|
|
783
1008
|
: ( 3*NumTraits<Scalar>::AddCost),
|
|
@@ -785,6 +1010,120 @@ struct functor_traits<scalar_sign_op<Scalar> >
|
|
|
785
1010
|
};
|
|
786
1011
|
};
|
|
787
1012
|
|
|
1013
|
+
/** \internal
|
|
1014
|
+
* \brief Template functor to compute the logistic function of a scalar
|
|
1015
|
+
* \sa class CwiseUnaryOp, ArrayBase::logistic()
|
|
1016
|
+
*/
|
|
1017
|
+
template <typename T>
|
|
1018
|
+
struct scalar_logistic_op {
|
|
1019
|
+
EIGEN_EMPTY_STRUCT_CTOR(scalar_logistic_op)
|
|
1020
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T operator()(const T& x) const {
|
|
1021
|
+
return packetOp(x);
|
|
1022
|
+
}
|
|
1023
|
+
|
|
1024
|
+
template <typename Packet> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
|
|
1025
|
+
Packet packetOp(const Packet& x) const {
|
|
1026
|
+
const Packet one = pset1<Packet>(T(1));
|
|
1027
|
+
return pdiv(one, padd(one, pexp(pnegate(x))));
|
|
1028
|
+
}
|
|
1029
|
+
};
|
|
1030
|
+
|
|
1031
|
+
#ifndef EIGEN_GPU_COMPILE_PHASE
|
|
1032
|
+
/** \internal
|
|
1033
|
+
* \brief Template specialization of the logistic function for float.
|
|
1034
|
+
*
|
|
1035
|
+
* Uses just a 9/10-degree rational interpolant which
|
|
1036
|
+
* interpolates 1/(1+exp(-x)) - 0.5 up to a couple of ulps in the range
|
|
1037
|
+
* [-9, 18]. Below -9 we use the more accurate approximation
|
|
1038
|
+
* 1/(1+exp(-x)) ~= exp(x), and above 18 the logistic function is 1 withing
|
|
1039
|
+
* one ulp. The shifted logistic is interpolated because it was easier to
|
|
1040
|
+
* make the fit converge.
|
|
1041
|
+
*
|
|
1042
|
+
*/
|
|
1043
|
+
template <>
|
|
1044
|
+
struct scalar_logistic_op<float> {
|
|
1045
|
+
EIGEN_EMPTY_STRUCT_CTOR(scalar_logistic_op)
|
|
1046
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float operator()(const float& x) const {
|
|
1047
|
+
return packetOp(x);
|
|
1048
|
+
}
|
|
1049
|
+
|
|
1050
|
+
template <typename Packet> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
|
|
1051
|
+
Packet packetOp(const Packet& _x) const {
|
|
1052
|
+
const Packet cutoff_lower = pset1<Packet>(-9.f);
|
|
1053
|
+
const Packet lt_mask = pcmp_lt<Packet>(_x, cutoff_lower);
|
|
1054
|
+
const bool any_small = predux_any(lt_mask);
|
|
1055
|
+
|
|
1056
|
+
// The upper cut-off is the smallest x for which the rational approximation evaluates to 1.
|
|
1057
|
+
// Choosing this value saves us a few instructions clamping the results at the end.
|
|
1058
|
+
#ifdef EIGEN_VECTORIZE_FMA
|
|
1059
|
+
const Packet cutoff_upper = pset1<Packet>(15.7243833541870117f);
|
|
1060
|
+
#else
|
|
1061
|
+
const Packet cutoff_upper = pset1<Packet>(15.6437711715698242f);
|
|
1062
|
+
#endif
|
|
1063
|
+
const Packet x = pmin(_x, cutoff_upper);
|
|
1064
|
+
|
|
1065
|
+
// The monomial coefficients of the numerator polynomial (odd).
|
|
1066
|
+
const Packet alpha_1 = pset1<Packet>(2.48287947061529e-01f);
|
|
1067
|
+
const Packet alpha_3 = pset1<Packet>(8.51377133304701e-03f);
|
|
1068
|
+
const Packet alpha_5 = pset1<Packet>(6.08574864600143e-05f);
|
|
1069
|
+
const Packet alpha_7 = pset1<Packet>(1.15627324459942e-07f);
|
|
1070
|
+
const Packet alpha_9 = pset1<Packet>(4.37031012579801e-11f);
|
|
1071
|
+
|
|
1072
|
+
// The monomial coefficients of the denominator polynomial (even).
|
|
1073
|
+
const Packet beta_0 = pset1<Packet>(9.93151921023180e-01f);
|
|
1074
|
+
const Packet beta_2 = pset1<Packet>(1.16817656904453e-01f);
|
|
1075
|
+
const Packet beta_4 = pset1<Packet>(1.70198817374094e-03f);
|
|
1076
|
+
const Packet beta_6 = pset1<Packet>(6.29106785017040e-06f);
|
|
1077
|
+
const Packet beta_8 = pset1<Packet>(5.76102136993427e-09f);
|
|
1078
|
+
const Packet beta_10 = pset1<Packet>(6.10247389755681e-13f);
|
|
1079
|
+
|
|
1080
|
+
// Since the polynomials are odd/even, we need x^2.
|
|
1081
|
+
const Packet x2 = pmul(x, x);
|
|
1082
|
+
|
|
1083
|
+
// Evaluate the numerator polynomial p.
|
|
1084
|
+
Packet p = pmadd(x2, alpha_9, alpha_7);
|
|
1085
|
+
p = pmadd(x2, p, alpha_5);
|
|
1086
|
+
p = pmadd(x2, p, alpha_3);
|
|
1087
|
+
p = pmadd(x2, p, alpha_1);
|
|
1088
|
+
p = pmul(x, p);
|
|
1089
|
+
|
|
1090
|
+
// Evaluate the denominator polynomial q.
|
|
1091
|
+
Packet q = pmadd(x2, beta_10, beta_8);
|
|
1092
|
+
q = pmadd(x2, q, beta_6);
|
|
1093
|
+
q = pmadd(x2, q, beta_4);
|
|
1094
|
+
q = pmadd(x2, q, beta_2);
|
|
1095
|
+
q = pmadd(x2, q, beta_0);
|
|
1096
|
+
// Divide the numerator by the denominator and shift it up.
|
|
1097
|
+
const Packet logistic = padd(pdiv(p, q), pset1<Packet>(0.5f));
|
|
1098
|
+
if (EIGEN_PREDICT_FALSE(any_small)) {
|
|
1099
|
+
const Packet exponential = pexp(_x);
|
|
1100
|
+
return pselect(lt_mask, exponential, logistic);
|
|
1101
|
+
} else {
|
|
1102
|
+
return logistic;
|
|
1103
|
+
}
|
|
1104
|
+
}
|
|
1105
|
+
};
|
|
1106
|
+
#endif // #ifndef EIGEN_GPU_COMPILE_PHASE
|
|
1107
|
+
|
|
1108
|
+
template <typename T>
|
|
1109
|
+
struct functor_traits<scalar_logistic_op<T> > {
|
|
1110
|
+
enum {
|
|
1111
|
+
// The cost estimate for float here here is for the common(?) case where
|
|
1112
|
+
// all arguments are greater than -9.
|
|
1113
|
+
Cost = scalar_div_cost<T, packet_traits<T>::HasDiv>::value +
|
|
1114
|
+
(internal::is_same<T, float>::value
|
|
1115
|
+
? NumTraits<T>::AddCost * 15 + NumTraits<T>::MulCost * 11
|
|
1116
|
+
: NumTraits<T>::AddCost * 2 +
|
|
1117
|
+
functor_traits<scalar_exp_op<T> >::Cost),
|
|
1118
|
+
PacketAccess =
|
|
1119
|
+
packet_traits<T>::HasAdd && packet_traits<T>::HasDiv &&
|
|
1120
|
+
(internal::is_same<T, float>::value
|
|
1121
|
+
? packet_traits<T>::HasMul && packet_traits<T>::HasMax &&
|
|
1122
|
+
packet_traits<T>::HasMin
|
|
1123
|
+
: packet_traits<T>::HasNegate && packet_traits<T>::HasExp)
|
|
1124
|
+
};
|
|
1125
|
+
};
|
|
1126
|
+
|
|
788
1127
|
} // end namespace internal
|
|
789
1128
|
|
|
790
1129
|
} // end namespace Eigen
|