11 inline int compute_nclusters(std::span<const int> cluster_ids) {
12 return *std::ranges::max_element(cluster_ids) + 1;
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);
19 std::for_each(cluster_ids.begin(), cluster_ids.end(), [&, i = 0](
auto cluster_id)
mutable {
21 clusters_points[cluster_id].push_back(i++);
24 return clusters_points;
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);
31 std::vector<int> clusters(nclusters);
32 std::ranges::transform(
33 clusters_points, clusters.begin(), [&](
const auto& cluster) { return cluster.size(); });
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);
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);
46 return compare_nclusters && compare_clusters_size;