Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Finding this damn fucking bug took me an inordinate amount of time ! It was well...
[simgrid.git] / src / surf / maxmin.c
index 9b5a48f..a031586 100644 (file)
@@ -62,7 +62,7 @@ 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)))
+    if (!xbt_swag_size(&(elem->constraint->element_set)))
       make_constraint_inactive(sys, elem->constraint);
   }
   var->cnsts_number = 0;
@@ -125,7 +125,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 +158,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 +232,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,7 +271,8 @@ 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);
       }
@@ -352,6 +357,16 @@ void lmm_update_variable_weight(lmm_system_t sys, lmm_variable_t var,
 {
   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));
+}
+
+
+double lmm_get_variable_weight(lmm_variable_t var)
+                                 
+{
+  return var->weight;
 }
 
 void lmm_update_constraint_bound(lmm_system_t sys, lmm_constraint_t cnst,
@@ -366,6 +381,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) */
 /* { */