X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/dda7529f8f14f9674a4defb7471322b56e0d0cb0..f4ae32c676421a6cd5c076b273dd7a07f2695957:/src/surf/maxmin.c diff --git a/src/surf/maxmin.c b/src/surf/maxmin.c index 3177a75fe1..08109bd57c 100644 --- a/src/surf/maxmin.c +++ b/src/surf/maxmin.c @@ -11,6 +11,7 @@ #include "xbt/mallocator.h" #include "maxmin_private.h" #include +#include /* sprintf */ #include XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_maxmin, surf, "Logging specific to SURF (maxmin)"); @@ -125,6 +126,11 @@ void lmm_constraint_shared(lmm_constraint_t cnst) cnst->shared = 0; } +int lmm_constraint_is_shared(lmm_constraint_t cnst) +{ + return (cnst->shared); +} + void lmm_constraint_free(lmm_system_t sys, lmm_constraint_t cnst) { remove_constraint(sys, cnst); @@ -177,7 +183,7 @@ lmm_variable_t lmm_variable_new(lmm_system_t sys, void *id, var->weight = weight; var->bound = bound; var->value = 0.0; - var->df = 0.0; + var->func_f = func_f_def; var->func_fp = func_fp_def; @@ -202,6 +208,11 @@ double lmm_variable_getvalue(lmm_variable_t var) return (var->value); } +double lmm_variable_getbound(lmm_variable_t var) +{ + return (var->bound); +} + void lmm_expand(lmm_system_t sys, lmm_constraint_t cnst, lmm_variable_t var, double value) { @@ -235,9 +246,10 @@ void lmm_expand_add(lmm_system_t sys, lmm_constraint_t cnst, if (var->cnsts[i].constraint == cnst) break; - if (i < var->cnsts_number) - var->cnsts[i].value += value; - else + if (i < var->cnsts_number) { + if(cnst->shared) var->cnsts[i].value += value; + else var->cnsts[i].value = MAX(var->cnsts[i].value,value); + } else lmm_expand(sys, cnst, var, value); } @@ -273,13 +285,16 @@ int lmm_get_number_of_cnst_from_var(lmm_system_t sys, lmm_variable_t var) lmm_variable_t lmm_get_var_from_cnst(lmm_system_t sys, lmm_constraint_t cnst, - lmm_variable_t * var) + lmm_element_t * elem) { - if (!(*var)) - xbt_swag_getFirst(&(cnst->element_set)); + if (!(*elem)) + *elem = xbt_swag_getFirst(&(cnst->element_set)); else - *var = xbt_swag_getNext(*var, cnst->element_set.offset); - return *var; + *elem = xbt_swag_getNext(*elem, cnst->element_set.offset); + if(*elem) + return (*elem)->variable; + else + return NULL; } void *lmm_constraint_id(lmm_constraint_t cnst) @@ -407,9 +422,9 @@ void lmm_print(lmm_system_t sys) } DEBUG1("%s", trace_buf); trace_buf[0] = '\000'; - if (double_positive(sum - cnst->bound)) - WARN3("Incorrect value (%f is not smaller than %f): %g", - sum, cnst->bound, sum - cnst->bound); + xbt_assert3(!double_positive(sum - cnst->bound), + "Incorrect value (%f is not smaller than %f): %g", + sum, cnst->bound, sum - cnst->bound); } DEBUG0("Variables"); @@ -418,9 +433,9 @@ void lmm_print(lmm_system_t sys) if (var->bound > 0) { DEBUG4("'%p'(%f) : %f (<=%f)", var, var->weight, var->value, var->bound); - if (double_positive(var->value - var->bound)) - WARN2("Incorrect value (%f is not smaller than %f", - var->value, var->bound); + xbt_assert2(!double_positive(var->value - var->bound), + "Incorrect value (%f is not smaller than %f", + var->value, var->bound); } else DEBUG3("'%p'(%f) : %f", var, var->weight, var->value); } @@ -447,6 +462,7 @@ void lmm_solve(lmm_system_t sys) xbt_swag_foreach(var, var_list) { int nb=0; int i; + if(var->weight<=0.0) break; var->value = 0.0; for (i = 0; i < var->cnsts_number; i++) { if(var->cnsts[i].value==0.0) nb++; @@ -490,6 +506,7 @@ void lmm_solve(lmm_system_t sys) var_list = &(sys->saturated_variable_set); xbt_swag_foreach(var, var_list) { + if(var->weight<=0.0) DIE_IMPOSSIBLE; /* First check if some of these variables have reach their upper bound and update min_usage accordingly. */ DEBUG5 @@ -590,24 +607,6 @@ void lmm_update_variable_bound(lmm_system_t sys, lmm_variable_t var, var->bound = bound; } -/** \brief Add the value delta to var->df (the sum of latencies). - * - * \param sys the lmm_system_t associated - * \param var the lmm_variable_t which need to updated - * \param delta the variation of the latency - * - * Add the value delta to var->df (the sum of latencys associated to the - * flow). Whenever this function is called a change is signed in the system. To - * avoid false system changing detection it is a good idea to test - * (delta != 0) before calling it. - * - */ -void lmm_update_variable_latency(lmm_system_t sys, lmm_variable_t var, - double delta) -{ - sys->modified = 1; - var->df += delta; -} void lmm_update_variable_weight(lmm_system_t sys, lmm_variable_t var, double weight) @@ -615,6 +614,7 @@ void lmm_update_variable_weight(lmm_system_t sys, lmm_variable_t var, int i; lmm_element_t elem; + if(weight==var->weight) return; XBT_IN3("(sys=%p, var=%p, weight=%f)", sys, var, weight); sys->modified = 1; var->weight = weight; @@ -632,6 +632,9 @@ void lmm_update_variable_weight(lmm_system_t sys, lmm_variable_t var, else xbt_swag_insert_at_tail(elem, &(elem->constraint->element_set)); } + if(!weight) + var->value = 0.0; + XBT_OUT; }