-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathStatsCollector.py
More file actions
149 lines (130 loc) · 4.57 KB
/
StatsCollector.py
File metadata and controls
149 lines (130 loc) · 4.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
import numpy as np
import math
import unittest as ut
##
# This class is a building block for stats. See example below.
# It's recommended that this should be as a member of a user-defined statistics class.
##
class Stats:
"""Class for storing statistics."""
##
# Initialize a statistics instance.
# Gets @windowSize in order to init a sliding window to store queue network history.
# Gets an optional user-defined stats class for fine-grained statistical analysis.
# Notice: the user-defined stats class functions can assume it can get as a parameter an array that is the window.
# Another way to achieve this is to create a new class that instantiates a StatsCollector as a member.
# The initial window will be filled with 0's.
##
def __init__(self, windowSize=10000):
if windowSize <= 0:
raise Exception("Invalid window size of" + str(windowSize))
self.window = np.zeros(windowSize)
self.nextOpenSlot = 0
self.firstSlot = None
##
# Reset the stats window.
##
def reset(self, windowSize=0):
size = self.getWindowSize()
if windowSize > 0:
size = windowSize
self.window = np.zeros(size)
self.nextOpenSlot = 0
self.firstSlot = None
##
# Gets the window size.
##
def getWindowSize(self):
return len(self.window)
##
# Gets the window average.
##
def getAverage(self):
return np.mean(self.window)
##
# Gets the window standard deviation.
##
def getStdv(self):
return np.std(self.window)
##
# Gets the window variance.
##
def getVar(self):
return np.var(self.window)
##
# Slides the window by 1 and inserts a new value.
##
def insert(self, value):
# FIXME: change this! No append or delete!
# self.window = np.delete(np.append(self.window, value), 0)
if self.firstSlot == self.nextOpenSlot:
self.firstSlot = (self.firstSlot + 1) % self.getWindowSize()
elif self.firstSlot is None:
self.firstSlot = self.nextOpenSlot
self.window[self.nextOpenSlot] = value
self.nextOpenSlot = (self.nextOpenSlot + 1) % self.getWindowSize()
##
# Get the whole window history.
##
def getWindow(self):
return self.window
##
# This should be as a member of a user-defined statistics class.
##
class StatsCollector:
"""Class for storing statistics and information about a queue network."""
def __init__(self, windowSizes=[]):
_sizes = windowSizes
if not _sizes:
_sizes = [10000]
self.stats = [Stats(windowSize=size) for size in _sizes]
def getStatNumber(self, num):
if num < 0 or num >= len(self.stats):
return None
return self.stats[num]
def reset(self, windowSizes=[]):
_sizes = windowSizes
if not _sizes:
_sizes = [0]*len(self.stats)
for i in range(len(_sizes)):
self.stats[i].reset(windowSize=_sizes[i])
########################################################################################################################
# TEST
########################################################################################################################
class TestStats(ut.TestCase):
def runTest(self):
# with self.assertRaises(Exception):
# Queue(service=0)
# with self.assertRaises(Exception):
# Queue(service=-1)
# with self.assertRaises(Exception):
# Queue(workload=-1)
# q = Queue()
# self.assertEqual(q.getWorkload(), 0)
# self.assertEqual(q.getService(), 1)
# q.setWorkload(100)
# self.assertEqual(q.getWorkload(), 100)
# q.setService(2)
# self.assertEqual(q.getService(), 2)
# with self.assertRaises(Exception):
# q.setWorkload(-1)
# with self.assertRaises(Exception):
# q.setService(0)
# q.addWorkload(100)
# self.assertEqual(q.getWorkload(), 200)
# q.endTimeSlot()
# self.assertEqual(q.getWorkload(), 198)
# q.addWorkload(-7)
# self.assertEqual(q.getWorkload(), 191)
# q.addWorkload(-192)
# self.assertEqual(q.getWorkload(), 0)
# q.endTimeSlot()
# self.assertEqual(q.getWorkload(), 0)
# q.addWorkload(10)
# self.assertEqual(q.getWorkload(), 10)
# q.reset()
# self.assertEqual(q.getService(), 1)
# self.assertEqual(q.getWorkload(), 0)
print "TestStats: OK."
if __name__ == '__main__':
ut.main()