+ this->generateSwitches();
+ this->generateLabels();
+ 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->nodesByLevel[i] ; j++) {
+ if(i != this->levels - 1) {
+ for(unsigned int l = 0 ; l < this->nodesByLevel[i+1] ; l++) {
+ this->connectNodeToParents(cluster, this->nodes[k]);
+ }
+ }
+ k++;
+ }
+ }
+}
+
+int AsClusterFatTree::connectNodeToParents(sg_platf_cluster_cbarg_t cluster,
+ FatTreeNode *node) {
+ FatTreeNode* currentParentNode;
+ int connectionsNumber = 0;
+ const int level = node->level;
+ currentParentNode = this->nodes[this->getLevelPosition(level + 1)];
+ for (unsigned int i = 0 ; i < this->nodesByLevel[level] ; i++ ) {
+ if(this->areRelated(currentParentNode, node)) {
+ this->addLink(cluster, currentParentNode, node->label[level + 1], node,
+ currentParentNode->label[level + 1]);
+ connectionsNumber++;
+ }
+ }
+ return connectionsNumber;
+}
+
+
+bool AsClusterFatTree::areRelated(FatTreeNode *parent, FatTreeNode *child) {
+ if (parent->level != child->level + 1) {
+ return false;
+ }
+
+ for (unsigned int i = 0 ; i < this->levels; i++) {
+ if (parent->label[i] != child->label[i] && i != parent->level) {
+ return false;
+ }
+ }
+ return true;
+}
+
+void AsClusterFatTree::generateSwitches() {