~thomas-philipp/openwns-systemtest-library/queueing-experimental

« back to all changes in this revision

Viewing changes to queuing/MM1Step6.py

  • Committer: Maciej Muehleisen
  • Date: 2008-11-01 22:21:03 UTC
  • Revision ID: mue@comnets.rwth-aachen.de-20081101222103-nrdh43je18ta98tt
Initial commit. Steps 5 and 6 still need work.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# import the necessary modules
 
2
 
 
3
# openwns contains the Simulator class, which is needed for every
 
4
# simulation
 
5
import openwns
 
6
 
 
7
# openws.queuingsystem contains the simulation model called
 
8
# "SimpleMM1" which is used in this example
 
9
import openwns.queuingsystem
 
10
 
 
11
import openwns.probebus
 
12
 
 
13
### Simulation setup
 
14
#
 
15
# Q: queue with unlimited size
 
16
#
 
17
# W: worker, the job processing time is negative-exponentially
 
18
#    distributed
 
19
#
 
20
# The jobs arrive at the system with an inter arrival time that is
 
21
# negative-exponentially distributed.
 
22
#
 
23
#             ----
 
24
# new jobs --> Q |-->(W)-->
 
25
#             ----
 
26
#
 
27
 
 
28
class StatisticsProbeBus(openwns.probebus.PythonProbeBus):
 
29
 
 
30
    def __init__(self, outputFilename):
 
31
        openwns.probebus.PythonProbeBus.__init__(self, self.accepts, self.onMeasurement, self.output)
 
32
        self.outputFilename = outputFilename
 
33
        self.sum = 0.0
 
34
        self.trials = 0
 
35
 
 
36
    def accepts(self, time, context):
 
37
        return True
 
38
 
 
39
    def onMeasurement(self, time, measurement, context):
 
40
        self.sum += measurement
 
41
        self.trials += 1
 
42
 
 
43
    def output(self):
 
44
        f = open(self.outputFilename, "w")
 
45
        f.write("Number of trials: %s\n" % str(self.trials))
 
46
        f.write("Mean value : %s\n" % str(self.sum/self.trials))
 
47
        f.close()
 
48
 
 
49
class FilterProbeBus(openwns.probebus.PythonProbeBus):
 
50
 
 
51
    def __init__(self, contextFilterKey, contextFilterValue):
 
52
        openwns.probebus.PythonProbeBus.__init__(self, self.accepts)
 
53
        self.contextFilterKey = contextFilterKey
 
54
        self.contextFilterValue = contextFilterValue
 
55
        
 
56
    def accepts(self, time, context):
 
57
        return context[self.contextFilterKey] == self.contextFilterValue
 
58
 
 
59
# create the M/M/1 (step4) simulation model configuration (time in seconds)
 
60
# we reuse step3 and only change the configuration!
 
61
mm1 = openwns.queuingsystem.SimpleMM1Step6(meanJobInterArrivalTime = 0.100,
 
62
                                           meanJobProcessingTime   = 0.099)
 
63
 
 
64
# This is our logger
 
65
loggingProbeBus = openwns.probebus.LoggingProbeBus()
 
66
 
 
67
# ProbeBusses may observe another probe bus. The observing probe bus sees all
 
68
# data that the observed probe bus accepts. The observing probe bus may accept
 
69
# only a subset of these measurement.
 
70
#
 
71
# We now use a FilterProbeBus to select only measurements from low priority jobs
 
72
#
 
73
#                  < ====   Decoupled by   ==== >
 
74
#                         ProbeBusRegistry
 
75
# +------------------+    +--------------+    +-----------------+    +-------------------+
 
76
# |MeasurementSource | -> |MasterProbeBus| -> |FilterProbeBus   | -> |StatisticsProbeBus |
 
77
# |                  |    |              |    |accepts jobs with|    |only sees jobs with|
 
78
# |                  |    |              |    |priority == 0    |    |priority == 0      |
 
79
# +------------------+    +--------------+    +-----------------+    +-------------------+
 
80
 
 
81
# accepts only low priority
 
82
lowPriorityFilter = FilterProbeBus('priority', 0)
 
83
lowPriorityStats  = StatisticsProbeBus("SimpleMM1Step6_lowPriority.output")
 
84
# let StatisticsProbeBus observe the FilterProbeBus
 
85
lowPriorityStats.observe(lowPriorityFilter)
 
86
 
 
87
# Same here but for high priority
 
88
highPriorityFilter = FilterProbeBus('priority', 1)
 
89
highPriorityStats  = StatisticsProbeBus("SimpleMM1Step6_highPriority.output")
 
90
highPriorityStats.observe(highPriorityFilter)
 
91
 
 
92
# create simulator configuration
 
93
sim = openwns.Simulator(simulationModel = mm1,
 
94
                        maxSimTime      = 100.0)
 
95
 
 
96
sim.eventSchedulerMonitor = None
 
97
 
 
98
# If an output directory is already present it will be deleted 
 
99
# if you change this to MOVE a present output directory will
 
100
# be ranamed 
 
101
sim.outputStrategy = openwns.simulator.OutputStrategy.DELETE
 
102
 
 
103
pbr = sim.environment.probeBusRegistry
 
104
 
 
105
pbr.getMeasurementSource("openwns.queuingsystem.MM1.sojournTime").addObserver(lowPriorityFilter)
 
106
 
 
107
pbr.getMeasurementSource("openwns.queuingsystem.MM1.sojournTime").addObserver(highPriorityFilter)
 
108
 
 
109
pbr.getMeasurementSource("openwns.queuingsystem.MM1.sojournTime").addObserver(loggingProbeBus)
 
110
 
 
111
# The resulting ProbeBusTree looks like this
 
112
 
 
113
# Source -> MasterProbeBus +-> FilterProbeBus[priority==0] -> StatisticsProbeBus[filename="SimpleMM1Step6_lowPriority.output"]
 
114
#                          |
 
115
#                          |-> FilterProbeBus[priority==1] -> StatisticsProbeBus[filename="SimpleMM1Step6_highPriority.output"]
 
116
#                          |
 
117
#                          +-> LoggingProbeBus
 
118
 
 
119
# set the configuration for this simulation
 
120
openwns.setSimulator(sim)