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