double log_stadnorm_density (double x) { /* log-Normal(0,1) density, x in R */ return -0.91893853 -0.5*x*x; } double log_norm_density (double x, double my, double sigma2) { /* log-Normal(my, sigma2) density, my in R, sigma > 0, x in R */ double sigma; sigma = sqrt(sigma2); return -log(sigma) + log_stadnorm_density((x-my)/sigma); } double gammln (double xx) { double x, tmp, ser; static double cof[6] = {76.18009173, -86.50532033, 24.01409822, -1.231739516, 0.120858003e-2, -0.536382e-5}; int j; x = xx - 1.0; tmp = x + 5.5; tmp -= (x + 0.5) * log (tmp); ser = 1.0; for (j = 0; j <= 5; j++) { x += 1.0; ser += cof[j] / x; } return -tmp + log (2.50662827465 * ser); } double log_gamma_density (double x, double alpha, double lambda) { return (alpha*log(lambda)+(alpha-1)*log(x)-lambda*x-gammln (alpha)); }