1 #ifndef __STAN__PROB__DISTRIBUTIONS__MULTI_STUDENT_T_HPP__
2 #define __STAN__PROB__DISTRIBUTIONS__MULTI_STUDENT_T_HPP__
23 template <
bool propto,
24 typename T_y,
typename T_dof,
typename T_loc,
typename T_scale,
26 typename boost::math::tools::promote_args<T_y,T_dof,T_loc,T_scale>::type
29 const Eigen::Matrix<T_loc,Eigen::Dynamic,1>& mu,
31 Eigen::Matrix<T_scale,
32 Eigen::Dynamic,Eigen::Dynamic>& Sigma,
34 static const char*
function =
"stan::prob::multi_student_t(%1%)";
41 using boost::math::tools::promote_args;
43 typename promote_args<T_y,T_dof,T_loc,T_scale>::type lp(0.0);
45 y.size(),
"Size of random variable",
46 mu.size(),
"size of location parameter",
50 y.size(),
"Size of random variable",
51 Sigma.rows(),
"rows of scale parameter",
55 y.size(),
"Size of random variable",
56 Sigma.cols(),
"columns of scale parameter",
59 if (!
check_finite(
function, mu,
"Location parameter", &lp, Policy()))
61 if (!
check_not_nan(
function, y,
"Random variable", &lp, Policy()))
63 if (!
check_symmetric(
function, Sigma,
"Scale parameter", &lp, Policy()))
68 "Degrees of freedom parameter", &lp,
72 "Degrees of freedom parameter", &lp,
81 Eigen::LLT< Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic> > LLT = Sigma.llt();
82 if (LLT.info() != Eigen::Success) {
83 lp = stan::math::policies::raise_domain_error<T_scale>(
function,
84 "Sigma is not positive definite (%1%)",
88 Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic> L = LLT.matrixL();
93 lp +=
lgamma(0.5 * (nu + d));
95 lp -= (0.5 * d) *
log(nu);
99 lp -= (0.5 * d) * LOG_PI;
109 lp -= L.diagonal().array().log().sum();
115 Eigen::Matrix<typename promote_args<T_y,T_loc>::type,
118 Eigen::Matrix<typename promote_args<T_scale,T_y,T_loc>::type,
120 1> half = L = mdivide_left_tri<Eigen::Lower>(L, y_minus_mu);
128 template <
bool propto,
129 typename T_y,
typename T_dof,
typename T_loc,
typename T_scale>
131 typename boost::math::tools::promote_args<T_y,T_dof,T_loc,T_scale>::type
134 const Eigen::Matrix<T_loc,Eigen::Dynamic,1>& mu,
136 Eigen::Matrix<T_scale,
137 Eigen::Dynamic,Eigen::Dynamic>& Sigma) {
138 return multi_student_t_log<propto>(y,nu,mu,Sigma,
142 template <
typename T_y,
typename T_dof,
typename T_loc,
typename T_scale,
145 typename boost::math::tools::promote_args<T_y,T_dof,T_loc,T_scale>::type
148 const Eigen::Matrix<T_loc,Eigen::Dynamic,1>& mu,
150 Eigen::Matrix<T_scale,
151 Eigen::Dynamic,Eigen::Dynamic>& Sigma,
153 return multi_student_t_log<false>(y,nu,mu,Sigma,Policy());
158 template <
typename T_y,
typename T_dof,
typename T_loc,
typename T_scale>
160 typename boost::math::tools::promote_args<T_y,T_dof,T_loc,T_scale>::type
163 const Eigen::Matrix<T_loc,Eigen::Dynamic,1>& mu,
165 Eigen::Matrix<T_scale,
166 Eigen::Dynamic,Eigen::Dynamic>& Sigma) {
167 return multi_student_t_log<false>(y,nu,mu,Sigma,