use scirs2_core::numeric::Float;
use std::collections::HashMap;
use std::fmt::Debug;
use serde::{Serialize, Deserialize};
use super::adaptation::AdaptationConfig;
#[derive(Debug, Clone)]
pub struct AdvancedConfig<T: Float + Debug + Send + Sync + 'static> {
pub enable_nas: bool,
pub enable_transformer_enhancement: bool,
pub enable_few_shot_learning: bool,
pub enable_meta_learning: bool,
pub max_parallel_optimizers: usize,
pub prediction_horizon: usize,
pub adaptation_threshold: T,
pub resource_allocation: ResourceAllocationStrategy,
pub objective_weights: HashMap<OptimizationObjective, T>,
pub enable_dynamic_reconfiguration: bool,
pub enable_advanced_analytics: bool,
pub cache_size_limit: usize,
pub adaptation_config: AdaptationConfig<T>,
}
impl<T: Float + Debug + Send + Sync + 'static> Default for AdvancedConfig<T> {
fn default() -> Self {
let mut objective_weights = HashMap::new();
objective_weights.insert(
OptimizationObjective::ConvergenceSpeed,
scirs2_core::numeric::NumCast::from(0.3).unwrap_or_else(|| T::zero()),
);
objective_weights.insert(
OptimizationObjective::SolutionQuality,
scirs2_core::numeric::NumCast::from(0.4).unwrap_or_else(|| T::zero()),
);
objective_weights.insert(
OptimizationObjective::ResourceEfficiency,
scirs2_core::numeric::NumCast::from(0.2).unwrap_or_else(|| T::zero()),
);
objective_weights.insert(OptimizationObjective::Robustness, scirs2_core::numeric::NumCast::from(0.1).unwrap_or_else(|| T::zero()));
Self {
enable_nas: true,
enable_transformer_enhancement: true,
enable_few_shot_learning: true,
enable_meta_learning: true,
max_parallel_optimizers: 8,
prediction_horizon: 100,
adaptation_threshold: scirs2_core::numeric::NumCast::from(0.05).unwrap_or_else(|| T::zero()),
resource_allocation: ResourceAllocationStrategy::Adaptive,
objective_weights,
enable_dynamic_reconfiguration: true,
enable_advanced_analytics: true,
cache_size_limit: 10000,
adaptation_config: AdaptationConfig::default(),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ResourceAllocationStrategy {
Uniform,
PerformanceWeighted,
Adaptive,
PriorityBased,
DynamicLoadBalancing,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum OptimizationObjective {
ConvergenceSpeed,
SolutionQuality,
ResourceEfficiency,
Robustness,
Generalization,
MemoryEfficiency,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum EnsembleStrategy {
WeightedVoting,
Stacking,
Boosting,
Bagging,
DynamicSelection,
MixtureOfExperts,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum OptimizerSelectionAlgorithm {
MultiArmedBandit,
UpperConfidenceBound,
ThompsonSampling,
EpsilonGreedy,
Portfolio,
ContextualBandits,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ProblemType {
Convex,
NonConvex,
MultiObjective,
Constrained,
Stochastic,
BlackBox,
LargeScale,
Online,
}
#[derive(Debug, Clone)]
pub struct ScalabilityInfo {
pub max_parameters: usize,
pub memory_complexity: ComplexityClass,
pub time_complexity: ComplexityClass,
pub parallel_scalability: ParallelScalability,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ComplexityClass {
Constant,
Logarithmic,
Linear,
Linearithmic,
Quadratic,
Cubic,
Exponential,
}
#[derive(Debug, Clone)]
pub struct ParallelScalability {
pub max_threads: usize,
pub efficiency: f64,
pub communication_overhead: f64,
}
#[derive(Debug, Clone)]
pub struct OptimizationContext<T: Float + Debug + Send + Sync + 'static> {
pub problem_type: ProblemType,
pub dimensionality: usize,
pub iteration: usize,
pub computational_budget: ComputationalBudget,
pub convergence_criteria: ConvergenceCriteria<T>,
pub historical_performance: Vec<T>,
pub metadata: HashMap<String, String>,
}
#[derive(Debug, Clone)]
pub struct ComputationalBudget {
pub max_evaluations: usize,
pub max_time: std::time::Duration,
pub max_memory: usize,
pub available_cores: usize,
}
#[derive(Debug, Clone)]
pub struct ConvergenceCriteria<T: Float + Debug + Send + Sync + 'static> {
pub function_tolerance: T,
pub parameter_tolerance: T,
pub gradient_tolerance: T,
pub max_iterations: usize,
pub stagnation_threshold: usize,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum OptimizationPhase {
Initialization,
Exploration,
Exploitation,
Refinement,
Convergence,
Finalization,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum AdaptationType {
LearningRate,
OptimizerSelection,
EnsembleWeights,
ResourceAllocation,
Strategy,
Architecture,
}
#[derive(Debug, Clone)]
pub enum MetaLearningSchedule {
Fixed {
episodes_per_update: usize,
},
Adaptive {
performance_threshold: f64,
min_episodes: usize,
max_episodes: usize,
},
EventDriven {
trigger_events: Vec<String>,
},
}
impl<T: Float + Debug + Send + Sync + 'static> AdvancedConfig<T> {
pub fn validate(&self) -> Result<(), String> {
if self.max_parallel_optimizers == 0 {
return Err("max_parallel_optimizers must be greater than 0".to_string());
}
if self.prediction_horizon == 0 {
return Err("prediction_horizon must be greater than 0".to_string());
}
if self.adaptation_threshold < T::zero() {
return Err("adaptation_threshold must be non-negative".to_string());
}
if self.cache_size_limit == 0 {
return Err("cache_size_limit must be greater than 0".to_string());
}
let weight_sum: T = self.objective_weights.values().fold(T::zero(), |acc, &w| acc + w);
let expected_sum = T::one();
let tolerance = scirs2_core::numeric::NumCast::from(1e-6).unwrap_or_else(|| T::zero());
if (weight_sum - expected_sum).abs() > tolerance {
return Err("objective_weights must sum to 1.0".to_string());
}
for (&objective, &weight) in &self.objective_weights {
if weight < T::zero() {
return Err(format!("Weight for {:?} must be non-negative", objective));
}
}
Ok(())
}
pub fn for_research() -> Self {
let mut config = Self::default();
config.enable_advanced_analytics = true;
config.enable_dynamic_reconfiguration = true;
config.max_parallel_optimizers = 16;
config.prediction_horizon = 200;
config
}
pub fn for_production() -> Self {
let mut config = Self::default();
config.enable_advanced_analytics = false;
config.enable_dynamic_reconfiguration = false;
config.max_parallel_optimizers = 4;
config.prediction_horizon = 50;
config.cache_size_limit = 5000;
config
}
pub fn for_resource_constrained() -> Self {
let mut config = Self::default();
config.enable_nas = false;
config.enable_transformer_enhancement = false;
config.enable_few_shot_learning = false;
config.max_parallel_optimizers = 2;
config.prediction_horizon = 20;
config.cache_size_limit = 1000;
config
}
}
impl Default for ComputationalBudget {
fn default() -> Self {
Self {
max_evaluations: 10000,
max_time: std::time::Duration::from_secs(3600), max_memory: 1024 * 1024 * 1024, available_cores: num_cpus::get(),
}
}
}
impl<T: Float + Debug + Send + Sync + 'static> Default for ConvergenceCriteria<T> {
fn default() -> Self {
Self {
function_tolerance: scirs2_core::numeric::NumCast::from(1e-6).unwrap_or_else(|| T::zero()),
parameter_tolerance: scirs2_core::numeric::NumCast::from(1e-8).unwrap_or_else(|| T::zero()),
gradient_tolerance: scirs2_core::numeric::NumCast::from(1e-6).unwrap_or_else(|| T::zero()),
max_iterations: 1000,
stagnation_threshold: 50,
}
}
}
impl<T: Float + Debug + Send + Sync + 'static> Default for OptimizationContext<T> {
fn default() -> Self {
Self {
problem_type: ProblemType::NonConvex,
dimensionality: 100,
iteration: 0,
computational_budget: ComputationalBudget::default(),
convergence_criteria: ConvergenceCriteria::default(),
historical_performance: Vec::new(),
metadata: HashMap::new(),
}
}
}
impl Default for ScalabilityInfo {
fn default() -> Self {
Self {
max_parameters: 1_000_000,
memory_complexity: ComplexityClass::Linear,
time_complexity: ComplexityClass::Linear,
parallel_scalability: ParallelScalability {
max_threads: num_cpus::get(),
efficiency: 0.8,
communication_overhead: 0.1,
},
}
}
}
impl Default for MetaLearningSchedule {
fn default() -> Self {
Self::Adaptive {
performance_threshold: 0.01,
min_episodes: 5,
max_episodes: 50,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_config_validation() {
let config = AdvancedConfig::<f32>::default();
assert!(config.validate().is_ok());
}
#[test]
fn test_invalid_config() {
let mut config = AdvancedConfig::<f32>::default();
config.max_parallel_optimizers = 0;
assert!(config.validate().is_err());
}
#[test]
fn test_preset_configs() {
let research_config = AdvancedConfig::<f32>::for_research();
assert!(research_config.validate().is_ok());
assert_eq!(research_config.max_parallel_optimizers, 16);
let production_config = AdvancedConfig::<f32>::for_production();
assert!(production_config.validate().is_ok());
assert_eq!(production_config.max_parallel_optimizers, 4);
let constrained_config = AdvancedConfig::<f32>::for_resource_constrained();
assert!(constrained_config.validate().is_ok());
assert!(!constrained_config.enable_nas);
}
#[test]
fn test_objective_weights_sum() {
let config = AdvancedConfig::<f64>::default();
let weight_sum: f64 = config.objective_weights.values().sum();
assert!((weight_sum - 1.0).abs() < 1e-10);
}
#[test]
fn test_computational_budget() {
let budget = ComputationalBudget::default();
assert!(budget.max_evaluations > 0);
assert!(budget.max_time.as_secs() > 0);
assert!(budget.available_cores > 0);
}
}