1 #ifndef __STAN__PROB__DISTRIBUTIONS__MULTIVARIATE__CONTINUOUS__LKJ_COV_HPP__
2 #define __STAN__PROB__DISTRIBUTIONS__MULTIVARIATE__CONTINUOUS__LKJ_COV_HPP__
21 template <
bool propto,
22 typename T_y,
typename T_loc,
typename T_scale,
typename T_shape,
24 typename boost::math::tools::promote_args<T_y,T_loc,T_scale,T_shape>::type
25 lkj_cov_log(
const Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic>& y,
26 const Eigen::Matrix<T_loc,Eigen::Dynamic,1>& mu,
27 const Eigen::Matrix<T_scale,Eigen::Dynamic,1>& sigma,
30 static const char*
function =
"stan::prob::lkj_cov_log(%1%)";
35 using boost::math::tools::promote_args;
37 typename promote_args<T_y,T_loc,T_scale,T_shape>::type lp(0.0);
39 mu.rows(),
"Rows of location parameter",
40 sigma.rows(),
"columns of scale parameter",
44 y.rows(),
"Rows of random variable",
45 y.cols(),
"columns of random variable",
49 y.rows(),
"Rows of random variable",
50 mu.rows(),
"rows of location parameter",
53 if (!
check_positive(
function, eta,
"Shape parameter", &lp, Policy()))
55 if (!
check_finite(
function, mu,
"Location parameter", &lp, Policy()))
57 if (!
check_finite(
function, sigma,
"Scale parameter", &lp, Policy()))
60 for (
int m = 0; m < y.rows(); ++m)
61 for (
int n = 0; n < y.cols(); ++n)
62 if (!
check_finite(
function, y(m,n),
"Covariance matrix", &lp, Policy()))
65 const unsigned int K = y.rows();
66 const Eigen::Array<T_y,Eigen::Dynamic,1> sds
67 = y.diagonal().array().sqrt();
68 for (
unsigned int k = 0; k < K; k++) {
69 lp += lognormal_log<propto>(sds(k), mu(k), sigma(k), Policy());
74 lp += lkj_corr_log<propto,T_y,T_shape,Policy>(y, eta, Policy());
77 Eigen::DiagonalMatrix<T_y,Eigen::Dynamic> D(K);
78 D.diagonal() = sds.inverse();
79 lp += lkj_corr_log<propto,T_y,T_shape,Policy>(D * y * D, eta, Policy());
83 template <
bool propto,
84 typename T_y,
typename T_loc,
typename T_scale,
typename T_shape>
86 typename boost::math::tools::promote_args<T_y,T_loc,T_scale,T_shape>::type
87 lkj_cov_log(
const Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic>& y,
88 const Eigen::Matrix<T_loc,Eigen::Dynamic,1>& mu,
89 const Eigen::Matrix<T_scale,Eigen::Dynamic,1>& sigma,
95 template <
typename T_y,
typename T_loc,
typename T_scale,
typename T_shape,
98 typename boost::math::tools::promote_args<T_y,T_loc,T_scale,T_shape>::type
99 lkj_cov_log(
const Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic>& y,
100 const Eigen::Matrix<T_loc,Eigen::Dynamic,1>& mu,
101 const Eigen::Matrix<T_scale,Eigen::Dynamic,1>& sigma,
104 return lkj_cov_log<false>(y,mu,sigma,eta,Policy());
108 template <
typename T_y,
typename T_loc,
typename T_scale,
typename T_shape>
110 typename boost::math::tools::promote_args<T_y,T_loc,T_scale,T_shape>::type
111 lkj_cov_log(
const Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic>& y,
112 const Eigen::Matrix<T_loc,Eigen::Dynamic,1>& mu,
113 const Eigen::Matrix<T_scale,Eigen::Dynamic,1>& sigma,
114 const T_shape& eta) {
122 template <
bool propto,
123 typename T_y,
typename T_loc,
typename T_scale,
typename T_shape,
125 typename boost::math::tools::promote_args<T_y,T_loc,T_scale,T_shape>::type
126 lkj_cov_log(
const Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic>& y,
128 const T_scale& sigma,
131 static const char*
function =
"stan::prob::lkj_cov_log(%1%)";
135 using boost::math::tools::promote_args;
137 typename promote_args<T_y,T_loc,T_scale,T_shape>::type lp(0.0);
138 if (!
check_positive(
function, eta,
"Shape parameter", &lp, Policy()))
140 if (!
check_finite(
function, mu,
"Location parameter", &lp, Policy()))
146 const unsigned int K = y.rows();
147 const Eigen::Array<T_y,Eigen::Dynamic,1> sds
148 = y.diagonal().array().sqrt();
149 for (
unsigned int k = 0; k < K; k++) {
150 lp += lognormal_log<propto>(sds(k), mu, sigma, Policy());
155 lp += lkj_corr_log<propto>(y,eta,Policy());
158 Eigen::DiagonalMatrix<T_y,Eigen::Dynamic> D(K);
159 D.diagonal() = sds.inverse();
160 lp += lkj_corr_log<propto,T_y,T_shape,Policy>(D * y * D, eta, Policy());
164 template <
bool propto,
165 typename T_y,
typename T_loc,
typename T_scale,
typename T_shape>
167 typename boost::math::tools::promote_args<T_y,T_loc,T_scale,T_shape>::type
168 lkj_cov_log(
const Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic>& y,
170 const T_scale& sigma,
171 const T_shape& eta) {
175 template <
typename T_y,
typename T_loc,
typename T_scale,
typename T_shape,
178 typename boost::math::tools::promote_args<T_y,T_loc,T_scale,T_shape>::type
179 lkj_cov_log(
const Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic>& y,
181 const T_scale& sigma,
184 return lkj_cov_log<false>(y,mu,sigma,eta,Policy());
187 template <
typename T_y,
typename T_loc,
typename T_scale,
typename T_shape>
189 typename boost::math::tools::promote_args<T_y,T_loc,T_scale,T_shape>::type
190 lkj_cov_log(
const Eigen::Matrix<T_y,Eigen::Dynamic,Eigen::Dynamic>& y,
192 const T_scale& sigma,
193 const T_shape& eta) {