1 #ifndef __STAN__PROB__DISTRIBUTIONS__UNIVARIATE__CONTINUOUS__CHI_SQUARE_HPP__
2 #define __STAN__PROB__DISTRIBUTIONS__UNIVARIATE__CONTINUOUS__CHI_SQUARE_HPP__
4 #include <boost/random/chi_squared_distribution.hpp>
5 #include <boost/random/variate_generator.hpp>
37 template <
bool propto,
38 typename T_y,
typename T_dof,
40 typename return_type<T_y,T_dof>::type
42 static const char*
function =
"stan::prob::chi_square_log(%1%)";
56 if (!
check_not_nan(
function, y,
"Random variable", &logp, Policy()))
58 if (!
check_finite(
function, nu,
"Degrees of freedom parameter", &logp, Policy()))
60 if (!
check_positive(
function, nu,
"Degrees of freedom parameter", &logp, Policy()))
65 "Random variable",
"Degrees of freedom parameter",
75 for (
size_t n = 0; n <
length(y); n++)
83 using boost::math::digamma;
89 for (
size_t i = 0; i <
length(y); i++)
95 for (
size_t i = 0; i <
length(y); i++)
104 for (
size_t i = 0; i <
length(nu); i++) {
105 double half_nu = 0.5 *
value_of(nu_vec[i]);
107 lgamma_half_nu[i] =
lgamma(half_nu);
109 digamma_half_nu_over_two[i] = digamma(half_nu) * 0.5;
115 for (
size_t n = 0; n < N; n++) {
116 const double y_dbl =
value_of(y_vec[n]);
117 const double half_y = 0.5 * y_dbl;
118 const double nu_dbl =
value_of(nu_vec[n]);
119 const double half_nu = 0.5 * nu_dbl;
121 logp += nu_dbl * NEG_LOG_TWO_OVER_TWO - lgamma_half_nu[n];
123 logp += (half_nu-1.0) * log_y[n];
128 operands_and_partials.
d_x1[n] += (half_nu-1.0)*inv_y[n] - 0.5;
131 operands_and_partials.
d_x2[n]
132 += NEG_LOG_TWO_OVER_TWO - digamma_half_nu_over_two[n] + log_y[n]*0.5;
135 return operands_and_partials.
to_var(logp);
139 template <
bool propto,
140 typename T_y,
typename T_dof>
148 template <
typename T_y,
typename T_dof,
153 return chi_square_log<false>(y,nu,Policy());
157 template <
typename T_y,
typename T_dof>
206 using boost::variate_generator;
207 using boost::random::chi_squared_distribution;
208 variate_generator<RNG&, chi_squared_distribution<> >