X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/7d5684d9beee690cf3b1346b66ebb7a6429e0660..83f54f6317f4a731d5534216d9ffb51b69dd51c9:/src/kernel/lmm/maxmin.cpp diff --git a/src/kernel/lmm/maxmin.cpp b/src/kernel/lmm/maxmin.cpp index 7606426f65..1c7da75b30 100644 --- a/src/kernel/lmm/maxmin.cpp +++ b/src/kernel/lmm/maxmin.cpp @@ -10,6 +10,7 @@ #include "xbt/log.h" #include "xbt/mallocator.h" #include "xbt/sysdep.h" +#include "xbt/utility.hpp" #include #include #include @@ -29,7 +30,7 @@ namespace lmm { typedef std::vector dyn_light_t; -int s_lmm_variable_t::Global_debug_id = 1; +int Variable::Global_debug_id = 1; int s_lmm_constraint_t::Global_debug_id = 1; int s_lmm_element_t::get_concurrency() const @@ -88,7 +89,7 @@ void s_lmm_system_t::check_concurrency() const } // Check that for each variable, all corresponding elements are in the same state (i.e. same element sets) - for (s_lmm_variable_t const& var : variable_set) { + for (Variable const& var : variable_set) { if (var.cnsts.empty()) continue; @@ -121,18 +122,12 @@ void s_lmm_system_t::var_free(lmm_variable_t var) for (s_lmm_element_t& elem : var->cnsts) { if (var->sharing_weight > 0) elem.decrease_concurrency(); - if (elem.enabled_element_set_hook.is_linked()) { - auto& set = elem.constraint->enabled_element_set; - set.erase(set.iterator_to(elem)); - } - if (elem.disabled_element_set_hook.is_linked()) { - auto& set = elem.constraint->disabled_element_set; - set.erase(set.iterator_to(elem)); - } - if (elem.active_element_set_hook.is_linked()) { - auto& set = elem.constraint->active_element_set; - set.erase(set.iterator_to(elem)); - } + if (elem.enabled_element_set_hook.is_linked()) + simgrid::xbt::intrusive_erase(elem.constraint->enabled_element_set, elem); + if (elem.disabled_element_set_hook.is_linked()) + simgrid::xbt::intrusive_erase(elem.constraint->disabled_element_set, elem); + if (elem.active_element_set_hook.is_linked()) + simgrid::xbt::intrusive_erase(elem.constraint->active_element_set, elem); int nelements = elem.constraint->enabled_element_set.size() + elem.constraint->disabled_element_set.size(); if (nelements == 0) make_constraint_inactive(elem.constraint); @@ -150,9 +145,6 @@ void s_lmm_system_t::var_free(lmm_variable_t var) s_lmm_system_t::s_lmm_system_t(bool selective_update) : selective_update_active(selective_update) { - s_lmm_variable_t var; - s_lmm_constraint_t cnst; - modified = false; visited_counter = 1; @@ -189,8 +181,6 @@ void s_lmm_system_t::cnst_free(lmm_constraint_t cnst) s_lmm_constraint_t::s_lmm_constraint_t(void* id_value, double bound_value) : bound(bound_value), id(id_value) { - s_lmm_element_t elem; - id_int = Global_debug_id++; remaining = 0.0; @@ -214,7 +204,7 @@ lmm_constraint_t s_lmm_system_t::constraint_new(void* id, double bound_value) void* s_lmm_system_t::variable_mallocator_new_f() { - return new s_lmm_variable_t; + return new Variable; } void s_lmm_system_t::variable_mallocator_free_f(void* var) @@ -394,14 +384,14 @@ lmm_variable_t s_lmm_constraint_t::get_variable_safe(const_lmm_element_t* elem, // Look at enabled_element_set, and jump to disabled_element_set when finished auto iter = std::next(enabled_element_set.iterator_to(**elem)); if (iter != std::end(enabled_element_set)) - *elem = &*iter; + *nextelem = &*iter; else if (not disabled_element_set.empty()) - *elem = &disabled_element_set.front(); + *nextelem = &disabled_element_set.front(); else - *elem = nullptr; + *nextelem = nullptr; } else { auto iter = std::next(disabled_element_set.iterator_to(**elem)); - *elem = iter != std::end(disabled_element_set) ? &*iter : nullptr; + *nextelem = iter != std::end(disabled_element_set) ? &*iter : nullptr; } return (*elem)->variable; } else @@ -456,7 +446,7 @@ void s_lmm_system_t::print() const std::string buf = std::string("MAX-MIN ( "); /* Printing Objective */ - for (s_lmm_variable_t const& var : variable_set) + for (Variable const& var : variable_set) buf += "'" + std::to_string(var.id_int) + "'(" + std::to_string(var.sharing_weight) + ") "; buf += ")"; XBT_DEBUG("%20s", buf.c_str()); @@ -486,7 +476,7 @@ void s_lmm_system_t::print() const XBT_DEBUG("Variables"); /* Printing Result */ - for (s_lmm_variable_t const& var : variable_set) { + for (Variable const& var : variable_set) { if (var.bound > 0) { XBT_DEBUG("'%d'(%f) : %f (<=%f)", var.id_int, var.sharing_weight, var.value, var.bound); xbt_assert(not double_positive(var.value - var.bound, var.bound * sg_maxmin_precision), @@ -573,7 +563,7 @@ template void s_lmm_system_t::solve(CnstList& cnst_list) do { /* Fix the variables that have to be */ auto& var_list = saturated_variable_set; - for (s_lmm_variable_t const& var : var_list) { + for (Variable const& var : var_list) { if (var.sharing_weight <= 0.0) DIE_IMPOSSIBLE; /* First check if some of these variables could reach their upper bound and update min_bound accordingly. */ @@ -589,7 +579,7 @@ template void s_lmm_system_t::solve(CnstList& cnst_list) } while (not var_list.empty()) { - s_lmm_variable_t& var = var_list.front(); + Variable& var = var_list.front(); if (min_bound < 0) { // If no variable could reach its bound, deal iteratively the constraints usage ( at worst one constraint is // saturated at each cycle) @@ -724,8 +714,8 @@ void s_lmm_system_t::update_variable_bound(lmm_variable_t var, double bound) update_modified_set(var->cnsts[0].constraint); } -void s_lmm_variable_t::initialize(simgrid::surf::Action* id_value, double sharing_weight_value, double bound_value, - int number_of_constraints, unsigned visited_value) +void Variable::initialize(simgrid::surf::Action* id_value, double sharing_weight_value, double bound_value, + int number_of_constraints, unsigned visited_value) { id = id_value; id_int = Global_debug_id++; @@ -746,7 +736,7 @@ void s_lmm_variable_t::initialize(simgrid::surf::Action* id_value, double sharin xbt_assert(not saturated_variable_set_hook.is_linked()); } -int s_lmm_variable_t::get_min_concurrency_slack() const +int Variable::get_min_concurrency_slack() const { int minslack = std::numeric_limits::max(); for (s_lmm_element_t const& elem : cnsts) { @@ -775,11 +765,10 @@ void s_lmm_system_t::enable_var(lmm_variable_t var) // Enabling the variable, move var to list head. Subtlety is: here, we need to call update_modified_set AFTER // moving at least one element of var. - variable_set.erase(variable_set.iterator_to(*var)); + simgrid::xbt::intrusive_erase(variable_set, *var); variable_set.push_front(*var); for (s_lmm_element_t& elem : var->cnsts) { - auto& set = elem.constraint->disabled_element_set; - set.erase(set.iterator_to(elem)); + simgrid::xbt::intrusive_erase(elem.constraint->disabled_element_set, elem); elem.constraint->enabled_element_set.push_front(elem); elem.increase_concurrency(); } @@ -796,18 +785,15 @@ void s_lmm_system_t::disable_var(lmm_variable_t var) xbt_assert(not var->staged_weight, "Staged weight should have been cleared"); // Disabling the variable, move to var to list tail. Subtlety is: here, we need to call update_modified_set // BEFORE moving the last element of var. - variable_set.erase(variable_set.iterator_to(*var)); + simgrid::xbt::intrusive_erase(variable_set, *var); variable_set.push_back(*var); if (not var->cnsts.empty()) update_modified_set(var->cnsts[0].constraint); for (s_lmm_element_t& elem : var->cnsts) { - auto& set = elem.constraint->enabled_element_set; - set.erase(set.iterator_to(elem)); + simgrid::xbt::intrusive_erase(elem.constraint->enabled_element_set, elem); elem.constraint->disabled_element_set.push_back(elem); - if (elem.active_element_set_hook.is_linked()) { - auto& set = elem.constraint->active_element_set; - set.erase(set.iterator_to(elem)); - } + if (elem.active_element_set_hook.is_linked()) + simgrid::xbt::intrusive_erase(elem.constraint->active_element_set, elem); elem.decrease_concurrency(); } @@ -957,7 +943,7 @@ void s_lmm_system_t::remove_all_modified_set() // (i.e. not readibily reproducible, and requiring a lot of run time before happening). if (++visited_counter == 1) { /* the counter wrapped around, reset each variable->visited */ - for (s_lmm_variable_t& var : variable_set) + for (Variable& var : variable_set) var.visited = 0; } modified_constraint_set.clear();