/machines/1RB0RA_1LC0LD_1LE1LD_0LB0RE_1RF0LA_---0RA/fuzz_shapes.py · raw
#!/usr/bin/env python3
"""Shape fuzz: random configs 0^inf <E 110 W (110)^G 00 (110)^M 0^inf; usage: fuzz_shapes.py real|wild N STEPS SEED.
   real = W built like observed records (opt. 4, (5 2)^k, digits 5 with random gaps); wild = random 2/3/4/5 blocks."""
import sys, random, json
sys.path.insert(0, "[local working file]")
import sim
M=sim.parse('1RB0RA_1LC0LD_1LE1LD_0LB0RE_1RF0LA_---0RA')
mode=sys.argv[1]; NCFG=int(sys.argv[2]); STEPS=int(float(sys.argv[3])); seed=int(sys.argv[4])
random.seed(seed)
B={2:'110',3:'1110',4:'11110',5:'111110',6:'1111110'}
def realistic():
    w=[]
    if random.random()<0.5: w.append(4)
    k=random.randint(0,6)
    for i in range(k): w+= [5,2]
    nd=random.randint(0,4)
    for i in range(nd):
        w+= [2]*random.randint(1,30) + [5]
    return w
def wild():
    w=[]
    for i in range(random.randint(0,25)):
        r=random.random()
        w.append(2 if r<0.55 else 5 if r<0.8 else 4 if r<0.93 else 3)
    return w
res={'halt':0,'ok':0}; halts=[]
for i in range(NCFG):
    w = realistic() if mode=='real' else wild()
    G=random.randint(1,300); Mk=random.randint(0,300)
    txt='0^inf <E 110 '+' '.join(B[x] for x in w)+' (110)^%d 00 (110)^%d 0^inf'%(G,Mk)
    cfg=sim.Config.parse(txt)
    r=sim.run(M, cfg, STEPS, final=False)
    if r.halted:
        res['halt']+=1; halts.append((txt, r.step))
    else: res['ok']+=1
print(json.dumps(res))
for h in halts[:15]: print('HALT', h[1], h[0][:200])