1 #ifndef STAN_MATH_PRIM_MAT_FUN_CHOLESKY_CORR_CONSTRAIN_HPP
2 #define STAN_MATH_PRIM_MAT_FUN_CHOLESKY_CORR_CONSTRAIN_HPP
19 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>
26 int k_choose_2 = (K * (K - 1)) / 2;
27 if (k_choose_2 != y.size()) {
30 "Require (K choose 2) elements in y.");
32 Matrix<T, Dynamic, 1> z(k_choose_2);
33 for (
int i = 0; i < k_choose_2; ++i)
35 Matrix<T, Dynamic, Dynamic> x(K, K);
38 for (
int j = 1; j < K; ++j)
39 for (
int i = 0; i < j; ++i)
43 for (
int i = 1; i < K; ++i) {
45 T sum_sqs(
square(x(i, 0)));
46 for (
int j = 1; j < i; ++j) {
47 x(i, j) = z(k++) *
sqrt(1.0 - sum_sqs);
48 sum_sqs +=
square(x(i, j));
50 x(i, i) =
sqrt(1.0 - sum_sqs);
57 Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>
66 int k_choose_2 = (K * (K - 1)) / 2;
67 if (k_choose_2 != y.size()) {
70 " Require (K choose 2) elements in y.");
72 Matrix<T, Dynamic, 1> z(k_choose_2);
73 for (
int i = 0; i < k_choose_2; ++i)
75 Matrix<T, Dynamic, Dynamic> x(K, K);
78 for (
int j = 1; j < K; ++j)
79 for (
int i = 0; i < j; ++i)
83 for (
int i = 1; i < K; ++i) {
85 T sum_sqs =
square(x(i, 0));
86 for (
int j = 1; j < i; ++j) {
87 lp += 0.5 *
log1m(sum_sqs);
88 x(i, j) = z(k++) *
sqrt(1.0 - sum_sqs);
89 sum_sqs +=
square(x(i, j));
91 x(i, i) =
sqrt(1.0 - sum_sqs);
fvar< T > sqrt(const fvar< T > &x)
fvar< T > square(const fvar< T > &x)
Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > cholesky_corr_constrain(const Eigen::Matrix< T, Eigen::Dynamic, 1 > &y, int K)
void domain_error(const char *function, const char *name, const T &y, const char *msg1, const char *msg2)
Throw a domain error with a consistently formatted message.
fvar< T > log1m(const fvar< T > &x)
T corr_constrain(const T x)
Return the result of transforming the specified scalar to have a valid correlation value between -1 a...