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}