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}