]> AND Private Git Repository - loba.git/blobdiff - process.cpp
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
Add platforms with 4096 nodes.
[loba.git] / process.cpp
index 01b5e0fcc3ce9caab4dcaefb9b25f0a4a8ad3e6e..b5531b0ce85eff0a0a20f6f5f9ce3a1276a71d5d 100644 (file)
@@ -295,19 +295,22 @@ void process::convergence_check()
     double load_diff = std::fabs(real_load - average);
     bool converged = load_diff <= load_diff_threshold;
 
-    if (convergence >= 0.0) {
-        if (!converged) {
-            XBT_VERB("current load has diverged: %g (%.4g%%)",
-                     real_load, 100.0 * load_diff / average);
-            convergence = -1.0;
-            convergence_counter++;
-        }
-    } else {
-        if (converged) {
+    if (converged) {
+        if (convergence < 0) {
             XBT_VERB("current load has converged: %g (%.4g%%)",
                      real_load,  100.0 * load_diff / average);
             convergence = MSG_get_clock();
-            convergence_counter--;
+            local_convergence_counter = opt::exit_on_convergence;
+        }
+        if (local_convergence_counter > 0 && --local_convergence_counter == 0)
+                --convergence_counter;
+    } else {
+        if (convergence >= 0.0) {
+            XBT_VERB("current load has diverged: %g (%.4g%%)",
+                     real_load, 100.0 * load_diff / average);
+            convergence = -1.0;
+            if (local_convergence_counter == 0)
+                ++convergence_counter;
         }
     }
 }
@@ -418,7 +421,11 @@ void process::data_send(neighbor& nb)
         else
             excess_load = real_load;
 
-        double balance = nb.get_debt() - nb.get_credit();
+        double balance;
+        if (nb.get_credit() > 0.0)
+            balance = nb.get_debt() - nb.get_credit();
+        else
+            balance = nb.get_debt();
         load_to_send = std::min(excess_load,
                                 std::max(0.0, balance));