"""Saved-data scientific analysis; no model invocation or fitting.""" import csv,json from pathlib import Path import numpy as np import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt from .core import concentration def stats(x): x=np.asarray(x,dtype=np.float64);valid=x[np.isfinite(x)] if not valid.size:return {'count':0,'p10':None,'median':None,'p90':None,'mean':None} q=np.quantile(valid,[.1,.5,.9]);return {'count':int(valid.size),'p10':float(q[0]),'median':float(q[1]),'p90':float(q[2]),'mean':float(valid.mean())} def csvwrite(p,rows): with p.open('w') as f: w=csv.DictWriter(f,fieldnames=list(rows[0]));w.writeheader();w.writerows(rows) def main(root): root=Path(root);figdir=root/'figures';figdir.mkdir(exist_ok=True);status=json.loads((root/'status.json').read_text());assert status['state']=='completed' rows=[];joint_rows=[];pool={};curves={};joint_pool={};obs={};winner=[];joint_by_layer={} for entry in status['completed_links']: sample=entry['sample'];source=entry['source'];data=dict(np.load(root/'raw'/f'{sample}-link-{source:02d}.npz')) if 'single_JS' in data: data['single_sqrtJS']=np.sqrt(data['single_JS']) for label in ('weak_half','strong_half','random_half','all_heads'): data['joint_'+label+'_sqrtJS']=np.sqrt(data['joint_'+label+'_JS']) masks=data.get('mask_'+label,np.ones_like(data['mask_weak_half'])) data['individual_sum_'+label+'_sqrtJS']=np.sum(data['single_sqrtJS'].transpose(2,1,0)*masks,-1).T for key in ('Q','K','V','QKV','JS','sqrtJS'): if 'single_'+key not in data:continue d=data['single_'+key][:,7:,:].transpose(1,2,0);c=concentration(d);valid=c['valid'];h=d.shape[-1] metric={k:v.reshape(-1) for k,v in c.items() if k!='valid'} row={'sample':sample,'source':source,'recipient':source+1,'metric':key,'source_heads':h,'recipient_attention_type':'full_attention' if entry['full_attention_recipient'] else 'linear_attention','observations':d.shape[0]*d.shape[1],'undefined_zero_total':int((~valid).sum())} for k,v in metric.items(): pool.setdefault(key,{}).setdefault(k,[]).extend(v) for s,z in stats(v).items():row[k+'_'+s]=z rows.append(row) # Raw per-observation statistics for independently reproducing figures. for k,v in metric.items():obs.setdefault(key+'_'+k,[]).append(v.astype(np.float32)) n=d.shape[0]*d.shape[1] for k,v in [('source',np.full(n,source)),('sample_index',np.full(n,sorted({e['sample'] for e in status['completed_links']}).index(sample))),('token',np.repeat(np.arange(7,32),d.shape[1])),('recipient_head',np.tile(np.arange(d.shape[1]),25))]:obs.setdefault(key+'_'+k,[]).append(v.astype(np.int16)) p=np.divide(d,d.sum(-1,keepdims=True),out=np.zeros_like(d),where=d.sum(-1,keepdims=True)>0);cum=np.concatenate([np.zeros((*d.shape[:2],1)),np.cumsum(np.sort(p,-1)[...,::-1],-1)],-1) grid=np.linspace(0,1,101);cc=np.array([np.interp(grid,np.linspace(0,1,h+1),v) for v in cum[valid]]) curves.setdefault(key,[]).extend(cc) win=np.argmax(d,-1);counts=np.bincount(win[valid],minlength=h) winner.append({'sample':sample,'source':source,'metric':key,'most_frequent_winner_fraction':float(counts.max()/max(counts.sum(),1)),'distinct_winning_heads':int((counts>0).sum()),'head_counts':json.dumps(counts.tolist())}) for label in ('weak_half','strong_half','random_half','all_heads'): values=data['joint_'+label+'_'+key][7:];summed=data['individual_sum_'+label+'_'+key][7:] jr={'sample':sample,'source':source,'recipient':source+1,'metric':key,'removed':label} for k,x in [('joint_effect',values),('sum_individual',summed)]: for s,z in stats(x).items():jr[k+'_'+s]=z joint_rows.append(jr);joint_pool.setdefault(key,{}).setdefault(label,[]).extend(values.ravel());joint_by_layer.setdefault((key,label,source),[]).extend(values.ravel()) csvwrite(root/'concentration-by-link.csv',rows);csvwrite(root/'joint-by-link.csv',joint_rows);csvwrite(root/'winner-identities.csv',winner) np.savez_compressed(root/'observations.npz',**{k:np.concatenate(v) for k,v in obs.items()}) pooled={k:{m:stats(v) for m,v in metrics.items()} for k,metrics in pool.items()};joint_stats={k:{m:stats(v) for m,v in metrics.items()} for k,metrics in joint_pool.items()} paired={} for key,labels in joint_pool.items(): weak=np.asarray(labels['weak_half']);strong=np.asarray(labels['strong_half']);random=np.asarray(labels['random_half']);valid=weak>0 paired[key]={'weak_less_than_strong_fraction':float(np.mean(weak