Stan  1.1
probability, sampling & optimization
 All Classes Namespaces Files Functions Variables Typedefs Enumerator Friends Macros Pages
wishart.hpp
Go to the documentation of this file.
1 #ifndef __STAN__PROB__DISTRIBUTIONS__MULTIVARIATE__CONTINUOUS__WISHART_HPP__
2 #define __STAN__PROB__DISTRIBUTIONS__MULTIVARIATE__CONTINUOUS__WISHART_HPP__
3 
8 #include <stan/agrad/matrix.hpp>
9 #include <stan/prob/traits.hpp>
10 #include <boost/concept_check.hpp>
11 
12 namespace stan {
13 
14  namespace prob {
15 
16  // Wishart(Sigma|n,Omega) [Sigma, Omega symmetric, non-neg, definite;
17  // Sigma.dims() = Omega.dims();
18  // n > Sigma.rows() - 1]
46  template <bool propto,
47  typename T_y, typename T_dof, typename T_scale,
48  class Policy>
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,
51  const T_dof& nu,
52  const Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic>& S,
53  const Policy&) {
54  static const char* function = "stan::prob::wishart_log(%1%)";
55 
58  using boost::math::tools::promote_args;
59 
61  typename promote_args<T_y,T_dof,T_scale>::type lp(0.0);
62  if (!check_greater_or_equal(function, nu, k - 1,
63  "Degrees of freedom parameter", &lp, Policy()))
64  return lp;
65  if (!check_size_match(function,
66  W.rows(), "Rows of random variable",
67  W.cols(), "columns of random variable",
68  &lp, Policy()))
69  return lp;
70  if (!check_size_match(function,
71  S.rows(), "Rows of scale parameter",
72  S.cols(), "columns of scale parameter",
73  &lp, Policy()))
74  return lp;
75  if (!check_size_match(function,
76  W.rows(), "Rows of random variable",
77  S.rows(), "columns of scale parameter",
78  &lp, Policy()))
79  return lp;
80  // FIXME: domain checks
81 
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%)",
86  0,Policy());
87  return lp;
88  }
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%)",
93  0,Policy());
94  return lp;
95  }
96 
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();
99 
102  using stan::math::crossprod;
103  using stan::math::lmgamma;
105  lp += nu * k * NEG_LOG_TWO_OVER_TWO;
106 
108  lp -= lmgamma(k, 0.5 * nu);
109 
111  lp -= nu * L_S.diagonal().array().log().sum();
112 
114  L_S = crossprod(mdivide_left_tri_low(L_S));
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> >(
120  &W(0), W.size(), 1);
121  lp -= 0.5 * dot_product(S_inv_vec, W_vec); // trace(S^-1 * W)
122  }
123 
124  if (include_summand<propto,T_y,T_dof>::value && nu != (k + 1))
125  lp += (nu - k - 1.0) * L_W.diagonal().array().log().sum();
126  return lp;
127  }
128 
129  template <bool propto,
130  typename T_y, typename T_dof, typename T_scale>
131  inline
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,
134  const T_dof& nu,
135  const Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic>& S) {
136  return wishart_log<propto>(W,nu,S,stan::math::default_policy());
137  }
138 
139 
140  template <typename T_y, typename T_dof, typename T_scale,
141  class Policy>
142  inline
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,
145  const T_dof& nu,
146  const Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic>& S,
147  const Policy&) {
148  return wishart_log<false>(W,nu,S,Policy());
149  }
150 
151 
152  template <typename T_y, typename T_dof, typename T_scale>
153  inline
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,
156  const T_dof& nu,
157  const Eigen::Matrix<T_scale,Eigen::Dynamic,Eigen::Dynamic>& S) {
158  return wishart_log<false>(W,nu,S,stan::math::default_policy());
159  }
160 
161 
162  }
163 }
164 #endif

     [ Stan Home Page ] © 2011–2013, Stan Development Team.