use scirs2_core::ndarray::{Dimension, ScalarOperand};
use scirs2_core::numeric::Float;
use std::fmt::Debug;
use crate::optimizers::Optimizer;
pub trait LearningRateScheduler<A: Float + Debug + ScalarOperand> {
fn get_learning_rate(&self) -> A;
fn step(&mut self) -> A;
fn apply_to<D: Dimension, O: Optimizer<A, D>>(&self, optimizer: &mut O)
where
Self: Sized,
{
optimizer.set_learning_rate(self.get_learning_rate());
}
fn reset(&mut self);
}
mod attention_aware;
mod constant;
mod cosine_annealing;
mod cosine_annealing_warm_restarts;
mod curriculum;
mod custom_scheduler;
mod cyclic_lr;
mod exponential_decay;
mod linear_decay;
mod linear_warmup_decay;
mod noise_injection;
mod one_cycle;
mod reduce_on_plateau;
mod step_decay;
mod vit_layer_decay;
pub use attention_aware::{AttentionAwareScheduler, TransformerComponentType};
pub use constant::ConstantScheduler;
pub use cosine_annealing::CosineAnnealing;
pub use cosine_annealing_warm_restarts::CosineAnnealingWarmRestarts;
pub use curriculum::{CurriculumScheduler, CurriculumStage, TransitionStrategy};
pub use custom_scheduler::{CombinedScheduler, CustomScheduler, SchedulerBuilder};
pub use cyclic_lr::{CyclicLR, CyclicMode};
pub use exponential_decay::ExponentialDecay;
pub use linear_decay::LinearDecay;
pub use linear_warmup_decay::{DecayStrategy, LinearWarmupDecay};
pub use noise_injection::{NoiseDistribution, NoiseInjectionScheduler};
pub use one_cycle::{AnnealStrategy, OneCycle};
pub use reduce_on_plateau::ReduceOnPlateau;
pub use step_decay::StepDecay;
pub use vit_layer_decay::ViTLayerDecay;