//! # RTX Federated - Advanced Federated Learning Platform //! //! A comprehensive federated learning platform that enables privacy-preserving distributed //! machine learning with state-of-the-art algorithms, Byzantine fault tolerance, and //! production-grade infrastructure. //! //! ## Features //! //! ### Advanced Aggregation Algorithms //! - **FedAvg**: Federated Averaging with momentum and adaptive learning //! - **FedProx**: Proximal federated optimization for heterogeneous networks //! - **SCAFFOLD**: Variance reduction with control variates for drift correction //! - **FedNova**: Normalized averaging for non-IID data distributions //! - **Asynchronous Aggregation**: Dynamic client participation support //! //! ### Personalized Federated Learning //! - **Meta-Learning**: MAML (Model-Agnostic Meta-Learning) for federated settings //! - **Personalization Layers**: Client-specific layers with shared backbone //! - **Multi-Task Learning**: Joint optimization across related tasks //! - **Client Clustering**: Data distribution-based client grouping //! - **Transfer Learning**: Knowledge transfer across federated clients //! //! ### Byzantine-Robust Aggregation //! - **Krum/Multi-Krum**: Geometric median-based Byzantine tolerance //! - **Trimmed Mean**: Robust statistical aggregation //! - **Gradient Clipping**: Defense against gradient attacks //! - **Anomaly Detection**: Real-time malicious update detection //! - **Reputation Systems**: Trust-based client weighting //! //! ### Privacy Mechanisms //! - **Differential Privacy**: Gaussian and Laplace noise mechanisms //! - **Local Differential Privacy**: Client-side privacy guarantees //! - **Secure Multi-Party Computation**: Privacy-preserving aggregation //! - **Homomorphic Encryption**: Computation on encrypted gradients //! - **Privacy Accounting**: Epsilon budget management and tracking //! //! ### Production Infrastructure //! - **Client Management**: Dynamic registration and lifecycle management //! - **Communication Optimization**: Gradient compression and quantization //! - **Fault Tolerance**: Robust recovery from client failures //! - **Monitoring**: Real-time analytics and performance tracking //! - **Resource-Aware Scheduling**: Adaptive client selection and scheduling //! //! ## Architecture //! //! ```text //! ┌─────────────────────────────────────────────────────────────────────┐ //! │ RTX Federated │ //! ├─────────────┬─────────────┬─────────────┬─────────────┬─────────────┤ //! │ Aggregation │ Personaliza │ Byzantine │ Privacy │ Infrastruct │ //! │ │ tion │ Robust │ │ ure │ //! │ • FedAvg │ • Meta-Learn│ • Krum │ • Diff Priv │ • Client │ //! │ • FedProx │ • Personal │ • Trimmed │ • Homomorph │ Mgmt │ //! │ • SCAFFOLD │ • Multi-Task│ Mean │ • SMPC │ • Comm Opt │ //! │ • FedNova │ • Clustering│ • Anomaly │ • Privacy │ • Fault Tol │ //! │ • Async │ • Transfer │ Detection │ Accounting│ • Monitoring│ //! └─────────────┴─────────────┴─────────────┴─────────────┴─────────────┘ //! ``` //! //! ## Usage Example //! //! ```rust,ignore //! use rtx_federated::{ //! FederatedSystem, FederatedConfig, AggregationAlgorithm, //! PrivacyMechanism, Client, ModelUpdate //! }; //! //! #[tokio::main] //! async fn main() -> Result<(), Box> { //! // Configure federated learning system //! let config = FederatedConfig::new() //! .with_aggregation(AggregationAlgorithm::FedAvg { momentum: 0.9 }) //! .with_privacy(PrivacyMechanism::DifferentialPrivacy { epsilon: 1.0 }) //! .with_byzantine_tolerance(true) //! .with_client_selection_ratio(0.3); //! //! // Initialize federated system //! let mut fed_system = FederatedSystem::new(config).await?; //! //! // Register clients //! for i in 0..100 { //! let client = Client::new(format!("client_{}", i)).await?; //! fed_system.register_client(client).await?; //! } //! //! // Run federated training rounds //! for round in 0..100 { //! let selected_clients = fed_system.select_clients().await?; //! let model_updates = fed_system.collect_updates(selected_clients).await?; //! let aggregated_model = fed_system.aggregate_updates(model_updates).await?; //! fed_system.distribute_model(aggregated_model).await?; //! } //! //! Ok(()) //! } //! ``` #![deny(unsafe_code)] #![warn(rust_2018_idioms)] // missing_docs is handled at workspace level pub mod aggregation; pub mod byzantine; pub mod error; pub mod infrastructure; pub mod personalization; pub mod privacy; pub mod simulation; // Re-export core types pub use crate::{ aggregation::{ AggregationAlgorithm, AggregationResult, AsyncAggregation, FedAvg, FedNova, FedProx, ModelUpdate, Scaffold, }, byzantine::{AnomalyDetector, ByzantineRobust, Krum, MultiKrum, ReputationSystem, TrimmedMean}, error::{FederatedError, Result}, infrastructure::{ ClientManager, CommunicationOptimizer, FaultTolerance, MonitoringSystem, ResourceScheduler, }, personalization::{ ClientClustering, MetaLearning, MultiTaskLearning, PersonalizationLayers, TransferLearning, }, privacy::{ DifferentialPrivacy, HomomorphicEncryption, LocalDifferentialPrivacy, PrivacyBudget, PrivacyMechanism, SecureMultiPartyComputation, }, }; use serde::{Deserialize, Serialize}; use std::collections::HashMap; use std::sync::Arc; use tokio::sync::RwLock; use tracing::{debug, info, warn}; use uuid::Uuid; /// Comprehensive federated learning system pub struct FederatedSystem { config: FederatedConfig, clients: RwLock>, aggregation_engine: Box, privacy_engine: Option>, byzantine_protection: Option>, infrastructure: Infrastructure, metrics: RwLock, } /// Federated learning configuration #[derive(Debug, Clone, Serialize, Deserialize)] pub struct FederatedConfig { /// Number of federated learning rounds pub num_rounds: usize, /// Fraction of clients selected per round pub client_selection_ratio: f64, /// Minimum number of clients required pub min_clients: usize, /// Maximum number of clients allowed pub max_clients: usize, /// Aggregation algorithm configuration pub aggregation: aggregation::AggregationConfig, /// Privacy mechanism configuration pub privacy: Option, /// Byzantine fault tolerance configuration pub byzantine_tolerance: bool, /// Personalization settings pub personalization: PersonalizationConfig, /// Communication optimization settings pub communication: CommunicationConfig, /// Monitoring and logging configuration pub monitoring: MonitoringConfig, } /// Aggregation algorithm configuration #[derive(Debug, Clone, Serialize, Deserialize)] pub enum AggregationConfig { /// Federated Averaging with optional momentum FedAvg { momentum: Option, adaptive_learning_rate: bool, }, /// Federated Proximal with regularization parameter FedProx { mu: f64, local_epochs: usize }, /// SCAFFOLD with control variates Scaffold { learning_rate: f64, local_steps: usize, }, /// FedNova with normalized averaging FedNova { tau_eff: f64, momentum: f64 }, /// Asynchronous aggregation Async { staleness_threshold: usize, mixing_parameter: f64, }, } /// Privacy mechanism configuration #[derive(Debug, Clone, Serialize, Deserialize)] pub enum PrivacyConfig { /// Differential privacy with noise parameters DifferentialPrivacy { epsilon: f64, delta: f64, noise_mechanism: NoiseMechanism, }, /// Local differential privacy LocalDifferentialPrivacy { epsilon: f64, randomization_mechanism: RandomizationMechanism, }, /// Secure multi-party computation SecureMultiPartyComputation { threshold: usize, security_parameter: usize, }, /// Homomorphic encryption HomomorphicEncryption { key_size: usize, precision: usize }, } /// Noise mechanisms for differential privacy #[derive(Debug, Clone, Serialize, Deserialize)] pub enum NoiseMechanism { Gaussian { sigma: f64 }, Laplace { scale: f64 }, Exponential { rate: f64 }, Discrete { sensitivity: f64 }, } /// Randomization mechanisms for local differential privacy #[derive(Debug, Clone, Serialize, Deserialize)] pub enum RandomizationMechanism { RandomResponse, LocalHashing, Duchi, } /// Personalization configuration #[derive(Debug, Clone, Serialize, Deserialize)] pub struct PersonalizationConfig { /// Enable meta-learning (MAML) pub meta_learning_enabled: bool, /// Number of personalization layers pub personalization_layers: usize, /// Enable multi-task learning pub multi_task_enabled: bool, /// Client clustering configuration pub clustering_config: Option, /// Transfer learning settings pub transfer_learning: TransferLearningConfig, } /// Client clustering configuration #[derive(Debug, Clone, Serialize, Deserialize)] pub struct ClusteringConfig { /// Number of clusters pub num_clusters: usize, /// Clustering algorithm pub algorithm: ClusteringAlgorithm, /// Re-clustering frequency (rounds) pub reclustering_frequency: usize, } /// Clustering algorithms #[derive(Debug, Clone, Serialize, Deserialize)] pub enum ClusteringAlgorithm { KMeans, SpectralClustering, HierarchicalClustering, DBScan, } /// Transfer learning configuration #[derive(Debug, Clone, Serialize, Deserialize)] pub struct TransferLearningConfig { /// Enable transfer learning pub enabled: bool, /// Source domain similarity threshold pub similarity_threshold: f64, /// Transfer learning method pub method: TransferMethod, } /// Transfer learning methods #[derive(Debug, Clone, Serialize, Deserialize)] pub enum TransferMethod { FineTuning, FeatureExtraction, DomainAdaptation, MultiTaskLearning, } /// Communication optimization configuration #[derive(Debug, Clone, Serialize, Deserialize)] pub struct CommunicationConfig { /// Enable gradient compression pub compression_enabled: bool, /// Compression ratio (0.0 to 1.0) pub compression_ratio: f64, /// Quantization bits pub quantization_bits: usize, /// Enable sparsification pub sparsification_enabled: bool, /// Top-k sparsification parameter pub top_k_ratio: f64, } /// Monitoring and logging configuration #[derive(Debug, Clone, Serialize, Deserialize)] pub struct MonitoringConfig { /// Enable real-time monitoring pub enabled: bool, /// Metrics collection interval (seconds) pub metrics_interval: u64, /// Enable performance profiling pub profiling_enabled: bool, /// Log verbosity level pub log_level: LogLevel, } /// Log verbosity levels #[derive(Debug, Clone, Serialize, Deserialize)] pub enum LogLevel { Error, Warn, Info, Debug, Trace, } /// Federated learning client #[derive(Debug, Clone)] pub struct Client { /// Unique client identifier pub id: Uuid, /// Client name/label pub name: String, /// Client capabilities pub capabilities: ClientCapabilities, /// Client status pub status: ClientStatus, /// Data characteristics pub data_profile: DataProfile, /// Communication endpoint pub endpoint: Option, /// Last seen timestamp pub last_seen: chrono::DateTime, } /// Client capabilities #[derive(Debug, Clone, Serialize, Deserialize)] pub struct ClientCapabilities { /// Computational power score (0.0 to 1.0) pub compute_score: f64, /// Available memory (bytes) pub memory_bytes: u64, /// Network bandwidth (Mbps) pub bandwidth_mbps: f64, /// Battery level (0.0 to 1.0, if applicable) pub battery_level: Option, /// Supported privacy mechanisms pub privacy_support: Vec, } /// Client status #[derive(Debug, Clone, Serialize, Deserialize)] pub enum ClientStatus { Available, Training, Offline, Faulty, Malicious, } /// Data profile for client data characteristics #[derive(Debug, Clone, Serialize, Deserialize)] pub struct DataProfile { /// Number of local samples pub sample_count: usize, /// Data distribution identifier pub distribution_id: Option, /// Data quality score (0.0 to 1.0) pub quality_score: f64, /// Privacy sensitivity level pub privacy_level: PrivacyLevel, } /// Privacy sensitivity levels #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] pub enum PrivacyLevel { Public, Internal, Confidential, Restricted, TopSecret, } /// Infrastructure components pub struct Infrastructure { client_manager: ClientManager, communication_optimizer: CommunicationOptimizer, fault_tolerance: FaultTolerance, monitoring_system: MonitoringSystem, resource_scheduler: ResourceScheduler, } /// Federated learning metrics #[derive(Debug, Default, Clone, Serialize, Deserialize)] pub struct FederatedMetrics { /// Total number of rounds completed pub rounds_completed: usize, /// Current round number pub current_round: usize, /// Number of active clients pub active_clients: usize, /// Average model accuracy across clients pub average_accuracy: f64, /// Communication overhead (bytes) pub communication_overhead: u64, /// Training time per round (milliseconds) pub training_time_ms: u64, /// Privacy budget consumed pub privacy_budget_consumed: f64, /// Byzantine attacks detected pub byzantine_attacks_detected: usize, /// System uptime (seconds) pub uptime_seconds: u64, } impl FederatedSystem { /// Create a new federated learning system pub async fn new(config: FederatedConfig) -> Result { info!("🚀 Initializing RTX Federated Learning System..."); // Initialize aggregation engine let aggregation_engine = create_aggregation_engine(&config.aggregation).await?; // Initialize privacy engine if configured let privacy_engine = if let Some(privacy_config) = &config.privacy { Some(create_privacy_engine(privacy_config).await?) } else { None }; // Initialize Byzantine protection if enabled let byzantine_protection = if config.byzantine_tolerance { Some(create_byzantine_protection().await?) } else { None }; // Initialize infrastructure let infrastructure = Infrastructure { client_manager: ClientManager::new().await?, communication_optimizer: CommunicationOptimizer::new( infrastructure::CommunicationConfig::default(), ) .await?, fault_tolerance: FaultTolerance::new().await?, monitoring_system: MonitoringSystem::new(infrastructure::MonitoringConfig::default()) .await?, resource_scheduler: ResourceScheduler::new().await?, }; info!("✅ Federated Learning System initialized successfully"); Ok(Self { config, clients: RwLock::new(HashMap::new()), aggregation_engine, privacy_engine, byzantine_protection, infrastructure, metrics: RwLock::new(FederatedMetrics::default()), }) } /// Register a new client pub async fn register_client(&mut self, client: Client) -> Result<()> { debug!("Registering client: {}", client.name); let client_id = client.id; let mut clients = self.clients.write().await; if clients.len() >= self.config.max_clients { return Err(FederatedError::MaxClientsReached(self.config.max_clients)); } clients.insert(client_id, client.clone()); // Create ClientConnection from Client use infrastructure::client_manager::protocol::{ClientConnection, ConnectionQuality}; use std::net::SocketAddr; use std::sync::atomic::AtomicU64; let connection = ClientConnection { client_id, endpoint: client .endpoint .as_ref() .and_then(|e| e.parse::().ok()) .unwrap_or_else(|| "127.0.0.1:8080".parse().unwrap()), connected_at: chrono::Utc::now(), last_heartbeat: chrono::Utc::now(), bytes_sent: Arc::new(AtomicU64::new(0)), bytes_received: Arc::new(AtomicU64::new(0)), round_trip_time_ms: Arc::new(AtomicU64::new(0)), connection_quality: ConnectionQuality::default(), auth_token: None, stream: None, }; self.infrastructure .client_manager .register_client(client_id, connection) .await?; let mut metrics = self.metrics.write().await; metrics.active_clients = clients.len(); info!("✅ Client {} registered successfully", client_id); Ok(()) } /// Select clients for the current training round pub async fn select_clients(&self) -> Result> { let clients = self.clients.read().await; let available_clients: Vec = clients .iter() .filter(|(_, client)| matches!(client.status, ClientStatus::Available)) .map(|(id, _)| *id) .collect(); if available_clients.len() < self.config.min_clients { return Err(FederatedError::InsufficientClients { required: self.config.min_clients, available: available_clients.len(), }); } let selected_count = (available_clients.len() as f64 * self.config.client_selection_ratio).ceil() as usize; let selected_count = selected_count .min(available_clients.len()) .max(self.config.min_clients); let selected_clients = self .infrastructure .resource_scheduler .select_clients(&available_clients, selected_count) .await?; debug!( "Selected {} clients for training round", selected_clients.len() ); Ok(selected_clients) } /// Collect model updates from selected clients pub async fn collect_updates(&self, client_ids: Vec) -> Result> { let mut updates = Vec::new(); for client_id in client_ids { match self .infrastructure .client_manager .request_update(client_id) .await { Ok(_update_bytes) => { // Convert raw bytes to ModelUpdate // In a real implementation, this would deserialize the update let model_update = ModelUpdate { client_id, parameters: { let mut params = HashMap::new(); // Simulate parameter extraction from bytes params.insert("layer1.weight".to_string(), vec![0.1, 0.2, 0.3]); params.insert("layer1.bias".to_string(), vec![0.01, 0.02]); params.insert("layer2.weight".to_string(), vec![0.4, 0.5, 0.6]); params.insert("layer2.bias".to_string(), vec![0.03, 0.04]); params }, sample_count: 1000, // Number of samples client trained on loss: 0.05, // Training loss achieved accuracy: 0.95, // Training accuracy achieved training_time_ms: 5000, // Training time in milliseconds local_epochs: 5, // Local epochs completed learning_rate: 0.001, // Learning rate used timestamp: chrono::Utc::now(), metadata: HashMap::new(), // Additional metadata }; // Apply privacy mechanism if configured let processed_update = if let Some(privacy_engine) = &self.privacy_engine { privacy_engine.apply_privacy(&model_update).await? } else { model_update }; updates.push(processed_update); } Err(e) => { warn!("Failed to collect update from client {}: {}", client_id, e); continue; } } } if updates.is_empty() { return Err(FederatedError::NoUpdatesCollected); } debug!("Collected {} model updates", updates.len()); Ok(updates) } /// Aggregate model updates using the configured algorithm pub async fn aggregate_updates(&self, updates: Vec) -> Result { // Apply Byzantine protection if enabled let filtered_updates = if let Some(byzantine_protection) = &self.byzantine_protection { byzantine_protection.filter_updates(&updates).await? } else { updates }; // Perform aggregation let aggregated = self.aggregation_engine.aggregate(&filtered_updates).await?; debug!("Successfully aggregated {} updates", filtered_updates.len()); Ok(aggregated) } /// Distribute aggregated model to clients pub async fn distribute_model(&self, model: ModelUpdate) -> Result<()> { let clients = self.clients.read().await; let mut distribution_tasks = Vec::new(); for (client_id, _) in clients.iter() { let compressed_model = self .infrastructure .communication_optimizer .compress_model(&model) .await?; // Serialize the model to bytes for distribution let model_bytes = bincode::serialize(&compressed_model).unwrap_or_else(|_| Vec::new()); let task = self .infrastructure .client_manager .distribute_model(*client_id, model_bytes); distribution_tasks.push(task); } // Wait for all distributions to complete let results = futures::future::join_all(distribution_tasks).await; let successful_distributions = results .into_iter() .filter(std::result::Result::is_ok) .count(); info!( "Distributed model to {}/{} clients", successful_distributions, clients.len() ); Ok(()) } /// Run a complete federated learning round pub async fn run_round(&mut self) -> Result { let start_time = std::time::Instant::now(); let mut metrics = self.metrics.write().await; metrics.current_round += 1; let current_round = metrics.current_round; drop(metrics); info!("🔄 Starting federated learning round {}", current_round); // Select clients let selected_clients = self.select_clients().await?; // Collect updates let updates = self.collect_updates(selected_clients).await?; // Aggregate updates let aggregated_model = self.aggregate_updates(updates).await?; // Distribute aggregated model self.distribute_model(aggregated_model).await?; // Update metrics let mut metrics = self.metrics.write().await; metrics.rounds_completed += 1; metrics.training_time_ms = start_time.elapsed().as_millis() as u64; info!( "✅ Completed federated learning round {} in {:?}", current_round, start_time.elapsed() ); Ok(metrics.clone()) } /// Get current system metrics pub async fn get_metrics(&self) -> FederatedMetrics { self.metrics.read().await.clone() } /// Shutdown the federated learning system pub async fn shutdown(&mut self) -> Result<()> { info!("🛑 Shutting down federated learning system..."); self.infrastructure.monitoring_system.shutdown().await?; self.infrastructure.client_manager.shutdown().await?; info!("✅ Federated learning system shutdown complete"); Ok(()) } } impl FederatedConfig { /// Create a new federated learning configuration with defaults pub fn new() -> Self { Self { num_rounds: 100, client_selection_ratio: 0.1, min_clients: 2, max_clients: 1000, aggregation: aggregation::AggregationConfig::FedAvg { momentum: Some(0.9), adaptive_learning_rate: true, weight_decay: None, }, privacy: Some(PrivacyConfig::DifferentialPrivacy { epsilon: 1.0, delta: 1e-5, noise_mechanism: NoiseMechanism::Gaussian { sigma: 1.0 }, }), byzantine_tolerance: true, personalization: PersonalizationConfig { meta_learning_enabled: false, personalization_layers: 2, multi_task_enabled: false, clustering_config: None, transfer_learning: TransferLearningConfig { enabled: false, similarity_threshold: 0.8, method: TransferMethod::FineTuning, }, }, communication: CommunicationConfig { compression_enabled: true, compression_ratio: 0.1, quantization_bits: 8, sparsification_enabled: true, top_k_ratio: 0.01, }, monitoring: MonitoringConfig { enabled: true, metrics_interval: 30, profiling_enabled: false, log_level: LogLevel::Info, }, } } /// Configure for maximum privacy pub fn with_maximum_privacy(mut self) -> Self { self.privacy = Some(PrivacyConfig::DifferentialPrivacy { epsilon: 0.1, // Strong privacy guarantee delta: 1e-6, noise_mechanism: NoiseMechanism::Gaussian { sigma: 2.0 }, }); self } /// Configure for Byzantine fault tolerance pub fn with_byzantine_tolerance(mut self, enabled: bool) -> Self { self.byzantine_tolerance = enabled; self } /// Configure aggregation algorithm pub fn with_aggregation(mut self, algorithm: aggregation::AggregationConfig) -> Self { self.aggregation = algorithm; self } } impl Client { /// Create a new federated learning client pub async fn new(name: String) -> Result { Ok(Self { id: Uuid::new_v4(), name, capabilities: ClientCapabilities { compute_score: 0.5, memory_bytes: 1024 * 1024 * 1024, // 1GB bandwidth_mbps: 10.0, battery_level: None, privacy_support: vec!["differential_privacy".to_string()], }, status: ClientStatus::Available, data_profile: DataProfile { sample_count: 1000, distribution_id: None, quality_score: 0.8, privacy_level: PrivacyLevel::Internal, }, endpoint: None, last_seen: chrono::Utc::now(), }) } /// Update client status pub fn update_status(&mut self, status: ClientStatus) { self.status = status; self.last_seen = chrono::Utc::now(); } } // Helper functions for creating engine components async fn create_aggregation_engine( config: &aggregation::AggregationConfig, ) -> Result> { match config { aggregation::AggregationConfig::FedAvg { momentum, adaptive_learning_rate, .. } => Ok(Box::new( FedAvg::new(*momentum, *adaptive_learning_rate).await?, )), aggregation::AggregationConfig::FedProx { proximal_mu, local_epochs, .. } => Ok(Box::new(FedProx::new(*proximal_mu, *local_epochs).await?)), aggregation::AggregationConfig::Scaffold { learning_rate, local_steps, .. } => Ok(Box::new(Scaffold::new(*learning_rate, *local_steps).await?)), aggregation::AggregationConfig::FedNova { tau_effective, momentum_factor, .. } => Ok(Box::new( FedNova::new(*tau_effective, *momentum_factor).await?, )), aggregation::AggregationConfig::AsyncAggregation { staleness_threshold, mixing_parameter, .. } => Ok(Box::new( AsyncAggregation::new(*staleness_threshold, *mixing_parameter).await?, )), } } async fn create_privacy_engine( config: &PrivacyConfig, ) -> Result> { match config { PrivacyConfig::DifferentialPrivacy { epsilon, delta, noise_mechanism: _, } => Ok(Box::new(DifferentialPrivacy::new(*epsilon, *delta).await?)), PrivacyConfig::LocalDifferentialPrivacy { epsilon, randomization_mechanism: _, } => Ok(Box::new(LocalDifferentialPrivacy::new(*epsilon).await?)), PrivacyConfig::SecureMultiPartyComputation { threshold, security_parameter, } => Ok(Box::new( SecureMultiPartyComputation::new(*threshold, *security_parameter).await?, )), PrivacyConfig::HomomorphicEncryption { key_size, precision, } => Ok(Box::new( HomomorphicEncryption::new(*key_size, *precision).await?, )), } } async fn create_byzantine_protection() -> Result> { // Default to Krum for Byzantine protection Ok(Box::new(Krum::new(0.1).await?)) } impl Default for FederatedConfig { fn default() -> Self { Self::new() } } /// Version information pub const VERSION: &str = env!("CARGO_PKG_VERSION"); impl std::fmt::Debug for FederatedSystem { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("FederatedSystem") .field("config", &self.config) .field("clients", &self.clients) .field("aggregation_engine", &"Box") .field( "privacy_engine", &self .privacy_engine .as_ref() .map(|_| "Box"), ) .field( "byzantine_protection", &self .byzantine_protection .as_ref() .map(|_| "Box"), ) .field("infrastructure", &"Infrastructure") .field("metrics", &self.metrics) .finish() } } impl std::fmt::Debug for Infrastructure { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("Infrastructure") .field("client_manager", &"ClientManager") .field("communication_optimizer", &"CommunicationOptimizer") .field("fault_tolerance", &"FaultTolerance") .field("monitoring_system", &"MonitoringSystem") .field("resource_scheduler", &"ResourceScheduler") .finish() } }