Classic DEVSPractical Modelling Techniques Using PythonPDEVS
Yentl Van Tendeloo, Hans Vangheluwe
IntroductionBrief recap of introductory DEVS tutorial
Bernard P. Zeigler.
Theory Of Modelling And Simulation.
1st ed. Wiley, 1976.
Bernard P. Zeigler, Herbert Praehofer,
and Tag Gon Kim.
Theory Of Modelling And Simulation.
2nd ed. Academic Press, 2000.
Bernard P. Zeigler.
Multifacetted Modelling and
Discrete Event Simulation.
1st ed. Academic Press, 1984.
Yentl Van Tendeloo and Hans Vangheluwe.
An Evaluation of DEVS Simulation Tools.
Simulation: Transactions of the Society
for Modeling and Simulation International.
2017, 93(2): 103-121
Yentl Van Tendeloo and Hans Vangheluwe.
An Overview of PythonPDEVS.
In Proceedings of JournΓ©es DEVS
Francophones (JDF), pages 59-66, 2016.
Our presentation uses initialized DEVS models, which
contain an initial total state. This was left implicit in
the original DEVS specification.
Yentl Van Tendeloo and Hans Vangheluwe. Extending the DEVS
Formalism with Initialization Information, 2018. ArXiv e-prints.
π = π, π, π, πππππ‘, πΏπππ‘, πΏππ₯π‘, π, π‘π
π : set of input events
π : set of output events
π : set of sequential states
πππππ‘ : ππ = π , π π β π, 0 β€ π β€ π‘π(π )
πΏπππ‘ : π β ππΏππ₯π‘: π Γ π β ππ : π β π βͺ ππ‘π : π β β0,+β
+
Atomic DEVS Specification
π = π, π, π, πππππ‘, πΏπππ‘, πΏππ₯π‘, π, π‘π
π : set of input events
π : set of output events
π : set of sequential states
πππππ‘ : ππ = π , π π β π, 0 β€ π β€ π‘π(π )
πΏπππ‘ : π β ππΏππ₯π‘: π Γ π β ππ : π β π βͺ ππ‘π : π β β0,+β
+
Atomic DEVS Specification
S
t
(π π , 0)
π‘π π π
(πΏππ₯π‘ π π , π , π₯ , 0)
(πΏπππ‘(π π), 0)
πΏππ₯π‘
πΏπππ‘
output π(π π)
π‘π π‘π + π π‘π + π‘π π π
π
πΆ = ππ πππ, ππ πππ, π·,ππ, πΌπ, ππ, π πππππ‘
πΌπ = πΌπ π β π· βͺ π πππβ π β π· βͺ π πππ βΆ πΌπ β π· βͺ π πππ
β π β π· βͺ π πππ βΆ π β πΌπ
ππ = ππ,π π β π· βͺ π πππ , π β πΌπππ πππ,π βΆ ππ πππ β ππ , β π β π·
ππ,π πππ βΆ ππ β ππ πππ, β π β π·
ππ,π βΆ ππ β ππ , β π, π β π·
π πππππ‘ βΆ 2π· β π·β πΈ β π·, πΈ β β : π πππππ‘ πΈ β πΈ
ππ = ππ π β π·
ππ = ππ , ππ , ππ , πππππ‘,π , πΏπππ‘,π , πΏππ₯π‘,π , ππ , π‘ππ , β π β π·
Coupled DEVS Specification
(done, t)
(*, t)
(y, t)
(x, t)(*, t)
(done, t) (done, t)
Root coordinator
Coordinator
SimulatorSimulator
Coupled DEVS
Atomic DEVS Atomic DEVS
(i, t)
(done, t)
(done, t)
(i, t)
(done, t)
Closure Under CouplingDenotational semantics for Coupled DEVS models
π΄πππππππ΄ππππ
ππππ
take_break toAuto
go_to_work toManual
?
?πΆπ = ππ πππ , ππ πππ , π·,ππ, πΌπ, ππ ππππ‘π‘ππ πΆπ = π, π, π, πππππ‘, πΏπππ‘, πΏππ₯π‘, π, π‘π
flatten
ππππ‘π‘ππ πΆπ = π, π, π, πππππ‘, πΏπππ‘, πΏππ₯π‘, π, π‘π
CM
21ππΆπ
ππΆπ
π1
π2
ππΆπ
ππΆπ
π1
π2
ππππ‘π‘ππ πΆπ = π, π, π, πππππ‘, πΏπππ‘, πΏππ₯π‘, π, π‘π
CM
21
π = ππΆππ = ππΆπ
ππππ‘π‘ππ πΆπ = π, π, π, πππππ‘, πΏπππ‘, πΏππ₯π‘, π, π‘π
CM
21ππΆπ
ππΆπ
π1
π2
π 1, π1
π 2, π2π2
π1
ππππ‘π‘ππ πΆπ = π, π, π, πππππ‘, πΏπππ‘, πΏππ₯π‘, π, π‘π
π = Γπβπ· ππ
CM
21ππΆπ
ππΆπ
π1
π2
π 1, π1
π 2, π2π2
π1
ππππ‘π‘ππ πΆπ = π, π, π, πππππ‘, πΏπππ‘, πΏππ₯π‘, π, π‘π
CM
21ππΆπ
ππΆπ
π1
π2
π 1, π1 = πππππ‘,1
π 2, π2 = πππππ‘,2π2
π1
π‘π1 π 1
π‘π2 π 2
ππππ‘π‘ππ πΆπ = π, π, π, πππππ‘, πΏπππ‘, πΏππ₯π‘, π, π‘π
CM
21
πππππ‘ = π ππππ‘, πππππ‘
ππΆπ
ππΆπ
π1
π2
π 1, π1 = πππππ‘,1
π 2, π2 = πππππ‘,2π2
π1
π‘π1 π 1
π‘π2 π 2
ππππ‘π‘ππ πΆπ = π, π, π, πππππ‘, πΏπππ‘, πΏππ₯π‘, π, π‘π
CM
21
πππππ‘ = π ππππ‘, πππππ‘
π ππππ‘ = β¦ , π ππππ‘,π , πππππ‘,π β πππππ‘ , β¦
ππΆπ
ππΆπ
π1
π2
π 1, π1 = πππππ‘,1
π 2, π2 = πππππ‘,2π2
π1
π‘π1 π 1
π‘π2 π 2
πππππ‘ = minπβπ·
πππππ‘,π
ππππ‘π‘ππ πΆπ = π, π, π, πππππ‘, πΏπππ‘, πΏππ₯π‘, π, π‘π
CM
21
πππππ‘ = π ππππ‘, πππππ‘
π ππππ‘ = β¦ , π ππππ‘,π , πππππ‘,π β πππππ‘ , β¦
ππΆπ
ππΆπ
π1
π2
π 1, π1 = πππππ‘,1
π 2, π2 = πππππ‘,2π2
π1
π‘π1 π 1
π‘π2 π 2
πππππ‘ = minπβπ·
πππππ‘,π
ππππ‘π‘ππ πΆπ = π, π, π, πππππ‘, πΏπππ‘, πΏππ₯π‘, π, π‘π
CM
21
πππππ‘ = π ππππ‘, πππππ‘
π ππππ‘,π , πππππ‘,π = πππππ‘,π
π ππππ‘ = β¦ , π ππππ‘,π , πππππ‘,π β πππππ‘ , β¦
ππΆπ
ππΆπ
π1
π2
π 1, π1 = πππππ‘,1
π 2, π2 = πππππ‘,2π2
π1
π‘π1 π 1
π‘π2 π 2
ππΆπ
ππΆπ
π1
π2
π‘π1
π‘π2
π‘
π1 ππππ‘π‘ππ πΆπ = π, π, π, πππππ‘, πΏπππ‘, πΏππ₯π‘, π, π‘π
CM
21
π‘π βΆ π β β0,+β+
π‘π π = minπβπ·
ππ = π‘ππ π π β ππ
π1
π2
ππππ‘π‘ππ πΆπ = π, π, π, πππππ‘, πΏπππ‘, πΏππ₯π‘, π, π‘π
CM
21ππΆπ
ππΆπ
π1
π2
π‘π1
π‘π2
π‘
π1
π‘π βΆ π β β0,+β+
π‘π π = minπβπ·
ππ = π‘ππ π π β ππ
πΌππ π = π β π· ππ = π‘π(π )π πππππ‘(πΌππ π ) = πβ
ππππ‘π‘ππ πΆπ = π, π, π, πππππ‘, πΏπππ‘, πΏππ₯π‘, π, π‘π
CM
21
π1
π2
ππΆπ
ππΆπ
π1
π2
π‘π1
π‘π2
π‘
π1
ππππ‘π‘ππ πΆπ = π, π, π, πππππ‘, πΏπππ‘, πΏππ₯π‘, π, π‘π
CM
21ππΆπ
ππΆπ
π1
π2
π‘
ππΆπ
ππΆπ
π1
π2π π = ΰ΅
ππβ,π πππ ππβ π πβ
β
ππ π πππ β πΌπβ
ππ π πππ β πΌπβ
π‘
ππππ‘π‘ππ πΆπ = π, π, π, πππππ‘, πΏπππ‘, πΏππ₯π‘, π, π‘π
CM
21
π¦2
ππππ‘π‘ππ πΆπ = π, π, π, πππππ‘, πΏπππ‘, πΏππ₯π‘, π, π‘π
CM
21ππΆπ
ππΆπ
π1
π2
π‘
π 1, 0
π 1, π‘π1 π 1
π 2, π2π 2, π2 + π‘π π = π‘π2(π 2)
π 2β² , 0
π‘π π
πΏπππ‘ π = β¦ , π πβ², ππ
β² , β¦
π πβ², ππ
β² =
πΏπππ‘,π π π , 0 πππ π = πβ
? πππ π β πΌπβ β π πππ
π π , ππ + π‘π π πππ π
ππππ‘π‘ππ πΆπ = π, π, π, πππππ‘, πΏπππ‘, πΏππ₯π‘, π, π‘π
CM
21ππΆπ
ππΆπ
π1
π2
π‘
π 1, 0
π 1, π‘π1 π 1
π 2, π2π 2, π2 + π‘π π = π‘π2(π 2)
π 2β² , 0
π‘π π
π‘
ππΆπ
ππΆπ
π1
π2 πΏπππ‘ π = β¦ , π πβ², ππ
β² , β¦
π πβ², ππ
β² =
πΏπππ‘,π π π , 0 πππ π = πβ
πΏππ₯π‘,π π π , ππ + π‘π π , ππβ,π ππβ π πβ , 0 πππ π β πΌπβ β π πππ
π π , ππ + π‘π π πππ π
π 1, π1π 1, π1 + π‘π π = π‘π1(π 1)
π 2, π2π 2, π2 + π‘π π β€ π‘π2 π 2
πΏπππ‘
πΏππ₯π‘
π 1β² , 0
π 2β² , 0
ππππ‘π‘ππ πΆπ = π, π, π, πππππ‘, πΏπππ‘, πΏππ₯π‘, π, π‘π
CM
21π¦1
π₯2
ππππ‘π‘ππ πΆπ = π, π, π, πππππ‘, πΏπππ‘, πΏππ₯π‘, π, π‘π
CM
21ππΆπ
ππΆπ
π1
π2
π‘
π
π1
πΏππ₯π‘ π , π , π₯ = β¦ , π πβ², ππ
β² , β¦
π πβ², ππ
β² = απΏππ₯π‘,π π π , ππ + π , ππ πππ,π π₯ , 0 πππ π β πΌπ πππ
π π , ππ + π πππ π
ππππ‘π‘ππ πΆπ = π, π, π, πππππ‘, πΏπππ‘, πΏππ₯π‘, π, π‘π
CM
21
π¦π πππ
ππΆπ
ππΆπ
π1
π2
π‘
π
π1
π = Γπβπ· ππ
π‘π π = minπβπ·
ππ = π‘ππ π π β ππ
πΌππ π = π β π· ππ = π‘π(π )
π π = ΰ΅ππβ,π πππ ππβ π πβ
π
ππ π πππ β πΌπβ
ππ π πππ β πΌπβ
πΏπππ‘ π = β¦ , π πβ², ππ
β² , β¦
π πβ², ππ
β² = απΏππ₯π‘,π π π , ππ + π , ππ πππ,π π₯ , 0 πππ π β πΌπ πππ
π π , ππ + π πππ π
ππππ‘π‘ππ πΆπ = π, π, π, πππππ‘, πΏπππ‘ , πΏππ₯π‘, π, π‘π
πππππ‘ = minπβπ·
πππππ‘,π
πππππ‘ = π ππππ‘ , πππππ‘ β π
π πβ², ππ
β² =
πΏπππ‘,π π π , 0 πππ π = πβ
πΏππ₯π‘,π π π , ππ + π‘π π , ππβ,π ππβ π πβ , 0 πππ π β πΌπβ
π π , ππ + π‘π π πππ π
π = ππΆππ = ππΆπ
π ππππ‘,π , πππππ‘,π = πππππ‘,π
π ππππ‘ = (β¦ , π ππππ‘,π , πππππ‘,π β πππππ‘ , β¦ )
π = π , π π β π, 0 β€ π β€ π‘π(π )
πβ = π πππππ‘(πΌππ π )
πΏππ₯π‘ π , π , π₯ = β¦ , π πβ², ππ
β² , β¦
Applications of DEVSDEVS in practice
http://irh.inf.unideb.hu/user/jsztrik/education/09/english/3f.html
http://irh.inf.unideb.hu/user/jsztrik/education/09/english/3f.html
πππ π‘ = 10 Γ #πππβπ‘π + ππ£π(π‘π‘πππ£ππ)
Generator StatisticsQueue
Notifier
Poller
β¦
Queue
Notifier
Poller
β¦
Custom Atomic DEVS ModelsExtending a DEVS repository
π = π, π, π, πππππ‘, πΏπππ‘, πΏππ₯π‘, π, π‘π
π : set of input events
π : set of output events
π : set of sequential states
πππππ‘ : ππ = π , π π β π, 0 β€ π β€ π‘π(π )
πΏπππ‘ : π β ππΏππ₯π‘: π Γ π β ππ : π β π βͺ ππ‘π : π β β0,+β
+
Atomic DEVS Specification
π = π, π, π, πππππ‘, πΏπππ‘, πΏππ₯π‘, π, π‘π
π : set of input events
π : set of output events
π : set of sequential states
πππππ‘ : ππ = π , π π β π, 0 β€ π β€ π‘π(π )
πΏπππ‘ : π β ππΏππ₯π‘: π Γ π β ππ : π β π βͺ ππ‘π : π β β0,+β
+
Atomic DEVS Specification
Pattern 1: Ignore an Event
X
Pattern 1: Ignore an Event
0.1 seconds
later
X Y
Pattern 1: Ignore an Event
π‘π(π π)
Pattern 1: Ignore an Event
π‘π(π π)
Pattern 1: Ignore an Event
π‘π(π πβ²)π
π‘π π πβ² = π‘π π π β π
Pattern 1: Ignore an Event
class RailwaySegmentState():
def __init__(self):
self.timer = INFINITY
class RailwaySegment(AtomicDEVS):
def extTransition(self, inputs):
self.state.timer -= self.elapsed
β¦
def timeAdvance(self):
return self.state.timer
Pattern 2: Simulated Time
π₯ seconds
later
π‘ = π π‘ = π + π₯
Pattern 2: Simulated Time
π₯ seconds
later
π‘ = π π‘ = π + π₯
π‘π‘ππππ ππ‘ = π₯
Pattern 2: Simulated Time
π₯ seconds
later
π‘ = π π‘ = π + π₯
π‘π‘ππππ ππ‘ = π₯
π‘ = ?
Pattern 2: Simulated Time
π‘π ππ = π₯
Pattern 2: Simulated Time
π‘π(π π)
π‘π ππ = π₯
Pattern 2: Simulated Time
π‘π(π π)
π‘π ππ = π₯
π‘π ππ = π₯ + π‘π π π
Pattern 2: Simulated Time
π
π‘π ππ = π₯
Pattern 2: Simulated Time
π
π‘π ππ = π₯
π‘π ππ = π₯ + π
Pattern 2: Simulated Time
class GeneratorState:
def __init__(self):
self.t_sim = 0.0
β¦
class Generator(AtomicDEVS):
def __init__(self):
self.state = GeneratorState()
β¦
def intTransition(self):
self.state.t_sim += self.timeAdvance()
β¦
def extTransition(self, inputs):
self.state.t_sim += self.elapsed
β¦
Pattern 3: Multiple Timers
Pattern 3: Multiple Timers
π‘π‘ππππ
π‘ππ’πππ¦
?
π‘π(π π)
Pattern 3: Multiple Timers
π‘π‘ππππ
π‘ππ’πππ¦
?
π‘π(π π)π‘π(π π)
Pattern 3: Multiple Timers
π‘π‘ππππ
π‘ππ’πππ¦
?
π‘π(π π)
Pattern 3: Multiple Timers
class RailwaySegmentState:
def __init__(self):
self.t_query = INFINITY
self.t_train = INFINITY
class RailwaySegment(AtomicDEVS):
def timeAdvance(self):
return min(self.state.t_query, \
self.state.t_train)
def extTransition(self, inputs):
self.state.t_query -= self.elapsed
self.state.t_train -= self.elapsed
β¦
β¦
def intTransition(self):
self.state.t_query -= self.timeAdvance()
self.state.t_train -= self.timeAdvance()
if (self.state.t_query == 0):
β¦ # process query
elif (self.state.t_train == 0):
β¦ # process train
Pattern 4: Statistics Gathering
[1815.7; 1901.1; 1801.4; 1867.3; 1911.8; 1846.4; 1844.3; 1873.5; β¦]
π trains = π doubles = 8π bytes
Pattern 4: Statistics Gathering
[1815.7; 1901.1; 1801.4; 1867.3; 1911.8; 1846.4; 1844.3; 1873.5; β¦]
π π’π =
π
π‘π‘πππ£ππ = 36,902,140.45
πππ’ππ‘ = πππππ£πππ = 20,000
ππ£π =π π’π
πππ’ππ‘
π trains = π doubles = 8π bytes
π trains = 1 double + 1 long long int = 16 bytes
Pattern 4: Statistics Gathering
class CollectorState():
def __init__(self):
self.counter = 0
self.accum = 0.0
self.t_sim = 0.0
class Collector(AtomicDEVS):
def extTransition(self, inputs):
left = inputs[self.train].left
transit = self.state.t_sim β left
self.accum += transit
self.counter += 1
Pattern 5: Complex State/Event
π π, π
Pattern 5: Complex State/Event
π π, π
π = π‘πππππ‘ππππ, π‘ππππππ’πππ¦ , π£π‘ππππ, π‘π‘ππππ, ππ‘ππππ π‘πππππ‘ππππ β β+, β¦
π, π = π‘, π£, π π‘ β β+, β¦ βͺ query βͺ πππππ’π πππππ’π β πππ, πππππ
Pattern 5: Complex State/Event
class Train:
def __init__(self, t, a):
self.t = t
self.a = a
self.v = 0.0
class Query:
def __init__(self):
pass
class QueryAck:
def __init__(self, colour):
self.colour = colour
class RailwaySegmentState:
def __init__(self):
self.train = None
class RailwaySegment(AtomicDEVS):
def __init__(self):
self.state = RailwaySegmentState()
β¦
def extTransition(self, inputs):
β¦
self.state.train = inputs[self.train_in]
β¦
Conclusion
http://msdl.cs.mcgill.ca/projects/PythonPDEVS