code wiki / _hdl_build / nx_codata_ingest.nx

nx_codata_ingest.nx source

↩ module page · 161 lines · 8531 B

1// nx_codata_ingest.nx -- chemistry/physics external-reference loop, ingest stage. Reads the FOUNDATIONED 2// NIST CODATA table (knowledge/fetched/nist/codata_allascii.txt, CID'd + signed by nx_codata_foundation) 3// and MECHANICALLY extracts each of our constants' verbatim value, writing a content-addressed canonical 4// record per constant into the SOVEREIGN seg_store (prefix knowledge/store/codata-, key "codata:<sym>"). 5// NO TSV: the symbol->NIST-quantity-NAME map (stable identifiers, never the drifting values) is INLINED 6// below, cited to the table; the only output is the sovereign content-addressed store. 7// 8// Table column model: "<quantity name padded><value><2+ spaces><uncertainty>...". Single spaces inside a 9// value are digit-groupers; "..." marks truncation. Q4-style normalize = strip spaces + "...". Baked 10// self-test: store round-trips c -> "299792458" and m_e -> "9.1093837139e-31" (the 2022 value). license_tier: ORIGINAL 11import "nx_syscalls.nx" 12import "nx_canon_cid.nx" 13import "nx_seg_store.nx" 14import "nx_uxf_decode.nx" 15const CI_MAGIC_131072: i64 = 131072 16 17const CI_TABLE: *u8 = "knowledge/fetched/nist/codata_allascii.txt" 18const CI_STORE: *u8 = "knowledge/store/codata-" 19 20func ci_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 } 21 22func ci_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} 31func ci_is_digit(c: u8) -> i64 { if c >= (48 as u8) { if c <= (57 as u8) { return 1 } } return 0 } 32func ci_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 } 33 34func ci_prefix(buf: *u8, p: i64, le: i64, name: *u8) -> i64 { 35 var i: i64 = 0 36 while name[i] != (0 as u8) { 37 if p + i >= le { return 0 - 1 } 38 if buf[p + i] != name[i] { return 0 - 1 } 39 i = i + 1 40 } 41 return i 42} 43// read the value field from vs up to a >=2-space run; strip single-space groupers + a literal "..." ellipsis. 44func ci_value(buf: *u8, vs: i64, le: i64, dst: *u8, trunc_ptr: *i64) -> i64 { 45 var k: i64 = 0; var i: i64 = vs; var done: i64 = 0 46 while done == 0 { 47 if i >= le { done = 1 } 48 else { let c: u8 = buf[i] 49 if c == (10 as u8) { done = 1 } 50 else { if c == (32 as u8) { 51 if i + 1 < le { if buf[i + 1] == (32 as u8) { done = 1 } else { i = i + 1 } } else { done = 1 } 52 } else { dst[k] = c; k = k + 1; i = i + 1 } } 53 } 54 } 55 dst[k] = 0 as u8 56 trunc_ptr[0] = 0 57 var a: i64 = 0 58 while a + 2 < k { 59 if dst[a] == (46 as u8) { if dst[a+1] == (46 as u8) { if dst[a+2] == (46 as u8) { 60 trunc_ptr[0] = 1 61 var b: i64 = a 62 while b + 3 <= k { dst[b] = dst[b+3]; b = b + 1 } 63 k = k - 3; dst[k] = 0 as u8 64 } } } 65 a = a + 1 66 } 67 return i 68} 69// find the value for one quantity name in the table. fills val (normalized) + trunc. 1/0. 70func ci_lookup(tab: *u8, tn: i64, name: *u8, val: *u8, trunc_ptr: *i64) -> i64 { 71 var ls: i64 = 0; var i: i64 = 0 72 while i <= tn { 73 var eol: i64 = 0 74 if i == tn { eol = 1 } else { if tab[i] == (10 as u8) { eol = 1 } } 75 if eol == 1 { 76 let nl: i64 = ci_prefix(tab, ls, i, name) 77 if nl > 0 { 78 var vs: i64 = ls + nl 79 if vs < i { if tab[vs] == (32 as u8) { 80 while vs < i { if tab[vs] != (32 as u8) { break } vs = vs + 1 } 81 if vs < i { if ci_is_digit(tab[vs]) == 1 { ci_value(tab, vs, i, val, trunc_ptr); return 1 } } 82 } } 83 } 84 ls = i + 1 85 } 86 i = i + 1 87 } 88 return 0 89} 90 91func main() -> i64 { 92 let tab: *u8 = sys_mmap(CI_MAGIC_131072) 93 let tn: i64 = ci_read(CI_TABLE, tab, CI_MAGIC_131072) 94 if tn <= 0 { ci_w(2, "CODATA-INGEST verdict=RED reason=no-table (foundation/fetch first)\n" as *u8); sys_exit(11); return 11 } 95 96 // INLINED symbol -> NIST quantity-name map (stable identifiers, NOT values; cited to the table). No TSV. 97 let nm: i64 = 12 98 let msym: *i64 = sys_mmap(8 * 16) as *i64 99 let mname: *i64 = sys_mmap(8 * 16) as *i64 100 msym[0] = "c" as *u8 as i64; mname[0] = "speed of light in vacuum" as *u8 as i64 101 msym[1] = "dnu_Cs" as *u8 as i64; mname[1] = "hyperfine transition frequency of Cs-133" as *u8 as i64 102 msym[2] = "h" as *u8 as i64; mname[2] = "Planck constant" as *u8 as i64 103 msym[3] = "e" as *u8 as i64; mname[3] = "elementary charge" as *u8 as i64 104 msym[4] = "k" as *u8 as i64; mname[4] = "Boltzmann constant" as *u8 as i64 105 msym[5] = "N_A" as *u8 as i64; mname[5] = "Avogadro constant" as *u8 as i64 106 msym[6] = "R" as *u8 as i64; mname[6] = "molar gas constant" as *u8 as i64 107 msym[7] = "hbar" as *u8 as i64; mname[7] = "reduced Planck constant" as *u8 as i64 108 msym[8] = "G" as *u8 as i64; mname[8] = "Newtonian constant of gravitation" as *u8 as i64 109 msym[9] = "m_e" as *u8 as i64; mname[9] = "electron mass" as *u8 as i64 110 msym[10] = "m_p" as *u8 as i64; mname[10] = "proton mass" as *u8 as i64 111 msym[11] = "alpha" as *u8 as i64; mname[11] = "fine-structure constant" as *u8 as i64 112 113 let sw: *i64 = ss_begin() 114 let val: *u8 = sys_mmap(128) 115 let trunc: *i64 = sys_mmap(8) as *i64 116 var count: i64 = 0; var miss: i64 = 0 117 118 var mi: i64 = 0 119 while mi < nm { 120 let sym: *u8 = msym[mi] as *u8 121 let name: *u8 = mname[mi] as *u8 122 if ci_lookup(tab, tn, name, val, trunc) == 1 { 123 var tstr: *u8 = "0" as *u8 124 if trunc[0] == 1 { tstr = "1" as *u8 } 125 let rk: *i64 = sys_mmap(32) as *i64; let rv: *i64 = sys_mmap(32) as *i64 126 rk[0] = "trunc" as *u8 as i64; rv[0] = tstr as i64 127 rk[1] = "value" as *u8 as i64; rv[1] = val as i64 128 let recb: *u8 = sys_mmap(512); let recl: i64 = canon_encode(rk, rv, 2, recb) 129 let kb: *u8 = sys_mmap(128); var kbn: i64 = 0 130 let kp: *u8 = "codata:" as *u8; var kpi: i64 = 0 131 while kp[kpi]!=(0 as u8){ kb[kbn]=kp[kpi]; kbn=kbn+1; kpi=kpi+1 } 132 var ski: i64 = 0 133 while sym[ski]!=(0 as u8){ kb[kbn]=sym[ski]; kbn=kbn+1; ski=ski+1 } kb[kbn]=0 as u8 134 ss_add(sw, 1, kb, recb, recl) 135 count = count + 1 136 } else { 137 miss = miss + 1 138 ci_w(2, "CODATA-INGEST miss symbol=" as *u8); ci_w(2, sym); ci_w(2, "\n" as *u8) 139 } 140 mi = mi + 1 141 } 142 let segid: i64 = sys_now_ms() 143 ss_commit(CI_STORE, sw, segid) 144 145 // self-test: round-trip from the sovereign store (proves the SSOT is correct + reads NIST 2022) 146 var st: i64 = 1 147 let gp: *i64 = sys_mmap(8) as *i64; let gl: *i64 = sys_mmap(8) as *i64 148 let dk: *i64 = sys_mmap(64) as *i64; let dv: *i64 = sys_mmap(64) as *i64 149 let cv: *u8 = sys_mmap(64); let mev: *u8 = sys_mmap(64) 150 if ss_get(CI_STORE, "codata:c" 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 ci_streq(dk[f] as *u8, "value" as *u8)==1 { var z: i64=0; let p: *u8=dv[f] as *u8; while p[z]!=(0 as u8){cv[z]=p[z];z=z+1} cv[z]=0 as u8 } f=f+1 } } else { st=0 } 151 if ss_get(CI_STORE, "codata:m_e" 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 ci_streq(dk[f] as *u8, "value" as *u8)==1 { var z: i64=0; let p: *u8=dv[f] as *u8; while p[z]!=(0 as u8){mev[z]=p[z];z=z+1} mev[z]=0 as u8 } f=f+1 } } else { st=0 } 152 if ci_streq(cv, "299792458" as *u8) != 1 { st = 0 } 153 if ci_streq(mev, "9.1093837139e-31" as *u8) != 1 { st = 0 } 154 if miss != 0 { st = 0 } 155 156 ci_w(1, "CODATA-INGEST stored=" as *u8) 157 let nb: *u8 = sys_mmap(16); var m: i64=count; let tb: *u8=sys_mmap(16); var kk: i64=0; if m==0{tb[0]=48 as u8;kk=1}; while m>0{tb[kk]=(48+(m%10)) as u8;m=m/10;kk=kk+1}; var jj: i64=0; while jj<kk{nb[jj]=tb[kk-1-jj];jj=jj+1}; sys_write(1,nb,kk) 158 ci_w(1, "/12 (sovereign seg_store, no TSV) c=" as *u8); ci_w(1, cv); ci_w(1, " m_e=" as *u8); ci_w(1, mev) 159 if st == 1 { ci_w(1, " selftest=OK verdict=GREEN\n" as *u8); sys_exit(0); return 0 } 160 ci_w(1, " selftest=FAIL verdict=RED\n" as *u8); sys_exit(1); return 1 161}