diff --git a/crates/accelerate/src/sabre_swap/mod.rs b/crates/accelerate/src/sabre_swap/mod.rs index 3bbc631fade..36b1d85bafa 100644 --- a/crates/accelerate/src/sabre_swap/mod.rs +++ b/crates/accelerate/src/sabre_swap/mod.rs @@ -416,8 +416,8 @@ fn swap_map_trial( qubits_decay.fill(1.); num_search_steps = 0; } else { - qubits_decay[best_swap[0].index()] += DECAY_RATE; - qubits_decay[best_swap[1].index()] += DECAY_RATE; + qubits_decay[best_swap[0].to_phys(&layout).index()] += DECAY_RATE; + qubits_decay[best_swap[1].to_phys(&layout).index()] += DECAY_RATE; } } // If we exceeded the number of allowed attempts without successfully routing a node, we @@ -717,7 +717,8 @@ fn choose_best_swap( + EXTENDED_SET_WEIGHT * extended_set.score(swap, layout, dist) } Heuristic::Decay => { - qubits_decay[swap[0].index()].max(qubits_decay[swap[1].index()]) + qubits_decay[swap[0].to_phys(layout).index()] + .max(qubits_decay[swap[1].to_phys(layout).index()]) * (absolute_score + layer.score(swap, layout, dist) + EXTENDED_SET_WEIGHT * extended_set.score(swap, layout, dist)) diff --git a/releasenotes/notes/sabre-decay-physical-ad2f470cd45d69f3.yaml b/releasenotes/notes/sabre-decay-physical-ad2f470cd45d69f3.yaml new file mode 100644 index 00000000000..8d647d5b13d --- /dev/null +++ b/releasenotes/notes/sabre-decay-physical-ad2f470cd45d69f3.yaml @@ -0,0 +1,6 @@ +--- +fixes: + - | + The ``"decay"`` heuristic of :class:`.SabreSwap` and :class:`.SabreLayout` now tracks the depth + correctly on physical qubits rather than mistakenly tracking the "depth" of swaps on virtual + qubits. diff --git a/test/python/transpiler/test_sabre_layout.py b/test/python/transpiler/test_sabre_layout.py index 2c41de46df0..ff9788521c1 100644 --- a/test/python/transpiler/test_sabre_layout.py +++ b/test/python/transpiler/test_sabre_layout.py @@ -60,7 +60,7 @@ def test_5q_circuit_20q_coupling(self): pass_.run(dag) layout = pass_.property_set["layout"] - self.assertEqual([layout[q] for q in circuit.qubits], [11, 10, 16, 5, 17]) + self.assertEqual([layout[q] for q in circuit.qubits], [16, 7, 11, 12, 13]) def test_6q_circuit_20q_coupling(self): """Test finds layout for 6q circuit on 20q device."""