code wiki / _hdl_build / nx_ng_world.nx

nx_ng_world.nx source

↩ module page · 183 lines · 10752 B

1// nx_ng_world.nx -- CAP-WORLD-MODEL, generation 14: THE ENDPOINT of the neural-graphics ladder. The leap past 2// every prior rung (which rendered STATIC scenes): a learned DYNAMICS model -- state x action -> next state -- 3// that can be ROLLED OUT (applied repeatedly) and RENDERED frame-by-frame = an interactive neural game engine 4// (Ha&Schmidhuber world model / GameNGen / Genie / Sora-class). src ng_world_sora, ng_world_t2v, ng_world_worldmodel. 5// 6// Reuses the renderer (software raster into nx_image, displayed via the nx_scene_demo canvas bridge -- the only 7// browser touch). Learns the transition rule from observed (state,action,next) transitions, then SIMULATES a 8// NOVEL action sequence and renders the rollout as a spacetime filmstrip (rows = time, cols = space). Q16, no float. 9// 10// Honest gated proof of the DEFINING (interactive) property: T1 LEARN-DYNAMICS -- recover the transition rule 11// from data (|V-V*| small); T2 INTERACTIVE ROLLOUT -- a NOVEL action sequence (not the training one) is simulated 12// correctly (predicted trajectory == true world, err~0) = actions drive the next frame, generalizes; T3 13// NEG-CONTROL -- a model that IGNORES the action (V=0, static) CANNOT predict (the action is load-bearing = what 14// makes it a *world* model, not a static scene); T4 RENDER+EMIT -- the rollout renders to a viewable filmstrip. 15// HONEST: 1-DOF state (object x-position), linear dynamics; full world-model = high-dim latent state + learned 16// non-linear dynamics + frame-conditioned generation = the follow-on. Sovereign: nx_image + nx_base64 + syscalls. 17// The emitted artifact is PUBLISHED via nx_ng_publish (NOT local show-and-tell). license_tier: ORIGINAL expect_exit: 0 18import "nx_image.nx" 19import "nx_itoa_lib.nx" // shared MSB-first emitter (zero-alloc) 20import "nx_base64.nx" 21const V_MAGIC_1024: i64 = 1024 22const V_MAGIC_8192: i64 = 8192 23const V_MAGIC_262144: i64 = 262144 24 25const WLOG: *u8 = "knowledge/status/ng_world.log" 26const OUTP: *u8 = "web_assets/ng_world_view.html" 27const Q16: i64 = 65536 28const NT: i64 = 12 // timesteps (filmstrip rows) 29const IW: i64 = 32 // space pixels (cols) 30const V_TRUE: i64 = 9830 // true per-action velocity 0.15 31const X0: i64 = 16384 // initial state 0.25 32const BR2: i64 = 655 // blob radius^2 (~0.1^2) for rendering 33const EPOCHS: i64 = 1000 34const LRQ: i64 = 2048 35 36func wp(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 37// MIGRATED to the shared emitter (debt 1785563586). The old body mmapped a scratch buffer 38// per call and never freed it. At PAGE granularity that is 4096B leaked PER CALL -- the 39// defect that took 28.5GB of a 36GB host in nx_ts_lumadiff (2MB input, ~3.66M calls). 40// nxi_* is MSB-first, allocates NOTHING, and emits identical bytes including the sign. 41func wpn(v: i64) -> i64 { nxi_out(v); return 0 } 42func w_abs(v: i64) -> i64 { if v<0 { return 0-v } return v } 43func wqm(a: i64, b: i64) -> i64 { return (a*b)>>16 } 44func wl_ws(fd: i64, s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(fd,s,n); return 0 } 45// MIGRATED to the shared emitter (debt 1785563586). The old body mmapped a scratch buffer 46// per call and never freed it. At PAGE granularity that is 4096B leaked PER CALL -- the 47// defect that took 28.5GB of a 36GB host in nx_ts_lumadiff (2MB input, ~3.66M calls). 48// nxi_* is MSB-first, allocates NOTHING, and emits identical bytes including the sign. 49func wl_wn(fd: i64, v: i64) -> i64 { nxi_fd(fd, v); return 0 } 50 51// --- canvas emitter copied from nx_scene_demo (sovereign framebuffer -> pixel-perfect canvas) --- 52func sc_app(out: *u8, off: *i64, s: *u8) -> i64 { var i: i64 = 0; while s[i] != (0 as u8) { out[off[0]] = s[i]; off[0] = off[0] + 1; i = i + 1 } return 0 } 53func sc_app_n(out: *u8, off: *i64, v: i64) -> i64 { 54 let t: *u8 = sys_mmap(28); var m: i64 = v; var k: i64 = 0 55 if m == 0 { t[0] = 48 as u8; k = 1 } 56 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } 57 var q: i64 = k - 1; while q >= 0 { out[off[0]] = t[q]; off[0] = off[0] + 1; q = q - 1 } 58 return 0 59} 60func nx_img_canvas_page(img: *Image, scale: i64, out: *u8, cap: i64) -> i64 { 61 let W: i64 = img.width 62 let H: i64 = img.height 63 let nbytes: i64 = W * H * 3 64 let b64: *u8 = sys_mmap(nbytes * 2 + 64) 65 let bn: i64 = b64_encode(img.pixels, nbytes, b64) 66 let off: *i64 = (sys_mmap(8)) as *i64 67 off[0] = 0 68 sc_app(out, off, "<!doctype html><html><head><meta charset=\"utf-8\"><title>Nishi World Model</title></head><body style=\"background:#111;text-align:center\">" as *u8) 69 sc_app(out, off, "<h2 style=\"color:#dde;font-family:sans-serif\">CAP-WORLD-MODEL &mdash; learned dynamics rolled out + rendered (rows=time, cols=space); sovereign, no WebGL</h2>" as *u8) 70 sc_app(out, off, "<canvas id=c width=" as *u8); sc_app_n(out, off, W * scale) 71 sc_app(out, off, " height=" as *u8); sc_app_n(out, off, H * scale) 72 sc_app(out, off, " style=\"image-rendering:pixelated;border:2px solid #444\"></canvas><script>var W=" as *u8); sc_app_n(out, off, W) 73 sc_app(out, off, ",H=" as *u8); sc_app_n(out, off, H) 74 sc_app(out, off, ",S=" as *u8); sc_app_n(out, off, scale) 75 sc_app(out, off, ",b=\"" as *u8) 76 var i: i64 = 0 77 while i < bn { out[off[0]] = b64[i]; off[0] = off[0] + 1; i = i + 1 } 78 sc_app(out, off, "\";var r=atob(b),o=document.createElement('canvas');o.width=W;o.height=H;var x=o.getContext('2d'),d=x.createImageData(W,H),p=0,i2=0;for(i2=0;i2<W*H;i2++){d.data[i2*4]=r.charCodeAt(p++);d.data[i2*4+1]=r.charCodeAt(p++);d.data[i2*4+2]=r.charCodeAt(p++);d.data[i2*4+3]=255;}x.putImageData(d,0,0);var c=document.getElementById('c'),t=c.getContext('2d');t.imageSmoothingEnabled=false;t.drawImage(o,0,0,W*S,H*S);</script></body></html>\n" as *u8) 79 out[off[0]] = 0 as u8 80 return off[0] 81} 82 83// roll out the world: traj[0]=x0 ; traj[t+1] = traj[t] + V*action[t] (action in {-Q16,0,+Q16}) 84func rollout(x0: i64, V: i64, acts: *i64, traj: *i64) -> i64 { 85 traj[0] = x0 86 var t: i64 = 0 87 while t < NT - 1 { traj[t+1] = traj[t] + wqm(V, acts[t]); t = t + 1 } 88 return 0 89} 90func max_traj_err(a: *i64, b: *i64) -> i64 { 91 var mx: i64 = 0; var t: i64 = 0 92 while t < NT { let e: i64 = w_abs(a[t]-b[t]); if e > mx { mx = e } t = t + 1 } 93 return mx 94} 95 96func main() -> i64 { 97 wp("nx_ng_world: CAP-WORLD-MODEL (ENDPOINT) -- learn dynamics (state x action -> next), roll out + render\n" as *u8) 98 // TRAINING action sequence + the true world trajectory it produces 99 let atr: *i64 = sys_mmap((NT-1)*8) as *i64 100 atr[0]=Q16; atr[1]=Q16; atr[2]=0; atr[3]=Q16; atr[4]=0; atr[5]=0-Q16; atr[6]=0-Q16; atr[7]=0; atr[8]=Q16; atr[9]=Q16; atr[10]=0-Q16 101 let xtr: *i64 = sys_mmap(NT*8) as *i64 102 rollout(X0, V_TRUE, atr, xtr) 103 104 // T1: LEARN the dynamics V from the observed transitions (teacher-forced; linear -> convex GD) 105 var V: i64 = 0 106 var ep: i64 = 0 107 while ep < EPOCHS { 108 var g: i64 = 0; var t: i64 = 0 109 while t < NT - 1 { 110 let pred: i64 = xtr[t] + wqm(V, atr[t]) 111 let resid: i64 = pred - xtr[t+1] 112 g = g + 2 * wqm(resid, atr[t]) 113 t = t + 1 114 } 115 V = V - wqm(LRQ, g) 116 ep = ep + 1 117 } 118 var t1: i64 = 0; if w_abs(V - V_TRUE) < V_MAGIC_1024 { t1 = 1 } 119 120 // T2: INTERACTIVE ROLLOUT on a NOVEL action sequence -> predicted world matches the true world 121 let ate: *i64 = sys_mmap((NT-1)*8) as *i64 122 ate[0]=Q16; ate[1]=0; ate[2]=Q16; ate[3]=Q16; ate[4]=0-Q16; ate[5]=0; ate[6]=Q16; ate[7]=0-Q16; ate[8]=0-Q16; ate[9]=0; ate[10]=Q16 123 let xpred: *i64 = sys_mmap(NT*8) as *i64; let xtrue: *i64 = sys_mmap(NT*8) as *i64 124 rollout(X0, V, ate, xpred) 125 rollout(X0, V_TRUE, ate, xtrue) 126 let t2err: i64 = max_traj_err(xpred, xtrue) 127 var t2: i64 = 0; if t2err < V_MAGIC_1024 { t2 = 1 } 128 129 // T3: NEG-CONTROL -- a model that IGNORES the action (V=0) cannot predict the world 130 let xstat: *i64 = sys_mmap(NT*8) as *i64 131 rollout(X0, 0, ate, xstat) 132 let t3err: i64 = max_traj_err(xstat, xtrue) 133 var t3: i64 = 0; if t3err > V_MAGIC_8192 { t3 = 1 } 134 135 // T4: RENDER the predicted rollout as a spacetime filmstrip (row=time, col=space) + EMIT a viewable canvas 136 let img: *Image = nx_image_alloc(IW, NT, 3) 137 var ty: i64 = 0 138 while ty < NT { 139 let xt: i64 = xpred[ty] 140 var c: i64 = 0 141 while c < IW { 142 let pos: i64 = c * (Q16/IW) + (Q16/(2*IW)) 143 let dlt: i64 = pos - xt; let d2: i64 = wqm(dlt, dlt) 144 var inten: i64 = 0 145 if d2 < BR2 { inten = 256 - (d2*256)/BR2; if inten<0 { inten=0 } if inten>256 { inten=256 } } 146 // moving object = cyan blob over a dark blue background 147 let rr: i64 = 16 + (inten*40)/256 148 let gg: i64 = 24 + (inten*220)/256 149 let bb: i64 = 40 + (inten*215)/256 150 nx_image_set(img, c, ty, 0, rr); nx_image_set(img, c, ty, 1, gg); nx_image_set(img, c, ty, 2, bb) 151 c = c + 1 152 } 153 ty = ty + 1 154 } 155 let out: *u8 = sys_mmap(V_MAGIC_262144) 156 let len: i64 = nx_img_canvas_page(img, 12, out, V_MAGIC_262144) 157 var wrote: i64 = 0 158 let fd: i64 = sys_openat_wr(OUTP, 420) 159 if fd>=0 { sys_write(fd, out, len); sys_close(fd); wrote=1 } 160 var t4: i64=0; if len>1000 { if wrote==1 { t4=1 } } 161 162 wp(" T1 LEARN-DYNAMICS: learned V=" as *u8); wpn(V); wp(" vs true 9830 ok=" as *u8); wpn(t1); wp("\n" as *u8) 163 wp(" T2 INTERACTIVE ROLLOUT (novel action seq): max trajectory err=" as *u8); wpn(t2err); wp(" simulates=" as *u8); wpn(t2); wp("\n" as *u8) 164 wp(" T3 NEG-CONTROL (action-ignored V=0): err vs true=" as *u8); wpn(t3err); wp(" action-load-bearing=" as *u8); wpn(t3); wp("\n" as *u8) 165 wp(" T4 RENDER+EMIT: filmstrip " as *u8); wpn(len); wp(" bytes -> " as *u8); wp(OUTP); wp(" wrote=" as *u8); wpn(wrote); wp("\n" as *u8) 166 167 var ok: i64=1 168 if t1!=1 { ok=0 } 169 if t2!=1 { ok=0 } 170 if t3!=1 { ok=0 } 171 if t4!=1 { ok=0 } 172 let logf: i64=sys_openat_append(WLOG, 420) 173 if logf>=0 { 174 wl_ws(logf,"NGWORLD authored=organ world-model-endpoint learnedV=" as *u8); wl_wn(logf,V) 175 wl_ws(logf," t1=" as *u8); wl_wn(logf,t1); wl_ws(logf," t2_rollout=" as *u8); wl_wn(logf,t2); wl_ws(logf," t3_negctl=" as *u8); wl_wn(logf,t3); wl_ws(logf," t4_render=" as *u8); wl_wn(logf,t4) 176 if ok==1 { wl_ws(logf," verdict=GREEN\n" as *u8) } else { wl_ws(logf," verdict=RED\n" as *u8) } 177 sys_close(logf) 178 } 179 wp(" verdict=" as *u8) 180 if ok==1 { wp("GREEN (learned dynamics + interactive rollout of a novel action sequence + rendered filmstrip = a world model, the ENDPOINT)\n" as *u8); sys_exit(0); return 0 } 181 wp("RED\n" as *u8) 182 sys_exit(1); return 1 183}