qiskit
qiskit copied to clipboard
`CommutativeInverseCancellation` raises `AttributeError` when combined with `CollectCliffords` on circuits containing specific gates
Environment
- Qiskit version: 2.1.0
- Python version: Python 3.13.2
- Operating system: Ubuntu 20.04.6 LTS
What is happening?
When using PassManager([CollectCliffords(), CommutativeInverseCancellation()]) on a circuit that contains an iswap gate and 'h' gate, the following error is raised:
AttributeError: 'Clifford' object has no attribute 'is_parameterized'
This error does not occur if:
CollectCliffords()is removed, orCommutativeInverseCancellation()is removed.
Furthermore, a more complex circuit containing conditional control-flow (if_test) runs without error, even when using the same two passes together.
How can we reproduce the issue?
To Reproduce:
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister, transpile
from qiskit_aer import Aer
from qiskit.transpiler.passes import *
from qiskit.transpiler import PassManager
import numpy as np
qreg = QuantumRegister(4)
creg = ClassicalRegister(4)
qc = QuantumCircuit(qreg, creg)
qc.iswap(3, 1)
qc.h(1)
qc.measure(qreg[0], creg[0])
qc.measure(qreg[1], creg[1])
qc.measure(qreg[2], creg[2])
qc.measure(qreg[3], creg[3])
simulator = Aer.get_backend("aer_simulator")
p = PassManager([CollectCliffords(), CommutativeInverseCancellation()])
qc = p.run(qc)
compiled_circuit = transpile(qc, backend=simulator)
job = simulator.run(compiled_circuit, shots=500)
result = job.result().get_counts()
print(result)
What should happen?
The circuit should transpile and execute successfully.
Any suggestions?
The following modified version runs without error:
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister, transpile
from qiskit_aer import Aer
from qiskit.transpiler.passes import *
from qiskit.transpiler import PassManager
import numpy as np
qreg = QuantumRegister(4)
creg = ClassicalRegister(4)
qc = QuantumCircuit(qreg, creg)
qc.iswap(3, 1)
qr = QuantumRegister(2)
cr = ClassicalRegister(2)
qc.add_register(qr)
qc.add_register(cr)
qc.measure(qr[0], cr[0])
qc.measure(qr[1], cr[1])
with qc.if_test((cr, 0b00)):
qc.cx(3, 1)
qc.h(1)
qc.measure(qreg[0], creg[0])
qc.measure(qreg[1], creg[1])
qc.measure(qreg[2], creg[2])
qc.measure(qreg[3], creg[3])
simulator = Aer.get_backend("aer_simulator")
p = PassManager([CollectCliffords(), CommutativeInverseCancellation()])
qc = p.run(qc)
compiled_circuit = transpile(qc, backend=simulator)
job = simulator.run(compiled_circuit, shots=500)
result = job.result().get_counts()
print(result)