Fail* result browser for pruning experiments.

Based on the database layout given by the pruner.
Run ./run.py -c <path to mysql.cnf>
(Default config ~/.my.cnf)

- Checks if objdump table exists
- Added view for results per instruction
- Added config file support for table details
- Overview data loaded at server startup
- Result type mapping configurable via config file

Based on Flask and MySQLdb

Change-Id: Ib49eac8f5c1e0ab23921aedb5bc53c34d0cde14d
This commit is contained in:
Martin Hoffmann
2013-09-26 14:02:36 +02:00
committed by Gerrit Code Review
parent b4f144745a
commit e4bf980b97
16 changed files with 1140 additions and 0 deletions

View File

@ -0,0 +1,143 @@
from pprint import pprint
import details
import model
def scrub(table_name):
return ''.join( chr for chr in table_name if chr.isalnum() or chr == '_' )
class Resulttype:
def __init__(self, name, count):
self.name = name
self.count = count
def getName(self):
return self.name
def getCount(self):
return self.count
class Variant:
def __init__(self, id, name, table, benchmark, detail):
self.id = id
self.dbname = name
self.parenttable = table # TableDetails
self.details = detail # VariantDetails
self.benchmark = benchmark # BenchmarkDetails
self.results = {}
self.totalresults = 0
def getMapper(self):
mapper = self.benchmark.getMapper()
if not mapper: #try benchmark mapper
mapper = self.details.getMapper()
if not mapper: # of not there, try parent tables mapper
mapper = self.parenttable.getMapper()
if not mapper: # no mapper found at all, try default mapper
mapper = model.detaildealer.getDefaultMapper()
return mapper
def addResulttype(self, name, count):
mapper = self.getMapper()
label = mapper.getLabel(name)
oldcount = self.results.setdefault(label, 0)
self.results[label] = oldcount + count
self.totalresults += count
def getResultLabels(self):
return self.results.keys()
def getDBName(self):
return str(self.name)
def getId(self):
return self.id
def getResults(self):
return self.results
def getTableDetails(self):
return self.parenttable
def getBenchmarkDetails(self):
return self.benchmark
def getDetails(self):
return self.details
def getTotals(self):
return self.totalresults
def __str__(self):
ret = "Variant: " + self.getDetails().getTitle() + " - " + self.getBenchmarkDetails().getTitle() +" (id: " + str( self.id )+ ")" + " "
ret += "Total Results: " + str( self.totalresults ) + "\n"
for v in self.results:
ret += "\t" + v.name + ": " + str( v.count ) + "\n"
return ret
__repr__ = __str__
'''A ResultTable contains n Variants'''
class ResultTable:
def __init__(self, name, cfg):
self.name = scrub(name)
self.details = cfg.getTable(name)
self.variants = {}
def addVariant(self, var):
if var.getId() in self.variants:
return
self.variants[var.getId()] = var # Add if not existing yet
def getVariant(self, id):
if id in self.variants:
return self.variants[id]
return None
def getVariantById(self, varid):
for k,v in self.variants.items():
if int(v.getId()) == int(varid):
return v
return None
def getDetails(self):
return self.details
def getVariants(self):
return self.variants
def __str__(self):
ret = "Result: " + self.getDetails().getTitle() + "\n"
for k,v in self.variants.items():
ret += "\t" + str(v) + "\n"
return ret
__repr__ = __str__
'''Overview has n ResultTables'''
class Overview:
def __init__(self):
self.tables = {}
def add(self, table):
self.tables[table.getDetails().getDBName()] = table
def getTables(self):
return self.tables
def getTable(self, dbname):
return self.tables.get(dbname, None)
def getVariantById(self, variant_id):
for key,table in self.tables.items():
variant = table.getVariantById(variant_id)
if variant:
return variant
print "Variant not found."
return None
def length(self):
return len(self.tables)