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}