X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/9cad0196551dcc8453b56f016d33dd7ceb98dd7a..07382145819134d7bbbc2eec66a0f5c285ac84f0:/src/surf/maxmin.c diff --git a/src/surf/maxmin.c b/src/surf/maxmin.c index b5a261ef90..d26d58162d 100644 --- a/src/surf/maxmin.c +++ b/src/surf/maxmin.c @@ -23,12 +23,11 @@ static void lmm_variable_mallocator_free_f(void *var); static void lmm_update_modified_set(lmm_system_t sys, lmm_constraint_t cnst); static void lmm_remove_all_modified_set(lmm_system_t sys); -int sg_maxmin_selective_update = 1; static int Global_debug_id = 1; static int Global_const_debug_id = 1; extern xbt_swag_t keep_track; -lmm_system_t lmm_system_new(void) +lmm_system_t lmm_system_new(int selective_update) { lmm_system_t l = NULL; s_lmm_variable_t var; @@ -37,7 +36,7 @@ lmm_system_t lmm_system_new(void) l = xbt_new0(s_lmm_system_t, 1); l->modified = 0; - l->selective_update_active = sg_maxmin_selective_update; + l->selective_update_active = selective_update; XBT_DEBUG("Setting selective_update_active flag to %d\n", l->selective_update_active); @@ -87,20 +86,31 @@ void lmm_system_free(lmm_system_t sys) XBT_INLINE void lmm_variable_disable(lmm_system_t sys, lmm_variable_t var) { int i; + int n; + lmm_element_t elem = NULL; XBT_IN("(sys=%p, var=%p)", sys, var); sys->modified = 1; + n = 0; for (i = 0; i < var->cnsts_number; i++) { elem = &var->cnsts[i]; xbt_swag_remove(elem, &(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); - else - lmm_update_modified_set(sys, elem->constraint); + else { + if (n < i) + var->cnsts[n].constraint = elem->constraint; + n++; + } + } + if (n) { + var->cnsts_number = n; + lmm_update_modified_set(sys, var->cnsts[0].constraint); } + var->cnsts_number = 0; XBT_OUT(); } @@ -117,7 +127,7 @@ static XBT_INLINE void lmm_cnst_free(lmm_system_t sys, { /* xbt_assert(xbt_swag_size(&(cnst->element_set)), */ /* "This list should be empty!"); */ - remove_active_constraint(sys, cnst); + make_constraint_inactive(sys, cnst); free(cnst); } @@ -259,6 +269,8 @@ void lmm_expand(lmm_system_t sys, lmm_constraint_t cnst, make_constraint_active(sys, cnst); lmm_update_modified_set(sys, cnst); + if (var->cnsts_number > 1) + lmm_update_modified_set(sys, var->cnsts[0].constraint); } void lmm_expand_add(lmm_system_t sys, lmm_constraint_t cnst, @@ -624,9 +636,6 @@ void lmm_solve(lmm_system_t sys) } /* Find out which variables reach the maximum */ - cnst_list = - sys->selective_update_active ? &(sys->modified_constraint_set) : - &(sys->active_constraint_set); min_usage = -1; min_bound = -1; xbt_swag_foreach(cnst, cnst_list) { @@ -677,14 +686,11 @@ void lmm_update(lmm_system_t sys, lmm_constraint_t cnst, void lmm_update_variable_bound(lmm_system_t sys, lmm_variable_t var, double bound) { - int i; - sys->modified = 1; var->bound = bound; - for (i = 0; i < var->cnsts_number; i++) - lmm_update_modified_set(sys, var->cnsts[i].constraint); - + if (var->cnsts_number) + lmm_update_modified_set(sys, var->cnsts[0].constraint); } @@ -712,12 +718,13 @@ void lmm_update_variable_weight(lmm_system_t sys, lmm_variable_t var, xbt_swag_insert_at_head(elem, &(elem->constraint->element_set)); else xbt_swag_insert_at_tail(elem, &(elem->constraint->element_set)); - - lmm_update_modified_set(sys, elem->constraint); } if (!weight) var->value = 0.0; + if (var->cnsts_number) + lmm_update_modified_set(sys, var->cnsts[0].constraint); + XBT_OUT(); } @@ -811,11 +818,5 @@ static void lmm_update_modified_set(lmm_system_t sys, */ static void lmm_remove_all_modified_set(lmm_system_t sys) { - xbt_swag_t modified_constraint_set = &sys->modified_constraint_set; - lmm_constraint_t cnst; - lmm_constraint_t cnst_next; - - xbt_swag_foreach_safe(cnst, cnst_next, modified_constraint_set) { - xbt_swag_remove(cnst, modified_constraint_set); - } + xbt_swag_reset(&sys->modified_constraint_set); }