pub fn connected_components(graph: &DependencyGraph) -> usize {
if graph.node_count() == 0 {
return 0;
}
let aprender_graph = to_aprender_graph(graph, false); let labels = aprender_graph.connected_components();
if labels.is_empty() {
return 0;
}
let max_label = labels.iter().copied().max().unwrap_or(0);
max_label + 1
}
pub fn strongly_connected_components(graph: &DependencyGraph) -> Vec<usize> {
if graph.node_count() == 0 {
return Vec::new();
}
let aprender_graph = to_aprender_graph(graph, true);
aprender_graph.strongly_connected_components()
}
pub fn is_cyclic(graph: &DependencyGraph) -> bool {
if graph.node_count() == 0 {
return false;
}
let aprender_graph = to_aprender_graph(graph, true);
aprender_graph.topological_sort().is_none()
}
pub fn shortest_path(
graph: &DependencyGraph,
source: usize,
target: usize,
) -> Option<(Vec<usize>, f64)> {
if graph.node_count() == 0 {
return None;
}
let aprender_graph = to_aprender_graph(graph, true);
aprender_graph.dijkstra(source, target)
}
pub fn betweenness_centrality(graph: &DependencyGraph) -> Vec<f64> {
if graph.node_count() == 0 {
return Vec::new();
}
let aprender_graph = to_aprender_graph(graph, true);
aprender_graph.betweenness_centrality()
}
pub fn louvain_communities(graph: &UndirectedGraph) -> Vec<Vec<usize>> {
if graph.node_count() == 0 {
return Vec::new();
}
let aprender_graph = to_aprender_graph_undirected(graph);
aprender_graph.louvain()
}