code wiki / (root) / nx_f32_gelu_gate.nx

nx_f32_gelu_gate.nx source

↩ module page · 41 lines · 2108 B

1// nx_f32_gelu_gate.nx -- proof of exact GELU vs known PyTorch values (tolerance 1e-3). expect_exit: 0 2import "nx_syscalls.nx" 3import "nx_f32.nx" 4import "nx_f32_cvt.nx" 5import "nx_f32_div.nx" 6import "nx_f32_gelu.nx" 7 8func gp(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return sys_write(1, s, n) } 9 10// |a-b| < tol ? 11func close(a: i64, b: i64, tol: i64) -> i64 { if nx_f32_lt(nx_f32_abs(nx_f32_sub(a, b)), tol) == 1 { return 1 } return 0 } 12 13func main(argc: i64, argv: *i64) -> i64 { 14 var pass: i64 = 0 15 let tol: i64 = nx_f32_div(nx_i32_to_f32(1), nx_i32_to_f32(1000)) // 0.001 16 17 // G1 gelu(0) = 0 (exact) 18 if nx_f32_gelu(nx_i32_to_f32(0)) == 0 { pass = pass + 1; gp("G1 gelu(0)=0 exact OK\n" as *u8) } else { gp("G1 FAIL\n" as *u8) } 19 20 // G2 gelu(1) = 0.84134475 21 let e2: i64 = nx_f32_div(nx_i32_to_f32(84134475), nx_i32_to_f32(100000000)) 22 if close(nx_f32_gelu(nx_i32_to_f32(1)), e2, tol) == 1 { pass = pass + 1; gp("G2 gelu(1)~0.8413 OK\n" as *u8) } else { gp("G2 FAIL\n" as *u8) } 23 24 // G3 gelu(-1) = -0.15865525 25 let e3: i64 = nx_f32_neg(nx_f32_div(nx_i32_to_f32(15865525), nx_i32_to_f32(100000000))) 26 if close(nx_f32_gelu(nx_i32_to_f32(0 - 1)), e3, tol) == 1 { pass = pass + 1; gp("G3 gelu(-1)~-0.1587 OK\n" as *u8) } else { gp("G3 FAIL\n" as *u8) } 27 28 // G4 gelu(2) = 1.9544998 29 let e4: i64 = nx_f32_div(nx_i32_to_f32(19544998), nx_i32_to_f32(10000000)) 30 if close(nx_f32_gelu(nx_i32_to_f32(2)), e4, tol) == 1 { pass = pass + 1; gp("G4 gelu(2)~1.9545 OK\n" as *u8) } else { gp("G4 FAIL\n" as *u8) } 31 32 // G5 erf(1) = 0.8427008 (direct) 33 let e5: i64 = nx_f32_div(nx_i32_to_f32(8427008), nx_i32_to_f32(10000000)) 34 if close(nx_f32_erf(nx_i32_to_f32(1)), e5, tol) == 1 { pass = pass + 1; gp("G5 erf(1)~0.8427 OK\n" as *u8) } else { gp("G5 FAIL\n" as *u8) } 35 36 gp("GELU-GATE pass=" as *u8) 37 let bb: *u8 = sys_mmap(8); bb[0] = (48 + pass) as u8; sys_write(1, bb, 1); gp("/5\n" as *u8) 38 if pass == 5 { gp("GELU-GATE verdict=GREEN 5/5 (exact erf-based GELU matches PyTorch)\n" as *u8); sys_exit(0) } 39 sys_exit(1) 40 return 0 41}