Stan  1.0
probability, sampling & optimization
scaled_inv_chi_square.hpp
Go to the documentation of this file.
1 #ifndef __STAN__PROB__DISTRIBUTIONS__UNIVARIATE__CONTINUOUS__SCALED_INV_CHI_SQUARE_HPP__
2 #define __STAN__PROB__DISTRIBUTIONS__UNIVARIATE__CONTINUOUS__SCALED_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, typename T_scale,
36  class Policy>
38  scaled_inv_chi_square_log(const T_y& y, const T_dof& nu, const T_scale& s,
39  const Policy&) {
40  static const char* function
41  = "stan::prob::scaled_inv_chi_square_log(%1%)";
42 
48 
49  // check if any vectors are zero length
50  if (!(stan::length(y)
51  && stan::length(nu)
52  && stan::length(s)))
53  return 0.0;
54 
55  typename return_type<T_y,T_dof,T_scale>::type logp(0.0);
56  if (!check_not_nan(function, y, "Random variable", &logp, Policy()))
57  return logp;
58  if (!check_finite(function, nu, "Degrees of freedom parameter", &logp, Policy()))
59  return logp;
60  if (!check_positive(function, nu, "Degrees of freedom parameter", &logp, Policy()))
61  return logp;
62  if (!check_finite(function, s, "Scale parameter", &logp, Policy()))
63  return logp;
64  if (!check_positive(function, s, "Scale parameter", &logp, Policy()))
65  return logp;
66  if (!(check_consistent_sizes(function,
67  y,nu,s,
68  "Random variable","Degrees of freedom parameter","Scale parameter",
69  &logp, Policy())))
70  return logp;
71 
72  // check if no variables are involved and prop-to
74  return 0.0;
75 
76  VectorView<const T_y> y_vec(y);
77  VectorView<const T_dof> nu_vec(nu);
79  size_t N = max_size(y, nu, s);
80 
81  for (size_t n = 0; n < N; n++) {
82  if (value_of(y_vec[n]) <= 0)
83  return LOG_ZERO;
84  }
85 
87  using stan::math::square;
88 
89  for (size_t n = 0; n < N; n++) {
91  typename return_type<T_dof>::type half_nu = 0.5 * nu_vec[n];
92  logp += multiply_log(half_nu,half_nu) - lgamma(half_nu);
93  }
95  logp += nu_vec[n] * log(s_vec[n]);
97  logp -= multiply_log(nu_vec[n]*0.5+1.0, y_vec[n]);
99  logp -= nu_vec[n] * 0.5 * square(s_vec[n]) / y_vec[n];
100  }
101  return logp;
102  }
103 
104  template <bool propto,
105  typename T_y, typename T_dof, typename T_scale>
106  inline
108  scaled_inv_chi_square_log(const T_y& y, const T_dof& nu, const T_scale& s) {
109  return scaled_inv_chi_square_log<propto>(y,nu,s,
111  }
112 
113  template <typename T_y, typename T_dof, typename T_scale,
114  class Policy>
115  inline
117  scaled_inv_chi_square_log(const T_y& y, const T_dof& nu, const T_scale& s,
118  const Policy&) {
119  return scaled_inv_chi_square_log<false>(y,nu,s,Policy());
120  }
121 
122  template <typename T_y, typename T_dof, typename T_scale>
123  inline
125  scaled_inv_chi_square_log(const T_y& y, const T_dof& nu, const T_scale& s) {
126  return scaled_inv_chi_square_log<false>(y,nu,s,
128  }
129 
130  }
131 }
132 
133 #endif
134 
var multiply_log(const var &a, const var &b)
Return the value of a*log(b).
var square(const var &x)
Return the square of the input variable.
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).
var log(const var &a)
Return the natural log of the specified variable (cmath).
Definition: agrad.hpp:1730
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.
T square(T x)
Return the square of the specified argument.
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, T_scale >::type scaled_inv_chi_square_log(const T_y &y, const T_dof &nu, const T_scale &s, const Policy &)
The log of a scaled 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.