1 #ifndef __STAN__PROB__DISTRIBUTIONS__UNIVARIATE__CONTINUOUS__GUMBEL_HPP__
2 #define __STAN__PROB__DISTRIBUTIONS__UNIVARIATE__CONTINUOUS__GUMBEL_HPP__
4 #include <boost/random/uniform_01.hpp>
5 #include <boost/random/variate_generator.hpp>
19 template <
bool propto,
20 typename T_y,
typename T_loc,
typename T_scale,
22 typename return_type<T_y,T_loc,T_scale>::type
23 gumbel_log(
const T_y& y,
const T_loc& mu,
const T_scale& beta,
25 static const char*
function =
"stan::prob::gumbel_log(%1%)";
47 if (!
check_not_nan(
function, y,
"Random variable", &logp, Policy()))
57 "Random variable",
"Location parameter",
"Scale parameter",
75 for (
size_t i = 0; i <
length(beta); i++) {
76 inv_beta[i] = 1.0 /
value_of(beta_vec[i]);
81 for (
size_t n = 0; n < N; n++) {
83 const double y_dbl =
value_of(y_vec[n]);
84 const double mu_dbl =
value_of(mu_vec[n]);
87 const double y_minus_mu_over_beta
88 = (y_dbl - mu_dbl) * inv_beta[n];
94 logp += -y_minus_mu_over_beta -
exp(-y_minus_mu_over_beta);
97 double scaled_diff = inv_beta[n] *
exp(-y_minus_mu_over_beta);
99 operands_and_partials.
d_x1[n] -= inv_beta[n] - scaled_diff;
101 operands_and_partials.
d_x2[n] += inv_beta[n] - scaled_diff;
103 operands_and_partials.
d_x3[n]
104 += -inv_beta[n] + y_minus_mu_over_beta * inv_beta[n] - scaled_diff * y_minus_mu_over_beta;
106 return operands_and_partials.
to_var(logp);
109 template <
bool propto,
110 typename T_y,
typename T_loc,
typename T_scale>
113 gumbel_log(
const T_y& y,
const T_loc& mu,
const T_scale& beta) {
117 template <
typename T_y,
typename T_loc,
typename T_scale,
121 gumbel_log(
const T_y& y,
const T_loc& mu,
const T_scale& beta,
123 return gumbel_log<false>(y,mu,beta,Policy());
126 template <
typename T_y,
typename T_loc,
typename T_scale>
129 gumbel_log(
const T_y& y,
const T_loc& mu,
const T_scale& beta) {
133 template <
typename T_y,
typename T_loc,
typename T_scale,
136 gumbel_cdf(
const T_y& y,
const T_loc& mu,
const T_scale& beta,
138 static const char*
function =
"stan::prob::gumbel_cdf(%1%)";
152 if (!
check_not_nan(
function, y,
"Random variable", &cdf, Policy()))
154 if (!
check_finite(
function, mu,
"Location parameter", &cdf, Policy()))
164 "Random variable",
"Location parameter",
"Scale parameter",
173 for (
size_t n = 0; n < N; n++) {
174 cdf *=
exp(-
exp(-((y_vec[n]) - (mu_vec[n])) / (beta_vec[n])));
180 template <
typename T_y,
typename T_loc,
typename T_scale>
183 gumbel_cdf(
const T_y& y,
const T_loc& mu,
const T_scale& beta) {
193 using boost::variate_generator;
194 using boost::uniform_01;
195 variate_generator<RNG&, uniform_01<> >
196 uniform01_rng(rng, uniform_01<>());