1 #ifndef __STAN__PROB__DISTRIBUTIONS__UNIVARIATE__CONTINUOUS__GAMMA_HPP__
2 #define __STAN__PROB__DISTRIBUTIONS__UNIVARIATE__CONTINUOUS__GAMMA_HPP__
4 #include <boost/random/gamma_distribution.hpp>
5 #include <boost/random/variate_generator.hpp>
40 template <
bool propto,
41 typename T_y,
typename T_shape,
typename T_inv_scale,
43 typename return_type<T_y,T_shape,T_inv_scale>::type
44 gamma_log(
const T_y& y,
const T_shape& alpha,
const T_inv_scale& beta,
46 static const char*
function =
"stan::prob::gamma_log(%1%)";
66 if (!
check_not_nan(
function, y,
"Random variable", &logp, Policy()))
74 if (!
check_finite(
function, beta,
"Inverse scale parameter",
82 "Random variable",
"Shape parameter",
"Inverse scale parameter",
95 for (
size_t n = 0; n <
length(y); n++) {
96 const double y_dbl =
value_of(y_vec[n]);
101 size_t N =
max_size(y, alpha, beta);
106 using boost::math::digamma;
111 for(
size_t n = 0; n <
length(y); n++) {
117 lgamma_alpha(
length(alpha));
119 digamma_alpha(
length(alpha));
120 for (
size_t n = 0; n <
length(alpha); n++) {
124 digamma_alpha[n] = digamma(
value_of(alpha_vec[n]));
130 for (
size_t n = 0; n <
length(beta); n++)
133 for (
size_t n = 0; n < N; n++) {
135 const double y_dbl =
value_of(y_vec[n]);
136 const double alpha_dbl =
value_of(alpha_vec[n]);
137 const double beta_dbl =
value_of(beta_vec[n]);
140 logp -= lgamma_alpha[n];
142 logp += alpha_dbl * log_beta[n];
144 logp += (alpha_dbl-1.0) * log_y[n];
146 logp -= beta_dbl * y_dbl;
150 operands_and_partials.
d_x1[n] += (alpha_dbl-1)/y_dbl - beta_dbl;
152 operands_and_partials.
d_x2[n] += -digamma_alpha[n] + log_beta[n] + log_y[n];
154 operands_and_partials.
d_x3[n] += alpha_dbl / beta_dbl - y_dbl;
156 return operands_and_partials.
to_var(logp);
159 template <
bool propto,
160 typename T_y,
typename T_shape,
typename T_inv_scale>
163 gamma_log(
const T_y& y,
const T_shape& alpha,
const T_inv_scale& beta) {
167 template <
typename T_y,
typename T_shape,
typename T_inv_scale,
171 gamma_log(
const T_y& y,
const T_shape& alpha,
const T_inv_scale& beta,
173 return gamma_log<false>(y,alpha,beta,Policy());
176 template <
typename T_y,
typename T_shape,
typename T_inv_scale>
179 gamma_log(
const T_y& y,
const T_shape& alpha,
const T_inv_scale& beta) {
246 using boost::variate_generator;
247 using boost::gamma_distribution;
248 variate_generator<RNG&, gamma_distribution<> >
249 gamma_rng(rng, gamma_distribution<>(alpha, beta));