X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/loba.git/blobdiff_plain/15ace044d0d9e82ef744e22cf84168771e669678..03a16acd38dfaa266986de5d73f4a90c0ddbfeb1:/deployment.cpp?ds=sidebyside diff --git a/deployment.cpp b/deployment.cpp index 705c1ea..2befb00 100644 --- a/deployment.cpp +++ b/deployment.cpp @@ -1,6 +1,6 @@ #include #include -#include +#include #include #include #include @@ -50,8 +50,7 @@ void deployment_generator::set_link(int host1, int host2) void deployment_generator::distribute_load() { - using std::tr1::bind; - using std::tr1::placeholders::_1; + using std::placeholders::_1; if (!opt::auto_depl::random_distribution) { set_load(0, opt::auto_depl::load); @@ -63,9 +62,36 @@ void deployment_generator::distribute_load() double factor = opt::auto_depl::load / std::accumulate(loads.begin(), loads.end(), 0.0); std::transform(loads.begin(), loads.end(), loads.begin(), - bind(std::multiplies(), _1, factor)); - for (unsigned i = 0 ; i < hosts.size() ; ++i) - set_load(i, loads[i]); + std::bind(std::multiplies(), _1, factor)); + 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()