diff --git a/crates/accelerate/src/unitary_synthesis.rs b/crates/accelerate/src/unitary_synthesis.rs index 1931f1e97b2b..b5ef66db4f1e 100644 --- a/crates/accelerate/src/unitary_synthesis.rs +++ b/crates/accelerate/src/unitary_synthesis.rs @@ -27,7 +27,7 @@ use smallvec::{smallvec, SmallVec}; use pyo3::intern; use pyo3::prelude::*; -use pyo3::types::{IntoPyDict, PyDict, PyList, PyString}; +use pyo3::types::{IntoPyDict, PyDict, PyString}; use pyo3::wrap_pyfunction; use pyo3::Python; @@ -225,7 +225,7 @@ fn py_run_main_loop( qubit_indices: Vec, min_qubits: usize, target: &Target, - coupling_edges: &Bound<'_, PyList>, + coupling_edges: HashSet<[PhysicalQubit; 2]>, approximation_degree: Option, natural_direction: Option, ) -> PyResult { @@ -268,7 +268,7 @@ fn py_run_main_loop( new_ids, min_qubits, target, - coupling_edges, + coupling_edges.clone(), approximation_degree, natural_direction, )?; @@ -352,7 +352,7 @@ fn py_run_main_loop( py, unitary, ref_qubits, - coupling_edges, + &coupling_edges, target, approximation_degree, natural_direction, @@ -383,7 +383,7 @@ fn run_2q_unitary_synthesis( py: Python, unitary: Array2, ref_qubits: &[PhysicalQubit; 2], - coupling_edges: &Bound<'_, PyList>, + coupling_edges: &HashSet<[PhysicalQubit; 2]>, target: &Target, approximation_degree: Option, natural_direction: Option, @@ -794,7 +794,7 @@ fn preferred_direction( decomposer: &DecomposerElement, ref_qubits: &[PhysicalQubit; 2], natural_direction: Option, - coupling_edges: &Bound<'_, PyList>, + coupling_edges: &HashSet<[PhysicalQubit; 2]>, target: &Target, ) -> PyResult> { // Returns: @@ -830,14 +830,8 @@ fn preferred_direction( Some(false) => None, _ => { // None or Some(true) - let mut edge_set = HashSet::new(); - for item in coupling_edges.iter() { - if let Ok(tuple) = item.extract::<(usize, usize)>() { - edge_set.insert(tuple); - } - } - let zero_one = edge_set.contains(&(qubits[0].0 as usize, qubits[1].0 as usize)); - let one_zero = edge_set.contains(&(qubits[1].0 as usize, qubits[0].0 as usize)); + let zero_one = coupling_edges.contains(&qubits); + let one_zero = coupling_edges.contains(&[qubits[1], qubits[0]]); match (zero_one, one_zero) { (true, false) => Some(true), diff --git a/qiskit/transpiler/passes/synthesis/unitary_synthesis.py b/qiskit/transpiler/passes/synthesis/unitary_synthesis.py index 883dbb6c4d68..cf9acdc890c2 100644 --- a/qiskit/transpiler/passes/synthesis/unitary_synthesis.py +++ b/qiskit/transpiler/passes/synthesis/unitary_synthesis.py @@ -505,7 +505,7 @@ def run(self, dag: DAGCircuit) -> DAGCircuit: if self.method == "default" and isinstance(kwargs["target"], Target): _coupling_edges = ( - list(self._coupling_map.get_edges()) if self._coupling_map is not None else [] + set(self._coupling_map.get_edges()) if self._coupling_map is not None else set() ) out = run_default_main_loop(