From: Raphaƫl Couturier <couturie@debian.iut-bm.univ-fcomte.fr>
Date: Fri, 17 Dec 2010 14:42:48 +0000 (+0100)
Subject: modification to fairstrategy
X-Git-Tag: v0.1~222
X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/loba.git/commitdiff_plain/e77b88227729cc003cb8e74b5657886ed61a270f?ds=sidebyside

modification to fairstrategy
---

diff --git a/loba_fairstrategy.cpp b/loba_fairstrategy.cpp
index fd710c2..81de9e1 100644
--- a/loba_fairstrategy.cpp
+++ b/loba_fairstrategy.cpp
@@ -1,5 +1,5 @@
 #include "loba_fairstrategy.h"
-
+#include <algorithm>
 #include <xbt/log.h>
 
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(loba);
@@ -8,34 +8,54 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(loba);
  *   load balance with a least-loaded neighbor,
  *   without breaking the ping-pong condition
  */
+
+class compare {
+public : 
+	bool operator()(const neighbor*a, const neighbor*b)	{
+		return a->get_load()>b->get_load();
+	}
+};
+
 double loba_fairstrategy::load_balance(double my_load)
 {
     int imin = -1;
     int imax = -1;
     double min = my_load;
     double max = -1.0;
-    for (unsigned i = 0 ; i < pneigh.size() ; ++i) {
+
+		std::sort(pneigh.begin(),pneigh.end(),compare());
+
+		//print_loads();
+
+		INFO0("list voisins");
+		for(unsigned i=0;i< pneigh.size() ; ++i) {
+			INFO2("%s %f ", pneigh[i]->get_name(), pneigh[i]->get_load());
+		}
+
+		double sum_sent=0;
+		bool found=true;
+
+		while(found) {
+			found=false;
+			for (unsigned i = 0 ; i < pneigh.size() ; ++i) {
         double l = pneigh[i]->get_load();
         if (l >= my_load)
-            continue;
-        if (l < min) {
-            imin = i;
-            min = l;
-        }
-        if (l > max) {
-            imax = i;
-            max = l;
-        }
-    }
-    if (imin != -1) {
-        // found someone
-        double balance = (my_load - max) / 2;
-        DEBUG6("%d:%g %d:%g %g %g", imin, min, imax, max, my_load, balance);
-        pneigh[imin]->set_to_send(balance);
-        return balance;
-    } else {
-        return 0.0;
-    }
+					continue;
+				if(l<my_load+2) {
+					found=true;
+					pneigh[i]->set_load(l+1);
+					pneigh[i]->add_to_send(1);
+					INFO1("sent to %s",pneigh[i]->get_name());
+					my_load--;
+					sum_sent++;
+				}
+			}
+		}
+
+
+		
+		return sum_sent;
+    
 }
 
 // Local variables:
diff --git a/neighbor.h b/neighbor.h
index 9607c07..58f6c1c 100644
--- a/neighbor.h
+++ b/neighbor.h
@@ -25,6 +25,7 @@ public:
     // Getter and setter for to_send
     double get_to_send() const          { return to_send;   }
     void set_to_send(double amount)     { to_send = amount; }
+    void add_to_send(double amount)     { to_send += amount; }
 
 private:
     const hostdata* host;       // pointer to this neighbor's hostdata
diff --git a/process.h b/process.h
index 053e348..df0cfe5 100644
--- a/process.h
+++ b/process.h
@@ -35,6 +35,8 @@ protected:
 
     // Returns the sum of "to_send" for all neighbors.
     double sum_of_to_send() const;
+    // Print with given priority what we know about our neighbors' loads
+    void print_loads(e_xbt_log_priority_t logp = xbt_log_priority_info);
 
 private:
     static double total_load_init;
@@ -83,8 +85,7 @@ private:
     void finalize1(neighbor& nb);
     void finalize();
 
-    // Print with given priority what we know about our neighbors' loads
-    void print_loads(e_xbt_log_priority_t logp = xbt_log_priority_info);
+
 };
 
 #endif // !PROCESS_H