#include <algorithm>
+#include <cmath>
#include <functional>
#include <iterator>
#include <numeric>
if (argc < 2 || !(std::istringstream(argv[1]) >> real_load))
throw std::invalid_argument("bad or missing initial load parameter");
+ double iload = std::trunc(real_load);
+ if (opt::integer_transfer && real_load != iload) {
+ XBT_WARN("Initial load %g is not an integer. Truncate it.",
+ real_load);
+ real_load = iload;
+ }
+
neigh.assign(argv + 2, argv + argc);
pneigh.reserve(neigh.size());
double process::compute_load_to_send(double desired)
{
+ if (opt::integer_transfer)
+ desired = std::floor(desired);
return desired >= opt::min_transfer_amount ? desired : 0.0;
}
{
double load_to_send;
if (opt::bookkeeping) {
- load_to_send = compute_load_to_send(std::min(real_load, nb.get_debt()));
- if (load_to_send > 0.0)
- nb.set_debt(nb.get_debt() - load_to_send);
+ double excess_load = real_load - expected_load;
+ if (excess_load > 0.0) {
+ load_to_send = compute_load_to_send(std::min(excess_load,
+ nb.get_debt()));
+ if (load_to_send > 0.0)
+ nb.set_debt(nb.get_debt() - load_to_send);
+ } else
+ load_to_send = 0.0;
} else {
load_to_send = compute_load_to_send(nb.get_to_send());
if (load_to_send > 0.0)