code wiki / _hdl_build / nx_ciq_analyst.nx
nx_ciq_analyst.nx source
↩ module page · 182 lines · 10663 B
1// nx_ciq_analyst.nx -- R1 of the CIQ arc, now MARKET-GENERIC: the ANALYST. Reads the markets registry
2// ("ciq:markets" -> list) from the SOVEREIGN seg_store and, for EACH market, computes per entity the two
3// Gartner Magic-Quadrant axes in no-float permil (0..1000):
4// Ability-to-Execute = weighted level over the KNOWN E-axis cells / max possible
5// Completeness-of-Vision = weighted level over the KNOWN V-axis cells / max possible
6// plus an honest data-COMPLETENESS permil per entity. LIAR-KILL: a FULL cell (level==max) with NO cited
7// evidence is invalid -> RED. Scores are written back ("ciq:<market>:score:<entity>") for the placer.
8// Generic over markets via inline key-building (ciq:<market>:meta / :cap:<name> / :score:<entity>), so a
9// new market = a new ingest organ + a markets-list entry, ZERO change here. Thresholds = NAMED consts
10// (rule #11). Mirrors nx_codata_ingest's sovereign store idiom. license_tier: ORIGINAL expect_exit: 0
11import "nx_syscalls.nx"
12import "nx_canon_cid.nx"
13import "nx_seg_store.nx"
14import "nx_uxf_decode.nx"
15const AQ_MAGIC_1024: i64 = 1024
16const AQ_MAGIC_8192: i64 = 8192
17
18const AQ_STORE: *u8 = "knowledge/store/ciq-"
19const AQ_MAXLEVEL: i64 = 2
20const AQ_COMPL_FLOOR: i64 = 400
21
22func aw(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
23func an(v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m;sys_write(1,"-" as *u8,1)} let t: *u8=sys_mmap(28); 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 i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1} sys_write(1,bb,k); return 0 }
24func aq_streq(a: *u8, b: *u8) -> i64 { var i: i64=0; while a[i]!=(0 as u8){ if a[i]!=b[i]{return 0} i=i+1 } if b[i]!=(0 as u8){return 0} return 1 }
25func aq_itoa(v: i64, b: *u8) -> i64 { var m: i64=v; if m<0{m=0-m} let t: *u8=sys_mmap(32); 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 i: i64=0; while i<k{b[i]=t[k-1-i];i=i+1} b[k]=0 as u8; return k }
26func aq_pint(s: *u8) -> i64 { var v: i64=0; var i: i64=0; var go: i64=1; while go==1 { let c: i64=s[i]; if c>=48 { if c<=57 { v=v*10+(c-48); i=i+1 } else { go=0 } } else { go=0 } } return v }
27func aq_field(dk: *i64, dv: *i64, nf: i64, name: *u8) -> *u8 { var f: i64=0; while f<nf { if aq_streq(dk[f] as *u8, name)==1 { return dv[f] as *u8 } f=f+1 } return 0 as *u8 }
28func aq_split(buf: *u8, delim: i64, out: *i64, maxn: i64) -> i64 { var n: i64=0; var i: i64=0; var intok: i64=0; while buf[i]!=(0 as u8) { let c: i64=buf[i]; if c==delim { buf[i]=0 as u8; intok=0 } else { if intok==0 { if n<maxn { out[n]=(buf as i64)+i; n=n+1 } intok=1 } } i=i+1 } return n }
29func aq_copy(src: *u8, dst: *u8) -> i64 { var i: i64=0; while src[i]!=(0 as u8){ dst[i]=src[i]; i=i+1 } dst[i]=0 as u8; return i }
30func aq_hasev(cell: *u8) -> i64 { var i: i64=0; while cell[i]!=(0 as u8){ if cell[i]==(33 as u8){ if cell[i+1]!=(0 as u8){ return 1 } } i=i+1 } return 0 }
31func aq_invalid(level: i64, has_ev: i64) -> i64 { if level==AQ_MAXLEVEL { if has_ev==0 { return 1 } } return 0 }
32// build "ciq:<market>:<suffix>" into buf (NUL-terminated)
33func aq_key(buf: *u8, market: *u8, suffix: *u8) -> i64 { var o: i64=0; o=ss_cat(buf,o,"ciq:" as *u8); o=ss_cat(buf,o,market); o=ss_cat(buf,o,":" as *u8); o=ss_cat(buf,o,suffix); buf[o]=0 as u8; return o }
34
35// score ONE market; write its score records into the shared writer sw. returns invalid-cell count (0=clean), or -1 if market unreadable.
36func score_market(market: *u8, sw: *i64) -> i64 {
37 let gp: *i64 = sys_mmap(8) as *i64
38 let gl: *i64 = sys_mmap(8) as *i64
39 let dk: *i64 = sys_mmap(8 * 16) as *i64
40 let dv: *i64 = sys_mmap(8 * 16) as *i64
41 let mk: *u8 = sys_mmap(256)
42 aq_key(mk, market, "meta" as *u8)
43 if ss_get(AQ_STORE, mk, gp, gl) != 1 { return 0 - 1 }
44 let mnf: i64 = canon_decode(gp[0] as *u8, gl[0], dk, dv, 16)
45 let ents_raw: *u8 = aq_field(dk, dv, mnf, "entities" as *u8)
46 let caps_raw: *u8 = aq_field(dk, dv, mnf, "caps" as *u8)
47 if ents_raw == (0 as *u8) { return 0 - 1 }
48 if caps_raw == (0 as *u8) { return 0 - 1 }
49 let ebuf: *u8 = sys_mmap(AQ_MAGIC_1024); aq_copy(ents_raw, ebuf)
50 let cbuf: *u8 = sys_mmap(AQ_MAGIC_8192); aq_copy(caps_raw, cbuf)
51 let ent: *i64 = sys_mmap(8 * 16) as *i64
52 let capn: *i64 = sys_mmap(8 * 64) as *i64
53 let N: i64 = aq_split(ebuf, 44, ent, 16)
54 let M: i64 = aq_split(cbuf, 44, capn, 64)
55
56 let exn: *i64 = sys_mmap(8 * 16) as *i64
57 let exd: *i64 = sys_mmap(8 * 16) as *i64
58 let vsn: *i64 = sys_mmap(8 * 16) as *i64
59 let vsd: *i64 = sys_mmap(8 * 16) as *i64
60 let known: *i64 = sys_mmap(8 * 16) as *i64
61 var z: i64 = 0
62 while z < N { exn[z]=0; exd[z]=0; vsn[z]=0; vsd[z]=0; known[z]=0; z=z+1 }
63 var invalid: i64 = 0
64
65 let kb: *u8 = sys_mmap(256)
66 let capsuf: *u8 = sys_mmap(128)
67 let cellbuf: *u8 = sys_mmap(512)
68 let cellp: *i64 = sys_mmap(8 * 16) as *i64
69 var j: i64 = 0
70 while j < M {
71 var so: i64 = 0; so = ss_cat(capsuf, so, "cap:" as *u8); so = ss_cat(capsuf, so, capn[j] as *u8); capsuf[so] = 0 as u8
72 aq_key(kb, market, capsuf)
73 if ss_get(AQ_STORE, kb, gp, gl) == 1 {
74 let cnf: i64 = canon_decode(gp[0] as *u8, gl[0], dk, dv, 16)
75 let ax: *u8 = aq_field(dk, dv, cnf, "ax" as *u8)
76 let wtp: *u8 = aq_field(dk, dv, cnf, "wt" as *u8)
77 let cells: *u8 = aq_field(dk, dv, cnf, "cells" as *u8)
78 if cells != (0 as *u8) {
79 let wt: i64 = aq_pint(wtp)
80 var isV: i64 = 0
81 if aq_streq(ax, "V" as *u8) == 1 { isV = 1 }
82 aq_copy(cells, cellbuf)
83 let nc: i64 = aq_split(cellbuf, 59, cellp, 16)
84 var i: i64 = 0
85 while i < N {
86 if i < nc {
87 let cell: *u8 = cellp[i] as *u8
88 let c0: i64 = cell[0]
89 if c0 != (85 as u8) {
90 var level: i64 = c0 - 48
91 if level < 0 { level = 0 }
92 if level > AQ_MAXLEVEL { level = AQ_MAXLEVEL }
93 let hev: i64 = aq_hasev(cell)
94 if aq_invalid(level, hev) == 1 { invalid = invalid + 1 }
95 known[i] = known[i] + 1
96 if isV == 1 { vsn[i] = vsn[i] + level * wt; vsd[i] = vsd[i] + AQ_MAXLEVEL * wt }
97 else { exn[i] = exn[i] + level * wt; exd[i] = exd[i] + AQ_MAXLEVEL * wt }
98 }
99 }
100 i = i + 1
101 }
102 }
103 }
104 j = j + 1
105 }
106
107 aw("-- market=" as *u8); aw(market); aw(" entities=" as *u8); an(N); aw(" capabilities=" as *u8); an(M); aw(" --\n" as *u8)
108 let nb1: *u8 = sys_mmap(32); let nb2: *u8 = sys_mmap(32); let nb3: *u8 = sys_mmap(32); let nb4: *u8 = sys_mmap(32)
109 var i2: i64 = 0
110 while i2 < N {
111 var exP: i64 = 0; if exd[i2] > 0 { exP = (exn[i2] * 1000) / exd[i2] }
112 var vsP: i64 = 0; if vsd[i2] > 0 { vsP = (vsn[i2] * 1000) / vsd[i2] }
113 var compl: i64 = 0; if M > 0 { compl = (known[i2] * 1000) / M }
114 var flag: *u8 = "OK" as *u8
115 if compl < AQ_COMPL_FLOOR { flag = "LOW-DATA" as *u8 }
116 aw(" " as *u8); aw(ent[i2] as *u8); aw(" EXEC=" as *u8); an(exP); aw(" VIS=" as *u8); an(vsP); aw(" compl=" as *u8); an(compl); aw(" [" as *u8); aw(flag); aw("]\n" as *u8)
117
118 aq_itoa(exP, nb1); aq_itoa(vsP, nb2); aq_itoa(compl, nb3); aq_itoa(known[i2], nb4)
119 let rk: *i64 = sys_mmap(8 * 8) as *i64; let rv: *i64 = sys_mmap(8 * 8) as *i64
120 rk[0]="execute" as *u8 as i64; rv[0]=nb1 as i64
121 rk[1]="vision" as *u8 as i64; rv[1]=nb2 as i64
122 rk[2]="completeness" as *u8 as i64; rv[2]=nb3 as i64
123 rk[3]="known" as *u8 as i64; rv[3]=nb4 as i64
124 rk[4]="flag" as *u8 as i64; rv[4]=flag as i64
125 let recb: *u8 = sys_mmap(512); let recl: i64 = canon_encode(rk, rv, 5, recb)
126 let scsuf: *u8 = sys_mmap(128); var sso: i64 = 0; sso = ss_cat(scsuf, sso, "score:" as *u8); sso = ss_cat(scsuf, sso, ent[i2] as *u8); scsuf[sso] = 0 as u8
127 let skb: *u8 = sys_mmap(256); aq_key(skb, market, scsuf)
128 ss_add(sw, 1, skb, recb, recl)
129 i2 = i2 + 1
130 }
131 return invalid
132}
133
134func main() -> i64 {
135 let gp: *i64 = sys_mmap(8) as *i64
136 let gl: *i64 = sys_mmap(8) as *i64
137 let dk: *i64 = sys_mmap(8 * 16) as *i64
138 let dv: *i64 = sys_mmap(8 * 16) as *i64
139
140 // markets registry (default "connect" if absent)
141 let mbuf: *u8 = sys_mmap(AQ_MAGIC_1024)
142 var have: i64 = 0
143 if ss_get(AQ_STORE, "ciq:markets" as *u8, gp, gl) == 1 {
144 let mnf: i64 = canon_decode(gp[0] as *u8, gl[0], dk, dv, 16)
145 let lst: *u8 = aq_field(dk, dv, mnf, "list" as *u8)
146 if lst != (0 as *u8) { aq_copy(lst, mbuf); have = 1 }
147 }
148 if have == 0 { aq_copy("connect" as *u8, mbuf) }
149 let markets: *i64 = sys_mmap(8 * 16) as *i64
150 let nm: i64 = aq_split(mbuf, 44, markets, 16)
151
152 aw("=== nx_ciq_analyst (market-generic) -- two-axis scores, no-float permil 0..1000 ===\n" as *u8)
153 aw("markets=" as *u8); an(nm); aw(" (liar-kill: FULL cell w/o cited evidence = invalid -> RED)\n" as *u8)
154
155 let sw: *i64 = ss_begin()
156 var invalid: i64 = 0
157 var scored: i64 = 0
158 var mi: i64 = 0
159 while mi < nm {
160 let r: i64 = score_market(markets[mi] as *u8, sw)
161 if r >= 0 { scored = scored + 1; invalid = invalid + r }
162 else { aw("-- market=" as *u8); aw(markets[mi] as *u8); aw(" UNREADABLE (skipped)\n" as *u8) }
163 mi = mi + 1
164 }
165 ss_commit(AQ_STORE, sw, sys_now_ms())
166
167 var neg_ok: i64 = 1
168 if aq_invalid(AQ_MAXLEVEL, 0) != 1 { neg_ok = 0 }
169 if aq_invalid(AQ_MAXLEVEL, 1) != 0 { neg_ok = 0 }
170 if aq_invalid(1, 0) != 0 { neg_ok = 0 }
171 var pos_ok: i64 = 1
172 if ((AQ_MAXLEVEL * 3 * 1000) / (AQ_MAXLEVEL * 3)) != 1000 { pos_ok = 0 }
173
174 aw("--- controls --- liar-kill(neg)=" as *u8); if neg_ok==1 { aw("PASS" as *u8) } else { aw("FAIL" as *u8) }
175 aw(" normalization(pos)=" as *u8); if pos_ok==1 { aw("PASS" as *u8) } else { aw("FAIL" as *u8) }
176 aw(" markets_scored=" as *u8); an(scored); aw("/" as *u8); an(nm); aw(" invalid_cells=" as *u8); an(invalid); aw("\n" as *u8)
177
178 var green: i64 = 0
179 if invalid == 0 { if neg_ok == 1 { if pos_ok == 1 { if scored == nm { green = 1 } } } }
180 if green == 1 { aw("ANALYSTGATE markets-generic scores_persisted=yes verdict=GREEN\n" as *u8); sys_exit(0); return 0 }
181 aw("ANALYSTGATE verdict=RED\n" as *u8); sys_exit(1); return 1
182}