1 #ifndef __STAN__PROB__DISTRIBUTIONS__UNIVARIATE__DISCRETE__NEG_BINOMIAL_HPP__
2 #define __STAN__PROB__DISTRIBUTIONS__UNIVARIATE__DISCRETE__NEG_BINOMIAL_HPP__
16 template <
bool propto,
18 typename T_shape,
typename T_inv_scale,
20 typename return_type<T_shape, T_inv_scale>::type
23 const T_inv_scale& beta,
26 static const char*
function =
"stan::prob::neg_binomial_log(%1%)";
44 if (!
check_finite(
function, alpha,
"Shape parameter", &logp, Policy()))
46 if (!
check_positive(
function, alpha,
"Shape parameter", &logp, Policy()))
48 if (!
check_finite(
function, beta,
"Inverse scale parameter",
56 "Failures variable",
"Shape parameter",
"Inverse scale parameter",
71 size_t size =
max_size(n, alpha, beta);
73 for (
size_t i = 0; i < size; i++) {
75 if (alpha_vec[i] > 1e10) {
77 logp -=
lgamma(n_vec[i] + 1.0);
81 lambda = alpha_vec[i] / beta_vec[i];
88 logp += binomial_coefficient_log<typename scalar_type<T_shape>::type>
89 (n_vec[i] + alpha_vec[i] - 1.0, n_vec[i]);
91 logp += -n_vec[i] *
log1p(beta_vec[i])
92 + alpha_vec[i] *
log(beta_vec[i] / (1 + beta_vec[i]));
98 template <
bool propto,
100 typename T_shape,
typename T_inv_scale>
104 const T_shape& alpha,
105 const T_inv_scale& beta) {
106 return neg_binomial_log<propto>(n,alpha,beta,
110 template <
typename T_n,
111 typename T_shape,
typename T_inv_scale,
116 const T_shape& alpha,
117 const T_inv_scale& beta,
119 return neg_binomial_log<false>(n,alpha,beta,Policy());
122 template <
typename T_n,
123 typename T_shape,
typename T_inv_scale>
127 const T_shape& alpha,
128 const T_inv_scale& beta) {
129 return neg_binomial_log<false>(n,alpha,beta,