Stan  1.0
probability, sampling & optimization
poisson.hpp
Go to the documentation of this file.
1 #ifndef __STAN__PROB__DISTRIBUTIONS__UNIVARIATE__DISCRETE__POISSON_HPP__
2 #define __STAN__PROB__DISTRIBUTIONS__UNIVARIATE__DISCRETE__POISSON_HPP__
3 
4 #include <limits>
5 
6 #include <stan/agrad.hpp>
9 #include <stan/meta/traits.hpp>
10 #include <stan/prob/traits.hpp>
11 #include <stan/prob/constants.hpp>
12 
13 namespace stan {
14 
15  namespace prob {
16 
17  // Poisson(n|lambda) [lambda > 0; n >= 0]
18  template <bool propto,
19  typename T_n, typename T_rate,
20  class Policy>
22  poisson_log(const T_n& n, const T_rate& lambda,
23  const Policy&) {
24 
25  static const char* function = "stan::prob::poisson_log(%1%)";
26 
32 
33  // check if any vectors are zero length
34  if (!(stan::length(n)
35  && stan::length(lambda)))
36  return 0.0;
37 
38  // set up return value accumulator
39  double logp(0.0);
40 
41  // validate args
42  if (!check_nonnegative(function, n, "Random variable", &logp, Policy()))
43  return logp;
44  if (!check_not_nan(function, lambda,
45  "Rate parameter", &logp, Policy()))
46  return logp;
47  if (!check_nonnegative(function, lambda,
48  "Rate parameter", &logp, Policy()))
49  return logp;
50  if (!(check_consistent_sizes(function,
51  n,lambda,
52  "Random variable","Rate parameter",
53  &logp, Policy())))
54  return logp;
55 
56  // check if no variables are involved and prop-to
58  return 0.0;
59 
60  // set up expression templates wrapping scalars/vecs into vector views
61  VectorView<const T_n> n_vec(n);
62  VectorView<const T_rate> lambda_vec(lambda);
63  size_t size = max_size(n, lambda);
64 
65  for (size_t i = 0; i < size; i++)
66  if (std::isinf(lambda_vec[i]))
67  return LOG_ZERO;
68  for (size_t i = 0; i < size; i++)
69  if (lambda_vec[i] == 0 && n_vec[i] != 0)
70  return LOG_ZERO;
71 
72  // return accumulator with gradients
73  agrad::OperandsAndPartials<T_rate> operands_and_partials(lambda);
74 
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);
81  logp += multiply_log(n_vec[i], value_of(lambda_vec[i]))
82  - value_of(lambda_vec[i]);
83  }
84 
85  // gradients
87  operands_and_partials.d_x1[i] += n_vec[i] / value_of(lambda_vec[i]) - 1.0;
88 
89  }
90 
91 
92  return operands_and_partials.to_var(logp);
93  }
94 
95  template <bool propto,
96  typename T_n,
97  typename T_rate>
98  inline
100  poisson_log(const T_n& n, const T_rate& lambda) {
101  return poisson_log<propto>(n,lambda,stan::math::default_policy());
102  }
103 
104 
105  template <typename T_n,
106  typename T_rate,
107  class Policy>
108  inline
110  poisson_log(const T_n& n, const T_rate& lambda,
111  const Policy&) {
112  return poisson_log<false>(n,lambda,Policy());
113  }
114 
115 
116  template <typename T_n,
117  typename T_rate>
118  inline
120  poisson_log(const T_n& n, const T_rate& lambda) {
121  return poisson_log<false>(n,lambda,stan::math::default_policy());
122  }
123 
124 
125 
126 
127 
128  // PoissonLog(n|alpha) [n >= 0] = Poisson(n|exp(alpha))
129  template <bool propto,
130  typename T_n, typename T_log_rate,
131  class Policy>
133  poisson_log_log(const T_n& n, const T_log_rate& alpha,
134  const Policy&) {
135 
136  static const char* function = "stan::prob::poisson_log_log(%1%)";
137 
138  using std::exp;
141  using stan::math::value_of;
144 
145  // check if any vectors are zero length
146  if (!(stan::length(n)
147  && stan::length(alpha)))
148  return 0.0;
149 
150  // set up return value accumulator
151  double logp(0.0);
152 
153  // validate args
154  if (!check_nonnegative(function, n, "Random variable", &logp, Policy()))
155  return logp;
156  if (!check_not_nan(function, alpha,
157  "Log rate parameter", &logp, Policy()))
158  return logp;
159  if (!(check_consistent_sizes(function,
160  n,alpha,
161  "Random variable","Log rate parameter",
162  &logp, Policy())))
163  return logp;
164 
165  // check if no variables are involved and prop-to
167  return 0.0;
168 
169  // set up expression templates wrapping scalars/vecs into vector views
170  VectorView<const T_n> n_vec(n);
171  VectorView<const T_log_rate> alpha_vec(alpha);
172  size_t size = max_size(n, alpha);
173 
174  // FIXME: first loop size of alpha_vec, second loop if-ed for size==1
175  for (size_t i = 0; i < size; i++)
176  if (std::numeric_limits<double>::infinity() == alpha_vec[i])
177  return LOG_ZERO;
178  for (size_t i = 0; i < size; i++)
179  if (-std::numeric_limits<double>::infinity() == alpha_vec[i]
180  && n_vec[i] != 0)
181  return LOG_ZERO;
182 
183  // return accumulator with gradients
184  agrad::OperandsAndPartials<T_log_rate> operands_and_partials(alpha);
185 
186  // FIXME: cache value_of for alpha_vec? faster if only one?
187 
189  for (size_t i = 0; i < size; i++) {
190  if (!(alpha_vec[i] == -std::numeric_limits<double>::infinity()
191  && n_vec[i] == 0)) {
193  logp -= lgamma(n_vec[i] + 1.0);
195  logp += n_vec[i] * value_of(alpha_vec[i]) - exp(value_of(alpha_vec[i]));
196  }
197 
198  // gradients
200  operands_and_partials.d_x1[i] += n_vec[i] - exp(value_of(alpha_vec[i]));
201  }
202  return operands_and_partials.to_var(logp);
203  }
204 
205  template <bool propto,
206  typename T_n,
207  typename T_log_rate>
208  inline
210  poisson_log_log(const T_n& n, const T_log_rate& alpha) {
211  return poisson_log_log<propto>(n,alpha,stan::math::default_policy());
212  }
213 
214 
215  template <typename T_n,
216  typename T_log_rate,
217  class Policy>
218  inline
220  poisson_log_log(const T_n& n, const T_log_rate& alpha,
221  const Policy&) {
222  return poisson_log_log<false>(n,alpha,Policy());
223  }
224 
225 
226  template <typename T_n,
227  typename T_log_rate>
228  inline
230  poisson_log_log(const T_n& n, const T_log_rate& alpha) {
231  return poisson_log_log<false>(n,alpha,stan::math::default_policy());
232  }
233 
234 
235  }
236 }
237 #endif
var multiply_log(const var &a, const var &b)
Return the value of a*log(b).
double value_of(const agrad::var &v)
Return the value of the specified variable.
var lgamma(const stan::agrad::var &a)
The log gamma function for variables (C99).
var exp(const var &a)
Return the exponentiation of the specified variable (cmath).
Definition: agrad.hpp:1716
boost::math::tools::promote_args< T_a, T_b >::type multiply_log(T_a a, T_b b)
double value_of(T x)
Return the value of the specified scalar argument converted to a double value.
bool check_not_nan(const char *function, const T_y &y, const char *name, T_result *result, const Policy &)
Checks if the variable y is nan.
bool check_consistent_sizes(const char *function, const T1 &x1, const T2 &x2, const char *name1, const char *name2, T_result *result, const Policy &)
bool check_nonnegative(const char *function, const T_y &y, const char *name, T_result *result, const Policy &)
boost::math::policies::policy default_policy
Default error-handling policy from Boost.
return_type< T_rate >::type poisson_log(const T_n &n, const T_rate &lambda, const Policy &)
Definition: poisson.hpp:22
return_type< T_log_rate >::type poisson_log_log(const T_n &n, const T_log_rate &alpha, const Policy &)
Definition: poisson.hpp:133
Probability, optimization and sampling library.
Definition: agrad.cpp:6
size_t length(const T &x)
Definition: traits.hpp:111
size_t max_size(const T1 &x1, const T2 &x2)
Definition: traits.hpp:148
int isinf(const stan::agrad::var &a)
Checks if the given number is infinite.
Definition: agrad.hpp:2374
A variable implementation that stores operands and derivatives with respect to the variable.
VectorView< double *, is_vector< T1 >::value > d_x1
T_return_type to_var(double logp)
Metaprogram to determine if a type has a base scalar type that can be assigned to type double.
Definition: traits.hpp:39
Template metaprogram to calculate whether a summand needs to be included in a proportional (log) prob...
Definition: traits.hpp:33
boost::math::tools::promote_args< typename scalar_type< T1 >::type, typename scalar_type< T2 >::type, typename scalar_type< T3 >::type, typename scalar_type< T4 >::type, typename scalar_type< T5 >::type, typename scalar_type< T6 >::type >::type type
Definition: traits.hpp:368

     [ Stan Home Page ] © 2011–2012, Stan Development Team.