//! Eigenvector centrality via power iteration on the adjacency matrix.
usecrate::error::{GraphalgError, GraphalgResult};usecrate::repr::adjacency_list::AdjacencyList;pubfneigenvector_centrality(g:&AdjacencyList,
max_iter:usize,
tol:f64,
)->GraphalgResult<Vec<f64>>{let n = g.n;if n ==0{returnOk(Vec::new());}letmut x =vec![1.0f64/(n asf64).sqrt(); n];letmut y =vec![0.0f64; n];for_in0..max_iter {for v in y.iter_mut(){*v =0.0;}for u in0..n {let xu = x[u];for&v in g.neighbors(u)?{
y[v]+= xu;}}let norm = y.iter().map(|v|v * v).sum::<f64>().sqrt();if norm < 1e-300{returnErr(GraphalgError::NumericalInstability("zero eigenvector during power iteration".to_string(),));}letmut diff =0.0f64;for i in0..n {let nv = y[i]/ norm;
diff +=(nv - x[i]).abs();
x[i]= nv;}if diff < tol {returnOk(x);}}Ok(x)}#[cfg(test)]modtests{usesuper::*;#[test]fneigen_star_center_largest(){// Center of a star has largest eigenvector centrality.
letmut g =AdjacencyList::new(4);for v in1..4{
g.add_undirected_edge(0, v).expect("ok");}let c =eigenvector_centrality(&g,200, 1e-10).expect("ok");assert!(c[0]> c[1]);assert!(c[0]> c[2]);}}