1
2 DEVELOPING = False
3 if DEVELOPING:
4 from Simulation import *
5 else:
6 from SimPy.Simulation import *
7 from random import *
8
9
10 import unittest
11
12 """MonitorTest.py
13 Testing Monitor, Tally.
14 This may be included in SimPyTest eventually.
15
16 Change history:
17 2004 05 03 corrected test for Monitored queues (gav)
18 2005 09 06 added tests for Tally (kgm)
19 2007 12 04 adding twVariance for both Monitor and Tally (gav)
20 2007 12 05 changed name to timeVariance (gav)
21
22 """
23 __version__ = '2.0 $Revision: 163 $ $Date: 2008-12-15 12:47:44 +0100 (Mo, 15 Dez 2008) $'
24
25
27 """ Thing process for testing Monitors in simulation"""
28 - def __init__(self, M = None, name = 'Thing',sim=None):
32
34 DEBUG = 0
35 self.y = 0.0
36 if DEBUG: print self.name, self.sim.now(),self.y
37 self.M.observe(self.y)
38
39 yield hold, self, 10.0
40 self.y = 10
41 if DEBUG: print self.name, self.sim.now(),self.y
42 self.M.observe(self.y)
43
44 yield hold, self, 10.0
45 self.y = 5
46 if DEBUG: print self.name, self.sim.now(),self.y
47 self.M.observe(self.y)
48
49
50
52 """ Test Monitor
53 """
54
56 self.M = Monitor(name = 'First')
57 for i in range(10):
58 self.M.observe(2 * i, i)
59 self.T = Tally(name = 'tallier')
60 self.M2 = Monitor(name = 'second')
61 T = [0, 1,4, 5]
62 Y = [1, 2,1, 0]
63 for t, y in zip(T, Y):
64 self.M2.observe(y, t)
65 assert self.M2.tseries() == T, 'wrong M2'
66 assert self.M2.yseries() == Y, 'wrong M2'
67
68
70 """Test Monitor - observe"""
71 m = self.M
72
73
74 assert m == [[i, 2 * i] for i in range(10)],'series wrong'
75 assert m.name == 'First', 'name wrong'
76 assert m.tseries() == list(range(10)),'tseries wrong:%s' % (m.tseries(),)
77 assert m.yseries() == [2 * i for i in range(10)],'yseries wrong:%s' % (m.yseries(),)
78 assert m.total() == 90, 'total wrong:%s'%m.total()
79 assert m.mean() == 9.0, 'mean wrong:%s'%m.mean()
80 assert m.var() == (4 * 285.-(90 * 90 / 10.0)) / 10.0, 'sample var wrong: %s' % (m.var(),)
81
83 """Test Monitor - observe with time being picked up from now()"""
84 s=Simulation()
85 s.initialize()
86 m = Monitor(name = 'No time',sim=s)
87 t = Thing(m,sim=s)
88 s.activate(t, t.execute(),0.0)
89 s.simulate(until = 20.0)
90 assert m.yseries() == [0, 10, 5],'yseries wrong:%s' % (m.yseries(),)
91 assert m.tseries() == [0, 10, 20],'tseries wrong:%s' % (m.tseries(),)
92 assert m.total() == 15, 'total wrong:%s'%m.total()
93 assert m.timeAverage(10.0) == 5.0, 'time average is wrong: %s'%m.timeAverage(10.0)
94
96 """Test Monitor - observe without time values"""
97 m = self.T
98 for i in range(10):
99 m.observe(2 * i)
100 assert m == [[0, 2 * i] for i in range(10)],'series wrong'
101 assert m.total() == 90, 'total wrong:%s'%m.total()
102 assert m.mean() == 9.0, 'mean wrong:%s'%m.mean()
103 assert m.var() == (4 * 285.-(90 * 90 / 10.0)) / 10.0, 'sample var wrong: %s' % (m.var(),)
104
106 """ test time averages """
107
108 m = self.M
109 assert m == [[i, 2 * i] for i in range(10)],'series wrong'
110 assert m.timeAverage(10.0) == 9.0, 'time average is wrong: %s'%m.timeAverage(10)
111 m2 = self.M2
112 assert m2.timeAverage(5.0) == 8.0 / 5, 'm2 time average is wrong: %s'%m2.timeAverage(5)
113
114
115
116
117
118
119
121 """ test time - weighted variance """
122 m = self.M
123 assert m == [[i, 2 * i] for i in range(10)],'series wrong'
124 assert abs(m.timeVariance(10.0) - 33) < 0.0001, 'time - weighted variance is wrong: %s'%m.timeVariance(10.0)
125 m2 = self.M2
126 assert abs(m2.timeVariance(5) - 6.0 / 25) < 0.0001, 'time - weighted variance is wrong: %s'%m2.timeVariance(5)
127
129 """ test time averages """
130 m = self.M
131 m.reset(t = 10.0)
132 assert m.startTime == 10.0, 'reset time wrong'
133 assert m == [],'reset series wrong: %s' % (m,)
134
135
137 """Test Monitor - tally"""
138 m = Monitor(name = 'First')
139 S = []
140 for i in range(10):
141 m.tally(i)
142 S.append([0, i])
143 assert m == S, 'Stored series is wrong: %s' % (m,)
144 assert m.name == 'First', 'Tally name wrong'
145 assert m.total() == 45, 'Tally total wrong'
146 assert m.mean() == 4.5, 'Tally mean wrong'
147 assert m.var() == (285 - (45 * 45 / 10.0)) / 10.0, 'Tally sample var wrong %s' % (m.var(),)
148
149
151 """Test Monitor - accumulate"""
152
153 m2 = Monitor(name = 'Second')
154 assert m2.startTime == 0, 'accum startTime wrong'
155 for i in range(5):
156 m2.accum(10, i)
157
158 assert m2.total() == 50, 'accum total wrong:%s' % (m2.total(),)
159 assert m2.startTime == 0, 'accum startTime wrong'
160 assert m2.timeAverage(5.0) == 10.0, 'accum timeAverage wrong:%s' % (m2.timeAverage(10.0),)
161
162 m2.reset(10)
163 assert m2 == [],'accum reset list wrong:%s' % (m2,)
164 assert m2.total() == 0.0, 'accum reset total wrong'
165 assert m2.startTime == 10, 'accum startTime wrong'
166
168 """Test Monitor - accumulate over simulation time"""
169
170 s=Simulation()
171 s.initialize()
172 m3 = Monitor(name = 'third',sim=s)
173 T3 = Thing(name = 'Job', M = m3,sim=s)
174 assert m3.startTime == 0, 'Accumulate startTime wrong'
175 s.activate(T3, T3.execute(),0.0)
176 s.simulate(until = 30.0)
177 assert m3.startTime == 0, 'Accumulate startTime wrong'
178
180 """Test some Monitor list operations"""
181 shouldBe = [[i, 2 * i] for i in range(10)]
182 assert shouldBe == self.M, 'M list is wrong'
183 assert [2, 4] == self.M[2], 'indexing wrong:%s' % (self.M[2],)
184 self.M[0] = [10, 10]
185 assert [10, 10] == self.M[0], 'item replacement wrong:%s' % (self.M[0],)
186 self.M.reverse()
187 assert [10, 10] == self.M[-1], 'list reverse wrong:%s' % (self.M[-1],)
188 self.M.sort()
189 assert [1, 2] == self.M[0], 'list sort wrong:%s' % (self.M[0],)
190 assert 10 == len(self.M), 'list length wrong'
191 assert [2, 4] in self.M, 'item in list wrong'
192
193
195 """Test Monitor histogram"""
196 m = Monitor(name = 'First')
197 for y in [-5, 0, 5, 15, 99, 105, 120]:m.observe(y)
198 h = m.histogram(low = 0.0, high = 100.0, nbins = 10)
199 shouldBe = list(zip(*h)[1])
200 assert shouldBe == [1, 2,1, 0,0, 0,0, 0,0, 0,1, 2], 'm histogram is wrong: %s' % (shouldBe,)
201
203 suite = unittest.TestSuite()
204 testObserve = makeMtestCase('testObserve')
205 testObserveNoTime = makeMtestCase('testObserveNoTime')
206 testObserveTally = makeMtestCase('testObserveTally')
207 testtimeAverage = makeMtestCase('testtimeAverage')
208 testtimeVariance = makeMtestCase('testtimeVariance')
209 testreset = makeMtestCase('testreset')
210 testTally = makeMtestCase('testTally')
211 testAccumulate = makeMtestCase('testAccumulate')
212 testAccumulateInTime = makeMtestCase('testAccumulateInTime')
213 testListStuff = makeMtestCase('testListStuff')
214 testhistogram = makeMtestCase('testhistogram')
215 suite.addTests([testObserve, testObserveNoTime,
216 testObserveTally,
217 testtimeAverage,
218 testtimeVariance,
219 testreset,
220 testTally, testAccumulate,
221 testAccumulateInTime,
222 testListStuff,
223 testhistogram,
224 ])
225 return suite
226
227
228
229
231 """ Test Tally
232 """
233
235 self.T = Tally(name = 'First')
236 for i in range(10):
237 self.T.observe(2 * i, i)
238 self.TT = Tally(name = 'tallier')
239 self.T2 = Tally(name = 'tally2')
240 T = [0, 1,4, 5]
241 Y = [1, 2,1, 0]
242 for t, y in zip(T, Y):
243 self.T2.observe(y, t)
244
245
247 """Test Tally - observe"""
248 t = self.T
249
250
251 assert t.name == 'First', 'name wrong'
252 assert t.total() == 90, 'total wrong:%s'%m.total()
253 assert t.mean() == 9.0, 'mean wrong:%s'%m.mean()
254 assert t.var() == (4 * 285.-(90 * 90 / 10.0)) / 10.0, 'sample var wrong: %s' % (t.var(),)
255
266
268 """ test time averages """
269 ta = self.T
270 assert ta.timeAverage(10.0) == 9.0, 'time average is wrong: %s'%ta.timeAverage(10.0)
271
273 """ test time - weighted Variance for Tally """
274 ta = self.T
275 assert abs(ta.timeVariance(10.0) - 33) < 0.00001, 'time - weighted variance is wrong: %s'%ta.timeVariance(10.0)
276 t2 = self.T2
277 assert abs(t2.timeVariance(5) - 6.0 / 25) < 0.0001, 'time - weighted variance is wrong: %s'%t2.timeVariance(5)
278
279
281 """ test time averages """
282 ta = self.T
283 ta.reset(t = 10.0)
284 assert ta.startTime == 10.0, 'reset time wrong'
285
287 """Test some Monitor list operations"""
288 ta = Monitor(name = 'First')
289 for y in [-5, 0, 5, 15, 99, 105, 120]:ta.observe(y)
290 ta.setHistogram(low = 0.0, high = 100.0, nbins = 10)
291 h = ta.histogram()
292 shouldBe = list(zip(*h)[1])
293 assert shouldBe == [1, 2,1, 0,0, 0,0, 0,0, 0,1, 2], 'm histogram is wrong: %s' % (shouldBe,)
294
310
311
312
313
314
315
317 """Process used in MakeEquivTestCase"""
320 - def act(self, res):
321 while True:
322 yield request, self, res
323 yield hold, self, 1
324 yield release, self, res
325
327 """To test that the histograms produced in monitoring
328 a Resource instance's queues are equivalent
329 """
331 s=Simulation()
332 s.initialize()
333 r = Resource(monitored = True, monitorType = Monitor,
334 name = 'TheResource / Monitor',sim=s)
335 r.waitMon.setHistogram(high = 3, nbins = 3)
336 r.actMon.setHistogram(high = 3, nbins = 3)
337
338 for i in range (5):
339 a = Actor(sim=s)
340 s.activate(a, a.act(r))
341 s.simulate(until = 20)
342 mHistoAct = r.actMon.getHistogram()
343 mHistoWait = r.waitMon.getHistogram()
344
345 s=Simulation()
346 s.initialize()
347 r = Resource(monitored = True, monitorType = Tally,
348 name = 'TheResource / Tally',sim=s)
349 r.waitMon.setHistogram(high = 3, nbins = 3)
350 r.actMon.setHistogram(high = 3, nbins = 3)
351 for i in range (5):
352 a = Actor(sim=s)
353 s.activate(a, a.act(r))
354 s.simulate(until = 20)
355 tHistoAct = r.actMon.getHistogram()
356 tHistoWait = r.waitMon.getHistogram()
357
358 assert mHistoAct == tHistoAct, 'actMon histograms are different'
359 assert mHistoWait == tHistoWait, 'waitMon histograms are different'
360
367
368
369
370 if __name__ == '__main__':
371 print 'MonitorTest.py %s'%__version__
372 alltests = unittest.TestSuite((makeMSuite(),
373
374 makeTSuite(),
375 makeEquivSuite()
376 ))
377 runner = unittest.TextTestRunner()
378 runner.run(alltests)
379