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}