use crate::error::{OptimError, Result};
use scirs2_core::ndarray::{Array1, Dimension};
use scirs2_core::numeric::Float;
use std::collections::{HashMap, VecDeque};
use std::fmt::Debug;
use std::time::Instant;
#[derive(Debug, Clone)]
pub struct AdaptationStep<T: Float + Debug + Send + Sync + 'static> {
pub step: usize,
pub loss: T,
pub gradient_norm: T,
pub parameter_change_norm: T,
pub learning_rate: T,
}
#[derive(Debug, Clone)]
pub struct MetaTrainingMetrics<T: Float + Debug + Send + Sync + 'static> {
pub avg_adaptation_speed: T,
pub generalization_performance: T,
pub task_diversity: T,
pub gradient_alignment: T,
}
#[derive(Debug, Clone, Copy)]
pub enum TaskIdentificationMethod {
Oracle,
Learned,
Clustering,
EntropyBased,
GradientBased,
}
#[derive(Debug, Clone)]
pub struct QueryEvaluationMetrics<T: Float + Debug + Send + Sync + 'static> {
pub mse: Option<T>,
pub classification_accuracy: Option<T>,
pub auc: Option<T>,
pub uncertainty_quality: T,
}
#[derive(Debug, Clone)]
pub struct MetaParameters<T: Float + Debug + Send + Sync + 'static> {
pub parameters: HashMap<String, Array1<T>>,
pub metadata: HashMap<String, String>,
}
pub struct MAMLLearner<T: Float + Debug + Send + Sync + 'static, D: Dimension> {
pub(super) config: MAMLConfig<T>,
pub(super) adaptation_history: VecDeque<TaskAdaptationResult<T>>,
pub(super) meta_steps: usize,
_phantom: std::marker::PhantomData<D>,
}
pub(super) const MAML_HISTORY_CAPACITY: usize = 1000;
impl<
T: Float
+ Default
+ Clone
+ Send
+ Sync
+ scirs2_core::ndarray::ScalarOperand
+ std::fmt::Debug,
D: Dimension,
> MAMLLearner<T, D>
{
pub fn new(config: MAMLConfig<T>) -> Result<Self> {
if config.inner_steps == 0 {
return Err(OptimError::InvalidConfig(
"MAML requires at least one inner step".to_string(),
));
}
Ok(Self {
config,
adaptation_history: VecDeque::with_capacity(MAML_HISTORY_CAPACITY),
meta_steps: 0,
_phantom: std::marker::PhantomData,
})
}
pub fn adaptations_recorded(&self) -> usize {
self.adaptation_history.len()
}
}
impl<T: Float + Debug + Send + Sync + 'static + Default + Clone + std::iter::Sum, D: Dimension>
MAMLLearner<T, D>
{
pub(super) fn compute_support_loss(
&self,
task: &MetaTask<T>,
parameters: &HashMap<String, Array1<T>>,
) -> Result<T> {
super::linear_model::mse_loss(
&task.support_set.features,
&task.support_set.targets,
parameters,
)
}
pub(super) fn compute_support_gradients(
&self,
task: &MetaTask<T>,
parameters: &HashMap<String, Array1<T>>,
) -> Result<HashMap<String, Array1<T>>> {
let mut grads = super::linear_model::mse_gradients(
&task.support_set.features,
&task.support_set.targets,
parameters,
)?;
if let Some(clip) = self.config.gradient_clip {
if let Some(max_norm) = scirs2_core::numeric::NumCast::from(clip) {
super::linear_model::clip_gradients(&mut grads, max_norm);
}
}
Ok(grads)
}
pub(super) fn compute_query_gradients(
&self,
task: &MetaTask<T>,
parameters: &HashMap<String, Array1<T>>,
) -> Result<HashMap<String, Array1<T>>> {
super::linear_model::mse_gradients(
&task.query_set.features,
&task.query_set.targets,
parameters,
)
}
}
#[derive(Debug, Clone, Copy)]
pub enum MemorySelectionCriteria {
Random,
GradientMagnitude,
LossBased,
Uncertainty,
Diversity,
TemporalProximity,
}
#[derive(Debug, Clone)]
pub struct TaskMetadata {
pub name: String,
pub description: String,
pub properties: HashMap<String, String>,
pub created_at: Instant,
pub source: String,
}
#[derive(Debug, Clone)]
pub struct MetaTrainingEpoch<T: Float + Debug + Send + Sync + 'static> {
pub epoch: usize,
pub training_result: MetaTrainingResult<T>,
pub validation_result: MetaValidationResult<T>,
pub meta_parameters: HashMap<String, Array1<T>>,
}
#[derive(Debug, Clone)]
pub struct TaskDataset<T: Float + Debug + Send + Sync + 'static> {
pub features: Vec<Array1<T>>,
pub targets: Vec<T>,
pub weights: Vec<T>,
pub metadata: DatasetMetadata,
}
#[derive(Debug, Clone)]
pub struct MAMLConfig<T: Float + Debug + Send + Sync + 'static> {
pub second_order: bool,
pub inner_lr: T,
pub outer_lr: T,
pub inner_steps: usize,
pub allow_unused: bool,
pub gradient_clip: Option<f64>,
}
#[derive(Debug, Clone)]
pub struct MetaTrainingResult<T: Float + Debug + Send + Sync + 'static> {
pub meta_loss: T,
pub task_losses: Vec<T>,
pub meta_gradients: HashMap<String, Array1<T>>,
pub metrics: MetaTrainingMetrics<T>,
pub adaptation_stats: AdaptationStatistics<T>,
}
#[derive(Debug, Clone)]
pub struct MetricLearningSettings {
pub distance_metric: DistanceMetric,
pub embedding_dim: usize,
pub learned_metric: bool,
}
#[derive(Debug, Clone)]
pub struct MultiTaskResult<T: Float + Debug + Send + Sync + 'static> {
pub task_results: Vec<TaskResult<T>>,
pub coordination_overhead: T,
pub convergence_status: String,
}
#[derive(Debug, Clone)]
pub struct MemoryReplaySettings {
pub buffer_size: usize,
pub replay_strategy: ReplayStrategy,
pub replay_frequency: usize,
pub selection_criteria: MemorySelectionCriteria,
}
#[derive(Debug, Clone, Copy)]
pub enum TaskType {
Regression,
Classification,
Optimization,
ReinforcementLearning,
StructuredPrediction,
Generative,
}
#[derive(Debug, Clone, Copy)]
pub enum InterferenceMitigationStrategy {
OrthogonalGradients,
TaskSpecificLayers,
AttentionMechanisms,
MetaGradients,
}
#[derive(Debug, Clone, Copy)]
pub enum ReplayStrategy {
Random,
GradientBased,
UncertaintyBased,
DiversityBased,
Temporal,
}
#[derive(Debug, Clone)]
pub struct TransferLearningSettings {
pub domain_adaptation: bool,
pub source_domain_weights: Vec<f64>,
pub strategies: Vec<TransferStrategy>,
pub similarity_measures: Vec<SimilarityMeasure>,
pub progressive_transfer: bool,
}
#[derive(Debug, Clone)]
pub struct ValidationResult {
pub is_valid: bool,
pub validation_loss: f64,
pub metrics: HashMap<String, f64>,
}
#[derive(Debug, Clone)]
pub struct TransferLearningResult<T: Float + Debug + Send + Sync + 'static> {
pub transfer_efficiency: T,
pub domain_adaptation_score: T,
pub source_task_retention: T,
pub target_task_performance: T,
}
#[derive(Debug, Clone, Copy)]
pub enum AdaptationStrategy {
FullFineTuning,
LayerWiseFineTuning,
ParameterEfficient,
LearnedLearningRates,
GradientBased,
MemoryBased,
AttentionBased,
ModularAdaptation,
}
#[derive(Debug, Clone)]
pub struct MetaTask<T: Float + Debug + Send + Sync + 'static> {
pub id: String,
pub support_set: TaskDataset<T>,
pub query_set: TaskDataset<T>,
pub metadata: TaskMetadata,
pub difficulty: T,
pub domain: String,
pub task_type: TaskType,
}
#[derive(Debug, Clone)]
pub struct ContinualLearningResult<T: Float + Debug + Send + Sync + 'static> {
pub sequence_results: Vec<TaskResult<T>>,
pub forgetting_measure: T,
pub adaptation_efficiency: T,
}
#[derive(Debug, Clone, Copy)]
pub enum AntiForgettingStrategy {
ElasticWeightConsolidation,
SynapticIntelligence,
MemoryReplay,
ProgressiveNetworks,
PackNet,
Piggyback,
HAT,
}
#[derive(Debug, Clone)]
pub struct TrainingResult {
pub training_loss: f64,
pub metrics: HashMap<String, f64>,
pub steps: usize,
}
#[derive(Debug, Clone)]
pub struct MetaTrainingResults<T: Float + Debug + Send + Sync + 'static> {
pub final_parameters: HashMap<String, Array1<T>>,
pub training_history: Vec<MetaTrainingEpoch<T>>,
pub best_performance: T,
pub total_epochs: usize,
}
#[derive(Debug, Clone)]
pub struct DatasetMetadata {
pub num_samples: usize,
pub feature_dim: usize,
pub distribution_type: String,
pub noise_level: f64,
}
#[derive(Debug, Clone)]
pub struct MetaLearningStatistics<T: Float + Debug + Send + Sync + 'static> {
pub algorithm: MetaLearningAlgorithm,
pub total_tasks_seen: usize,
pub adaptation_efficiency: T,
pub transfer_success_rate: T,
pub forgetting_measure: T,
pub multitask_interference: T,
pub few_shot_performance: T,
}
#[derive(Debug, Clone)]
pub struct TaskAdaptationResult<T: Float + Debug + Send + Sync + 'static> {
pub adapted_parameters: HashMap<String, Array1<T>>,
pub adaptation_trajectory: Vec<AdaptationStep<T>>,
pub final_loss: T,
pub metrics: TaskAdaptationMetrics<T>,
}
#[derive(Debug, Clone, Copy)]
pub enum TransferStrategy {
FeatureExtraction,
FineTuning,
DomainAdaptation,
MultiTask,
MetaTransfer,
Progressive,
}
#[derive(Debug, Clone, Copy)]
pub enum AugmentationStrategy {
Geometric,
Color,
Noise,
Mixup,
CutMix,
Learned,
}
#[derive(Debug, Clone)]
pub struct StabilityMetrics<T: Float + Debug + Send + Sync + 'static> {
pub parameter_stability: T,
pub performance_stability: T,
pub gradient_stability: T,
pub forgetting_measure: T,
}
#[derive(Debug, Clone)]
pub struct TaskResult<T: Float + Debug + Send + Sync + 'static> {
pub task_id: String,
pub loss: T,
pub metrics: HashMap<String, T>,
}
#[derive(Debug, Clone, Copy)]
pub enum MetaLearningAlgorithm {
MAML,
FOMAML,
Reptile,
MetaSGD,
L2L,
GBML,
IMaml,
ProtoNet,
MatchingNet,
RelationNet,
MANN,
WarpGrad,
LearnedGD,
}
#[derive(Debug, Clone, Copy)]
pub enum GradientBalancingMethod {
Uniform,
GradNorm,
PCGrad,
CAGrad,
NashMTL,
}
#[derive(Debug, Clone)]
pub struct QueryEvaluationResult<T: Float + Debug + Send + Sync + 'static> {
pub query_loss: T,
pub accuracy: T,
pub predictions: Vec<T>,
pub confidence_scores: Vec<T>,
pub metrics: QueryEvaluationMetrics<T>,
}
#[derive(Debug, Clone, Copy)]
pub enum FewShotAlgorithm {
Prototypical,
Matching,
Relation,
MAML,
Reptile,
MetaOptNet,
}
#[derive(Debug, Clone, Copy)]
pub enum ActivationFunction {
ReLU,
Sigmoid,
Tanh,
Softmax,
GELU,
}
#[derive(Debug, Clone)]
pub struct AdaptationStatistics<T: Float + Debug + Send + Sync + 'static> {
pub convergence_steps: Vec<usize>,
pub final_losses: Vec<T>,
pub adaptation_efficiency: T,
pub stability_metrics: StabilityMetrics<T>,
}
#[derive(Debug, Clone)]
pub struct MetaValidationResult<T: Float + Debug + Send + Sync + 'static> {
pub performance: T,
pub adaptation_speed: T,
pub generalization_gap: T,
pub task_specific_metrics: HashMap<String, T>,
}
#[derive(Debug, Clone)]
pub struct ContinualLearningSettings {
pub anti_forgetting_strategies: Vec<AntiForgettingStrategy>,
pub memory_replay: MemoryReplaySettings,
pub task_identification: TaskIdentificationMethod,
pub plasticity_stability_balance: f64,
}
#[derive(Debug, Clone, Copy)]
pub enum TaskWeightingStrategy {
Uniform,
UncertaintyBased,
GradientMagnitude,
PerformanceBased,
Adaptive,
Learned,
}
#[derive(Debug, Clone)]
pub struct MultiTaskSettings {
pub task_weighting: TaskWeightingStrategy,
pub gradient_balancing: GradientBalancingMethod,
pub interference_mitigation: InterferenceMitigationStrategy,
pub shared_representation: SharedRepresentationStrategy,
}
#[derive(Debug, Clone, Copy)]
pub enum SharedRepresentationStrategy {
HardSharing,
SoftSharing,
HierarchicalSharing,
AttentionBased,
Modular,
}
#[derive(Debug, Clone, Copy)]
pub enum DistanceMetric {
Euclidean,
Cosine,
Mahalanobis,
Learned,
}
#[derive(Debug, Clone)]
pub struct TaskAdaptationMetrics<T: Float + Debug + Send + Sync + 'static> {
pub convergence_speed: T,
pub final_performance: T,
pub efficiency: T,
pub robustness: T,
}
#[derive(Debug, Clone)]
pub struct FewShotSettings {
pub num_shots: usize,
pub num_ways: usize,
pub algorithm: FewShotAlgorithm,
pub metric_learning: MetricLearningSettings,
pub augmentation_strategies: Vec<AugmentationStrategy>,
}
#[derive(Debug, Clone, Copy)]
pub enum SimilarityMeasure {
CosineDistance,
KLDivergence,
WassersteinDistance,
CentralMomentDiscrepancy,
MaximumMeanDiscrepancy,
}
#[derive(Debug, Clone)]
pub struct MetaLearningConfig {
pub algorithm: MetaLearningAlgorithm,
pub inner_steps: usize,
pub outer_steps: usize,
pub meta_learning_rate: f64,
pub inner_learning_rate: f64,
pub task_batch_size: usize,
pub support_set_size: usize,
pub query_set_size: usize,
pub second_order: bool,
pub gradient_clip: f64,
pub adaptation_strategies: Vec<AdaptationStrategy>,
pub transfer_settings: TransferLearningSettings,
pub continual_settings: ContinualLearningSettings,
pub multitask_settings: MultiTaskSettings,
pub few_shot_settings: FewShotSettings,
pub enable_meta_regularization: bool,
pub meta_regularization_strength: f64,
pub task_sampling_strategy: TaskSamplingStrategy,
}
#[derive(Debug, Clone, Copy)]
pub enum TaskSamplingStrategy {
Uniform,
Curriculum,
DifficultyBased,
DiversityBased,
ActiveLearning,
Adversarial,
}
#[derive(Debug, Clone)]
pub struct FewShotResult<T: Float + Debug + Send + Sync + 'static> {
pub accuracy: T,
pub confidence: T,
pub adaptation_steps: usize,
pub uncertainty_estimates: Vec<T>,
}
impl Default for MetaLearningConfig {
fn default() -> Self {
Self {
algorithm: MetaLearningAlgorithm::MAML,
inner_steps: 5,
outer_steps: 100,
meta_learning_rate: 0.3,
inner_learning_rate: 0.4,
task_batch_size: 8,
support_set_size: 6,
query_set_size: 6,
second_order: false,
gradient_clip: 10.0,
adaptation_strategies: vec![AdaptationStrategy::FullFineTuning],
transfer_settings: TransferLearningSettings {
domain_adaptation: true,
source_domain_weights: vec![1.0],
strategies: vec![TransferStrategy::FineTuning],
similarity_measures: vec![SimilarityMeasure::CosineDistance],
progressive_transfer: false,
},
continual_settings: ContinualLearningSettings {
anti_forgetting_strategies: vec![
AntiForgettingStrategy::ElasticWeightConsolidation,
],
memory_replay: MemoryReplaySettings {
buffer_size: 256,
replay_strategy: ReplayStrategy::Random,
replay_frequency: 8,
selection_criteria: MemorySelectionCriteria::Random,
},
task_identification: TaskIdentificationMethod::Oracle,
plasticity_stability_balance: 0.5,
},
multitask_settings: MultiTaskSettings {
task_weighting: TaskWeightingStrategy::Uniform,
gradient_balancing: GradientBalancingMethod::Uniform,
interference_mitigation: InterferenceMitigationStrategy::OrthogonalGradients,
shared_representation: SharedRepresentationStrategy::HardSharing,
},
few_shot_settings: FewShotSettings {
num_shots: 5,
num_ways: 2,
algorithm: FewShotAlgorithm::MAML,
metric_learning: MetricLearningSettings {
distance_metric: DistanceMetric::Euclidean,
embedding_dim: 16,
learned_metric: false,
},
augmentation_strategies: Vec::new(),
},
enable_meta_regularization: false,
meta_regularization_strength: 0.0,
task_sampling_strategy: TaskSamplingStrategy::Uniform,
}
}
}
impl MetaLearningConfig {
pub fn validate(&self) -> Result<()> {
if self.inner_steps == 0 {
return Err(OptimError::InvalidConfig(
"inner_steps must be greater than zero".to_string(),
));
}
if self.task_batch_size == 0 {
return Err(OptimError::InvalidConfig(
"task_batch_size must be greater than zero".to_string(),
));
}
if !(self.meta_learning_rate.is_finite() && self.meta_learning_rate > 0.0) {
return Err(OptimError::InvalidConfig(
"meta_learning_rate must be finite and positive".to_string(),
));
}
if !(self.inner_learning_rate.is_finite() && self.inner_learning_rate > 0.0) {
return Err(OptimError::InvalidConfig(
"inner_learning_rate must be finite and positive".to_string(),
));
}
if !(self.gradient_clip.is_finite() && self.gradient_clip > 0.0) {
return Err(OptimError::InvalidConfig(
"gradient_clip must be finite and positive".to_string(),
));
}
if !(0.0..=1.0).contains(&self.continual_settings.plasticity_stability_balance) {
return Err(OptimError::InvalidConfig(
"plasticity_stability_balance must lie in [0, 1]".to_string(),
));
}
Ok(())
}
}