]> AND Public Git Repository - simgrid.git/blobdiff - src/surf/network_cm02.cpp
Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
System: fix modified_set_ when selective_update is active
[simgrid.git] / src / surf / network_cm02.cpp
index edcfb57239b7f8d1d00c8206439e926de63608a0..fef1236760e6b033f74b52a99f53f3cb4bdc065e 100644 (file)
@@ -88,7 +88,8 @@ NetworkCm02Model::NetworkCm02Model(const std::string& name) : NetworkModel(name)
     select = true;
   }
 
-  set_maxmin_system(new lmm::System(select));
+  set_maxmin_system(lmm::System::build("maxmin", select));
+
   loopback_ = create_link("__loopback__", {config::get_value<double>("network/loopback-bw")});
   loopback_->set_sharing_policy(s4u::Link::SharingPolicy::FATPIPE, {});
   loopback_->set_latency(config::get_value<double>("network/loopback-lat"));
@@ -221,12 +222,21 @@ void NetworkCm02Model::comm_action_expand_constraints(const s4u::Host* src, cons
   }
 
   /* WI-FI links needs special treatment, do it here */
-  if (src_wifi_link != nullptr)
-    get_maxmin_system()->expand(src_wifi_link->get_constraint(), action->get_variable(),
-                                1.0 / src_wifi_link->get_host_rate(src));
-  if (dst_wifi_link != nullptr)
-    get_maxmin_system()->expand(dst_wifi_link->get_constraint(), action->get_variable(),
-                                1.0 / dst_wifi_link->get_host_rate(dst));
+  if (src_wifi_link != nullptr) {
+    /* In case of 0Mbps data rate, don't consider it in the LMM */
+    if (src_wifi_link->get_host_rate(src) > 0)
+      get_maxmin_system()->expand(src_wifi_link->get_constraint(), action->get_variable(),
+                                  1.0 / src_wifi_link->get_host_rate(src));
+    else
+      get_maxmin_system()->update_variable_penalty(action->get_variable(), 0);
+  }
+  if (dst_wifi_link != nullptr) {
+    if (dst_wifi_link->get_host_rate(dst) > 0)
+      get_maxmin_system()->expand(dst_wifi_link->get_constraint(), action->get_variable(),
+                                  1.0 / dst_wifi_link->get_host_rate(dst));
+    else
+      get_maxmin_system()->update_variable_penalty(action->get_variable(), 0);
+  }
 
   for (auto const* link : route) {
     if (link->get_sharing_policy() != s4u::Link::SharingPolicy::WIFI)
@@ -316,11 +326,10 @@ bool NetworkCm02Model::comm_get_route_info(const s4u::Host* src, const s4u::Host
 
   bool failed = std::any_of(route.begin(), route.end(), [](const StandardLinkImpl* link) { return not link->is_on(); });
 
-  if (cfg_crosstraffic) {
+  if (not failed && cfg_crosstraffic) {
     dst->route_to(src, back_route, nullptr);
-    if (not failed)
-      failed = std::any_of(back_route.begin(), back_route.end(),
-                           [](const StandardLinkImpl* link) { return not link->is_on(); });
+    failed = std::any_of(back_route.begin(), back_route.end(),
+                         [](const StandardLinkImpl* link) { return not link->is_on(); });
   }
   return failed;
 }