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" 56 template <
class X,
class T =
double>
class Simulator:
57 public AbstractSimulator<X,T>,
58 private Schedule<X,T>::ImminentVisitor
73 schedule(model,adevs_zero<T>());
81 return sched.minPriority();
146 schedule(model,adevs_zero<T>());
180 typedef enum { OUTPUT_OK, OUTPUT_NOT_OK, RESTORING_OUTPUT } OutputStatus;
185 LogicalProcess<X,T>* lp;
186 bool look_ahead, stop_forced;
187 OutputStatus out_flag;
199 bool allow_mealy_input, io_up_to_date;
203 object_pool<Bag<X> > io_pool;
204 object_pool<Bag<Event<X,T> > > recv_pool;
211 struct bottom_to_top_depth_compare
215 unsigned long int d1 = 0, d2 = 0;
231 if (d1 == d2)
return m1 < m2;
236 struct top_to_bottom_depth_compare
240 unsigned long int d1 = 0, d2 = 0;
256 if (d1 == d2)
return m1 < m2;
261 std::set<Network<X,T>*,bottom_to_top_depth_compare> model_func_eval_set;
262 std::set<Devs<X,T>*,top_to_bottom_depth_compare> sorted_removed;
310 template <
class X,
class T>
313 assert(model->y == NULL);
318 assert(model->y == NULL);
320 if (model->x == NULL)
324 model->y = io_pool.make_obj();
326 if (model->x == NULL)
333 y_iter != model->y->
end(); y_iter++)
339 template <
class X,
class T>
343 if (io_up_to_date && !(io_time == t))
346 for (iter = activated.
begin(); iter != activated.
end(); iter++)
354 allow_mealy_input =
true;
355 if (t == sched.minPriority() && !io_up_to_date)
356 sched.visitImminent(
this);
358 for (
typename Bag<
Event<X,T> >::iterator iter = input.begin();
359 iter != input.end(); iter++)
364 inject_event(amodel,(*iter).value);
368 route((*iter).model->typeIsNetwork(),(*iter).model,(*iter).value);
372 allow_mealy_input =
false;
375 m_iter != mealy.end(); m_iter++)
378 assert(model->y == NULL);
379 model->y = io_pool.make_obj();
381 if (model->x == NULL)
382 activated.insert(model);
387 if (model->x == NULL)
395 assert(model->x != NULL);
397 model->
output_func(sched.minPriority()-model->tL,*(model->x),*(model->y));
403 m_iter != mealy.end(); m_iter++)
408 y_iter != model->y->end(); y_iter++)
415 io_up_to_date =
true;
420 template<
class X,
class T>
426 template <
class X,
class T>
430 assert(io_time == t && io_up_to_date);
434 template <
class X,
class T>
439 io_up_to_date =
false;
447 for (
typename Bag<
Atomic<X,T>*>::iterator iter = activated.begin();
448 iter != activated.end(); iter++)
455 t = t + adevs_epsilon<T>();
462 if (model_func_eval_set.empty() ==
false)
464 while (!model_func_eval_set.empty())
466 Network<X,T>* network_model = *(model_func_eval_set.begin());
467 model_func_eval_set.erase(model_func_eval_set.begin());
468 getAllChildren(network_model,prev);
472 model_func_eval_set.insert(network_model->
getParent());
474 getAllChildren(network_model,next);
490 for (
typename Bag<
Devs<X,T>*>::iterator iter = added.begin();
491 iter != added.end(); iter++)
498 for (
typename Bag<
Devs<X,T>*>::iterator iter = removed.begin();
499 iter != removed.end(); iter++)
502 unschedule_model(*iter);
504 sorted_removed.insert(*iter);
509 while (!sorted_removed.empty())
512 Devs<X,T>* model_to_remove = *(sorted_removed.begin());
514 sorted_removed.erase(sorted_removed.begin());
523 for (; iter != prev.end(); iter++)
524 sorted_removed.erase(*iter);
528 delete model_to_remove;
531 assert(prev.empty());
532 assert(sorted_removed.empty());
536 for (
typename Bag<
Atomic<X,T>*>::iterator iter = activated.begin();
537 iter != activated.end(); iter++)
545 if (lps != NULL && lps->stop_forced)
552 template <
class X,
class T>
558 if (amodel->x != NULL)
561 io_pool.destroy_obj(amodel->x);
564 if (amodel->y != NULL)
568 io_pool.destroy_obj(amodel->y);
580 for (
typename Set<
Devs<X,T>*>::iterator iter = components.begin();
581 iter != components.end(); iter++)
588 template <
class X,
class T>
600 for (
typename Set<
Devs<X,T>*>::iterator iter = components.begin();
601 iter != components.end(); iter++)
603 unschedule_model(*iter);
608 template <
class X,
class T>
616 if (dt == adevs_inf<T>())
618 sched.schedule(a,adevs_inf<T>());
625 exception err(
"Negative time advance",a);
628 sched.schedule(a,tNext);
635 typename Set<Devs<X,T>*>::iterator iter = components.begin();
636 for (; iter != components.end(); iter++)
643 template <
class X,
class T>
650 if (allow_mealy_input)
652 assert(model->y == NULL);
659 exception err(
"Mealy model coupled to a Mealy model",model);
664 if (model->x == NULL)
666 if (model->y == NULL)
667 activated.insert(model);
668 model->x = io_pool.make_obj();
673 template <
class X,
class T>
677 if (parent != src && (lps == NULL || lps->out_flag != RESTORING_OUTPUT))
680 if (parent == NULL)
return;
683 parent->
route(x,src,*recvs);
687 for (; recv_iter != recvs->
end(); recv_iter++)
690 if (src == (*recv_iter).model)
692 exception err(
"Model tried to influence self",src);
703 if (lps == NULL || amodel->
getProc() == lps->lp->getID())
704 inject_event(amodel,(*recv_iter).value);
706 else if (lps->out_flag != RESTORING_OUTPUT)
707 lps->lp->notifyInput(amodel,(*recv_iter).value);
710 else if ((*recv_iter).model == parent)
712 route(parent->
getParent(),parent,(*recv_iter).value);
717 route((*recv_iter).model->typeIsNetwork(),
718 (*recv_iter).model,(*recv_iter).value);
722 recv_pool.destroy_obj(recvs);
725 template <
class X,
class T>
728 if (!manage_lookahead_data(model))
return;
730 if (model->x == NULL)
733 else if (model->y != NULL)
737 model->
delta_ext(t-model->tL,*(model->x));
743 model_func_eval_set.insert(model->
getParent());
747 template <
class X,
class T>
754 s.insert(tmp.begin(),tmp.end());
757 for (iter = tmp.begin(); iter != tmp.end(); iter++)
759 if ((*iter)->typeIsNetwork() != NULL)
761 getAllChildren((*iter)->typeIsNetwork(),s);
766 template <
class X,
class T>
771 for (iter = activated.
begin(); iter != activated.
end(); iter++)
777 template <
class X,
class T>
781 io_up_to_date =
false;
782 io_time = adevs_zero<T>();
783 lps =
new lp_support;
785 lps->look_ahead =
false;
786 lps->stop_forced =
false;
787 lps->out_flag = OUTPUT_OK;
790 template <
class X,
class T>
798 lps->look_ahead =
true;
799 if (!activated.empty())
800 lps->out_flag = OUTPUT_NOT_OK;
803 template <
class X,
class T>
809 template <
class X,
class T>
812 if (lps == NULL)
return;
814 for (; iter != lps->to_restore.end(); iter++)
816 (*iter)->endLookahead();
817 schedule(*iter,(*iter)->tL_cp);
818 (*iter)->tL_cp = adevs_sentinel<T>();
819 assert((*iter)->x == NULL);
820 assert((*iter)->y == NULL);
822 lps->to_restore.clear();
823 assert(activated.empty());
824 if (lps->out_flag == OUTPUT_NOT_OK)
826 lps->out_flag = RESTORING_OUTPUT;
828 lps->out_flag = OUTPUT_OK;
830 lps->look_ahead =
false;
831 lps->stop_forced =
false;
834 template <
class X,
class T>
837 if (lps == NULL)
return true;
838 if (lps->look_ahead && model->tL_cp < adevs_zero<T>())
840 lps->to_restore.insert(model);
841 model->tL_cp = model->tL;
848 lps->stop_forced =
true;
851 return !(lps->stop_forced);
Atomic< X, T > * typeIsAtomic()
Returns a pointer to this model.
Definition: adevs_models.h:258
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:84
void beginLookahead()
Definition: adevs_simulator.h:791
void lookNextEvent()
Definition: adevs_simulator.h:804
void computeNextOutput()
Definition: adevs_simulator.h:421
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:144
int getProc()
Definition: adevs_models.h:133
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:86
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
Definition: adevs_exception.h:80
virtual void output_func(Bag< X > &yb)=0
virtual Network< X, T > * typeIsNetwork()
Definition: adevs_models.h:82
Definition: adevs_fmi.h:56
virtual bool model_transition()
Definition: adevs_models.h:113
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
virtual void beginLookahead()
Definition: adevs_models.h:243
T nextEventTime()
Definition: adevs_simulator.h:79
void execUntil(T tend)
Execute until nextEventTime() > tend.
Definition: adevs_simulator.h:89
virtual Atomic< X, T > * typeIsAtomic()
Returns NULL if this is not an atomic model; returns itself otherwise.
Definition: adevs_models.h:84
~Simulator()
Definition: adevs_simulator.h:767
virtual void delta_ext(T e, const Bag< X > &xb)=0
Definition: adevs_models.h:64
virtual void delta_conf(const Bag< X > &xb)=0
Definition: adevs_models.h:145
void computeNextState()
Definition: adevs_simulator.h:435
void endLookahead()
Definition: adevs_simulator.h:810
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:67
Definition: adevs_exception.h:99
const Network< X, T > * getParent() const
Definition: adevs_models.h:91
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