use optirs_core::optimizers::{Optimizer, SGD};
use optirs_core::regularizers::{ElasticNet, Regularizer, L1, L2};
use scirs2_core::ndarray::Array1;
#[allow(dead_code)]
fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("Regularization Example");
println!("=====================");
let params = Array1::from_vec(vec![0.5, -0.3, 0.0, 0.2, -0.8, 1.5]);
let gradients = Array1::from_vec(vec![0.1, 0.2, -0.3, 0.0, 0.15, -0.05]);
println!("Parameters: {:?}", params);
println!("Original Gradients: {:?}", gradients);
println!();
let l1_reg = L1::new(0.01);
let mut l1_gradients = gradients.clone();
let l1_penalty = l1_reg.apply(¶ms, &mut l1_gradients)?;
println!("L1 Regularization (alpha = 0.01)");
println!("--------------------------------");
println!("Modified Gradients: {:?}", l1_gradients);
println!("L1 Penalty Term: {:.6}", l1_penalty);
println!();
let l2_reg = L2::new(0.01);
let mut l2_gradients = gradients.clone();
let l2_penalty = l2_reg.apply(¶ms, &mut l2_gradients)?;
println!("L2 Regularization (alpha = 0.01)");
println!("--------------------------------");
println!("Modified Gradients: {:?}", l2_gradients);
println!("L2 Penalty Term: {:.6}", l2_penalty);
println!();
let elastic_net_reg = ElasticNet::new(0.01, 0.5);
let mut elastic_net_gradients = gradients.clone();
let elastic_net_penalty = elastic_net_reg.apply(¶ms, &mut elastic_net_gradients)?;
println!("ElasticNet Regularization (alpha = 0.01, l1_ratio = 0.5)");
println!("-------------------------------------------------------");
println!("Modified Gradients: {:?}", elastic_net_gradients);
println!("ElasticNet Penalty Term: {:.6}", elastic_net_penalty);
println!();
println!("Effect of Regularization on Optimization");
println!("---------------------------------------");
let params_large = Array1::from_vec(vec![5.0, -3.0, 0.0, 2.0, -8.0, 15.0]);
let gradients_base = Array1::from_vec(vec![0.1, 0.2, -0.3, 0.0, 0.15, -0.05]);
let mut optimizer_no_reg = SGD::new(0.1);
let mut params_no_reg = params_large.clone();
let mut params_with_l2 = params_large.clone();
println!("\nIteration | No Regularization | L2 Regularization");
println!("------------------------------------------------");
for i in 0..10 {
let gradients_no_reg = gradients_base.clone();
params_no_reg = optimizer_no_reg.step(¶ms_no_reg, &gradients_no_reg)?;
let mut gradients_with_l2 = gradients_base.clone();
l2_reg.apply(¶ms_with_l2, &mut gradients_with_l2)?;
params_with_l2 = optimizer_no_reg.step(¶ms_with_l2, &gradients_with_l2)?;
let l2_norm_no_reg = f64::sqrt(params_no_reg.iter().fold(0.0, |acc, &x| acc + x * x));
let l2_norm_with_l2 = f64::sqrt(params_with_l2.iter().fold(0.0, |acc, &x| acc + x * x));
println!(
"{:9} | {:16.6} | {:16.6}",
i, l2_norm_no_reg, l2_norm_with_l2
);
}
println!("\nFinal Parameters:");
println!("No Regularization: {:?}", params_no_reg);
println!("L2 Regularization: {:?}", params_with_l2);
Ok(())
}