fpmas 1.6
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
126 private:
127 enum NodeType {
128 HORIZONTAL_FRONTIER,
129 VERTICAL_FRONTIER,
130 LEAF
131 };
132
133 std::vector<GridDimensions> process_grid_dimensions;
134
135 struct Node {
136 // Coordinates of the bottom left corner of the zone
137 // represented by this node
138 DiscretePoint origin;
139 // Width of the node represented by this node
140 DiscreteCoordinate width;
141 // Height of the node represented by this node
142 DiscreteCoordinate height;
143
144 NodeType node_type;
145 // When the node is a frontier, the value between the first and
146 // second child. Depending on the orientation of the frontier,
147 // this is an x or y coordinate.
148 DiscreteCoordinate value;
149
150 // Children of the node (empty if the node is a LEAF, exactly two
151 // children otherwise)
152 std::vector<Node*> childs;
153
154 // When the node is a LEAF, process that owns the zone
155 // represented by this node
156 int process = -1;
157 };
158 Node* root;
159
160 /*
161 * Splits the first node of the list in two nodes, that become the
162 * children of the node.
163 *
164 * The zone is split vertically if node->height > node->width,
165 * horizontally otherwise, in order to minimize the size of
166 * frontiers.
167 *
168 * By construction, the leafs are ordered so that largest zones are
169 * at the beginning of the list, so its consistent to split those
170 * nodes first. Indeed, split nodes are always pushed back in the
171 * list, while the first element of leafs is popped. Moreover, at
172 * the beginning of the algorithm, the only element in `leafs` is
173 * `root`, that represents the whole grid.
174 *
175 * Also note that this procedure increases the leafs size by 1: 2
176 * children are added at the end of the list, while the split node
177 * is removed from the beginning of the list.
178 */
179 void split_node(std::list<Node*>& leafs);
180
181 /*
182 * Recursively deletes all nodes of the tree.
183 */
184 void delete_node(Node* node);
185
186 /*
187 * Recursively finds the LEAF node that contains `point`, and
188 * returns the rank of the process associated to this node.
189 */
190 int process(DiscretePoint point, Node* node) const;
191
192 public:
203 );
204
205 TreeProcessMapping(const TreeProcessMapping&) = delete;
206 TreeProcessMapping& operator=(const TreeProcessMapping&) = delete;
207
208 int process(DiscretePoint point) const override;
209
210 GridDimensions gridDimensions(int process) const override;
211
213 };
214
230 private:
234 enum Mode {
238 HORIZONTAL,
242 VERTICAL
243 };
244 Mode mode;
245 std::map<DiscreteCoordinate, int> process_bounds;
246 std::vector<GridDimensions> process_grid_dimensions;
247
248 public:
259 );
260
272 int process(DiscretePoint point) const override;
273
274 GridDimensions gridDimensions(int process) const override;
275 };
276
288 private:
289 std::vector<GridDimensions> process_grid_dimensions;
290 std::vector<std::vector<int>> process_map;
291 int _n;
292 int _p;
293 int N_x;
294 int N_y;
295 DiscreteCoordinate width;
296 DiscreteCoordinate height;
297 public:
308 );
309
321 int process(DiscretePoint point) const override;
322
323 GridDimensions gridDimensions(int process) const override;
324
328 int n() const;
332 int p() const;
333 };
334
364 class GridLoadBalancing : public api::graph::LoadBalancing<api::model::AgentPtr> {
365 private:
366 FastProcessMapping default_process_mapping;
367 const GridProcessMapping& grid_process_mapping;
368
369 public:
383 );
384
391 GridLoadBalancing(const GridProcessMapping& grid_process_mapping);
392
393
399 ) override;
400
416 api::graph::PartitionMode partition_mode
417 ) override;
418 };
419
420}}
421#endif
Definition: communication.h:251
Definition: load_balancing.h:92
Definition: grid_load_balancing.h:287
int n() const
Definition: grid_load_balancing.cpp:209
int p() const
Definition: grid_load_balancing.cpp:213
FastProcessMapping(DiscreteCoordinate width, DiscreteCoordinate height, api::communication::MpiCommunicator &comm)
Definition: grid_load_balancing.cpp:160
int process(DiscretePoint point) const override
Definition: grid_load_balancing.cpp:205
GridDimensions gridDimensions(int process) const override
Definition: grid_load_balancing.cpp:217
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:364
GridLoadBalancing(DiscreteCoordinate width, DiscreteCoordinate height, api::communication::MpiCommunicator &comm)
Definition: grid_load_balancing.cpp:221
api::graph::PartitionMap balance(api::graph::NodeMap< api::model::AgentPtr > nodes) override
Definition: grid_load_balancing.cpp:235
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:229
GridDimensions gridDimensions(int process) const override
Definition: grid_load_balancing.cpp:156
StripProcessMapping(DiscreteCoordinate width, DiscreteCoordinate height, api::communication::MpiCommunicator &comm)
Definition: grid_load_balancing.cpp:113
int process(DiscretePoint point) const override
Definition: grid_load_balancing.cpp:140
Definition: grid_load_balancing.h:125
GridDimensions gridDimensions(int process) const override
Definition: grid_load_balancing.cpp:109
TreeProcessMapping(DiscreteCoordinate width, DiscreteCoordinate height, api::communication::MpiCommunicator &comm)
Definition: grid_load_balancing.cpp:8
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