26 const std::vector<std::size_t>& degrees,
28 double dense_frontier_fraction = 0.08,
29 std::size_t high_degree_threshold = 64) {
32 decision.
frontier_edges = std::accumulate(degrees.begin(), degrees.end(), std::size_t{0});
35 :
static_cast<double>(decision.
frontier_edges) /
static_cast<double>(degrees.size());
37 if (workers == 0) workers = 1;
38 const auto high_degree =
static_cast<std::size_t
>(std::count_if(
39 degrees.begin(), degrees.end(), [high_degree_threshold](std::size_t degree) {
40 return degree >= high_degree_threshold;
42 const double high_degree_fraction = degrees.empty()
44 :
static_cast<double>(high_degree) /
static_cast<double>(degrees.size());
46 if (decision.
average_degree >=
static_cast<double>(high_degree_threshold) ||
47 high_degree_fraction >= dense_frontier_fraction) {
49 }
else if (decision.
average_degree >=
static_cast<double>(high_degree_threshold) * 0.25) {
58 const std::size_t target_chunks = workers * 8;
59 decision.
recommended_grain = std::max<std::size_t>(1, (work + target_chunks - 1) / target_chunks);