#!/usr/bin/env python3
"""Recompute published summaries from anonymous counts. Standard library only."""
import collections as c, json, statistics as st
from pathlib import Path
j=json.loads(Path('public/data/research-counts-v1.json').read_text())
pairs=c.defaultdict(list);repeat=c.defaultdict(list);holds=c.defaultdict(list)
for r in j['overlap']:pairs[(r['a'],r['b'])].append(r['intersection']/r['union'])
for r in j['repeat']:repeat[r['engine']].append(r['intersection']/r['union'])
for r in j['transitions']:holds[r['engine']].append(r)
pair_rows=[dict(a=a,b=b,mean_jaccard=st.mean(v),lanes=len(v)) for (a,b),v in sorted(pairs.items()) if len(v)>=12]
result=dict(schema_version=1,exported=j['exported'],runs=j['runs'],lanes=j['lanes'],pair_means=pair_rows,unweighted_mean_of_pairs=st.mean(r['mean_jaccard'] for r in pair_rows),weighted_mean_of_pairs=sum(r['mean_jaccard']*r['lanes'] for r in pair_rows)/sum(r['lanes'] for r in pair_rows),repeat_jaccard=[dict(engine=e,mean_jaccard=st.mean(v),pairs=len(v)) for e,v in sorted(repeat.items()) if len(v)>=20],durability=[])
for e,rows in sorted(holds.items()):
 total=sum(r['first_total'] for r in rows)
 if total<8:continue
 result['durability'].append(dict(engine=e,first_held=sum(r['first_held'] for r in rows),first_total=total,presence_held=sum(r['presence_held'] for r in rows),presence_total=sum(r['presence_total'] for r in rows),date_pairs=len(rows),gap_min=min(r['gap_days'] for r in rows),gap_median=st.median(r['gap_days'] for r in rows),gap_max=max(r['gap_days'] for r in rows)))
Path('public/data/research-summary-v1.json').write_text(json.dumps(result,indent=2)+'\n')
print(json.dumps(result,indent=2))
offsite=json.loads(Path('public/data/offsite-counts-v1.json').read_text())
shares={k:dict(runs=v['runs'],citing_runs=v['citing_runs'],share_of_citing_runs={c:round(100*n/v['citing_runs'],1) for c,n in v['classes'].items()}) for k,v in sorted(offsite['industries'].items())}
Path('public/data/offsite-summary-v1.json').write_text(json.dumps(shares,indent=2)+'\n')
