1 #ifndef __STAN__PROB__DISTRIBUTIONS__UNIVARIATE__CONTINUOUS__BETA_HPP__
2 #define __STAN__PROB__DISTRIBUTIONS__UNIVARIATE__CONTINUOUS__BETA_HPP__
36 template <
bool propto,
37 typename T_y,
typename T_scale_succ,
typename T_scale_fail,
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,
42 static const char*
function =
"stan::prob::beta_log(%1%)";
54 using boost::math::digamma;
67 "First shape parameter",
71 "First shape parameter",
75 "Second shape parameter",
79 "Second shape parameter",
82 if (!
check_not_nan(
function, y,
"Random variable", &logp, Policy()))
86 "Random variable",
"First shape parameter",
"Second shape parameter",
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)
112 for (
size_t n = 0; n <
length(y); n++) {
121 for (
size_t n = 0; n <
length(alpha); n++) {
125 digamma_alpha[n] = digamma(
value_of(alpha_vec[n]));
131 for (
size_t n = 0; n <
length(beta); n++) {
135 digamma_beta[n] = digamma(
value_of(beta_vec[n]));
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++) {
147 lgamma_alpha_beta[n] =
lgamma(alpha_beta);
149 digamma_alpha_beta[n] = digamma(alpha_beta);
152 for (
size_t n = 0; n < N; n++) {
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]);
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];
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];
178 return operands_and_partials.
to_var(logp);
181 template <
bool propto,
182 typename T_y,
typename T_scale_succ,
typename T_scale_fail>
185 beta_log(
const T_y& y,
const T_scale_succ& alpha,
const T_scale_fail& beta) {
189 template <
typename T_y,
typename T_scale_succ,
typename T_scale_fail,
192 beta_log(
const T_y& y,
const T_scale_succ& alpha,
const T_scale_fail& beta,
194 return beta_log<false>(y,alpha,beta,Policy());
197 template <
typename T_y,
typename T_scale_succ,
typename T_scale_fail>
200 beta_log(
const T_y& y,
const T_scale_succ& alpha,
const T_scale_fail& beta) {
218 template <
typename T_y,
typename T_scale_succ,
typename T_scale_fail,
221 beta_cdf(
const T_y& y,
const T_scale_succ& alpha,
const T_scale_fail& beta,
223 static const char*
function =
"stan::prob::beta_cdf(%1%)";
228 using boost::math::tools::promote_args;
230 typename promote_args<T_y,T_scale_succ,T_scale_fail>::type lp;
232 "First shape parameter",
236 "First shape parameter",
240 "Second shape parameter",
244 "Second shape parameter",
247 if (!
check_not_nan(
function, y,
"Random variable", &lp, Policy()))
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) {