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);
50 if (!
check_finite(
function, mu,
"Location parameter", &lp, Policy()))
52 if (!
check_not_nan(
function, y,
"Random variable", &lp, Policy()))
54 if (!
check_symmetric(
function, Sigma,
"Scale parameter", &lp, Policy()))
59 "Degrees of freedom parameter", &lp,
63 "Degrees of freedom parameter", &lp,
72 Eigen::LLT< Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic> > LLT = Sigma.llt();
73 if (LLT.info() != Eigen::Success) {
74 lp = stan::math::policies::raise_domain_error<T_scale>(
function,
75 "Sigma is not positive definite (%1%)",
79 Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic> L = LLT.matrixL();
84 lp +=
lgamma(0.5 * (nu + d));
86 lp -= (0.5 * d) *
log(nu);
90 lp -= (0.5 * d) * LOG_PI;
100 lp -= L.diagonal().array().log().sum();
106 Eigen::Matrix<typename promote_args<T_y,T_loc>::type,
109 Eigen::Matrix<typename promote_args<T_scale,T_y,T_loc>::type,
111 1> half = L = mdivide_left_tri<Eigen::Lower>(L, y_minus_mu);
119 template <
bool propto,
120 typename T_y,
typename T_dof,
typename T_loc,
typename T_scale>
122 typename boost::math::tools::promote_args<T_y,T_dof,T_loc,T_scale>::type
125 const Eigen::Matrix<T_loc,Eigen::Dynamic,1>& mu,
127 Eigen::Matrix<T_scale,
128 Eigen::Dynamic,Eigen::Dynamic>& Sigma) {
129 return multi_student_t_log<propto>(y,nu,mu,Sigma,
133 template <
typename T_y,
typename T_dof,
typename T_loc,
typename T_scale,
136 typename boost::math::tools::promote_args<T_y,T_dof,T_loc,T_scale>::type
139 const Eigen::Matrix<T_loc,Eigen::Dynamic,1>& mu,
141 Eigen::Matrix<T_scale,
142 Eigen::Dynamic,Eigen::Dynamic>& Sigma,
144 return multi_student_t_log<false>(y,nu,mu,Sigma,Policy());
149 template <
typename T_y,
typename T_dof,
typename T_loc,
typename T_scale>
151 typename boost::math::tools::promote_args<T_y,T_dof,T_loc,T_scale>::type
154 const Eigen::Matrix<T_loc,Eigen::Dynamic,1>& mu,
156 Eigen::Matrix<T_scale,
157 Eigen::Dynamic,Eigen::Dynamic>& Sigma) {
158 return multi_student_t_log<false>(y,nu,mu,Sigma,