1 #ifndef __STAN__PROB__DISTRIBUTIONS__MULTIVARIATE__CONTINUOUS__INV_WISHART_HPP__
2 #define __STAN__PROB__DISTRIBUTIONS__MULTIVARIATE__CONTINUOUS__INV_WISHART_HPP__
42 template <
bool propto,
43 typename T_y,
typename T_dof,
typename T_scale,
45 typename boost::math::tools::promote_args<T_y,T_dof,T_scale>::type
48 const Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic>& S,
50 static const char*
function =
"stan::prob::inv_wishart_log(%1%)";
54 using boost::math::tools::promote_args;
58 typename promote_args<T_y,T_dof,T_scale>::type lp(0.0);
70 Eigen::LLT< Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic> > LLT_W = W.llt();
71 if (LLT_W.info() != Eigen::Success) {
72 lp = stan::math::policies::raise_domain_error<T_y>(
function,
73 "W is not positive definite (%1%)",
77 Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic> L = LLT_W.matrixL();
87 lp += nu * S.llt().matrixLLT().diagonal().array().log().sum();
90 lp -= (nu + k + 1.0) * L.diagonal().array().log().sum();
97 lp += nu * k * NEG_LOG_TWO_OVER_TWO;
101 template <
bool propto,
102 typename T_y,
typename T_dof,
typename T_scale>
104 typename boost::math::tools::promote_args<T_y,T_dof,T_scale>::type
107 const Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic>& S) {
112 template <
typename T_y,
typename T_dof,
typename T_scale,
115 typename boost::math::tools::promote_args<T_y,T_dof,T_scale>::type
118 const Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic>& S,
120 return inv_wishart_log<false>(W,nu,S,Policy());
124 template <
typename T_y,
typename T_dof,
typename T_scale>
126 typename boost::math::tools::promote_args<T_y,T_dof,T_scale>::type
129 const Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic>& S) {