1 #ifndef __STAN__PROB__DISTRIBUTIONS__MULTIVARIATE__CONTINUOUS__LKJ_COV_HPP__
2 #define __STAN__PROB__DISTRIBUTIONS__MULTIVARIATE__CONTINUOUS__LKJ_COV_HPP__
20 template <
bool propto,
21 typename T_y,
typename T_loc,
typename T_scale,
typename T_shape,
23 typename boost::math::tools::promote_args<T_y,T_loc,T_scale,T_shape>::type
24 lkj_cov_log(
const Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic>& y,
25 const Eigen::Matrix<T_loc,Eigen::Dynamic,1>& mu,
26 const Eigen::Matrix<T_scale,Eigen::Dynamic,1>& sigma,
29 static const char*
function =
"stan::prob::lkj_cov_log(%1%)";
34 using boost::math::tools::promote_args;
36 typename promote_args<T_y,T_loc,T_scale,T_shape>::type lp(0.0);
38 mu.rows(),
"Rows of location parameter",
39 sigma.rows(),
"columns of scale parameter",
43 y.rows(),
"Rows of random variable",
44 y.cols(),
"columns of random variable",
48 y.rows(),
"Rows of random variable",
49 mu.rows(),
"rows of location parameter",
52 if (!
check_positive(
function, eta,
"Shape parameter", &lp, Policy()))
54 if (!
check_finite(
function, mu,
"Location parameter", &lp, Policy()))
56 if (!
check_finite(
function, sigma,
"Scale parameter", &lp, Policy()))
59 for (
int m = 0; m < y.rows(); ++m)
60 for (
int n = 0; n < y.cols(); ++n)
61 if (!
check_finite(
function, y(m,n),
"Covariance matrix", &lp, Policy()))
64 const unsigned int K = y.rows();
65 const Eigen::Array<T_y,Eigen::Dynamic,1> sds
66 = y.diagonal().array().sqrt();
67 for (
unsigned int k = 0; k < K; k++) {
68 lp += lognormal_log<propto>(sds(k), mu(k), sigma(k), Policy());
73 lp += lkj_corr_log<propto,T_y,T_shape,Policy>(y, eta, Policy());
76 Eigen::DiagonalMatrix<T_y,Eigen::Dynamic> D(K);
77 D.diagonal() = sds.inverse();
78 lp += lkj_corr_log<propto,T_y,T_shape,Policy>(D * y * D, eta, Policy());
82 template <
bool propto,
83 typename T_y,
typename T_loc,
typename T_scale,
typename T_shape>
85 typename boost::math::tools::promote_args<T_y,T_loc,T_scale,T_shape>::type
86 lkj_cov_log(
const Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic>& y,
87 const Eigen::Matrix<T_loc,Eigen::Dynamic,1>& mu,
88 const Eigen::Matrix<T_scale,Eigen::Dynamic,1>& sigma,
94 template <
typename T_y,
typename T_loc,
typename T_scale,
typename T_shape,
97 typename boost::math::tools::promote_args<T_y,T_loc,T_scale,T_shape>::type
98 lkj_cov_log(
const Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic>& y,
99 const Eigen::Matrix<T_loc,Eigen::Dynamic,1>& mu,
100 const Eigen::Matrix<T_scale,Eigen::Dynamic,1>& sigma,
103 return lkj_cov_log<false>(y,mu,sigma,eta,Policy());
107 template <
typename T_y,
typename T_loc,
typename T_scale,
typename T_shape>
109 typename boost::math::tools::promote_args<T_y,T_loc,T_scale,T_shape>::type
110 lkj_cov_log(
const Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic>& y,
111 const Eigen::Matrix<T_loc,Eigen::Dynamic,1>& mu,
112 const Eigen::Matrix<T_scale,Eigen::Dynamic,1>& sigma,
113 const T_shape& eta) {
121 template <
bool propto,
122 typename T_y,
typename T_loc,
typename T_scale,
typename T_shape,
124 typename boost::math::tools::promote_args<T_y,T_loc,T_scale,T_shape>::type
125 lkj_cov_log(
const Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic>& y,
127 const T_scale& sigma,
130 static const char*
function =
"stan::prob::lkj_cov_log(%1%)";
134 using boost::math::tools::promote_args;
136 typename promote_args<T_y,T_loc,T_scale,T_shape>::type lp(0.0);
137 if (!
check_positive(
function, eta,
"Shape parameter", &lp, Policy()))
139 if (!
check_finite(
function, mu,
"Location parameter", &lp, Policy()))
145 const unsigned int K = y.rows();
146 const Eigen::Array<T_y,Eigen::Dynamic,1> sds
147 = y.diagonal().array().sqrt();
148 for (
unsigned int k = 0; k < K; k++) {
149 lp += lognormal_log<propto>(sds(k), mu, sigma, Policy());
154 lp += lkj_corr_log<propto>(y,eta,Policy());
157 Eigen::DiagonalMatrix<T_y,Eigen::Dynamic> D(K);
158 D.diagonal() = sds.inverse();
159 lp += lkj_corr_log<propto,T_y,T_shape,Policy>(D * y * D, eta, Policy());
163 template <
bool propto,
164 typename T_y,
typename T_loc,
typename T_scale,
typename T_shape>
166 typename boost::math::tools::promote_args<T_y,T_loc,T_scale,T_shape>::type
167 lkj_cov_log(
const Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic>& y,
169 const T_scale& sigma,
170 const T_shape& eta) {
174 template <
typename T_y,
typename T_loc,
typename T_scale,
typename T_shape,
177 typename boost::math::tools::promote_args<T_y,T_loc,T_scale,T_shape>::type
178 lkj_cov_log(
const Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic>& y,
180 const T_scale& sigma,
183 return lkj_cov_log<false>(y,mu,sigma,eta,Policy());
186 template <
typename T_y,
typename T_loc,
typename T_scale,
typename T_shape>
188 typename boost::math::tools::promote_args<T_y,T_loc,T_scale,T_shape>::type
189 lkj_cov_log(
const Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic>& y,
191 const T_scale& sigma,
192 const T_shape& eta) {