fpmas-metamodel 1.0
Loading...
Searching...
No Matches
cell.h
Go to the documentation of this file.
1#pragma once
2
3#include "config.h"
4#include "interactions.h"
5
6using namespace fpmas::model;
7
17class MetaCell {
18 public:
22 static float cell_edge_weight;
23
24 private:
25 float utility;
26 std::vector<char> data;
27
28 public:
29 // For edge migration optimization purpose only
30
34 MetaCell() = default;
35
36 // For JSON serialization
37
47 MetaCell(float utility, std::size_t cell_size)
48 : MetaCell(utility, std::vector<char>(cell_size)) {
49 }
50
57 MetaCell(float utility, const std::vector<char>& data)
58 : utility(utility), data(data) {
59 }
60
64 float getUtility() const {
65 return utility;
66 }
72 const std::vector<char>& getData() const {
73 return data;
74 }
75
86
90 virtual void read_all_cell() = 0;
94 virtual void read_one_cell() = 0;
98 virtual void write_all_cell() = 0;
102 virtual void write_one_cell() = 0;
106 virtual void read_all_write_one_cell() = 0;
110 virtual void read_all_write_all_cell() = 0;
111
115 virtual const fpmas::api::model::AgentNode* cellNode() const = 0;
116};
117
124template<typename CellType>
129 static void to_json(nlohmann::json &j, const CellType *cell) {
130 j = {cell->getUtility(), cell->getData()};
131 }
132
136 static CellType* from_json(const nlohmann::json& j) {
137 return new CellType(j[0].get<float>(), j[1].get<std::vector<char>>());
138 }
139
143 static std::size_t size(
144 const fpmas::io::datapack::ObjectPack &o, const CellType *cell) {
145 return o.size<float>() + o.size(cell->getData());
146 }
147
151 static void to_datapack(
152 fpmas::io::datapack::ObjectPack &o, const CellType *cell) {
153 o.put(cell->getUtility());
154 o.put(cell->getData());
155 }
156
160 static CellType* from_datapack(const fpmas::io::datapack::ObjectPack& o) {
161 float utility = o.get<float>();
162 std::vector<char> data = o.get<std::vector<char>>();
163 return new CellType(utility, data);
164 }
165};
166
167#define IMPLEM_CELL_INTERACTION(INTERACTION, CELL_TYPE)\
168 void INTERACTION##_cell() override {\
169 auto neighbors = this->outNeighbors<fpmas::api::model::Agent>(fpmas::api::model::CELL_SUCCESSOR);\
170 ReaderWriter::INTERACTION(neighbors);\
171 }
172
173#define IMPLEM_CELL_INTERACTIONS(CELL_TYPE)\
174 IMPLEM_CELL_INTERACTION(read_all, CELL_TYPE)\
175 IMPLEM_CELL_INTERACTION(read_one, CELL_TYPE)\
176 IMPLEM_CELL_INTERACTION(write_all, CELL_TYPE)\
177 IMPLEM_CELL_INTERACTION(write_one, CELL_TYPE)\
178 IMPLEM_CELL_INTERACTION(read_all_write_one, CELL_TYPE)\
179 IMPLEM_CELL_INTERACTION(read_all_write_all, CELL_TYPE)
180
185 public MetaCell,
186 public GridCellBase<MetaGridCell>,
187 public CellSerialization<MetaGridCell> {
188 public:
189 // For edge migration optimization purpose only
190 using MetaCell::MetaCell;
191
192 // For cell factory
193
201 MetaGridCell(DiscretePoint location, float utility, const std::vector<char>& data)
202 : GridCellBase<MetaGridCell>(location), MetaCell(utility, data) {
203 }
214 MetaGridCell(DiscretePoint location, float utility, std::size_t cell_size)
215 : MetaGridCell(location, utility, std::vector<char>(cell_size)) {
216 }
217
218 const fpmas::api::model::AgentNode* cellNode() const override {
219 return this->GridCellBase<MetaGridCell>::node();
220 }
221
222 IMPLEM_CELL_INTERACTIONS(MetaGridCell);
223};
224
229 public MetaCell,
230 public GraphCellBase<MetaGraphCell>,
231 public CellSerialization<MetaGraphCell> {
232 public:
233 // For edge migration optimization purpose only
234 using MetaCell::MetaCell;
235
236 // For cell factory
237
244 MetaGraphCell(float utility, const std::vector<char>& data)
245 : GraphCellBase<MetaGraphCell>(), MetaCell(utility, data) {
246 }
247
257 MetaGraphCell(float utility, std::size_t cell_size)
258 : MetaGraphCell(utility, std::vector<char>(cell_size)) {
259 }
260
261 const fpmas::api::model::AgentNode* cellNode() const override {
262 return this->GraphCellBase<MetaGraphCell>::node();
263 }
264
265 IMPLEM_CELL_INTERACTIONS(MetaGraphCell);
266 };
267
279 virtual float utility(GridAttractor attractor, DiscretePoint point) const = 0;
280
281 virtual ~UtilityFunction() {
282 }
283};
284
291 float utility(GridAttractor attractor, DiscretePoint point) const override;
292};
293
301 float utility(GridAttractor attractor, DiscretePoint point) const override;
302};
303
312 private:
313 float offset;
314
315 public:
322 }
323
329 InverseUtility(float offset) : offset(offset) {
330 }
331
332 float utility(GridAttractor attractor, DiscretePoint point) const override;
333};
334
343 float utility(GridAttractor attractor, DiscretePoint point) const override;
344};
345
351class MetaGridCellFactory : public fpmas::api::model::GridCellFactory<MetaGridCell> {
352 private:
353 const UtilityFunction& utility_function;
354 std::vector<GridAttractor> attractors;
355 std::size_t cell_size;
356
357 public:
369 const UtilityFunction& utility_function,
370 std::vector<GridAttractor> attractors,
371 std::size_t cell_size) :
372 utility_function(utility_function), attractors(attractors),
373 cell_size(cell_size) {
374 }
375
380 MetaGridCell* build(DiscretePoint location) override;
381};
382
387 private:
388 std::size_t cell_size;
389 public:
395 MetaGraphCellFactory(std::size_t cell_size)
396 : cell_size(cell_size) {
397 }
398
403};
404
Definition: cell.h:311
InverseUtility()
Definition: cell.h:321
InverseUtility(float offset)
Definition: cell.h:329
float utility(GridAttractor attractor, DiscretePoint point) const override
Definition: cell.h:17
virtual void read_one_cell()=0
MetaCell(float utility, std::size_t cell_size)
Definition: cell.h:47
static float cell_edge_weight
Definition: cell.h:22
MetaCell()=default
virtual void read_all_write_one_cell()=0
virtual void read_all_write_all_cell()=0
void update_edge_weights()
float getUtility() const
Definition: cell.h:64
virtual void write_one_cell()=0
virtual void read_all_cell()=0
const std::vector< char > & getData() const
Definition: cell.h:72
virtual const fpmas::api::model::AgentNode * cellNode() const =0
MetaCell(float utility, const std::vector< char > &data)
Definition: cell.h:57
virtual void write_all_cell()=0
Definition: cell.h:386
MetaGraphCell * operator()()
MetaGraphCellFactory(std::size_t cell_size)
Definition: cell.h:395
Definition: cell.h:231
MetaGraphCell(float utility, std::size_t cell_size)
Definition: cell.h:257
MetaGraphCell(float utility, const std::vector< char > &data)
Definition: cell.h:244
const fpmas::api::model::AgentNode * cellNode() const override
Definition: cell.h:261
Definition: cell.h:351
MetaGridCell * build(DiscretePoint location) override
MetaGridCellFactory(const UtilityFunction &utility_function, std::vector< GridAttractor > attractors, std::size_t cell_size)
Definition: cell.h:368
Definition: cell.h:187
const fpmas::api::model::AgentNode * cellNode() const override
Definition: cell.h:218
MetaGridCell(DiscretePoint location, float utility, const std::vector< char > &data)
Definition: cell.h:201
MetaGridCell(DiscretePoint location, float utility, std::size_t cell_size)
Definition: cell.h:214
Definition: cell.h:125
static void to_json(nlohmann::json &j, const CellType *cell)
Definition: cell.h:129
static void to_datapack(fpmas::io::datapack::ObjectPack &o, const CellType *cell)
Definition: cell.h:151
static std::size_t size(const fpmas::io::datapack::ObjectPack &o, const CellType *cell)
Definition: cell.h:143
static CellType * from_json(const nlohmann::json &j)
Definition: cell.h:136
static CellType * from_datapack(const fpmas::io::datapack::ObjectPack &o)
Definition: cell.h:160
Definition: config.h:259
Definition: cell.h:300
float utility(GridAttractor attractor, DiscretePoint point) const override
Definition: cell.h:342
float utility(GridAttractor attractor, DiscretePoint point) const override
Definition: cell.h:290
float utility(GridAttractor attractor, DiscretePoint point) const override
Definition: cell.h:271
virtual float utility(GridAttractor attractor, DiscretePoint point) const =0