1 #ifndef __STAN__PROB__DISTRIBUTIONS__UNIVARIATE__CONTINUOUS__EXPONENTIAL_HPP__
2 #define __STAN__PROB__DISTRIBUTIONS__UNIVARIATE__CONTINUOUS__EXPONENTIAL_HPP__
4 #include <boost/random/exponential_distribution.hpp>
5 #include <boost/random/variate_generator.hpp>
44 template <
bool propto,
45 typename T_y,
typename T_inv_scale,
47 typename return_type<T_y,T_inv_scale>::type
50 static const char*
function =
"stan::prob::exponential_log(%1%)";
64 if(!
check_not_nan(
function, y,
"Random variable", &logp, Policy()))
66 if(!
check_finite(
function, beta,
"Inverse scale parameter", &logp, Policy()))
68 if(!
check_positive(
function, beta,
"Inverse scale parameter", &logp, Policy()))
73 "Random variable",
"Inverse scale parameter",
86 for (
size_t i = 0; i <
length(beta); i++)
87 if (include_summand<propto,T_inv_scale>::value)
92 for (
size_t n = 0; n < N; n++) {
93 const double beta_dbl =
value_of(beta_vec[n]);
94 const double y_dbl =
value_of(y_vec[n]);
95 if (include_summand<propto,T_inv_scale>::value)
98 logp -= beta_dbl * y_dbl;
101 operands_and_partials.
d_x1[n] -= beta_dbl;
103 operands_and_partials.
d_x2[n] += 1 / beta_dbl - y_dbl;
105 return operands_and_partials.
to_var(logp);
108 template <
bool propto,
109 typename T_y,
typename T_inv_scale>
116 template <
typename T_y,
typename T_inv_scale,
121 return exponential_log<false>(y,beta,Policy());
124 template <
typename T_y,
typename T_inv_scale>
146 template <
typename T_y,
147 typename T_inv_scale,
149 typename boost::math::tools::promote_args<T_y,T_inv_scale>::type
151 const T_inv_scale& beta,
154 static const char*
function =
"stan::prob::exponential_cdf(%1%)";
159 using boost::math::tools::promote_args;
161 typename promote_args<T_y,T_inv_scale>::type lp;
162 if(!
check_not_nan(
function, y,
"Random variable", &lp, Policy()))
164 if(!
check_finite(
function, beta,
"Inverse scale parameter", &lp, Policy()))
166 if(!
check_positive(
function, beta,
"Inverse scale parameter", &lp, Policy()))
172 return 1.0 -
exp(-beta * y);
175 template <
typename T_y,
176 typename T_inv_scale>
178 typename boost::math::tools::promote_args<T_y,T_inv_scale>::type
180 const T_inv_scale& beta) {
188 using boost::variate_generator;
189 using boost::exponential_distribution;
190 variate_generator<RNG&, exponential_distribution<> >
191 exp_rng(rng, exponential_distribution<>(beta));