code wiki / (root) / nx_coco_oks_gate.nx

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}