-
Notifications
You must be signed in to change notification settings - Fork 2.6k
Closed
Description
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 workingSomething isn't working