"""Follow-up prompted by the low within-word collision count; exploratory."""
import json,re
from word_core import *

def edges(source):
    ws=tokenize(source);c=vals(source);within=np.zeros(max(0,len(c)-1),bool)
    for w in ws:
        a=w['rune_offset'];n=len(w['values']);within[a:a+n-1]=True
    return c,within

def row(c,m):
    eq=c[1:]==c[:-1]
    return {'within_word_equal':int(eq[m].sum()),'within_word_pairs':int(m.sum()),'between_word_equal':int(eq[~m].sum()),'between_word_pairs':int((~m).sum())}

if __name__=='__main__':
    sections=[s for s in '%'.join(lp[:56]).split('$') if len(vals(s))]
    out={'reason':'Post-hoc follow-up to low within-word equality; no claim of independent discovery or held-out confirmation.','sections':[],'source_crosschecks':[]}
    rng=np.random.default_rng(3301004)
    for i,s in enumerate(sections):
        c,m=edges(s)
        if len(c)<60:continue
        obs=row(c,m);pieces=s.split('%');lens=[len(vals(p)) for p in pieces];st=np.r_[0,np.cumsum(lens)]
        samples=[]
        for n in range(999):
            q=c.copy()
            for a,b in zip(st,st[1:]):q[a:b]=rng.permutation(q[a:b])
            samples.append(row(q,m))
        item={'section':i,'observed':obs,'null':{}}
        for k in ['within_word_equal','between_word_equal']:
            arr=np.array([r[k] for r in samples]);item['null'][k]={'mean':float(arr.mean()),'minimum':int(arr.min()),'lower_tail_p':(1+int(np.sum(arr<=obs[k])))/1000}
        out['sections'].append(item)
    # Second archive transcription, two independently extracted sections.
    snapshots=json.loads((ROOT/'archive_rune_excerpts.json').read_text())
    for sample in snapshots['samples']:
        start=sample['start'];end=sample['end_exclusive']
        alt=vals(sample['runes_text']);master=vals('%'.join(lp[start:end]))
        out['source_crosschecks'].append({'pages':list(range(start,end)),'archive_runes':len(alt),'master_runes':len(master),'exact_match':np.array_equal(alt,master),'archive_adjacent_equal':int(np.sum(alt[1:]==alt[:-1])),'master_adjacent_equal':int(np.sum(master[1:]==master[:-1]))})
    c=vals('%'.join(lp[:56]));w=tokenize('%'.join(lp[:56]));diff=[]
    for item in w:
        a=np.array(item['values']);diff.extend(((a[1:]-a[:-1])%29).tolist())
    out['within_word_difference_histogram']=np.bincount(diff,minlength=29).tolist()
    out['source_note']='Two archive sources can share ancestry; matching them is not independent image verification or PGP authentication.'
    (ROOT/'adjacency_results.json').write_text(json.dumps(out,indent=2));print(json.dumps(out,indent=2))
