1 #ifndef STAN__PROB__INTERNAL_MATH_HPP
2 #define STAN__PROB__INTERNAL_MATH_HPP
5 #include <boost/math/special_functions/gamma.hpp>
6 #include <boost/math/special_functions/beta.hpp>
7 #include <boost/math/special_functions/fpclassify.hpp>
14 double F32(
double a,
double b,
double c,
double d,
double e,
double z,
double precision = 1e-6)
27 while( (
fabs(tNew) > precision) || (k == 0) )
30 double p = (a + k) * (b + k) * (c + k) / ( (d + k) * (e + k) * (k + 1) );
50 void gradF32(
double* g,
double a,
double b,
double c,
double d,
double e,
double z,
double precision = 1e-6)
55 for(
double *p = g; p != g + 6; ++p) *p = 0;
56 for(
double *p = gOld; p != gOld + 6; ++p) *p = 0;
67 while( (
fabs(tNew) > precision) || (k == 0) )
70 double C = (a + k) / (d + k);
71 C *= (b + k) / (e + k);
72 C *= (c + k) / (1 + k);
82 gOld[0] = tNew * (gOld[0] / tOld + 1.0 / (a + k) );
83 gOld[1] = tNew * (gOld[1] / tOld + 1.0 / (b + k) );
84 gOld[2] = tNew * (gOld[2] / tOld + 1.0 / (c + k) );
86 gOld[3] = tNew * (gOld[3] / tOld - 1.0 / (d + k) );
87 gOld[4] = tNew * (gOld[4] / tOld - 1.0 / (e + k) );
89 gOld[5] = tNew * ( gOld[5] / tOld + 1.0 / z );
91 for(
int i = 0; i < 6; ++i) g[i] += gOld[i];
102 void grad2F1(
double& gradA,
double& gradC,
double a,
double b,
double c,
double z,
double precision = 1
e-6)
112 double tDak = 1.0 / (a - 1);
114 while( (
fabs(tDak * (a + (k - 1)) ) > precision) || (k == 0) )
117 const double r = ( (a + k) / (c + k) ) * ( (b + k) / (double)(k + 1) ) * z;
118 tDak = r * tDak * (a + (k - 1)) / (a + k);
122 gradAold = r * gradAold + tDak;
123 gradCold = r * gradCold - tDak * ((a + k) / (c + k));
140 void gradIncBeta(
double& g1,
double& g2,
double a,
double b,
double z)
145 double c3 = boost::math::beta(a, b, z);
147 double C =
std::exp( a * c1 + b * c2 ) / a;
152 if(C)
grad2F1(dF1, dF2, a + b, 1, a + 1, z);
155 g1 = (c1 - 1.0 / a) * c3 + C * (dF1 + dF2);
156 g2 = c2 * c3 + C * dF1;
162 double digammaA,
double digammaB,
double digammaSum,
double betaAB)
170 double b1 = boost::math::beta(a, b, z);
172 g1 = ( dBda - b1 * (digammaA - digammaSum) ) / betaAB;
173 g2 = ( dBdb - b1 * (digammaB - digammaSum) ) / betaAB;
182 double precision = 1
e-6) {
190 double delta = s / (a * a);
192 while (
fabs(delta) > precision) {
196 delta = s / ((k + a) * (k + a));
198 throw std::domain_error(
"stan::math::gradRegIncGamma not converging");
void grad2F1(double &gradA, double &gradC, double a, double b, double c, double z, double precision=1e-6)
fvar< T > fabs(const fvar< T > &x)
void gradRegIncBeta(double &g1, double &g2, double a, double b, double z, double digammaA, double digammaB, double digammaSum, double betaAB)
bool isinf(const stan::agrad::var &v)
Checks if the given number is infinite.
void gradF32(double *g, double a, double b, double c, double d, double e, double z, double precision=1e-6)
double gradRegIncGamma(double a, double z, double g, double dig, double precision=1e-6)
double F32(double a, double b, double c, double d, double e, double z, double precision=1e-6)
fvar< T > gamma_p(const fvar< T > &x1, const fvar< T > &x2)
void gradIncBeta(double &g1, double &g2, double a, double b, double z)
double e()
Return the base of the natural logarithm.
fvar< T > log(const fvar< T > &x)
fvar< T > exp(const fvar< T > &x)
double gamma_p(double x, double a)