diff --git a/src/undirected_graph.rs b/src/undirected_graph.rs index cabcbd643c21f0091989fc44979b9cf0e2586c5d..127a48c31a6f171965c7dddb2d7483712f47bdac 100644 --- a/src/undirected_graph.rs +++ b/src/undirected_graph.rs @@ -1,4 +1,4 @@ -use std::collections::HashMap; +use std::collections::{HashMap, HashSet}; #[derive(Debug, Eq, Hash, PartialEq)] pub struct UndirectedGraph { @@ -285,15 +285,15 @@ impl UndirectedGraph { return diff; } - pub fn contractions(&self, edge_orbit_reps: &Vec<usize>) -> Vec<UndirectedGraph> { - let mut contractions: Vec<UndirectedGraph> = vec![]; + pub fn contractions(&self, edge_orbit_reps: &Vec<usize>) -> HashSet<UndirectedGraph> { + let mut contractions: HashSet<UndirectedGraph> = HashSet::new(); for &edge_orbit_rep in edge_orbit_reps { let edge: (usize, usize) = self.edges[edge_orbit_rep]; // TODO: Optimize the computation of new_edges. let mut new_edges: Vec<(usize, usize)> = self.edges.clone(); // Remove edge. new_edges.remove(edge_orbit_rep); - for (a,b) in new_edges.iter_mut() { + for (a, b) in new_edges.iter_mut() { // Remove vertex edge.1 if *a == edge.1 { *a = edge.0; @@ -313,10 +313,15 @@ impl UndirectedGraph { *b = *b - 1; } } - let mut unique_edges: std::collections::HashSet<(usize,usize)> = std::collections::HashSet::new(); - let has_no_double_edges: bool = new_edges.iter().all(|new_edge| unique_edges.insert(*new_edge)); + let mut unique_edges: HashSet<(usize, usize)> = HashSet::new(); + let has_no_double_edges: bool = new_edges + .iter() + .all(|new_edge| unique_edges.insert(*new_edge)); if has_no_double_edges { - contractions.push(UndirectedGraph::new(self.num_vertices - 1, new_edges)); + let cg: UndirectedGraph = UndirectedGraph::new(self.num_vertices - 1, new_edges); + let (_normal_cg_sign, normal_cg, _normal_cg_orbits) = cg.normal_form(); + // TODO: Also return vertex orbit data. + contractions.insert(normal_cg); } } return contractions;