nx_nofloat_qwen_gen_gate.nx source
↩ module page · 121 lines · 8427 B
1// nx_nofloat_qwen_gen_gate.nx -- GREEDY MULTI-TOKEN GENERATION through the sovereign no-float Qwen2.5-0.5B.
2// encode("The capital of France is") -> loop [embed -> 24-layer run_stack -> final RMSNorm(Q24) -> LM-head argmax
3// -> append] -> decode. No KV cache (each step re-runs the full growing sequence -- correctness first).
4// FAITHFULNESS ANCHOR: the float reference (nx_f32_qwen_capital_gate) greedily generates " Paris. It is the";
5// tooth T2 pins the first generated token to ĠParis (12095).
6// No hw writes (Rule 26). expect_exit: 0 license_tier: ORIGINAL
7import "nx_syscalls.nx"
8import "nx_tier.nx"
9import "nx_le.nx"
10import "nx_tensor.nx"
11import "nx_gguf.nx"
12import "nx_gguf_load.nx"
13import "nx_gguf_meta.nx"
14import "nx_nofloat_llm.nx"
15import "nx_nofloat_tok.nx"
16import "nx_gate_verdict.nx"
17
18func gg_puts(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
19func gg_num(v: i64) -> i64 { let b: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m;sys_write(1,"-" as *u8,1)} let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48 as u8;k=1} while m>0{t[k]=(48+(m%10)) as u8;m=m/10;k=k+1} var i: i64=0; while i<k{b[i]=t[k-1-i];i=i+1} sys_write(1,b,k); return 0 }
20func gg_slen(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n }
21
22func main() -> i64 {
23 gg_puts("NO-FLOAT GREEDY GENERATION: 'The capital of France is' -> +4 tokens (float ref: ' Paris. It is the')\n\n" as *u8)
24 let path: *u8 = "/home/elderwesto/nx_stage/nx_real_model.gguf\x00" as *u8
25 let len_out: *i64 = sys_mmap(8) as *i64; len_out[0]=0
26 let buf: *u8 = sys_read_file(path, len_out)
27 if buf == (0 as *u8) { gg_puts("MODEL ABSENT\n" as *u8); return 1 }
28 let hdr: *NxGgufHeader = sys_mmap(NX_GGUF_HDR_BYTES) as *NxGgufHeader
29 if nx_gguf_parse(buf, len_out[0], hdr) != NX_GGUF_OK { gg_puts("PARSE FAIL\n" as *u8); return 1 }
30
31 let ne: i64=896; let qd: i64=896; let kvd: i64=128; let fd: i64=4864; let MAXT: i64=16
32 let voff: *i64=sys_mmap(8) as *i64; let vty: *i64=sys_mmap(8) as *i64
33 var mfirst: i64=0; var nm_c: i64=0; var vfirst: i64=0; var vocab: i64=0
34 let km: *u8="tokenizer.ggml.merges\x00" as *u8; let kt: *u8="tokenizer.ggml.tokens\x00" as *u8
35 if nx_gguf_meta_find(buf, len_out[0], hdr, km, gg_slen(km), voff, vty)==NX_GMETA_OK { nm_c=nx_gguf_meta_array_count(buf, voff[0]); mfirst=nx_gguf_meta_array_first_elt_off(buf, voff[0]) }
36 if nx_gguf_meta_find(buf, len_out[0], hdr, kt, gg_slen(kt), voff, vty)==NX_GMETA_OK { vocab=nx_gguf_meta_array_count(buf, voff[0]); vfirst=nx_gguf_meta_array_first_elt_off(buf, voff[0]) }
37 let nt: *u8="token_embd.weight\x00" as *u8; let no: *u8="output.weight\x00" as *u8; let nn: *u8="output_norm.weight\x00" as *u8
38 let ie: nx_int=nx_gguf_find_tensor(hdr, nt, 17); let io: nx_int=nx_gguf_find_tensor(hdr, no, 13); let inn: nx_int=nx_gguf_find_tensor(hdr, nn, 18)
39 if ie<0 { return 1 } if io<0 { return 1 } if inn<0 { return 1 }
40 let te: *NxGgufTensorInfo=nx_gguf_tensor_at(hdr, ie); let te_base: i64=hdr.data_off+te.offset; let te_ty: i64=te.ggml_type
41 let oh: *NxGgufTensorInfo=nx_gguf_tensor_at(hdr, io); let oh_base: i64=hdr.data_off+oh.offset; let oh_ty: i64=oh.ggml_type
42 let gout: *i64=sys_mmap(ne*8) as *i64; load_named_q16(buf, hdr, nn, 18, gout, ne)
43
44 let wb: *i64=sys_mmap(12*8) as *i64
45 wb[0]=sys_mmap(ne*8) as i64; wb[1]=sys_mmap(qd*ne*8) as i64; wb[2]=sys_mmap(kvd*ne*8) as i64; wb[3]=sys_mmap(kvd*ne*8) as i64; wb[4]=sys_mmap(ne*qd*8) as i64
46 wb[5]=sys_mmap(ne*8) as i64; wb[6]=sys_mmap(ne*fd*8) as i64; wb[7]=sys_mmap(ne*fd*8) as i64; wb[8]=sys_mmap(fd*ne*8) as i64
47 wb[9]=sys_mmap(qd*8) as i64; wb[10]=sys_mmap(kvd*8) as i64; wb[11]=sys_mmap(kvd*8) as i64
48 let sb: *i64=sys_mmap(14*8) as *i64
49 sb[0]=sys_mmap(MAXT*ne*8) as i64; sb[1]=sys_mmap(MAXT*qd*8) as i64; sb[2]=sys_mmap(MAXT*kvd*8) as i64; sb[3]=sys_mmap(MAXT*kvd*8) as i64; sb[4]=sys_mmap(MAXT*qd*8) as i64
50 sb[5]=sys_mmap(MAXT*8) as i64; sb[6]=sys_mmap(MAXT*8) as i64; sb[7]=sys_mmap(MAXT*ne*8) as i64; sb[8]=sys_mmap(MAXT*fd*8) as i64; sb[9]=sys_mmap(MAXT*fd*8) as i64
51 sb[10]=sys_mmap(MAXT*fd*8) as i64; sb[11]=sys_mmap(MAXT*ne*8) as i64; sb[12]=sys_mmap(MAXT*ne*8) as i64; sb[13]=sys_mmap(MAXT*ne*8) as i64
52 let nmbuf: *u8=sys_mmap(64); let freqs: *i64=sys_mmap(32*8) as *i64; rope_freqs(freqs, 64)
53 let tmp: *i64=sys_mmap(64*256*8) as *i64
54 let x: *i64=sys_mmap(MAXT*ne*8) as *i64
55 let hout: *i64=sys_mmap(MAXT*ne*8) as *i64
56 let cfgA: *i64=sys_mmap(8*8) as *i64; cfgA[1]=ne; cfgA[2]=14; cfgA[3]=2; cfgA[4]=64; cfgA[5]=qd; cfgA[6]=kvd; cfgA[7]=8192
57 let cfgF: *i64=sys_mmap(4*8) as *i64; cfgF[1]=ne; cfgF[2]=fd
58
59 let input: *u8="The capital of France is\x00" as *u8
60 let ids: *i64=sys_mmap(MAXT*8) as *i64; let tokp: *i64=sys_mmap(MAXT*8) as *i64; let tokl: *i64=sys_mmap(MAXT*8) as *i64
61 let nprompt: i64=tk_bpe_encode(buf, mfirst, nm_c, vfirst, vocab, input, gg_slen(input), tokp, tokl, ids)
62 gg_puts("prompt tokens: "); gg_num(nprompt); gg_puts("\n")
63
64 let normed: *i64=sys_mmap(ne*8) as *i64
65 let row: *i64=sys_mmap(ne*8) as *i64
66 let MAXNEW: i64=4
67 var T: i64=nprompt
68 var ngen: i64=0
69 var stop: i64=0
70 while stop==0 {
71 // embed ids[0..T)
72 var ei: i64=0; while ei<T { dequant_row(buf, te_base, te_ty, ids[ei], ne, ((x as i64)+ei*ne*8) as *i64, tmp); ei=ei+1 }
73 cfgA[0]=T; cfgF[0]=T
74 run_stack(buf, hdr, x, hout, wb, sb, nmbuf, freqs, cfgA, cfgF, 24, 0)
75 // final norm (Q24) on the LAST token + streamed LM head -> argmax
76 rmsnorm_gamma_row_q24(hout, gout, (T-1)*ne, ne, normed, 0)
77 var best: i64=0
78 var bestv: i64=0-9223372036854775807
79 var v: i64=0
80 while v<vocab {
81 dequant_row(buf, oh_base, oh_ty, v, ne, row, tmp)
82 var s: i64=0; var k: i64=0; while k<ne { s=s+(normed[k]*row[k]); k=k+1 }
83 let lg: i64=s>>24
84 if lg>bestv { bestv=lg; best=v }
85 v=v+1
86 }
87 gg_puts(" step "); gg_num(ngen); gg_puts(": next id="); gg_num(best); gg_puts(" logit="); gg_num(bestv); gg_puts(" piece='")
88 let off: i64=tk_decode_off(buf, vfirst, best); let pl: i64=nx_gguf_meta_read_string_len(buf, off)
89 if pl>0 { sys_write(1, nx_gguf_meta_read_string_ptr(buf, off), pl) }
90 gg_puts("'\n")
91 ids[T]=best; T=T+1; ngen=ngen+1
92 if best==151643 { stop=1 } // <|endoftext|>
93 if best==151645 { stop=1 } // <|im_end|>
94 if ngen>=MAXNEW { stop=1 }
95 if T>=MAXT { stop=1 }
96 }
97
98 gg_puts("\nCOMPLETION: '" as *u8)
99 var gi: i64=nprompt
100 var outbytes: i64=0
101 while gi<T { let o2: i64=tk_decode_off(buf, vfirst, ids[gi]); let p2: i64=nx_gguf_meta_read_string_len(buf, o2); if p2>0 { sys_write(1, nx_gguf_meta_read_string_ptr(buf, o2), p2); outbytes=outbytes+p2 } gi=gi+1 }
102 gg_puts("' (float ref: ' Paris. It is the')\n\n" as *u8)
103
104 var pass: i64=0
105 var ttl: i64=0
106 ttl=ttl+1; gg_puts(" T1 prompt encoded to exactly 5 tokens: "); if nprompt==5 { pass=pass+1; gg_puts("PASS\n") } else { gg_puts("FAIL\n") }
107 ttl=ttl+1; gg_puts(" T2 FAITHFUL first token: generated[0] == 12095 (ĠParis, matches the float reference): "); if ids[nprompt]==12095 { pass=pass+1; gg_puts("PASS\n") } else { gg_puts("FAIL\n") }
108 ttl=ttl+1; gg_puts(" T3 generated >=3 tokens, all valid ids: "); var okids: i64=1; var ci: i64=nprompt; while ci<T { if ids[ci]<0 { okids=0 } if ids[ci]>=vocab { okids=0 } ci=ci+1 } if ngen>=3 { if okids==1 { pass=pass+1; gg_puts("PASS\n") } else { gg_puts("FAIL\n") } } else { gg_puts("FAIL\n") }
109 ttl=ttl+1; gg_puts(" T4 completion decodes to non-empty text: "); if outbytes>0 { pass=pass+1; gg_puts("PASS\n") } else { gg_puts("FAIL\n") }
110
111 gg_puts("NX-NOFLOAT-QWEN-GEN-GATE passed "); gg_num(pass); gg_puts("/"); gg_num(ttl)
112 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check
113 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled
114 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify.
115 let ctr__dry: *i64 = gv_ctr()
116 ctr__dry[0] = pass
117 ctr__dry[1] = ttl
118 let rc__dry: i64 = gv_verdict("NOFLOAT-QWEN-GEN-GATE" as *u8, ctr__dry, "greedy multi-token generation through the sovereign no-float Qwen -- first token faithful to the float reference)" as *u8)
119 sys_exit(rc__dry)
120 return rc__dry
121}