![]() |
Eigen-unsupported
3.3.3
|
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