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,
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%)";
53 using boost::math::digamma;
66 "First shape parameter",
70 "First shape parameter",
74 "Second shape parameter",
78 "Second shape parameter",
81 if (!
check_not_nan(
function, y,
"Random variable", &logp, Policy()))
85 "Random variable",
"First shape parameter",
"Second shape parameter",
98 for (
size_t n = 0; n < N; n++) {
99 const double y_dbl =
value_of(y_vec[n]);
100 if (y_dbl < 0 || y_dbl > 1)
111 for (
size_t n = 0; n <
length(y); n++) {
120 for (
size_t n = 0; n <
length(alpha); n++) {
124 digamma_alpha[n] = digamma(
value_of(alpha_vec[n]));
130 for (
size_t n = 0; n <
length(beta); n++) {
134 digamma_beta[n] = digamma(
value_of(beta_vec[n]));
140 lgamma_alpha_beta(
max_size(alpha,beta));
144 digamma_alpha_beta(
max_size(alpha,beta));
145 for (
size_t n = 0; n <
max_size(alpha,beta); n++) {
148 lgamma_alpha_beta[n] =
lgamma(alpha_beta);
150 digamma_alpha_beta[n] = digamma(alpha_beta);
153 for (
size_t n = 0; n < N; n++) {
155 const double y_dbl =
value_of(y_vec[n]);
156 const double alpha_dbl =
value_of(alpha_vec[n]);
157 const double beta_dbl =
value_of(beta_vec[n]);
161 logp += lgamma_alpha_beta[n];
163 logp -= lgamma_alpha[n];
165 logp -= lgamma_beta[n];
167 logp += (alpha_dbl-1.0) * log_y[n];
169 logp += (beta_dbl-1.0) * log1m_y[n];
173 operands_and_partials.
d_x1[n] += (alpha_dbl-1)/y_dbl + (beta_dbl-1)/(y_dbl-1);
175 operands_and_partials.
d_x2[n] += log_y[n] + digamma_alpha_beta[n] - digamma_alpha[n];
177 operands_and_partials.
d_x3[n] += log1m_y[n] + digamma_alpha_beta[n] - digamma_beta[n];
179 return operands_and_partials.
to_var(logp);
182 template <
bool propto,
183 typename T_y,
typename T_scale_succ,
typename T_scale_fail>
186 beta_log(
const T_y& y,
const T_scale_succ& alpha,
const T_scale_fail& beta) {
190 template <
typename T_y,
typename T_scale_succ,
typename T_scale_fail,
193 beta_log(
const T_y& y,
const T_scale_succ& alpha,
const T_scale_fail& beta,
195 return beta_log<false>(y,alpha,beta,Policy());
198 template <
typename T_y,
typename T_scale_succ,
typename T_scale_fail>
201 beta_log(
const T_y& y,
const T_scale_succ& alpha,
const T_scale_fail& beta) {
219 template <
typename T_y,
typename T_scale_succ,
typename T_scale_fail,
222 beta_cdf(
const T_y& y,
const T_scale_succ& alpha,
const T_scale_fail& beta,
224 static const char*
function =
"stan::prob::beta_cdf(%1%)";
229 using boost::math::tools::promote_args;
231 typename promote_args<T_y,T_scale_succ,T_scale_fail>::type lp;
233 "First shape parameter",
237 "First shape parameter",
241 "Second shape parameter",
245 "Second shape parameter",
248 if (!
check_not_nan(
function, y,
"Random variable", &lp, Policy()))
259 template <
typename T_y,
typename T_scale_succ,
typename T_scale_fail>
261 beta_cdf(
const T_y& y,
const T_scale_succ& alpha,
const T_scale_fail& beta) {
var log1m(const stan::agrad::var &a)
The log (1 - x) function for variables.
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 log(const var &a)
Return the natural log of the specified variable (cmath).
double ibeta(const double &a, const double &b, const double &x)
The normalized incomplete beta function of a, b, and x.
boost::math::tools::promote_args< T >::type log1m(T x)
Return the natural logarithm of one minus the specified value.
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_positive(const char *function, const T_y &y, const char *name, T_result *result, const Policy &)
bool check_finite(const char *function, const T_y &y, const char *name, T_result *result, const Policy &)
Checks if the variable y is finite.
boost::math::policies::policy default_policy
Default error-handling policy from Boost.
return_type< T_y, T_scale_succ, T_scale_fail >::type beta_log(const T_y &y, const T_scale_succ &alpha, const T_scale_fail &beta, const Policy &)
The log of the beta density for the specified scalar(s) given the specified sample size(s).
return_type< T_y, T_scale_succ, T_scale_fail >::type beta_cdf(const T_y &y, const T_scale_succ &alpha, const T_scale_fail &beta, const Policy &)
Calculates the beta cumulative distribution function for the given variate and scale variables.
Probability, optimization and sampling library.
size_t length(const T &x)
size_t max_size(const T1 &x1, const T2 &x2)
A variable implementation that stores operands and derivatives with respect to the variable.
VectorView< double *, is_vector< T1 >::value > d_x1
VectorView< double *, is_vector< T2 >::value > d_x2
T_return_type to_var(double logp)
VectorView< double *, is_vector< T3 >::value > d_x3
Metaprogram to determine if a type has a base scalar type that can be assigned to type double.
Template metaprogram to calculate whether a summand needs to be included in a proportional (log) prob...
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