in src/dachshund/algorithms/connected_components.rs [22:72]
fn _get_connected_components_membership(
&self,
ignore_nodes: Option<&FxHashSet<NodeId>>,
ignore_edges: Option<&HashSet<(NodeId, NodeId)>>,
) -> (HashMap<NodeId, usize>, usize) {
let mut components: HashMap<NodeId, usize> = HashMap::new();
let mut queue: OrderedNodeSet = BTreeSet::new();
for id in self.get_ids_iter() {
if ignore_nodes.is_none() || !ignore_nodes.unwrap().contains(id) {
queue.insert(*id);
}
}
let mut idx = 0;
while !queue.is_empty() {
let id = queue.pop_first().unwrap();
let distinct_nodes: Vec<NodeId> = self
.get_node(id)
.get_edges()
.map(|x| x.get_neighbor_id())
.filter(|x| {
ignore_edges.is_none()
|| (!ignore_edges.unwrap().contains(&(id, *x))
&& !ignore_edges.unwrap().contains(&(*x, id)))
})
.collect();
let mut q2: OrderedNodeSet = BTreeSet::from_iter(distinct_nodes.into_iter());
while !q2.is_empty() {
let nid = q2.pop_first().unwrap();
if ignore_nodes.is_none() || !ignore_nodes.unwrap().contains(&nid) {
components.insert(nid, idx);
if queue.contains(&nid) {
queue.remove(&nid);
}
for e in self.get_node(nid).get_edges() {
let nid2 = e.get_neighbor_id();
if (ignore_nodes.is_none() || !ignore_nodes.unwrap().contains(&nid2))
&& (ignore_edges.is_none()
|| (!ignore_edges.unwrap().contains(&(nid, nid2))
&& !ignore_edges.unwrap().contains(&(nid2, nid))))
&& !components.contains_key(&nid2)
{
q2.insert(nid2);
}
}
}
}
idx += 1;
}
(components, idx)
}