code wiki / _hdl_build / nx_mt_r1_gate.nx

nx_mt_r1_gate.nx source

↩ module page · 209 lines · 8754 B

1// nx_mt_r1_gate.nx -- GATE for MT-R1: SEQUENCES. Proves, by RUNNING, that the sovereign MT core 2// (nx_mt_core) translates multi-token SEQUENCES with a SHARED, position-independent learned 3// word-map -- and that the map GENERALIZES to HELD-OUT sentences it was never trained on. This 4// is the seq2seq plumbing + the no-overfit test harness the rest of the arc rides on; R0 proved 5// the single-token atom, R2 will add cross-token CONTEXT (reordering) via fnet_mix. 6// 7// Dictionary (EN->ES), target indices are a PERMUTATION (not identity): tgt_map=[2,0,5,1,3,4]. 8// src EN: 0 hello 1 family 2 love 3 good 4 day 5 water 9// tgt ES: 0 familia 1 bueno 2 hola 3 dia 4 agua 5 amor 10// 11// TRAIN = 4 sentences x 3 tokens, arranged so EVERY word occurs EXACTLY TWICE (m=2) -> with 12// lr=1/8 the GD factor (1-2*lr*m)=0.5 is stable+monotone for all weights. HELD-OUT = 3 sentences 13// whose token TRIPLES never appear in training (novel combinations of the same vocab). 14// 15// FOUR GATES: 16// A LEARNS (train set): per-token acc == all-train-tokens, sum-loss < 1/1000, loss decreased. 17// B GENERALIZES (held-out): per-token acc == all-held-tokens on sentences NEVER trained -> 18// the shared map is compositional/position-independent, not a per-sentence memorization. 19// C BIT-EXACT: retrain from zero-init -> identical W bits. 20// D UNTRAINED FAILS (liar-kill): zero-epoch model scores < all-held-tokens on held-out. 21// 22// genealogy_id: rumelhart_1986_backprop (realized_in nx_autograd) 23// lineage_id: sovereign_neural_mt_r1_sequences_v1 24// license_tier: ORIGINAL 25import "nx_mt_core.nx" // mt_train / mt_argmax / mt_seq_acc (shared word-map model) 26import "nx_autograd.nx" // ag_constf + nx_f32 compares + AG_F32_* + nx_syscalls 27import "nx_syscalls.nx" 28 29const MR_LOG: *u8 = "knowledge/status/mt_r1.log" 30const MR_S: i64 = 6 31const MR_T: i64 = 6 32const MR_L: i64 = 3 // sequence length 33 34const EN0: *u8 = "hello" as *u8 35const EN1: *u8 = "family" as *u8 36const EN2: *u8 = "love" as *u8 37const EN3: *u8 = "good" as *u8 38const EN4: *u8 = "day" as *u8 39const EN5: *u8 = "water" as *u8 40const ES0: *u8 = "familia" as *u8 41const ES1: *u8 = "bueno" as *u8 42const ES2: *u8 = "hola" as *u8 43const ES3: *u8 = "dia" as *u8 44const ES4: *u8 = "agua" as *u8 45const ES5: *u8 = "amor" as *u8 46const ESQ: *u8 = "?" as *u8 47 48func mr_en(i: i64) -> *u8 { 49 if i == 0 { return EN0 } 50 if i == 1 { return EN1 } 51 if i == 2 { return EN2 } 52 if i == 3 { return EN3 } 53 if i == 4 { return EN4 } 54 if i == 5 { return EN5 } 55 return ESQ 56} 57func mr_es(j: i64) -> *u8 { 58 if j == 0 { return ES0 } 59 if j == 1 { return ES1 } 60 if j == 2 { return ES2 } 61 if j == 3 { return ES3 } 62 if j == 4 { return ES4 } 63 if j == 5 { return ES5 } 64 return ESQ 65} 66 67func mr_w(fd: i64, s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(fd, s, n); return 0 } 68func mr_wn(fd: i64, v: i64) -> i64 { 69 let bb: *u8 = sys_mmap(28); var m: i64 = v 70 if m < 0 { m = 0 - m; sys_write(fd, "-" as *u8, 1) } 71 let t: *u8 = sys_mmap(28); var k: i64 = 0 72 if m == 0 { t[0] = 48; k = 1 } 73 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } 74 var i: i64 = 0 75 while i < k { bb[i] = t[k - 1 - i]; i = i + 1 } 76 sys_write(fd, bb, k); return 0 77} 78func mr_f32_to_milli(v: i64) -> i64 { 79 var s: i64 = nx_f32_mul(v, nx_i32_to_f32(1000)) 80 var neg: i64 = 0 81 if nx_f32_lt(s, AG_F32_ZERO) == 1 { neg = 1; s = nx_f32_neg(s) } 82 let half: i64 = ag_constf(1, 2) 83 var m: i64 = 0 84 var go: i64 = 1 85 while go == 1 { 86 let mid: i64 = nx_f32_add(nx_i32_to_f32(m), half) 87 if nx_f32_lt(mid, s) == 1 { 88 m = m + 1 89 if m >= 100000 { go = 0 } 90 } else { go = 0 } 91 } 92 if neg == 1 { return 0 - m } 93 return m 94} 95 96// print each held-out token as en->es (predicted by the trained, frozen W). Honest demo. 97func mr_demo(fd: i64, W: *i64, held_src: *i64, n_held: i64) -> i64 { 98 mr_w(fd, "MT-R1 held-out (never trained):" as *u8) 99 var k: i64 = 0 100 let n: i64 = n_held * MR_L 101 while k < n { 102 let s: i64 = held_src[k] 103 let pj: i64 = mt_argmax(W, MR_S, MR_T, s) 104 mr_w(fd, " " as *u8); mr_w(fd, mr_en(s)); mr_w(fd, "->" as *u8); mr_w(fd, mr_es(pj)) 105 k = k + 1 106 } 107 mr_w(fd, "\n" as *u8) 108 return 0 109} 110 111func mr_emit(fd: i64, r: *i64) -> i64 { 112 mr_w(fd, "MTR1GATE authored=organ engine=scalar-tape-autograd-f32 task=sequence-translate-shared-wordmap" as *u8) 113 mr_w(fd, " | A_learns_pass=" as *u8); mr_wn(fd, r[0]) 114 mr_w(fd, " train_acc=" as *u8); mr_wn(fd, r[1]); mr_w(fd, "/" as *u8); mr_wn(fd, r[2]) 115 mr_w(fd, " loss_first_milli=" as *u8); mr_wn(fd, r[3]); mr_w(fd, " loss_last_milli=" as *u8); mr_wn(fd, r[4]) 116 mr_w(fd, " | B_generalizes_pass=" as *u8); mr_wn(fd, r[5]) 117 mr_w(fd, " heldout_acc=" as *u8); mr_wn(fd, r[6]); mr_w(fd, "/" as *u8); mr_wn(fd, r[7]) 118 mr_w(fd, " | C_bitexact_pass=" as *u8); mr_wn(fd, r[8]) 119 mr_w(fd, " | D_untrained_fails_pass=" as *u8); mr_wn(fd, r[9]); mr_w(fd, " untrained_heldout_acc=" as *u8); mr_wn(fd, r[10]) 120 if r[11] == 1 { mr_w(fd, " verdict=GREEN\n" as *u8) } else { mr_w(fd, " verdict=RED\n" as *u8) } 121 return 0 122} 123 124func main() -> i64 { 125 var ok: i64 = 1 126 let NW: i64 = MR_T * MR_S 127 128 // word-map (permutation) 129 let tmap: *i64 = (sys_mmap(MR_S * 8)) as *i64 130 tmap[0] = 2; tmap[1] = 0; tmap[2] = 5; tmap[3] = 1; tmap[4] = 3; tmap[5] = 4 131 132 // TRAIN: 4 sentences x 3, every word exactly twice 133 let n_train: i64 = 4 134 let ntr: i64 = n_train * MR_L 135 let tr_src: *i64 = (sys_mmap(ntr * 8)) as *i64 136 tr_src[0] = 0; tr_src[1] = 1; tr_src[2] = 2 137 tr_src[3] = 3; tr_src[4] = 4; tr_src[5] = 5 138 tr_src[6] = 2; tr_src[7] = 3; tr_src[8] = 0 139 tr_src[9] = 5; tr_src[10] = 1; tr_src[11] = 4 140 let tr_tgt: *i64 = (sys_mmap(ntr * 8)) as *i64 141 var k: i64 = 0 142 while k < ntr { tr_tgt[k] = tmap[tr_src[k]]; k = k + 1 } 143 144 // HELD-OUT: 3 sentences x 3, triples never appear in training 145 let n_held: i64 = 3 146 let nhd: i64 = n_held * MR_L 147 let hd_src: *i64 = (sys_mmap(nhd * 8)) as *i64 148 hd_src[0] = 1; hd_src[1] = 2; hd_src[2] = 3 149 hd_src[3] = 4; hd_src[4] = 5; hd_src[5] = 0 150 hd_src[6] = 3; hd_src[7] = 0; hd_src[8] = 5 151 let hd_tgt: *i64 = (sys_mmap(nhd * 8)) as *i64 152 k = 0 153 while k < nhd { hd_tgt[k] = tmap[hd_src[k]]; k = k + 1 } 154 155 let lr: i64 = ag_constf(1, 8) // m_max=2 -> factor (1-2*lr*m)=0.5, stable 156 157 // ---------- Gate A: LEARNS the training set ---------- 158 let W: *i64 = (sys_mmap(NW * 8)) as *i64 159 let lf: *i64 = (sys_mmap(8)) as *i64 160 let ll: *i64 = (sys_mmap(8)) as *i64 161 mt_train(W, MR_S, MR_T, tr_src, tr_tgt, n_train, MR_L, 300, lr, lf, ll) 162 let tr_acc: i64 = mt_seq_acc(W, MR_S, MR_T, tr_src, tr_tgt, n_train, MR_L) 163 var learns_pass: i64 = 1 164 if tr_acc != ntr { learns_pass = 0 } 165 if nx_f32_lt(*ll, ag_constf(1, 1000)) != 1 { learns_pass = 0 } 166 if nx_f32_lt(*ll, *lf) != 1 { learns_pass = 0 } 167 if learns_pass != 1 { ok = 0 } 168 169 // ---------- Gate B: GENERALIZES to held-out sentences ---------- 170 let hd_acc: i64 = mt_seq_acc(W, MR_S, MR_T, hd_src, hd_tgt, n_held, MR_L) 171 var gen_pass: i64 = 1 172 if hd_acc != nhd { gen_pass = 0 } 173 if gen_pass != 1 { ok = 0 } 174 175 // ---------- Gate C: bit-exact reproducible ---------- 176 let Wr: *i64 = (sys_mmap(NW * 8)) as *i64 177 let lfr: *i64 = (sys_mmap(8)) as *i64 178 let llr: *i64 = (sys_mmap(8)) as *i64 179 mt_train(Wr, MR_S, MR_T, tr_src, tr_tgt, n_train, MR_L, 300, lr, lfr, llr) 180 var bitexact_pass: i64 = 1 181 var c: i64 = 0 182 while c < NW { if Wr[c] != W[c] { bitexact_pass = 0 } c = c + 1 } 183 if bitexact_pass != 1 { ok = 0 } 184 185 // ---------- Gate D: untrained model FAILS held-out (liar-kill) ---------- 186 let W0: *i64 = (sys_mmap(NW * 8)) as *i64 187 let lf0: *i64 = (sys_mmap(8)) as *i64 188 let ll0: *i64 = (sys_mmap(8)) as *i64 189 mt_train(W0, MR_S, MR_T, tr_src, tr_tgt, n_train, MR_L, 0, lr, lf0, ll0) 190 let hd_acc0: i64 = mt_seq_acc(W0, MR_S, MR_T, hd_src, hd_tgt, n_held, MR_L) 191 var untrained_fails_pass: i64 = 1 192 if hd_acc0 >= nhd { untrained_fails_pass = 0 } 193 if untrained_fails_pass != 1 { ok = 0 } 194 195 // ---------- emit ---------- 196 let r: *i64 = (sys_mmap(12 * 8)) as *i64 197 r[0] = learns_pass; r[1] = tr_acc; r[2] = ntr 198 r[3] = mr_f32_to_milli(*lf); r[4] = mr_f32_to_milli(*ll) 199 r[5] = gen_pass; r[6] = hd_acc; r[7] = nhd 200 r[8] = bitexact_pass; r[9] = untrained_fails_pass; r[10] = hd_acc0 201 r[11] = ok 202 mr_emit(1, r) 203 mr_demo(1, W, hd_src, n_held) 204 let logf: i64 = sys_openat_append(MR_LOG, 420) 205 if logf >= 0 { mr_emit(logf, r); mr_demo(logf, W, hd_src, n_held); sys_close(logf) } 206 207 if ok == 1 { return 0 } 208 return 1 209}