Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
match previous merge updates
[simgrid.git] / src / kernel / lmm / System.cpp
index 3f975662e30fb51d0416cb24c07401701ae1244c..5aa108295a2a66aea48b79c79602f310c37d7fa5 100644 (file)
@@ -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. */
@@ -30,7 +30,7 @@ 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) {
+  if (constraint->get_sharing_policy() == Constraint::SharingPolicy::WIFI) {
     return 1;
   }
 
@@ -62,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") {
@@ -275,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) {