Stan  1.1
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 
9 namespace stan {
10 
11  namespace prob {
41  template <bool propto,
42  typename T_y, typename T_loc, typename T_scale, typename T_alpha, typename T_beta,
43  class Policy>
44  typename boost::math::tools::promote_args<T_y,T_loc,T_scale,T_alpha,T_beta>::type
45  trunc_normal_log(const T_y& y, const T_loc& mu, const T_scale& sigma,
46  const T_alpha& alpha, const T_beta& beta,
47  const Policy&) {
48  static const char* function = "stan::prob::trunc_normal_log(%1%)";
49 
50 
53  using boost::math::tools::promote_args;
54  using boost::math::isinf;
56  using stan::math::Phi;
57 
58  typename promote_args<T_y,T_loc,T_scale,T_alpha,T_beta>::type lp(0.0);
59 
60  if (!check_not_nan(function, alpha, "Lower bound",
61  &lp, Policy()))
62  return lp;
63  if (!check_not_nan(function, beta, "Upper bound",
64  &lp, Policy()))
65  return lp;
66  if (!check_greater(function, beta, alpha, "Upper bound",
67  &lp, Policy()))
68  return lp;
69 
70  if (y < alpha || y > beta) {
71  lp = LOG_ZERO;
72  }
73  else {
74  lp = normal_log<propto>(y,mu,sigma,Policy());
76  if (isinf(sigma))
77  lp -= log(beta - alpha);
78  else
79  if (!isinf(beta) && !isinf(alpha))
80  lp -= log(Phi((beta - mu)/sigma) - Phi((alpha - mu)/sigma));
81  else if (isfinite(alpha))
82  lp -= log(1.0 - Phi((alpha - mu)/sigma));
83  else if (isfinite(beta))
84  lp -= log(Phi((beta - mu)/sigma));
85  }
86  }
87 
88  return lp;
89  }
90 
91 
92  template <bool propto,
93  typename T_y, typename T_loc, typename T_scale, typename T_alpha, typename T_beta>
94  inline
95  typename boost::math::tools::promote_args<T_y,T_loc,T_scale,T_alpha,T_beta>::type
96  trunc_normal_log(const T_y& y, const T_loc& mu, const T_scale& sigma, const T_alpha& alpha, const T_beta& beta) {
97  return trunc_normal_log<propto>(y,mu,sigma,alpha,beta,stan::math::default_policy());
98  }
99 
100  template <typename T_y, typename T_loc, typename T_scale, typename T_alpha, typename T_beta,
101  class Policy>
102  inline
103  typename boost::math::tools::promote_args<T_y,T_loc,T_scale,T_alpha,T_beta>::type
104  trunc_normal_log(const T_y& y, const T_loc& mu, const T_scale& sigma, const T_alpha& alpha, const T_beta& beta,
105  const Policy&) {
106  return trunc_normal_log<false>(y,mu,sigma,alpha,beta,Policy());
107  }
108 
109  template <typename T_y, typename T_loc, typename T_scale, typename T_alpha, typename T_beta>
110  inline
111  typename boost::math::tools::promote_args<T_y,T_loc,T_scale,T_alpha,T_beta>::type
112  trunc_normal_log(const T_y& y, const T_loc& mu, const T_scale& sigma, const T_alpha& alpha, const T_beta& beta) {
113  return trunc_normal_log<false>(y,mu,sigma,alpha,beta,stan::math::default_policy());
114  }
115  }
116 }
117 #endif

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