Metody symulacyjne
JĘZYK SYMULACYJNY MODSIM
biblioteki
Plan prezentacji
Wybrane biblioteki:
– IOMod – operacje wejścia/wyjścia
– RandMod – generowanie liczb
pseudolosowych
– StatMod – monitory statystyczne
– ListMod – zarządzanie złożonymi
strukturami z rekordami
– GrpMod –zarządzanie złożonymi
strukturami z obiektami
– SimMod – operacje związane z symulacją
IOMod – operacje wejścia/wyjścia
(1/4)
Typ wyliczeniowy dla trybu pracy
strumienia danych
FileUseType
= (
Input
,
Output
,
InOut
,
Append
,
Update
,
CreateBinary
);
– tryb tekstowy strumienia danych: InPut,
OutPut, InOut, Append,
– tryb binarny: Update, CreateBinary,
IOMod – operacje wejścia/wyjścia
(2/4)
PROCEDURE ReadKey() : CHAR;
PROCEDURE FileExists(IN fname: STRING) : BOOLEAN;
PROCEDURE DeleteFile(IN fname: STRING);
PROCEDURE FileSize(IN fname: STRING) : INTEGER;
StreamObj = OBJECT
eof: BOOLEAN;
ioResult: INTEGER;
fileName: STRING;
ASK METHOD Open(IN fname: STRING; IN ioDirection:
FileUseType);
ASK METHOD Close;
ASK METHOD Delete;
ASK METHOD IsOpen() : BOOLEAN;
IOMod – operacje wejścia/wyjścia
(3/4)
ASK METHOD ReadChar(OUT ch: CHAR);
ASK METHOD ReadInt(OUT n: INTEGER);
ASK METHOD ReadReal(OUT x: REAL);
ASK METHOD ReadString(OUT str: STRING);
ASK METHOD ReadLine(OUT str: STRING);
ASK METHOD ReadBlock(IN buffer: ANYREC; IN size: INTEGER;
IN blocknum : INTEGER);
IOMod – operacje wejścia/wyjścia
(4/4)
ASK METHOD WriteChar(IN ch: CHAR);
ASK METHOD WriteInt(IN num, fieldwidth: INTEGER);
ASK METHOD WriteHex(IN num, fieldwidth: INTEGER);
ASK METHOD WriteReal(IN num: REAL; IN fieldwidth,
precision: INTEGER);
ASK METHOD WriteExp(IN num: REAL; IN fieldwidth,
precision: INTEGER);
ASK METHOD WriteString(IN str: STRING);
ASK METHOD WriteLn;
ASK METHOD WriteBlock(IN buffer : ANYREC; IN size:
INTEGER;
IN blocknum: INTEGER);
ASK METHOD GetPosition() : INTEGER;
ASK METHOD Position(IN moveTo: INTEGER);
END OBJECT;
RandMod – generowanie liczb
pseudolosowych (1/3)
PROCEDURE Random() : REAL;
PROCEDURE FetchSeed(IN SimscriptSeedNumber: INTEGER) :
INTEGER;
RandomObj = OBJECT
originalSeed,
currentSeed: INTEGER;
antithetic: BOOLEAN;
ASK METHOD Sample() : REAL;
ASK METHOD SetSeed(IN NewSeed: INTEGER);
ASK METHOD Reset();
RandMod – generowanie liczb
pseudolosowych (2/3)
ASK METHOD UniformReal(IN lo, hi: REAL) : REAL;
ASK METHOD UniformInt (IN lo, hi: INTEGER) : INTEGER;
ASK METHOD Exponential(IN mean: REAL) : REAL;
{mean > 0}
ASK METHOD Normal(IN mean, sigma: REAL) : REAL;
{sigma > 0}
ASK METHOD Gamma(IN mean, alpha : REAL) : REAL;
{mean, alpha > 0}
ASK METHOD Beta(IN alpha1, alpha2 : REAL) : REAL;
{alpha1, alpha2 > 0}
ASK METHOD Triangular(IN min, mean, max : REAL) : REAL;
{min < mean < max}
RandMod – generowanie liczb
pseudolosowych (3/3)
ASK METHOD Erlang(IN mean : REAL; IN K : INTEGER): REAL;
{mean, K > 0}
ASK METHOD LogNormal(IN SDev, Mean : REAL): REAL;
{mean > 0}
ASK METHOD Weibull(IN shape,scale : REAL) : REAL;
{shape, scale > 0}
ASK METHOD Poisson(IN mu : REAL) : INTEGER;
{mu > 0}
ASK METHOD Binomial( IN n : INTEGER; IN p : REAL) :
INTEGER;
{n (liczba prób) and p (prawdopodobieństwo) n, p > 0}
END OBJECT;
StatMod – monitory statystyczne
(1/4)
Typ tablicowy dla histogramów
histogram = ARRAY INTEGER OF REAL;
Klasa bazowa dla monitorów
statystycznych
StatObj = OBJECT
Count : INTEGER;
Sum : REAL;
SumOfSquares : REAL;
low, high, interval: INTEGER;
ASK METHOD SetHistogram(IN Low: INTEGER;
IN High: INTEGER; IN Interval : INTEGER);
StatMod – monitory statystyczne
(2/4)
ASK METHOD GetHistogram() : histogram;
ASK METHOD Mean() : REAL;
ASK METHOD MeanSquare() : REAL;
ASK METHOD Variance() : REAL;
ASK METHOD StdDev() : REAL;
ASK METHOD Reset;
PRIVATE
Histogram : histogram;
END OBJECT;
StatMod – monitory statystyczne
(3/4)
Typy monitorów statystycznych
IStatObj – monitor statystyczny zmiennych typu
INTEGER
ITimedStatObj – monitor statystyczny (ważony
czasem) zmiennych typu INTEGER
RStatObj – monitor statystyczny zmiennych typu
REAL
RTimedStatObj – monitor statystyczny (ważony
czasem) zmiennych typu REAL
StatMod – monitory statystyczne
(4/4)
Typy liczbowe monitorowane
(statystycznie)
SINTEGER = LMONITORED INTEGER BY IStatObj;
TSINTEGER = LMONITORED INTEGER BY
ITimedStatObj;
BINTEGER = LMONITORED INTEGER BY IStatObj,
ITimedStatObj;
SREAL = LMONITORED REAL BY RStatObj;
TSREAL = LMONITORED REAL BY RTimedStatObj;
BREAL = LMONITORED REAL BY RStatObj,
RTimedStatObj;
ListMod – zarządzanie złożonymi
strukturami z rekordami (1/3)
Klasy kontenerów:
– QueueList
– StackList
– RankedList
– BTreeList
– StatQueueList
– StatStackList
– StatRankedList
– StatBTreeList
ListMod – zarządzanie złożonymi
strukturami z rekordami (2/3)
Metody wszystkich klas:
ASK METHOD Includes(IN candidate: ANYREC) :
BOOLEAN;
ASK METHOD Add(IN NewMember : ANYREC);
ASK METHOD Remove() : ANYREC;
ASK METHOD First() : ANYREC;
ASK METHOD Last() : ANYREC;
ASK METHOD Next(IN candidate: ANYREC) : ANYREC;
ASK METHOD Prev(IN candidate: ANYREC) : ANYREC;
ASK METHOD RemoveThis(IN member: ANYREC);
ASK METHOD AddBefore(IN ExistingMember,
NewMember:ANYREC);
ASK METHOD AddAfter(IN ExistingMember,
NewMember: ANYREC);
ListMod – zarządzanie złożonymi
strukturami z rekordami (3/3)
Metody tylko dla list uporządkowanych:
ASK METHOD Rank (IN a, b : ANYREC) : INTEGER;
{metoda musi być nadpisana}
Metody tylko dla klas BTree:
ASK METHOD SetOrder(IN degree : INTEGER);
{ustawia porządek, gdy nie ma elementów w
strukturze}
ASK METHOD Key(IN object : ANYREC) : STRING;
{metoda musi być nadpisana}
ASK METHOD Find(IN key : STRING) : ANYREC;
SimMod – zarządzanie symulacją
(1/4)
Obiekt do synchronizacji procesów:
TriggerObj = OBJECT
WAITFOR METHOD Fire;
TELL METHOD Trigger;
ASK METHOD Release;
ASK METHOD InterruptTrigger;
ASK METHOD NumWaiting() : INTEGER;
PRIVATE
triggerList: ANYOBJ;
END OBJECT;
SimMod – zarządzanie symulacją
(2/4)
Procedury:
PROCEDURE StartSimulation;
PROCEDURE StopSimulation;
{anuluje wszystkie oczekujące aktywności i zwraca
sterowanie do pierwszej instrukcji po
StartSimulation}
PROCEDURE NumActivities(IN object : ANYOBJ) :
INTEGER;
PROCEDURE NumObjPending() : INTEGER;
PROCEDURE NumActPending() : INTEGER;
PROCEDURE NumWAITFOR() : INTEGER;
PROCEDURE ResetSimTime(IN newtime : REAL);
PROCEDURE ActivityOwner(IN activity : ACTID) :
ANYOBJ;
SimMod – zarządzanie symulacją
(3/4)
PROCEDURE ScheduledTime(IN activity : ACTID) :
REAL;
{zwraca chwilę wznowienia podanej aktywności}
PROCEDURE ActivityName(IN activity: ACTID) :
STRING;
PROCEDURE InterruptMethod(IN activity : ACTID);
PROCEDURE Interrupt(IN object : ANYOBJ;
IN methName : STRING);
PROCEDURE InterruptWaitingFor(IN activity :
ANYREC);
{interrupts the most imminent activity with that method
name}
SimMod – zarządzanie symulacją
(4/4)
PROCEDURE InterruptAll(IN object : ANYOBJ);
PROCEDURE PendingListDump(IN DoActList:
BOOLEAN);
{dumps the pending list showing each object on it. if
DoActList is true, it also dumps each object's activity list}
PROCEDURE PendingListDumpToStream(IN
doActivityList :
BOOLEAN; IN stream :
StreamObj);
PROCEDURE ActivityListDump(IN ProcObj:
ANYOBJ);
PROCEDURE SimTime() : REAL;