File size: 1,226 Bytes
021d920
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
"""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}")