X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/74e0e2a3ea0e6a0ae9bb445ff167906fb0cbad7c..0714dbb971a42b14418ea392844026a816f757e3:/src/surf/maxmin.c diff --git a/src/surf/maxmin.c b/src/surf/maxmin.c index 8dd3fb35d3..7ff6a48c09 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 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_maxmin, surf, "Logging specific to SURF (maxmin)"); @@ -173,6 +174,13 @@ 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; + var->func_fpi = func_fpi_def; + var->func_fpip = func_fpip_def; + if(weight) xbt_swag_insert_at_head(var,&(sys->variable_set)); else xbt_swag_insert_at_tail(var,&(sys->variable_set)); XBT_OUT; @@ -325,6 +333,7 @@ static void saturated_variable_set_update(lmm_system_t sys) } void lmm_print(lmm_system_t sys) + { lmm_constraint_t cnst = NULL; lmm_element_t elem = NULL; @@ -378,7 +387,7 @@ void lmm_print(lmm_system_t sys) } DEBUG1("%s",trace_buf); trace_buf[0]='\000'; - xbt_assert3((sum<=cnst->bound), "Incorrect value (%f is not smaller than %f): %g", + xbt_assert3(!double_positive(sum-cnst->bound), "Incorrect value (%f is not smaller than %f): %g", sum,cnst->bound,sum-cnst->bound); } @@ -386,7 +395,8 @@ void lmm_print(lmm_system_t sys) xbt_swag_foreach(var, var_list) { if(var->bound>0) { DEBUG4("'%p'(%f) : %f (<=%f)",var,var->weight,var->value, var->bound); - xbt_assert0((var->value<=var->bound), "Incorrect value"); + 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); @@ -526,6 +536,18 @@ void lmm_update(lmm_system_t sys, lmm_constraint_t cnst, } } +/** \brief Attribute the value bound to var->bound. + * + * \param sys the lmm_system_t + * \param var the lmm_variable_t + * \param bound the new bound to associate with var + * + * Makes var->bound equal to bound. 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 + * (bound != 0) before calling it. + * + */ void lmm_update_variable_bound(lmm_system_t sys, lmm_variable_t var, double bound) { @@ -533,6 +555,25 @@ 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) { @@ -583,3 +624,20 @@ lmm_constraint_t lmm_get_next_active_constraint(lmm_system_t sys, lmm_constraint return xbt_swag_getNext(cnst,(sys->active_constraint_set).offset); } + + +/** \brief Attribute the value bound to var->bound. + * + * \param func_f default function f associated with the chosen protocol flavor + * \param func_fp partial differential of f (f prime, f') + * \param func_fpi inverse of the partial differential of f (f prime inverse, (f')^{-1}) + * \param func_fpip partial differential of the inverse of the partial differential of f (f prime inverse prime, ((f')^{-1})') + * + * Set default functions to the ones passed as parameters. This is a polimorfism in C pure, enjoy the roots of programming. + * + */ +void lmm_set_default_protocol_functions(double (* func_fpi) (lmm_variable_t var, double x)) +{ + func_fpi_def = func_fpi; +} +