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}