Stan  1.0
probability, sampling & optimization
inv_chi_square.hpp
Go to the documentation of this file.
1 #ifndef __STAN__PROB__DIST__UNI__CONTINUOUS__INV_CHI_SQUARE_HPP__
2 #define __STAN__PROB__DIST__UNI__CONTINUOUS__INV_CHI_SQUARE_HPP__
3 
4 #include <stan/agrad.hpp>
7 #include <stan/meta/traits.hpp>
9 #include <stan/prob/traits.hpp>
10 
11 namespace stan {
12 
13  namespace prob {
14 
34  template <bool propto,
35  typename T_y, typename T_dof,
36  class Policy>
38  inv_chi_square_log(const T_y& y, const T_dof& nu,
39  const Policy&) {
40  static const char* function = "stan::prob::inv_chi_square_log(%1%)";
41 
42  // check if any vectors are zero length
43  if (!(stan::length(y)
44  && stan::length(nu)))
45  return 0.0;
46 
52 
53  typename return_type<T_y,T_dof>::type logp(0.0);
54  if (!check_finite(function, nu, "Degrees of freedom parameter", &logp, Policy()))
55  return logp;
56  if (!check_positive(function, nu, "Degrees of freedom parameter", &logp, Policy()))
57  return logp;
58  if (!check_not_nan(function, y, "Random variable", &logp, Policy()))
59  return logp;
60 
61  if (!(check_consistent_sizes(function,
62  y,nu,
63  "Random variable","Degrees of freedom parameter",
64  &logp, Policy())))
65  return logp;
66 
67 
68  // set up template expressions wrapping scalars into vector views
69  VectorView<const T_y> y_vec(y);
70  VectorView<const T_dof> nu_vec(nu);
71  size_t N = max_size(y, nu);
72 
73  for (size_t n = 0; n < length(y); n++)
74  if (value_of(y_vec[n]) <= 0)
75  return LOG_ZERO;
76 
77  using boost::math::lgamma;
79  for (size_t n = 0; n < N; n++) {
81  logp += nu_vec[n] * NEG_LOG_TWO_OVER_TWO - lgamma(0.5 * nu_vec[n]);
83  logp -= multiply_log(0.5*nu_vec[n]+1.0, y_vec[n]);
85  logp -= 0.5 / y_vec[n];
86  }
87  return logp;
88  }
89 
90  template <bool propto,
91  typename T_y, typename T_dof>
92  inline
94  inv_chi_square_log(const T_y& y, const T_dof& nu) {
95  return inv_chi_square_log<propto>(y,nu,stan::math::default_policy());
96  }
97 
98  template <typename T_y, typename T_dof,
99  class Policy>
100  inline
102  inv_chi_square_log(const T_y& y, const T_dof& nu,
103  const Policy&) {
104  return inv_chi_square_log<false>(y,nu,Policy());
105  }
106 
107 
108  template <typename T_y, typename T_dof>
109  inline
111  inv_chi_square_log(const T_y& y, const T_dof& nu) {
112  return inv_chi_square_log<false>(y,nu,stan::math::default_policy());
113  }
114 
115  }
116 }
117 
118 #endif
119 
var multiply_log(const var &a, const var &b)
Return the value of a*log(b).
double value_of(const agrad::var &v)
Return the value of the specified variable.
var lgamma(const stan::agrad::var &a)
The log gamma function for variables (C99).
boost::math::tools::promote_args< T_a, T_b >::type multiply_log(T_a a, T_b b)
double value_of(T x)
Return the value of the specified scalar argument converted to a double value.
bool check_not_nan(const char *function, const T_y &y, const char *name, T_result *result, const Policy &)
Checks if the variable y is nan.
bool check_consistent_sizes(const char *function, const T1 &x1, const T2 &x2, const char *name1, const char *name2, T_result *result, const Policy &)
bool check_positive(const char *function, const T_y &y, const char *name, T_result *result, const Policy &)
bool check_finite(const char *function, const T_y &y, const char *name, T_result *result, const Policy &)
Checks if the variable y is finite.
boost::math::policies::policy default_policy
Default error-handling policy from Boost.
return_type< T_y, T_dof >::type inv_chi_square_log(const T_y &y, const T_dof &nu, const Policy &)
The log of an inverse chi-squared density for y with the specified degrees of freedom parameter.
Probability, optimization and sampling library.
Definition: agrad.cpp:6
size_t length(const T &x)
Definition: traits.hpp:111
size_t max_size(const T1 &x1, const T2 &x2)
Definition: traits.hpp:148
Template metaprogram to calculate whether a summand needs to be included in a proportional (log) prob...
Definition: traits.hpp:33
boost::math::tools::promote_args< typename scalar_type< T1 >::type, typename scalar_type< T2 >::type, typename scalar_type< T3 >::type, typename scalar_type< T4 >::type, typename scalar_type< T5 >::type, typename scalar_type< T6 >::type >::type type
Definition: traits.hpp:368

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