Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
bugfix... I'm so pissed off to keep finding bug in this part of the code whereas...
[simgrid.git] / src / surf / maxmin.c
index fbe6327..4566590 100644 (file)
@@ -62,7 +62,8 @@ void lmm_variable_disable(lmm_system_t sys, lmm_variable_t var)
   for (i = 0; i < var->cnsts_number; i++) {
     elem = &var->cnsts[i];
     xbt_swag_remove(elem, &(elem->constraint->element_set));
-    if (xbt_swag_size(&(elem->constraint->element_set)))
+    xbt_swag_remove(elem, &(elem->constraint->active_element_set));
+    if (!xbt_swag_size(&(elem->constraint->element_set)))
       make_constraint_inactive(sys, elem->constraint);
   }
   var->cnsts_number = 0;
@@ -72,7 +73,7 @@ static void lmm_var_free(lmm_system_t sys, lmm_variable_t var)
 {
 
   lmm_variable_disable(sys, var);
-
+  memset(var->cnsts,0,var->cnsts_size*sizeof(s_lmm_element_t));
   xbt_free(var->cnsts);
   xbt_free(var);
 }
@@ -125,7 +126,8 @@ lmm_variable_t lmm_variable_new(lmm_system_t sys, void *id,
   var->weight = weight;
   var->bound = bound;
   var->value = 0.0;
-  insert_variable(sys, var);
+  if(weight) xbt_swag_insert_at_head(var,&(sys->variable_set));
+  else xbt_swag_insert_at_tail(var,&(sys->variable_set));
 
   return var;
 }
@@ -157,7 +159,8 @@ void lmm_expand(lmm_system_t sys, lmm_constraint_t cnst,
   elem->constraint = cnst;
   elem->variable = var;
 
-  insert_elem_in_constraint(elem);
+  if(var->weight) xbt_swag_insert_at_head(elem,&(elem->constraint->element_set));
+  else xbt_swag_insert_at_tail(elem,&(elem->constraint->element_set));
 
   make_constraint_active(sys, cnst);
 }
@@ -230,9 +233,11 @@ static void saturated_variable_set_update(lmm_system_t sys)
   cnst_list = &(sys->saturated_constraint_set);
   while ((cnst = xbt_swag_getFirst(cnst_list))) {
     elem_list = &(cnst->active_element_set);
-    xbt_swag_foreach(elem, elem_list)
-       if ((elem->value > 0) && (elem->variable->weight > 0))
-      xbt_swag_insert(elem->variable, &(sys->saturated_variable_set));
+    xbt_swag_foreach(elem, elem_list) {
+      if(elem->variable->weight<=0) break;
+      if ((elem->value > 0))
+       xbt_swag_insert(elem->variable, &(sys->saturated_variable_set));
+    }
     xbt_swag_remove(cnst, cnst_list);
   }
 
@@ -267,9 +272,10 @@ void lmm_solve(lmm_system_t sys)
     cnst->remaining = cnst->bound;
     cnst->usage = 0;
     xbt_swag_foreach(elem, elem_list) {
-      if ((elem->value > 0) && (elem->variable->weight > 0)) {
+      if(elem->variable->weight <=0) break;
+      if ((elem->value > 0)) {
        cnst->usage += elem->value / elem->variable->weight;
-       insert_active_elem_in_constraint(elem);
+       make_elem_active(elem);
       }
     }
 
@@ -307,7 +313,7 @@ void lmm_solve(lmm_system_t sys)
        cnst = elem->constraint;
        cnst->remaining -= elem->value * var->value;
        cnst->usage -= elem->value / var->weight;
-       remove_active_elem_in_constraint(elem);
+       make_elem_inactive(elem);
       }
       xbt_swag_remove(var, var_list);
     }
@@ -350,12 +356,24 @@ void lmm_update_variable_bound(lmm_system_t sys, lmm_variable_t var,
 void lmm_update_variable_weight(lmm_system_t sys, lmm_variable_t var,
                                double weight)
 {
+  int i ;
+  lmm_element_t elem;
+
   sys->modified = 1;
   var->weight = weight;
-}
+  xbt_swag_remove(var,&(sys->variable_set));
+  if(weight) xbt_swag_insert_at_head(var,&(sys->variable_set));
+  else xbt_swag_insert_at_tail(var,&(sys->variable_set));
 
+  for (i = 0; i < var->cnsts_number; i++) {
+    elem = &var->cnsts[i];
+    xbt_swag_remove(elem, &(elem->constraint->element_set));
+    if(weight) xbt_swag_insert_at_head(elem, &(elem->constraint->element_set));
+    else xbt_swag_insert_at_tail(elem, &(elem->constraint->element_set));
+  }
+}
 
-double lmm_get_variable_weight(lmm_system_t sys, lmm_variable_t var)
+double lmm_get_variable_weight(lmm_variable_t var)
                                  
 {
   return var->weight;
@@ -373,6 +391,16 @@ int lmm_constraint_used(lmm_system_t sys, lmm_constraint_t cnst)
   return xbt_swag_belongs(cnst, &(sys->active_constraint_set));
 }
 
+lmm_constraint_t lmm_get_first_active_constraint(lmm_system_t sys)
+{
+  return xbt_swag_getFirst(&(sys->active_constraint_set));
+}
+
+lmm_constraint_t lmm_get_next_active_constraint(lmm_system_t sys, lmm_constraint_t cnst)
+{
+  return xbt_swag_getNext(cnst,(sys->active_constraint_set).offset);
+}
+
 
 /* void lmm_print(lmm_system_t sys) */
 /* { */