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}