Skip to content

Commit

Permalink
Bug fix in ElidePermutations (#13186) (#13191)
Browse files Browse the repository at this point in the history
* elide permutations fix

* extending the test to check the final permutation

(cherry picked from commit adf55e1)

Co-authored-by: Alexander Ivrii <[email protected]>
  • Loading branch information
mergify[bot] and alexanderivrii authored Sep 19, 2024
1 parent 48a961e commit ed53512
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 2 deletions.
4 changes: 2 additions & 2 deletions qiskit/transpiler/passes/optimization/elide_permutations.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,8 +96,8 @@ def _apply_mapping(qargs):
elif isinstance(node.op, PermutationGate):
starting_indices = [qubit_mapping[dag.find_bit(qarg).index] for qarg in node.qargs]
pattern = node.op.params[0]
pattern_indices = [qubit_mapping[idx] for idx in pattern]
for i, j in zip(starting_indices, pattern_indices):
updated_indices = [starting_indices[idx] for idx in pattern]
for i, j in zip(starting_indices, updated_indices):
qubit_mapping[i] = j
input_qubit_mapping = {qubit: index for index, qubit in enumerate(dag.qubits)}
self.property_set["original_layout"] = Layout(input_qubit_mapping)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
fixes:
- |
Fixed a bug in the transpiler pass :class:`~.ElidePermutations` where the
qubit mapping was not updated correctly in the presence of :class:`.PermutationGate`\s.
31 changes: 31 additions & 0 deletions test/python/transpiler/test_elide_permutations.py
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,37 @@ def test_permutation_in_middle(self):
res = self.swap_pass(qc)
self.assertEqual(res, expected)

def test_partial_permutation_in_middle(self):
"""Test with a permutation gate in the middle of a circuit,
with the permutation gate defined only on a subset of qubits.
"""
qc = QuantumCircuit(5)
qc.cx(0, 1)
qc.append(PermutationGate([1, 2, 0]), [0, 2, 4])
qc.cx(2, 3)

# The permutation corresponding to the permutation gate maps
# 2 -> 0, 4 -> 2, 0 -> 4, and 1 -> 1, 3 -> 3.
# Instead of the permutation gate, we can relabel the qubits
# 0 -> 2, 1 -> 1, 2 -> 4, 3 -> 3, 4 -> 2.
# Hence cx(2, 3) becomes cx(4, 3).
expected = QuantumCircuit(5)
expected.cx(0, 1)
expected.cx(4, 3)

pass_ = ElidePermutations()
res = pass_(qc)

# Make sure that the pass removes the permutation gate and remaps
# the following gate
self.assertEqual(res, expected)

# Make sure that the transpiled circuit *with* the final permutation
# is equivalent to the original circuit
perm = pass_.property_set["virtual_permutation_layout"].to_permutation(qc.qubits)
res.append(PermutationGate(perm), [0, 1, 2, 3, 4])
self.assertEqual(Operator(res), Operator(qc))

def test_permutation_at_beginning(self):
"""Test permutation in beginning of bell is elided."""
qc = QuantumCircuit(3, 3)
Expand Down

0 comments on commit ed53512

Please sign in to comment.