12#ifndef EIGEN_SPECIALFUNCTIONS_FUNCTORS_H
13#define EIGEN_SPECIALFUNCTIONS_FUNCTORS_H
16#include "./InternalHeaderCheck.h"
27template <
typename Scalar>
28struct scalar_igamma_op : binary_op_base<Scalar, Scalar> {
29 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar operator()(
const Scalar& a,
const Scalar& x)
const {
33 template <
typename Packet>
34 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a,
const Packet& x)
const {
35 return internal::pigamma(a, x);
38template <
typename Scalar>
39struct functor_traits<scalar_igamma_op<Scalar> > {
42 Cost = 20 * NumTraits<Scalar>::MulCost + 10 * NumTraits<Scalar>::AddCost,
43 PacketAccess = packet_traits<Scalar>::HasIGamma
53template <
typename Scalar>
54struct scalar_igamma_der_a_op {
55 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar operator()(
const Scalar& a,
const Scalar& x)
const {
56 using numext::igamma_der_a;
59 template <
typename Packet>
60 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a,
const Packet& x)
const {
61 return internal::pigamma_der_a(a, x);
64template <
typename Scalar>
65struct functor_traits<scalar_igamma_der_a_op<Scalar> > {
68 Cost = 40 * NumTraits<Scalar>::MulCost + 20 * NumTraits<Scalar>::AddCost,
69 PacketAccess = packet_traits<Scalar>::HasIGammaDerA
80template <
typename Scalar>
81struct scalar_gamma_sample_der_alpha_op {
82 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar operator()(
const Scalar& alpha,
const Scalar& sample)
const {
83 using numext::gamma_sample_der_alpha;
86 template <
typename Packet>
87 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& alpha,
const Packet& sample)
const {
88 return internal::pgamma_sample_der_alpha(alpha, sample);
91template <
typename Scalar>
92struct functor_traits<scalar_gamma_sample_der_alpha_op<Scalar> > {
95 Cost = 30 * NumTraits<Scalar>::MulCost + 15 * NumTraits<Scalar>::AddCost,
96 PacketAccess = packet_traits<Scalar>::HasGammaSampleDerAlpha
105template <
typename Scalar>
106struct scalar_igammac_op : binary_op_base<Scalar, Scalar> {
107 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar operator()(
const Scalar& a,
const Scalar& x)
const {
108 using numext::igammac;
111 template <
typename Packet>
112 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Packet packetOp(
const Packet& a,
const Packet& x)
const {
113 return internal::pigammac(a, x);
116template <
typename Scalar>
117struct functor_traits<scalar_igammac_op<Scalar> > {
120 Cost = 20 * NumTraits<Scalar>::MulCost + 10 * NumTraits<Scalar>::AddCost,
121 PacketAccess = packet_traits<Scalar>::HasIGammac
129template <
typename Scalar>
130struct scalar_betainc_op {
131 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar operator()(
const Scalar& x,
const Scalar& a,
132 const Scalar& b)
const {
133 using numext::betainc;
136 template <
typename Packet>
137 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);
141template <
typename Scalar>
142struct functor_traits<scalar_betainc_op<Scalar> > {
145 Cost = 400 * NumTraits<Scalar>::MulCost + 400 * NumTraits<Scalar>::AddCost,
146 PacketAccess = packet_traits<Scalar>::HasBetaInc
155template <
typename Scalar>
156struct scalar_lgamma_op {
157 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar operator()(
const Scalar& a)
const {
158 using numext::lgamma;
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); }
164template <
typename Scalar>
165struct functor_traits<scalar_lgamma_op<Scalar> > {
168 Cost = 10 * NumTraits<Scalar>::MulCost + 5 * NumTraits<Scalar>::AddCost,
169 PacketAccess = packet_traits<Scalar>::HasLGamma
177template <
typename Scalar>
178struct scalar_digamma_op {
179 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar operator()(
const Scalar& a)
const {
180 using numext::digamma;
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); }
186template <
typename Scalar>
187struct functor_traits<scalar_digamma_op<Scalar> > {
190 Cost = 10 * NumTraits<Scalar>::MulCost + 5 * NumTraits<Scalar>::AddCost,
191 PacketAccess = packet_traits<Scalar>::HasDiGamma
199template <
typename Scalar>
200struct scalar_zeta_op {
201 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar operator()(
const Scalar& x,
const Scalar& q)
const {
205 typedef typename packet_traits<Scalar>::type Packet;
206 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(
const Packet& x,
const Packet& q)
const {
207 return internal::pzeta(x, q);
210template <
typename Scalar>
211struct functor_traits<scalar_zeta_op<Scalar> > {
214 Cost = 10 * NumTraits<Scalar>::MulCost + 5 * NumTraits<Scalar>::AddCost,
215 PacketAccess = packet_traits<Scalar>::HasZeta
223template <
typename Scalar>
224struct scalar_polygamma_op {
225 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar operator()(
const Scalar& n,
const Scalar& x)
const {
226 using numext::polygamma;
229 typedef typename packet_traits<Scalar>::type Packet;
230 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(
const Packet& n,
const Packet& x)
const {
231 return internal::ppolygamma(n, x);
234template <
typename Scalar>
235struct functor_traits<scalar_polygamma_op<Scalar> > {
238 Cost = 10 * NumTraits<Scalar>::MulCost + 5 * NumTraits<Scalar>::AddCost,
239 PacketAccess = packet_traits<Scalar>::HasPolygamma
247template <
typename Scalar>
248struct scalar_erf_op {
249 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar operator()(
const Scalar& a)
const {
return numext::erf(a); }
250 template <
typename Packet>
251 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(
const Packet& x)
const {
255template <
typename Scalar>
256struct functor_traits<scalar_erf_op<Scalar> > {
258 PacketAccess = packet_traits<Scalar>::HasErf,
260#ifdef EIGEN_VECTORIZE_FMA
264 ? (2 * NumTraits<Scalar>::AddCost + 7 * NumTraits<Scalar>::MulCost +
265 scalar_div_cost<Scalar, packet_traits<Scalar>::HasDiv>::value)
267 ? (12 * NumTraits<Scalar>::AddCost + 12 * NumTraits<Scalar>::MulCost +
268 scalar_div_cost<Scalar, packet_traits<Scalar>::HasDiv>::value)
271 : (functor_traits<scalar_exp_op<Scalar> >::Cost))
280template <
typename Scalar>
281struct scalar_erfc_op {
282 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar operator()(
const Scalar& a)
const {
286 typedef typename packet_traits<Scalar>::type Packet;
287 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(
const Packet& a)
const {
return internal::perfc(a); }
289template <
typename Scalar>
290struct functor_traits<scalar_erfc_op<Scalar> > {
293 Cost = 10 * NumTraits<Scalar>::MulCost + 5 * NumTraits<Scalar>::AddCost,
294 PacketAccess = packet_traits<Scalar>::HasErfc
303template <
typename Scalar>
304struct scalar_ndtri_op {
305 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Scalar operator()(
const Scalar& a)
const {
309 typedef typename packet_traits<Scalar>::type Packet;
310 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(
const Packet& a)
const {
return internal::pndtri(a); }
312template <
typename Scalar>
313struct functor_traits<scalar_ndtri_op<Scalar> > {
318 Cost = 18 * NumTraits<Scalar>::MulCost + 18 * NumTraits<Scalar>::AddCost,
319 PacketAccess = packet_traits<Scalar>::HasNdtri
Namespace containing all symbols from the Eigen library.
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:86
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:49
const Eigen::CwiseTernaryOp< Eigen::internal::scalar_betainc_op< typename ArgXDerived::Scalar >, const ArgADerived, const ArgBDerived, const ArgXDerived > betainc(const Eigen::ArrayBase< ArgADerived > &a, const Eigen::ArrayBase< ArgBDerived > &b, const Eigen::ArrayBase< ArgXDerived > &x)
Definition SpecialFunctionsArrayAPI.h:120
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:69
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:103
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:31
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:141