HHRESULT CGaussianMDP::sample_s2 ( double &s2, double *phi, double m, int sizephi, double w, double W ) { double p1 = (double)sizephi/2.0 + w; double p2,s; int i; HHRESULT hr = HH_OK; s=0.0; for(i=0; i<sizephi; i++) { s += (phi[i]-m)*(phi[i]-m); } p2 = (s/2.0 + W); s2 = 1.0/ rgamma2(p1,p2); return hr; }
HHRESULT CGaussianMDP::sample_alpha ( double par1, double par2, int n, int k, double &alpha ) { double b,odds,prob; int ind; HHRESULT hr = HH_OK; b = rbeta(alpha+1,n); odds = (par1+k-1)/(n*(par2-log(b))); prob = odds/(odds+1); ind = (int)rbinom(1,prob); alpha = ind * rgamma2(par1+k, (par2-log(b))) + (1-ind) * rgamma2(par1+k-1, (par2-log(b))); return hr; }
double rgamma(double alpha, double beta) /* * Generates from a general gamma(alpha,beta) distribution */ { double random; if (alpha < 1) do { random = rgamma1(alpha)/beta; } while (random < 0 ); if (alpha == 1) random = rexp(1)/beta; if (alpha > 1) do { random = rgamma2(alpha)/beta; } while (random < 0); return random; }