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}