nx_imgsig_gate.nx source
↩ module page · 179 lines · 8696 B
1// nx_imgsig_gate.nx -- referee for the unified visual signature (nx_imgsig = visdesc + colordesc).
2// PROVES the COMBINATION beats either component alone, on a 2x2 structure x color corpus where each
3// component is individually ambiguous:
4// classes = {H-stripes RED, H-stripes GREEN, V-stripes RED, V-stripes GREEN}, 4 instances each.
5// - visdesc alone (structure/tone on gray) CONFUSES H-red vs H-green (same structure) -> lower P@3.
6// - colordesc alone (chroma) CONFUSES H-red vs V-red (same color) -> lower P@3.
7// - imgsig (both) separates all four.
8// row1 imgsig retrieval P@3 strong (>=850 permil).
9// row2 imgsig P@3 > visdesc-only P@3 (color disambiguates what structure cannot) [measured]
10// row3 imgsig P@3 > colordesc-only P@3 (structure disambiguates what color cannot) [measured]
11// row4 DETERMINISM: same image twice -> identical signature (L1 == 0).
12// row5 SEPARATION: cross-class imgsig L1 >> same-class.
13// GREEN iff 5/5. Durable verdict -> knowledge/status/imgsig_gate.log. license_tier: ORIGINAL
14import "nx_imgsig.nx"
15
16func 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 }
17func g_num(v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m;sys_write(1,"-" as *u8,1)}; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=(48 as u8);k=1}; while m>0{t[k]=((48+(m%10)) as u8);m=m/10;k=k+1}; var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1}; sys_write(1,bb,k); return 0 }
18func g_w(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 }
19func g_wn(fd: i64, v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m}; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=(48 as u8);k=1}; while m>0{t[k]=((48+(m%10)) as u8);m=m/10;k=k+1}; var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1}; sys_write(fd,bb,k); return 0 }
20func g_clamp255(v: i64) -> i64 { if v<0 { return 0 } if v>255 { return 255 } return v }
21
22// build a stripe pattern modulated in a chosen hue: structIdx 0=horizontal 1=vertical, colorIdx 0=red 1=green.
23// writes both the interleaved RGB and its row-major luma (so visdesc/colordesc see the same image).
24func g_synth_sc(rgb: *u8, gray: *u8, w: i64, h: i64, structIdx: i64, colorIdx: i64, p: i64, phase: i64, dbright: i64) -> i64 {
25 var y: i64 = 0
26 while y < h {
27 var x: i64 = 0
28 while x < w {
29 var s: i64 = 0
30 if structIdx==0 { s = (((y+phase)/p) & 1) } else { s = (((x+phase)/p) & 1) }
31 var r: i64 = 0
32 var g: i64 = 0
33 var b: i64 = 0
34 if colorIdx==0 {
35 if s==1 { r=200; g=0; b=0 } else { r=40; g=0; b=0 }
36 } else {
37 if s==1 { r=0; g=160; b=0 } else { r=0; g=40; b=0 }
38 }
39 let nz: i64 = ((x*7 + y*13 + phase*5) & 5)
40 r = r + dbright + nz
41 g = g + dbright + nz
42 b = b + dbright + nz
43 let idx: i64 = (y*w+x)*3
44 rgb[idx] = g_clamp255(r) as u8
45 rgb[idx+1] = g_clamp255(g) as u8
46 rgb[idx+2] = g_clamp255(b) as u8
47 gray[y*w+x] = g_clamp255((77*g_clamp255(r) + 150*g_clamp255(g) + 29*g_clamp255(b)) / 256) as u8
48 x = x + 1
49 }
50 y = y + 1
51 }
52 return 0
53}
54
55// L1 in one of three modes: 0=visdesc-only (first 80) 1=colordesc-only (last 32) 2=imgsig (all 112).
56func g_l1mode(a: *i64, b: *i64, mode: i64) -> i64 {
57 if mode==0 { return nx_visdesc_l1(a, b) }
58 if mode==1 { return nx_colordesc_l1(((a as i64)+80*8) as *i64, ((b as i64)+80*8) as *i64) }
59 return nx_imgsig_l1(a, b)
60}
61
62// precision@3 (permil) over a corpus of 112-dim signatures, relevance = same class (k/ninst).
63func g_p3(sdesc: *i64, nimg: i64, ninst: i64, mode: i64, taken: *i64) -> i64 {
64 var pk: i64 = 0
65 var k: i64 = 0
66 while k < nimg {
67 let dk: *i64 = sdesc[k] as *i64
68 var t: i64 = 0
69 while t < nimg { taken[t]=0; t=t+1 }
70 taken[k]=1
71 var rank: i64 = 0
72 while rank < 3 {
73 var best: i64 = 0-1
74 var bestd: i64 = 0
75 var j: i64 = 0
76 while j < nimg {
77 if taken[j]==0 {
78 let dj: *i64 = sdesc[j] as *i64
79 let l1: i64 = g_l1mode(dk, dj, mode)
80 if best<0 { best=j; bestd=l1 } else { if l1<bestd { best=j; bestd=l1 } }
81 }
82 j=j+1
83 }
84 if best>=0 { taken[best]=1; if (best/ninst)==(k/ninst) { pk=pk+1 } }
85 rank=rank+1
86 }
87 k=k+1
88 }
89 return pk*1000/(nimg*3)
90}
91
92func main() -> i64 {
93 g_puts("=== IMGSIG GATE (unified visual signature = structure + color > either alone) ===\n" as *u8)
94 let W: i64 = 32
95 let H: i64 = 32
96 let NPX: i64 = W*H
97 let NINST: i64 = 4
98 let NIMG: i64 = 16
99
100 let grays: *i64 = sys_mmap(8*NIMG) as *i64
101 let rgbs: *i64 = sys_mmap(8*NIMG) as *i64
102 let sdesc: *i64 = sys_mmap(8*NIMG) as *i64
103 var k: i64 = 0
104 while k < NIMG {
105 let cls: i64 = k / NINST
106 let inst: i64 = k % NINST
107 let structIdx: i64 = cls / 2
108 let colorIdx: i64 = cls % 2
109 let rgb: *u8 = sys_mmap(NPX*3)
110 let gray: *u8 = sys_mmap(NPX)
111 g_synth_sc(rgb, gray, W, H, structIdx, colorIdx, 2+inst, inst, inst*8)
112 grays[k] = gray as i64
113 rgbs[k] = rgb as i64
114 let d: *i64 = sys_mmap(8*112) as *i64
115 nx_imgsig_extract(gray, rgb, W, H, d)
116 sdesc[k] = d as i64
117 k = k + 1
118 }
119
120 let taken: *i64 = sys_mmap(8*NIMG) as *i64
121 let vis_p3: i64 = g_p3(sdesc, NIMG, NINST, 0, taken)
122 let col_p3: i64 = g_p3(sdesc, NIMG, NINST, 1, taken)
123 let sig_p3: i64 = g_p3(sdesc, NIMG, NINST, 2, taken)
124
125 var pass: i64 = 0
126 let rows: i64 = 5
127
128 // ---- row1: imgsig retrieval strong ----
129 g_puts(" row1 imgsig P@3=" as *u8); g_num(sig_p3); g_puts("permil -> " as *u8)
130 if sig_p3 >= 850 { pass=pass+1; g_puts("PASS\n" as *u8) } else { g_puts("FAIL\n" as *u8) }
131
132 // ---- row2: imgsig beats visdesc-only ----
133 g_puts(" row2 imgsig vs structure-only -> imgsig=" as *u8); g_num(sig_p3); g_puts(" visdesc=" as *u8); g_num(vis_p3); g_puts(" -> " as *u8)
134 if sig_p3 > vis_p3 { pass=pass+1; g_puts("PASS (color disambiguates structure)\n" as *u8) } else { g_puts("FAIL\n" as *u8) }
135
136 // ---- row3: imgsig beats colordesc-only ----
137 g_puts(" row3 imgsig vs color-only -> imgsig=" as *u8); g_num(sig_p3); g_puts(" colordesc=" as *u8); g_num(col_p3); g_puts(" -> " as *u8)
138 if sig_p3 > col_p3 { pass=pass+1; g_puts("PASS (structure disambiguates color)\n" as *u8) } else { g_puts("FAIL\n" as *u8) }
139
140 // ---- row4: determinism ----
141 let s2: *i64 = sys_mmap(8*112) as *i64
142 nx_imgsig_extract(grays[0] as *u8, rgbs[0] as *u8, W, H, s2)
143 let det_l1: i64 = nx_imgsig_l1(sdesc[0] as *i64, s2)
144 g_puts(" row4 determinism -> L1(extract,extract)=" as *u8); g_num(det_l1); g_puts(" (==0) -> " as *u8)
145 if det_l1 == 0 { pass=pass+1; g_puts("PASS\n" as *u8) } else { g_puts("FAIL\n" as *u8) }
146
147 // ---- row5: separation ----
148 var ssum: i64 = 0
149 var scnt: i64 = 0
150 var xsum: i64 = 0
151 var xcnt: i64 = 0
152 var a: i64 = 0
153 while a < NIMG {
154 var b: i64 = a+1
155 while b < NIMG {
156 let l1: i64 = nx_imgsig_l1(sdesc[a] as *i64, sdesc[b] as *i64)
157 if (a/NINST) == (b/NINST) { ssum = ssum + l1; scnt = scnt + 1 } else { xsum = xsum + l1; xcnt = xcnt + 1 }
158 b = b + 1
159 }
160 a = a + 1
161 }
162 var savg: i64 = 0
163 if scnt > 0 { savg = ssum / scnt }
164 var xavg: i64 = 0
165 if xcnt > 0 { xavg = xsum / xcnt }
166 g_puts(" row5 separation -> same-class avg L1=" as *u8); g_num(savg); g_puts(" cross-class avg L1=" as *u8); g_num(xavg); g_puts(" -> " as *u8)
167 if xavg > 2*savg { pass=pass+1; g_puts("PASS\n" as *u8) } else { g_puts("FAIL\n" as *u8) }
168
169 g_puts("----\nIMGSIG-GATE rows=" as *u8); g_num(rows); g_puts(" pass=" as *u8); g_num(pass); g_puts("\n" as *u8)
170 let lg: i64 = sys_openat_append("knowledge/status/imgsig_gate.log" as *u8, 0x1a4)
171 if lg>=0 {
172 g_w(lg,"IMGSIG-GATE rows=" as *u8); g_wn(lg,rows); g_w(lg," pass=" as *u8); g_wn(lg,pass)
173 g_w(lg," sig_p3=" as *u8); g_wn(lg,sig_p3); g_w(lg," vis_p3=" as *u8); g_wn(lg,vis_p3); g_w(lg," col_p3=" as *u8); g_wn(lg,col_p3); g_w(lg," sameL1=" as *u8); g_wn(lg,savg); g_w(lg," crossL1=" as *u8); g_wn(lg,xavg)
174 if pass==rows { g_w(lg," verdict=GREEN\n" as *u8) } else { g_w(lg," verdict=RED\n" as *u8) }
175 sys_close(lg)
176 }
177 if pass==rows { g_puts("IMGSIG-GATE GREEN\n" as *u8); sys_exit(0); return 0 }
178 g_puts("IMGSIG-GATE RED\n" as *u8); sys_exit(1); return 1
179}