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
Environment
What is happening?
rz
gates are ignored by theCollectCliffords
pass (regardless of angle), when it could potentially collect them.How can we reproduce the issue?
What should happen?
There should be a single instruction in the resulting circuit, however I get
Any suggestions?
It seems this function is just looking at
_BASIS_1Q
which doesn't includerz
(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 aClifford
. Since this would likely come at a performance hit, it should probably beFalse
by default.E.g.