1use chrono::{DateTime, Utc};
7use scirs2_core::ndarray_ext::Array2;
8use serde::{Deserialize, Serialize};
9use std::collections::HashMap;
10use uuid::Uuid;
11
12#[derive(Debug, Clone, Serialize, Deserialize)]
14pub struct Participant {
15 pub participant_id: Uuid,
17 pub name: String,
19 pub endpoint: String,
21 pub public_key: String,
23 pub data_stats: DataStatistics,
25 pub capabilities: ParticipantCapabilities,
27 pub trust_score: f64,
29 pub last_communication: DateTime<Utc>,
31 pub status: ParticipantStatus,
33}
34
35#[derive(Debug, Clone, Serialize, Deserialize)]
37pub struct DataStatistics {
38 pub num_samples: usize,
40 pub num_features: usize,
42 pub distribution_summary: HashMap<String, f64>,
44 pub quality_metrics: HashMap<String, f64>,
46 pub privacy_budget_used: f64,
48}
49
50#[derive(Debug, Clone, Serialize, Deserialize)]
52pub struct ParticipantCapabilities {
53 pub compute_power: ComputePower,
55 pub available_memory_gb: f64,
57 pub network_bandwidth_mbps: f64,
59 pub supported_algorithms: Vec<String>,
61 pub hardware_accelerators: Vec<HardwareAccelerator>,
63 pub security_features: Vec<SecurityFeature>,
65}
66
67#[derive(Debug, Clone, Serialize, Deserialize)]
69pub enum ComputePower {
70 Low,
72 Medium,
74 High,
76 VeryHigh,
78}
79
80#[derive(Debug, Clone, Serialize, Deserialize)]
82pub enum HardwareAccelerator {
83 GPU,
85 TPU,
87 NCS,
89 NPU,
91 FPGA,
93}
94
95#[derive(Debug, Clone, Serialize, Deserialize)]
97pub enum SecurityFeature {
98 TEE,
100 HSM,
102 SecureEnclave,
104 IntelSGX,
106 ARMTrustZone,
108}
109
110#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
112pub enum ParticipantStatus {
113 Active,
115 Inactive,
117 Disconnected,
119 Suspended,
121 Excluded,
123}
124
125#[derive(Debug, Clone, Serialize, Deserialize)]
127pub struct FederatedRound {
128 pub round_number: usize,
130 pub start_time: DateTime<Utc>,
132 pub end_time: Option<DateTime<Utc>>,
134 pub participants: Vec<Uuid>,
136 pub global_parameters: HashMap<String, Array2<f32>>,
138 pub aggregated_updates: HashMap<String, Array2<f32>>,
140 pub metrics: RoundMetrics,
142 pub status: RoundStatus,
144}
145
146#[derive(Debug, Clone, Serialize, Deserialize)]
148pub struct RoundMetrics {
149 pub num_participants: usize,
151 pub total_samples: usize,
153 pub avg_local_loss: f64,
155 pub global_accuracy: f64,
157 pub communication_overhead: u64,
159 pub duration_seconds: f64,
161 pub privacy_budget_consumed: f64,
163 pub convergence_metrics: ConvergenceMetrics,
165}
166
167#[derive(Debug, Clone, Serialize, Deserialize)]
169pub struct ConvergenceMetrics {
170 pub parameter_change: f64,
172 pub loss_improvement: f64,
174 pub gradient_norm: f64,
176 pub convergence_status: ConvergenceStatus,
178 pub estimated_rounds_to_convergence: Option<usize>,
180}
181
182#[derive(Debug, Clone, Serialize, Deserialize)]
184pub enum ConvergenceStatus {
185 Progressing,
187 Converged,
189 Diverging,
191 Stagnated,
193 Oscillating,
195}
196
197#[derive(Debug, Clone, Serialize, Deserialize)]
199pub enum RoundStatus {
200 Initializing,
202 Training,
204 Aggregating,
206 Completed,
208 Failed,
210 Aborted,
212}
213
214#[derive(Debug, Clone, Serialize, Deserialize)]
216pub struct LocalTrainingStats {
217 pub epochs_completed: usize,
219 pub training_time_seconds: f64,
221 pub local_loss: f64,
223 pub local_accuracy: f64,
225 pub samples_used: usize,
227 pub gradient_norm: f64,
229 pub resource_utilization: ResourceUtilization,
231}
232
233#[derive(Debug, Clone, Serialize, Deserialize)]
235pub struct ResourceUtilization {
236 pub cpu_usage_percent: f64,
238 pub memory_usage_gb: f64,
240 pub gpu_usage_percent: Option<f64>,
242 pub network_bandwidth_used_mbps: f64,
244}
245
246#[derive(Debug, Clone, Serialize, Deserialize)]
248pub struct LocalUpdate {
249 pub participant_id: Uuid,
251 pub round_number: usize,
253 pub parameter_updates: HashMap<String, Array2<f32>>,
255 pub num_samples: usize,
257 pub training_stats: LocalTrainingStats,
259 pub timestamp: DateTime<Utc>,
261 pub data_selection: DataSelectionStrategy,
263}
264
265#[derive(Debug, Clone, Serialize, Deserialize)]
267pub enum DataSelectionStrategy {
268 AllData,
270 RandomSampling { sample_rate: f64 },
272 StratifiedSampling {
274 strata_proportions: HashMap<String, f64>,
275 },
276 ActiveLearning { uncertainty_threshold: f64 },
278 ImportanceSampling { importance_weights: Vec<f64> },
280}
281
282#[derive(Debug, Clone, Serialize, Deserialize)]
284pub struct GlobalModelState {
285 pub parameters: HashMap<String, Array2<f32>>,
287 pub global_round: usize,
289 pub model_version: String,
291 pub last_updated: DateTime<Utc>,
293 pub performance_metrics: HashMap<String, f64>,
295 pub participant_contributions: HashMap<Uuid, f64>,
297}
298
299#[derive(Debug, Clone, Serialize, Deserialize)]
301pub struct LocalModelState {
302 pub participant_id: Uuid,
304 pub parameters: HashMap<String, Array2<f32>>,
306 pub personalized_parameters: HashMap<String, Array2<f32>>,
308 pub synchronized_round: usize,
310 pub local_adaptation_steps: usize,
312 pub last_sync_time: DateTime<Utc>,
314}
315
316#[derive(Debug, Clone, Serialize, Deserialize)]
318pub struct PrivacyMetrics {
319 pub total_budget_spent: f64,
321 pub participant_budget_usage: HashMap<Uuid, f64>,
323 pub dp_guarantees: HashMap<String, f64>,
325 pub privacy_violations: Vec<PrivacyViolation>,
327 pub privacy_risk_score: f64,
329}
330
331#[derive(Debug, Clone, Serialize, Deserialize)]
333pub struct PrivacyViolation {
334 pub violation_type: PrivacyViolationType,
336 pub participant_id: Option<Uuid>,
338 pub timestamp: DateTime<Utc>,
340 pub severity: ViolationSeverity,
342 pub description: String,
344 pub mitigation_action: Option<String>,
346}
347
348#[derive(Debug, Clone, Serialize, Deserialize)]
350pub enum PrivacyViolationType {
351 BudgetExceeded,
353 InformationLeakage,
355 ModelInversion,
357 MembershipInference,
359 DataReconstruction,
361}
362
363#[derive(Debug, Clone, Serialize, Deserialize)]
365pub enum ViolationSeverity {
366 Low,
368 Medium,
370 High,
372 Critical,
374}
375
376#[derive(Debug, Clone, Serialize, Deserialize)]
378pub struct FederationStats {
379 pub total_participants: usize,
381 pub active_participants: usize,
383 pub rounds_completed: usize,
385 pub avg_round_duration_seconds: f64,
387 pub total_communication_overhead_bytes: u64,
389 pub convergence_status: ConvergenceStatus,
391 pub privacy_metrics: PrivacyMetrics,
393 pub system_uptime_seconds: u64,
395 pub last_activity: DateTime<Utc>,
397}