From b5d66b5e7395be326cbc66434ac0e35da33732e2 Mon Sep 17 00:00:00 2001 From: ShengYang1 Date: Tue, 7 Apr 2020 13:18:00 +0800 Subject: [PATCH] Implement scalar_cmp_with_cast_op --- Eigen/src/Core/functors/BinaryFunctors.h | 104 +++++++++++++++++++++++ 1 file changed, 104 insertions(+) diff --git a/Eigen/src/Core/functors/BinaryFunctors.h b/Eigen/src/Core/functors/BinaryFunctors.h index 697816663..54bcddd34 100644 --- a/Eigen/src/Core/functors/BinaryFunctors.h +++ b/Eigen/src/Core/functors/BinaryFunctors.h @@ -251,6 +251,110 @@ struct scalar_cmp_op : binary_op_base struct scalar_cmp_with_cast_op; + +template +struct functor_traits > { + enum { + Cost = (NumTraits::AddCost+NumTraits::AddCost)/2, + PacketAccess = internal::is_same::value && internal::is_same::value + }; +}; + +template +struct scalar_cmp_with_cast_op : binary_op_base +{ + typedef typename ScalarBinaryOpTraits::ReturnType result_type; + EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_with_cast_op) + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const { + if(a==b) return static_cast(1); + else return static_cast(0); + } + template + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const + { return internal::pselect(internal::pcmp_eq(a,b), internal::pset1(static_cast(1)), internal::pzero(a)); } +}; +template +struct scalar_cmp_with_cast_op : binary_op_base +{ + typedef typename ScalarBinaryOpTraits::ReturnType result_type; + EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_with_cast_op) + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const { + if(a(1); + else return static_cast(0); + } + template + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const + { return internal::pselect(internal::pcmp_lt(a,b), internal::pset1(static_cast(1)), internal::pzero(a)); } +}; +template +struct scalar_cmp_with_cast_op : binary_op_base +{ + typedef typename ScalarBinaryOpTraits::ReturnType result_type; + EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_with_cast_op) + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const { + if(a<=b) return static_cast(1); + else return static_cast(0); + } + template + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const + { return internal::pselect(internal::pcmp_le(a,b), internal::pset1(static_cast(1)), internal::pzero(a)); } +}; +template +struct scalar_cmp_with_cast_op : binary_op_base +{ + typedef typename ScalarBinaryOpTraits::ReturnType result_type; + EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_with_cast_op) + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const { + if(a>b) return static_cast(1); + else return static_cast(0); + } + template + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const + { return internal::pselect(internal::pcmp_le(a,b), internal::pzero(a), internal::pset1(static_cast(1))); } +}; +template +struct scalar_cmp_with_cast_op : binary_op_base +{ + typedef typename ScalarBinaryOpTraits::ReturnType result_type; + EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_with_cast_op) + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const { + if(a>=b) return static_cast(1); + else return static_cast(0); + } + template + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const + { return internal::pselect(internal::pcmp_lt(a,b), internal::pzero(a), internal::pset1(static_cast(1))); } +}; +template +struct scalar_cmp_with_cast_op : binary_op_base +{ + typedef typename ScalarBinaryOpTraits::ReturnType result_type; + EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_with_cast_op) + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const { + if(a<=b || b<=a) return static_cast(0); + else return static_cast(1); + } + template + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const + { return internal::pselect(por(internal::pcmp_le(a,b), internal::pcmp_le(b,a)), internal::pzero(a), internal::pset1(static_cast(1))); } +}; +template +struct scalar_cmp_with_cast_op : binary_op_base +{ + typedef typename ScalarBinaryOpTraits::ReturnType result_type; + EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_with_cast_op) + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const { + if(a!=b) return static_cast(1); + else return static_cast(0); + } + template + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const + { return internal::pselect(internal::pcmp_eq(a,b), internal::pzero(a), internal::pset1(static_cast(1))); } +}; /** \internal * \brief Template functor to compute the hypot of two \b positive \b and \b real scalars