nx_coco_oks_gate.nx source
↩ module page · 41 lines · 2581 B
1// nx_coco_oks_gate.nx -- proof of the COCO OKS metric: perfect->1000, a hand-computed offset, visibility handling.
2// expect_exit: 0
3import "nx_syscalls.nx"
4import "nx_f32_cvt.nx"
5import "nx_coco_oks.nx"
6
7func gp(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return sys_write(1,s,n) }
8func gn(v: i64) -> i64 { let bb:*u8=sys_mmap(28); var m:i64=v; if m<0{sys_write(1,"-" as *u8,1);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} return sys_write(1,bb,k) }
9
10func main(argc: i64, argv: *i64) -> i64 {
11 var pass: i64 = 0
12 let px: *i64=sys_mmap(8*17) as *i64; let py: *i64=sys_mmap(8*17) as *i64
13 let gx: *i64=sys_mmap(8*17) as *i64; let gy: *i64=sys_mmap(8*17) as *i64
14 let v: *i64=sys_mmap(8*17) as *i64
15
16 // O1 perfect: pred==GT, all visible -> OKS 1000
17 var i: i64=0; while i<17 { px[i]=i*3; py[i]=i*2; gx[i]=i*3; gy[i]=i*2; v[i]=2; i=i+1 }
18 let o1: i64 = coco_oks(px,py,gx,gy,v,17, nx_i32_to_f32(10000))
19 if o1==1000 { pass=pass+1; gp("O1 perfect -> OKS=1000 OK\n" as *u8) } else { gp("O1 FAIL oks=" as *u8); gn(o1); gp("\n" as *u8) }
20
21 // O2 hand-computed: 1 keypoint (nose sig .026, k=.052, k^2=.002704). GT(0,0) pred(10,0) d^2=100;
22 // area=18491 -> 2*area*k^2 = 100 -> exponent -1 -> e=exp(-1)=.3679 -> OKS~368
23 gx[0]=0;gy[0]=0; px[0]=10;py[0]=0; v[0]=2
24 let o2: i64 = coco_oks(px,py,gx,gy,v,1, nx_i32_to_f32(18491))
25 if o2>=350 { if o2<=385 { pass=pass+1; gp("O2 offset d=10 area=18491 -> OKS~368 (exp(-1)) OK, got " as *u8); gn(o2); gp("\n" as *u8) } }
26 if o2<350 { gp("O2 FAIL oks=" as *u8); gn(o2); gp("\n" as *u8) }
27 if o2>385 { gp("O2 FAIL oks=" as *u8); gn(o2); gp("\n" as *u8) }
28
29 // O3 visibility: 17 kpts, first 10 perfect+visible, last 7 invisible -> only visible counted -> 1000
30 i=0; while i<17 { px[i]=i*3; py[i]=i*2; gx[i]=i*3; gy[i]=i*2; i=i+1 }
31 i=0; while i<10 { v[i]=2; i=i+1 } i=10; while i<17 { v[i]=0; i=i+1 }
32 // make the invisible ones WRONG to prove they're ignored
33 i=10; while i<17 { px[i]=999; i=i+1 }
34 let o3: i64 = coco_oks(px,py,gx,gy,v,17, nx_i32_to_f32(10000))
35 if o3==1000 { pass=pass+1; gp("O3 invisible keypoints ignored -> OKS=1000 OK\n" as *u8) } else { gp("O3 FAIL oks=" as *u8); gn(o3); gp("\n" as *u8) }
36
37 gp("COCO-OKS-GATE pass=" as *u8); gn(pass); gp("/3\n" as *u8)
38 if pass==3 { gp("COCO-OKS-GATE verdict=GREEN 3/3 (the REAL industry metric: perfect + offset + visibility)\n" as *u8); sys_exit(0) }
39 sys_exit(1)
40 return 0
41}