@@ -91,14 +91,14 @@ TEST(ProbDistributionsInvWishartCholesky, SpecialRNGTest) {
9191 using stan::math::inv_wishart_cholesky_rng;
9292 using stan::math::multiply_lower_tri_self_transpose;
9393
94- boost::random::mt19937 rng (1234U );
94+ boost::random::mt19937 rng (92343U );
9595 int N = 1e5 ;
9696 double tol = 0.1 ;
9797 for (int k = 1 ; k < 5 ; k++) {
98- MatrixXd sigma = MatrixXd::Identity (k, k);
98+ MatrixXd L = MatrixXd::Identity (k, k);
9999 MatrixXd Z = MatrixXd::Zero (k, k);
100100 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 (inv_wishart_cholesky_rng (k + 2 , L , rng));
102102 }
103103 Z /= N;
104104 for (int j = 0 ; j < k; j++) {
@@ -111,3 +111,36 @@ TEST(ProbDistributionsInvWishartCholesky, SpecialRNGTest) {
111111 }
112112 }
113113}
114+
115+ TEST (ProbDistributionsInvWishartCholesky, compareToInvWishart) {
116+ // Compare the marginal mean
117+
118+ using Eigen::MatrixXd;
119+ using Eigen::VectorXd;
120+ using stan::math::inv_wishart_cholesky_rng;
121+ using stan::math::multi_normal_rng;
122+ using stan::math::inv_wishart_rng;
123+ using stan::math::lkj_corr_cholesky_rng;
124+ using stan::math::qr_thin_R;
125+ using stan::math::multiply_lower_tri_self_transpose;
126+
127+ boost::random::mt19937 rng (92343U );
128+ int N = 1e5 ;
129+ double tol = 0.1 ;
130+ for (int k = 1 ; k < 5 ; k++) {
131+ MatrixXd sigma = inv_wishart_rng (15 , MatrixXd::Identity (k, k), rng);
132+ MatrixXd L = stan::math::cholesky_decompose (sigma);
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 += inv_wishart_cholesky_rng (k + 4 , L, rng);
137+ }
138+ Z_est /= N;
139+ Z_est = multiply_lower_tri_self_transpose (Z_est);
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