use crate::EvaluationMetric;
use scirs2_core::numeric::Float;
use std::collections::HashMap;
use std::fmt::Debug;
use std::time::Duration;
#[derive(Debug, Clone)]
pub struct NASConfig<T: Float + Debug + Send + Sync + 'static> {
pub search_strategy: SearchStrategyType,
pub search_space: SearchSpaceConfig,
pub evaluation_config: EvaluationConfig<T>,
pub multi_objective_config: MultiObjectiveConfig<T>,
pub search_budget: usize,
pub early_stopping: EarlyStoppingConfig<T>,
pub progressive_search: bool,
pub population_size: usize,
pub enable_transfer_learning: bool,
pub encoding_strategy: ArchitectureEncodingStrategy,
pub enable_performance_prediction: bool,
pub parallelization_factor: usize,
pub auto_hyperparameter_tuning: bool,
pub resource_constraints: ResourceConstraints<T>,
}
#[derive(Debug, Clone)]
pub enum SearchStrategyType {
Random,
Evolutionary,
ReinforcementLearning,
Differentiable,
BayesianOptimization,
Progressive,
MultiObjectiveEvolutionary,
NeuralPredictorBased,
}
#[derive(Debug, Clone)]
pub struct SearchSpaceConfig {
pub components: Vec<OptimizerComponentConfig>,
pub connection_patterns: Vec<ConnectionPatternType>,
pub learning_rate_schedules: LearningRateScheduleSpace,
pub regularization_techniques: RegularizationSpace,
pub adaptive_mechanisms: AdaptiveMechanismSpace,
pub memory_constraints: MemoryConstraints,
pub computation_constraints: ComputationConstraints,
pub component_types: Vec<ComponentType>,
pub max_components: usize,
pub min_components: usize,
pub max_connections: usize,
}
#[derive(Debug, Clone)]
pub struct OptimizerComponentConfig {
pub component_type: ComponentType,
pub hyperparameter_ranges: HashMap<String, ParameterRange>,
pub complexity_score: f64,
pub memory_requirement: usize,
pub computational_cost: f64,
pub compatibility_constraints: Vec<CompatibilityConstraint>,
}
#[derive(Debug, Clone, Default)]
pub struct ArchitectureConstraints {
pub min_parameters: Option<usize>,
pub max_parameters: Option<usize>,
pub input_dimensions: Vec<usize>,
pub output_dimensions: Vec<usize>,
pub compatibility_rules: Vec<String>,
}
#[derive(Debug, Clone)]
pub struct ComponentTypeConfig {
pub name: String,
pub parameters: Vec<String>,
pub defaults: HashMap<String, String>,
pub enabled: bool,
pub probability: f64,
pub hyperparameter_ranges: HashMap<String, ParameterRange>,
pub dependencies: Vec<String>,
pub component_type: ComponentType,
pub constraints: ArchitectureConstraints,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum ComponentType {
GradientComputation,
Momentum,
AdaptiveLearningRate,
Regularization,
Normalization,
SecondOrder,
Preconditioning,
LearningRateScheduling,
GradientClipping,
MemoryManagement,
ConvergenceAcceleration,
SGD,
Adam,
AdamW,
RMSprop,
AdaGrad,
AdaDelta,
Nesterov,
LRScheduler,
BatchNorm,
Dropout,
LAMB,
LARS,
Lion,
RAdam,
Lookahead,
SAM,
LBFGS,
SparseAdam,
GroupedAdam,
MAML,
Reptile,
MetaSGD,
ConstantLR,
ExponentialLR,
StepLR,
CosineAnnealingLR,
OneCycleLR,
CyclicLR,
L1Regularizer,
L2Regularizer,
ElasticNetRegularizer,
DropoutRegularizer,
WeightDecay,
AdaptiveLR,
AdaptiveMomentum,
AdaptiveRegularization,
LSTMOptimizer,
TransformerOptimizer,
AttentionOptimizer,
Custom(String),
}
#[derive(Debug, Clone)]
pub enum ParameterRange {
Continuous(f64, f64),
Discrete(Vec<f64>),
Integer(i32, i32),
Boolean,
Categorical(Vec<String>),
LogUniform(f64, f64),
}
#[derive(Debug, Clone)]
pub enum ConnectionPatternType {
Sequential,
Parallel,
SkipConnection,
DenseConnection,
ResidualConnection,
AttentionConnection,
HighwayConnection,
SqueezeExcitationConnection,
Custom(String),
}
#[derive(Debug, Clone)]
pub struct LearningRateScheduleSpace {
pub schedule_types: Vec<ScheduleType>,
pub initial_lr_range: ParameterRange,
pub schedule_parameters: HashMap<ScheduleType, HashMap<String, ParameterRange>>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum ScheduleType {
Constant,
StepDecay,
ExponentialDecay,
CosineAnnealing,
CyclicalLR,
OneCycleLR,
ReduceOnPlateau,
WarmupLinear,
WarmupCosine,
Custom(String),
}
#[derive(Debug, Clone)]
pub struct RegularizationSpace {
pub techniques: Vec<RegularizationTechnique>,
pub strength_ranges: HashMap<RegularizationTechnique, ParameterRange>,
pub combination_strategies: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum RegularizationTechnique {
L1,
L2,
Dropout,
DropConnect,
BatchNormalization,
LayerNormalization,
GroupNormalization,
SpectralNormalization,
WeightDecay,
EarlyStopping,
Custom(String),
}
#[derive(Debug, Clone)]
pub struct AdaptiveMechanismSpace {
pub adaptation_strategies: Vec<AdaptationStrategy>,
pub adaptation_parameters: HashMap<AdaptationStrategy, HashMap<String, ParameterRange>>,
pub adaptation_frequencies: Vec<usize>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum AdaptationStrategy {
PerformanceBased,
GradientBased,
LossBased,
TimeBased,
HybridAdaptation,
Custom(String),
}
#[derive(Debug, Clone)]
pub struct MemoryConstraints {
pub max_memory_bytes: usize,
pub component_memory_limits: HashMap<ComponentType, usize>,
pub enable_memory_optimization: bool,
pub allocation_strategy: MemoryAllocationStrategy,
}
#[derive(Debug, Clone)]
pub enum MemoryAllocationStrategy {
Static,
Dynamic,
Adaptive,
Lazy,
}
#[derive(Debug, Clone)]
pub struct ComputationConstraints {
pub max_computational_cost: f64,
pub component_cost_limits: HashMap<ComponentType, f64>,
pub enable_computation_optimization: bool,
pub parallelization_constraints: ParallelizationConstraints,
}
#[derive(Debug, Clone)]
pub struct ParallelizationConstraints {
pub max_workers: usize,
pub min_batch_size: usize,
pub enable_simd: bool,
pub enable_gpu: bool,
}
#[derive(Debug, Clone)]
pub struct CompatibilityConstraint {
pub constraint_type: CompatibilityType,
pub target_components: Vec<ComponentType>,
pub condition: ConstraintCondition,
}
#[derive(Debug, Clone)]
pub enum CompatibilityType {
Requires,
Excludes,
Conditional,
VersionRequirement,
ParameterConstraint,
Custom(String),
}
#[derive(Debug, Clone)]
pub enum ConstraintCondition {
Always,
Never,
ParameterCondition(ParameterCondition),
ArchitectureCondition(String),
Custom(String),
}
#[derive(Debug, Clone)]
pub enum ParameterCondition {
Equals(String, f64),
GreaterThan(String, f64),
LessThan(String, f64),
InRange(String, f64, f64),
InSet(String, Vec<f64>),
BooleanExpression(String),
}
#[derive(Debug, Clone)]
pub struct EvaluationConfig<T: Float + Debug + Send + Sync + 'static> {
pub metrics: Vec<EvaluationMetric>,
pub benchmark_datasets: Vec<BenchmarkDataset>,
pub evaluation_budget: EvaluationBudget,
pub statistical_testing: StatisticalTestingConfig,
pub cross_validation_folds: usize,
pub enable_early_stopping: bool,
pub parallelization_factor: usize,
pub problem_domains: Vec<ProblemDomain>,
pub resource_limits: HashMap<ResourceType, T>,
}
#[derive(Debug, Clone)]
pub enum ProblemDomain {
Classification,
Regression,
Reinforcement,
GenerativeModeling,
SequenceModeling,
ComputerVision,
NaturalLanguageProcessing,
TimeSeriesForecasting,
Custom(String),
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum ResourceType {
Memory,
CPUTime,
GPUTime,
NetworkBandwidth,
StorageSpace,
}
#[derive(Debug, Clone)]
pub struct BenchmarkDataset {
pub name: String,
pub path: String,
pub characteristics: DatasetCharacteristics,
pub problem_type: ProblemType,
pub weight: f64,
pub enable_augmentation: bool,
}
#[derive(Debug, Clone)]
pub struct DatasetCharacteristics {
pub num_samples: usize,
pub num_features: usize,
pub num_classes: Option<usize>,
pub size_category: DatasetSizeCategory,
pub correlation_structure: CorrelationStructure,
pub noise_level: f64,
pub imbalance_ratio: Option<f64>,
}
#[derive(Debug, Clone)]
pub enum ProblemType {
BinaryClassification,
MultiClassClassification,
Regression,
MultiTaskLearning,
MetaLearning,
TransferLearning,
FewShotLearning,
Custom(String),
}
#[derive(Debug, Clone)]
pub enum DatasetSizeCategory {
Small, Medium, Large, VeryLarge, }
#[derive(Debug, Clone)]
pub enum CorrelationStructure {
Independent,
LowCorrelation,
ModerateCorrelation,
HighCorrelation,
BlockStructure,
Hierarchical,
}
#[derive(Debug, Clone)]
pub struct EvaluationBudget {
pub max_time_per_architecture: Duration,
pub max_epochs: usize,
pub max_function_evaluations: usize,
pub early_stopping_patience: usize,
pub resource_allocation: ResourceAllocation,
}
#[derive(Debug, Clone)]
pub struct ResourceAllocation {
pub cpu_cores: usize,
pub memory_gb: f64,
pub gpu_devices: usize,
pub storage_gb: f64,
}
#[derive(Debug, Clone)]
pub struct StatisticalTestingConfig {
pub significance_level: f64,
pub test_type: StatisticalTestType,
pub multiple_comparison_correction: MultipleComparisonCorrection,
pub min_effect_size: f64,
pub bootstrap_samples: usize,
}
#[derive(Debug, Clone)]
pub enum StatisticalTestType {
TTest,
WilcoxonRankSum,
KruskalWallis,
FriedmanTest,
Bootstrap,
}
#[derive(Debug, Clone)]
pub enum MultipleComparisonCorrection {
None,
Bonferroni,
BenjaminiHochberg,
BenjaminiYekutieli,
Holm,
}
#[derive(Debug, Clone)]
pub struct MultiObjectiveConfig<T: Float + Debug + Send + Sync + 'static> {
pub objectives: Vec<ObjectiveConfig<T>>,
pub algorithm: MultiObjectiveAlgorithm,
pub user_preferences: Option<UserPreferences<T>>,
pub diversity_strategy: DiversityStrategy,
pub constraint_handling: ConstraintHandlingMethod,
}
#[derive(Debug, Clone)]
pub struct ObjectiveConfig<T: Float + Debug + Send + Sync + 'static> {
pub name: String,
pub objective_type: ObjectiveType,
pub direction: OptimizationDirection,
pub weight: T,
pub priority: ObjectivePriority,
pub normalization_bounds: Option<(T, T)>,
}
#[derive(Debug, Clone)]
pub enum ObjectiveType {
Accuracy,
Loss,
TrainingTime,
InferenceTime,
MemoryUsage,
EnergyConsumption,
ModelSize,
Robustness,
Fairness,
Performance,
Efficiency,
Interpretability,
Privacy,
Sustainability,
Cost,
Custom(String),
}
#[derive(Debug, Clone)]
pub enum OptimizationDirection {
Minimize,
Maximize,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub enum ObjectivePriority {
Low,
Medium,
High,
Critical,
}
#[derive(Debug, Clone)]
pub enum MultiObjectiveAlgorithm {
NSGA2,
NSGA3,
MOEAD,
SPEA2,
PAES,
WeightedSum,
EpsilonConstraint,
GoalProgramming,
Custom(String),
}
#[derive(Debug, Clone)]
pub struct UserPreferences<T: Float + Debug + Send + Sync + 'static> {
pub preference_type: PreferenceType<T>,
pub reference_point: Option<Vec<T>>,
pub aspiration_levels: Option<Vec<T>>,
pub reservation_levels: Option<Vec<T>>,
}
#[derive(Debug, Clone)]
pub enum PreferenceType<T: Float + Debug + Send + Sync + 'static> {
WeightVector(Vec<T>),
ReferencePoint(Vec<T>),
GoalVector(Vec<T>),
RankingOrder(Vec<usize>),
PairwiseComparison(Vec<(usize, usize)>),
}
#[derive(Debug, Clone)]
pub enum DiversityStrategy {
Crowding,
Sharing,
Clearing,
Clustering,
Novelty,
Custom(String),
}
#[derive(Debug, Clone)]
pub enum ConstraintHandlingMethod {
PenaltyFunction,
DeathPenalty,
Repair,
Decoder,
PreserveFeasibility,
Custom(String),
}
#[derive(Debug, Clone)]
pub struct EarlyStoppingConfig<T: Float + Debug + Send + Sync + 'static> {
pub enabled: bool,
pub patience: usize,
pub min_improvement: T,
pub convergence_strategy: ConvergenceDetectionStrategy,
pub min_generations: usize,
pub metric: EvaluationMetric,
pub target_performance: Option<T>,
pub convergence_detection: ConvergenceDetectionStrategy,
}
#[derive(Debug, Clone)]
pub enum ConvergenceDetectionStrategy {
BestScore,
AverageScore,
PopulationDiversity,
ParetoFrontStability,
NoImprovement,
Custom(String),
}
#[derive(Debug, Clone)]
pub enum ArchitectureEncodingStrategy {
Direct,
Graph,
String,
Binary,
RealValued,
Hierarchical,
Neural,
Hybrid,
Custom(String),
}
#[derive(Debug, Clone)]
pub struct ResourceConstraints<T: Float + Debug + Send + Sync + 'static> {
pub hardware_resources: HardwareResources,
pub time_constraints: TimeConstraints,
pub energy_constraints: Option<T>,
pub cost_constraints: Option<T>,
pub violation_handling: ResourceViolationHandling,
pub max_memory_gb: T,
pub max_computation_hours: T,
pub max_energy_kwh: T,
pub max_cost_usd: T,
pub enable_monitoring: bool,
}
#[derive(Debug, Clone)]
pub struct HardwareResources {
pub max_memory_gb: f64,
pub max_cpu_cores: usize,
pub max_gpu_devices: usize,
pub max_storage_gb: f64,
pub max_network_bandwidth: f64,
pub enable_cloud_scaling: bool,
pub cloud_budget: Option<f64>,
pub cpu_cores: usize,
pub ram_gb: u32,
pub num_gpus: usize,
pub gpu_memory_gb: u32,
pub storage_gb: u32,
pub network_bandwidth_mbps: f32,
}
#[derive(Debug, Clone)]
pub struct TimeConstraints {
pub max_search_time: Duration,
pub max_evaluation_time: Duration,
pub search_deadline: Option<std::time::Instant>,
pub budget_allocation: TimeBudgetAllocation,
}
#[derive(Debug, Clone)]
pub enum TimeBudgetAllocation {
Uniform,
AdaptiveByComplexity,
AdaptiveByPerformance,
PriorityBased,
Custom(String),
}
#[derive(Debug, Clone)]
pub enum ResourceViolationHandling {
Abort,
Skip,
ScaleDown,
Approximate,
Dynamic,
Penalty,
Custom(String),
}
impl<T: Float + Debug + Send + Sync + 'static> Default for NASConfig<T> {
fn default() -> Self {
Self {
search_strategy: SearchStrategyType::Evolutionary,
search_space: SearchSpaceConfig::default(),
evaluation_config: EvaluationConfig::default(),
multi_objective_config: MultiObjectiveConfig::default(),
search_budget: 100,
early_stopping: EarlyStoppingConfig::default(),
progressive_search: false,
population_size: 20,
enable_transfer_learning: false,
encoding_strategy: ArchitectureEncodingStrategy::Graph,
enable_performance_prediction: false,
parallelization_factor: 1,
auto_hyperparameter_tuning: false,
resource_constraints: ResourceConstraints::default(),
}
}
}
impl Default for SearchSpaceConfig {
fn default() -> Self {
Self {
components: Vec::new(),
connection_patterns: vec![
ConnectionPatternType::Sequential,
ConnectionPatternType::Parallel,
ConnectionPatternType::SkipConnection,
],
learning_rate_schedules: LearningRateScheduleSpace::default(),
regularization_techniques: RegularizationSpace::default(),
adaptive_mechanisms: AdaptiveMechanismSpace::default(),
memory_constraints: MemoryConstraints::default(),
computation_constraints: ComputationConstraints::default(),
component_types: vec![ComponentType::SGD, ComponentType::Adam],
max_components: 10,
min_components: 1,
max_connections: 20,
}
}
}
impl Default for LearningRateScheduleSpace {
fn default() -> Self {
Self {
schedule_types: vec![
ScheduleType::Constant,
ScheduleType::StepDecay,
ScheduleType::ExponentialDecay,
ScheduleType::CosineAnnealing,
],
initial_lr_range: ParameterRange::LogUniform(1e-5, 1e-1),
schedule_parameters: HashMap::new(),
}
}
}
impl Default for RegularizationSpace {
fn default() -> Self {
Self {
techniques: vec![
RegularizationTechnique::L1,
RegularizationTechnique::L2,
RegularizationTechnique::Dropout,
RegularizationTechnique::WeightDecay,
],
strength_ranges: HashMap::new(),
combination_strategies: Vec::new(),
}
}
}
impl Default for AdaptiveMechanismSpace {
fn default() -> Self {
Self {
adaptation_strategies: vec![
AdaptationStrategy::PerformanceBased,
AdaptationStrategy::GradientBased,
AdaptationStrategy::LossBased,
],
adaptation_parameters: HashMap::new(),
adaptation_frequencies: vec![1, 5, 10, 25, 50, 100],
}
}
}
impl Default for MemoryConstraints {
fn default() -> Self {
Self {
max_memory_bytes: 32 * 1024 * 1024 * 1024, component_memory_limits: HashMap::new(),
enable_memory_optimization: true,
allocation_strategy: MemoryAllocationStrategy::Dynamic,
}
}
}
impl Default for ComputationConstraints {
fn default() -> Self {
Self {
max_computational_cost: 1000.0,
component_cost_limits: HashMap::new(),
enable_computation_optimization: true,
parallelization_constraints: ParallelizationConstraints::default(),
}
}
}
impl Default for ParallelizationConstraints {
fn default() -> Self {
Self {
max_workers: num_cpus::get(),
min_batch_size: 32,
enable_simd: true,
enable_gpu: true,
}
}
}
impl<T: Float + Debug + Send + Sync + 'static> Default for EvaluationConfig<T> {
fn default() -> Self {
Self {
metrics: vec![EvaluationMetric::Accuracy, EvaluationMetric::TrainingTime],
benchmark_datasets: Vec::new(),
evaluation_budget: EvaluationBudget::default(),
statistical_testing: StatisticalTestingConfig::default(),
cross_validation_folds: 5,
enable_early_stopping: true,
parallelization_factor: 1,
problem_domains: vec![ProblemDomain::Classification],
resource_limits: HashMap::new(),
}
}
}
impl Default for EvaluationBudget {
fn default() -> Self {
Self {
max_time_per_architecture: Duration::from_secs(300),
max_epochs: 100,
max_function_evaluations: 1000,
early_stopping_patience: 10,
resource_allocation: ResourceAllocation::default(),
}
}
}
impl Default for ResourceAllocation {
fn default() -> Self {
Self {
cpu_cores: 4,
memory_gb: 8.0,
gpu_devices: 1,
storage_gb: 10.0,
}
}
}
impl Default for StatisticalTestingConfig {
fn default() -> Self {
Self {
significance_level: 0.05,
test_type: StatisticalTestType::TTest,
multiple_comparison_correction: MultipleComparisonCorrection::BenjaminiHochberg,
min_effect_size: 0.1,
bootstrap_samples: 1000,
}
}
}
impl<T: Float + Debug + Send + Sync + 'static> Default for MultiObjectiveConfig<T> {
fn default() -> Self {
Self {
objectives: Vec::new(),
algorithm: MultiObjectiveAlgorithm::NSGA2,
user_preferences: None,
diversity_strategy: DiversityStrategy::Crowding,
constraint_handling: ConstraintHandlingMethod::PenaltyFunction,
}
}
}
impl<T: Float + Debug + Send + Sync + 'static> Default for EarlyStoppingConfig<T> {
fn default() -> Self {
Self {
enabled: true,
patience: 20,
min_improvement: scirs2_core::numeric::NumCast::from(0.001)
.unwrap_or_else(|| T::zero()),
convergence_strategy: ConvergenceDetectionStrategy::BestScore,
min_generations: 10,
metric: EvaluationMetric::Accuracy,
target_performance: None,
convergence_detection: ConvergenceDetectionStrategy::NoImprovement,
}
}
}
impl<T: Float + Debug + Send + Sync + 'static> Default for ResourceConstraints<T> {
fn default() -> Self {
Self {
hardware_resources: HardwareResources::default(),
time_constraints: TimeConstraints::default(),
energy_constraints: None,
cost_constraints: None,
violation_handling: ResourceViolationHandling::Skip,
max_memory_gb: scirs2_core::numeric::NumCast::from(32.0).unwrap_or_else(|| T::zero()),
max_computation_hours: scirs2_core::numeric::NumCast::from(24.0)
.unwrap_or_else(|| T::zero()),
max_energy_kwh: scirs2_core::numeric::NumCast::from(100.0).unwrap_or_else(|| T::zero()),
max_cost_usd: scirs2_core::numeric::NumCast::from(1000.0).unwrap_or_else(|| T::zero()),
enable_monitoring: true,
}
}
}
impl Default for HardwareResources {
fn default() -> Self {
Self {
max_memory_gb: 32.0,
max_cpu_cores: num_cpus::get(),
max_gpu_devices: 4,
max_storage_gb: 100.0,
max_network_bandwidth: 1000.0, enable_cloud_scaling: false,
cloud_budget: None,
cpu_cores: num_cpus::get(),
ram_gb: 32,
num_gpus: 1,
gpu_memory_gb: 8,
storage_gb: 100,
network_bandwidth_mbps: 1000.0,
}
}
}
impl Default for TimeConstraints {
fn default() -> Self {
Self {
max_search_time: Duration::from_secs(3600), max_evaluation_time: Duration::from_secs(300), search_deadline: None,
budget_allocation: TimeBudgetAllocation::Uniform,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_nas_config_default() {
let config = NASConfig::<f32>::default();
assert_eq!(config.search_budget, 100);
assert_eq!(config.population_size, 20);
assert!(!config.progressive_search);
}
#[test]
fn test_search_space_config_default() {
let config = SearchSpaceConfig::default();
assert!(!config.connection_patterns.is_empty());
assert_eq!(config.connection_patterns.len(), 3);
}
#[test]
fn test_parameter_range_variants() {
let continuous = ParameterRange::Continuous(0.0, 1.0);
let discrete = ParameterRange::Discrete(vec![0.1, 0.5, 0.9]);
let integer = ParameterRange::Integer(1, 10);
match continuous {
ParameterRange::Continuous(min, max) => {
assert_eq!(min, 0.0);
assert_eq!(max, 1.0);
}
_ => panic!("Expected continuous range"),
}
match discrete {
ParameterRange::Discrete(values) => {
assert_eq!(values.len(), 3);
}
_ => panic!("Expected discrete range"),
}
match integer {
ParameterRange::Integer(min, max) => {
assert_eq!(min, 1);
assert_eq!(max, 10);
}
_ => panic!("Expected integer range"),
}
}
}