ii) the sigma_i + mu_i wasn't done correctly, mu_i was added at
each lambda_j variable instead of only once at the end, iii) the
initialization of parameter df in lmm_variable_new was 1 and it must
be 0.0, iv) the function for Reno has some workrounds that doesn't
seem to work correctly (this last one to be continued...).
Thanks to Arnaud Legrand.
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@3769
48e7efb5-ca39-0410-a469-
dd3cf9ba447f
var_list = &(sys->variable_set);
i=0;
xbt_swag_foreach(var, var_list) {
var_list = &(sys->variable_set);
i=0;
xbt_swag_foreach(var, var_list) {
- if((var->bound > 0.0) || (var->weight <= 0.0)){
- DEBUG1("#### NOTE var(%d) is a boundless variable", i);
+ if((var->bound < 0.0) || (var->weight <= 0.0)){
+ DEBUG1("#### NOTE var(%d) is a boundless (or inactive) variable", i);
var->mu = -1.0;
} else{
var->mu = 1.0;
var->new_mu = 2.0;
}
var->mu = -1.0;
} else{
var->mu = 1.0;
var->new_mu = 2.0;
}
- DEBUG2("#### var(%d)->mu : %e", i, var->mu);
- DEBUG2("#### var(%d)->weight: %e", i, var->weight);
+ DEBUG3("#### var(%d) %p ->mu : %e", i, var, var->mu);
+ DEBUG3("#### var(%d) %p ->weight: %e", i, var, var->weight);
+ DEBUG3("#### var(%d) %p ->bound: %e", i, var, var->bound);
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;
+ DEBUG2("====> var->mu (%p) = %e", var, var->new_mu);
tmp = 0;
for(i=0; i<var->cnsts_number; i++){
tmp += (var->cnsts[i].constraint)->lambda;
tmp = 0;
for(i=0; i<var->cnsts_number; i++){
tmp += (var->cnsts[i].constraint)->lambda;
- if(var->bound > 0)
- tmp+=var->mu;
+ if(var->bound > 0)
+ tmp+=var->mu;
+ DEBUG3("\t Working on var (%p). cost = %e; Df = %e", var, tmp, var->df);
//uses the partial differential inverse function
tmp = var->func_fpi(var, tmp);
//uses the partial differential inverse function
tmp = var->func_fpi(var, tmp);
- tmp = tmp - cnst->bound;
-
- if(tmp > epsilon_min_error){
- WARN3("The link (%p) doesn't match the KKT property, expected less than %e and got %e", cnst, epsilon_min_error, tmp);
+ if(tmp - cnst->bound > epsilon_min_error) {
+ WARN3("The link (%p) is over-used. Expected less than %e and got %e", cnst, cnst->bound, tmp);
+ }
+ if(!((fabs(tmp - cnst->bound)<epsilon_min_error && cnst->lambda>=epsilon_min_error) ||
+ (fabs(tmp - cnst->bound)>=epsilon_min_error && cnst->lambda<epsilon_min_error))) {
+ WARN1("The KKT condition is not verified for cnst %p...", cnst);
+ overall_error=1.0;
}
//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(var->bound <= 0 || var->weight <= 0) continue;
- tmp = 0;
- tmp = (var->value - var->bound);
+ if(var->bound < 0 || var->weight <= 0) continue;
-
- if(tmp != 0.0 || var->mu != 0.0){
- WARN3("The flow (%p) doesn't match the KKT property, value expected (=0) got (lambda=%e) (sum_rho=%e)", var, var->mu, tmp);
+ INFO2("Checking KKT: sat = %e mu = %e",var->value - var->bound,var->mu);
+ if(!((fabs(var->value - var->bound)<epsilon_min_error && var->mu>=epsilon_min_error) ||
+ (fabs(var->value - var->bound)>=epsilon_min_error && var->mu<epsilon_min_error))) {
+ WARN1("The KKT condition is not verified for var %p...",var);
+ overall_error=1.0;
+/* tmp = 0; */
+/* tmp = (var->value - var->bound); */
+/* if(tmp != 0.0 || var->mu != 0.0){ */
+/* WARN3("The flow (%p) doesn't match the KKT property, value expected (=0) got (lambda=%e) (sum_rho=%e)", var, var->mu, tmp); */
+/* } */
}
if(overall_error <= epsilon_min_error){
}
if(overall_error <= epsilon_min_error){
- DEBUG1("The method converge in %d iterations.", iteration);
+ DEBUG1("The method converges in %d iterations.", iteration);
}else{
WARN1("Method reach %d iterations, which is the maxmimun number of iterations allowed.", iteration);
}
}else{
WARN1("Method reach %d iterations, which is the maxmimun number of iterations allowed.", iteration);
}
lmm_variable_t var = NULL;
lmm_constraint_t cnst= (lmm_constraint_t) param_cnst;
double lambda_partial=0.0;
lmm_variable_t var = NULL;
lmm_constraint_t cnst= (lmm_constraint_t) param_cnst;
double lambda_partial=0.0;
elem_list = &(cnst->element_set);
elem_list = &(cnst->element_set);
if(var->weight<=0) continue;
//initilize de sumation variable
if(var->weight<=0) continue;
//initilize de sumation variable
//compute sigma_i of variable var
for(i=0; i<var->cnsts_number; i++){
//compute sigma_i of variable var
for(i=0; i<var->cnsts_number; i++){
- sigma_mu += (var->cnsts[i].constraint)->lambda;
+ sigma_i += (var->cnsts[i].constraint)->lambda;
}
//add mu_i if this flow has a RTT constraint associated
}
//add mu_i if this flow has a RTT constraint associated
- if(var->bound > 0) sigma_mu += var->mu;
+ if(var->bound > 0) sigma_i += var->mu;
//replace value of cnst->lambda by the value of parameter lambda
//replace value of cnst->lambda by the value of parameter lambda
- sigma_mu = (sigma_mu - cnst->lambda) + lambda;
+ sigma_i = (sigma_i - cnst->lambda) + lambda;
//use the auxiliar function passing (\sigma_i + \mu_i)
//use the auxiliar function passing (\sigma_i + \mu_i)
- lambda_partial += diff_aux(var, sigma_mu);
+ lambda_partial += diff_aux(var, sigma_i);
}
lambda_partial += cnst->bound;
}
lambda_partial += cnst->bound;
var->weight = weight;
var->bound = bound;
var->value = 0.0;
var->weight = weight;
var->bound = bound;
var->value = 0.0;
var->func_f = func_f_def;
var->func_fp = func_fp_def;
var->func_f = func_f_def;
var->func_fp = func_fp_def;
double res_fpi;
xbt_assert0( var->df, "Please report this bug.");
double res_fpi;
xbt_assert0( var->df, "Please report this bug.");
- //avoid a disaster value - c'est du bricolage mais ca marche
- if(x == 0) x = 10e-8;
+ //avoid a disaster value - c'est du bricolage mais ca marche pas ....
+ if(x == 0) x = 10e-16;
res_fpi = 1/(var->df*var->df*x) - 2/(3*var->df*var->df);
res_fpi = 1/(var->df*var->df*x) - 2/(3*var->df*var->df);
xbt_assert0(var->df,"Please report this bug.");
//avoid division by zero - c'est du bricolage mais ca marche
xbt_assert0(var->df,"Please report this bug.");
//avoid division by zero - c'est du bricolage mais ca marche
res_fpip = 1/(var->df*var->df*x) - 2/(3*var->df*var->df);
res_fpip = 1/(var->df*var->df*x) - 2/(3*var->df*var->df);
int cnsts_number;
double weight;
double bound;
int cnsts_number;
double weight;
double bound;
+ double value;
+ void *id;
+ int index; /* FOR SDP ONLY */
+ /* \begin{For Lagrange only} */
double mu;
double new_mu;
double mu;
double new_mu;
double df; /* Total delay of flow */
double df; /* Total delay of flow */
double (* func_f) (struct lmm_variable *var, double x); /* f */
double (* func_fp) (struct lmm_variable *var, double x); /* f' */
double (* func_fpi) (struct lmm_variable *var, double x); /* (f')^{-1} */
double (* func_fpip) (struct lmm_variable *var, double x); /* ((f')^{-1})' */
double (* func_f) (struct lmm_variable *var, double x); /* f */
double (* func_fp) (struct lmm_variable *var, double x); /* f' */
double (* func_fpi) (struct lmm_variable *var, double x); /* (f')^{-1} */
double (* func_fpip) (struct lmm_variable *var, double x); /* ((f')^{-1})' */
+ /* \end{For Lagrange only} */
} s_lmm_variable_t;
typedef struct lmm_system {
} s_lmm_variable_t;
typedef struct lmm_system {