code wiki / _hdl_build / nx_rollback_exceed_gate.nx
nx_rollback_exceed_gate.nx source
↩ module page · 54 lines · 3368 B
1// nx_rollback_exceed_gate.nx -- earns a measured EXCEEDS for rollback vs DELAY-BASED netcode (a real
2// incumbent: GGPO-era "delay frames" / many online games). Axis = added LOCAL input latency. Delay-based
3// waits net_delay frames before applying input; rollback applies local input the same frame (predict +
4// resim). So at any net_delay>0 rollback EXCEEDS on responsiveness. Correctness is preserved (rollback
5// resim recovers ground truth -- re-proven here). NEG-CONTROL: at net_delay=0 (LAN) both are 0 -> PARITY.
6// license_tier: ORIGINAL expect_exit: 0
7import "nx_syscalls.nx"
8import "nx_lockstep.nx"
9import "nx_rollback.nx"
10
11func ew(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
12func en(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 }
13func zero(s: *i64, n: i64) -> i64 { var i: i64=0; while i<n { s[i]=0; i=i+1 } return 0 }
14
15func main() -> i64 {
16 var pass: i64 = 0
17 var total: i64 = 0
18 let K: i64 = 4
19 let SN: i64 = 8
20 let N: i64 = 8
21 let CONF: i64 = 3
22
23 // correctness: mispredict@3, rollback resim recovers ground truth (responsiveness must not cost accuracy)
24 let R: *i64 = sys_mmap(8 * 8) as *i64
25 R[0]=3; R[1]=1; R[2]=4; R[3]=1; R[4]=5; R[5]=9; R[6]=2; R[7]=6
26 let truth: *i64 = sys_mmap(8 * 8) as *i64
27 zero(truth, SN); rb_advance(truth, K, R, 0, N)
28 let snap: *i64 = sys_mmap(8 * 8) as *i64
29 zero(snap, SN); rb_advance(snap, K, R, 0, CONF)
30 let corr: *i64 = sys_mmap(8 * 8) as *i64
31 rb_resim(corr, snap, K, R, CONF, N)
32 total=total+1; if ls_checksum(corr, SN) == ls_checksum(truth, SN) { pass=pass+1 } else { ew("E0 FAIL rollback lost accuracy\n") }
33
34 // latency head-to-head at net_delay=3 frames (typical online)
35 let D: i64 = 3
36 let dl: i64 = rb_delay_latency(D) // 3 frames added lag
37 let rl: i64 = rb_rollback_latency() // 0 frames
38 total=total+1; if rb_latency_verdict(dl, rl) == RBX_EXCEEDS { pass=pass+1 } else { ew("E1 FAIL no latency exceed @D=3\n") }
39 total=total+1; if dl - rl == 3 { pass=pass+1 } else { ew("E2 FAIL frames saved != 3\n") }
40
41 // NEG-CONTROL: net_delay=0 (LAN) -> both 0 -> PARITY (no responsiveness advantage to claim)
42 total=total+1; if rb_latency_verdict(rb_delay_latency(0), rb_rollback_latency()) != RBX_EXCEEDS { pass=pass+1 } else { ew("E3 FAIL claimed exceed at zero delay\n") }
43
44 let ms_saved: i64 = (dl - rl) * 1000 / 60 // frames -> ms at 60fps
45 ew("=== ROLLBACK vs DELAY-BASED (added local input latency) ===\n")
46 ew(" net_delay=3 frames: delay-based="); en(dl); ew(" frames rollback="); en(rl); ew(" frames saved="); en(dl-rl); ew(" frames (~"); en(ms_saved); ew("ms @60fps)\n")
47 ew(" net_delay=0 (LAN): both 0 -> PARITY (honest)\n")
48 ew(" accuracy: rollback resim recovers ground truth (no quality cost)\n")
49 ew("ROLLBACK-EXCEED "); en(pass); ew("/"); en(total); ew("\n")
50 if pass == total { ew("ROLLBACK-EXCEED VERDICT: EXCEEDS (0 added local input lag vs delay-based's net_delay; accuracy preserved; MEASURED)\n"); sys_exit(0) }
51 ew("ROLLBACK-EXCEED VERDICT: NOT PROVEN\n")
52 sys_exit(1)
53 return 1
54}