Initial commit. Please see the README
[golden_search.git] / measurements.py
blob68d19d93d3351c9938ec1dcd7399157f68bcdcdf
1 import math
3 from number import Number
5 def avg(l):
6 assert len(l)
7 return sum(l) / float(len(l))
9 class MethodAnalyzer:
10 def __init__(self):
11 self.method_data = {}
12 self.method_avg_sdsq = {}
14 def addMeasurement(self, m):
15 assert m.method
16 l = self.method_data.get(m.method, [])
17 l.append( m.computeStats() )
18 self.method_data[m.method] = l
20 def computeStats(self, verbose=False):
21 for method, l in self.method_data.iteritems():
22 avg_sdsq = avg( [ t[2] for t in l ] )
23 min_sdsq = min( t[2] for t in l )
24 max_sdsq = max( t[2] for t in l )
26 self.method_avg_sdsq[method] = avg_sdsq
27 if verbose:
28 print method
29 print "min =", min_sdsq
30 print "avg =", avg_sdsq
31 print "max =", max_sdsq
33 class M:
34 def __init__(self, name, ms, method=None, units=None, precise=False):
35 if units == None:
36 units = {'m':1}
38 if precise:
39 assert len(ms) == 1
41 self.name = name
42 self.ms = map(float, ms)
43 #self.ms = ms
44 self.method = method
45 self.units = units
46 self.precise = precise
48 def computeStats(self):
49 n = len(self.ms)
50 mean = avg(self.ms)
51 # delime takhle kvuli nevychylenymu odhadu
52 sdsq = sum((x - mean)**2 for x in self.ms) / ( (n - 1) if n > 1 else 1 )
54 return (n, mean, sdsq)
56 def toNumber(self, method_resolution=None, method_analyzer=None):
57 if self.precise:
58 return Number(self.ms[0], units=self.units, string=self.name)
60 n, mean, sdsq = self.computeStats()
61 if self.method:
62 if method_analyzer:
63 mavg = method_analyzer.method_avg_sdsq[self.method]
64 if sdsq < mavg:
65 sdsq = mavg
67 # the more measurements, the better
68 sdsq /= n
70 if method_resolution:
71 # add the resolution of the method
72 sdsq += method_resolution[self.method] ** 2
74 return Number(mean, sdsq=sdsq, units=self.units, string=self.name)