use scirs2_core::numeric::Float;
use std::fmt::Debug;
use serde::{Deserialize, Serialize};
use std::time::Duration;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TransformerBasedOptimizerConfig<T: Float + Debug + Send + Sync + 'static> {
pub architecture: TransformerArchConfig,
pub attention: AttentionConfig<T>,
pub meta_learning: MetaLearningConfig<T>,
pub sequence: SequenceConfig,
pub memory: MemoryConfig,
pub performance: PerformanceConfig,
pub training: TrainingConfig<T>,
}
impl<T: Float + Debug + Send + Sync + 'static> Default for TransformerBasedOptimizerConfig<T> {
fn default() -> Self {
Self {
architecture: TransformerArchConfig::default(),
attention: AttentionConfig::default(),
meta_learning: MetaLearningConfig::default(),
sequence: SequenceConfig::default(),
memory: MemoryConfig::default(),
performance: PerformanceConfig::default(),
training: TrainingConfig::default(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TransformerArchConfig {
pub num_layers: usize,
pub hidden_dim: usize,
pub ff_dim: usize,
pub num_heads: usize,
pub dropout_rate: f64,
pub pre_norm: bool,
pub activation: ActivationType,
pub max_seq_length: usize,
pub learnable_pe: bool,
pub embedding_dim: usize,
}
impl Default for TransformerArchConfig {
fn default() -> Self {
Self {
num_layers: 6,
hidden_dim: 512,
ff_dim: 2048,
num_heads: 8,
dropout_rate: 0.1,
pre_norm: true,
activation: ActivationType::Gelu,
max_seq_length: 1024,
learnable_pe: false,
embedding_dim: 512,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum ActivationType {
Relu,
Gelu,
Swish,
Mish,
Tanh,
Sigmoid,
LeakyRelu { negative_slope: f64 },
Elu { alpha: f64 },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AttentionConfig<T: Float + Debug + Send + Sync + 'static> {
pub head_dim: usize,
pub scaled: bool,
pub attention_dropout: f64,
pub relative_pe: bool,
pub max_relative_position: usize,
pub bias_type: AttentionBiasType,
pub temperature: T,
pub sparse_attention: bool,
pub sparsity_config: Option<SparsityConfig>,
}
impl<T: Float + Debug + Send + Sync + 'static> Default for AttentionConfig<T> {
fn default() -> Self {
Self {
head_dim: 64,
scaled: true,
attention_dropout: 0.1,
relative_pe: false,
max_relative_position: 32,
bias_type: AttentionBiasType::None,
temperature: T::one(),
sparse_attention: false,
sparsity_config: None,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum AttentionBiasType {
None,
Causal,
Custom,
Relative,
Learnable,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SparsityConfig {
pub pattern: SparsityPattern,
pub block_size: usize,
pub stride: usize,
pub local_attention: usize,
pub global_attention: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum SparsityPattern {
BlockSparse,
Strided,
LocalGlobal,
Random { sparsity_ratio: f64 },
Custom,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MetaLearningConfig<T: Float + Debug + Send + Sync + 'static> {
pub strategy: MetaLearningStrategy,
pub meta_learning_rate: T,
pub inner_steps: usize,
pub meta_batch_size: usize,
pub gradient_clip: Option<T>,
pub second_order: bool,
pub adaptation: AdaptationConfig<T>,
pub task_sampling: TaskSamplingConfig,
}
impl<T: Float + Debug + Send + Sync + 'static> Default for MetaLearningConfig<T> {
fn default() -> Self {
Self {
strategy: MetaLearningStrategy::Maml,
meta_learning_rate: scirs2_core::numeric::NumCast::from(0.001).unwrap_or_else(|| T::zero()),
inner_steps: 5,
meta_batch_size: 16,
gradient_clip: Some(scirs2_core::numeric::NumCast::from(1.0).unwrap_or_else(|| T::zero())),
second_order: false,
adaptation: AdaptationConfig::default(),
task_sampling: TaskSamplingConfig::default(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum MetaLearningStrategy {
Maml,
Reptile,
Prototypical,
Matching,
MetaSgd,
LearnedOptimizer,
GradientBased,
MemoryAugmented,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AdaptationConfig<T: Float + Debug + Send + Sync + 'static> {
pub num_steps: usize,
pub learning_rate: T,
pub adaptive_lr: bool,
pub lr_schedule: LearningRateSchedule<T>,
pub early_stopping: bool,
pub tolerance: T,
}
impl<T: Float + Debug + Send + Sync + 'static> Default for AdaptationConfig<T> {
fn default() -> Self {
Self {
num_steps: 10,
learning_rate: scirs2_core::numeric::NumCast::from(0.01).unwrap_or_else(|| T::zero()),
adaptive_lr: false,
lr_schedule: LearningRateSchedule::Constant,
early_stopping: false,
tolerance: scirs2_core::numeric::NumCast::from(1e-6).unwrap_or_else(|| T::zero()),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum LearningRateSchedule<T: Float + Debug + Send + Sync + 'static> {
Constant,
Exponential { decay_rate: T },
Cosine { min_lr: T },
Step {
step_size: usize,
gamma: T
},
Polynomial { power: T },
WarmRestart {
t_0: usize,
t_mult: usize
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TaskSamplingConfig {
pub strategy: TaskSamplingStrategy,
pub num_support: usize,
pub num_query: usize,
pub curriculum: Option<CurriculumConfig>,
pub augmentation: TaskAugmentationConfig,
}
impl Default for TaskSamplingConfig {
fn default() -> Self {
Self {
strategy: TaskSamplingStrategy::Uniform,
num_support: 10,
num_query: 15,
curriculum: None,
augmentation: TaskAugmentationConfig::default(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum TaskSamplingStrategy {
Uniform,
Weighted,
Curriculum,
AntiCurriculum,
Adaptive,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CurriculumConfig {
pub start_difficulty: f64,
pub end_difficulty: f64,
pub schedule: CurriculumSchedule,
pub difficulty_metric: DifficultyMetric,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum CurriculumSchedule {
Linear,
Exponential { rate: f64 },
Step { step_size: usize },
PerformanceBased { threshold: f64 },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum DifficultyMetric {
Loss,
GradientNorm,
ConvergenceRate,
OptimizationSteps,
Custom(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TaskAugmentationConfig {
pub noise_injection: bool,
pub noise_level: f64,
pub parameter_perturbation: bool,
pub perturbation_magnitude: f64,
pub gradient_augmentation: bool,
pub augmentation_methods: Vec<AugmentationMethod>,
}
impl Default for TaskAugmentationConfig {
fn default() -> Self {
Self {
noise_injection: false,
noise_level: 0.01,
parameter_perturbation: false,
perturbation_magnitude: 0.1,
gradient_augmentation: false,
augmentation_methods: vec![],
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum AugmentationMethod {
GaussianNoise { std: f64 },
Dropout { rate: f64 },
GradientClipping { threshold: f64 },
ParameterScaling { factor: f64 },
Custom(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SequenceConfig {
pub max_length: usize,
pub padding_strategy: PaddingStrategy,
pub truncation_strategy: TruncationStrategy,
pub dynamic_batching: bool,
pub batch_size: usize,
pub augmentation: SequenceAugmentationConfig,
}
impl Default for SequenceConfig {
fn default() -> Self {
Self {
max_length: 1024,
padding_strategy: PaddingStrategy::Zero,
truncation_strategy: TruncationStrategy::Right,
dynamic_batching: true,
batch_size: 32,
augmentation: SequenceAugmentationConfig::default(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum PaddingStrategy {
Zero,
Mean,
Constant(f64),
Reflection,
Replication,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum TruncationStrategy {
Right,
Left,
Center,
Random,
None,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SequenceAugmentationConfig {
pub temporal_jittering: bool,
pub jitter_strength: f64,
pub sequence_dropout: bool,
pub dropout_rate: f64,
pub permutation: bool,
pub permutation_prob: f64,
}
impl Default for SequenceAugmentationConfig {
fn default() -> Self {
Self {
temporal_jittering: false,
jitter_strength: 0.1,
sequence_dropout: false,
dropout_rate: 0.1,
permutation: false,
permutation_prob: 0.1,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MemoryConfig {
pub memory_type: MemoryType,
pub memory_size: usize,
pub update_strategy: MemoryUpdateStrategy,
pub retrieval_strategy: MemoryRetrievalStrategy,
pub compression: bool,
pub compression_algorithm: CompressionAlgorithm,
}
impl Default for MemoryConfig {
fn default() -> Self {
Self {
memory_type: MemoryType::Fifo,
memory_size: 10000,
update_strategy: MemoryUpdateStrategy::Replace,
retrieval_strategy: MemoryRetrievalStrategy::MostRecent,
compression: false,
compression_algorithm: CompressionAlgorithm::None,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum MemoryType {
Fifo,
Lru,
Priority,
Associative,
Episodic,
Working,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum MemoryUpdateStrategy {
Replace,
Average,
Weighted { weight: f64 },
Append,
Selective,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum MemoryRetrievalStrategy {
MostRecent,
MostRelevant,
Random,
Similarity,
Attention,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum CompressionAlgorithm {
None,
Pca { components: usize },
Svd { rank: usize },
Autoencoder { latent_dim: usize },
Quantization { bits: usize },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PerformanceConfig {
pub enabled: bool,
pub tracking_interval: Duration,
pub metrics: Vec<PerformanceMetric>,
pub profiling: bool,
pub memory_tracking: bool,
pub time_tracking: bool,
}
impl Default for PerformanceConfig {
fn default() -> Self {
Self {
enabled: true,
tracking_interval: Duration::from_secs(1),
metrics: vec![
PerformanceMetric::Loss,
PerformanceMetric::Accuracy,
PerformanceMetric::ConvergenceRate,
],
profiling: false,
memory_tracking: true,
time_tracking: true,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum PerformanceMetric {
Loss,
Accuracy,
ConvergenceRate,
GradientNorm,
LearningRate,
MemoryUsage,
ComputationTime,
AttentionWeights,
Custom(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TrainingConfig<T: Float + Debug + Send + Sync + 'static> {
pub learning_rate: T,
pub optimizer: OptimizerType,
pub weight_decay: T,
pub gradient_clipping: Option<GradientClippingConfig<T>>,
pub lr_schedule: LearningRateSchedule<T>,
pub warmup: Option<WarmupConfig>,
pub early_stopping: Option<EarlyStoppingConfig<T>>,
}
impl<T: Float + Debug + Send + Sync + 'static> Default for TrainingConfig<T> {
fn default() -> Self {
Self {
learning_rate: scirs2_core::numeric::NumCast::from(0.001).unwrap_or_else(|| T::zero()),
optimizer: OptimizerType::Adam,
weight_decay: scirs2_core::numeric::NumCast::from(0.01).unwrap_or_else(|| T::zero()),
gradient_clipping: Some(GradientClippingConfig::default()),
lr_schedule: LearningRateSchedule::Constant,
warmup: None,
early_stopping: None,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum OptimizerType {
Adam,
AdamW,
Sgd,
RmsProp,
Adagrad,
Custom(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GradientClippingConfig<T: Float + Debug + Send + Sync + 'static> {
pub method: ClippingMethod<T>,
pub threshold: T,
pub adaptive: bool,
}
impl<T: Float + Debug + Send + Sync + 'static> Default for GradientClippingConfig<T> {
fn default() -> Self {
Self {
method: ClippingMethod::Norm,
threshold: scirs2_core::numeric::NumCast::from(1.0).unwrap_or_else(|| T::zero()),
adaptive: false,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ClippingMethod<T: Float + Debug + Send + Sync + 'static> {
Norm,
Value,
GlobalNorm,
Adaptive { percentile: T },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WarmupConfig {
pub steps: usize,
pub warmup_type: WarmupType,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum WarmupType {
Linear,
Cosine,
Exponential,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EarlyStoppingConfig<T: Float + Debug + Send + Sync + 'static> {
pub patience: usize,
pub min_delta: T,
pub monitor: String,
pub mode: MonitorMode,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum MonitorMode {
Min,
Max,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_config() {
let config = TransformerBasedOptimizerConfig::<f64>::default();
assert_eq!(config.architecture.num_layers, 6);
assert_eq!(config.architecture.hidden_dim, 512);
assert_eq!(config.attention.head_dim, 64);
}
#[test]
fn test_activation_types() {
let relu = ActivationType::Relu;
let gelu = ActivationType::Gelu;
let leaky_relu = ActivationType::LeakyRelu { negative_slope: 0.01 };
assert_eq!(relu, ActivationType::Relu);
assert_eq!(gelu, ActivationType::Gelu);
if let ActivationType::LeakyRelu { negative_slope } = leaky_relu {
assert_eq!(negative_slope, 0.01);
}
}
#[test]
fn test_meta_learning_config() {
let config = MetaLearningConfig::<f32>::default();
assert_eq!(config.inner_steps, 5);
assert_eq!(config.meta_batch_size, 16);
assert!(matches!(config.strategy, MetaLearningStrategy::Maml));
}
#[test]
fn test_memory_config() {
let config = MemoryConfig::default();
assert_eq!(config.memory_size, 10000);
assert!(matches!(config.memory_type, MemoryType::Fifo));
assert!(!config.compression);
}
#[test]
fn test_sequence_config() {
let config = SequenceConfig::default();
assert_eq!(config.max_length, 1024);
assert_eq!(config.batch_size, 32);
assert!(config.dynamic_batching);
}
#[test]
fn test_performance_config() {
let config = PerformanceConfig::default();
assert!(config.enabled);
assert!(config.memory_tracking);
assert!(config.time_tracking);
assert_eq!(config.metrics.len(), 3);
}
}