Source code for bqskit.ir.gates.constant.identity

"""This module implements the IdentityGate."""
from __future__ import annotations

from typing import Sequence

import numpy as np

from bqskit.ir.gates.constantgate import ConstantGate
from bqskit.qis.unitary.unitarymatrix import UnitaryMatrix
from bqskit.utils.typing import is_valid_radixes


[docs] class IdentityGate(ConstantGate): """An Identity (No-OP) Gate."""
[docs] def __init__( self, num_qudits: int = 1, radixes: Sequence[int] = [], ) -> None: """ Create an IdentityGate, defaulting to a single-qubit identity. Args: num_qudits (int): The number of qudits this gate acts on. radixes (Sequence[int]): The number of orthogonal states for each qudit. Defaults to qubits. Raises: ValueError: If `num_qudits` is nonpositive. """ if num_qudits <= 0: raise ValueError('Expected positive integer, got %d' % num_qudits) if len(radixes) != 0 and not is_valid_radixes(radixes, num_qudits): raise TypeError('Invalid radixes.') self._num_qudits = num_qudits self._radixes = tuple(radixes or [2] * num_qudits) self._dim = int(np.prod(self.radixes)) self._utry = UnitaryMatrix.identity(self.dim, self.radixes) self._qasm_name = 'identity%d' % self.num_qudits
[docs] def get_qasm_gate_def(self) -> str: """Return a qasm gate definition block for this gate.""" param_symbols = ['a%d' % i for i in range(self.num_qudits)] param_str = ','.join(param_symbols) header = 'gate identity%d %s' % (self.num_qudits, param_str) body_stmts = ['\tU(0,0,0) %s;' % sym for sym in param_symbols] body = '\n'.join(body_stmts) return f'{header}\n{{\n{body}\n}}\n'
def __eq__(self, other: object) -> bool: return ( isinstance(other, IdentityGate) and self.num_qudits == other.num_qudits and self.radixes == other.radixes ) def __hash__(self) -> int: return hash((self.num_qudits, self.radixes)) def __str__(self) -> str: if self.is_qubit_only(): return f'IdentityGate({self.num_qudits})' else: return f'IdentityGate({self.num_qudits}, {self.radixes})'