+#include <string>
+#include <map>
+#include <vector>
+
+#include <xbt/base.h>
+
+#include "surf_routing_cluster.hpp"
+
+namespace simgrid {
+namespace surf {
+
+/** \file surf_routing_cluster_fat_tree.cpp
+ * The class AsClusterFatTree describes PGFT, as introduced by Eitan Zahavi
+ * in "D-Mod-K Routing Providing Non-Blocking Traffic for Shift Permutations
+ * on Real Life Fat Trees" (2010). RLFT are PGFT with some restrictions to
+ * address real world constraints, which are not currently enforced.
+ */
+
+class XBT_PRIVATE FatTreeNode;
+class XBT_PRIVATE FatTreeLink;
+
+/** \brief A node in a fat tree.
+ * A FatTreeNode can either be a switch or a processing node. Switches are
+ * identified by a negative ID. This class is closely related to fat
+ */
+class FatTreeNode {
+public:
+ /** Unique ID which identifies every node. */
+ int id;
+ /* Level into the tree, with 0 being the leafs.
+ */
+ unsigned int level;
+ /* \brief Position into the level, starting from 0.
+ */
+ unsigned int position;
+ /** In order to link nodes between them, each one must be assigned a label,
+ * consisting of l integers, l being the levels number of the tree. Each label
+ * is unique in the level, and the way it is generated allows the construction
+ * of a fat tree which fits the desired topology.
+ */
+ std::vector<unsigned int> label;
+
+ /** Links to the lower level, where the position in the vector corresponds to
+ * a port number.
+ */
+ std::vector<FatTreeLink*> children;
+ /** Links to the upper level, where the position in the vector corresponds to
+ * a port number.
+ */
+ std::vector<FatTreeLink*> parents;
+
+ /** Virtual link standing for the node global capacity.
+ */
+ Link* limiterLink;
+ /** If present, communications from this node to this node will pass through it
+ * instead of passing by an upper level switch.
+ */
+ Link* loopback;
+ FatTreeNode(sg_platf_cluster_cbarg_t cluster, int id, int level,
+ int position);
+};
+