3 #include "adevs_base.h" 10 template <
typename DataType,
typename TimeType>
class Network;
21 template <
typename DataType,
typename TimeType=Time>
23 public Model<DataType,TimeType>
40 friend class Network<DataType,TimeType>;
52 template <
typename DataType,
typename TimeType=Time>
54 public Devs<DataType,TimeType>
59 virtual void delta_int() = 0;
61 virtual void delta_ext(TimeType e, std::vector<DataType>& x) = 0;
63 virtual void delta_conf(std::vector<DataType>& x) = 0;
65 virtual TimeType ta() = 0;
73 virtual void output_func(std::vector<DataType>& y) = 0;
89 std::vector<DataType> y;
90 enum Mode { STATE_CHANGE, OUTPUT, PASSIVE };
95 template <
typename DataType,
typename TimeType>
100 return (tN = schedule_internal_events(env));
103 template <
typename DataType,
typename TimeType>
107 assert(mode != PASSIVE);
109 if (mode == STATE_CHANGE)
113 tN = schedule_internal_events(env);
119 transmit_output(env);
121 tN = env->
now() + adevs_epsilon<TimeType>();
126 template <
typename DataType,
typename TimeType>
131 if (env->
now() < tN || (env->
now() == tN && mode != STATE_CHANGE))
133 delta_ext(env->
now()-tL,x);
135 tN = schedule_internal_events(env);
142 tN = schedule_internal_events(env);
147 template <
typename DataType,
typename TimeType>
157 if (h == adevs_zero<TimeType>())
159 transmit_output(env);
161 return env->
now() + adevs_epsilon<TimeType>();
166 if (h < adevs_inf<TimeType>())
176 template <
typename DataType,
typename TimeType>
180 for (
unsigned i = 0; i < y.size() && this->
parent() != NULL; i++)
181 env->
send(
this,this->parent(),y[i]);
192 template <
typename DataType,
typename TimeType=Time>
194 public Devs<DataType,TimeType>
203 model->m_parent =
this;
226 return adevs_inf<TimeType>();
233 std::pair<Model<DataType,TimeType>*,DataType>
relay(
236 std::vector<std::pair<Model<DataType,TimeType>*,DataType> > msgs;
241 template <
typename DataType,
typename TimeType>
242 std::pair<Model<DataType,TimeType>*,DataType>
248 if (src == this->
parent() || src == NULL)
256 while (pos < msgs.size())
259 if (msgs[pos].first !=
this)
264 if (this->
parent() != NULL)
266 msgs[pos].first = this->
parent();
273 return std::pair<Model<DataType,TimeType>*,DataType>(NULL,x);
277 template <
typename DataType>
287 port(port),value(value){}
291 template <
typename DataType,
typename TimeType=Time>
293 public Network<port_value<DataType>,TimeType>
319 std::set<Devs<port_value<DataType>,TimeType>* > models;
320 std::map<std::pair<Model<port_value<DataType>,TimeType>*,
int>,
321 std::vector<std::pair<Model<port_value<DataType>,TimeType>*,
int> > > graph;
324 template <
typename DataType,
typename TimeType>
327 typename std::set<Devs<port_value<DataType>,TimeType>* >::iterator iter =
329 for (; iter != models.end(); iter++)
334 template <
typename DataType,
typename TimeType>
338 typename std::set<Devs<port_value<DataType>,TimeType>* >::iterator iter =
340 for (; iter != models.end(); iter++)
344 this->assign_parent(*iter);
350 template <
typename DataType,
typename TimeType>
357 std::pair<Model<port_value<DataType>,TimeType>*,
int> a(src,src_port);
358 std::pair<Model<port_value<DataType>,TimeType>*,
int> b(dst,dst_port);
359 graph[a].push_back(b);
362 template <
typename DataType,
typename TimeType>
368 std::pair<Model<port_value<DataType>,TimeType>*,
int> a(src,data.
port);
369 typename std::map<std::pair<Model<port_value<DataType>,TimeType>*,
int>,
370 std::vector<std::pair<Model<port_value<DataType>,TimeType>*,
int> > >::const_iterator
371 iter = graph.find(a);
372 if (iter != graph.end())
374 const std::vector<std::pair<Model<port_value<DataType>,TimeType>*,
int> >&
375 link = (*iter).second;
376 for (
unsigned i = 0; i < link.size(); i++)
378 data.
port = link[i].second;
381 link[i].first,data));
391 template <
typename DataType,
typename TimeType=Time>
393 public Network<DataType,TimeType>
415 std::set<Devs<DataType,TimeType>* > models;
416 std::map<Model<DataType,TimeType>*,
417 std::vector<Model<DataType,TimeType>* > > graph;
420 template <
typename DataType,
typename TimeType>
423 typename std::set<Devs<DataType,TimeType>* >::iterator iter =
425 for (; iter != models.end(); iter++)
430 template <
typename DataType,
typename TimeType>
433 typename std::set<Devs<DataType,TimeType>* >::iterator iter =
435 for (; iter != models.end(); iter++)
439 this->assign_parent(*iter);
445 template <
typename DataType,
typename TimeType>
451 graph[src].push_back(dst);
454 template <
typename DataType,
typename TimeType>
460 typename std::map<Model<DataType,TimeType>*,
461 std::vector<Model<DataType,TimeType>* > >::const_iterator
462 iter = graph.find(src);
463 if (iter != graph.end())
465 const std::vector<Model<DataType,TimeType>*>& link =
467 for (
unsigned i = 0; i < link.size(); i++)
DataType value
The message data.
Definition: adevs_pdevs.h:283
virtual void add(Model< DataType, TimeType > *model)=0
Add a model to the simulator.
void couple(Devs< port_value< DataType >, TimeType > *src, int src_port, Devs< port_value< DataType >, TimeType > *dst, int dst_port)
Create a link in the network.
Definition: adevs_pdevs.h:351
std::pair< Model< DataType, TimeType > *, DataType > relay(Model< DataType, TimeType > *src, DataType x)
Relay uses the route method to redirect messages. Do not override.
Definition: adevs_pdevs.h:243
void route(Model< port_value< DataType >, TimeType > *src, port_value< DataType > data, std::vector< std::pair< Model< port_value< DataType >, TimeType > *, port_value< DataType > > > &msgs)
The network's route method. Do not override.
Definition: adevs_pdevs.h:363
port_value(int port, DataType value)
Assigns initial values to port and value.
Definition: adevs_pdevs.h:286
void assign_parent(Devs< DataType, TimeType > *model)
Set the parent of a model to be this Network.
Definition: adevs_pdevs.h:202
virtual std::pair< Model< DataType, TimeType > *, DataType > relay(Model< DataType, TimeType > *src, DataType x)
Relay a message to another model.
Definition: adevs_base.h:141
int port
Port on which the data is sent or arriving.
Definition: adevs_pdevs.h:281
void add(SimEnv< DataType, TimeType > *env)
Adds this model to the simulation context.
Definition: adevs_pdevs.h:85
A simple graph model.
Definition: adevs_pdevs.h:392
virtual void add(SimEnv< DataType, TimeType > *env)=0
Add this model and any submodels to the simulation.
Data type for a Digraph model.
Definition: adevs_pdevs.h:278
This is a Parallel DEVS network model.
Definition: adevs_pdevs.h:10
void fini(TimeType)
No op fini.
Definition: adevs_pdevs.h:83
virtual ~Network()
Destructor.
Definition: adevs_pdevs.h:221
virtual TimeType init(SimEnv< DataType, TimeType > *env)=0
Called when the model is added to the simulation.
void fini(TimeType)
No op fini.
Definition: adevs_pdevs.h:231
Definition: adevs_base.h:21
TimeType init(SimEnv< DataType, TimeType > *)
No op init.
Definition: adevs_pdevs.h:229
virtual TimeType update(SimEnv< DataType, TimeType > *env, std::vector< DataType > &x)=0
Called to assign a new state to the model at now() when input is present.
virtual void send(Model< DataType, TimeType > *src, Model< DataType, TimeType > *dst, DataType data)=0
Send a message to a model.
TimeType update(SimEnv< DataType, TimeType > *, std::vector< DataType > &)
No op update.
Definition: adevs_pdevs.h:225
This is the base class for all components in a Parallel DEVS model.
Definition: adevs_pdevs.h:22
void couple(Devs< DataType, TimeType > *src, Devs< DataType, TimeType > *dst)
Create a link in the network.
Definition: adevs_pdevs.h:446
TimeType init(SimEnv< DataType, TimeType > *env)
Schedules the first output event. Do not override this method.
Definition: adevs_pdevs.h:96
void add(SimEnv< port_value< DataType >, TimeType > *env)
Add this model and its submodels to the simulation context. You must couple your models first...
Definition: adevs_pdevs.h:335
Interface to a simulation context for sending messages, getting the time, and adding or removing mode...
Definition: adevs_base.h:38
TimeType update(SimEnv< DataType, TimeType > *env)
Definition: adevs_pdevs.h:104
A typical digraph network model with port value pairs for input and output.
Definition: adevs_pdevs.h:292
This class offers the standard PDEVS interface for an atomic model.
Definition: adevs_pdevs.h:53
TimeType update(SimEnv< DataType, TimeType > *)
No op update.
Definition: adevs_pdevs.h:223
A model in the simulation.
Definition: adevs_base.h:24
void route(Model< DataType, TimeType > *src, DataType data, std::vector< std::pair< Model< DataType, TimeType > *, DataType > > &msgs)
The network's route method. Do not override.
Definition: adevs_pdevs.h:455
Network< DataType, TimeType > * parent() const
Get the parent of this model.
Definition: adevs_pdevs.h:34
void add(SimEnv< DataType, TimeType > *env)
Add this model and its submodels to the simulation context. You must couple your models first...
Definition: adevs_pdevs.h:431
virtual TimeType now()=0
Get the current time.