graph.rs

2.4 kB · rust · 67 lines

1pub use crate::dim::graph::{core_graph, edge_graph, tunnel_graph};23#[cfg(test)]4mod tests {5    use super::*;6    use crate::two::designs;7    use mrlynum::graph::census;8    #[test]9    fn carpet_graphs() {10        let cell = designs::carpet(3, 1).unwrap();11        let core = core_graph(&cell).unwrap();12        assert_eq!(core.nodes.len(), 8);13        assert_eq!(core.branches.len(), 8);14        assert_eq!(census(&core).components, 1);15        assert_eq!(tunnel_graph(&cell).unwrap().nodes.len(), 1);16        assert!(edge_graph(&cell).unwrap().nodes.len() > 8);17    }18}1920#[cfg(test)]21mod spectra {22    use super::*;23    use crate::two::designs;24    use mrlynum::graph::census;25    use mrlynum::spectrum::{clusters, laplacian_spectrum, multiplicity};2627    #[test]28    fn the_sierpinski_normalised_spectrum_holds_its_degeneracy_table() {29        let root = 30f64.sqrt() / 6.0;30        let rows = [31            (1usize, 3usize, 3usize, 0usize, 0.0000, 1usize, 0usize),32            (2, 9, 7, 1, 0.3333, 3, 1),33            (3, 27, 17, 3, 0.4815, 9, 2),34            (4, 81, 43, 9, 0.5802, 27, 4),35            (5, 243, 111, 25, 0.6461, 81, 10),36            (6, 729, 289, 67, 0.6955, 243, 28),37        ];38        for (level, nodes, distinct, classes, fraction, one, pair) in rows {39            let cell = designs::create(7, 2, level, 0, 2).unwrap();40            let graph = core_graph(&cell).unwrap();41            assert_eq!(graph.nodes.len(), nodes, "l={level}");42            assert_eq!(census(&graph).components, 1, "l={level}");43            let spectrum = laplacian_spectrum(&graph, true).unwrap();44            let groups = clusters(&spectrum, 1e-9);45            let repeated: usize = groups.iter().filter(|g| g.1 > 1).map(|g| g.1).sum();46            assert_eq!(groups.len(), distinct, "l={level}");47            assert_eq!(48                groups.iter().filter(|g| g.1 > 1).count(),49                classes,50                "l={level}"51            );52            let got = (repeated as f64 / nodes as f64 * 10000.0).round() / 10000.0;53            assert!((got - fraction).abs() < 1e-9, "l={level} {got}");54            assert_eq!(multiplicity(&spectrum, 1.0, 1e-12), one, "l={level}");55            assert_eq!(56                multiplicity(&spectrum, 1.0 - root, 1e-12),57                pair,58                "l={level}"59            );60            assert_eq!(61                multiplicity(&spectrum, 1.0 + root, 1e-12),62                pair,63                "l={level}"64            );65        }66    }67}