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}