X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/fc3e8ab9260b0b679e61a8d1071dff4782f74cca..3fafdab4bb94b48cb16c80690408a18f472e202b:/src/kernel/lmm/System.cpp diff --git a/src/kernel/lmm/System.cpp b/src/kernel/lmm/System.cpp index 7d803082fb..5aa108295a 100644 --- a/src/kernel/lmm/System.cpp +++ b/src/kernel/lmm/System.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2004-2022. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2004-2023. The SimGrid Team. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ @@ -17,9 +17,7 @@ double sg_maxmin_precision = 1E-5; /* Change this with --cfg=maxmin/precision:VA double sg_surf_precision = 1E-9; /* Change this with --cfg=surf/precision:VALUE */ int sg_concurrency_limit = -1; /* Change this with --cfg=maxmin/concurrency-limit:VALUE */ -namespace simgrid { -namespace kernel { -namespace lmm { +namespace simgrid::kernel::lmm { int Variable::next_rank_ = 1; int Constraint::next_rank_ = 1; @@ -31,6 +29,11 @@ Element::Element(Constraint* constraint, Variable* variable, double cweight) int Element::get_concurrency() const { + // just to try having the computation of the concurrency + if (constraint->get_sharing_policy() == Constraint::SharingPolicy::WIFI) { + return 1; + } + // Ignore element with weight less than one (e.g. cross-traffic) return (consumption_weight >= 1) ? 1 : 0; // There are other alternatives, but they will change the behavior of the model.. @@ -59,7 +62,7 @@ void Element::increase_concurrency(bool check_limit) "Concurrency limit overflow!"); } -System* System::build(const std::string& solver_name, bool selective_update) +System* System::build(std::string_view solver_name, bool selective_update) { System* system = nullptr; if (solver_name == "bmf") { @@ -176,9 +179,10 @@ System::System(bool selective_update) : selective_update_active(selective_update System::~System() { while (Variable* var = extract_variable()) { - std::string demangled = boost::core::demangle(var->id_ ? typeid(*var->id_).name() : "(unidentified)"); - XBT_WARN("Probable bug: a %s variable (#%d) not removed before the LMM system destruction.", demangled.c_str(), - var->rank_); + const char* name = var->id_ ? typeid(*var->id_).name() : "(unidentified)"; + boost::core::scoped_demangled_name demangled(name); + XBT_WARN("Probable bug: a %s variable (#%d) not removed before the LMM system destruction.", + demangled.get() ? demangled.get() : name, var->rank_); var_free(var); } while (Constraint* cnst = extract_constraint()) @@ -271,18 +275,20 @@ Element& System::expand_add_to_elem(Element& elem, const Constraint* cnst, doubl return elem; } -void System::expand(Constraint* cnst, Variable* var, double consumption_weight) +void System::expand(Constraint* cnst, Variable* var, double consumption_weight, bool force_creation) { modified_ = true; auto elem_it = std::find_if(begin(var->cnsts_), end(var->cnsts_), [&cnst](Element const& x) { return x.constraint == cnst; }); - if (elem_it != end(var->cnsts_) && var->sharing_penalty_ != 0.0) { + + bool reuse_elem = elem_it != end(var->cnsts_) && not force_creation; + if (reuse_elem && var->sharing_penalty_ != 0.0) { /* before changing it, decreases concurrency on constraint, it'll be added back later */ elem_it->decrease_concurrency(); } - Element& elem = elem_it != end(var->cnsts_) ? expand_add_to_elem(*elem_it, cnst, consumption_weight) - : expand_create_elem(cnst, var, consumption_weight); + Element& elem = reuse_elem ? expand_add_to_elem(*elem_it, cnst, consumption_weight) + : expand_create_elem(cnst, var, consumption_weight); // Check if we need to disable the variable if (var->sharing_penalty_ != 0) { @@ -317,8 +323,6 @@ Variable* Constraint::get_variable(const Element** elem) const *elem = &enabled_element_set_.front(); else if (not disabled_element_set_.empty()) *elem = &disabled_element_set_.front(); - else - *elem = nullptr; } else { // elem is not null, so we carry on if ((*elem)->enabled_element_set_hook.is_linked()) { @@ -351,8 +355,6 @@ Variable* Constraint::get_variable_safe(const Element** elem, const Element** ne *elem = &enabled_element_set_.front(); else if (not disabled_element_set_.empty()) *elem = &disabled_element_set_.front(); - else - *elem = nullptr; } else { *elem = *nextelem; if (*numelem > 0) { @@ -759,12 +761,10 @@ double Constraint::get_usage() const void Constraint::set_sharing_policy(SharingPolicy policy, const s4u::NonLinearResourceCb& cb) { - xbt_assert(policy == SharingPolicy::NONLINEAR || not cb, + xbt_assert(policy == SharingPolicy::NONLINEAR || policy == SharingPolicy::WIFI || not cb, "Invalid sharing policy for constraint. Callback should be used with NONLINEAR sharing policy"); sharing_policy_ = policy; dyn_constraint_cb_ = cb; } -} // namespace lmm -} // namespace kernel -} // namespace simgrid +} // namespace simgrid::kernel::lmm