code wiki / _hdl_build / nx_ciaaw_ingest.nx
nx_ciaaw_ingest.nx source
↩ module page · 131 lines · 7445 B
1// nx_ciaaw_ingest.nx -- ingest the FOUNDATIONED IUPAC/CIAAW abridged standard atomic weights, accessed
2// PROPERLY through the sovereign HTML table extractor nx_html_table (rows x cells, entity-decoded) -- NOT
3// grep. For each element row: Z (cell 0), abridged atomic weight (cell 3) parsed to milli-AMU (x1000, matching
4// our periodic table's mass_q3). Elements without a standard atomic weight (CIAAW shows "[mass number]") are
5// SKIPPED (honestly no standard weight). Writes content-addressed records to the sovereign seg_store
6// (knowledge/store/ciaaw-atw-, key "atw:<Z>"). Self-test: H->1008, C->12011. license_tier: ORIGINAL
7import "nx_syscalls.nx"
8import "nx_canon_cid.nx"
9import "nx_seg_store.nx"
10import "nx_uxf_decode.nx"
11import "nx_html_table.nx"
12const CW_MAGIC_131072: i64 = 131072
13
14const CW_RAW: *u8 = "knowledge/fetched/ciaaw/abridged_atomic_weights.html"
15const CW_STORE: *u8 = "knowledge/store/ciaaw-atw-"
16
17func cw_w(fd: i64, s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(fd,s,n); return 0 }
18func cw_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 }
19func cw_itoa(v: i64, dst: *u8) -> i64 { var m: i64=v; 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 i: i64=0; while i<k{dst[i]=t[k-1-i];i=i+1} dst[k]=0 as u8; return k }
20func cw_atoi(s: *u8) -> i64 { var v: i64=0; var any: i64=0; var i: i64=0; while s[i]!=(0 as u8){ if s[i]>=(48 as u8){ if s[i]<=(57 as u8){ v=v*10+(s[i]-48); any=1 } } i=i+1 } if any==0 { return 0 - 1 } return v }
21
22func cw_read(path: *u8, buf: *u8, cap: i64) -> i64 {
23 let fd: i64 = sys_openat_rd(path)
24 if fd < 0 { return 0 }
25 var n: i64 = 0
26 var r: i64 = sys_read(fd, buf, cap - 1)
27 while r > 0 { n = n + r; if n >= cap - 1 { r = 0 } else { r = sys_read(fd, buf + n, cap - 1 - n) } }
28 sys_close(fd); buf[n] = 0 as u8
29 return n
30}
31
32// parse the first number in s as atomic-weight*1000 (rounded). -1 if a "[mass]" placeholder or no number.
33func cw_q3(s: *u8) -> i64 {
34 var b: i64 = 0
35 while s[b] != (0 as u8) { if s[b] == (91 as u8) { return 0 - 1 } b = b + 1 } // '[' -> no standard weight
36 var i: i64 = 0; var found: i64 = 0
37 while s[i] != (0 as u8) { if s[i] >= (48 as u8) { if s[i] <= (57 as u8) { found = 1; break } } i = i + 1 }
38 if found == 0 { return 0 - 1 }
39 var ip: i64 = 0
40 while s[i] != (0 as u8) { if s[i] >= (48 as u8) { if s[i] <= (57 as u8) { ip = ip*10 + (s[i]-48); i=i+1 } else { break } } else { break } }
41 var q3: i64 = ip * 1000
42 if s[i] == (46 as u8) {
43 i = i + 1
44 var dpos: i64 = 0; var mult: i64 = 100; var d4: i64 = 0
45 while dpos < 4 {
46 if s[i] >= (48 as u8) { if s[i] <= (57 as u8) {
47 let d: i64 = s[i] - 48
48 if dpos < 3 { q3 = q3 + d*mult; mult = mult/10 } else { d4 = d }
49 i = i + 1; dpos = dpos + 1
50 } else { break } } else { break }
51 }
52 if d4 >= 5 { q3 = q3 + 1 }
53 }
54 return q3
55}
56
57// parse the SECOND number in s (the +/- uncertainty) as *1000, rounded. 0 if none (sub-milli or absent).
58func cw_unc(s: *u8) -> i64 {
59 var i: i64 = 0; var f: i64 = 0
60 while s[i]!=(0 as u8){ if s[i]>=(48 as u8){ if s[i]<=(57 as u8){ f=1; break } } i=i+1 }
61 if f==0 { return 0 }
62 while s[i]!=(0 as u8){ if s[i]>=(48 as u8){ if s[i]<=(57 as u8){ i=i+1 } else { if s[i]==(46 as u8){ i=i+1 } else { break } } } else { break } }
63 var f2: i64 = 0
64 while s[i]!=(0 as u8){ if s[i]>=(48 as u8){ if s[i]<=(57 as u8){ f2=1; break } } i=i+1 }
65 if f2==0 { return 0 }
66 var ip: i64 = 0
67 while s[i]!=(0 as u8){ if s[i]>=(48 as u8){ if s[i]<=(57 as u8){ ip=ip*10+(s[i]-48); i=i+1 } else { break } } else { break } }
68 var q3: i64 = ip*1000
69 if s[i]==(46 as u8){ i=i+1; var dp: i64=0; var mult: i64=100; var d4: i64=0
70 while dp<4 { if s[i]>=(48 as u8){ if s[i]<=(57 as u8){ let d: i64=s[i]-48; if dp<3 { q3=q3+d*mult; mult=mult/10 } else { d4=d } i=i+1; dp=dp+1 } else { break } } else { break } }
71 if d4>=5 { q3=q3+1 } }
72 return q3
73}
74
75func main() -> i64 {
76 let html: *u8 = sys_mmap(CW_MAGIC_131072)
77 let n: i64 = cw_read(CW_RAW, html, CW_MAGIC_131072)
78 if n <= 0 { cw_w(2, "CIAAW-INGEST verdict=RED reason=no-raw (foundation/fetch first)\n" as *u8); sys_exit(11); return 11 }
79
80 let sw: *i64 = ss_begin()
81 let rs: *i64 = sys_mmap(8) as *i64; let re: *i64 = sys_mmap(8) as *i64
82 let c0: *u8 = sys_mmap(64); let c3: *u8 = sys_mmap(160)
83 var pos: i64 = 0; var count: i64 = 0; var done: i64 = 0
84
85 while done == 0 {
86 let nxt: i64 = ht_next_row(html, n, pos, rs, re)
87 if nxt < 0 { done = 1 }
88 else {
89 pos = nxt
90 ht_cell(html, rs[0], re[0], 0, c0, 64)
91 let z: i64 = cw_atoi(c0)
92 if z >= 1 { if z <= 118 {
93 ht_cell(html, rs[0], re[0], 3, c3, 160)
94 let q3: i64 = cw_q3(c3)
95 if q3 > 0 {
96 let unc: i64 = cw_unc(c3)
97 let q3s: *u8 = sys_mmap(24); cw_itoa(q3, q3s)
98 let us: *u8 = sys_mmap(24); cw_itoa(unc, us)
99 let rk: *i64 = sys_mmap(16) as *i64; let rv: *i64 = sys_mmap(16) as *i64
100 rk[0] = "mass_q3" as *u8 as i64; rv[0] = q3s as i64
101 rk[1] = "unc_q3" as *u8 as i64; rv[1] = us as i64
102 let recb: *u8 = sys_mmap(256); let recl: i64 = canon_encode(rk, rv, 2, recb)
103 let kb: *u8 = sys_mmap(64); var kn: i64 = 0
104 let kp: *u8 = "atw:" as *u8; var ki: i64 = 0
105 while kp[ki]!=(0 as u8){ kb[kn]=kp[ki]; kn=kn+1; ki=ki+1 }
106 kn = kn + cw_itoa(z, ((kb as i64)+kn) as *u8)
107 ss_add(sw, 1, kb, recb, recl)
108 count = count + 1
109 }
110 } }
111 }
112 }
113 let segid: i64 = sys_now_ms()
114 ss_commit(CW_STORE, sw, segid)
115
116 // self-test: round-trip H (1.0080->1008) and C (12.011->12011)
117 var st: i64 = 1
118 let gp: *i64 = sys_mmap(8) as *i64; let gl: *i64 = sys_mmap(8) as *i64
119 let dk: *i64 = sys_mmap(64) as *i64; let dv: *i64 = sys_mmap(64) as *i64
120 let hv: *u8 = sys_mmap(32); let cv: *u8 = sys_mmap(32)
121 if ss_get(CW_STORE, "atw:1" as *u8, gp, gl)==1 { let nf: i64=canon_decode(gp[0] as *u8, gl[0], dk, dv, 8); var f: i64=0; while f<nf { if cw_streq(dk[f] as *u8, "mass_q3" as *u8)==1 { var z2: i64=0; let p: *u8=dv[f] as *u8; while p[z2]!=(0 as u8){hv[z2]=p[z2];z2=z2+1} hv[z2]=0 as u8 } f=f+1 } } else { st=0 }
122 if ss_get(CW_STORE, "atw:6" as *u8, gp, gl)==1 { let nf: i64=canon_decode(gp[0] as *u8, gl[0], dk, dv, 8); var f: i64=0; while f<nf { if cw_streq(dk[f] as *u8, "mass_q3" as *u8)==1 { var z2: i64=0; let p: *u8=dv[f] as *u8; while p[z2]!=(0 as u8){cv[z2]=p[z2];z2=z2+1} cv[z2]=0 as u8 } f=f+1 } } else { st=0 }
123 if cw_streq(hv, "1008" as *u8) != 1 { st = 0 }
124 if cw_streq(cv, "12011" as *u8) != 1 { st = 0 }
125
126 cw_w(1, "CIAAW-INGEST stored=" as *u8)
127 let nb: *u8 = sys_mmap(16); cw_itoa(count, nb); cw_w(1, nb)
128 cw_w(1, " (sovereign seg_store, via nx_html_table) H=" as *u8); cw_w(1, hv); cw_w(1, " C=" as *u8); cw_w(1, cv)
129 if st == 1 { cw_w(1, " selftest=OK verdict=GREEN\n" as *u8); sys_exit(0); return 0 }
130 cw_w(1, " selftest=FAIL verdict=RED\n" as *u8); sys_exit(1); return 1
131}