1 #ifndef __STAN__PROB__DISTRIBUTIONS__UNIVARIATE__CONTINUOUS__TRUNC_NORMAL_HPP__
2 #define __STAN__PROB__DISTRIBUTIONS__UNIVARIATE__CONTINUOUS__TRUNC_NORMAL_HPP__
8 #include<boost/math/distributions.hpp>
42 template <
bool propto,
43 typename T_y,
typename T_loc,
typename T_scale,
typename T_alpha,
typename T_beta,
45 typename boost::math::tools::promote_args<T_y,T_loc,T_scale,T_alpha,T_beta>::type
47 const T_alpha& alpha,
const T_beta& beta,
49 static const char*
function =
"stan::prob::trunc_normal_log(%1%)";
54 using boost::math::tools::promote_args;
59 typename promote_args<T_y,T_loc,T_scale,T_alpha,T_beta>::type lp(0.0);
71 if (y < alpha || y > beta) {
75 lp = normal_log<propto>(y,mu,sigma,Policy());
78 lp -=
log(beta - alpha);
81 lp -=
log(
Phi((beta - mu)/sigma) -
Phi((alpha - mu)/sigma));
83 lp -=
log(1.0 -
Phi((alpha - mu)/sigma));
85 lp -=
log(
Phi((beta - mu)/sigma));
93 template <
bool propto,
94 typename T_y,
typename T_loc,
typename T_scale,
typename T_alpha,
typename T_beta>
96 typename boost::math::tools::promote_args<T_y,T_loc,T_scale,T_alpha,T_beta>::type
97 trunc_normal_log(
const T_y& y,
const T_loc& mu,
const T_scale& sigma,
const T_alpha& alpha,
const T_beta& beta) {
101 template <
typename T_y,
typename T_loc,
typename T_scale,
typename T_alpha,
typename T_beta,
104 typename boost::math::tools::promote_args<T_y,T_loc,T_scale,T_alpha,T_beta>::type
105 trunc_normal_log(
const T_y& y,
const T_loc& mu,
const T_scale& sigma,
const T_alpha& alpha,
const T_beta& beta,
107 return trunc_normal_log<false>(y,mu,sigma,alpha,beta,Policy());
110 template <
typename T_y,
typename T_loc,
typename T_scale,
typename T_alpha,
typename T_beta>
112 typename boost::math::tools::promote_args<T_y,T_loc,T_scale,T_alpha,T_beta>::type
113 trunc_normal_log(
const T_y& y,
const T_loc& mu,
const T_scale& sigma,
const T_alpha& alpha,
const T_beta& beta) {
124 using boost::variate_generator;
126 while(a > beta || a < alpha)