use aprender::graph::{Graph, GraphCentrality};
use proptest::prelude::*;
proptest! {
#[test]
fn prop_probability_distribution(
n in 3usize..10
) {
let edges: Vec<(usize, usize)> = (0..n).map(|i| (i, (i + 1) % n)).collect();
let g = Graph::from_edges(&edges, true);
let ranks = g.pagerank(0.85, 100, 1e-8).expect("pagerank succeeds");
let sum: f64 = ranks.iter().sum();
prop_assert!(
(sum - 1.0).abs() < 1e-4,
"sum(ranks)={sum}, expected ~1.0"
);
}
#[test]
fn prop_scores_non_negative(
n in 3usize..10
) {
let edges: Vec<(usize, usize)> = (0..n).map(|i| (i, (i + 1) % n)).collect();
let g = Graph::from_edges(&edges, true);
let ranks = g.pagerank(0.85, 100, 1e-8).expect("pagerank succeeds");
for (i, &r) in ranks.iter().enumerate() {
prop_assert!(
r >= 0.0,
"rank[{i}]={r}, expected >= 0"
);
}
}
#[test]
fn prop_normalization_preserved(
iters in 1usize..50
) {
let g = Graph::from_edges(&[(0, 1), (1, 2), (2, 0), (0, 2)], true);
let ranks = g.pagerank(0.85, iters, 1e-12).expect("pagerank succeeds");
let sum: f64 = ranks.iter().sum();
prop_assert!(
(sum - 1.0).abs() < 0.01,
"sum(ranks)={sum} after {iters} iterations, expected ~1.0"
);
}
#[test]
fn prop_single_node(_dummy in 0..1i32) {
let g = Graph::from_edges(&[(0, 0)], true);
let ranks = g.pagerank(0.85, 100, 1e-8).expect("pagerank succeeds");
prop_assert_eq!(ranks.len(), 1);
prop_assert!(
(ranks[0] - 1.0).abs() < 1e-6,
"single node rank={}, expected 1.0", ranks[0]
);
}
#[test]
#[ignore = "SIMD equivalence — trueno domain"]
fn prop_simd_equivalence(
_x in proptest::collection::vec(-10.0f32..10.0, 1..32usize)
) {
}
}