#[derive(Debug)]
#[allow(dead_code)]
struct CommunityData {
node_to_community: Vec<usize>,
community_degrees: HashMap<usize, f64>,
community_internal_weight: HashMap<usize, f64>,
}
impl CommunityData {
fn new(communities: &[usize], graph_data: &GraphData) -> Self {
let node_to_community = communities.to_vec();
let mut community_degrees: HashMap<usize, f64> = HashMap::new();
let mut community_internal_weight: HashMap<usize, f64> = HashMap::new();
for (node, &community) in communities.iter().enumerate() {
*community_degrees.entry(community).or_insert(0.0) += graph_data.degrees[node];
}
for (&(source, target), &weight) in &graph_data.edge_weights {
if communities[source] == communities[target] {
*community_internal_weight
.entry(communities[source])
.or_insert(0.0) += weight;
}
}
CommunityData {
node_to_community,
community_degrees,
community_internal_weight,
}
}
}