Source code for mimiqcircuits.decomposition.rules.to_z_rotation
#
# Copyright © 2022-2024 University of Strasbourg. All Rights Reserved.
# Copyright © 2023-2025 QPerfect. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
"""Rewrite rule for converting X and Y rotations to Z rotations."""
from __future__ import annotations
from typing import TYPE_CHECKING, Sequence
from mimiqcircuits.decomposition.abstract import DecompositionError, RewriteRule
if TYPE_CHECKING:
from mimiqcircuits import Circuit, Operation
[docs]
class ToZRotationRewrite(RewriteRule):
"""Rewrite rule that converts RX and RY rotations to RZ + Clifford gates.
This is useful for gate sets where only Z-rotations are available as
the parametric rotation (e.g., some hardware native gate sets).
Transformations:
- ``RX(theta)`` -> ``H * RZ(theta) * H``
- ``RY(theta)`` -> ``Sdg * H * RZ(theta) * H * S``
Example:
>>> from mimiqcircuits import GateRX, GateRY
>>> from mimiqcircuits.decomposition import ToZRotationRewrite
>>> from symengine import pi
>>> rule = ToZRotationRewrite()
>>> circ = rule.decompose_step(GateRX(pi/3), [0], [], [])
"""
[docs]
def matches(self, op: Operation) -> bool:
"""Check if this rule can decompose the operation.
Args:
op: The operation to check.
Returns:
True for GateRX and GateRY operations.
"""
import mimiqcircuits as mc
return isinstance(op, (mc.GateRX, mc.GateRY))
[docs]
def decompose_step(
self,
op: Operation,
qubits: Sequence[int],
bits: Sequence[int],
zvars: Sequence[int],
) -> Circuit:
"""Convert RX or RY to RZ + Clifford gates.
Args:
op: The rotation operation (GateRX or GateRY).
qubits: Qubit indices for the operation.
bits: Classical bit indices (unused).
zvars: Z-variable indices (unused).
Returns:
A Circuit containing the decomposed instructions.
Raises:
DecompositionError: If the operation is not supported.
"""
import mimiqcircuits as mc
if not self.matches(op):
raise DecompositionError(
f"ToZRotationRewrite cannot decompose {type(op).__name__}"
)
circ = mc.Circuit()
q = qubits[0]
if isinstance(op, mc.GateRX):
# RX(theta) = H * RZ(theta) * H
circ.push(mc.GateH(), q)
circ.push(mc.GateRZ(op.theta), q)
circ.push(mc.GateH(), q)
elif isinstance(op, mc.GateRY):
# RY(theta) = Sdg * H * RZ(theta) * H * S
circ.push(mc.GateSDG(), q)
circ.push(mc.GateH(), q)
circ.push(mc.GateRZ(op.theta), q)
circ.push(mc.GateH(), q)
circ.push(mc.GateS(), q)
return circ
__all__ = ["ToZRotationRewrite"]