#!/usr/bin/env python3
"""Predeclared same-cohort predictor-block ablations, separate from parking search."""
import importlib.util,pathlib,json,gzip,sys
ROOT=pathlib.Path(__file__).resolve().parents[1];OUT=ROOT/'public/research/parking/v4'
spec=importlib.util.spec_from_file_location('parking4',ROOT/'scripts/model-parking-phase4.py');m=importlib.util.module_from_spec(spec);spec.loader.exec_module(m)
BLOCKS={'rurality-density':['urbanShare','logDensity','densitySquared'],'road-traffic':['trunkShare','carShare','hgvShare','vanShare','logFlow'],'housing-ownership':['detached','terraced','flats','noCars','twoPlusCars'],'social':['income','noQualifications'],'age':['ageYoung','ageOld']}
if sys.argv[1]=='prepare':
 assert not (OUT/'control-design.json').exists()
 m.dump('control-design.json',dict(blocks=BLOCKS,designSha256=m.sha(OUT/'design.json'),scriptSha256=m.sha(pathlib.Path(__file__)),method='Compare the full expanded baseline without parking with the same model minus each named block. Positive gain means the block improves leave-region-out Poisson deviance, conditional on the remaining blocks. These are exploratory tests with correlated predictors, not individual causal effects. Network addition uses a 2026 snapshot. No best block or parking scenario selected.'))
else:
 d=m.read(OUT/'control-design.json');assert d['scriptSha256']==m.sha(pathlib.Path(__file__));assert d['designSha256']==m.sha(OUT/'design.json');f=m.read(OUT/'design.json');rows=f['rows'];eng=m.Engine(rows);results=[];fits=[]
 for endpoint in m.ENDPOINTS:
  full=eng.model(m.EXPANDED,endpoint)
  for block,columns in BLOCKS.items():
   reduced=eng.model([k for k in m.EXPANDED if k not in columns],endpoint);results.append(dict(endpoint=endpoint,block=block,columns=columns,spatial=m.comparison(rows,reduced['oof'],full['oof'],endpoint)))
   fits.append(dict(endpoint=endpoint,block=block,coefficients=reduced['theta'].tolist(),transform=reduced['meta'],diagnostic=reduced['diagnostic'],foldDiagnostics=reduced['foldDiagnostics']))
  network=eng.model(m.EXPANDED+['logJunctionDensity'],endpoint);results.append(dict(endpoint=endpoint,block='junction-density',columns=['logJunctionDensity'],spatial=m.comparison(rows,full['oof'],network['oof'],endpoint)))
  fits.append(dict(endpoint=endpoint,block='junction-density',coefficients=network['theta'].tolist(),transform=network['meta'],diagnostic=network['diagnostic'],foldDiagnostics=network['foldDiagnostics']))
  print('control blocks fitted',endpoint,flush=True)
 m.dump('control-tests.json',dict(method=d['method'],results=results,authorities=len(f['cohort']),designSha256=m.sha(OUT/'control-design.json')))
 (OUT/'control-fits.json.gz').write_bytes(gzip.compress(json.dumps(fits,separators=(',',':')).encode(),mtime=0));(OUT/'parking-phase4-control-tests.py').write_bytes(pathlib.Path(__file__).read_bytes())
