fpmas 1.6
model.h
Go to the documentation of this file.
1#ifndef FPMAS_MODEL_DETAIL_H
2#define FPMAS_MODEL_DETAIL_H
3
13
14namespace fpmas {
15 namespace model {
18 using api::model::AgentPtr;
21
31 public:
32 void execute(api::model::Agent* agent) const override {
33 agent->act();
34 }
35 };
36
40 namespace detail {
44 class AgentTaskBase : public scheduler::TaskBase<api::model::AgentTask> {
45 protected:
50 public:
57 : _agent(agent_ptr) {}
58
59 const api::model::AgentPtr& agent() const override {
60 return _agent;
61 }
62
63 AgentNode* node() override {
64 return _agent->node();
65 }
66 };
67
76 class AgentTask : public AgentTaskBase {
77 public:
84 : AgentTaskBase(agent_ptr) {}
85
86
87 void run() override {
88 _agent->act();
89 }
90 };
91
97 private:
98 const api::model::Behavior& behavior;
99
100 public:
112 : AgentTaskBase(agent), behavior(behavior) {}
113
114 void run() override {
115 behavior.execute(_agent.get());
116 }
117 };
118
127 class SynchronizeGraphTask : public scheduler::TaskBase<api::scheduler::Task> {
128 private:
129 api::model::AgentGraph& agent_graph;
130 public:
137 : agent_graph(agent_graph) {}
138
142 void run() override {
143 agent_graph.synchronize();
144 }
145 };
146
147 class EraseAgentCallback;
148
155 : public api::utils::Callback<AgentNode*> {
156 private:
157 api::model::Model& model;
158 public:
165
186 void call(api::model::AgentNode* node) override;
187 };
188
195 : public api::utils::Callback<AgentNode*> {
196 private:
197 api::model::Model& model;
198 public:
205
215 void call(api::model::AgentNode* node) override;
216 };
217
226 : public api::utils::EventCallback<api::graph::SetLocalNodeEvent<AgentPtr>> {
227 private:
228 api::model::Model& model;
229 public:
235 SetAgentLocalCallback(api::model::Model& model) : model(model) {}
236
247 void call(const api::graph::SetLocalNodeEvent<AgentPtr>& event) override;
248 };
249
258 : public api::utils::EventCallback<api::graph::SetDistantNodeEvent<AgentPtr>> {
259 private:
260 api::model::Model& model;
261 public:
268
283 void call(const api::graph::SetDistantNodeEvent<AgentPtr>& event) override;
284 };
285
290 template<template<typename> class SyncMode>
292
301
310 class LoadBalancingTask : public scheduler::TaskBase<api::scheduler::Task> {
311 public:
320
321 private:
322 api::model::AgentGraph& agent_graph;
323 api::model::LoadBalancing& load_balancing;
324 // Initially PARTITION, and REPARTITION after the first run
325 api::graph::PartitionMode partition_mode;
326
327 public:
337 api::model::AgentGraph& agent_graph,
338 api::model::LoadBalancing& load_balancing
339 )
340 : agent_graph(agent_graph), load_balancing(load_balancing),
341 partition_mode(api::graph::PARTITION) {
342 }
343
344 void run() override;
345 };
346
350 class AgentGroupBase : public virtual api::model::AgentGroup {
351 friend detail::EraseAgentCallback;
352 private:
353 GroupId id;
354 api::model::AgentGraph& agent_graph;
355 scheduler::Job job_base;
356 detail::SynchronizeGraphTask sync_graph_task;
357 std::list<api::model::Agent*> _agents;
358
359 static const DefaultBehavior default_behavior;
360 const api::model::Behavior& _behavior;
361
362 std::unordered_map<
363 Event,
364 std::vector<api::utils::Callback<api::model::Agent*>*>
365 > event_handlers;
366
367 void emit(Event event, api::model::Agent* agent);
368
369 public:
376 AgentGroupBase(GroupId group_id, api::model::AgentGraph& agent_graph);
377
386
395 GroupId group_id,
396 api::model::AgentGraph& agent_graph,
398
399 GroupId groupId() const override {return id;}
400 const api::model::Behavior& behavior() override {return _behavior;}
401
402 void add(api::model::Agent*) override;
403 void remove(api::model::Agent*) override;
404
405 void insert(api::model::AgentPtr*) override;
406 void erase(api::model::AgentPtr*) override;
407 void clear() override;
408
409 scheduler::Job& job() override {return job_base;}
410 const scheduler::Job& job() const override {return job_base;}
411 api::scheduler::Job& agentExecutionJob() override {return job_base;}
412 const api::scheduler::Job& agentExecutionJob() const override {return job_base;}
413
414 std::vector<api::model::Agent*> agents() const override;
415 std::vector<api::model::Agent*> localAgents() const override;
416 std::vector<api::model::Agent*> distantAgents() const override;
417
418 void addEventHandler(
419 Event event,
421
423 Event event,
425
427 };
428
434 class AgentGroup : public AgentGroupBase {
435 public:
437
438 api::scheduler::JobList jobs() const override {
439 return {this->agentExecutionJob()};
440 }
441 };
442
443
447 class Model : public virtual api::model::Model {
448 protected:
449 void insert(api::model::GroupId id, api::model::AgentGroup* group) override;
450
451 private:
453 api::scheduler::Scheduler& _scheduler;
454 api::runtime::Runtime& _runtime;
455 scheduler::Job _loadBalancingJob;
456 LoadBalancingTask load_balancing_task;
457 InsertAgentNodeCallback* insert_node_callback
458 = new InsertAgentNodeCallback(*this);
459 EraseAgentNodeCallback* erase_node_callback
460 = new EraseAgentNodeCallback(*this);
461 SetAgentLocalCallback* set_local_callback
462 = new SetAgentLocalCallback(*this);
463 SetAgentDistantCallback* set_distant_callback
464 = new SetAgentDistantCallback(*this);
465
466 std::unordered_map<GroupId, api::model::AgentGroup*> _groups;
467
468 public:
477 Model(
481 api::model::LoadBalancing& load_balancing);
482 Model(const Model&) = delete;
483 Model(Model&&) = delete;
484 Model& operator=(const Model&) = delete;
485 Model& operator=(Model&&) = delete;
486
488 return _graph;
489 }
490 const api::model::AgentGraph& graph() const override {
491 return _graph;
492 }
494 return _scheduler;
495 }
496 const api::scheduler::Scheduler& scheduler() const override {
497 return _scheduler;
498 }
500 return _runtime;
501 }
502 const api::runtime::Runtime& runtime() const override {
503 return _runtime;
504 }
505
506 const scheduler::Job& loadBalancingJob() const override {
507 return _loadBalancingJob;
508 }
509
511 api::model::GroupId id) override;
514 const api::model::Behavior& behavior) override;
515
516 void removeGroup(api::model::AgentGroup& group) override;
517
519 api::model::GroupId id) const override;
520
521 const std::unordered_map<GroupId, api::model::AgentGroup*>&
522 groups() const override {return _groups;}
523
525 api::model::Agent* src_agent,
526 api::model::Agent* tgt_agent,
527 api::graph::LayerId layer) override;
528 void unlink(api::model::AgentEdge* edge) override;
529
531 return this->_graph.getMpiCommunicator();
532 }
533
535 return this->_graph.getMpiCommunicator();
536 }
537
538 void clear() override {
539 this->_graph.clear();
540 this->runtime().setCurrentDate(0);
541 }
542
543 ~Model();
544 };
545
550 template<template<typename> class SyncMode>
552 protected:
560 AgentGraph<SyncMode> __graph {comm};
564 scheduler::Scheduler __scheduler;
568 runtime::Runtime __runtime {__scheduler};
572 ZoltanLoadBalancing __zoltan_lb {comm};
576 ScheduledLoadBalancing __load_balancing {
577 __zoltan_lb, __scheduler, __runtime
578 };
579 };
580
637 template<template<typename> class SyncMode>
638 class DefaultModel : private DefaultModelConfig<SyncMode>, public Model {
639 public:
648 DefaultModelConfig<SyncMode>(),
649 Model(
650 this->__graph, this->__scheduler, this->__runtime,
651 this->__load_balancing
652 ) {}
668 api::graph::LoadBalancing<AgentPtr>& load_balancing) :
669 DefaultModelConfig<SyncMode>(),
670 Model(
671 this->__graph, this->__scheduler, this->__runtime,
672 load_balancing
673 ) {}
674
693 api::graph::LoadBalancing<AgentPtr>& load_balancing) :
694 DefaultModelConfig<SyncMode>(),
695 Model(
696 this->__graph, scheduler, runtime,
697 load_balancing
698 ) {}
699 };
700
701 }
702 }
703}
704#endif
Definition: communication.h:251
Definition: distributed_edge.h:91
Definition: distributed_graph.h:169
virtual api::communication::MpiCommunicator & getMpiCommunicator()=0
Definition: distributed_node.h:28
virtual void clear()=0
Definition: load_balancing.h:92
Definition: model.h:547
Event
Definition: model.h:552
Definition: model.h:92
Definition: model.h:174
virtual void act()=0
Definition: model.h:520
virtual void execute(Agent *agent) const =0
Definition: model.h:841
Definition: runtime.h:18
virtual void setCurrentDate(Date date)=0
Definition: scheduler.h:135
Definition: scheduler.h:302
Definition: callback.h:16
T * get()
Definition: ptr_wrapper.h:58
Definition: communication.h:267
Definition: scheduled_load_balancing.h:25
Definition: zoltan_load_balancing.h:419
Definition: distributed_graph.h:49
Definition: model.h:30
void execute(api::model::Agent *agent) const override
Definition: model.h:32
AgentBehaviorTask(const api::model::Behavior &behavior, api::model::AgentPtr &agent)
Definition: model.h:111
void run() override
Definition: model.h:114
void erase(api::model::AgentPtr *) override
Definition: model.cpp:240
const scheduler::Job & job() const override
Definition: model.h:410
std::vector< api::model::Agent * > localAgents() const override
Definition: model.cpp:271
AgentGroupBase & operator=(const AgentGroupBase &)=delete
AgentGroupBase(const AgentGroupBase &)=delete
const api::scheduler::Job & agentExecutionJob() const override
Definition: model.h:412
void remove(api::model::Agent *) override
Definition: model.cpp:188
std::vector< api::model::Agent * > distantAgents() const override
Definition: model.cpp:279
void insert(api::model::AgentPtr *) override
Definition: model.cpp:213
void clear() override
Definition: model.cpp:259
scheduler::Job & job() override
Definition: model.h:409
api::scheduler::Job & agentExecutionJob() override
Definition: model.h:411
GroupId groupId() const override
Definition: model.h:399
void add(api::model::Agent *) override
Definition: model.cpp:156
AgentGroupBase(GroupId group_id, api::model::AgentGraph &agent_graph)
Definition: model.cpp:142
std::vector< api::model::Agent * > agents() const override
Definition: model.cpp:264
void addEventHandler(Event event, api::utils::Callback< api::model::Agent * > *callback) override
Definition: model.cpp:287
void removeEventHandler(Event event, api::utils::Callback< api::model::Agent * > *callback) override
Definition: model.cpp:293
const api::model::Behavior & behavior() override
Definition: model.h:400
Definition: model.h:434
api::scheduler::JobList jobs() const override
Definition: model.h:438
AgentTaskBase(api::model::AgentPtr &agent_ptr)
Definition: model.h:56
const api::model::AgentPtr & agent() const override
Definition: model.h:59
api::model::AgentPtr & _agent
Definition: model.h:49
AgentNode * node() override
Definition: model.h:63
Definition: model.h:76
void run() override
Definition: model.h:87
AgentTask(api::model::AgentPtr &agent_ptr)
Definition: model.h:83
communication::MpiCommunicator comm
Definition: model.h:556
Definition: model.h:638
DefaultModel(api::scheduler::Scheduler &scheduler, api::runtime::Runtime &runtime, api::graph::LoadBalancing< AgentPtr > &load_balancing)
Definition: model.h:690
DefaultModel()
Definition: model.h:647
DefaultModel(api::graph::LoadBalancing< AgentPtr > &load_balancing)
Definition: model.h:667
EraseAgentNodeCallback(api::model::Model &model)
Definition: model.h:204
void call(api::model::AgentNode *node) override
Definition: model.cpp:20
InsertAgentNodeCallback(api::model::Model &model)
Definition: model.h:164
void call(api::model::AgentNode *node) override
Definition: model.cpp:9
void run() override
Definition: model.cpp:131
api::graph::NodeMap< AgentPtr > NodeMap
Definition: model.h:315
api::graph::PartitionMap PartitionMap
Definition: model.h:319
LoadBalancingTask(api::model::AgentGraph &agent_graph, api::model::LoadBalancing &load_balancing)
Definition: model.h:336
Definition: model.h:447
void clear() override
Definition: model.h:538
api::model::AgentGroup & buildGroup(api::model::GroupId id) override
Definition: model.cpp:101
const api::communication::MpiCommunicator & getMpiCommunicator() const override
Definition: model.h:534
api::runtime::Runtime & runtime() override
Definition: model.h:499
api::scheduler::Scheduler & scheduler() override
Definition: model.h:493
AgentEdge * link(api::model::Agent *src_agent, api::model::Agent *tgt_agent, api::graph::LayerId layer) override
Definition: model.cpp:121
api::communication::MpiCommunicator & getMpiCommunicator() override
Definition: model.h:530
const scheduler::Job & loadBalancingJob() const override
Definition: model.h:506
void unlink(api::model::AgentEdge *edge) override
Definition: model.cpp:127
const api::scheduler::Scheduler & scheduler() const override
Definition: model.h:496
Model(api::model::AgentGraph &graph, api::scheduler::Scheduler &scheduler, api::runtime::Runtime &runtime, api::model::LoadBalancing &load_balancing)
Definition: model.cpp:73
const api::runtime::Runtime & runtime() const override
Definition: model.h:502
const api::model::AgentGraph & graph() const override
Definition: model.h:490
api::model::AgentGraph & graph() override
Definition: model.h:487
void removeGroup(api::model::AgentGroup &group) override
Definition: model.cpp:115
void insert(api::model::GroupId id, api::model::AgentGroup *group) override
Definition: model.cpp:93
const std::unordered_map< GroupId, api::model::AgentGroup * > & groups() const override
Definition: model.h:522
api::model::AgentGroup & getGroup(api::model::GroupId id) const override
Definition: model.cpp:97
SetAgentDistantCallback(api::model::Model &model)
Definition: model.h:267
void call(const api::graph::SetDistantNodeEvent< AgentPtr > &event) override
Definition: model.cpp:56
void call(const api::graph::SetLocalNodeEvent< AgentPtr > &event) override
Definition: model.cpp:42
SetAgentLocalCallback(api::model::Model &model)
Definition: model.h:235
void run() override
Definition: model.h:142
SynchronizeGraphTask(api::model::AgentGraph &agent_graph)
Definition: model.h:136
Definition: runtime.h:19
Definition: scheduler.h:169
Definition: scheduler.h:259
Definition: scheduler.h:33
std::unordered_map< DistributedId, int, api::graph::IdHash< DistributedId > > PartitionMap
Definition: load_balancing.h:19
int LayerId
Definition: edge.h:13
PartitionMode
Definition: load_balancing.h:30
@ PARTITION
Definition: load_balancing.h:35
typename graph::Graph< graph::DistributedNode< T >, graph::DistributedEdge< T > >::NodeMap NodeMap
Definition: load_balancing.h:25
int GroupId
Definition: model.h:78
api::graph::DistributedNode< AgentPtr > AgentNode
Definition: model.h:40
api::graph::DistributedGraph< AgentPtr >::SetDistantNodeCallback SetAgentDistantCallback
Definition: model.h:73
api::graph::DistributedEdge< AgentPtr > AgentEdge
Definition: model.h:49
api::graph::DistributedGraph< AgentPtr >::SetLocalNodeCallback SetAgentLocalCallback
Definition: model.h:64
std::vector< std::reference_wrapper< const Job > > JobList
Definition: scheduler.h:215
size_t JID
Definition: scheduler.h:38
graph::ScheduledLoadBalancing< AgentPtr > ScheduledLoadBalancing
Definition: model.h:300
graph::ZoltanLoadBalancing< AgentPtr > ZoltanLoadBalancing
Definition: model.h:296
Definition: fpmas.cpp:3
Definition: distributed_graph.h:99
Definition: distributed_graph.h:42
Definition: callback.h:33