from pathlib import Path import numpy as np,json R=Path.home()/'run/pets-knp';a=np.load(R/'training-counts.npz');y=np.tile(np.load(R/'data/train.npz')['labels'],2);yv=np.load(R/'data/val.npz')['labels'];rows=[];best=None for mode in ['counts','sqrt','root_l2']: def enc(x): if mode=='counts':return x q=np.sqrt(x.astype(np.float64)) if mode=='sqrt':q*=24 else:q*=2048/np.maximum(np.sqrt((q*q).sum(1,keepdims=True)),1) return np.clip(np.rint(q),0,640).astype(np.int32) xt=enc(a['train']);xv=enc(a['validation']);mu=xt.mean(0);sd=xt.std(0)+1e-3;z=(xt-mu)/sd;A=z.T@z;v=z.T@(y*2.-1) for lam in (10,100,1000,10000): sol=np.linalg.solve(A+lam*np.eye(800),v);w=sol/sd;b=(y*2.-1).mean()-mu@w for limit in (31,): scale=limit/abs(w).max();wq=np.rint(w*scale).astype(np.int32);bq=int(round(b*scale));margin=xv.astype(np.int64)@wq+bq row={'encoding':mode,'lambda':lam,'weight_limit':limit,'validation_accuracy':float(((margin>0)==yv).mean()),'float_validation':float(((xv@w+b>0)==yv).mean()),'ties':int((margin==0).sum())};rows.append(row);print(row,flush=True) if best is None or row['validation_accuracy']>best[0]:best=(row['validation_accuracy'],dict(row),wq,bq) _,row,w,b=best;M=R/'readout-v3';M.mkdir(exist_ok=False);w.tofile(M/'weights.bin');np.array([b],np.int32).tofile(M/'bias.bin');row['candidates']=rows;(M/'selection.json').write_text(json.dumps(row,indent=2));print('BEST',row,flush=True)