diff --git a/src/main.rs b/src/main.rs index 0c29340bc5cb4e02ef59e238276150979bdb3581..63812cbf162e9d750fb642b3b26487ea140b422a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,8 +6,9 @@ fn main() { println!("g = {:?}", g); println!("g.to_nauty() = {:?}", g.to_nauty()); println!("UndirectedGraph::from_nauty(&g.to_nauty()) = {:?}", UndirectedGraph::from_nauty(&g.to_nauty())); - println!("g.normal_form() = {:?}", g.normal_form()); - println!("g.expanding_differential() = {:?}", g.expanding_differential()); + let (_sign, normal_g, orbits) = g.normal_form(); + println!("normal_g = {:?}", normal_g); + println!("normal_g.expanding_differential(orbits) = {:?}", normal_g.expanding_differential(&orbits)); let triangle: UndirectedGraph = UndirectedGraph::new(3, vec![(0,1), (1,2), (0,2)]); println!("triangle.normal_form() = {:?}", triangle.normal_form()); } diff --git a/src/undirected_graph.rs b/src/undirected_graph.rs index 2ad9e1d751eb6aa6349965f2768f84ad1204529d..ce72850c8de2c3c3c1fad766b10422e58f7f0ae9 100644 --- a/src/undirected_graph.rs +++ b/src/undirected_graph.rs @@ -257,32 +257,30 @@ impl UndirectedGraph { return expansion; } - pub fn expanding_differential(&self) -> HashMap<UndirectedGraph, i64> { + pub fn expanding_differential( + &self, + orbits: &HashMap<usize, usize>, + ) -> HashMap<UndirectedGraph, i64> { let mut diff: HashMap<UndirectedGraph, i64> = HashMap::new(); - // TODO: Move this normal form computation out to avoid redundant re-computation. - let (sign, normal_self, orbits) = self.normal_form(); - - if sign != 0 { - for (orbit_rep, orbit_size) in orbits { - for (c, dg) in normal_self.expand_vertex(&orbit_rep) { - // TODO: Avoid computing orbits when not used. - let (normal_dg_sign, normal_dg, _normal_dg_orbits) = dg.normal_form(); - if normal_dg_sign == 0 { - continue; - } - // TODO: Fix coefficient types. - let normal_dg_coeff: i64 = - (normal_dg_sign as i64) * (sign as i64) * (orbit_size as i64) * (c as i64); - if let Some(diff_coeff) = diff.get_mut(&normal_dg) { - *diff_coeff += normal_dg_coeff; - } else { - diff.insert(normal_dg, normal_dg_coeff); - } + for (&orbit_rep, &orbit_size) in orbits { + for (c, dg) in self.expand_vertex(&orbit_rep) { + // TODO: Avoid computing orbits when not used. + let (normal_dg_sign, normal_dg, _normal_dg_orbits) = dg.normal_form(); + if normal_dg_sign == 0 { + continue; + } + // TODO: Fix coefficient types. + let normal_dg_coeff: i64 = + (normal_dg_sign as i64) * (orbit_size as i64) * (c as i64); + if let Some(diff_coeff) = diff.get_mut(&normal_dg) { + *diff_coeff += normal_dg_coeff; + } else { + diff.insert(normal_dg, normal_dg_coeff); } } - diff.retain(|_dg, dg_coeff| *dg_coeff != 0); } + diff.retain(|_dg, dg_coeff| *dg_coeff != 0); return diff; }