Skip to content

Commit

Permalink
wff fire statistics
Browse files Browse the repository at this point in the history
  • Loading branch information
Dominik Rosch committed Dec 10, 2024
1 parent 11abf74 commit 2c00153
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 7 deletions.
40 changes: 33 additions & 7 deletions kaminpar-shm/coarsening/sparsification/WeightedForestFireScore.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ StaticArray<EdgeID> WeightedForestFireScore::scores(const CSRGraph &g) {
tbb::parallel_for(0ul, burnt.size(), [&](auto i) { burnt[i] = 0; });
EdgeID edges_burnt = 0;

tbb::concurrent_vector<EdgeID> numbers_of_edges_burnt;

int number_of_fires = 0;
tbb::parallel_for(0, tbb::this_task_arena::max_concurrency(), [&](auto) {
while (edges_burnt < _targetBurnRatio * g.m()) {
Expand Down Expand Up @@ -59,19 +61,43 @@ StaticArray<EdgeID> WeightedForestFireScore::scores(const CSRGraph &g) {
visited[x] = true;
}
}

__atomic_add_fetch(&edges_burnt, localEdgesBurnt, __ATOMIC_RELAXED);
numbers_of_edges_burnt.push_back(localEdgesBurnt);
}
});
printf(
" **[ %d fires have burned %d edges with the target being %f ]** \n",
number_of_fires,
edges_burnt,
_targetBurnRatio * g.m()
);

print_fire_statistics(g, edges_burnt, number_of_fires, numbers_of_edges_burnt);

// Not normalized unlike in the NetworKit implementation
return burnt;
}

void WeightedForestFireScore::print_fire_statistics(
const CSRGraph &g,
EdgeID edges_burnt,
int number_of_fires,
tbb::concurrent_vector<EdgeID> numbers_of_edges_burnt
) {
const auto default_precision{std::cout.precision()};
std::cout << std::setprecision(4);

double average = static_cast<double>(edges_burnt) / number_of_fires;
double variance = 0;
for (auto x : numbers_of_edges_burnt) {
double local_burnt = static_cast<double>(x);
variance += (local_burnt - average) * (local_burnt - average) / (number_of_fires - 1);
}

std::cout << "** targetBurntRatio=" << _targetBurnRatio << ", pf=" << _pf << "\n";
std::cout << "** m=" << g.m() << ", n=" << g.n() << "\n";
std::cout << "** " << number_of_fires << " fires have burned " << edges_burnt << " edges\n";
std::cout << "** edges burnt per fire: avg=" << average << ", var=" << variance << " min="
<< *std::min_element(numbers_of_edges_burnt.begin(), numbers_of_edges_burnt.end())
<< ", max="
<< *std::max_element(numbers_of_edges_burnt.begin(), numbers_of_edges_burnt.end())
<< "\n";

std::cout << std::setprecision(default_precision);
}

} // namespace kaminpar::shm::sparsification
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
#pragma once
#include <oneapi/tbb/concurrent_vector.h>

#include "ScoreBacedSampler.h"

namespace kaminpar::shm::sparsification {
Expand All @@ -12,5 +14,12 @@ class WeightedForestFireScore : public ScoreFunction<EdgeID> {
private:
double _pf;
double _targetBurnRatio;

void print_fire_statistics(
const CSRGraph &g,
EdgeID edges_burnt,
int number_of_fires,
tbb::concurrent_vector<EdgeID> numbers_of_edges_burnt
);
};
} // namespace kaminpar::shm::sparsification

0 comments on commit 2c00153

Please sign in to comment.