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>());
154 bool allow_mealy_input, io_up_to_date;
158 object_pool<Bag<X> > io_pool;
159 object_pool<Bag<Event<X,T> > > recv_pool;
166 struct bottom_to_top_depth_compare
170 unsigned long int d1 = 0, d2 = 0;
186 if (d1 == d2)
return m1 < m2;
191 struct top_to_bottom_depth_compare
195 unsigned long int d1 = 0, d2 = 0;
211 if (d1 == d2)
return m1 < m2;
216 std::set<Network<X,T>*,bottom_to_top_depth_compare> model_func_eval_set;
217 std::set<Devs<X,T>*,top_to_bottom_depth_compare> sorted_removed;
252 template <
class X,
class T>
255 assert(model->y == NULL);
260 assert(model->y == NULL);
262 if (model->x == NULL)
266 model->y = io_pool.make_obj();
268 if (model->x == NULL)
275 y_iter != model->y->
end(); y_iter++)
281 template <
class X,
class T>
285 if (io_up_to_date && !(io_time == t))
288 for (iter = activated.
begin(); iter != activated.
end(); iter++)
296 allow_mealy_input =
true;
297 if (t == sched.minPriority() && !io_up_to_date)
298 sched.visitImminent(
this);
300 for (
typename Bag<
Event<X,T> >::iterator iter = input.begin();
301 iter != input.end(); iter++)
306 inject_event(amodel,(*iter).value);
310 route((*iter).model->typeIsNetwork(),(*iter).model,(*iter).value);
314 allow_mealy_input =
false;
317 m_iter != mealy.end(); m_iter++)
320 assert(model->y == NULL);
321 model->y = io_pool.make_obj();
323 if (model->x == NULL)
324 activated.insert(model);
329 if (model->x == NULL)
336 assert(model->x != NULL);
338 model->
output_func(sched.minPriority()-model->tL,*(model->x),*(model->y));
344 m_iter != mealy.end(); m_iter++)
349 y_iter != model->y->end(); y_iter++)
356 io_up_to_date =
true;
361 template<
class X,
class T>
367 template <
class X,
class T>
371 assert(io_time == t && io_up_to_date);
375 template <
class X,
class T>
380 io_up_to_date =
false;
381 T t = io_time, tQ = io_time + adevs_epsilon<T>();
389 #pragma omp parallel for 391 for (
unsigned i = 0; i < activated.size(); i++)
395 if (model->x == NULL)
405 model->
delta_ext(t-model->tL,*(model->x));
414 model_func_eval_set.insert(model->
getParent());
429 if (model_func_eval_set.empty() ==
false)
431 while (!model_func_eval_set.empty())
433 Network<X,T>* network_model = *(model_func_eval_set.begin());
434 model_func_eval_set.erase(model_func_eval_set.begin());
435 getAllChildren(network_model,prev);
439 model_func_eval_set.insert(network_model->
getParent());
441 getAllChildren(network_model,next);
457 for (
typename Bag<
Devs<X,T>*>::iterator iter = added.begin();
458 iter != added.end(); iter++)
465 for (
typename Bag<
Devs<X,T>*>::iterator iter = removed.begin();
466 iter != removed.end(); iter++)
469 unschedule_model(*iter);
471 sorted_removed.insert(*iter);
476 while (!sorted_removed.empty())
479 Devs<X,T>* model_to_remove = *(sorted_removed.begin());
481 sorted_removed.erase(sorted_removed.begin());
490 for (; iter != prev.end(); iter++)
491 sorted_removed.erase(*iter);
495 delete model_to_remove;
498 assert(prev.empty());
499 assert(sorted_removed.empty());
503 for (
typename Bag<
Atomic<X,T>*>::iterator iter = activated.begin();
504 iter != activated.end(); iter++)
512 template <
class X,
class T>
518 if (amodel->x != NULL)
521 io_pool.destroy_obj(amodel->x);
524 if (amodel->y != NULL)
528 io_pool.destroy_obj(amodel->y);
540 for (
typename Set<
Devs<X,T>*>::iterator iter = components.begin();
541 iter != components.end(); iter++)
548 template <
class X,
class T>
560 for (
typename Set<
Devs<X,T>*>::iterator iter = components.begin();
561 iter != components.end(); iter++)
563 unschedule_model(*iter);
568 template <
class X,
class T>
576 if (dt == adevs_inf<T>())
581 sched.schedule(a,adevs_inf<T>());
588 exception err(
"Negative time advance",a);
594 sched.schedule(a,tNext);
601 typename Set<Devs<X,T>*>::iterator iter = components.begin();
602 for (; iter != components.end(); iter++)
609 template <
class X,
class T>
616 if (allow_mealy_input)
618 assert(model->y == NULL);
625 exception err(
"Mealy model coupled to a Mealy model",model);
630 if (model->x == NULL)
632 if (model->y == NULL)
633 activated.insert(model);
634 model->x = io_pool.make_obj();
639 template <
class X,
class T>
646 if (parent == NULL)
return;
649 parent->
route(x,src,*recvs);
653 for (; recv_iter != recvs->
end(); recv_iter++)
662 inject_event(amodel,(*recv_iter).value);
665 else if ((*recv_iter).model == parent)
667 route(parent->
getParent(),parent,(*recv_iter).value);
672 route((*recv_iter).model->typeIsNetwork(),
673 (*recv_iter).model,(*recv_iter).value);
677 recv_pool.destroy_obj(recvs);
680 template <
class X,
class T>
687 s.insert(tmp.begin(),tmp.end());
690 for (iter = tmp.begin(); iter != tmp.end(); iter++)
692 if ((*iter)->typeIsNetwork() != NULL)
694 getAllChildren((*iter)->typeIsNetwork(),s);
699 template <
class X,
class T>
704 for (iter = activated.
begin(); iter != activated.
end(); iter++)
Atomic< X, T > * typeIsAtomic()
Returns a pointer to this model.
Definition: adevs_models.h:209
Definition: adevs_models.h:50
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:362
Definition: adevs_models.h:46
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:79
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:75
Definition: adevs_fmi.h:57
virtual bool model_transition()
Definition: adevs_models.h:106
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:77
~Simulator()
Definition: adevs_simulator.h:700
virtual void delta_ext(T e, const Bag< X > &xb)=0
Definition: adevs_models.h:58
virtual void delta_conf(const Bag< X > &xb)=0
Definition: adevs_models.h:116
void computeNextState()
Definition: adevs_simulator.h:376
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:84
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