diff options
Diffstat (limited to 'util/stats')
-rw-r--r-- | util/stats/db.py | 35 | ||||
-rw-r--r-- | util/stats/info.py | 28 | ||||
-rwxr-xr-x | util/stats/stats.py | 99 |
3 files changed, 151 insertions, 11 deletions
diff --git a/util/stats/db.py b/util/stats/db.py index 495cdb5b5..ed5d10bc2 100644 --- a/util/stats/db.py +++ b/util/stats/db.py @@ -207,16 +207,43 @@ class Database(object): # Name: listTicks # Desc: Prints all samples for a given run - def listTicks(self, run=None): + def listTicks(self, runs=None): print "tick" print "----------------------------------------" - sql = 'select distinct dt_tick from data where dt_stat=1950' - #if run != None: - # sql += ' where dt_run=%d' % run + sql = 'select distinct dt_tick from data where dt_stat=1180 and (' + if runs != None: + first = True + for run in runs: + if first: + # sql += ' where' + first = False + else: + sql += ' or' + sql += ' dt_run=%s' % run.run + sql += ')' self.query(sql) for r in self.cursor.fetchall(): print r[0] + # Name: retTicks + # Desc: Prints all samples for a given run + def retTicks(self, runs=None): + sql = 'select distinct dt_tick from data where dt_stat=1180 and (' + if runs != None: + first = True + for run in runs: + if first: + first = False + else: + sql += ' or' + sql += ' dt_run=%s' % run.run + sql += ')' + self.query(sql) + ret = [] + for r in self.cursor.fetchall(): + ret.append(r[0]) + return ret + # Name: liststats # Desc: Prints all statistics that appear in the database, # the optional argument is a regular expression that can diff --git a/util/stats/info.py b/util/stats/info.py index d11619765..01d7bdb0f 100644 --- a/util/stats/info.py +++ b/util/stats/info.py @@ -3,6 +3,8 @@ import operator, re, types source = None display_run = 0 +global globalTicks +globalTicks = None def issequence(t): return isinstance(t, types.TupleType) or isinstance(t, types.ListType) @@ -130,6 +132,7 @@ def cmp(a, b): return 1 class Statistic(object): + def __init__(self, data): self.__dict__.update(data.__dict__) if not self.__dict__.has_key('value'): @@ -138,9 +141,25 @@ class Statistic(object): self.__dict__['bins'] = None if not self.__dict__.has_key('ticks'): self.__dict__['ticks'] = None + if 'vc' not in self.__dict__: + self.vc = {} def __getattribute__(self, attr): + if attr == 'ticks': + if self.__dict__['ticks'] != globalTicks: + self.__dict__['value'] = None + self.__dict__['ticks'] = globalTicks + return self.__dict__['ticks'] if attr == 'value': + if self.__dict__['ticks'] != globalTicks: + if self.__dict__['ticks'] != None and \ + len(self.__dict__['ticks']) == 1: + self.vc[self.__dict__['ticks'][0]] = self.__dict__['value'] + self.__dict__['ticks'] = globalTicks + if len(globalTicks) == 1 and self.vc.has_key(globalTicks[0]): + self.__dict__['value'] = self.vc[globalTicks[0]] + else: + self.__dict__['value'] = None if self.__dict__['value'] == None: self.__dict__['value'] = self.getValue() return self.__dict__['value'] @@ -152,11 +171,12 @@ class Statistic(object): if attr == 'bins': if value is not None: value = source.getBin(value) - elif attr == 'ticks' and type(value) is str: - value = [ int(x) for x in value.split() ] + #elif attr == 'ticks' and type(value) is str: + # value = [ int(x) for x in value.split() ] self.__dict__[attr] = value self.__dict__['value'] = None + self.vc = {} else: super(Statistic, self).__setattr__(attr, value) @@ -287,7 +307,7 @@ class Scalar(Statistic,FormulaStat): class Vector(Statistic,FormulaStat): def getValue(self): - return source.data(self, self.bins); + return source.data(self, self.bins, self.ticks); def display(self): import display @@ -304,7 +324,7 @@ class Vector(Statistic,FormulaStat): def __eq__(self, other): if issequence(self.value) != issequence(other.value): - return false + return False if issequence(self.value): if len(self.value) != len(other.value): diff --git a/util/stats/stats.py b/util/stats/stats.py index b2b0ff8ad..c9b7ab2ac 100755 --- a/util/stats/stats.py +++ b/util/stats/stats.py @@ -1,11 +1,24 @@ #!/usr/bin/env python from __future__ import division -import re, sys +import re, sys, math + def usage(): print '''\ Usage: %s [-E] [-F] [-d <db> ] [-g <get> ] [-h <host>] [-p] - [-s <system>] [-r <runs> ] [-u <username>] <command> [command args] + [-s <system>] [-r <runs> ] [-T <samples>] [-u <username>] + <command> [command args] + + commands extra parameters description + ----------- ------------------ --------------------------------------- + bins [regex] List bins (only matching regex) + formula <formula> Evaluated formula specified + formulas [regex] List formulas (only matching regex) + runs none List all runs in database + samples none List samples present in database + stability <pairnum> <stats> Calculated statistical info about stats + stat <regex> Show stat data (only matching regex) + stats [regex] List all stats (only matching regex) ''' % sys.argv[0] sys.exit(1) @@ -249,6 +262,86 @@ def commands(options, command, args): info.source.listRuns(user) return + if command == 'stability': + if len(args) < 2: + raise CommandException + + try: + merge = int(args[0]) + except ValueError: + usage() + stats = info.source.getStat(args[1]) + info.source.get = "sum" + + + #loop through all the stats selected + for stat in stats: + + print "%s:" % stat.name + print "%-20s %12s %12s %4s %5s %5s %5s %10s" % \ + ("run name", "average", "stdev", ">10%", ">1SDV", ">2SDV", "SAMP", "CV") + print "%-20s %12s %12s %4s %5s %5s %5s %10s" % \ + ("--------------------", "------------", + "------------", "----", "-----", "-----", "-----", "----------") + #loop through all the selected runs + for run in runs: + info.display_run = run.run; + runTicks = info.source.retTicks([ run ]) + #throw away the first one, it's 0 + runTicks.pop(0) + info.globalTicks = runTicks + avg = 0 + stdev = 0 + numoutsideavg = 0 + numoutside1std = 0 + numoutside2std = 0 + pairRunTicks = [] + if float(stat) == 1e300*1e300: + continue + for t in range(0, len(runTicks)-(merge-1), merge): + tempPair = [] + for p in range(0,merge): + tempPair.append(runTicks[t+p]) + pairRunTicks.append(tempPair) + #loop through all the various ticks for each run + for tick in pairRunTicks: + info.globalTicks = tick + avg += float(stat) + avg /= len(pairRunTicks) + for tick in pairRunTicks: + info.globalTicks = tick + val = float(stat) + stdev += pow((val-avg),2) + stdev = math.sqrt(stdev / len(pairRunTicks)) + for tick in pairRunTicks: + info.globalTicks = tick + val = float(stat) + if (val < (avg * .9)) or (val > (avg * 1.1)): + numoutsideavg += 1 + if (val < (avg - stdev)) or (val > (avg + stdev)): + numoutside1std += 1 + if (val < (avg - (2*stdev))) or (val > (avg + (2*stdev))): + numoutside2std += 1 + if avg > 1000: + print "%-20s %12s %12s %4s %5s %5s %5s %10s" % \ + (run.name, "%.1f" % avg, "%.1f" % stdev, + "%d" % numoutsideavg, "%d" % numoutside1std, + "%d" % numoutside2std, "%d" % len(pairRunTicks), + "%.3f" % (stdev/avg*100)) + elif avg > 100: + print "%-20s %12s %12s %4s %5s %5s %5s %10s" % \ + (run.name, "%.1f" % avg, "%.1f" % stdev, + "%d" % numoutsideavg, "%d" % numoutside1std, + "%d" % numoutside2std, "%d" % len(pairRunTicks), + "%.5f" % (stdev/avg*100)) + else: + print "%-20s %12s %12s %4s %5s %5s %5s %10s" % \ + (run.name, "%.5f" % avg, "%.5f" % stdev, + "%d" % numoutsideavg, "%d" % numoutside1std, + "%d" % numoutside2std, "%d" % len(pairRunTicks), + "%.7f" % (stdev/avg*100)) + return + if command == 'stats': if len(args) == 0: info.source.listStats() @@ -270,7 +363,7 @@ def commands(options, command, args): else: if options.ticks: print 'only displaying sample %s' % options.ticks - stat.ticks = options.ticks + info.globalTicks = [ int(x) for x in options.ticks.split() ] if options.binned: print 'kernel ticks' |