23 using P = std::pair<size_t, size_t>;
30 std::vector<std::size_t>
lpt(std::size_t nbag, std::vector<std::size_t>& pieces,
double* bal) {
35 for (
size_t i = 0;
i < pieces.size(); ++
i) {
36 pvec.push_back(
P(
i, pieces[
i]));
39 auto P_comp = [](
const P& a,
const P& b) {
return a.second > b.second; };
41 std::sort(pvec.begin(), pvec.end(), P_comp);
43 std::vector<std::size_t> bagindices(pieces.size());
45 std::priority_queue<P, std::vector<P>, decltype(P_comp)> bagq(P_comp);
46 for (
size_t i = 0;
i < nbag; ++
i) {
50 for (
const auto&
p: pvec) {
51 P bagqitem = bagq.top();
53 bagindices[
p.first] = bagqitem.first;
54 bagqitem.second +=
p.second;
59 std::vector<size_t>
v(bagq.size());
60 for (
size_t i = 1;
i < nbag; ++
i) {
61 v[
i] = bagq.top().second;
68 printf(
"load balance = %g for %ld pieces in %ld bags\n", b, pieces.size(), nbag);
76 std::size_t sum = std::accumulate(
v.begin(),
v.end(), 0);
77 std::size_t max = *std::max_element(
v.begin(),
v.end());
78 return (
double(sum) /
v.size()) / max;
double load_balance(std::vector< size_t > &v)
std::pair< size_t, size_t > P
std::vector< std::size_t > lpt(std::size_t nbag, std::vector< std::size_t > &pieces, double *bal)
#define nrn_assert(x)
assert()-like macro, independent of NDEBUG status