blob: ecdb7d2a274bbab9b8514133159276d59362ab5a [file] [log] [blame]
Clement Courbet96715412018-05-07 09:09:48 +00001//===-- ClusteringTest.cpp --------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Clustering.h"
11#include "BenchmarkResult.h"
12#include "llvm/Support/Error.h"
13#include "llvm/Support/raw_ostream.h"
14#include "gmock/gmock.h"
15#include "gtest/gtest.h"
16
17namespace exegesis {
18
19namespace {
20
21using testing::Field;
22using testing::UnorderedElementsAre;
23using testing::UnorderedElementsAreArray;
24
25TEST(ClusteringTest, Clusters3D) {
26 std::vector<InstructionBenchmark> Points(6);
27
28 // Cluster around (x=0, y=1, z=2): points {0, 3}.
29 Points[0].Measurements = {{"x", 0.01, ""}, {"y", 1.02, ""}, {"z", 1.98, "A"}};
30 Points[3].Measurements = {{"x", -0.01, ""}, {"y", 1.02, ""}, {"z", 1.98, ""}};
31 // Cluster around (x=1, y=1, z=2): points {1, 4}.
32 Points[1].Measurements = {{"x", 1.01, ""}, {"y", 1.02, ""}, {"z", 1.98, ""}};
33 Points[4].Measurements = {{"x", 0.99, ""}, {"y", 1.02, ""}, {"z", 1.98, ""}};
34 // Cluster around (x=0, y=0, z=0): points {5}, marked as noise.
35 Points[5].Measurements = {{"x", 0.0, ""}, {"y", 0.01, ""}, {"z", -0.02, ""}};
36 // Error cluster: points {2}
37 Points[2].Error = "oops";
38
39 auto HasPoints = [](const std::vector<int> &Indices) {
40 return Field(&InstructionBenchmarkClustering::Cluster::PointIndices,
41 UnorderedElementsAreArray(Indices));
42 };
43
44 auto Clustering = InstructionBenchmarkClustering::create(Points, 2, 0.25);
45 ASSERT_TRUE((bool)Clustering);
46 EXPECT_THAT(Clustering.get().getValidClusters(),
47 UnorderedElementsAre(HasPoints({0, 3}), HasPoints({1, 4})));
48 EXPECT_THAT(Clustering.get().getCluster(
49 InstructionBenchmarkClustering::ClusterId::noise()),
50 HasPoints({5}));
51 EXPECT_THAT(Clustering.get().getCluster(
52 InstructionBenchmarkClustering::ClusterId::error()),
53 HasPoints({2}));
54
55 EXPECT_EQ(Clustering.get().getClusterIdForPoint(2),
56 InstructionBenchmarkClustering::ClusterId::error());
57 EXPECT_EQ(Clustering.get().getClusterIdForPoint(5),
58 InstructionBenchmarkClustering::ClusterId::noise());
59 EXPECT_EQ(Clustering.get().getClusterIdForPoint(0),
60 Clustering.get().getClusterIdForPoint(3));
61 EXPECT_EQ(Clustering.get().getClusterIdForPoint(1),
62 Clustering.get().getClusterIdForPoint(4));
63}
64
65TEST(ClusteringTest, Clusters3D_InvalidSize) {
66 std::vector<InstructionBenchmark> Points(6);
67 Points[0].Measurements = {{"x", 0.01, ""}, {"y", 1.02, ""}, {"z", 1.98, ""}};
68 Points[1].Measurements = {{"y", 1.02, ""}, {"z", 1.98, ""}};
69 auto Error =
70 InstructionBenchmarkClustering::create(Points, 2, 0.25).takeError();
71 ASSERT_TRUE((bool)Error);
72 consumeError(std::move(Error));
73}
74
75TEST(ClusteringTest, Clusters3D_InvalidOrder) {
76 std::vector<InstructionBenchmark> Points(6);
77 Points[0].Measurements = {{"x", 0.01, ""}, {"y", 1.02, ""}};
78 Points[1].Measurements = {{"y", 1.02, ""}, {"x", 1.98, ""}};
79 auto Error =
80 InstructionBenchmarkClustering::create(Points, 2, 0.25).takeError();
81 ASSERT_TRUE((bool)Error);
82 consumeError(std::move(Error));
83}
84
Clement Courbet17d3c252018-05-22 13:31:29 +000085TEST(ClusteringTest, Ordering) {
86 ASSERT_LT(InstructionBenchmarkClustering::ClusterId::makeValid(1),
87 InstructionBenchmarkClustering::ClusterId::makeValid(2));
88
89 ASSERT_LT(InstructionBenchmarkClustering::ClusterId::makeValid(2),
90 InstructionBenchmarkClustering::ClusterId::noise());
91
92 ASSERT_LT(InstructionBenchmarkClustering::ClusterId::makeValid(2),
93 InstructionBenchmarkClustering::ClusterId::error());
94
95 ASSERT_LT(InstructionBenchmarkClustering::ClusterId::noise(),
96 InstructionBenchmarkClustering::ClusterId::error());
97}
98
Clement Courbet96715412018-05-07 09:09:48 +000099} // namespace
100} // namespace exegesis