79 lines
2.1 KiB
Python
79 lines
2.1 KiB
Python
|
"""Shared routines for the plotters."""
|
||
|
|
||
|
import fileinput
|
||
|
import collections
|
||
|
|
||
|
Record = collections.namedtuple('Record', 'variant function bytes loops src_alignment dst_alignment run_id elapsed rest')
|
||
|
|
||
|
|
||
|
def make_colours():
|
||
|
return iter('m b g r c y k pink orange brown grey'.split())
|
||
|
|
||
|
def parse_value(v):
|
||
|
"""Turn text into a primitive"""
|
||
|
try:
|
||
|
if '.' in v:
|
||
|
return float(v)
|
||
|
else:
|
||
|
return int(v)
|
||
|
except ValueError:
|
||
|
return v
|
||
|
|
||
|
def create_column_tuple(record, names):
|
||
|
cols = [getattr(record, name) for name in names]
|
||
|
return tuple(cols)
|
||
|
|
||
|
def unique(records, name, prefer=''):
|
||
|
"""Return the unique values of a column in the records"""
|
||
|
if type(name) == tuple:
|
||
|
values = list(set(create_column_tuple(x, name) for x in records))
|
||
|
else:
|
||
|
values = list(set(getattr(x, name) for x in records))
|
||
|
|
||
|
if not values:
|
||
|
return values
|
||
|
elif type(values[0]) == str:
|
||
|
return sorted(values, key=lambda x: '%-06d|%s' % (-prefer.find(x), x))
|
||
|
else:
|
||
|
return sorted(values)
|
||
|
|
||
|
def alignments_equal(alignments):
|
||
|
for alignment in alignments:
|
||
|
if alignment[0] != alignment[1]:
|
||
|
return False
|
||
|
return True
|
||
|
|
||
|
def parse_row(line):
|
||
|
return Record(*[parse_value(y) for y in line.split(':')])
|
||
|
|
||
|
def parse():
|
||
|
"""Parse a record file into named tuples, correcting for loop
|
||
|
overhead along the way.
|
||
|
"""
|
||
|
records = [parse_row(x) for x in fileinput.input()]
|
||
|
|
||
|
# Pull out any bounce values
|
||
|
costs = {}
|
||
|
|
||
|
for record in [x for x in records if x.function=='bounce']:
|
||
|
costs[(record.bytes, record.loops)] = record.elapsed
|
||
|
|
||
|
# Fix up all of the records for cost
|
||
|
out = []
|
||
|
|
||
|
for record in records:
|
||
|
if record.function == 'bounce':
|
||
|
continue
|
||
|
|
||
|
cost = costs.get((record.bytes, record.loops), None)
|
||
|
|
||
|
if not cost:
|
||
|
out.append(record)
|
||
|
else:
|
||
|
# Unfortunately you can't update a namedtuple...
|
||
|
values = list(record)
|
||
|
values[-2] -= cost
|
||
|
out.append(Record(*values))
|
||
|
|
||
|
return out
|