spectrum.rs
969 B · rust · 29 lines
1use crate::graphs::Graph;2use faer::{Mat, Side};34pub fn eigenvalues(graph: &Graph, normalised: bool) -> Vec<f64> {5 let n = graph.nodes();6 let mut matrix = Mat::<f64>::zeros(n, n);7 for (node, row) in graph.adjacency.iter().enumerate() {8 let degree = row.len() as f64;9 if normalised {10 matrix[(node, node)] = if degree > 0.0 { 1.0 } else { 0.0 };11 } else {12 matrix[(node, node)] = degree;13 }14 for other in row {15 let weight = if normalised {16 -1.0 / (degree * graph.adjacency[*other as usize].len() as f64).sqrt()17 } else {18 -1.019 };20 matrix[(node, *other as usize)] = weight;21 }22 }23 let mut values = matrix24 .as_ref()25 .self_adjoint_eigenvalues(Side::Lower)26 .expect("the dense eigensolver converges");27 values.sort_by(|a, b| a.partial_cmp(b).expect("finite eigenvalues"));28 values29}