Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
zero wifi rate
authorClément Courageux-Sudan <clement.courageux-sudan@inria.fr>
Wed, 2 Feb 2022 11:11:58 +0000 (12:11 +0100)
committerClément Courageux-Sudan <clement.courageux-sudan@inria.fr>
Wed, 2 Feb 2022 11:11:58 +0000 (12:11 +0100)
include/simgrid/s4u/Link.hpp
src/kernel/resource/WifiLinkImpl.cpp
src/surf/network_cm02.cpp

index fec2d9a..acb4092 100644 (file)
@@ -122,7 +122,10 @@ public:
    * current function to specify that a given host uses another level of bandwidth. This can be used to take the
    * location of hosts into account, or even to model mobility in your SimGrid simulation.
    *
-   * Note that this function asserts that the link is actually a wifi link */
+   * Note that this function asserts that the link is actually a wifi link
+   *
+   * warning: in the case where a 0Mbps data rate should be used, set that rate only once during the
+   * experiment, and don't modify the bandwidth of that host later */
   void set_host_wifi_rate(const s4u::Host* host, int level) const;
 
   /** @brief Returns the current load (in bytes per second) */
index 9ef1733..f4c9b75 100644 (file)
@@ -77,7 +77,7 @@ void WifiLinkImpl::refresh_decay_bandwidths()
     double min_bw     = bandwidth.peak - (wifi_max_rate_ - wifi_min_rate_);
     double model_rate = bandwidth.peak - (wifi_max_rate_ - model_rate_);
 
-    xbt_assert(min_bw > 0, "Your WIFI link is using bandwidth(s) which is too low for the decay model.");
+    //xbt_assert(min_bw > 0, "Your WIFI link is using bandwidth(s) which is too low for the decay model.");
 
     double N0     = max_bw - min_bw;
     double lambda = (-log(model_rate - min_bw) + log(N0)) / model_n_;
index 3c24efa..29604a5 100644 (file)
@@ -221,12 +221,22 @@ 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)