10 #ifndef EIGEN_CUDA_SPECIALFUNCTIONS_H
11 #define EIGEN_CUDA_SPECIALFUNCTIONS_H
20 #if defined(__CUDACC__) && defined(EIGEN_USE_GPU)
22 template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
23 float4 plgamma<float4>(
const float4& a)
25 return make_float4(lgammaf(a.x), lgammaf(a.y), lgammaf(a.z), lgammaf(a.w));
28 template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
29 double2 plgamma<double2>(
const double2& a)
35 template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
36 float4 pdigamma<float4>(
const float4& a)
38 using numext::digamma;
42 template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
43 double2 pdigamma<double2>(
const double2& a)
45 using numext::digamma;
49 template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
50 float4 pzeta<float4>(
const float4& x,
const float4& q)
53 return make_float4(zeta(x.x, q.x), zeta(x.y, q.y), zeta(x.z, q.z), zeta(x.w, q.w));
56 template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
57 double2 pzeta<double2>(
const double2& x,
const double2& q)
60 return make_double2(zeta(x.x, q.x), zeta(x.y, q.y));
63 template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
64 float4 ppolygamma<float4>(
const float4& n,
const float4& x)
66 using numext::polygamma;
67 return make_float4(polygamma(n.x, x.x), polygamma(n.y, x.y), polygamma(n.z, x.z), polygamma(n.w, x.w));
70 template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
71 double2 ppolygamma<double2>(
const double2& n,
const double2& x)
73 using numext::polygamma;
74 return make_double2(polygamma(n.x, x.x), polygamma(n.y, x.y));
77 template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
78 float4 perf<float4>(
const float4& a)
80 return make_float4(erff(a.x), erff(a.y), erff(a.z), erff(a.w));
83 template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
84 double2 perf<double2>(
const double2& a)
87 return make_double2(
erf(a.x),
erf(a.y));
90 template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
91 float4 perfc<float4>(
const float4& a)
97 template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
98 double2 perfc<double2>(
const double2& a)
101 return make_double2(
erfc(a.x),
erfc(a.y));
105 template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
106 float4 pigamma<float4>(
const float4& a,
const float4& x)
108 using numext::igamma;
116 template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
117 double2 pigamma<double2>(
const double2& a,
const double2& x)
119 using numext::igamma;
120 return make_double2(igamma(a.x, x.x), igamma(a.y, x.y));
123 template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
124 float4 pigammac<float4>(
const float4& a,
const float4& x)
126 using numext::igammac;
134 template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
135 double2 pigammac<double2>(
const double2& a,
const double2& x)
137 using numext::igammac;
138 return make_double2(igammac(a.x, x.x), igammac(a.y, x.y));
141 template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
142 float4 pbetainc<float4>(
const float4& a,
const float4& b,
const float4& x)
144 using numext::betainc;
146 betainc(a.x, b.x, x.x),
147 betainc(a.y, b.y, x.y),
148 betainc(a.z, b.z, x.z),
149 betainc(a.w, b.w, x.w));
152 template<> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
153 double2 pbetainc<double2>(
const double2& a,
const double2& b,
const double2& x)
155 using numext::betainc;
156 return make_double2(betainc(a.x, b.x, x.x), betainc(a.y, b.y, x.y));
165 #endif // EIGEN_CUDA_SPECIALFUNCTIONS_H
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_lgamma_op< typename Derived::Scalar >, const Derived > lgamma(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_erf_op< typename Derived::Scalar >, const Derived > erf(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_erfc_op< typename Derived::Scalar >, const Derived > erfc(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_digamma_op< typename Derived::Scalar >, const Derived > digamma(const Eigen::ArrayBase< Derived > &x)