SpecialFunctionsFunctors.h
00001 // This file is part of Eigen, a lightweight C++ template library
00002 // for linear algebra.
00003 //
00004 // Copyright (C) 2016 Eugene Brevdo <ebrevdo@gmail.com>
00005 // Copyright (C) 2016 Gael Guennebaud <gael.guennebaud@inria.fr>
00006 //
00007 // This Source Code Form is subject to the terms of the Mozilla
00008 // Public License v. 2.0. If a copy of the MPL was not distributed
00009 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
00010 
00011 #ifndef EIGEN_SPECIALFUNCTIONS_FUNCTORS_H
00012 #define EIGEN_SPECIALFUNCTIONS_FUNCTORS_H
00013 
00014 namespace Eigen {
00015 
00016 namespace internal {
00017 
00018 
00024 template<typename Scalar> struct scalar_igamma_op : binary_op_base<Scalar,Scalar>
00025 {
00026   EIGEN_EMPTY_STRUCT_CTOR(scalar_igamma_op)
00027   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a, const Scalar& x) const {
00028     using numext::igamma; return igamma(a, x);
00029   }
00030   template<typename Packet>
00031   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& x) const {
00032     return internal::pigamma(a, x);
00033   }
00034 };
00035 template<typename Scalar>
00036 struct functor_traits<scalar_igamma_op<Scalar> > {
00037   enum {
00038     // Guesstimate
00039     Cost = 20 * NumTraits<Scalar>::MulCost + 10 * NumTraits<Scalar>::AddCost,
00040     PacketAccess = packet_traits<Scalar>::HasIGamma
00041   };
00042 };
00043 
00044 
00050 template<typename Scalar> struct scalar_igammac_op : binary_op_base<Scalar,Scalar>
00051 {
00052   EIGEN_EMPTY_STRUCT_CTOR(scalar_igammac_op)
00053   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a, const Scalar& x) const {
00054     using numext::igammac; return igammac(a, x);
00055   }
00056   template<typename Packet>
00057   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& x) const
00058   {
00059     return internal::pigammac(a, x);
00060   }
00061 };
00062 template<typename Scalar>
00063 struct functor_traits<scalar_igammac_op<Scalar> > {
00064   enum {
00065     // Guesstimate
00066     Cost = 20 * NumTraits<Scalar>::MulCost + 10 * NumTraits<Scalar>::AddCost,
00067     PacketAccess = packet_traits<Scalar>::HasIGammac
00068   };
00069 };
00070 
00071 
00076 template<typename Scalar> struct scalar_betainc_op {
00077   EIGEN_EMPTY_STRUCT_CTOR(scalar_betainc_op)
00078   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& x, const Scalar& a, const Scalar& b) const {
00079     using numext::betainc; return betainc(x, a, b);
00080   }
00081   template<typename Packet>
00082   EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& x, const Packet& a, const Packet& b) const
00083   {
00084     return internal::pbetainc(x, a, b);
00085   }
00086 };
00087 template<typename Scalar>
00088 struct functor_traits<scalar_betainc_op<Scalar> > {
00089   enum {
00090     // Guesstimate
00091     Cost = 400 * NumTraits<Scalar>::MulCost + 400 * NumTraits<Scalar>::AddCost,
00092     PacketAccess = packet_traits<Scalar>::HasBetaInc
00093   };
00094 };
00095 
00096 
00102 template<typename Scalar> struct scalar_lgamma_op {
00103   EIGEN_EMPTY_STRUCT_CTOR(scalar_lgamma_op)
00104   EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const {
00105     using numext::lgamma; return lgamma(a);
00106   }
00107   typedef typename packet_traits<Scalar>::type Packet;
00108   EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::plgamma(a); }
00109 };
00110 template<typename Scalar>
00111 struct functor_traits<scalar_lgamma_op<Scalar> >
00112 {
00113   enum {
00114     // Guesstimate
00115     Cost = 10 * NumTraits<Scalar>::MulCost + 5 * NumTraits<Scalar>::AddCost,
00116     PacketAccess = packet_traits<Scalar>::HasLGamma
00117   };
00118 };
00119 
00124 template<typename Scalar> struct scalar_digamma_op {
00125   EIGEN_EMPTY_STRUCT_CTOR(scalar_digamma_op)
00126   EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const {
00127     using numext::digamma; return digamma(a);
00128   }
00129   typedef typename packet_traits<Scalar>::type Packet;
00130   EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::pdigamma(a); }
00131 };
00132 template<typename Scalar>
00133 struct functor_traits<scalar_digamma_op<Scalar> >
00134 {
00135   enum {
00136     // Guesstimate
00137     Cost = 10 * NumTraits<Scalar>::MulCost + 5 * NumTraits<Scalar>::AddCost,
00138     PacketAccess = packet_traits<Scalar>::HasDiGamma
00139   };
00140 };
00141 
00146 template<typename Scalar> struct scalar_zeta_op {
00147     EIGEN_EMPTY_STRUCT_CTOR(scalar_zeta_op)
00148     EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& x, const Scalar& q) const {
00149         using numext::zeta; return zeta(x, q);
00150     }
00151     typedef typename packet_traits<Scalar>::type Packet;
00152     EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& x, const Packet& q) const { return internal::pzeta(x, q); }
00153 };
00154 template<typename Scalar>
00155 struct functor_traits<scalar_zeta_op<Scalar> >
00156 {
00157     enum {
00158         // Guesstimate
00159         Cost = 10 * NumTraits<Scalar>::MulCost + 5 * NumTraits<Scalar>::AddCost,
00160         PacketAccess = packet_traits<Scalar>::HasZeta
00161     };
00162 };
00163 
00168 template<typename Scalar> struct scalar_polygamma_op {
00169     EIGEN_EMPTY_STRUCT_CTOR(scalar_polygamma_op)
00170     EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& n, const Scalar& x) const {
00171         using numext::polygamma; return polygamma(n, x);
00172     }
00173     typedef typename packet_traits<Scalar>::type Packet;
00174     EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& n, const Packet& x) const { return internal::ppolygamma(n, x); }
00175 };
00176 template<typename Scalar>
00177 struct functor_traits<scalar_polygamma_op<Scalar> >
00178 {
00179     enum {
00180         // Guesstimate
00181         Cost = 10 * NumTraits<Scalar>::MulCost + 5 * NumTraits<Scalar>::AddCost,
00182         PacketAccess = packet_traits<Scalar>::HasPolygamma
00183     };
00184 };
00185 
00191 template<typename Scalar> struct scalar_erf_op {
00192   EIGEN_EMPTY_STRUCT_CTOR(scalar_erf_op)
00193   EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const {
00194     using numext::erf; return erf(a);
00195   }
00196   typedef typename packet_traits<Scalar>::type Packet;
00197   EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::perf(a); }
00198 };
00199 template<typename Scalar>
00200 struct functor_traits<scalar_erf_op<Scalar> >
00201 {
00202   enum {
00203     // Guesstimate
00204     Cost = 10 * NumTraits<Scalar>::MulCost + 5 * NumTraits<Scalar>::AddCost,
00205     PacketAccess = packet_traits<Scalar>::HasErf
00206   };
00207 };
00208 
00214 template<typename Scalar> struct scalar_erfc_op {
00215   EIGEN_EMPTY_STRUCT_CTOR(scalar_erfc_op)
00216   EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const {
00217     using numext::erfc; return erfc(a);
00218   }
00219   typedef typename packet_traits<Scalar>::type Packet;
00220   EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::perfc(a); }
00221 };
00222 template<typename Scalar>
00223 struct functor_traits<scalar_erfc_op<Scalar> >
00224 {
00225   enum {
00226     // Guesstimate
00227     Cost = 10 * NumTraits<Scalar>::MulCost + 5 * NumTraits<Scalar>::AddCost,
00228     PacketAccess = packet_traits<Scalar>::HasErfc
00229   };
00230 };
00231 
00232 } // end namespace internal
00233 
00234 } // end namespace Eigen
00235 
00236 #endif // EIGEN_SPECIALFUNCTIONS_FUNCTORS_H
 All Classes Functions Variables Typedefs Enumerator