code wiki / (root) / nx_arousal_profile_gate.nx

nx_arousal_profile_gate.nx source

↩ module page · 127 lines · 7169 B

1// nx_arousal_profile_gate.nx -- liar-killed GATE for the dual-control profile estimator. 2// 3// The load-bearing teeth are the two REFUSALS, not the recovery: 4// - SES and SIS1 must ALWAYS report UNIDENTIFIABLE. They both scale with stimulus, so 5// stimulus-response data can only recover their DIFFERENCE; emitting a number for either would 6// be inventing one. This is structural, not a sampling limit -- more sessions cannot fix it. 7// - a negative SIS2 is an impossible inhibition magnitude and means the observations do not lie on 8// the model's line. Refuse the fit rather than hand a downstream readout a corrupt profile to 9// diagnose from. 10// Recovery itself is checked on two DIFFERENT synthetic profiles so a constant-returning estimator 11// cannot pass. 12// 13// Tooth total is DERIVED; G_MIN_TEETH is a floor so a deleted tooth trips RED. 14// license_tier: ORIGINAL expect_exit: 0 15import "nx_syscalls.nx" 16 17const G_OUTCAP: i64 = 8192 18const G_MIN_TEETH: i64 = 14 19 20func g_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 g_putn(v: i64) -> i64 { 22 if v == 0 { sys_write(1, "0" as *u8, 1); return 0 } 23 var m: i64 = v 24 let d: *u8 = sys_mmap(24); var k: i64 = 0 25 while m > 0 { d[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } 26 let o: *u8 = sys_mmap(24); var w: i64 = 0 27 while w < k { o[w] = d[k-1-w]; w = w + 1 } 28 sys_write(1, o, k) 29 sys_munmap(d, 24); sys_munmap(o, 24) 30 return 0 31} 32func g_slen(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n } 33func g_bool(name: *u8, got: i64, want: i64, passp: *i64) -> i64 { 34 passp[1] = passp[1] + 1 35 g_puts("T " as *u8); g_puts(name); g_puts(" got=" as *u8); g_putn(got) 36 if got == want { g_puts(" PASS\n" as *u8); passp[0] = passp[0] + 1 } else { g_puts(" FAIL\n" as *u8) } 37 return 0 38} 39func g_has(hay: *u8, hn: i64, needle: *u8) -> i64 { 40 let nl: i64 = g_slen(needle) 41 if nl == 0 { return 0 } 42 var i: i64 = 0 43 while i + nl <= hn { var k: i64 = 0; var ok: i64 = 1; while k < nl { if hay[i+k] != needle[k] { ok = 0; k = nl } k = k + 1 } if ok == 1 { return 1 } i = i + 1 } 44 return 0 45} 46func g_run(elf: *u8, a1: *u8, a2: *u8, a3: *u8, a4: *u8, a5: *u8, out: *u8, cap: i64) -> i64 { 47 let pb: *i64 = sys_mmap(16) as *i64 48 sys_pipe2(pb, 0) 49 let rfd: i64 = pb[0] & 0xFFFFFFFF 50 let wfd: i64 = (pb[0] >> 32) & 0xFFFFFFFF 51 let pid: i64 = sys_fork() 52 if pid == 0 { 53 sys_dup3(wfd, 1, 0) 54 sys_close(rfd); sys_close(wfd) 55 let av: *i64 = sys_mmap(80) as *i64 56 av[0] = elf as i64 57 var ac: i64 = 1 58 if a1 as i64 != 0 { av[ac] = a1 as i64; ac = ac + 1 } 59 if a2 as i64 != 0 { av[ac] = a2 as i64; ac = ac + 1 } 60 if a3 as i64 != 0 { av[ac] = a3 as i64; ac = ac + 1 } 61 if a4 as i64 != 0 { av[ac] = a4 as i64; ac = ac + 1 } 62 if a5 as i64 != 0 { av[ac] = a5 as i64; ac = ac + 1 } 63 av[ac] = 0 64 sys_execve(elf, av, 0 as *i64) 65 sys_exit(127) 66 } 67 sys_close(wfd) 68 var tot: i64 = 0 69 var n: i64 = sys_read(rfd, out, cap - 1) 70 while n > 0 { tot = tot + n; if tot >= cap - 1 { n = 0 } else { n = sys_read(rfd, (out as i64 + tot) as *u8, cap - 1 - tot) } } 71 sys_close(rfd) 72 let st: *i64 = sys_mmap(16) as *i64 73 sys_wait4(pid, st, 0) 74 out[tot] = 0 as u8 75 return tot 76} 77 78func main(argc: i64, argv: *i64) -> i64 { 79 var elf: *u8 = "_build/nx_arousal_profile.sov.elf" as *u8 80 if argc >= 2 { elf = argv[1] as *u8 } 81 let pass: *i64 = sys_mmap(16) as *i64 82 pass[0] = 0 83 pass[1] = 0 84 let out: *u8 = sys_mmap(G_OUTCAP) 85 var n: i64 = 0 86 87 // ---- EXACT recovery on synthetic truth (net=200, sis2=50) ---------------------------------- 88 n = g_run(elf, "fit" as *u8, "900" as *u8, "130" as *u8, "500" as *u8, "50" as *u8, out, G_OUTCAP) 89 g_bool("recovers-net-200" as *u8, g_has(out, n, "net_ses_minus_sis1=200" as *u8), 1, pass) 90 g_bool("recovers-sis2-50" as *u8, g_has(out, n, "sis2=50" as *u8), 1, pass) 91 g_bool("verdict-net-excitatory" as *u8, g_has(out, n, "verdict=NET_EXCITATORY" as *u8), 1, pass) 92 93 // ---- THE IDENTIFIABILITY REFUSAL ----------------------------------------------------------- 94 g_bool("ses-reported-unidentifiable" as *u8, g_has(out, n, "ses=UNIDENTIFIABLE" as *u8), 1, pass) 95 g_bool("sis1-reported-unidentifiable" as *u8, g_has(out, n, "sis1=UNIDENTIFIABLE" as *u8), 1, pass) 96 // ★NEG: the confounded pair must NEVER carry a number. "ses=8" would match "ses=" followed by a 97 // digit; assert the specific truth value cannot appear. 98 g_bool("NEG-ses-never-emitted-as-a-number" as *u8, g_has(out, n, "ses=800" as *u8), 0, pass) 99 g_bool("NEG-sis1-never-emitted-as-a-number" as *u8, g_has(out, n, "sis1=600" as *u8), 0, pass) 100 101 // ---- a DIFFERENT profile must give DIFFERENT numbers (non-vacuity) ------------------------- 102 n = g_run(elf, "fit" as *u8, "800" as *u8, "300" as *u8, "400" as *u8, "100" as *u8, out, G_OUTCAP) 103 g_bool("recovers-net-500-on-second-profile" as *u8, g_has(out, n, "net_ses_minus_sis1=500" as *u8), 1, pass) 104 g_bool("recovers-sis2-100-on-second-profile" as *u8, g_has(out, n, "sis2=100" as *u8), 1, pass) 105 g_bool("NEG-estimator-is-not-constant" as *u8, g_has(out, n, "net_ses_minus_sis1=200" as *u8), 0, pass) 106 107 // ---- REFUSALS ------------------------------------------------------------------------------ 108 // observations that do not lie on the model's line produce an impossible negative SIS2 109 n = g_run(elf, "fit" as *u8, "900" as *u8, "40" as *u8, "500" as *u8, "90" as *u8, out, G_OUTCAP) 110 g_bool("refuses-negative-sis2" as *u8, g_has(out, n, "REFUSED reason=negative_sis2_model_does_not_fit" as *u8), 1, pass) 111 // two sessions at the same stimulus carry an intercept and NO slope 112 n = g_run(elf, "fit" as *u8, "900" as *u8, "130" as *u8, "900" as *u8, "130" as *u8, out, G_OUTCAP) 113 g_bool("refuses-identical-stimulus" as *u8, g_has(out, n, "REFUSED reason=identical_stimulus_no_slope" as *u8), 1, pass) 114 // a clamped session is a bound, not a measurement -- fitting through it manufactures a slope 115 n = g_run(elf, "fit" as *u8, "900" as *u8, "1000" as *u8, "500" as *u8, "400" as *u8, out, G_OUTCAP) 116 g_bool("refuses-ceiling-saturated-session" as *u8, g_has(out, n, "REFUSED reason=session1_saturated_at_ceiling" as *u8), 1, pass) 117 n = g_run(elf, "fit" as *u8, "900" as *u8, "130" as *u8, "500" as *u8, "0" as *u8, out, G_OUTCAP) 118 g_bool("refuses-floor-saturated-session" as *u8, g_has(out, n, "REFUSED reason=session2_saturated_at_floor" as *u8), 1, pass) 119 n = g_run(elf, "fit" as *u8, "5000" as *u8, "130" as *u8, "500" as *u8, "50" as *u8, out, G_OUTCAP) 120 g_bool("refuses-stim-out-of-range" as *u8, g_has(out, n, "REFUSED reason=stim_out_of_range" as *u8), 1, pass) 121 122 g_puts("AROUSAL-PROFILE-GATE pass=" as *u8); g_putn(pass[0]); g_puts("/" as *u8); g_putn(pass[1]); g_puts(" verdict=" as *u8) 123 if pass[1] < G_MIN_TEETH { g_puts("RED reason=teeth_deleted\n" as *u8); return 1 } 124 if pass[0] == pass[1] { g_puts("GREEN\n" as *u8); return 0 } 125 g_puts("RED\n" as *u8) 126 return 1 127}