From 07382145819134d7bbbc2eec66a0f5c285ac84f0 Mon Sep 17 00:00:00 2001 From: Navarrop Date: Fri, 6 Jan 2012 16:01:33 +0100 Subject: [PATCH] The variable-constraint graph is already traversed, and there is no need to call lmm_update_modified_set for each constraint of a variable. Note: the fix in lmm_update_variable_weight may change the order of the elements in modified_constraint_set, and some timings may slightly vary. If it is really important, the following patch fixes that: --- a/src/surf/maxmin.c +++ b/src/surf/maxmin.c @@ -716,13 +716,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)); + + if (i == 0) + 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(); } --- src/surf/maxmin.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/surf/maxmin.c b/src/surf/maxmin.c index 191068f13b..d26d58162d 100644 --- a/src/surf/maxmin.c +++ b/src/surf/maxmin.c @@ -86,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(); } @@ -675,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); } @@ -710,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(); } -- 2.20.1