"""Export paper tables from preserved numerical results; no new simulations.""" import csv import hashlib import json from pathlib import Path ROOT = Path(__file__).resolve().parent OUT = ROOT.parent / 'figures' HERE = ROOT / 'exports' HERE.mkdir(exist_ok=True) sources = {} def read(rel): p = ROOT / rel sources[rel] = hashlib.sha256(p.read_bytes()).hexdigest() return json.loads(p.read_text()) def write(name, columns, rows): for base in [HERE, OUT]: with (base / name).open('w', newline='') as f: w = csv.writer(f) w.writerow(columns) w.writerows(rows) d = read('numerics/E01_gaussian_intensity/results.json') write('gaussian_mesh.csv', ['h', 'quadrature', 'mc', 'se', 'twose', 'rice'], [[r['mesh'], r['crossing_probability_divided_by_mesh'], r['conditional_monte_carlo_mean'], r['standard_error'], 2*r['standard_error'], d['rice_constant']] for r in d['rows']]) d = read('numerics/E681_actual_quadratic/plot_data.json') p = d['panels'][0] assert p['delta'] == .5 write('quadratic_cdf.csv', ['x', 'positive', 'negative', 'random', 'se'], [[x, p['cdf']['D > 0'][j], p['cdf']['D < 0'][j], p['cdf']['Random finite P'][j], (p['cdf']['Random finite P'][j]*(1-p['cdf']['Random finite P'][j])/d['random_n'])**.5] for j, x in enumerate(p['x'])]) d = read('numerics/E681_actual_quadratic/arithmetic_summary.json') pos = d['root_groups']['X=100000;sign=1'] neg = d['root_groups']['X=100000;sign=-1'] write('quadratic_counts.csv', ['roots', 'positive', 'negative', 'n_positive', 'n_negative'], [[k, pos['counts'].get(str(k), 0)/pos['n'], neg['counts'].get(str(k), 0)/neg['n'], pos['counts'].get(str(k), 0), neg['counts'].get(str(k), 0)] for k in range(3)]) d = read('numerics/E1571_actual_modular_twists/full_D17.json') write('delta_twist17.csv', ['s', 'L', 'Lprime'], [[r['s'], r['L'], r['Lprime']] for r in d['refined_grid']]) d = read('numerics/E1577_eight_point_covariance_and_quantile/results.json') a, b = [r['levels'][-1]['eigenvalues_ascending'] for r in d['matrices']] write('eight_anchor_gram.csv', ['index', 'central', 'bridge'], [[j+1, a[j], b[j]] for j in range(8)]) manifest = {'purpose': 'Pure extraction; original files are not changed.', 'source_sha256': sources, 'output_sha256': {p.name: hashlib.sha256(p.read_bytes()).hexdigest() for p in sorted(HERE.glob('*.csv'))}, 'sampling': 'Only Gaussian Monte Carlo and finite Euler-model CDF have sampling SE; all other data are deterministic or finite censuses.', 'limitations': 'Finite-precision arithmetic and mesh counts are not interval-certified; plots do not validate arithmetic asymptotic constants.'} (HERE/'manifest.json').write_text(json.dumps(manifest, indent=2)+'\n') (OUT/'data_manifest.json').write_text(json.dumps(manifest, indent=2)+'\n') print('Exported five tables from five preserved numerical result files.') # Materialize genuine TeX tables so figures do not depend on ancillary files at build time. TEX_TABLES = ROOT.parent.parent / 'figures' / 'numerical_data.tex' TABLE_MACROS = [('gaussian_mesh.csv', 'BMgaussianmesh'), ('quadratic_cdf.csv', 'BMquadraticcdf'), ('quadratic_counts.csv', 'BMquadraticcounts'), ('delta_twist17.csv', 'BMdeltatwist'), ('eight_anchor_gram.csv', 'BMeightanchorgram')] tex_lines = ['% Generated from the preserved numerical CSV files; do not round values.'] for filename, macro in TABLE_MACROS: tex_lines.append(r'\pgfplotstableread[col sep=comma,row sep=\\]{') tex_lines.extend(line + r'\\' for line in (OUT / filename).read_text().splitlines()) tex_lines.append('}' + chr(92) + macro) tex_lines.append('') TEX_TABLES.write_text('\n'.join(tex_lines) + '\n') print('Exported TeX-native figure tables.')