| """Compute the learnability ratio R for a config on the local bank. |
| Usage: python compute_R.py <static|moving> <size_px> [contrast]""" |
| import sys, numpy as np, cv2 |
| mode,size=sys.argv[1],int(sys.argv[2]); ct=float(sys.argv[3]) if len(sys.argv)>3 else 1.0 |
| B=np.load("simreal/frames64.npy").astype(np.float32)/255.0 |
| rng=np.random.default_rng(0) |
| def pool(img): return cv2.resize(img,(8,8),interpolation=cv2.INTER_AREA).ravel() |
| def draw(img,pos,c): |
| img=img.copy();x,y=pos |
| img[y:y+size,x:x+size]=c*ct+img[y:y+size,x:x+size].mean(axis=(0,1))*(1-ct); return img |
| sig=[];den=[] |
| for _ in range(80): |
| if mode=="static": frames=[B[rng.integers(len(B))]]*9 |
| else: frames=[B[rng.integers(len(B))] for _ in range(9)] |
| pos=(int(rng.integers(2,60-size)),int(rng.integers(2,60-size))) |
| c=rng.uniform(0.15,0.95,3).astype(np.float32) |
| sig.append(np.sum((pool(draw(frames[0],pos,c))-pool(draw(frames[0],pos,1-c)))**2)/4) |
| P=np.array([pool(f) for f in frames]) |
| probes=[pool(np.roll(np.roll(frames[0],int(rng.integers(64)),0),int(rng.integers(64)),1)) for _ in range(6)] |
| den.append(P.var(axis=0).sum()+np.array(probes).var(axis=0).sum()) |
| print(f"R({mode},{size}px,ct={ct}) = {np.mean(sig)/(np.mean(den)+1e-9):.4f}") |
|
|