X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/loba.git/blobdiff_plain/5d1712c42d9e55e896c0a7d2acec2fde03bfc3d7..03a16acd38dfaa266986de5d73f4a90c0ddbfeb1:/deployment.cpp?ds=inline diff --git a/deployment.cpp b/deployment.cpp index 8f52806..2befb00 100644 --- a/deployment.cpp +++ b/deployment.cpp @@ -63,8 +63,35 @@ void deployment_generator::distribute_load() std::accumulate(loads.begin(), loads.end(), 0.0); std::transform(loads.begin(), loads.end(), loads.begin(), std::bind(std::multiplies(), _1, factor)); - for (unsigned i = 0 ; i < hosts.size() ; ++i) - set_load(i, loads[i]); + if (opt::integer_transfer) { + // round the loads + std::vector iloads(hosts.size()); + std::transform(loads.begin(), loads.end(), iloads.begin(), round); + // compute the differences between each load and its rounded value + std::vector diffs(hosts.size()); + std::transform(loads.begin(), loads.end(), iloads.begin(), + diffs.begin(), std::minus()); + // compute the absolute values of the diffs + std::vector adiffs(hosts.size()); + std::transform(diffs.begin(), diffs.end(), adiffs.begin(), fabs); + // find i, index of the element farthest from its rounded value + unsigned i; + i = std::max_element(adiffs.begin(), adiffs.end()) - adiffs.begin(); + // remove element i from diffs, and compute the residual part... + diffs[i] = diffs.back(); + diffs.pop_back(); + double residue = std::accumulate(diffs.begin(), diffs.end(), 0.0); + // ... and compute element i (rounded to avoid numerical errors) + iloads[i] = fabs(round(loads[i] + residue)); + // final sanity check + xbt_assert(opt::auto_depl::load == + std::accumulate(iloads.begin(), iloads.end(), 0.0)); + for (unsigned i = 0 ; i < hosts.size() ; ++i) + set_load(i, iloads[i]); + } else { + for (unsigned i = 0 ; i < hosts.size() ; ++i) + set_load(i, loads[i]); + } } void deployment_generator::deploy()