Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Fix the bug raised by Tchimou.
[simgrid.git] / src / surf / maxmin.c
index c240511..61be934 100644 (file)
@@ -126,6 +126,11 @@ void lmm_constraint_shared(lmm_constraint_t cnst)
   cnst->shared = 0;
 }
 
+int lmm_constraint_is_shared(lmm_constraint_t cnst)
+{
+  return (cnst->shared);
+}
+
 void lmm_constraint_free(lmm_system_t sys, lmm_constraint_t cnst)
 {
   remove_constraint(sys, cnst);
@@ -203,6 +208,11 @@ double lmm_variable_getvalue(lmm_variable_t var)
   return (var->value);
 }
 
+double lmm_variable_getbound(lmm_variable_t var)
+{
+  return (var->bound);
+}
+
 void lmm_expand(lmm_system_t sys, lmm_constraint_t cnst,
                lmm_variable_t var, double value)
 {
@@ -236,9 +246,10 @@ void lmm_expand_add(lmm_system_t sys, lmm_constraint_t cnst,
     if (var->cnsts[i].constraint == cnst)
       break;
 
-  if (i < var->cnsts_number)
-    var->cnsts[i].value += value;
-  else
+  if (i < var->cnsts_number) {
+    if(cnst->shared) var->cnsts[i].value += value;
+    else var->cnsts[i].value = MAX(var->cnsts[i].value,value);
+  }  else
     lmm_expand(sys, cnst, var, value);
 }
 
@@ -451,6 +462,7 @@ void lmm_solve(lmm_system_t sys)
   xbt_swag_foreach(var, var_list) {
     int nb=0;
     int i;
+    if(var->weight<=0.0) break;
     var->value = 0.0;
     for (i = 0; i < var->cnsts_number; i++) {
       if(var->cnsts[i].value==0.0) nb++;
@@ -494,6 +506,7 @@ void lmm_solve(lmm_system_t sys)
     var_list = &(sys->saturated_variable_set);
 
     xbt_swag_foreach(var, var_list) {
+      if(var->weight<=0.0) DIE_IMPOSSIBLE;
       /* First check if some of these variables have reach their upper
          bound and update min_usage accordingly. */
       DEBUG5
@@ -619,6 +632,7 @@ void lmm_update_variable_weight(lmm_system_t sys, lmm_variable_t var,
   int i;
   lmm_element_t elem;
 
+  if(weight==var->weight) return;
   XBT_IN3("(sys=%p, var=%p, weight=%f)", sys, var, weight);
   sys->modified = 1;
   var->weight = weight;
@@ -636,6 +650,9 @@ void lmm_update_variable_weight(lmm_system_t sys, lmm_variable_t var,
     else
       xbt_swag_insert_at_tail(elem, &(elem->constraint->element_set));
   }
+  if(!weight)
+    var->value = 0.0;
+
   XBT_OUT;
 }