from pathlib import Path
import json,numpy as np,pandas as pd,hashlib
p=pd.read_csv('data/analysis_panel.csv').dropna(subset=['y_opioid_rate','law_direct','synthetic_dominant'])
a=p.law_direct.to_numpy(float);b=p.synthetic_dominant.to_numpy(float)
X=np.column_stack([np.ones(len(p)),a,b,a*b,pd.get_dummies(p.state,drop_first=True).to_numpy(float),pd.get_dummies(p.year,drop_first=True).to_numpy(float)])
y=p.y_opioid_rate.to_numpy(float);inv=np.linalg.pinv(X.T@X);coef=inv@X.T@y;res=y-X@coef
meat=np.zeros((X.shape[1],X.shape[1]));G=p.state.nunique();n,k=X.shape
for s in p.state.unique():
 z=p.state.to_numpy()==s;v=X[z].T@res[z];meat+=np.outer(v,v)
cov=inv@meat@inv*(G/(G-1))*((n-1)/(n-k))
r={'independent_beta1':float(coef[1]),'independent_beta2':float(coef[3]),'independent_se1':float(np.sqrt(cov[1,1])),'design_rank':int(np.linalg.matrix_rank(X)),'columns':k,'treated_states':int(p.loc[p.law_direct==1,'state'].nunique()),'cells':p.groupby(['law_direct','synthetic_dominant']).size().to_dict().__str__(),'duplicate_state_years':int(p.duplicated(['state','year']).sum())}
source=json.load(open('data/SOURCES.json'));r['source_hash_matches']={f:hashlib.sha256(Path('data',f).read_bytes()).hexdigest()==v['sha256'].removeprefix('sha256:') for f,v in source['files'].items() if f!='SOURCES.json'}
Path('results').mkdir(exist_ok=True);Path('results/review_check.json').write_text(json.dumps(r,indent=2));print(json.dumps(r))
