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%)
  ...
This commit is contained in:
Christopher Haster
2024-05-13 14:23:26 -05:00
parent 827dddf62b
commit 03ea2e6ac5
8 changed files with 277 additions and 325 deletions

View File

@@ -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(