1 #ifndef __STAN__PROB__DISTRIBUTIONS__MULTIVARIATE__CONTINUOUS__WISHART_HPP__
2 #define __STAN__PROB__DISTRIBUTIONS__MULTIVARIATE__CONTINUOUS__WISHART_HPP__
9 #include <boost/concept_check.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
49 wishart_log(
const Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic>& W,
51 const Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic>& S,
53 static const char*
function =
"stan::prob::wishart_log(%1%)";
57 using boost::math::tools::promote_args;
61 typename promote_args<T_y,T_dof,T_scale>::type lp;
63 "Degrees of freedom parameter", &lp, Policy()))
73 Eigen::LLT< Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic> > LLT_W = W.llt();
74 if (LLT_W.info() != Eigen::Success) {
75 lp = stan::math::policies::raise_domain_error<T_y>(
function,
76 "W is not positive definite (%1%)",
80 Eigen::LLT< Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic> > LLT_S = S.llt();
81 if (LLT_S.info() != Eigen::Success) {
82 lp = stan::math::policies::raise_domain_error<T_scale>(
function,
83 "S is not positive definite (%1%)",
88 Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic> L_W = LLT_W.matrixL();
89 Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic> L_S = LLT_S.matrixL();
96 lp += nu * k * NEG_LOG_TWO_OVER_TWO;
102 lp -= nu * L_S.diagonal().array().log().sum();
105 Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic> I(k,k);
108 L_S = L_S.transpose() * L_S.template triangularView<Eigen::Lower>();
113 lp += (nu - k - 1.0) * L_W.diagonal().array().log().sum();
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
122 wishart_log(
const Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic>& W,
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
133 wishart_log(
const Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic>& W,
135 const Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic>& S,
137 return 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
144 wishart_log(
const Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic>& W,
146 const Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic>& S) {