Lines Matching full:scalar
44 template <typename Scalar>
47 static EIGEN_STRONG_INLINE Scalar run(const Scalar) { in run()
48 EIGEN_STATIC_ASSERT((internal::is_same<Scalar, Scalar>::value == false), in run()
50 return Scalar(0); in run()
54 template <typename Scalar>
56 typedef Scalar type;
109 template <typename Scalar>
111 typedef Scalar type;
119 * input Scalar s, assuming s is above 10.0.
121 * If s is above a certain threshold for the given Scalar type, zero
123 * coefficients for results matching Scalar machine precision.
127 template <typename Scalar>
130 static EIGEN_STRONG_INLINE Scalar run(const Scalar) {
131 EIGEN_STATIC_ASSERT((internal::is_same<Scalar, Scalar>::value == false),
133 return Scalar(0);
180 template <typename Scalar>
183 static Scalar run(Scalar x) {
241 Scalar p, q, nz, s, w, y;
244 const Scalar nan = NumTraits<Scalar>::quiet_NaN();
245 const Scalar m_pi = Scalar(EIGEN_PI);
247 const Scalar zero = Scalar(0);
248 const Scalar one = Scalar(1);
249 const Scalar half = Scalar(0.5);
279 while (s < Scalar(10)) {
284 y = digamma_impl_maybe_poly<Scalar>::run(s);
356 template <typename Scalar>
358 typedef Scalar type;
391 template <typename Scalar>
394 static EIGEN_STRONG_INLINE Scalar run(const Scalar) {
395 EIGEN_STATIC_ASSERT((internal::is_same<Scalar, Scalar>::value == false),
397 return Scalar(0);
401 template <typename Scalar>
403 typedef Scalar type;
493 typedef typename unpacket_traits<T>::type Scalar;
494 const T sign_mask = pset1<T>(Scalar(-0.0));
511 // We split this computation in to two so that in the scalar path
644 template <typename Scalar>
646 typedef Scalar type;
651 template <typename Scalar>
654 static EIGEN_STRONG_INLINE Scalar run(const Scalar) {
655 EIGEN_STATIC_ASSERT((internal::is_same<Scalar, Scalar>::value == false),
657 return Scalar(0);
663 template <typename Scalar>
666 static EIGEN_STRONG_INLINE Scalar run(const Scalar x) {
667 return generic_ndtri<Scalar, Scalar>(x);
678 template <typename Scalar>
680 typedef Scalar type;
684 template <typename Scalar>
687 …static EIGEN_STRONG_INLINE Scalar machep() { assert(false && "machep not supported for this type")…
689 …static EIGEN_STRONG_INLINE Scalar big() { assert(false && "big not supported for this type"); retu…
691 …static EIGEN_STRONG_INLINE Scalar biginv() { assert(false && "biginv not supported for this type")…
731 template <typename Scalar>
733 static EIGEN_STRONG_INLINE Scalar main_igamma_term(Scalar a, Scalar x) {
735 Scalar logax = a * numext::log(x) - x - lgamma_impl<Scalar>::run(a);
736 if (logax < -numext::log(NumTraits<Scalar>::highest()) ||
739 return Scalar(0);
744 template <typename Scalar, IgammaComputationMode mode>
753 if (internal::is_same<Scalar, float>::value) {
755 } else if (internal::is_same<Scalar, double>::value) {
762 template <typename Scalar, IgammaComputationMode mode>
774 static Scalar run(Scalar a, Scalar x) {
775 const Scalar zero = 0;
776 const Scalar one = 1;
777 const Scalar two = 2;
778 const Scalar machep = cephes_helper<Scalar>::machep();
779 const Scalar big = cephes_helper<Scalar>::big();
780 const Scalar biginv = cephes_helper<Scalar>::biginv();
786 Scalar ax = main_igamma_term<Scalar>(a, x);
796 Scalar y = one - a;
797 Scalar z = x + y + one;
798 Scalar c = zero;
799 Scalar pkm2 = one;
800 Scalar qkm2 = x;
801 Scalar pkm1 = x + one;
802 Scalar qkm1 = z * x;
803 Scalar ans = pkm1 / qkm1;
805 Scalar dpkm2_da = zero;
806 Scalar dqkm2_da = zero;
807 Scalar dpkm1_da = zero;
808 Scalar dqkm1_da = -x;
809 Scalar dans_da = (dpkm1_da - ans * dqkm1_da) / qkm1;
811 for (int i = 0; i < igamma_num_iterations<Scalar, mode>(); i++) {
816 Scalar yc = y * c;
817 Scalar pk = pkm1 * z - pkm2 * yc;
818 Scalar qk = qkm1 * z - qkm2 * yc;
820 Scalar dpk_da = dpkm1_da * z - pkm1 - dpkm2_da * yc + pkm2 * c;
821 Scalar dqk_da = dqkm1_da * z - qkm1 - dqkm2_da * yc + qkm2 * c;
824 Scalar ans_prev = ans;
827 Scalar dans_da_prev = dans_da;
865 Scalar dlogax_da = numext::log(x) - digamma_impl<Scalar>::run(a);
866 Scalar dax_da = ax * dlogax_da;
880 template <typename Scalar, IgammaComputationMode mode>
891 static Scalar run(Scalar a, Scalar x) {
892 const Scalar zero = 0;
893 const Scalar one = 1;
894 const Scalar machep = cephes_helper<Scalar>::machep();
896 Scalar ax = main_igamma_term<Scalar>(a, x);
909 Scalar r = a;
910 Scalar c = one;
911 Scalar ans = one;
913 Scalar dc_da = zero;
914 Scalar dans_da = zero;
916 for (int i = 0; i < igamma_num_iterations<Scalar, mode>(); i++) {
918 Scalar term = x / r;
919 Scalar dterm_da = -x / (r * r);
936 Scalar dlogax_da = numext::log(x) - digamma_impl<Scalar>::run(a + one);
937 Scalar dax_da = ax * dlogax_da;
953 template <typename Scalar>
956 static Scalar run(Scalar a, Scalar x) {
957 EIGEN_STATIC_ASSERT((internal::is_same<Scalar, Scalar>::value == false),
959 return Scalar(0);
965 template <typename Scalar>
968 static Scalar run(Scalar a, Scalar x) {
1023 const Scalar zero = 0;
1024 const Scalar one = 1;
1025 const Scalar nan = NumTraits<Scalar>::quiet_NaN();
1037 return (one - igamma_series_impl<Scalar, VALUE>::run(a, x));
1040 return igammac_cf_impl<Scalar, VALUE>::run(a, x);
1052 template <typename Scalar, IgammaComputationMode mode>
1055 static EIGEN_STRONG_INLINE Scalar run(Scalar a, Scalar x) {
1056 EIGEN_STATIC_ASSERT((internal::is_same<Scalar, Scalar>::value == false),
1058 return Scalar(0);
1064 template <typename Scalar, IgammaComputationMode mode>
1067 static Scalar run(Scalar a, Scalar x) {
1076 const Scalar zero = 0;
1077 const Scalar one = 1;
1078 const Scalar nan = NumTraits<Scalar>::quiet_NaN();
1091 Scalar ret = igammac_cf_impl<Scalar, mode>::run(a, x);
1099 return igamma_series_impl<Scalar, mode>::run(a, x);
1105 template <typename Scalar>
1107 typedef Scalar type;
1110 template <typename Scalar>
1111 struct igamma_impl : igamma_generic_impl<Scalar, VALUE> {
1181 template <typename Scalar>
1182 struct igamma_der_a_retval : igamma_retval<Scalar> {};
1184 template <typename Scalar>
1185 struct igamma_der_a_impl : igamma_generic_impl<Scalar, DERIVATIVE> {
1202 template <typename Scalar>
1203 struct gamma_sample_der_alpha_retval : igamma_retval<Scalar> {};
1205 template <typename Scalar>
1207 : igamma_generic_impl<Scalar, SAMPLE_DERIVATIVE> {
1251 template <typename Scalar>
1253 typedef Scalar type;
1256 template <typename Scalar>
1259 static EIGEN_STRONG_INLINE Scalar run(const Scalar) {
1260 EIGEN_STATIC_ASSERT((internal::is_same<Scalar, Scalar>::value == false),
1262 return Scalar(0);
1306 template <typename Scalar>
1309 static Scalar run(Scalar x, Scalar q) {
1372 Scalar p, r, a, b, k, s, t, w;
1374 const Scalar A[] = {
1375 Scalar(12.0),
1376 Scalar(-720.0),
1377 Scalar(30240.0),
1378 Scalar(-1209600.0),
1379 Scalar(47900160.0),
1380 Scalar(-1.8924375803183791606e9), /*1.307674368e12/691*/
1381 Scalar(7.47242496e10),
1382 Scalar(-2.950130727918164224e12), /*1.067062284288e16/3617*/
1383 Scalar(1.1646782814350067249e14), /*5.109094217170944e18/43867*/
1384 Scalar(-4.5979787224074726105e15), /*8.028576626982912e20/174611*/
1385 Scalar(1.8152105401943546773e17), /*1.5511210043330985984e23/854513*/
1386 Scalar(-7.1661652561756670113e18) /*1.6938241367317436694528e27/236364091*/
1389 const Scalar maxnum = NumTraits<Scalar>::infinity();
1390 const Scalar zero = 0.0, half = 0.5, one = 1.0;
1391 const Scalar machep = cephes_helper<Scalar>::machep();
1392 const Scalar nan = NumTraits<Scalar>::quiet_NaN();
1428 if (zeta_impl_series<Scalar>::run(a, b, s, x, machep)) {
1460 template <typename Scalar>
1462 typedef Scalar type;
1467 template <typename Scalar>
1470 static EIGEN_STRONG_INLINE Scalar run(Scalar n, Scalar x) {
1471 EIGEN_STATIC_ASSERT((internal::is_same<Scalar, Scalar>::value == false),
1473 return Scalar(0);
1479 template <typename Scalar>
1482 static Scalar run(Scalar n, Scalar x) {
1483 Scalar zero = 0.0, one = 1.0;
1484 Scalar nplus = n + one;
1485 const Scalar nan = NumTraits<Scalar>::quiet_NaN();
1493 return digamma_impl<Scalar>::run(x);
1497 Scalar factorial = numext::exp(lgamma_impl<Scalar>::run(nplus));
1498 return numext::pow(-one, nplus) * factorial * zeta_impl<Scalar>::run(nplus, x);
1509 template <typename Scalar>
1511 typedef Scalar type;
1516 template <typename Scalar>
1519 static EIGEN_STRONG_INLINE Scalar run(Scalar a, Scalar b, Scalar x) {
1520 EIGEN_STATIC_ASSERT((internal::is_same<Scalar, Scalar>::value == false),
1522 return Scalar(0);
1528 template <typename Scalar>
1531 static EIGEN_STRONG_INLINE Scalar run(Scalar, Scalar, Scalar) {
1601 EIGEN_STATIC_ASSERT((internal::is_same<Scalar, Scalar>::value == false),
1603 return Scalar(0);
1610 template <typename Scalar>
1613 static EIGEN_STRONG_INLINE Scalar run(Scalar a, Scalar b, Scalar x, bool small_branch) {
1614 EIGEN_STATIC_ASSERT((internal::is_same<Scalar, float>::value ||
1615 internal::is_same<Scalar, double>::value),
1617 const Scalar big = cephes_helper<Scalar>::big();
1618 const Scalar machep = cephes_helper<Scalar>::machep();
1619 const Scalar biginv = cephes_helper<Scalar>::biginv();
1621 const Scalar zero = 0;
1622 const Scalar one = 1;
1623 const Scalar two = 2;
1625 Scalar xk, pk, pkm1, pkm2, qk, qkm1, qkm2;
1626 Scalar k1, k2, k3, k4, k5, k6, k7, k8, k26update;
1627 Scalar ans;
1630 const int num_iters = (internal::is_same<Scalar, float>::value) ? 100 : 300;
1631 const Scalar thresh =
1632 (internal::is_same<Scalar, float>::value) ? machep : Scalar(3) * machep;
1633 Scalar r = (internal::is_same<Scalar, float>::value) ? zero : one;
1717 /* Helper functions depending on the Scalar type */
1718 template <typename Scalar>
1970 template <typename Scalar>
1971 EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(lgamma, Scalar)
1972 lgamma(const Scalar& x) {
1973 return EIGEN_MATHFUNC_IMPL(lgamma, Scalar)::run(x);
1976 template <typename Scalar>
1977 EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(digamma, Scalar)
1978 digamma(const Scalar& x) {
1979 return EIGEN_MATHFUNC_IMPL(digamma, Scalar)::run(x);
1982 template <typename Scalar>
1983 EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(zeta, Scalar)
1984 zeta(const Scalar& x, const Scalar& q) {
1985 return EIGEN_MATHFUNC_IMPL(zeta, Scalar)::run(x, q);
1988 template <typename Scalar>
1989 EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(polygamma, Scalar)
1990 polygamma(const Scalar& n, const Scalar& x) {
1991 return EIGEN_MATHFUNC_IMPL(polygamma, Scalar)::run(n, x);
1994 template <typename Scalar>
1995 EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(erf, Scalar)
1996 erf(const Scalar& x) {
1997 return EIGEN_MATHFUNC_IMPL(erf, Scalar)::run(x);
2000 template <typename Scalar>
2001 EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(erfc, Scalar)
2002 erfc(const Scalar& x) {
2003 return EIGEN_MATHFUNC_IMPL(erfc, Scalar)::run(x);
2006 template <typename Scalar>
2007 EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(ndtri, Scalar)
2008 ndtri(const Scalar& x) {
2009 return EIGEN_MATHFUNC_IMPL(ndtri, Scalar)::run(x);
2012 template <typename Scalar>
2013 EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(igamma, Scalar)
2014 igamma(const Scalar& a, const Scalar& x) {
2015 return EIGEN_MATHFUNC_IMPL(igamma, Scalar)::run(a, x);
2018 template <typename Scalar>
2019 EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(igamma_der_a, Scalar)
2020 igamma_der_a(const Scalar& a, const Scalar& x) {
2021 return EIGEN_MATHFUNC_IMPL(igamma_der_a, Scalar)::run(a, x);
2024 template <typename Scalar>
2025 EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(gamma_sample_der_alpha, Scalar)
2026 gamma_sample_der_alpha(const Scalar& a, const Scalar& x) {
2027 return EIGEN_MATHFUNC_IMPL(gamma_sample_der_alpha, Scalar)::run(a, x);
2030 template <typename Scalar>
2031 EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(igammac, Scalar)
2032 igammac(const Scalar& a, const Scalar& x) {
2033 return EIGEN_MATHFUNC_IMPL(igammac, Scalar)::run(a, x);
2036 template <typename Scalar>
2037 EIGEN_DEVICE_FUNC inline EIGEN_MATHFUNC_RETVAL(betainc, Scalar)
2038 betainc(const Scalar& a, const Scalar& b, const Scalar& x) {
2039 return EIGEN_MATHFUNC_IMPL(betainc, Scalar)::run(a, b, x);