OverviewFilesCommitsIssuesDocsReleasesPeers

atomspace-layer-discovery / experiments / jigsaw-transformer / summarize-v3pool.py

30 lines · python ref:
#!/usr/bin/env python3
# Score results-v3pool/<stamp> against PREREG-v3pool.md. Usage: summarize-v3pool.py results-v3pool/<stamp> results-v3diag/<stamp>
import glob, os, sys
def mean(x): return sum(x) / len(x) if x else 0.0
def load(d):
    D = {}
    for f in glob.glob(os.path.join(d, 'seed-*.tsv')):
        for line in open(f):
            p = line.rstrip('\n').split('\t')
            if p[0] == 'D': D[(p[4], int(p[1]))] = p[5:]
    return D
D, O = load(sys.argv[1]), load(sys.argv[2])
seeds = sorted({k[1] for k in D}); out = []
def say(s=''): out.append(s); print(s)
ok = all(D[('GG', s)] == O[('GG', s)] and D[('JG1', s)] == O[('JG', s)] for s in seeds)
say(f'F0: {"PASS" if ok else "FAIL"} — GG and JG1 reproduce results-v3diag GG and JG')
R = {}
say('\ncell  split  precision  recall  base  minor-prec  minor-rec')
for c in ['GG', 'JG1', 'JG6', 'PG1', 'PG6']:
    r = [list(map(float, D[(c, s)])) for s in seeds]
    prec = mean([x[2] / x[1] if x[1] else 0.0 for x in r]); rec = mean([x[2] / x[3] if x[3] else 0.0 for x in r]); base = mean([x[3] / x[0] for x in r])
    R[c] = (prec, rec, base)
    say(f'{c:4s}  {mean([x[1] for x in r]):5.1f}  {prec:9.3f}  {rec:6.3f}  {base:.3f}  {mean([x[4] for x in r if x[6] > 0]):10.3f}  {mean([x[5] for x in r if x[6] > 0]):9.3f}')
say('')
for n, c in [('F1', 'JG6'), ('F2', 'PG6')]:
    say(f'{n}: {"PASS" if R[c][0] >= 2 * R[c][2] else "FAIL"} — {c} split precision {R[c][0]:.3f} (bar {2 * R[c][2]:.3f})')
ok = R['JG6'][0] > R['JG1'][0] and R['PG6'][0] > R['PG1'][0]
say(f'F3: {"PASS" if ok else "FAIL"} — precision JG6 {R["JG6"][0]:.3f} vs JG1 {R["JG1"][0]:.3f}; PG6 {R["PG6"][0]:.3f} vs PG1 {R["PG1"][0]:.3f}')
open(os.path.join(sys.argv[1], 'summary.txt'), 'w').write('\n'.join(out) + '\n')