1 #ifndef __STAN__PROB__DISTRIBUTIONS__UNIVARIATE__DISCRETE__POISSON_HPP__
2 #define __STAN__PROB__DISTRIBUTIONS__UNIVARIATE__DISCRETE__POISSON_HPP__
18 template <
bool propto,
19 typename T_n,
typename T_rate,
21 typename return_type<T_rate>::type
25 static const char*
function =
"stan::prob::poisson_log(%1%)";
45 "Rate parameter", &logp, Policy()))
48 "Rate parameter", &logp, Policy()))
52 "Random variable",
"Rate parameter",
65 for (
size_t i = 0; i < size; i++)
68 for (
size_t i = 0; i < size; i++)
69 if (lambda_vec[i] == 0 && n_vec[i] != 0)
76 for (
size_t i = 0; i < size; i++) {
77 if (!(lambda_vec[i] == 0 && n_vec[i] == 0)) {
79 logp -=
lgamma(n_vec[i] + 1.0);
87 operands_and_partials.
d_x1[i] += n_vec[i] /
value_of(lambda_vec[i]) - 1.0;
92 return operands_and_partials.
to_var(logp);
95 template <
bool propto,
105 template <
typename T_n,
112 return poisson_log<false>(n,lambda,Policy());
116 template <
typename T_n,
129 template <
bool propto,
130 typename T_n,
typename T_log_rate,
136 static const char*
function =
"stan::prob::poisson_log_log(%1%)";
157 "Log rate parameter", &logp, Policy()))
161 "Random variable",
"Log rate parameter",
175 for (
size_t i = 0; i < size; i++)
176 if (std::numeric_limits<double>::infinity() == alpha_vec[i])
178 for (
size_t i = 0; i < size; i++)
179 if (-std::numeric_limits<double>::infinity() == alpha_vec[i]
189 for (
size_t i = 0; i < size; i++) {
190 if (!(alpha_vec[i] == -std::numeric_limits<double>::infinity()
193 logp -=
lgamma(n_vec[i] + 1.0);
200 operands_and_partials.
d_x1[i] += n_vec[i] -
exp(
value_of(alpha_vec[i]));
202 return operands_and_partials.
to_var(logp);
205 template <
bool propto,
215 template <
typename T_n,
222 return poisson_log_log<false>(n,alpha,Policy());
226 template <
typename T_n,
235 template <
bool propto,
typename T_n,
typename T_rate,
class Policy>
239 static const char*
function =
"stan::prob::poisson_cdf(%1%)";
257 if (!
check_not_nan(
function, lambda,
"Rate parameter", &P, Policy()))
264 "Random variable",
"Rate parameter",
278 for (
size_t i = 0; i < size; i++)
279 if (
std::isinf(lambda_vec[i]))
return LOG_ZERO;
281 for (
size_t i = 0; i < size; i++)
282 if (lambda_vec[i] == 0 && n_vec[i] != 0)
288 using boost::math::gamma_p_derivative;
289 using boost::math::gamma_p;
296 for (
size_t i = 0; i < size; i++)
299 const double n_dbl =
value_of(n_vec[i]);
300 const double lambda_dbl =
value_of(lambda_vec[i]);
302 const double Pi = gamma_p(n_dbl, lambda_dbl);
307 operands_and_partials.
d_x1[i] += gamma_p_derivative(n_dbl, lambda_dbl) / Pi;
311 for (
size_t i = 0; i < size; i++) {
314 operands_and_partials.
d_x1[n] *= P;
318 return operands_and_partials.
to_var(P);
321 template <
bool propto,
typename T_n,
typename T_rate>
328 template <
typename T_n,
typename T_rate,
class Policy>
331 return poisson_cdf<false>(n, lambda, Policy());
335 template <
typename T_n,
typename T_rate>