code wiki / _hdl_build / nx_sim_uq_gate.nx
nx_sim_uq_gate.nx source
↩ module page · 74 lines · 5262 B
1// nx_sim_uq_gate.nx -- climb the UNCERTAINTY QUANTIFICATION axis (NASA-STD-7009 "Results Uncertainty"; ASME V&V
2// 20 / FDA all require UQ). A sovereign Monte-Carlo uncertainty-propagation engine, VERIFIED against the exact
3// analytic propagation law. Sim: projectile range R = (2*vy/g)*vx = k*vx (k=5 with vy=10,g=4). The horizontal
4// launch speed vx is UNCERTAIN: uniform over integers [mu-W, mu+W] (analytic variance W(W+1)/3). MC samples vx,
5// runs the sim, and the OUTPUT distribution must satisfy the analytic law: E[R]=k*mu, Var[R]=k^2*Var[vx]. The
6// sigma interval uses our sovereign isqrt. Liar-kill: with an uncertain input the output variance is provably
7// > 0 -- a "certain/deterministic output" claim is rejected. Deterministic PRNG (reproducible). GREEN iff 6/6.
8// license_tier: ORIGINAL
9import "nx_syscalls.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 }
15func xrng(s: *i64) -> i64 { var x: i64=s[0]; x = x ^ (x << 13); x = x ^ (x >> 7); x = x ^ (x << 17); s[0]=x; return x }
16func rpos(s: *i64) -> i64 { let v: i64=xrng(s); return v & 0x3FFFFFFFFFFFFFFF }
17func isqrt(N: i64) -> i64 { if N<2 { return N } var x: i64=N; var y: i64=(x+1)/2; while y<x { x=y; y=(x + N/x)/2 } return x }
18
19// the sim: projectile range as a function of horizontal launch speed (linear, gain k).
20func sim_range(vx: i64, k: i64) -> i64 { return k*vx }
21
22// MC propagation: out[0]=mean_R, out[1]=var_R, out[2]=count within mu_R +/- sigma_R, out[3]=var_vx(empirical).
23func mc_run(seed: i64, mu: i64, W: i64, k: i64, N: i64, out: *i64) -> i64 {
24 let st: *i64=sys_mmap(8) as *i64; st[0]=seed
25 let span: i64=2*W+1
26 var sx: i64=0; var sx2: i64=0; var sy: i64=0; var sy2: i64=0
27 let ys: *i64=sys_mmap(8*N) as *i64
28 var i: i64=0
29 while i<N {
30 let vx: i64 = (mu-W) + (rpos(st)%span)
31 let R: i64 = sim_range(vx,k)
32 sx=sx+vx; sx2=sx2+vx*vx; sy=sy+R; sy2=sy2+R*R; ys[i]=R
33 i=i+1
34 }
35 let mean_y: i64=sy/N; let var_y: i64=sy2/N - mean_y*mean_y
36 let mean_x: i64=sx/N; let var_x: i64=sx2/N - mean_x*mean_x
37 let sig: i64=isqrt(var_y)
38 var cnt: i64=0; i=0
39 while i<N { if iabs(ys[i]-mean_y)<=sig { cnt=cnt+1 } i=i+1 }
40 out[0]=mean_y; out[1]=var_y; out[2]=cnt; out[3]=var_x
41 return 0
42}
43
44func main() -> i64 {
45 let pass: *i64 = sys_mmap(8) as *i64; pass[0]=0
46 g_w("=== NX-SIM-UQ GATE (Monte-Carlo uncertainty propagation, verified vs the analytic law) ===\n")
47 let mu: i64=1000; let W: i64=300; let k: i64=5; let N: i64=200000
48 let var_x_analytic: i64 = W*(W+1)/3 // variance of discrete uniform on [mu-W, mu+W]
49 let mean_y_analytic: i64 = k*mu // E[R] = k*E[vx]
50 let var_y_analytic: i64 = k*k*var_x_analytic // Var[R] = k^2 Var[vx]
51
52 let a: *i64=sys_mmap(8*8) as *i64; mc_run(0x9E3779B97F4A7C15, mu, W, k, N, a)
53 let b: *i64=sys_mmap(8*8) as *i64; mc_run(0x2545F4914F6CDD1D, mu, W, k, N, b)
54 let sig_y: i64=isqrt(a[1])
55
56 g_w(" analytic: Var[vx]="); g_n(var_x_analytic); g_w(" E[R]="); g_n(mean_y_analytic); g_w(" Var[R]="); g_n(var_y_analytic); g_w("\n")
57 g_w(" MC seed1: mean_R="); g_n(a[0]); g_w(" var_R="); g_n(a[1]); g_w(" sigma_R="); g_n(sig_y); g_w(" within1sig%="); g_n(a[2]*100/N); g_w(" var_vx="); g_n(a[3]); g_w("\n")
58 g_w(" MC seed2: mean_R="); g_n(b[0]); g_w(" var_R="); g_n(b[1]); g_w("\n")
59
60 // tolerances (MC error for N=2e5 ~0.3%): variance +/-3%, mean +/-1%
61 let vtol: i64=var_y_analytic*3/100; let vxtol: i64=var_x_analytic*3/100; let mtol: i64=mean_y_analytic/100
62 g_row("SAMPLER: empirical input variance matches analytic W(W+1)/3 (the sampler is correct)" as *u8, (iabs(a[3]-var_x_analytic)<vxtol) as i64, pass)
63 g_row("MEAN PROPAGATION: E[R] == k*E[vx] (the mean propagates through the sim)" as *u8, (iabs(a[0]-mean_y_analytic)<mtol) as i64, pass)
64 g_row("VARIANCE PROPAGATION: Var[R] == k^2 * Var[vx] (UQ law, within MC tolerance)" as *u8, (iabs(a[1]-var_y_analytic)<vtol) as i64, pass)
65 var ci: i64=0; if a[2]*100/N > 52 { if a[2]*100/N < 64 { ci=1 } } // uniform: ~57.7% within +/-1 sigma
66 g_row("CONFIDENCE INTERVAL: ~58% of outputs within mean +/- 1 sigma (sigma via sovereign isqrt) -- usable CI" as *u8, ci, pass)
67 g_row("ROBUSTNESS: an independent PRNG seed reproduces the propagated variance (within MC tolerance)" as *u8, (iabs(a[1]-b[1]) < vtol) as i64, pass)
68 var liar: i64=0; if a[1] > 0 { if iabs(a[1]-var_y_analytic)<vtol { liar=1 } }
69 g_row("LIAR-KILL: with uncertain input the output variance is provably > 0 -- a 'certain output' claim is rejected" as *u8, liar, pass)
70
71 g_w("SIM-UQ-GATE rows=6 pass="); g_n(pass[0])
72 if pass[0]==6 { g_w(" verdict=GREEN\n"); sys_exit(0); return 0 }
73 g_w(" verdict=RED\n"); sys_exit(1); return 1
74}