in src/dachshund/typed_graph_builder.rs [155:183]
fn trim_edges(node_map: &mut FxHashMap<NodeId, Node>, min_degree: &usize) -> HashSet<NodeId> {
let mut degree_map: HashMap<NodeId, usize> = HashMap::new();
for (node_id, node) in node_map.iter() {
let node_degree: usize = node.degree();
degree_map.insert(*node_id, node_degree);
}
let mut nodes_to_delete: HashSet<NodeId> = HashSet::new();
loop {
let mut nodes_to_update: HashSet<NodeId> = HashSet::new();
for (node_id, node_degree) in degree_map.iter() {
if node_degree < min_degree && !nodes_to_delete.contains(node_id) {
nodes_to_update.insert(*node_id);
nodes_to_delete.insert(*node_id);
}
}
if nodes_to_update.is_empty() {
break;
}
for node_id in nodes_to_update.iter() {
let node: &Node = &node_map[node_id];
for n in node.edges.iter() {
let neighbor_node_id: NodeId = n.target_id;
let current_degree: usize = degree_map[&neighbor_node_id];
degree_map.insert(neighbor_node_id, current_degree - 1);
}
}
}
nodes_to_delete
}