From 03ea2e6ac59f50c351a25dacaa950450c6301bb7 Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Mon, 13 May 2024 14:23:26 -0500 Subject: [PATCH] Tweaked cov.py, summary.py, to render fraction percents as notes This matches how diff percentages are rendered, and simplifies the internal table rendering by making Frac less of a special case. It also allows for other type notes in the future. One concern is how all the notes are shoved to the side, which may make it a bit harder to find related percentages. If this becomes annoying we should probably look into interspersing all notes (including diff percentages) between the relevant columns. Before: function lines branches lfsr_rbyd_appendattr 230/231 99.6% 172/192 89.6% lfsr_rbyd_p_recolor 33/34 97.1% 11/12 91.7% lfs_alloc 40/42 95.2% 21/24 87.5% lfsr_rbyd_appendcompaction 54/57 94.7% 39/42 92.9% ... After: function lines branches lfsr_rbyd_appendattr 230/231 172/192 (99.6%, 89.6%) lfsr_rbyd_p_recolor 33/34 11/12 (97.1%, 91.7%) lfs_alloc 40/42 21/24 (95.2%, 87.5%) lfsr_rbyd_appendcompaction 54/57 39/42 (94.7%, 92.9%) ... --- scripts/code.py | 69 ++++++++++++++++----------------- scripts/cov.py | 92 ++++++++++++++++++++------------------------ scripts/data.py | 69 ++++++++++++++++----------------- scripts/perf.py | 69 ++++++++++++++++----------------- scripts/perfbd.py | 69 ++++++++++++++++----------------- scripts/stack.py | 69 ++++++++++++++++----------------- scripts/structs.py | 69 ++++++++++++++++----------------- scripts/summary.py | 96 +++++++++++++++++++++------------------------- 8 files changed, 277 insertions(+), 325 deletions(-) diff --git a/scripts/code.py b/scripts/code.py index 2327bdbe..8f5f0752 100755 --- a/scripts/code.py +++ b/scripts/code.py @@ -67,10 +67,7 @@ class Int(co.namedtuple('Int', 'x')): def table(self): return '%7s' % (self,) - diff_none = '%7s' % '-' - diff_table = table - - def diff_diff(self, other): + def diff(self, other): new = self.x if self else 0 old = other.x if other else 0 diff = new - old @@ -426,7 +423,7 @@ def table(Result, results, diff_results=None, *, header.append('') lines.append(header) - def table_entry(name, r, diff_r=None, ratios=[]): + def table_entry(name, r, diff_r=None): entry = [] entry.append(name) if diff_results is None: @@ -436,37 +433,43 @@ def table(Result, results, diff_results=None, *, else types[k].none) elif percent: for k in fields: - entry.append(getattr(r, k).diff_table() + entry.append(getattr(r, k).table() if getattr(r, k, None) is not None - else types[k].diff_none) + else types[k].none) else: for k in fields: - entry.append(getattr(diff_r, k).diff_table() + entry.append(getattr(diff_r, k).table() if getattr(diff_r, k, None) is not None - else types[k].diff_none) + else types[k].none) for k in fields: - entry.append(getattr(r, k).diff_table() + entry.append(getattr(r, k).table() if getattr(r, k, None) is not None - else types[k].diff_none) + else types[k].none) for k in fields: - entry.append(types[k].diff_diff( + entry.append(types[k].diff( getattr(r, k, None), getattr(diff_r, k, None))) if diff_results is None: - entry.append('') - elif percent: - entry.append(' (%s)' % ', '.join( - '+∞%' if t == +m.inf - else '-∞%' if t == -m.inf - else '%+.1f%%' % (100*t) - for t in ratios)) + notes = [] + for k in fields: + try: + notes.extend(getattr(r, k).notes()) + except AttributeError: + pass + entry.append(' (%s)' % ', '.join(notes) + if notes else '') else: + ratios = [ + types[k].ratio( + getattr(r, k, None), + getattr(diff_r, k, None)) + for k in fields] entry.append(' (%s)' % ', '.join( '+∞%' if t == +m.inf else '-∞%' if t == -m.inf else '%+.1f%%' % (100*t) for t in ratios) - if any(ratios) else '') + if percent or any(ratios) else '') return entry # entries @@ -475,34 +478,26 @@ def table(Result, results, diff_results=None, *, r = table.get(name) if diff_results is None: diff_r = None - ratios = None else: diff_r = diff_table.get(name) - ratios = [ - types[k].ratio( - getattr(r, k, None), - getattr(diff_r, k, None)) - for k in fields] - if not all_ and not any(ratios): + if not all_ and not any( + types[k].ratio( + getattr(r, k, None), + getattr(diff_r, k, None)) + for k in fields): continue - lines.append(table_entry(name, r, diff_r, ratios)) + lines.append(table_entry(name, r, diff_r)) # total r = next(iter(fold(Result, results, by=[])), None) if diff_results is None: diff_r = None - ratios = None else: diff_r = next(iter(fold(Result, diff_results, by=[])), None) - ratios = [ - types[k].ratio( - getattr(r, k, None), - getattr(diff_r, k, None)) - for k in fields] - lines.append(table_entry('TOTAL', r, diff_r, ratios)) + lines.append(table_entry('TOTAL', r, diff_r)) - # find the best widths, note that column 0 contains the names and column -1 - # the ratios, so those are handled a bit differently + # find the best widths, note that column 0 contains the names and + # column -1 the ratios/notes, so those are handled a bit differently widths = [ ((max(it.chain([w], (len(l[i]) for l in lines)))+1+4-1)//4)*4-1 for w, i in zip( diff --git a/scripts/cov.py b/scripts/cov.py index 0ae5f60e..0390d152 100755 --- a/scripts/cov.py +++ b/scripts/cov.py @@ -67,10 +67,7 @@ class Int(co.namedtuple('Int', 'x')): def table(self): return '%7s' % (self,) - diff_none = '%7s' % '-' - diff_table = table - - def diff_diff(self, other): + def diff(self, other): new = self.x if self else 0 old = other.x if other else 0 diff = new - old @@ -124,25 +121,22 @@ class Frac(co.namedtuple('Frac', 'a,b')): def __float__(self): return float(self.a) - none = '%11s %7s' % ('-', '-') + none = '%11s' % '-' def table(self): - t = self.a.x/self.b.x if self.b.x else 1.0 - return '%11s %7s' % ( - self, - '∞%' if t == +m.inf - else '-∞%' if t == -m.inf - else '%.1f%%' % (100*t)) - - diff_none = '%11s' % '-' - def diff_table(self): return '%11s' % (self,) - def diff_diff(self, other): + def notes(self): + t = self.a.x/self.b.x if self.b.x else 1.0 + return ['∞%' if t == +m.inf + else '-∞%' if t == -m.inf + else '%.1f%%' % (100*t)] + + def diff(self, other): new_a, new_b = self if self else (Int(0), Int(0)) old_a, old_b = other if other else (Int(0), Int(0)) return '%11s' % ('%s/%s' % ( - new_a.diff_diff(old_a).strip(), - new_b.diff_diff(old_b).strip())) + new_a.diff(old_a).strip(), + new_b.diff(old_b).strip())) def ratio(self, other): new_a, new_b = self if self else (Int(0), Int(0)) @@ -408,7 +402,7 @@ def table(Result, results, diff_results=None, *, header.append('') lines.append(header) - def table_entry(name, r, diff_r=None, ratios=[]): + def table_entry(name, r, diff_r=None): entry = [] entry.append(name) if diff_results is None: @@ -418,37 +412,43 @@ def table(Result, results, diff_results=None, *, else types[k].none) elif percent: for k in fields: - entry.append(getattr(r, k).diff_table() + entry.append(getattr(r, k).table() if getattr(r, k, None) is not None - else types[k].diff_none) + else types[k].none) else: for k in fields: - entry.append(getattr(diff_r, k).diff_table() + entry.append(getattr(diff_r, k).table() if getattr(diff_r, k, None) is not None - else types[k].diff_none) + else types[k].none) for k in fields: - entry.append(getattr(r, k).diff_table() + entry.append(getattr(r, k).table() if getattr(r, k, None) is not None - else types[k].diff_none) + else types[k].none) for k in fields: - entry.append(types[k].diff_diff( + entry.append(types[k].diff( getattr(r, k, None), getattr(diff_r, k, None))) if diff_results is None: - entry.append('') - elif percent: - entry.append(' (%s)' % ', '.join( - '+∞%' if t == +m.inf - else '-∞%' if t == -m.inf - else '%+.1f%%' % (100*t) - for t in ratios)) + notes = [] + for k in fields: + try: + notes.extend(getattr(r, k).notes()) + except AttributeError: + pass + entry.append(' (%s)' % ', '.join(notes) + if notes else '') else: + ratios = [ + types[k].ratio( + getattr(r, k, None), + getattr(diff_r, k, None)) + for k in fields] entry.append(' (%s)' % ', '.join( '+∞%' if t == +m.inf else '-∞%' if t == -m.inf else '%+.1f%%' % (100*t) for t in ratios) - if any(ratios) else '') + if percent or any(ratios) else '') return entry # entries @@ -457,34 +457,26 @@ def table(Result, results, diff_results=None, *, r = table.get(name) if diff_results is None: diff_r = None - ratios = None else: diff_r = diff_table.get(name) - ratios = [ - types[k].ratio( - getattr(r, k, None), - getattr(diff_r, k, None)) - for k in fields] - if not all_ and not any(ratios): + if not all_ and not any( + types[k].ratio( + getattr(r, k, None), + getattr(diff_r, k, None)) + for k in fields): continue - lines.append(table_entry(name, r, diff_r, ratios)) + lines.append(table_entry(name, r, diff_r)) # total r = next(iter(fold(Result, results, by=[])), None) if diff_results is None: diff_r = None - ratios = None else: diff_r = next(iter(fold(Result, diff_results, by=[])), None) - ratios = [ - types[k].ratio( - getattr(r, k, None), - getattr(diff_r, k, None)) - for k in fields] - lines.append(table_entry('TOTAL', r, diff_r, ratios)) + lines.append(table_entry('TOTAL', r, diff_r)) - # find the best widths, note that column 0 contains the names and column -1 - # the ratios, so those are handled a bit differently + # find the best widths, note that column 0 contains the names and + # column -1 the ratios/notes, so those are handled a bit differently widths = [ ((max(it.chain([w], (len(l[i]) for l in lines)))+1+4-1)//4)*4-1 for w, i in zip( diff --git a/scripts/data.py b/scripts/data.py index c4243755..18e99064 100755 --- a/scripts/data.py +++ b/scripts/data.py @@ -67,10 +67,7 @@ class Int(co.namedtuple('Int', 'x')): def table(self): return '%7s' % (self,) - diff_none = '%7s' % '-' - diff_table = table - - def diff_diff(self, other): + def diff(self, other): new = self.x if self else 0 old = other.x if other else 0 diff = new - old @@ -426,7 +423,7 @@ def table(Result, results, diff_results=None, *, header.append('') lines.append(header) - def table_entry(name, r, diff_r=None, ratios=[]): + def table_entry(name, r, diff_r=None): entry = [] entry.append(name) if diff_results is None: @@ -436,37 +433,43 @@ def table(Result, results, diff_results=None, *, else types[k].none) elif percent: for k in fields: - entry.append(getattr(r, k).diff_table() + entry.append(getattr(r, k).table() if getattr(r, k, None) is not None - else types[k].diff_none) + else types[k].none) else: for k in fields: - entry.append(getattr(diff_r, k).diff_table() + entry.append(getattr(diff_r, k).table() if getattr(diff_r, k, None) is not None - else types[k].diff_none) + else types[k].none) for k in fields: - entry.append(getattr(r, k).diff_table() + entry.append(getattr(r, k).table() if getattr(r, k, None) is not None - else types[k].diff_none) + else types[k].none) for k in fields: - entry.append(types[k].diff_diff( + entry.append(types[k].diff( getattr(r, k, None), getattr(diff_r, k, None))) if diff_results is None: - entry.append('') - elif percent: - entry.append(' (%s)' % ', '.join( - '+∞%' if t == +m.inf - else '-∞%' if t == -m.inf - else '%+.1f%%' % (100*t) - for t in ratios)) + notes = [] + for k in fields: + try: + notes.extend(getattr(r, k).notes()) + except AttributeError: + pass + entry.append(' (%s)' % ', '.join(notes) + if notes else '') else: + ratios = [ + types[k].ratio( + getattr(r, k, None), + getattr(diff_r, k, None)) + for k in fields] entry.append(' (%s)' % ', '.join( '+∞%' if t == +m.inf else '-∞%' if t == -m.inf else '%+.1f%%' % (100*t) for t in ratios) - if any(ratios) else '') + if percent or any(ratios) else '') return entry # entries @@ -475,34 +478,26 @@ def table(Result, results, diff_results=None, *, r = table.get(name) if diff_results is None: diff_r = None - ratios = None else: diff_r = diff_table.get(name) - ratios = [ - types[k].ratio( - getattr(r, k, None), - getattr(diff_r, k, None)) - for k in fields] - if not all_ and not any(ratios): + if not all_ and not any( + types[k].ratio( + getattr(r, k, None), + getattr(diff_r, k, None)) + for k in fields): continue - lines.append(table_entry(name, r, diff_r, ratios)) + lines.append(table_entry(name, r, diff_r)) # total r = next(iter(fold(Result, results, by=[])), None) if diff_results is None: diff_r = None - ratios = None else: diff_r = next(iter(fold(Result, diff_results, by=[])), None) - ratios = [ - types[k].ratio( - getattr(r, k, None), - getattr(diff_r, k, None)) - for k in fields] - lines.append(table_entry('TOTAL', r, diff_r, ratios)) + lines.append(table_entry('TOTAL', r, diff_r)) - # find the best widths, note that column 0 contains the names and column -1 - # the ratios, so those are handled a bit differently + # find the best widths, note that column 0 contains the names and + # column -1 the ratios/notes, so those are handled a bit differently widths = [ ((max(it.chain([w], (len(l[i]) for l in lines)))+1+4-1)//4)*4-1 for w, i in zip( diff --git a/scripts/perf.py b/scripts/perf.py index bcc4d347..63d79e1e 100755 --- a/scripts/perf.py +++ b/scripts/perf.py @@ -76,10 +76,7 @@ class Int(co.namedtuple('Int', 'x')): def table(self): return '%7s' % (self,) - diff_none = '%7s' % '-' - diff_table = table - - def diff_diff(self, other): + def diff(self, other): new = self.x if self else 0 old = other.x if other else 0 diff = new - old @@ -748,7 +745,7 @@ def table(Result, results, diff_results=None, *, header.append('') lines.append(header) - def table_entry(name, r, diff_r=None, ratios=[]): + def table_entry(name, r, diff_r=None): entry = [] entry.append(name) if diff_results is None: @@ -758,37 +755,43 @@ def table(Result, results, diff_results=None, *, else types[k].none) elif percent: for k in fields: - entry.append(getattr(r, k).diff_table() + entry.append(getattr(r, k).table() if getattr(r, k, None) is not None - else types[k].diff_none) + else types[k].none) else: for k in fields: - entry.append(getattr(diff_r, k).diff_table() + entry.append(getattr(diff_r, k).table() if getattr(diff_r, k, None) is not None - else types[k].diff_none) + else types[k].none) for k in fields: - entry.append(getattr(r, k).diff_table() + entry.append(getattr(r, k).table() if getattr(r, k, None) is not None - else types[k].diff_none) + else types[k].none) for k in fields: - entry.append(types[k].diff_diff( + entry.append(types[k].diff( getattr(r, k, None), getattr(diff_r, k, None))) if diff_results is None: - entry.append('') - elif percent: - entry.append(' (%s)' % ', '.join( - '+∞%' if t == +m.inf - else '-∞%' if t == -m.inf - else '%+.1f%%' % (100*t) - for t in ratios)) + notes = [] + for k in fields: + try: + notes.extend(getattr(r, k).notes()) + except AttributeError: + pass + entry.append(' (%s)' % ', '.join(notes) + if notes else '') else: + ratios = [ + types[k].ratio( + getattr(r, k, None), + getattr(diff_r, k, None)) + for k in fields] entry.append(' (%s)' % ', '.join( '+∞%' if t == +m.inf else '-∞%' if t == -m.inf else '%+.1f%%' % (100*t) for t in ratios) - if any(ratios) else '') + if percent or any(ratios) else '') return entry # entries @@ -797,34 +800,26 @@ def table(Result, results, diff_results=None, *, r = table.get(name) if diff_results is None: diff_r = None - ratios = None else: diff_r = diff_table.get(name) - ratios = [ - types[k].ratio( - getattr(r, k, None), - getattr(diff_r, k, None)) - for k in fields] - if not all_ and not any(ratios): + if not all_ and not any( + types[k].ratio( + getattr(r, k, None), + getattr(diff_r, k, None)) + for k in fields): continue - lines.append(table_entry(name, r, diff_r, ratios)) + lines.append(table_entry(name, r, diff_r)) # total r = next(iter(fold(Result, results, by=[])), None) if diff_results is None: diff_r = None - ratios = None else: diff_r = next(iter(fold(Result, diff_results, by=[])), None) - ratios = [ - types[k].ratio( - getattr(r, k, None), - getattr(diff_r, k, None)) - for k in fields] - lines.append(table_entry('TOTAL', r, diff_r, ratios)) + lines.append(table_entry('TOTAL', r, diff_r)) - # find the best widths, note that column 0 contains the names and column -1 - # the ratios, so those are handled a bit differently + # find the best widths, note that column 0 contains the names and + # column -1 the ratios/notes, so those are handled a bit differently widths = [ ((max(it.chain([w], (len(l[i]) for l in lines)))+1+4-1)//4)*4-1 for w, i in zip( diff --git a/scripts/perfbd.py b/scripts/perfbd.py index a29fd141..3c5b0607 100755 --- a/scripts/perfbd.py +++ b/scripts/perfbd.py @@ -67,10 +67,7 @@ class Int(co.namedtuple('Int', 'x')): def table(self): return '%7s' % (self,) - diff_none = '%7s' % '-' - diff_table = table - - def diff_diff(self, other): + def diff(self, other): new = self.x if self else 0 old = other.x if other else 0 diff = new - old @@ -714,7 +711,7 @@ def table(Result, results, diff_results=None, *, header.append('') lines.append(header) - def table_entry(name, r, diff_r=None, ratios=[]): + def table_entry(name, r, diff_r=None): entry = [] entry.append(name) if diff_results is None: @@ -724,37 +721,43 @@ def table(Result, results, diff_results=None, *, else types[k].none) elif percent: for k in fields: - entry.append(getattr(r, k).diff_table() + entry.append(getattr(r, k).table() if getattr(r, k, None) is not None - else types[k].diff_none) + else types[k].none) else: for k in fields: - entry.append(getattr(diff_r, k).diff_table() + entry.append(getattr(diff_r, k).table() if getattr(diff_r, k, None) is not None - else types[k].diff_none) + else types[k].none) for k in fields: - entry.append(getattr(r, k).diff_table() + entry.append(getattr(r, k).table() if getattr(r, k, None) is not None - else types[k].diff_none) + else types[k].none) for k in fields: - entry.append(types[k].diff_diff( + entry.append(types[k].diff( getattr(r, k, None), getattr(diff_r, k, None))) if diff_results is None: - entry.append('') - elif percent: - entry.append(' (%s)' % ', '.join( - '+∞%' if t == +m.inf - else '-∞%' if t == -m.inf - else '%+.1f%%' % (100*t) - for t in ratios)) + notes = [] + for k in fields: + try: + notes.extend(getattr(r, k).notes()) + except AttributeError: + pass + entry.append(' (%s)' % ', '.join(notes) + if notes else '') else: + ratios = [ + types[k].ratio( + getattr(r, k, None), + getattr(diff_r, k, None)) + for k in fields] entry.append(' (%s)' % ', '.join( '+∞%' if t == +m.inf else '-∞%' if t == -m.inf else '%+.1f%%' % (100*t) for t in ratios) - if any(ratios) else '') + if percent or any(ratios) else '') return entry # entries @@ -763,34 +766,26 @@ def table(Result, results, diff_results=None, *, r = table.get(name) if diff_results is None: diff_r = None - ratios = None else: diff_r = diff_table.get(name) - ratios = [ - types[k].ratio( - getattr(r, k, None), - getattr(diff_r, k, None)) - for k in fields] - if not all_ and not any(ratios): + if not all_ and not any( + types[k].ratio( + getattr(r, k, None), + getattr(diff_r, k, None)) + for k in fields): continue - lines.append(table_entry(name, r, diff_r, ratios)) + lines.append(table_entry(name, r, diff_r)) # total r = next(iter(fold(Result, results, by=[])), None) if diff_results is None: diff_r = None - ratios = None else: diff_r = next(iter(fold(Result, diff_results, by=[])), None) - ratios = [ - types[k].ratio( - getattr(r, k, None), - getattr(diff_r, k, None)) - for k in fields] - lines.append(table_entry('TOTAL', r, diff_r, ratios)) + lines.append(table_entry('TOTAL', r, diff_r)) - # find the best widths, note that column 0 contains the names and column -1 - # the ratios, so those are handled a bit differently + # find the best widths, note that column 0 contains the names and + # column -1 the ratios/notes, so those are handled a bit differently widths = [ ((max(it.chain([w], (len(l[i]) for l in lines)))+1+4-1)//4)*4-1 for w, i in zip( diff --git a/scripts/stack.py b/scripts/stack.py index 06228ac3..f685dea5 100755 --- a/scripts/stack.py +++ b/scripts/stack.py @@ -58,10 +58,7 @@ class Int(co.namedtuple('Int', 'x')): def table(self): return '%7s' % (self,) - diff_none = '%7s' % '-' - diff_table = table - - def diff_diff(self, other): + def diff(self, other): new = self.x if self else 0 old = other.x if other else 0 diff = new - old @@ -385,7 +382,7 @@ def table(Result, results, diff_results=None, *, header.append('') lines.append(header) - def table_entry(name, r, diff_r=None, ratios=[]): + def table_entry(name, r, diff_r=None): entry = [] entry.append(name) if diff_results is None: @@ -395,37 +392,43 @@ def table(Result, results, diff_results=None, *, else types[k].none) elif percent: for k in fields: - entry.append(getattr(r, k).diff_table() + entry.append(getattr(r, k).table() if getattr(r, k, None) is not None - else types[k].diff_none) + else types[k].none) else: for k in fields: - entry.append(getattr(diff_r, k).diff_table() + entry.append(getattr(diff_r, k).table() if getattr(diff_r, k, None) is not None - else types[k].diff_none) + else types[k].none) for k in fields: - entry.append(getattr(r, k).diff_table() + entry.append(getattr(r, k).table() if getattr(r, k, None) is not None - else types[k].diff_none) + else types[k].none) for k in fields: - entry.append(types[k].diff_diff( + entry.append(types[k].diff( getattr(r, k, None), getattr(diff_r, k, None))) if diff_results is None: - entry.append('') - elif percent: - entry.append(' (%s)' % ', '.join( - '+∞%' if t == +m.inf - else '-∞%' if t == -m.inf - else '%+.1f%%' % (100*t) - for t in ratios)) + notes = [] + for k in fields: + try: + notes.extend(getattr(r, k).notes()) + except AttributeError: + pass + entry.append(' (%s)' % ', '.join(notes) + if notes else '') else: + ratios = [ + types[k].ratio( + getattr(r, k, None), + getattr(diff_r, k, None)) + for k in fields] entry.append(' (%s)' % ', '.join( '+∞%' if t == +m.inf else '-∞%' if t == -m.inf else '%+.1f%%' % (100*t) for t in ratios) - if any(ratios) else '') + if percent or any(ratios) else '') return entry # entries @@ -434,34 +437,26 @@ def table(Result, results, diff_results=None, *, r = table.get(name) if diff_results is None: diff_r = None - ratios = None else: diff_r = diff_table.get(name) - ratios = [ - types[k].ratio( - getattr(r, k, None), - getattr(diff_r, k, None)) - for k in fields] - if not all_ and not any(ratios): + if not all_ and not any( + types[k].ratio( + getattr(r, k, None), + getattr(diff_r, k, None)) + for k in fields): continue - lines.append(table_entry(name, r, diff_r, ratios)) + lines.append(table_entry(name, r, diff_r)) # total r = next(iter(fold(Result, results, by=[])), None) if diff_results is None: diff_r = None - ratios = None else: diff_r = next(iter(fold(Result, diff_results, by=[])), None) - ratios = [ - types[k].ratio( - getattr(r, k, None), - getattr(diff_r, k, None)) - for k in fields] - lines.append(table_entry('TOTAL', r, diff_r, ratios)) + lines.append(table_entry('TOTAL', r, diff_r)) - # find the best widths, note that column 0 contains the names and column -1 - # the ratios, so those are handled a bit differently + # find the best widths, note that column 0 contains the names and + # column -1 the ratios/notes, so those are handled a bit differently widths = [ ((max(it.chain([w], (len(l[i]) for l in lines)))+1+4-1)//4)*4-1 for w, i in zip( diff --git a/scripts/structs.py b/scripts/structs.py index 9b32724e..571d01af 100755 --- a/scripts/structs.py +++ b/scripts/structs.py @@ -63,10 +63,7 @@ class Int(co.namedtuple('Int', 'x')): def table(self): return '%7s' % (self,) - diff_none = '%7s' % '-' - diff_table = table - - def diff_diff(self, other): + def diff(self, other): new = self.x if self else 0 old = other.x if other else 0 diff = new - old @@ -375,7 +372,7 @@ def table(Result, results, diff_results=None, *, header.append('') lines.append(header) - def table_entry(name, r, diff_r=None, ratios=[]): + def table_entry(name, r, diff_r=None): entry = [] entry.append(name) if diff_results is None: @@ -385,37 +382,43 @@ def table(Result, results, diff_results=None, *, else types[k].none) elif percent: for k in fields: - entry.append(getattr(r, k).diff_table() + entry.append(getattr(r, k).table() if getattr(r, k, None) is not None - else types[k].diff_none) + else types[k].none) else: for k in fields: - entry.append(getattr(diff_r, k).diff_table() + entry.append(getattr(diff_r, k).table() if getattr(diff_r, k, None) is not None - else types[k].diff_none) + else types[k].none) for k in fields: - entry.append(getattr(r, k).diff_table() + entry.append(getattr(r, k).table() if getattr(r, k, None) is not None - else types[k].diff_none) + else types[k].none) for k in fields: - entry.append(types[k].diff_diff( + entry.append(types[k].diff( getattr(r, k, None), getattr(diff_r, k, None))) if diff_results is None: - entry.append('') - elif percent: - entry.append(' (%s)' % ', '.join( - '+∞%' if t == +m.inf - else '-∞%' if t == -m.inf - else '%+.1f%%' % (100*t) - for t in ratios)) + notes = [] + for k in fields: + try: + notes.extend(getattr(r, k).notes()) + except AttributeError: + pass + entry.append(' (%s)' % ', '.join(notes) + if notes else '') else: + ratios = [ + types[k].ratio( + getattr(r, k, None), + getattr(diff_r, k, None)) + for k in fields] entry.append(' (%s)' % ', '.join( '+∞%' if t == +m.inf else '-∞%' if t == -m.inf else '%+.1f%%' % (100*t) for t in ratios) - if any(ratios) else '') + if percent or any(ratios) else '') return entry # entries @@ -424,34 +427,26 @@ def table(Result, results, diff_results=None, *, r = table.get(name) if diff_results is None: diff_r = None - ratios = None else: diff_r = diff_table.get(name) - ratios = [ - types[k].ratio( - getattr(r, k, None), - getattr(diff_r, k, None)) - for k in fields] - if not all_ and not any(ratios): + if not all_ and not any( + types[k].ratio( + getattr(r, k, None), + getattr(diff_r, k, None)) + for k in fields): continue - lines.append(table_entry(name, r, diff_r, ratios)) + lines.append(table_entry(name, r, diff_r)) # total r = next(iter(fold(Result, results, by=[])), None) if diff_results is None: diff_r = None - ratios = None else: diff_r = next(iter(fold(Result, diff_results, by=[])), None) - ratios = [ - types[k].ratio( - getattr(r, k, None), - getattr(diff_r, k, None)) - for k in fields] - lines.append(table_entry('TOTAL', r, diff_r, ratios)) + lines.append(table_entry('TOTAL', r, diff_r)) - # find the best widths, note that column 0 contains the names and column -1 - # the ratios, so those are handled a bit differently + # find the best widths, note that column 0 contains the names and + # column -1 the ratios/notes, so those are handled a bit differently widths = [ ((max(it.chain([w], (len(l[i]) for l in lines)))+1+4-1)//4)*4-1 for w, i in zip( diff --git a/scripts/summary.py b/scripts/summary.py index b5eb606f..4d267ca9 100755 --- a/scripts/summary.py +++ b/scripts/summary.py @@ -83,10 +83,7 @@ class Int(co.namedtuple('Int', 'x')): def table(self): return '%7s' % (self,) - diff_none = '%7s' % '-' - diff_table = table - - def diff_diff(self, other): + def diff(self, other): new = self.x if self else 0 old = other.x if other else 0 diff = new - old @@ -155,10 +152,8 @@ class Float(co.namedtuple('Float', 'x')): none = Int.none table = Int.table - diff_none = Int.diff_none - diff_table = Int.diff_table - def diff_diff(self, other): + def diff(self, other): new = self.x if self else 0 old = other.x if other else 0 diff = new - old @@ -192,25 +187,22 @@ class Frac(co.namedtuple('Frac', 'a,b')): def __float__(self): return float(self.a) - none = '%11s %7s' % ('-', '-') + none = '%11s' % '-' def table(self): - t = self.a.x/self.b.x if self.b.x else 1.0 - return '%11s %7s' % ( - self, - '∞%' if t == +m.inf - else '-∞%' if t == -m.inf - else '%.1f%%' % (100*t)) - - diff_none = '%11s' % '-' - def diff_table(self): return '%11s' % (self,) - def diff_diff(self, other): + def notes(self): + t = self.a.x/self.b.x if self.b.x else 1.0 + return ['∞%' if t == +m.inf + else '-∞%' if t == -m.inf + else '%.1f%%' % (100*t)] + + def diff(self, other): new_a, new_b = self if self else (Int(0), Int(0)) old_a, old_b = other if other else (Int(0), Int(0)) return '%11s' % ('%s/%s' % ( - new_a.diff_diff(old_a).strip(), - new_b.diff_diff(old_b).strip())) + new_a.diff(old_a).strip(), + new_b.diff(old_b).strip())) def ratio(self, other): new_a, new_b = self if self else (Int(0), Int(0)) @@ -503,7 +495,7 @@ def table(Result, results, diff_results=None, *, header.append('') lines.append(header) - def table_entry(name, r, diff_r=None, ratios=[]): + def table_entry(name, r, diff_r=None): entry = [] entry.append(name) if diff_results is None: @@ -513,37 +505,43 @@ def table(Result, results, diff_results=None, *, else types[k].none) elif percent: for k in fields: - entry.append(getattr(r, k).diff_table() + entry.append(getattr(r, k).table() if getattr(r, k, None) is not None - else types[k].diff_none) + else types[k].none) else: for k in fields: - entry.append(getattr(diff_r, k).diff_table() + entry.append(getattr(diff_r, k).table() if getattr(diff_r, k, None) is not None - else types[k].diff_none) + else types[k].none) for k in fields: - entry.append(getattr(r, k).diff_table() + entry.append(getattr(r, k).table() if getattr(r, k, None) is not None - else types[k].diff_none) + else types[k].none) for k in fields: - entry.append(types[k].diff_diff( + entry.append(types[k].diff( getattr(r, k, None), getattr(diff_r, k, None))) if diff_results is None: - entry.append('') - elif percent: - entry.append(' (%s)' % ', '.join( - '+∞%' if t == +m.inf - else '-∞%' if t == -m.inf - else '%+.1f%%' % (100*t) - for t in ratios)) + notes = [] + for k in fields: + try: + notes.extend(getattr(r, k).notes()) + except AttributeError: + pass + entry.append(' (%s)' % ', '.join(notes) + if notes else '') else: + ratios = [ + types[k].ratio( + getattr(r, k, None), + getattr(diff_r, k, None)) + for k in fields] entry.append(' (%s)' % ', '.join( '+∞%' if t == +m.inf else '-∞%' if t == -m.inf else '%+.1f%%' % (100*t) for t in ratios) - if any(ratios) else '') + if percent or any(ratios) else '') return entry # entries @@ -552,34 +550,26 @@ def table(Result, results, diff_results=None, *, r = table.get(name) if diff_results is None: diff_r = None - ratios = None else: diff_r = diff_table.get(name) - ratios = [ - types[k].ratio( - getattr(r, k, None), - getattr(diff_r, k, None)) - for k in fields] - if not all_ and not any(ratios): + if not all_ and not any( + types[k].ratio( + getattr(r, k, None), + getattr(diff_r, k, None)) + for k in fields): continue - lines.append(table_entry(name, r, diff_r, ratios)) + lines.append(table_entry(name, r, diff_r)) # total r = next(iter(fold(Result, results, by=[])), None) if diff_results is None: diff_r = None - ratios = None else: diff_r = next(iter(fold(Result, diff_results, by=[])), None) - ratios = [ - types[k].ratio( - getattr(r, k, None), - getattr(diff_r, k, None)) - for k in fields] - lines.append(table_entry('TOTAL', r, diff_r, ratios)) + lines.append(table_entry('TOTAL', r, diff_r)) - # find the best widths, note that column 0 contains the names and column -1 - # the ratios, so those are handled a bit differently + # find the best widths, note that column 0 contains the names and + # column -1 the ratios/notes, so those are handled a bit differently widths = [ ((max(it.chain([w], (len(l[i]) for l in lines)))+1+4-1)//4)*4-1 for w, i in zip(