code wiki / _hdl_build / nx_dr_semjudge_x_cli.nx

nx_dr_semjudge_x_cli.nx source

↩ module page · 91 lines · 4987 B

1// nx_dr_semjudge_x_cli.nx -- A/B semantic judge: same code, ANY PPMI model (DR-11). 2// The judge's measured ceiling is out-of-vocabulary terms: a model built over QA-benchmark 3// prose does not know enterprise-research vocabulary, so those terms score 0. To test whether 4// a domain-augmented model lifts that ceiling you must hold the CODE constant and vary only 5// the MODEL -- which a hardcoded model path made impossible. This CLI takes the model as an 6// argument and reports OOV coverage alongside the scores, so the comparison is auditable. 7// nx_dr_semjudge_x <model.bin> <document> <insight_1> [insight_2 ...] 8// Built on the shared nx_ppmi_lib (eats half of debt seq283 -- one loader, not two). 9// license_tier: ORIGINAL No hw writes (Rule 26). expect_exit: 0 10import "nx_ppmi_lib.nx" 11import "nx_itoa_lib.nx" // shared MSB-first emitter (zero-alloc) 12import "nx_dr_run.nx" 13import "nx_dr_verify.nx" 14import "nx_syscalls.nx" 15const K_MAGIC_16384: i64 = 16384 16const K_MAGIC_2048: i64 = 2048 17 18func sx_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 sx_q() -> i64 { let b: *u8 = sys_mmap(1); b[0] = 34 as u8; sys_write(1, b, 1); return 0 } 20func sx_key(name: *u8) -> i64 { sx_q(); sx_puts(name); sx_q(); sx_puts(":" as *u8); return 0 } 21// MIGRATED to the shared emitter (debt 1785563586). The old body mmapped a scratch buffer 22// per call and never freed it. At PAGE granularity that is 4096B leaked PER CALL -- the 23// defect that took 28.5GB of a 36GB host in nx_ts_lumadiff (2MB input, ~3.66M calls). 24// nxi_* is MSB-first, allocates NOTHING, and emits identical bytes including the sign. 25func sx_num(v: i64) -> i64 { nxi_out(v); return 0 } 26// how many of the first n ids are in-vocabulary (>=0)? 27func sx_invocab(ids: *i64, n: i64) -> i64 { 28 var c: i64 = 0; var i: i64 = 0 29 while i < n { if ids[i] >= 0 { c = c + 1 } i = i + 1 } 30 return c 31} 32 33func main(argc: i64, argv: *i64) -> i64 { 34 if argc < 4 { sx_puts("{" as *u8); sx_key("error" as *u8); sx_q(); sx_puts("usage: nx_dr_semjudge_x <model.bin> <document> <insight>..." as *u8); sx_q(); sx_puts("}\n" as *u8); sys_exit(2); return 2 } 35 let model: *u8 = argv[1] as *u8 36 let g: *i64 = sys_mmap(128 * 8) as *i64 37 if ppl_load(g, model) == 0 { sx_puts("{" as *u8); sx_key("error" as *u8); sx_q(); sx_puts("model load failed" as *u8); sx_q(); sx_puts("}\n" as *u8); sys_exit(1); return 1 } 38 39 let doc: *u8 = argv[2] as *u8 40 let dlen: i64 = drr_strlen(doc) 41 let lex_doc: *i64 = sys_mmap(K_MAGIC_16384 * 8) as *i64 42 let nld: i64 = drr_tokenize(doc, dlen, lex_doc, K_MAGIC_16384) 43 let sem_doc: *i64 = sys_mmap(K_MAGIC_16384 * 8) as *i64 44 let nsd: i64 = ppl_tokenize_ids(g, doc, dlen, sem_doc, K_MAGIC_16384) 45 let doc_iv: i64 = sx_invocab(sem_doc, nsd) 46 47 let n: i64 = argc - 3 48 var k: i64 = 0 49 var tot_terms: i64 = 0 50 var tot_iv: i64 = 0 51 52 sx_puts("{" as *u8) 53 sx_key("tool" as *u8); sx_q(); sx_puts("nx_dr_semjudge_x" as *u8); sx_q(); sx_puts("," as *u8) 54 sx_key("vocab" as *u8); sx_num(g[71]); sx_puts("," as *u8) 55 sx_key("document_tokens" as *u8); sx_num(nsd); sx_puts("," as *u8) 56 sx_key("document_in_vocab" as *u8); sx_num(doc_iv); sx_puts("," as *u8) 57 sx_key("insights" as *u8); sx_puts("[" as *u8) 58 while k < n { 59 if k > 0 { sx_puts("," as *u8) } 60 let s: *u8 = argv[3 + k] as *u8 61 let slen: i64 = drr_strlen(s) 62 let li: *i64 = sys_mmap(K_MAGIC_2048 * 8) as *i64 63 let nli: i64 = drr_tokenize(s, slen, li, K_MAGIC_2048) 64 let lex: i64 = dv_entail(li, nli, lex_doc, nld) 65 let si: *i64 = sys_mmap(K_MAGIC_2048 * 8) as *i64 66 let nsi: i64 = ppl_tokenize_ids(g, s, slen, si, K_MAGIC_2048) 67 let iv: i64 = sx_invocab(si, nsi) 68 let sem: i64 = ppl_maxsim(g, si, nsi, sem_doc, nsd) 69 let semi: i64 = ppl_maxsim_idf(g, si, nsi, sem_doc, nsd) 70 tot_terms = tot_terms + nsi 71 tot_iv = tot_iv + iv 72 sx_puts("{" as *u8) 73 sx_key("idx" as *u8); sx_num(k); sx_puts("," as *u8) 74 sx_key("terms" as *u8); sx_num(nsi); sx_puts("," as *u8) 75 sx_key("in_vocab" as *u8); sx_num(iv); sx_puts("," as *u8) 76 sx_key("lexical_permil" as *u8); sx_num(lex); sx_puts("," as *u8) 77 sx_key("semantic_permil" as *u8); sx_num(sem); sx_puts("," as *u8) 78 sx_key("semantic_idf_permil" as *u8); sx_num(semi) 79 sx_puts("}" as *u8) 80 k = k + 1 81 } 82 sx_puts("]," as *u8) 83 var covp: i64 = 0 84 if tot_terms > 0 { covp = (tot_iv * 1000) / tot_terms } 85 sx_key("insight_terms" as *u8); sx_num(tot_terms); sx_puts("," as *u8) 86 sx_key("insight_terms_in_vocab" as *u8); sx_num(tot_iv); sx_puts("," as *u8) 87 sx_key("vocab_coverage_permil" as *u8); sx_num(covp); sx_puts("," as *u8) 88 sx_key("note" as *u8); sx_q(); sx_puts("same code, model supplied as argv -- vocab_coverage is the OOV ceiling being tested" as *u8); sx_q() 89 sx_puts("}\n" as *u8) 90 sys_exit(0); return 0 91}