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
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__="1.9.1 $Revision: 1.1.1.23 $ $Date: 2008/03/03 13:56:37 $"
25
26
28 """ Thing process for testing Monitors in simulation"""
34
36 DEBUG = 0
37 self.y = 0.0
38 if DEBUG: print self.name,now(),self.y
39 self.M.observe(self.y)
40
41 yield hold,self,10.0
42 self.y = 10
43 if DEBUG: print self.name,now(),self.y
44 self.M.observe(self.y)
45
46 yield hold,self,10.0
47 self.y = 5
48 if DEBUG: print self.name,now(),self.y
49 self.M.observe(self.y)
50
51
52
54 """ Test Monitor
55 """
56
58 self.M = Monitor(name='First')
59 for i in range(10):
60 self.M.observe(2*i,i)
61 self.T = Tally(name='tallier')
62 self.M2 = Monitor(name="second")
63 T = [0,1,4,5]
64 Y = [1,2,1,0]
65 for t,y in zip(T,Y):
66 self.M2.observe(y,t)
67 assert self.M2.tseries() == T, 'wrong M2'
68 assert self.M2.yseries() == Y, 'wrong M2'
69
70
72 """Test Monitor - observe"""
73 m = self.M
74
75
76 assert m == [[i, 2*i] for i in range(10)],'series wrong'
77 assert m.name == 'First','name wrong'
78 assert m.tseries() == list(range(10)),'tseries wrong:%s'%(m.tseries(),)
79 assert m.yseries() == [2*i for i in range(10)],'yseries wrong:%s'%(m.yseries(),)
80 assert m.total() == 90, 'total wrong:%s'%m.total()
81 assert m.mean() == 9.0,'mean wrong:%s'%m.mean()
82 assert m.var() == (4*285.-(90*90/10.0))/10.0,'sample var wrong: %s'%(m.var(),)
83
85 """Test Monitor - observe with time being picked up from now()"""
86 m = Monitor(name='No time')
87 initialize()
88 t = Thing(m)
89 activate(t,t.execute(),0.0)
90 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 initialize()
172 m3 = Monitor(name='third')
173 T3 = Thing(name="Job",M=m3)
174 assert m3.startTime == 0,'Accumulate startTime wrong'
175 activate(T3,T3.execute(),0.0)
176 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
265
267 """ test time averages """
268 ta= self.T
269 assert ta.timeAverage(10.0) == 9.0 ,'time average is wrong: %s'%ta.timeAverage(10.0)
270
272 """ test time-weighted Variance for Tally """
273 ta= self.T
274 assert abs(ta.timeVariance(10.0) - 33) < 0.00001 ,'time-weighted variance is wrong: %s'%ta.timeVariance(10.0)
275 t2 = self.T2
276 assert abs(t2.timeVariance(5) - 6.0/25)<0.0001,'time-weighted variance is wrong: %s'%t2.timeVariance(5)
277
278
280 """ test time averages """
281 ta=self.T
282 ta.reset(t = 10.0)
283 assert ta.startTime == 10.0,'reset time wrong'
284
286 """Test some Monitor list operations"""
287 ta = Monitor(name='First')
288 for y in [-5, 0, 5, 15,99,105,120]:ta.observe(y)
289 ta.setHistogram(low=0.0,high=100.0,nbins=10)
290 h = ta.histogram()
291 shouldBe = list(zip(*h)[1])
292 assert shouldBe == [1,2,1,0,0,0,0,0,0,0,1,2], 'm histogram is wrong: %s'%(shouldBe,)
293
309
310
311
312
313
314
316 """Process used in MakeEquivTestCase"""
318 while True:
319 yield request,self,res
320 yield hold,self,1
321 yield release,self,res
322
324 """To test that the histograms produced in monitoring
325 a Resource instance's queues are equivalent
326 """
328 initialize()
329 r=Resource(monitored=True,monitorType=Monitor,name="TheResource/Monitor")
330 r.waitMon.setHistogram(high=3,nbins=3)
331 r.actMon.setHistogram(high=3,nbins=3)
332
333 for i in range (5):
334 a=Actor()
335 activate(a,a.act(r))
336 simulate(until=20)
337 mHistoAct= r.actMon.getHistogram()
338 mHistoWait=r.waitMon.getHistogram()
339
340 initialize()
341 r=Resource(monitored=True,monitorType=Tally,name="TheResource/Tally")
342 r.waitMon.setHistogram(high=3,nbins=3)
343 r.actMon.setHistogram(high=3,nbins=3)
344 for i in range (5):
345 a=Actor()
346 activate(a,a.act(r))
347 simulate(until=20)
348 tHistoAct= r.actMon.getHistogram()
349 tHistoWait=r.waitMon.getHistogram()
350
351 assert mHistoAct==tHistoAct,"actMon histograms are different"
352 assert mHistoWait==tHistoWait,"waitMon histograms are different"
353
360
361
362
363 if __name__ == '__main__':
364 print "MonitorTest.py %s"%__version__
365 alltests = unittest.TestSuite((makeMSuite(),
366
367 makeTSuite(),
368 makeEquivSuite()
369 ))
370 runner = unittest.TextTestRunner()
371 runner.run(alltests)
372