Stan  1.1
probability, sampling & optimization
 All Classes Namespaces Files Functions Variables Typedefs Enumerator Friends Macros Pages
beta.hpp
Go to the documentation of this file.
1 #ifndef __STAN__PROB__DISTRIBUTIONS__UNIVARIATE__CONTINUOUS__BETA_HPP__
2 #define __STAN__PROB__DISTRIBUTIONS__UNIVARIATE__CONTINUOUS__BETA_HPP__
3 
4 #include <stan/agrad.hpp>
7 #include <stan/meta/traits.hpp>
9 #include <stan/prob/traits.hpp>
10 
11 namespace stan {
12 
13  namespace prob {
14 
36  template <bool propto,
37  typename T_y, typename T_scale_succ, typename T_scale_fail,
38  class Policy>
39  typename return_type<T_y,T_scale_succ,T_scale_fail>::type
40  beta_log(const T_y& y, const T_scale_succ& alpha, const T_scale_fail& beta,
41  const Policy&) {
42  static const char* function = "stan::prob::beta_log(%1%)";
43 
45  using stan::is_vector;
51  using stan::math::log1m;
54  using boost::math::digamma;
55 
56  // check if any vectors are zero length
57  if (!(stan::length(y)
58  && stan::length(alpha)
59  && stan::length(beta)))
60  return 0.0;
61 
62  // set up return value accumulator
63  double logp(0.0);
64 
65  // validate args (here done over var, which should be OK)
66  if (!check_finite(function, alpha,
67  "First shape parameter",
68  &logp, Policy()))
69  return logp;
70  if (!check_positive(function, alpha,
71  "First shape parameter",
72  &logp, Policy()))
73  return logp;
74  if (!check_finite(function, beta,
75  "Second shape parameter",
76  &logp, Policy()))
77  return logp;
78  if (!check_positive(function, beta,
79  "Second shape parameter",
80  &logp, Policy()))
81  return logp;
82  if (!check_not_nan(function, y, "Random variable", &logp, Policy()))
83  return logp;
84  if (!(check_consistent_sizes(function,
85  y,alpha,beta,
86  "Random variable","First shape parameter","Second shape parameter",
87  &logp, Policy())))
88  return logp;
89 
90  // check if no variables are involved and prop-to
92  return 0.0;
93 
94  VectorView<const T_y> y_vec(y);
95  VectorView<const T_scale_succ> alpha_vec(alpha);
96  VectorView<const T_scale_fail> beta_vec(beta);
97  size_t N = max_size(y, alpha, beta);
98 
99  for (size_t n = 0; n < N; n++) {
100  const double y_dbl = value_of(y_vec[n]);
101  if (y_dbl < 0 || y_dbl > 1)
102  return LOG_ZERO;
103  }
104 
105  // set up template expressions wrapping scalars into vector views
106  agrad::OperandsAndPartials<T_y, T_scale_succ, T_scale_fail> operands_and_partials(y, alpha, beta);
107 
108 
111 
112  for (size_t n = 0; n < length(y); n++) {
114  log_y[n] = log(value_of(y_vec[n]));
116  log1m_y[n] = log1m(value_of(y_vec[n]));
117  }
118 
121  for (size_t n = 0; n < length(alpha); n++) {
123  lgamma_alpha[n] = lgamma(value_of(alpha_vec[n]));
125  digamma_alpha[n] = digamma(value_of(alpha_vec[n]));
126  }
127 
128 
131  for (size_t n = 0; n < length(beta); n++) {
133  lgamma_beta[n] = lgamma(value_of(beta_vec[n]));
135  digamma_beta[n] = digamma(value_of(beta_vec[n]));
136  }
137 
140  lgamma_alpha_beta(max_size(alpha,beta));
143  digamma_alpha_beta(max_size(alpha,beta));
144  for (size_t n = 0; n < max_size(alpha,beta); n++) {
145  const double alpha_beta = value_of(alpha_vec[n]) + value_of(beta_vec[n]);
147  lgamma_alpha_beta[n] = lgamma(alpha_beta);
149  digamma_alpha_beta[n] = digamma(alpha_beta);
150  }
151 
152  for (size_t n = 0; n < N; n++) {
153  // pull out values of arguments
154  const double y_dbl = value_of(y_vec[n]);
155  const double alpha_dbl = value_of(alpha_vec[n]);
156  const double beta_dbl = value_of(beta_vec[n]);
157 
158  // log probability
160  logp += lgamma_alpha_beta[n];
162  logp -= lgamma_alpha[n];
164  logp -= lgamma_beta[n];
166  logp += (alpha_dbl-1.0) * log_y[n];
168  logp += (beta_dbl-1.0) * log1m_y[n];
169 
170  // gradients
172  operands_and_partials.d_x1[n] += (alpha_dbl-1)/y_dbl + (beta_dbl-1)/(y_dbl-1);
174  operands_and_partials.d_x2[n] += log_y[n] + digamma_alpha_beta[n] - digamma_alpha[n];
176  operands_and_partials.d_x3[n] += log1m_y[n] + digamma_alpha_beta[n] - digamma_beta[n];
177  }
178  return operands_and_partials.to_var(logp);
179  }
180 
181  template <bool propto,
182  typename T_y, typename T_scale_succ, typename T_scale_fail>
183  inline
185  beta_log(const T_y& y, const T_scale_succ& alpha, const T_scale_fail& beta) {
186  return beta_log<propto>(y,alpha,beta,stan::math::default_policy());
187  }
188 
189  template <typename T_y, typename T_scale_succ, typename T_scale_fail,
190  class Policy>
192  beta_log(const T_y& y, const T_scale_succ& alpha, const T_scale_fail& beta,
193  const Policy&) {
194  return beta_log<false>(y,alpha,beta,Policy());
195  }
196 
197  template <typename T_y, typename T_scale_succ, typename T_scale_fail>
198  inline
200  beta_log(const T_y& y, const T_scale_succ& alpha, const T_scale_fail& beta) {
201  return beta_log<false>(y,alpha,beta,stan::math::default_policy());
202  }
203 
204 
218  template <typename T_y, typename T_scale_succ, typename T_scale_fail,
219  class Policy>
221  beta_cdf(const T_y& y, const T_scale_succ& alpha, const T_scale_fail& beta,
222  const Policy&) {
223  static const char* function = "stan::prob::beta_cdf(%1%)";
224 
228  using boost::math::tools::promote_args;
229 
230  typename promote_args<T_y,T_scale_succ,T_scale_fail>::type lp;
231  if (!check_finite(function, alpha,
232  "First shape parameter",
233  &lp, Policy()))
234  return lp;
235  if (!check_positive(function, alpha,
236  "First shape parameter",
237  &lp, Policy()))
238  return lp;
239  if (!check_finite(function, beta,
240  "Second shape parameter",
241  &lp, Policy()))
242  return lp;
243  if (!check_positive(function, beta,
244  "Second shape parameter",
245  &lp, Policy()))
246  return lp;
247  if (!check_not_nan(function, y, "Random variable", &lp, Policy()))
248  return lp;
249 
250  if (y < 0.0)
251  return 0;
252  if (y > 1.0)
253  return 1.0;
254 
255  return stan::math::ibeta(alpha, beta, y);
256  }
257 
258  template <typename T_y, typename T_scale_succ, typename T_scale_fail>
260  beta_cdf(const T_y& y, const T_scale_succ& alpha, const T_scale_fail& beta) {
261  return beta_cdf(y,alpha,beta,stan::math::default_policy());
262  }
263  }
264 }
265 #endif

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