CJC Source Code — demo2_gradient.cjc
fn square(x: f64) -> f64 { x * x }
fn f(x: f64) -> f64 {
square(x - 3.0)
}
fn grad_f(x: f64) -> f64 {
2.0 * (x - 3.0)
}
fn abs(x: f64) -> f64 {
if x < 0.0 { 0.0 - x }
else { x }
}
// Gradient descent
let x = 0.0;
let lr = 0.1;
let steps = 100;
let i = 0;
while i < steps {
let g = grad_f(x);
x = x - lr * g;
i = i + 1;
}
// Verify convergence
assert(abs(x - 3.0) < 0.001);
assert(f(x) < 0.000001);
print("Converged!");
Live Output — $ cjc run demo2_gradient.cjc
Starting gradient descent on f(x) = (x-3)^2
Initial x: 0 f(x): 9
Step 20 x = 2.9654 f(x) = 0.00120
Step 40 x = 2.9996 f(x) = 0.00000016
Step 60 x = 3.0000 f(x) = 0.000000000021
Step 80 x = 3.0000 f(x) = 0.0000000000000028
Step 100 x = 3.0000 f(x) = 0.0000000000000000004
Final x: 2.9999999993888893
Final f(x): 3.7e-19
Gradient descent converged!
x is within 0.001 of optimal.