nx_arousal_fit_gate.nx source
↩ module page · 178 lines · 12325 B
1// nx_arousal_fit_gate.nx -- liar-killed GATE for the tau fitter.
2// The load-bearing tooth is NON-VACUITY: the fitter must recover DIFFERENT tau from DIFFERENT data.
3// A fitter that returns a constant would still show residual=0 on its own training point, so
4// "residual=0" alone proves nothing -- T4 is the tooth that actually convicts.
5//
6// Synthetic truth generated by the engine itself (nx_arousal residual <tau> ... 0 0 prints m1/m2):
7// tau= 90000 -> obs 670/987 tau=185000 -> obs 416/883
8// tau=210000 -> obs 378/850 tau=300000 -> obs 282/734
9// usage: nx_arousal_fit_gate [elf] Exit 0 on 12/12.
10// license_tier: ORIGINAL expect_exit: 0
11import "nx_syscalls.nx"
12
13const G_OUTCAP: i64 = 16384
14// Tooth total is DERIVED (g_bool counts every attempt) -- a hand-maintained total silently drifts
15// from the real tooth count on every edit. G_MIN_TEETH is a FLOOR so deleting a tooth still trips RED.
16const G_MIN_TEETH: i64 = 30
17
18func 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 }
19func g_putn(v: i64) -> i64 {
20 if v == 0 { sys_write(1, "0" as *u8, 1); return 0 }
21 var m: i64 = v
22 let d: *u8 = sys_mmap(24); var k: i64 = 0
23 while m > 0 { d[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
24 let o: *u8 = sys_mmap(24); var w: i64 = 0
25 while w < k { o[w] = d[k-1-w]; w = w + 1 }
26 sys_write(1, o, k)
27 sys_munmap(d, 24); sys_munmap(o, 24)
28 return 0
29}
30func g_slen(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n }
31// passp[0] = passes, passp[1] = attempts. Counting attempts here is what makes the total derived.
32func g_bool(name: *u8, got: i64, want: i64, passp: *i64) -> i64 {
33 passp[1] = passp[1] + 1
34 g_puts("T " as *u8); g_puts(name); g_puts(" got=" as *u8); g_putn(got)
35 if got == want { g_puts(" PASS\n" as *u8); passp[0] = passp[0] + 1 } else { g_puts(" FAIL\n" as *u8) }
36 return 0
37}
38func g_has(hay: *u8, hn: i64, needle: *u8) -> i64 {
39 let nl: i64 = g_slen(needle)
40 if nl == 0 { return 0 }
41 var i: i64 = 0
42 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 }
43 return 0
44}
45// mode 420 = 0o644. sys_openat_wr arg2 is the FILE MODE, not flags -- passing a flag word here
46// creates a non-owner-writable file whose FIRST open succeeds and every later one silently EACCESs.
47func g_write(path: *u8, s: *u8) -> i64 { let fd: i64 = sys_openat_wr(path, 420); if fd < 0 { return 0 - 1 } sys_write(fd, s, g_slen(s)); sys_close(fd); return 0 }
48func g_run(elf: *u8, a1: *u8, a2: *u8, a3: *u8, a4: *u8, a5: *u8, a6: *u8, a7: *u8, a8: *u8, out: *u8, cap: i64) -> i64 {
49 let pb: *i64 = sys_mmap(16) as *i64
50 sys_pipe2(pb, 0)
51 let rfd: i64 = pb[0] & 0xFFFFFFFF
52 let wfd: i64 = (pb[0] >> 32) & 0xFFFFFFFF
53 let pid: i64 = sys_fork()
54 if pid == 0 {
55 sys_dup3(wfd, 1, 0)
56 sys_close(rfd); sys_close(wfd)
57 let av: *i64 = sys_mmap(112) as *i64
58 av[0] = elf as i64
59 var ac: i64 = 1
60 if a1 as i64 != 0 { av[ac] = a1 as i64; ac = ac + 1 }
61 if a2 as i64 != 0 { av[ac] = a2 as i64; ac = ac + 1 }
62 if a3 as i64 != 0 { av[ac] = a3 as i64; ac = ac + 1 }
63 if a4 as i64 != 0 { av[ac] = a4 as i64; ac = ac + 1 }
64 if a5 as i64 != 0 { av[ac] = a5 as i64; ac = ac + 1 }
65 if a6 as i64 != 0 { av[ac] = a6 as i64; ac = ac + 1 }
66 if a7 as i64 != 0 { av[ac] = a7 as i64; ac = ac + 1 }
67 if a8 as i64 != 0 { av[ac] = a8 as i64; ac = ac + 1 }
68 av[ac] = 0
69 sys_execve(elf, av, 0 as *i64)
70 sys_exit(127)
71 }
72 sys_close(wfd)
73 var tot: i64 = 0
74 var n: i64 = sys_read(rfd, out, cap - 1)
75 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) } }
76 sys_close(rfd)
77 let st: *i64 = sys_mmap(16) as *i64
78 sys_wait4(pid, st, 0)
79 out[tot] = 0 as u8
80 return tot
81}
82
83func main(argc: i64, argv: *i64) -> i64 {
84 var elf: *u8 = "_build/nx_arousal_fit.sov.elf" as *u8
85 if argc >= 2 { elf = argv[1] as *u8 }
86 var eelf: *u8 = "_build/nx_arousal.sov.elf" as *u8
87 if argc >= 3 { eelf = argv[2] as *u8 }
88 let pass: *i64 = sys_mmap(16) as *i64
89 pass[0] = 0
90 pass[1] = 0
91 let out: *u8 = sys_mmap(G_OUTCAP)
92 var n: i64 = 0
93
94 // T1 recover the male slow-vascular tau (truth 185000) from its own synthetic observations
95 n = g_run(elf, "tau" as *u8, "1000" as *u8, "100000" as *u8, "416" as *u8, "400000" as *u8, "883" as *u8, 0 as *u8, 0 as *u8, out, G_OUTCAP)
96 g_bool("recovers-male-tau-185007" as *u8, g_has(out, n, "best_tau=185007" as *u8), 1, pass)
97 g_bool("residual-driven-to-zero" as *u8, g_has(out, n, "residual=0 " as *u8), 1, pass)
98 g_bool("reports-improved-over-seed" as *u8, g_has(out, n, "improved=1" as *u8), 1, pass)
99 // the seed baseline must be VISIBLE -- a fitter that hides its starting point can't be audited
100 g_bool("seed-baseline-visible-572" as *u8, g_has(out, n, "seed_residual=572" as *u8), 1, pass)
101
102 // T2/T3 THE NON-VACUITY TEETH: different data must yield different tau.
103 n = g_run(elf, "tau" as *u8, "1000" as *u8, "100000" as *u8, "670" as *u8, "400000" as *u8, "987" as *u8, 0 as *u8, 0 as *u8, out, G_OUTCAP)
104 g_bool("recovers-fast-tau-89879" as *u8, g_has(out, n, "best_tau=89879" as *u8), 1, pass)
105 // NEG CONTROL: a fitter returning a constant would still emit 185007 here. It must NOT.
106 g_bool("NEG-fit-is-not-a-constant" as *u8, g_has(out, n, "best_tau=185007" as *u8), 0, pass)
107 n = g_run(elf, "tau" as *u8, "1000" as *u8, "100000" as *u8, "282" as *u8, "400000" as *u8, "734" as *u8, 0 as *u8, 0 as *u8, out, G_OUTCAP)
108 g_bool("recovers-slow-tau-299632" as *u8, g_has(out, n, "best_tau=299632" as *u8), 1, pass)
109 // T4 the female slow-vascular tau (truth 210000) recovers to its own value, not the male one
110 n = g_run(elf, "tau" as *u8, "1000" as *u8, "100000" as *u8, "378" as *u8, "400000" as *u8, "850" as *u8, 0 as *u8, 0 as *u8, out, G_OUTCAP)
111 g_bool("recovers-female-tau-209394" as *u8, g_has(out, n, "best_tau=209394" as *u8), 1, pass)
112
113 // T5 refusals: a corrupt or degenerate input must be REFUSED, never fitted.
114 n = g_run(elf, "tau" as *u8, "1000" as *u8, "100000" as *u8, "5000" as *u8, "400000" as *u8, "883" as *u8, 0 as *u8, 0 as *u8, out, G_OUTCAP)
115 g_bool("refuses-obs-out-of-permil-range" as *u8, g_has(out, n, "REFUSED reason=obs_out_of_range" as *u8), 1, pass)
116 n = g_run(elf, "tau" as *u8, "1000" as *u8, "100000" as *u8, "416" as *u8, "400000" as *u8, "883" as *u8, "500000" as *u8, "1000" as *u8, out, G_OUTCAP)
117 g_bool("refuses-empty-bracket" as *u8, g_has(out, n, "REFUSED reason=empty_bracket" as *u8), 1, pass)
118 n = g_run(elf, "tau" as *u8, "0" as *u8, "100000" as *u8, "416" as *u8, "400000" as *u8, "883" as *u8, 0 as *u8, 0 as *u8, out, G_OUTCAP)
119 g_bool("refuses-nonpositive-drive" as *u8, g_has(out, n, "REFUSED reason=nonpositive_drive" as *u8), 1, pass)
120 n = g_run(elf, "tau" as *u8, "5000" as *u8, "100000" as *u8, "416" as *u8, "400000" as *u8, "883" as *u8, 0 as *u8, 0 as *u8, out, G_OUTCAP)
121 g_bool("refuses-drive-over-permil" as *u8, g_has(out, n, "REFUSED reason=drive_over_permil" as *u8), 1, pass)
122
123 // ---- SERIES (dense-trajectory joint tau+drive fit) -----------------------------------------
124 // The gate GENERATES its own ground truth via the engine's gen verb rather than trusting
125 // hand-copied constants, so generator and fitter are proven consistent in one act.
126 n = g_run(eelf, "gen" as *u8, "185000" as *u8, "800" as *u8, "30000" as *u8, "20" as *u8, 0 as *u8, 0 as *u8, 0 as *u8, out, G_OUTCAP)
127 g_bool("gen-emits-a-trajectory" as *u8, g_has(out, n, "30000 119" as *u8), 1, pass)
128 g_write("_scratch/gate_ser_a.txt" as *u8, out)
129 n = g_run(elf, "series" as *u8, "_scratch/gate_ser_a.txt" as *u8, 0 as *u8, 0 as *u8, 0 as *u8, 0 as *u8, 0 as *u8, 0 as *u8, out, G_OUTCAP)
130 g_bool("series-joint-recovers-tau-185012" as *u8, g_has(out, n, "best_tau=185012" as *u8), 1, pass)
131 g_bool("series-joint-recovers-drive-800" as *u8, g_has(out, n, "best_drive=800" as *u8), 1, pass)
132 g_bool("series-residual-zero" as *u8, g_has(out, n, "residual=0 " as *u8), 1, pass)
133
134 // NON-VACUITY: a DIFFERENT trajectory must yield DIFFERENT parameters (the seq1399 law).
135 n = g_run(eelf, "gen" as *u8, "90000" as *u8, "450" as *u8, "20000" as *u8, "20" as *u8, 0 as *u8, 0 as *u8, 0 as *u8, out, G_OUTCAP)
136 g_write("_scratch/gate_ser_b.txt" as *u8, out)
137 n = g_run(elf, "series" as *u8, "_scratch/gate_ser_b.txt" as *u8, 0 as *u8, 0 as *u8, 0 as *u8, 0 as *u8, 0 as *u8, 0 as *u8, out, G_OUTCAP)
138 g_bool("series-recovers-distinct-tau-90005" as *u8, g_has(out, n, "best_tau=90005" as *u8), 1, pass)
139 g_bool("series-recovers-distinct-drive-450" as *u8, g_has(out, n, "best_drive=450" as *u8), 1, pass)
140 g_bool("NEG-series-fit-is-not-a-constant" as *u8, g_has(out, n, "best_tau=185012" as *u8), 0, pass)
141
142 // malformed input is REFUSED, never fitted
143 g_write("_scratch/gate_unsorted.txt" as *u8, "300000 500\n100000 200\n400000 700\n" as *u8)
144 n = g_run(elf, "series" as *u8, "_scratch/gate_unsorted.txt" as *u8, 0 as *u8, 0 as *u8, 0 as *u8, 0 as *u8, 0 as *u8, 0 as *u8, out, G_OUTCAP)
145 g_bool("series-refuses-non-ascending" as *u8, g_has(out, n, "REFUSED reason=malformed_series" as *u8), 1, pass)
146 n = g_run(elf, "series" as *u8, "_scratch/gate_absent.txt" as *u8, 0 as *u8, 0 as *u8, 0 as *u8, 0 as *u8, 0 as *u8, 0 as *u8, out, G_OUTCAP)
147 g_bool("series-refuses-unreadable-path" as *u8, g_has(out, n, "REFUSED reason=series_unreadable" as *u8), 1, pass)
148
149 // ---- NOISE ROBUSTNESS: the pass that stands between this fitter and real captures ----------
150 // Real thermography carries sensor noise, motion artifact and ambient drift. A fitter that
151 // still reports residual=0 and a point estimate on noisy input is reporting false precision.
152 n = g_run(eelf, "gen" as *u8, "185000" as *u8, "800" as *u8, "30000" as *u8, "20" as *u8, 0 as *u8, 0 as *u8, 0 as *u8, out, G_OUTCAP)
153 // noiseless output must be BYTE-IDENTICAL to before the noise args existed (scope-slot check)
154 g_bool("gen-noiseless-output-unchanged" as *u8, g_has(out, n, "30000 119" as *u8), 1, pass)
155 n = g_run(eelf, "gen" as *u8, "185000" as *u8, "800" as *u8, "30000" as *u8, "20" as *u8, "40" as *u8, "777" as *u8, 0 as *u8, out, G_OUTCAP)
156 // same seed must reproduce exactly, or a noise tooth is not a tooth
157 g_bool("gen-noise-deterministic-seed777" as *u8, g_has(out, n, "30000 97" as *u8), 1, pass)
158 g_bool("NEG-noisy-is-not-the-clean-series" as *u8, g_has(out, n, "30000 119" as *u8), 0, pass)
159 g_write("_scratch/gate_noisy.txt" as *u8, out)
160
161 n = g_run(elf, "series" as *u8, "_scratch/gate_ser_a.txt" as *u8, 0 as *u8, 0 as *u8, 0 as *u8, 0 as *u8, 0 as *u8, 0 as *u8, out, G_OUTCAP)
162 g_bool("clean-bracket-is-tight-925" as *u8, g_has(out, n, "ci_width=925" as *u8), 1, pass)
163 n = g_run(elf, "series" as *u8, "_scratch/gate_noisy.txt" as *u8, 0 as *u8, 0 as *u8, 0 as *u8, 0 as *u8, 0 as *u8, 0 as *u8, out, G_OUTCAP)
164 // residual CANNOT reach zero against noisy data -- if it does, the objective is ignoring the data
165 g_bool("noisy-residual-is-nonzero-383" as *u8, g_has(out, n, "residual=383" as *u8), 1, pass)
166 g_bool("noisy-bracket-widens-to-15136" as *u8, g_has(out, n, "ci_width=15136" as *u8), 1, pass)
167 g_bool("NEG-noisy-bracket-is-not-tight" as *u8, g_has(out, n, "ci_width=925" as *u8), 0, pass)
168 // THE HONESTY PROPERTY: the point estimate drifts to 189277 (2.3% off the true 185000), but the
169 // reported bracket must still CONTAIN 185000 -- 182655 below it, 197791 above it.
170 g_bool("noisy-bracket-lo-below-truth" as *u8, g_has(out, n, "tau_lo=182655" as *u8), 1, pass)
171 g_bool("noisy-bracket-hi-above-truth" as *u8, g_has(out, n, "tau_hi=197791" as *u8), 1, pass)
172
173 g_puts("AROUSAL-FIT-GATE pass=" as *u8); g_putn(pass[0]); g_puts("/" as *u8); g_putn(pass[1]); g_puts(" verdict=" as *u8)
174 if pass[1] < G_MIN_TEETH { g_puts("RED reason=teeth_deleted\n" as *u8); return 1 }
175 if pass[0] == pass[1] { g_puts("GREEN\n" as *u8); return 0 }
176 g_puts("RED\n" as *u8)
177 return 1
178}