11 #ifndef EIGEN_SPECIALFUNCTIONS_FUNCTORS_H 12 #define EIGEN_SPECIALFUNCTIONS_FUNCTORS_H 24 template<
typename Scalar>
struct scalar_igamma_op : binary_op_base<Scalar,Scalar>
26 EIGEN_EMPTY_STRUCT_CTOR(scalar_igamma_op)
27 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar operator() (
const Scalar& a,
const Scalar& x)
const {
28 using numext::igamma;
return igamma(a, x);
30 template<
typename Packet>
31 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a,
const Packet& x)
const {
32 return internal::pigamma(a, x);
35 template<
typename Scalar>
36 struct functor_traits<scalar_igamma_op<Scalar> > {
39 Cost = 20 * NumTraits<Scalar>::MulCost + 10 * NumTraits<Scalar>::AddCost,
40 PacketAccess = packet_traits<Scalar>::HasIGamma
50 template <
typename Scalar>
51 struct scalar_igamma_der_a_op {
52 EIGEN_EMPTY_STRUCT_CTOR(scalar_igamma_der_a_op)
53 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar operator()(
const Scalar& a,
const Scalar& x)
const {
54 using numext::igamma_der_a;
57 template <
typename Packet>
58 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a,
const Packet& x)
const {
59 return internal::pigamma_der_a(a, x);
62 template <
typename Scalar>
63 struct functor_traits<scalar_igamma_der_a_op<Scalar> > {
66 Cost = 40 * NumTraits<Scalar>::MulCost + 20 * NumTraits<Scalar>::AddCost,
67 PacketAccess = packet_traits<Scalar>::HasIGammaDerA
78 template <
typename Scalar>
79 struct scalar_gamma_sample_der_alpha_op {
80 EIGEN_EMPTY_STRUCT_CTOR(scalar_gamma_sample_der_alpha_op)
81 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar operator()(
const Scalar& alpha,
const Scalar& sample)
const {
82 using numext::gamma_sample_der_alpha;
85 template <
typename Packet>
86 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& alpha,
const Packet& sample)
const {
87 return internal::pgamma_sample_der_alpha(alpha, sample);
90 template <
typename Scalar>
91 struct functor_traits<scalar_gamma_sample_der_alpha_op<Scalar> > {
94 Cost = 30 * NumTraits<Scalar>::MulCost + 15 * NumTraits<Scalar>::AddCost,
95 PacketAccess = packet_traits<Scalar>::HasGammaSampleDerAlpha
104 template<
typename Scalar>
struct scalar_igammac_op : binary_op_base<Scalar,Scalar>
106 EIGEN_EMPTY_STRUCT_CTOR(scalar_igammac_op)
107 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar operator() (
const Scalar& a,
const Scalar& x)
const {
108 using numext::igammac;
return igammac(a, x);
110 template<
typename Packet>
111 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a,
const Packet& x)
const 113 return internal::pigammac(a, x);
116 template<
typename Scalar>
117 struct functor_traits<scalar_igammac_op<Scalar> > {
120 Cost = 20 * NumTraits<Scalar>::MulCost + 10 * NumTraits<Scalar>::AddCost,
121 PacketAccess = packet_traits<Scalar>::HasIGammac
130 template<
typename Scalar>
struct scalar_betainc_op {
131 EIGEN_EMPTY_STRUCT_CTOR(scalar_betainc_op)
132 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar operator() (
const Scalar& x,
const Scalar& a,
const Scalar& b)
const {
133 using numext::betainc;
return betainc(x, a, b);
135 template<
typename Packet>
136 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& x,
const Packet& a,
const Packet& b)
const 138 return internal::pbetainc(x, a, b);
141 template<
typename Scalar>
142 struct functor_traits<scalar_betainc_op<Scalar> > {
145 Cost = 400 * NumTraits<Scalar>::MulCost + 400 * NumTraits<Scalar>::AddCost,
146 PacketAccess = packet_traits<Scalar>::HasBetaInc
156 template<
typename Scalar>
struct scalar_lgamma_op {
157 EIGEN_EMPTY_STRUCT_CTOR(scalar_lgamma_op)
158 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar operator() (
const Scalar& a)
const {
159 using numext::lgamma;
return lgamma(a);
161 typedef typename packet_traits<Scalar>::type Packet;
162 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(
const Packet& a)
const {
return internal::plgamma(a); }
164 template<
typename Scalar>
165 struct functor_traits<scalar_lgamma_op<Scalar> >
169 Cost = 10 * NumTraits<Scalar>::MulCost + 5 * NumTraits<Scalar>::AddCost,
170 PacketAccess = packet_traits<Scalar>::HasLGamma
178 template<
typename Scalar>
struct scalar_digamma_op {
179 EIGEN_EMPTY_STRUCT_CTOR(scalar_digamma_op)
180 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar operator() (
const Scalar& a)
const {
181 using numext::digamma;
return digamma(a);
183 typedef typename packet_traits<Scalar>::type Packet;
184 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(
const Packet& a)
const {
return internal::pdigamma(a); }
186 template<
typename Scalar>
187 struct functor_traits<scalar_digamma_op<Scalar> >
191 Cost = 10 * NumTraits<Scalar>::MulCost + 5 * NumTraits<Scalar>::AddCost,
192 PacketAccess = packet_traits<Scalar>::HasDiGamma
200 template<
typename Scalar>
struct scalar_zeta_op {
201 EIGEN_EMPTY_STRUCT_CTOR(scalar_zeta_op)
202 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar operator() (
const Scalar& x,
const Scalar& q)
const {
203 using numext::zeta;
return zeta(x, q);
205 typedef typename packet_traits<Scalar>::type Packet;
206 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(
const Packet& x,
const Packet& q)
const {
return internal::pzeta(x, q); }
208 template<
typename Scalar>
209 struct functor_traits<scalar_zeta_op<Scalar> >
213 Cost = 10 * NumTraits<Scalar>::MulCost + 5 * NumTraits<Scalar>::AddCost,
214 PacketAccess = packet_traits<Scalar>::HasZeta
222 template<
typename Scalar>
struct scalar_polygamma_op {
223 EIGEN_EMPTY_STRUCT_CTOR(scalar_polygamma_op)
224 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar operator() (
const Scalar& n,
const Scalar& x)
const {
225 using numext::polygamma;
return polygamma(n, x);
227 typedef typename packet_traits<Scalar>::type Packet;
228 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(
const Packet& n,
const Packet& x)
const {
return internal::ppolygamma(n, x); }
230 template<
typename Scalar>
231 struct functor_traits<scalar_polygamma_op<Scalar> >
235 Cost = 10 * NumTraits<Scalar>::MulCost + 5 * NumTraits<Scalar>::AddCost,
236 PacketAccess = packet_traits<Scalar>::HasPolygamma
244 template<
typename Scalar>
struct scalar_erf_op {
245 EIGEN_EMPTY_STRUCT_CTOR(scalar_erf_op)
246 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar
247 operator()(
const Scalar& a)
const {
248 return numext::erf(a);
250 template <
typename Packet>
251 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(
const Packet& x)
const {
255 template <
typename Scalar>
256 struct functor_traits<scalar_erf_op<Scalar> > {
258 PacketAccess = packet_traits<Scalar>::HasErf,
261 #ifdef EIGEN_VECTORIZE_FMA 265 ? (2 * NumTraits<Scalar>::AddCost +
266 7 * NumTraits<Scalar>::MulCost +
267 scalar_div_cost<Scalar, packet_traits<Scalar>::HasDiv>::value)
269 ? (12 * NumTraits<Scalar>::AddCost +
270 12 * NumTraits<Scalar>::MulCost +
271 scalar_div_cost<Scalar, packet_traits<Scalar>::HasDiv>::value)
274 : (functor_traits<scalar_exp_op<Scalar> >::Cost))
283 template<
typename Scalar>
struct scalar_erfc_op {
284 EIGEN_EMPTY_STRUCT_CTOR(scalar_erfc_op)
285 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar operator() (
const Scalar& a)
const {
286 using numext::erfc;
return erfc(a);
288 typedef typename packet_traits<Scalar>::type Packet;
289 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(
const Packet& a)
const {
return internal::perfc(a); }
291 template<
typename Scalar>
292 struct functor_traits<scalar_erfc_op<Scalar> >
296 Cost = 10 * NumTraits<Scalar>::MulCost + 5 * NumTraits<Scalar>::AddCost,
297 PacketAccess = packet_traits<Scalar>::HasErfc
306 template<
typename Scalar>
struct scalar_ndtri_op {
307 EIGEN_EMPTY_STRUCT_CTOR(scalar_ndtri_op)
308 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar operator() (
const Scalar& a)
const {
309 using numext::ndtri;
return ndtri(a);
311 typedef typename packet_traits<Scalar>::type Packet;
312 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(
const Packet& a)
const {
return internal::pndtri(a); }
314 template<
typename Scalar>
315 struct functor_traits<scalar_ndtri_op<Scalar> >
321 Cost = 18 * NumTraits<Scalar>::MulCost + 18 * NumTraits<Scalar>::AddCost,
322 PacketAccess = packet_traits<Scalar>::HasNdtri
330 #endif // EIGEN_SPECIALFUNCTIONS_FUNCTORS_H const Eigen::CwiseBinaryOp< Eigen::internal::scalar_igamma_der_a_op< typename Derived::Scalar >, const Derived, const ExponentDerived > igamma_der_a(const Eigen::ArrayBase< Derived > &a, const Eigen::ArrayBase< ExponentDerived > &x)
Definition: SpecialFunctionsArrayAPI.h:51
Namespace containing all symbols from the Eigen library.
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_ndtri_op< typename Derived::Scalar >, const Derived > ndtri(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_lgamma_op< typename Derived::Scalar >, const Derived > lgamma(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseBinaryOp< Eigen::internal::scalar_igammac_op< typename Derived::Scalar >, const Derived, const ExponentDerived > igammac(const Eigen::ArrayBase< Derived > &a, const Eigen::ArrayBase< ExponentDerived > &x)
Definition: SpecialFunctionsArrayAPI.h:90
const Eigen::CwiseBinaryOp< Eigen::internal::scalar_igamma_op< typename Derived::Scalar >, const Derived, const ExponentDerived > igamma(const Eigen::ArrayBase< Derived > &a, const Eigen::ArrayBase< ExponentDerived > &x)
Definition: SpecialFunctionsArrayAPI.h:28
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_erfc_op< typename Derived::Scalar >, const Derived > erfc(const Eigen::ArrayBase< Derived > &x)
const TensorCwiseTernaryOp< internal::scalar_betainc_op< typename XDerived::Scalar >, const ADerived, const BDerived, const XDerived > betainc(const ADerived &a, const BDerived &b, const XDerived &x)
Definition: TensorGlobalFunctions.h:24
const Eigen::CwiseBinaryOp< Eigen::internal::scalar_gamma_sample_der_alpha_op< typename AlphaDerived::Scalar >, const AlphaDerived, const SampleDerived > gamma_sample_der_alpha(const Eigen::ArrayBase< AlphaDerived > &alpha, const Eigen::ArrayBase< SampleDerived > &sample)
Definition: SpecialFunctionsArrayAPI.h:72
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_digamma_op< typename Derived::Scalar >, const Derived > digamma(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseBinaryOp< Eigen::internal::scalar_zeta_op< typename DerivedX::Scalar >, const DerivedX, const DerivedQ > zeta(const Eigen::ArrayBase< DerivedX > &x, const Eigen::ArrayBase< DerivedQ > &q)
Definition: SpecialFunctionsArrayAPI.h:156
const Eigen::CwiseBinaryOp< Eigen::internal::scalar_polygamma_op< typename DerivedX::Scalar >, const DerivedN, const DerivedX > polygamma(const Eigen::ArrayBase< DerivedN > &n, const Eigen::ArrayBase< DerivedX > &x)
Definition: SpecialFunctionsArrayAPI.h:112