code wiki / (root) / nx_nofloat_qgap_probe.nx

nx_nofloat_qgap_probe.nx source

↩ module page · 249 lines · 13068 B

1// nx_nofloat_qgap_probe.nx -- THE QUANTISATION-GAP INSTRUMENT (2026-09-17, search R0s): does the served W12A12 (i8) 2// route generate what the lossless i32 route generates? Same model file, same prompts, GREEDY decoding, so the only 3// variable left is the arithmetic. The oracle scores biology 408 and the sovereign i8 pass 352 with two different 4// samplers, so that gap cannot say whether quantisation is the cause; this can. Two processes because a 16 GB VM 5// holds one weight cache beside the running engine: 6// nx_nofloat_qgap_probe run i32|i8|q8 <model.gguf> <queries.tsv> <nq> <max_new> <outdir> -- one file per prompt 7// nx_nofloat_qgap_probe compare <outdir> <nq> [ref_prefix] [arm] -- the agreement, as values 8// It is an INSTRUMENT: the teeth assert that every prompt produced both arms and that the comparator can see a 9// planted difference; the gap itself is printed, never judged, so a large gap cannot be argued away by a threshold. 10import "nx_syscalls.nx" 11import "nx_nofloat_serve_core.nx" 12import "nx_gate_verdict.nx" 13 14const QG_OUT_CAP: i64 = 8192 15const QG_GP_SLOTS: i64 = 16 16const QG_META_SLOTS: i64 = 8 17const QG_MODE_I32: i64 = 0 18const QG_MODE_I8: i64 = 1 19const QG_MODE_Q8: i64 = 3 // search R0s: the resident block-native route (NSV_MODE_Q4K's slot tables over a Q8_0 gguf) 20const QG_PROMPT_CAP: i64 = 4096 21const QG_PATH_CAP: i64 = 512 22const QG_PERMIL: i64 = 1000 23const QG_SEED: i64 = 1 24const QG_FILE_MODE: i64 = 420 25const QG_DEC: i64 = 10 26const QG_ASCII_0: i64 = 48 27const QG_INSTR: *u8 = "Rewrite the following question as a focused web search query that names the underlying scientific concepts. Question: " as *u8 28 29func qg_slen(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n } 30func qg_cat(d: *u8, o: i64, s: *u8) -> i64 { var i: i64 = 0; var p: i64 = o; while s[i] != (0 as u8) { d[p] = s[i]; p = p + 1; i = i + 1 } d[p] = 0 as u8; return p } 31func qg_catn(d: *u8, o: i64, v0: i64) -> i64 { 32 var p: i64 = o 33 var v: i64 = v0 34 if v < 0 { d[p] = 45 as u8; p = p + 1; v = 0 - v } 35 if v == 0 { d[p] = 48 as u8; p = p + 1; d[p] = 0 as u8; return p } 36 var pw: i64 = 1 37 while v / pw >= QG_DEC { pw = pw * QG_DEC } 38 while pw > 0 { d[p] = (QG_ASCII_0 + ((v / pw) % QG_DEC)) as u8; p = p + 1; pw = pw / QG_DEC } 39 d[p] = 0 as u8 40 return p 41} 42func qg_atoi(s: *u8) -> i64 { var v: i64 = 0; var i: i64 = 0; while s[i] != (0 as u8) { if s[i] >= (48 as u8) { if s[i] <= (57 as u8) { v = v * QG_DEC + ((s[i] - (48 as u8)) as i64) } } i = i + 1 } return v } 43func qg_streq(a: *u8, b: *u8) -> i64 { var i: i64 = 0; while a[i] == b[i] { if a[i] == (0 as u8) { return 1 } i = i + 1 } return 0 } 44func qg_putsn(b: *u8, n: i64) { if n > 0 { sys_write(1, b, n) } } 45// the idx-th line's second TAB field copied into out (cap-1 bytes at most); returns its length, -1 when absent 46func qg_query(buf: *u8, n: i64, idx: i64, out: *u8, cap: i64) -> i64 { 47 var line: i64 = 0 48 var i: i64 = 0 49 while i < n { 50 if line == idx { 51 var j: i64 = i 52 var go: i64 = 1 53 while go == 1 { if j < n { if buf[j] == (9 as u8) { go = 0 } else { if buf[j] == (10 as u8) { go = 0 } else { j = j + 1 } } } else { go = 0 } } 54 if j >= n { return 0 - 1 } 55 if buf[j] != (9 as u8) { return 0 - 1 } 56 j = j + 1 57 var o: i64 = 0 58 var go2: i64 = 1 59 while go2 == 1 { if j < n { if buf[j] == (10 as u8) { go2 = 0 } else { if buf[j] == (13 as u8) { go2 = 0 } else { if o < cap - 1 { out[o] = buf[j]; o = o + 1 } j = j + 1 } } } else { go2 = 0 } } 60 out[o] = 0 as u8 61 return o 62 } 63 if buf[i] == (10 as u8) { line = line + 1 } 64 i = i + 1 65 } 66 return 0 - 1 67} 68// <outdir>/q<idx>.<arm>.<ext> 69func qg_path(out: *u8, dir: *u8, idx: i64, arm: *u8, ext: *u8) -> i64 { 70 var o: i64 = qg_cat(out, 0, dir) 71 o = qg_cat(out, o, "/q" as *u8) 72 o = qg_catn(out, o, idx) 73 o = qg_cat(out, o, "." as *u8) 74 o = qg_cat(out, o, arm) 75 o = qg_cat(out, o, "." as *u8) 76 o = qg_cat(out, o, ext) 77 return o 78} 79func qg_write(path: *u8, buf: *u8, n: i64) -> i64 { 80 let fd: i64 = sys_openat_wr(path, QG_FILE_MODE) 81 if fd < 0 { return 0 - 1 } 82 var w: i64 = 0 83 if n > 0 { w = sys_write(fd, buf, n) } 84 sys_close(fd) 85 return w 86} 87 88func qg_run(argc: i64, argv: *i64, ctr: *i64) -> i64 { 89 if argc < 8 { gv_puts("usage: nx_nofloat_qgap_probe run i32|i8|q8 <model.gguf> <queries.tsv> <nq> <max_new> <outdir>\n" as *u8); return 2 } 90 let arm: *u8 = argv[2] as *u8 91 let mpath: *u8 = argv[3] as *u8 92 let qpath: *u8 = argv[4] as *u8 93 let nq: i64 = qg_atoi(argv[5] as *u8) 94 let maxnew: i64 = qg_atoi(argv[6] as *u8) 95 let outdir: *u8 = argv[7] as *u8 96 var mode: i64 = 0 - 1 97 if qg_streq(arm, "i32" as *u8) == 1 { mode = QG_MODE_I32 } 98 if qg_streq(arm, "i8" as *u8) == 1 { mode = QG_MODE_I8 } 99 if qg_streq(arm, "q8" as *u8) == 1 { mode = QG_MODE_Q8 } 100 gv_need("arm-is-i32-or-i8" as *u8, (mode >= 0) as i64, ctr) 101 var ir: i64 = 0 - 1 102 if mode == QG_MODE_I32 { ir = nsv_init_i32only(mpath) } else { if mode == QG_MODE_Q8 { ir = nsv_init_q4k(mpath) } else { ir = nsv_init_i8(mpath) } } 103 gv_need("model-initialised" as *u8, (ir == 0) as i64, ctr) 104 let qlen: *i64 = sys_mmap(16) as *i64 105 let qbuf: *u8 = sys_read_file(qpath, qlen) 106 gv_need("queries-readable" as *u8, (qlen[0] > 0) as i64, ctr) 107 let qtext: *u8 = sys_mmap(QG_PROMPT_CAP) 108 let prompt: *u8 = sys_mmap(QG_PROMPT_CAP + QG_PROMPT_CAP) 109 let out: *u8 = sys_mmap(QG_OUT_CAP) 110 let meta: *i64 = sys_mmap(QG_META_SLOTS * 8) as *i64 111 let gp: *i64 = sys_mmap(QG_GP_SLOTS * 8) as *i64 112 let pbuf: *u8 = sys_mmap(QG_PATH_CAP) 113 let mbuf: *u8 = sys_mmap(QG_PATH_CAP) 114 let kbuf: *u8 = sys_mmap(QG_PATH_CAP) 115 var allok: i64 = 1 116 var done: i64 = 0 117 var i: i64 = 0 118 while i < nq { 119 let ql: i64 = qg_query(qbuf, qlen[0], i, qtext, QG_PROMPT_CAP) 120 if ql > 0 { 121 var pl: i64 = qg_cat(prompt, 0, QG_INSTR) 122 pl = qg_cat(prompt, pl, qtext) 123 gp[0] = prompt as i64; gp[1] = pl; gp[2] = maxnew; gp[3] = mode 124 gp[4] = out as i64; gp[5] = QG_OUT_CAP; gp[6] = meta as i64 125 gp[7] = 0; gp[8] = 0; gp[9] = 0; gp[10] = 0; gp[11] = QG_SEED; gp[12] = 1 126 let n: i64 = nsv_generate(gp) 127 if n <= 0 { allok = 0 } 128 qg_path(pbuf, outdir, i, arm, "out" as *u8) 129 qg_write(pbuf, out, n) 130 var mo: i64 = qg_cat(mbuf, 0, "tokens=" as *u8) 131 mo = qg_catn(mbuf, mo, meta[1]) 132 mo = qg_cat(mbuf, mo, " ms=" as *u8) 133 mo = qg_catn(mbuf, mo, meta[2]) 134 mo = qg_cat(mbuf, mo, " prompt_tokens=" as *u8) 135 mo = qg_catn(mbuf, mo, meta[0]) 136 mo = qg_cat(mbuf, mo, " bytes=" as *u8) 137 mo = qg_catn(mbuf, mo, n) 138 mo = qg_cat(mbuf, mo, "\n" as *u8) 139 qg_path(pbuf, outdir, i, arm, "meta" as *u8) 140 qg_write(pbuf, mbuf, mo) 141 var ko: i64 = qg_cat(kbuf, 0, "q" as *u8); ko = qg_catn(kbuf, ko, i); ko = qg_cat(kbuf, ko, "_" as *u8); ko = qg_cat(kbuf, ko, arm); ko = qg_cat(kbuf, ko, "_ms" as *u8) 142 gv_kv(kbuf, meta[2]) 143 ko = qg_cat(kbuf, 0, "q" as *u8); ko = qg_catn(kbuf, ko, i); ko = qg_cat(kbuf, ko, "_" as *u8); ko = qg_cat(kbuf, ko, arm); ko = qg_cat(kbuf, ko, "_tokens" as *u8) 144 gv_kv(kbuf, meta[1]) 145 ko = qg_cat(kbuf, 0, "q" as *u8); ko = qg_catn(kbuf, ko, i); ko = qg_cat(kbuf, ko, "_" as *u8); ko = qg_cat(kbuf, ko, arm); ko = qg_cat(kbuf, ko, "_bytes" as *u8) 146 gv_kv(kbuf, n) 147 done = done + 1 148 } 149 i = i + 1 150 } 151 gv_kv("prompts_run" as *u8, done) 152 gv_check("T1 every prompt generated on this arm (no error code, bytes written)" as *u8, allok, ctr) 153 gv_check_eq("T2 the prompt count reached the request" as *u8, done, nq, ctr) 154 let rc: i64 = gv_verdict("NOFLOAT-QGAP-RUN" as *u8, ctr, "one arm of the quantisation-gap instrument: greedy continuations written per prompt" as *u8) 155 gv_exit(rc) // the base-class exit: the pool workers die with the verdict 156 return rc 157} 158 159func qg_common(a: *u8, an: i64, b: *u8, bn: i64) -> i64 { 160 var n: i64 = an 161 if bn < n { n = bn } 162 var i: i64 = 0 163 while i < n { if a[i] != b[i] { return i } i = i + 1 } 164 return n 165} 166 167func qg_compare(argc: i64, argv: *i64, ctr: *i64) -> i64 { 168 if argc < 4 { gv_puts("usage: nx_nofloat_qgap_probe compare <outdir> <nq> [ref_prefix] [arm]\n" as *u8); return 2 } 169 let outdir: *u8 = argv[2] as *u8 170 let nq: i64 = qg_atoi(argv[3] as *u8) 171 // optional 4th arg: a REFERENCE PREFIX for the lossless arm (<prefix>q<i>.i32.out), so a host that cannot hold the 172 // i32 cache compares its served route against continuations banked once on a host that could 173 var hasref: i64 = 0 174 var refpfx: *u8 = "" as *u8 175 if argc >= 5 { hasref = 1; refpfx = argv[4] as *u8 } 176 // optional 5th arg: the arm under test (default i8) -- the R0s block-native route compares as q8 177 var carm: *u8 = "i8" as *u8 178 if argc >= 6 { carm = argv[5] as *u8 } 179 let pa: *u8 = sys_mmap(QG_PATH_CAP) 180 let pb: *u8 = sys_mmap(QG_PATH_CAP) 181 let la: *i64 = sys_mmap(16) as *i64 182 let lb: *i64 = sys_mmap(16) as *i64 183 let kbuf: *u8 = sys_mmap(QG_PATH_CAP) 184 var both: i64 = 0 185 var identical: i64 = 0 186 var permil_sum: i64 = 0 187 var first_div_sum: i64 = 0 188 var i: i64 = 0 189 while i < nq { 190 if hasref == 1 { var ro: i64 = qg_cat(pa, 0, refpfx); ro = qg_cat(pa, ro, "q" as *u8); ro = qg_catn(pa, ro, i); qg_cat(pa, ro, ".i32.out" as *u8) } else { qg_path(pa, outdir, i, "i32" as *u8, "out" as *u8) } 191 qg_path(pb, outdir, i, carm, "out" as *u8) 192 let a: *u8 = sys_read_file(pa, la) 193 let b: *u8 = sys_read_file(pb, lb) 194 if la[0] > 0 { if lb[0] > 0 { 195 both = both + 1 196 let c: i64 = qg_common(a, la[0], b, lb[0]) 197 var longest: i64 = la[0] 198 if lb[0] > longest { longest = lb[0] } 199 var same: i64 = 0 200 if la[0] == lb[0] { if c == la[0] { same = 1 } } 201 identical = identical + same 202 permil_sum = permil_sum + (c * QG_PERMIL) / longest 203 first_div_sum = first_div_sum + c 204 var ko: i64 = qg_cat(kbuf, 0, "q" as *u8); ko = qg_catn(kbuf, ko, i); ko = qg_cat(kbuf, ko, "_identical" as *u8) 205 gv_kv(kbuf, same) 206 ko = qg_cat(kbuf, 0, "q" as *u8); ko = qg_catn(kbuf, ko, i); ko = qg_cat(kbuf, ko, "_common_prefix_bytes" as *u8) 207 gv_kv(kbuf, c) 208 ko = qg_cat(kbuf, 0, "q" as *u8); ko = qg_catn(kbuf, ko, i); ko = qg_cat(kbuf, ko, "_i32_bytes" as *u8) 209 gv_kv(kbuf, la[0]) 210 ko = qg_cat(kbuf, 0, "q" as *u8); ko = qg_catn(kbuf, ko, i); ko = qg_cat(kbuf, ko, "_" as *u8); ko = qg_cat(kbuf, ko, carm); ko = qg_cat(kbuf, ko, "_bytes" as *u8) 211 gv_kv(kbuf, lb[0]) 212 gv_puts(" q" as *u8); gv_num(i); gv_puts(" i32: " as *u8); qg_putsn(a, la[0]); gv_puts("\n" as *u8) 213 gv_puts(" q" as *u8); gv_num(i); gv_puts(" " as *u8); gv_puts(carm); gv_puts(": " as *u8); qg_putsn(b, lb[0]); gv_puts("\n" as *u8) 214 } } 215 i = i + 1 216 } 217 gv_kv("prompts" as *u8, nq) 218 gv_kv("both_arms_present" as *u8, both) 219 gv_kv("identical_continuations" as *u8, identical) 220 var mp: i64 = 0 221 if both > 0 { mp = permil_sum / both } 222 gv_kv("mean_common_prefix_permil" as *u8, mp) 223 var mf: i64 = 0 224 if both > 0 { mf = first_div_sum / both } 225 gv_kv("mean_common_prefix_bytes" as *u8, mf) 226 gv_check_eq("T1 both arms present for every prompt" as *u8, both, nq, ctr) 227 // neg-control: the comparator sees a planted difference 228 let x: *u8 = sys_mmap(64) 229 let y: *u8 = sys_mmap(64) 230 var k: i64 = 0 231 while k < 32 { x[k] = (65 + (k % 26)) as u8; y[k] = x[k]; k = k + 1 } 232 y[17] = 33 as u8 233 gv_check_eq("neg-control-T2 a planted byte at offset 17 stops the common prefix at 17" as *u8, qg_common(x, 32, y, 32), 17, ctr) 234 gv_check_eq("T2b identical buffers share their whole length" as *u8, qg_common(x, 32, x, 32), 32, ctr) 235 let rc: i64 = gv_verdict("NOFLOAT-QGAP" as *u8, ctr, "the lossless i32 route vs the served i8 route on the same prompts, greedy: agreement printed as values, never judged by a threshold" as *u8) 236 gv_exit(rc) 237 return rc 238} 239 240func main(argc: i64, argv: *i64) -> i64 { 241 let ctr: *i64 = gv_ctr() 242 gv_head("=== nx_nofloat_qgap_probe: the lossless i32 route vs the served i8 route, greedy, same prompts ===" as *u8) 243 if argc < 2 { gv_puts("usage: nx_nofloat_qgap_probe run i32|i8|q8 <model.gguf> <queries.tsv> <nq> <max_new> <outdir> | compare <outdir> <nq> [ref_prefix] [arm]\n" as *u8); return 2 } 244 let verb: *u8 = argv[1] as *u8 245 if qg_streq(verb, "run" as *u8) == 1 { return qg_run(argc, argv, ctr) } 246 if qg_streq(verb, "compare" as *u8) == 1 { return qg_compare(argc, argv, ctr) } 247 gv_puts("unknown verb (run | compare)\n" as *u8) 248 return 2 249}