Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
No more types for models.
[simgrid.git] / src / surf / network_cm02.cpp
index a63e676..4e45f4d 100644 (file)
@@ -4,8 +4,11 @@
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "src/surf/network_cm02.hpp"
+#include "simgrid/kernel/routing/NetZoneImpl.hpp"
+#include "simgrid/s4u/Engine.hpp"
 #include "simgrid/s4u/Host.hpp"
 #include "simgrid/sg_config.hpp"
+#include "src/kernel/EngineImpl.hpp"
 #include "src/kernel/resource/profile/Event.hpp"
 #include "src/surf/network_wifi.hpp"
 #include "src/surf/surf_interface.hpp"
@@ -16,9 +19,9 @@
 
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(res_network);
 
-double sg_latency_factor = 1.0; /* default value; can be set by model or from command line */
-double sg_bandwidth_factor = 1.0;       /* default value; can be set by model or from command line */
-double sg_weight_S_parameter = 0.0;     /* default value; can be set by model or from command line */
+double sg_latency_factor     = 1.0; /* default value; can be set by model or from command line */
+double sg_bandwidth_factor   = 1.0; /* default value; can be set by model or from command line */
+double sg_weight_S_parameter = 0.0; /* default value; can be set by model or from command line */
 
 /************************************************************************/
 /* New model based on optimizations discussed during Pedro Velho's thesis*/
@@ -36,9 +39,10 @@ double sg_weight_S_parameter = 0.0;     /* default value; can be set by model or
 /*  } */
 void surf_network_model_init_LegrandVelho()
 {
-  xbt_assert(surf_network_model == nullptr, "Cannot set the network model twice");
-
-  surf_network_model = new simgrid::kernel::resource::NetworkCm02Model();
+  auto net_model = std::make_shared<simgrid::kernel::resource::NetworkCm02Model>();
+  net_model->set_name("Network_LegrandVelho");
+  simgrid::kernel::EngineImpl::get_instance()->add_model(net_model, {});
+  simgrid::s4u::Engine::get_instance()->get_netzone_root()->get_impl()->set_network_model(net_model);
 
   simgrid::config::set_default<double>("network/latency-factor", 13.01);
   simgrid::config::set_default<double>("network/bandwidth-factor", 0.97);
@@ -58,13 +62,14 @@ void surf_network_model_init_LegrandVelho()
 /* } */
 void surf_network_model_init_CM02()
 {
-  xbt_assert(surf_network_model == nullptr, "Cannot set the network model twice");
-
   simgrid::config::set_default<double>("network/latency-factor", 1.0);
   simgrid::config::set_default<double>("network/bandwidth-factor", 1.0);
   simgrid::config::set_default<double>("network/weight-S", 0.0);
 
-  surf_network_model = new simgrid::kernel::resource::NetworkCm02Model();
+  auto net_model = std::make_shared<simgrid::kernel::resource::NetworkCm02Model>();
+  net_model->set_name("Network_CM02");
+  simgrid::kernel::EngineImpl::get_instance()->add_model(net_model, {});
+  simgrid::s4u::Engine::get_instance()->get_netzone_root()->get_impl()->set_network_model(net_model);
 }
 
 namespace simgrid {
@@ -72,35 +77,40 @@ namespace kernel {
 namespace resource {
 
 NetworkCm02Model::NetworkCm02Model()
-    : NetworkModel(simgrid::config::get_value<std::string>("network/optim") == "Full" ? Model::UpdateAlgo::FULL
-                                                                                      : Model::UpdateAlgo::LAZY)
 {
-  all_existing_models.push_back(this);
+  if (config::get_value<std::string>("network/optim") == "Lazy")
+    set_update_algorithm(Model::UpdateAlgo::LAZY);
 
-  std::string optim = simgrid::config::get_value<std::string>("network/optim");
-  bool select       = simgrid::config::get_value<bool>("network/maxmin-selective-update");
+  std::string optim = config::get_value<std::string>("network/optim");
+  bool select       = config::get_value<bool>("network/maxmin-selective-update");
 
   if (optim == "Lazy") {
-    xbt_assert(select || simgrid::config::is_default("network/maxmin-selective-update"),
+    xbt_assert(select || config::is_default("network/maxmin-selective-update"),
                "You cannot disable network selective update when using the lazy update mechanism");
     select = true;
   }
 
   set_maxmin_system(new lmm::System(select));
-  loopback_ = NetworkCm02Model::create_link("__loopback__", 
-                                            std::vector<double>{simgrid::config::get_value<double>("network/loopback-bw")},
-                                            s4u::Link::SharingPolicy::FATPIPE)->set_latency(simgrid::config::get_value<double>("network/loopback-lat"));
+  loopback_ = NetworkCm02Model::create_link("__loopback__",
+                                            std::vector<double>{config::get_value<double>("network/loopback-bw")},
+                                            s4u::Link::SharingPolicy::FATPIPE)
+                  ->set_latency(config::get_value<double>("network/loopback-lat"));
   loopback_->seal();
 }
 
 LinkImpl* NetworkCm02Model::create_link(const std::string& name, const std::vector<double>& bandwidths,
                                         s4u::Link::SharingPolicy policy)
 {
-  if (policy == s4u::Link::SharingPolicy::WIFI)
-    return new NetworkWifiLink(this, name, bandwidths, get_maxmin_system());
+  LinkImpl* link;
+  if (policy == s4u::Link::SharingPolicy::WIFI) {
+    link = new NetworkWifiLink(name, bandwidths, get_maxmin_system());
+  } else {
+    xbt_assert(bandwidths.size() == 1, "Non-WIFI links must use only 1 bandwidth.");
+    link = new NetworkCm02Link(name, bandwidths[0], policy, get_maxmin_system());
+  }
 
-  xbt_assert(bandwidths.size() == 1, "Non-WIFI links must use only 1 bandwidth.");
-  return new NetworkCm02Link(this, name, bandwidths[0], policy, get_maxmin_system());
+  link->set_model(this);
+  return link;
 }
 
 void NetworkCm02Model::update_actions_state_lazy(double now, double /*delta*/)
@@ -215,9 +225,9 @@ Action* NetworkCm02Model::communicate(s4u::Host* src, s4u::Host* dst, double siz
     action = new NetworkCm02Action(this, *src, *dst, size, failed);
   else
     action = new NetworkWifiAction(this, *src, *dst, size, failed, src_wifi_link, dst_wifi_link);
-  action->sharing_penalty_  = latency;
-  action->latency_ = latency;
-  action->rate_ = rate;
+  action->sharing_penalty_ = latency;
+  action->latency_         = latency;
+  action->set_user_bound(rate);
 
   if (is_update_lazy()) {
     action->set_last_update();
@@ -237,7 +247,7 @@ Action* NetworkCm02Model::communicate(s4u::Host* src, s4u::Host* dst, double siz
 
   action->lat_current_ = action->latency_;
   action->latency_ *= get_latency_factor(size);
-  action->rate_ = get_bandwidth_constraint(action->rate_, bandwidth_bound, size);
+  action->set_user_bound(get_bandwidth_constraint(action->get_user_bound(), bandwidth_bound, size));
 
   size_t constraints_per_variable = route.size();
   constraints_per_variable += back_route.size();
@@ -256,14 +266,14 @@ Action* NetworkCm02Model::communicate(s4u::Host* src, s4u::Host* dst, double siz
   } else
     action->set_variable(get_maxmin_system()->variable_new(action, 1.0, -1.0, constraints_per_variable));
 
-  if (action->rate_ < 0) {
+  if (action->get_user_bound() < 0) {
     get_maxmin_system()->update_variable_bound(
         action->get_variable(), (action->lat_current_ > 0) ? cfg_tcp_gamma / (2.0 * action->lat_current_) : -1.0);
   } else {
     get_maxmin_system()->update_variable_bound(
         action->get_variable(), (action->lat_current_ > 0)
-                                    ? std::min(action->rate_, cfg_tcp_gamma / (2.0 * action->lat_current_))
-                                    : action->rate_);
+                                    ? std::min(action->get_user_bound(), cfg_tcp_gamma / (2.0 * action->lat_current_))
+                                    : action->get_user_bound());
   }
 
   if (src_wifi_link != nullptr)
@@ -308,12 +318,13 @@ Action* NetworkCm02Model::communicate(s4u::Host* src, s4u::Host* dst, double siz
 /************
  * Resource *
  ************/
-NetworkCm02Link::NetworkCm02Link(NetworkCm02Model* model, const std::string& name, double bandwidth,
-                                 s4u::Link::SharingPolicy policy, kernel::lmm::System* system)
-    : LinkImpl(model, name, system->constraint_new(this, sg_bandwidth_factor * bandwidth))
+NetworkCm02Link::NetworkCm02Link(const std::string& name, double bandwidth, s4u::Link::SharingPolicy policy,
+                                 kernel::lmm::System* system)
+    : LinkImpl(name)
 {
   bandwidth_.scale = 1.0;
   bandwidth_.peak  = bandwidth;
+  this->set_constraint(system->constraint_new(this, sg_bandwidth_factor * bandwidth));
 
   if (policy == s4u::Link::SharingPolicy::FATPIPE)
     get_constraint()->unshare();
@@ -356,11 +367,10 @@ void NetworkCm02Link::set_bandwidth(double value)
   if (sg_weight_S_parameter > 0) {
     double delta = sg_weight_S_parameter / value - sg_weight_S_parameter / (bandwidth_.peak * bandwidth_.scale);
 
-    const kernel::lmm::Variable* var;
     const kernel::lmm::Element* elem     = nullptr;
     const kernel::lmm::Element* nextelem = nullptr;
-    int numelem                  = 0;
-    while ((var = get_constraint()->get_variable_safe(&elem, &nextelem, &numelem))) {
+    int numelem                          = 0;
+    while (const auto* var = get_constraint()->get_variable_safe(&elem, &nextelem, &numelem)) {
       auto* action = static_cast<NetworkCm02Action*>(var->get_id());
       action->sharing_penalty_ += delta;
       if (not action->is_suspended())
@@ -373,27 +383,27 @@ LinkImpl* NetworkCm02Link::set_latency(double value)
 {
   latency_check(value);
 
-  double delta                 = value - latency_.peak;
-  const kernel::lmm::Variable* var;
+  double delta = value - latency_.peak;
   const kernel::lmm::Element* elem     = nullptr;
   const kernel::lmm::Element* nextelem = nullptr;
-  int numelem                  = 0;
+  int numelem                          = 0;
 
   latency_.scale = 1.0;
-  latency_.peak = value;
+  latency_.peak  = value;
 
-  while ((var = get_constraint()->get_variable_safe(&elem, &nextelem, &numelem))) {
+  while (const auto* var = get_constraint()->get_variable_safe(&elem, &nextelem, &numelem)) {
     auto* action = static_cast<NetworkCm02Action*>(var->get_id());
     action->lat_current_ += delta;
     action->sharing_penalty_ += delta;
-    if (action->rate_ < 0)
+    if (action->get_user_bound() < 0)
       get_model()->get_maxmin_system()->update_variable_bound(action->get_variable(), NetworkModel::cfg_tcp_gamma /
                                                                                           (2.0 * action->lat_current_));
     else {
       get_model()->get_maxmin_system()->update_variable_bound(
-          action->get_variable(), std::min(action->rate_, NetworkModel::cfg_tcp_gamma / (2.0 * action->lat_current_)));
+          action->get_variable(),
+          std::min(action->get_user_bound(), NetworkModel::cfg_tcp_gamma / (2.0 * action->lat_current_)));
 
-      if (action->rate_ < NetworkModel::cfg_tcp_gamma / (2.0 * action->lat_current_)) {
+      if (action->get_user_bound() < NetworkModel::cfg_tcp_gamma / (2.0 * action->lat_current_)) {
         XBT_INFO("Flow is limited BYBANDWIDTH");
       } else {
         XBT_INFO("Flow is limited BYLATENCY, latency of flow is %f", action->lat_current_);