"""Independently aggregate saved simulations; allow one-draw boundary effects from six-digit output."""
import csv,json,math,sys
from collections import defaultdict
from pathlib import Path
p=Path(sys.argv[1]);r1=json.loads((p/'R1.json').read_text());r2=json.loads((p/'R2.json').read_text())
groups=defaultdict(list)
for row in csv.DictReader((p/'null_draws.csv').open()):groups[row['noise_model'],row['dataset']].append(row)
output=[]
for (model,dataset),rows in sorted(groups.items()):
 n=len(rows);assert n==2000
 obs=r1[dataset]['adjusted'];decl=r2['noise_models'][model][dataset]
 rates={
 'size_tmax_005':sum(float(r['p_nominal'])<.05 for r in rows)/n,
 'size_tmax_001':sum(float(r['p_nominal'])<.01 for r in rows)/n,
 'p_tmax':(1+sum(float(r['tmax'])>=obs['tmax'] for r in rows))/(n+1),
 'p_quad_monthly':(1+sum(abs(float(r['zq_monthly']))>=abs(obs['zq_monthly']) for r in rows))/(n+1),
 'p_quad_annual':(1+sum(abs(float(r['zq_annual']))>=abs(obs['zq_annual']) for r in rows))/(n+1),
 'size_quad_monthly_005':sum(math.erfc(abs(float(r['zq_monthly']))/math.sqrt(2))<.05 for r in rows)/n,
 'size_quad_annual_005':sum(math.erfc(abs(float(r['zq_annual']))/math.sqrt(2))<.05 for r in rows)/n,
 }
 diff={k:abs(v-decl[k]) for k,v in rates.items()}
 assert max(diff.values())<=1/n+1e-6,(model,dataset,diff)
 output.append({'model':model,'dataset':dataset,'draws':n,'reaggregated':rates,'max_absolute_difference':max(diff.values())})
assert len(groups)==15
print(json.dumps({'checked_draws':sum(len(v) for v in groups.values()),'groups':output},indent=2))
