@@ -91,14 +91,15 @@ TEST(ProbDistributionsInvWishartCholesky, SpecialRNGTest) {
91
91
using stan::math::inv_wishart_cholesky_rng;
92
92
using stan::math::multiply_lower_tri_self_transpose;
93
93
94
- boost::random ::mt19937 rng (1234U );
94
+ boost::random ::mt19937 rng (92343U );
95
95
int N = 1e5 ;
96
96
double tol = 0.1 ;
97
97
for (int k = 1 ; k < 5 ; k++) {
98
- MatrixXd sigma = MatrixXd::Identity (k, k);
98
+ MatrixXd L = MatrixXd::Identity (k, k);
99
99
MatrixXd Z = MatrixXd::Zero (k, k);
100
100
for (int i = 0 ; i < N; i++) {
101
- Z += stan::math::crossprod (inv_wishart_cholesky_rng (k + 2 , sigma, rng));
101
+ Z += multiply_lower_tri_self_transpose (
102
+ inv_wishart_cholesky_rng (k + 2 , L, rng));
102
103
}
103
104
Z /= N;
104
105
for (int j = 0 ; j < k; j++) {
@@ -111,3 +112,35 @@ TEST(ProbDistributionsInvWishartCholesky, SpecialRNGTest) {
111
112
}
112
113
}
113
114
}
115
+
116
+ TEST (ProbDistributionsInvWishartCholesky, compareToInvWishart) {
117
+ // Compare the marginal mean
118
+
119
+ using Eigen::MatrixXd;
120
+ using Eigen::VectorXd;
121
+ using stan::math::inv_wishart_cholesky_rng;
122
+ using stan::math::inv_wishart_rng;
123
+ using stan::math::multiply_lower_tri_self_transpose;
124
+ using stan::math::qr_thin_Q;
125
+
126
+ boost::random ::mt19937 rng (92343U );
127
+ int N = 1e5 ;
128
+ double tol = 0.05 ;
129
+ for (int k = 1 ; k < 5 ; k++) {
130
+ MatrixXd L = qr_thin_Q (MatrixXd::Random (k, k)).transpose ();
131
+ L.diagonal () = stan::math::abs (L.diagonal ());
132
+ MatrixXd sigma = multiply_lower_tri_self_transpose (L);
133
+ MatrixXd Z_mean = sigma / (k + 3 );
134
+ MatrixXd Z_est = MatrixXd::Zero (k, k);
135
+ for (int i = 0 ; i < N; i++) {
136
+ Z_est += multiply_lower_tri_self_transpose (
137
+ inv_wishart_cholesky_rng (k + 4 , L, rng));
138
+ }
139
+ Z_est /= N;
140
+ for (int j = 0 ; j < k; j++) {
141
+ for (int i = 0 ; i < j; i++) {
142
+ EXPECT_NEAR (Z_est (i, j), Z_mean (i, j), tol);
143
+ }
144
+ }
145
+ }
146
+ }
0 commit comments