code wiki / _hdl_build / nx_viz_force_gate.nx

nx_viz_force_gate.nx source

↩ module page · 62 lines · 2801 B

1// nx_viz_force_gate.nx -- REFEREE for the force layer (physics-based KATs, not brittle exact strings). 2// T1 determinism : same graph + same start -> byte-identical layout (no hidden RNG) 3// T2 spring : 2 nodes far apart + 1 edge -> converge toward k = isqrt(W*H/n) (~707) 4// T3 repulsion : 2 nodes close + NO edge -> pushed well apart (final dist >> initial) 5// GREEN iff T1+T2+T3. Sovereign: nx_viz_force (-> nx_viz_trig isqrt). license_tier: ORIGINAL 6import "nx_viz_force.nx" 7import "nx_viz_trig.nx" 8import "nx_syscalls.nx" 9 10func 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 } 11func g_row(name: *u8, ok: i64) -> i64 { 12 if ok == 1 { g_w(" PASS " as *u8) } 13 if ok != 1 { g_w(" FAIL " as *u8) } 14 g_w(name); g_w("\n" as *u8) 15 return ok 16} 17func gdist(xs: *i64, ys: *i64, a: i64, b: i64) -> i64 { 18 let dx: i64 = xs[a] - xs[b] 19 let dy: i64 = ys[a] - ys[b] 20 return vs_isqrt(dx * dx + dy * dy) 21} 22 23func main() -> i64 { 24 g_w("viz-force gate (Fruchterman-Reingold force-directed layout, integer)\n" as *u8) 25 let xs: *i64 = sys_mmap(512) as *i64 26 let ys: *i64 = sys_mmap(512) as *i64 27 let xs2: *i64 = sys_mmap(512) as *i64 28 let ys2: *i64 = sys_mmap(512) as *i64 29 let ea: *i64 = sys_mmap(512) as *i64 30 let eb: *i64 = sys_mmap(512) as *i64 31 var pass: i64 = 0 32 33 xs[0] = 100; ys[0] = 100; xs[1] = 900; ys[1] = 100; xs[2] = 500; ys[2] = 800 34 xs2[0] = 100; ys2[0] = 100; xs2[1] = 900; ys2[1] = 100; xs2[2] = 500; ys2[2] = 800 35 ea[0] = 0; eb[0] = 1; ea[1] = 1; eb[1] = 2; ea[2] = 2; eb[2] = 0 36 vf_layout(3, xs, ys, 3, ea, eb, 1000, 1000, 150, 0) 37 vf_layout(3, xs2, ys2, 3, ea, eb, 1000, 1000, 150, 0) 38 var t1: i64 = 0 39 if xs[0] == xs2[0] { if ys[0] == ys2[0] { if xs[1] == xs2[1] { if ys[2] == ys2[2] { t1 = 1 } } } } 40 pass = pass + g_row("T1 deterministic (same input -> same layout)\x00" as *u8, t1) 41 42 xs[0] = 0; ys[0] = 500; xs[1] = 1000; ys[1] = 500 43 ea[0] = 0; eb[0] = 1 44 vf_layout(2, xs, ys, 1, ea, eb, 1000, 1000, 250, 0) 45 let dspring: i64 = gdist(xs, ys, 0, 1) 46 var t2: i64 = 0 47 if dspring > 450 { if dspring < 950 { t2 = 1 } } 48 pass = pass + g_row("T2 spring: 2 nodes+edge converge near k(=707)\x00" as *u8, t2) 49 50 xs[0] = 490; ys[0] = 500; xs[1] = 510; ys[1] = 500 51 let dinit: i64 = gdist(xs, ys, 0, 1) 52 vf_layout(2, xs, ys, 0, ea, eb, 1000, 1000, 250, 0) 53 let dfin: i64 = gdist(xs, ys, 0, 1) 54 var t3: i64 = 0 55 if dfin > dinit + 100 { t3 = 1 } 56 pass = pass + g_row("T3 repulsion: 2 nodes no-edge pushed apart\x00" as *u8, t3) 57 58 if pass == 3 { g_w("VIZ-FORCE GATE GREEN 3/3 (deterministic FR layout: springs+repulsion balance)\n" as *u8); sys_exit(0) } 59 g_w("VIZ-FORCE GATE RED\n" as *u8) 60 sys_exit(1) 61 return 1 62}