modelling devs applications
Post on 02-Jan-2016
46 Views
Preview:
DESCRIPTION
TRANSCRIPT
Modelling DEVS applications
The CD++ tool
http://cell-devs.sce.carleton.ca/
http://www.sce.carleton.ca/faculty/wainer/CD++BuilderSetup.exe
http://www.sce.carleton.ca/faculty/wainer/setupCDpp.exe
Atomic: lowest level model, contains structural dynamics -- model level modularity
Coupled: composed of one or more atomic and/or coupled models -- hierarchical construction
Elements of an atomic model:
input ports
output ports
state variables
state transition functions
output function
time advance function
Elements of coupled model:
Components
Couplings
– Internal Couplings– External Input Couplings– External Output Couplings
Review of the DEVS formalism
Algorithmic languages State-based languages DEVS graph
– Node : sequential state– Arc : (XY{S}) ta(S)
Internal transition
External transition
out ! y=(s0) Internal Transition (i) ta(s0) (ii) out = (s0) , int(s0)=s1
External Transition ext(s0, t, (x,in))=s2
DEVS graphs
out ! (s0)
in ? x,t
DEVS graphs definition
state : stateId …stateId : lifetime
[modelname] atomic or coupled model name
I/O ports:in : inport1 inport2 ...out : outport1 outport2 ...
Internal transitions:int:source destination [outport!value]* ( { (action;)* } )(Action: complex function to generate an output).
External transitions :ext : source destination EXPRESSION ( { (action;)* } )? value
DEVS graphs definition
States (bubbles) Internal transitions (dotted lines)
Output_port!output_value External transitions (full lines)
Input_port?input_value I/O ports
TL=inf
TL=inf
TL=100 s
DEVS graphs analytical specification
[myAtomic]
in: Port1 PortY
out: PortX
state: Start Process Finish
int: Process Finish PortX!1
ext: Start Process Value(Port1)?0
ext: Finish Start Value(PortY)?1
Start: 0:0:10:0
Process: 0:0:10:0
Finish: 0:0:10:0
CD++ (1997/98)
• Basic tool following DEVS formalism.• Extension to include Cell-DEVS models.• High level specification language.
-operator==()-operator=()-receiveInitMessage()-receiveInternalMessage()-receiveOutputMessage()-receiveExternalMessage()-receiveDoneMessage()-receiveCollectMessage()+nextChange()+lastChange()+absoluteNext()
+Model+externalMsgs-next-last-processorId
Processor
+initialize()+finalize()+simulate()+receiveOutputMessage()+receiveDoneMessage()+stop()+addExternalEvent()+stopTime()+addDeadline()
-externalEvents : EventList-deadlines : DeadlineList
Root
Simulator
+imminentChildren()
-syncSet : ModelId
Coordinator
+addExternalMessage()+eraseAll()
-msgs : MessageList-msgCout : int-msgTime : Time
MessageBag
+currentTime() : Time
-hour -min -sec -msec
Time
+imminentChildren()+nextChange()+lastChange()+absoluteNext()
-syncSet : ModelId
FlatDEVSCoordinator
+generateRoot()+generateProcessor()+add2DB()
-procDB : ProcessorDB-procIdCount : ProcId
ProcessorAdmin
11
11
+addInputPort()+addOutputPort()+nextChange()+lastChange()+sendOutput()
-ident : ModelId-parent_id : ModelId-execId : ModelId-inputList : PortList-outputList : PortList
Model
+operator ==()+registerAtomic()+newAtomic()+newCoupled()
-kinds : AtomicKinds-types : AtomicTypes
ModelAdmin
+addModel()+children()+addInfluence()
-childs : ModelList
Coupled
+operator=()+operator==()+initFunction()+externalFunction()+internalFunction()+outputFunction()+confluentFunction ()+holdIn()+passivate()+state()
Atomic
+influences()+model()+addInfluence()+delInfluence()+findInfluence()+pDriver()
-influenceList : PortList-pid : PortId-portName-mid : ModelId
Port
1
*
+run()+registerNewAtomics()+isFlatDEVS()+loadModels()+loadExternalEvents()+loadPorts()+loadLinks()+loadFlattenLinks()+updateOutLinks()+updateAtomicOutLinks()+addFlattenedLinksToFlatTop()+elapsedTime() : Time+registerTopPorts()
MainSimulator
+sendTo()+time()+procId()+operator==()+operator=()+clone()+type()
-time : Time-proc : ProcId
Message
+operator==()+operator=()+run()+stop()+send()
-unprocessedQueue : UnprocessedMsgQueue
MessageAdmin
1*
InitMessage
1
*
DoneMessage
+port() : Port+value() : double
-port : Port-value : double
OutputMessageInternalMessage
+port() : Port+value() : double
-port : Port-value : double
ExternalMessage
CollectMessage
Messaging Subsystem
Simulation Subsystem
Modeling Subsystem
Main Simulator Subsystem
Example: Robot Vehicle Model
Example: Robot Vehicle Model
Autonomous Reconnaissance Vehicle
Radar Controller Atomic model
Autonomous Reconnaissance Vehicle
Movement Controller
holdIn(state, time)
passivate()
timelast()
timenext()
sendOutput(time, port, value)
state()
distribution().get()
CD++ programming services
Adding new atomic models
Atomic model definitions initFunction
externalFunction
outputFunction
internalFunction
Linking with the abstract simulator registerNewAtomic
Generator
out
Represents a generator of impulses represented
by consecutive natural numbers.
Period between impulses
defined by a random function using different distributions (Chi2, Gamma, Normal, etc.).
Generator model: description
0, 1, 2,...
f(t) = ...
Implementing atomic models
External transition function:
none (model does not include input ports)
Internal transition function:
generates numbers according to
a specified probability distribution. Output function: sends following
consecutive natural number through the out port.
Transition functions
Atomic modelGenerator
Output Port : out
0, 1, 2,...
ext
int
Generator: conceptual definition
Generator
distributionnext
internalFunction()outputFunction()initFunction()
Atomic
initFunction()internalFunction()outputFunction()externalFunction()
(from Models)
class Generator:public Atomic {public: . . .protected: Model &initFunction() ; Model &externalFunction(const ExternalMessage &); Model &internalFunction(const InternalMessage &); Model &outputFunction(const InternalMessage&);
private: int next; int initial; Port &out ; Distribution *distribution ;};
Generator model: header files
CD++ - initFunction
Model &initFunction(){ this->next = this->initial; this->holdIn(Atomic::active, Time::Zero) ; return *this ;}
Programmed to have an Instantaneous internal trans.
Generator: coding example
CD++ - internalFunction
Model &internalFunction(const InternalMessage &) { this->next++ ; Time t(fabs(this->distribution().get()) ) ; this->holdIn(active, t) ; return *this ;}
Reprogrammed for the following internaltransition.
Obtains the timevalue bycomputinga probabilisticfunction
Generator (cont.)
CD++ - outputFunction
Model &outputFunction(const InternalMessage &msg) { this->sendOutput(msg.time(), this->out, this->next); return *this ;} The output value
increments sequentially
Generator (cont.)
out
gen
CD++ - Coupling scheme
[top]components : gen@Generatorout : MyoutLink : out@gen Myout
[gen]distribution : normalmean : 2deviation : 1
top
Myout
Generator: stand-alone testing
Description
It is in charge of computing the number of jobs finished in a given time unit.
It computes the usage ratio for the server (a CPU in this case).
It transfers the outputs with a given frequency.
Transducer
time
jobs
Jobs
Transducer model
The external transition function is in charge of record the jobs received and those finished.
The internal transition function should be activated in the following job burst.
The output function will send the metrics through output ports.
DEVS
Atomic ModelTransducer
cpuusage
ext
int
arrived
throughput
solved
Outputs
Inputs
Transducer model : conceptual definition
CD++
class Transducer: public Atomic {public: . . .protected: Model &initFunction(); Model &externalFunction(const ExternalMessage&); Model &internalFunction(const InternalMessage&); Model &outputFunction(const InternalMessage&);private: const Port &arrived, &solved ; Port &throughput, &cpuUsage ; Time frec, tUnit ; long procCount, cpuLoad ; JobsList unsolved ; };
Atomic
initFunction()externalFunction()internalFunction()outputFunction()
(from Models)
TransducercpuLoad : longprocCount : longfrec : TimetUnit : Time
initFunction()externalFunction()internalFunction()outputFunction()
Transducer: header files
Transducer: coding example
CD++ - initFunction
Model &initFunction() { cpuLoad = procCount = 0 ; unsolved.erase() ; this->holdIn( active, this->frequence() ) ; return *this ;} The results are sent
with a predefinedfrequency.
State variables initialization
CD++ - externalFunction
Model &externalFunction( const ExternalMessage &msg ) { Time dif = ( msg.time() - this->lastChange() ) ; cpuLoad += dif.asMsecs() * unsolved.size() if( msg.port() == arrived ) unsolved[ msg.value() ] = msg.time() ;
if( msg.port() == solved ) { procCount ++ ; unsolved.erase( msg.value() ) ; } return *this ;}
Record a non-finished job
Update the numberof tasks
CPU load
Transducer (cont.)
CD++ - internalFunction
Model &internalFunction( const InternalMessage & ) { this->holdIn( active, this->frequence() ) ; return *this ;}
Programmed to informthe results with a certainfrequency
Transducer (cont.)
CD++ - outputFunction
Model &outputFunction( const InternalMessage &msg ) { long ms = msg.time().asMsecs() ; float t( ms / this->timeUnit().asMsecs() ) ; Time dif = ( msg.time() - this->lastChange() ) ; cpuLoad += dif.asMsecs() * unsolved.size() ) ; this->sendOutput( msg.time(),throughput,procCount/t ); this->sendOutput( msg.time(),cpuUsage, cpuLoad / ms ); return *this ;}
Transducer (cont.)
CPU model
CPU
out
A processor running individual tasks in a non preemptive fashion.
Execution time for each
tasks defined by a probability distribution
chosen by the user.
Description
0, 1, 2,...
f(t) = ...
in
0, 1, 2,...
CPU: conceptual definition
External transition function starts theprocessing a task. Internal transition scheduled for the end of the job, defined at random. If model already processing a task, new one is discarded.
Internal transition function finishesprocessing the job, leaving the model in a passive state waiting
for new jobs.
Output function sends the job id trhough the output port out.
Atomic ModelCPU
ext
int
out
0, 1, 2,...
in
0, 1, 2,...
CPU: header files
CD++class CPU : public Atomic {public: . . .protected: Model &initFunction() ; Model &externalFunction(const ExternalMessage&); Model &internalFunction(const InternalMessage &); Model &outputFunction(const InternalMessage&);
private: int pid; Port &in, &out ; Distribution *distribution ;};
Atomic
initFunction()internalFunction()outputFunction()externalFunction()
(from Models)
CPU
distributionpid
initFunction()outputFunction()internalFunction()ExternalFunction()
CPU: coding example
CD++ - initFunction
Model &initFunction() { this->passivate() ; return *this ;}
Passive state kept while cpu waits for new external events in input ports.
CD++ - externalFunctionModel &externalFunction(const ExternalMessage &msg){ if( this->state() == passive ) { this->pid = static_cast<int>(msg.value()) ; Time t( fabs(this->distribution().get()) ) ; this->holdIn(active, t) ; } return *this ;}
Process Id stored. Schedule internal transition at random using the chosen distribution.
CPU (Cont.)
CD++ - internalFunction
Model &internalFunction( const InternalMessage & ){ this->passivate() ; return *this ;}
Task processing finished. Passivate waiting for the
following request.
CPU (Cont.)
CD++ - outputFunction
Model &outputFunction( const InternalMessage &msg ){ this->sendOutput(msg.time(), this->out, this->pid); return *this ;} Send Process Id and time
associated with end of processing for the
present task.
CPU (Cont.)
CD++ - Coupling specification
[top]components : proc@CPUin : inout : outLink : in in@procLink : out@proc out
[proc]distribution : normalmean : 2deviation : 1
out
proc
top
out
in
in
CPU model testing
out
proc
CD++ - External event file (.EV)
00:00:10:00 in 000:00:30:00 in 100:01:00:00 in 200:02:20:00 in 3
top
out
in
in
Hh:mm:ss:ms
Input port used
Job Id
Input events to test
Mensaje I / 00:00:00:000 / Root(00) para top(01)Mensaje I / 00:00:00:000 / top(01) para proc(02)Mensaje D / 00:00:00:000 / proc(02) / ... para top(01)Mensaje D / 00:00:00:000 / top(01) / ... para Root(00)Mensaje X / 00:00:10:000 / Root(00) / in / 0.000 para top(01)Mensaje X / 00:00:10:000 / top(01) / in / 0.000 para proc(02)Mensaje D / 00:00:10:000 / proc(02) / 00:00:01:348 para top(01)Mensaje D / 00:00:10:000 / top(01) / 00:00:01:348 para Root(00)Mensaje * / 00:00:11:348 / Root(00) para top(01)Mensaje * / 00:00:11:348 / top(01) para proc(02)Mensaje Y / 00:00:11:348 / proc(02) / out / 0.000 para top(01)Mensaje D / 00:00:11:348 / proc(02) / ... para top(01)Mensaje Y / 00:00:11:348 / top(01) / out / 0.000 para Root(00)Mensaje D / 00:00:11:348 / top(01) / ... para Root(00)Mensaje X / 00:00:30:000 / Root(00) / in / 1.000 para top(01)Mensaje X / 00:00:30:000 / top(01) / in / 1.000 para proc(02)Mensaje D / 00:00:30:000 / proc(02) / 00:00:03:485 para top(01)
CD++ - Simulation
Log file
CD++ - Output file
00:00:11:348 out 000:00:33:485 out 100:01:00:328 out 200:02:21:094 out 3
Hh:mm:ss:ms Output Port
Job Id
Output file
top related