OpenMPCD
test_OnTheFlyStatistics.py
1 from __future__ import division
2 
3 import math
4 import pytest
5 
6 from MPCDAnalysis.OnTheFlyStatistics import OnTheFlyStatistics
7 
8 def test_emptyInstance():
9  stat = OnTheFlyStatistics()
10 
11  assert stat.getSampleSize() == 0
12 
13  with pytest.raises(Exception):
14  stat.getSampleMean()
15 
16  with pytest.raises(Exception):
17  stat.getSampleVariance()
18 
19 
20 def test_oneDatum():
21  stat = OnTheFlyStatistics()
22 
23  stat.addDatum(-1)
24 
25  assert stat.getSampleSize() == 1
26  assert stat.getSampleMean() == -1
27 
28  with pytest.raises(Exception):
29  stat.getSampleVariance()
30 
31 
32 def test_twoData_int():
33  stat = OnTheFlyStatistics()
34 
35  data = [-1, 0]
36 
37  for datum in data:
38  stat.addDatum(datum)
39 
40  assert stat.getSampleSize() == 2
41  assert stat.getSampleMean() == -0.5
42  assert stat.getSampleVariance() == 0.5
43  assert \
44  math.sqrt(stat.getSampleVariance()) == stat.getSampleStandardDeviation()
45  assert \
46  stat.getStandardErrorOfTheMean() == \
47  stat.getSampleStandardDeviation() / math.sqrt(stat.getSampleSize())
48 
49 
50 def test_twoData_float():
51  stat = OnTheFlyStatistics()
52 
53  data = [5, 2.0]
54 
55  for datum in data:
56  stat.addDatum(datum)
57 
58  assert stat.getSampleSize() == 2
59  assert stat.getSampleMean() == sum(data) / len(data)
60  assert stat.getSampleVariance() == 4.5
61  assert \
62  math.sqrt(stat.getSampleVariance()) == stat.getSampleStandardDeviation()
63  assert \
64  stat.getStandardErrorOfTheMean() == \
65  stat.getSampleStandardDeviation() / math.sqrt(stat.getSampleSize())
66 
67 
68 def test_threeData():
69  stat = OnTheFlyStatistics()
70 
71  data = [-1, 0, 1.0]
72 
73  for datum in data:
74  stat.addDatum(datum)
75 
76  assert stat.getSampleSize() == 3
77  assert stat.getSampleMean() == 0
78  assert stat.getSampleVariance() == 1
79  assert \
80  math.sqrt(stat.getSampleVariance()) == stat.getSampleStandardDeviation()
81  assert \
82  stat.getStandardErrorOfTheMean() == \
83  stat.getSampleStandardDeviation() / math.sqrt(stat.getSampleSize())
84 
85 
86 def test_mergeSample():
87  stat = OnTheFlyStatistics()
88 
89  data = [-1, 0, 1.0]
90 
91  for datum in data:
92  stat.addDatum(datum)
93 
94  import copy
95  stat1 = copy.deepcopy(stat)
96  stat2 = OnTheFlyStatistics()
97 
98  stat.addDatum(3)
99  stat2.addDatum(3)
100 
101  stat.addDatum(4.5)
102  stat2.addDatum(4.5)
103 
104  stat1.mergeSample(stat2)
105 
106  assert stat1.getSampleSize() == stat.getSampleSize()
107  assert stat1.getSampleMean() == stat.getSampleMean()
108  assert stat1.getSampleVariance() == stat.getSampleVariance()
109  assert \
110  stat1.getSampleStandardDeviation() == stat.getSampleStandardDeviation()
111  assert \
112  stat1.getStandardErrorOfTheMean() == stat.getStandardErrorOfTheMean()
113 
114 
115 def test_mergeSamples():
116  stat = OnTheFlyStatistics()
117 
118  data = [-1, 0, 1.0]
119 
120  for datum in data:
121  stat.addDatum(datum)
122 
123  import copy
124  stat1 = copy.deepcopy(stat)
125  stat2 = OnTheFlyStatistics()
126 
127  stat.addDatum(3)
128  stat2.addDatum(3)
129 
130  stat.addDatum(4.5)
131  stat2.addDatum(4.5)
132 
133  stat1.mergeSample(stat2)
134 
135  stat_threeMerged = copy.deepcopy(stat)
136  stat_threeMerged.mergeSamples([stat1, stat2])
137 
138  stat.mergeSample(stat1)
139  stat.mergeSample(stat2)
140 
141  assert stat_threeMerged.getSampleSize() == stat.getSampleSize()
142  assert stat_threeMerged.getSampleMean() == stat.getSampleMean()
143  assert stat_threeMerged.getSampleVariance() == stat.getSampleVariance()
144  assert \
145  stat_threeMerged.getSampleStandardDeviation() == \
146  stat.getSampleStandardDeviation()
147  assert \
148  stat_threeMerged.getStandardErrorOfTheMean() == \
149  stat.getStandardErrorOfTheMean()
150 
151 
152 def test_constructor_with_arguments():
153  stat = OnTheFlyStatistics(3, 4, 5)
154  assert stat.getSampleSize() == 5
155  assert stat.getSampleMean() == 3
156  assert stat.getSampleVariance() == 4
157  assert \
158  stat.getSampleStandardDeviation() == math.sqrt(stat.getSampleVariance())
159  assert \
160  stat.getStandardErrorOfTheMean() == \
161  stat.getSampleStandardDeviation() / math.sqrt(stat.getSampleSize())
162 
163  stat2 = OnTheFlyStatistics()
164  stat2.mergeSample(stat)
165 
166  assert stat2.getSampleSize() == stat.getSampleSize()
167  assert stat2.getSampleMean() == stat.getSampleMean()
168  assert stat2.getSampleVariance() == stat.getSampleVariance()
169  assert \
170  stat2.getStandardErrorOfTheMean() == \
171  stat.getStandardErrorOfTheMean()
172 
173 
174 def test_serializeToString():
175  dataSizes = \
176  [
177  0, 1,
178  2, 3,
179  4, 5,
180  7, 8, 9,
181  15, 16, 17,
182  31, 32, 33,
183  63, 64, 65, 100
184  ]
185 
186  for dataSize in dataSizes:
187  import random
188  data = [random.random() for _ in range(0, dataSize)]
189 
190  stat = OnTheFlyStatistics()
191  for datum in data:
192  stat.addDatum(datum)
193  assert isinstance(stat.serializeToString(), str)
194 
195 
196 def test_unserializeFromString():
197  stat = OnTheFlyStatistics()
198 
199  with pytest.raises(TypeError):
200  stat.unserializeFromString(["foo"])
201  with pytest.raises(TypeError):
202  stat.unserializeFromString(stat)
203 
204  with pytest.raises(ValueError):
205  stat.unserializeFromString("")
206  with pytest.raises(ValueError):
207  stat.unserializeFromString("foo")
208  with pytest.raises(ValueError):
209  stat.unserializeFromString("123;0;0;0")
210  with pytest.raises(ValueError):
211  stat.unserializeFromString("1;0;1;0")
212  with pytest.raises(ValueError):
213  stat.unserializeFromString("1;0;0;1")
214  with pytest.raises(ValueError):
215  stat.unserializeFromString("1;-1;0.0;0.0")
216  with pytest.raises(ValueError):
217  stat.unserializeFromString("1;2;0;-1")
218  with pytest.raises(ValueError):
219  stat.unserializeFromString("1;0;0;0;0")
220  with pytest.raises(ValueError):
221  stat.unserializeFromString("1;0;0;0;")
222  with pytest.raises(ValueError):
223  stat.unserializeFromString("1;0;;0")
224 
225 
226  stat.unserializeFromString("1;0;0;0")
227  assert stat.getSampleSize() == 0
228 
229  stat = OnTheFlyStatistics()
230  unserialized = OnTheFlyStatistics()
231  unserialized.unserializeFromString(stat.serializeToString())
232  assert unserialized == stat
233  unserialized.unserializeFromString(stat.serializeToString())
234  assert unserialized == stat
235 
236 
237  def approximatelyEqual(lhs, rhs):
238  if lhs.getSampleSize() != rhs.getSampleSize():
239  return False
240 
241  if lhs.getSampleSize() == 0:
242  return True
243 
244  if lhs.getSampleMean() != pytest.approx(rhs.getSampleMean()):
245  return False
246 
247  if lhs.getSampleSize() == 1:
248  return True
249 
250  if lhs.getSampleVariance() != pytest.approx(rhs.getSampleVariance()):
251  return False
252 
253  return True
254 
255 
256  import random
257  for _ in range(0, 50):
258  for _ in range(0, random.randint(1, 5)):
259  stat.addDatum(random.random())
260 
261  assert not approximatelyEqual(unserialized, stat)
262  unserialized.unserializeFromString(stat.serializeToString())
263  assert approximatelyEqual(unserialized, stat)
264  unserialized.unserializeFromString(stat.serializeToString())
265  assert approximatelyEqual(unserialized, stat)
266 
267 
268  stat = OnTheFlyStatistics()
269  stat.addDatum(1)
270  stat.addDatum(2)
271  stat.addDatum(3)
272  stat.addDatum(4)
273  stat.addDatum(5)
274 
275  unserialized = OnTheFlyStatistics()
276  unserialized.unserializeFromString("1;5;3.0;10.0")
277  assert approximatelyEqual(unserialized, stat)
278 
279 
280 
281 def test___eq_____ne_____hash__():
282  stat1_1 = OnTheFlyStatistics(3, 4, 5)
283  stat1_2 = OnTheFlyStatistics(3, 4, 5)
284  stat2 = OnTheFlyStatistics(1, 4, 5)
285  stat3 = OnTheFlyStatistics(3, 1, 5)
286  stat4 = OnTheFlyStatistics(3, 4, 1)
287 
288  stat2to4 = [stat2, stat3, stat4]
289  allstat = [stat1_1, stat1_2] + stat2to4
290 
291  for stat in allstat:
292  assert stat is stat
293  assert stat == stat
294  assert not stat != stat
295  assert stat.__hash__() == stat.__hash__()
296 
297  assert stat1_1 == stat1_2
298  assert stat1_2 == stat1_1
299  assert not stat1_1 != stat1_2
300  assert not stat1_2 != stat1_1
301  assert stat1_1.__hash__() == stat1_2.__hash__()
302 
303  for statcollection in [[stat1_1] + stat2to4, [stat1_2] + stat2to4]:
304  for stat in statcollection:
305  for other in statcollection:
306  if stat is other:
307  continue
308  assert not stat == other
309  assert stat != other
310  assert stat.__hash__() != other.__hash__()
311 
312 
313 def test___repr__():
314  dataSizes = \
315  [
316  0, 1,
317  2, 3,
318  4, 5,
319  7, 8, 9,
320  15, 16, 17,
321  31, 32, 33,
322  63, 64, 65, 100
323  ]
324 
325  for dataSize in dataSizes:
326  import random
327  data = [random.random() for _ in range(0, dataSize)]
328 
329  stat = OnTheFlyStatistics()
330  for datum in data:
331  stat.addDatum(datum)
332 
333  assert isinstance(stat.__repr__(), str)
MPCDAnalysis.OnTheFlyStatistics
Definition: OnTheFlyStatistics.py:1