use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NetworkAdaptationConfig {
pub enable_monitoring: bool,
pub monitoring_interval_ms: u64,
pub enable_adaptive_scheduling: bool,
pub enable_bandwidth_optimization: bool,
pub quality_thresholds: NetworkQualityThresholds,
pub communication_strategy: CommunicationStrategy,
pub data_usage_limits: DataUsageLimits,
pub sync_frequency: SyncFrequencyConfig,
pub failure_recovery: FailureRecoveryConfig,
pub prediction_config: NetworkPredictionConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NetworkQualityThresholds {
pub min_bandwidth_full_sync_mbps: f32,
pub min_bandwidth_incremental_sync_mbps: f32,
pub max_latency_realtime_ms: f32,
pub max_packet_loss_percent: f32,
pub min_signal_strength_dbm: i32,
pub max_jitter_ms: f32,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct CommunicationStrategy {
pub wifi_strategy: WiFiStrategy,
pub cellular_strategy: CellularStrategy,
pub poor_network_strategy: PoorNetworkStrategy,
pub compression_config: NetworkCompressionConfig,
pub retry_config: RetryConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WiFiStrategy {
pub enable_high_frequency_updates: bool,
pub max_full_sync_size_mb: usize,
pub preferred_sync_window_hours: Vec<u8>,
pub enable_background_sync: bool,
pub max_concurrent_connections: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CellularStrategy {
pub enable_cellular_sync: bool,
pub g5_config: CellularConfig,
pub g4_config: CellularConfig,
pub data_usage_awareness: DataUsageAwareness,
pub time_based_scheduling: TimeBasedScheduling,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CellularConfig {
pub max_sync_size_mb: usize,
pub sync_frequency_hours: u32,
pub enable_compression: bool,
pub compression_ratio_target: f32,
pub delta_sync_only: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DataUsageAwareness {
pub track_daily_usage: bool,
pub daily_limit_mb: usize,
pub monthly_limit_mb: usize,
pub warning_threshold_percent: u8,
pub adaptive_quality: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TimeBasedScheduling {
pub preferred_hours: Vec<u8>,
pub avoid_peak_hours: bool,
pub peak_hours: Vec<u8>,
pub off_peak_multiplier: f32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PoorNetworkStrategy {
pub enable_degraded_mode: bool,
pub min_update_size_kb: usize,
pub extended_retry_intervals: Vec<u64>,
pub enable_store_and_forward: bool,
pub max_queue_size_mb: usize,
pub fallback_local_only: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NetworkCompressionConfig {
pub enable_gradient_compression: bool,
pub gradient_compression_algo: GradientCompressionAlgorithm,
pub model_compression_ratio: f32,
pub enable_differential_compression: bool,
pub network_quantization: NetworkQuantizationConfig,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
pub enum GradientCompressionAlgorithm {
None,
TopK { k: usize },
RandomSparsification { ratio: f32 },
Quantized { bits: u8 },
Adaptive,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NetworkQuantizationConfig {
pub enabled: bool,
pub bits_per_parameter: u8,
pub dynamic_range_scaling: bool,
pub scheme: QuantizationScheme,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
pub enum QuantizationScheme {
Uniform,
NonUniform,
Logarithmic,
Adaptive,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RetryConfig {
pub max_attempts: usize,
pub base_interval_ms: u64,
pub backoff_multiplier: f32,
pub max_interval_ms: u64,
pub jitter_percent: f32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DataUsageLimits {
pub daily_limit_mb: usize,
pub monthly_limit_mb: usize,
pub session_limit_mb: usize,
pub warning_thresholds: Vec<u8>,
pub emergency_stop_threshold: u8,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SyncFrequencyConfig {
pub base_frequency_minutes: u32,
pub adaptive_frequency: bool,
pub min_frequency_minutes: u32,
pub max_frequency_minutes: u32,
pub frequency_conditions: HashMap<String, f32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FailureRecoveryConfig {
pub enable_auto_recovery: bool,
pub recovery_timeout_ms: u64,
pub max_recovery_attempts: usize,
pub recovery_strategies: Vec<RecoveryStrategy>,
pub fallback_offline: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
pub enum RecoveryStrategy {
Retry,
Reconnect,
Degrade,
Queue,
Offline,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NetworkPredictionConfig {
pub enabled: bool,
pub prediction_window_minutes: u32,
pub history_window_hours: u32,
pub accuracy_threshold: f32,
pub model_update_frequency_hours: u32,
}
impl Default for NetworkAdaptationConfig {
fn default() -> Self {
Self {
enable_monitoring: true,
monitoring_interval_ms: 10000, enable_adaptive_scheduling: true,
enable_bandwidth_optimization: true,
quality_thresholds: NetworkQualityThresholds::default(),
communication_strategy: CommunicationStrategy::default(),
data_usage_limits: DataUsageLimits::default(),
sync_frequency: SyncFrequencyConfig::default(),
failure_recovery: FailureRecoveryConfig::default(),
prediction_config: NetworkPredictionConfig::default(),
}
}
}
impl Default for NetworkQualityThresholds {
fn default() -> Self {
Self {
min_bandwidth_full_sync_mbps: 5.0,
min_bandwidth_incremental_sync_mbps: 1.0,
max_latency_realtime_ms: 100.0,
max_packet_loss_percent: 2.0,
min_signal_strength_dbm: -70,
max_jitter_ms: 50.0,
}
}
}
impl Default for WiFiStrategy {
fn default() -> Self {
Self {
enable_high_frequency_updates: true,
max_full_sync_size_mb: 100,
preferred_sync_window_hours: vec![2, 3, 4, 5], enable_background_sync: true,
max_concurrent_connections: 3,
}
}
}
impl Default for CellularStrategy {
fn default() -> Self {
Self {
enable_cellular_sync: true,
g5_config: CellularConfig {
max_sync_size_mb: 50,
sync_frequency_hours: 6,
enable_compression: true,
compression_ratio_target: 0.7,
delta_sync_only: false,
},
g4_config: CellularConfig {
max_sync_size_mb: 20,
sync_frequency_hours: 12,
enable_compression: true,
compression_ratio_target: 0.5,
delta_sync_only: true,
},
data_usage_awareness: DataUsageAwareness::default(),
time_based_scheduling: TimeBasedScheduling::default(),
}
}
}
impl Default for DataUsageAwareness {
fn default() -> Self {
Self {
track_daily_usage: true,
daily_limit_mb: 100,
monthly_limit_mb: 2000,
warning_threshold_percent: 80,
adaptive_quality: true,
}
}
}
impl Default for TimeBasedScheduling {
fn default() -> Self {
Self {
preferred_hours: vec![2, 3, 4, 5, 6],
avoid_peak_hours: true,
peak_hours: vec![8, 9, 10, 17, 18, 19, 20],
off_peak_multiplier: 1.5,
}
}
}
impl Default for PoorNetworkStrategy {
fn default() -> Self {
Self {
enable_degraded_mode: true,
min_update_size_kb: 10,
extended_retry_intervals: vec![5000, 10000, 20000, 40000],
enable_store_and_forward: true,
max_queue_size_mb: 50,
fallback_local_only: true,
}
}
}
impl Default for NetworkCompressionConfig {
fn default() -> Self {
Self {
enable_gradient_compression: true,
gradient_compression_algo: GradientCompressionAlgorithm::Adaptive,
model_compression_ratio: 0.8,
enable_differential_compression: true,
network_quantization: NetworkQuantizationConfig::default(),
}
}
}
impl Default for NetworkQuantizationConfig {
fn default() -> Self {
Self {
enabled: true,
bits_per_parameter: 16,
dynamic_range_scaling: true,
scheme: QuantizationScheme::Adaptive,
}
}
}
impl Default for RetryConfig {
fn default() -> Self {
Self {
max_attempts: 3,
base_interval_ms: 1000,
backoff_multiplier: 2.0,
max_interval_ms: 10000,
jitter_percent: 0.1,
}
}
}
impl Default for DataUsageLimits {
fn default() -> Self {
Self {
daily_limit_mb: 100,
monthly_limit_mb: 2000,
session_limit_mb: 50,
warning_thresholds: vec![50, 75, 90],
emergency_stop_threshold: 95,
}
}
}
impl Default for SyncFrequencyConfig {
fn default() -> Self {
Self {
base_frequency_minutes: 60,
adaptive_frequency: true,
min_frequency_minutes: 15,
max_frequency_minutes: 240,
frequency_conditions: HashMap::new(),
}
}
}
impl Default for FailureRecoveryConfig {
fn default() -> Self {
Self {
enable_auto_recovery: true,
recovery_timeout_ms: 30000,
max_recovery_attempts: 3,
recovery_strategies: vec![
RecoveryStrategy::Retry,
RecoveryStrategy::Reconnect,
RecoveryStrategy::Degrade,
],
fallback_offline: true,
}
}
}
impl Default for NetworkPredictionConfig {
fn default() -> Self {
Self {
enabled: true,
prediction_window_minutes: 30,
history_window_hours: 24,
accuracy_threshold: 0.8,
model_update_frequency_hours: 6,
}
}
}