"""Rebuild saved statistics and check every terminal mark against the fold.""" from pathlib import Path import csv,json,sys import numpy as np from fold_model import Parameters from simulate_fold import summarize from path_data import read_paths ROOT=Path(__file__).resolve().parents[1] rows=list(csv.DictReader((ROOT/'data/simulation_summary.csv').open())) count=0;max_summary_error=0.;max_width=0. for row in rows: stem=ROOT/'data'/row['name'];meta=json.loads(stem.with_suffix('.json').read_text()) par=Parameters(**meta['parameters']) paths=read_paths(stem.with_suffix('.csv')) n=meta['n'];assert len(paths['cause'])==n assert np.all(np.isin(paths['cause'],[0,1,2])) assert np.all(np.isfinite(paths['time_lower'])) assert np.all(paths['time_upper']>=paths['time_lower']) assert np.all(paths['time_upper']<=meta['horizon']+1e-12) assert np.all(paths['pre_h']>0) summary=summarize(paths) for cause in ['contact','jump','survival']: for key in ['count','estimate','standard_error']: error=abs(summary[cause][key]-float(row[cause+'_'+key])) assert error<1e-14;max_summary_error=max(max_summary_error,error) assert sum(summary[c]['count'] for c in ['contact','jump','survival'])==n j=paths['cause']==1;_,_,a=par.coefficients(paths['final_v'][j]) assert np.all(paths['pre_h'][j]-par.kappa*(a*paths['terminal_mark'][j])**2<=1e-12) assert np.all(np.abs(paths['terminal_mark'][j])>=meta['cutoff']) assert np.array_equal(paths['time_lower'][j],paths['time_upper'][j]) assert summary['max_contact_interval']<=meta['max_step']+1e-12 max_width=max(max_width,summary['max_contact_interval']);count+=n report=dict(configurations=len(rows),path_records=count, maximum_summary_reconstruction_error=max_summary_error, maximum_recorded_contact_interval=max_width, checks='Cause accounting, stored mean/SE, every terminal geometry, mark cutoff, time conventions.') print(json.dumps(report,indent=2))