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(