nx_de_referee_gate.nx source
↩ module page · 149 lines · 8030 B
1// nx_de_referee_gate.nx -- THE GATE FOR THE PER-REGION CIEDE2000 REFEREE, 2026-09-03.
2//
3// SUBJECT: dr_region_de / dr_run in-process (nx_de_referee_lib has no main).
4//
5// THE THREE TEETH THAT CARRY THE CLAIM ARE T4, T5 AND T9, and every one of them is a law the estate has
6// already been bitten by:
7// T4 ZERO REGIONS MUST NOT PASS. A tooth that passes on the empty set is not a tooth, and a referee that
8// returns PASS when it measured nothing is the most dangerous possible green.
9// T5 ALL-UNOBSERVED MUST NOT PASS either -- declaring regions and sampling none of them is the same
10// vacuum wearing a denominator.
11// T9 AN UNOBSERVED REGION RESCUES NOTHING. If one measured region is out of tolerance, adding empty
12// regions beside it must not turn the verdict green. That is the abstain-never-acquit law in the one
13// direction where getting it wrong is silent.
14//
15// Teeth, in order:
16// T1 identical colours give a difference of exactly zero.
17// T2 a real difference is non-zero (so T1 cannot pass on a stub that always returns zero).
18// T3 the WORST region is correctly identified, not the first or the last.
19// T4 zero declared regions -> ABSTAIN, never PASS.
20// T5 all regions unobserved -> ABSTAIN, never PASS.
21// T6 the partition RECONCILES: measured + unobserved == declared, always.
22// T7 a render inside tolerance PASSES.
23// T8 a render outside tolerance FAILS -- with T7 this proves the verdict is not a constant.
24// T9 an unobserved region does not rescue a failing measured one.
25// T10 NEG-CONTROL: a non-positive tolerance REFUSES rather than judging against nothing.
26// license_tier: ORIGINAL No hw writes (Rule 26). expect_exit: 0
27import "nx_syscalls.nx"
28import "nx_gate_verdict.nx"
29import "nx_de_referee_lib.nx"
30
31const DG_SLOT: i64 = 8
32const DG_LAB: i64 = 3
33const DG_N: i64 = 4
34const DG_MICRO: i64 = 1000000
35
36func dg_q(micro: i64) -> i64 { return fq_div(fq_from_int(micro), fq_from_int(DG_MICRO)) }
37
38func main(argc: i64, argv: *i64) -> i64 {
39 let ctr: *i64 = gv_ctr()
40 gv_head("nx_de_referee gate -- CIEDE2000 per body region, and the three ways a referee can lie about a green" as *u8)
41
42 let cs: *i64 = cs_ctx()
43 let out: *i64 = sys_mmap(DR_O_SLOTS * DG_SLOT) as *i64
44
45 let refs: *i64 = sys_mmap(DG_N * DG_LAB * DG_SLOT) as *i64
46 let rnds: *i64 = sys_mmap(DG_N * DG_LAB * DG_SLOT) as *i64
47 let counts: *i64 = sys_mmap(DG_N * DG_SLOT) as *i64
48 var i: i64 = 0
49 while i < DG_N {
50 refs[i * DG_LAB + 0] = dg_q(65000000)
51 refs[i * DG_LAB + 1] = dg_q(12000000)
52 refs[i * DG_LAB + 2] = dg_q(15000000)
53 rnds[i * DG_LAB + 0] = dg_q(65000000)
54 rnds[i * DG_LAB + 1] = dg_q(12000000)
55 rnds[i * DG_LAB + 2] = dg_q(15000000)
56 counts[i] = 100
57 i = i + 1
58 }
59
60 let d0: i64 = dr_region_de(cs, refs, rnds)
61 gv_puts(" [T1] identical colours -> de_micro=" as *u8); gv_num(fq_to_micro(d0)); gv_puts("\n" as *u8)
62 gv_check("identical-colours-give-a-difference-of-exactly-zero" as *u8, (d0 == 0) as i64, ctr)
63
64 let far: *i64 = sys_mmap(DG_LAB * DG_SLOT) as *i64
65 far[0] = dg_q(72000000)
66 far[1] = dg_q(4000000)
67 far[2] = dg_q(22000000)
68 let d1: i64 = dr_region_de(cs, refs, far)
69 gv_puts(" [T2] a real difference -> de_micro=" as *u8); gv_num(fq_to_micro(d1)); gv_puts("\n" as *u8)
70 gv_check("a-real-difference-is-non-zero (so T1 cannot pass on a stub that always returns zero)" as *u8, (d1 > 0) as i64, ctr)
71
72 rnds[2 * DG_LAB + 0] = dg_q(72000000)
73 rnds[2 * DG_LAB + 1] = dg_q(4000000)
74 rnds[2 * DG_LAB + 2] = dg_q(22000000)
75 rnds[1 * DG_LAB + 0] = dg_q(66000000)
76 let tol_wide: i64 = dg_q(50000000)
77 let v3: i64 = dr_run(cs, refs, rnds, counts, DG_N, tol_wide, out)
78 gv_puts(" [T3] worst_idx=" as *u8); gv_num(out[DR_O_WORST_IDX])
79 gv_puts(" worst_de_micro=" as *u8); gv_num(fq_to_micro(out[DR_O_WORST_DE]))
80 gv_puts(" mean_micro=" as *u8); gv_num(fq_to_micro(out[DR_O_MEAN_DE])); gv_puts("\n" as *u8)
81 gv_check("the-WORST-region-is-identified-not-the-first-or-the-last" as *u8, (out[DR_O_WORST_IDX] == 2) as i64, ctr)
82
83 let v4: i64 = dr_run(cs, refs, rnds, counts, 0, tol_wide, out)
84 gv_puts(" [T4] zero declared regions -> " as *u8); gv_puts(dr_verdict_name(v4))
85 gv_puts(" measured=" as *u8); gv_num(out[DR_O_MEASURED]); gv_puts("\n" as *u8)
86 gv_check("ZERO-declared-regions-ABSTAINS-and-never-passes (a tooth that passes on the empty set is not a tooth)" as *u8, (v4 == DR_ABSTAIN) as i64, ctr)
87
88 var z: i64 = 0
89 while z < DG_N {
90 counts[z] = 0
91 z = z + 1
92 }
93 let v5: i64 = dr_run(cs, refs, rnds, counts, DG_N, tol_wide, out)
94 gv_puts(" [T5] all regions unobserved -> " as *u8); gv_puts(dr_verdict_name(v5))
95 gv_puts(" measured=" as *u8); gv_num(out[DR_O_MEASURED]); gv_puts(" unobserved=" as *u8); gv_num(out[DR_O_UNOBSERVED]); gv_puts("\n" as *u8)
96 gv_check("ALL-regions-unobserved-ABSTAINS-and-never-passes" as *u8, (v5 == DR_ABSTAIN) as i64, ctr)
97
98 counts[0] = 50
99 counts[1] = 0
100 counts[2] = 80
101 counts[3] = 0
102 let v6: i64 = dr_run(cs, refs, rnds, counts, DG_N, tol_wide, out)
103 let sum6: i64 = out[DR_O_MEASURED] + out[DR_O_UNOBSERVED]
104 gv_puts(" [T6] measured=" as *u8); gv_num(out[DR_O_MEASURED])
105 gv_puts(" unobserved=" as *u8); gv_num(out[DR_O_UNOBSERVED])
106 gv_puts(" declared=" as *u8); gv_num(out[DR_O_DECLARED])
107 gv_puts(" sum=" as *u8); gv_num(sum6); gv_puts("\n" as *u8)
108 gv_check("the-partition-RECONCILES-measured-plus-unobserved-equals-declared" as *u8, (sum6 == out[DR_O_DECLARED]) as i64, ctr)
109
110 var w: i64 = 0
111 while w < DG_N {
112 rnds[w * DG_LAB + 0] = refs[w * DG_LAB + 0]
113 rnds[w * DG_LAB + 1] = refs[w * DG_LAB + 1]
114 rnds[w * DG_LAB + 2] = refs[w * DG_LAB + 2]
115 counts[w] = 100
116 w = w + 1
117 }
118 rnds[1 * DG_LAB + 0] = dg_q(65200000)
119 let tol_tight: i64 = dg_q(2000000)
120 let v7: i64 = dr_run(cs, refs, rnds, counts, DG_N, tol_tight, out)
121 gv_puts(" [T7] near render -> " as *u8); gv_puts(dr_verdict_name(v7))
122 gv_puts(" worst_micro=" as *u8); gv_num(fq_to_micro(out[DR_O_WORST_DE]))
123 gv_puts(" tol_micro=" as *u8); gv_num(fq_to_micro(tol_tight)); gv_puts("\n" as *u8)
124 gv_check("a-render-inside-the-declared-tolerance-PASSES" as *u8, (v7 == DR_PASS) as i64, ctr)
125
126 rnds[3 * DG_LAB + 0] = dg_q(72000000)
127 rnds[3 * DG_LAB + 1] = dg_q(4000000)
128 rnds[3 * DG_LAB + 2] = dg_q(22000000)
129 let v8: i64 = dr_run(cs, refs, rnds, counts, DG_N, tol_tight, out)
130 gv_puts(" [T8] far render -> " as *u8); gv_puts(dr_verdict_name(v8))
131 gv_puts(" worst_idx=" as *u8); gv_num(out[DR_O_WORST_IDX])
132 gv_puts(" worst_micro=" as *u8); gv_num(fq_to_micro(out[DR_O_WORST_DE])); gv_puts("\n" as *u8)
133 gv_check("a-render-outside-the-declared-tolerance-FAILS (with T7 this proves the verdict is not a constant)" as *u8, (v8 == DR_FAIL) as i64, ctr)
134
135 counts[0] = 0
136 counts[1] = 0
137 counts[2] = 0
138 counts[3] = 100
139 let v9: i64 = dr_run(cs, refs, rnds, counts, DG_N, tol_tight, out)
140 gv_puts(" [T9] one failing region, three unobserved -> " as *u8); gv_puts(dr_verdict_name(v9))
141 gv_puts(" measured=" as *u8); gv_num(out[DR_O_MEASURED]); gv_puts(" unobserved=" as *u8); gv_num(out[DR_O_UNOBSERVED]); gv_puts("\n" as *u8)
142 gv_check("an-unobserved-region-RESCUES-NOTHING (abstain never acquits, in the direction where it is silent)" as *u8, (v9 == DR_FAIL) as i64, ctr)
143
144 let v10: i64 = dr_run(cs, refs, rnds, counts, DG_N, 0, out)
145 gv_puts(" [T10] tolerance=0 -> " as *u8); gv_num(v10); gv_puts(" want=" as *u8); gv_num(DR_REFUSED); gv_puts("\n" as *u8)
146 gv_check("neg-control-a-non-positive-tolerance-REFUSES-rather-than-judging-against-nothing" as *u8, (v10 == DR_REFUSED) as i64, ctr)
147
148 return gv_verdict("de_referee" as *u8, ctr, "CIEDE2000 judged per body region against a declared tolerance, with the empty set abstaining, the partition reconciling, and an unobserved region rescuing nothing" as *u8)
149}