use optirs_core::optimizers::{Optimizer, SGD};
use scirs2_core::ndarray::Array1;
#[allow(dead_code)]
fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("SGD Optimizer Example");
println!("=====================");
let gradient_fn = |x: &Array1<f64>| -> Array1<f64> {
let mut grad = x.clone();
grad.mapv_inplace(|xi| 2.0 * xi);
grad
};
let mut params = Array1::from_vec(vec![5.0]);
let mut optimizer = SGD::new_with_config(0.1, 0.0, 0.0);
println!("Starting optimization at x = {}", params[0]);
println!("Learning rate = {}", optimizer.learning_rate());
println!("\nIteration | Parameter | Gradient | Function Value");
println!("--------------------------------------------------");
for i in 0..20 {
let gradient = gradient_fn(¶ms);
let function_value = params[0] * params[0];
println!(
"{:9} | {:9.4} | {:8.4} | {:13.4}",
i, params[0], gradient[0], function_value
);
params = optimizer.step(¶ms, &gradient)?;
}
let final_value = params[0] * params[0];
println!("\nFinal parameter: x = {:.6}", params[0]);
println!("Final function value: f(x) = {:.6}", final_value);
Ok(())
}