Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
FatTreeZone: Add limiters for switches
authorBruno Donassolo <bruno.donassolo@inria.fr>
Tue, 4 May 2021 12:53:41 +0000 (14:53 +0200)
committerBruno Donassolo <bruno.donassolo@inria.fr>
Tue, 4 May 2021 16:04:49 +0000 (18:04 +0200)
Users can set limiters for switches (elements whose level > 0) in Fat-Tree.

Coordinates in Fat-tree are now characterized by: <level, id>, level 0
elements are the leaves (processing nodes).

Uniform limiter behavior in routes: src, destination and middle nodes.

Changes in tests:
1) cluster-multicpu: adjust timing due to new limiters.

2) flatifier tests must be adapted for these reasons:
  - Changed callback to create limiters from XML. Radicals in XML are valid for leaves in the tree. Use internal ID instead.
  - Changed order of links in the route from get_local_route of Fat-trees.

examples/cpp/clusters-multicpu/s4u-clusters-multicpu.cpp
examples/cpp/clusters-multicpu/s4u-clusters-multicpu.tesh
include/simgrid/kernel/routing/FatTreeZone.hpp
src/kernel/routing/FatTreeZone.cpp
src/surf/sg_platf.cpp
teshsuite/simdag/flatifier/flatifier.tesh

index c5477b3..849148e 100644 (file)
@@ -129,7 +129,7 @@ create_hostzone(const sg4::NetZone* zone, const std::vector<unsigned int>& /*coo
  * @param id Internal identifier in the torus (for information)
  * @return Limiter link
  */
-static sg4::Link* create_limiter(sg4::NetZone* zone, const std::vector<unsigned int>& /*coord*/, int id)
+static sg4::Link* create_limiter(sg4::NetZone* zone, const std::vector<unsigned int>& coord, int id)
 {
   return zone->create_link("limiter-" + std::to_string(id), 1e9)->seal();
 }
@@ -192,12 +192,17 @@ static void create_torus_cluster()
  *
  *
  *                         S3     S4                <-- Level 1 routers
- *                        /   \  /  \
- *                       /     /\    \
- *   link: 10GBps -->   |    /    \   |
- *   (full-duplex)      |  /        \ |
+ *    link:limiter -      /   \  /  \
+ *                       +     ++    +
+ *    link: 10GBps -->  |     /  \    |
+ *     (full-duplex)    |    /    \   |
+ *                      +   +      +  +
+ *                      |  /        \ |
  *                      S1           S2             <-- Level 2 routers
- *  link:10GBps  -->  / | \         / | \
+ *   link:limiter ->    |             |
+ *                      +             +
+ *  link:10GBps  -->   /|\           /|\
+ *                    / | \         / | \
  *                   +  +  +       +  +  +
  *  link:limiter -> /   |   \     /   |   \
  *                 A    B    C   D    E    F        <-- Nodes
@@ -208,16 +213,14 @@ static void create_torus_cluster()
  * 2) link: 10Gbs link connecting the components (created automatically)
  *
  * For example, a communication from A to C goes through:
- * <tt> A->limiter(A)->link(A-S1)->link(S1-C)->->limiter(C)->C</tt>
+ * <tt> A->limiter(A)->link(A-S1)->limiter(S1)->link(S1-C)->->limiter(C)->C</tt>
  *
  * More precisely, considering that A and C are StarZones, a
  * communication from A-CPU-3 to C-CPU-7 goes through:
  * 1) StarZone A: A-CPU-3 -> link-up-A-CPU-3 -> A-CPU-0
- * 2) A-CPU-0->limiter(A)->link(A-S1)->link(S1-C)->limiter(C)->C-CPU-0
+ * 2) A-CPU-0->limiter(A)->link(A-S1)->limiter(S1)->link(S1-C)->limiter(C)->C-CPU-0
  * 3) StarZone C: C-CPU-0-> link-down-C-CPU-7 -> C-CPU-7
  *
- * Note that limiters are only valid for leaves, not routers.
- *
  * More details in: <a href="https://simgrid.org/doc/latest/Platform_examples.html#fat-tree-cluster">Fat-Tree
  * Cluster</a>
  */
index 5470ce6..d8d75a3 100644 (file)
@@ -78,18 +78,18 @@ $ ${bindir:=.}/s4u-clusters-multicpu fatTree
 > [host0-cpu2:receiver-host0-cpu2:(4) 0.000083] [s4u_torus_multicpu/INFO] I got a 'Hello, I'm alive and running on host0-cpu0'.
 > [host0-cpu1:receiver-host0-cpu1:(3) 0.000083] [s4u_torus_multicpu/INFO] I got a 'Hello, I'm alive and running on host0-cpu0'.
 > [host0-cpu0:receiver-host0-cpu0:(2) 0.000083] [s4u_torus_multicpu/INFO] I got a 'Hello, I'm alive and running on host0-cpu0'.
-> [host1-cpu0:receiver-host1-cpu0:(10) 0.033296] [s4u_torus_multicpu/INFO] I got a 'Hello, I'm alive and running on host0-cpu0'.
-> [host1-cpu7:receiver-host1-cpu7:(17) 0.033504] [s4u_torus_multicpu/INFO] I got a 'Hello, I'm alive and running on host0-cpu0'.
-> [host1-cpu6:receiver-host1-cpu6:(16) 0.033504] [s4u_torus_multicpu/INFO] I got a 'Hello, I'm alive and running on host0-cpu0'.
-> [host1-cpu5:receiver-host1-cpu5:(15) 0.033504] [s4u_torus_multicpu/INFO] I got a 'Hello, I'm alive and running on host0-cpu0'.
-> [host1-cpu4:receiver-host1-cpu4:(14) 0.033504] [s4u_torus_multicpu/INFO] I got a 'Hello, I'm alive and running on host0-cpu0'.
-> [host1-cpu3:receiver-host1-cpu3:(13) 0.033504] [s4u_torus_multicpu/INFO] I got a 'Hello, I'm alive and running on host0-cpu0'.
-> [host1-cpu2:receiver-host1-cpu2:(12) 0.033504] [s4u_torus_multicpu/INFO] I got a 'Hello, I'm alive and running on host0-cpu0'.
-> [host1-cpu1:receiver-host1-cpu1:(11) 0.033504] [s4u_torus_multicpu/INFO] I got a 'Hello, I'm alive and running on host0-cpu0'.
-> [host5-cpu0:receiver-host5-cpu0:(42) 0.043420] [s4u_torus_multicpu/INFO] I got a 'Hello, I'm alive and running on host0-cpu0'.
-> [host4-cpu0:receiver-host4-cpu0:(34) 0.043420] [s4u_torus_multicpu/INFO] I got a 'Hello, I'm alive and running on host0-cpu0'.
-> [host3-cpu0:receiver-host3-cpu0:(26) 0.043420] [s4u_torus_multicpu/INFO] I got a 'Hello, I'm alive and running on host0-cpu0'.
-> [host2-cpu0:receiver-host2-cpu0:(18) 0.043420] [s4u_torus_multicpu/INFO] I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [host1-cpu0:receiver-host1-cpu0:(10) 0.027921] [s4u_torus_multicpu/INFO] I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [host1-cpu7:receiver-host1-cpu7:(17) 0.028052] [s4u_torus_multicpu/INFO] I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [host1-cpu6:receiver-host1-cpu6:(16) 0.028052] [s4u_torus_multicpu/INFO] I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [host1-cpu5:receiver-host1-cpu5:(15) 0.028052] [s4u_torus_multicpu/INFO] I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [host1-cpu4:receiver-host1-cpu4:(14) 0.028052] [s4u_torus_multicpu/INFO] I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [host1-cpu3:receiver-host1-cpu3:(13) 0.028052] [s4u_torus_multicpu/INFO] I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [host1-cpu2:receiver-host1-cpu2:(12) 0.028052] [s4u_torus_multicpu/INFO] I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [host1-cpu1:receiver-host1-cpu1:(11) 0.028052] [s4u_torus_multicpu/INFO] I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [host5-cpu0:receiver-host5-cpu0:(42) 0.043476] [s4u_torus_multicpu/INFO] I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [host4-cpu0:receiver-host4-cpu0:(34) 0.043476] [s4u_torus_multicpu/INFO] I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [host3-cpu0:receiver-host3-cpu0:(26) 0.043476] [s4u_torus_multicpu/INFO] I got a 'Hello, I'm alive and running on host0-cpu0'.
+> [host2-cpu0:receiver-host2-cpu0:(18) 0.043476] [s4u_torus_multicpu/INFO] I got a 'Hello, I'm alive and running on host0-cpu0'.
 > [host5-cpu7:receiver-host5-cpu7:(49) 0.043559] [s4u_torus_multicpu/INFO] I got a 'Hello, I'm alive and running on host0-cpu0'.
 > [host5-cpu6:receiver-host5-cpu6:(48) 0.043559] [s4u_torus_multicpu/INFO] I got a 'Hello, I'm alive and running on host0-cpu0'.
 > [host5-cpu5:receiver-host5-cpu5:(47) 0.043559] [s4u_torus_multicpu/INFO] I got a 'Hello, I'm alive and running on host0-cpu0'.
index 911f92a..05c3474 100644 (file)
@@ -122,8 +122,8 @@ class XBT_PRIVATE FatTreeZone : public ClusterZone {
 
   void add_link(FatTreeNode* parent, unsigned int parent_port, FatTreeNode* child, unsigned int child_port);
   int get_level_position(const unsigned int level);
+  void generate_switches(const s4u::ClusterCallbacks& set_callbacks);
   void generate_labels();
-  void generate_switches();
   int connect_node_to_parents(FatTreeNode* node);
   bool are_related(FatTreeNode* parent, FatTreeNode* child) const;
   bool is_in_sub_tree(FatTreeNode* root, FatTreeNode* node) const;
@@ -150,6 +150,12 @@ public:
   void set_topology(unsigned int n_levels, const std::vector<unsigned int>& down_links,
                     const std::vector<unsigned int>& up_links, const std::vector<unsigned int>& link_count);
   void add_processing_node(int id, resource::LinkImpl* limiter, resource::LinkImpl* loopback);
+  /**
+   * @brief Build upper levels (switchs) in Fat-Tree
+   *
+   * Suppose that set_topology and add_processing_node have already been called
+   */
+  void build_upper_levels(const s4u::ClusterCallbacks& set_callbacks);
   void generate_dot_file(const std::string& filename = "fat_tree.dot") const;
 };
 } // namespace routing
index b7df0d1..2aa3799 100644 (file)
@@ -89,13 +89,15 @@ void FatTreeZone::get_local_route(NetPoint* src, NetPoint* dst, Route* into, dou
 
     int k = this->num_parents_per_node_[currentNode->level];
     d     = d % k;
+
+    if (currentNode->limiter_link_)
+      into->link_list_.push_back(currentNode->limiter_link_);
+
     into->link_list_.push_back(currentNode->parents[d]->up_link_);
 
     if (latency)
       *latency += currentNode->parents[d]->up_link_->get_latency();
 
-    if (currentNode->limiter_link_)
-      into->link_list_.push_back(currentNode->limiter_link_);
     currentNode = currentNode->parents[d]->up_node_;
   }
 
@@ -106,69 +108,75 @@ void FatTreeZone::get_local_route(NetPoint* src, NetPoint* dst, Route* into, dou
   while (currentNode != destination) {
     for (unsigned int i = 0; i < currentNode->children.size(); i++) {
       if (i % this->num_children_per_node_[currentNode->level - 1] == destination->label[currentNode->level - 1]) {
+
         into->link_list_.push_back(currentNode->children[i]->down_link_);
+
+        if (currentNode->limiter_link_)
+          into->link_list_.push_back(currentNode->limiter_link_);
+
         if (latency)
           *latency += currentNode->children[i]->down_link_->get_latency();
         currentNode = currentNode->children[i]->down_node_;
-        if (currentNode->limiter_link_)
-          into->link_list_.push_back(currentNode->limiter_link_);
         XBT_DEBUG("%d(%u,%u) is accessible through %d(%u,%u)", destination->id, destination->level,
                   destination->position, currentNode->id, currentNode->level, currentNode->position);
       }
     }
   }
+  if (currentNode->limiter_link_) { // limiter for receiver/destination
+    into->link_list_.push_back(currentNode->limiter_link_);
+  }
   // set gateways (if any)
   into->gw_src_ = get_gateway(src->id());
   into->gw_dst_ = get_gateway(dst->id());
 }
 
-/* This function makes the assumption that parse_specific_arguments() and
- * addNodes() have already been called
- */
+void FatTreeZone::build_upper_levels(const s4u::ClusterCallbacks& set_callbacks)
+{
+  generate_switches(set_callbacks);
+  generate_labels();
+
+  unsigned int k = 0;
+  // Nodes are totally ordered, by level and then by position, in this->nodes
+  for (unsigned int i = 0; i < levels_; i++) {
+    for (unsigned int j = 0; j < nodes_by_level_[i]; j++) {
+      connect_node_to_parents(nodes_[k]);
+      k++;
+    }
+  }
+}
+
 void FatTreeZone::do_seal()
 {
   if (this->levels_ == 0) {
     return;
   }
-  this->generate_switches();
-
-  if (XBT_LOG_ISENABLED(surf_route_fat_tree, xbt_log_priority_debug)) {
-    std::stringstream msgBuffer;
+  if (not XBT_LOG_ISENABLED(surf_route_fat_tree, xbt_log_priority_debug)) {
+    return;
+  }
 
-    msgBuffer << "We are creating a fat tree of " << this->levels_ << " levels "
-              << "with " << this->nodes_by_level_[0] << " processing nodes";
-    for (unsigned int i = 1; i <= this->levels_; i++) {
-      msgBuffer << ", " << this->nodes_by_level_[i] << " switches at level " << i;
-    }
-    XBT_DEBUG("%s", msgBuffer.str().c_str());
-    msgBuffer.str("");
-    msgBuffer << "Nodes are : ";
+  /* for debugging purpose only, Fat-Tree is already build when seal is called */
+  std::stringstream msgBuffer;
 
-    for (FatTreeNode const* node : this->nodes_) {
-      msgBuffer << node->id << "(" << node->level << "," << node->position << ") ";
-    }
-    XBT_DEBUG("%s", msgBuffer.str().c_str());
+  msgBuffer << "We are creating a fat tree of " << this->levels_ << " levels "
+            << "with " << this->nodes_by_level_[0] << " processing nodes";
+  for (unsigned int i = 1; i <= this->levels_; i++) {
+    msgBuffer << ", " << this->nodes_by_level_[i] << " switches at level " << i;
   }
+  XBT_DEBUG("%s", msgBuffer.str().c_str());
+  msgBuffer.str("");
+  msgBuffer << "Nodes are : ";
 
-  this->generate_labels();
-
-  unsigned int k = 0;
-  // Nodes are totally ordered, by level and then by position, in this->nodes
-  for (unsigned int i = 0; i < this->levels_; i++) {
-    for (unsigned int j = 0; j < this->nodes_by_level_[i]; j++) {
-      this->connect_node_to_parents(this->nodes_[k]);
-      k++;
-    }
+  for (FatTreeNode const* node : this->nodes_) {
+    msgBuffer << node->id << "(" << node->level << "," << node->position << ") ";
   }
+  XBT_DEBUG("%s", msgBuffer.str().c_str());
 
-  if (XBT_LOG_ISENABLED(surf_route_fat_tree, xbt_log_priority_debug)) {
-    std::stringstream msgBuffer;
-    msgBuffer << "Links are : ";
-    for (FatTreeLink const* link : this->links_) {
-      msgBuffer << "(" << link->up_node_->id << "," << link->down_node_->id << ") ";
-    }
-    XBT_DEBUG("%s", msgBuffer.str().c_str());
+  msgBuffer.clear();
+  msgBuffer << "Links are : ";
+  for (FatTreeLink const* link : this->links_) {
+    msgBuffer << "(" << link->up_node_->id << "," << link->down_node_->id << ") ";
   }
+  XBT_DEBUG("%s", msgBuffer.str().c_str());
 }
 
 int FatTreeZone::connect_node_to_parents(FatTreeNode* node)
@@ -227,7 +235,7 @@ bool FatTreeZone::are_related(FatTreeNode* parent, FatTreeNode* child) const
   return true;
 }
 
-void FatTreeZone::generate_switches()
+void FatTreeZone::generate_switches(const s4u::ClusterCallbacks& set_callbacks)
 {
   XBT_DEBUG("Generating switches.");
   this->nodes_by_level_.resize(this->levels_ + 1, 0);
@@ -259,7 +267,14 @@ void FatTreeZone::generate_switches()
   int k = 0;
   for (unsigned int i = 0; i < this->levels_; i++) {
     for (unsigned int j = 0; j < this->nodes_by_level_[i + 1]; j++) {
-      auto* newNode = new FatTreeNode(--k, i + 1, j, nullptr, nullptr);
+      kernel::resource::LinkImpl* limiter = nullptr;
+      int id                              = --k;
+      if (set_callbacks.limiter) {
+        auto* s4u_link = set_callbacks.limiter(get_iface(), {i + 1, j}, id);
+        if (s4u_link)
+          limiter = s4u_link->get_impl();
+      }
+      auto* newNode = new FatTreeNode(id, i + 1, j, limiter, nullptr);
       XBT_DEBUG("We create the switch %d(%u,%u)", newNode->id, newNode->level, newNode->position);
       newNode->children.resize(this->num_children_per_node_[i] * this->num_port_lower_level_[i]);
       if (i != this->levels_ - 1) {
@@ -514,14 +529,16 @@ NetZone* create_fatTree_zone(const std::string& name, const NetZone* parent, con
   zone->set_link_characteristics(bandwidth, latency, sharing_policy);
 
   /* populating it */
-  int tot_elements = std::accumulate(params.down.begin(), params.down.end(), 1, std::multiplies<>());
-  for (int i = 0; i < tot_elements; i++) {
+  unsigned int tot_elements = std::accumulate(params.down.begin(), params.down.end(), 1, std::multiplies<>());
+  for (unsigned int i = 0; i < tot_elements; i++) {
     kernel::routing::NetPoint* netpoint;
     Link* limiter;
     Link* loopback;
-    zone->fill_leaf_from_cb(i, params.down, set_callbacks, &netpoint, &loopback, &limiter);
+    /* coordinates are based on 2 indexes: number of levels and id */
+    zone->fill_leaf_from_cb(i, {params.levels + 1, tot_elements}, set_callbacks, &netpoint, &loopback, &limiter);
     zone->add_processing_node(i, limiter ? limiter->get_impl() : nullptr, loopback ? loopback->get_impl() : nullptr);
   }
+  zone->build_upper_levels(set_callbacks);
 
   return zone->get_iface();
 }
index 371892e..e63fc05 100644 (file)
@@ -195,13 +195,7 @@ static simgrid::s4u::Link* sg_platf_cluster_create_limiter(const simgrid::kernel
                                                            simgrid::s4u::NetZone* zone,
                                                            const std::vector<unsigned int>& /*coord*/, int id)
 {
-  xbt_assert(static_cast<unsigned long>(id) < cluster->radicals.size(),
-             "Zone(%s): error when creating limiter for host number %d in the zone. Insufficient number of radicals "
-             "available "
-             "(total = %zu). Check the 'radical' parameter in XML",
-             cluster->id.c_str(), id, cluster->radicals.size());
-
-  std::string link_id = std::string(cluster->id) + "_link_" + std::to_string(cluster->radicals[id]) + "_limiter";
+  std::string link_id = std::string(cluster->id) + "_link_" + std::to_string(id) + "_limiter";
   XBT_DEBUG("Cluster: creating limiter link=%s bw=%f", link_id.c_str(), cluster->limiter_link);
 
   simgrid::s4u::Link* limiter = zone->create_link(link_id, cluster->limiter_link)->seal();
index 4e10390..eaf3ef5 100644 (file)
@@ -1228,12 +1228,12 @@ $ ${bindir:=.}/flatifier ../platforms/cluster_dragonfly_noncontiguous_rad.xml "-
 >   <link id="black_link_in_group_0_between_chassis_0_and_1_blade_1_7_UP" bandwidth="375000000" latency="0.000050000"/>
 >   <link id="bob_cluster_link_0_limiter" bandwidth="150000000" latency="0.000000000"/>
 >   <link id="bob_cluster_link_0_loopback" bandwidth="100000000" latency="0.000000000" sharing_policy="FATPIPE"/>
->   <link id="bob_cluster_link_1002_limiter" bandwidth="150000000" latency="0.000000000"/>
 >   <link id="bob_cluster_link_1002_loopback" bandwidth="100000000" latency="0.000000000" sharing_policy="FATPIPE"/>
->   <link id="bob_cluster_link_1003_limiter" bandwidth="150000000" latency="0.000000000"/>
 >   <link id="bob_cluster_link_1003_loopback" bandwidth="100000000" latency="0.000000000" sharing_policy="FATPIPE"/>
->   <link id="bob_cluster_link_1004_limiter" bandwidth="150000000" latency="0.000000000"/>
 >   <link id="bob_cluster_link_1004_loopback" bandwidth="100000000" latency="0.000000000" sharing_policy="FATPIPE"/>
+>   <link id="bob_cluster_link_1_limiter" bandwidth="150000000" latency="0.000000000"/>
+>   <link id="bob_cluster_link_2_limiter" bandwidth="150000000" latency="0.000000000"/>
+>   <link id="bob_cluster_link_3_limiter" bandwidth="150000000" latency="0.000000000"/>
 >   <link id="green_link_in_chassis_0_between_routers_0_and_1_4_DOWN" bandwidth="125000000" latency="0.000050000"/>
 >   <link id="green_link_in_chassis_0_between_routers_0_and_1_4_UP" bandwidth="125000000" latency="0.000050000"/>
 >   <link id="green_link_in_chassis_1_between_routers_0_and_1_5_DOWN" bandwidth="125000000" latency="0.000050000"/>
@@ -1250,46 +1250,46 @@ $ ${bindir:=.}/flatifier ../platforms/cluster_dragonfly_noncontiguous_rad.xml "-
 >   <link_ctn id="bob_cluster_link_0_loopback"/>
 >   </route>
 >   <route src="node-0.simgrid.org" dst="node-1002.simgrid.org">
->   <link_ctn id="local_link_from_router_0_to_node_0_0_UP"/><link_ctn id="bob_cluster_link_0_limiter"/><link_ctn id="green_link_in_chassis_0_between_routers_0_and_1_4_UP"/><link_ctn id="bob_cluster_link_1002_limiter"/><link_ctn id="local_link_from_router_1_to_node_0_1_DOWN"/>
+>   <link_ctn id="local_link_from_router_0_to_node_0_0_UP"/><link_ctn id="bob_cluster_link_0_limiter"/><link_ctn id="green_link_in_chassis_0_between_routers_0_and_1_4_UP"/><link_ctn id="bob_cluster_link_1_limiter"/><link_ctn id="local_link_from_router_1_to_node_0_1_DOWN"/>
 >   </route>
 >   <route src="node-0.simgrid.org" dst="node-1003.simgrid.org">
->   <link_ctn id="local_link_from_router_0_to_node_0_0_UP"/><link_ctn id="bob_cluster_link_0_limiter"/><link_ctn id="black_link_in_group_0_between_chassis_0_and_1_blade_0_6_UP"/><link_ctn id="bob_cluster_link_1003_limiter"/><link_ctn id="local_link_from_router_2_to_node_0_2_DOWN"/>
+>   <link_ctn id="local_link_from_router_0_to_node_0_0_UP"/><link_ctn id="bob_cluster_link_0_limiter"/><link_ctn id="black_link_in_group_0_between_chassis_0_and_1_blade_0_6_UP"/><link_ctn id="bob_cluster_link_2_limiter"/><link_ctn id="local_link_from_router_2_to_node_0_2_DOWN"/>
 >   </route>
 >   <route src="node-0.simgrid.org" dst="node-1004.simgrid.org">
->   <link_ctn id="local_link_from_router_0_to_node_0_0_UP"/><link_ctn id="bob_cluster_link_0_limiter"/><link_ctn id="green_link_in_chassis_0_between_routers_0_and_1_4_UP"/><link_ctn id="black_link_in_group_0_between_chassis_0_and_1_blade_1_7_UP"/><link_ctn id="bob_cluster_link_1004_limiter"/><link_ctn id="local_link_from_router_3_to_node_0_3_DOWN"/>
+>   <link_ctn id="local_link_from_router_0_to_node_0_0_UP"/><link_ctn id="bob_cluster_link_0_limiter"/><link_ctn id="green_link_in_chassis_0_between_routers_0_and_1_4_UP"/><link_ctn id="black_link_in_group_0_between_chassis_0_and_1_blade_1_7_UP"/><link_ctn id="bob_cluster_link_3_limiter"/><link_ctn id="local_link_from_router_3_to_node_0_3_DOWN"/>
 >   </route>
 >   <route src="node-1002.simgrid.org" dst="node-0.simgrid.org">
->   <link_ctn id="local_link_from_router_1_to_node_0_1_UP"/><link_ctn id="bob_cluster_link_1002_limiter"/><link_ctn id="green_link_in_chassis_0_between_routers_0_and_1_4_DOWN"/><link_ctn id="bob_cluster_link_0_limiter"/><link_ctn id="local_link_from_router_0_to_node_0_0_DOWN"/>
+>   <link_ctn id="local_link_from_router_1_to_node_0_1_UP"/><link_ctn id="bob_cluster_link_1_limiter"/><link_ctn id="green_link_in_chassis_0_between_routers_0_and_1_4_DOWN"/><link_ctn id="bob_cluster_link_0_limiter"/><link_ctn id="local_link_from_router_0_to_node_0_0_DOWN"/>
 >   </route>
 >   <route src="node-1002.simgrid.org" dst="node-1002.simgrid.org">
 >   <link_ctn id="bob_cluster_link_1002_loopback"/>
 >   </route>
 >   <route src="node-1002.simgrid.org" dst="node-1003.simgrid.org">
->   <link_ctn id="local_link_from_router_1_to_node_0_1_UP"/><link_ctn id="bob_cluster_link_1002_limiter"/><link_ctn id="green_link_in_chassis_0_between_routers_0_and_1_4_DOWN"/><link_ctn id="black_link_in_group_0_between_chassis_0_and_1_blade_0_6_UP"/><link_ctn id="bob_cluster_link_1003_limiter"/><link_ctn id="local_link_from_router_2_to_node_0_2_DOWN"/>
+>   <link_ctn id="local_link_from_router_1_to_node_0_1_UP"/><link_ctn id="bob_cluster_link_1_limiter"/><link_ctn id="green_link_in_chassis_0_between_routers_0_and_1_4_DOWN"/><link_ctn id="black_link_in_group_0_between_chassis_0_and_1_blade_0_6_UP"/><link_ctn id="bob_cluster_link_2_limiter"/><link_ctn id="local_link_from_router_2_to_node_0_2_DOWN"/>
 >   </route>
 >   <route src="node-1002.simgrid.org" dst="node-1004.simgrid.org">
->   <link_ctn id="local_link_from_router_1_to_node_0_1_UP"/><link_ctn id="bob_cluster_link_1002_limiter"/><link_ctn id="black_link_in_group_0_between_chassis_0_and_1_blade_1_7_UP"/><link_ctn id="bob_cluster_link_1004_limiter"/><link_ctn id="local_link_from_router_3_to_node_0_3_DOWN"/>
+>   <link_ctn id="local_link_from_router_1_to_node_0_1_UP"/><link_ctn id="bob_cluster_link_1_limiter"/><link_ctn id="black_link_in_group_0_between_chassis_0_and_1_blade_1_7_UP"/><link_ctn id="bob_cluster_link_3_limiter"/><link_ctn id="local_link_from_router_3_to_node_0_3_DOWN"/>
 >   </route>
 >   <route src="node-1003.simgrid.org" dst="node-0.simgrid.org">
->   <link_ctn id="local_link_from_router_2_to_node_0_2_UP"/><link_ctn id="bob_cluster_link_1003_limiter"/><link_ctn id="black_link_in_group_0_between_chassis_0_and_1_blade_0_6_DOWN"/><link_ctn id="bob_cluster_link_0_limiter"/><link_ctn id="local_link_from_router_0_to_node_0_0_DOWN"/>
+>   <link_ctn id="local_link_from_router_2_to_node_0_2_UP"/><link_ctn id="bob_cluster_link_2_limiter"/><link_ctn id="black_link_in_group_0_between_chassis_0_and_1_blade_0_6_DOWN"/><link_ctn id="bob_cluster_link_0_limiter"/><link_ctn id="local_link_from_router_0_to_node_0_0_DOWN"/>
 >   </route>
 >   <route src="node-1003.simgrid.org" dst="node-1002.simgrid.org">
->   <link_ctn id="local_link_from_router_2_to_node_0_2_UP"/><link_ctn id="bob_cluster_link_1003_limiter"/><link_ctn id="green_link_in_chassis_1_between_routers_0_and_1_5_UP"/><link_ctn id="bob_cluster_link_1002_limiter"/><link_ctn id="local_link_from_router_1_to_node_0_1_DOWN"/>
+>   <link_ctn id="local_link_from_router_2_to_node_0_2_UP"/><link_ctn id="bob_cluster_link_2_limiter"/><link_ctn id="green_link_in_chassis_1_between_routers_0_and_1_5_UP"/><link_ctn id="bob_cluster_link_1_limiter"/><link_ctn id="local_link_from_router_1_to_node_0_1_DOWN"/>
 >   </route>
 >   <route src="node-1003.simgrid.org" dst="node-1003.simgrid.org">
 >   <link_ctn id="bob_cluster_link_1003_loopback"/>
 >   </route>
 >   <route src="node-1003.simgrid.org" dst="node-1004.simgrid.org">
->   <link_ctn id="local_link_from_router_2_to_node_0_2_UP"/><link_ctn id="bob_cluster_link_1003_limiter"/><link_ctn id="green_link_in_chassis_1_between_routers_0_and_1_5_UP"/><link_ctn id="black_link_in_group_0_between_chassis_0_and_1_blade_1_7_UP"/><link_ctn id="bob_cluster_link_1004_limiter"/><link_ctn id="local_link_from_router_3_to_node_0_3_DOWN"/>
+>   <link_ctn id="local_link_from_router_2_to_node_0_2_UP"/><link_ctn id="bob_cluster_link_2_limiter"/><link_ctn id="green_link_in_chassis_1_between_routers_0_and_1_5_UP"/><link_ctn id="black_link_in_group_0_between_chassis_0_and_1_blade_1_7_UP"/><link_ctn id="bob_cluster_link_3_limiter"/><link_ctn id="local_link_from_router_3_to_node_0_3_DOWN"/>
 >   </route>
 >   <route src="node-1004.simgrid.org" dst="node-0.simgrid.org">
->   <link_ctn id="local_link_from_router_3_to_node_0_3_UP"/><link_ctn id="bob_cluster_link_1004_limiter"/><link_ctn id="green_link_in_chassis_1_between_routers_0_and_1_5_DOWN"/><link_ctn id="bob_cluster_link_0_limiter"/><link_ctn id="local_link_from_router_0_to_node_0_0_DOWN"/>
+>   <link_ctn id="local_link_from_router_3_to_node_0_3_UP"/><link_ctn id="bob_cluster_link_3_limiter"/><link_ctn id="green_link_in_chassis_1_between_routers_0_and_1_5_DOWN"/><link_ctn id="bob_cluster_link_0_limiter"/><link_ctn id="local_link_from_router_0_to_node_0_0_DOWN"/>
 >   </route>
 >   <route src="node-1004.simgrid.org" dst="node-1002.simgrid.org">
->   <link_ctn id="local_link_from_router_3_to_node_0_3_UP"/><link_ctn id="bob_cluster_link_1004_limiter"/><link_ctn id="black_link_in_group_0_between_chassis_0_and_1_blade_1_7_DOWN"/><link_ctn id="bob_cluster_link_1002_limiter"/><link_ctn id="local_link_from_router_1_to_node_0_1_DOWN"/>
+>   <link_ctn id="local_link_from_router_3_to_node_0_3_UP"/><link_ctn id="bob_cluster_link_3_limiter"/><link_ctn id="black_link_in_group_0_between_chassis_0_and_1_blade_1_7_DOWN"/><link_ctn id="bob_cluster_link_1_limiter"/><link_ctn id="local_link_from_router_1_to_node_0_1_DOWN"/>
 >   </route>
 >   <route src="node-1004.simgrid.org" dst="node-1003.simgrid.org">
->   <link_ctn id="local_link_from_router_3_to_node_0_3_UP"/><link_ctn id="bob_cluster_link_1004_limiter"/><link_ctn id="green_link_in_chassis_1_between_routers_0_and_1_5_DOWN"/><link_ctn id="black_link_in_group_0_between_chassis_0_and_1_blade_0_6_UP"/><link_ctn id="bob_cluster_link_1003_limiter"/><link_ctn id="local_link_from_router_2_to_node_0_2_DOWN"/>
+>   <link_ctn id="local_link_from_router_3_to_node_0_3_UP"/><link_ctn id="bob_cluster_link_3_limiter"/><link_ctn id="green_link_in_chassis_1_between_routers_0_and_1_5_DOWN"/><link_ctn id="black_link_in_group_0_between_chassis_0_and_1_blade_0_6_UP"/><link_ctn id="bob_cluster_link_2_limiter"/><link_ctn id="local_link_from_router_2_to_node_0_2_DOWN"/>
 >   </route>
 >   <route src="node-1004.simgrid.org" dst="node-1004.simgrid.org">
 >   <link_ctn id="bob_cluster_link_1004_loopback"/>
@@ -1307,14 +1307,18 @@ $ ${bindir:=.}/flatifier ../platforms/cluster_fat_tree_noncontiguous_rad.xml "--
 >   <host id="node-119.simgrid.org" speed="1000000000"/>
 >   <host id="node-120.simgrid.org" speed="1000000000"/>
 >   <link id="__loopback__" bandwidth="10000000000" latency="0.000000000" sharing_policy="FATPIPE"/>
->   <link id="bob_cluster_link_100_limiter" bandwidth="50000000" latency="0.000000000"/>
+>   <link id="bob_cluster_link_-1_limiter" bandwidth="50000000" latency="0.000000000"/>
+>   <link id="bob_cluster_link_-2_limiter" bandwidth="50000000" latency="0.000000000"/>
+>   <link id="bob_cluster_link_-3_limiter" bandwidth="50000000" latency="0.000000000"/>
+>   <link id="bob_cluster_link_-4_limiter" bandwidth="50000000" latency="0.000000000"/>
+>   <link id="bob_cluster_link_0_limiter" bandwidth="50000000" latency="0.000000000"/>
 >   <link id="bob_cluster_link_100_loopback" bandwidth="100000000" latency="0.000000000" sharing_policy="FATPIPE"/>
->   <link id="bob_cluster_link_101_limiter" bandwidth="50000000" latency="0.000000000"/>
 >   <link id="bob_cluster_link_101_loopback" bandwidth="100000000" latency="0.000000000" sharing_policy="FATPIPE"/>
->   <link id="bob_cluster_link_119_limiter" bandwidth="50000000" latency="0.000000000"/>
 >   <link id="bob_cluster_link_119_loopback" bandwidth="100000000" latency="0.000000000" sharing_policy="FATPIPE"/>
->   <link id="bob_cluster_link_120_limiter" bandwidth="50000000" latency="0.000000000"/>
 >   <link id="bob_cluster_link_120_loopback" bandwidth="100000000" latency="0.000000000" sharing_policy="FATPIPE"/>
+>   <link id="bob_cluster_link_1_limiter" bandwidth="50000000" latency="0.000000000"/>
+>   <link id="bob_cluster_link_2_limiter" bandwidth="50000000" latency="0.000000000"/>
+>   <link id="bob_cluster_link_3_limiter" bandwidth="50000000" latency="0.000000000"/>
 >   <link id="link_from_-1_-3_4_DOWN" bandwidth="125000000" latency="0.000050000"/>
 >   <link id="link_from_-1_-3_4_UP" bandwidth="125000000" latency="0.000050000"/>
 >   <link id="link_from_-1_-3_5_DOWN" bandwidth="125000000" latency="0.000050000"/>
@@ -1343,46 +1347,46 @@ $ ${bindir:=.}/flatifier ../platforms/cluster_fat_tree_noncontiguous_rad.xml "--
 >   <link_ctn id="bob_cluster_link_100_loopback"/>
 >   </route>
 >   <route src="node-100.simgrid.org" dst="node-101.simgrid.org">
->   <link_ctn id="link_from_0_-1_0_UP"/><link_ctn id="bob_cluster_link_100_limiter"/><link_ctn id="link_from_1_-1_1_DOWN"/><link_ctn id="bob_cluster_link_101_limiter"/>
+>   <link_ctn id="bob_cluster_link_0_limiter"/><link_ctn id="link_from_0_-1_0_UP"/><link_ctn id="link_from_1_-1_1_DOWN"/><link_ctn id="bob_cluster_link_-1_limiter"/><link_ctn id="bob_cluster_link_1_limiter"/>
 >   </route>
 >   <route src="node-100.simgrid.org" dst="node-119.simgrid.org">
->   <link_ctn id="link_from_0_-1_0_UP"/><link_ctn id="bob_cluster_link_100_limiter"/><link_ctn id="link_from_-1_-3_4_UP"/><link_ctn id="link_from_-2_-3_8_DOWN"/><link_ctn id="link_from_2_-2_2_DOWN"/><link_ctn id="bob_cluster_link_119_limiter"/>
+>   <link_ctn id="bob_cluster_link_0_limiter"/><link_ctn id="link_from_0_-1_0_UP"/><link_ctn id="bob_cluster_link_-1_limiter"/><link_ctn id="link_from_-1_-3_4_UP"/><link_ctn id="link_from_-2_-3_8_DOWN"/><link_ctn id="bob_cluster_link_-3_limiter"/><link_ctn id="link_from_2_-2_2_DOWN"/><link_ctn id="bob_cluster_link_-2_limiter"/><link_ctn id="bob_cluster_link_2_limiter"/>
 >   </route>
 >   <route src="node-100.simgrid.org" dst="node-120.simgrid.org">
->   <link_ctn id="link_from_0_-1_0_UP"/><link_ctn id="bob_cluster_link_100_limiter"/><link_ctn id="link_from_-1_-4_6_UP"/><link_ctn id="link_from_-2_-4_10_DOWN"/><link_ctn id="link_from_3_-2_3_DOWN"/><link_ctn id="bob_cluster_link_120_limiter"/>
+>   <link_ctn id="bob_cluster_link_0_limiter"/><link_ctn id="link_from_0_-1_0_UP"/><link_ctn id="bob_cluster_link_-1_limiter"/><link_ctn id="link_from_-1_-4_6_UP"/><link_ctn id="link_from_-2_-4_10_DOWN"/><link_ctn id="bob_cluster_link_-4_limiter"/><link_ctn id="link_from_3_-2_3_DOWN"/><link_ctn id="bob_cluster_link_-2_limiter"/><link_ctn id="bob_cluster_link_3_limiter"/>
 >   </route>
 >   <route src="node-101.simgrid.org" dst="node-100.simgrid.org">
->   <link_ctn id="link_from_1_-1_1_UP"/><link_ctn id="bob_cluster_link_101_limiter"/><link_ctn id="link_from_0_-1_0_DOWN"/><link_ctn id="bob_cluster_link_100_limiter"/>
+>   <link_ctn id="bob_cluster_link_1_limiter"/><link_ctn id="link_from_1_-1_1_UP"/><link_ctn id="link_from_0_-1_0_DOWN"/><link_ctn id="bob_cluster_link_-1_limiter"/><link_ctn id="bob_cluster_link_0_limiter"/>
 >   </route>
 >   <route src="node-101.simgrid.org" dst="node-101.simgrid.org">
 >   <link_ctn id="bob_cluster_link_101_loopback"/>
 >   </route>
 >   <route src="node-101.simgrid.org" dst="node-119.simgrid.org">
->   <link_ctn id="link_from_1_-1_1_UP"/><link_ctn id="bob_cluster_link_101_limiter"/><link_ctn id="link_from_-1_-3_4_UP"/><link_ctn id="link_from_-2_-3_8_DOWN"/><link_ctn id="link_from_2_-2_2_DOWN"/><link_ctn id="bob_cluster_link_119_limiter"/>
+>   <link_ctn id="bob_cluster_link_1_limiter"/><link_ctn id="link_from_1_-1_1_UP"/><link_ctn id="bob_cluster_link_-1_limiter"/><link_ctn id="link_from_-1_-3_4_UP"/><link_ctn id="link_from_-2_-3_8_DOWN"/><link_ctn id="bob_cluster_link_-3_limiter"/><link_ctn id="link_from_2_-2_2_DOWN"/><link_ctn id="bob_cluster_link_-2_limiter"/><link_ctn id="bob_cluster_link_2_limiter"/>
 >   </route>
 >   <route src="node-101.simgrid.org" dst="node-120.simgrid.org">
->   <link_ctn id="link_from_1_-1_1_UP"/><link_ctn id="bob_cluster_link_101_limiter"/><link_ctn id="link_from_-1_-4_6_UP"/><link_ctn id="link_from_-2_-4_10_DOWN"/><link_ctn id="link_from_3_-2_3_DOWN"/><link_ctn id="bob_cluster_link_120_limiter"/>
+>   <link_ctn id="bob_cluster_link_1_limiter"/><link_ctn id="link_from_1_-1_1_UP"/><link_ctn id="bob_cluster_link_-1_limiter"/><link_ctn id="link_from_-1_-4_6_UP"/><link_ctn id="link_from_-2_-4_10_DOWN"/><link_ctn id="bob_cluster_link_-4_limiter"/><link_ctn id="link_from_3_-2_3_DOWN"/><link_ctn id="bob_cluster_link_-2_limiter"/><link_ctn id="bob_cluster_link_3_limiter"/>
 >   </route>
 >   <route src="node-119.simgrid.org" dst="node-100.simgrid.org">
->   <link_ctn id="link_from_2_-2_2_UP"/><link_ctn id="bob_cluster_link_119_limiter"/><link_ctn id="link_from_-2_-3_8_UP"/><link_ctn id="link_from_-1_-3_4_DOWN"/><link_ctn id="link_from_0_-1_0_DOWN"/><link_ctn id="bob_cluster_link_100_limiter"/>
+>   <link_ctn id="bob_cluster_link_2_limiter"/><link_ctn id="link_from_2_-2_2_UP"/><link_ctn id="bob_cluster_link_-2_limiter"/><link_ctn id="link_from_-2_-3_8_UP"/><link_ctn id="link_from_-1_-3_4_DOWN"/><link_ctn id="bob_cluster_link_-3_limiter"/><link_ctn id="link_from_0_-1_0_DOWN"/><link_ctn id="bob_cluster_link_-1_limiter"/><link_ctn id="bob_cluster_link_0_limiter"/>
 >   </route>
 >   <route src="node-119.simgrid.org" dst="node-101.simgrid.org">
->   <link_ctn id="link_from_2_-2_2_UP"/><link_ctn id="bob_cluster_link_119_limiter"/><link_ctn id="link_from_-2_-4_10_UP"/><link_ctn id="link_from_-1_-4_6_DOWN"/><link_ctn id="link_from_1_-1_1_DOWN"/><link_ctn id="bob_cluster_link_101_limiter"/>
+>   <link_ctn id="bob_cluster_link_2_limiter"/><link_ctn id="link_from_2_-2_2_UP"/><link_ctn id="bob_cluster_link_-2_limiter"/><link_ctn id="link_from_-2_-4_10_UP"/><link_ctn id="link_from_-1_-4_6_DOWN"/><link_ctn id="bob_cluster_link_-4_limiter"/><link_ctn id="link_from_1_-1_1_DOWN"/><link_ctn id="bob_cluster_link_-1_limiter"/><link_ctn id="bob_cluster_link_1_limiter"/>
 >   </route>
 >   <route src="node-119.simgrid.org" dst="node-119.simgrid.org">
 >   <link_ctn id="bob_cluster_link_119_loopback"/>
 >   </route>
 >   <route src="node-119.simgrid.org" dst="node-120.simgrid.org">
->   <link_ctn id="link_from_2_-2_2_UP"/><link_ctn id="bob_cluster_link_119_limiter"/><link_ctn id="link_from_3_-2_3_DOWN"/><link_ctn id="bob_cluster_link_120_limiter"/>
+>   <link_ctn id="bob_cluster_link_2_limiter"/><link_ctn id="link_from_2_-2_2_UP"/><link_ctn id="link_from_3_-2_3_DOWN"/><link_ctn id="bob_cluster_link_-2_limiter"/><link_ctn id="bob_cluster_link_3_limiter"/>
 >   </route>
 >   <route src="node-120.simgrid.org" dst="node-100.simgrid.org">
->   <link_ctn id="link_from_3_-2_3_UP"/><link_ctn id="bob_cluster_link_120_limiter"/><link_ctn id="link_from_-2_-3_8_UP"/><link_ctn id="link_from_-1_-3_4_DOWN"/><link_ctn id="link_from_0_-1_0_DOWN"/><link_ctn id="bob_cluster_link_100_limiter"/>
+>   <link_ctn id="bob_cluster_link_3_limiter"/><link_ctn id="link_from_3_-2_3_UP"/><link_ctn id="bob_cluster_link_-2_limiter"/><link_ctn id="link_from_-2_-3_8_UP"/><link_ctn id="link_from_-1_-3_4_DOWN"/><link_ctn id="bob_cluster_link_-3_limiter"/><link_ctn id="link_from_0_-1_0_DOWN"/><link_ctn id="bob_cluster_link_-1_limiter"/><link_ctn id="bob_cluster_link_0_limiter"/>
 >   </route>
 >   <route src="node-120.simgrid.org" dst="node-101.simgrid.org">
->   <link_ctn id="link_from_3_-2_3_UP"/><link_ctn id="bob_cluster_link_120_limiter"/><link_ctn id="link_from_-2_-4_10_UP"/><link_ctn id="link_from_-1_-4_6_DOWN"/><link_ctn id="link_from_1_-1_1_DOWN"/><link_ctn id="bob_cluster_link_101_limiter"/>
+>   <link_ctn id="bob_cluster_link_3_limiter"/><link_ctn id="link_from_3_-2_3_UP"/><link_ctn id="bob_cluster_link_-2_limiter"/><link_ctn id="link_from_-2_-4_10_UP"/><link_ctn id="link_from_-1_-4_6_DOWN"/><link_ctn id="bob_cluster_link_-4_limiter"/><link_ctn id="link_from_1_-1_1_DOWN"/><link_ctn id="bob_cluster_link_-1_limiter"/><link_ctn id="bob_cluster_link_1_limiter"/>
 >   </route>
 >   <route src="node-120.simgrid.org" dst="node-119.simgrid.org">
->   <link_ctn id="link_from_3_-2_3_UP"/><link_ctn id="bob_cluster_link_120_limiter"/><link_ctn id="link_from_2_-2_2_DOWN"/><link_ctn id="bob_cluster_link_119_limiter"/>
+>   <link_ctn id="bob_cluster_link_3_limiter"/><link_ctn id="link_from_3_-2_3_UP"/><link_ctn id="link_from_2_-2_2_DOWN"/><link_ctn id="bob_cluster_link_-2_limiter"/><link_ctn id="bob_cluster_link_2_limiter"/>
 >   </route>
 >   <route src="node-120.simgrid.org" dst="node-120.simgrid.org">
 >   <link_ctn id="bob_cluster_link_120_loopback"/>
@@ -1402,12 +1406,12 @@ $ ${bindir:=.}/flatifier ../platforms/cluster_torus_noncontiguous_rad.xml "--log
 >   <link id="__loopback__" bandwidth="10000000000" latency="0.000000000" sharing_policy="FATPIPE"/>
 >   <link id="bob_cluster_link_0_limiter" bandwidth="50000000" latency="0.000000000"/>
 >   <link id="bob_cluster_link_0_loopback" bandwidth="100000000" latency="0.000000000" sharing_policy="FATPIPE"/>
->   <link id="bob_cluster_link_102_limiter" bandwidth="50000000" latency="0.000000000"/>
 >   <link id="bob_cluster_link_102_loopback" bandwidth="100000000" latency="0.000000000" sharing_policy="FATPIPE"/>
->   <link id="bob_cluster_link_103_limiter" bandwidth="50000000" latency="0.000000000"/>
 >   <link id="bob_cluster_link_103_loopback" bandwidth="100000000" latency="0.000000000" sharing_policy="FATPIPE"/>
 >   <link id="bob_cluster_link_1_limiter" bandwidth="50000000" latency="0.000000000"/>
 >   <link id="bob_cluster_link_1_loopback" bandwidth="100000000" latency="0.000000000" sharing_policy="FATPIPE"/>
+>   <link id="bob_cluster_link_2_limiter" bandwidth="50000000" latency="0.000000000"/>
+>   <link id="bob_cluster_link_3_limiter" bandwidth="50000000" latency="0.000000000"/>
 >   <link id="bob_cluster_link_from_0_to_0_DOWN" bandwidth="125000000" latency="0.000050000"/>
 >   <link id="bob_cluster_link_from_0_to_0_UP" bandwidth="125000000" latency="0.000050000"/>
 >   <link id="bob_cluster_link_from_0_to_1_DOWN" bandwidth="125000000" latency="0.000050000"/>
@@ -1439,10 +1443,10 @@ $ ${bindir:=.}/flatifier ../platforms/cluster_torus_noncontiguous_rad.xml "--log
 >   <link_ctn id="bob_cluster_link_0_limiter"/><link_ctn id="bob_cluster_link_from_0_to_1_UP"/><link_ctn id="bob_cluster_link_1_limiter"/>
 >   </route>
 >   <route src="node-0.simgrid.org" dst="node-102.simgrid.org">
->   <link_ctn id="bob_cluster_link_0_limiter"/><link_ctn id="bob_cluster_link_from_0_to_2_UP"/><link_ctn id="bob_cluster_link_102_limiter"/>
+>   <link_ctn id="bob_cluster_link_0_limiter"/><link_ctn id="bob_cluster_link_from_0_to_2_UP"/><link_ctn id="bob_cluster_link_2_limiter"/>
 >   </route>
 >   <route src="node-0.simgrid.org" dst="node-103.simgrid.org">
->   <link_ctn id="bob_cluster_link_0_limiter"/><link_ctn id="bob_cluster_link_from_0_to_1_UP"/><link_ctn id="bob_cluster_link_1_limiter"/><link_ctn id="bob_cluster_link_from_1_to_3_UP"/><link_ctn id="bob_cluster_link_103_limiter"/>
+>   <link_ctn id="bob_cluster_link_0_limiter"/><link_ctn id="bob_cluster_link_from_0_to_1_UP"/><link_ctn id="bob_cluster_link_1_limiter"/><link_ctn id="bob_cluster_link_from_1_to_3_UP"/><link_ctn id="bob_cluster_link_3_limiter"/>
 >   </route>
 >   <route src="node-1.simgrid.org" dst="node-0.simgrid.org">
 >   <link_ctn id="bob_cluster_link_1_limiter"/><link_ctn id="bob_cluster_link_from_0_to_1_DOWN"/><link_ctn id="bob_cluster_link_0_limiter"/>
@@ -1451,31 +1455,31 @@ $ ${bindir:=.}/flatifier ../platforms/cluster_torus_noncontiguous_rad.xml "--log
 >   <link_ctn id="bob_cluster_link_1_loopback"/>
 >   </route>
 >   <route src="node-1.simgrid.org" dst="node-102.simgrid.org">
->   <link_ctn id="bob_cluster_link_1_limiter"/><link_ctn id="bob_cluster_link_from_0_to_1_DOWN"/><link_ctn id="bob_cluster_link_0_limiter"/><link_ctn id="bob_cluster_link_from_0_to_2_UP"/><link_ctn id="bob_cluster_link_102_limiter"/>
+>   <link_ctn id="bob_cluster_link_1_limiter"/><link_ctn id="bob_cluster_link_from_0_to_1_DOWN"/><link_ctn id="bob_cluster_link_0_limiter"/><link_ctn id="bob_cluster_link_from_0_to_2_UP"/><link_ctn id="bob_cluster_link_2_limiter"/>
 >   </route>
 >   <route src="node-1.simgrid.org" dst="node-103.simgrid.org">
->   <link_ctn id="bob_cluster_link_1_limiter"/><link_ctn id="bob_cluster_link_from_1_to_3_UP"/><link_ctn id="bob_cluster_link_103_limiter"/>
+>   <link_ctn id="bob_cluster_link_1_limiter"/><link_ctn id="bob_cluster_link_from_1_to_3_UP"/><link_ctn id="bob_cluster_link_3_limiter"/>
 >   </route>
 >   <route src="node-102.simgrid.org" dst="node-0.simgrid.org">
->   <link_ctn id="bob_cluster_link_102_limiter"/><link_ctn id="bob_cluster_link_from_0_to_2_DOWN"/><link_ctn id="bob_cluster_link_0_limiter"/>
+>   <link_ctn id="bob_cluster_link_2_limiter"/><link_ctn id="bob_cluster_link_from_0_to_2_DOWN"/><link_ctn id="bob_cluster_link_0_limiter"/>
 >   </route>
 >   <route src="node-102.simgrid.org" dst="node-1.simgrid.org">
->   <link_ctn id="bob_cluster_link_102_limiter"/><link_ctn id="bob_cluster_link_from_2_to_3_UP"/><link_ctn id="bob_cluster_link_103_limiter"/><link_ctn id="bob_cluster_link_from_1_to_3_DOWN"/><link_ctn id="bob_cluster_link_1_limiter"/>
+>   <link_ctn id="bob_cluster_link_2_limiter"/><link_ctn id="bob_cluster_link_from_2_to_3_UP"/><link_ctn id="bob_cluster_link_3_limiter"/><link_ctn id="bob_cluster_link_from_1_to_3_DOWN"/><link_ctn id="bob_cluster_link_1_limiter"/>
 >   </route>
 >   <route src="node-102.simgrid.org" dst="node-102.simgrid.org">
 >   <link_ctn id="bob_cluster_link_102_loopback"/>
 >   </route>
 >   <route src="node-102.simgrid.org" dst="node-103.simgrid.org">
->   <link_ctn id="bob_cluster_link_102_limiter"/><link_ctn id="bob_cluster_link_from_2_to_3_UP"/><link_ctn id="bob_cluster_link_103_limiter"/>
+>   <link_ctn id="bob_cluster_link_2_limiter"/><link_ctn id="bob_cluster_link_from_2_to_3_UP"/><link_ctn id="bob_cluster_link_3_limiter"/>
 >   </route>
 >   <route src="node-103.simgrid.org" dst="node-0.simgrid.org">
->   <link_ctn id="bob_cluster_link_103_limiter"/><link_ctn id="bob_cluster_link_from_2_to_3_DOWN"/><link_ctn id="bob_cluster_link_102_limiter"/><link_ctn id="bob_cluster_link_from_0_to_2_DOWN"/><link_ctn id="bob_cluster_link_0_limiter"/>
+>   <link_ctn id="bob_cluster_link_3_limiter"/><link_ctn id="bob_cluster_link_from_2_to_3_DOWN"/><link_ctn id="bob_cluster_link_2_limiter"/><link_ctn id="bob_cluster_link_from_0_to_2_DOWN"/><link_ctn id="bob_cluster_link_0_limiter"/>
 >   </route>
 >   <route src="node-103.simgrid.org" dst="node-1.simgrid.org">
->   <link_ctn id="bob_cluster_link_103_limiter"/><link_ctn id="bob_cluster_link_from_1_to_3_DOWN"/><link_ctn id="bob_cluster_link_1_limiter"/>
+>   <link_ctn id="bob_cluster_link_3_limiter"/><link_ctn id="bob_cluster_link_from_1_to_3_DOWN"/><link_ctn id="bob_cluster_link_1_limiter"/>
 >   </route>
 >   <route src="node-103.simgrid.org" dst="node-102.simgrid.org">
->   <link_ctn id="bob_cluster_link_103_limiter"/><link_ctn id="bob_cluster_link_from_2_to_3_DOWN"/><link_ctn id="bob_cluster_link_102_limiter"/>
+>   <link_ctn id="bob_cluster_link_3_limiter"/><link_ctn id="bob_cluster_link_from_2_to_3_DOWN"/><link_ctn id="bob_cluster_link_2_limiter"/>
 >   </route>
 >   <route src="node-103.simgrid.org" dst="node-103.simgrid.org">
 >   <link_ctn id="bob_cluster_link_103_loopback"/>