qiskit icon indicating copy to clipboard operation
qiskit copied to clipboard

`CommutativeInverseCancellation` raises `AttributeError` when combined with `CollectCliffords` on circuits containing specific gates

Open YaegakiY opened this issue 6 months ago • 0 comments

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, or
  • CommutativeInverseCancellation() 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)

YaegakiY avatar Jun 19 '25 12:06 YaegakiY