Skip to content

Incorrect Optimization of Swap and Measure Instructions #11195

@p51lee

Description

@p51lee

Environment

  • Qiskit Terra version: 0.45.0
  • Python version: 3.10.9
  • Operating system: MacOS 13.5 Ventura

What is happening?

Hello, The qiskit.transpile function at optimization_level=3 incorrectly optimizes circuits involving swap and measure instructions. This leads to incorrect possible outcomes when the circuit is executed.

How can we reproduce the issue?

The issue can be replicated using the following Python code:

import qiskit
from qiskit import QuantumCircuit, transpile, Aer

bug_qasm = """OPENQASM 2.0;
include "qelib1.inc";
qreg q[3];
creg c[3];
z q[0];
sx q[0];
swap q[0],q[1];
measure q[1] -> c[2];
measure q -> c;
"""

simulator = Aer.get_backend("aer_simulator")
circ = QuantumCircuit.from_qasm_str(bug_qasm)
original = transpile(circ, backend=simulator, optimization_level=0)
optimized = transpile(circ, backend=simulator, optimization_level=3)

orig_count = simulator.run(original, shots=100000).result().get_counts()
trans_count = simulator.run(optimized, shots=100000).result().get_counts()

keys = set(orig_count.keys()).union(trans_count.keys())

for k in sorted(list(keys)):
    print(f"{k}: {orig_count.get(k, 0):>5} {trans_count.get(k, 0):>5}")

The possible outcomes differ between the original and optimized circuits:

000: 50006 49660
010: 49994     0
100:     0 50340

What should happen?

The optimized circuit should yield only 000 and 010 outcomes, consistent with the original circuit.

Any suggestions?

The potential source of the bug could be in
qiskit/transpiler/passes/optimization/optimize_swap_before_measure

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions