import hashlib import json from pathlib import Path MODEL=Path(__file__).resolve().parent CFG=json.loads((MODEL/'config.json').read_text(encoding='utf-8')) ROOT=Path(CFG['root']);EXP=ROOT/CFG['experiment'];AC=ROOT/CFG['prior_experiment'] def digest(path): h=hashlib.sha256() with Path(path).open('rb') as f: for b in iter(lambda:f.read(8<<20),b''):h.update(b) return h.hexdigest() def save(path,value): path=Path(path);path.parent.mkdir(parents=True,exist_ok=True) with path.open('x',encoding='utf-8') as f:json.dump(value,f,indent=2,ensure_ascii=False,allow_nan=False);f.write('\n') def source_hashes(): return {p.name:digest(p) for p in sorted(MODEL.iterdir()) if p.is_file() and p.name not in ('manifest.json','checksums.sha256')} def check_prereg(): pre=json.loads((EXP/'protocol/preregistered.json').read_text()) assert pre['source_hashes']==source_hashes(),'Source changed after preregistration' for r in pre['input_hashes']: assert digest(ROOT/r['path'])==r['sha256'],r['path'] return pre