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

Private GIT Repository
modification to fairstrategy
authorRaphaël Couturier <couturie@debian.iut-bm.univ-fcomte.fr>
Fri, 17 Dec 2010 14:42:48 +0000 (15:42 +0100)
committerRaphael Couturier <raphael.couturier@univ-fcomte.fr>
Fri, 17 Dec 2010 14:44:56 +0000 (15:44 +0100)
loba_fairstrategy.cpp
neighbor.h
process.h

index fd710c2bf60024e6384d3eed820493062e663406..81de9e100a7e0941fbe0974e35d9c56e949cb7f3 100644 (file)
@@ -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:
index 9607c072f49c8dbd5de11adab45e3eaca3746e81..58f6c1cfac6a937ea09691b4d73cd5971b0bdf92 100644 (file)
@@ -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
index 053e3482c67fbbd424632ebaf770b6c4a2378fbb..df0cfe5fc19682172030a5e27769708a25877aa4 100644 (file)
--- 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