code wiki / _hdl_build / nx_isotope_gate.nx
nx_isotope_gate.nx source
↩ module page · 108 lines · 6298 B
1// nx_isotope_gate.nx -- chemistry external-reference loop, VERIFY + LIAR-KILL gate. Compares OUR periodic
2// table's exact isotope masses (nx_chem_periodic nx_chem_atomic_data_table_118: iso_mass_q4 = exact mass of
3// the most-abundant isotope * 10000) against the NIST Atomic Weights reference held in the SOVEREIGN seg_store
4// (key "iso:<Z>:<A>", populated by nx_isotope_ingest from the foundationed NIST data) -- NOT a TSV.
5//
6// For each element we look up NIST's Relative Atomic Mass for OUR most-abundant isotope (Z, iso_a_q0) and
7// assert iso_mass_q4 == NIST_q4 (exact integer; both are mass*10000 rounded). disagree>0 is a real finding
8// (our value drifted from NIST). missing = our isotope not in this NIST subset = honestly UNVERIFIED (reported,
9// never claimed verified). LIAR-KILL neg-control proves the lookup distinguishes known values + a missing key.
10// GREEN iff neg-control OK AND disagree==0. Writes knowledge/status/isotope_gate.log. license_tier: ORIGINAL
11import "nx_syscalls.nx"
12import "nx_seg_store.nx"
13import "nx_uxf_decode.nx"
14import "nx_chem_periodic.nx"
15
16const IG_STORE: *u8 = "knowledge/store/isotope-"
17const IG_LOG: *u8 = "knowledge/status/isotope_gate.log"
18
19func ig_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 }
20func ig_wn(fd: i64, v: i64) -> i64 { let b: *u8=sys_mmap(16); var m: i64=v; if m<0{m=0-m;sys_write(fd,"-" as *u8,1)} let t: *u8=sys_mmap(16); 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}; sys_write(fd,b,k); return 0 }
21func ig_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 }
22func ig_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 }
23func ig_atoi(s: *u8) -> i64 { var v: 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) } } i=i+1 } return v }
24
25// NIST Q4 mass for isotope (z,a) from the sovereign store; -1 if absent.
26func ig_ref(z: i64, a: i64) -> i64 {
27 let kb: *u8 = sys_mmap(64); var kn: i64 = 0
28 let kp: *u8 = "iso:" as *u8; var ki: i64 = 0
29 while kp[ki]!=(0 as u8){ kb[kn]=kp[ki]; kn=kn+1; ki=ki+1 }
30 kn = kn + ig_itoa(z, ((kb as i64)+kn) as *u8)
31 kb[kn]=58 as u8; kn=kn+1
32 kn = kn + ig_itoa(a, ((kb as i64)+kn) as *u8)
33 let gp: *i64 = sys_mmap(8) as *i64; let gl: *i64 = sys_mmap(8) as *i64
34 if ss_get(IG_STORE, kb, gp, gl) != 1 { return 0 - 1 }
35 let dk: *i64 = sys_mmap(64) as *i64; let dv: *i64 = sys_mmap(64) as *i64
36 let nf: i64 = canon_decode(gp[0] as *u8, gl[0], dk, dv, 8)
37 if nf < 0 { return 0 - 1 }
38 var f: i64 = 0
39 while f < nf { if ig_streq(dk[f] as *u8, "mass_q4" as *u8)==1 { return ig_atoi(dv[f] as *u8) } f=f+1 }
40 return 0 - 1
41}
42
43func main() -> i64 {
44 let arr: *AtomicData = nx_chem_atomic_data_table_118()
45
46 // LIAR-KILL neg-control: known references resolve + a missing key is absent.
47 var nc: i64 = 1
48 if ig_ref(6, 12) != 120000 { nc = 0 } // C-12 exactly 12
49 if ig_ref(8, 16) != 159949 { nc = 0 } // O-16
50 if ig_ref(999, 999) != (0 - 1) { nc = 0 } // absent -> not found
51
52 var agree: i64 = 0; var disagree: i64 = 0; var missing: i64 = 0
53 let rep: *u8 = sys_mmap(65536); var rw: i64 = 0
54
55 var idx: i64 = 0
56 while idx < 118 {
57 let d: *AtomicData = ((arr as i64) + idx * NX_ATOMIC_DATA_BYTES) as *AtomicData
58 let z: i64 = d.z
59 let a: i64 = d.iso_a_q0
60 let ourq4: i64 = d.iso_mass_q4
61 let nistq4: i64 = ig_ref(z, a)
62 if nistq4 == (0 - 1) {
63 missing = missing + 1
64 let m1: *u8=" MISSING Z="; var b: i64=0; while m1[b]!=(0 as u8){rep[rw]=m1[b];rw=rw+1;b=b+1}
65 let zb: *u8=sys_mmap(24); ig_itoa(z, zb); b=0; while zb[b]!=(0 as u8){rep[rw]=zb[b];rw=rw+1;b=b+1}
66 let m2: *u8=" A="; b=0; while m2[b]!=(0 as u8){rep[rw]=m2[b];rw=rw+1;b=b+1}
67 let ab: *u8=sys_mmap(24); ig_itoa(a, ab); b=0; while ab[b]!=(0 as u8){rep[rw]=ab[b];rw=rw+1;b=b+1}
68 rep[rw]=10 as u8; rw=rw+1
69 } else {
70 if ourq4 == nistq4 { agree = agree + 1 }
71 else {
72 disagree = disagree + 1
73 let m1: *u8=" DISAGREE Z="; var b: i64=0; while m1[b]!=(0 as u8){rep[rw]=m1[b];rw=rw+1;b=b+1}
74 let zb: *u8=sys_mmap(24); ig_itoa(z, zb); b=0; while zb[b]!=(0 as u8){rep[rw]=zb[b];rw=rw+1;b=b+1}
75 let m2: *u8=" A="; b=0; while m2[b]!=(0 as u8){rep[rw]=m2[b];rw=rw+1;b=b+1}
76 let ab: *u8=sys_mmap(24); ig_itoa(a, ab); b=0; while ab[b]!=(0 as u8){rep[rw]=ab[b];rw=rw+1;b=b+1}
77 let m3: *u8=" ours="; b=0; while m3[b]!=(0 as u8){rep[rw]=m3[b];rw=rw+1;b=b+1}
78 let ob: *u8=sys_mmap(24); ig_itoa(ourq4, ob); b=0; while ob[b]!=(0 as u8){rep[rw]=ob[b];rw=rw+1;b=b+1}
79 let m4: *u8=" nist="; b=0; while m4[b]!=(0 as u8){rep[rw]=m4[b];rw=rw+1;b=b+1}
80 let nb: *u8=sys_mmap(24); ig_itoa(nistq4, nb); b=0; while nb[b]!=(0 as u8){rep[rw]=nb[b];rw=rw+1;b=b+1}
81 rep[rw]=10 as u8; rw=rw+1
82 }
83 }
84 idx = idx + 1
85 }
86
87 var ok: i64 = 0
88 if nc==1 { if disagree==0 { ok = 1 } }
89
90 var p2: i64 = 0
91 while p2 < 2 {
92 var fd: i64 = 1
93 if p2==1 { fd = sys_openat_append(IG_LOG, 0x1a4) }
94 if fd >= 0 {
95 ig_w(fd, "ISOTOPE-GATE elements=118 agree=" as *u8); ig_wn(fd, agree)
96 ig_w(fd, " disagree=" as *u8); ig_wn(fd, disagree)
97 ig_w(fd, " missing(unverified)=" as *u8); ig_wn(fd, missing)
98 ig_w(fd, " negctrl=" as *u8); if nc==1 { ig_w(fd, "OK" as *u8) } else { ig_w(fd, "FAIL" as *u8) }
99 ig_w(fd, " ref=NIST-AtomicWeights(sovereign-seg_store) model=iso_mass_q4-exact" as *u8)
100 if ok==1 { ig_w(fd, " verdict=GREEN\n" as *u8) } else { ig_w(fd, " verdict=RED\n" as *u8) }
101 sys_write(fd, rep, rw)
102 if p2==1 { sys_close(fd) }
103 }
104 p2 = p2 + 1
105 }
106 if ok==1 { sys_exit(0); return 0 }
107 sys_exit(1); return 1
108}