in src/dachshund/algorithms/shortest_paths.rs [138:169]
fn enumerate_shortest_paths(
&self,
dist: &HashMap<NodeId, Option<usize>>,
parents: &HashMap<NodeId, HashSet<NodeId>>,
destination: NodeId,
) -> HashMap<NodeId, Vec<Vec<NodeId>>> {
let mut nodes_by_distance: HashMap<usize, Vec<NodeId>> = HashMap::new();
for (node_id, distance) in dist {
if *node_id != destination {
let d = distance.unwrap();
nodes_by_distance.entry(d).or_insert_with(Vec::new);
nodes_by_distance.get_mut(&d).unwrap().push(*node_id);
}
}
nodes_by_distance.insert(0 as usize, vec![destination]);
let mut distances: Vec<usize> = nodes_by_distance.keys().cloned().collect::<Vec<usize>>();
distances.sort();
// all the paths from a source to the destination;
let mut paths: HashMap<NodeId, Vec<Vec<NodeId>>> = HashMap::new();
paths.insert(destination, vec![vec![]]);
for d in distances {
let nodes: &Vec<NodeId> = nodes_by_distance.get(&d).unwrap();
for node_id in nodes {
let parent_ids = parents.get(node_id).unwrap();
let new_paths = self.retrace_parent_paths(node_id, &parent_ids, &paths);
paths.insert(*node_id, new_paths);
}
}
paths
}