From 11540e34f148fdfa113a77446445803a2a47641e Mon Sep 17 00:00:00 2001 From: Arnaud Giersch Date: Thu, 15 Sep 2011 18:09:55 +0200 Subject: [PATCH] Add option -E : egocentric mode. The changes introduced by commit f5336c506a2c288f6a4a9ed84ecb21b12a22a2dd ("Do not go below expected_load when bookkeeping.") are now only used when egocentric mode is turned on. The default behaviour is reverted to the previous one. --- options.cpp | 12 +++++++++++- options.h | 1 + process.cpp | 17 +++++++++-------- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/options.cpp b/options.cpp index 3ca93b7..b387267 100644 --- a/options.cpp +++ b/options.cpp @@ -59,6 +59,7 @@ namespace opt { // Load balancing algorithm std::string loba_algo("simple"); bool bookkeeping = false; + bool egocentric = false; double min_lb_iter_duration = 1.0; // fixme: find better defaults double min_transfer_amount = 0.0; double max_transfer_amount = 0.0; @@ -225,7 +226,7 @@ bool opt::parse_args(int* argc, char* argv[]) int c; opterr = 0; while ((c = getopt(*argc, argv, - "a:bc:C:d:D:ehi:I:l:L:m:M:N:r:Rs:S:t:T:vVx:Z")) != -1) { + "a:bc:C:d:D:eEhi:I:l:L:m:M:N:r:Rs:S:t:T:vVx:Z")) != -1) { switch (c) { case 'a': opt::loba_algo = optarg; @@ -264,6 +265,9 @@ bool opt::parse_args(int* argc, char* argv[]) case 'e': opt::exit_on_close = !opt::exit_on_close; break; + case 'E': + opt::egocentric = !opt::egocentric; + break; case 'h': opt::help_requested++; break; @@ -392,6 +396,7 @@ void opt::print() } DESCR("load balancing algorithm", "%s", loba_algo.c_str()); DESCR("bookkeeping", "%s", h.on_off(bookkeeping)); + DESCR("egocentric mode", "%s", h.on_off(egocentric)); DESCR("minimum duration between lb. iterations", "%g", min_lb_iter_duration); DESCR("computation cost factors", "[%s]", comp_cost.to_string().c_str()); @@ -479,6 +484,11 @@ void opt::usage() so_list(opt::loba_algorithms); std::clog << o("-b") << "toggle bookkeeping (\"virtual load\")" << " [" << opt_helper::on_off(opt::bookkeeping) << "]\n"; + std::clog << o("-E") << "toggle egocentric mode when bookkeeping" + << " [" << opt_helper::on_off(opt::egocentric) << "]\n"; + if (opt::help_requested > 1) + std::clog << o("") + << "(a not so good idea introduced by git commit f5336c5)\n"; std::clog << "\nLb. and comp. iterations:\n"; std::clog << o("-s value") diff --git a/options.h b/options.h index f0f2935..ed32b85 100644 --- a/options.h +++ b/options.h @@ -43,6 +43,7 @@ namespace opt { // Load balancing algorithm extern std::string loba_algo; extern bool bookkeeping; + extern bool egocentric; extern double min_transfer_amount; extern double max_transfer_amount; extern double min_lb_iter_duration; diff --git a/process.cpp b/process.cpp index 0f7380c..1883464 100644 --- a/process.cpp +++ b/process.cpp @@ -322,14 +322,15 @@ void process::data_send(neighbor& nb) { double load_to_send; if (opt::bookkeeping) { - 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; + double excess_load; + if (opt::egocentric) + excess_load = std::max(0.0, real_load - expected_load); + else + excess_load = real_load; + 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 = compute_load_to_send(nb.get_to_send()); if (load_to_send > 0.0) -- 2.39.5