1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library 2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra. 3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr> 5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla 7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed 8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_FUNCTORS_H 11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_FUNCTORS_H 12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen { 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal { 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// associative functors: 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the sum of two scalars 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseBinaryOp, MatrixBase::operator+, class VectorwiseOp, MatrixBase::sum() 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_sum_op { 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_sum_op) 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a, const Scalar& b) const { return a + b; } 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Packet> 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return internal::padd(a,b); } 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Packet> 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Scalar predux(const Packet& a) const 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return internal::predux(a); } 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_sum_op<Scalar> > { 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Cost = NumTraits<Scalar>::AddCost, 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath PacketAccess = packet_traits<Scalar>::HasAdd 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the product of two scalars 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseBinaryOp, Cwise::operator*(), class VectorwiseOp, MatrixBase::redux() 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename LhsScalar,typename RhsScalar> struct scalar_product_op { 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // TODO vectorize mixed product 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Vectorizable = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasMul && packet_traits<RhsScalar>::HasMul 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename scalar_product_traits<LhsScalar,RhsScalar>::ReturnType result_type; 53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_product_op) 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const { return a * b; } 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Packet> 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return internal::pmul(a,b); } 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Packet> 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const result_type predux(const Packet& a) const 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return internal::predux_mul(a); } 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename LhsScalar,typename RhsScalar> 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_product_op<LhsScalar,RhsScalar> > { 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Cost = (NumTraits<LhsScalar>::MulCost + NumTraits<RhsScalar>::MulCost)/2, // rough estimate! 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath PacketAccess = scalar_product_op<LhsScalar,RhsScalar>::Vectorizable 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the conjugate product of two scalars 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This is a short cut for conj(x) * y which is needed for optimization purpose; in Eigen2 support mode, this becomes x * conj(y) 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename LhsScalar,typename RhsScalar> struct scalar_conj_product_op { 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Conj = NumTraits<LhsScalar>::IsComplex 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename scalar_product_traits<LhsScalar,RhsScalar>::ReturnType result_type; 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_conj_product_op) 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return conj_helper<LhsScalar,RhsScalar,Conj,false>().pmul(a,b); } 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Packet> 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return conj_helper<Packet,Packet,Conj,false>().pmul(a,b); } 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename LhsScalar,typename RhsScalar> 92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_conj_product_op<LhsScalar,RhsScalar> > { 93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Cost = NumTraits<LhsScalar>::MulCost, 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath PacketAccess = internal::is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasMul 96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the min of two scalars 101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseBinaryOp, MatrixBase::cwiseMin, class VectorwiseOp, MatrixBase::minCoeff() 103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_min_op { 105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_min_op) 106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a, const Scalar& b) const { using std::min; return (min)(a, b); } 107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Packet> 108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const 109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return internal::pmin(a,b); } 110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Packet> 111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Scalar predux(const Packet& a) const 112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return internal::predux_min(a); } 113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_min_op<Scalar> > { 116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Cost = NumTraits<Scalar>::AddCost, 118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath PacketAccess = packet_traits<Scalar>::HasMin 119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the max of two scalars 124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseBinaryOp, MatrixBase::cwiseMax, class VectorwiseOp, MatrixBase::maxCoeff() 126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_max_op { 128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_max_op) 129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a, const Scalar& b) const { using std::max; return (max)(a, b); } 130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Packet> 131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const 132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return internal::pmax(a,b); } 133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Packet> 134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Scalar predux(const Packet& a) const 135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return internal::predux_max(a); } 136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_max_op<Scalar> > { 139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Cost = NumTraits<Scalar>::AddCost, 141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath PacketAccess = packet_traits<Scalar>::HasMax 142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the hypot of two scalars 147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa MatrixBase::stableNorm(), class Redux 149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_hypot_op { 151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_hypot_op) 152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// typedef typename NumTraits<Scalar>::Real result_type; 153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& _x, const Scalar& _y) const 154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using std::max; 156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using std::min; 1577faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez using std::sqrt; 158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar p = (max)(_x, _y); 159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar q = (min)(_x, _y); 160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar qp = q/p; 161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return p * sqrt(Scalar(1) + qp*qp); 162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_hypot_op<Scalar> > { 166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess=0 }; 167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the pow of two scalars 171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar, typename OtherScalar> struct scalar_binary_pow_op { 173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_binary_pow_op) 1747faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez inline Scalar operator() (const Scalar& a, const OtherScalar& b) const { return numext::pow(a, b); } 175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar, typename OtherScalar> 177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_binary_pow_op<Scalar,OtherScalar> > { 178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = false }; 179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// other binary functors: 182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the difference of two scalars 185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseBinaryOp, MatrixBase::operator- 187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_difference_op { 189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_difference_op) 190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a, const Scalar& b) const { return a - b; } 191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Packet> 192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const 193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return internal::psub(a,b); } 194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_difference_op<Scalar> > { 197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Cost = NumTraits<Scalar>::AddCost, 199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath PacketAccess = packet_traits<Scalar>::HasSub 200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the quotient of two scalars 205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseBinaryOp, Cwise::operator/() 207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 2087faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandeztemplate<typename LhsScalar,typename RhsScalar> struct scalar_quotient_op { 2097faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez enum { 2107faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez // TODO vectorize mixed product 2117faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Vectorizable = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasDiv && packet_traits<RhsScalar>::HasDiv 2127faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez }; 2137faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez typedef typename scalar_product_traits<LhsScalar,RhsScalar>::ReturnType result_type; 214c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_quotient_op) 2157faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const { return a / b; } 216c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Packet> 217c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const 218c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return internal::pdiv(a,b); } 219c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 2207faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandeztemplate<typename LhsScalar,typename RhsScalar> 2217faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezstruct functor_traits<scalar_quotient_op<LhsScalar,RhsScalar> > { 222c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 2237faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez Cost = (NumTraits<LhsScalar>::MulCost + NumTraits<RhsScalar>::MulCost), // rough estimate! 2247faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez PacketAccess = scalar_quotient_op<LhsScalar,RhsScalar>::Vectorizable 225c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 226c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 227c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 2287faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 2297faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 230c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 231c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the and of two booleans 232c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 233c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseBinaryOp, ArrayBase::operator&& 234c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 235c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct scalar_boolean_and_op { 236c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_boolean_and_op) 237c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE bool operator() (const bool& a, const bool& b) const { return a && b; } 238c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 239c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<> struct functor_traits<scalar_boolean_and_op> { 240c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 241c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Cost = NumTraits<bool>::AddCost, 242c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath PacketAccess = false 243c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 244c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 245c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 246c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 247c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the or of two booleans 248c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 249c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseBinaryOp, ArrayBase::operator|| 250c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 251c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct scalar_boolean_or_op { 252c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_boolean_or_op) 253c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE bool operator() (const bool& a, const bool& b) const { return a || b; } 254c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 255c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<> struct functor_traits<scalar_boolean_or_op> { 256c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 257c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Cost = NumTraits<bool>::AddCost, 258c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath PacketAccess = false 259c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 260c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 261c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 262c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// unary functors: 263c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 264c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 265c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the opposite of a scalar 266c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 267c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, MatrixBase::operator- 268c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 269c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_opposite_op { 270c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_opposite_op) 271c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const { return -a; } 272c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Packet> 273c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const 274c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return internal::pnegate(a); } 275c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 276c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 277c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_opposite_op<Scalar> > 278c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { 279c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Cost = NumTraits<Scalar>::AddCost, 280c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath PacketAccess = packet_traits<Scalar>::HasNegate }; 281c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 282c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 283c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 284c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the absolute value of a scalar 285c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 286c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, Cwise::abs 287c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 288c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_abs_op { 289c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_abs_op) 290c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename NumTraits<Scalar>::Real result_type; 2917faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez EIGEN_STRONG_INLINE const result_type operator() (const Scalar& a) const { using std::abs; return abs(a); } 292c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Packet> 293c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const 294c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return internal::pabs(a); } 295c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 296c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 297c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_abs_op<Scalar> > 298c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 299c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 300c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Cost = NumTraits<Scalar>::AddCost, 301c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath PacketAccess = packet_traits<Scalar>::HasAbs 302c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 303c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 304c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 305c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 306c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the squared absolute value of a scalar 307c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 308c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, Cwise::abs2 309c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 310c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_abs2_op { 311c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_abs2_op) 312c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename NumTraits<Scalar>::Real result_type; 3137faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez EIGEN_STRONG_INLINE const result_type operator() (const Scalar& a) const { return numext::abs2(a); } 314c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Packet> 315c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const 316c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return internal::pmul(a,a); } 317c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 318c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 319c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_abs2_op<Scalar> > 320c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasAbs2 }; }; 321c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 322c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 323c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the conjugate of a complex value 324c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 325c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, MatrixBase::conjugate() 326c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 327c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_conjugate_op { 328c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_conjugate_op) 3297faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const { using numext::conj; return conj(a); } 330c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Packet> 331c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const { return internal::pconj(a); } 332c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 333c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 334c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_conjugate_op<Scalar> > 335c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 336c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 337c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Cost = NumTraits<Scalar>::IsComplex ? NumTraits<Scalar>::AddCost : 0, 338c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath PacketAccess = packet_traits<Scalar>::HasConj 339c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 340c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 341c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 342c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 343c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to cast a scalar to another type 344c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 345c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, MatrixBase::cast() 346c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 347c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar, typename NewType> 348c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct scalar_cast_op { 349c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_cast_op) 350c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef NewType result_type; 351c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const NewType operator() (const Scalar& a) const { return cast<Scalar, NewType>(a); } 352c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 353c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar, typename NewType> 354c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_cast_op<Scalar,NewType> > 355c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = is_same<Scalar, NewType>::value ? 0 : NumTraits<NewType>::AddCost, PacketAccess = false }; }; 356c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 357c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 358c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to extract the real part of a complex 359c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 360c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, MatrixBase::real() 361c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 362c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 363c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct scalar_real_op { 364c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_real_op) 365c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename NumTraits<Scalar>::Real result_type; 3667faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const { return numext::real(a); } 367c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 368c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 369c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_real_op<Scalar> > 370c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 0, PacketAccess = false }; }; 371c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 372c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 373c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to extract the imaginary part of a complex 374c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 375c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, MatrixBase::imag() 376c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 377c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 378c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct scalar_imag_op { 379c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_imag_op) 380c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename NumTraits<Scalar>::Real result_type; 3817faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const { return numext::imag(a); } 382c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 383c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 384c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_imag_op<Scalar> > 385c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 0, PacketAccess = false }; }; 386c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 387c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 388c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to extract the real part of a complex as a reference 389c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 390c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, MatrixBase::real() 391c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 392c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 393c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct scalar_real_ref_op { 394c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_real_ref_op) 395c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename NumTraits<Scalar>::Real result_type; 3967faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez EIGEN_STRONG_INLINE result_type& operator() (const Scalar& a) const { return numext::real_ref(*const_cast<Scalar*>(&a)); } 397c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 398c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 399c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_real_ref_op<Scalar> > 400c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 0, PacketAccess = false }; }; 401c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 402c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 403c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to extract the imaginary part of a complex as a reference 404c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 405c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, MatrixBase::imag() 406c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 407c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 408c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct scalar_imag_ref_op { 409c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_imag_ref_op) 410c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename NumTraits<Scalar>::Real result_type; 4117faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez EIGEN_STRONG_INLINE result_type& operator() (const Scalar& a) const { return numext::imag_ref(*const_cast<Scalar*>(&a)); } 412c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 413c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 414c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_imag_ref_op<Scalar> > 415c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 0, PacketAccess = false }; }; 416c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 417c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 418c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 419c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the exponential of a scalar 420c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 421c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, Cwise::exp() 422c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 423c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_exp_op { 424c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_exp_op) 4257faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez inline const Scalar operator() (const Scalar& a) const { using std::exp; return exp(a); } 426c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename packet_traits<Scalar>::type Packet; 427c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Packet packetOp(const Packet& a) const { return internal::pexp(a); } 428c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 429c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 430c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_exp_op<Scalar> > 431c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasExp }; }; 432c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 433c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 434c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 435c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the logarithm of a scalar 436c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 437c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, Cwise::log() 438c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 439c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_log_op { 440c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_log_op) 4417faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez inline const Scalar operator() (const Scalar& a) const { using std::log; return log(a); } 442c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename packet_traits<Scalar>::type Packet; 443c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Packet packetOp(const Packet& a) const { return internal::plog(a); } 444c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 445c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 446c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_log_op<Scalar> > 447c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasLog }; }; 448c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 449c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 450c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to multiply a scalar by a fixed other one 451c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 452c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, MatrixBase::operator*, MatrixBase::operator/ 453c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 454c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/* NOTE why doing the pset1() in packetOp *is* an optimization ? 455c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * indeed it seems better to declare m_other as a Packet and do the pset1() once 456c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * in the constructor. However, in practice: 457c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * - GCC does not like m_other as a Packet and generate a load every time it needs it 4587faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez * - on the other hand GCC is able to moves the pset1() outside the loop :) 459c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * - simpler code ;) 460c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * (ICC and gcc 4.4 seems to perform well in both cases, the issue is visible with y = a*x + b*y) 461c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 462c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 463c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct scalar_multiple_op { 464c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename packet_traits<Scalar>::type Packet; 465c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // FIXME default copy constructors seems bugged with std::complex<> 466c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE scalar_multiple_op(const scalar_multiple_op& other) : m_other(other.m_other) { } 467c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE scalar_multiple_op(const Scalar& other) : m_other(other) { } 468c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE Scalar operator() (const Scalar& a) const { return a * m_other; } 469c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const 470c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return internal::pmul(a, pset1<Packet>(m_other)); } 471c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typename add_const_on_value_type<typename NumTraits<Scalar>::Nested>::type m_other; 472c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 473c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 474c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_multiple_op<Scalar> > 475c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; }; 476c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 477c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar1, typename Scalar2> 478c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct scalar_multiple2_op { 479c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename scalar_product_traits<Scalar1,Scalar2>::ReturnType result_type; 480c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE scalar_multiple2_op(const scalar_multiple2_op& other) : m_other(other.m_other) { } 481c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE scalar_multiple2_op(const Scalar2& other) : m_other(other) { } 482c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE result_type operator() (const Scalar1& a) const { return a * m_other; } 483c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typename add_const_on_value_type<typename NumTraits<Scalar2>::Nested>::type m_other; 484c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 485c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar1,typename Scalar2> 486c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_multiple2_op<Scalar1,Scalar2> > 487c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = NumTraits<Scalar1>::MulCost, PacketAccess = false }; }; 488c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 489c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 490c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to divide a scalar by a fixed other one 491c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 492c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This functor is used to implement the quotient of a matrix by 493c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * a scalar where the scalar type is not necessarily a floating point type. 494c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 495c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, MatrixBase::operator/ 496c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 497c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 4987faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezstruct scalar_quotient1_op { 4997faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez typedef typename packet_traits<Scalar>::type Packet; 5007faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez // FIXME default copy constructors seems bugged with std::complex<> 5017faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez EIGEN_STRONG_INLINE scalar_quotient1_op(const scalar_quotient1_op& other) : m_other(other.m_other) { } 5027faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez EIGEN_STRONG_INLINE scalar_quotient1_op(const Scalar& other) : m_other(other) {} 5037faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez EIGEN_STRONG_INLINE Scalar operator() (const Scalar& a) const { return a / m_other; } 5047faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const 5057faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez { return internal::pdiv(a, pset1<Packet>(m_other)); } 5067faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez typename add_const_on_value_type<typename NumTraits<Scalar>::Nested>::type m_other; 507c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 508c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 509c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_quotient1_op<Scalar> > 5107faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez{ enum { Cost = 2 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasDiv }; }; 511c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 512c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// nullary functors 513c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 514c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 515c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct scalar_constant_op { 516c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename packet_traits<Scalar>::type Packet; 517c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE scalar_constant_op(const scalar_constant_op& other) : m_other(other.m_other) { } 518c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE scalar_constant_op(const Scalar& other) : m_other(other) { } 519c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Index> 520c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Scalar operator() (Index, Index = 0) const { return m_other; } 521c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Index> 522c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Packet packetOp(Index, Index = 0) const { return internal::pset1<Packet>(m_other); } 523c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Scalar m_other; 524c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 525c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 526c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_constant_op<Scalar> > 527c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// FIXME replace this packet test by a safe one 528c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 1, PacketAccess = packet_traits<Scalar>::Vectorizable, IsRepeatable = true }; }; 529c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 530c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_identity_op { 531c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_identity_op) 532c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Index> 533c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Scalar operator() (Index row, Index col) const { return row==col ? Scalar(1) : Scalar(0); } 534c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 535c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 536c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_identity_op<Scalar> > 537c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = false, IsRepeatable = true }; }; 538c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 539c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename Scalar, bool RandomAccess> struct linspaced_op_impl; 540c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 541c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// linear access for packet ops: 542c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 1) initialization 543c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// base = [low, ..., low] + ([step, ..., step] * [-size, ..., 0]) 5447faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// 2) each step (where size is 1 for coeff access or PacketSize for packet access) 545c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// base += [size*step, ..., size*step] 5467faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// 5477faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// TODO: Perhaps it's better to initialize lazily (so not in the constructor but in packetOp) 5487faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// in order to avoid the padd() in operator() ? 549c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename Scalar> 550c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct linspaced_op_impl<Scalar,false> 551c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 552c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename packet_traits<Scalar>::type Packet; 553c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 5547faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez linspaced_op_impl(const Scalar& low, const Scalar& step) : 555c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_low(low), m_step(step), 556c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_packetStep(pset1<Packet>(packet_traits<Scalar>::size*step)), 5577faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez m_base(padd(pset1<Packet>(low), pmul(pset1<Packet>(step),plset<Scalar>(-packet_traits<Scalar>::size)))) {} 558c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 559c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Index> 5607faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez EIGEN_STRONG_INLINE const Scalar operator() (Index i) const 5617faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez { 5627faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez m_base = padd(m_base, pset1<Packet>(m_step)); 5637faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez return m_low+Scalar(i)*m_step; 5647faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez } 5657faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 566c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Index> 567c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Packet packetOp(Index) const { return m_base = padd(m_base,m_packetStep); } 568c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 569c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Scalar m_low; 570c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Scalar m_step; 571c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Packet m_packetStep; 572c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath mutable Packet m_base; 573c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 574c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 575c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// random access for packet ops: 576c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 1) each step 577c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// [low, ..., low] + ( [step, ..., step] * ( [i, ..., i] + [0, ..., size] ) ) 578c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename Scalar> 579c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct linspaced_op_impl<Scalar,true> 580c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 581c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename packet_traits<Scalar>::type Packet; 582c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 5837faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez linspaced_op_impl(const Scalar& low, const Scalar& step) : 584c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_low(low), m_step(step), 585c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_lowPacket(pset1<Packet>(m_low)), m_stepPacket(pset1<Packet>(m_step)), m_interPacket(plset<Scalar>(0)) {} 586c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 587c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Index> 588c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Scalar operator() (Index i) const { return m_low+i*m_step; } 589c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 590c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Index> 591c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Packet packetOp(Index i) const 5927faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez { return internal::padd(m_lowPacket, pmul(m_stepPacket, padd(pset1<Packet>(Scalar(i)),m_interPacket))); } 593c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 594c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Scalar m_low; 595c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Scalar m_step; 596c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Packet m_lowPacket; 597c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Packet m_stepPacket; 598c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Packet m_interPacket; 599c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 600c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 601c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// ----- Linspace functor ---------------------------------------------------------------- 602c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 603c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Forward declaration (we default to random access which does not really give 604c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// us a speed gain when using packet access but it allows to use the functor in 605c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// nested expressions). 606c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename Scalar, bool RandomAccess = true> struct linspaced_op; 607c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename Scalar, bool RandomAccess> struct functor_traits< linspaced_op<Scalar,RandomAccess> > 608c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 1, PacketAccess = packet_traits<Scalar>::HasSetLinear, IsRepeatable = true }; }; 609c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename Scalar, bool RandomAccess> struct linspaced_op 610c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 611c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename packet_traits<Scalar>::type Packet; 6127faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez linspaced_op(const Scalar& low, const Scalar& high, DenseIndex num_steps) : impl((num_steps==1 ? high : low), (num_steps==1 ? Scalar() : (high-low)/Scalar(num_steps-1))) {} 613c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 614c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Index> 615c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Scalar operator() (Index i) const { return impl(i); } 616c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 617c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // We need this function when assigning e.g. a RowVectorXd to a MatrixXd since 618c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // there row==0 and col is used for the actual iteration. 619c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Index> 620c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Scalar operator() (Index row, Index col) const 621c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 622c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_assert(col==0 || row==0); 623c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return impl(col + row); 624c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 625c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 626c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Index> 627c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Packet packetOp(Index i) const { return impl.packetOp(i); } 628c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 629c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // We need this function when assigning e.g. a RowVectorXd to a MatrixXd since 630c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // there row==0 and col is used for the actual iteration. 631c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Index> 632c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const Packet packetOp(Index row, Index col) const 633c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 634c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_assert(col==0 || row==0); 635c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return impl.packetOp(col + row); 636c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 637c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 638c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // This proxy object handles the actual required temporaries, the different 639c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // implementations (random vs. sequential access) as well as the 640c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // correct piping to size 2/4 packet operations. 641c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const linspaced_op_impl<Scalar,RandomAccess> impl; 642c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 643c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 644c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// all functors allow linear access, except scalar_identity_op. So we fix here a quick meta 645c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// to indicate whether a functor allows linear access, just always answering 'yes' except for 646c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// scalar_identity_op. 647c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// FIXME move this to functor_traits adding a functor_default 648c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Functor> struct functor_has_linear_access { enum { ret = 1 }; }; 649c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct functor_has_linear_access<scalar_identity_op<Scalar> > { enum { ret = 0 }; }; 650c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 6517faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// In Eigen, any binary op (Product, CwiseBinaryOp) require the Lhs and Rhs to have the same scalar type, except for multiplication 6527faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// where the mixing of different types is handled by scalar_product_traits 6537faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// In particular, real * complex<real> is allowed. 654c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// FIXME move this to functor_traits adding a functor_default 6557faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandeztemplate<typename Functor> struct functor_is_product_like { enum { ret = 0 }; }; 6567faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandeztemplate<typename LhsScalar,typename RhsScalar> struct functor_is_product_like<scalar_product_op<LhsScalar,RhsScalar> > { enum { ret = 1 }; }; 6577faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandeztemplate<typename LhsScalar,typename RhsScalar> struct functor_is_product_like<scalar_conj_product_op<LhsScalar,RhsScalar> > { enum { ret = 1 }; }; 6587faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandeztemplate<typename LhsScalar,typename RhsScalar> struct functor_is_product_like<scalar_quotient_op<LhsScalar,RhsScalar> > { enum { ret = 1 }; }; 659c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 660c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 661c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 662c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to add a scalar to a fixed other one 663c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, Array::operator+ 664c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 665c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/* If you wonder why doing the pset1() in packetOp() is an optimization check scalar_multiple_op */ 666c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 667c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct scalar_add_op { 668c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename packet_traits<Scalar>::type Packet; 669c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // FIXME default copy constructors seems bugged with std::complex<> 670c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline scalar_add_op(const scalar_add_op& other) : m_other(other.m_other) { } 671c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline scalar_add_op(const Scalar& other) : m_other(other) { } 672c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Scalar operator() (const Scalar& a) const { return a + m_other; } 673c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const Packet packetOp(const Packet& a) const 674c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return internal::padd(a, pset1<Packet>(m_other)); } 675c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Scalar m_other; 676c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 677c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 678c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_add_op<Scalar> > 679c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = packet_traits<Scalar>::HasAdd }; }; 680c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 681c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 682c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the square root of a scalar 683c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, Cwise::sqrt() 684c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 685c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_sqrt_op { 686c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_sqrt_op) 6877faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez inline const Scalar operator() (const Scalar& a) const { using std::sqrt; return sqrt(a); } 688c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename packet_traits<Scalar>::type Packet; 689c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Packet packetOp(const Packet& a) const { return internal::psqrt(a); } 690c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 691c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 692c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_sqrt_op<Scalar> > 693c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { 694c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Cost = 5 * NumTraits<Scalar>::MulCost, 695c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath PacketAccess = packet_traits<Scalar>::HasSqrt 696c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 697c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 698c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 699c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 700c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the cosine of a scalar 701c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, ArrayBase::cos() 702c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 703c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_cos_op { 704c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_cos_op) 7057faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez inline Scalar operator() (const Scalar& a) const { using std::cos; return cos(a); } 706c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename packet_traits<Scalar>::type Packet; 707c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Packet packetOp(const Packet& a) const { return internal::pcos(a); } 708c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 709c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 710c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_cos_op<Scalar> > 711c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 712c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 713c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Cost = 5 * NumTraits<Scalar>::MulCost, 714c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath PacketAccess = packet_traits<Scalar>::HasCos 715c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 716c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 717c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 718c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 719c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the sine of a scalar 720c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, ArrayBase::sin() 721c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 722c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_sin_op { 723c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_sin_op) 7247faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez inline const Scalar operator() (const Scalar& a) const { using std::sin; return sin(a); } 725c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename packet_traits<Scalar>::type Packet; 726c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Packet packetOp(const Packet& a) const { return internal::psin(a); } 727c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 728c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 729c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_sin_op<Scalar> > 730c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 731c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 732c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Cost = 5 * NumTraits<Scalar>::MulCost, 733c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath PacketAccess = packet_traits<Scalar>::HasSin 734c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 735c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 736c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 737c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 738c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 739c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the tan of a scalar 740c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, ArrayBase::tan() 741c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 742c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_tan_op { 743c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_tan_op) 7447faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez inline const Scalar operator() (const Scalar& a) const { using std::tan; return tan(a); } 745c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename packet_traits<Scalar>::type Packet; 746c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Packet packetOp(const Packet& a) const { return internal::ptan(a); } 747c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 748c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 749c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_tan_op<Scalar> > 750c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 751c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 752c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Cost = 5 * NumTraits<Scalar>::MulCost, 753c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath PacketAccess = packet_traits<Scalar>::HasTan 754c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 755c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 756c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 757c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 758c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the arc cosine of a scalar 759c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, ArrayBase::acos() 760c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 761c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_acos_op { 762c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_acos_op) 7637faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez inline const Scalar operator() (const Scalar& a) const { using std::acos; return acos(a); } 764c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename packet_traits<Scalar>::type Packet; 765c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Packet packetOp(const Packet& a) const { return internal::pacos(a); } 766c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 767c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 768c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_acos_op<Scalar> > 769c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 770c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 771c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Cost = 5 * NumTraits<Scalar>::MulCost, 772c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath PacketAccess = packet_traits<Scalar>::HasACos 773c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 774c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 775c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 776c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 777c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the arc sine of a scalar 778c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, ArrayBase::asin() 779c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 780c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_asin_op { 781c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_asin_op) 7827faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez inline const Scalar operator() (const Scalar& a) const { using std::asin; return asin(a); } 783c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename packet_traits<Scalar>::type Packet; 784c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Packet packetOp(const Packet& a) const { return internal::pasin(a); } 785c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 786c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 787c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_asin_op<Scalar> > 788c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 789c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 790c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Cost = 5 * NumTraits<Scalar>::MulCost, 791c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath PacketAccess = packet_traits<Scalar>::HasASin 792c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 793c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 794c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 795c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 796c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to raise a scalar to a power 797c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, Cwise::pow 798c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 799c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 800c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct scalar_pow_op { 801c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // FIXME default copy constructors seems bugged with std::complex<> 802c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline scalar_pow_op(const scalar_pow_op& other) : m_exponent(other.m_exponent) { } 803c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline scalar_pow_op(const Scalar& exponent) : m_exponent(exponent) {} 8047faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez inline Scalar operator() (const Scalar& a) const { return numext::pow(a, m_exponent); } 805c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Scalar m_exponent; 806c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 807c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 808c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_pow_op<Scalar> > 809c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = false }; }; 810c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 811c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 812c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the quotient between a scalar and array entries. 813c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, Cwise::inverse() 814c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 815c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 816c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct scalar_inverse_mult_op { 817c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath scalar_inverse_mult_op(const Scalar& other) : m_other(other) {} 818c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Scalar operator() (const Scalar& a) const { return m_other / a; } 819c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Packet> 820c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const Packet packetOp(const Packet& a) const 821c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return internal::pdiv(pset1<Packet>(m_other),a); } 822c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar m_other; 823c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 824c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 825c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 826c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the inverse of a scalar 827c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, Cwise::inverse() 828c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 829c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 830c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct scalar_inverse_op { 831c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_inverse_op) 832c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Scalar operator() (const Scalar& a) const { return Scalar(1)/a; } 833c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Packet> 834c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const Packet packetOp(const Packet& a) const 835c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return internal::pdiv(pset1<Packet>(Scalar(1)),a); } 836c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 837c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 838c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_inverse_op<Scalar> > 839c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasDiv }; }; 840c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 841c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 842c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the square of a scalar 843c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, Cwise::square() 844c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 845c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 846c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct scalar_square_op { 847c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_square_op) 848c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Scalar operator() (const Scalar& a) const { return a*a; } 849c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Packet> 850c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const Packet packetOp(const Packet& a) const 851c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return internal::pmul(a,a); } 852c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 853c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 854c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_square_op<Scalar> > 855c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; }; 856c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 857c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 858c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Template functor to compute the cube of a scalar 859c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class CwiseUnaryOp, Cwise::cube() 860c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 861c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 862c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct scalar_cube_op { 863c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_EMPTY_STRUCT_CTOR(scalar_cube_op) 864c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Scalar operator() (const Scalar& a) const { return a*a*a; } 865c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Packet> 866c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const Packet packetOp(const Packet& a) const 867c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return internal::pmul(a,pmul(a,a)); } 868c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 869c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> 870c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_cube_op<Scalar> > 871c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 2*NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; }; 872c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 873c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// default functor traits for STL functors: 874c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 875c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> 876c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::multiplies<T> > 877c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = NumTraits<T>::MulCost, PacketAccess = false }; }; 878c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 879c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> 880c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::divides<T> > 881c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = NumTraits<T>::MulCost, PacketAccess = false }; }; 882c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 883c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> 884c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::plus<T> > 885c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = NumTraits<T>::AddCost, PacketAccess = false }; }; 886c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 887c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> 888c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::minus<T> > 889c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = NumTraits<T>::AddCost, PacketAccess = false }; }; 890c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 891c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> 892c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::negate<T> > 893c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = NumTraits<T>::AddCost, PacketAccess = false }; }; 894c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 895c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> 896c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::logical_or<T> > 897c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 1, PacketAccess = false }; }; 898c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 899c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> 900c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::logical_and<T> > 901c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 1, PacketAccess = false }; }; 902c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 903c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> 904c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::logical_not<T> > 905c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 1, PacketAccess = false }; }; 906c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 907c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> 908c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::greater<T> > 909c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 1, PacketAccess = false }; }; 910c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 911c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> 912c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::less<T> > 913c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 1, PacketAccess = false }; }; 914c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 915c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> 916c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::greater_equal<T> > 917c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 1, PacketAccess = false }; }; 918c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 919c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> 920c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::less_equal<T> > 921c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 1, PacketAccess = false }; }; 922c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 923c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> 924c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::equal_to<T> > 925c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 1, PacketAccess = false }; }; 926c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 927c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> 928c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::not_equal_to<T> > 929c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 1, PacketAccess = false }; }; 930c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 931c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> 932c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::binder2nd<T> > 933c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = functor_traits<T>::Cost, PacketAccess = false }; }; 934c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 935c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> 936c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::binder1st<T> > 937c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = functor_traits<T>::Cost, PacketAccess = false }; }; 938c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 939c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> 940c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::unary_negate<T> > 941c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 1 + functor_traits<T>::Cost, PacketAccess = false }; }; 942c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 943c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> 944c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::binary_negate<T> > 945c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 1 + functor_traits<T>::Cost, PacketAccess = false }; }; 946c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 947c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifdef EIGEN_STDEXT_SUPPORT 948c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 949c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T0,typename T1> 950c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::project1st<T0,T1> > 951c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 0, PacketAccess = false }; }; 952c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 953c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T0,typename T1> 954c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::project2nd<T0,T1> > 955c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 0, PacketAccess = false }; }; 956c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 957c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T0,typename T1> 958c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::select2nd<std::pair<T0,T1> > > 959c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 0, PacketAccess = false }; }; 960c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 961c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T0,typename T1> 962c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::select1st<std::pair<T0,T1> > > 963c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 0, PacketAccess = false }; }; 964c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 965c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T0,typename T1> 966c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::unary_compose<T0,T1> > 967c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = functor_traits<T0>::Cost + functor_traits<T1>::Cost, PacketAccess = false }; }; 968c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 969c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T0,typename T1,typename T2> 970c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<std::binary_compose<T0,T1,T2> > 971c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = functor_traits<T0>::Cost + functor_traits<T1>::Cost + functor_traits<T2>::Cost, PacketAccess = false }; }; 972c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 973c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_STDEXT_SUPPORT 974c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 975c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// allow to add new functors and specializations of functor_traits from outside Eigen. 976c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// this macro is really needed because functor_traits must be specialized after it is declared but before it is used... 977c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifdef EIGEN_FUNCTORS_PLUGIN 978c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include EIGEN_FUNCTORS_PLUGIN 979c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif 980c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 981c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace internal 982c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 983c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen 984c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 985c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_FUNCTORS_H 986