brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.9 KiB · f914800 Raw
150 lines · cpp
1//===-- ClusteringTest.cpp --------------------------------------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "Clustering.h"10#include "BenchmarkResult.h"11#include "llvm/Support/Error.h"12#include "llvm/Support/raw_ostream.h"13#include "gmock/gmock.h"14#include "gtest/gtest.h"15 16namespace llvm {17namespace exegesis {18 19namespace {20 21using testing::Field;22using testing::UnorderedElementsAre;23using testing::UnorderedElementsAreArray;24 25static const auto HasPoints = [](const std::vector<int> &Indices) {26  return Field(&BenchmarkClustering::Cluster::PointIndices,27                 UnorderedElementsAreArray(Indices));28};29 30TEST(ClusteringTest, Clusters3D) {31  std::vector<Benchmark> Points(6);32 33  // Cluster around (x=0, y=1, z=2): points {0, 3}.34  Points[0].Measurements = {BenchmarkMeasure::Create("x", 0.01, {}),35                            BenchmarkMeasure::Create("y", 1.02, {}),36                            BenchmarkMeasure::Create("z", 1.98, {})};37  Points[3].Measurements = {BenchmarkMeasure::Create("x", -0.01, {}),38                            BenchmarkMeasure::Create("y", 1.02, {}),39                            BenchmarkMeasure::Create("z", 1.98, {})};40  // Cluster around (x=1, y=1, z=2): points {1, 4}.41  Points[1].Measurements = {BenchmarkMeasure::Create("x", 1.01, {}),42                            BenchmarkMeasure::Create("y", 1.02, {}),43                            BenchmarkMeasure::Create("z", 1.98, {})};44  Points[4].Measurements = {BenchmarkMeasure::Create("x", 0.99, {}),45                            BenchmarkMeasure::Create("y", 1.02, {}),46                            BenchmarkMeasure::Create("z", 1.98, {})};47  // Cluster around (x=0, y=0, z=0): points {5}, marked as noise.48  Points[5].Measurements = {BenchmarkMeasure::Create("x", 0.0, {}),49                            BenchmarkMeasure::Create("y", 0.01, {}),50                            BenchmarkMeasure::Create("z", -0.02, {})};51  // Error cluster: points {2}52  Points[2].Error = "oops";53 54  auto Clustering = BenchmarkClustering::create(55      Points, BenchmarkClustering::ModeE::Dbscan, 2, 0.25);56  ASSERT_TRUE((bool)Clustering);57  EXPECT_THAT(Clustering.get().getValidClusters(),58              UnorderedElementsAre(HasPoints({0, 3}), HasPoints({1, 4})));59  EXPECT_THAT(Clustering.get().getCluster(60                  BenchmarkClustering::ClusterId::noise()),61              HasPoints({5}));62  EXPECT_THAT(Clustering.get().getCluster(63                  BenchmarkClustering::ClusterId::error()),64              HasPoints({2}));65 66  EXPECT_EQ(Clustering.get().getClusterIdForPoint(2),67            BenchmarkClustering::ClusterId::error());68  EXPECT_EQ(Clustering.get().getClusterIdForPoint(5),69            BenchmarkClustering::ClusterId::noise());70  EXPECT_EQ(Clustering.get().getClusterIdForPoint(0),71            Clustering.get().getClusterIdForPoint(3));72  EXPECT_EQ(Clustering.get().getClusterIdForPoint(1),73            Clustering.get().getClusterIdForPoint(4));74}75 76TEST(ClusteringTest, Clusters3D_InvalidSize) {77  std::vector<Benchmark> Points(6);78  Points[0].Measurements = {BenchmarkMeasure::Create("x", 0.01, {}),79                            BenchmarkMeasure::Create("y", 1.02, {}),80                            BenchmarkMeasure::Create("z", 1.98, {})};81  Points[1].Measurements = {BenchmarkMeasure::Create("y", 1.02, {}),82                            BenchmarkMeasure::Create("z", 1.98, {})};83  auto Error =84      BenchmarkClustering::create(85          Points, BenchmarkClustering::ModeE::Dbscan, 2, 0.25)86          .takeError();87  ASSERT_TRUE((bool)Error);88  consumeError(std::move(Error));89}90 91TEST(ClusteringTest, Clusters3D_InvalidOrder) {92  std::vector<Benchmark> Points(6);93  Points[0].Measurements = {BenchmarkMeasure::Create("x", 0.01, {}),94                            BenchmarkMeasure::Create("y", 1.02, {})};95  Points[1].Measurements = {BenchmarkMeasure::Create("y", 1.02, {}),96                            BenchmarkMeasure::Create("x", 1.98, {})};97  auto Error =98      BenchmarkClustering::create(99          Points, BenchmarkClustering::ModeE::Dbscan, 2, 0.25)100          .takeError();101  ASSERT_TRUE((bool)Error);102  consumeError(std::move(Error));103}104 105TEST(ClusteringTest, Ordering) {106  ASSERT_LT(BenchmarkClustering::ClusterId::makeValid(1),107            BenchmarkClustering::ClusterId::makeValid(2));108 109  ASSERT_LT(BenchmarkClustering::ClusterId::makeValid(2),110            BenchmarkClustering::ClusterId::noise());111 112  ASSERT_LT(BenchmarkClustering::ClusterId::makeValid(2),113            BenchmarkClustering::ClusterId::error());114 115  ASSERT_LT(BenchmarkClustering::ClusterId::noise(),116            BenchmarkClustering::ClusterId::error());117}118 119TEST(ClusteringTest, Ordering1) {120  std::vector<Benchmark> Points(3);121 122  Points[0].Measurements = {BenchmarkMeasure::Create("x", 0.0, {})};123  Points[1].Measurements = {BenchmarkMeasure::Create("x", 1.0, {})};124  Points[2].Measurements = {BenchmarkMeasure::Create("x", 2.0, {})};125 126  auto Clustering = BenchmarkClustering::create(127      Points, BenchmarkClustering::ModeE::Dbscan, 2, 1.1);128  ASSERT_TRUE((bool)Clustering);129  EXPECT_THAT(Clustering.get().getValidClusters(),130              UnorderedElementsAre(HasPoints({0, 1, 2})));131}132 133TEST(ClusteringTest, Ordering2) {134  std::vector<Benchmark> Points(3);135 136  Points[0].Measurements = {BenchmarkMeasure::Create("x", 0.0, {})};137  Points[1].Measurements = {BenchmarkMeasure::Create("x", 2.0, {})};138  Points[2].Measurements = {BenchmarkMeasure::Create("x", 1.0, {})};139 140  auto Clustering = BenchmarkClustering::create(141      Points, BenchmarkClustering::ModeE::Dbscan, 2, 1.1);142  ASSERT_TRUE((bool)Clustering);143  EXPECT_THAT(Clustering.get().getValidClusters(),144              UnorderedElementsAre(HasPoints({0, 1, 2})));145}146 147} // namespace148} // namespace exegesis149} // namespace llvm150