1 #ifndef __STAN__PROB__DISTRIBUTIONS__UNIVARIATE__CONTINUOUS__INV_GAMMA_HPP__
2 #define __STAN__PROB__DISTRIBUTIONS__UNIVARIATE__CONTINUOUS__INV_GAMMA_HPP__
31 template <
bool propto,
32 typename T_y,
typename T_shape,
typename T_scale,
34 typename return_type<T_y,T_shape,T_scale>::type
37 static const char*
function =
"stan::prob::inv_gamma_log(%1%)";
43 using boost::math::tools::promote_args;
56 if (!
check_not_nan(
function, y,
"Random variable", &logp, Policy()))
72 "Random variable",
"Shape parameter",
"Scale parameter",
85 for (
size_t n = 0; n <
length(y); n++) {
86 const double y_dbl =
value_of(y_vec[n]);
96 using boost::math::digamma;
102 for(
size_t n = 0; n <
length(y); n++) {
107 inv_y[n] = 1.0 /
value_of(y_vec[n]);
111 lgamma_alpha(
length(alpha));
113 digamma_alpha(
length(alpha));
114 for (
size_t n = 0; n <
length(alpha); n++) {
118 digamma_alpha[n] = digamma(
value_of(alpha_vec[n]));
124 for (
size_t n = 0; n <
length(beta); n++)
127 for (
size_t n = 0; n < N; n++) {
129 const double alpha_dbl =
value_of(alpha_vec[n]);
130 const double beta_dbl =
value_of(beta_vec[n]);
133 logp -= lgamma_alpha[n];
135 logp += alpha_dbl * log_beta[n];
137 logp -= (alpha_dbl+1.0) * log_y[n];
139 logp -= beta_dbl * inv_y[n];
143 operands_and_partials.
d_x1[n] += -(alpha_dbl+1) * inv_y[n] + beta_dbl * inv_y[n] * inv_y[n];
145 operands_and_partials.
d_x2[n] += -digamma_alpha[n] + log_beta[n] - log_y[n];
147 operands_and_partials.
d_x3[n] += alpha_dbl / beta_dbl - inv_y[n];
149 return operands_and_partials.
to_var(logp);
152 template <
bool propto,
153 typename T_y,
typename T_shape,
typename T_scale>
160 template <
typename T_y,
typename T_shape,
typename T_scale,
166 return inv_gamma_log<false>(y,alpha,beta,Policy());
169 template <
typename T_y,
typename T_shape,
typename T_scale>