X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/3b7443ac913c549dfeba60b2fc381800b493a67b..8cd6895f11e7da5ddbb04fbc117ae1f3244cca29:/src/kernel/lmm/lagrange.cpp diff --git a/src/kernel/lmm/lagrange.cpp b/src/kernel/lmm/lagrange.cpp index 939e3cc284..98b6fd2aeb 100644 --- a/src/kernel/lmm/lagrange.cpp +++ b/src/kernel/lmm/lagrange.cpp @@ -12,10 +12,8 @@ #include "xbt/sysdep.h" #include -#include -#ifndef MATH #include -#endif +#include XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_lagrange, surf, "Logging specific to SURF (lagrange)"); XBT_LOG_NEW_SUBCATEGORY(surf_lagrange_dichotomy, surf_lagrange, "Logging specific to SURF (lagrange dichotomy)"); @@ -45,10 +43,9 @@ static double dichotomy(double init, double diff(double, const Constraint&), con // computes the value of the differential of constraint cnst applied to lambda static double partial_diff_lambda(double lambda, const Constraint& cnst); -template -static int __check_feasible(const CnstList& cnst_list, const VarList& var_list, int warn) +bool Lagrange::check_feasible(bool warn) { - for (Constraint const& cnst : cnst_list) { + for (Constraint const& cnst : active_constraint_set) { double tmp = 0; for (Element const& elem : cnst.enabled_element_set) { Variable* var = elem.variable; @@ -59,12 +56,12 @@ static int __check_feasible(const CnstList& cnst_list, const VarList& var_list, if (double_positive(tmp - cnst.bound, sg_maxmin_precision)) { if (warn) XBT_WARN("The link (%p) is over-used. Expected less than %f and got %f", &cnst, cnst.bound, tmp); - return 0; + return false; } XBT_DEBUG("Checking feasability for constraint (%p): sat = %f, lambda = %f ", &cnst, tmp - cnst.bound, cnst.lambda); } - for (Variable const& var : var_list) { + for (Variable const& var : variable_set) { if (not var.sharing_weight) break; if (var.bound < 0) @@ -74,10 +71,10 @@ static int __check_feasible(const CnstList& cnst_list, const VarList& var_list, if (double_positive(var.value - var.bound, sg_maxmin_precision)) { if (warn) XBT_WARN("The variable (%p) is too large. Expected less than %f and got %f", &var, var.bound, var.value); - return 0; + return false; } } - return 1; + return true; } static double new_value(const Variable& var) @@ -108,12 +105,11 @@ static double new_mu(const Variable& var) return mu_i; } -template -static double dual_objective(const VarList& var_list, const CnstList& cnst_list) +double Lagrange::dual_objective() { double obj = 0.0; - for (Variable const& var : var_list) { + for (Variable const& var : variable_set) { double sigma_i = 0.0; if (not var.sharing_weight) @@ -133,7 +129,7 @@ static double dual_objective(const VarList& var_list, const CnstList& cnst_list) obj += var.mu * var.bound; } - for (Constraint const& cnst : cnst_list) + for (Constraint const& cnst : active_constraint_set) obj += cnst.lambda * cnst.bound; return obj; @@ -197,7 +193,7 @@ void Lagrange::lagrange_solve() } /* Compute dual objective. */ - double obj = dual_objective(var_list, cnst_list); + double obj = dual_objective(); /* While doesn't reach a minimum error or a number maximum of iterations. */ int iteration = 0; @@ -214,7 +210,7 @@ void Lagrange::lagrange_solve() XBT_DEBUG("Updating mu : var->mu (%p) : %1.20f -> %1.20f", &var, var.mu, var.new_mu); var.mu = var.new_mu; - double new_obj = dual_objective(var_list, cnst_list); + double new_obj = dual_objective(); XBT_DEBUG("Improvement for Objective (%g -> %g) : %g", obj, new_obj, obj - new_obj); xbt_assert(obj - new_obj >= -epsilon_min_error, "Our gradient sucks! (%1.20f)", obj - new_obj); obj = new_obj; @@ -228,7 +224,7 @@ void Lagrange::lagrange_solve() XBT_DEBUG("Updating lambda : cnst->lambda (%p) : %1.20f -> %1.20f", &cnst, cnst.lambda, cnst.new_lambda); cnst.lambda = cnst.new_lambda; - double new_obj = dual_objective(var_list, cnst_list); + double new_obj = dual_objective(); XBT_DEBUG("Improvement for Objective (%g -> %g) : %g", obj, new_obj, obj - new_obj); xbt_assert(obj - new_obj >= -epsilon_min_error, "Our gradient sucks! (%1.20f)", obj - new_obj); obj = new_obj; @@ -251,12 +247,12 @@ void Lagrange::lagrange_solve() } XBT_DEBUG("-------------- Check feasability ----------"); - if (not __check_feasible(cnst_list, var_list, 0)) + if (not check_feasible(false)) overall_modification = 1.0; XBT_DEBUG("Iteration %d: overall_modification : %f", iteration, overall_modification); } - __check_feasible(cnst_list, var_list, 1); + check_feasible(true); if (overall_modification <= epsilon_min_error) { XBT_DEBUG("The method converges in %d iterations.", iteration);