1 #ifndef __STAN__PROB__DISTRIBUTIONS__UNIVARIATE__DISCRETE__POISSON_HPP__
2 #define __STAN__PROB__DISTRIBUTIONS__UNIVARIATE__DISCRETE__POISSON_HPP__
4 #include <boost/random/poisson_distribution.hpp>
5 #include <boost/random/variate_generator.hpp>
21 template <
bool propto,
22 typename T_n,
typename T_rate,
24 typename return_type<T_rate>::type
28 static const char*
function =
"stan::prob::poisson_log(%1%)";
49 "Rate parameter", &logp, Policy()))
52 "Rate parameter", &logp, Policy()))
56 "Random variable",
"Rate parameter",
69 for (
size_t i = 0; i <
size; i++)
72 for (
size_t i = 0; i <
size; i++)
73 if (lambda_vec[i] == 0 && n_vec[i] != 0)
80 for (
size_t i = 0; i <
size; i++) {
81 if (!(lambda_vec[i] == 0 && n_vec[i] == 0)) {
83 logp -=
lgamma(n_vec[i] + 1.0);
91 operands_and_partials.
d_x1[i]
92 += n_vec[i] /
value_of(lambda_vec[i]) - 1.0;
97 return operands_and_partials.
to_var(logp);
100 template <
bool propto,
110 template <
typename T_n,
117 return poisson_log<false>(n,lambda,Policy());
121 template <
typename T_n,
134 template <
bool propto,
135 typename T_n,
typename T_log_rate,
141 static const char*
function =
"stan::prob::poisson_log_log(%1%)";
163 "Log rate parameter", &logp, Policy()))
167 "Random variable",
"Log rate parameter",
181 for (
size_t i = 0; i <
size; i++)
182 if (std::numeric_limits<double>::infinity() == alpha_vec[i])
184 for (
size_t i = 0; i <
size; i++)
185 if (-std::numeric_limits<double>::infinity() == alpha_vec[i]
196 for (
size_t i = 0; i <
length(alpha); i++)
200 for (
size_t i = 0; i <
size; i++) {
201 if (!(alpha_vec[i] == -std::numeric_limits<double>::infinity()
204 logp -=
lgamma(n_vec[i] + 1.0);
206 logp += n_vec[i] *
value_of(alpha_vec[i]) - exp_alpha[i];
211 operands_and_partials.
d_x1[i] += n_vec[i] - exp_alpha[i];
213 return operands_and_partials.
to_var(logp);
216 template <
bool propto,
226 template <
typename T_n,
233 return poisson_log_log<false>(n,alpha,Policy());
237 template <
typename T_n,
246 template <
bool propto,
typename T_n,
typename T_rate,
class Policy>
250 static const char*
function =
"stan::prob::poisson_cdf(%1%)";
264 if (!
check_not_nan(
function, lambda,
"Rate parameter", &P, Policy()))
271 "Random variable",
"Rate parameter",
286 using boost::math::gamma_p_derivative;
287 using boost::math::gamma_q;
293 + operands_and_partials.
nvaris, 0.0);
299 return operands_and_partials.
to_var(0.0);
302 for (
size_t i = 0; i <
size; i++) {
306 if (
value_of(n_vec[i]) == std::numeric_limits<double>::infinity())
309 const double n_dbl =
value_of(n_vec[i]);
310 const double lambda_dbl =
value_of(lambda_vec[i]);
312 const double Pi = gamma_q(n_dbl+1, lambda_dbl);
316 operands_and_partials.
d_x1[i]
317 -= gamma_p_derivative(n_dbl + 1, lambda_dbl) / Pi;
324 operands_and_partials.
d_x1[i] *= P;
326 return operands_and_partials.
to_var(P);
330 template <
bool propto,
typename T_n,
typename T_rate>
337 template <
typename T_n,
typename T_rate,
class Policy>
340 return poisson_cdf<false>(n, lambda, Policy());
344 template <
typename T_n,
typename T_rate>
354 using boost::variate_generator;
355 using boost::random::poisson_distribution;
356 variate_generator<RNG&, poisson_distribution<> >