nx_nofloat_qwen_rope_h2h_gate.nx source
↩ module page · 78 lines · 4355 B
1// nx_nofloat_qwen_rope_h2h_gate.nx -- ARCH H2H: the library's no-float Q16 RoPE vs the reference f32 RoPE.
2// Same head-dim-64 vector + position + base(1e6) through the lib's rope_apply/rope_freqs (fixed-point) AND the
3// reference nx_f32_rope_apply_vector (IEEE f32) -- proving same interleaved convention + theta. Library logic
4// from nx_nofloat_llm.nx (DRY). expect_exit: 0 license_tier: ORIGINAL
5import "nx_syscalls.nx"
6import "nx_tier.nx"
7import "nx_le.nx"
8import "nx_tensor.nx"
9import "nx_gguf.nx"
10import "nx_gguf_load.nx"
11import "nx_nofloat_llm.nx"
12import "nx_f32.nx"
13import "nx_f32_div.nx"
14import "nx_f32_cvt.nx"
15import "nx_f32_rope.nx"
16import "nx_gate_verdict.nx"
17
18func rh_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 rh_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 rh_absd(a: i64, b: i64) -> i64 { if a>b { return a-b } return b-a }
21
22func main() -> i64 {
23 rh_puts("ARCH H2H: library Q16 RoPE vs reference f32 nx_f32_rope_apply_vector (head_dim=64, base 1e6, pos 3)\n\n" as *u8)
24 let hd: i64=64
25 let pos: i64=3
26 let F65536: i64 = nx_i32_to_f32(65536)
27 let log_base: i64 = nx_f32_div(nx_i32_to_f32(905421), nx_i32_to_f32(65536)) // ln(1e6) == lib LN_BASE_Q16/65536
28
29 let vq16: *i64 = sys_mmap(hd*8) as *i64
30 let vf32: *i64 = sys_mmap(hd*8) as *i64
31 let vq16b: *i64 = sys_mmap(hd*8) as *i64
32 var k: i64=0
33 while k<hd { let val: i64=((k%7)-3)*20000; vq16[k]=val; vq16b[k]=val; vf32[k]=nx_f32_div(nx_i32_to_f32(val), F65536); k=k+1 }
34
35 // lib Q16 rope
36 let freqs: *i64 = sys_mmap((hd/2)*8) as *i64
37 rope_freqs(freqs, hd)
38 rope_apply(vq16, hd, pos, freqs)
39 rope_apply(vq16b, hd, pos, freqs)
40 // reference f32 rope -- NEOX pairing (Qwen2.5 GGUF = LLAMA_ROPE_TYPE_NEOX), matching the lib's rope_apply (fixed 2026-07-09)
41 nx_f32_rope_apply_vector_neox(vf32, hd, pos, log_base)
42
43 var agree: i64=0
44 var maxdiff: i64=0
45 var changed: i64=0
46 var detmis: i64=0
47 k=0
48 while k<hd {
49 let ref_q16: i64 = __f32_to_i64(nx_f32_mul(vf32[k], F65536))
50 let dd: i64 = rh_absd(vq16[k], ref_q16)
51 if dd>maxdiff { maxdiff=dd }
52 var mag: i64=vq16[k]; if mag<0 { mag=0-mag }
53 if dd <= (mag/32 + 400) { agree=agree+1 }
54 if vq16[k] != (((k%7)-3)*20000) { changed=changed+1 }
55 if vq16[k] != vq16b[k] { detmis=detmis+1 }
56 k=k+1
57 }
58
59 rh_puts(" dim0: mine="); rh_num(vq16[0]); rh_puts(" ref="); rh_num(__f32_to_i64(nx_f32_mul(vf32[0], F65536))); rh_puts(" agreement="); rh_num(agree); rh_puts("/"); rh_num(hd); rh_puts(" max abs diff="); rh_num(maxdiff); rh_puts(" rotated="); rh_num(changed); rh_puts("\n\n");
60
61 var pass: i64=0
62 var ttl: i64=0
63 ttl=ttl+1; rh_puts(" T1 both ropes ran on the identical vector (RoPE actually rotated it): "); if changed>0 { pass=pass+1; rh_puts("PASS\n") } else { rh_puts("FAIL\n") }
64 ttl=ttl+1; rh_puts(" T2 library Q16 RoPE AGREES with the reference f32 RoPE across all 64 dims: "); if agree==hd { pass=pass+1; rh_puts("PASS\n") } else { rh_puts("FAIL\n") }
65 ttl=ttl+1; rh_puts(" T3 close match: max abs diff small (< 1500 Q16-ulps -- same convention + theta): "); if maxdiff < 1500 { pass=pass+1; rh_puts("PASS\n") } else { rh_puts("FAIL\n") }
66 ttl=ttl+1; rh_puts(" T4 the library RoPE is deterministic (re-run bit-identical): "); if detmis==0 { pass=pass+1; rh_puts("PASS\n") } else { rh_puts("FAIL\n") }
67
68 rh_puts("NX-NOFLOAT-QWEN-ROPE-H2H-GATE passed "); rh_num(pass); rh_puts("/"); rh_num(ttl)
69 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check
70 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled
71 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify.
72 let ctr__dry: *i64 = gv_ctr()
73 ctr__dry[0] = pass
74 ctr__dry[1] = ttl
75 let rc__dry: i64 = gv_verdict("NOFLOAT-QWEN-ROPE-H2H-GATE" as *u8, ctr__dry, "library no-float RoPE matches the reference f32 RoPE -- same convention + theta)" as *u8)
76 sys_exit(rc__dry)
77 return rc__dry
78}