fpmas 1.6
model.h
Go to the documentation of this file.
1#ifndef FPMAS_MODEL_API_H
2#define FPMAS_MODEL_API_H
3
8#include <typeindex>
9#include <list>
10#include <random>
11
16
17#ifndef FPMAS_AGENT_RNG
32 #define FPMAS_AGENT_RNG minstd_rand
33#endif
34
35namespace fpmas { namespace api {namespace model {
36 using api::graph::DistributedId;
37
38 class Agent;
39 class AgentTask;
40 class AgentPtr;
41
50
55
74
78 typedef int GroupId;
82 typedef std::type_index TypeId;
83
92 class AgentPtr : public api::utils::PtrWrapper<api::model::Agent> {
93 public:
104 : PtrWrapper(agent) {}
105
111 AgentPtr(AgentPtr&& other);
112
128 AgentPtr(const AgentPtr& other);
129
136 AgentPtr& operator=(AgentPtr&& other);
137
146 AgentPtr& operator=(const AgentPtr&);
147
151 ~AgentPtr();
152 };
153
161
162 class Model;
163 class AgentGroup;
164
174 class Agent {
175 public:
185 HEDLEY_DEPRECATED_FOR(1.1, groupIds())
186 virtual GroupId groupId() const = 0;
187
193 virtual std::vector<GroupId> groupIds() const = 0;
194
204 HEDLEY_DEPRECATED_FOR(1.1, addGroupId())
205 virtual void setGroupId(GroupId id) = 0;
206
212 virtual void addGroupId(GroupId id) = 0;
213
219 virtual void removeGroupId(GroupId id) = 0;
220
221
231 HEDLEY_DEPRECATED_FOR(1.1, groups())
232 virtual AgentGroup* group() = 0;
236 HEDLEY_DEPRECATED_FOR(1.1, groups())
237 virtual const AgentGroup* group() const = 0;
238
244 virtual std::vector<AgentGroup*> groups() = 0;
245
249 virtual std::vector<const AgentGroup*> groups() const = 0;
250
261 HEDLEY_DEPRECATED_FOR(1.1, addGroup())
262 virtual void setGroup(AgentGroup* group) = 0;
263
270 virtual void addGroup(AgentGroup* group) = 0;
271
281 virtual void removeGroup(AgentGroup* group) = 0;
282
297 virtual void setGroupPos(
298 api::model::GroupId gid,
299 std::list<Agent*>::iterator pos
300 ) = 0;
301
310 virtual std::list<Agent*>::iterator getGroupPos(api::model::GroupId gid) const = 0;
311
315 virtual TypeId typeId() const = 0;
322 virtual Agent* copy() const = 0;
323
329 virtual void copyAssign(Agent* agent) = 0;
330
347 virtual void moveAssign(Agent* agent) = 0;
348
354 virtual AgentNode* node() = 0;
358 virtual const AgentNode* node() const = 0;
364 virtual void setNode(AgentNode* node) = 0;
365
371 virtual Model* model() = 0;
375 virtual const Model* model() const = 0;
382 virtual void setModel(Model* model) = 0;
383
390 HEDLEY_DEPRECATED_FOR(1.1, task(GroupId))
391 virtual AgentTask* task() = 0;
395 HEDLEY_DEPRECATED_FOR(1.1, task(GroupId))
396 virtual const AgentTask* task() const = 0;
402 HEDLEY_DEPRECATED_FOR(1.1, setTask(GroupId, AgentTask*))
403 virtual void setTask(AgentTask* task) = 0;
404
414 virtual AgentTask* task(GroupId id) = 0;
418 virtual const AgentTask* task(GroupId id) const = 0;
419
430 virtual void setTask(GroupId id, AgentTask* task) = 0;
431
440 virtual const std::unordered_map<GroupId, AgentTask*>& tasks() = 0;
441
450 virtual void act() = 0;
451
452 virtual ~Agent(){}
453 };
454
463 public:
477
485 virtual void seed(std::FPMAS_AGENT_RNG::result_type seed) = 0;
486
487 virtual ~RandomAgent() {
488 }
489 };
490
497 class AgentTask : public api::scheduler::NodeTask<AgentPtr> {
498 public:
504 virtual const AgentPtr& agent() const = 0;
505
506 virtual ~AgentTask(){}
507 };
508
520 class Behavior {
521 public:
527 virtual void execute(Agent* agent) const = 0;
528
529 virtual ~Behavior(){}
530 };
531
548 public:
552 enum Event {
568 REMOVE
569 };
575 virtual GroupId groupId() const = 0;
576
582 virtual const Behavior& behavior() = 0;
583
619 virtual void add(Agent* agent) = 0;
620
636 virtual void remove(Agent* agent) = 0;
637
641 virtual void clear() = 0;
642
663 virtual void insert(AgentPtr* agent) = 0;
679 virtual void erase(AgentPtr* agent) = 0;
680
694 virtual std::vector<Agent*> agents() const = 0;
695
696
709 virtual std::vector<Agent*> localAgents() const = 0;
710
727 virtual std::vector<Agent*> distantAgents() const = 0;
728
752 HEDLEY_DEPRECATED_FOR(1.1, jobs())
753 virtual api::scheduler::Job& job() = 0;
754
758 HEDLEY_DEPRECATED_FOR(1.1, jobs())
759 virtual const api::scheduler::Job& job() const = 0;
760
774 virtual api::scheduler::Job& agentExecutionJob() = 0;
775
779 virtual const api::scheduler::Job& agentExecutionJob() const = 0;
780
801 virtual api::scheduler::JobList jobs() const = 0;
802
810 virtual void addEventHandler(
811 Event event, api::utils::Callback<Agent*>* callback
812 ) = 0;
823 virtual void removeEventHandler(
824 Event event, api::utils::Callback<Agent*>* callback
825 ) = 0;
826
827 virtual ~AgentGroup(){}
828 };
829
833 typedef std::vector<std::reference_wrapper<AgentGroup>> GroupList;
834
841 class Model {
842 protected:
849 virtual void insert(GroupId id, AgentGroup* group) = 0;
850
851 public:
857 virtual AgentGraph& graph() = 0;
858
862 virtual const AgentGraph& graph() const = 0;
863
870
874 virtual const api::scheduler::Scheduler& scheduler() const = 0;
875
882
886 virtual const api::runtime::Runtime& runtime() const = 0;
887
904 virtual const api::scheduler::Job& loadBalancingJob() const = 0;
905
949 virtual AgentGroup& buildGroup(GroupId id) = 0;
950
970 virtual AgentGroup& buildGroup(GroupId id, const Behavior& behavior) = 0;
971
980 virtual void removeGroup(AgentGroup& group) = 0;
981
992 virtual AgentGroup& getGroup(GroupId id) const = 0;
993
999 virtual const std::unordered_map<GroupId, AgentGroup*>& groups() const = 0;
1000
1012 virtual AgentEdge* link(Agent* src_agent, Agent* tgt_agent, api::graph::LayerId layer) = 0;
1019 virtual void unlink(AgentEdge* edge) = 0;
1020
1027
1032
1041 virtual void clear() = 0;
1042 public:
1043 virtual ~Model(){}
1044 };
1045
1050}}}
1051#endif
Definition: communication.h:251
Definition: distributed_edge.h:91
Definition: distributed_graph.h:169
Definition: distributed_node.h:28
Definition: load_balancing.h:92
Definition: model.h:547
virtual api::scheduler::Job & agentExecutionJob()=0
virtual void addEventHandler(Event event, api::utils::Callback< Agent * > *callback)=0
virtual void remove(Agent *agent)=0
virtual const Behavior & behavior()=0
virtual void removeEventHandler(Event event, api::utils::Callback< Agent * > *callback)=0
virtual GroupId groupId() const =0
virtual std::vector< Agent * > localAgents() const =0
virtual api::scheduler::JobList jobs() const =0
virtual void insert(AgentPtr *agent)=0
virtual void add(Agent *agent)=0
virtual api::scheduler::Job & job()=0
virtual std::vector< Agent * > agents() const =0
Event
Definition: model.h:552
@ REMOVE
Definition: model.h:568
@ ADD
Definition: model.h:564
@ INSERT
Definition: model.h:556
@ ERASE
Definition: model.h:560
virtual void erase(AgentPtr *agent)=0
virtual std::vector< Agent * > distantAgents() const =0
Definition: model.h:92
AgentPtr()
Definition: model.h:97
AgentPtr(api::model::Agent *agent)
Definition: model.h:103
AgentPtr & operator=(AgentPtr &&other)
Definition: model.cpp:23
~AgentPtr()
Definition: model.cpp:36
Definition: model.h:497
virtual const AgentPtr & agent() const =0
Definition: model.h:174
virtual void act()=0
virtual TypeId typeId() const =0
virtual void copyAssign(Agent *agent)=0
virtual Agent * copy() const =0
virtual void setNode(AgentNode *node)=0
virtual std::list< Agent * >::iterator getGroupPos(api::model::GroupId gid) const =0
virtual void setTask(AgentTask *task)=0
virtual void addGroup(AgentGroup *group)=0
virtual void addGroupId(GroupId id)=0
virtual void setModel(Model *model)=0
virtual void setGroupPos(api::model::GroupId gid, std::list< Agent * >::iterator pos)=0
virtual void setGroupId(GroupId id)=0
virtual void removeGroup(AgentGroup *group)=0
virtual Model * model()=0
virtual AgentNode * node()=0
virtual const std::unordered_map< GroupId, AgentTask * > & tasks()=0
virtual void moveAssign(Agent *agent)=0
virtual AgentTask * task()=0
virtual AgentGroup * group()=0
virtual void setGroup(AgentGroup *group)=0
virtual std::vector< GroupId > groupIds() const =0
virtual GroupId groupId() const =0
virtual std::vector< AgentGroup * > groups()=0
virtual void removeGroupId(GroupId id)=0
Definition: model.h:520
virtual void execute(Agent *agent) const =0
Definition: model.h:841
virtual AgentGroup & getGroup(GroupId id) const =0
virtual void clear()=0
virtual void insert(GroupId id, AgentGroup *group)=0
virtual const AgentGraph & graph() const =0
virtual void removeGroup(AgentGroup &group)=0
virtual api::runtime::Runtime & runtime()=0
virtual const std::unordered_map< GroupId, AgentGroup * > & groups() const =0
virtual const api::runtime::Runtime & runtime() const =0
virtual void unlink(AgentEdge *edge)=0
virtual api::communication::MpiCommunicator & getMpiCommunicator()=0
virtual AgentGroup & buildGroup(GroupId id, const Behavior &behavior)=0
virtual AgentEdge * link(Agent *src_agent, Agent *tgt_agent, api::graph::LayerId layer)=0
virtual api::scheduler::Scheduler & scheduler()=0
virtual AgentGroup & buildGroup(GroupId id)=0
virtual const api::communication::MpiCommunicator & getMpiCommunicator() const =0
virtual const api::scheduler::Scheduler & scheduler() const =0
virtual const api::scheduler::Job & loadBalancingJob() const =0
virtual AgentGraph & graph()=0
Definition: model.h:462
virtual void seed(std::FPMAS_AGENT_RNG::result_type seed)=0
virtual api::random::Generator< std::FPMAS_AGENT_RNG::result_type > & rd()=0
Definition: generator.h:20
Definition: runtime.h:18
Definition: scheduler.h:135
Definition: scheduler.h:117
Definition: scheduler.h:302
Definition: ptr_wrapper.h:21
int LayerId
Definition: edge.h:13
api::graph::SetLocalNodeEvent< AgentPtr > SetAgentLocalEvent
Definition: model.h:59
int GroupId
Definition: model.h:78
api::utils::PtrWrapper< api::model::Agent > WeakAgentPtr
Definition: model.h:160
api::graph::DistributedNode< AgentPtr > AgentNode
Definition: model.h:40
std::type_index TypeId
Definition: model.h:82
api::graph::DistributedGraph< AgentPtr >::SetDistantNodeCallback SetAgentDistantCallback
Definition: model.h:73
api::graph::DistributedGraph< AgentPtr > AgentGraph
Definition: model.h:54
api::graph::DistributedEdge< AgentPtr > AgentEdge
Definition: model.h:49
api::graph::SetDistantNodeEvent< AgentPtr > SetAgentDistantEvent
Definition: model.h:68
std::vector< std::reference_wrapper< AgentGroup > > GroupList
Definition: model.h:833
api::graph::DistributedGraph< AgentPtr >::SetLocalNodeCallback SetAgentLocalCallback
Definition: model.h:64
std::vector< std::reference_wrapper< const Job > > JobList
Definition: scheduler.h:215
Definition: fpmas.cpp:3
Definition: distributed_graph.h:99
Definition: distributed_graph.h:42
Definition: callback.h:33