"""Synthetic aggregate scenarios, not measured model or fab performance."""
import csv,json
from pathlib import Path

def evaluate(row):
 counts={k:int(row[k]) for k in ['events','TP','FP','TN','FN']}
 if any(v<0 for v in counts.values()) or counts['events']<=0:raise ValueError('invalid nonnegative counts or denominator')
 n=counts['events'];tp,fp,tn,fn=[counts[k] for k in ['TP','FP','TN','FN']]
 if tp+fp+tn+fn!=n:raise ValueError('confusion counts must sum to events')
 def ratio(a,b):return a/b if b else None
 prevalence=ratio(tp+fn,n);tpr=ratio(tp,tp+fn);fpr=ratio(fp,fp+tn)
 return {'scenario':row['scenario'],**counts,'prevalence':prevalence,'recall':tpr,'false_positive_rate':fpr,'alerts':tp+fp,'precision':ratio(tp,tp+fp),'false_discovery_fraction':ratio(fp,tp+fp),'accuracy':ratio(tp+tn,n)}

def analyze(path):
 rows=list(csv.DictReader(Path(path).open(newline='',encoding='utf-8')))
 if len({r['scenario'] for r in rows})!=len(rows):raise ValueError('duplicate scenario')
 return {'synthetic':True,'scope':'TWO_SEPARATE_ASSUMED_AGGREGATE_SCENARIOS; no trained model, no event-level labels, no operating threshold selection','scenarios':[evaluate(r) for r in rows]}

if __name__=='__main__':print(json.dumps(analyze(Path(__file__).with_name('scenarios.csv')),ensure_ascii=False,indent=2))
