Source code for mqt.qudits.quantum_circuit.gates.gellmann
# Copyright (c) 2023 - 2025 Chair for Design Automation, TUM
# Copyright (c) 2025 Munich Quantum Software Company GmbH
# All rights reserved.
#
# SPDX-License-Identifier: MIT
#
# Licensed under the MIT License
from __future__ import annotations
from typing import TYPE_CHECKING, cast
import numpy as np
from ..components.extensions.gate_types import GateTypes
from ..gate import Gate
if TYPE_CHECKING:
from numpy.typing import NDArray
from ..circuit import QuantumCircuit
from ..components.extensions.controls import ControlData
from ..gate import Parameter
[docs]
class GellMann(Gate):
"""Gate used as generator for Givens rotations."""
def __init__(
self,
circuit: QuantumCircuit,
name: str,
target_qudits: int,
parameters: list[int | str],
dimensions: int,
controls: ControlData | None = None,
) -> None:
assert self.validate_parameter(parameters), "Invalid parameters"
super().__init__(
circuit=circuit,
name=name,
gate_type=GateTypes.SINGLE,
target_qudits=target_qudits,
dimensions=dimensions,
control_set=controls,
qasm_tag="gell",
lev_a=cast("int", parameters[0]),
lev_b=cast("int", parameters[1]),
params=parameters,
)
self.type_m = cast("str", parameters[2])
[docs]
def __array__(self) -> NDArray[np.complex128]: # noqa: PLW3201
d = self._dimensions
assert isinstance(d, int)
matrix = np.zeros((d, d), dtype=np.complex128)
if self.type_m == "s":
matrix[self.lev_a, self.lev_b] = 1
matrix[self.lev_b, self.lev_a] = 1
elif self.type_m == "a":
matrix[self.lev_a, self.lev_b] -= 1j
matrix[self.lev_b, self.lev_a] += 1j
else:
m = np.zeros((d, d), dtype=np.complex128)
for j_ind in range(self.lev_b):
m[j_ind, j_ind] += 1
m[self.lev_b, self.lev_b] -= self.lev_b
coeff = np.sqrt(2 / (self.lev_b * (self.lev_b + 1)))
m = coeff * m
matrix = m
return matrix
[docs]
@staticmethod
def validate_parameter(parameter: Parameter) -> bool:
if parameter is None:
return False
if isinstance(parameter, list):
parameter = cast("list[int | str]", parameter)
assert isinstance(parameter[0], int)
assert isinstance(parameter[1], int)
assert isinstance(parameter[2], str)
assert 0 <= parameter[0] < parameter[1], (
f"lev_a and lev_b are out of range or in wrong order: {parameter[0]}, {parameter[1]}"
)
assert isinstance(parameter[2], str), "type parameter should be a string"
return True
if isinstance(parameter, np.ndarray):
# Add validation for numpy array if needed
return False
return False