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}