"""Recalculate published aggregate values; not a replication of the experiments.
Sources: https://doi.org/10.1073/pnas.2422633122 Table 1
         https://doi.org/10.1038/s41598-025-97652-6 Results
Python standard library only. Run: python3 recalculate.py
Writes recalculation.csv and results.json next to this file.
"""
from decimal import Decimal as D, ROUND_HALF_UP
import csv
import json
from pathlib import Path

def rounded(value):
    return str(value.quantize(D('0.1'), rounding=ROUND_HALF_UP))

rows=[]
for tool,phase,coefficient,control_mean,expected in [
    ('GPT Base','assisted_practice','0.137','0.284','48.2'),
    ('GPT Tutor','assisted_practice','0.361','0.284','127.1'),
    ('GPT Base','unassisted_exam','-0.054','0.321','-16.8'),
    ('GPT Tutor','unassisted_exam','-0.004','0.321','-1.2'),
]:
    absolute=D(coefficient)*100
    relative=D(coefficient)/D(control_mean)*100
    assert rounded(relative)==expected
    rows.append(dict(tool=tool,phase=phase,adjusted_coefficient=coefficient,
      control_mean=control_mean,points_on_100_scale=rounded(absolute),
      relative_change_percent=rounded(relative),source='10.1073/pnas.2422633122 Table 1'))
# Differences of marginal medians, not medians of individual gains.
median_ai,median_class,median_pre=map(D,['4.5','3.5','2.75'])
gain_ratio=(median_ai-median_pre)/(median_class-median_pre)
score_ratio=median_ai/median_class
assert gain_ratio.quantize(D('0.01'))==D('2.33')
assert score_ratio.quantize(D('0.01'))==D('1.29')
result=dict(verified_date='2026-09-21',scope='Arithmetic on published rounded aggregate values; no individual-data analysis or new AI experiment.',
    pnas=rows,physics=dict(source='10.1038/s41598-025-97652-6 Results',
    ai_post_median=str(median_ai),class_post_median=str(median_class),pooled_pre_median=str(median_pre),
    ratio_of_median_differences=str(gain_ratio.quantize(D('0.01'))),
    ratio_of_post_medians=str(score_ratio.quantize(D('0.01')))))
folder=Path(__file__).resolve().parent
with (folder/'recalculation.csv').open('w',newline='',encoding='utf-8-sig') as f:
    w=csv.DictWriter(f,fieldnames=list(rows[0]));w.writeheader();w.writerows(rows)
(folder/'results.json').write_text(json.dumps(result,ensure_ascii=False,indent=2)+'\n',encoding='utf-8')
print('Verified 4 relative changes and 2 median ratios.')
