code wiki / _hdl_build / nx_nofloat_k3interleave_gate.nx

nx_nofloat_k3interleave_gate.nx source

↩ module page · 123 lines · 5607 B

1// nx_nofloat_k3interleave_gate.nx -- gate: the 3:1 KDA:MLA interleaved K3 block structure, assembled from the 2// proven KDA + MLA organs, deterministic at depth. 3// T1 the 4-layer interleave [KDA,KDA,KDA,MLA] runs end-to-end + transforms the input 4// T2 BOTH attention types are LIVE: perturbing ONLY an MLA weight changes the output, AND perturbing ONLY a 5// KDA weight changes the output (neither path is dead / optimized away) 6// T3 DEPTH-STABLE: output bounded through the interleaved stack (RMSNorm holds) 7// T4 DETERMINISTIC bit-identical at depth (float interleaved stacks drift + compound) 8// T5 the schedule is mechanically 3:1: layer_type over 8 layers == [0,0,0,1,0,0,0,1] (6 KDA : 2 MLA) 9// license_tier: ORIGINAL No hw writes (Rule 26). expect_exit: 0 10import "nx_nofloat_k3interleave.nx" 11import "nx_gate_verdict.nx" 12import "nx_syscalls.nx" 13 14const IG_T: i64 = 4 15const IG_D: i64 = 4 16const IG_DFF: i64 = 8 17const IG_NH: i64 = 2 18const IG_HD: i64 = 2 19const IG_LC: i64 = 2 20const IG_L: i64 = 4 21const IG_Q: i64 = 65536 22const IG_SCALE: i64 = 46341 // 1/sqrt(hd=2) in Q16 23 24func ig_fill(m: *i64, n: i64, seed: i64) -> i64 { 25 var i: i64 = 0 26 while i < n { m[i] = (((i + seed) % 5) + 1) * (IG_Q / 10); i = i + 1 } 27 return 0 28} 29 30func main() -> i64 { 31 let ctr: *i64 = gv_ctr() 32 gv_head("nx_nofloat_k3interleave gate -- 3:1 KDA:MLA K3 block, assembled from proven organs, deterministic" as *u8) 33 let t: i64 = IG_T 34 let d: i64 = IG_D 35 let dff: i64 = IG_DFF 36 let x: *i64 = sys_mmap(64*8) as *i64 37 let wq: *i64 = sys_mmap(64*8) as *i64 38 let wk: *i64 = sys_mmap(64*8) as *i64 39 let wv: *i64 = sys_mmap(64*8) as *i64 40 let wo: *i64 = sys_mmap(64*8) as *i64 41 let w1: *i64 = sys_mmap(64*8) as *i64 42 let w2: *i64 = sys_mmap(64*8) as *i64 43 let Wdkv: *i64 = sys_mmap(64*8) as *i64 44 let Wuk: *i64 = sys_mmap(64*8) as *i64 45 let Wuv: *i64 = sys_mmap(64*8) as *i64 46 let Wqm: *i64 = sys_mmap(64*8) as *i64 47 let Wom: *i64 = sys_mmap(64*8) as *i64 48 ig_fill(x, t*d, 1) 49 ig_fill(wq, d*d, 2); ig_fill(wk, d*d, 3); ig_fill(wv, d*d, 4); ig_fill(wo, d*d, 5) 50 ig_fill(w1, d*dff, 6); ig_fill(w2, dff*d, 7) 51 ig_fill(Wdkv, d*IG_LC, 8); ig_fill(Wuk, IG_LC*d, 9); ig_fill(Wuv, IG_LC*d, 10) 52 ig_fill(Wqm, d*d, 11); ig_fill(Wom, d*d, 12) 53 54 let out: *i64 = sys_mmap(64*8) as *i64 55 k3il_stack(x, wq,wk,wv,wo,w1,w2, Wdkv,Wuk,Wuv,Wqm,Wom, IG_L, t,d,dff, IG_NH,IG_HD,IG_LC,IG_SCALE, out) 56 57 // T1: runs + transforms 58 var t1: i64 = 0 59 var i: i64 = 0 60 while i < t*d { if out[i] != x[i] { t1 = 1 } i = i + 1 } 61 gv_check("T1 4-layer 3:1 interleave [KDA,KDA,KDA,MLA] runs + transforms input" as *u8, t1, ctr) 62 63 // T2a: perturb ONLY the MLA weight Wdkv (big, 2.0 Q16) -> deterministic output MUST change (MLA path live). 64 // deterministic integer stack: a LIVE path changes the output by some nonzero amount; a DEAD path by 0. 65 Wdkv[0] = Wdkv[0] + (2*IG_Q) 66 let outm: *i64 = sys_mmap(64*8) as *i64 67 k3il_stack(x, wq,wk,wv,wo,w1,w2, Wdkv,Wuk,Wuv,Wqm,Wom, IG_L, t,d,dff, IG_NH,IG_HD,IG_LC,IG_SCALE, outm) 68 var dm: i64 = 0 69 i = 0 70 while i < t*d { var e: i64 = outm[i] - out[i]; if e < 0 { e = 0 - e } dm = dm + e; i = i + 1 } 71 Wdkv[0] = Wdkv[0] - (2*IG_Q) // restore 72 var t2a: i64 = 0 73 if dm > 8 { t2a = 1 } 74 gv_check("T2a MLA path LIVE: perturbing an MLA-only weight (Wdkv) moves the output" as *u8, t2a, ctr) 75 76 // T2b: perturb ONLY a KDA weight wq (big) -> output MUST change (KDA path live, even diluted by depth) 77 wq[0] = wq[0] + (2*IG_Q) 78 let outk: *i64 = sys_mmap(64*8) as *i64 79 k3il_stack(x, wq,wk,wv,wo,w1,w2, Wdkv,Wuk,Wuv,Wqm,Wom, IG_L, t,d,dff, IG_NH,IG_HD,IG_LC,IG_SCALE, outk) 80 var dk: i64 = 0 81 i = 0 82 while i < t*d { var e: i64 = outk[i] - out[i]; if e < 0 { e = 0 - e } dk = dk + e; i = i + 1 } 83 wq[0] = wq[0] - (2*IG_Q) // restore 84 var t2b: i64 = 0 85 if dk > 8 { t2b = 1 } 86 gv_check("T2b KDA path LIVE: perturbing a KDA-only weight (wq) moves the output" as *u8, t2b, ctr) 87 88 // T3: depth-stable 89 var t3: i64 = 1 90 i = 0 91 while i < t*d { var av: i64 = out[i]; if av < 0 { av = 0 - av } if av > 1000000000 { t3 = 0 } i = i + 1 } 92 gv_check("T3 DEPTH-STABLE (interleaved output bounded, RMSNorm holds)" as *u8, t3, ctr) 93 94 // T4: deterministic 95 let outb: *i64 = sys_mmap(64*8) as *i64 96 k3il_stack(x, wq,wk,wv,wo,w1,w2, Wdkv,Wuk,Wuv,Wqm,Wom, IG_L, t,d,dff, IG_NH,IG_HD,IG_LC,IG_SCALE, outb) 97 var t4: i64 = 1 98 i = 0 99 while i < t*d { if outb[i] != out[i] { t4 = 0 } i = i + 1 } 100 gv_check("T4 DETERMINISTIC bit-identical at depth (the exceed: float interleaved stacks drift)" as *u8, t4, ctr) 101 102 // T5: schedule is mechanically 3:1 over 8 layers 103 var t5: i64 = 1 104 var mla_ct: i64 = 0 105 var kda_ct: i64 = 0 106 var l: i64 = 0 107 while l < 8 { 108 let ty: i64 = k3il_layer_type(l) 109 if ty == 1 { mla_ct = mla_ct + 1 } else { kda_ct = kda_ct + 1 } 110 l = l + 1 111 } 112 // expect layers 3 and 7 = MLA -> mla_ct=2, kda_ct=6 (6:2 = 3:1) 113 if mla_ct != 2 { t5 = 0 } 114 if kda_ct != 6 { t5 = 0 } 115 if k3il_layer_type(3) != 1 { t5 = 0 } 116 if k3il_layer_type(7) != 1 { t5 = 0 } 117 if k3il_layer_type(0) != 0 { t5 = 0 } 118 gv_check("T5 schedule mechanically 3:1: 6 KDA : 2 MLA over 8 layers, MLA at l=3,7" as *u8, t5, ctr) 119 120 let rc: i64 = gv_verdict("NOFLOAT-K3INTERLEAVE-GATE" as *u8, ctr, "3:1 KDA:MLA K3 block assembled from proven KDA+MLA organs: runs, both paths live, depth-stable, bit-exact, schedule 3:1" as *u8) 121 sys_exit(rc) 122 return rc 123}