code wiki / _hdl_build / nx_nofloat_bpe_gate.nx
nx_nofloat_bpe_gate.nx source
↩ module page · 84 lines · 4967 B
1// nx_nofloat_bpe_gate.nx -- R2 (efficiency) from the sovereign-researcher roadmap
2// (knowledge/research/2026-06-23-nofloat-affordable-land-roadmap.md, grounded in nfs_bpe.raw): a LEARNED
3// Byte-Pair-Encoding tokenizer. Greedily merge the most-frequent adjacent token pair K times -> frequent
4// substrings become single sub-word tokens -> FEWER tokens per text -> cheaper LM training + longer effective
5// context for the same compute. Pure integer, self-contained (nx_syscalls only).
6// T1 COMPRESSION: BPE token count << char count (ratio >= 1.4) = the efficiency win.
7// T2 LOSSLESS (teeth): recursively expand the BPE tokens back to bytes == the original corpus, byte-exact.
8// T3 learned K real merges (each a repeated pair).
9// expect_exit: 0 license_tier: ORIGINAL
10import "nx_syscalls.nx"
11import "nx_gate_emit_lib.nx"
12const STRIDE: i64 = 320 // pair key = a*STRIDE + b (ids stay < 256+K < 320)
13
14
15func slen(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n }
16// recursively expand token tok into bytes appended at out[*w]; merges ma/mb indexed by (tok-256).
17func expand(tok: i64, ma: *i64, mb: *i64, out: *u8, w: *i64) -> i64 {
18 if tok < 256 { out[w[0]] = tok as u8; w[0] = w[0] + 1; return 0 }
19 let m: i64 = tok - 256
20 expand(ma[m], ma, mb, out, w)
21 expand(mb[m], ma, mb, out, w)
22 return 0
23}
24
25func main() -> i64 {
26 g_puts("nx_nofloat_bpe gate (learned BPE sub-word compression -- the R2 efficiency win)\n" as *u8)
27 let corpus: *u8 = "the cat sat the cat ran the dog sat the dog ran the cat ran the dog sat" as *u8
28 let L: i64 = slen(corpus)
29 let seq: *i64 = sys_mmap(L*8) as *i64
30 var n: i64=0; while n<L { seq[n]=corpus[n] as i64; n=n+1 } // start: one token per byte
31 let K: i64 = 14
32 let ma: *i64 = sys_mmap(K*8) as *i64; let mb: *i64 = sys_mmap(K*8) as *i64
33 let cnt: *i64 = sys_mmap(STRIDE*STRIDE*8) as *i64 // pair-frequency table
34 let seq2: *i64 = sys_mmap(L*8) as *i64
35 var nextid: i64 = 256
36 var learned: i64 = 0
37 var k: i64=0
38 while k<K {
39 // zero the pair table over the used id range only (ids < nextid)
40 var z: i64=0; let lim: i64 = nextid*STRIDE
41 while z<lim { cnt[z]=0; z=z+1 }
42 // count adjacent pairs in seq[0..n-1]
43 var i: i64=0
44 while i<n-1 { let key: i64=seq[i]*STRIDE+seq[i+1]; cnt[key]=cnt[key]+1; i=i+1 }
45 // find the most frequent pair
46 var bestkey: i64=0-1; var bestc: i64=1
47 i=0
48 while i<n-1 { let key: i64=seq[i]*STRIDE+seq[i+1]; if cnt[key]>bestc { bestc=cnt[key]; bestkey=key } i=i+1 }
49 if bestkey < 0 { k=K } else {
50 let a: i64=bestkey/STRIDE; let b: i64=bestkey-a*STRIDE
51 ma[learned]=a; mb[learned]=b; let newid: i64=nextid; nextid=nextid+1; learned=learned+1
52 // replace every adjacent (a,b) with newid
53 var w: i64=0; i=0
54 while i<n { if i<n-1 { if seq[i]==a { if seq[i+1]==b { seq2[w]=newid; w=w+1; i=i+2 } else { seq2[w]=seq[i]; w=w+1; i=i+1 } } else { seq2[w]=seq[i]; w=w+1; i=i+1 } } else { seq2[w]=seq[i]; w=w+1; i=i+1 } }
55 var c: i64=0; while c<w { seq[c]=seq2[c]; c=c+1 } n=w
56 k=k+1
57 }
58 }
59 let comp_n: i64 = n
60 g_puts(" [measure] chars=" as *u8); g_pn(L); g_puts(" BPE tokens=" as *u8); g_pn(comp_n); g_puts(" merges learned=" as *u8); g_pn(learned); g_puts(" ratio(x100)=" as *u8); g_pn(L*100/comp_n); g_puts("\n" as *u8)
61
62 // ---- T2: lossless reconstruction ----
63 let recon: *u8 = sys_mmap(L+16); let w: *i64 = sys_mmap(8) as *i64; w[0]=0
64 var t: i64=0; while t<comp_n { expand(seq[t], ma, mb, recon, w); t=t+1 }
65 var lossless: i64=1
66 if w[0] != L { lossless=0 }
67 var ci: i64=0; while ci<L { if recon[ci] != corpus[ci] { lossless=0 } ci=ci+1 }
68
69 var pass: i64=0; var total: i64=0
70 var t1: i64=0; if L*10 >= comp_n*14 { t1=1 } // ratio >= 1.4
71 pass=pass+g_check("T1: COMPRESSION -- BPE token count <= chars/1.4 (fewer tokens/text = cheaper training)" as *u8, t1); total=total+1
72 pass=pass+g_check("T2: LOSSLESS -- BPE tokens expand back to the EXACT original corpus (correct tokenizer)" as *u8, lossless); total=total+1
73 var t3: i64=0; if learned >= 8 { t3=1 }
74 pass=pass+g_check("T3: learned >= 8 real BPE merges (frequent sub-words found)" as *u8, t3); total=total+1
75
76 var okall: i64=0; if pass==total { okall=1 }
77 if okall==1 {
78 let logf: i64 = sys_openat_append("knowledge/status/nofloat_bpe.log" as *u8, 420)
79 if logf >= 0 { let x0: i64=sys_write(logf,"NOFLOATBPE learned-bpe compression+lossless measured\n" as *u8,52); sys_close(logf) }
80 }
81 g_puts("---- bpe gate: passed " as *u8); g_pn(pass); g_puts(" / " as *u8); g_pn(total); g_puts(" ----\n" as *u8)
82 if okall==1 { g_puts("verdict=GREEN (learned BPE: lossless sub-word compression = the R2 efficiency win toward landing)\n" as *u8); sys_exit(0); return 0 }
83 g_puts("verdict=RED\n" as *u8); sys_exit(1); return 1
84}