Skip to content

CollectCliffords pass ignores Rz's #13138

@samanthavbarron

Description

@samanthavbarron

Environment

  • Qiskit version: 1.2.0
  • Python version: 3.12.3
  • Operating system: MacOS

What is happening?

rz gates are ignored by the CollectCliffords pass (regardless of angle), when it could potentially collect them.

How can we reproduce the issue?

from qiskit import QuantumCircuit
from qiskit.transpiler import PassManager
from qiskit.transpiler.passes import CollectCliffords

qc = QuantumCircuit(1)
qc.rz(0, 0)
qc.sx(0)

PassManager([CollectCliffords(min_block_size=1)]).run(qc).draw()

What should happen?

There should be a single instruction in the resulting circuit, however I get

   ┌───────┐┌──────────┐
q: ┤ Rz(0) ├┤ Clifford ├
   └───────┘└──────────┘

Any suggestions?

It seems this function is just looking at _BASIS_1Q which doesn't include rz (and shouldn't, IMO).

Presumably this issue extends to other parameterized gates.

A possible fix would be to instead have an option in CollectCliffords which attempts to cast it as a Clifford. Since this would likely come at a performance hit, it should probably be False by default.

E.g.

def _is_clifford_gate(node, try_harder: bool = False):
    """Specifies whether a node holds a clifford gate."""
    if getattr(node.op, "condition", None) is not None:
        return False
    if node.op.name in clifford_gate_names:
        return True
    
    if not try_harder:
        return False
    
    try:
        Clifford(node.op)
        return True
    except:
        return False

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions