diff --git a/crates/accelerate/src/sabre_swap/layer.rs b/crates/accelerate/src/sabre_swap/layer.rs index b3e5d597b4..5724f41372 100644 --- a/crates/accelerate/src/sabre_swap/layer.rs +++ b/crates/accelerate/src/sabre_swap/layer.rs @@ -11,7 +11,6 @@ // that they have been altered from the originals. use ahash; -use hashbrown::HashMap; use indexmap::IndexMap; use ndarray::prelude::*; use rustworkx_core::petgraph::prelude::*; @@ -149,19 +148,18 @@ impl FrontLayer { } } -/// This is largely similar to the `FrontLayer` struct, but does not need to track the insertion -/// order of the nodes, and can have more than one node on each active qubit. This does not have a -/// `remove` method (and its data structures aren't optimised for fast removal), since the extended -/// set is built from scratch each time a new gate is routed. +/// This is largely similar to the `FrontLayer` struct but can have more than one node on each active +/// qubit. This does not have `remove` method (and its data structures aren't optimised for fast +/// removal), since the extended set is built from scratch each time a new gate is routed. pub struct ExtendedSet { - nodes: HashMap, + nodes: IndexMap, qubits: Vec>, } impl ExtendedSet { pub fn new(num_qubits: usize, max_size: usize) -> Self { ExtendedSet { - nodes: HashMap::with_capacity(max_size), + nodes: IndexMap::with_capacity_and_hasher(max_size, ahash::RandomState::default()), qubits: vec![Vec::new(); num_qubits], } } @@ -212,8 +210,8 @@ impl ExtendedSet { return 0.0; } self.nodes - .iter() - .map(|(_, &[l_a, l_b])| dist[[layout.logic_to_phys[l_a], layout.logic_to_phys[l_b]]]) + .values() + .map(|&[l_a, l_b]| dist[[layout.logic_to_phys[l_a], layout.logic_to_phys[l_b]]]) .sum::() / self.nodes.len() as f64 } diff --git a/crates/accelerate/src/sabre_swap/mod.rs b/crates/accelerate/src/sabre_swap/mod.rs index 19474dcc0a..12c21cbd1c 100644 --- a/crates/accelerate/src/sabre_swap/mod.rs +++ b/crates/accelerate/src/sabre_swap/mod.rs @@ -17,9 +17,8 @@ pub mod neighbor_table; pub mod sabre_dag; pub mod swap_map; -use std::cmp::Ordering; - use hashbrown::HashMap; +use indexmap::IndexMap; use ndarray::prelude::*; use numpy::PyReadonlyArray2; use numpy::{IntoPyArray, PyArray, ToPyArray}; @@ -36,6 +35,7 @@ use rustworkx_core::petgraph::prelude::*; use rustworkx_core::petgraph::visit::EdgeRef; use rustworkx_core::shortest_path::dijkstra; use rustworkx_core::token_swapper::token_swapper; +use std::cmp::Ordering; use crate::getenv_use_multiple_threads; use crate::nlayout::NLayout; @@ -171,7 +171,8 @@ fn populate_extended_set( required_predecessors: &mut [u32], ) { let mut to_visit = front_layer.iter_nodes().copied().collect::>(); - let mut decremented: HashMap = HashMap::new(); + let mut decremented: IndexMap = + IndexMap::with_hasher(ahash::RandomState::default()); let mut i = 0; while i < to_visit.len() && extended_set.len() < EXTENDED_SET_SIZE { for edge in dag.dag.edges_directed(to_visit[i], Direction::Outgoing) {