1 #ifndef __STAN__PROB__DISTRIBUTIONS__MULTIVARIATE__CONTINUOUS__WISHART_HPP__
2 #define __STAN__PROB__DISTRIBUTIONS__MULTIVARIATE__CONTINUOUS__WISHART_HPP__
10 #include <boost/concept_check.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
50 wishart_log(
const Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic>& W,
52 const Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic>& S,
54 static const char*
function =
"stan::prob::wishart_log(%1%)";
58 using boost::math::tools::promote_args;
61 typename promote_args<T_y,T_dof,T_scale>::type lp(0.0);
63 "Degrees of freedom parameter", &lp, Policy()))
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::LLT< Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic> > LLT_S = S.llt();
90 if (LLT_S.info() != Eigen::Success) {
91 lp = stan::math::policies::raise_domain_error<T_scale>(
function,
92 "S is not positive definite (%1%)",
97 Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic> L_W = LLT_W.matrixL();
98 Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic> L_S = LLT_S.matrixL();
105 lp += nu * k * NEG_LOG_TWO_OVER_TWO;
111 lp -= nu * L_S.diagonal().array().log().sum();
115 Eigen::Matrix<T_scale,Eigen::Dynamic,1> S_inv_vec = Eigen::Map<
116 const Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic> >(
117 &L_S(0), L_S.size(), 1);
118 Eigen::Matrix<T_y,Eigen::Dynamic,1> W_vec = Eigen::Map<
119 const Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic> >(
125 lp += (nu - k - 1.0) * L_W.diagonal().array().log().sum();
129 template <
bool propto,
130 typename T_y,
typename T_dof,
typename T_scale>
132 typename boost::math::tools::promote_args<T_y,T_dof,T_scale>::type
133 wishart_log(
const Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic>& W,
135 const Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic>& S) {
140 template <
typename T_y,
typename T_dof,
typename T_scale,
143 typename boost::math::tools::promote_args<T_y,T_dof,T_scale>::type
144 wishart_log(
const Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic>& W,
146 const Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic>& S,
148 return wishart_log<false>(W,nu,S,Policy());
152 template <
typename T_y,
typename T_dof,
typename T_scale>
154 typename boost::math::tools::promote_args<T_y,T_dof,T_scale>::type
155 wishart_log(
const Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic>& W,
157 const Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic>& S) {