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}