Source code for tket_exts.tket.quantum

"""Quantum extension operations."""

import functools

from hugr.ext import Extension, OpDef, TypeDef
from hugr.ops import ExtOp
from hugr.tys import StringArg

from ._util import TketExtension, load_extension


[docs] class QuantumExtension(TketExtension): """TKET's standard quantum operations."""
[docs] @functools.cache def __call__(self) -> Extension: """Returns the quantum extension""" return load_extension("tket.quantum")
[docs] def TYPES(self) -> list[TypeDef]: """Return the types defined by this extension""" return []
[docs] def OPS(self) -> list[OpDef]: """Return the operations defined by this extension""" return [ self.CRz.op_def(), self.CX.op_def(), self.CY.op_def(), self.CZ.op_def(), self.H.op_def(), self.measure.op_def(), self.measure_free.op_def(), self.qAlloc.op_def(), self.qFree.op_def(), self.reset.op_def(), self.Rx.op_def(), self.Ry.op_def(), self.Rz.op_def(), self.S.op_def(), self.Sdg.op_def(), self.T.op_def(), self.Tdg.op_def(), self.toffoli.op_def(), self.try_QAlloc.op_def(), self.V.op_def(), self.Vdg.op_def(), self.X.op_def(), self.Y.op_def(), self.Z.op_def(), self.symbolic_angle_def, ]
@functools.cached_property def CRz(self) -> ExtOp: """Controlled Rz rotation with angle parameter.""" return self().get_op("CRz").instantiate() @functools.cached_property def CX(self) -> ExtOp: """Controlled-X (CNOT).""" return self().get_op("CX").instantiate() @functools.cached_property def CY(self) -> ExtOp: """Controlled-Y.""" return self().get_op("CY").instantiate() @functools.cached_property def CZ(self) -> ExtOp: """Controlled-Z.""" return self().get_op("CZ").instantiate() @functools.cached_property def H(self) -> ExtOp: """Hadamard.""" return self().get_op("H").instantiate() @functools.cached_property def measure(self) -> ExtOp: """Measure a qubit producing a classical result (and keep the qubit).""" return self().get_op("Measure").instantiate() @functools.cached_property def measure_free(self) -> ExtOp: """Measure a qubit producing an opaque bool (qubit consumed).""" return self().get_op("MeasureFree").instantiate() @functools.cached_property def qAlloc(self) -> ExtOp: """Allocate a new qubit in |0>.""" return self().get_op("QAlloc").instantiate() @functools.cached_property def qFree(self) -> ExtOp: """Free a qubit (lose track).""" return self().get_op("QFree").instantiate() @functools.cached_property def reset(self) -> ExtOp: """Reset a qubit to |0>.""" return self().get_op("Reset").instantiate() @functools.cached_property def Rx(self) -> ExtOp: """Rotate around X by a rotation parameter.""" return self().get_op("Rx").instantiate() @functools.cached_property def Ry(self) -> ExtOp: """Rotate around Y by a rotation parameter.""" return self().get_op("Ry").instantiate() @functools.cached_property def Rz(self) -> ExtOp: """Rotate around Z by a rotation parameter.""" return self().get_op("Rz").instantiate() @functools.cached_property def S(self) -> ExtOp: """S phase gate (pi/2 around Z).""" return self().get_op("S").instantiate() @functools.cached_property def Sdg(self) -> ExtOp: """S dagger gate (-pi/2 around Z).""" return self().get_op("Sdg").instantiate() @functools.cached_property def T(self) -> ExtOp: """T phase gate (pi/4 around Z).""" return self().get_op("T").instantiate() @functools.cached_property def Tdg(self) -> ExtOp: """T dagger gate (-pi/4 around Z).""" return self().get_op("Tdg").instantiate() @functools.cached_property def toffoli(self) -> ExtOp: """Toffoli (CCX).""" return self().get_op("Toffoli").instantiate() @functools.cached_property def try_QAlloc(self) -> ExtOp: """Try allocate a qubit, returning None on failure.""" return self().get_op("TryQAlloc").instantiate() @functools.cached_property def V(self) -> ExtOp: """V gate (sqrt(X)).""" return self().get_op("V").instantiate() @functools.cached_property def Vdg(self) -> ExtOp: """V dagger gate (sqrt(X))^-1.""" return self().get_op("Vdg").instantiate() @functools.cached_property def X(self) -> ExtOp: """Pauli-X.""" return self().get_op("X").instantiate() @functools.cached_property def Y(self) -> ExtOp: """Pauli-Y.""" return self().get_op("Y").instantiate() @functools.cached_property def Z(self) -> ExtOp: """Pauli-Z.""" return self().get_op("Z").instantiate() @functools.cached_property def symbolic_angle_def(self) -> OpDef: """Store a sympy expression evaluable to a rotation angle. This is the generic operation definition. For the instantiated operation, see `symbolic_angle`. """ return self().get_op("symbolic_angle")
[docs] def symbolic_angle(self, expr: str) -> ExtOp: """Store a sympy expression evaluable to a rotation angle. Args: expr: A sympy expression as a string. """ return self.symbolic_angle_def.instantiate([StringArg(expr)])