nx_facet_gate.nx source
↩ module page · 114 lines · 4403 B
1// nx_facet_gate.nx -- SREACH R2 GATE: the bits-up facet classifier vs the
2// verified gold facets, at a permil bar.
3//
4// module: nishi-core.search.bench.facet_gate
5// depends: nx_diora_data.nx (gold qrels), nx_facet_classify.nx
6// capability: GATE
7//
8// WHY: R2 retires the oracle-from-gold facet labels. This gate is the proof:
9// run nx_facet_classify over every gold doc, measure agreement as a permil,
10// print every disagreement (url, gold, got) so a miss is a named defect, and
11// write ONE machine-readable verdict row to a durable log the Examiner can
12// grade. exit 0 iff permil >= bar.
13//
14// Bar rationale (Rule #11): 900 permil = at most 4 of the 45 verified docs may
15// disagree. Facets feed ONLY the ranking diversity bonus (0.5 gain one-time),
16// so a single mislabel shifts at most one slot -- 900 keeps the policy honest
17// without demanding the classifier memorize the gold (which would re-create
18// the leak this rung removes).
19
20import "nx_diora_data.nx"
21import "nx_facet_classify.nx"
22
23const NX_FACET_GATE_BAR_PERMIL: i64 = 900
24
25func fg_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
26func fg_putn(v: i64) -> i64 {
27 let b: *u8 = sys_mmap(28)
28 let t: *u8 = sys_mmap(28)
29 var m: i64 = v
30 if m < 0 { m = 0 - m; sys_write(1, "-" as *u8, 1) }
31 var k: i64 = 0
32 if m == 0 { t[0] = 48; k = 1 }
33 while m > 0 { t[k] = 48 + (m % 10); m = m / 10; k = k + 1 }
34 var i: i64 = 0
35 while i < k { b[i] = t[k - 1 - i]; i = i + 1 }
36 sys_write(1, b, k)
37 return 0
38}
39func fg_fputs(fd: i64, s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(fd, s, n); return 0 }
40func fg_fputn(fd: i64, v: i64) -> i64 {
41 let b: *u8 = sys_mmap(28)
42 let t: *u8 = sys_mmap(28)
43 var m: i64 = v
44 if m < 0 { m = 0 - m }
45 var k: i64 = 0
46 if m == 0 { t[0] = 48; k = 1 }
47 while m > 0 { t[k] = 48 + (m % 10); m = m / 10; k = k + 1 }
48 var i: i64 = 0
49 while i < k { b[i] = t[k - 1 - i]; i = i + 1 }
50 sys_write(fd, b, k)
51 return 0
52}
53
54func fg_facet_name(f: i64) -> *u8 {
55 if f == 0 { return "IDENTITY" }
56 if f == 1 { return "WORKS" }
57 if f == 2 { return "OFFICIAL_MEDIA" }
58 if f == 3 { return "INTERVIEWS" }
59 if f == 4 { return "PRESS" }
60 if f == 5 { return "SELF_SOCIAL" }
61 if f == 6 { return "LONGTAIL" }
62 return "?"
63}
64
65func main() -> i64 {
66 fg_puts("=== FACET GATE (SREACH R2): bits-up classifier vs verified gold facets ===\n" as *u8)
67 let qn: i64 = nx_diora_qn()
68 let qurl: **u8 = sys_mmap(qn * 8) as **u8
69 let qtit: **u8 = sys_mmap(qn * 8) as **u8
70 let qfac: *i64 = sys_mmap(qn * 8) as *i64
71 let qgrd: *i64 = sys_mmap(qn * 8) as *i64
72 let qpri: *i64 = sys_mmap(qn * 8) as *i64
73 nx_diora_fill_qrels(qurl, qtit, qfac, qgrd, qpri)
74
75 var agree: i64 = 0
76 var i: i64 = 0
77 while i < qn {
78 let got: i64 = nx_facet_classify(qurl[i], qtit[i])
79 if got == qfac[i] {
80 agree = agree + 1
81 } else {
82 fg_puts(" MISMATCH " as *u8); fg_puts(qurl[i])
83 fg_puts("\n gold=" as *u8); fg_puts(fg_facet_name(qfac[i]))
84 fg_puts(" got=" as *u8); fg_puts(fg_facet_name(got)); fg_puts("\n" as *u8)
85 }
86 i = i + 1
87 }
88
89 let permil: i64 = (agree * 1000) / qn
90 fg_puts(" agreement: " as *u8); fg_putn(agree); fg_puts("/" as *u8); fg_putn(qn)
91 fg_puts(" permil=" as *u8); fg_putn(permil)
92 fg_puts(" bar=" as *u8); fg_putn(NX_FACET_GATE_BAR_PERMIL); fg_puts("\n" as *u8)
93
94 // durable machine row (Examiner-gradable, reboot-safe)
95 let lfd: i64 = sys_openat_append("knowledge/status/search_facets.log" as *u8, 0x1a4)
96 if lfd >= 0 {
97 fg_fputs(lfd, "FACET-GATE epoch=" as *u8); fg_fputn(lfd, sys_now_realtime_sec())
98 fg_fputs(lfd, " agree=" as *u8); fg_fputn(lfd, agree)
99 fg_fputs(lfd, "/" as *u8); fg_fputn(lfd, qn)
100 fg_fputs(lfd, " permil=" as *u8); fg_fputn(lfd, permil)
101 fg_fputs(lfd, " bar=" as *u8); fg_fputn(lfd, NX_FACET_GATE_BAR_PERMIL)
102 if permil >= NX_FACET_GATE_BAR_PERMIL { fg_fputs(lfd, " verdict=PASS\n" as *u8) } else { fg_fputs(lfd, " verdict=FAIL\n" as *u8) }
103 sys_close(lfd)
104 }
105
106 if permil >= NX_FACET_GATE_BAR_PERMIL {
107 fg_puts(" FACET-GATE: PASS\n" as *u8)
108 sys_exit(0)
109 return 0
110 }
111 fg_puts(" FACET-GATE: FAIL\n" as *u8)
112 sys_exit(1)
113 return 1
114}