use crate::error::Result;
use crate::graph::GraphDataBuilder;
use crate::partition::Partition;
use crate::quality::{Modularity, QualityFunction};
pub fn load_edgelist(data: &str, node_count: usize) -> Result<crate::graph::GraphData> {
let mut builder = GraphDataBuilder::new(node_count);
let mut seen = rustc_hash::FxHashSet::default();
for line in data.lines() {
let line = line.trim();
if line.is_empty() || line.starts_with('#') {
continue;
}
let parts: Vec<&str> = line.split_whitespace().collect();
if parts.len() < 2 {
continue;
}
let src: usize = match parts[0].parse() {
Ok(v) => v,
Err(_) => continue,
};
let dst: usize = match parts[1].parse() {
Ok(v) => v,
Err(_) => continue,
};
if src >= node_count || dst >= node_count || src == dst {
continue;
}
let key = (src.min(dst), src.max(dst));
if seen.insert(key) {
builder.add_edge(src, dst, 1.0)?;
}
}
builder.build()
}
pub fn modularity(data: &crate::graph::GraphData, partition: &Partition) -> f64 {
Modularity::with_resolution(1.0).total_quality(data, partition)
}