code wiki / _hdl_build / nx_gen_machine.nx
nx_gen_machine.nx source
↩ module page · 146 lines · 5790 B
1// AUTHORED BY nx_machine_gen from a DATA spec (op-fragments + examples) -- a machine the team authored from DATA, not hand-written. license_tier: ORIGINAL
2import "nx_syscalls.nx"
3import "nx_itoa_lib.nx" // shared MSB-first emitter (zero-alloc)
4const EVO_MAGIC_2862933555777941757: i64 = 2862933555777941757
5const EVO_MAGIC_3037000493: i64 = 3037000493
6const EVO_MAGIC_2000000: i64 = 2000000
7const EVO_MAGIC_1000000: i64 = 1000000
8const EVO_MAGIC_2654435761: i64 = 2654435761
9const EVO_MAGIC_12345: i64 = 12345
10const EVO_MAGIC_1000000000: i64 = 1000000000
11const GLEN: i64 = 4
12const EVO_P: i64 = 256
13const EVO_G: i64 = 2000
14const EVO_T: i64 = 5
15const NTRAIN: i64 = 6
16const NHELD: i64 = 4
17func gm_rand(s: *i64) -> i64 { s[0] = s[0] * EVO_MAGIC_2862933555777941757 + EVO_MAGIC_3037000493; return (s[0] >> 17) & 0x3fffffff }
18func gm_abs(x: i64) -> i64 { if x < 0 { return 0 - x } return x }
19func gm_xa(i: i64) -> i64 {
20 if i == 0 { return 2 }
21 if i == 1 { return 4 }
22 if i == 2 { return 3 }
23 if i == 3 { return 5 }
24 if i == 4 { return 6 }
25 if i == 5 { return 1 }
26 if i == 6 { return 7 }
27 if i == 7 { return 3 }
28 if i == 8 { return 8 }
29 if i == 9 { return 4 }
30 return 0
31}
32func gm_xb(i: i64) -> i64 {
33 if i == 0 { return 3 }
34 if i == 1 { return 5 }
35 if i == 2 { return 2 }
36 if i == 3 { return 1 }
37 if i == 4 { return 2 }
38 if i == 5 { return 7 }
39 if i == 6 { return 2 }
40 if i == 7 { return 3 }
41 if i == 8 { return 1 }
42 if i == 9 { return 4 }
43 return 0
44}
45func gm_xy(i: i64) -> i64 {
46 if i == 0 { return 8 }
47 if i == 1 { return 24 }
48 if i == 2 { return 9 }
49 if i == 3 { return 10 }
50 if i == 4 { return 18 }
51 if i == 5 { return 8 }
52 if i == 6 { return 21 }
53 if i == 7 { return 12 }
54 if i == 8 { return 16 }
55 if i == 9 { return 20 }
56 return 0
57}
58func gm_eval(pop: *i64, base: i64, a: i64, b: i64) -> i64 {
59 var acc: i64 = 0
60 var j: i64 = 0
61 while j < GLEN {
62 let op: i64 = pop[base + j]
63 if op == 0 { acc = a }
64 if op == 1 { acc = b }
65 if op == 2 { acc = acc * a }
66 if op == 3 { acc = acc * b }
67 if op == 4 { acc = acc + a }
68 if op == 5 { acc = acc + b }
69 j = j + 1
70 }
71 return acc
72}
73func gm_fit(pop: *i64, base: i64) -> i64 {
74 var err: i64 = 0
75 var i: i64 = 0
76 while i < NTRAIN {
77 let r: i64 = gm_eval(pop, base, gm_xa(i), gm_xb(i))
78 var d: i64 = EVO_MAGIC_2000000
79 if r >= 0 { if r <= EVO_MAGIC_1000000 { d = gm_abs(r - gm_xy(i)) } }
80 err = err + d
81 i = i + 1
82 }
83 return err
84}
85func gm_tourney(fit: *i64, state: *i64) -> i64 {
86 var bi: i64 = gm_rand(state) % EVO_P
87 var bd: i64 = fit[bi]
88 var k: i64 = 1
89 while k < EVO_T { let i: i64 = gm_rand(state) % EVO_P; if fit[i] < bd { bd = fit[i]; bi = i } k = k + 1 }
90 return bi
91}
92func gm_p(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
93// MIGRATED to the shared emitter (debt 1785563586). The old body mmapped a scratch buffer
94// per call and never freed it. At PAGE granularity that is 4096B leaked PER CALL -- the
95// defect that took 28.5GB of a 36GB host in nx_ts_lumadiff (2MB input, ~3.66M calls).
96// nxi_* is MSB-first, allocates NOTHING, and emits identical bytes including the sign.
97func gm_pn(v: i64) -> i64 { nxi_out(v); return 0 }
98func main() -> i64 {
99 let state: *i64 = sys_mmap(8) as *i64
100 state[0] = 7 * EVO_MAGIC_2654435761 + EVO_MAGIC_12345
101 let pop: *i64 = sys_mmap(EVO_P * GLEN * 8) as *i64
102 let nxt: *i64 = sys_mmap(EVO_P * GLEN * 8) as *i64
103 let fit: *i64 = sys_mmap(EVO_P * 8) as *i64
104 let best: *i64 = sys_mmap(GLEN * 8) as *i64
105 var p: i64 = 0
106 while p < EVO_P { var j: i64 = 0; while j < GLEN { pop[p*GLEN + j] = gm_rand(state) % 6; j = j + 1 } p = p + 1 }
107 var best_err: i64 = EVO_MAGIC_1000000000
108 var found: i64 = 0
109 var g: i64 = 0
110 while g < EVO_G {
111 var gbest: i64 = EVO_MAGIC_1000000000
112 var gbp: i64 = 0
113 p = 0
114 while p < EVO_P { let e: i64 = gm_fit(pop, p*GLEN); fit[p] = e; if e < gbest { gbest = e; gbp = p } p = p + 1 }
115 if gbest < best_err { best_err = gbest; var j: i64 = 0; while j < GLEN { best[j] = pop[gbp*GLEN + j]; j = j + 1 } }
116 if best_err == 0 { found = 1; g = EVO_G } else {
117 var j2: i64 = 0
118 while j2 < GLEN { nxt[j2] = best[j2]; j2 = j2 + 1 }
119 p = 1
120 while p < EVO_P {
121 let pa: i64 = gm_tourney(fit, state) * GLEN
122 let pb: i64 = gm_tourney(fit, state) * GLEN
123 let cut: i64 = (gm_rand(state) % (GLEN - 1)) + 1
124 var jj: i64 = 0
125 while jj < GLEN { if jj < cut { nxt[p*GLEN + jj] = pop[pa + jj] } else { nxt[p*GLEN + jj] = pop[pb + jj] } jj = jj + 1 }
126 let slot: i64 = gm_rand(state) % GLEN
127 nxt[p*GLEN + slot] = gm_rand(state) % 6
128 p = p + 1
129 }
130 var c: i64 = 0
131 while c < EVO_P * GLEN { pop[c] = nxt[c]; c = c + 1 }
132 g = g + 1
133 }
134 }
135 var held_ok: i64 = 0
136 var hi: i64 = 0
137 while hi < NHELD { let idx: i64 = NTRAIN + hi; if gm_eval(best, 0, gm_xa(idx), gm_xb(idx)) == gm_xy(idx) { held_ok = held_ok + 1 } hi = hi + 1 }
138 gm_p("GENMACHINE train_err=" as *u8); gm_pn(best_err); gm_p(" heldout=" as *u8); gm_pn(held_ok); gm_p("/" as *u8); gm_pn(NHELD)
139 if found == 1 { if held_ok == NHELD { gm_p(" GENERALIZES ops=" as *u8) } else { gm_p(" OVERFIT ops=" as *u8) } } else { gm_p(" NEAR ops=" as *u8) }
140 var jg: i64 = 0
141 while jg < GLEN { gm_pn(best[jg]); gm_p(" " as *u8); jg = jg + 1 }
142 gm_p("\n" as *u8)
143 if found == 1 { if held_ok == NHELD { sys_exit(0); return 0 } }
144 sys_exit(1)
145 return 1
146}