X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/0f5828869a4c6d79018e8eca27a10d0fe51979e5..8cd6895f11e7da5ddbb04fbc117ae1f3244cca29:/src/kernel/lmm/lagrange.cpp diff --git a/src/kernel/lmm/lagrange.cpp b/src/kernel/lmm/lagrange.cpp index 7d2afe0e98..98b6fd2aeb 100644 --- a/src/kernel/lmm/lagrange.cpp +++ b/src/kernel/lmm/lagrange.cpp @@ -12,18 +12,15 @@ #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)"); -#define SHOW_EXPR(expr) XBT_CDEBUG(surf_lagrange, #expr " = %g", expr); -#define VEGAS_SCALING 1000.0 -#define RENO_SCALING 1.0 -#define RENO2_SCALING 1.0 +static constexpr double VEGAS_SCALING = 1000.0; +static constexpr double RENO_SCALING = 1.0; +static constexpr double RENO2_SCALING = 1.0; namespace simgrid { namespace kernel { @@ -33,20 +30,22 @@ double (*func_f_def)(const Variable&, double); double (*func_fp_def)(const Variable&, double); double (*func_fpi_def)(const Variable&, double); +System* make_new_lagrange_system(bool selective_update) +{ + return new Lagrange(selective_update); +} + /* * Local prototypes to implement the Lagrangian optimization with optimal step, also called dichotomy. */ -// solves the proportional fairness using a Lagrangian optimization with dichotomy step -void lagrange_solve(kernel::lmm::System* sys); // computes the value of the dichotomy using a initial values, init, with a specific variable or constraint static double dichotomy(double init, double diff(double, const Constraint&), const Constraint& cnst, double min_error); // 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; @@ -57,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) @@ -72,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) @@ -106,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) @@ -131,13 +129,14 @@ 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; } -void lagrange_solve(kernel::lmm::System* sys) +// solves the proportional fairness using a Lagrangian optimization with dichotomy step +void Lagrange::lagrange_solve() { /* Lagrange Variables. */ int max_iterations = 100; @@ -152,14 +151,14 @@ void lagrange_solve(kernel::lmm::System* sys) XBT_DEBUG("#### Minimum error tolerated (dichotomy) : %e", dichotomy_min_error); if (XBT_LOG_ISENABLED(surf_lagrange, xbt_log_priority_debug)) { - sys->print(); + print(); } - if (not sys->modified) + if (not modified) return; /* Initialize lambda. */ - auto& cnst_list = sys->active_constraint_set; + auto& cnst_list = active_constraint_set; for (Constraint& cnst : cnst_list) { cnst.lambda = 1.0; cnst.new_lambda = 2.0; @@ -169,7 +168,7 @@ void lagrange_solve(kernel::lmm::System* sys) /* * Initialize the var_list variable with only the active variables. Initialize mu. */ - auto& var_list = sys->variable_set; + auto& var_list = variable_set; for (Variable& var : var_list) { if (not var.sharing_weight) var.value = 0.0; @@ -194,7 +193,7 @@ void lagrange_solve(kernel::lmm::System* sys) } /* 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; @@ -211,7 +210,7 @@ void lagrange_solve(kernel::lmm::System* sys) 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; @@ -225,7 +224,7 @@ void lagrange_solve(kernel::lmm::System* sys) 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; @@ -248,12 +247,12 @@ void lagrange_solve(kernel::lmm::System* sys) } 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); @@ -263,7 +262,7 @@ void lagrange_solve(kernel::lmm::System* sys) } if (XBT_LOG_ISENABLED(surf_lagrange, xbt_log_priority_debug)) { - sys->print(); + print(); } }