code wiki / (root) / nx_gguf_meta_test.nx

nx_gguf_meta_test.nx source

↩ module page · 159 lines · 6603 B

1// nx_gguf_meta_test.nx -- smoke for nx_gguf_meta.nx. 2// 3// Builds a synthetic GGUF with 4 metadata entries: 4// "n_layers" U32 -> 32 5// "rope_base" F32 -> 10000.0 6// "arch" STRING -> "llama" 7// "vocab" ARRAY of U32 with 3 elements -> [100, 200, 300] 8// 9// Verifies: 10// - find returns OK with correct value_off + type for each 11// - typed readers produce expected values 12// - missing key returns NOT_FOUND 13// - array helpers expose inner_type + count + first_elt_off 14// - array element walk via array_advance produces correct values 15 16import "nx_syscalls.nx" 17import "nx_tier.nx" 18import "nx_le.nx" 19import "nx_gguf.nx" 20import "nx_gguf_meta.nx" 21 22func _byte_equal(a: *u8, b: *u8, n: nx_int) -> nx_int { 23 var i: nx_int = 0 24 while i < n { 25 if a[i] != b[i] { return 0 } 26 i = i + 1 27 } 28 return 1 29} 30 31func main() -> i64 { 32 // ----- Verdict gate ----- 33 var vi: nx_int = 0 34 while vi < NX_GMETA_N_VERDICTS { 35 if nx_gmeta_verdict_is_valid(vi) != 1 { return 5 + vi } 36 vi = vi + 1 37 } 38 39 let buf: *u8 = sys_mmap(1024) 40 buf[0]=0x47; buf[1]=0x47; buf[2]=0x55; buf[3]=0x46 41 buf[4]=3 42 nx_le_write_u64(buf, 8, 0) // 0 tensors (we only test metadata) 43 nx_le_write_u64(buf, 16, 4) // 4 metadata entries 44 45 // ----- Build metadata section starting at byte 24 ----- 46 var p: i64 = 24 47 48 // Entry 1: "n_layers" (8 bytes) U32 = 32 49 nx_le_write_u64(buf, p, 8); p = p + 8 50 buf[p+0]=0x6e; buf[p+1]=0x5f; buf[p+2]=0x6c; buf[p+3]=0x61 51 buf[p+4]=0x79; buf[p+5]=0x65; buf[p+6]=0x72; buf[p+7]=0x73 52 p = p + 8 53 nx_le_write_u32(buf, p, NX_GGUF_TYPE_UINT32); p = p + 4 54 nx_le_write_u32(buf, p, 32); p = p + 4 55 56 // Entry 2: "rope_base" (9 bytes) F32 = 10000.0 = 0x461C4000 57 nx_le_write_u64(buf, p, 9); p = p + 8 58 buf[p+0]=0x72; buf[p+1]=0x6f; buf[p+2]=0x70; buf[p+3]=0x65 59 buf[p+4]=0x5f; buf[p+5]=0x62; buf[p+6]=0x61; buf[p+7]=0x73 60 buf[p+8]=0x65 61 p = p + 9 62 nx_le_write_u32(buf, p, NX_GGUF_TYPE_FLOAT32); p = p + 4 63 nx_le_write_u32(buf, p, 0x461C4000); p = p + 4 64 65 // Entry 3: "arch" (4 bytes) STRING = "llama" (5 bytes) 66 nx_le_write_u64(buf, p, 4); p = p + 8 67 buf[p+0]=0x61; buf[p+1]=0x72; buf[p+2]=0x63; buf[p+3]=0x68 68 p = p + 4 69 nx_le_write_u32(buf, p, NX_GGUF_TYPE_STRING); p = p + 4 70 nx_le_write_u64(buf, p, 5); p = p + 8 71 buf[p+0]=0x6c; buf[p+1]=0x6c; buf[p+2]=0x61; buf[p+3]=0x6d 72 buf[p+4]=0x61 73 p = p + 5 74 75 // Entry 4: "vocab" (5 bytes) ARRAY-of-U32 count=3 [100, 200, 300] 76 nx_le_write_u64(buf, p, 5); p = p + 8 77 buf[p+0]=0x76; buf[p+1]=0x6f; buf[p+2]=0x63; buf[p+3]=0x61; buf[p+4]=0x62 78 p = p + 5 79 nx_le_write_u32(buf, p, NX_GGUF_TYPE_ARRAY); p = p + 4 80 nx_le_write_u32(buf, p, NX_GGUF_TYPE_UINT32); p = p + 4 // inner type 81 nx_le_write_u64(buf, p, 3); p = p + 8 // count 82 nx_le_write_u32(buf, p, 100); p = p + 4 83 nx_le_write_u32(buf, p, 200); p = p + 4 84 nx_le_write_u32(buf, p, 300); p = p + 4 85 86 // ----- Parse header (will skip metadata) ----- 87 let hdr: *NxGgufHeader = sys_mmap(NX_GGUF_HDR_BYTES) as *NxGgufHeader 88 let v_p: nx_int = nx_gguf_parse(buf, 1024, hdr) 89 if v_p != NX_GGUF_OK { return 20 + v_p } 90 if hdr.metadata_count != 4 { return 30 } 91 92 // ----- Find + read "n_layers" ----- 93 let key1: *u8 = sys_mmap(8) 94 key1[0]=0x6e; key1[1]=0x5f; key1[2]=0x6c; key1[3]=0x61 95 key1[4]=0x79; key1[5]=0x65; key1[6]=0x72; key1[7]=0x73 96 let voff: *i64 = sys_mmap(8) as *i64 97 let vty: *i64 = sys_mmap(8) as *i64 98 let v_f1: nx_int = nx_gguf_meta_find(buf, 1024, hdr, key1, 8, voff, vty) 99 if v_f1 != NX_GMETA_OK { return 40 } 100 if vty[0] != NX_GGUF_TYPE_UINT32 { return 41 } 101 if nx_gguf_meta_read_u32(buf, voff[0]) != 32 { return 42 } 102 103 // ----- Find + read "rope_base" ----- 104 let key2: *u8 = sys_mmap(9) 105 key2[0]=0x72; key2[1]=0x6f; key2[2]=0x70; key2[3]=0x65 106 key2[4]=0x5f; key2[5]=0x62; key2[6]=0x61; key2[7]=0x73 107 key2[8]=0x65 108 let v_f2: nx_int = nx_gguf_meta_find(buf, 1024, hdr, key2, 9, voff, vty) 109 if v_f2 != NX_GMETA_OK { return 50 } 110 if vty[0] != NX_GGUF_TYPE_FLOAT32 { return 51 } 111 // 10000.0 in Q10: f32 0x461C4000 has sign=0, exp=140-127=13, mantissa<<. 112 // Per our _gguf_f32_to_q10: 113 // m = 0x1C4000; m_q10 = m >> 13 = 0xE2 = 226 114 // base = 1024 + 226 = 1250 115 // result = 1250 << 13 = 10240000 116 if nx_gguf_meta_read_f32_q10(buf, voff[0]) != 10240000 { return 52 } 117 118 // ----- Find + read "arch" string ----- 119 let key3: *u8 = sys_mmap(4) 120 key3[0]=0x61; key3[1]=0x72; key3[2]=0x63; key3[3]=0x68 121 let v_f3: nx_int = nx_gguf_meta_find(buf, 1024, hdr, key3, 4, voff, vty) 122 if v_f3 != NX_GMETA_OK { return 60 } 123 if vty[0] != NX_GGUF_TYPE_STRING { return 61 } 124 if nx_gguf_meta_read_string_len(buf, voff[0]) != 5 { return 62 } 125 let s_ptr: *u8 = nx_gguf_meta_read_string_ptr(buf, voff[0]) 126 let exp_llama: *u8 = sys_mmap(5) 127 exp_llama[0]=0x6c; exp_llama[1]=0x6c; exp_llama[2]=0x61 128 exp_llama[3]=0x6d; exp_llama[4]=0x61 129 if _byte_equal(s_ptr, exp_llama, 5) != 1 { return 63 } 130 131 // ----- Find + read "vocab" array ----- 132 let key4: *u8 = sys_mmap(5) 133 key4[0]=0x76; key4[1]=0x6f; key4[2]=0x63; key4[3]=0x61; key4[4]=0x62 134 let v_f4: nx_int = nx_gguf_meta_find(buf, 1024, hdr, key4, 5, voff, vty) 135 if v_f4 != NX_GMETA_OK { return 70 } 136 if vty[0] != NX_GGUF_TYPE_ARRAY { return 71 } 137 if nx_gguf_meta_array_inner_type(buf, voff[0]) != NX_GGUF_TYPE_UINT32 { return 72 } 138 if nx_gguf_meta_array_count(buf, voff[0]) != 3 { return 73 } 139 let first_off: i64 = nx_gguf_meta_array_first_elt_off(buf, voff[0]) 140 if nx_gguf_meta_read_u32(buf, first_off + 0) != 100 { return 74 } 141 if nx_gguf_meta_read_u32(buf, first_off + 4) != 200 { return 75 } 142 if nx_gguf_meta_read_u32(buf, first_off + 8) != 300 { return 76 } 143 144 // Walk via array_advance (should also reach the same offsets). 145 var advanced: i64 = first_off 146 advanced = nx_gguf_meta_array_advance(buf, 1024, advanced, NX_GGUF_TYPE_UINT32) 147 if advanced != first_off + 4 { return 77 } 148 advanced = nx_gguf_meta_array_advance(buf, 1024, advanced, NX_GGUF_TYPE_UINT32) 149 if advanced != first_off + 8 { return 78 } 150 151 // ----- Negative: missing key ----- 152 let key_miss: *u8 = sys_mmap(7) 153 key_miss[0]=0x6d; key_miss[1]=0x69; key_miss[2]=0x73; key_miss[3]=0x73 154 key_miss[4]=0x69; key_miss[5]=0x6e; key_miss[6]=0x67 155 let v_fm: nx_int = nx_gguf_meta_find(buf, 1024, hdr, key_miss, 7, voff, vty) 156 if v_fm != NX_GMETA_NOT_FOUND { return 80 } 157 158 return 0 159}