use crate::{db::api::view::*, prelude::*};
use rayon::prelude::*;
pub fn max_degree<'graph, G: GraphViewOps<'graph>>(graph: &G) -> usize {
graph.nodes().degree().max().unwrap_or(0)
}
pub fn min_degree<'graph, G: GraphViewOps<'graph>>(graph: &'graph G) -> usize {
graph.nodes().degree().min().unwrap_or(0)
}
pub fn max_out_degree<'graph, G: GraphViewOps<'graph>>(graph: &'graph G) -> usize {
graph.nodes().out_degree().max().unwrap_or(0)
}
pub fn max_in_degree<'graph, G: GraphViewOps<'graph>>(graph: &'graph G) -> usize {
graph.nodes().in_degree().max().unwrap_or(0)
}
pub fn min_out_degree<'graph, G: GraphViewOps<'graph>>(graph: &'graph G) -> usize {
graph.nodes().out_degree().min().unwrap_or(0)
}
pub fn min_in_degree<'graph, G: GraphViewOps<'graph>>(graph: &'graph G) -> usize {
graph.nodes().in_degree().min().unwrap_or(0)
}
pub fn average_degree<'graph, G: GraphViewOps<'graph>>(graph: &'graph G) -> f64 {
let (deg_sum, count) = graph
.nodes()
.degree()
.par_iter_values()
.fold_with((0usize, 0usize), |(deg_sum, count), deg| {
(deg_sum + deg, count + 1)
})
.reduce_with(|(deg_sum1, count1), (deg_sum2, count2)| {
(deg_sum1 + deg_sum2, count1 + count2)
})
.unwrap_or((0, 1));
deg_sum as f64 / count as f64
}