code wiki / (root) / nx_pck_gate.nx

nx_pck_gate.nx source

↩ module page · 36 lines · 1991 B

1// nx_pck_gate.nx -- exact proof of the PCK metric. expect_exit: 0 2import "nx_syscalls.nx" 3import "nx_pck.nx" 4 5func gp(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return sys_write(1,s,n) } 6func 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) } 7 8func main(argc: i64, argv: *i64) -> i64 { 9 var pass: i64 = 0 10 let px: *i64=sys_mmap(8*4) as *i64; let py: *i64=sys_mmap(8*4) as *i64 11 let gx: *i64=sys_mmap(8*4) as *i64; let gy: *i64=sys_mmap(8*4) as *i64 12 // pred: (0,0)(10,10)(5,5)(20,20) ; gt: (1,1)(10,11)(50,50)(20,20) 13 px[0]=0;py[0]=0; px[1]=10;py[1]=10; px[2]=5;py[2]=5; px[3]=20;py[3]=20 14 gx[0]=1;gy[0]=1; gx[1]=10;gy[1]=11; gx[2]=50;gy[2]=50; gx[3]=20;gy[3]=20 15 16 // thresh_sq=4 (within 2px): kp0 dist2=2 OK, kp1 dist2=1 OK, kp2 huge NO, kp3 0 OK -> 3/4, 750 17 let c1: i64 = pck_count(px,py,gx,gy,4,4) 18 let p1: i64 = pck_permille(px,py,gx,gy,4,4) 19 if c1==3 { if p1==750 { pass=pass+1; gp("P1 PCK@2px = 3/4 = 750 permille OK\n" as *u8) } } 20 if c1!=3 { gp("P1 FAIL c=" as *u8); gn(c1); gp(" p=" as *u8); gn(p1); gp("\n" as *u8) } 21 22 // thresh_sq=0 (exact): only kp3 -> 1/4 = 250 23 let c2: i64 = pck_count(px,py,gx,gy,4,0) 24 if c2==1 { pass=pass+1; gp("P2 PCK@exact = 1/4 OK\n" as *u8) } 25 if c2!=1 { gp("P2 FAIL c=" as *u8); gn(c2); gp("\n" as *u8) } 26 27 // thresh_sq huge -> all correct 28 let c3: i64 = pck_permille(px,py,gx,gy,4,100000) 29 if c3==1000 { pass=pass+1; gp("P3 PCK@loose = 1000 permille (all) OK\n" as *u8) } 30 if c3!=1000 { gp("P3 FAIL p=" as *u8); gn(c3); gp("\n" as *u8) } 31 32 gp("PCK-GATE pass=" as *u8); gn(pass); gp("/3\n" as *u8) 33 if pass==3 { gp("PCK-GATE verdict=GREEN 3/3 (correct-within-thresh + exact + loose)\n" as *u8); sys_exit(0) } 34 sys_exit(1) 35 return 0 36}