icentral-graph 0.1.0

A Rust library for advanced graph manipulation, focusing on minimum union cycles, betweenness centrality, and biconnected components.
Documentation
crate::ix!();

impl<GH> BuildGraphHashMappingForConnVertex<GH> for Graph<GH> 
where GH: InsertNode + InsertEdge + CreateNamedEmpty
{
    fn build_graphhash_mapping_for_conn_vertex_step(
        &self, 
        gh:         &mut GH,
        bfs_source: NodeId,
        conn_vert:  NodeId,
        item:       (NodeId, &Vec<NodeId>),
        muc_id:     MinimumUnionCycleId) 
    -> Result<(),BetweennessCentralityError> 
    {
        let visit_markers_name = name![self.name(), "build_graphhash_mapping_for_conn_vertex_step::visit_markers"];

        let mut visit_markers = VisitMarkers::new(
            self.num_nodes(), 
            visit_markers_name
        );

        visit_markers.visit(bfs_source);
        visit_markers.visit(conn_vert);

        let queue_name = name![
            self.name(),
            "build_graphhash_mapping_for_conn_vertex_step::queue"
        ];

        let mut queue = NodeIdQueue::empty(queue_name);

        queue.enqueue(bfs_source);

        while let Some(node) = queue.dequeue() {

            gh.insert_node(node);

            let nbrs = self.neighbors(node);

            for &bfs_nbr in nbrs.iter() {

                if visit_markers.unvisited(bfs_nbr) {

                    queue.enqueue(bfs_nbr);

                    visit_markers.visit(bfs_nbr);

                    if bfs_nbr != conn_vert {
                        gh.insert_edge(&Edge::new(node, bfs_nbr));
                    }
                }
            }
        }

        Ok(())
    }

    fn build_graphhash_mapping_for_conn_vertex(
        &self, 
        item:   (NodeId, &Vec<NodeId>),
        muc_id: MinimumUnionCycleId) 
    -> Result<(NodeId, Arc<GH>),BetweennessCentralityError> 
    {
        let conn_vert: NodeId = item.0;

        let gh_name = name![
            self.name(), 
            "build_graphhash_mapping_for_conn_vertex::gh"
        ];

        let mut gh: GH = GH::empty(gh_name);

        for &bfs_source in item.1.iter() {

            self.build_graphhash_mapping_for_conn_vertex_step(
                &mut gh, 
                bfs_source,
                conn_vert,
                item, 
                muc_id
            )?;
        }

        Ok((conn_vert,Arc::new(gh)))
    }
}