Generator
in
DEVSsharp/ModelBase/Generator.cs
produces jobs depending on
(1) autonomous mode, (2) generating delay pdf, and (3) producing
job spectrum.
If Generator
's bool m_bAutonomous
filed is
true
then Generator
keeps producing at Work
phase, while it is false
then Generator
will be
waiting for an external pull signal through the input port,
ips
as shown in Figure 4.6(b).
The generating time delay at Work
phase of Generator
can be determined by an random variable rv
of a given pdf,
m_PDFofInterGenerating
.
The job spectrum can be determined by a PMF in which the
probability of each job class is described. For more detail
information for the class of PVofPMF
, revisit to Section
2.4. The following codes show the interface
ports, and internal data fields. Here int m_no_gen
is used
for tracking the job id which will be unique during a simulation
run.
public class Generator: Atomic { public OutputPort oout;//-- output port for job public InputPort ips;//-- pull signal port bool m_bAutonomous; // automatic or manual RVofPMF<Job> m_JobSpectrum; //-- Job Spectrum RVofPDF m_PDFofInterGenerating; // pdf of inter-generating time int m_no_gen; //-- to no of generating: used for job.id enum PHASE { Wait, Work } PHASE m_phase;
The constructor of Generator
needs five arguments: (1)
name
as a string, (2) TimeUnit
tu
, (3)
bool
auto
indicating autonomous or non-autonomous
which is assign to the internal variable m_bAutonomous
, (4)
InterGenerating
PDF as RVofPDF
, and (5) Job spectrum
as RVofPMF<Job>
as follows.
public Generator(string name, TimeUnit tu, bool auto, RVofPDF InterGenerating, RVofPMF<Job> JobSelection):base(name,tu){...}
Generator::init()
resets m_no_gen
to zero. m_phase
is set
to Work
if m_bAutonomous
is true
, otherwise, it is set to
Wait
. If m_JobSpectrum
is not null m_statistics
is
initialized by each type of job available in m_JobSpectrum
.
m_statistics
of Generator
will collect statistics
how may jobs have been produced.
public override void init() { m_no_gen = 0; // if (m_bAutonomous) m_phase = PHASE.Work; else m_phase = PHASE.Wait; if (m_JobSpectrum != null) { foreach (Job job in m_JobSpectrum.pmf.Keys) m_statistics.Add(job.type.ToString(), 0.0); } }
When the phase of Generator
is Work
,
Generator::tau()
returns a random value from the pdf
m_PDFofInterGenerating
(which is set through the constructor
function of Generator
). If Generator
's phase is
Wait
, it returns the infinity as the lifespan of
Wait
.
public override double tau() { if (m_phase == PHASE.Work) { double t = m_PDFofInterGenerating.RN(); return t; }else // PHASE.Wait return double.MaxValue; }
Generator::detla_x()
treats the situation that
Generator
is non-autonomous, and it receives the pull
signal through ips
port when it waits for the signal.
Otherwise, Generator
ignores any input signal.
public override bool delta_x(PortValue x) { if (m_bAutonomous == false && x.port == ips && m_phase == PHASE.Wait) { m_phase = PHASE.Work; return true; } return false; }
In Generator::detla_y()
, Generator
has a non-trivial
m_JobSpectrum
, Generator
picks one job by calling
m_JobSpectrum.SampleV()
and clones the picked job to
clnt
. The unique job id for clnt
is assigned. At
this time, Generator
stamps the current time into
clnt
's TimeMap
with its key value as the string
``SysIn
''. This event time will be used when collecting
System Time Performance Index by Transducer
that we will
look through later.
To collect of how many different jobs are generated,
Generator
accumulates the number of jobs generated with
respect to their job types.
After generating a job (or null job) through oout
port, if
Generator
is non-autonomous, it goes back to the phase
Wait
, otherwise it keep generating the next job by staying
its phase Work
.
public override void delta_y(ref PortValue y) { if (m_JobSpectrum != null && m_JobSpectrum.pmf.Count > 0) { Job clnt = (m_JobSpectrum.SampleV()).Clone(); clnt.id = ++m_no_gen; //-- (event, time) stamping clnt.TimeMap.Add("SysIn", Devs.TimeCurrent); y.Set(oout, clnt); m_statistics[clnt.type.ToString()] += 1; } else // no job value sent y.Set(oout); if (m_bActive == false) m_phase = PHASE.Wait; }