15 #include <gmock/gmock.h>
16 #include <gtest/gtest.h>
25 #include <range/v3/range/conversion.hpp>
26 #include <range/v3/view/generate.hpp>
27 #include <range/v3/view/take_exactly.hpp>
39 const Eigen::Matrix3d covariance = Eigen::Vector3d::Ones().asDiagonal();
41 auto other_distribution = distribution;
42 ASSERT_EQ(distribution, other_distribution);
43 auto generator = std::mt19937{std::random_device()()};
44 auto other_generator = generator;
46 ASSERT_EQ(distribution(generator), other_distribution(other_generator));
47 ASSERT_EQ(distribution(generator), other_distribution(other_generator));
51 const Eigen::Matrix3d covariance = Eigen::Matrix3d::Ones();
56 auto covariance = testing::as<Eigen::Matrix3d>({{1.0, 2.0, 0.0}, {1.0, 1.0, 0.0}, {0.0, 0.0, 1.0}});
62 auto generator = std::mt19937{std::random_device()()};
67 class MultivariateNormalDistributionWithParam
68 :
public ::testing::TestWithParam<std::pair<Eigen::Vector2d, Eigen::Matrix2d>> {};
70 TEST_P(MultivariateNormalDistributionWithParam, DistributionCovarianceAndMean) {
72 const Eigen::Vector2d& expected_mean = std::get<0>(GetParam());
73 const Eigen::Matrix2d& expected_covariance = std::get<1>(GetParam());
75 const auto sequence = ranges::views::generate([&]() {
76 static auto generator = std::mt19937{std::random_device()()};
77 return distribution(generator);
79 ranges::views::take_exactly(1
'000'000) | ranges::to<std::vector>;
81 const auto sum = std::accumulate(sequence.begin(), sequence.end(), Eigen::Vector2d{0, 0});
82 const auto mean = Eigen::Vector2d{sum / sequence.size()};
83 ASSERT_NEAR(mean(0), expected_mean(0),
kTolerance);
84 ASSERT_NEAR(mean(1), expected_mean(1),
kTolerance);
86 ASSERT_NEAR(covariance(0, 0), expected_covariance(0, 0),
kTolerance);
87 ASSERT_NEAR(covariance(0, 1), expected_covariance(0, 1),
kTolerance);
88 ASSERT_NEAR(covariance(1, 0), expected_covariance(1, 0),
kTolerance);
89 ASSERT_NEAR(covariance(1, 1), expected_covariance(1, 1),
kTolerance);
92 INSTANTIATE_TEST_SUITE_P(
94 MultivariateNormalDistributionWithParam,
96 std::make_pair(Eigen::Vector2d{1.0, 2.0}, testing::as<Eigen::Matrix2d>({{0.0, 0.0}, {0.0, 0.0}})),
97 std::make_pair(Eigen::Vector2d{3.0, 4.0}, testing::as<Eigen::Matrix2d>({{1.0, 0.0}, {0.0, 1.0}})),
98 std::make_pair(Eigen::Vector2d{3.0, 4.0}, testing::as<Eigen::Matrix2d>({{1.5, -0.3}, {-0.3, 1.5}})),
99 std::make_pair(Eigen::Vector2d{5.0, 6.0}, testing::as<Eigen::Matrix2d>({{2.0, 0.7}, {0.7, 2.0}}))));
103 auto generator = std::mt19937{std::random_device()()};
104 auto expected_mean = Eigen::RowVector2d{1.0, 2.0};
106 auto mean = distribution(generator);
107 ASSERT_NEAR(mean(0), expected_mean(0),
kTolerance);
108 ASSERT_NEAR(mean(1), expected_mean(1),
kTolerance);
113 auto generator = std::mt19937{std::random_device()()};
116 auto mean = distribution(generator);
117 ASSERT_NEAR((mean).log(), expected_mean.log(),
kTolerance);
122 auto generator = std::mt19937{std::random_device()()};
125 auto mean = distribution(generator);
126 ASSERT_NEAR(mean.so2().log(), expected_mean.so2().log(),
kTolerance);
127 ASSERT_NEAR(mean.translation()(0), expected_mean.translation()(0),
kTolerance);
128 ASSERT_NEAR(mean.translation()(1), expected_mean.translation()(1),
kTolerance);
132 auto generator = std::mt19937{std::random_device()()};
135 auto mean = distribution(generator);
136 ASSERT_NEAR(mean.log()(0), expected_mean.log()(0), 0.001);
137 ASSERT_NEAR(mean.log()(1), expected_mean.log()(1), 0.001);
138 ASSERT_NEAR(mean.log()(2), expected_mean.log()(2), 0.001);
142 auto generator = std::mt19937{std::random_device()()};
145 auto mean = distribution(generator);
146 ASSERT_NEAR(mean.log()(0), expected_mean.log()(0), 0.001);
147 ASSERT_NEAR(mean.log()(1), expected_mean.log()(1), 0.001);
148 ASSERT_NEAR(mean.log()(2), expected_mean.log()(2), 0.001);
149 ASSERT_NEAR(mean.translation()(0), expected_mean.translation()(0), 0.001);
150 ASSERT_NEAR(mean.translation()(1), expected_mean.translation()(1), 0.001);
151 ASSERT_NEAR(mean.translation()(2), expected_mean.translation()(2), 0.001);