code wiki / _hdl_build / nx_viz_tree.nx
nx_viz_tree.nx source
↩ module page · 43 lines · 1526 B
1// nx_viz_tree.nx -- the TIDY-TREE layer of the sovereign Nishi viz library (the d3-hierarchy tree core, bits-up).
2// Assigns x by leaf order (spacing 100) then centres each internal node over its children (post-order by
3// decreasing depth); y = depth. Cleaner than naive layered stacking (parents sit above their subtree's middle).
4// Closes layout-tree. license_tier: ORIGINAL
5import "nx_syscalls.nx"
6
7func vt_tree(n: i64, parent: *i64, x_out: *i64, depth_out: *i64) -> i64 {
8 var i: i64 = 0
9 while i < n {
10 var dep: i64 = 0; var p: i64 = parent[i]
11 while p >= 0 { dep = dep + 1; p = parent[p] }
12 depth_out[i] = dep
13 i = i + 1
14 }
15 var maxd: i64 = 0
16 i = 0
17 while i < n { if depth_out[i] > maxd { maxd = depth_out[i] } i = i + 1 }
18
19 var counter: i64 = 0
20 i = 0
21 while i < n {
22 var haschild: i64 = 0; var c: i64 = 0
23 while c < n { if parent[c] == i { haschild = 1; c = n } else { c = c + 1 } }
24 if haschild == 0 { x_out[i] = counter * 100; counter = counter + 1 }
25 i = i + 1
26 }
27
28 var dd: i64 = maxd - 1
29 while dd >= 0 {
30 i = 0
31 while i < n {
32 if depth_out[i] == dd {
33 var sum: i64 = 0; var cnt: i64 = 0; var c: i64 = 0
34 while c < n { if parent[c] == i { sum = sum + x_out[c]; cnt = cnt + 1 } c = c + 1 }
35 if cnt > 0 { x_out[i] = sum / cnt }
36 }
37 i = i + 1
38 }
39 dd = dd - 1
40 }
41 return maxd
42}
43func main() -> i64 { return 0 }