use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OptimizerConfig {
pub name: String,
pub lr: f64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub weight_decay: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub betas: Option<Vec<f64>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub eps: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub amsgrad: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub momentum: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub nesterov: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub dampening: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub alpha: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub centered: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub param_groups: Option<Vec<ParamGroup>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ParamGroup {
pub params: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub lr: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub weight_decay: Option<f64>,
}