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>
13 double F32(
double a,
double b,
double c,
double d,
double e,
double z,
double precision = 1e-6)
26 while( (
fabs(tNew) > precision) || (k == 0) )
29 double p = (a + k) * (b + k) * (c + k) / ( (d + k) * (e + k) * (k + 1) );
49 void gradF32(
double* g,
double a,
double b,
double c,
double d,
double e,
double z,
double precision = 1e-6)
54 for(
double *p = g; p != g + 6; ++p) *p = 0;
55 for(
double *p = gOld; p != gOld + 6; ++p) *p = 0;
66 while( (
fabs(tNew) > precision) || (k == 0) )
69 double C = (a + k) / (d + k);
70 C *= (b + k) / (e + k);
71 C *= (c + k) / (1 + k);
81 gOld[0] = tNew * (gOld[0] / tOld + 1.0 / (a + k) );
82 gOld[1] = tNew * (gOld[1] / tOld + 1.0 / (b + k) );
83 gOld[2] = tNew * (gOld[2] / tOld + 1.0 / (c + k) );
85 gOld[3] = tNew * (gOld[3] / tOld - 1.0 / (d + k) );
86 gOld[4] = tNew * (gOld[4] / tOld - 1.0 / (e + k) );
88 gOld[5] = tNew * ( gOld[5] / tOld + 1.0 / z );
90 for(
int i = 0; i < 6; ++i) g[i] += gOld[i];
101 void grad2F1(
double& gradA,
double& gradC,
double a,
double b,
double c,
double z,
double precision = 1
e-6)
111 double tDak = 1.0 / (a - 1);
113 while( (
fabs(tDak * (a + (k - 1)) ) > precision) || (k == 0) )
116 const double r = ( (a + k) / (c + k) ) * ( (b + k) / (double)(k + 1) ) * z;
117 tDak = r * tDak * (a + (k - 1)) / (a + k);
121 gradAold = r * gradAold + tDak;
122 gradCold = r * gradCold - tDak * ((a + k) / (c + k));
139 void gradIncBeta(
double& g1,
double& g2,
double a,
double b,
double z)
144 double c3 = boost::math::beta(a, b, z);
146 double C =
std::exp( a * c1 + b * c2 ) / a;
151 if(C)
grad2F1(dF1, dF2, a + b, 1, a + 1, z);
154 g1 = (c1 - 1.0 / a) * c3 + C * (dF1 + dF2);
155 g2 = c2 * c3 + C * dF1;
161 double digammaA,
double digammaB,
double digammaSum,
double betaAB)
169 double b1 = boost::math::beta(a, b, z);
171 g1 = ( dBda - b1 * (digammaA - digammaSum) ) / betaAB;
172 g2 = ( dBdb - b1 * (digammaB - digammaSum) ) / betaAB;
180 using boost::math::gamma_p;
187 double delta = s / (a * a);
189 while (
fabs(delta) > precision)
194 delta = s / ((k + a) * (k + a));
200 return gamma_p(a, z) * ( dig - l ) +
std::exp( a * l ) * S / g;