CLUEstering
High-performance density-based weighted clustering library developed at CERN
Loading...
Searching...
No Matches
validation.hpp
1
2#pragma once
3
4#include <algorithm>
5#include <ranges>
6#include <span>
7#include <vector>
8
9namespace clue {
10
11 inline int compute_nclusters(std::span<const int> cluster_ids) {
12 return *std::ranges::max_element(cluster_ids) + 1;
13 }
14
15 inline std::vector<std::vector<int>> compute_clusters_points(std::span<const int> cluster_ids) {
16 const auto nclusters = compute_nclusters(cluster_ids);
17 std::vector<std::vector<int>> clusters_points(nclusters);
18
19 std::for_each(cluster_ids.begin(), cluster_ids.end(), [&, i = 0](auto cluster_id) mutable {
20 if (cluster_id > -1)
21 clusters_points[cluster_id].push_back(i++);
22 });
23
24 return clusters_points;
25 }
26
27 inline std::vector<int> compute_clusters_size(std::span<const int> cluster_ids) {
28 const auto nclusters = compute_nclusters(cluster_ids);
29 const auto clusters_points = compute_clusters_points(cluster_ids);
30
31 std::vector<int> clusters(nclusters);
32 std::ranges::transform(
33 clusters_points, clusters.begin(), [&](const auto& cluster) { return cluster.size(); });
34 return clusters;
35 }
36
37 inline bool validate_results(std::span<const int> cluster_ids, std::span<const int> truth) {
38 auto result_clusters_sizes = compute_clusters_size(cluster_ids);
39 auto truth_clusters_sizes = compute_clusters_size(truth);
40 std::ranges::sort(result_clusters_sizes);
41 std::ranges::sort(truth_clusters_sizes);
42
43 bool compare_nclusters = compute_nclusters(cluster_ids) == compute_nclusters(truth);
44 bool compare_clusters_size = std::ranges::equal(result_clusters_sizes, truth_clusters_sizes);
45
46 return compare_nclusters && compare_clusters_size;
47 }
48
49} // namespace clue