code wiki / _hdl_build / nx_dr_semjudge_cli.nx
nx_dr_semjudge_cli.nx source
↩ module page · 77 lines · 4425 B
1// nx_dr_semjudge_cli.nx -- judge insights against a document BOTH ways, side by side (DR-10).
2// Shows exactly where the semantic tier beats the lexical one: for every insight it reports
3// the lexical containment score, the PPMI semantic maxsim score, and whether lexical MISSED a
4// match the semantic judge found (lexical 0, semantic > 0). Useful for calibrating the judge
5// threshold and for auditing why a source was or was not credited.
6// nx_dr_semjudge <document_text> <insight_1> [insight_2 ...]
7// e.g. nx_dr_semjudge "the team defeated their rivals" "won"
8// -> {"insights":[{"lexical_permil":0,"semantic_permil":86,"lexical_missed":1}]}
9// ⚠The PPMI model is a count model over QA-benchmark prose; specialist terms are OOV and
10// score 0. Honest tiering: this is not a neural cross-encoder.
11// license_tier: ORIGINAL No hw writes (Rule 26). expect_exit: 0
12import "nx_dr_semjudge.nx"
13import "nx_itoa_lib.nx" // shared MSB-first emitter (zero-alloc)
14import "nx_dr_run.nx"
15import "nx_dr_verify.nx"
16import "nx_syscalls.nx"
17const K_MAGIC_16384: i64 = 16384
18const K_MAGIC_1024: i64 = 1024
19
20func sg_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
21func sg_q() -> i64 { let b: *u8 = sys_mmap(1); b[0] = 34 as u8; sys_write(1, b, 1); return 0 }
22func sg_key(name: *u8) -> i64 { sg_q(); sg_puts(name); sg_q(); sg_puts(":" as *u8); return 0 }
23// MIGRATED to the shared emitter (debt 1785563586). The old body mmapped a scratch buffer
24// per call and never freed it. At PAGE granularity that is 4096B leaked PER CALL -- the
25// defect that took 28.5GB of a 36GB host in nx_ts_lumadiff (2MB input, ~3.66M calls).
26// nxi_* is MSB-first, allocates NOTHING, and emits identical bytes including the sign.
27func sg_num(v: i64) -> i64 { nxi_out(v); return 0 }
28
29func main(argc: i64, argv: *i64) -> i64 {
30 if argc < 3 { sg_puts("{" as *u8); sg_key("error" as *u8); sg_q(); sg_puts("usage: nx_dr_semjudge <document> <insight>..." as *u8); sg_q(); sg_puts("}\n" as *u8); sys_exit(2); return 2 }
31
32 let g: *i64 = sys_mmap(128 * 8) as *i64
33 if sj_load(g) == 0 { sg_puts("{" as *u8); sg_key("error" as *u8); sg_q(); sg_puts("semppmi_v1.bin load failed (model must be at knowledge/index/)" as *u8); sg_q(); sg_puts("}\n" as *u8); sys_exit(1); return 1 }
34
35 let doc: *u8 = argv[1] as *u8
36 let dlen: i64 = drr_strlen(doc)
37 let lex_doc: *i64 = sys_mmap(K_MAGIC_16384 * 8) as *i64
38 let nld: i64 = drr_tokenize(doc, dlen, lex_doc, K_MAGIC_16384)
39 let sem_doc: *i64 = sys_mmap(K_MAGIC_16384 * 8) as *i64
40 let nsd: i64 = sj_tokenize_ids(g, doc, dlen, sem_doc, K_MAGIC_16384)
41
42 let n: i64 = argc - 2
43 var missed: i64 = 0
44 var k: i64 = 0
45
46 sg_puts("{" as *u8)
47 sg_key("tool" as *u8); sg_q(); sg_puts("nx_dr_semjudge" as *u8); sg_q(); sg_puts("," as *u8)
48 sg_key("vocab" as *u8); sg_num(g[71]); sg_puts("," as *u8)
49 sg_key("document_tokens" as *u8); sg_num(nsd); sg_puts("," as *u8)
50 sg_key("n_insights" as *u8); sg_num(n); sg_puts("," as *u8)
51 sg_key("insights" as *u8); sg_puts("[" as *u8)
52 while k < n {
53 if k > 0 { sg_puts("," as *u8) }
54 let s: *u8 = argv[2 + k] as *u8
55 let slen: i64 = drr_strlen(s)
56 let li: *i64 = sys_mmap(K_MAGIC_1024 * 8) as *i64
57 let nli: i64 = drr_tokenize(s, slen, li, K_MAGIC_1024)
58 let lex: i64 = dv_entail(li, nli, lex_doc, nld)
59 let si: *i64 = sys_mmap(K_MAGIC_1024 * 8) as *i64
60 let nsi: i64 = sj_tokenize_ids(g, s, slen, si, K_MAGIC_1024)
61 let sem: i64 = sj_maxsim(g, si, nsi, sem_doc, nsd)
62 var miss: i64 = 0
63 if lex == 0 { if sem > 0 { miss = 1; missed = missed + 1 } }
64 sg_puts("{" as *u8)
65 sg_key("idx" as *u8); sg_num(k); sg_puts("," as *u8)
66 sg_key("lexical_permil" as *u8); sg_num(lex); sg_puts("," as *u8)
67 sg_key("semantic_permil" as *u8); sg_num(sem); sg_puts("," as *u8)
68 sg_key("lexical_missed" as *u8); sg_num(miss)
69 sg_puts("}" as *u8)
70 k = k + 1
71 }
72 sg_puts("]," as *u8)
73 sg_key("lexical_missed_count" as *u8); sg_num(missed); sg_puts("," as *u8)
74 sg_key("note" as *u8); sg_q(); sg_puts("lexical=djb2 token containment; semantic=PPMI late-interaction maxsim over the real 102318-word count model; OOV terms score 0 (domain-bounded, not a neural cross-encoder)" as *u8); sg_q()
75 sg_puts("}\n" as *u8)
76 sys_exit(0); return 0
77}