Source code for guppyft.std._measurement
from collections.abc import Callable, Sequence
from typing import Generic, no_type_check
import hugr.tys as ht
from guppylang import guppy
from guppylang.std.builtins import array
from guppylang_internals.compiler.core import CompilerContext
from guppylang_internals.decorator import custom_type, hugr_op
from guppylang_internals.tys.arg import Argument
from guppylang_internals.tys.common import ToHugrContext
from guppylang_internals.tys.param import ConstParam
from guppylang_internals.tys.subst import Inst
from guppylang_internals.tys.ty import NumericType
from hugr.ext import OpDef, TypeDef
from hugr.ops import DataflowOp, ExtOp
from guppyft.extensions import std_ops, std_types
def _instantiator_for_ty(
ty_def: TypeDef,
) -> Callable[[Sequence[Argument], CompilerContext], ht.Type]:
def ty(args: Sequence[Argument], ctx: ToHugrContext) -> ht.Type:
return ht.ExtType(ty_def, [arg.to_hugr(ctx) for arg in args])
return ty
def _instantiator_for_op(
op_def: OpDef,
) -> Callable[[ht.FunctionType, Inst, ToHugrContext], DataflowOp]:
def op(ty: ht.FunctionType, inst: Inst, ctx: ToHugrContext) -> DataflowOp:
return ExtOp(op_def, ty, [arg.to_hugr(ctx) for arg in inst])
return op
N = guppy.nat_var("N")
[docs]
@custom_type(
_instantiator_for_ty(std_types.logical_measurement_def),
copyable=True,
droppable=True,
params=[ConstParam(1, "k", NumericType(NumericType.Kind.Nat))],
)
class LogicalMeasurement(Generic[N]): # type: ignore[misc]
[docs]
@guppy
@no_type_check
def decode(self: "LogicalMeasurement[N]") -> array[bool, N]:
"""Decode logical measurement"""
return decode(self)
[docs]
@hugr_op(_instantiator_for_op(std_ops.decode_def))
@no_type_check
def decode(meas: LogicalMeasurement[N]) -> array[bool, N]:
"""Decode logical measurement"""