use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MincutResult {
pub cut_value: f64,
pub partition_a: Vec<usize>,
pub partition_b: Vec<usize>,
pub cut_edges: Vec<(usize, usize, f64)>,
pub timestamp: f64,
}
impl MincutResult {
pub fn num_nodes(&self) -> usize {
self.partition_a.len() + self.partition_b.len()
}
pub fn num_cut_edges(&self) -> usize {
self.cut_edges.len()
}
pub fn balance_ratio(&self) -> f64 {
let a = self.partition_a.len() as f64;
let b = self.partition_b.len() as f64;
if a == 0.0 || b == 0.0 {
return 0.0;
}
a.min(b) / a.max(b)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MultiPartition {
pub partitions: Vec<Vec<usize>>,
pub cut_value: f64,
pub modularity: f64,
}
impl MultiPartition {
pub fn num_partitions(&self) -> usize {
self.partitions.len()
}
pub fn num_nodes(&self) -> usize {
self.partitions.iter().map(|p| p.len()).sum()
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum CognitiveState {
Rest,
Focused,
MotorPlanning,
SpeechProcessing,
MemoryEncoding,
MemoryRetrieval,
Creative,
Stressed,
Fatigued,
Sleep(SleepStage),
Unknown,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum SleepStage {
Wake,
N1,
N2,
N3,
Rem,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TopologyMetrics {
pub global_mincut: f64,
pub modularity: f64,
pub global_efficiency: f64,
pub local_efficiency: f64,
pub graph_entropy: f64,
pub fiedler_value: f64,
pub num_modules: usize,
pub timestamp: f64,
}