#!/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])