1 #ifndef __STAN__PROB__DISTRIBUTIONS__MULTIVARIATE__CONTINUOUS__INV_WISHART_HPP__
2 #define __STAN__PROB__DISTRIBUTIONS__MULTIVARIATE__CONTINUOUS__INV_WISHART_HPP__
45 template <
bool propto,
46 typename T_y,
typename T_dof,
typename T_scale,
48 typename boost::math::tools::promote_args<T_y,T_dof,T_scale>::type
51 const Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic>& S,
53 static const char*
function =
"stan::prob::inv_wishart_log(%1%)";
57 using boost::math::tools::promote_args;
60 typename promote_args<T_y,T_dof,T_scale>::type lp(0.0);
65 W.rows(),
"Rows of random variable",
66 W.cols(),
"columns of random variable",
70 S.rows(),
"Rows of scale parameter",
71 S.cols(),
"columns of scale parameter",
75 W.rows(),
"Rows of random variable",
76 S.rows(),
"columns of scale parameter",
81 Eigen::LLT< Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic> > LLT_W = W.llt();
82 if (LLT_W.info() != Eigen::Success) {
83 lp = stan::math::policies::raise_domain_error<T_y>(
function,
84 "W is not positive definite (%1%)",
88 Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic> L = LLT_W.matrixL();
98 lp += nu * S.llt().matrixLLT().diagonal().array().log().sum();
101 lp -= (nu + k + 1.0) * L.diagonal().array().log().sum();
105 Eigen::Matrix<T_y,Eigen::Dynamic,1> W_inv_vec = Eigen::Map<
106 const Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic> >(
108 Eigen::Matrix<T_scale,Eigen::Dynamic,1> S_vec = Eigen::Map<
109 const Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic> >(
114 lp += nu * k * NEG_LOG_TWO_OVER_TWO;
118 template <
bool propto,
119 typename T_y,
typename T_dof,
typename T_scale>
121 typename boost::math::tools::promote_args<T_y,T_dof,T_scale>::type
124 const Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic>& S) {
129 template <
typename T_y,
typename T_dof,
typename T_scale,
132 typename boost::math::tools::promote_args<T_y,T_dof,T_scale>::type
135 const Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic>& S,
137 return inv_wishart_log<false>(W,nu,S,Policy());
141 template <
typename T_y,
typename T_dof,
typename T_scale>
143 typename boost::math::tools::promote_args<T_y,T_dof,T_scale>::type
146 const Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic>& S) {