1 #ifndef __STAN__PROB__DISTRIBUTIONS__MULTIVARIATE__CONTINUOUS__INV_WISHART_HPP__
2 #define __STAN__PROB__DISTRIBUTIONS__MULTIVARIATE__CONTINUOUS__INV_WISHART_HPP__
46 template <
bool propto,
47 typename T_y,
typename T_dof,
typename T_scale,
49 typename boost::math::tools::promote_args<T_y,T_dof,T_scale>::type
52 const Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic>& S,
54 static const char*
function =
"stan::prob::inv_wishart_log(%1%)";
58 using boost::math::tools::promote_args;
61 typename promote_args<T_y,T_dof,T_scale>::type lp(0.0);
62 if(!
check_greater(
function, nu, k-1,
"Degrees of freedom parameter",
66 W.rows(),
"Rows of random variable",
67 W.cols(),
"columns of random variable",
71 S.rows(),
"Rows of scale parameter",
72 S.cols(),
"columns of scale parameter",
76 W.rows(),
"Rows of random variable",
77 S.rows(),
"columns of scale parameter",
82 Eigen::LLT< Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic> > LLT_W = W.llt();
83 if (LLT_W.info() != Eigen::Success) {
84 lp = stan::math::policies::raise_domain_error<T_y>(
function,
85 "W is not positive definite (%1%)",
89 Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic> L = LLT_W.matrixL();
104 lp -= (nu + k + 1.0) * L.diagonal().array().log().sum();
108 Eigen::Matrix<T_y,Eigen::Dynamic,1> W_inv_vec = Eigen::Map<
109 const Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic> >(
111 Eigen::Matrix<T_scale,Eigen::Dynamic,1> S_vec = Eigen::Map<
112 const Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic> >(
117 lp += nu * k * NEG_LOG_TWO_OVER_TWO;
121 template <
bool propto,
122 typename T_y,
typename T_dof,
typename T_scale>
124 typename boost::math::tools::promote_args<T_y,T_dof,T_scale>::type
127 const Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic>& S) {
132 template <
typename T_y,
typename T_dof,
typename T_scale,
135 typename boost::math::tools::promote_args<T_y,T_dof,T_scale>::type
138 const Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic>& S,
140 return inv_wishart_log<false>(W,nu,S,Policy());
144 template <
typename T_y,
typename T_dof,
typename T_scale>
146 typename boost::math::tools::promote_args<T_y,T_dof,T_scale>::type
149 const Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic>& S) {
154 inline Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>
156 const Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic>& S,
159 Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic> S_inv(S.rows(), S.cols());
160 S_inv = Eigen::MatrixXd::Identity(S.cols(),S.cols());
161 S_inv = S.ldlt().solve(S_inv);