code wiki / (root) / nx_imgsig_gate.nx

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}