diff options
| author | Stanislaw Halik <sthalik@misaki.pl> | 2019-03-03 21:09:10 +0100 |
|---|---|---|
| committer | Stanislaw Halik <sthalik@misaki.pl> | 2019-03-03 21:10:13 +0100 |
| commit | f0238cfb6997c4acfc2bd200de7295f3fa36968f (patch) | |
| tree | b215183760e4f615b9c1dabc1f116383b72a1b55 /eigen/Eigen/src/Core/functors | |
| parent | 543edd372a5193d04b3de9f23c176ab439e51b31 (diff) | |
don't index Eigen
Diffstat (limited to 'eigen/Eigen/src/Core/functors')
| -rw-r--r-- | eigen/Eigen/src/Core/functors/AssignmentFunctors.h | 168 | ||||
| -rw-r--r-- | eigen/Eigen/src/Core/functors/BinaryFunctors.h | 475 | ||||
| -rw-r--r-- | eigen/Eigen/src/Core/functors/NullaryFunctors.h | 188 | ||||
| -rw-r--r-- | eigen/Eigen/src/Core/functors/StlFunctors.h | 136 | ||||
| -rw-r--r-- | eigen/Eigen/src/Core/functors/TernaryFunctors.h | 25 | ||||
| -rw-r--r-- | eigen/Eigen/src/Core/functors/UnaryFunctors.h | 792 |
6 files changed, 0 insertions, 1784 deletions
diff --git a/eigen/Eigen/src/Core/functors/AssignmentFunctors.h b/eigen/Eigen/src/Core/functors/AssignmentFunctors.h deleted file mode 100644 index 4153b87..0000000 --- a/eigen/Eigen/src/Core/functors/AssignmentFunctors.h +++ /dev/null @@ -1,168 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr> -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_ASSIGNMENT_FUNCTORS_H -#define EIGEN_ASSIGNMENT_FUNCTORS_H - -namespace Eigen { - -namespace internal { - -/** \internal - * \brief Template functor for scalar/packet assignment - * - */ -template<typename DstScalar,typename SrcScalar> struct assign_op { - - EIGEN_EMPTY_STRUCT_CTOR(assign_op) - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(DstScalar& a, const SrcScalar& b) const { a = b; } - - template<int Alignment, typename Packet> - EIGEN_STRONG_INLINE void assignPacket(DstScalar* a, const Packet& b) const - { internal::pstoret<DstScalar,Packet,Alignment>(a,b); } -}; - -// Empty overload for void type (used by PermutationMatrix) -template<typename DstScalar> struct assign_op<DstScalar,void> {}; - -template<typename DstScalar,typename SrcScalar> -struct functor_traits<assign_op<DstScalar,SrcScalar> > { - enum { - Cost = NumTraits<DstScalar>::ReadCost, - PacketAccess = is_same<DstScalar,SrcScalar>::value && packet_traits<DstScalar>::Vectorizable && packet_traits<SrcScalar>::Vectorizable - }; -}; - -/** \internal - * \brief Template functor for scalar/packet assignment with addition - * - */ -template<typename DstScalar,typename SrcScalar> struct add_assign_op { - - EIGEN_EMPTY_STRUCT_CTOR(add_assign_op) - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(DstScalar& a, const SrcScalar& b) const { a += b; } - - template<int Alignment, typename Packet> - EIGEN_STRONG_INLINE void assignPacket(DstScalar* a, const Packet& b) const - { internal::pstoret<DstScalar,Packet,Alignment>(a,internal::padd(internal::ploadt<Packet,Alignment>(a),b)); } -}; -template<typename DstScalar,typename SrcScalar> -struct functor_traits<add_assign_op<DstScalar,SrcScalar> > { - enum { - Cost = NumTraits<DstScalar>::ReadCost + NumTraits<DstScalar>::AddCost, - PacketAccess = is_same<DstScalar,SrcScalar>::value && packet_traits<DstScalar>::HasAdd - }; -}; - -/** \internal - * \brief Template functor for scalar/packet assignment with subtraction - * - */ -template<typename DstScalar,typename SrcScalar> struct sub_assign_op { - - EIGEN_EMPTY_STRUCT_CTOR(sub_assign_op) - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(DstScalar& a, const SrcScalar& b) const { a -= b; } - - template<int Alignment, typename Packet> - EIGEN_STRONG_INLINE void assignPacket(DstScalar* a, const Packet& b) const - { internal::pstoret<DstScalar,Packet,Alignment>(a,internal::psub(internal::ploadt<Packet,Alignment>(a),b)); } -}; -template<typename DstScalar,typename SrcScalar> -struct functor_traits<sub_assign_op<DstScalar,SrcScalar> > { - enum { - Cost = NumTraits<DstScalar>::ReadCost + NumTraits<DstScalar>::AddCost, - PacketAccess = is_same<DstScalar,SrcScalar>::value && packet_traits<DstScalar>::HasSub - }; -}; - -/** \internal - * \brief Template functor for scalar/packet assignment with multiplication - * - */ -template<typename DstScalar, typename SrcScalar=DstScalar> -struct mul_assign_op { - - EIGEN_EMPTY_STRUCT_CTOR(mul_assign_op) - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(DstScalar& a, const SrcScalar& b) const { a *= b; } - - template<int Alignment, typename Packet> - EIGEN_STRONG_INLINE void assignPacket(DstScalar* a, const Packet& b) const - { internal::pstoret<DstScalar,Packet,Alignment>(a,internal::pmul(internal::ploadt<Packet,Alignment>(a),b)); } -}; -template<typename DstScalar, typename SrcScalar> -struct functor_traits<mul_assign_op<DstScalar,SrcScalar> > { - enum { - Cost = NumTraits<DstScalar>::ReadCost + NumTraits<DstScalar>::MulCost, - PacketAccess = is_same<DstScalar,SrcScalar>::value && packet_traits<DstScalar>::HasMul - }; -}; - -/** \internal - * \brief Template functor for scalar/packet assignment with diviving - * - */ -template<typename DstScalar, typename SrcScalar=DstScalar> struct div_assign_op { - - EIGEN_EMPTY_STRUCT_CTOR(div_assign_op) - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(DstScalar& a, const SrcScalar& b) const { a /= b; } - - template<int Alignment, typename Packet> - EIGEN_STRONG_INLINE void assignPacket(DstScalar* a, const Packet& b) const - { internal::pstoret<DstScalar,Packet,Alignment>(a,internal::pdiv(internal::ploadt<Packet,Alignment>(a),b)); } -}; -template<typename DstScalar, typename SrcScalar> -struct functor_traits<div_assign_op<DstScalar,SrcScalar> > { - enum { - Cost = NumTraits<DstScalar>::ReadCost + NumTraits<DstScalar>::MulCost, - PacketAccess = is_same<DstScalar,SrcScalar>::value && packet_traits<DstScalar>::HasDiv - }; -}; - -/** \internal - * \brief Template functor for scalar/packet assignment with swapping - * - * It works as follow. For a non-vectorized evaluation loop, we have: - * for(i) func(A.coeffRef(i), B.coeff(i)); - * where B is a SwapWrapper expression. The trick is to make SwapWrapper::coeff behaves like a non-const coeffRef. - * Actually, SwapWrapper might not even be needed since even if B is a plain expression, since it has to be writable - * B.coeff already returns a const reference to the underlying scalar value. - * - * The case of a vectorized loop is more tricky: - * for(i,j) func.assignPacket<A_Align>(&A.coeffRef(i,j), B.packet<B_Align>(i,j)); - * Here, B must be a SwapWrapper whose packet function actually returns a proxy object holding a Scalar*, - * the actual alignment and Packet type. - * - */ -template<typename Scalar> struct swap_assign_op { - - EIGEN_EMPTY_STRUCT_CTOR(swap_assign_op) - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(Scalar& a, const Scalar& b) const - { -#ifdef __CUDACC__ - // FIXME is there some kind of cuda::swap? - Scalar t=b; const_cast<Scalar&>(b)=a; a=t; -#else - using std::swap; - swap(a,const_cast<Scalar&>(b)); -#endif - } -}; -template<typename Scalar> -struct functor_traits<swap_assign_op<Scalar> > { - enum { - Cost = 3 * NumTraits<Scalar>::ReadCost, - PacketAccess = packet_traits<Scalar>::Vectorizable - }; -}; - -} // namespace internal - -} // namespace Eigen - -#endif // EIGEN_ASSIGNMENT_FUNCTORS_H diff --git a/eigen/Eigen/src/Core/functors/BinaryFunctors.h b/eigen/Eigen/src/Core/functors/BinaryFunctors.h deleted file mode 100644 index 3eae6b8..0000000 --- a/eigen/Eigen/src/Core/functors/BinaryFunctors.h +++ /dev/null @@ -1,475 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr> -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_BINARY_FUNCTORS_H -#define EIGEN_BINARY_FUNCTORS_H - -namespace Eigen { - -namespace internal { - -//---------- associative binary functors ---------- - -template<typename Arg1, typename Arg2> -struct binary_op_base -{ - typedef Arg1 first_argument_type; - typedef Arg2 second_argument_type; -}; - -/** \internal - * \brief Template functor to compute the sum of two scalars - * - * \sa class CwiseBinaryOp, MatrixBase::operator+, class VectorwiseOp, DenseBase::sum() - */ -template<typename LhsScalar,typename RhsScalar> -struct scalar_sum_op : binary_op_base<LhsScalar,RhsScalar> -{ - typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_sum_op>::ReturnType result_type; -#ifndef EIGEN_SCALAR_BINARY_OP_PLUGIN - EIGEN_EMPTY_STRUCT_CTOR(scalar_sum_op) -#else - scalar_sum_op() { - EIGEN_SCALAR_BINARY_OP_PLUGIN - } -#endif - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const { return a + b; } - template<typename Packet> - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const - { return internal::padd(a,b); } - template<typename Packet> - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type predux(const Packet& a) const - { return internal::predux(a); } -}; -template<typename LhsScalar,typename RhsScalar> -struct functor_traits<scalar_sum_op<LhsScalar,RhsScalar> > { - enum { - Cost = (NumTraits<LhsScalar>::AddCost+NumTraits<RhsScalar>::AddCost)/2, // rough estimate! - PacketAccess = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasAdd && packet_traits<RhsScalar>::HasAdd - // TODO vectorize mixed sum - }; -}; - -/** \internal - * \brief Template specialization to deprecate the summation of boolean expressions. - * This is required to solve Bug 426. - * \sa DenseBase::count(), DenseBase::any(), ArrayBase::cast(), MatrixBase::cast() - */ -template<> struct scalar_sum_op<bool,bool> : scalar_sum_op<int,int> { - EIGEN_DEPRECATED - scalar_sum_op() {} -}; - - -/** \internal - * \brief Template functor to compute the product of two scalars - * - * \sa class CwiseBinaryOp, Cwise::operator*(), class VectorwiseOp, MatrixBase::redux() - */ -template<typename LhsScalar,typename RhsScalar> -struct scalar_product_op : binary_op_base<LhsScalar,RhsScalar> -{ - typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_product_op>::ReturnType result_type; -#ifndef EIGEN_SCALAR_BINARY_OP_PLUGIN - EIGEN_EMPTY_STRUCT_CTOR(scalar_product_op) -#else - scalar_product_op() { - EIGEN_SCALAR_BINARY_OP_PLUGIN - } -#endif - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const { return a * b; } - template<typename Packet> - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const - { return internal::pmul(a,b); } - template<typename Packet> - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type predux(const Packet& a) const - { return internal::predux_mul(a); } -}; -template<typename LhsScalar,typename RhsScalar> -struct functor_traits<scalar_product_op<LhsScalar,RhsScalar> > { - enum { - Cost = (NumTraits<LhsScalar>::MulCost + NumTraits<RhsScalar>::MulCost)/2, // rough estimate! - PacketAccess = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasMul && packet_traits<RhsScalar>::HasMul - // TODO vectorize mixed product - }; -}; - -/** \internal - * \brief Template functor to compute the conjugate product of two scalars - * - * This is a short cut for conj(x) * y which is needed for optimization purpose; in Eigen2 support mode, this becomes x * conj(y) - */ -template<typename LhsScalar,typename RhsScalar> -struct scalar_conj_product_op : binary_op_base<LhsScalar,RhsScalar> -{ - - enum { - Conj = NumTraits<LhsScalar>::IsComplex - }; - - typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_conj_product_op>::ReturnType result_type; - - EIGEN_EMPTY_STRUCT_CTOR(scalar_conj_product_op) - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const - { return conj_helper<LhsScalar,RhsScalar,Conj,false>().pmul(a,b); } - - template<typename Packet> - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const - { return conj_helper<Packet,Packet,Conj,false>().pmul(a,b); } -}; -template<typename LhsScalar,typename RhsScalar> -struct functor_traits<scalar_conj_product_op<LhsScalar,RhsScalar> > { - enum { - Cost = NumTraits<LhsScalar>::MulCost, - PacketAccess = internal::is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasMul - }; -}; - -/** \internal - * \brief Template functor to compute the min of two scalars - * - * \sa class CwiseBinaryOp, MatrixBase::cwiseMin, class VectorwiseOp, MatrixBase::minCoeff() - */ -template<typename LhsScalar,typename RhsScalar> -struct scalar_min_op : binary_op_base<LhsScalar,RhsScalar> -{ - typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_min_op>::ReturnType result_type; - EIGEN_EMPTY_STRUCT_CTOR(scalar_min_op) - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const { return numext::mini(a, b); } - template<typename Packet> - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const - { return internal::pmin(a,b); } - template<typename Packet> - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type predux(const Packet& a) const - { return internal::predux_min(a); } -}; -template<typename LhsScalar,typename RhsScalar> -struct functor_traits<scalar_min_op<LhsScalar,RhsScalar> > { - enum { - Cost = (NumTraits<LhsScalar>::AddCost+NumTraits<RhsScalar>::AddCost)/2, - PacketAccess = internal::is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasMin - }; -}; - -/** \internal - * \brief Template functor to compute the max of two scalars - * - * \sa class CwiseBinaryOp, MatrixBase::cwiseMax, class VectorwiseOp, MatrixBase::maxCoeff() - */ -template<typename LhsScalar,typename RhsScalar> -struct scalar_max_op : binary_op_base<LhsScalar,RhsScalar> -{ - typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_max_op>::ReturnType result_type; - EIGEN_EMPTY_STRUCT_CTOR(scalar_max_op) - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const { return numext::maxi(a, b); } - template<typename Packet> - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const - { return internal::pmax(a,b); } - template<typename Packet> - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type predux(const Packet& a) const - { return internal::predux_max(a); } -}; -template<typename LhsScalar,typename RhsScalar> -struct functor_traits<scalar_max_op<LhsScalar,RhsScalar> > { - enum { - Cost = (NumTraits<LhsScalar>::AddCost+NumTraits<RhsScalar>::AddCost)/2, - PacketAccess = internal::is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasMax - }; -}; - -/** \internal - * \brief Template functors for comparison of two scalars - * \todo Implement packet-comparisons - */ -template<typename LhsScalar, typename RhsScalar, ComparisonName cmp> struct scalar_cmp_op; - -template<typename LhsScalar, typename RhsScalar, ComparisonName cmp> -struct functor_traits<scalar_cmp_op<LhsScalar,RhsScalar, cmp> > { - enum { - Cost = (NumTraits<LhsScalar>::AddCost+NumTraits<RhsScalar>::AddCost)/2, - PacketAccess = false - }; -}; - -template<ComparisonName Cmp, typename LhsScalar, typename RhsScalar> -struct result_of<scalar_cmp_op<LhsScalar, RhsScalar, Cmp>(LhsScalar,RhsScalar)> { - typedef bool type; -}; - - -template<typename LhsScalar, typename RhsScalar> -struct scalar_cmp_op<LhsScalar,RhsScalar, cmp_EQ> : binary_op_base<LhsScalar,RhsScalar> -{ - typedef bool result_type; - EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op) - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator()(const LhsScalar& a, const RhsScalar& b) const {return a==b;} -}; -template<typename LhsScalar, typename RhsScalar> -struct scalar_cmp_op<LhsScalar,RhsScalar, cmp_LT> : binary_op_base<LhsScalar,RhsScalar> -{ - typedef bool result_type; - EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op) - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator()(const LhsScalar& a, const RhsScalar& b) const {return a<b;} -}; -template<typename LhsScalar, typename RhsScalar> -struct scalar_cmp_op<LhsScalar,RhsScalar, cmp_LE> : binary_op_base<LhsScalar,RhsScalar> -{ - typedef bool result_type; - EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op) - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator()(const LhsScalar& a, const RhsScalar& b) const {return a<=b;} -}; -template<typename LhsScalar, typename RhsScalar> -struct scalar_cmp_op<LhsScalar,RhsScalar, cmp_GT> : binary_op_base<LhsScalar,RhsScalar> -{ - typedef bool result_type; - EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op) - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator()(const LhsScalar& a, const RhsScalar& b) const {return a>b;} -}; -template<typename LhsScalar, typename RhsScalar> -struct scalar_cmp_op<LhsScalar,RhsScalar, cmp_GE> : binary_op_base<LhsScalar,RhsScalar> -{ - typedef bool result_type; - EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op) - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator()(const LhsScalar& a, const RhsScalar& b) const {return a>=b;} -}; -template<typename LhsScalar, typename RhsScalar> -struct scalar_cmp_op<LhsScalar,RhsScalar, cmp_UNORD> : binary_op_base<LhsScalar,RhsScalar> -{ - typedef bool result_type; - EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op) - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator()(const LhsScalar& a, const RhsScalar& b) const {return !(a<=b || b<=a);} -}; -template<typename LhsScalar, typename RhsScalar> -struct scalar_cmp_op<LhsScalar,RhsScalar, cmp_NEQ> : binary_op_base<LhsScalar,RhsScalar> -{ - typedef bool result_type; - EIGEN_EMPTY_STRUCT_CTOR(scalar_cmp_op) - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator()(const LhsScalar& a, const RhsScalar& b) const {return a!=b;} -}; - - -/** \internal - * \brief Template functor to compute the hypot of two \b positive \b and \b real scalars - * - * \sa MatrixBase::stableNorm(), class Redux - */ -template<typename Scalar> -struct scalar_hypot_op<Scalar,Scalar> : binary_op_base<Scalar,Scalar> -{ - EIGEN_EMPTY_STRUCT_CTOR(scalar_hypot_op) - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar &x, const Scalar &y) const - { - // This functor is used by hypotNorm only for which it is faster to first apply abs - // on all coefficients prior to reduction through hypot. - // This way we avoid calling abs on positive and real entries, and this also permits - // to seamlessly handle complexes. Otherwise we would have to handle both real and complexes - // through the same functor... - return internal::positive_real_hypot(x,y); - } -}; -template<typename Scalar> -struct functor_traits<scalar_hypot_op<Scalar,Scalar> > { - enum - { - Cost = 3 * NumTraits<Scalar>::AddCost + - 2 * NumTraits<Scalar>::MulCost + - 2 * scalar_div_cost<Scalar,false>::value, - PacketAccess = false - }; -}; - -/** \internal - * \brief Template functor to compute the pow of two scalars - */ -template<typename Scalar, typename Exponent> -struct scalar_pow_op : binary_op_base<Scalar,Exponent> -{ - typedef typename ScalarBinaryOpTraits<Scalar,Exponent,scalar_pow_op>::ReturnType result_type; -#ifndef EIGEN_SCALAR_BINARY_OP_PLUGIN - EIGEN_EMPTY_STRUCT_CTOR(scalar_pow_op) -#else - scalar_pow_op() { - typedef Scalar LhsScalar; - typedef Exponent RhsScalar; - EIGEN_SCALAR_BINARY_OP_PLUGIN - } -#endif - EIGEN_DEVICE_FUNC - inline result_type operator() (const Scalar& a, const Exponent& b) const { return numext::pow(a, b); } -}; -template<typename Scalar, typename Exponent> -struct functor_traits<scalar_pow_op<Scalar,Exponent> > { - enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = false }; -}; - - - -//---------- non associative binary functors ---------- - -/** \internal - * \brief Template functor to compute the difference of two scalars - * - * \sa class CwiseBinaryOp, MatrixBase::operator- - */ -template<typename LhsScalar,typename RhsScalar> -struct scalar_difference_op : binary_op_base<LhsScalar,RhsScalar> -{ - typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_difference_op>::ReturnType result_type; -#ifndef EIGEN_SCALAR_BINARY_OP_PLUGIN - EIGEN_EMPTY_STRUCT_CTOR(scalar_difference_op) -#else - scalar_difference_op() { - EIGEN_SCALAR_BINARY_OP_PLUGIN - } -#endif - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const { return a - b; } - template<typename Packet> - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const - { return internal::psub(a,b); } -}; -template<typename LhsScalar,typename RhsScalar> -struct functor_traits<scalar_difference_op<LhsScalar,RhsScalar> > { - enum { - Cost = (NumTraits<LhsScalar>::AddCost+NumTraits<RhsScalar>::AddCost)/2, - PacketAccess = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasSub && packet_traits<RhsScalar>::HasSub - }; -}; - -/** \internal - * \brief Template functor to compute the quotient of two scalars - * - * \sa class CwiseBinaryOp, Cwise::operator/() - */ -template<typename LhsScalar,typename RhsScalar> -struct scalar_quotient_op : binary_op_base<LhsScalar,RhsScalar> -{ - typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_quotient_op>::ReturnType result_type; -#ifndef EIGEN_SCALAR_BINARY_OP_PLUGIN - EIGEN_EMPTY_STRUCT_CTOR(scalar_quotient_op) -#else - scalar_quotient_op() { - EIGEN_SCALAR_BINARY_OP_PLUGIN - } -#endif - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const { return a / b; } - template<typename Packet> - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const - { return internal::pdiv(a,b); } -}; -template<typename LhsScalar,typename RhsScalar> -struct functor_traits<scalar_quotient_op<LhsScalar,RhsScalar> > { - typedef typename scalar_quotient_op<LhsScalar,RhsScalar>::result_type result_type; - enum { - PacketAccess = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasDiv && packet_traits<RhsScalar>::HasDiv, - Cost = scalar_div_cost<result_type,PacketAccess>::value - }; -}; - - - -/** \internal - * \brief Template functor to compute the and of two booleans - * - * \sa class CwiseBinaryOp, ArrayBase::operator&& - */ -struct scalar_boolean_and_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_boolean_and_op) - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator() (const bool& a, const bool& b) const { return a && b; } -}; -template<> struct functor_traits<scalar_boolean_and_op> { - enum { - Cost = NumTraits<bool>::AddCost, - PacketAccess = false - }; -}; - -/** \internal - * \brief Template functor to compute the or of two booleans - * - * \sa class CwiseBinaryOp, ArrayBase::operator|| - */ -struct scalar_boolean_or_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_boolean_or_op) - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator() (const bool& a, const bool& b) const { return a || b; } -}; -template<> struct functor_traits<scalar_boolean_or_op> { - enum { - Cost = NumTraits<bool>::AddCost, - PacketAccess = false - }; -}; - -/** \internal - * \brief Template functor to compute the xor of two booleans - * - * \sa class CwiseBinaryOp, ArrayBase::operator^ - */ -struct scalar_boolean_xor_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_boolean_xor_op) - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator() (const bool& a, const bool& b) const { return a ^ b; } -}; -template<> struct functor_traits<scalar_boolean_xor_op> { - enum { - Cost = NumTraits<bool>::AddCost, - PacketAccess = false - }; -}; - - - -//---------- binary functors bound to a constant, thus appearing as a unary functor ---------- - -// The following two classes permits to turn any binary functor into a unary one with one argument bound to a constant value. -// They are analogues to std::binder1st/binder2nd but with the following differences: -// - they are compatible with packetOp -// - they are portable across C++ versions (the std::binder* are deprecated in C++11) -template<typename BinaryOp> struct bind1st_op : BinaryOp { - - typedef typename BinaryOp::first_argument_type first_argument_type; - typedef typename BinaryOp::second_argument_type second_argument_type; - typedef typename BinaryOp::result_type result_type; - - bind1st_op(const first_argument_type &val) : m_value(val) {} - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const second_argument_type& b) const { return BinaryOp::operator()(m_value,b); } - - template<typename Packet> - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& b) const - { return BinaryOp::packetOp(internal::pset1<Packet>(m_value), b); } - - first_argument_type m_value; -}; -template<typename BinaryOp> struct functor_traits<bind1st_op<BinaryOp> > : functor_traits<BinaryOp> {}; - - -template<typename BinaryOp> struct bind2nd_op : BinaryOp { - - typedef typename BinaryOp::first_argument_type first_argument_type; - typedef typename BinaryOp::second_argument_type second_argument_type; - typedef typename BinaryOp::result_type result_type; - - bind2nd_op(const second_argument_type &val) : m_value(val) {} - - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const first_argument_type& a) const { return BinaryOp::operator()(a,m_value); } - - template<typename Packet> - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const - { return BinaryOp::packetOp(a,internal::pset1<Packet>(m_value)); } - - second_argument_type m_value; -}; -template<typename BinaryOp> struct functor_traits<bind2nd_op<BinaryOp> > : functor_traits<BinaryOp> {}; - - -} // end namespace internal - -} // end namespace Eigen - -#endif // EIGEN_BINARY_FUNCTORS_H diff --git a/eigen/Eigen/src/Core/functors/NullaryFunctors.h b/eigen/Eigen/src/Core/functors/NullaryFunctors.h deleted file mode 100644 index b03be02..0000000 --- a/eigen/Eigen/src/Core/functors/NullaryFunctors.h +++ /dev/null @@ -1,188 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2016 Gael Guennebaud <gael.guennebaud@inria.fr> -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_NULLARY_FUNCTORS_H -#define EIGEN_NULLARY_FUNCTORS_H - -namespace Eigen { - -namespace internal { - -template<typename Scalar> -struct scalar_constant_op { - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE scalar_constant_op(const scalar_constant_op& other) : m_other(other.m_other) { } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE scalar_constant_op(const Scalar& other) : m_other(other) { } - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() () const { return m_other; } - template<typename PacketType> - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const PacketType packetOp() const { return internal::pset1<PacketType>(m_other); } - const Scalar m_other; -}; -template<typename Scalar> -struct functor_traits<scalar_constant_op<Scalar> > -{ enum { Cost = 0 /* as the constant value should be loaded in register only once for the whole expression */, - PacketAccess = packet_traits<Scalar>::Vectorizable, IsRepeatable = true }; }; - -template<typename Scalar> struct scalar_identity_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_identity_op) - template<typename IndexType> - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (IndexType row, IndexType col) const { return row==col ? Scalar(1) : Scalar(0); } -}; -template<typename Scalar> -struct functor_traits<scalar_identity_op<Scalar> > -{ enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = false, IsRepeatable = true }; }; - -template <typename Scalar, typename Packet, bool IsInteger> struct linspaced_op_impl; - -template <typename Scalar, typename Packet> -struct linspaced_op_impl<Scalar,Packet,/*IsInteger*/false> -{ - linspaced_op_impl(const Scalar& low, const Scalar& high, Index num_steps) : - m_low(low), m_high(high), m_size1(num_steps==1 ? 1 : num_steps-1), m_step(num_steps==1 ? Scalar() : (high-low)/Scalar(num_steps-1)), - m_flip(numext::abs(high)<numext::abs(low)) - {} - - template<typename IndexType> - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (IndexType i) const { - typedef typename NumTraits<Scalar>::Real RealScalar; - if(m_flip) - return (i==0)? m_low : (m_high - RealScalar(m_size1-i)*m_step); - else - return (i==m_size1)? m_high : (m_low + RealScalar(i)*m_step); - } - - template<typename IndexType> - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(IndexType i) const - { - // Principle: - // [low, ..., low] + ( [step, ..., step] * ( [i, ..., i] + [0, ..., size] ) ) - if(m_flip) - { - Packet pi = plset<Packet>(Scalar(i-m_size1)); - Packet res = padd(pset1<Packet>(m_high), pmul(pset1<Packet>(m_step), pi)); - if(i==0) - res = pinsertfirst(res, m_low); - return res; - } - else - { - Packet pi = plset<Packet>(Scalar(i)); - Packet res = padd(pset1<Packet>(m_low), pmul(pset1<Packet>(m_step), pi)); - if(i==m_size1-unpacket_traits<Packet>::size+1) - res = pinsertlast(res, m_high); - return res; - } - } - - const Scalar m_low; - const Scalar m_high; - const Index m_size1; - const Scalar m_step; - const bool m_flip; -}; - -template <typename Scalar, typename Packet> -struct linspaced_op_impl<Scalar,Packet,/*IsInteger*/true> -{ - linspaced_op_impl(const Scalar& low, const Scalar& high, Index num_steps) : - m_low(low), - m_multiplier((high-low)/convert_index<Scalar>(num_steps<=1 ? 1 : num_steps-1)), - m_divisor(convert_index<Scalar>((high>=low?num_steps:-num_steps)+(high-low))/((numext::abs(high-low)+1)==0?1:(numext::abs(high-low)+1))), - m_use_divisor(num_steps>1 && (numext::abs(high-low)+1)<num_steps) - {} - - template<typename IndexType> - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const Scalar operator() (IndexType i) const - { - if(m_use_divisor) return m_low + convert_index<Scalar>(i)/m_divisor; - else return m_low + convert_index<Scalar>(i)*m_multiplier; - } - - const Scalar m_low; - const Scalar m_multiplier; - const Scalar m_divisor; - const bool m_use_divisor; -}; - -// ----- Linspace functor ---------------------------------------------------------------- - -// Forward declaration (we default to random access which does not really give -// us a speed gain when using packet access but it allows to use the functor in -// nested expressions). -template <typename Scalar, typename PacketType> struct linspaced_op; -template <typename Scalar, typename PacketType> struct functor_traits< linspaced_op<Scalar,PacketType> > -{ - enum - { - Cost = 1, - PacketAccess = (!NumTraits<Scalar>::IsInteger) && packet_traits<Scalar>::HasSetLinear && packet_traits<Scalar>::HasBlend, - /*&& ((!NumTraits<Scalar>::IsInteger) || packet_traits<Scalar>::HasDiv),*/ // <- vectorization for integer is currently disabled - IsRepeatable = true - }; -}; -template <typename Scalar, typename PacketType> struct linspaced_op -{ - linspaced_op(const Scalar& low, const Scalar& high, Index num_steps) - : impl((num_steps==1 ? high : low),high,num_steps) - {} - - template<typename IndexType> - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (IndexType i) const { return impl(i); } - - template<typename Packet,typename IndexType> - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(IndexType i) const { return impl.packetOp(i); } - - // This proxy object handles the actual required temporaries and the different - // implementations (integer vs. floating point). - const linspaced_op_impl<Scalar,PacketType,NumTraits<Scalar>::IsInteger> impl; -}; - -// Linear access is automatically determined from the operator() prototypes available for the given functor. -// If it exposes an operator()(i,j), then we assume the i and j coefficients are required independently -// and linear access is not possible. In all other cases, linear access is enabled. -// Users should not have to deal with this structure. -template<typename Functor> struct functor_has_linear_access { enum { ret = !has_binary_operator<Functor>::value }; }; - -// For unreliable compilers, let's specialize the has_*ary_operator -// helpers so that at least built-in nullary functors work fine. -#if !( (EIGEN_COMP_MSVC>1600) || (EIGEN_GNUC_AT_LEAST(4,8)) || (EIGEN_COMP_ICC>=1600)) -template<typename Scalar,typename IndexType> -struct has_nullary_operator<scalar_constant_op<Scalar>,IndexType> { enum { value = 1}; }; -template<typename Scalar,typename IndexType> -struct has_unary_operator<scalar_constant_op<Scalar>,IndexType> { enum { value = 0}; }; -template<typename Scalar,typename IndexType> -struct has_binary_operator<scalar_constant_op<Scalar>,IndexType> { enum { value = 0}; }; - -template<typename Scalar,typename IndexType> -struct has_nullary_operator<scalar_identity_op<Scalar>,IndexType> { enum { value = 0}; }; -template<typename Scalar,typename IndexType> -struct has_unary_operator<scalar_identity_op<Scalar>,IndexType> { enum { value = 0}; }; -template<typename Scalar,typename IndexType> -struct has_binary_operator<scalar_identity_op<Scalar>,IndexType> { enum { value = 1}; }; - -template<typename Scalar, typename PacketType,typename IndexType> -struct has_nullary_operator<linspaced_op<Scalar,PacketType>,IndexType> { enum { value = 0}; }; -template<typename Scalar, typename PacketType,typename IndexType> -struct has_unary_operator<linspaced_op<Scalar,PacketType>,IndexType> { enum { value = 1}; }; -template<typename Scalar, typename PacketType,typename IndexType> -struct has_binary_operator<linspaced_op<Scalar,PacketType>,IndexType> { enum { value = 0}; }; - -template<typename Scalar,typename IndexType> -struct has_nullary_operator<scalar_random_op<Scalar>,IndexType> { enum { value = 1}; }; -template<typename Scalar,typename IndexType> -struct has_unary_operator<scalar_random_op<Scalar>,IndexType> { enum { value = 0}; }; -template<typename Scalar,typename IndexType> -struct has_binary_operator<scalar_random_op<Scalar>,IndexType> { enum { value = 0}; }; -#endif - -} // end namespace internal - -} // end namespace Eigen - -#endif // EIGEN_NULLARY_FUNCTORS_H diff --git a/eigen/Eigen/src/Core/functors/StlFunctors.h b/eigen/Eigen/src/Core/functors/StlFunctors.h deleted file mode 100644 index 9c1d758..0000000 --- a/eigen/Eigen/src/Core/functors/StlFunctors.h +++ /dev/null @@ -1,136 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr> -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_STL_FUNCTORS_H -#define EIGEN_STL_FUNCTORS_H - -namespace Eigen { - -namespace internal { - -// default functor traits for STL functors: - -template<typename T> -struct functor_traits<std::multiplies<T> > -{ enum { Cost = NumTraits<T>::MulCost, PacketAccess = false }; }; - -template<typename T> -struct functor_traits<std::divides<T> > -{ enum { Cost = NumTraits<T>::MulCost, PacketAccess = false }; }; - -template<typename T> -struct functor_traits<std::plus<T> > -{ enum { Cost = NumTraits<T>::AddCost, PacketAccess = false }; }; - -template<typename T> -struct functor_traits<std::minus<T> > -{ enum { Cost = NumTraits<T>::AddCost, PacketAccess = false }; }; - -template<typename T> -struct functor_traits<std::negate<T> > -{ enum { Cost = NumTraits<T>::AddCost, PacketAccess = false }; }; - -template<typename T> -struct functor_traits<std::logical_or<T> > -{ enum { Cost = 1, PacketAccess = false }; }; - -template<typename T> -struct functor_traits<std::logical_and<T> > -{ enum { Cost = 1, PacketAccess = false }; }; - -template<typename T> -struct functor_traits<std::logical_not<T> > -{ enum { Cost = 1, PacketAccess = false }; }; - -template<typename T> -struct functor_traits<std::greater<T> > -{ enum { Cost = 1, PacketAccess = false }; }; - -template<typename T> -struct functor_traits<std::less<T> > -{ enum { Cost = 1, PacketAccess = false }; }; - -template<typename T> -struct functor_traits<std::greater_equal<T> > -{ enum { Cost = 1, PacketAccess = false }; }; - -template<typename T> -struct functor_traits<std::less_equal<T> > -{ enum { Cost = 1, PacketAccess = false }; }; - -template<typename T> -struct functor_traits<std::equal_to<T> > -{ enum { Cost = 1, PacketAccess = false }; }; - -template<typename T> -struct functor_traits<std::not_equal_to<T> > -{ enum { Cost = 1, PacketAccess = false }; }; - -#if (__cplusplus < 201103L) && (EIGEN_COMP_MSVC <= 1900) -// std::binder* are deprecated since c++11 and will be removed in c++17 -template<typename T> -struct functor_traits<std::binder2nd<T> > -{ enum { Cost = functor_traits<T>::Cost, PacketAccess = false }; }; - -template<typename T> -struct functor_traits<std::binder1st<T> > -{ enum { Cost = functor_traits<T>::Cost, PacketAccess = false }; }; -#endif - -#if (__cplusplus < 201703L) && (EIGEN_COMP_MSVC < 1910) -// std::unary_negate is deprecated since c++17 and will be removed in c++20 -template<typename T> -struct functor_traits<std::unary_negate<T> > -{ enum { Cost = 1 + functor_traits<T>::Cost, PacketAccess = false }; }; - -// std::binary_negate is deprecated since c++17 and will be removed in c++20 -template<typename T> -struct functor_traits<std::binary_negate<T> > -{ enum { Cost = 1 + functor_traits<T>::Cost, PacketAccess = false }; }; -#endif - -#ifdef EIGEN_STDEXT_SUPPORT - -template<typename T0,typename T1> -struct functor_traits<std::project1st<T0,T1> > -{ enum { Cost = 0, PacketAccess = false }; }; - -template<typename T0,typename T1> -struct functor_traits<std::project2nd<T0,T1> > -{ enum { Cost = 0, PacketAccess = false }; }; - -template<typename T0,typename T1> -struct functor_traits<std::select2nd<std::pair<T0,T1> > > -{ enum { Cost = 0, PacketAccess = false }; }; - -template<typename T0,typename T1> -struct functor_traits<std::select1st<std::pair<T0,T1> > > -{ enum { Cost = 0, PacketAccess = false }; }; - -template<typename T0,typename T1> -struct functor_traits<std::unary_compose<T0,T1> > -{ enum { Cost = functor_traits<T0>::Cost + functor_traits<T1>::Cost, PacketAccess = false }; }; - -template<typename T0,typename T1,typename T2> -struct functor_traits<std::binary_compose<T0,T1,T2> > -{ enum { Cost = functor_traits<T0>::Cost + functor_traits<T1>::Cost + functor_traits<T2>::Cost, PacketAccess = false }; }; - -#endif // EIGEN_STDEXT_SUPPORT - -// allow to add new functors and specializations of functor_traits from outside Eigen. -// this macro is really needed because functor_traits must be specialized after it is declared but before it is used... -#ifdef EIGEN_FUNCTORS_PLUGIN -#include EIGEN_FUNCTORS_PLUGIN -#endif - -} // end namespace internal - -} // end namespace Eigen - -#endif // EIGEN_STL_FUNCTORS_H diff --git a/eigen/Eigen/src/Core/functors/TernaryFunctors.h b/eigen/Eigen/src/Core/functors/TernaryFunctors.h deleted file mode 100644 index b254e96..0000000 --- a/eigen/Eigen/src/Core/functors/TernaryFunctors.h +++ /dev/null @@ -1,25 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2016 Eugene Brevdo <ebrevdo@gmail.com> -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_TERNARY_FUNCTORS_H -#define EIGEN_TERNARY_FUNCTORS_H - -namespace Eigen { - -namespace internal { - -//---------- associative ternary functors ---------- - - - -} // end namespace internal - -} // end namespace Eigen - -#endif // EIGEN_TERNARY_FUNCTORS_H diff --git a/eigen/Eigen/src/Core/functors/UnaryFunctors.h b/eigen/Eigen/src/Core/functors/UnaryFunctors.h deleted file mode 100644 index 2e6a00f..0000000 --- a/eigen/Eigen/src/Core/functors/UnaryFunctors.h +++ /dev/null @@ -1,792 +0,0 @@ -// This file is part of Eigen, a lightweight C++ template library -// for linear algebra. -// -// Copyright (C) 2008-2016 Gael Guennebaud <gael.guennebaud@inria.fr> -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#ifndef EIGEN_UNARY_FUNCTORS_H -#define EIGEN_UNARY_FUNCTORS_H - -namespace Eigen { - -namespace internal { - -/** \internal - * \brief Template functor to compute the opposite of a scalar - * - * \sa class CwiseUnaryOp, MatrixBase::operator- - */ -template<typename Scalar> struct scalar_opposite_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_opposite_op) - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const { return -a; } - template<typename Packet> - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const - { return internal::pnegate(a); } -}; -template<typename Scalar> -struct functor_traits<scalar_opposite_op<Scalar> > -{ enum { - Cost = NumTraits<Scalar>::AddCost, - PacketAccess = packet_traits<Scalar>::HasNegate }; -}; - -/** \internal - * \brief Template functor to compute the absolute value of a scalar - * - * \sa class CwiseUnaryOp, Cwise::abs - */ -template<typename Scalar> struct scalar_abs_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_abs_op) - typedef typename NumTraits<Scalar>::Real result_type; - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const Scalar& a) const { return numext::abs(a); } - template<typename Packet> - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const - { return internal::pabs(a); } -}; -template<typename Scalar> -struct functor_traits<scalar_abs_op<Scalar> > -{ - enum { - Cost = NumTraits<Scalar>::AddCost, - PacketAccess = packet_traits<Scalar>::HasAbs - }; -}; - -/** \internal - * \brief Template functor to compute the score of a scalar, to chose a pivot - * - * \sa class CwiseUnaryOp - */ -template<typename Scalar> struct scalar_score_coeff_op : scalar_abs_op<Scalar> -{ - typedef void Score_is_abs; -}; -template<typename Scalar> -struct functor_traits<scalar_score_coeff_op<Scalar> > : functor_traits<scalar_abs_op<Scalar> > {}; - -/* Avoid recomputing abs when we know the score and they are the same. Not a true Eigen functor. */ -template<typename Scalar, typename=void> struct abs_knowing_score -{ - EIGEN_EMPTY_STRUCT_CTOR(abs_knowing_score) - typedef typename NumTraits<Scalar>::Real result_type; - template<typename Score> - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const Scalar& a, const Score&) const { return numext::abs(a); } -}; -template<typename Scalar> struct abs_knowing_score<Scalar, typename scalar_score_coeff_op<Scalar>::Score_is_abs> -{ - EIGEN_EMPTY_STRUCT_CTOR(abs_knowing_score) - typedef typename NumTraits<Scalar>::Real result_type; - template<typename Scal> - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const Scal&, const result_type& a) const { return a; } -}; - -/** \internal - * \brief Template functor to compute the squared absolute value of a scalar - * - * \sa class CwiseUnaryOp, Cwise::abs2 - */ -template<typename Scalar> struct scalar_abs2_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_abs2_op) - typedef typename NumTraits<Scalar>::Real result_type; - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const result_type operator() (const Scalar& a) const { return numext::abs2(a); } - template<typename Packet> - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const - { return internal::pmul(a,a); } -}; -template<typename Scalar> -struct functor_traits<scalar_abs2_op<Scalar> > -{ enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasAbs2 }; }; - -/** \internal - * \brief Template functor to compute the conjugate of a complex value - * - * \sa class CwiseUnaryOp, MatrixBase::conjugate() - */ -template<typename Scalar> struct scalar_conjugate_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_conjugate_op) - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const { using numext::conj; return conj(a); } - template<typename Packet> - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const { return internal::pconj(a); } -}; -template<typename Scalar> -struct functor_traits<scalar_conjugate_op<Scalar> > -{ - enum { - Cost = NumTraits<Scalar>::IsComplex ? NumTraits<Scalar>::AddCost : 0, - PacketAccess = packet_traits<Scalar>::HasConj - }; -}; - -/** \internal - * \brief Template functor to compute the phase angle of a complex - * - * \sa class CwiseUnaryOp, Cwise::arg - */ -template<typename Scalar> struct scalar_arg_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_arg_op) - typedef typename NumTraits<Scalar>::Real result_type; - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const Scalar& a) const { using numext::arg; return arg(a); } - template<typename Packet> - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const - { return internal::parg(a); } -}; -template<typename Scalar> -struct functor_traits<scalar_arg_op<Scalar> > -{ - enum { - Cost = NumTraits<Scalar>::IsComplex ? 5 * NumTraits<Scalar>::MulCost : NumTraits<Scalar>::AddCost, - PacketAccess = packet_traits<Scalar>::HasArg - }; -}; -/** \internal - * \brief Template functor to cast a scalar to another type - * - * \sa class CwiseUnaryOp, MatrixBase::cast() - */ -template<typename Scalar, typename NewType> -struct scalar_cast_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_cast_op) - typedef NewType result_type; - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const NewType operator() (const Scalar& a) const { return cast<Scalar, NewType>(a); } -}; -template<typename Scalar, typename NewType> -struct functor_traits<scalar_cast_op<Scalar,NewType> > -{ enum { Cost = is_same<Scalar, NewType>::value ? 0 : NumTraits<NewType>::AddCost, PacketAccess = false }; }; - -/** \internal - * \brief Template functor to extract the real part of a complex - * - * \sa class CwiseUnaryOp, MatrixBase::real() - */ -template<typename Scalar> -struct scalar_real_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_real_op) - typedef typename NumTraits<Scalar>::Real result_type; - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const { return numext::real(a); } -}; -template<typename Scalar> -struct functor_traits<scalar_real_op<Scalar> > -{ enum { Cost = 0, PacketAccess = false }; }; - -/** \internal - * \brief Template functor to extract the imaginary part of a complex - * - * \sa class CwiseUnaryOp, MatrixBase::imag() - */ -template<typename Scalar> -struct scalar_imag_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_imag_op) - typedef typename NumTraits<Scalar>::Real result_type; - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const { return numext::imag(a); } -}; -template<typename Scalar> -struct functor_traits<scalar_imag_op<Scalar> > -{ enum { Cost = 0, PacketAccess = false }; }; - -/** \internal - * \brief Template functor to extract the real part of a complex as a reference - * - * \sa class CwiseUnaryOp, MatrixBase::real() - */ -template<typename Scalar> -struct scalar_real_ref_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_real_ref_op) - typedef typename NumTraits<Scalar>::Real result_type; - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE result_type& operator() (const Scalar& a) const { return numext::real_ref(*const_cast<Scalar*>(&a)); } -}; -template<typename Scalar> -struct functor_traits<scalar_real_ref_op<Scalar> > -{ enum { Cost = 0, PacketAccess = false }; }; - -/** \internal - * \brief Template functor to extract the imaginary part of a complex as a reference - * - * \sa class CwiseUnaryOp, MatrixBase::imag() - */ -template<typename Scalar> -struct scalar_imag_ref_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_imag_ref_op) - typedef typename NumTraits<Scalar>::Real result_type; - EIGEN_DEVICE_FUNC - EIGEN_STRONG_INLINE result_type& operator() (const Scalar& a) const { return numext::imag_ref(*const_cast<Scalar*>(&a)); } -}; -template<typename Scalar> -struct functor_traits<scalar_imag_ref_op<Scalar> > -{ enum { Cost = 0, PacketAccess = false }; }; - -/** \internal - * - * \brief Template functor to compute the exponential of a scalar - * - * \sa class CwiseUnaryOp, Cwise::exp() - */ -template<typename Scalar> struct scalar_exp_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_exp_op) - EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return numext::exp(a); } - template <typename Packet> - EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pexp(a); } -}; -template <typename Scalar> -struct functor_traits<scalar_exp_op<Scalar> > { - enum { - PacketAccess = packet_traits<Scalar>::HasExp, - // The following numbers are based on the AVX implementation. -#ifdef EIGEN_VECTORIZE_FMA - // Haswell can issue 2 add/mul/madd per cycle. - Cost = - (sizeof(Scalar) == 4 - // float: 8 pmadd, 4 pmul, 2 padd/psub, 6 other - ? (8 * NumTraits<Scalar>::AddCost + 6 * NumTraits<Scalar>::MulCost) - // double: 7 pmadd, 5 pmul, 3 padd/psub, 1 div, 13 other - : (14 * NumTraits<Scalar>::AddCost + - 6 * NumTraits<Scalar>::MulCost + - scalar_div_cost<Scalar,packet_traits<Scalar>::HasDiv>::value)) -#else - Cost = - (sizeof(Scalar) == 4 - // float: 7 pmadd, 6 pmul, 4 padd/psub, 10 other - ? (21 * NumTraits<Scalar>::AddCost + 13 * NumTraits<Scalar>::MulCost) - // double: 7 pmadd, 5 pmul, 3 padd/psub, 1 div, 13 other - : (23 * NumTraits<Scalar>::AddCost + - 12 * NumTraits<Scalar>::MulCost + - scalar_div_cost<Scalar,packet_traits<Scalar>::HasDiv>::value)) -#endif - }; -}; - -/** \internal - * - * \brief Template functor to compute the logarithm of a scalar - * - * \sa class CwiseUnaryOp, ArrayBase::log() - */ -template<typename Scalar> struct scalar_log_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_log_op) - EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return numext::log(a); } - template <typename Packet> - EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::plog(a); } -}; -template <typename Scalar> -struct functor_traits<scalar_log_op<Scalar> > { - enum { - PacketAccess = packet_traits<Scalar>::HasLog, - Cost = - (PacketAccess - // The following numbers are based on the AVX implementation. -#ifdef EIGEN_VECTORIZE_FMA - // 8 pmadd, 6 pmul, 8 padd/psub, 16 other, can issue 2 add/mul/madd per cycle. - ? (20 * NumTraits<Scalar>::AddCost + 7 * NumTraits<Scalar>::MulCost) -#else - // 8 pmadd, 6 pmul, 8 padd/psub, 20 other - ? (36 * NumTraits<Scalar>::AddCost + 14 * NumTraits<Scalar>::MulCost) -#endif - // Measured cost of std::log. - : sizeof(Scalar)==4 ? 40 : 85) - }; -}; - -/** \internal - * - * \brief Template functor to compute the logarithm of 1 plus a scalar value - * - * \sa class CwiseUnaryOp, ArrayBase::log1p() - */ -template<typename Scalar> struct scalar_log1p_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_log1p_op) - EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return numext::log1p(a); } - template <typename Packet> - EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::plog1p(a); } -}; -template <typename Scalar> -struct functor_traits<scalar_log1p_op<Scalar> > { - enum { - PacketAccess = packet_traits<Scalar>::HasLog1p, - Cost = functor_traits<scalar_log_op<Scalar> >::Cost // TODO measure cost of log1p - }; -}; - -/** \internal - * - * \brief Template functor to compute the base-10 logarithm of a scalar - * - * \sa class CwiseUnaryOp, Cwise::log10() - */ -template<typename Scalar> struct scalar_log10_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_log10_op) - EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { EIGEN_USING_STD_MATH(log10) return log10(a); } - template <typename Packet> - EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::plog10(a); } -}; -template<typename Scalar> -struct functor_traits<scalar_log10_op<Scalar> > -{ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasLog10 }; }; - -/** \internal - * \brief Template functor to compute the square root of a scalar - * \sa class CwiseUnaryOp, Cwise::sqrt() - */ -template<typename Scalar> struct scalar_sqrt_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_sqrt_op) - EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return numext::sqrt(a); } - template <typename Packet> - EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::psqrt(a); } -}; -template <typename Scalar> -struct functor_traits<scalar_sqrt_op<Scalar> > { - enum { -#if EIGEN_FAST_MATH - // The following numbers are based on the AVX implementation. - Cost = (sizeof(Scalar) == 8 ? 28 - // 4 pmul, 1 pmadd, 3 other - : (3 * NumTraits<Scalar>::AddCost + - 5 * NumTraits<Scalar>::MulCost)), -#else - // The following numbers are based on min VSQRT throughput on Haswell. - Cost = (sizeof(Scalar) == 8 ? 28 : 14), -#endif - PacketAccess = packet_traits<Scalar>::HasSqrt - }; -}; - -/** \internal - * \brief Template functor to compute the reciprocal square root of a scalar - * \sa class CwiseUnaryOp, Cwise::rsqrt() - */ -template<typename Scalar> struct scalar_rsqrt_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_rsqrt_op) - EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return Scalar(1)/numext::sqrt(a); } - template <typename Packet> - EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::prsqrt(a); } -}; - -template<typename Scalar> -struct functor_traits<scalar_rsqrt_op<Scalar> > -{ enum { - Cost = 5 * NumTraits<Scalar>::MulCost, - PacketAccess = packet_traits<Scalar>::HasRsqrt - }; -}; - -/** \internal - * \brief Template functor to compute the cosine of a scalar - * \sa class CwiseUnaryOp, ArrayBase::cos() - */ -template<typename Scalar> struct scalar_cos_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_cos_op) - EIGEN_DEVICE_FUNC inline Scalar operator() (const Scalar& a) const { return numext::cos(a); } - template <typename Packet> - EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pcos(a); } -}; -template<typename Scalar> -struct functor_traits<scalar_cos_op<Scalar> > -{ - enum { - Cost = 5 * NumTraits<Scalar>::MulCost, - PacketAccess = packet_traits<Scalar>::HasCos - }; -}; - -/** \internal - * \brief Template functor to compute the sine of a scalar - * \sa class CwiseUnaryOp, ArrayBase::sin() - */ -template<typename Scalar> struct scalar_sin_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_sin_op) - EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return numext::sin(a); } - template <typename Packet> - EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::psin(a); } -}; -template<typename Scalar> -struct functor_traits<scalar_sin_op<Scalar> > -{ - enum { - Cost = 5 * NumTraits<Scalar>::MulCost, - PacketAccess = packet_traits<Scalar>::HasSin - }; -}; - - -/** \internal - * \brief Template functor to compute the tan of a scalar - * \sa class CwiseUnaryOp, ArrayBase::tan() - */ -template<typename Scalar> struct scalar_tan_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_tan_op) - EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return numext::tan(a); } - template <typename Packet> - EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::ptan(a); } -}; -template<typename Scalar> -struct functor_traits<scalar_tan_op<Scalar> > -{ - enum { - Cost = 5 * NumTraits<Scalar>::MulCost, - PacketAccess = packet_traits<Scalar>::HasTan - }; -}; - -/** \internal - * \brief Template functor to compute the arc cosine of a scalar - * \sa class CwiseUnaryOp, ArrayBase::acos() - */ -template<typename Scalar> struct scalar_acos_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_acos_op) - EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return numext::acos(a); } - template <typename Packet> - EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pacos(a); } -}; -template<typename Scalar> -struct functor_traits<scalar_acos_op<Scalar> > -{ - enum { - Cost = 5 * NumTraits<Scalar>::MulCost, - PacketAccess = packet_traits<Scalar>::HasACos - }; -}; - -/** \internal - * \brief Template functor to compute the arc sine of a scalar - * \sa class CwiseUnaryOp, ArrayBase::asin() - */ -template<typename Scalar> struct scalar_asin_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_asin_op) - EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return numext::asin(a); } - template <typename Packet> - EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pasin(a); } -}; -template<typename Scalar> -struct functor_traits<scalar_asin_op<Scalar> > -{ - enum { - Cost = 5 * NumTraits<Scalar>::MulCost, - PacketAccess = packet_traits<Scalar>::HasASin - }; -}; - - -/** \internal - * \brief Template functor to compute the atan of a scalar - * \sa class CwiseUnaryOp, ArrayBase::atan() - */ -template<typename Scalar> struct scalar_atan_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_atan_op) - EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return numext::atan(a); } - template <typename Packet> - EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::patan(a); } -}; -template<typename Scalar> -struct functor_traits<scalar_atan_op<Scalar> > -{ - enum { - Cost = 5 * NumTraits<Scalar>::MulCost, - PacketAccess = packet_traits<Scalar>::HasATan - }; -}; - -/** \internal - * \brief Template functor to compute the tanh of a scalar - * \sa class CwiseUnaryOp, ArrayBase::tanh() - */ -template <typename Scalar> -struct scalar_tanh_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_tanh_op) - EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::tanh(a); } - template <typename Packet> - EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& x) const { return ptanh(x); } -}; - -template <typename Scalar> -struct functor_traits<scalar_tanh_op<Scalar> > { - enum { - PacketAccess = packet_traits<Scalar>::HasTanh, - Cost = ( (EIGEN_FAST_MATH && is_same<Scalar,float>::value) -// The following numbers are based on the AVX implementation, -#ifdef EIGEN_VECTORIZE_FMA - // Haswell can issue 2 add/mul/madd per cycle. - // 9 pmadd, 2 pmul, 1 div, 2 other - ? (2 * NumTraits<Scalar>::AddCost + - 6 * NumTraits<Scalar>::MulCost + - scalar_div_cost<Scalar,packet_traits<Scalar>::HasDiv>::value) -#else - ? (11 * NumTraits<Scalar>::AddCost + - 11 * NumTraits<Scalar>::MulCost + - scalar_div_cost<Scalar,packet_traits<Scalar>::HasDiv>::value) -#endif - // This number assumes a naive implementation of tanh - : (6 * NumTraits<Scalar>::AddCost + - 3 * NumTraits<Scalar>::MulCost + - 2 * scalar_div_cost<Scalar,packet_traits<Scalar>::HasDiv>::value + - functor_traits<scalar_exp_op<Scalar> >::Cost)) - }; -}; - -/** \internal - * \brief Template functor to compute the sinh of a scalar - * \sa class CwiseUnaryOp, ArrayBase::sinh() - */ -template<typename Scalar> struct scalar_sinh_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_sinh_op) - EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return numext::sinh(a); } - template <typename Packet> - EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::psinh(a); } -}; -template<typename Scalar> -struct functor_traits<scalar_sinh_op<Scalar> > -{ - enum { - Cost = 5 * NumTraits<Scalar>::MulCost, - PacketAccess = packet_traits<Scalar>::HasSinh - }; -}; - -/** \internal - * \brief Template functor to compute the cosh of a scalar - * \sa class CwiseUnaryOp, ArrayBase::cosh() - */ -template<typename Scalar> struct scalar_cosh_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_cosh_op) - EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return numext::cosh(a); } - template <typename Packet> - EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pcosh(a); } -}; -template<typename Scalar> -struct functor_traits<scalar_cosh_op<Scalar> > -{ - enum { - Cost = 5 * NumTraits<Scalar>::MulCost, - PacketAccess = packet_traits<Scalar>::HasCosh - }; -}; - -/** \internal - * \brief Template functor to compute the inverse of a scalar - * \sa class CwiseUnaryOp, Cwise::inverse() - */ -template<typename Scalar> -struct scalar_inverse_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_inverse_op) - EIGEN_DEVICE_FUNC inline Scalar operator() (const Scalar& a) const { return Scalar(1)/a; } - template<typename Packet> - EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const - { return internal::pdiv(pset1<Packet>(Scalar(1)),a); } -}; -template<typename Scalar> -struct functor_traits<scalar_inverse_op<Scalar> > -{ enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasDiv }; }; - -/** \internal - * \brief Template functor to compute the square of a scalar - * \sa class CwiseUnaryOp, Cwise::square() - */ -template<typename Scalar> -struct scalar_square_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_square_op) - EIGEN_DEVICE_FUNC inline Scalar operator() (const Scalar& a) const { return a*a; } - template<typename Packet> - EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const - { return internal::pmul(a,a); } -}; -template<typename Scalar> -struct functor_traits<scalar_square_op<Scalar> > -{ enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; }; - -/** \internal - * \brief Template functor to compute the cube of a scalar - * \sa class CwiseUnaryOp, Cwise::cube() - */ -template<typename Scalar> -struct scalar_cube_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_cube_op) - EIGEN_DEVICE_FUNC inline Scalar operator() (const Scalar& a) const { return a*a*a; } - template<typename Packet> - EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const - { return internal::pmul(a,pmul(a,a)); } -}; -template<typename Scalar> -struct functor_traits<scalar_cube_op<Scalar> > -{ enum { Cost = 2*NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; }; - -/** \internal - * \brief Template functor to compute the rounded value of a scalar - * \sa class CwiseUnaryOp, ArrayBase::round() - */ -template<typename Scalar> struct scalar_round_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_round_op) - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const { return numext::round(a); } - template <typename Packet> - EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pround(a); } -}; -template<typename Scalar> -struct functor_traits<scalar_round_op<Scalar> > -{ - enum { - Cost = NumTraits<Scalar>::MulCost, - PacketAccess = packet_traits<Scalar>::HasRound - }; -}; - -/** \internal - * \brief Template functor to compute the floor of a scalar - * \sa class CwiseUnaryOp, ArrayBase::floor() - */ -template<typename Scalar> struct scalar_floor_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_floor_op) - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const { return numext::floor(a); } - template <typename Packet> - EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pfloor(a); } -}; -template<typename Scalar> -struct functor_traits<scalar_floor_op<Scalar> > -{ - enum { - Cost = NumTraits<Scalar>::MulCost, - PacketAccess = packet_traits<Scalar>::HasFloor - }; -}; - -/** \internal - * \brief Template functor to compute the ceil of a scalar - * \sa class CwiseUnaryOp, ArrayBase::ceil() - */ -template<typename Scalar> struct scalar_ceil_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_ceil_op) - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const { return numext::ceil(a); } - template <typename Packet> - EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pceil(a); } -}; -template<typename Scalar> -struct functor_traits<scalar_ceil_op<Scalar> > -{ - enum { - Cost = NumTraits<Scalar>::MulCost, - PacketAccess = packet_traits<Scalar>::HasCeil - }; -}; - -/** \internal - * \brief Template functor to compute whether a scalar is NaN - * \sa class CwiseUnaryOp, ArrayBase::isnan() - */ -template<typename Scalar> struct scalar_isnan_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_isnan_op) - typedef bool result_type; - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const { return (numext::isnan)(a); } -}; -template<typename Scalar> -struct functor_traits<scalar_isnan_op<Scalar> > -{ - enum { - Cost = NumTraits<Scalar>::MulCost, - PacketAccess = false - }; -}; - -/** \internal - * \brief Template functor to check whether a scalar is +/-inf - * \sa class CwiseUnaryOp, ArrayBase::isinf() - */ -template<typename Scalar> struct scalar_isinf_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_isinf_op) - typedef bool result_type; - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const { return (numext::isinf)(a); } -}; -template<typename Scalar> -struct functor_traits<scalar_isinf_op<Scalar> > -{ - enum { - Cost = NumTraits<Scalar>::MulCost, - PacketAccess = false - }; -}; - -/** \internal - * \brief Template functor to check whether a scalar has a finite value - * \sa class CwiseUnaryOp, ArrayBase::isfinite() - */ -template<typename Scalar> struct scalar_isfinite_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_isfinite_op) - typedef bool result_type; - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const { return (numext::isfinite)(a); } -}; -template<typename Scalar> -struct functor_traits<scalar_isfinite_op<Scalar> > -{ - enum { - Cost = NumTraits<Scalar>::MulCost, - PacketAccess = false - }; -}; - -/** \internal - * \brief Template functor to compute the logical not of a boolean - * - * \sa class CwiseUnaryOp, ArrayBase::operator! - */ -template<typename Scalar> struct scalar_boolean_not_op { - EIGEN_EMPTY_STRUCT_CTOR(scalar_boolean_not_op) - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator() (const bool& a) const { return !a; } -}; -template<typename Scalar> -struct functor_traits<scalar_boolean_not_op<Scalar> > { - enum { - Cost = NumTraits<bool>::AddCost, - PacketAccess = false - }; -}; - -/** \internal - * \brief Template functor to compute the signum of a scalar - * \sa class CwiseUnaryOp, Cwise::sign() - */ -template<typename Scalar,bool iscpx=(NumTraits<Scalar>::IsComplex!=0) > struct scalar_sign_op; -template<typename Scalar> -struct scalar_sign_op<Scalar,false> { - EIGEN_EMPTY_STRUCT_CTOR(scalar_sign_op) - EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const - { - return Scalar( (a>Scalar(0)) - (a<Scalar(0)) ); - } - //TODO - //template <typename Packet> - //EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::psign(a); } -}; -template<typename Scalar> -struct scalar_sign_op<Scalar,true> { - EIGEN_EMPTY_STRUCT_CTOR(scalar_sign_op) - EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const - { - typedef typename NumTraits<Scalar>::Real real_type; - real_type aa = numext::abs(a); - if (aa==real_type(0)) - return Scalar(0); - aa = real_type(1)/aa; - return Scalar(real(a)*aa, imag(a)*aa ); - } - //TODO - //template <typename Packet> - //EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::psign(a); } -}; -template<typename Scalar> -struct functor_traits<scalar_sign_op<Scalar> > -{ enum { - Cost = - NumTraits<Scalar>::IsComplex - ? ( 8*NumTraits<Scalar>::MulCost ) // roughly - : ( 3*NumTraits<Scalar>::AddCost), - PacketAccess = packet_traits<Scalar>::HasSign - }; -}; - -} // end namespace internal - -} // end namespace Eigen - -#endif // EIGEN_FUNCTORS_H |
