1 #ifndef __STAN__PROB__DISTRIBUTIONS__MULTIVARIATE__CONTINUOUS__WISHART_HPP__
2 #define __STAN__PROB__DISTRIBUTIONS__MULTIVARIATE__CONTINUOUS__WISHART_HPP__
9 #include <boost/concept_check.hpp>
53 template <
bool propto,
54 typename T_y,
typename T_dof,
typename T_scale,
56 typename boost::math::tools::promote_args<T_y,T_dof,T_scale>::type
57 wishart_log(
const Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic>& W,
59 const Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic>& S,
61 static const char*
function =
"stan::prob::wishart_log(%1%)";
65 using boost::math::tools::promote_args;
68 typename promote_args<T_y,T_dof,T_scale>::type lp(0.0);
70 "Degrees of freedom parameter", &lp, Policy()))
73 W.rows(),
"Rows of random variable",
74 W.cols(),
"columns of random variable",
78 S.rows(),
"Rows of scale parameter",
79 S.cols(),
"columns of scale parameter",
83 W.rows(),
"Rows of random variable",
84 S.rows(),
"columns of scale parameter",
89 Eigen::LLT< Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic> > LLT_W = W.llt();
90 if (LLT_W.info() != Eigen::Success) {
91 lp = stan::math::policies::raise_domain_error<T_y>(
function,
92 "W is not positive definite (%1%)",
96 Eigen::LLT< Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic> > LLT_S = S.llt();
97 if (LLT_S.info() != Eigen::Success) {
98 lp = stan::math::policies::raise_domain_error<T_scale>(
function,
99 "S is not positive definite (%1%)",
104 Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic> L_W = LLT_W.matrixL();
105 Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic> L_S = LLT_S.matrixL();
112 lp += nu * k * NEG_LOG_TWO_OVER_TWO;
118 lp -= nu * L_S.diagonal().array().log().sum();
122 Eigen::Matrix<T_scale,Eigen::Dynamic,1> S_inv_vec = Eigen::Map<
123 const Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic> >(
124 &L_S(0), L_S.size(), 1);
125 Eigen::Matrix<T_y,Eigen::Dynamic,1> W_vec = Eigen::Map<
126 const Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic> >(
132 lp += (nu - k - 1.0) * L_W.diagonal().array().log().sum();
136 template <
bool propto,
137 typename T_y,
typename T_dof,
typename T_scale>
139 typename boost::math::tools::promote_args<T_y,T_dof,T_scale>::type
140 wishart_log(
const Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic>& W,
142 const Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic>& S) {
147 template <
typename T_y,
typename T_dof,
typename T_scale,
150 typename boost::math::tools::promote_args<T_y,T_dof,T_scale>::type
151 wishart_log(
const Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic>& W,
153 const Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic>& S,
155 return wishart_log<false>(W,nu,S,Policy());
159 template <
typename T_y,
typename T_dof,
typename T_scale>
161 typename boost::math::tools::promote_args<T_y,T_dof,T_scale>::type
162 wishart_log(
const Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic>& W,
164 const Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic>& S) {
169 inline Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>
171 const Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic>& S,
174 Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic> B(S.rows(), S.cols());
177 for(
int i = 0; i < S.cols(); i++) {
179 for(
int j = 0; j < i; j++)