use crate::core::system::topology::Topology;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct NetworkResult {
pub component_sizes: Vec<usize>,
pub num_components: usize,
}
pub fn hbond_components(n_nodes: usize, edges: &[(usize, usize)]) -> NetworkResult {
let mut topo = Topology::with_atoms(n_nodes);
for &(a, b) in edges {
if a != b && a < n_nodes && b < n_nodes {
topo.add_bond(a, b);
}
}
let labels = topo.connected_components();
let n_labels = labels
.iter()
.copied()
.max()
.map(|m| (m + 1) as usize)
.unwrap_or(0);
let mut sizes = vec![0usize; n_labels];
for &l in &labels {
sizes[l as usize] += 1;
}
sizes.sort_unstable_by(|a, b| b.cmp(a));
NetworkResult {
num_components: sizes.len(),
component_sizes: sizes,
}
}