"""Compute the learnability ratio R for a config on the local bank. Usage: python compute_R.py [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}")