69 lines
3.6 KiB
Python
69 lines
3.6 KiB
Python
"""Ordered numerical gates before any full CAL; never tune from outcomes."""
|
|
import argparse
|
|
import json
|
|
from pathlib import Path
|
|
import subprocess
|
|
import time
|
|
import traceback
|
|
from context import ROOT,MODEL,EXP,CFG,check,save,budget
|
|
|
|
SCIENCE=ROOT/'models/male-cns-lif/.venv/bin/python'
|
|
ORACLE=ROOT/'experiments/phase4ad-author-semantics/environment/.venv/bin/python'
|
|
|
|
|
|
def child(backend,name,repeat=0):
|
|
log=EXP/'logs'/f'{backend}-{name}-r{repeat}.log'
|
|
cmd=[str(ORACLE if backend=='oracle' else SCIENCE),'-B',str(MODEL/'run_case.py'),backend,name,'--repeat',str(repeat)]
|
|
print('START',backend,name,repeat,flush=True);t0=time.perf_counter()
|
|
with log.open('x',encoding='utf-8') as f:
|
|
result=subprocess.run(cmd,stdout=f,stderr=subprocess.STDOUT,timeout=1800,check=False)
|
|
print('FINISH',backend,name,repeat,'exit',result.returncode,'wall',round(time.perf_counter()-t0,2),flush=True)
|
|
if result.returncode:raise RuntimeError(f'{backend} {name} failed; inspect {log}')
|
|
|
|
|
|
def gate_case(name,repeats):
|
|
from compare import compare,compare_gpu_repeats
|
|
child('gpu',name)
|
|
for r in range(1,repeats):child('gpu',name,r)
|
|
child('oracle',name)
|
|
result=compare(EXP/'cases'/name,EXP/'gpu'/(name+'-r0'),EXP/'oracle'/name,EXP/'audit'/('compare-'+name+'.json'))
|
|
assert result['pass_all'],f'Closed-loop exact comparison failed: {name}; no later CAL permitted'
|
|
for r in range(1,repeats):
|
|
report=compare_gpu_repeats(EXP/'gpu'/(name+'-r0'),EXP/'gpu'/f'{name}-r{r}',EXP/'audit'/f'repeat-{name}-r{r}.json')
|
|
assert report['pass_all'],f'Exact GPU repeat failed: {name}'
|
|
child('component',name)
|
|
return dict(case=name,pass_all=True,gpu_repeats=repeats)
|
|
|
|
|
|
def main():
|
|
parser=argparse.ArgumentParser();parser.add_argument('stage',choices=['fixtures','probes','calibration']);args=parser.parse_args()
|
|
check();budget();receipt=EXP/'audit'/(args.stage+'-gate.json');assert not receipt.exists()
|
|
try:
|
|
if args.stage=='fixtures':
|
|
rows=[gate_case(n,CFG['fixture_repeats']) for n in CFG['fixtures']]
|
|
save(receipt,dict(pass_all=True,cases=rows,scope='Fixed real-edge induced fixtures only'))
|
|
elif args.stage=='probes':
|
|
assert json.loads((EXP/'audit/fixtures-gate.json').read_text())['pass_all']
|
|
rows=[gate_case(n,1) for n in CFG['calibration']['full_oracle_probes']]
|
|
save(receipt,dict(pass_all=True,cases=rows,scope='Only two original first-CAL fixed fullgraph trajectories'))
|
|
else:
|
|
assert json.loads((EXP/'audit/fixtures-gate.json').read_text())['pass_all']
|
|
assert json.loads((EXP/'audit/probes-gate.json').read_text())['pass_all']
|
|
records=json.loads((EXP/'protocol/calibration-cases.json').read_text());assert len(records)==60
|
|
probes=CFG['calibration']['full_oracle_probes']
|
|
for rec in records:
|
|
if rec['name'] not in probes:child('gpu',rec['name'])
|
|
if rec['seed']==CFG['calibration']['seeds'][0]:child('gpu',rec['name'],1)
|
|
from calibration import summarize
|
|
result=summarize()
|
|
save(receipt,dict(pass_all=result['pass_all'],scope='Complete original six-CAL representation gate, not heldout or learning',summary='calibration/summary.json'))
|
|
if not result['pass_all']:raise SystemExit(2)
|
|
except Exception as e:
|
|
save(EXP/'audit'/('stopped-'+args.stage+'.json'),dict(stage=args.stage,type=type(e).__name__,message=str(e),traceback=traceback.format_exc(),
|
|
later_stages_not_permitted=True,partial_outputs_preserved=True,parameters_changed=False))
|
|
raise
|
|
budget()
|
|
|
|
|
|
if __name__=='__main__':main()
|