code wiki / (root) / nx_facet_gate.nx

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}