Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Added the update for the Df parameter (lmm_variable_t), which means the sum of all
[simgrid.git] / src / surf / maxmin.c
index ccafa55..2131d8f 100644 (file)
@@ -173,6 +173,7 @@ lmm_variable_t lmm_variable_new(lmm_system_t sys, void *id,
   var->weight = weight;
   var->bound = bound;
   var->value = 0.0;
+  var->df    = 0.0;
   if(weight) xbt_swag_insert_at_head(var,&(sys->variable_set));
   else xbt_swag_insert_at_tail(var,&(sys->variable_set));
   XBT_OUT;
@@ -324,7 +325,7 @@ static void saturated_variable_set_update(lmm_system_t sys)
   }
 }
 
-static void lmm_print(lmm_system_t sys)
+void lmm_print(lmm_system_t sys)
 {
   lmm_constraint_t cnst = NULL;
   lmm_element_t elem = NULL;
@@ -370,10 +371,16 @@ static void lmm_print(lmm_system_t sys)
     sprintf(print_buf,"0 <= %f ('%p')",cnst->bound,cnst);
     trace_buf = xbt_realloc(trace_buf,strlen(trace_buf)+strlen(print_buf)+1);
     strcat(trace_buf, print_buf);
+
+    if(!cnst->shared) {
+      sprintf(print_buf," [MAX-Constraint]");
+      trace_buf = xbt_realloc(trace_buf,strlen(trace_buf)+strlen(print_buf)+1);
+      strcat(trace_buf, print_buf);
+    }
     DEBUG1("%s",trace_buf);
     trace_buf[0]='\000';
-    xbt_assert2((sum<=cnst->bound), "Incorrect value (%f is not smaller than %f)",
-               sum,cnst->bound);
+    xbt_assert3((sum<=cnst->bound), "Incorrect value (%f is not smaller than %f): %g",
+               sum,cnst->bound,sum-cnst->bound);
   }
 
   /* Printing Result */
@@ -409,9 +416,9 @@ void lmm_solve(lmm_system_t sys)
     var->value = 0.0;
   }
 
-
-  /* Compute Usage and store the variables that reach the maximum */
-
+  /* 
+   * Compute Usage and store the variables that reach the maximum.
+   */
   cnst_list = &(sys->active_constraint_set);
   DEBUG1("Active constraints : %d", xbt_swag_size(cnst_list));
   xbt_swag_foreach(cnst, cnst_list) {
@@ -419,21 +426,22 @@ void lmm_solve(lmm_system_t sys)
     cnst->remaining = cnst->bound;
     cnst->usage = 0;
     elem_list = &(cnst->element_set);
+    cnst->usage = 0.0;
     xbt_swag_foreach(elem, elem_list) {
       if(elem->variable->weight <=0) break;
       if ((elem->value > 0)) {
        if(cnst->shared)
          cnst->usage += elem->value / elem->variable->weight;
        else 
-         cnst->usage = 1;
+         if(cnst->usage<elem->value / elem->variable->weight)
+           cnst->usage = elem->value / elem->variable->weight;
+       DEBUG2("Constraint Usage %p : %f",cnst,cnst->usage);
        make_elem_active(elem);
       }
     }
-
     /* Saturated constraints update */
     saturated_constraint_set_update(sys, cnst, &min_usage);
   }
-
   saturated_variable_set_update(sys);
 
   /* Saturated variables update */
@@ -458,6 +466,8 @@ void lmm_solve(lmm_system_t sys)
       int i;
 
       var->value = min_usage / var->weight;
+      DEBUG5("Min usage: %f, Var(%p)->weight: %f, Var(%p)->value: %f ",min_usage,var,var->weight,var,var->value);
+
 
       /* Update usage */
 
@@ -467,8 +477,21 @@ void lmm_solve(lmm_system_t sys)
        if(cnst->shared) {
          double_update(&(cnst->remaining), elem->value * var->value);
          double_update(&(cnst->usage), elem->value / var->weight);
+         make_elem_inactive(elem);
+       } else { /* FIXME one day: We recompute usage.... :( */
+         cnst->usage = 0.0;
+         make_elem_inactive(elem);
+         xbt_swag_foreach(elem, elem_list) {
+           if(elem->variable->weight <=0) break;
+           if(elem->variable->value > 0) break;
+           if ((elem->value > 0)) {
+             if(cnst->usage<elem->value / elem->variable->weight)
+               cnst->usage = elem->value / elem->variable->weight;
+             DEBUG2("Constraint Usage %p : %f",cnst,cnst->usage);
+             make_elem_active(elem);
+           }
+         } 
        }
-       make_elem_inactive(elem);
       }
       xbt_swag_remove(var, var_list);
     }
@@ -511,6 +534,13 @@ void lmm_update_variable_bound(lmm_system_t sys, lmm_variable_t var,
   var->bound = bound;
 }
 
+void lmm_update_variable_latency(lmm_system_t sys, lmm_variable_t var,
+                              double delta)
+{
+  sys->modified = 1;
+  var->df += delta;
+}
+
 void lmm_update_variable_weight(lmm_system_t sys, lmm_variable_t var,
                                double weight)
 {