Skip to content

Commit c2a84dc

Browse files
Fix ElidePermutations pass in the presence of PermutationGates (Qiskit#14603) (Qiskit#14622)
* fixing ElidePermutations and adding tests * release notes (cherry picked from commit 96fda18) Co-authored-by: Alexander Ivrii <[email protected]>
1 parent 190bf83 commit c2a84dc

File tree

3 files changed

+28
-9
lines changed

3 files changed

+28
-9
lines changed

crates/accelerate/src/elide_permutations.rs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -58,17 +58,13 @@ fn run(py: Python, dag: &mut DAGCircuit) -> PyResult<Option<(DAGCircuit, Vec<usi
5858
.map(|q| q.index())
5959
.collect();
6060

61-
let remapped_qindices: Vec<usize> = (0..qindices.len())
62-
.map(|i| pattern[i])
63-
.map(|i| qindices[i as usize])
61+
let new_values: Vec<usize> = (0..qindices.len())
62+
.map(|i| mapping[qindices[pattern[i] as usize]])
6463
.collect();
6564

66-
qindices
67-
.iter()
68-
.zip(remapped_qindices.iter())
69-
.for_each(|(old, new)| {
70-
mapping[*old] = *new;
71-
});
65+
for i in 0..qindices.len() {
66+
mapping[qindices[i]] = new_values[i];
67+
}
7268
} else {
7369
unreachable!();
7470
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
fixes:
3+
- |
4+
Fixed a bug in the :class:`.ElidePermutation` transpiler pass, where
5+
the qubit mapping was not updated correctly in the presence of
6+
:class:`.PermutationGate`\s, leading to incorrect circuits and
7+
updates to the pass manager's property set.

test/python/transpiler/test_elide_permutations.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
"""Test ElidePermutations pass"""
1414

15+
import itertools
1516
import unittest
1617

1718
from qiskit.circuit.quantumcircuit import QuantumCircuit
@@ -20,6 +21,7 @@
2021
from qiskit.transpiler.passes.routing import StarPreRouting
2122
from qiskit.circuit.controlflow import IfElseOp
2223
from qiskit.quantum_info import Operator
24+
from qiskit.transpiler.passmanager import PassManager
2325
from qiskit.transpiler.coupling import CouplingMap
2426
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
2527
from test import QiskitTestCase # pylint: disable=wrong-import-order
@@ -377,6 +379,20 @@ def test_unitary_equivalence(self):
377379
res = spm.run(qc)
378380
self.assertTrue(Operator.from_circuit(res).equiv(Operator(qc)))
379381

382+
def test_unitary_equivalence_permutation_gates(self):
383+
"""Test unitary equivalence of the original and transpiled circuits."""
384+
385+
for perm in itertools.permutations([0, 1, 2]):
386+
qc = QuantumCircuit(5)
387+
qc.h(1)
388+
qc.swap(1, 2)
389+
qc.swap(4, 3)
390+
qc.append(PermutationGate(perm), [1, 2, 3])
391+
392+
pm = PassManager([ElidePermutations()])
393+
res = pm.run(qc)
394+
self.assertEqual(Operator.from_circuit(res), (Operator(qc)))
395+
380396
def test_unitary_equivalence_routing_and_basis_translation(self):
381397
"""Test on a larger example that includes routing and basis translation."""
382398

0 commit comments

Comments
 (0)