code wiki / _hdl_build / nx_gradient_ml_gate.nx
nx_gradient_ml_gate.nx source
↩ module page · 88 lines · 6650 B
1import "nx_gate_gn.nx"
2import "nx_gate_base.nx"
3// nx_gradient_ml_gate.nx -- GRADIENT-BASED classical ML: LINEAR regression + LOGISTIC regression by gradient descent
4// (operator: fill the mechanistic-AI foundation gaps -- gradient ML was ABSENT though we have f32 autograd+Adam). The
5// gradient-descent mechanism (Cauchy 1847) underlies classical ML and neural nets alike; here it fits the two canonical
6// models. f32, NO LLM. Linear: y=w*x+b by MSE descent -> recovers y=2x+1. Logistic: p=sigmoid(w*x+b) by cross-entropy
7// descent -> learns a separating boundary and classifies 100%.
8// T0 LINEAR DATA: (x,y) from y = 2x + 1.
9// T1 LINEAR FIT: gradient descent on MSE -> w~=2, b~=1.
10// T2 LINEAR PREDICT: held-out x=5 -> ~11 (the line generalizes).
11// T3 LOGISTIC DATA: 1-D binary classification (low x -> 0, high x -> 1).
12// T4 LOGISTIC FIT: cross-entropy descent learns w,b -> classifies all 6 points correctly.
13// T5 = gradient ML (linear + logistic regression) by gradient descent, mechanistic, no LLM.
14// license_tier: ORIGINAL
15import "nx_f32_hw.nx"
16import "nx_syscalls.nx"
17
18func grow(name: *u8, ok: i64) -> i64 { if ok==1 { gw(" PASS " as *u8) } else { gw(" FAIL " as *u8) } gw(name); gw("
19" as *u8); return ok }
20func gm(x: i64) -> i64 { return gn(f32_int(f32_mul(x, f32_of(1000)))) }
21func f32_le(x: i64, y: i64) -> i64 { let d: i64=f32_sub(x,y) & 0xFFFFFFFF; if ((d>>31)&1)==1 { return 1 } if (d & 0x7FFFFFFF)==0 { return 1 } return 0 }
22func f32_abs(x: i64) -> i64 { return x & 0x7FFFFFFF }
23func f32_exp(x: i64) -> i64 {
24 let log2e: i64=f32_div(f32_of(1442695),f32_of(1000000)); let ln2: i64=f32_div(f32_of(693147),f32_of(1000000)); let half: i64=f32_div(f32_of(1),f32_of(2))
25 let t: i64=f32_mul(x, log2e); var n: i64=0; if f32_le(f32_of(0), t)==1 { n=f32_int(f32_add(t,half)) } else { n=f32_int(f32_sub(t,half)) }
26 let arg: i64=f32_mul(f32_sub(t, f32_of(n)), ln2); var p2f: i64=f32_of(1); var term: i64=f32_of(1); var k: i64=1
27 while k<=8 { term=f32_div(f32_mul(term,arg), f32_of(k)); p2f=f32_add(p2f,term); k=k+1 }
28 var ef: i64=n+127; if ef<=0 { return f32_of(0) } if ef>=255 { ef=254 } return f32_mul(p2f, (ef & 0xFF) << 23)
29}
30func f32_sigmoid(z: i64) -> i64 { return f32_div(f32_of(1), f32_add(f32_of(1), f32_exp(f32_neg(z)))) }
31
32func main() -> i64 {
33 gw("=== nx_gradient_ml_gate: linear + logistic regression by gradient descent, no LLM ===\n" as *u8)
34 var pass: i64=0; var total: i64=0
35
36 // ---- LINEAR regression: y = 2x + 1 ----
37 let N: i64=4
38 let X: *i64=sys_mmap(64) as *i64; let Yv: *i64=sys_mmap(64) as *i64
39 X[0]=f32_of(1); Yv[0]=f32_of(3); X[1]=f32_of(2); Yv[1]=f32_of(5); X[2]=f32_of(3); Yv[2]=f32_of(7); X[3]=f32_of(4); Yv[3]=f32_of(9)
40 total=total+1; pass=pass+1
41 gw(" [PASS] T0 LINEAR DATA: (1,3)(2,5)(3,7)(4,9) from y=2x+1\n" as *u8)
42
43 var w: i64=f32_of(0); var b: i64=f32_of(0); let lr: i64=f32_div(f32_of(2),f32_of(100)); var it: i64=0
44 while it<6000 {
45 var dw: i64=f32_of(0); var db: i64=f32_of(0); var i: i64=0
46 while i<N { let pred: i64=f32_add(f32_mul(w,X[i]),b); let err: i64=f32_sub(pred,Yv[i]); dw=f32_add(dw,f32_mul(err,X[i])); db=f32_add(db,err); i=i+1 }
47 let sc: i64=f32_div(f32_of(2),f32_of(N))
48 w=f32_sub(w, f32_mul(lr, f32_mul(sc,dw))); b=f32_sub(b, f32_mul(lr, f32_mul(sc,db)))
49 it=it+1
50 }
51 total=total+1; if f32_int(f32_mul(w,f32_of(100)))>=190 { if f32_int(f32_mul(w,f32_of(100)))<=210 { if f32_int(f32_mul(b,f32_of(100)))>=90 { if f32_int(f32_mul(b,f32_of(100)))<=110 { pass=pass+1; gw(" [PASS] " as *u8) } else { gw(" [FAIL] " as *u8) } } else { gw(" [FAIL] " as *u8) } } else { gw(" [FAIL] " as *u8) } } else { gw(" [FAIL] " as *u8) }
52 gw("T1 LINEAR FIT: gradient descent -> w=" as *u8); gm(w); gw("m b=" as *u8); gm(b); gw("m (~2.0, ~1.0)\n" as *u8)
53
54 let pred5: i64=f32_add(f32_mul(w,f32_of(5)),b)
55 total=total+1; if f32_le(f32_abs(f32_sub(pred5,f32_of(11))),f32_div(f32_of(3),f32_of(10)))==1 { pass=pass+1; gw(" [PASS] " as *u8) } else { gw(" [FAIL] " as *u8) }
56 gw("T2 LINEAR PREDICT: held-out x=5 -> " as *u8); gm(pred5); gw("m (~11, generalizes)\n" as *u8)
57
58 // ---- LOGISTIC regression: binary ----
59 let M: i64=6
60 let LX: *i64=sys_mmap(64) as *i64; let LY: *i64=sys_mmap(64) as *i64
61 LX[0]=f32_of(1); LY[0]=f32_of(0); LX[1]=f32_of(2); LY[1]=f32_of(0); LX[2]=f32_of(3); LY[2]=f32_of(0)
62 LX[3]=f32_of(7); LY[3]=f32_of(1); LX[4]=f32_of(8); LY[4]=f32_of(1); LX[5]=f32_of(9); LY[5]=f32_of(1)
63 total=total+1; pass=pass+1
64 gw(" [PASS] T3 LOGISTIC DATA: x=[1,2,3]->0, x=[7,8,9]->1 (1-D binary)\n" as *u8)
65
66 var lw: i64=f32_of(0); var lb: i64=f32_of(0); let llr: i64=f32_div(f32_of(5),f32_of(100)); it=0
67 while it<4000 {
68 var dw: i64=f32_of(0); var db: i64=f32_of(0); var i: i64=0
69 while i<M { let p: i64=f32_sigmoid(f32_add(f32_mul(lw,LX[i]),lb)); let err: i64=f32_sub(p,LY[i]); dw=f32_add(dw,f32_mul(err,LX[i])); db=f32_add(db,err); i=i+1 }
70 lw=f32_sub(lw, f32_mul(llr,dw)); lb=f32_sub(lb, f32_mul(llr,db))
71 it=it+1
72 }
73 var correct: i64=0; var i: i64=0
74 while i<M { let p: i64=f32_sigmoid(f32_add(f32_mul(lw,LX[i]),lb)); var cls: i64=0; if f32_le(f32_div(f32_of(1),f32_of(2)),p)==1 { cls=1 } if f32_of(cls)==LY[i] { correct=correct+1 } i=i+1 }
75 total=total+1; if correct==M { pass=pass+1; gw(" [PASS] " as *u8) } else { gw(" [FAIL] " as *u8) }
76 gw("T4 LOGISTIC FIT: cross-entropy descent -> w=" as *u8); gm(lw); gw("m b=" as *u8); gm(lb); gw("m, classifies " as *u8); gn(correct); gw("/" as *u8); gn(M); gw(" correct\n" as *u8)
77
78 total=total+1; if correct==M { pass=pass+1; gw(" [PASS] " as *u8) } else { gw(" [FAIL] " as *u8) }
79 gw("T5 GRADIENT ML: linear + logistic regression by gradient descent, mechanistic, no LLM\n" as *u8)
80
81 gw("\n GRADIENT ML: gradient descent (Cauchy) fit LINEAR regression (recovered y=2x+1) and LOGISTIC regression (learned a separating\n" as *u8)
82 gw(" boundary, 6/6 classified) -- the canonical continuous-optimization classifiers/regressors. f32, NO LLM. This closes the\n" as *u8)
83 gw(" classical-ML row (with decision tree + k-NN + k-means + Naive Bayes). Same gradient mechanism scales to the f32 autograd +\n" as *u8)
84 gw(" Adam transformer stack -- one mechanism, classical to deep. Foundation rung.\n" as *u8)
85 gw("GRADIENT-ML verdict=" as *u8)
86 if pass==total { gw("GREEN passes=" as *u8); gn(pass); gw("/" as *u8); gn(total); gw(" -- linear + logistic regression by gradient descent, no LLM\n" as *u8); sys_exit(0); return 0 }
87 gw("RED passes=" as *u8); gn(pass); gw("/" as *u8); gn(total); gw("\n" as *u8); sys_exit(1); return 1
88}