Package SimPy :: Module MonitorTest
[hide private]
[frames] | no frames]

Source Code for Module SimPy.MonitorTest

  1  #!/usr/bin/env python 
  2  DEVELOPING = False 
  3  if DEVELOPING: 
  4     from Simulation import * 
  5  else: 
  6     from SimPy.Simulation import * 
  7  from random import * 
  8  # ------------------------------------------------------------ 
  9  #from SimPy.SimPlot import SimPlot 
 10  import unittest 
 11  # $Revision: 1.1.1.23 $ $Date: 2008/03/03 13:56:37 $ 
 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  ## ------------------------------------------------------------ 
27 -class Thing(Process):
28 """ Thing process for testing Monitors in simulation"""
29 - def __init__(self,M=None,name="Thing"):
30 Process.__init__(self) 31 self.name=name 32 self.y = 0.0 33 self.M = M
34
35 - def execute(self):
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
53 -class makeMtestCase(unittest.TestCase):
54 """ Test Monitor 55 """ 56
57 - def setUp(self):
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
71 - def testObserve(self):
72 """Test Monitor - observe""" 73 m = self.M 74 #for i in m.series(): 75 # print i 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
84 - def testObserveNoTime(self):
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
96 - def testObserveTally(self):
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
106 - def testtimeAverage(self):
107 """ test time averages """ 108 # old version 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 # now the new recursive version 115 #m = self.M 116 #assert m.newtimeAverage(10.0) == 9.0 ,'m1: new time average wrong: %s'%m.newtimeAverage(10) 117 #m2 = self.M2 118 #assert m2.newtimeAverage(5.0) == 8.0/5,'m2: new time average wrong: %s'%m2.newtimeAverage(5.0) 119 120
121 - def testtimeVariance(self):
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
129 - def testreset(self):
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
137 - def testTally(self):
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
151 - def testAccumulate(self):
152 """Test Monitor - accumulate""" 153 #print 'Monitor version '+__version__ 154 m2 = Monitor(name='Second') 155 assert m2.startTime == 0,'accum startTime wrong' 156 for i in range(5): 157 m2.accum(10,i) # this is (y,t) 158 # print 'debug', m2.data 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 ## test reset 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
168 - def testAccumulateInTime(self):
169 """Test Monitor - accumulate over simulation time""" 170 #print 'Monitor version '+__version__ 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
179 - def testListStuff(self):
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
194 - def testhistogram(self):
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
202 -def makeMSuite():
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 ## Tally test cases 229 ## -----------------------------------------------------------------------
230 -class makeTtestCase(unittest.TestCase):
231 """ Test Tally 232 """ 233
234 - def setUp(self):
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
246 - def testObserve(self):
247 """Test Tally - observe""" 248 t = self.T 249 #for i in m.series(): 250 # print i 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
256 - def testObserveNoTime(self):
257 """Test Tally - observe with time being picked up from now()""" 258 ta= Tally(name='No time') 259 initialize() 260 t = Thing(ta) 261 activate(t,t.execute(),0.0) 262 simulate(until=20.0) 263 assert ta.total() == 15, 'total wrong:%s'%ta.total() 264 assert ta.timeAverage(10.0) == 5.0 ,'time average is wrong: %s'%ta.timeAverage(10.0)
265
266 - def testtimeAverage(self):
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
271 - def testtimeVariance(self):
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
279 - def testreset(self):
280 """ test time averages """ 281 ta=self.T 282 ta.reset(t = 10.0) 283 assert ta.startTime == 10.0,'reset time wrong'
284
285 - def testhistogram(self):
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
294 -def makeTSuite():
295 suite = unittest.TestSuite() 296 testObserve = makeTtestCase("testObserve") 297 testObserveNoTime = makeTtestCase("testObserveNoTime") 298 testtimeAverage = makeTtestCase("testtimeAverage") 299 testtimeVariance = makeTtestCase("testtimeVariance") 300 testreset = makeTtestCase("testreset") 301 testhistogram = makeTtestCase("testhistogram") 302 suite.addTests([testObserve,testObserveNoTime, 303 testtimeAverage, 304 testtimeVariance, 305 testreset, 306 testhistogram, 307 ]) 308 return suite
309 310 ## ----------------------------------------------------------------------- 311 ## Test cases to test equivalence of Monitor and Tally 312 ## for monitored Resource instances 313 ## ----------------------------------------------------------------------- 314
315 -class Actor(Process):
316 """Process used in MakeEquivTestCase"""
317 - def act(self,res):
318 while True: 319 yield request,self,res 320 yield hold,self,1 321 yield release,self,res
322
323 -class makeEquivTestCase(unittest.TestCase):
324 """To test that the histograms produced in monitoring 325 a Resource instance's queues are equivalent 326 """
327 - def testResHistogram(self):
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
354 -def makeEquivSuite():
355 suite = unittest.TestSuite() 356 testResHistogram = makeEquivTestCase("testResHistogram") 357 suite.addTests([testResHistogram 358 ]) 359 return suite
360 361 ## ----------------------------------------------------------------------- 362 363 if __name__ == '__main__': 364 print "MonitorTest.py %s"%__version__ 365 alltests = unittest.TestSuite((makeMSuite(), 366 ## makeHSuite(), 367 makeTSuite(), 368 makeEquivSuite() 369 )) 370 runner = unittest.TextTestRunner() 371 runner.run(alltests) 372