code wiki / _hdl_build / nx_product_atlas_build.nx
nx_product_atlas_build.nx source
↩ module page · 129 lines · 6367 B
1// nx_product_atlas_build.nx -- FIRST PRODUCT-ATLAS: ingest the design-to-market NEEDS + CAPABILITIES + the
2// COMPONENT keywords in the need notes into an eco_graph store (productgraph-) so nx_atlas_recombine can walk
3// PRODUCTS, not just software. Nodes: each need, each capability, each component keyword; edges: need->cap
4// (fulfils, by keyword match) + need->component (from note). Then `nx_atlas_recombine knowledge/store/productgraph-`
5// produces PRODUCT recombinations. Imports eco_graph + store_seed_lib (coexist since the ss_begin_cap fix).
6// usage: nx_product_atlas_build [needs-prefix] [caps-prefix] [out-prefix] license_tier: ORIGINAL expect_exit:0
7import "nx_store_seed_lib.nx"
8import "nx_seg_store.nx"
9import "nx_eco_graph.nx"
10import "nx_syscalls.nx"
11const PA_MAGIC_1024: i64 = 1024
12const PA_MAGIC_2048: i64 = 2048
13const PA_MAGIC_262144: i64 = 262144
14
15const PA_CAP: i64 = 262144
16const PA_NL: i64 = 10
17const PA_TAB: i64 = 9
18const PA_SP: i64 = 32
19const PA_MAXCOL: i64 = 16
20const PA_MAXROW: i64 = 64
21const CT_NOTE: i64 = 6
22
23func pa_slen(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n }
24func pa_w(s: *u8) -> i64 { sys_write(1, s, pa_slen(s)); return 0 }
25func pa_wn(v: i64) -> i64 { let b: *u8 = sys_mmap(24); var m: i64 = v; if m < 0 { sys_write(1, "-" as *u8, 1); 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 j: i64 = 0; while j < k { b[j] = t[k-1-j]; j = j + 1 } sys_write(1, b, k); return 0 }
26func pa_copy(dst: *u8, src: *u8, a: i64, b: i64) -> i64 { var n: i64 = 0; var i: i64 = a; while i < b { if n < 200 { dst[n] = src[i]; n = n + 1 } i = i + 1 } dst[n] = 0 as u8; return n }
27func pa_cols(q: *u8, ls: i64, le: i64, sp: *i64) -> i64 {
28 var c: i64 = 0
29 var p: i64 = ls
30 while c < PA_MAXCOL {
31 var e: i64 = p
32 var s: i64 = 1
33 while s == 1 { if e >= le { s = 0 } else { if q[e] == (PA_TAB as u8) { s = 0 } else { e = e + 1 } } }
34 sp[c*2] = p
35 sp[c*2+1] = e
36 c = c + 1
37 if e >= le { return c }
38 p = e + 1
39 }
40 return c
41}
42func pa_has_sub(q: *u8, a: i64, b: i64, w: *u8, wl: i64) -> i64 {
43 if wl < 3 { return 0 }
44 var i: i64 = a
45 while i + wl <= b {
46 var m: i64 = 1
47 var j: i64 = 0
48 while j < wl { if q[i+j] != w[j] { m = 0; j = wl } else { j = j + 1 } }
49 if m == 1 { return 1 }
50 i = i + 1
51 }
52 return 0
53}
54func pa_parse(buf: *u8, n: i64, na: *i64, nb: *i64, ta: *i64, tb: *i64) -> i64 {
55 let sp: *i64 = sys_mmap(PA_MAXCOL*2*8) as *i64
56 var rc: i64 = 0
57 var i: i64 = 0
58 while i < n {
59 var le: i64 = i
60 var s: i64 = 1
61 while s == 1 { if le >= n { s = 0 } else { if buf[le] == (PA_NL as u8) { s = 0 } else { le = le + 1 } } }
62 if le > i { if rc < PA_MAXROW {
63 let nc: i64 = pa_cols(buf, i, le, sp)
64 if nc >= 1 { na[rc] = sp[0]; nb[rc] = sp[1]; if nc > CT_NOTE { ta[rc] = sp[CT_NOTE*2]; tb[rc] = sp[CT_NOTE*2+1] } else { ta[rc] = sp[0]; tb[rc] = sp[1] } rc = rc + 1 }
65 } }
66 i = le + 1
67 }
68 return rc
69}
70
71func main(argc: i64, argv: *i64) -> i64 {
72 var needsp: *u8 = "knowledge/store/dmktneeds-" as *u8
73 var capsp: *u8 = "knowledge/store/dmktcap-" as *u8
74 var outp: *u8 = "knowledge/store/productgraph-" as *u8
75 if argc > 1 { needsp = argv[1] as *u8 }
76 if argc > 2 { capsp = argv[2] as *u8 }
77 if argc > 3 { outp = argv[3] as *u8 }
78 let nbuf: *u8 = sys_mmap(PA_CAP)
79 let nn: i64 = sts_load(needsp, nbuf, PA_CAP)
80 if nn <= 0 { pa_w("needs plane EMPTY\n" as *u8); sys_exit(1); return 1 }
81 let cbuf: *u8 = sys_mmap(PA_CAP)
82 let cnn: i64 = sts_load(capsp, cbuf, PA_CAP)
83 if cnn <= 0 { pa_w("caps plane EMPTY\n" as *u8); sys_exit(1); return 1 }
84 let nna: *i64 = sys_mmap(PA_MAXROW*8) as *i64
85 let nnb: *i64 = sys_mmap(PA_MAXROW*8) as *i64
86 let nta: *i64 = sys_mmap(PA_MAXROW*8) as *i64
87 let ntb: *i64 = sys_mmap(PA_MAXROW*8) as *i64
88 let nrows: i64 = pa_parse(nbuf, nn, nna, nnb, nta, ntb)
89 let cna: *i64 = sys_mmap(PA_MAXROW*8) as *i64
90 let cnb: *i64 = sys_mmap(PA_MAXROW*8) as *i64
91 let cta: *i64 = sys_mmap(PA_MAXROW*8) as *i64
92 let ctb: *i64 = sys_mmap(PA_MAXROW*8) as *i64
93 let crows: i64 = pa_parse(cbuf, cnn, cna, cnb, cta, ctb)
94 let g: *EcoGraph = eg_new(PA_MAGIC_1024, PA_MAGIC_2048, PA_MAGIC_262144, PA_MAGIC_2048)
95 let nidx: *i64 = sys_mmap(PA_MAXROW*8) as *i64
96 let cidx: *i64 = sys_mmap(PA_MAXROW*8) as *i64
97 let nmb: *u8 = sys_mmap(256)
98 var i: i64 = 0
99 while i < nrows { let l: i64 = pa_copy(nmb, nbuf, nna[i], nnb[i]); nidx[i] = eg_intern(g, nmb, l); i = i + 1 }
100 var j: i64 = 0
101 while j < crows { let l: i64 = pa_copy(nmb, cbuf, cna[j], cnb[j]); cidx[j] = eg_intern(g, nmb, l); j = j + 1 }
102 i = 0
103 while i < nrows {
104 var bestc: i64 = 0 - 1
105 var kk: i64 = pa_copy(nmb, nbuf, nna[i], nnb[i])
106 j = 0
107 while j < crows { if bestc < 0 { if pa_has_sub(cbuf, cta[j], ctb[j], nmb, kk) == 1 { bestc = j } } j = j + 1 }
108 if bestc >= 0 { eg_add_edge(g, nidx[i], cidx[bestc]) }
109 var p: i64 = nta[i]
110 let e: i64 = ntb[i]
111 while p < e {
112 var atsp: i64 = 1
113 while atsp == 1 { if p < e { if nbuf[p] == (PA_SP as u8) { p = p + 1 } else { atsp = 0 } } else { atsp = 0 } }
114 let ws: i64 = p
115 var iw: i64 = 1
116 while iw == 1 { if p < e { if nbuf[p] != (PA_SP as u8) { p = p + 1 } else { iw = 0 } } else { iw = 0 } }
117 let wl: i64 = p - ws
118 if wl >= 4 { let cl: i64 = pa_copy(nmb, nbuf, ws, p); let cnode: i64 = eg_intern(g, nmb, cl); if cnode >= 0 { eg_add_edge(g, nidx[i], cnode) } }
119 }
120 i = i + 1
121 }
122 eg_finalize(g)
123 if eg_save(g, outp) < 0 { pa_w("product-graph save error\n" as *u8); sys_exit(1); return 1 }
124 pa_w("=== nx_product_atlas_build: product graph saved ===\n" as *u8)
125 pa_w("needs=" as *u8); pa_wn(nrows); pa_w(" caps=" as *u8); pa_wn(crows); pa_w(" -> nodes=" as *u8); pa_wn(g.node_count); pa_w(" edges=" as *u8); pa_wn(g.edge_count); pa_w(" (needs+caps+components) -> " as *u8); pa_w(outp); pa_w("\n" as *u8)
126 pa_w("NEXT: nx_atlas_recombine " as *u8); pa_w(outp); pa_w(" 1 20 -> PRODUCT recombinations\n" as *u8)
127 sys_exit(0)
128 return 0
129}