fpmas 1.5
grid_load_balancing.h
Go to the documentation of this file.
1#ifndef FPMAS_GRID_LB_H
2#define FPMAS_GRID_LB_H
3
10
11#include <list>
12
13namespace fpmas { namespace model {
14 using api::model::DiscretePoint;
16
31 private:
32 DiscretePoint origin;
33 DiscretePoint extent;
34
35 public:
43 : origin(origin), extent(extent) {
44 }
49
53 DiscretePoint getOrigin() const {return origin;}
57 void setOrigin(const DiscretePoint& point) {this->origin = point;}
58
62 DiscretePoint getExtent() const {return extent;}
66 void setExtent(const DiscretePoint& point) {this->extent = point;}
67
73 return extent.x - origin.x;
74 }
80 return extent.y - origin.y;
81 }
82 };
83
92 public:
101 virtual int process(DiscretePoint point) const = 0;
102
107 virtual GridDimensions gridDimensions(int process) const = 0;
108
109 virtual ~GridProcessMapping() {}
110 };
111
127 private:
128 enum NodeType {
129 HORIZONTAL_FRONTIER,
130 VERTICAL_FRONTIER,
131 LEAF
132 };
133
134 std::vector<GridDimensions> process_grid_dimensions;
135
136 struct Node {
137 // Coordinates of the bottom left corner of the zone
138 // represented by this node
139 DiscretePoint origin;
140 // Width of the node represented by this node
141 DiscreteCoordinate width;
142 // Height of the node represented by this node
143 DiscreteCoordinate height;
144
145 NodeType node_type;
146 // When the node is a frontier, the value between the first and
147 // second child. Depending on the orientation of the frontier,
148 // this is an x or y coordinate.
149 DiscreteCoordinate value;
150
151 // Children of the node (empty if the node is a LEAF, exactly two
152 // children otherwise)
153 std::vector<Node*> childs;
154
155 // When the node is a LEAF, process that owns the zone
156 // represented by this node
157 int process = -1;
158 };
159 Node* root;
160
161 /*
162 * Splits the first node of the list in two nodes, that become the
163 * children of the node.
164 *
165 * The zone is split vertically if node->height > node->width,
166 * horizontally otherwise, in order to minimize the size of
167 * frontiers.
168 *
169 * By construction, the leafs are ordered so that largest zones are
170 * at the beginning of the list, so its consistent to split those
171 * nodes first. Indeed, split nodes are always pushed back in the
172 * list, while the first element of leafs is popped. Moreover, at
173 * the beginning of the algorithm, the only element in `leafs` is
174 * `root`, that represents the whole grid.
175 *
176 * Also note that this procedure increases the leafs size by 1: 2
177 * children are added at the end of the list, while the split node
178 * is removed from the beginning of the list.
179 */
180 void split_node(std::list<Node*>& leafs);
181
182 /*
183 * Recursively deletes all nodes of the tree.
184 */
185 void delete_node(Node* node);
186
187 /*
188 * Recursively finds the LEAF node that contains `point`, and
189 * returns the rank of the process associated to this node.
190 */
191 int process(DiscretePoint point, Node* node) const;
192
193 public:
201
212 );
213
214 TreeProcessMapping(const TreeProcessMapping&) = delete;
215 TreeProcessMapping& operator=(const TreeProcessMapping&) = delete;
216
217 int process(DiscretePoint point) const override;
218
219 GridDimensions gridDimensions(int process) const override;
220
222 };
223
239 private:
243 enum Mode {
247 HORIZONTAL,
251 VERTICAL
252 };
253 Mode mode;
254 std::map<DiscreteCoordinate, int> process_bounds;
255 std::vector<GridDimensions> process_grid_dimensions;
256
257 public:
268 );
269
281 int process(DiscretePoint point) const override;
282
283 GridDimensions gridDimensions(int process) const override;
284 };
314 class GridLoadBalancing : public api::graph::LoadBalancing<api::model::AgentPtr> {
315 private:
316 TreeProcessMapping default_process_mapping;
317 const GridProcessMapping& grid_process_mapping;
318
319 public:
333 );
334
341 GridLoadBalancing(const GridProcessMapping& grid_process_mapping);
342
343
349 ) override;
350
366 api::graph::PartitionMode partition_mode
367 ) override;
368 };
369
370}}
371#endif
Definition: communication.h:251
Definition: load_balancing.h:92
Definition: grid_load_balancing.h:30
DiscreteCoordinate height() const
Definition: grid_load_balancing.h:79
void setExtent(const DiscretePoint &point)
Definition: grid_load_balancing.h:66
DiscreteCoordinate width() const
Definition: grid_load_balancing.h:72
void setOrigin(const DiscretePoint &point)
Definition: grid_load_balancing.h:57
GridDimensions()
Definition: grid_load_balancing.h:48
DiscretePoint getOrigin() const
Definition: grid_load_balancing.h:53
GridDimensions(DiscretePoint origin, DiscretePoint extent)
Definition: grid_load_balancing.h:42
DiscretePoint getExtent() const
Definition: grid_load_balancing.h:62
Definition: grid_load_balancing.h:314
GridLoadBalancing(DiscreteCoordinate width, DiscreteCoordinate height, api::communication::MpiCommunicator &comm)
Definition: grid_load_balancing.cpp:162
api::graph::PartitionMap balance(api::graph::NodeMap< api::model::AgentPtr > nodes) override
Definition: grid_load_balancing.cpp:176
Definition: grid_load_balancing.h:91
virtual GridDimensions gridDimensions(int process) const =0
virtual int process(DiscretePoint point) const =0
Definition: grid_load_balancing.h:238
GridDimensions gridDimensions(int process) const override
Definition: grid_load_balancing.cpp:158
StripProcessMapping(DiscreteCoordinate width, DiscreteCoordinate height, api::communication::MpiCommunicator &comm)
Definition: grid_load_balancing.cpp:115
int process(DiscretePoint point) const override
Definition: grid_load_balancing.cpp:142
Definition: grid_load_balancing.h:126
GridDimensions gridDimensions(int process) const override
Definition: grid_load_balancing.cpp:111
TreeProcessMapping()
Definition: grid_load_balancing.cpp:4
std::unordered_map< DistributedId, int, api::graph::IdHash< DistributedId > > PartitionMap
Definition: load_balancing.h:19
PartitionMode
Definition: load_balancing.h:30
typename graph::Graph< graph::DistributedNode< T >, graph::DistributedEdge< T > >::NodeMap NodeMap
Definition: load_balancing.h:25
long DiscreteCoordinate
Definition: grid.h:15
Definition: fpmas.cpp:3
DiscreteCoordinate x
Definition: grid.h:25
DiscreteCoordinate y
Definition: grid.h:29