code wiki / _hdl_build / _bf_regen_gate_authored.nx
_bf_regen_gate_authored.nx source
↩ module page · 107 lines · 3439 B
1// _bf_regen_gate_authored.nx -- ME3 rung 1 gate: the SOVEREIGN bigfloat oracle
2// (nx_bigfloat120 + exp/ln, every constant self-computed) must reproduce EVERY
3// mpmath-born expected value in the exp (203) and log (196) KAT sets bit-exactly.
4// GREEN = anchor transferred = the last python debt in the math arc closes
5// (ledger T#math-oracle-py-exp-log): vector regeneration is nishi-only from here.
6//
7// Markers: REGENBAD fn= i= x= exp= got= / REGEN exp=ok/total log=ok/total
8// BF-REGEN-GATE verdict=GREEN|RED
9
10import "nx_syscalls.nx"
11import "nx_bigfloat120.nx"
12import "nx_bigfloat120_div.nx"
13import "nx_bigfloat120_exp.nx"
14import "nx_bigfloat120_ln.nx"
15import "_f64_exp_kat_vectors.nx"
16import "_f64_log_kat_vectors.nx"
17
18func bfr_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
19
20func bfr_putn(v: i64) -> i64 {
21 let bb: *u8 = sys_mmap(28)
22 var m: i64 = v
23 if m < 0 { m = 0 - m; sys_write(1, "-" as *u8, 1) }
24 let t: *u8 = sys_mmap(28)
25 var k: i64 = 0
26 if m == 0 { t[0] = 48; k = 1 }
27 while m > 0 { t[k] = 48 + (m % 10); m = m / 10; k = k + 1 }
28 var i: i64 = 0
29 while i < k { bb[i] = t[k-1-i]; i = i + 1 }
30 sys_write(1, bb, k)
31 return 0
32}
33
34func bfr_puthex(v: i64) -> i64 {
35 let bb: *u8 = sys_mmap(20)
36 var i: i64 = 0
37 while i < 16 {
38 let nib: i64 = (v >> ((15 - i) * 4)) & 15
39 if nib < 10 { bb[i] = 48 + nib } else { bb[i] = 55 + nib }
40 i = i + 1
41 }
42 sys_write(1, bb, 16)
43 return 0
44}
45
46func main() -> i64 {
47 let av: *i64 = sys_mmap(8 * 256) as *i64
48 let ev: *i64 = sys_mmap(8 * 256) as *i64
49
50 let ne: i64 = f64e_kat_fill_all(av, ev)
51 var eok: i64 = 0
52 var ebad: i64 = 0
53 var i: i64 = 0
54 while i < ne {
55 let got: i64 = bf_exp_f64(av[i])
56 if got == ev[i] {
57 eok = eok + 1
58 } else {
59 ebad = ebad + 1
60 if ebad <= 25 {
61 bfr_puts("REGENBAD fn=exp i=" as *u8); bfr_putn(i)
62 bfr_puts(" x=" as *u8); bfr_puthex(av[i])
63 bfr_puts(" exp=" as *u8); bfr_puthex(ev[i])
64 bfr_puts(" got=" as *u8); bfr_puthex(got)
65 bfr_puts("\n" as *u8)
66 }
67 }
68 i = i + 1
69 }
70
71 let av2: *i64 = sys_mmap(8 * 256) as *i64
72 let ev2: *i64 = sys_mmap(8 * 256) as *i64
73 let nl: i64 = f64l_kat_fill_all(av2, ev2)
74 var lok: i64 = 0
75 var lbad: i64 = 0
76 var j: i64 = 0
77 while j < nl {
78 let got2: i64 = bf_ln_f64(av2[j])
79 if got2 == ev2[j] {
80 lok = lok + 1
81 } else {
82 lbad = lbad + 1
83 if lbad <= 25 {
84 bfr_puts("REGENBAD fn=log i=" as *u8); bfr_putn(j)
85 bfr_puts(" x=" as *u8); bfr_puthex(av2[j])
86 bfr_puts(" exp=" as *u8); bfr_puthex(ev2[j])
87 bfr_puts(" got=" as *u8); bfr_puthex(got2)
88 bfr_puts("\n" as *u8)
89 }
90 }
91 j = j + 1
92 }
93
94 bfr_puts("REGEN exp=" as *u8); bfr_putn(eok); bfr_puts("/" as *u8); bfr_putn(ne)
95 bfr_puts(" log=" as *u8); bfr_putn(lok); bfr_puts("/" as *u8); bfr_putn(nl)
96 bfr_puts("\n" as *u8)
97 if ebad == 0 {
98 if lbad == 0 {
99 bfr_puts("BF-REGEN-GATE verdict=GREEN\n" as *u8)
100 return 0
101 }
102 }
103 bfr_puts("BF-REGEN-GATE verdict=RED\n" as *u8)
104 var rc: i64 = ebad + lbad
105 if rc > 100 { rc = 100 }
106 return rc
107}