31 #ifndef __adevs_simulator_h_ 32 #define __adevs_simulator_h_ 33 #include "adevs_abstract_simulator.h" 34 #include "adevs_models.h" 35 #include "adevs_event_listener.h" 36 #include "adevs_sched.h" 37 #include "adevs_bag.h" 38 #include "adevs_set.h" 39 #include "object_pool.h" 55 template <
class X,
class T =
double>
class Simulator:
56 public AbstractSimulator<X,T>,
57 private Schedule<X,T>::ImminentVisitor
71 schedule(model,adevs_zero<T>());
79 return sched.minPriority();
144 schedule(model,adevs_zero<T>());
158 bool allow_mealy_input, io_up_to_date;
162 object_pool<Bag<X> > io_pool;
163 object_pool<Bag<Event<X,T> > > recv_pool;
170 struct bottom_to_top_depth_compare
174 unsigned long int d1 = 0, d2 = 0;
190 if (d1 == d2)
return m1 < m2;
195 struct top_to_bottom_depth_compare
199 unsigned long int d1 = 0, d2 = 0;
215 if (d1 == d2)
return m1 < m2;
220 std::set<Network<X,T>*,bottom_to_top_depth_compare> model_func_eval_set;
221 std::set<Devs<X,T>*,top_to_bottom_depth_compare> sorted_removed;
256 template <
class X,
class T>
259 assert(model->y == NULL);
264 assert(model->y == NULL);
266 if (model->x == NULL)
270 model->y = io_pool.make_obj();
272 if (model->x == NULL)
279 y_iter != model->y->
end(); y_iter++)
285 template <
class X,
class T>
289 if (io_up_to_date && !(io_time == t))
292 for (iter = activated.
begin(); iter != activated.
end(); iter++)
300 allow_mealy_input =
true;
301 if (t == sched.minPriority() && !io_up_to_date)
302 sched.visitImminent(
this);
304 for (
typename Bag<
Event<X,T> >::iterator iter = input.begin();
305 iter != input.end(); iter++)
310 inject_event(amodel,(*iter).value);
314 route((*iter).model->typeIsNetwork(),(*iter).model,(*iter).value);
318 allow_mealy_input =
false;
321 m_iter != mealy.end(); m_iter++)
324 assert(model->y == NULL);
325 model->y = io_pool.make_obj();
327 if (model->x == NULL)
328 activated.insert(model);
333 if (model->x == NULL)
341 assert(model->x != NULL);
343 model->
output_func(sched.minPriority()-model->tL,*(model->x),*(model->y));
349 m_iter != mealy.end(); m_iter++)
354 y_iter != model->y->end(); y_iter++)
361 io_up_to_date =
true;
366 template<
class X,
class T>
372 template <
class X,
class T>
376 assert(io_time == t && io_up_to_date);
380 template <
class X,
class T>
385 io_up_to_date =
false;
386 T t = io_time, tQ = io_time + adevs_epsilon<T>();
394 #pragma omp parallel for 396 for (
unsigned i = 0; i < activated.size(); i++)
400 if (model->x == NULL)
403 else if (model->y != NULL)
407 model->
delta_ext(t-model->tL,*(model->x));
416 model_func_eval_set.insert(model->
getParent());
431 if (model_func_eval_set.empty() ==
false)
433 while (!model_func_eval_set.empty())
435 Network<X,T>* network_model = *(model_func_eval_set.begin());
436 model_func_eval_set.erase(model_func_eval_set.begin());
437 getAllChildren(network_model,prev);
441 model_func_eval_set.insert(network_model->
getParent());
443 getAllChildren(network_model,next);
459 for (
typename Bag<
Devs<X,T>*>::iterator iter = added.begin();
460 iter != added.end(); iter++)
467 for (
typename Bag<
Devs<X,T>*>::iterator iter = removed.begin();
468 iter != removed.end(); iter++)
471 unschedule_model(*iter);
473 sorted_removed.insert(*iter);
478 while (!sorted_removed.empty())
481 Devs<X,T>* model_to_remove = *(sorted_removed.begin());
483 sorted_removed.erase(sorted_removed.begin());
492 for (; iter != prev.end(); iter++)
493 sorted_removed.erase(*iter);
497 delete model_to_remove;
500 assert(prev.empty());
501 assert(sorted_removed.empty());
505 for (
typename Bag<
Atomic<X,T>*>::iterator iter = activated.begin();
506 iter != activated.end(); iter++)
514 template <
class X,
class T>
520 if (amodel->x != NULL)
523 io_pool.destroy_obj(amodel->x);
526 if (amodel->y != NULL)
530 io_pool.destroy_obj(amodel->y);
542 for (
typename Set<
Devs<X,T>*>::iterator iter = components.begin();
543 iter != components.end(); iter++)
550 template <
class X,
class T>
562 for (
typename Set<
Devs<X,T>*>::iterator iter = components.begin();
563 iter != components.end(); iter++)
565 unschedule_model(*iter);
570 template <
class X,
class T>
578 if (dt == adevs_inf<T>())
580 sched.schedule(a,adevs_inf<T>());
587 exception err(
"Negative time advance",a);
590 sched.schedule(a,tNext);
597 typename Set<Devs<X,T>*>::iterator iter = components.begin();
598 for (; iter != components.end(); iter++)
605 template <
class X,
class T>
612 if (allow_mealy_input)
614 assert(model->y == NULL);
621 exception err(
"Mealy model coupled to a Mealy model",model);
626 if (model->x == NULL)
628 if (model->y == NULL)
629 activated.insert(model);
630 model->x = io_pool.make_obj();
635 template <
class X,
class T>
642 if (parent == NULL)
return;
645 parent->
route(x,src,*recvs);
649 for (; recv_iter != recvs->
end(); recv_iter++)
652 if (src == (*recv_iter).model)
654 exception err(
"Model tried to influence self",src);
664 inject_event(amodel,(*recv_iter).value);
667 else if ((*recv_iter).model == parent)
669 route(parent->
getParent(),parent,(*recv_iter).value);
674 route((*recv_iter).model->typeIsNetwork(),
675 (*recv_iter).model,(*recv_iter).value);
679 recv_pool.destroy_obj(recvs);
682 template <
class X,
class T>
689 s.insert(tmp.begin(),tmp.end());
692 for (iter = tmp.begin(); iter != tmp.end(); iter++)
694 if ((*iter)->typeIsNetwork() != NULL)
696 getAllChildren((*iter)->typeIsNetwork(),s);
701 template <
class X,
class T>
706 for (iter = activated.
begin(); iter != activated.
end(); iter++)
Atomic< X, T > * typeIsAtomic()
Returns a pointer to this model.
Definition: adevs_models.h:210
Definition: adevs_models.h:51
virtual void output_func(T e, const Bag< X > &xb, Bag< X > &yb)=0
virtual void route(const X &value, Devs< X, T > *model, Bag< Event< X, T > > &r)=0
Definition: adevs_abstract_simulator.h:45
Definition: adevs_set.h:42
void execNextEvent()
Execute the simulation cycle at time nextEventTime()
Definition: adevs_simulator.h:82
void computeNextOutput()
Definition: adevs_simulator.h:367
Definition: adevs_models.h:46
Definition: adevs_models.h:50
void clear()
Remove all of the elements from the bag.
Definition: adevs_bag.h:144
virtual void gc_output(Bag< X > &g)=0
void notify_output_listeners(Devs< X, T > *model, const X &value, T t)
Notify listeners of an output event.
Definition: adevs_abstract_simulator.h:79
void addModel(Atomic< X, T > *model)
Definition: adevs_simulator.h:142
virtual void delta_int()=0
Internal transition function.
iterator begin() const
Get an iterator pointing to the first element in the bag.
Definition: adevs_bag.h:128
virtual void getComponents(Set< Devs< X, T > * > &c)=0
Definition: adevs_exception.h:43
virtual MealyAtomic< X, T > * typeIsMealyAtomic()
Returns NULL if this is not a mealy atomic model; returns itself otherwise.
Definition: adevs_models.h:80
Definition: adevs_models.h:49
iterator end() const
Get an iterator to the end of the bag (i.e., just after the last element)
Definition: adevs_bag.h:130
virtual void output_func(Bag< X > &yb)=0
virtual Network< X, T > * typeIsNetwork()
Definition: adevs_models.h:76
Definition: adevs_fmi.h:57
virtual bool model_transition()
Definition: adevs_models.h:107
void set_assign_diff(Bag< T > &result, const Set< T > &A, const Set< T > &B)
Set difference operator. Returns the set A-B.
Definition: adevs_set.h:48
T nextEventTime()
Definition: adevs_simulator.h:77
void execUntil(T tend)
Execute until nextEventTime() > tend.
Definition: adevs_simulator.h:87
virtual Atomic< X, T > * typeIsAtomic()
Returns NULL if this is not an atomic model; returns itself otherwise.
Definition: adevs_models.h:78
~Simulator()
Definition: adevs_simulator.h:702
virtual void delta_ext(T e, const Bag< X > &xb)=0
Definition: adevs_models.h:59
virtual void delta_conf(const Bag< X > &xb)=0
Definition: adevs_models.h:117
void computeNextState()
Definition: adevs_simulator.h:381
void insert(const T &t)
Put t into the bag.
Definition: adevs_bag.h:153
Definition: adevs_models.h:47
Simulator(Devs< X, T > *model)
Definition: adevs_simulator.h:66
const Network< X, T > * getParent() const
Definition: adevs_models.h:85
void notify_state_listeners(Atomic< X, T > *model, T t)
Notify listeners of a state change.
Definition: adevs_abstract_simulator.h:90
Definition: adevs_models.h:48
Definition: adevs_bag.h:45