mirror of
https://git.proxmox.com/git/rustc
synced 2025-08-16 14:40:37 +00:00
84 lines
2.1 KiB
Rust
84 lines
2.1 KiB
Rust
use petgraph::{algo::page_rank, Graph};
|
|
|
|
#[cfg(feature = "rayon")]
|
|
use petgraph::algo::page_rank::parallel_page_rank;
|
|
|
|
fn graph_example() -> Graph<String, f32> {
|
|
// Taken and adapted from https://github.com/neo4j-labs/graph?tab=readme-ov-file#how-to-run-algorithms
|
|
let mut graph = Graph::<_, f32>::new();
|
|
graph.add_node("A".to_owned());
|
|
graph.add_node("B".to_owned());
|
|
graph.add_node("C".to_owned());
|
|
graph.add_node("D".to_owned());
|
|
graph.add_node("E".to_owned());
|
|
graph.add_node("F".to_owned());
|
|
graph.add_node("G".to_owned());
|
|
graph.add_node("H".to_owned());
|
|
graph.add_node("I".to_owned());
|
|
graph.add_node("J".to_owned());
|
|
graph.add_node("K".to_owned());
|
|
graph.add_node("L".to_owned());
|
|
graph.add_node("M".to_owned());
|
|
graph.extend_with_edges(&[
|
|
(1, 2), // B->C
|
|
(2, 1), // C->B
|
|
(4, 0), // D->A
|
|
(4, 1), // D->B
|
|
(5, 4), // E->D
|
|
(5, 1), // E->B
|
|
(5, 6), // E->F
|
|
(6, 1), // F->B
|
|
(6, 5), // F->E
|
|
(7, 1), // G->B
|
|
(7, 5), // F->E
|
|
(8, 1), // G->B
|
|
(8, 5), // G->E
|
|
(9, 1), // H->B
|
|
(9, 5), // H->E
|
|
(10, 1), // I->B
|
|
(10, 5), // I->E
|
|
(11, 5), // J->B
|
|
(12, 5), // K->B
|
|
]);
|
|
graph
|
|
}
|
|
|
|
fn expected_ranks() -> Vec<f32> {
|
|
vec![
|
|
0.029228685,
|
|
0.38176042,
|
|
0.3410649,
|
|
0.014170233,
|
|
0.035662483,
|
|
0.077429585,
|
|
0.035662483,
|
|
0.014170233,
|
|
0.014170233,
|
|
0.014170233,
|
|
0.014170233,
|
|
0.014170233,
|
|
0.014170233,
|
|
]
|
|
}
|
|
|
|
#[test]
|
|
fn test_page_rank() {
|
|
let graph = graph_example();
|
|
let output_ranks = page_rank(&graph, 0.85_f32, 100);
|
|
assert_eq!(expected_ranks(), output_ranks);
|
|
}
|
|
|
|
#[test]
|
|
#[cfg(feature = "rayon")]
|
|
|
|
fn test_par_page_rank() {
|
|
let graph = graph_example();
|
|
let output_ranks = parallel_page_rank(&graph, 0.85_f32, 100, Some(1e-12));
|
|
assert!(!expected_ranks()
|
|
.iter()
|
|
.zip(output_ranks)
|
|
.any(|(expected, computed)| ((expected - computed).abs() > 1e-6)
|
|
|| computed.is_nan()
|
|
|| expected.is_nan()));
|
|
}
|