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}