"""Retally submitted Monte Carlo output; does not rerun the submitted pipeline."""
import collections,csv,json,math,pathlib,sys
r=pathlib.Path(sys.argv[1]);o=pathlib.Path(sys.argv[2])
a=json.loads((r/'results/R1.json').read_text());b=json.loads((r/'results/R2.json').read_text())
groups=collections.defaultdict(list)
with (r/'results/null_draws.csv').open() as f:
 for x in csv.DictReader(f):groups[x['noise_model'],x['dataset']].append(x)
def wilson(k,n):
 z=1.959963984540054;p=k/n;den=1+z*z/n;mid=(p+z*z/(2*n))/den;half=z*math.sqrt(p*(1-p)/n+z*z/(4*n*n))/den
 return [max(0,mid-half),min(1,mid+half)]
out={'scope':'Consistency of declared draws and summaries only, not reproduction.','groups':[],'comparisons':0,'mismatches':[]}
for (model,ds),xs in sorted(groups.items()):
 n=len(xs);obs=a[ds]['adjusted'];decl=b['noise_models'][model][ds]
 kT=sum(float(x['tmax'])>=obs['tmax'] for x in xs)
 kM=sum(abs(float(x['zq_monthly']))>=abs(obs['zq_monthly']) for x in xs)
 kA=sum(abs(float(x['zq_annual']))>=abs(obs['zq_annual']) for x in xs)
 calcs={'p_tmax':(kT+1)/(n+1),'p_quad_monthly':(kM+1)/(n+1),'p_quad_annual':(kA+1)/(n+1),'size_tmax_005':sum(float(x['p_nominal'])<.05 for x in xs)/n,'size_tmax_001':sum(float(x['p_nominal'])<.01 for x in xs)/n,'size_quad_monthly_005':sum(math.erfc(abs(float(x['zq_monthly']))/math.sqrt(2))<.05 for x in xs)/n,'size_quad_annual_005':sum(math.erfc(abs(float(x['zq_annual']))/math.sqrt(2))<.05 for x in xs)/n}
 for k,v in calcs.items():
  out['comparisons']+=1
  if abs(v-decl[k])>1e-5:out['mismatches'].append({'noise':model,'dataset':ds,'field':k,'retallied':v,'declared':decl[k]})
 out['groups'].append({'noise':model,'dataset':ds,'n':n,'tail_counts':{'tmax':kT,'quadratic_monthly':kM,'quadratic_annual':kA},'wilson95_tail_probability':{'tmax':wilson(kT,n),'quadratic_monthly':wilson(kM,n),'quadratic_annual':wilson(kA,n)},'retallied':calcs})
q=json.loads((r/'results/qtable.json').read_text());out['qtable_rows']=len(q['phi']);out['qtable_quantiles_ordered']=all(x<y for x,y in zip(q['q95'],q['q99']));out['all_groups_2000']=all(len(v)==2000 for v in groups.values())
o.write_text(json.dumps(out,indent=2)+'\n')
print(json.dumps({'comparisons':out['comparisons'],'mismatches':out['mismatches'],'all_groups_2000':out['all_groups_2000'],'qtable_rows':out['qtable_rows']}))
