code wiki / (root) / nx_nofloat_qwen_rope_h2h_gate.nx

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}