Stan  1.3
probability, sampling & optimization
 All Classes Namespaces Files Functions Variables Typedefs Enumerator Friends Macros Pages
trunc_normal.hpp
Go to the documentation of this file.
1 #ifndef __STAN__PROB__DISTRIBUTIONS__UNIVARIATE__CONTINUOUS__TRUNC_NORMAL_HPP__
2 #define __STAN__PROB__DISTRIBUTIONS__UNIVARIATE__CONTINUOUS__TRUNC_NORMAL_HPP__
3 
6 #include <stan/prob/traits.hpp>
8 #include<boost/math/distributions.hpp>
9 
10 namespace stan {
11 
12  namespace prob {
42  template <bool propto,
43  typename T_y, typename T_loc, typename T_scale, typename T_alpha, typename T_beta,
44  class Policy>
45  typename boost::math::tools::promote_args<T_y,T_loc,T_scale,T_alpha,T_beta>::type
46  trunc_normal_log(const T_y& y, const T_loc& mu, const T_scale& sigma,
47  const T_alpha& alpha, const T_beta& beta,
48  const Policy&) {
49  static const char* function = "stan::prob::trunc_normal_log(%1%)";
50 
51 
54  using boost::math::tools::promote_args;
55  using boost::math::isinf;
57  using stan::math::Phi;
58 
59  typename promote_args<T_y,T_loc,T_scale,T_alpha,T_beta>::type lp(0.0);
60 
61  if (!check_not_nan(function, alpha, "Lower bound",
62  &lp, Policy()))
63  return lp;
64  if (!check_not_nan(function, beta, "Upper bound",
65  &lp, Policy()))
66  return lp;
67  if (!check_greater(function, beta, alpha, "Upper bound",
68  &lp, Policy()))
69  return lp;
70 
71  if (y < alpha || y > beta) {
72  lp = LOG_ZERO;
73  }
74  else {
75  lp = normal_log<propto>(y,mu,sigma,Policy());
77  if (isinf(sigma))
78  lp -= log(beta - alpha);
79  else
80  if (!isinf(beta) && !isinf(alpha))
81  lp -= log(Phi((beta - mu)/sigma) - Phi((alpha - mu)/sigma));
82  else if (isfinite(alpha))
83  lp -= log(1.0 - Phi((alpha - mu)/sigma));
84  else if (isfinite(beta))
85  lp -= log(Phi((beta - mu)/sigma));
86  }
87  }
88 
89  return lp;
90  }
91 
92 
93  template <bool propto,
94  typename T_y, typename T_loc, typename T_scale, typename T_alpha, typename T_beta>
95  inline
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) {
98  return trunc_normal_log<propto>(y,mu,sigma,alpha,beta,stan::math::default_policy());
99  }
100 
101  template <typename T_y, typename T_loc, typename T_scale, typename T_alpha, typename T_beta,
102  class Policy>
103  inline
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,
106  const Policy&) {
107  return trunc_normal_log<false>(y,mu,sigma,alpha,beta,Policy());
108  }
109 
110  template <typename T_y, typename T_loc, typename T_scale, typename T_alpha, typename T_beta>
111  inline
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) {
114  return trunc_normal_log<false>(y,mu,sigma,alpha,beta,stan::math::default_policy());
115  }
116 
117  template <class RNG>
118  inline double
119  trunc_normal_rng(const double mu,
120  const double sigma,
121  const double alpha,
122  const double beta,
123  RNG& rng) {
124  using boost::variate_generator;
125  double a = stan::prob::normal_rng(mu, sigma, rng);
126  while(a > beta || a < alpha)
127  a = stan::prob::normal_rng(mu,sigma,rng);
128  return a;
129  }
130  }
131 }
132 #endif

     [ Stan Home Page ] © 2011–2013, Stan Development Team.