X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/bb671f9a46d6bba398acb63681457a3ad5b8c1dc..1c06c4d49a2022cb250516dac52d613e9efaf66b:/src/surf/maxmin.c diff --git a/src/surf/maxmin.c b/src/surf/maxmin.c index 3e94153e35..ba4b5c8dd2 100644 --- a/src/surf/maxmin.c +++ b/src/surf/maxmin.c @@ -1,24 +1,16 @@ -/* Authors: Arnaud Legrand */ +/* $Id$ */ + +/* Copyright (c) 2004 Arnaud Legrand. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it - under the terms of the license (GNU LGPL) which comes with this package. */ + * under the terms of the license (GNU LGPL) which comes with this package. */ + #include "xbt/sysdep.h" #include "xbt/error.h" #include "maxmin_private.h" #include -/* extern lmm_system_t Sys; */ -/* extern lmm_constraint_t L1; */ -/* extern lmm_constraint_t L2; */ -/* extern lmm_constraint_t L3; */ - -/* extern lmm_variable_t R_1_2_3; */ -/* extern lmm_variable_t R_1; */ -/* extern lmm_variable_t R_2; */ -/* extern lmm_variable_t R_3; */ - - lmm_system_t lmm_system_new(void) { lmm_system_t l = NULL; @@ -131,7 +123,7 @@ lmm_variable_t lmm_variable_new(lmm_system_t sys, void *id, /* var->cnsts_number = 0; *//* Useless because of the calloc */ var->weight = weight; var->bound = bound; - var->value = -1; + var->value = 0.0; insert_variable(sys, var); return var; @@ -180,6 +172,14 @@ int lmm_get_number_of_cnst_from_var(lmm_system_t sys, lmm_variable_t var) return(var->cnsts_number); } +lmm_variable_t lmm_get_var_from_cnst(lmm_system_t sys, lmm_constraint_t cnst, + lmm_variable_t *var) +{ + if(!(*var)) xbt_swag_getFirst(&(cnst->element_set)); + else *var=xbt_swag_getNext(*var,cnst->element_set.offset); + return *var; +} + void *lmm_constraint_id(lmm_constraint_t cnst) { return cnst->id; @@ -190,16 +190,14 @@ void *lmm_variable_id(lmm_variable_t var) return var->id; } -static void saturated_constraints_update(lmm_system_t sys, +static void saturated_constraint_set_update(lmm_system_t sys, lmm_constraint_t cnst, xbt_maxmin_float_t * min_usage) { lmm_constraint_t useless_cnst = NULL; - sys->modified = 1; - - if (cnst->remaining <= 0) - return; + if(cnst->usage <=0) return; + if (cnst->remaining <= 0) return; if ((*min_usage < 0) || (*min_usage > cnst->remaining / cnst->usage)) { *min_usage = cnst->remaining / cnst->usage; @@ -212,20 +210,18 @@ static void saturated_constraints_update(lmm_system_t sys, } } -static void saturated_variables_update(lmm_system_t sys) +static void saturated_variable_set_update(lmm_system_t sys) { lmm_constraint_t cnst = NULL; xbt_swag_t cnst_list = NULL; lmm_element_t elem = NULL; xbt_swag_t elem_list = NULL; - sys->modified = 1; - cnst_list = &(sys->saturated_constraint_set); while ((cnst = xbt_swag_getFirst(cnst_list))) { -/* xbt_swag_foreach(cnst, 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_remove(cnst, cnst_list); } @@ -247,7 +243,7 @@ void lmm_solve(lmm_system_t sys) /* Init */ var_list = &(sys->variable_set); xbt_swag_foreach(var, var_list) { - var->value = -1; + var->value = 0.0; } @@ -260,15 +256,17 @@ void lmm_solve(lmm_system_t sys) cnst->remaining = cnst->bound; cnst->usage = 0; xbt_swag_foreach(elem, elem_list) { - cnst->usage += elem->value / elem->variable->weight; - insert_active_elem_in_constraint(elem); + if((elem->value>0) && (elem->variable->weight>0)) { + cnst->usage += elem->value / elem->variable->weight; + insert_active_elem_in_constraint(elem); + } } /* Saturated constraints update */ - saturated_constraints_update(sys, cnst, &min_usage); + saturated_constraint_set_update(sys, cnst, &min_usage); } - saturated_variables_update(sys); + saturated_variable_set_update(sys); /* Saturated variables update */ @@ -307,9 +305,9 @@ void lmm_solve(lmm_system_t sys) cnst_list = &(sys->active_constraint_set); min_usage = -1; xbt_swag_foreach(cnst, cnst_list) { - saturated_constraints_update(sys, cnst, &min_usage); + saturated_constraint_set_update(sys, cnst, &min_usage); } - saturated_variables_update(sys); + saturated_variable_set_update(sys); } while (xbt_swag_size(&(sys->saturated_variable_set))); @@ -322,12 +320,11 @@ void lmm_update(lmm_system_t sys, lmm_constraint_t cnst, lmm_variable_t var, xbt_maxmin_float_t value) { int i; - lmm_element_t elem = NULL; sys->modified = 1; for (i = 0; i < var->cnsts_number; i++) if (var->cnsts[i].constraint == cnst) { - elem->value = value; + var->cnsts[i].value = value; return; } }