use crate::error::CoreResult;
use crate::quantum_optimization::QuantumOptimizer;
use rand::{Rng, RngExt, SeedableRng};
use std::collections::HashMap;
use std::sync::{Arc, Mutex, RwLock};
use std::time::{Duration, Instant};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum NASStrategy {
Evolutionary,
Differentiable,
Progressive,
ReinforcementLearning,
Random,
QuantumEnhanced,
Hybrid,
}
#[derive(Debug, Clone)]
pub struct SearchSpace {
pub layer_types: Vec<LayerType>,
pub depth_range: (usize, usize),
pub width_range: (usize, usize),
pub activations: Vec<ActivationType>,
pub optimizers: Vec<OptimizerType>,
pub connections: Vec<ConnectionType>,
pub skip_connection_prob: f64,
pub dropout_range: (f64, f64),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum LayerType {
Dense,
Convolution1D,
Convolution2D,
ConvolutionDepthwise,
ConvolutionSeparable,
LSTM,
GRU,
Attention,
SelfAttention,
MultiHeadAttention,
BatchNorm,
LayerNorm,
GroupNorm,
Dropout,
MaxPool1D,
MaxPool2D,
AvgPool1D,
AvgPool2D,
GlobalAvgPool,
MaxPooling,
AveragePooling,
GlobalAveragePooling,
Flatten,
Reshape,
Embedding,
PositionalEncoding,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum ActivationType {
ReLU,
LeakyReLU,
ELU,
Swish,
GELU,
Tanh,
Sigmoid,
Softmax,
Mish,
HardSwish,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum OptimizerType {
Adam,
AdamW,
SGD,
RMSprop,
Adagrad,
AdaDelta,
Lion,
Lamb,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum ConnectionType {
Sequential,
Residual,
DenseNet,
Inception,
MobileNet,
EfficientNet,
Transformer,
Skip,
}
#[derive(Debug, Clone)]
pub struct Architecture {
pub id: String,
pub layers: Vec<LayerConfig>,
pub globalconfig: GlobalConfig,
pub connections: Vec<Connection>,
pub metadata: ArchitectureMetadata,
pub fitness: f64,
pub optimizer: OptimizerType,
pub loss_function: String,
pub metrics: Vec<String>,
}
#[derive(Debug, Clone)]
pub struct LayerConfig {
pub layer_type: LayerType,
pub parameters: LayerParameters,
pub activation: Option<ActivationType>,
pub skippable: bool,
}
#[derive(Debug, Clone)]
pub struct LayerParameters {
pub units: Option<usize>,
pub kernel_size: Option<(usize, usize)>,
pub stride: Option<(usize, usize)>,
pub padding: Option<(usize, usize)>,
pub dropout_rate: Option<f64>,
pub num_heads: Option<usize>,
pub hidden_dim: Option<usize>,
pub custom: HashMap<String, f64>,
}
#[derive(Debug, Clone)]
pub struct GlobalConfig {
pub inputshape: Vec<usize>,
pub output_size: usize,
pub learningrate: f64,
pub batch_size: usize,
pub optimizer: OptimizerType,
pub loss_function: String,
pub epochs: usize,
}
#[derive(Debug, Clone)]
pub struct Connection {
pub from: usize,
pub to: usize,
pub connection_type: ConnectionType,
pub weight: f64,
}
#[derive(Debug, Clone)]
pub struct ArchitectureMetadata {
pub generation: usize,
pub parents: Vec<String>,
pub created_at: Instant,
pub search_strategy: NASStrategy,
pub estimated_flops: u64,
pub estimated_memory: usize,
pub estimated_latency: Duration,
}
#[derive(Debug, Clone)]
pub struct ArchitecturePerformance {
pub accuracy: f64,
pub loss: f64,
pub latency: Duration,
pub memory_usage: usize,
pub energy_consumption: f64,
pub model_size: usize,
pub flops: u64,
pub training_time: Duration,
pub custom_metrics: HashMap<String, f64>,
}
#[derive(Debug, Clone)]
pub struct OptimizationObjectives {
pub accuracy_weight: f64,
pub latency_weight: f64,
pub memory_weight: f64,
pub energy_weight: f64,
pub size_weight: f64,
pub training_time_weight: f64,
pub custom_weights: HashMap<String, f64>,
}
#[derive(Debug, Clone)]
pub struct HardwareConstraints {
pub max_memory: Option<usize>,
pub max_latency: Option<Duration>,
pub max_energy: Option<f64>,
pub max_parameters: Option<usize>,
pub target_platform: HardwarePlatform,
pub compute_units: usize,
pub memorybandwidth: f64,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum HardwarePlatform {
CPU,
GPU,
TPU,
Mobile,
Edge,
Embedded,
FPGA,
ASIC,
}
#[derive(Debug, Clone)]
pub enum ArchitecturePattern {
LayerSequence {
sequence: Vec<String>,
frequency: usize,
performance_correlation: f64,
},
DepthRange {
min_depth: usize,
max_depth: usize,
avg_performance: f64,
confidence: f64,
},
ConnectionType {
connection_type: String,
usage_frequency: usize,
avg_performance: f64,
},
ActivationFunction {
activation: String,
effectiveness: f64,
usage_count: usize,
},
ParameterScaling {
layer_type: String,
optimal_range: (f64, f64),
scaling_factor: f64,
},
RegularizationPattern {
technique: String,
optimal_strength: f64,
applicable_layers: Vec<String>,
},
}
#[derive(Debug, Clone)]
pub struct MetaKnowledgeBase {
pub domain_patterns: HashMap<String, Vec<ArchitecturePattern>>,
pub transfer_mappings: HashMap<String, Vec<TransferMapping>>,
pub performance_predictors: HashMap<String, PerformancePredictor>,
pub best_practices: Vec<BestPractice>,
}
#[derive(Debug, Clone)]
pub struct TransferMapping {
pub source_domain: String,
pub target_domain: String,
pub mapping_quality: f64,
}
#[derive(Debug, Clone)]
pub struct PerformancePredictor {
pub name: String,
pub accuracy: f64,
}
#[derive(Debug, Clone)]
pub struct BestPractice {
pub name: String,
pub description: String,
pub effectiveness: f64,
}
#[derive(Debug, Clone)]
pub struct SearchHistory {
pub evaluations: Vec<ArchitecturePerformance>,
pub best_architectures: Vec<Architecture>,
}
#[derive(Debug, Clone)]
pub struct ProgressiveSearchController {
pub current_complexity: usize,
pub max_complexity: usize,
}
#[derive(Debug, Clone)]
pub struct SearchConfig {
pub strategy: NASStrategy,
pub max_evaluations: usize,
pub population_size: usize,
pub max_generations: usize,
}
#[derive(Debug, Clone)]
pub struct SearchProgress {
pub generation: usize,
pub best_fitness: f64,
pub avg_fitness: f64,
}
#[derive(Debug, Clone)]
pub struct ResourceUsage {
pub cpu_time: Duration,
pub memory_peak: usize,
pub evaluations_count: usize,
}
#[derive(Debug, Clone)]
pub struct SearchStatistics {
pub total_evaluations: usize,
pub successful_evaluations: usize,
pub convergence_generation: Option<usize>,
}
#[derive(Debug, Clone)]
pub struct SearchResults {
pub best_architecture: Option<(Architecture, ArchitecturePerformance)>,
pub all_evaluated: Vec<(Architecture, ArchitecturePerformance)>,
pub progress_history: Vec<SearchProgress>,
pub resource_usage: ResourceUsage,
pub statistics: SearchStatistics,
pub meta_knowledge: MetaKnowledgeBase,
pub searchconfig: SearchConfig,
}
#[allow(dead_code)]
pub struct NeuralArchitectureSearch {
search_space: SearchSpace,
strategy: NASStrategy,
objectives: OptimizationObjectives,
constraints: HardwareConstraints,
population: Arc<RwLock<Vec<Architecture>>>,
performance_cache: Arc<RwLock<HashMap<String, ArchitecturePerformance>>>,
meta_knowledge: Arc<RwLock<MetaKnowledgeBase>>,
search_history: Arc<Mutex<SearchHistory>>,
quantum_optimizer: Option<QuantumOptimizer>,
progressive_controller: Arc<Mutex<ProgressiveSearchController>>,
pub config: SearchConfig,
}
impl NeuralArchitectureSearch {
#[allow(clippy::too_many_arguments)]
pub fn new(
search_space: SearchSpace,
strategy: NASStrategy,
objectives: OptimizationObjectives,
constraints: HardwareConstraints,
config: SearchConfig,
) -> CoreResult<Self> {
Ok(Self {
search_space,
strategy,
objectives,
constraints,
population: Arc::new(RwLock::new(Vec::new())),
performance_cache: Arc::new(RwLock::new(HashMap::new())),
meta_knowledge: Arc::new(RwLock::new(MetaKnowledgeBase {
domain_patterns: HashMap::new(),
transfer_mappings: HashMap::new(),
performance_predictors: HashMap::new(),
best_practices: Vec::new(),
})),
search_history: Arc::new(Mutex::new(SearchHistory {
evaluations: Vec::new(),
best_architectures: Vec::new(),
})),
quantum_optimizer: None,
progressive_controller: Arc::new(Mutex::new(ProgressiveSearchController {
current_complexity: 1,
max_complexity: 10,
})),
config,
})
}
pub fn search(&mut self) -> CoreResult<SearchResults> {
match self.strategy {
NASStrategy::Evolutionary => self.evolutionary_search(),
NASStrategy::Differentiable => self.differentiable_search(),
NASStrategy::Progressive => self.progressive_search(),
NASStrategy::ReinforcementLearning => self.reinforcement_learning_search(),
NASStrategy::Random => self.random_search(),
NASStrategy::QuantumEnhanced => self.quantum_enhanced_search(),
NASStrategy::Hybrid => self.hybrid_search(),
}
}
pub fn generate_random_architecture(&self) -> CoreResult<Architecture> {
use std::collections::hash_map::DefaultHasher;
use std::hash::{Hash, Hasher};
let mut hasher = DefaultHasher::new();
std::time::SystemTime::now().hash(&mut hasher);
let mut rng = rand::rng();
let num_layers = self.search_space.depth_range.0
+ (rng.random::<f64>()
* (self.search_space.depth_range.1 - self.search_space.depth_range.0) as f64)
as usize;
let mut layers = Vec::new();
let mut connections = Vec::new();
for i in 0..num_layers {
let layer_type_idx =
(rng.random::<f64>() * self.search_space.layer_types.len() as f64) as usize;
let layer_type = self.search_space.layer_types[layer_type_idx];
let activation_idx =
(rng.random::<f64>() * self.search_space.activations.len() as f64) as usize;
let activation = Some(self.search_space.activations[activation_idx]);
let units = self.search_space.width_range.0
+ (rng.random::<f64>()
* (self.search_space.width_range.1 - self.search_space.width_range.0) as f64)
as usize;
layers.push(LayerConfig {
layer_type,
parameters: LayerParameters {
units: Some(units),
kernel_size: None,
stride: None,
padding: None,
dropout_rate: Some(0.2),
num_heads: None,
hidden_dim: None,
custom: HashMap::new(),
},
activation,
skippable: false,
});
if i > 0 {
connections.push(Connection {
from: i.saturating_sub(1),
to: i,
connection_type: ConnectionType::Sequential,
weight: 1.0,
});
}
}
let optimizer_idx =
(rng.random::<f64>() * self.search_space.optimizers.len() as f64) as usize;
Ok(Architecture {
id: format!("{}", hasher.finish()),
layers,
globalconfig: GlobalConfig {
inputshape: vec![224, 224, 3], output_size: 1000, learningrate: 0.001,
batch_size: 32,
optimizer: self.search_space.optimizers[optimizer_idx],
loss_function: "categorical_crossentropy".to_string(),
epochs: 100,
},
connections,
metadata: ArchitectureMetadata {
generation: 0,
parents: Vec::new(),
created_at: Instant::now(),
search_strategy: self.strategy,
estimated_flops: 1_000_000, estimated_memory: 1024 * 1024, estimated_latency: Duration::from_millis(10),
},
fitness: 0.0,
optimizer: self.search_space.optimizers[optimizer_idx],
loss_function: "categorical_crossentropy".to_string(),
metrics: vec!["accuracy".to_string()],
})
}
fn evolutionary_search(&mut self) -> CoreResult<SearchResults> {
let mut population = Vec::new();
for _ in 0..self.config.population_size {
population.push(self.generate_random_architecture()?);
}
let mut best_architecture: Option<(Architecture, ArchitecturePerformance)> = None;
let mut progress_history = Vec::new();
for generation in 0..self.config.max_generations {
let mut evaluated = Vec::new();
for arch in &population {
let performance = self.evaluate_architecture(arch)?;
evaluated.push((arch.clone(), performance));
}
evaluated.sort_by(|a, b| {
b.1.accuracy
.partial_cmp(&a.1.accuracy)
.expect("Operation failed")
});
if let Some((arch, perf)) = evaluated.first() {
if best_architecture.is_none()
|| perf.accuracy
> best_architecture
.as_ref()
.expect("Operation failed")
.1
.accuracy
{
best_architecture = Some((arch.clone(), perf.clone()));
}
}
let avg_fitness =
evaluated.iter().map(|(_, p)| p.accuracy).sum::<f64>() / evaluated.len() as f64;
progress_history.push(SearchProgress {
generation,
best_fitness: best_architecture
.as_ref()
.expect("Operation failed")
.1
.accuracy,
avg_fitness,
});
let elite_size = self.config.population_size / 4;
let mut next_population = Vec::new();
for arch_ in evaluated.iter().take(elite_size) {
next_population.push(arch_.0.clone());
}
let mut rng = rand::rng();
while next_population.len() < self.config.population_size {
let parent1_idx = (rng.random::<f64>() * elite_size as f64) as usize;
let parent2_idx = (rng.random::<f64>() * elite_size as f64) as usize;
let (child1, child2) =
self.crossover(&evaluated[parent1_idx].0, &evaluated[parent2_idx].0)?;
let mutated_child1 = self.mutate(&child1)?;
let mutated_child2 = self.mutate(&child2)?;
next_population.push(mutated_child1);
if next_population.len() < self.config.population_size {
next_population.push(mutated_child2);
}
}
population = next_population;
}
Ok(SearchResults {
best_architecture,
all_evaluated: Vec::new(),
progress_history,
resource_usage: ResourceUsage {
cpu_time: Duration::from_secs(0),
memory_peak: 0,
evaluations_count: 0,
},
statistics: SearchStatistics {
total_evaluations: 0,
successful_evaluations: 0,
convergence_generation: None,
},
meta_knowledge: MetaKnowledgeBase {
domain_patterns: HashMap::new(),
transfer_mappings: HashMap::new(),
performance_predictors: HashMap::new(),
best_practices: Vec::new(),
},
searchconfig: self.config.clone(),
})
}
fn crossover(
&self,
parent1: &Architecture,
parent2: &Architecture,
) -> CoreResult<(Architecture, Architecture)> {
let mut rng = rand::rng();
let crossover_point = (rng.random::<f64>() * parent1.layers.len() as f64) as usize;
let mut child1_layers = parent1.layers[..crossover_point].to_vec();
child1_layers.extend_from_slice(&parent2.layers[crossover_point..]);
let mut child2_layers = parent2.layers[..crossover_point].to_vec();
child2_layers.extend_from_slice(&parent1.layers[crossover_point..]);
let child1 = Architecture {
id: format!(
"child1_{}",
std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.expect("Operation failed")
.as_nanos()
),
layers: child1_layers,
globalconfig: parent1.globalconfig.clone(),
connections: parent1.connections.clone(), metadata: ArchitectureMetadata {
generation: parent1.metadata.generation + 1,
parents: vec![parent1.id.clone(), parent2.id.clone()],
created_at: Instant::now(),
search_strategy: self.strategy,
estimated_flops: (parent1.metadata.estimated_flops
+ parent2.metadata.estimated_flops)
/ 2,
estimated_memory: (parent1.metadata.estimated_memory
+ parent2.metadata.estimated_memory)
/ 2,
estimated_latency: (parent1.metadata.estimated_latency
+ parent2.metadata.estimated_latency)
/ 2,
},
fitness: 0.0,
optimizer: parent1.optimizer,
loss_function: parent1.loss_function.clone(),
metrics: parent1.metrics.clone(),
};
let child2 = Architecture {
id: format!(
"child2_{}",
std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.expect("Operation failed")
.as_nanos()
),
layers: child2_layers,
globalconfig: parent2.globalconfig.clone(),
connections: parent2.connections.clone(), metadata: ArchitectureMetadata {
generation: parent2.metadata.generation + 1,
parents: vec![parent1.id.clone(), parent2.id.clone()],
created_at: Instant::now(),
search_strategy: self.strategy,
estimated_flops: (parent1.metadata.estimated_flops
+ parent2.metadata.estimated_flops)
/ 2,
estimated_memory: (parent1.metadata.estimated_memory
+ parent2.metadata.estimated_memory)
/ 2,
estimated_latency: (parent1.metadata.estimated_latency
+ parent2.metadata.estimated_latency)
/ 2,
},
fitness: 0.0,
optimizer: parent2.optimizer,
loss_function: parent2.loss_function.clone(),
metrics: parent2.metrics.clone(),
};
Ok((child1, child2))
}
fn mutate(&self, architecture: &Architecture) -> CoreResult<Architecture> {
let mut mutated = architecture.clone();
let mut rng = rand::rng();
if rng.random::<f64>() < 0.1 {
if !mutated.layers.is_empty() {
let layer_idx = (rng.random::<f64>() * mutated.layers.len() as f64) as usize;
let new_type_idx =
(rng.random::<f64>() * self.search_space.layer_types.len() as f64) as usize;
mutated.layers[layer_idx].layer_type = self.search_space.layer_types[new_type_idx];
}
}
if rng.random::<f64>() < 0.1 {
if !mutated.layers.is_empty() {
let layer_idx = (rng.random::<f64>() * mutated.layers.len() as f64) as usize;
let new_activation_idx =
(rng.random::<f64>() * self.search_space.activations.len() as f64) as usize;
mutated.layers[layer_idx].activation =
Some(self.search_space.activations[new_activation_idx]);
}
}
Ok(mutated)
}
#[allow(dead_code)]
fn evaluate_architecture(
&self,
architecture: &Architecture,
) -> CoreResult<ArchitecturePerformance> {
let mut rng = rand::rng();
let complexity_penalty = architecture.layers.len() as f64 * 0.01;
let accuracy = 0.8 - complexity_penalty + rng.random::<f64>() * 0.1;
Ok(ArchitecturePerformance {
accuracy: accuracy.clamp(0.0, 1.0),
loss: 1.0 - accuracy,
latency: Duration::from_millis(10 + architecture.layers.len() as u64),
memory_usage: architecture.layers.len() * 1024 * 1024,
energy_consumption: architecture.layers.len() as f64 * 0.1,
model_size: architecture.layers.len() * 1000,
flops: architecture.layers.len() as u64 * 1_000_000,
training_time: Duration::from_secs(architecture.layers.len() as u64 * 10),
custom_metrics: HashMap::new(),
})
}
fn differentiable_search(&mut self) -> CoreResult<SearchResults> {
Ok(SearchResults {
best_architecture: None,
all_evaluated: Vec::new(),
progress_history: Vec::new(),
resource_usage: ResourceUsage {
cpu_time: Duration::from_secs(0),
memory_peak: 0,
evaluations_count: 0,
},
statistics: SearchStatistics {
total_evaluations: 0,
successful_evaluations: 0,
convergence_generation: None,
},
meta_knowledge: MetaKnowledgeBase {
domain_patterns: HashMap::new(),
transfer_mappings: HashMap::new(),
performance_predictors: HashMap::new(),
best_practices: Vec::new(),
},
searchconfig: self.config.clone(),
})
}
fn progressive_search(&mut self) -> CoreResult<SearchResults> {
Ok(SearchResults {
best_architecture: None,
all_evaluated: Vec::new(),
progress_history: Vec::new(),
resource_usage: ResourceUsage {
cpu_time: Duration::from_secs(0),
memory_peak: 0,
evaluations_count: 0,
},
statistics: SearchStatistics {
total_evaluations: 0,
successful_evaluations: 0,
convergence_generation: None,
},
meta_knowledge: MetaKnowledgeBase {
domain_patterns: HashMap::new(),
transfer_mappings: HashMap::new(),
performance_predictors: HashMap::new(),
best_practices: Vec::new(),
},
searchconfig: self.config.clone(),
})
}
fn reinforcement_learning_search(&mut self) -> CoreResult<SearchResults> {
Ok(SearchResults {
best_architecture: None,
all_evaluated: Vec::new(),
progress_history: Vec::new(),
resource_usage: ResourceUsage {
cpu_time: Duration::from_secs(0),
memory_peak: 0,
evaluations_count: 0,
},
statistics: SearchStatistics {
total_evaluations: 0,
successful_evaluations: 0,
convergence_generation: None,
},
meta_knowledge: MetaKnowledgeBase {
domain_patterns: HashMap::new(),
transfer_mappings: HashMap::new(),
performance_predictors: HashMap::new(),
best_practices: Vec::new(),
},
searchconfig: self.config.clone(),
})
}
fn random_search(&mut self) -> CoreResult<SearchResults> {
let mut best_architecture: Option<(Architecture, ArchitecturePerformance)> = None;
let mut all_evaluated = Vec::new();
for i in 0..self.config.max_evaluations {
let arch = self.generate_random_architecture()?;
let performance = self.evaluate_architecture(&arch)?;
if best_architecture.is_none()
|| performance.accuracy
> best_architecture
.as_ref()
.expect("Operation failed")
.1
.accuracy
{
best_architecture = Some((arch.clone(), performance.clone()));
}
all_evaluated.push((arch, performance));
if let Some((_, ref perf)) = best_architecture {
if perf.accuracy > 0.95 {
break;
}
}
if i % 100 == 0 {
if let Some((_, ref perf)) = best_architecture {
println!(
"Random search iteration {}: best accuracy = {:.4}",
i, perf.accuracy
);
}
}
}
Ok(SearchResults {
best_architecture,
all_evaluated,
progress_history: Vec::new(),
resource_usage: ResourceUsage {
cpu_time: Duration::from_secs(0),
memory_peak: 0,
evaluations_count: 0,
},
statistics: SearchStatistics {
total_evaluations: 0,
successful_evaluations: 0,
convergence_generation: None,
},
meta_knowledge: MetaKnowledgeBase {
domain_patterns: HashMap::new(),
transfer_mappings: HashMap::new(),
performance_predictors: HashMap::new(),
best_practices: Vec::new(),
},
searchconfig: self.config.clone(),
})
}
fn quantum_enhanced_search(&mut self) -> CoreResult<SearchResults> {
Ok(SearchResults {
best_architecture: None,
all_evaluated: Vec::new(),
progress_history: Vec::new(),
resource_usage: ResourceUsage {
cpu_time: Duration::from_secs(0),
memory_peak: 0,
evaluations_count: 0,
},
statistics: SearchStatistics {
total_evaluations: 0,
successful_evaluations: 0,
convergence_generation: None,
},
meta_knowledge: MetaKnowledgeBase {
domain_patterns: HashMap::new(),
transfer_mappings: HashMap::new(),
performance_predictors: HashMap::new(),
best_practices: Vec::new(),
},
searchconfig: self.config.clone(),
})
}
fn hybrid_search(&mut self) -> CoreResult<SearchResults> {
Ok(SearchResults {
best_architecture: None,
all_evaluated: Vec::new(),
progress_history: Vec::new(),
resource_usage: ResourceUsage {
cpu_time: Duration::from_secs(0),
memory_peak: 0,
evaluations_count: 0,
},
statistics: SearchStatistics {
total_evaluations: 0,
successful_evaluations: 0,
convergence_generation: None,
},
meta_knowledge: MetaKnowledgeBase {
domain_patterns: HashMap::new(),
transfer_mappings: HashMap::new(),
performance_predictors: HashMap::new(),
best_practices: Vec::new(),
},
searchconfig: self.config.clone(),
})
}
}
impl Default for SearchSpace {
fn default() -> Self {
Self {
layer_types: vec![
LayerType::Dense,
LayerType::Convolution2D,
LayerType::LSTM,
LayerType::Attention,
],
depth_range: (3, 20),
width_range: (32, 512),
activations: vec![
ActivationType::ReLU,
ActivationType::Swish,
ActivationType::GELU,
],
optimizers: vec![
OptimizerType::Adam,
OptimizerType::AdamW,
OptimizerType::SGD,
],
connections: vec![
ConnectionType::Sequential,
ConnectionType::Residual,
ConnectionType::Skip,
],
skip_connection_prob: 0.2,
dropout_range: (0.0, 0.5),
}
}
}
impl Default for OptimizationObjectives {
fn default() -> Self {
Self {
accuracy_weight: 1.0,
latency_weight: 0.2,
memory_weight: 0.1,
energy_weight: 0.1,
size_weight: 0.1,
training_time_weight: 0.05,
custom_weights: HashMap::new(),
}
}
}
impl Default for HardwareConstraints {
fn default() -> Self {
Self {
max_memory: Some((8u64 * 1024 * 1024 * 1024) as usize), max_latency: Some(Duration::from_millis(100)),
max_energy: Some(10.0), max_parameters: Some(100_000_000), target_platform: HardwarePlatform::GPU,
compute_units: 16,
memorybandwidth: 1000.0, }
}
}
impl Default for SearchConfig {
fn default() -> Self {
Self {
strategy: NASStrategy::Evolutionary,
max_evaluations: 1000,
population_size: 50,
max_generations: 100,
}
}
}