1 #ifndef __STAN__PROB__DISTRIBUTIONS__UNIVARIATE__CONTINUOUS__LOGNORMAL_HPP__
2 #define __STAN__PROB__DISTRIBUTIONS__UNIVARIATE__CONTINUOUS__LOGNORMAL_HPP__
4 #include <boost/random/lognormal_distribution.hpp>
5 #include <boost/random/variate_generator.hpp>
20 template <
bool propto,
21 typename T_y,
typename T_loc,
typename T_scale,
23 typename return_type<T_y,T_loc,T_scale>::type
26 static const char*
function =
"stan::prob::lognormal_log(%1%)";
47 if (!
check_not_nan(
function, y,
"Random variable", &logp, Policy()))
60 "Random variable",
"Location parameter",
"Scale parameter",
70 for (
size_t n = 0; n <
length(y); n++)
78 using stan::prob::NEG_LOG_SQRT_TWO_PI;
83 for (
size_t n = 0; n <
length(sigma); n++)
88 for (
size_t n = 0; n <
length(sigma); n++)
89 inv_sigma[n] = 1 /
value_of(sigma_vec[n]);
91 for (
size_t n = 0; n <
length(sigma); n++)
92 inv_sigma_sq[n] = inv_sigma[n] * inv_sigma[n];
96 for (
size_t n = 0; n <
length(y); n++)
100 for (
size_t n = 0; n <
length(y); n++)
104 logp += N * NEG_LOG_SQRT_TWO_PI;
106 for (
size_t n = 0; n < N; n++) {
107 const double mu_dbl =
value_of(mu_vec[n]);
112 logy_m_mu = log_y[n] - mu_dbl;
114 double logy_m_mu_sq = logy_m_mu * logy_m_mu;
115 double logy_m_mu_div_sigma(0);
119 logy_m_mu_div_sigma = logy_m_mu * inv_sigma_sq[n];
124 logp -= log_sigma[n];
128 logp -= 0.5 * logy_m_mu_sq * inv_sigma_sq[n];
132 operands_and_partials.
d_x1[n] -= (1 + logy_m_mu_div_sigma) * inv_y[n];
134 operands_and_partials.
d_x2[n] += logy_m_mu_div_sigma;
136 operands_and_partials.
d_x3[n] += (logy_m_mu_div_sigma * logy_m_mu - 1) * inv_sigma[n];
138 return operands_and_partials.
to_var(logp);
141 template <
bool propto,
142 typename T_y,
typename T_loc,
typename T_scale>
149 template <
typename T_y,
typename T_loc,
typename T_scale,
155 return lognormal_log<false>(y,mu,sigma,Policy());
158 template <
typename T_y,
typename T_loc,
typename T_scale>
168 template <
typename T_y,
typename T_loc,
typename T_scale,
170 typename boost::math::tools::promote_args<T_y,T_loc,T_scale>::type
173 static const char*
function =
"stan::prob::lognormal_cdf(%1%)";
178 using boost::math::tools::promote_args;
180 typename promote_args<T_y,T_loc,T_scale>::type lp;
181 if (!
check_not_nan(
function, y,
"Random variable", &lp, Policy()))
183 if (!
check_finite(
function, mu,
"Location parameter", &lp, Policy()))
195 template <
typename T_y,
typename T_loc,
typename T_scale>
197 typename boost::math::tools::promote_args<T_y,T_loc,T_scale>::type
207 using boost::variate_generator;
208 using boost::random::lognormal_distribution;
209 variate_generator<RNG&, lognormal_distribution<> >
210 lognorm_rng(rng, lognormal_distribution<>(mu, sigma));
211 return lognorm_rng();