use std::collections::HashMap;
use super::components::*;
#[derive(Debug, Clone)]
pub struct ConnectionTopology {
pub topology_type: TopologyType,
pub density: f64,
pub pattern: ConnectionPattern,
pub layer_connections: HashMap<usize, Vec<usize>>,
pub skip_configuration: SkipConfiguration,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum TopologyType {
Sequential,
Parallel,
Tree,
Graph,
Mesh,
Star,
Ring,
Custom,
}
#[derive(Debug, Clone)]
pub struct SkipConfiguration {
pub skip_type: SkipConnectionType,
pub skip_intervals: Vec<usize>,
pub adaptive_skips: bool,
pub skip_weights: HashMap<(usize, usize), f64>,
}
#[derive(Debug, Clone)]
pub struct ResidualPattern {
pub pattern_type: ResidualPatternType,
pub block_size: usize,
pub bottleneck_config: Option<BottleneckConfig>,
pub norm_placement: NormPlacement,
pub activation_placement: ActivationPlacement,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum ResidualPatternType {
Basic, Bottleneck, PreActivation, DenseNet, Highway, ResNeXt, Custom,
}
#[derive(Debug, Clone)]
pub struct BottleneckConfig {
pub reduction_ratio: f64,
pub intermediate_dims: Vec<usize>,
pub use_pointwise: bool,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum NormPlacement {
PreActivation,
PostActivation,
Both,
None,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum ActivationPlacement {
PreNorm,
PostNorm,
Both,
None,
}
#[derive(Debug, Clone)]
pub struct AttentionConnectivity {
pub attention_pattern: AttentionPatternType,
pub connectivity_matrix: Option<Vec<Vec<bool>>>,
pub local_window_size: Option<usize>,
pub sparse_config: Option<SparseAttentionPattern>,
pub cross_layer_attention: bool,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum AttentionPatternType {
Full, Local, Sparse, Blocked, Strided, Random, Learned, Hierarchical, }
#[derive(Debug, Clone)]
pub struct SparseAttentionPattern {
pub sparsity_ratio: f64,
pub block_size: Option<usize>,
pub stride: Option<usize>,
pub pattern_regularity: PatternRegularity,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum PatternRegularity {
Regular, Irregular, Adaptive, Learned, }
#[derive(Debug, Clone)]
pub struct MemoryAccessStrategy {
pub access_type: MemoryAccessType,
pub prefetch_strategy: PrefetchStrategy,
pub cache_optimization: CacheOptimization,
pub memory_layout: MemoryLayout,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum MemoryAccessType {
Sequential,
Random,
Strided,
Blocked,
Hierarchical,
ContentAddressable,
Adaptive,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum PrefetchStrategy {
None,
Conservative,
Aggressive,
Adaptive,
Learned,
}
#[derive(Debug, Clone)]
pub struct CacheOptimization {
pub data_layout_optimization: bool,
pub blocking_strategy: BlockingStrategy,
pub cache_line_optimization: bool,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum BlockingStrategy {
None,
Basic,
Hierarchical,
Adaptive,
Custom,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum MemoryLayout {
RowMajor,
ColumnMajor,
Blocked,
Tiled,
Custom,
}
#[derive(Debug, Clone)]
pub struct OptimizationPath {
pub path_type: OptimizationPathType,
pub search_trajectory: SearchTrajectory,
pub exploration_strategy: ExplorationStrategy,
pub convergence_pattern: ConvergencePattern,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum OptimizationPathType {
Greedy,
Evolutionary,
Gradient,
Bayesian,
Reinforcement,
Hybrid,
Progressive,
}
#[derive(Debug, Clone)]
pub struct SearchTrajectory {
pub smoothness: f64,
pub exploration_ratio: f64,
pub restart_strategy: RestartStrategy,
pub path_memory_size: usize,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum RestartStrategy {
None,
Periodic,
Adaptive,
Performance,
Diversity,
}
#[derive(Debug, Clone)]
pub struct ExplorationStrategy {
pub strategy_type: ExplorationStrategyType,
pub exploration_schedule: ExplorationSchedule,
pub novelty_detection: bool,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum ExplorationStrategyType {
Random,
Systematic,
Curiosity,
Diversity,
Uncertainty,
Hybrid,
}
#[derive(Debug, Clone)]
pub struct ExplorationSchedule {
pub initial_rate: f64,
pub final_rate: f64,
pub decay_type: DecayType,
pub decay_steps: usize,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum DecayType {
Linear,
Exponential,
Cosine,
Polynomial,
Step,
Adaptive,
}
#[derive(Debug, Clone)]
pub struct ConvergencePattern {
pub pattern_type: ConvergencePatternType,
pub early_stopping: EarlyStopping,
pub convergence_detection: ConvergenceDetection,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum ConvergencePatternType {
Monotonic,
Oscillatory,
Plateau,
Stochastic,
MultiModal,
Adaptive,
}
#[derive(Debug, Clone)]
pub struct EarlyStopping {
pub patience: usize,
pub min_delta: f64,
pub monitor_metric: String,
pub restore_best: bool,
}
#[derive(Debug, Clone)]
pub struct ConvergenceDetection {
pub method: ConvergenceDetectionMethod,
pub window_size: usize,
pub threshold: f64,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum ConvergenceDetectionMethod {
ThresholdBased,
TrendAnalysis,
Statistical,
Plateau,
Gradient,
Hybrid,
}
impl Default for ConnectionTopology {
fn default() -> Self {
Self {
topology_type: TopologyType::Sequential,
density: 1.0,
pattern: ConnectionPattern::Sequential,
layer_connections: HashMap::new(),
skip_configuration: SkipConfiguration::default(),
}
}
}
impl Default for SkipConfiguration {
fn default() -> Self {
Self {
skip_type: SkipConnectionType::None,
skip_intervals: vec![],
adaptive_skips: false,
skip_weights: HashMap::new(),
}
}
}
impl Default for ResidualPattern {
fn default() -> Self {
Self {
pattern_type: ResidualPatternType::Basic,
block_size: 2,
bottleneck_config: None,
norm_placement: NormPlacement::PostActivation,
activation_placement: ActivationPlacement::PostNorm,
}
}
}
impl Default for AttentionConnectivity {
fn default() -> Self {
Self {
attention_pattern: AttentionPatternType::Full,
connectivity_matrix: None,
local_window_size: None,
sparse_config: None,
cross_layer_attention: false,
}
}
}
impl Default for MemoryAccessStrategy {
fn default() -> Self {
Self {
access_type: MemoryAccessType::Sequential,
prefetch_strategy: PrefetchStrategy::Conservative,
cache_optimization: CacheOptimization {
data_layout_optimization: true,
blocking_strategy: BlockingStrategy::Basic,
cache_line_optimization: true,
},
memory_layout: MemoryLayout::RowMajor,
}
}
}
impl Default for OptimizationPath {
fn default() -> Self {
Self {
path_type: OptimizationPathType::Greedy,
search_trajectory: SearchTrajectory {
smoothness: 0.5,
exploration_ratio: 0.1,
restart_strategy: RestartStrategy::None,
path_memory_size: 100,
},
exploration_strategy: ExplorationStrategy {
strategy_type: ExplorationStrategyType::Random,
exploration_schedule: ExplorationSchedule {
initial_rate: 1.0,
final_rate: 0.01,
decay_type: DecayType::Exponential,
decay_steps: 1000,
},
novelty_detection: false,
},
convergence_pattern: ConvergencePattern {
pattern_type: ConvergencePatternType::Monotonic,
early_stopping: EarlyStopping {
patience: 10,
min_delta: 0.001,
monitor_metric: "loss".to_string(),
restore_best: true,
},
convergence_detection: ConvergenceDetection {
method: ConvergenceDetectionMethod::ThresholdBased,
window_size: 10,
threshold: 0.001,
},
},
}
}
}
impl ConnectionTopology {
pub fn sequential(num_layers: usize) -> Self {
let mut layer_connections = HashMap::new();
for i in 0..num_layers - 1 {
layer_connections.insert(i, vec![i + 1]);
}
Self {
topology_type: TopologyType::Sequential,
density: 1.0 / (num_layers as f64 - 1.0),
pattern: ConnectionPattern::Sequential,
layer_connections,
skip_configuration: SkipConfiguration::default(),
}
}
pub fn residual(num_layers: usize, skip_interval: usize) -> Self {
let mut topology = Self::sequential(num_layers);
topology.topology_type = TopologyType::Custom;
topology.pattern = ConnectionPattern::Residual;
for i in 0..num_layers {
if i + skip_interval < num_layers {
topology
.layer_connections
.entry(i)
.or_insert_with(Vec::new)
.push(i + skip_interval);
}
}
topology.skip_configuration = SkipConfiguration {
skip_type: SkipConnectionType::Residual,
skip_intervals: vec![skip_interval],
adaptive_skips: false,
skip_weights: HashMap::new(),
};
topology
}
pub fn calculate_density(&self) -> f64 {
let total_connections: usize = self.layer_connections.values().map(|v| v.len()).sum();
let max_connections = self.layer_connections.len() * self.layer_connections.len();
if max_connections == 0 {
0.0
} else {
total_connections as f64 / max_connections as f64
}
}
pub fn is_valid(&self) -> bool {
for (from, connections) in &self.layer_connections {
for &to in connections {
if to <= *from {
continue; }
}
}
true
}
}
impl ResidualPattern {
pub fn basic(block_size: usize) -> Self {
Self {
pattern_type: ResidualPatternType::Basic,
block_size,
bottleneck_config: None,
norm_placement: NormPlacement::PostActivation,
activation_placement: ActivationPlacement::PostNorm,
}
}
pub fn bottleneck(block_size: usize, reduction_ratio: f64) -> Self {
Self {
pattern_type: ResidualPatternType::Bottleneck,
block_size,
bottleneck_config: Some(BottleneckConfig {
reduction_ratio,
intermediate_dims: vec![],
use_pointwise: true,
}),
norm_placement: NormPlacement::PostActivation,
activation_placement: ActivationPlacement::PostNorm,
}
}
pub fn computational_overhead(&self) -> f64 {
match self.pattern_type {
ResidualPatternType::Basic => 1.1,
ResidualPatternType::Bottleneck => 0.8,
ResidualPatternType::PreActivation => 1.05,
ResidualPatternType::DenseNet => 1.5,
ResidualPatternType::Highway => 1.3,
ResidualPatternType::ResNeXt => 1.2,
ResidualPatternType::Custom => 1.0,
}
}
}
impl AttentionConnectivity {
pub fn full_attention(num_heads: usize) -> Self {
Self {
attention_pattern: AttentionPatternType::Full,
connectivity_matrix: None,
local_window_size: None,
sparse_config: None,
cross_layer_attention: false,
}
}
pub fn local_attention(window_size: usize) -> Self {
Self {
attention_pattern: AttentionPatternType::Local,
connectivity_matrix: None,
local_window_size: Some(window_size),
sparse_config: None,
cross_layer_attention: false,
}
}
pub fn sparse_attention(sparsity_ratio: f64) -> Self {
Self {
attention_pattern: AttentionPatternType::Sparse,
connectivity_matrix: None,
local_window_size: None,
sparse_config: Some(SparseAttentionPattern {
sparsity_ratio,
block_size: None,
stride: None,
pattern_regularity: PatternRegularity::Regular,
}),
cross_layer_attention: false,
}
}
pub fn attention_complexity(&self, sequence_length: usize) -> f64 {
match self.attention_pattern {
AttentionPatternType::Full => (sequence_length * sequence_length) as f64,
AttentionPatternType::Local => {
let window = self.local_window_size.unwrap_or(8);
(sequence_length * window) as f64
}
AttentionPatternType::Sparse => {
let sparsity = self
.sparse_config
.as_ref()
.map(|c| c.sparsity_ratio)
.unwrap_or(0.1);
(sequence_length * sequence_length) as f64 * sparsity
}
_ => (sequence_length * sequence_length) as f64 * 0.5,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_sequential_topology() {
let topology = ConnectionTopology::sequential(5);
assert_eq!(topology.topology_type, TopologyType::Sequential);
assert_eq!(topology.layer_connections.len(), 4);
}
#[test]
fn test_residual_topology() {
let topology = ConnectionTopology::residual(6, 2);
assert_eq!(topology.pattern, ConnectionPattern::Residual);
assert_eq!(topology.skip_configuration.skip_intervals, vec![2]);
}
#[test]
fn test_density_calculation() {
let topology = ConnectionTopology::sequential(4);
let density = topology.calculate_density();
assert!(density > 0.0 && density <= 1.0);
}
#[test]
fn test_residual_pattern_overhead() {
let basic = ResidualPattern::basic(2);
let bottleneck = ResidualPattern::bottleneck(2, 0.25);
assert!(basic.computational_overhead() > 1.0);
assert!(bottleneck.computational_overhead() < basic.computational_overhead());
}
#[test]
fn test_attention_complexity() {
let full = AttentionConnectivity::full_attention(8);
let local = AttentionConnectivity::local_attention(16);
let sparse = AttentionConnectivity::sparse_attention(0.1);
let seq_len = 128;
assert!(full.attention_complexity(seq_len) > local.attention_complexity(seq_len));
assert!(sparse.attention_complexity(seq_len) < full.attention_complexity(seq_len));
}
#[test]
fn test_topology_validity() {
let topology = ConnectionTopology::sequential(3);
assert!(topology.is_valid());
}
}