fpmas 1.6
von_neumann_grid.h
Go to the documentation of this file.
1#ifndef FPMAS_VON_NEUMANN_GRID_H
2#define FPMAS_VON_NEUMANN_GRID_H
3
8#include "grid_builder.h"
9
10namespace fpmas { namespace model {
11 using api::model::DiscretePoint;
13
20 public:
27 const DiscretePoint& p1,
28 const DiscretePoint& p2) const {
29 return std::abs(p2.x - p1.x) + std::abs(p2.y - p1.y);
30 }
31 };
32
48 template<typename CellType = model::GridCell>
49 class VonNeumannGridBuilder : public detail::GridBuilder<CellType> {
50 private:
51
65 void buildLocalGrid(
67 GridDimensions local_dimensions,
69 ) const override;
70
83 void linkFrontiers(
85 GridDimensions local_dimensions,
87 std::vector<CellType*>& frontier
88 ) const override;
89 public:
91 };
92
93 template<typename CellType>
96 GridDimensions local_dimensions,
98 ) const {
99 DiscreteCoordinate local_width = local_dimensions.width();
100 DiscreteCoordinate local_height = local_dimensions.height();
101
102 for(DiscreteCoordinate j = 0; j < local_width; j++) {
103 for(DiscreteCoordinate i = 0; i < local_height-1; i++) {
104 model.link(cells[i][j], cells[i+1][j], api::model::CELL_SUCCESSOR);
105 }
106 for(DiscreteCoordinate i = local_height-1; i > 0; i--) {
107 model.link(cells[i][j], cells[i-1][j], api::model::CELL_SUCCESSOR);
108 }
109 }
110 for(DiscreteCoordinate i = 0; i < local_height; i++) {
111 for(DiscreteCoordinate j = 0; j < local_width-1; j++) {
112 model.link(cells[i][j], cells[i][j+1], api::model::CELL_SUCCESSOR);
113 }
114 for(DiscreteCoordinate j = local_width-1; j > 0; j--) {
115 model.link(cells[i][j], cells[i][j-1], api::model::CELL_SUCCESSOR);
116 }
117 }
118 }
119 template<typename CellType>
120 void VonNeumannGridBuilder<CellType>::linkFrontiers(
121 api::model::SpatialModel<CellType>& model,
122 GridDimensions local_dimensions,
123 typename detail::GridBuilder<CellType>::CellMatrix& local_cells,
124 std::vector<CellType*>& frontier
125 ) const {
126 for(auto cell : frontier) {
127 if(cell->location().y == local_dimensions.getExtent().y) {
128 // top
129 if(cell->location().x >= local_dimensions.getOrigin().x
130 && cell->location().x < local_dimensions.getExtent().x) {
131 model.link(
132 local_cells[local_dimensions.height()-1][cell->location().x - local_dimensions.getOrigin().x],
133 cell,
134 SpatialModelLayers::CELL_SUCCESSOR
135 );
136 }
137 }
138 else if(cell->location().y == local_dimensions.getOrigin().y-1) {
139 // bottom
140 if(cell->location().x >= local_dimensions.getOrigin().x
141 && cell->location().x < local_dimensions.getExtent().x) {
142 model.link(
143 local_cells[0][cell->location().x - local_dimensions.getOrigin().x],
144 cell,
145 SpatialModelLayers::CELL_SUCCESSOR
146 );
147 }
148 }
149 else if(cell->location().x == local_dimensions.getOrigin().x-1) {
150 // left
151 if(cell->location().y >= local_dimensions.getOrigin().y
152 && cell->location().y < local_dimensions.getExtent().y) {
153 model.link(
154 local_cells[cell->location().y - local_dimensions.getOrigin().y][0],
155 cell,
156 SpatialModelLayers::CELL_SUCCESSOR
157 );
158 }
159 }
160 else if(cell->location().x == local_dimensions.getExtent().x) {
161 // right
162 if(cell->location().y >= local_dimensions.getOrigin().y
163 && cell->location().y < local_dimensions.getExtent().y) {
164 model.link(
165 local_cells[cell->location().y - local_dimensions.getOrigin().y][local_dimensions.width()-1],
166 cell,
167 SpatialModelLayers::CELL_SUCCESSOR
168 );
169 }
170 }
171 }
172 }
173
178 template<typename CellType = model::GridCell>
180}}
181#endif
virtual AgentEdge * link(Agent *src_agent, Agent *tgt_agent, api::graph::LayerId layer)=0
Definition: grid_load_balancing.h:30
DiscreteCoordinate height() const
Definition: grid_load_balancing.h:79
DiscreteCoordinate width() const
Definition: grid_load_balancing.h:72
Definition: von_neumann_grid.h:19
DiscreteCoordinate operator()(const DiscretePoint &p1, const DiscretePoint &p2) const
Definition: von_neumann_grid.h:26
Definition: von_neumann_grid.h:49
Definition: grid_builder.h:29
std::vector< std::vector< CellType * > > CellMatrix
Definition: grid_builder.h:37
long DiscreteCoordinate
Definition: grid.h:15
Definition: fpmas.cpp:3
DiscreteCoordinate x
Definition: grid.h:25
DiscreteCoordinate y
Definition: grid.h:29
Definition: grid.h:507