1 #ifndef __STAN__PROB__DISTRIBUTIONS__UNIVARIATE__CONTINUOUS__UNIFORM_HPP__
2 #define __STAN__PROB__DISTRIBUTIONS__UNIVARIATE__CONTINUOUS__UNIFORM_HPP__
4 #include <boost/random/uniform_real_distribution.hpp>
5 #include <boost/random/variate_generator.hpp>
40 template <
bool propto,
41 typename T_y,
typename T_low,
typename T_high,
43 typename return_type<T_y,T_low,T_high>::type
44 uniform_log(
const T_y& y,
const T_low& alpha,
const T_high& beta,
46 static const char*
function =
"stan::prob::uniform_log(%1%)";
62 if(!
check_not_nan(
function, y,
"Random variable", &logp, Policy()))
64 if (!
check_finite(
function, alpha,
"Lower bound parameter", &logp, Policy()))
66 if (!
check_finite(
function, beta,
"Upper bound parameter", &logp, Policy()))
68 if (!
check_greater(
function, beta, alpha,
"Upper bound parameter",
73 "Random variable",
"Lower bound parameter",
"Upper bound parameter",
87 for (
size_t n = 0; n < N; n++) {
88 const double y_dbl =
value_of(y_vec[n]);
95 for (
size_t i = 0; i <
max_size(alpha,beta); i++)
97 inv_beta_minus_alpha[i] = 1.0 / (
value_of(beta_vec[i]) -
value_of(alpha_vec[i]));
100 for (
size_t i = 0; i <
max_size(alpha,beta); i++)
105 for (
size_t n = 0; n < N; n++) {
107 logp -= log_beta_minus_alpha[n];
110 operands_and_partials.
d_x2[n] += inv_beta_minus_alpha[n];
112 operands_and_partials.
d_x3[n] -= inv_beta_minus_alpha[n];
114 return operands_and_partials.
to_var(logp);
118 template <
bool propto,
119 typename T_y,
typename T_low,
typename T_high>
122 uniform_log(
const T_y& y,
const T_low& alpha,
const T_high& beta) {
126 template <
typename T_y,
typename T_low,
typename T_high,
132 return uniform_log<false>(y,alpha,beta,Policy());
136 template <
typename T_y,
typename T_low,
typename T_high>
139 uniform_log(
const T_y& y,
const T_low& alpha,
const T_high& beta) {
149 using boost::variate_generator;
150 using boost::random::uniform_real_distribution;
151 variate_generator<RNG&, uniform_real_distribution<> >
152 uniform_rng(rng, uniform_real_distribution<>(alpha, beta));