code wiki / _hdl_build / nx_solarsim_gate.nx
nx_solarsim_gate.nx source
↩ module page · 93 lines · 5828 B
1// nx_solarsim_gate.nx -- NATIVE verify of the browser solar-system sim (base = mmap; the SAME base-relative code
2// runs in the sovereign WASM). Proves it is REAL physics, not animation: each planet is leapfrog-integrated under
3// the Sun's gravity, and we (1) measure each EMERGENT orbital period (steps to close the orbit) and show the
4// ratios match the REAL measured planetary periods (Kepler T~a^1.5) within 3%, (2) confirm the inner-faster
5// ordering, (3) confirm orbits stay bounded (no spiral/escape) with energy conserved, (4) raster a frame to PNG.
6// This is the "video games are simulators / full real physics" deliverable, browser-ready. license_tier: ORIGINAL expect_exit: 0
7import "nx_syscalls.nx"
8import "nx_solarsim.nx"
9import "nx_png.nx"
10
11func g_w(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
12func g_n(v: i64) -> i64 { var m: i64=v; if m<0{g_w("-");m=0-m} let t:*u8=sys_mmap(24); 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; let o:*u8=sys_mmap(24); while i<k{o[i]=t[k-1-i];i=i+1}; sys_write(1,o,k); return 0 }
13func g_row(id: *u8, ok: i64, pass: *i64) -> i64 { g_w(" "); g_w(id); g_w(": "); if ok==1 { g_w("OK\n"); pass[0]=pass[0]+1 } else { g_w("FAIL\n") } return 0 }
14func iabs(x: i64) -> i64 { if x<0 { return 0-x } return x }
15
16// measure planet p's emergent orbital period (steps to return to a y=0 up-crossing with x>0), others frozen
17func measure_period(base: i64, p: i64) -> i64 {
18 init_impl(base)
19 let X: *i64=(base+O_X) as *i64; let Y: *i64=(base+O_Y) as *i64
20 var prev: i64=Y[p]; var step: i64=0
21 while step<300000 {
22 step_one_impl(base, p)
23 let cy: i64=Y[p]
24 if prev<0 { if cy>=0 { if X[p]>0 { if step>10 { return step } } } }
25 prev=cy; step=step+1
26 }
27 return 0
28}
29
30func main() -> i64 {
31 let pass: *i64 = sys_mmap(8) as *i64; pass[0]=0
32 g_w("=== NX-SOLARSIM native verify (real N-body solar system; SAME code runs in sovereign wasm) ===\n")
33 let base: i64 = sys_mmap(2*1048576) as i64
34
35 // ---- emergent periods from the gravity integration ----
36 let T: *i64=sys_mmap(8*8) as *i64
37 var p: i64=0; while p<N { T[p]=measure_period(base, p); p=p+1 }
38 // real measured period ratios x1000 (T_planet / T_earth): from nx_sim_validation_real_gate's measured data
39 let rr: *i64=sys_mmap(8*8) as *i64
40 rr[0]=241; rr[1]=615; rr[2]=1000; rr[3]=1881; rr[4]=11860
41 let nmh: *i64=sys_mmap(8*8) as *i64
42 nmh[0]=("Mercury" as *u8) as i64; nmh[1]=("Venus " as *u8) as i64; nmh[2]=("Earth " as *u8) as i64; nmh[3]=("Mars " as *u8) as i64; nmh[4]=("Jupiter" as *u8) as i64
43
44 var kepler_ok: i64=1; var worst: i64=0
45 p=0
46 while p<N {
47 let mr: i64 = T[p]*1000/T[2] // measured ratio to Earth x1000
48 let err: i64 = iabs(mr - rr[p])
49 if err > rr[p]*3/100 { kepler_ok=0 } // 3% tolerance
50 if err*1000/rr[p] > worst { worst = err*1000/rr[p] }
51 g_w(" "); g_w((nmh[p] as *u8)); g_w(" emergent T(steps)="); g_n(T[p]); g_w(" ratio/Earth(x1000)="); g_n(mr); g_w(" real="); g_n(rr[p]); g_w("\n")
52 p=p+1
53 }
54 // ordering: strictly increasing periods (inner faster)
55 var ordered: i64=1; p=1; while p<N { if T[p] <= T[p-1] { ordered=0 } p=p+1 }
56
57 // ---- stability + energy over a full inner-system run ----
58 init_impl(base)
59 let e0: *i64=sys_mmap(8*8) as *i64; p=0; while p<N { e0[p]=energy_p(base,p); p=p+1 }
60 var t: i64=0; while t<300 { tick_impl(base, 0); t=t+1 }
61 let X: *i64=(base+O_X) as *i64; let Y: *i64=(base+O_Y) as *i64; let R0: *i64=(base+O_R0) as *i64
62 var bounded: i64=1; var econs: i64=1
63 p=0
64 while p<N {
65 let r: i64=isqrt(X[p]*X[p]+Y[p]*Y[p])
66 if r < R0[p]*85/100 { bounded=0 }
67 if r > R0[p]*115/100 { bounded=0 }
68 let ec: i64=energy_p(base,p); var ae0: i64=e0[p]; if ae0<0 { ae0=0-ae0 }
69 let drift: i64=iabs(ec-e0[p])*1000/ae0
70 if drift > 50 { econs=0 } // <5% energy drift
71 p=p+1
72 }
73
74 // ---- raster a frame ----
75 render_impl(base)
76 write_png((base + O_FB) as *i64, W, H, "knowledge/nx_solarsim.png" as *u8)
77 let fb: *i64=(base+O_FB) as *i64; let sun: i64=fb[CY*W+CX]
78 g_w(" worst Kepler ratio error="); g_n(worst); g_w("/1000 bounded="); g_n(bounded); g_w(" energy-conserved="); g_n(econs); g_w(" -> knowledge/nx_solarsim.png\n")
79
80 var ran: i64=0; if T[0]>0 { if T[4]>0 { ran=1 } }
81 g_row("SIM RUNS: all 5 planets leapfrog-integrated under the Sun's gravity and completed orbits" as *u8, ran, pass)
82 g_row("STABLE ORBITS: every planet's radius stays within 15% of its true semi-major axis (no spiral/escape) over a full inner-system run" as *u8, bounded, pass)
83 g_row("ENERGY CONSERVED: symplectic leapfrog keeps each planet's orbital energy bounded (drift < 5%)" as *u8, econs, pass)
84 g_row("EMERGENT KEPLER: the periods EMERGE from the gravity integration and match the REAL measured planetary periods within 3% (T~a^1.5)" as *u8, kepler_ok, pass)
85 g_row("INNER-FASTER ORDERING: T(Mercury)<Venus<Earth<Mars<Jupiter -- the real Kepler ordering, from physics not script" as *u8, ordered, pass)
86 g_row("RASTER: framebuffer drawn (Sun + planets), non-empty frame -> knowledge/nx_solarsim.png" as *u8, ((sun & 255)>200) as i64, pass)
87 var iface: i64=0; if ww()==W { if hh()==H { if fb_off()==O_FB { iface=1 } } }
88 g_row("WASM-READY: init/tick/render/ww/hh/fb_off interface intact -- the exact base-relative code wasm runs" as *u8, iface, pass)
89
90 g_w("NX-SOLARSIM-GATE rows=7 pass="); g_n(pass[0])
91 if pass[0]==7 { g_w(" verdict=GREEN (real N-body solar system; emergent Kepler periods match real data; browser-ready)\n"); sys_exit(0); return 0 }
92 g_w(" verdict=RED\n"); sys_exit(1); return 1
93}