1 #include <stan/math/fwd.hpp>
2 #include <gtest/gtest.h>
3 
TEST(ProbDistributionsMultiGP,fvar_double)4 TEST(ProbDistributionsMultiGP, fvar_double) {
5   using Eigen::Dynamic;
6   using Eigen::Matrix;
7   using stan::math::fvar;
8   Matrix<fvar<double>, Dynamic, 1> mu(5, 1);
9   mu.setZero();
10 
11   Matrix<fvar<double>, Dynamic, Dynamic> y(3, 5);
12   y << 2.0, -2.0, 11.0, 4.0, -2.0, 11.0, 2.0, -5.0, 11.0, 0.0, -2.0, 11.0, 2.0,
13       -2.0, -11.0;
14 
15   Matrix<fvar<double>, Dynamic, Dynamic> Sigma(5, 5);
16   Sigma << 9.0, -3.0, 0.0, 0.0, 0.0, -3.0, 4.0, 0.0, 0.0, 0.0, 0.0, 0.0, 5.0,
17       1.0, 0.0, 0.0, 0.0, 1.0, 10.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.0;
18 
19   Matrix<fvar<double>, Dynamic, 1> w(3, 1);
20   w << 1.0, 0.5, 1.5;
21 
22   for (int i = 0; i < 5; i++) {
23     mu(i).d_ = 1.0;
24     if (i < 3)
25       w(i).d_ = 1.0;
26     for (int j = 0; j < 5; j++) {
27       Sigma(i, j).d_ = 1.0;
28       if (i < 3)
29         y(i, j).d_ = 1.0;
30     }
31   }
32 
33   fvar<double> lp_ref(0);
34   for (size_t i = 0; i < 3; i++) {
35     Matrix<fvar<double>, Dynamic, 1> cy(y.row(i).transpose());
36     Matrix<fvar<double>, Dynamic, Dynamic> cSigma((1.0 / w[i]) * Sigma);
37     lp_ref += stan::math::multi_normal_log(cy, mu, cSigma);
38   }
39 
40   EXPECT_FLOAT_EQ(lp_ref.val_, stan::math::multi_gp_log(y, Sigma, w).val_);
41   EXPECT_FLOAT_EQ(-74.572952, stan::math::multi_gp_log(y, Sigma, w).d_);
42 }
43 
TEST(ProbDistributionsMultiGP,fvar_fvar_double)44 TEST(ProbDistributionsMultiGP, fvar_fvar_double) {
45   using Eigen::Dynamic;
46   using Eigen::Matrix;
47   using stan::math::fvar;
48   Matrix<fvar<fvar<double> >, Dynamic, 1> mu(5, 1);
49   mu.setZero();
50 
51   Matrix<fvar<fvar<double> >, Dynamic, Dynamic> y(3, 5);
52   y << 2.0, -2.0, 11.0, 4.0, -2.0, 11.0, 2.0, -5.0, 11.0, 0.0, -2.0, 11.0, 2.0,
53       -2.0, -11.0;
54 
55   Matrix<fvar<fvar<double> >, Dynamic, Dynamic> Sigma(5, 5);
56   Sigma << 9.0, -3.0, 0.0, 0.0, 0.0, -3.0, 4.0, 0.0, 0.0, 0.0, 0.0, 0.0, 5.0,
57       1.0, 0.0, 0.0, 0.0, 1.0, 10.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.0;
58 
59   Matrix<fvar<fvar<double> >, Dynamic, 1> w(3, 1);
60   w << 1.0, 0.5, 1.5;
61 
62   for (int i = 0; i < 5; i++) {
63     mu(i).d_.val_ = 1.0;
64     if (i < 3)
65       w(i).d_.val_ = 1.0;
66     for (int j = 0; j < 5; j++) {
67       Sigma(i, j).d_.val_ = 1.0;
68       if (i < 3)
69         y(i, j).d_.val_ = 1.0;
70     }
71   }
72 
73   fvar<fvar<double> > lp_ref(0);
74   for (size_t i = 0; i < 3; i++) {
75     Matrix<fvar<fvar<double> >, Dynamic, 1> cy(y.row(i).transpose());
76     Matrix<fvar<fvar<double> >, Dynamic, Dynamic> cSigma((1.0 / w[i]) * Sigma);
77     lp_ref += stan::math::multi_normal_log(cy, mu, cSigma);
78   }
79 
80   EXPECT_FLOAT_EQ(lp_ref.val_.val_,
81                   stan::math::multi_gp_log(y, Sigma, w).val_.val_);
82   EXPECT_FLOAT_EQ(-74.572952, stan::math::multi_gp_log(y, Sigma, w).d_.val_);
83 }
84