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