icentral_largest_bcc/
lbcc.rs

1crate::ix!();
2
3pub struct LargestBiconnectedComponents<'g,'v,GH> 
4where GH: BccGraphHashInterface
5{
6    graph: &'g Graph<GH>,
7
8    bcc_vec: &'v Vec<GH>,
9
10    /// index of the lbcc, # of nodes
11    lbcc_i: usize,
12
13    /// index of the lbcc, # of edges
14    lbcc_j: usize,
15
16    /// highest # of nodes
17    lbcc_n: usize,
18
19    /// highest # of edges
20    lbcc_m: usize,
21}
22
23impl<'g,'v,GH> fmt::Debug for LargestBiconnectedComponents<'g,'v,GH> 
24where GH: BccGraphHashInterface
25{
26    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
27
28        let binding     = f.debug_struct("LargestBiconnectedComponents");
29
30        let mut builder = binding;
31
32        if self.lbcc_i != self.lbcc_j {
33            builder.field("warning", &"LargestBiconnectedComponents_m is not LargestBiconnectedComponents_n!");
34        }
35
36        builder.field("num_nodes:   {}", &self.num_nodes());
37        builder.field("num_edges:   {}", &self.num_edges());
38        builder.field("frac_nodes:  {}", &self.frac_nodes());
39        builder.field("frac_edges:  {}", &self.frac_edges());
40
41        builder.finish()
42    }
43}
44
45impl<'g,'v,GH> NumNodes for LargestBiconnectedComponents<'g,'v,GH> 
46where GH: BccGraphHashInterface
47{
48    fn num_nodes(&self) -> usize {
49        self.lbcc_n
50    }
51}
52
53impl<'g,'v,GH> NumEdges for LargestBiconnectedComponents<'g,'v,GH> 
54where GH: BccGraphHashInterface
55{
56
57    fn num_edges(&self) -> usize {
58        self.bcc_vec[self.lbcc_i as usize].num_edges()
59    }
60}
61
62impl<'g,'v,GH> LargestBiconnectedComponents<'g,'v,GH> 
63where GH: BccGraphHashInterface
64{
65    pub fn new(bcc_vec: &'v Vec<GH>, graph: &'g Graph<GH>) -> Self {
66
67        let mut lbcc_i: usize = 0; // index of the lbcc, # of nodes
68        let mut lbcc_j: usize = 0; // index of the lbcc, # of edges
69        let mut lbcc_n: usize = 0; // highest # of nodes
70        let mut lbcc_m: usize = 0; // highest # of edges
71
72        if bcc_vec.len() > 1 {
73
74            for i in 0..bcc_vec.len() {
75
76                if bcc_vec[i].num_nodes() > lbcc_n {
77
78                    lbcc_n = bcc_vec[i].num_nodes();
79
80                    lbcc_i = i;
81                }
82
83                if bcc_vec[i].num_edges() > lbcc_m {
84
85                    lbcc_m = bcc_vec[i].num_edges();
86
87                    lbcc_j = i;
88                }
89            }
90        }
91
92        Self {
93            graph,
94            bcc_vec,
95            lbcc_i,
96            lbcc_j,
97            lbcc_n,
98            lbcc_m,
99        }
100    }
101
102    pub fn frac_nodes(&self) -> f64 {
103        self.num_nodes() as f64 / self.graph.num_nodes() as f64
104    }
105
106    pub fn frac_edges(&self) -> f64 {
107        self.num_edges() as f64 / self.graph.num_edges() as f64
108    }
109}
110
111/**
112  | finds the fraction of nodes and edges
113  | in the largest bcc, largest bcc in terms
114  | of number of nodes
115  |
116  */
117pub fn lbcc_stat<GH>(graph: &mut Graph<GH>) 
118-> Result<(),BetweennessCentralityError>  
119where GH: BccGraphHashInterface 
120{
121    graph.print_header();
122
123    let mut bcc_vec: Vec<GH> = vec![];
124
125    graph.find_bicon_component(&mut bcc_vec);
126
127    let stat = LargestBiconnectedComponents::new(&bcc_vec,&graph);
128
129    debug!("{:#?}", stat);
130
131    Ok(())
132}