X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/607bb2a7ef2ed05e9f9d0be783621242313b3e88..77f37f760119eedffa3ba51f5f67419822e48cda:/src/surf/maxmin.c diff --git a/src/surf/maxmin.c b/src/surf/maxmin.c index 01e29f9aed..200722f8be 100644 --- a/src/surf/maxmin.c +++ b/src/surf/maxmin.c @@ -11,7 +11,7 @@ #include "maxmin_private.h" #include XBT_LOG_NEW_DEFAULT_SUBCATEGORY(maxmin, surf, - "Logging specific to the SURF maxminmodule"); + "Logging specific to the SURF maxmin module"); lmm_system_t lmm_system_new(void) { @@ -79,8 +79,8 @@ static void lmm_var_free(lmm_system_t sys, lmm_variable_t var) static void lmm_cnst_free(lmm_system_t sys, lmm_constraint_t cnst) { - xbt_assert0(xbt_swag_size(&(cnst->element_set)), - "This list should be empty!"); +/* xbt_assert0(xbt_swag_size(&(cnst->element_set)), */ +/* "This list should be empty!"); */ remove_active_constraint(sys, cnst); xbt_free(cnst); } @@ -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; } @@ -148,7 +149,7 @@ void lmm_expand(lmm_system_t sys, lmm_constraint_t cnst, sys->modified = 1; - xbt_assert0(var->cnsts_number >= var->cnsts_size, + xbt_assert0(var->cnsts_number < var->cnsts_size, "Too much constraints"); elem = &(var->cnsts[var->cnsts_number++]); @@ -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) */ /* { */