git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@3498
48e7efb5-ca39-0410-a469-
dd3cf9ba447f
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_lagrange, surf, "Logging specific to SURF (lagrange)");
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_lagrange, surf, "Logging specific to SURF (lagrange)");
/*
* Local prototypes to implement the lagrangian optimization with optimal step, also called dicotomi.
*/
/*
* Local prototypes to implement the lagrangian optimization with optimal step, also called dicotomi.
*/
double partial_diff_lambda (double lambda, void * param_cnst);
double partial_diff_lambda (double lambda, void * param_cnst);
void lagrange_solve(lmm_system_t sys)
{
/*
void lagrange_solve(lmm_system_t sys)
{
/*
double dicotomi_min_error = 1e-8;
double overall_error = 1;
double dicotomi_min_error = 1e-8;
double overall_error = 1;
/*
* Variables to manipulate the data structure proposed to model the maxmin
* fairness. See docummentation for more details.
/*
* Variables to manipulate the data structure proposed to model the maxmin
* fairness. See docummentation for more details.
xbt_swag_t var_list = NULL;
lmm_variable_t var = NULL;
xbt_swag_t var_list = NULL;
lmm_variable_t var = NULL;
/*
* Auxiliar variables.
*/
/*
* Auxiliar variables.
*/
if((var->bound >= 0) && (var->weight > 0) ){
var->new_mu = dicotomi(var->mu, partial_diff_mu, var, dicotomi_min_error);
if(var->new_mu < 0) var->new_mu = 0;
if((var->bound >= 0) && (var->weight > 0) ){
var->new_mu = dicotomi(var->mu, partial_diff_mu, var, dicotomi_min_error);
if(var->new_mu < 0) var->new_mu = 0;
xbt_swag_foreach(cnst, cnst_list) {
cnst->new_lambda = dicotomi(cnst->lambda, partial_diff_lambda, cnst, dicotomi_min_error);
DEBUG2("====> cnst->lambda (%p) = %e", cnst, cnst->new_lambda);
xbt_swag_foreach(cnst, cnst_list) {
cnst->new_lambda = dicotomi(cnst->lambda, partial_diff_lambda, cnst, dicotomi_min_error);
DEBUG2("====> cnst->lambda (%p) = %e", cnst, cnst->new_lambda);
+ cnst->lambda = cnst->new_lambda;
- /*
- * Update values of mu and lambda
- */
- //forall mu_i in mu_1, mu_2, ..., mu_n
- xbt_swag_foreach(var, var_list) {
- var->mu = var->new_mu ;
- }
+
+/* /\* */
+/* * Update values of mu and lambda */
+/* *\/ */
+/* //forall mu_i in mu_1, mu_2, ..., mu_n */
+/* xbt_swag_foreach(var, var_list) { */
+/* var->mu = var->new_mu ; */
+/* } */
- //forall lambda_i in lambda_1, lambda_2, ..., lambda_n
- xbt_swag_foreach(cnst, cnst_list) {
- cnst->lambda = cnst->new_lambda;
- }
+/* //forall lambda_i in lambda_1, lambda_2, ..., lambda_n */
+/* xbt_swag_foreach(cnst, cnst_list) { */
+/* cnst->lambda = cnst->new_lambda; */
+/* } */
/*
* Now computes the values of each variable (\rho) based on
/*
* Now computes the values of each variable (\rho) based on
//verify the KKT property of each flow
xbt_swag_foreach(var, var_list){
//verify the KKT property of each flow
xbt_swag_foreach(var, var_list){
if(overall_error <= epsilon_min_error){
DEBUG1("The method converge in %d iterations.", iteration);
}else{
if(overall_error <= epsilon_min_error){
DEBUG1("The method converge in %d iterations.", iteration);
}else{
double min_diff, max_diff, middle_diff;
min = max = init;
double min_diff, max_diff, middle_diff;
min = max = init;
+
+ if(init == 0){
+ min = max = 1;
+ }
+
min_diff = max_diff = middle_diff = 0.0;
overall_error = 1;
min_diff = max_diff = middle_diff = 0.0;
overall_error = 1;
+ DEBUG0("====> not detected positive diff in 0");
+
while(overall_error > min_error){
while(overall_error > min_error){
min_diff = diff(min, var_cnst);
max_diff = diff(max, var_cnst);
min_diff = diff(min, var_cnst);
max_diff = diff(max, var_cnst);
+ DEBUG2("DICOTOMI ===> min = %e , max = %e", min, max);
+ DEBUG2("DICOTOMI ===> diffmin = %e , diffmax = %e", min_diff, max_diff);
+
if( min_diff > 0 && max_diff > 0 ){
if(min == max){
min = min / 2.0;
if( min_diff > 0 && max_diff > 0 ){
if(min == max){
min = min / 2.0;
- DEBUG2("===> Variable (%p) %s", var, (char *)var->id);
+ //DEBUG2("===> Variable (%p) %s", var, (char *)var->id);
for(i=0; i<var->cnsts_number; i++){
tmp += (var->cnsts[i].constraint)->lambda;
for(i=0; i<var->cnsts_number; i++){
tmp += (var->cnsts[i].constraint)->lambda;
- DEBUG1("======> lambda %e + ", (var->cnsts[i].constraint)->lambda);
+ //DEBUG1("======> lambda %e + ", (var->cnsts[i].constraint)->lambda);
}
if(var->bound > 0)
tmp += var->mu;
}
if(var->bound > 0)
tmp += var->mu;
- DEBUG2("======> lambda - %e + %e ", cnst->lambda, lambda);
+ //DEBUG2("======> lambda - %e + %e ", cnst->lambda, lambda);
tmp = tmp - cnst->lambda + lambda;
tmp = tmp - cnst->lambda + lambda;
lambda_partial += (-1.0/tmp);
lambda_partial += (-1.0/tmp);
- DEBUG1("======> %e ", (-1.0/tmp));
+ //DEBUG1("======> %e ", (-1.0/tmp));
}
lambda_partial += cnst->bound;
}
lambda_partial += cnst->bound;
- DEBUG1("===> %e ", lambda_partial);
+ //DEBUG1("===> %e ", lambda_partial);