xref: /llvm-project/llvm/unittests/tools/llvm-exegesis/ClusteringTest.cpp (revision c1a155bf785152abc72b77608261a3d0e6c776a6)
196715414SClement Courbet //===-- ClusteringTest.cpp --------------------------------------*- C++ -*-===//
296715414SClement Courbet //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
696715414SClement Courbet //
796715414SClement Courbet //===----------------------------------------------------------------------===//
896715414SClement Courbet 
996715414SClement Courbet #include "Clustering.h"
1096715414SClement Courbet #include "BenchmarkResult.h"
1196715414SClement Courbet #include "llvm/Support/Error.h"
1296715414SClement Courbet #include "llvm/Support/raw_ostream.h"
1396715414SClement Courbet #include "gmock/gmock.h"
1496715414SClement Courbet #include "gtest/gtest.h"
1596715414SClement Courbet 
1632401afdSFangrui Song namespace llvm {
1796715414SClement Courbet namespace exegesis {
1896715414SClement Courbet 
1996715414SClement Courbet namespace {
2096715414SClement Courbet 
2196715414SClement Courbet using testing::Field;
2296715414SClement Courbet using testing::UnorderedElementsAre;
2396715414SClement Courbet using testing::UnorderedElementsAreArray;
2496715414SClement Courbet 
__anon7ae965d30202(const std::vector<int> &Indices) 25c08b26edSClement Courbet static const auto HasPoints = [](const std::vector<int> &Indices) {
26389bf5d8SAiden Grossman   return Field(&BenchmarkClustering::Cluster::PointIndices,
2728550779SClement Courbet                  UnorderedElementsAreArray(Indices));
2828550779SClement Courbet };
2928550779SClement Courbet 
TEST(ClusteringTest,Clusters3D)3096715414SClement Courbet TEST(ClusteringTest, Clusters3D) {
31389bf5d8SAiden Grossman   std::vector<Benchmark> Points(6);
3296715414SClement Courbet 
3396715414SClement Courbet   // Cluster around (x=0, y=1, z=2): points {0, 3}.
34*c1a155bfSAiden Grossman   Points[0].Measurements = {BenchmarkMeasure::Create("x", 0.01, {}),
35*c1a155bfSAiden Grossman                             BenchmarkMeasure::Create("y", 1.02, {}),
36*c1a155bfSAiden Grossman                             BenchmarkMeasure::Create("z", 1.98, {})};
37*c1a155bfSAiden Grossman   Points[3].Measurements = {BenchmarkMeasure::Create("x", -0.01, {}),
38*c1a155bfSAiden Grossman                             BenchmarkMeasure::Create("y", 1.02, {}),
39*c1a155bfSAiden Grossman                             BenchmarkMeasure::Create("z", 1.98, {})};
4096715414SClement Courbet   // Cluster around (x=1, y=1, z=2): points {1, 4}.
41*c1a155bfSAiden Grossman   Points[1].Measurements = {BenchmarkMeasure::Create("x", 1.01, {}),
42*c1a155bfSAiden Grossman                             BenchmarkMeasure::Create("y", 1.02, {}),
43*c1a155bfSAiden Grossman                             BenchmarkMeasure::Create("z", 1.98, {})};
44*c1a155bfSAiden Grossman   Points[4].Measurements = {BenchmarkMeasure::Create("x", 0.99, {}),
45*c1a155bfSAiden Grossman                             BenchmarkMeasure::Create("y", 1.02, {}),
46*c1a155bfSAiden Grossman                             BenchmarkMeasure::Create("z", 1.98, {})};
4796715414SClement Courbet   // Cluster around (x=0, y=0, z=0): points {5}, marked as noise.
48*c1a155bfSAiden Grossman   Points[5].Measurements = {BenchmarkMeasure::Create("x", 0.0, {}),
49*c1a155bfSAiden Grossman                             BenchmarkMeasure::Create("y", 0.01, {}),
50*c1a155bfSAiden Grossman                             BenchmarkMeasure::Create("z", -0.02, {})};
5196715414SClement Courbet   // Error cluster: points {2}
5296715414SClement Courbet   Points[2].Error = "oops";
5396715414SClement Courbet 
54389bf5d8SAiden Grossman   auto Clustering = BenchmarkClustering::create(
55389bf5d8SAiden Grossman       Points, BenchmarkClustering::ModeE::Dbscan, 2, 0.25);
5696715414SClement Courbet   ASSERT_TRUE((bool)Clustering);
5796715414SClement Courbet   EXPECT_THAT(Clustering.get().getValidClusters(),
5896715414SClement Courbet               UnorderedElementsAre(HasPoints({0, 3}), HasPoints({1, 4})));
5996715414SClement Courbet   EXPECT_THAT(Clustering.get().getCluster(
60389bf5d8SAiden Grossman                   BenchmarkClustering::ClusterId::noise()),
6196715414SClement Courbet               HasPoints({5}));
6296715414SClement Courbet   EXPECT_THAT(Clustering.get().getCluster(
63389bf5d8SAiden Grossman                   BenchmarkClustering::ClusterId::error()),
6496715414SClement Courbet               HasPoints({2}));
6596715414SClement Courbet 
6696715414SClement Courbet   EXPECT_EQ(Clustering.get().getClusterIdForPoint(2),
67389bf5d8SAiden Grossman             BenchmarkClustering::ClusterId::error());
6896715414SClement Courbet   EXPECT_EQ(Clustering.get().getClusterIdForPoint(5),
69389bf5d8SAiden Grossman             BenchmarkClustering::ClusterId::noise());
7096715414SClement Courbet   EXPECT_EQ(Clustering.get().getClusterIdForPoint(0),
7196715414SClement Courbet             Clustering.get().getClusterIdForPoint(3));
7296715414SClement Courbet   EXPECT_EQ(Clustering.get().getClusterIdForPoint(1),
7396715414SClement Courbet             Clustering.get().getClusterIdForPoint(4));
7496715414SClement Courbet }
7596715414SClement Courbet 
TEST(ClusteringTest,Clusters3D_InvalidSize)7696715414SClement Courbet TEST(ClusteringTest, Clusters3D_InvalidSize) {
77389bf5d8SAiden Grossman   std::vector<Benchmark> Points(6);
78*c1a155bfSAiden Grossman   Points[0].Measurements = {BenchmarkMeasure::Create("x", 0.01, {}),
79*c1a155bfSAiden Grossman                             BenchmarkMeasure::Create("y", 1.02, {}),
80*c1a155bfSAiden Grossman                             BenchmarkMeasure::Create("z", 1.98, {})};
81*c1a155bfSAiden Grossman   Points[1].Measurements = {BenchmarkMeasure::Create("y", 1.02, {}),
82*c1a155bfSAiden Grossman                             BenchmarkMeasure::Create("z", 1.98, {})};
8396715414SClement Courbet   auto Error =
84389bf5d8SAiden Grossman       BenchmarkClustering::create(
85389bf5d8SAiden Grossman           Points, BenchmarkClustering::ModeE::Dbscan, 2, 0.25)
86c2423fe6SRoman Lebedev           .takeError();
8796715414SClement Courbet   ASSERT_TRUE((bool)Error);
8896715414SClement Courbet   consumeError(std::move(Error));
8996715414SClement Courbet }
9096715414SClement Courbet 
TEST(ClusteringTest,Clusters3D_InvalidOrder)9196715414SClement Courbet TEST(ClusteringTest, Clusters3D_InvalidOrder) {
92389bf5d8SAiden Grossman   std::vector<Benchmark> Points(6);
93*c1a155bfSAiden Grossman   Points[0].Measurements = {BenchmarkMeasure::Create("x", 0.01, {}),
94*c1a155bfSAiden Grossman                             BenchmarkMeasure::Create("y", 1.02, {})};
95*c1a155bfSAiden Grossman   Points[1].Measurements = {BenchmarkMeasure::Create("y", 1.02, {}),
96*c1a155bfSAiden Grossman                             BenchmarkMeasure::Create("x", 1.98, {})};
9796715414SClement Courbet   auto Error =
98389bf5d8SAiden Grossman       BenchmarkClustering::create(
99389bf5d8SAiden Grossman           Points, BenchmarkClustering::ModeE::Dbscan, 2, 0.25)
100c2423fe6SRoman Lebedev           .takeError();
10196715414SClement Courbet   ASSERT_TRUE((bool)Error);
10296715414SClement Courbet   consumeError(std::move(Error));
10396715414SClement Courbet }
10496715414SClement Courbet 
TEST(ClusteringTest,Ordering)10517d3c257SClement Courbet TEST(ClusteringTest, Ordering) {
106389bf5d8SAiden Grossman   ASSERT_LT(BenchmarkClustering::ClusterId::makeValid(1),
107389bf5d8SAiden Grossman             BenchmarkClustering::ClusterId::makeValid(2));
10817d3c257SClement Courbet 
109389bf5d8SAiden Grossman   ASSERT_LT(BenchmarkClustering::ClusterId::makeValid(2),
110389bf5d8SAiden Grossman             BenchmarkClustering::ClusterId::noise());
11117d3c257SClement Courbet 
112389bf5d8SAiden Grossman   ASSERT_LT(BenchmarkClustering::ClusterId::makeValid(2),
113389bf5d8SAiden Grossman             BenchmarkClustering::ClusterId::error());
11417d3c257SClement Courbet 
115389bf5d8SAiden Grossman   ASSERT_LT(BenchmarkClustering::ClusterId::noise(),
116389bf5d8SAiden Grossman             BenchmarkClustering::ClusterId::error());
11717d3c257SClement Courbet }
11817d3c257SClement Courbet 
TEST(ClusteringTest,Ordering1)11928550779SClement Courbet TEST(ClusteringTest, Ordering1) {
120389bf5d8SAiden Grossman   std::vector<Benchmark> Points(3);
12128550779SClement Courbet 
122*c1a155bfSAiden Grossman   Points[0].Measurements = {BenchmarkMeasure::Create("x", 0.0, {})};
123*c1a155bfSAiden Grossman   Points[1].Measurements = {BenchmarkMeasure::Create("x", 1.0, {})};
124*c1a155bfSAiden Grossman   Points[2].Measurements = {BenchmarkMeasure::Create("x", 2.0, {})};
12528550779SClement Courbet 
126389bf5d8SAiden Grossman   auto Clustering = BenchmarkClustering::create(
127389bf5d8SAiden Grossman       Points, BenchmarkClustering::ModeE::Dbscan, 2, 1.1);
12828550779SClement Courbet   ASSERT_TRUE((bool)Clustering);
12928550779SClement Courbet   EXPECT_THAT(Clustering.get().getValidClusters(),
13028550779SClement Courbet               UnorderedElementsAre(HasPoints({0, 1, 2})));
13128550779SClement Courbet }
13228550779SClement Courbet 
TEST(ClusteringTest,Ordering2)13328550779SClement Courbet TEST(ClusteringTest, Ordering2) {
134389bf5d8SAiden Grossman   std::vector<Benchmark> Points(3);
13528550779SClement Courbet 
136*c1a155bfSAiden Grossman   Points[0].Measurements = {BenchmarkMeasure::Create("x", 0.0, {})};
137*c1a155bfSAiden Grossman   Points[1].Measurements = {BenchmarkMeasure::Create("x", 2.0, {})};
138*c1a155bfSAiden Grossman   Points[2].Measurements = {BenchmarkMeasure::Create("x", 1.0, {})};
13928550779SClement Courbet 
140389bf5d8SAiden Grossman   auto Clustering = BenchmarkClustering::create(
141389bf5d8SAiden Grossman       Points, BenchmarkClustering::ModeE::Dbscan, 2, 1.1);
14228550779SClement Courbet   ASSERT_TRUE((bool)Clustering);
14328550779SClement Courbet   EXPECT_THAT(Clustering.get().getValidClusters(),
14428550779SClement Courbet               UnorderedElementsAre(HasPoints({0, 1, 2})));
14528550779SClement Courbet }
14628550779SClement Courbet 
14796715414SClement Courbet } // namespace
14896715414SClement Courbet } // namespace exegesis
14932401afdSFangrui Song } // namespace llvm
150