From 1f2c2006b326950ebb2a0a4a5b2d9a658e2caa22 Mon Sep 17 00:00:00 2001 From: Tatiana S Date: Thu, 9 Apr 2026 16:43:38 +0100 Subject: [PATCH 1/9] WIP revert opaque bool and change measure ops result to new measurement type --- devenv.lock | 62 ++++++++++++- .../compiler/cfg_compiler.py | 7 -- .../compiler/expr_compiler.py | 86 ++----------------- .../guppylang_internals/definition/custom.py | 49 ----------- .../definition/pytket_circuits.py | 10 +-- .../std/_internal/compiler/array.py | 2 - .../std/_internal/compiler/either.py | 7 +- .../std/_internal/compiler/option.py | 7 +- .../std/_internal/compiler/platform.py | 17 +--- .../std/_internal/compiler/qsystem.py | 4 +- .../std/_internal/compiler/quantum.py | 21 +++-- .../std/_internal/compiler/tket_bool.py | 50 ----------- .../std/_internal/compiler/tket_exts.py | 3 + .../guppylang_internals/std/_internal/util.py | 28 +----- .../src/guppylang_internals/tys/builtin.py | 3 +- guppylang/src/guppylang/std/bool.py | 10 +-- guppylang/src/guppylang/std/num.py | 38 ++++---- .../src/guppylang/std/qsystem/__init__.py | 28 +++--- .../src/guppylang/std/quantum/__init__.py | 18 +++- pyproject.toml | 1 + uv.lock | 26 ++---- 21 files changed, 154 insertions(+), 323 deletions(-) delete mode 100644 guppylang-internals/src/guppylang_internals/std/_internal/compiler/tket_bool.py diff --git a/devenv.lock b/devenv.lock index 18eb450da..d8a7b8a9e 100644 --- a/devenv.lock +++ b/devenv.lock @@ -18,6 +18,21 @@ } }, "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1767039857, + "owner": "NixOS", + "repo": "flake-compat", + "rev": "5edf11c44bc78a0d334f6334cdaf7d60d732daab", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_2": { "flake": false, "locked": { "lastModified": 1767039857, @@ -33,6 +48,47 @@ "type": "github" } }, + "git-hooks": { + "inputs": { + "flake-compat": "flake-compat", + "gitignore": "gitignore", + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1775585728, + "owner": "cachix", + "repo": "git-hooks.nix", + "rev": "580633fa3fe5fc0379905986543fd7495481913d", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "git-hooks.nix", + "type": "github" + } + }, + "gitignore": { + "inputs": { + "nixpkgs": [ + "git-hooks", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1762808025, + "owner": "hercules-ci", + "repo": "gitignore.nix", + "rev": "cb5e3fdca1de58ccbc3ef53de65bd372b48f567c", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "gitignore.nix", + "type": "github" + } + }, "nixpkgs": { "locked": { "lastModified": 1775005781, @@ -51,7 +107,7 @@ }, "nixpkgs-python": { "inputs": { - "flake-compat": "flake-compat", + "flake-compat": "flake-compat_2", "nixpkgs": [ "nixpkgs" ] @@ -73,8 +129,12 @@ "root": { "inputs": { "devenv": "devenv", + "git-hooks": "git-hooks", "nixpkgs": "nixpkgs", "nixpkgs-python": "nixpkgs-python", + "pre-commit-hooks": [ + "git-hooks" + ], "rust-overlay": "rust-overlay" } }, diff --git a/guppylang-internals/src/guppylang_internals/compiler/cfg_compiler.py b/guppylang-internals/src/guppylang_internals/compiler/cfg_compiler.py index 75bf23ad2..f89f7f6ce 100644 --- a/guppylang-internals/src/guppylang_internals/compiler/cfg_compiler.py +++ b/guppylang-internals/src/guppylang_internals/compiler/cfg_compiler.py @@ -1,6 +1,5 @@ import functools from collections.abc import Sequence -from typing import cast from hugr import Wire, ops from hugr import tys as ht @@ -23,7 +22,6 @@ ) from guppylang_internals.compiler.expr_compiler import ExprCompiler from guppylang_internals.compiler.stmt_compiler import StmtCompiler -from guppylang_internals.std._internal.compiler.tket_bool import OpaqueBool, read_bool from guppylang_internals.tys.ty import type_to_row @@ -107,11 +105,6 @@ def compile_bb( if len(bb.successors) > 1: assert bb.branch_pred is not None branch_port = ExprCompiler(ctx).compile(bb.branch_pred, dfg) - # Convert the bool predicate into a sum for branching. - pred_ty = builder.hugr.port_type(branch_port.out_port()) - assert pred_ty == OpaqueBool - branch_port = dfg.builder.add_op(read_bool(), branch_port, set_debug_info=False) - branch_port = cast("Wire", branch_port) else: # Even if we don't branch, we still have to add a `Sum(())` predicates branch_port = dfg.builder.add_op( diff --git a/guppylang-internals/src/guppylang_internals/compiler/expr_compiler.py b/guppylang-internals/src/guppylang_internals/compiler/expr_compiler.py index 589bd8359..596a4c79e 100644 --- a/guppylang-internals/src/guppylang_internals/compiler/expr_compiler.py +++ b/guppylang-internals/src/guppylang_internals/compiler/expr_compiler.py @@ -1,7 +1,7 @@ import ast from collections.abc import Iterator, Sequence from contextlib import AbstractContextManager, ExitStack, contextmanager -from typing import Any, Final, TypeGuard, TypeVar +from typing import Any, TypeGuard, TypeVar import hugr import hugr.std.collections.array @@ -12,7 +12,6 @@ from hugr import Wire, ops from hugr import tys as ht from hugr import val as hv -from hugr.build import function as hf from hugr.build.cond_loop import Conditional from hugr.build.dfg import DP, DfBase @@ -26,7 +25,6 @@ CompilerContext, DFBuilder, DFContainer, - GlobalConstId, ) from guppylang_internals.compiler.hugr_extension import PartialOp from guppylang_internals.definition.common import CheckableGenericDef @@ -63,7 +61,6 @@ convert_itousize, ) from guppylang_internals.std._internal.compiler.array import ( - array_map, array_new, array_to_std_array, barray_new_all_borrowed, @@ -80,13 +77,6 @@ make_error, panic, ) -from guppylang_internals.std._internal.compiler.tket_bool import ( - OpaqueBool, - OpaqueBoolVal, - make_opaque, - not_op, - read_bool, -) from guppylang_internals.tys.builtin import ( bool_type, get_element_type, @@ -216,12 +206,8 @@ def _if_else( """Builds a `Conditional`, returning context managers to build the `True` and `False` branch. """ - cond_wire = self.visit(cond) - cond_ty = self.builder.get_wire_type(cond_wire) - if cond_ty == OpaqueBool: - cond_wire = self.builder.add_op(read_bool(), cond_wire) conditional = self.builder.add_conditional( - cond_wire, *(self.visit(inp) for inp in inputs) + self.visit(cond), *(self.visit(inp) for inp in inputs) ) only_true_inputs_ = only_true_inputs or [] only_false_inputs_ = only_false_inputs or [] @@ -480,7 +466,7 @@ def visit_UnaryOp(self, node: ast.UnaryOp) -> Wire: # since it is not implemented via a dunder method if isinstance(node.op, ast.Not): arg = self.visit(node.operand) - return self.builder.add_op(not_op(), arg) + return self.builder.add_op(hugr.std.logic.Not, arg) raise InternalGuppyError("Node should have been removed during type checking.") @@ -592,7 +578,7 @@ def visit_StateResultExpr(self, node: StateResultExpr) -> Wire: # array. qubits_in = [self.visit(node.args[1])] qubits_out = [ - apply_array_op_with_conversions( + apply_op_with_borrow_array_conversion( self.ctx, self.builder, op, @@ -767,7 +753,7 @@ def python_value_to_hugr(v: Any, exp_ty: Type, ctx: CompilerContext) -> hv.Value """ match v: case bool(): - return OpaqueBoolVal(v) + return hv.bool_value(v) case str(): return hugr.std.prelude.StringVal(v) case int(): @@ -804,38 +790,6 @@ def python_value_to_hugr(v: Any, exp_ty: Type, ctx: CompilerContext) -> hv.Value return None -ARRAY_READ_BOOL: Final[GlobalConstId] = GlobalConstId.fresh("array.__read_bool") -ARRAY_MAKE_OPAQUE_BOOL: Final[GlobalConstId] = GlobalConstId.fresh( - "array.__make_opaque_bool" -) - - -def array_read_bool(ctx: CompilerContext) -> hf.Function: - """Returns the Hugr function that is used to unwrap the elements in an option array - to turn it into a regular array.""" - sig = ht.PolyFuncType( - params=[], - body=ht.FunctionType([OpaqueBool], [ht.Bool]), - ) - func, already_defined = ctx.declare_global_func(ARRAY_READ_BOOL, sig) - if not already_defined: - func.set_outputs(func.add_op(read_bool(), func.inputs()[0])) - return func - - -def array_make_opaque_bool(ctx: CompilerContext) -> hf.Function: - """Returns the Hugr function that is used to unwrap the elements in an option array - to turn it into a regular array.""" - sig = ht.PolyFuncType( - params=[], - body=ht.FunctionType([ht.Bool], [OpaqueBool]), - ) - func, already_defined = ctx.declare_global_func(ARRAY_MAKE_OPAQUE_BOOL, sig) - if not already_defined: - func.set_outputs(func.add_op(make_opaque(), func.inputs()[0])) - return func - - T = TypeVar("T") @@ -844,44 +798,22 @@ def doesnt_contain_none(xs: list[T | None]) -> TypeGuard[list[T]]: return all(x is not None for x in xs) -def apply_array_op_with_conversions( +def apply_op_with_borrow_array_conversion( ctx: CompilerContext, builder: DFBuilder[ops.DfParentOp], op: ops.DataflowOp, elem_ty: ht.Type, size_arg: ht.TypeArg, input_array: Wire, - convert_bool: bool = False, ) -> Wire: - """Applies common transformations to a Guppy array input before it can be passed to - a Hugr op operating on a standard Hugr array, and then reverses them again on the - output array. - - Transformations: - 1. (Optional) Converts from / to opaque bool to / from Hugr bool. - 2. Converts from / to borrow array to / from standard Hugr array. + """Transforms a Guppy borrow array before it can be passed to a Hugr op operating on + a standard Hugr array, and then reverses the transformation again on the output + array. """ - if convert_bool: - array_read = array_read_bool(ctx) - array_read = builder.load_function(array_read) - map_op = array_map(OpaqueBool, size_arg, ht.Bool) - input_array = builder.add_op(map_op, input_array, array_read) - elem_ty = ht.Bool - input_array = builder.add_op( array_to_std_array(elem_ty, size_arg), input_array, ) - result_array = builder.add_op(op, input_array) - result_array = builder.add_op(std_array_to_array(elem_ty, size_arg), result_array) - - if convert_bool: - array_make_opaque = array_make_opaque_bool(ctx) - array_make_opaque = builder.load_function(array_make_opaque) - map_op = array_map(ht.Bool, size_arg, OpaqueBool) - result_array = builder.add_op(map_op, result_array, array_make_opaque) - elem_ty = OpaqueBool - return result_array diff --git a/guppylang-internals/src/guppylang_internals/definition/custom.py b/guppylang-internals/src/guppylang_internals/definition/custom.py index b7a6f8499..88a780fc8 100644 --- a/guppylang-internals/src/guppylang_internals/definition/custom.py +++ b/guppylang-internals/src/guppylang_internals/definition/custom.py @@ -34,11 +34,6 @@ from guppylang_internals.error import GuppyError, InternalGuppyError from guppylang_internals.nodes import GlobalCall from guppylang_internals.span import SourceMap -from guppylang_internals.std._internal.compiler.tket_bool import ( - OpaqueBool, - make_opaque, - read_bool, -) from guppylang_internals.tys.param import Parameter from guppylang_internals.tys.subst import Inst, Subst from guppylang_internals.tys.ty import ( @@ -484,50 +479,6 @@ def compile_with_inouts(self, args: list[Wire]) -> CallReturnWires: ) -class BoolOpCompiler(CustomInoutCallCompiler): - """Call compiler for functions that are directly implemented via Hugr ops but need - input and/or output conversions from hugr sum bools to the opaque bools Guppy is - using. - - args: - op: A function that takes an instantiation of the type arguments as well as - the monomorphic function type, and returns a concrete HUGR op. - """ - - op: Callable[[ht.FunctionType, Inst, CompilerContext], ops.DataflowOp] - - def __init__( - self, op: Callable[[ht.FunctionType, Inst, CompilerContext], ops.DataflowOp] - ) -> None: - self.op = op - - def compile_with_inouts(self, args: list[Wire]) -> CallReturnWires: - converted_in = [ht.Bool if inp == OpaqueBool else inp for inp in self.ty.input] - converted_out = [ - ht.Bool if out == OpaqueBool else out for out in self.ty.output - ] - hugr_op_ty = ht.FunctionType(converted_in, converted_out) - op = self.op(hugr_op_ty, self.type_args, self.ctx) - converted_args = [ - self.builder.add_op(read_bool(), arg) - if self.builder.get_wire_type(arg) == OpaqueBool - else arg - for arg in args - ] - node = self.builder.add_op(op, *converted_args) - result = list(node.outputs()) - converted_result = [ - self.builder.add_op(make_opaque(), res) - if self.builder.get_wire_type(res) == ht.Bool - else res - for res in result - ] - return CallReturnWires( - regular_returns=converted_result, # type: ignore[arg-type] - inout_returns=[], - ) - - class NoopCompiler(CustomCallCompiler): """Call compiler for functions that are noops.""" diff --git a/guppylang-internals/src/guppylang_internals/definition/pytket_circuits.py b/guppylang-internals/src/guppylang_internals/definition/pytket_circuits.py index 3fed4f3fe..4f4e3ac19 100644 --- a/guppylang-internals/src/guppylang_internals/definition/pytket_circuits.py +++ b/guppylang-internals/src/guppylang_internals/definition/pytket_circuits.py @@ -50,7 +50,6 @@ array_unpack, ) from guppylang_internals.std._internal.compiler.quantum import from_halfturns_unchecked -from guppylang_internals.std._internal.compiler.tket_bool import OpaqueBool, make_opaque from guppylang_internals.tys.builtin import array_type, bool_type, float_type from guppylang_internals.tys.subst import Subst from guppylang_internals.tys.ty import ( @@ -294,13 +293,6 @@ def compile_outer( output_list[self.input_circuit.n_qubits :] + output_list[: self.input_circuit.n_qubits] ) - # Convert hugr sum bools into the opaque bools that Guppy uses. - wires = [ - outer_func.add_op(make_opaque(), wire) - if outer_func.hugr.port_type(wire.out_port()) == ht.Bool - else wire - for wire in wires - ] if self.use_arrays: array_wires: list[Wire] = [] @@ -309,7 +301,7 @@ def compile_outer( for c_reg in self.input_circuit.c_registers: array_wires.append( outer_func.add_op( - array_new(OpaqueBool, c_reg.size), + array_new(ht.Bool, c_reg.size), *wires[wire_idx : wire_idx + c_reg.size], ) ) diff --git a/guppylang-internals/src/guppylang_internals/std/_internal/compiler/array.py b/guppylang-internals/src/guppylang_internals/std/_internal/compiler/array.py index d404b6851..61fcfe32a 100644 --- a/guppylang-internals/src/guppylang_internals/std/_internal/compiler/array.py +++ b/guppylang-internals/src/guppylang_internals/std/_internal/compiler/array.py @@ -14,7 +14,6 @@ from guppylang_internals.error import InternalGuppyError from guppylang_internals.std._internal.compiler.arithmetic import convert_itousize from guppylang_internals.std._internal.compiler.prelude import build_unwrap_right -from guppylang_internals.std._internal.compiler.tket_bool import make_opaque from guppylang_internals.tys.arg import ConstArg, TypeArg if TYPE_CHECKING: @@ -435,7 +434,6 @@ def compile_with_inouts(self, args: list[Wire]) -> CallReturnWires: array, b = self.builder.add_op( barray_is_borrowed(self.elem_ty, self.length), array, idx ) - b = self.builder.add_op(make_opaque(), b) return CallReturnWires(regular_returns=[b], inout_returns=[array]) def compile(self, args: list[Wire]) -> list[Wire]: diff --git a/guppylang-internals/src/guppylang_internals/std/_internal/compiler/either.py b/guppylang-internals/src/guppylang_internals/std/_internal/compiler/either.py index 1fa494685..7550be15c 100644 --- a/guppylang-internals/src/guppylang_internals/std/_internal/compiler/either.py +++ b/guppylang-internals/src/guppylang_internals/std/_internal/compiler/either.py @@ -3,6 +3,7 @@ from hugr import Wire, ops from hugr import tys as ht +from hugr import val as hv from guppylang_internals.compiler.expr_compiler import unpack_wire from guppylang_internals.definition.custom import ( @@ -12,10 +13,6 @@ from guppylang_internals.definition.value import CallReturnWires from guppylang_internals.error import InternalGuppyError from guppylang_internals.std._internal.compiler.prelude import build_unwrap_either -from guppylang_internals.std._internal.compiler.tket_bool import ( - OPAQUE_FALSE, - OPAQUE_TRUE, -) from guppylang_internals.tys.arg import Argument, TypeArg from guppylang_internals.tys.common import ToHugrContext from guppylang_internals.tys.ty import type_to_row @@ -88,7 +85,7 @@ def compile_with_inouts(self, args: list[Wire]) -> CallReturnWires: cond = self.builder.add_conditional(either) for i in [0, 1]: with cond.add_case(i) as case: - val = OPAQUE_TRUE if i == self.tag else OPAQUE_FALSE + val = hv.TRUE if i == self.tag else hv.FALSE either = case.add_op(ops.Tag(i, self.either_ty), *case.inputs()) case.set_outputs(case.load(val), either) [res, either] = cond.outputs() diff --git a/guppylang-internals/src/guppylang_internals/std/_internal/compiler/option.py b/guppylang-internals/src/guppylang_internals/std/_internal/compiler/option.py index 6d0ee004c..05eef7f21 100644 --- a/guppylang-internals/src/guppylang_internals/std/_internal/compiler/option.py +++ b/guppylang-internals/src/guppylang_internals/std/_internal/compiler/option.py @@ -2,6 +2,7 @@ from hugr import Wire, ops from hugr import tys as ht +from hugr import val as hv from guppylang_internals.compiler.expr_compiler import unpack_wire from guppylang_internals.definition.custom import ( @@ -14,10 +15,6 @@ build_expect_none, build_unwrap, ) -from guppylang_internals.std._internal.compiler.tket_bool import ( - OPAQUE_FALSE, - OPAQUE_TRUE, -) from guppylang_internals.tys.arg import TypeArg @@ -54,7 +51,7 @@ def compile_with_inouts(self, args: list[Wire]) -> CallReturnWires: cond = self.builder.add_conditional(opt) for i in [0, 1]: with cond.add_case(i) as case: - val = OPAQUE_TRUE if i == self.tag else OPAQUE_FALSE + val = hv.TRUE if i == self.tag else hv.FALSE opt = case.add_op(ops.Tag(i, self.option_ty), *case.inputs()) case.set_outputs(case.load(val), opt) [res, opt] = cond.outputs() diff --git a/guppylang-internals/src/guppylang_internals/std/_internal/compiler/platform.py b/guppylang-internals/src/guppylang_internals/std/_internal/compiler/platform.py index 0d1c124ee..d9bff6db6 100644 --- a/guppylang-internals/src/guppylang_internals/std/_internal/compiler/platform.py +++ b/guppylang-internals/src/guppylang_internals/std/_internal/compiler/platform.py @@ -6,7 +6,6 @@ from guppylang_internals.ast_util import AstNode from guppylang_internals.compiler.core import CompilerContext -from guppylang_internals.compiler.expr_compiler import array_read_bool from guppylang_internals.definition.custom import ( CustomCallCompiler, CustomInoutCallCompiler, @@ -16,13 +15,11 @@ from guppylang_internals.error import GuppyError, InternalGuppyError from guppylang_internals.std._internal.compiler.array import ( array_clone, - array_map, array_to_std_array, ) -from guppylang_internals.std._internal.compiler.tket_bool import OpaqueBool, read_bool from guppylang_internals.std._internal.compiler.tket_exts import RESULT_EXTENSION from guppylang_internals.tys.arg import Argument, ConstArg -from guppylang_internals.tys.builtin import get_element_type, is_bool_type +from guppylang_internals.tys.builtin import get_element_type from guppylang_internals.tys.const import BoundConstVar, ConstValue from guppylang_internals.tys.ty import NumericType @@ -58,10 +55,6 @@ def compile(self, args: list[Wire]) -> list[Wire]: args = [tag_to_hugr(self.type_args[0], self.ctx, self.node)] if self.with_int_width: args.append(tys.BoundedNatArg(NumericType.INT_WIDTH)) - # Bool results need an extra conversion into regular hugr bools - if is_bool_type(ty): - value = self.builder.add_op(read_bool(), value) - hugr_ty = tys.Bool op = RESULT_EXTENSION.get_op(self.op_name) sig = tys.FunctionType(input=[hugr_ty], output=[]) self.builder.add_op(op.instantiate(args, sig), value) @@ -92,14 +85,6 @@ def compile_with_inouts(self, args: list[Wire]) -> CallReturnWires: hugr_elem_ty = elem_ty.to_hugr(self.ctx) hugr_size = size_arg.to_hugr(self.ctx) arr, out_arr = self.builder.add_op(array_clone(hugr_elem_ty, hugr_size), arr) - # For bool arrays, we furthermore need to coerce a read on all the array - # elements - if is_bool_type(elem_ty): - array_read = array_read_bool(self.ctx) - array_read = self.builder.load_function(array_read) - map_op = array_map(OpaqueBool, hugr_size, tys.Bool) - arr = self.builder.add_op(map_op, arr, array_read).out(0) - hugr_elem_ty = tys.Bool # Turn `borrow_array` into regular `array` arr = self.builder.add_op(array_to_std_array(hugr_elem_ty, hugr_size), arr).out( 0 diff --git a/guppylang-internals/src/guppylang_internals/std/_internal/compiler/qsystem.py b/guppylang-internals/src/guppylang_internals/std/_internal/compiler/qsystem.py index 312c6e24d..5471969e5 100644 --- a/guppylang-internals/src/guppylang_internals/std/_internal/compiler/qsystem.py +++ b/guppylang-internals/src/guppylang_internals/std/_internal/compiler/qsystem.py @@ -9,7 +9,6 @@ from guppylang_internals.std._internal.compiler.quantum import ( RNGCONTEXT_T, ) -from guppylang_internals.std._internal.compiler.tket_bool import make_opaque from guppylang_internals.std._internal.compiler.tket_exts import ( FUTURES_EXTENSION, QSYSTEM_EXTENSION, @@ -79,5 +78,4 @@ def compile_with_inouts(self, args: list[Wire]) -> CallReturnWires: ), future, ) - opaque_bool_value = self.builder.add_op(make_opaque(), bool_value) - return CallReturnWires(regular_returns=[opaque_bool_value], inout_returns=[]) + return CallReturnWires(regular_returns=[bool_value], inout_returns=[]) diff --git a/guppylang-internals/src/guppylang_internals/std/_internal/compiler/quantum.py b/guppylang-internals/src/guppylang_internals/std/_internal/compiler/quantum.py index eee571f5c..20703b8c3 100644 --- a/guppylang-internals/src/guppylang_internals/std/_internal/compiler/quantum.py +++ b/guppylang-internals/src/guppylang_internals/std/_internal/compiler/quantum.py @@ -11,8 +11,8 @@ from guppylang_internals.definition.custom import CustomInoutCallCompiler from guppylang_internals.definition.value import CallReturnWires -from guppylang_internals.std._internal.compiler.tket_bool import OpaqueBool, make_opaque from guppylang_internals.std._internal.compiler.tket_exts import ( + MEASUREMENT_EXTENSION, QSYSTEM_RANDOM_EXTENSION, QUANTUM_EXTENSION, ROTATION_EXTENSION, @@ -42,9 +42,9 @@ def from_halfturns_unchecked() -> ops.ExtOp: # ------------------------------------------------------ -class InoutMeasureCompiler(CustomInoutCallCompiler): - """Compiler for the measure functions with an inout qubit - such as the `project_z` function - requiring conversion to tket.bool.""" +class InoutMeasureCompilerBool(CustomInoutCallCompiler): + """Compiler for the measure functions with an inout qubit and a bool + such as the `project_z` function""" opname: str ext: he.Extension @@ -63,13 +63,12 @@ def compile_with_inouts(self, args: list[Wire]) -> CallReturnWires: ), q, ) - bit = self.builder.add_op(make_opaque(), bit) return CallReturnWires(regular_returns=[bit], inout_returns=[q]) -class InoutMeasureResetCompiler(CustomInoutCallCompiler): - """Compiler for the measure functions with an inout qubit - such as the `project_z` function.""" +class InoutMeasureCompilerMsmt(CustomInoutCallCompiler): + """Compiler for the measure functions with an inout qubit and a measurement + such as the `project_z` function""" opname: str ext: he.Extension @@ -84,7 +83,11 @@ def compile_with_inouts(self, args: list[Wire]) -> CallReturnWires: [q] = args [q, bit] = self.builder.add_op( quantum_op(self.opname, ext=self.ext)( - ht.FunctionType([ht.Qubit], [ht.Qubit, OpaqueBool]), (), self.ctx + ht.FunctionType( + [ht.Qubit], [MEASUREMENT_EXTENSION.get_type("Measurement"), ht.Bool] + ), + (), + self.ctx, ), q, ) diff --git a/guppylang-internals/src/guppylang_internals/std/_internal/compiler/tket_bool.py b/guppylang-internals/src/guppylang_internals/std/_internal/compiler/tket_bool.py deleted file mode 100644 index 86065d100..000000000 --- a/guppylang-internals/src/guppylang_internals/std/_internal/compiler/tket_bool.py +++ /dev/null @@ -1,50 +0,0 @@ -from dataclasses import dataclass - -from hugr import ops -from hugr import tys as ht -from hugr import val as hv - -from guppylang_internals.std._internal.compiler.tket_exts import BOOL_EXTENSION - -BOOL_DEF = BOOL_EXTENSION.get_type("bool") -OpaqueBool = ht.ExtType(BOOL_DEF) - - -def read_bool() -> ops.ExtOp: - return ops.ExtOp( - BOOL_EXTENSION.get_op("read"), - ht.FunctionType([OpaqueBool], [ht.Bool]), - ) - - -def make_opaque() -> ops.ExtOp: - return ops.ExtOp( - BOOL_EXTENSION.get_op("make_opaque"), - ht.FunctionType([ht.Bool], [OpaqueBool]), - ) - - -def not_op() -> ops.ExtOp: - return ops.ExtOp( - BOOL_EXTENSION.get_op("not"), - ht.FunctionType([OpaqueBool], [OpaqueBool]), - ) - - -@dataclass -class OpaqueBoolVal(hv.ExtensionValue): - """Custom value for a boolean.""" - - v: bool - - def to_value(self) -> hv.Extension: - name = "ConstBool" - payload = self.v - return hv.Extension(name, typ=OpaqueBool, val=payload) - - def __str__(self) -> str: - return f"{self.v}" - - -OPAQUE_TRUE = OpaqueBoolVal(True) -OPAQUE_FALSE = OpaqueBoolVal(False) diff --git a/guppylang-internals/src/guppylang_internals/std/_internal/compiler/tket_exts.py b/guppylang-internals/src/guppylang_internals/std/_internal/compiler/tket_exts.py index 6ac7a3ebb..71861ce06 100644 --- a/guppylang-internals/src/guppylang_internals/std/_internal/compiler/tket_exts.py +++ b/guppylang-internals/src/guppylang_internals/std/_internal/compiler/tket_exts.py @@ -7,6 +7,7 @@ futures, global_phase, guppy, + measurement, modifier, qsystem, qsystem_random, @@ -22,6 +23,7 @@ FUTURES_EXTENSION = futures() GLOBAL_PHASE_EXTENSION = global_phase() GUPPY_EXTENSION = guppy() +MEASUREMENT_EXTENSION = measurement() MODIFIER_EXTENSION = modifier() QSYSTEM_EXTENSION = qsystem() QSYSTEM_RANDOM_EXTENSION = qsystem_random() @@ -37,6 +39,7 @@ FUTURES_EXTENSION, GLOBAL_PHASE_EXTENSION, GUPPY_EXTENSION, + MEASUREMENT_EXTENSION, MODIFIER_EXTENSION, QSYSTEM_EXTENSION, QSYSTEM_RANDOM_EXTENSION, diff --git a/guppylang-internals/src/guppylang_internals/std/_internal/util.py b/guppylang-internals/src/guppylang_internals/std/_internal/util.py index 9c8b9febf..8922d1b12 100644 --- a/guppylang-internals/src/guppylang_internals/std/_internal/util.py +++ b/guppylang-internals/src/guppylang_internals/std/_internal/util.py @@ -16,11 +16,7 @@ from hugr import tys as ht from guppylang_internals.compiler.hugr_extension import UnsupportedOp -from guppylang_internals.std._internal.compiler.tket_bool import OpaqueBool -from guppylang_internals.std._internal.compiler.tket_exts import ( - BOOL_EXTENSION, - QUANTUM_EXTENSION, -) +from guppylang_internals.std._internal.compiler.tket_exts import QUANTUM_EXTENSION from guppylang_internals.tys.common import ToHugrContext from guppylang_internals.tys.subst import Inst from guppylang_internals.tys.ty import NumericType @@ -247,25 +243,3 @@ def op(ty: ht.FunctionType, inst: Inst, ctx: ToHugrContext) -> ops.DataflowOp: ) return op - - -def bool_logic_op( - op_name: str, -) -> Callable[[ht.FunctionType, Inst, ToHugrContext], ops.DataflowOp]: - """Utility method to create binary `tket.bool` logic ops. - - args: - op_name: The name of the operation. - - Returns: - A function that takes an instantiation of the type arguments and returns - a concrete HUGR op. - """ - - def op(ty: ht.FunctionType, inst: Inst, ctx: ToHugrContext) -> ops.DataflowOp: - return ops.ExtOp( - BOOL_EXTENSION.get_op(op_name), - ht.FunctionType([OpaqueBool, OpaqueBool], [OpaqueBool]), - ) - - return op diff --git a/guppylang-internals/src/guppylang_internals/tys/builtin.py b/guppylang-internals/src/guppylang_internals/tys/builtin.py index 76294ccb8..02655b59e 100644 --- a/guppylang-internals/src/guppylang_internals/tys/builtin.py +++ b/guppylang-internals/src/guppylang_internals/tys/builtin.py @@ -13,7 +13,6 @@ from guppylang_internals.definition.ty import OpaqueTypeDef, TypeDef from guppylang_internals.error import GuppyError, InternalGuppyError from guppylang_internals.experimental import check_lists_enabled -from guppylang_internals.std._internal.compiler.tket_bool import OpaqueBool from guppylang_internals.std._internal.compiler.tket_exts import WASM_EXTENSION from guppylang_internals.tys.arg import Argument, ConstArg, TypeArg from guppylang_internals.tys.common import ToHugrContext @@ -219,7 +218,7 @@ def _option_to_hugr(args: Sequence[Argument], ctx: ToHugrContext) -> ht.Type: params=[], never_copyable=False, never_droppable=False, - to_hugr=lambda args, ctx: OpaqueBool, + to_hugr=lambda args, ctx: ht.Bool, ) nat_type_def = _NumericTypeDef( DefId.fresh(), "nat", None, [], NumericType(NumericType.Kind.Nat) diff --git a/guppylang/src/guppylang/std/bool.py b/guppylang/src/guppylang/std/bool.py index f00f6c8cf..07732bb5c 100644 --- a/guppylang/src/guppylang/std/bool.py +++ b/guppylang/src/guppylang/std/bool.py @@ -9,7 +9,7 @@ from guppylang_internals.decorator import custom_function, extend_type, hugr_op from guppylang_internals.definition.custom import NoopCompiler from guppylang_internals.std._internal.checker import DunderChecker, ReversingChecker -from guppylang_internals.std._internal.util import bool_logic_op +from guppylang_internals.std._internal.util import logic_op from guppylang_internals.tys.builtin import bool_type_def from guppylang import guppy @@ -26,13 +26,13 @@ class bool: ``False`` using the standard truth testing procedure. """ - @hugr_op(bool_logic_op("and")) + @hugr_op(logic_op("And")) def __and__(self: bool, other: bool) -> bool: ... @custom_function(NoopCompiler()) def __bool__(self: bool) -> bool: ... - @hugr_op(bool_logic_op("eq")) + @hugr_op(logic_op("Eq")) def __eq__(self: bool, other: bool) -> bool: ... @guppy @@ -56,10 +56,10 @@ def __nat__(self: bool) -> nat: @custom_function(checker=DunderChecker("__bool__"), higher_order_value=False) def __new__(x): ... - @hugr_op(bool_logic_op("or")) + @hugr_op(logic_op("Or")) def __or__(self: bool, other: bool) -> bool: ... - @hugr_op(bool_logic_op("xor")) + @hugr_op(logic_op("Xor")) def __xor__(self: bool, other: bool) -> bool: ... @custom_function(checker=ReversingChecker()) diff --git a/guppylang/src/guppylang/std/num.py b/guppylang/src/guppylang/std/num.py index 631abd7c7..e5b7ca163 100644 --- a/guppylang/src/guppylang/std/num.py +++ b/guppylang/src/guppylang/std/num.py @@ -9,7 +9,7 @@ import hugr.std.int from guppylang_internals.decorator import custom_function, extend_type, hugr_op -from guppylang_internals.definition.custom import BoolOpCompiler, NoopCompiler +from guppylang_internals.definition.custom import NoopCompiler from guppylang_internals.std._internal.checker import DunderChecker, ReversingChecker from guppylang_internals.std._internal.compiler.prelude import UnwrapOpCompiler from guppylang_internals.std._internal.util import ( @@ -47,7 +47,7 @@ def __ceil__(self: nat) -> nat: ... @hugr_op(int_op("idivmod_u", n_vars=2)) def __divmod__(self: nat, other: nat) -> tuple[nat, nat]: ... - @custom_function(BoolOpCompiler(int_op("ieq"))) + @hugr_op(int_op("ieq")) def __eq__(self: nat, other: nat) -> bool: ... @hugr_op(int_op("convert_u", hugr.std.int.CONVERSIONS_EXTENSION)) @@ -59,10 +59,10 @@ def __floor__(self: nat) -> nat: ... @hugr_op(int_op("idiv_u")) def __floordiv__(self: nat, other: nat) -> nat: ... - @custom_function(BoolOpCompiler(int_op("ige_u"))) + @hugr_op(int_op("ige_u")) def __ge__(self: nat, other: nat) -> bool: ... - @custom_function(BoolOpCompiler(int_op("igt_u"))) + @hugr_op(int_op("igt_u")) def __gt__(self: nat, other: nat) -> bool: ... @hugr_op(int_op("iu_to_s")) @@ -71,13 +71,13 @@ def __int__(self: nat) -> int: ... @hugr_op(int_op("inot")) def __invert__(self: nat) -> nat: ... - @custom_function(BoolOpCompiler(int_op("ile_u"))) + @hugr_op(int_op("ile_u")) def __le__(self: nat, other: nat) -> bool: ... @hugr_op(int_op("ishl")) def __lshift__(self: nat, other: nat) -> nat: ... - @custom_function(BoolOpCompiler(int_op("ilt_u"))) + @hugr_op(int_op("ilt_u")) def __lt__(self: nat, other: nat) -> bool: ... @hugr_op(int_op("imod_u")) @@ -89,7 +89,7 @@ def __mul__(self: nat, other: nat) -> nat: ... @custom_function(NoopCompiler()) def __nat__(self: nat) -> nat: ... - @custom_function(BoolOpCompiler(int_op("ine"))) + @hugr_op(int_op("ine")) def __ne__(self: nat, other: nat) -> bool: ... @custom_function(checker=DunderChecker("__nat__"), higher_order_value=False) @@ -188,7 +188,7 @@ def __ceil__(self: int) -> int: ... @hugr_op(int_op("idivmod_s")) def __divmod__(self: int, other: int) -> tuple[int, int]: ... - @custom_function(BoolOpCompiler(int_op("ieq"))) + @hugr_op(int_op("ieq")) def __eq__(self: int, other: int) -> bool: ... @hugr_op(int_op("convert_s", hugr.std.int.CONVERSIONS_EXTENSION)) @@ -200,10 +200,10 @@ def __floor__(self: int) -> int: ... @hugr_op(int_op("idiv_s")) def __floordiv__(self: int, other: int) -> int: ... - @custom_function(BoolOpCompiler(int_op("ige_s"))) + @hugr_op(int_op("ige_s")) def __ge__(self: int, other: int) -> bool: ... - @custom_function(BoolOpCompiler(int_op("igt_s"))) + @hugr_op(int_op("igt_s")) def __gt__(self: int, other: int) -> bool: ... @custom_function(NoopCompiler()) @@ -212,13 +212,13 @@ def __int__(self: int) -> int: ... @hugr_op(int_op("inot")) def __invert__(self: int) -> int: ... - @custom_function(BoolOpCompiler(int_op("ile_s"))) + @hugr_op(int_op("ile_s")) def __le__(self: int, other: int) -> bool: ... @hugr_op(int_op("ishl")) # TODO: RHS is unsigned def __lshift__(self: int, other: int) -> int: ... - @custom_function(BoolOpCompiler(int_op("ilt_s"))) + @hugr_op(int_op("ilt_s")) def __lt__(self: int, other: int) -> bool: ... @hugr_op(int_op("imod_s")) @@ -230,7 +230,7 @@ def __mul__(self: int, other: int) -> int: ... @hugr_op(int_op("is_to_u")) def __nat__(self: int) -> nat: ... - @custom_function(BoolOpCompiler(int_op("ine"))) + @hugr_op(int_op("ine")) def __ne__(self: int, other: int) -> bool: ... @hugr_op(int_op("ineg")) @@ -341,7 +341,7 @@ def __ceil__(self: float) -> float: ... def __divmod__(self: float, other: float) -> tuple[float, float]: return self // other, self.__mod__(other) - @custom_function(BoolOpCompiler(float_op("feq"))) + @hugr_op(float_op("feq")) def __eq__(self: float, other: float) -> bool: ... @custom_function(NoopCompiler()) @@ -355,10 +355,10 @@ def __floor__(self: float) -> float: ... def __floordiv__(self: float, other: float) -> float: return (self / other).__floor__() - @custom_function(BoolOpCompiler(float_op("fge"))) + @hugr_op(float_op("fge")) def __ge__(self: float, other: float) -> bool: ... - @custom_function(BoolOpCompiler(float_op("fgt"))) + @hugr_op(float_op("fgt")) def __gt__(self: float, other: float) -> bool: ... @custom_function( @@ -369,10 +369,10 @@ def __gt__(self: float, other: float) -> bool: ... ) def __int__(self: float) -> int: ... - @custom_function(BoolOpCompiler(float_op("fle"))) + @hugr_op(float_op("fle")) def __le__(self: float, other: float) -> bool: ... - @custom_function(BoolOpCompiler(float_op("flt"))) + @hugr_op(float_op("flt")) def __lt__(self: float, other: float) -> bool: ... @guppy @@ -391,7 +391,7 @@ def __mul__(self: float, other: float) -> float: ... ) def __nat__(self: float) -> nat: ... - @custom_function(BoolOpCompiler(float_op("fne"))) + @hugr_op(float_op("fne")) def __ne__(self: float, other: float) -> bool: ... @hugr_op(float_op("fneg")) diff --git a/guppylang/src/guppylang/std/qsystem/__init__.py b/guppylang/src/guppylang/std/qsystem/__init__.py index 9f601c55e..ec7ae1b2f 100644 --- a/guppylang/src/guppylang/std/qsystem/__init__.py +++ b/guppylang/src/guppylang/std/qsystem/__init__.py @@ -9,7 +9,7 @@ future_bool_type, ) from guppylang_internals.std._internal.compiler.quantum import ( - InoutMeasureResetCompiler, + InoutMeasureCompilerMsmt, ) from guppylang_internals.std._internal.compiler.tket_exts import ( QSYSTEM_EXTENSION, @@ -22,7 +22,7 @@ from guppylang.std.builtins import owned from guppylang.std.futures import Future from guppylang.std.option import Option, nothing, some -from guppylang.std.quantum import qubit +from guppylang.std.quantum import Measurement, qubit @guppy @@ -122,13 +122,13 @@ def rz(q: qubit, angle: angle) -> None: @hugr_op(quantum_op("Measure", ext=QSYSTEM_EXTENSION)) @no_type_check -def measure(q: qubit @ owned) -> bool: +def measure(q: qubit @ owned) -> Measurement: """Measure a qubit destructively.""" -@custom_function(InoutMeasureResetCompiler("MeasureReset", QSYSTEM_EXTENSION)) +@custom_function(InoutMeasureCompilerMsmt("MeasureReset", QSYSTEM_EXTENSION)) @no_type_check -def measure_and_reset(q: qubit) -> bool: +def measure_and_reset(q: qubit) -> Measurement: """MeasureReset operation from the qsystem extension.""" @@ -199,7 +199,7 @@ def discard(self: "MaybeLeaked @ owned") -> None: @hugr_op(quantum_op("LazyMeasure", ext=QSYSTEM_EXTENSION)) @no_type_check -def lazy_measure(q: qubit @ owned) -> "Measurement": +def lazy_measure(q: qubit @ owned) -> "FutureMeasurement": """Request a destructive lazy measurement of a qubit, returning a `Measurement` value. Call `.read()` on the value to block until the result is available. """ @@ -207,7 +207,7 @@ def lazy_measure(q: qubit @ owned) -> "Measurement": @custom_function(compiler=LazyMeasureResetCompiler()) @no_type_check -def lazy_measure_and_reset(q: qubit) -> "Measurement": +def lazy_measure_and_reset(q: qubit) -> "FutureMeasurement": """Like `lazy_measure`, but also resets the qubit after measurement.""" @@ -216,7 +216,9 @@ def lazy_measure_and_reset(q: qubit) -> "Measurement": @guppy @no_type_check -def lazy_measure_array(qubits: array[qubit, N] @ owned) -> array["Measurement", N]: +def lazy_measure_array( + qubits: array[qubit, N] @ owned, +) -> array["FutureMeasurement", N]: """Request a destructive lazy measurement of an array of qubits, returning an array of `Measurement` values. Call `.read()` on each value to block until results are available. @@ -229,26 +231,28 @@ def lazy_measure_array(qubits: array[qubit, N] @ owned) -> array["Measurement", copyable=False, droppable=False, ) -class Measurement: +class FutureMeasurement: """Represents the result of a lazy measurement which needs to be explicitly read before being used.""" @custom_function(compiler=ReadFutureBoolCompiler()) @no_type_check - def read(self: "Measurement" @ owned) -> bool: + def read(self: "FutureMeasurement" @ owned) -> bool: """Read the measurement result, consuming it. Blocks until the result is available if the measurement hasn't been performed yet since being requested. """ @guppy @no_type_check - def __consume_as_bool__(self: "Measurement" @ owned) -> bool: + def __consume_as_bool__(self: "FutureMeasurement" @ owned) -> bool: return self.read() @guppy @no_type_check -def collect_measurements(measurements: array[Measurement, N] @ owned) -> array[bool, N]: +def collect_measurements( + measurements: array[FutureMeasurement, N] @ owned, +) -> array[bool, N]: """Block on each measurement until it is available and collect results into an array of bools. """ diff --git a/guppylang/src/guppylang/std/quantum/__init__.py b/guppylang/src/guppylang/std/quantum/__init__.py index 38599c832..b10d370ea 100644 --- a/guppylang/src/guppylang/std/quantum/__init__.py +++ b/guppylang/src/guppylang/std/quantum/__init__.py @@ -6,9 +6,10 @@ from guppylang_internals.decorator import custom_function, custom_type, hugr_op from guppylang_internals.std._internal.compiler.quantum import ( - InoutMeasureCompiler, + InoutMeasureCompilerBool, RotationCompiler, ) +from guppylang_internals.std._internal.compiler.tket_exts import MEASUREMENT_EXTENSION from guppylang_internals.std._internal.util import quantum_op from guppylang_internals.tys.ty import UnitaryFlags from hugr import tys as ht @@ -42,6 +43,15 @@ def discard(self: "qubit" @ owned) -> None: discard(self) +@custom_type( + MEASUREMENT_EXTENSION.get_type("Measurement"), copyable=False, droppable=False +) +class Measurement: + @hugr_op(quantum_op("Read", MEASUREMENT_EXTENSION)) + @no_type_check + def read(self) -> bool: ... + + @hugr_op(quantum_op("TryQAlloc")) @no_type_check def maybe_qubit() -> Option[qubit]: @@ -348,7 +358,7 @@ def toffoli(control1: qubit, control2: qubit, target: qubit) -> None: """ -@custom_function(InoutMeasureCompiler()) +@custom_function(InoutMeasureCompilerBool()) @no_type_check def project_z(q: qubit) -> bool: """Project a single qubit into the Z-basis (a non-destructive measurement).""" @@ -362,7 +372,7 @@ def discard(q: qubit @ owned) -> None: @hugr_op(quantum_op("MeasureFree")) @no_type_check -def measure(q: qubit @ owned) -> bool: +def measure(q: qubit @ owned) -> Measurement: """Measure a single qubit destructively.""" @@ -377,7 +387,7 @@ def reset(q: qubit) -> None: @guppy @no_type_check -def measure_array(qubits: array[qubit, N] @ owned) -> array[bool, N]: +def measure_array(qubits: array[qubit, N] @ owned) -> array[Measurement, N]: """Measure an array of qubits, returning an array of bools.""" return array(measure(q) for q in qubits) diff --git a/pyproject.toml b/pyproject.toml index 109184cef..6929865d8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,6 +30,7 @@ guppylang-internals = { workspace = true } miette-py = { workspace = true } # Uncomment these to test the latest dependency version during development # hugr = { git = "https://github.com/quantinuum/hugr", subdirectory = "hugr-py", rev = "a4da8ef" } +tket = { git = "https://github.com/quantinuum/tket2", subdirectory = "tket-py", rev = "9f1ec02" } [build-system] requires = ["hatchling"] diff --git a/uv.lock b/uv.lock index 009d52d28..28081764c 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 3 +revision = 2 requires-python = ">=3.10, <4" resolution-markers = [ "python_full_version >= '3.14'", @@ -1017,7 +1017,7 @@ dependencies = [ requires-dist = [ { name = "hugr", specifier = "~=0.16.0" }, { name = "pytket", specifier = ">=1.34" }, - { name = "tket", specifier = ">=0.13.0" }, + { name = "tket", git = "https://github.com/quantinuum/tket2?subdirectory=tket-py&rev=9f1ec02" }, { name = "tket-exts", specifier = "~=0.12.0" }, { name = "typing-extensions", specifier = ">=4.9.0,<5" }, { name = "wasmtime", specifier = ">=38.0,<43.1" }, @@ -3691,42 +3691,26 @@ wheels = [ [[package]] name = "tket" version = "0.13.0" -source = { registry = "https://pypi.org/simple" } +source = { git = "https://github.com/quantinuum/tket2?subdirectory=tket-py&rev=9f1ec02#9f1ec02f6cd22f3bf368ffdcfe57f6b287451188" } dependencies = [ { name = "hugr" }, { name = "pytket" }, { name = "tket-eccs" }, { name = "tket-exts" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/94/72/7d1eddd68475a453fba17d010f5b0484061b370c4a669ef241e05f7c1136/tket-0.13.0.tar.gz", hash = "sha256:7ccbcd6379f0bad5e6d701bc38b0e73ae09a89316a948ba79a4dd3d0800374bf", size = 587556, upload-time = "2026-04-07T15:58:47.276Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/34/62/d56c2af222ceaf53e2b2366fd887aa813c9b9a795a5a09db18fda34289e9/tket-0.13.0-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:e4d6d7e02409c741b3db8d1feedb9ba24962ea09769d177eb18631ec7227cc11", size = 9821143, upload-time = "2026-04-07T15:58:35.375Z" }, - { url = "https://files.pythonhosted.org/packages/b3/b9/09f1d165a64ffe2885a19bd1942c91cfaf0827df8328999eb5749ac4ed9f/tket-0.13.0-cp310-abi3-macosx_11_0_x86_64.whl", hash = "sha256:d3a3169e232eb3576fd529f1aacb87d5a2cfeffcd1b604f81ff80169c8ef35f9", size = 10709085, upload-time = "2026-04-07T15:58:37.804Z" }, - { url = "https://files.pythonhosted.org/packages/1f/39/6a3d69429f25dd3c178de76c5e0d40f6526799e632357714c5ed4d55b449/tket-0.13.0-cp310-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:fa73f33e83fe59c9669723d105cdc8b4cc9e494b5ca808be4aff8525b3ca3cdc", size = 11900149, upload-time = "2026-04-07T15:58:40.426Z" }, - { url = "https://files.pythonhosted.org/packages/94/82/df1610831c76007a7146c0fb1ae9af9672c389dff24e727f8e7a498a6fba/tket-0.13.0-cp310-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:c044aa8b4a83ddd7362fd139e32c5dd1b5a9c132176cf8e31ccc9691d446463f", size = 12888623, upload-time = "2026-04-07T15:58:42.832Z" }, - { url = "https://files.pythonhosted.org/packages/7b/d1/0b478d69c744849cf94af21079d8b702c322eed85031c5cb6effb54ffdbf/tket-0.13.0-cp310-abi3-win_amd64.whl", hash = "sha256:2f147c0d378930f7a6f676ce5e880fda9c0258512ebed4f929b1add976a798f5", size = 9450232, upload-time = "2026-04-07T15:58:45.1Z" }, -] [[package]] name = "tket-eccs" version = "0.5.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bb/35/0433336cbe94775e79d1e27823e95f05c697be0010c4c06252bc562cabc4/tket_eccs-0.5.1.tar.gz", hash = "sha256:7e3118569c64f29bab09b9c2dbf20b769ceb1db80ca9b2cec59dfae09023e7d2", size = 7615434, upload-time = "2025-08-19T16:55:12.648Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/56/ef17291924c26e02ce19d062d4698234f499c156a7ed670a0ec556a37d96/tket_eccs-0.5.1-py3-none-any.whl", hash = "sha256:a28f66fde5fe0f52f286a5aca19b821a3182328596d79c7d26c7ede7a4659537", size = 7616506, upload-time = "2025-08-19T16:55:10.576Z" }, -] +source = { git = "https://github.com/quantinuum/tket2?subdirectory=tket-eccs&rev=9f1ec02#9f1ec02f6cd22f3bf368ffdcfe57f6b287451188" } [[package]] name = "tket-exts" version = "0.12.3" -source = { registry = "https://pypi.org/simple" } +source = { git = "https://github.com/quantinuum/tket2?subdirectory=tket-exts&rev=9f1ec02#9f1ec02f6cd22f3bf368ffdcfe57f6b287451188" } dependencies = [ { name = "hugr" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/10/68/036b38ded9ad6ef8aedb93817127af0b5535e52eeb68ef8f19b368d0e035/tket_exts-0.12.3.tar.gz", hash = "sha256:de9faa87e35a7cc2250ab1022a026f129d05dc7bf41ad4fd86914d5a9c81541e", size = 21797, upload-time = "2026-04-07T15:26:51.422Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/77/df/ab123f36707d0fb4deaa96c48a992b90f574348f79aefb94c120dd695f1b/tket_exts-0.12.3-py3-none-any.whl", hash = "sha256:34b03fa69160606bb7ef86735671aa8e7a70149947d630c48a7ebf2f61c49417", size = 34309, upload-time = "2026-04-07T15:26:49.84Z" }, -] [[package]] name = "tomli" From db8fd323c9df5527d026c3d4ddfa539ac0c2ed65 Mon Sep 17 00:00:00 2001 From: Tatiana S Date: Mon, 20 Apr 2026 17:01:42 +0100 Subject: [PATCH 2/9] WIP Adjusting lots of tests mainly --- examples/canonical-qpe.ipynb | 4 +- examples/deferred_measurement.ipynb | 4 +- examples/ghz_and_graph.ipynb | 6 +- examples/postselect.ipynb | 23 +- examples/random_numbers.ipynb | 4 +- examples/repeat-until-success.ipynb | 4 +- examples/swap_test.ipynb | 794 +++++++++--------- examples/t_factory.ipynb | 10 +- .../std/_internal/compiler/qsystem.py | 35 +- .../std/_internal/compiler/quantum.py | 6 +- .../src/guppylang/std/qsystem/__init__.py | 69 +- .../src/guppylang/std/quantum/__init__.py | 37 +- pyproject.toml | 13 +- .../error/linear_errors/branch_use_field1.py | 2 +- .../error/linear_errors/branch_use_field2.err | 4 +- .../error/linear_errors/branch_use_field2.py | 2 +- .../linear_errors/field_copy_nested1.err | 4 +- .../error/linear_errors/field_copy_nested1.py | 2 +- .../linear_errors/field_copy_nested2.err | 4 +- .../error/linear_errors/field_copy_nested2.py | 2 +- tests/error/linear_errors/unused_field3.py | 2 +- .../error/modifier_errors/bad_custom_call.err | 2 +- .../error/modifier_errors/bad_custom_call.py | 2 +- tests/error/tracing_errors/linear_copy4.py | 2 +- tests/error/tracing_errors/linear_drop3.py | 2 +- .../tracing_errors/linear_not_owned1.err | 2 +- .../error/tracing_errors/linear_not_owned1.py | 2 +- tests/integration/notebooks/demo.ipynb | 2 +- tests/integration/notebooks/errorsdemo.ipynb | 4 +- tests/integration/std/test_mem.py | 10 +- tests/integration/test_array.py | 2 +- tests/integration/test_array_index.py | 4 +- tests/integration/test_emulator.py | 19 +- tests/integration/test_extensions.py | 7 +- tests/integration/test_inout.py | 2 +- tests/integration/test_linear.py | 6 +- tests/integration/test_pytket_circuits.py | 4 +- tests/integration/test_qsystem.py | 17 +- tests/integration/test_quantum.py | 10 +- .../integration/test_side_effect_ordering.py | 6 +- tests/integration/tracing/test_quantum.py | 2 +- uv.lock | 49 +- 42 files changed, 599 insertions(+), 588 deletions(-) diff --git a/examples/canonical-qpe.ipynb b/examples/canonical-qpe.ipynb index 9575e4ae0..b409fc382 100644 --- a/examples/canonical-qpe.ipynb +++ b/examples/canonical-qpe.ipynb @@ -21,7 +21,7 @@ "source": [ "from guppylang import guppy\n", "from guppylang.std.angles import pi\n", - "from guppylang.std.quantum import qubit, h, crz, x, measure_array, discard_array\n", + "from guppylang.std.quantum import qubit, h, crz, x, measure_array, discard_array, collect_measurements\n", "from guppylang.std.builtins import result, array \n", "from guppylang.std.mem import mem_swap\n", "\n", @@ -255,7 +255,7 @@ " discard_array(state)\n", "\n", " # Create a result from the measured array\n", - " result(\"c\", measure_array(measured))\n" + " result(\"c\", collect_measurements((measure_array(measured))))\n" ] }, { diff --git a/examples/deferred_measurement.ipynb b/examples/deferred_measurement.ipynb index 6bb773fc8..0fb09f6e3 100644 --- a/examples/deferred_measurement.ipynb +++ b/examples/deferred_measurement.ipynb @@ -9,6 +9,8 @@ "\n", "**Download this notebook - {nb-download}`deferred_measurement.ipynb`**\n", "\n", + "TODO: Update this notebook to explain default lazy behaviour and reason for change (currently just made to run).\n", + "\n", "In this example we will illustrate why using `std.qsystem.lazy_measure` can be useful. " ] }, @@ -47,7 +49,7 @@ "@no_type_check\n", "def eager_read(qs: array[qubit, 10] @ owned) -> None:\n", " for q in qs:\n", - " result(\"t\", measure(q)) # forces immediate measurement of q\n", + " result(\"t\", measure(q).read()) # forces immediate measurement of q\n", " # [... more quantum operations ...]\n", "\n", "eager_read.check()" diff --git a/examples/ghz_and_graph.ipynb b/examples/ghz_and_graph.ipynb index fc48c36e3..e814c105c 100644 --- a/examples/ghz_and_graph.ipynb +++ b/examples/ghz_and_graph.ipynb @@ -24,7 +24,7 @@ "from guppylang import guppy\n", "from guppylang.defs import GuppyFunctionDefinition\n", "from guppylang.std.builtins import array, comptime, result\n", - "from guppylang.std.quantum import cx, cz, h, measure_array, qubit\n", + "from guppylang.std.quantum import cx, cz, h, measure_array, qubit, collect_measurements\n", "from guppylang.emulator import EmulatorResult" ] }, @@ -80,7 +80,7 @@ "\n", " build_ghz_state(q)\n", "\n", - " result(\"c\", measure_array(q))\n", + " result(\"c\", collect_measurements(measure_array(q)))\n", "\n", " # return the guppy function\n", " return main" @@ -172,7 +172,7 @@ " # apply CZ along every graph edge\n", " cz(qs[i], qs[j])\n", "\n", - " result(\"c\", measure_array(qs))\n", + " result(\"c\", collect_measurements(measure_array(qs)))\n", "\n", " return main" ] diff --git a/examples/postselect.ipynb b/examples/postselect.ipynb index 57928b02c..f57cb74e4 100644 --- a/examples/postselect.ipynb +++ b/examples/postselect.ipynb @@ -27,7 +27,7 @@ "\n", "from guppylang import guppy\n", "from guppylang.std.builtins import result, array, exit, panic\n", - "from guppylang.std.quantum import measure_array, measure, qubit, h, cx\n", + "from guppylang.std.quantum import measure_array, measure, qubit, h, cx, collect_measurements\n", "from guppylang.defs import GuppyFunctionDefinition\n", "\n", "from selene_sim import DepolarizingErrorModel\n", @@ -109,6 +109,13 @@ "We use a simple depolarizing error model to induce errors in the preparation." ] }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [], + "execution_count": null, + "source": "" + }, { "cell_type": "code", "execution_count": 4, @@ -184,7 +191,7 @@ "\n", " # Measure the data qubits\n", " data = measure_array(steane_q.data_qs)\n", - " result(\"parity\", parity_check(data))\n", + " result(\"parity\", parity_check(collect_measurements(data)))\n", "\n", "\n", "run(main)" @@ -232,12 +239,12 @@ "evalue": "Panic (#1001): Invalid data index in physical_h", "output_type": "error", "traceback": [ - "\u001b[31m---------------------------------------------------------------------------\u001b[39m", - "\u001b[31mEmulatorError\u001b[39m Traceback (most recent call last)", - "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[6]\u001b[39m\u001b[32m, line 18\u001b[39m\n\u001b[32m 15\u001b[39m data = measure_array(steane_q.data_qs)\n\u001b[32m 16\u001b[39m result(\u001b[33m\"\u001b[39m\u001b[33mparity\u001b[39m\u001b[33m\"\u001b[39m, parity_check(data))\n\u001b[32m---> \u001b[39m\u001b[32m18\u001b[39m \u001b[43mrun\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmain\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[4]\u001b[39m\u001b[32m, line 31\u001b[39m, in \u001b[36mrun\u001b[39m\u001b[34m(main_def)\u001b[39m\n\u001b[32m 24\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mrun\u001b[39m(main_def: GuppyFunctionDefinition) -> Counter:\n\u001b[32m 25\u001b[39m res = (\n\u001b[32m 26\u001b[39m \u001b[43mmain_def\u001b[49m\u001b[43m.\u001b[49m\u001b[43memulator\u001b[49m\u001b[43m(\u001b[49m\u001b[43mn_qubits\u001b[49m\u001b[43m=\u001b[49m\u001b[32;43m8\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[32m 27\u001b[39m \u001b[43m \u001b[49m\u001b[43m.\u001b[49m\u001b[43mstabilizer_sim\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 28\u001b[39m \u001b[43m \u001b[49m\u001b[43m.\u001b[49m\u001b[43mwith_seed\u001b[49m\u001b[43m(\u001b[49m\u001b[32;43m42\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[32m 29\u001b[39m \u001b[43m \u001b[49m\u001b[43m.\u001b[49m\u001b[43mwith_shots\u001b[49m\u001b[43m(\u001b[49m\u001b[32;43m1000\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[32m 30\u001b[39m \u001b[43m \u001b[49m\u001b[43m.\u001b[49m\u001b[43mwith_error_model\u001b[49m\u001b[43m(\u001b[49m\u001b[43merror_model\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m---> \u001b[39m\u001b[32m31\u001b[39m \u001b[43m \u001b[49m\u001b[43m.\u001b[49m\u001b[43mrun\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 32\u001b[39m )\n\u001b[32m 34\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m res.collated_counts()\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/guppylang/guppylang/src/guppylang/emulator/instance.py:226\u001b[39m, in \u001b[36mEmulatorInstance.run\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 224\u001b[39m shot_results.append(tag, value)\n\u001b[32m 225\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[32m--> \u001b[39m\u001b[32m226\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m EmulatorError(\n\u001b[32m 227\u001b[39m completed_shots=EmulatorResult(all_results),\n\u001b[32m 228\u001b[39m failing_shot=shot_results,\n\u001b[32m 229\u001b[39m underlying_exception=e,\n\u001b[32m 230\u001b[39m ) \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[32m 231\u001b[39m all_results.append(shot_results)\n\u001b[32m 232\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m EmulatorResult(all_results)\n", - "\u001b[31mEmulatorError\u001b[39m: Panic (#1001): Invalid data index in physical_h" + "\u001B[31m---------------------------------------------------------------------------\u001B[39m", + "\u001B[31mEmulatorError\u001B[39m Traceback (most recent call last)", + "\u001B[36mCell\u001B[39m\u001B[36m \u001B[39m\u001B[32mIn[6]\u001B[39m\u001B[32m, line 18\u001B[39m\n\u001B[32m 15\u001B[39m data = measure_array(steane_q.data_qs)\n\u001B[32m 16\u001B[39m result(\u001B[33m\"\u001B[39m\u001B[33mparity\u001B[39m\u001B[33m\"\u001B[39m, parity_check(data))\n\u001B[32m---> \u001B[39m\u001B[32m18\u001B[39m \u001B[43mrun\u001B[49m\u001B[43m(\u001B[49m\u001B[43mmain\u001B[49m\u001B[43m)\u001B[49m\n", + "\u001B[36mCell\u001B[39m\u001B[36m \u001B[39m\u001B[32mIn[4]\u001B[39m\u001B[32m, line 31\u001B[39m, in \u001B[36mrun\u001B[39m\u001B[34m(main_def)\u001B[39m\n\u001B[32m 24\u001B[39m \u001B[38;5;28;01mdef\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[34mrun\u001B[39m(main_def: GuppyFunctionDefinition) -> Counter:\n\u001B[32m 25\u001B[39m res = (\n\u001B[32m 26\u001B[39m \u001B[43mmain_def\u001B[49m\u001B[43m.\u001B[49m\u001B[43memulator\u001B[49m\u001B[43m(\u001B[49m\u001B[43mn_qubits\u001B[49m\u001B[43m=\u001B[49m\u001B[32;43m8\u001B[39;49m\u001B[43m)\u001B[49m\n\u001B[32m 27\u001B[39m \u001B[43m \u001B[49m\u001B[43m.\u001B[49m\u001B[43mstabilizer_sim\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\n\u001B[32m 28\u001B[39m \u001B[43m \u001B[49m\u001B[43m.\u001B[49m\u001B[43mwith_seed\u001B[49m\u001B[43m(\u001B[49m\u001B[32;43m42\u001B[39;49m\u001B[43m)\u001B[49m\n\u001B[32m 29\u001B[39m \u001B[43m \u001B[49m\u001B[43m.\u001B[49m\u001B[43mwith_shots\u001B[49m\u001B[43m(\u001B[49m\u001B[32;43m1000\u001B[39;49m\u001B[43m)\u001B[49m\n\u001B[32m 30\u001B[39m \u001B[43m \u001B[49m\u001B[43m.\u001B[49m\u001B[43mwith_error_model\u001B[49m\u001B[43m(\u001B[49m\u001B[43merror_model\u001B[49m\u001B[43m)\u001B[49m\n\u001B[32m---> \u001B[39m\u001B[32m31\u001B[39m \u001B[43m \u001B[49m\u001B[43m.\u001B[49m\u001B[43mrun\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\n\u001B[32m 32\u001B[39m )\n\u001B[32m 34\u001B[39m \u001B[38;5;28;01mreturn\u001B[39;00m res.collated_counts()\n", + "\u001B[36mFile \u001B[39m\u001B[32m~/guppylang/guppylang/src/guppylang/emulator/instance.py:226\u001B[39m, in \u001B[36mEmulatorInstance.run\u001B[39m\u001B[34m(self)\u001B[39m\n\u001B[32m 224\u001B[39m shot_results.append(tag, value)\n\u001B[32m 225\u001B[39m \u001B[38;5;28;01mexcept\u001B[39;00m \u001B[38;5;167;01mException\u001B[39;00m \u001B[38;5;28;01mas\u001B[39;00m e:\n\u001B[32m--> \u001B[39m\u001B[32m226\u001B[39m \u001B[38;5;28;01mraise\u001B[39;00m EmulatorError(\n\u001B[32m 227\u001B[39m completed_shots=EmulatorResult(all_results),\n\u001B[32m 228\u001B[39m failing_shot=shot_results,\n\u001B[32m 229\u001B[39m underlying_exception=e,\n\u001B[32m 230\u001B[39m ) \u001B[38;5;28;01mfrom\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[38;5;28;01mNone\u001B[39;00m\n\u001B[32m 231\u001B[39m all_results.append(shot_results)\n\u001B[32m 232\u001B[39m \u001B[38;5;28;01mreturn\u001B[39;00m EmulatorResult(all_results)\n", + "\u001B[31mEmulatorError\u001B[39m: Panic (#1001): Invalid data index in physical_h" ] } ], diff --git a/examples/random_numbers.ipynb b/examples/random_numbers.ipynb index fb4c1ac2b..2ad56ed9e 100644 --- a/examples/random_numbers.ipynb +++ b/examples/random_numbers.ipynb @@ -123,7 +123,7 @@ " randval = comptime(randints)[get_current_shot()]\n", " pauli_identity(q, randval)\n", " result(\"rng\", randval)\n", - " result(\"c\", measure(q))" + " result(\"c\", measure(q).read())" ] }, { @@ -213,7 +213,7 @@ " rng.discard()\n", " pauli_identity(q, randval)\n", " result(\"rng\", randval)\n", - " result(\"c\", measure(q))" + " result(\"c\", measure(q).read())" ] }, { diff --git a/examples/repeat-until-success.ipynb b/examples/repeat-until-success.ipynb index fa940a39b..b2edb821f 100644 --- a/examples/repeat-until-success.ipynb +++ b/examples/repeat-until-success.ipynb @@ -290,7 +290,7 @@ " z(q)\n", " repeat_until_success(q)\n", " h(q)\n", - " result(\"outcome\", measure(q))\n", + " result(\"outcome\", measure(q).read())\n", "\n", " _rus.check()\n", "\n", @@ -302,7 +302,7 @@ " z(q)\n", " unitary_func(q)\n", " h(q)\n", - " result(\"outcome\", measure(q))\n", + " result(\"outcome\", measure(q).read())\n", "\n", " _ref.check()\n", "\n", diff --git a/examples/swap_test.ipynb b/examples/swap_test.ipynb index c98517220..64f674db9 100644 --- a/examples/swap_test.ipynb +++ b/examples/swap_test.ipynb @@ -1,399 +1,399 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# The SWAP test and loading `pytket` circuits\n", - "\n", - "**Download this notebook - {nb-download}`swap_test.ipynb`**\n", - "\n", - "In this example we will use the SWAP test to demonstrate the construction of a simple Guppy program and show how pytket circuits with multiple registers can be loaded as Guppy functions." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "from guppylang import guppy\n", - "from guppylang.std.quantum import qubit, h, cx, toffoli, measure, discard_array\n", - "from guppylang.emulator import EmulatorResult\n", - "from guppylang.std.builtins import result, array\n", - "\n", - "\n", - "from pytket import Circuit\n", - "from pytket.circuit import StatePreparationBox\n", - "from pytket.passes import DecomposeBoxes\n", - "\n", - "import numpy as np" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Background" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The swap test is a simple quantum circuit that allows us to approximate the squared overlap between two quantum states. \n", - "\n", - "\n", - "![](./img/swap_test_circuit.png){w=240px align=center}\n", - "\n", - "\n", - "We apply controlled swap operation to swap the qubits in the $|\\psi\\rangle$ and $|\\phi\\rangle$ registers. This swaps the two target qubits if the control qubit is in the $|1\\rangle$ state and acts as the identity otherwise. \n", - "\n", - "\n", - "Notice how only the first qubit is measured, giving $|0\\rangle$ or $|1\\rangle$. The value of our squared inner product is related to the probability of measuring $|0\\rangle$ and $|1\\rangle$ as follows.\n", - "\n", - "$$\n", - "P_0 = \\frac{1}{2} + \\frac{1}{2}|\\langle\\psi|\\phi\\rangle|^2\\,, \\quad \n", - "P_1 = \\frac{1}{2} - \\frac{1}{2}|\\langle\\psi|\\phi\\rangle|^2\n", - "$$\n", - "\n", - "To approximate $|\\langle\\psi|\\phi\\rangle|^2$ within an error $\\epsilon$ we will need to run the program for $\\mathcal{O}(\\frac{1}{\\epsilon^2})$ shots. For more background on the swap test, see this [Wikipedia article](https://en.wikipedia.org/wiki/Swap_test).\n", - "\n", - "\n", - "In this example we will consider the following three qubit states\n", - "\n", - "$$\n", - "|W\\rangle = \\frac{1}{\\sqrt{3}} \\big(|001\\rangle + |010\\rangle + |100\\rangle \\big)\n", - "$$\n", - "\n", - "$$\n", - "|S\\rangle = \\frac{1}{\\sqrt{7}}\\big(|001\\rangle+|010\\rangle+|011\\rangle+|100\\rangle+|101\\rangle+|110\\rangle+|111\\rangle \\big)\\,.\n", - "$$\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Controlled SWAP" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Firstly lets define a Guppy function to implement our CSWAP gate in terms of Toffoli and CX gates." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "@guppy\n", - "def cswap(control: qubit, q1: qubit, q2: qubit) -> None:\n", - " cx(q1, q2)\n", - " toffoli(control, q2, q1)\n", - " cx(q1, q2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As we are doing the swap test for two states with three qubits each, we will need to use three CSWAP gates to swap all of the qubits in both state preparation registers." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "@guppy\n", - "def cswap_layer(ancilla: qubit, arr0: array[qubit, 3], arr1: array[qubit, 3]) -> None:\n", - " for i in range(3):\n", - " cswap(ancilla, arr0[i], arr1[i])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## State Preparation using pytket\n", - "\n", - "Now for the state preparation phase. Here we will leverage the [StatePreparationBox](https://docs.quantinuum.com/tket/api-docs/circuit.html#pytket.circuit.StatePreparationBox) construct from pytket.\n", - "\n", - "We will create a pytket `Circuit` with three registers. One qubit is used for the ancilla, and three qubits each for the two state preparation registers. " - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[StatePreparationBox s[0], s[1], s[2]; StatePreparationBox w[0], w[1], w[2]; ]" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Define two StatePreparationBox(es) by passing the amplitudes for |S> and |W> as numpy arrays\n", - "w_state = 1 / np.sqrt(3) * np.array([0, 1, 1, 0, 1, 0, 0, 0])\n", - "s_state = 1 / np.sqrt(7) * np.array([0] + [1] * 7)\n", - "\n", - "w_state_box = StatePreparationBox(w_state)\n", - "s_state_box = StatePreparationBox(s_state)\n", - "\n", - "\n", - "# Build a pytket Circuit with 7 qubits\n", - "pytket_circ = Circuit()\n", - "ancilla = pytket_circ.add_q_register(\"a\", 1)\n", - "w_qubits = pytket_circ.add_q_register(\"w\", 3)\n", - "s_qubits = pytket_circ.add_q_register(\"s\", 3)\n", - "\n", - "\n", - "# Append the state preparation subroutines to the empty circuit\n", - "pytket_circ.add_gate(w_state_box, list(w_qubits))\n", - "pytket_circ.add_gate(s_state_box, list(s_qubits))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Before loading the state preparation circuit into Guppy, we can use the [DecomposeBoxes](https://docs.quantinuum.com/tket/api-docs/passes.html#pytket.passes.DecomposeBoxes) pass to decompose the pytket circuit into CX and Ry gates." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "DecomposeBoxes().apply(pytket_circ)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can now load in the pytket circuit and create a corresponding Guppy function which takes the ancilla, $|S\\rangle$ and $|W\\rangle$ registers as inputs." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "pytket_state_prep = guppy.load_pytket(\"pytket_state_prep\", pytket_circ)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here, the separate quantum registers in the circuit are treated as distinct Guppy arrays. The loaded circuit can now be invoked as a `pytket_state_prep` Guppy function which takes three arrays (corresponding to `\"a\"` `\"s\"` and `\"w\"`) as input. Note that as with pytket the qubit ordering here is lexicographic. So the arrays are arranged in alphabetical order with `\"a\"` first followed by `\"s\"` and finally `\"w\"`.\n", - "\n", - "The `load_pytket` function has a `use_arrays` flag which is set to `True` by default. Setting this argument to `False` means that Guppy will not create arrays for the distinct registers but instead will treat each named qubit as a separate function argument to `pytket_state_prep`. In this case we would have seven distinct qubit arguments to `pytket_state_prep` instead of three arrays." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Execution on Selene" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can compose the different parts of our program together into a `main` function. Here we only need to measure the first qubit so we discard the two state preparation registers." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "@guppy\n", - "def main() -> None:\n", - " w_qubits = array(qubit() for _ in range(3))\n", - " s_qubits = array(qubit() for _ in range(3))\n", - " ancilla_reg = array(qubit())\n", - " # The pytket function only acts on arrays\n", - " pytket_state_prep(ancilla_reg, s_qubits, w_qubits)\n", - "\n", - " (ancilla,) = ancilla_reg\n", - "\n", - " h(ancilla)\n", - " cswap_layer(ancilla, w_qubits, s_qubits)\n", - " h(ancilla)\n", - "\n", - " result(\"c\", measure(ancilla))\n", - "\n", - " # We are only interested in measuring the first qubit\n", - " # Discard all the of |W> and |S> qubits to avoid linearity violation.\n", - " discard_array(w_qubits)\n", - " discard_array(s_qubits)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can now compile and execute our program on Selene." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "my_shots = main.emulator(n_qubits=7).with_seed(91919).with_shots(2000).run()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's look at the frequencies of the $|0\\rangle$ and $|1\\rangle$ measurement outcomes." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Counter({'0': 1414, '1': 586})\n" - ] - } - ], - "source": [ - "print(my_shots.register_counts()[\"c\"])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Conclusion" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Finally, lets get an estimate for the value of $|\\langle W| S \\rangle|^2$ by rearranging our expression for $P_0$\n", - "\n", - "$$\n", - "|\\langle W | S\\rangle|^2 = 2P_0 -1\n", - "$$" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "def eval_squared_overlap(shots: EmulatorResult) -> float:\n", - " counter = shots.register_counts()[\"c\"]\n", - " p0 = counter[\"0\"] / (counter[\"0\"] + counter[\"1\"])\n", - " return 2 * p0 - 1" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.4139999999999999" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "eval_squared_overlap(my_shots)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now lets compare with the classical calculation. We can just compute the inner product between the $|S\\rangle$ and $|W\\rangle$ statevectors with numpy." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.42857142857142866\n" - ] - } - ], - "source": [ - "print(abs(np.vdot(w_state, s_state)) ** 2)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "venv", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.13.4" - } - }, - "nbformat": 4, - "nbformat_minor": 4 + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# The SWAP test and loading `pytket` circuits\n", + "\n", + "**Download this notebook - {nb-download}`swap_test.ipynb`**\n", + "\n", + "In this example we will use the SWAP test to demonstrate the construction of a simple Guppy program and show how pytket circuits with multiple registers can be loaded as Guppy functions." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from guppylang import guppy\n", + "from guppylang.std.quantum import qubit, h, cx, toffoli, measure, discard_array\n", + "from guppylang.emulator import EmulatorResult\n", + "from guppylang.std.builtins import result, array\n", + "\n", + "\n", + "from pytket import Circuit\n", + "from pytket.circuit import StatePreparationBox\n", + "from pytket.passes import DecomposeBoxes\n", + "\n", + "import numpy as np" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Background" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The swap test is a simple quantum circuit that allows us to approximate the squared overlap between two quantum states. \n", + "\n", + "\n", + "![](./img/swap_test_circuit.png){w=240px align=center}\n", + "\n", + "\n", + "We apply controlled swap operation to swap the qubits in the $|\\psi\\rangle$ and $|\\phi\\rangle$ registers. This swaps the two target qubits if the control qubit is in the $|1\\rangle$ state and acts as the identity otherwise. \n", + "\n", + "\n", + "Notice how only the first qubit is measured, giving $|0\\rangle$ or $|1\\rangle$. The value of our squared inner product is related to the probability of measuring $|0\\rangle$ and $|1\\rangle$ as follows.\n", + "\n", + "$$\n", + "P_0 = \\frac{1}{2} + \\frac{1}{2}|\\langle\\psi|\\phi\\rangle|^2\\,, \\quad \n", + "P_1 = \\frac{1}{2} - \\frac{1}{2}|\\langle\\psi|\\phi\\rangle|^2\n", + "$$\n", + "\n", + "To approximate $|\\langle\\psi|\\phi\\rangle|^2$ within an error $\\epsilon$ we will need to run the program for $\\mathcal{O}(\\frac{1}{\\epsilon^2})$ shots. For more background on the swap test, see this [Wikipedia article](https://en.wikipedia.org/wiki/Swap_test).\n", + "\n", + "\n", + "In this example we will consider the following three qubit states\n", + "\n", + "$$\n", + "|W\\rangle = \\frac{1}{\\sqrt{3}} \\big(|001\\rangle + |010\\rangle + |100\\rangle \\big)\n", + "$$\n", + "\n", + "$$\n", + "|S\\rangle = \\frac{1}{\\sqrt{7}}\\big(|001\\rangle+|010\\rangle+|011\\rangle+|100\\rangle+|101\\rangle+|110\\rangle+|111\\rangle \\big)\\,.\n", + "$$\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Controlled SWAP" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Firstly lets define a Guppy function to implement our CSWAP gate in terms of Toffoli and CX gates." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "@guppy\n", + "def cswap(control: qubit, q1: qubit, q2: qubit) -> None:\n", + " cx(q1, q2)\n", + " toffoli(control, q2, q1)\n", + " cx(q1, q2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As we are doing the swap test for two states with three qubits each, we will need to use three CSWAP gates to swap all of the qubits in both state preparation registers." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "@guppy\n", + "def cswap_layer(ancilla: qubit, arr0: array[qubit, 3], arr1: array[qubit, 3]) -> None:\n", + " for i in range(3):\n", + " cswap(ancilla, arr0[i], arr1[i])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## State Preparation using pytket\n", + "\n", + "Now for the state preparation phase. Here we will leverage the [StatePreparationBox](https://docs.quantinuum.com/tket/api-docs/circuit.html#pytket.circuit.StatePreparationBox) construct from pytket.\n", + "\n", + "We will create a pytket `Circuit` with three registers. One qubit is used for the ancilla, and three qubits each for the two state preparation registers. " + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[StatePreparationBox s[0], s[1], s[2]; StatePreparationBox w[0], w[1], w[2]; ]" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Define two StatePreparationBox(es) by passing the amplitudes for |S> and |W> as numpy arrays\n", + "w_state = 1 / np.sqrt(3) * np.array([0, 1, 1, 0, 1, 0, 0, 0])\n", + "s_state = 1 / np.sqrt(7) * np.array([0] + [1] * 7)\n", + "\n", + "w_state_box = StatePreparationBox(w_state)\n", + "s_state_box = StatePreparationBox(s_state)\n", + "\n", + "\n", + "# Build a pytket Circuit with 7 qubits\n", + "pytket_circ = Circuit()\n", + "ancilla = pytket_circ.add_q_register(\"a\", 1)\n", + "w_qubits = pytket_circ.add_q_register(\"w\", 3)\n", + "s_qubits = pytket_circ.add_q_register(\"s\", 3)\n", + "\n", + "\n", + "# Append the state preparation subroutines to the empty circuit\n", + "pytket_circ.add_gate(w_state_box, list(w_qubits))\n", + "pytket_circ.add_gate(s_state_box, list(s_qubits))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Before loading the state preparation circuit into Guppy, we can use the [DecomposeBoxes](https://docs.quantinuum.com/tket/api-docs/passes.html#pytket.passes.DecomposeBoxes) pass to decompose the pytket circuit into CX and Ry gates." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "DecomposeBoxes().apply(pytket_circ)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can now load in the pytket circuit and create a corresponding Guppy function which takes the ancilla, $|S\\rangle$ and $|W\\rangle$ registers as inputs." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "pytket_state_prep = guppy.load_pytket(\"pytket_state_prep\", pytket_circ)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here, the separate quantum registers in the circuit are treated as distinct Guppy arrays. The loaded circuit can now be invoked as a `pytket_state_prep` Guppy function which takes three arrays (corresponding to `\"a\"` `\"s\"` and `\"w\"`) as input. Note that as with pytket the qubit ordering here is lexicographic. So the arrays are arranged in alphabetical order with `\"a\"` first followed by `\"s\"` and finally `\"w\"`.\n", + "\n", + "The `load_pytket` function has a `use_arrays` flag which is set to `True` by default. Setting this argument to `False` means that Guppy will not create arrays for the distinct registers but instead will treat each named qubit as a separate function argument to `pytket_state_prep`. In this case we would have seven distinct qubit arguments to `pytket_state_prep` instead of three arrays." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Execution on Selene" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can compose the different parts of our program together into a `main` function. Here we only need to measure the first qubit so we discard the two state preparation registers." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "@guppy\n", + "def main() -> None:\n", + " w_qubits = array(qubit() for _ in range(3))\n", + " s_qubits = array(qubit() for _ in range(3))\n", + " ancilla_reg = array(qubit())\n", + " # The pytket function only acts on arrays\n", + " pytket_state_prep(ancilla_reg, s_qubits, w_qubits)\n", + "\n", + " (ancilla,) = ancilla_reg\n", + "\n", + " h(ancilla)\n", + " cswap_layer(ancilla, w_qubits, s_qubits)\n", + " h(ancilla)\n", + "\n", + " result(\"c\", measure(ancilla).read())\n", + "\n", + " # We are only interested in measuring the first qubit\n", + " # Discard all the of |W> and |S> qubits to avoid linearity violation.\n", + " discard_array(w_qubits)\n", + " discard_array(s_qubits)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can now compile and execute our program on Selene." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "my_shots = main.emulator(n_qubits=7).with_seed(91919).with_shots(2000).run()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's look at the frequencies of the $|0\\rangle$ and $|1\\rangle$ measurement outcomes." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Counter({'0': 1414, '1': 586})\n" + ] + } + ], + "source": [ + "print(my_shots.register_counts()[\"c\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Conclusion" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, lets get an estimate for the value of $|\\langle W| S \\rangle|^2$ by rearranging our expression for $P_0$\n", + "\n", + "$$\n", + "|\\langle W | S\\rangle|^2 = 2P_0 -1\n", + "$$" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "def eval_squared_overlap(shots: EmulatorResult) -> float:\n", + " counter = shots.register_counts()[\"c\"]\n", + " p0 = counter[\"0\"] / (counter[\"0\"] + counter[\"1\"])\n", + " return 2 * p0 - 1" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.4139999999999999" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "eval_squared_overlap(my_shots)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now lets compare with the classical calculation. We can just compute the inner product between the $|S\\rangle$ and $|W\\rangle$ statevectors with numpy." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.42857142857142866\n" + ] + } + ], + "source": [ + "print(abs(np.vdot(w_state, s_state)) ** 2)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.4" + } + }, + "nbformat": 4, + "nbformat_minor": 4 } diff --git a/examples/t_factory.ipynb b/examples/t_factory.ipynb index 3074429f2..483ccfacd 100644 --- a/examples/t_factory.ipynb +++ b/examples/t_factory.ipynb @@ -33,7 +33,7 @@ " measure,\n", " qubit,\n", " ry,\n", - " rz,\n", + " rz, Measurement, collect_measurements,\n", ")\n", "\n", "from selene_sim import build, Quest\n", @@ -265,7 +265,7 @@ "source": [ "@guppy\n", "def attempt_measure(qs: array[qubit, 10] @ owned) -> None:\n", - " measure(qs[5])\n", + " measure(qs[5]).read()\n", "\n", "\n", "compiled = attempt_measure.compile()" @@ -294,7 +294,7 @@ "@guppy\n", "def measure_mask(\n", " qs: array[Option[qubit], n], mask: array[bool, n] @ owned\n", - ") -> array[int, n]:\n", + ") -> array[Measurement, n]:\n", " \"\"\"Measure all qubits in `qs` with a corresponding `True` index in `mask`.\"\"\"\n", " res = array(-1 for _ in range(n))\n", " idx = 0\n", @@ -302,7 +302,7 @@ " if m and qs[idx].is_some():\n", " # `take` swaps an optional value with nothing().\n", " q = qs[idx].take()\n", - " res[idx] = int(measure(q.unwrap()))\n", + " res[idx] = measure(q.unwrap())\n", " idx += 1\n", " return res\n", "\n", @@ -311,7 +311,7 @@ "def main() -> None:\n", " qs = array(some(qubit()) for _ in range(3))\n", " mask = array(True, False, True)\n", - " measure_mask(qs, mask)\n", + " collect_measurements(measure_mask(qs, mask))\n", " # We need to consume the array of options at some point, as it can't be leaked.\n", " for q_opt in qs:\n", " if q_opt.is_some():\n", diff --git a/guppylang-internals/src/guppylang_internals/std/_internal/compiler/qsystem.py b/guppylang-internals/src/guppylang_internals/std/_internal/compiler/qsystem.py index 5471969e5..64a4f21c2 100644 --- a/guppylang-internals/src/guppylang_internals/std/_internal/compiler/qsystem.py +++ b/guppylang-internals/src/guppylang_internals/std/_internal/compiler/qsystem.py @@ -10,11 +10,9 @@ RNGCONTEXT_T, ) from guppylang_internals.std._internal.compiler.tket_exts import ( - FUTURES_EXTENSION, - QSYSTEM_EXTENSION, QSYSTEM_RANDOM_EXTENSION, ) -from guppylang_internals.std._internal.util import external_op, quantum_op +from guppylang_internals.std._internal.util import external_op class RandomIntCompiler(CustomInoutCallCompiler): @@ -48,34 +46,3 @@ def compile_with_inouts(self, args: list[Wire]) -> CallReturnWires: ) [rnd] = self.builder.add_op(iwiden_s(5, 6), rnd) return CallReturnWires(regular_returns=[rnd], inout_returns=[ctx]) - - -class LazyMeasureResetCompiler(CustomInoutCallCompiler): - def compile_with_inouts(self, args: list[Wire]) -> CallReturnWires: - [q] = args - [q, measurement] = self.builder.add_op( - quantum_op("LazyMeasureReset", ext=QSYSTEM_EXTENSION)( - ht.FunctionType([ht.Qubit], [ht.Qubit, future_bool_type()]), - (), - self.ctx, - ), - q, - ) - return CallReturnWires(regular_returns=[measurement], inout_returns=[q]) - - -def future_bool_type() -> ht.ExtType: - return FUTURES_EXTENSION.get_type("Future").instantiate([ht.TypeTypeArg(ht.Bool)]) - - -class ReadFutureBoolCompiler(CustomInoutCallCompiler): - def compile_with_inouts(self, args: list[Wire]) -> CallReturnWires: - [future] = args - [bool_value] = self.builder.add_op( - FUTURES_EXTENSION.get_op("Read").instantiate( - [ht.TypeTypeArg(ht.Bool)], - ht.FunctionType([future_bool_type()], [ht.Bool]), - ), - future, - ) - return CallReturnWires(regular_returns=[bool_value], inout_returns=[]) diff --git a/guppylang-internals/src/guppylang_internals/std/_internal/compiler/quantum.py b/guppylang-internals/src/guppylang_internals/std/_internal/compiler/quantum.py index 20703b8c3..400faef67 100644 --- a/guppylang-internals/src/guppylang_internals/std/_internal/compiler/quantum.py +++ b/guppylang-internals/src/guppylang_internals/std/_internal/compiler/quantum.py @@ -84,7 +84,11 @@ def compile_with_inouts(self, args: list[Wire]) -> CallReturnWires: [q, bit] = self.builder.add_op( quantum_op(self.opname, ext=self.ext)( ht.FunctionType( - [ht.Qubit], [MEASUREMENT_EXTENSION.get_type("Measurement"), ht.Bool] + [ht.Qubit], + [ + ht.ExtType(MEASUREMENT_EXTENSION.get_type("Measurement")), + ht.Bool, + ], ), (), self.ctx, diff --git a/guppylang/src/guppylang/std/qsystem/__init__.py b/guppylang/src/guppylang/std/qsystem/__init__.py index ec7ae1b2f..fa055b8e8 100644 --- a/guppylang/src/guppylang/std/qsystem/__init__.py +++ b/guppylang/src/guppylang/std/qsystem/__init__.py @@ -3,11 +3,6 @@ from typing import no_type_check from guppylang_internals.decorator import custom_function, custom_type, hugr_op -from guppylang_internals.std._internal.compiler.qsystem import ( - LazyMeasureResetCompiler, - ReadFutureBoolCompiler, - future_bool_type, -) from guppylang_internals.std._internal.compiler.quantum import ( InoutMeasureCompilerMsmt, ) @@ -123,13 +118,15 @@ def rz(q: qubit, angle: angle) -> None: @hugr_op(quantum_op("Measure", ext=QSYSTEM_EXTENSION)) @no_type_check def measure(q: qubit @ owned) -> Measurement: - """Measure a qubit destructively.""" + """Request a destructive lazy measurement of a qubit, returning a `Measurement` + value. Call `.read()` on the value to block until the result is available. + """ @custom_function(InoutMeasureCompilerMsmt("MeasureReset", QSYSTEM_EXTENSION)) @no_type_check def measure_and_reset(q: qubit) -> Measurement: - """MeasureReset operation from the qsystem extension.""" + """Like `measure`, but also resets the qubit after measurement.""" @hugr_op(quantum_op("Reset", ext=QSYSTEM_EXTENSION)) @@ -197,18 +194,20 @@ def discard(self: "MaybeLeaked @ owned") -> None: self._measurement.discard() -@hugr_op(quantum_op("LazyMeasure", ext=QSYSTEM_EXTENSION)) +@guppy @no_type_check -def lazy_measure(q: qubit @ owned) -> "FutureMeasurement": - """Request a destructive lazy measurement of a qubit, returning a `Measurement` - value. Call `.read()` on the value to block until the result is available. - """ +def lazy_measure(q: qubit @ owned) -> Measurement: + """Same as `measure` as the standard measurement behaviour is already lazy.""" + return measure(q) -@custom_function(compiler=LazyMeasureResetCompiler()) +@guppy @no_type_check -def lazy_measure_and_reset(q: qubit) -> "FutureMeasurement": - """Like `lazy_measure`, but also resets the qubit after measurement.""" +def lazy_measure_and_reset(q: qubit) -> Measurement: + """Same as `measure_and_reset` as the standard measurement behaviour is already + lazy. + """ + return measure_and_reset(q) N = guppy.nat_var("N") @@ -218,47 +217,13 @@ def lazy_measure_and_reset(q: qubit) -> "FutureMeasurement": @no_type_check def lazy_measure_array( qubits: array[qubit, N] @ owned, -) -> array["FutureMeasurement", N]: - """Request a destructive lazy measurement of an array of qubits, returning an array - of `Measurement` values. Call `.read()` on each value to block until results are - available. +) -> array["Measurement", N]: + """Same as `measure_array` as the standard measurement behaviour is already + lazy. """ return array(lazy_measure(q) for q in qubits) -@custom_type( - future_bool_type(), - copyable=False, - droppable=False, -) -class FutureMeasurement: - """Represents the result of a lazy measurement which needs to be explicitly read - before being used.""" - - @custom_function(compiler=ReadFutureBoolCompiler()) - @no_type_check - def read(self: "FutureMeasurement" @ owned) -> bool: - """Read the measurement result, consuming it. Blocks until the result is - available if the measurement hasn't been performed yet since being requested. - """ - - @guppy - @no_type_check - def __consume_as_bool__(self: "FutureMeasurement" @ owned) -> bool: - return self.read() - - -@guppy -@no_type_check -def collect_measurements( - measurements: array[FutureMeasurement, N] @ owned, -) -> array[bool, N]: - """Block on each measurement until it is available and collect results into an - array of bools. - """ - return array(m.read() for m in measurements) - - # ------------------------------------------------------ # --------- Internal definitions ----------------------- # ------------------------------------------------------ diff --git a/guppylang/src/guppylang/std/quantum/__init__.py b/guppylang/src/guppylang/std/quantum/__init__.py index b10d370ea..30e2d353c 100644 --- a/guppylang/src/guppylang/std/quantum/__init__.py +++ b/guppylang/src/guppylang/std/quantum/__init__.py @@ -44,12 +44,25 @@ def discard(self: "qubit" @ owned) -> None: @custom_type( - MEASUREMENT_EXTENSION.get_type("Measurement"), copyable=False, droppable=False + ht.ExtType(MEASUREMENT_EXTENSION.get_type("Measurement")), + copyable=False, + droppable=False, ) class Measurement: + """Represents the result of a lazy measurement which needs to be explicitly read + before being used.""" + @hugr_op(quantum_op("Read", MEASUREMENT_EXTENSION)) @no_type_check - def read(self) -> bool: ... + def read(self: "Measurement" @ owned) -> bool: + """Read the measurement result, consuming it. Blocks until the result is + available if the measurement hasn't been performed yet since being requested. + """ + + @guppy + @no_type_check + def __consume_as_bool__(self: "Measurement" @ owned) -> bool: + return self.read() @hugr_op(quantum_op("TryQAlloc")) @@ -373,7 +386,9 @@ def discard(q: qubit @ owned) -> None: @hugr_op(quantum_op("MeasureFree")) @no_type_check def measure(q: qubit @ owned) -> Measurement: - """Measure a single qubit destructively.""" + """Request a destructive lazy measurement of a qubit, returning a `Measurement` + value. Call `.read()` on the value to block until the result is available. + """ @hugr_op(quantum_op("Reset")) @@ -388,7 +403,10 @@ def reset(q: qubit) -> None: @guppy @no_type_check def measure_array(qubits: array[qubit, N] @ owned) -> array[Measurement, N]: - """Measure an array of qubits, returning an array of bools.""" + """Request a destructive lazy measurement of an array of qubits, returning an array + of `Measurement` values. Call `.read()` on each value or `collect_measurements(...)` + on the whole array to block until results are available. + """ return array(measure(q) for q in qubits) @@ -402,6 +420,17 @@ def discard_array(qubits: array[qubit, N] @ owned) -> None: qubits.discard_all_taken() +@guppy +@no_type_check +def collect_measurements( + measurements: array[Measurement, N] @ owned, +) -> array[bool, N]: + """Block on each measurement until it is available and collect results into an + array of bools. + """ + return array(m.read() for m in measurements) + + # -------NON-PRIMITIVE------- diff --git a/pyproject.toml b/pyproject.toml index 6929865d8..e44574604 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,8 +30,19 @@ guppylang-internals = { workspace = true } miette-py = { workspace = true } # Uncomment these to test the latest dependency version during development # hugr = { git = "https://github.com/quantinuum/hugr", subdirectory = "hugr-py", rev = "a4da8ef" } -tket = { git = "https://github.com/quantinuum/tket2", subdirectory = "tket-py", rev = "9f1ec02" } +tket = {path = "/Users/tatiana.sedelnikov/Documents/Code/monohugr/repositories/tket2/tket-py", editable = true} +# Sources from repository: guppylang +# Sources from repository: tket2 +tket_eccs = {path = "/Users/tatiana.sedelnikov/Documents/Code/monohugr/repositories/tket2/tket-eccs", editable = true} +tket-exts = {path = "/Users/tatiana.sedelnikov/Documents/Code/monohugr/repositories/tket2/tket-exts", editable = true} +selene-hugr-qis-compiler = {path = "/Users/tatiana.sedelnikov/Documents/Code/monohugr/repositories/tket2/qis-compiler", editable = true} +# Sources from repository: guppylang +# Sources from repository: tket2 +# Sources from repository: guppylang +# Sources from repository: tket2 +# Sources from repository: guppylang +# Sources from repository: tket2 [build-system] requires = ["hatchling"] build-backend = "hatchling.build" diff --git a/tests/error/linear_errors/branch_use_field1.py b/tests/error/linear_errors/branch_use_field1.py index 0362d4a92..a6d4a20a8 100644 --- a/tests/error/linear_errors/branch_use_field1.py +++ b/tests/error/linear_errors/branch_use_field1.py @@ -11,7 +11,7 @@ class MyStruct: def foo(b: bool) -> bool: s = MyStruct(qubit()) if b: - return measure(s.q) + return measure(s.q).read() return False diff --git a/tests/error/linear_errors/branch_use_field2.err b/tests/error/linear_errors/branch_use_field2.err index e75ddd939..1996e4e20 100644 --- a/tests/error/linear_errors/branch_use_field2.err +++ b/tests/error/linear_errors/branch_use_field2.err @@ -1,7 +1,7 @@ Error: Copy violation (at $FILE:16:11) | 14 | if b: -15 | measure(s.q2) +15 | measure(s.q2).read() 16 | return s | ^ Field `s.q2` with non-copyable type `qubit` cannot be | returned ... @@ -9,7 +9,7 @@ Error: Copy violation (at $FILE:16:11) Note: | 14 | if b: -15 | measure(s.q2) +15 | measure(s.q2).read() | ---- Field `s.q2` already consumed here Guppy compilation failed due to 1 previous error diff --git a/tests/error/linear_errors/branch_use_field2.py b/tests/error/linear_errors/branch_use_field2.py index 81a3b4061..709b570aa 100644 --- a/tests/error/linear_errors/branch_use_field2.py +++ b/tests/error/linear_errors/branch_use_field2.py @@ -12,7 +12,7 @@ class MyStruct: @guppy def foo(b: bool, s: MyStruct @owned) -> MyStruct: if b: - measure(s.q2) + measure(s.q2).read() return s diff --git a/tests/error/linear_errors/field_copy_nested1.err b/tests/error/linear_errors/field_copy_nested1.err index 3bded80de..552fe08f5 100644 --- a/tests/error/linear_errors/field_copy_nested1.err +++ b/tests/error/linear_errors/field_copy_nested1.err @@ -1,6 +1,6 @@ Error: Copy violation (at $FILE:21:11) | -19 | measure(s.q) +19 | measure(s.q).read() 20 | s.q = s.x.q 21 | return s | ^ Variable `s` with non-copyable type `MyStruct1` cannot be @@ -8,7 +8,7 @@ Error: Copy violation (at $FILE:21:11) Note: | -19 | measure(s.q) +19 | measure(s.q).read() 20 | s.q = s.x.q | ----- ... since the member `s.x.q` with non-copyable type `qubit` | was already moved here diff --git a/tests/error/linear_errors/field_copy_nested1.py b/tests/error/linear_errors/field_copy_nested1.py index 4a2ccd6e1..1d208e3d6 100644 --- a/tests/error/linear_errors/field_copy_nested1.py +++ b/tests/error/linear_errors/field_copy_nested1.py @@ -16,7 +16,7 @@ class MyStruct2: @guppy def foo(s: MyStruct1 @owned) -> MyStruct1: - measure(s.q) + measure(s.q).read() s.q = s.x.q return s diff --git a/tests/error/linear_errors/field_copy_nested2.err b/tests/error/linear_errors/field_copy_nested2.err index ee474063e..bf2bcd48d 100644 --- a/tests/error/linear_errors/field_copy_nested2.err +++ b/tests/error/linear_errors/field_copy_nested2.err @@ -1,7 +1,7 @@ Error: Copy violation (at $FILE:20:21) | 18 | def foo(s: MyStruct1 @owned) -> MyStruct1: -19 | measure(s.x.q1) +19 | measure(s.x.q1).read() 20 | return MyStruct1(s.x) | ^^^ Field `s.x` with non-copyable type `MyStruct2` cannot be | consumed ... @@ -9,7 +9,7 @@ Error: Copy violation (at $FILE:20:21) Note: | 18 | def foo(s: MyStruct1 @owned) -> MyStruct1: -19 | measure(s.x.q1) +19 | measure(s.x.q1).read() | ------ ... since the member `s.x.q1` with non-copyable type `qubit` | was already consumed here diff --git a/tests/error/linear_errors/field_copy_nested2.py b/tests/error/linear_errors/field_copy_nested2.py index ec271db53..7d965e2a2 100644 --- a/tests/error/linear_errors/field_copy_nested2.py +++ b/tests/error/linear_errors/field_copy_nested2.py @@ -16,7 +16,7 @@ class MyStruct2: @guppy def foo(s: MyStruct1 @owned) -> MyStruct1: - measure(s.x.q1) + measure(s.x.q1).read() return MyStruct1(s.x) diff --git a/tests/error/linear_errors/unused_field3.py b/tests/error/linear_errors/unused_field3.py index af6a84049..37731b431 100644 --- a/tests/error/linear_errors/unused_field3.py +++ b/tests/error/linear_errors/unused_field3.py @@ -17,7 +17,7 @@ class MyStruct2: @guppy def foo(s: MyStruct1 @owned) -> int: - measure(s.x.q1) + measure(s.x.q1).read() return s.y diff --git a/tests/error/modifier_errors/bad_custom_call.err b/tests/error/modifier_errors/bad_custom_call.err index 954dc8522..cf1fbb0f9 100644 --- a/tests/error/modifier_errors/bad_custom_call.err +++ b/tests/error/modifier_errors/bad_custom_call.err @@ -2,7 +2,7 @@ Error: Dagger constraint violation (at $FILE:9:4) | 7 | @guppy(dagger=True) 8 | def test(x: qubit @owned) -> None: -9 | measure(x) +9 | measure(x).read() | ^^^^^^^^^^ This function cannot be called in a dagger context Guppy compilation failed due to 1 previous error diff --git a/tests/error/modifier_errors/bad_custom_call.py b/tests/error/modifier_errors/bad_custom_call.py index 7f624502d..b553a6aa4 100644 --- a/tests/error/modifier_errors/bad_custom_call.py +++ b/tests/error/modifier_errors/bad_custom_call.py @@ -6,7 +6,7 @@ @guppy(dagger=True) def test(x: qubit @owned) -> None: - measure(x) + measure(x).read() test.compile_function() diff --git a/tests/error/tracing_errors/linear_copy4.py b/tests/error/tracing_errors/linear_copy4.py index 2f92eb2ab..89199a8d2 100644 --- a/tests/error/tracing_errors/linear_copy4.py +++ b/tests/error/tracing_errors/linear_copy4.py @@ -5,7 +5,7 @@ @guppy.comptime def test() -> None: q = qubit() - measure(q) + measure(q).read() h(q) diff --git a/tests/error/tracing_errors/linear_drop3.py b/tests/error/tracing_errors/linear_drop3.py index 240611211..09360931c 100644 --- a/tests/error/tracing_errors/linear_drop3.py +++ b/tests/error/tracing_errors/linear_drop3.py @@ -6,7 +6,7 @@ @guppy.comptime def test(qs: array[qubit, 10] @ owned) -> None: for i in range(9): - measure(qs[i]) + measure(qs[i]).read() test.compile() diff --git a/tests/error/tracing_errors/linear_not_owned1.err b/tests/error/tracing_errors/linear_not_owned1.err index 410fb7c50..d04e87e64 100644 --- a/tests/error/tracing_errors/linear_not_owned1.err +++ b/tests/error/tracing_errors/linear_not_owned1.err @@ -4,7 +4,7 @@ Error: Error in comptime function return (at $FILE:6:0) 5 | @guppy.comptime 6 | def test(q: qubit) -> None: | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ -7 | measure(q) +7 | measure(q).read() | ^^^^^^^^^^^^^^ Argument `q` is borrowed, so it is implicitly returned to the caller. Value with diff --git a/tests/error/tracing_errors/linear_not_owned1.py b/tests/error/tracing_errors/linear_not_owned1.py index 2de79cdc8..7bb81231f 100644 --- a/tests/error/tracing_errors/linear_not_owned1.py +++ b/tests/error/tracing_errors/linear_not_owned1.py @@ -4,7 +4,7 @@ @guppy.comptime def test(q: qubit) -> None: - measure(q) + measure(q).read() test.compile() diff --git a/tests/integration/notebooks/demo.ipynb b/tests/integration/notebooks/demo.ipynb index db8fd7c1a..6021e8a08 100644 --- a/tests/integration/notebooks/demo.ipynb +++ b/tests/integration/notebooks/demo.ipynb @@ -89,7 +89,7 @@ " h(q2)\n", " # Measure\n", " b1, b2 = measure(q1), measure(q2)\n", - " return b1 ^ b2" + " return b1.read() ^ b2.read()" ] }, { diff --git a/tests/integration/notebooks/errorsdemo.ipynb b/tests/integration/notebooks/errorsdemo.ipynb index 2f93926a9..5e70f7c04 100644 --- a/tests/integration/notebooks/errorsdemo.ipynb +++ b/tests/integration/notebooks/errorsdemo.ipynb @@ -607,7 +607,7 @@ "@guppy\n", "def foo(b: bool, s: MyStruct @ owned) -> MyStruct:\n", " if b:\n", - " measure(s.q2)\n", + " measure(s.q2).read()\n", "\n", " return s\n", "\n", @@ -848,7 +848,7 @@ "def foo(b: bool) -> bool:\n", " s = MyStruct(qubit())\n", " if b:\n", - " return measure(s.q)\n", + " return measure(s.q).read()\n", " return False\n", "\n", "\n", diff --git a/tests/integration/std/test_mem.py b/tests/integration/std/test_mem.py index 262c9237a..a7f37cd59 100644 --- a/tests/integration/std/test_mem.py +++ b/tests/integration/std/test_mem.py @@ -1,13 +1,13 @@ from guppylang.decorator import guppy from guppylang.std.builtins import owned from guppylang.std.mem import with_owned -from guppylang.std.quantum import qubit, measure +from guppylang.std.quantum import qubit, measure, Measurement def test_with_owned(validate): @guppy - def measure_and_reset(q: qubit) -> bool: - def helper(q: qubit @ owned) -> tuple[bool, qubit]: + def measure_and_reset(q: qubit) -> Measurement: + def helper(q: qubit @ owned) -> tuple[Measurement, qubit]: return measure(q), qubit() return with_owned(q, helper) @@ -17,8 +17,8 @@ def helper(q: qubit @ owned) -> tuple[bool, qubit]: def test_with_owned_row(validate): @guppy - def measure_and_reset(q: qubit) -> tuple[bool, int]: - def helper(q: qubit @ owned) -> tuple[tuple[bool, int], qubit]: + def measure_and_reset(q: qubit) -> tuple[Measurement, int]: + def helper(q: qubit @ owned) -> tuple[tuple[Measurement, int], qubit]: return (measure(q), 42), qubit() return with_owned(q, helper) diff --git a/tests/integration/test_array.py b/tests/integration/test_array.py index c823c5ae9..1cbbadcc9 100644 --- a/tests/integration/test_array.py +++ b/tests/integration/test_array.py @@ -694,7 +694,7 @@ def main() -> int: q = qs.take(3) result("after_take", qs.is_borrowed(3)) # True qs.try_take(3).unwrap_nothing() - measure(q) + measure(q).read() # But we can put something back qs.put(qubit(), 3) diff --git a/tests/integration/test_array_index.py b/tests/integration/test_array_index.py index c6ae0b9f4..7e9fc2e7d 100644 --- a/tests/integration/test_array_index.py +++ b/tests/integration/test_array_index.py @@ -122,7 +122,7 @@ def test_method_take_valid_index(): def main() -> None: qs = array(qubit() for _ in range(10)) q = qs.take(5) # inbounds, take qubit out of array - measure(q) + measure(q).read() discard_array(qs) main.compile() @@ -142,7 +142,7 @@ def test_method_take_put_valid_index(): @guppy def main() -> None: qs = array(qubit() for _ in range(10)) - measure(qs.take(3)) # Take it out to make space for the new one + measure(qs.take(3)).read() # Take it out to make space for the new one qs.put(qubit(), 3) h(qs[3]) discard_array(qs) diff --git a/tests/integration/test_emulator.py b/tests/integration/test_emulator.py index 076bfbbf5..2c8e08dde 100644 --- a/tests/integration/test_emulator.py +++ b/tests/integration/test_emulator.py @@ -20,6 +20,7 @@ t, measure_array, discard_array, + collect_measurements, ) from guppylang.std.angles import angle, pi from guppylang.std.qsystem import zz_max, zz_phase, phased_x, rz as qsystem_rz @@ -44,7 +45,7 @@ def test_basic_emulation() -> None: @guppy def main() -> None: - result("c", measure(qubit())) + result("c", measure(qubit()).read()) res = main.emulator(1).run() expected = EmulatorResult([[("c", False)]]) @@ -104,7 +105,7 @@ def main() -> None: def test_no_given_qubits() -> None: @guppy() def main() -> None: - result("c", measure(qubit())) + result("c", measure(qubit()).read()) with pytest.raises( EmulatorBuildError, @@ -120,7 +121,7 @@ def main() -> None: def test_hinted_qubits() -> None: @guppy(max_qubits=1) def main() -> None: - result("c", measure(qubit())) + result("c", measure(qubit()).read()) shots = main.emulator().coinflip_sim().with_seed(0).with_shots(1).run() assert shots[0].as_dict()["c"] == 1 @@ -130,7 +131,7 @@ def test_hinted_qubits_with_given_qubits() -> None: @guppy(max_qubits=1) def main() -> None: qubits = array(qubit() for _ in range(4)) - result("c", measure_array(qubits)) + result("c", collect_measurements(measure_array(qubits))) shots = main.emulator(n_qubits=4).coinflip_sim().with_seed(0).with_shots(1).run() assert shots[0].as_dict()["c"] == [1, 0, 1, 0] @@ -139,7 +140,7 @@ def main() -> None: def test_hinted_qubits_with_insufficient_given_qubits() -> None: @guppy(max_qubits=3) def main() -> None: - result("c", measure(qubit())) + result("c", measure(qubit()).read()) with pytest.raises( EmulatorBuildError, @@ -158,7 +159,7 @@ def main() -> None: x(q) state_result("s", q) state_result("s", q) - result("c", measure(q)) + result("c", measure(q).read()) res = main.emulator(1).run() (shot_states,) = res.partial_states() @@ -278,7 +279,7 @@ def main() -> None: b2 = project_z(q0) result("c0", b1) result("c1", b2) - result("c2", measure(q0)) + result("c2", measure(q0).read()) res = _build_run(main, n_qubits=2, n_shots=1, seed=12).results[0].entries assert dict(res) == {"c0": 1, "c1": 0, "c2": 0} @@ -291,7 +292,7 @@ def test_multi_alloc_free(): def main() -> None: for _ in range(comptime(N)): q = qubit() - result("c", measure(q)) + result("c", measure(q).read()) res = _build_run(main, n_qubits=2).results[0].entries assert res == [("c", 0)] * N @@ -348,7 +349,7 @@ def main() -> None: result("shot", current_shot) if current_shot == 5: t(q) - result("measurement", measure(q)) + result("measurement", measure(q).read()) with pytest.raises( EmulatorError, match="not representable in stabiliser form" diff --git a/tests/integration/test_extensions.py b/tests/integration/test_extensions.py index e037a90e5..41de66f58 100644 --- a/tests/integration/test_extensions.py +++ b/tests/integration/test_extensions.py @@ -8,7 +8,6 @@ from hugr import ext, tys, ops from guppylang.decorator import hugr_op -import tket_exts def custom_ext_op( @@ -39,13 +38,11 @@ def op(ty: tys.FunctionType, inst: Inst, ctx: ToHugrContext) -> ops.DataflowOp: def test_custom_extension(validate): - opaque_bool_ty = tket_exts.bool.bool_t - # Build an extension with a custom op op_def = ext.OpDef( name="CustomOp", description="outer op with lowering", - signature=ext.OpDefSig(tys.FunctionType.endo([opaque_bool_ty])), + signature=ext.OpDefSig(tys.FunctionType.endo([tys.Bool])), ) extension = ext.Extension( version=ext.Version(0, 1, 0), @@ -66,14 +63,12 @@ def ret(b: bool) -> array[bool, 1]: assert {ext.name for ext in ret.extensions} == { "outer", - "tket.bool", } assert ret.modules[0].used_extensions().used_extensions.ids() == { "prelude", "collections.array", "collections.borrow_arr", "outer", - "tket.bool", } validate(ret) diff --git a/tests/integration/test_inout.py b/tests/integration/test_inout.py index e91d9677d..fb23a42ce 100644 --- a/tests/integration/test_inout.py +++ b/tests/integration/test_inout.py @@ -318,7 +318,7 @@ def test() -> bool: q0 = qubit() result = q0.project_z() - q0.measure() + q0.measure().read() qubit().discard() return result diff --git a/tests/integration/test_linear.py b/tests/integration/test_linear.py index 3f23be895..8ae249999 100644 --- a/tests/integration/test_linear.py +++ b/tests/integration/test_linear.py @@ -246,7 +246,7 @@ def test(s: MyStruct @ owned, b: bool) -> MyStruct: def test_measure(validate): @guppy def test(q: qubit @ owned, x: int) -> int: - b = measure(q) + b = measure(q).read() return x validate(test.compile_function()) @@ -306,7 +306,7 @@ def foo(i: int) -> bool: b = False while True: q = qubit() - b ^= measure(q) + b ^= measure(q).read() if i == 0: break i -= 1 @@ -351,7 +351,7 @@ def test_for_measure(validate): def test(qs: list[qubit] @ owned) -> bool: parity = False for q in qs: - parity |= measure(q) + parity |= measure(q).read() return parity validate(test.compile_function()) diff --git a/tests/integration/test_pytket_circuits.py b/tests/integration/test_pytket_circuits.py index efd52fc2f..779b0c246 100644 --- a/tests/integration/test_pytket_circuits.py +++ b/tests/integration/test_pytket_circuits.py @@ -363,8 +363,8 @@ def main() -> None: guppy_circ(a, b) - result("a", measure(a)) - result("b", measure(b)) + result("a", measure(a).read()) + result("b", measure(b).read()) # deterministic - should always be 0 res = main.emulator(n_qubits=2).run() diff --git a/tests/integration/test_qsystem.py b/tests/integration/test_qsystem.py index 32fde5ad1..5ff931fa6 100644 --- a/tests/integration/test_qsystem.py +++ b/tests/integration/test_qsystem.py @@ -5,14 +5,19 @@ from guppylang.std.qsystem import ( MaybeLeaked, - collect_measurements, lazy_measure, lazy_measure_array, lazy_measure_and_reset, measure_leaked, ) from guppylang.std.qsystem.utils import get_current_shot -from guppylang.std.quantum import qubit, measure_array, x +from guppylang.std.quantum import ( + qubit, + measure_array, + x, + collect_measurements, + Measurement, +) from guppylang.std.qsystem.functional import ( phased_x, zz_phase, @@ -30,7 +35,7 @@ def test_qsystem(validate): # type: ignore[no-untyped-def] """Compile various operations from the qsystem extension.""" @guppy - def test(q1: qubit @ owned, q2: qubit @ owned, a1: angle) -> bool: + def test(q1: qubit @ owned, q2: qubit @ owned, a1: angle) -> Measurement: shot = get_current_shot() q1 = phased_x(q1, a1, a1) q1, q2 = zz_phase(q1, q2, a1) @@ -56,7 +61,7 @@ def test() -> tuple[int, float, int, int, angle, angle]: rint_bnd = rng.random_int_bounded(100) ar = array(qubit() for _ in range(5)) rng.shuffle(ar) - _ = measure_array(ar) + _ = collect_measurements(measure_array(ar)) dist = make_discrete_distribution(array(0.0, 1.0, 2.0, 3.0)) rint_discrete = dist.sample(rng) rangle = rng.random_angle() @@ -149,7 +154,9 @@ def test() -> int: x(q) first_result = lazy_measure_and_reset(q) second_result = measure(q) - if first_result and not second_result: # First expect flip, then expect reset + if ( + first_result.read() and not second_result.read() + ): # First expect flip, then expect reset return 1 return 0 diff --git a/tests/integration/test_quantum.py b/tests/integration/test_quantum.py index 060690206..3b37650d0 100644 --- a/tests/integration/test_quantum.py +++ b/tests/integration/test_quantum.py @@ -7,7 +7,6 @@ from guppylang.std.builtins import owned, array, panic, result from guppylang.std.platform import barrier - from guppylang.std import quantum as q from guppylang.std.quantum import ( discard, @@ -16,6 +15,7 @@ maybe_qubit, measure_array, discard_array, + Measurement, ) from guppylang.std.quantum.functional import ( cx, @@ -46,7 +46,7 @@ def test_alloc(validate): @guppy - def test() -> tuple[bool, bool]: + def test() -> tuple[Measurement, Measurement]: q1, q2 = qubit(), maybe_qubit().unwrap() q1, q2 = cx(q1, q2) return (measure(q1), measure(q2)) @@ -99,7 +99,7 @@ def test_measure_ops(validate): """Compile various measurement-related operations.""" @guppy - def test(q1: qubit @ owned, q2: qubit @ owned) -> tuple[bool, bool]: + def test(q1: qubit @ owned, q2: qubit @ owned) -> tuple[bool, Measurement]: q1, b1 = project_z(q1) q1 = discard(q1) q2 = reset(q2) @@ -127,7 +127,7 @@ def test_measure_array(validate): """Build and measure array.""" @guppy - def test() -> array[bool, 10]: + def test() -> array[Measurement, 10]: qs = array(qubit() for _ in range(10)) return measure_array(qs) @@ -249,6 +249,6 @@ def test() -> None: barrier(q1, array(1, 2, 3), 2 + 3, x) result("c", x) - result("c2", measure(q1)) + result("c2", measure(q1).read()) validate(test.compile_function()) diff --git a/tests/integration/test_side_effect_ordering.py b/tests/integration/test_side_effect_ordering.py index d7eefe37c..9d8761a00 100644 --- a/tests/integration/test_side_effect_ordering.py +++ b/tests/integration/test_side_effect_ordering.py @@ -58,7 +58,7 @@ def test_input_result_output(validate): def main() -> None: q = qubit() q = f(q) - b = measure(q) + b = measure(q).read() result("b", b) @@ -103,7 +103,7 @@ def test() -> None: q1 = qubit() discard(q1) q2 = qubit() - measure(q2) + measure(q2).read() compiled = test.compile_function() validate(compiled) @@ -148,7 +148,7 @@ def test_nested(validate): @guppy def test() -> None: qs1 = array(qubit() for _ in range(10)) - array(measure(q) for q in qs1) + array(measure(q).read() for q in qs1) qs2 = array(qubit() for _ in range(10)) array(discard(q) for q in qs2) diff --git a/tests/integration/tracing/test_quantum.py b/tests/integration/tracing/test_quantum.py index b0e082cee..4d44d2bc0 100644 --- a/tests/integration/tracing/test_quantum.py +++ b/tests/integration/tracing/test_quantum.py @@ -18,7 +18,7 @@ def foo() -> qubit: def bar(q1: qubit) -> None: q2 = qubit() cx(q1, q2) - measure(q2) + measure(q2).read() validate(foo.compile_function()) diff --git a/uv.lock b/uv.lock index 28081764c..7e1095ad2 100644 --- a/uv.lock +++ b/uv.lock @@ -993,7 +993,7 @@ requires-dist = [ { name = "guppylang-internals", editable = "guppylang-internals" }, { name = "numpy", specifier = "~=2.0" }, { name = "pytket", specifier = ">=1.34" }, - { name = "selene-hugr-qis-compiler", specifier = "~=0.2.9" }, + { name = "selene-hugr-qis-compiler", editable = "../monohugr/repositories/tket2/qis-compiler" }, { name = "selene-sim", specifier = "~=0.2.7" }, { name = "tqdm", specifier = ">=4.67.1" }, { name = "types-tqdm", specifier = ">=4.67.0.20250809" }, @@ -1017,8 +1017,8 @@ dependencies = [ requires-dist = [ { name = "hugr", specifier = "~=0.16.0" }, { name = "pytket", specifier = ">=1.34" }, - { name = "tket", git = "https://github.com/quantinuum/tket2?subdirectory=tket-py&rev=9f1ec02" }, - { name = "tket-exts", specifier = "~=0.12.0" }, + { name = "tket", editable = "../monohugr/repositories/tket2/tket-py" }, + { name = "tket-exts", editable = "../monohugr/repositories/tket2/tket-exts" }, { name = "typing-extensions", specifier = ">=4.9.0,<5" }, { name = "wasmtime", specifier = ">=38.0,<43.1" }, ] @@ -3404,13 +3404,16 @@ wheels = [ [[package]] name = "selene-hugr-qis-compiler" version = "0.2.10" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/aa/6b3f287f9330bf077c95bfef3ab350ab1eac0707f7111c38596a22554ecf/selene_hugr_qis_compiler-0.2.10-cp310-abi3-macosx_13_0_arm64.whl", hash = "sha256:2912702073aa37f1bfd1d42678b972b3b10525ed3f5f003091519512331142bd", size = 29532801, upload-time = "2025-11-10T14:48:39.26Z" }, - { url = "https://files.pythonhosted.org/packages/f5/9c/77a1b81e1cedbde6f401fbdc2302bc2221c8cbc46c924ac0bd9cda979799/selene_hugr_qis_compiler-0.2.10-cp310-abi3-macosx_13_0_x86_64.whl", hash = "sha256:60ece08d7ffb792149029f8aad483c546d2f2db8a5d265906bed41479bdc5a9e", size = 32232684, upload-time = "2025-11-10T14:48:42.701Z" }, - { url = "https://files.pythonhosted.org/packages/9d/d0/569e59983549fcf4c050f892927a55af92e0b0ab0622610c58ebbd72c03f/selene_hugr_qis_compiler-0.2.10-cp310-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:fde73e325ad51bb00c40978a4a17ecb31ff968854d39259cee5a600bf2964b54", size = 32893561, upload-time = "2025-11-10T14:48:46.504Z" }, - { url = "https://files.pythonhosted.org/packages/92/b0/abf9cfe11934100a2210468545c7a8b8508534c1c90b882484a9b59fbf96/selene_hugr_qis_compiler-0.2.10-cp310-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9ecb054a543a41ecadcbfdd3d49ba9ada99e5d0806fb1b10638d3e9c1d6e6216", size = 33989527, upload-time = "2025-11-10T14:48:49.734Z" }, - { url = "https://files.pythonhosted.org/packages/12/36/476ac6ffdd5e8edc7d1f4772fb1eb3679e6e38105aa529a3d59a5d211bfa/selene_hugr_qis_compiler-0.2.10-cp310-abi3-win_amd64.whl", hash = "sha256:bf013a2b6910dbac1a811d95822df25d4bdcd96f15d9b1aa263b578834a45c27", size = 29199534, upload-time = "2025-11-10T14:48:52.545Z" }, +source = { editable = "../monohugr/repositories/tket2/qis-compiler" } + +[package.metadata] + +[package.metadata.requires-dev] +dev = [ + { name = "cibuildwheel", specifier = ">=2.23.2" }, + { name = "hugr", specifier = "~=0.16.0" }, + { name = "pytest", specifier = ">=8.4.2" }, + { name = "pytest-snapshot", specifier = "~=0.9.0" }, ] [[package]] @@ -3691,7 +3694,7 @@ wheels = [ [[package]] name = "tket" version = "0.13.0" -source = { git = "https://github.com/quantinuum/tket2?subdirectory=tket-py&rev=9f1ec02#9f1ec02f6cd22f3bf368ffdcfe57f6b287451188" } +source = { editable = "../monohugr/repositories/tket2/tket-py" } dependencies = [ { name = "hugr" }, { name = "pytket" }, @@ -3699,19 +3702,39 @@ dependencies = [ { name = "tket-exts" }, ] +[package.metadata] +requires-dist = [ + { name = "hugr", specifier = "~=0.16.0" }, + { name = "pytket", specifier = ">=2.1.0,<3" }, + { name = "tket-eccs", editable = "../monohugr/repositories/tket2/tket-eccs" }, + { name = "tket-exts", editable = "../monohugr/repositories/tket2/tket-exts" }, +] + +[package.metadata.requires-dev] +docs = [ + { name = "furo", specifier = ">=2024.8.6" }, + { name = "myst-nb", specifier = ">=1.1.2" }, + { name = "sphinx-autodoc-typehints", specifier = ">=3.0.1" }, + { name = "sphinx-basic-ng", specifier = ">=1.0.0b2" }, + { name = "sphinx-copybutton", specifier = ">=0.5.2" }, +] + [[package]] name = "tket-eccs" version = "0.5.1" -source = { git = "https://github.com/quantinuum/tket2?subdirectory=tket-eccs&rev=9f1ec02#9f1ec02f6cd22f3bf368ffdcfe57f6b287451188" } +source = { editable = "../monohugr/repositories/tket2/tket-eccs" } [[package]] name = "tket-exts" version = "0.12.3" -source = { git = "https://github.com/quantinuum/tket2?subdirectory=tket-exts&rev=9f1ec02#9f1ec02f6cd22f3bf368ffdcfe57f6b287451188" } +source = { editable = "../monohugr/repositories/tket2/tket-exts" } dependencies = [ { name = "hugr" }, ] +[package.metadata] +requires-dist = [{ name = "hugr", specifier = "~=0.16.0" }] + [[package]] name = "tomli" version = "2.4.1" From 892ec84ca5b43f46957ab362335b9c47ed42c8cf Mon Sep 17 00:00:00 2001 From: Tatiana S Date: Wed, 29 Apr 2026 13:59:18 +0100 Subject: [PATCH 3/9] More test fixes --- examples/postselect.ipynb | 62 ++++++++++----- examples/t_factory.ipynb | 78 +++++++++++++++---- .../std/_internal/compiler/quantum.py | 53 ++++--------- .../src/guppylang/std/qsystem/__init__.py | 4 +- .../src/guppylang/std/qsystem/functional.py | 6 +- .../src/guppylang/std/quantum/__init__.py | 6 +- pyproject.toml | 9 +-- tests/error/tracing_errors/linear_drop3.err | 4 +- .../tracing_errors/linear_not_owned1.err | 2 +- tests/integration/notebooks/errorsdemo.ipynb | 6 +- tests/integration/test_emulator.py | 10 +-- tests/integration/test_qsystem.py | 15 ++-- 12 files changed, 148 insertions(+), 107 deletions(-) diff --git a/examples/postselect.ipynb b/examples/postselect.ipynb index f57cb74e4..436cdced9 100644 --- a/examples/postselect.ipynb +++ b/examples/postselect.ipynb @@ -20,7 +20,12 @@ { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2026-04-29T12:44:11.876698Z", + "start_time": "2026-04-29T12:44:11.147001Z" + } + }, "outputs": [], "source": [ "from typing import Counter\n", @@ -51,7 +56,12 @@ { "cell_type": "code", "execution_count": 2, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2026-04-29T12:44:13.697644Z", + "start_time": "2026-04-29T12:44:13.678652Z" + } + }, "outputs": [], "source": [ "@guppy.struct\n", @@ -84,7 +94,12 @@ { "cell_type": "code", "execution_count": 3, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2026-04-29T12:44:15.908094Z", + "start_time": "2026-04-29T12:44:15.890556Z" + } + }, "outputs": [], "source": [ "@guppy\n", @@ -109,17 +124,15 @@ "We use a simple depolarizing error model to induce errors in the preparation." ] }, - { - "metadata": {}, - "cell_type": "code", - "outputs": [], - "execution_count": null, - "source": "" - }, { "cell_type": "code", "execution_count": 4, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2026-04-29T12:44:46.321966Z", + "start_time": "2026-04-29T12:44:46.308515Z" + } + }, "outputs": [], "source": [ "n = guppy.nat_var(\"n\")\n", @@ -169,7 +182,12 @@ { "cell_type": "code", "execution_count": 5, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2026-04-29T12:44:51.809478Z", + "start_time": "2026-04-29T12:44:49.947720Z" + } + }, "outputs": [ { "data": { @@ -229,6 +247,10 @@ "cell_type": "code", "execution_count": 6, "metadata": { + "ExecuteTime": { + "end_time": "2026-04-29T12:45:04.562132Z", + "start_time": "2026-04-29T12:45:02.824971Z" + }, "tags": [ "raises-exception" ] @@ -239,12 +261,12 @@ "evalue": "Panic (#1001): Invalid data index in physical_h", "output_type": "error", "traceback": [ - "\u001B[31m---------------------------------------------------------------------------\u001B[39m", - "\u001B[31mEmulatorError\u001B[39m Traceback (most recent call last)", - "\u001B[36mCell\u001B[39m\u001B[36m \u001B[39m\u001B[32mIn[6]\u001B[39m\u001B[32m, line 18\u001B[39m\n\u001B[32m 15\u001B[39m data = measure_array(steane_q.data_qs)\n\u001B[32m 16\u001B[39m result(\u001B[33m\"\u001B[39m\u001B[33mparity\u001B[39m\u001B[33m\"\u001B[39m, parity_check(data))\n\u001B[32m---> \u001B[39m\u001B[32m18\u001B[39m \u001B[43mrun\u001B[49m\u001B[43m(\u001B[49m\u001B[43mmain\u001B[49m\u001B[43m)\u001B[49m\n", - "\u001B[36mCell\u001B[39m\u001B[36m \u001B[39m\u001B[32mIn[4]\u001B[39m\u001B[32m, line 31\u001B[39m, in \u001B[36mrun\u001B[39m\u001B[34m(main_def)\u001B[39m\n\u001B[32m 24\u001B[39m \u001B[38;5;28;01mdef\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[34mrun\u001B[39m(main_def: GuppyFunctionDefinition) -> Counter:\n\u001B[32m 25\u001B[39m res = (\n\u001B[32m 26\u001B[39m \u001B[43mmain_def\u001B[49m\u001B[43m.\u001B[49m\u001B[43memulator\u001B[49m\u001B[43m(\u001B[49m\u001B[43mn_qubits\u001B[49m\u001B[43m=\u001B[49m\u001B[32;43m8\u001B[39;49m\u001B[43m)\u001B[49m\n\u001B[32m 27\u001B[39m \u001B[43m \u001B[49m\u001B[43m.\u001B[49m\u001B[43mstabilizer_sim\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\n\u001B[32m 28\u001B[39m \u001B[43m \u001B[49m\u001B[43m.\u001B[49m\u001B[43mwith_seed\u001B[49m\u001B[43m(\u001B[49m\u001B[32;43m42\u001B[39;49m\u001B[43m)\u001B[49m\n\u001B[32m 29\u001B[39m \u001B[43m \u001B[49m\u001B[43m.\u001B[49m\u001B[43mwith_shots\u001B[49m\u001B[43m(\u001B[49m\u001B[32;43m1000\u001B[39;49m\u001B[43m)\u001B[49m\n\u001B[32m 30\u001B[39m \u001B[43m \u001B[49m\u001B[43m.\u001B[49m\u001B[43mwith_error_model\u001B[49m\u001B[43m(\u001B[49m\u001B[43merror_model\u001B[49m\u001B[43m)\u001B[49m\n\u001B[32m---> \u001B[39m\u001B[32m31\u001B[39m \u001B[43m \u001B[49m\u001B[43m.\u001B[49m\u001B[43mrun\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\n\u001B[32m 32\u001B[39m )\n\u001B[32m 34\u001B[39m \u001B[38;5;28;01mreturn\u001B[39;00m res.collated_counts()\n", - "\u001B[36mFile \u001B[39m\u001B[32m~/guppylang/guppylang/src/guppylang/emulator/instance.py:226\u001B[39m, in \u001B[36mEmulatorInstance.run\u001B[39m\u001B[34m(self)\u001B[39m\n\u001B[32m 224\u001B[39m shot_results.append(tag, value)\n\u001B[32m 225\u001B[39m \u001B[38;5;28;01mexcept\u001B[39;00m \u001B[38;5;167;01mException\u001B[39;00m \u001B[38;5;28;01mas\u001B[39;00m e:\n\u001B[32m--> \u001B[39m\u001B[32m226\u001B[39m \u001B[38;5;28;01mraise\u001B[39;00m EmulatorError(\n\u001B[32m 227\u001B[39m completed_shots=EmulatorResult(all_results),\n\u001B[32m 228\u001B[39m failing_shot=shot_results,\n\u001B[32m 229\u001B[39m underlying_exception=e,\n\u001B[32m 230\u001B[39m ) \u001B[38;5;28;01mfrom\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[38;5;28;01mNone\u001B[39;00m\n\u001B[32m 231\u001B[39m all_results.append(shot_results)\n\u001B[32m 232\u001B[39m \u001B[38;5;28;01mreturn\u001B[39;00m EmulatorResult(all_results)\n", - "\u001B[31mEmulatorError\u001B[39m: Panic (#1001): Invalid data index in physical_h" + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mEmulatorError\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[6]\u001b[39m\u001b[32m, line 18\u001b[39m\n\u001b[32m 14\u001b[39m \n\u001b[32m 15\u001b[39m data = measure_array(steane_q.data_qs)\n\u001b[32m 16\u001b[39m result(\u001b[33m\"parity\"\u001b[39m, parity_check(collect_measurements(data)))\n\u001b[32m 17\u001b[39m \n\u001b[32m---> \u001b[39m\u001b[32m18\u001b[39m run(main)\n", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[4]\u001b[39m\u001b[32m, line 31\u001b[39m, in \u001b[36mrun\u001b[39m\u001b[34m(main_def)\u001b[39m\n\u001b[32m 27\u001b[39m .stabilizer_sim()\n\u001b[32m 28\u001b[39m .with_seed(\u001b[32m42\u001b[39m)\n\u001b[32m 29\u001b[39m .with_shots(\u001b[32m1000\u001b[39m)\n\u001b[32m 30\u001b[39m .with_error_model(error_model)\n\u001b[32m---> \u001b[39m\u001b[32m31\u001b[39m .run()\n\u001b[32m 32\u001b[39m )\n\u001b[32m 33\u001b[39m \n\u001b[32m 34\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m res.collated_counts()\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/Documents/Code/guppylang/guppylang/src/guppylang/emulator/instance.py:228\u001b[39m, in \u001b[36mEmulatorInstance.run\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 224\u001b[39m shot_results.append(tag, value)\n\u001b[32m 225\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e: \u001b[38;5;66;03m# noqa: BLE001\u001b[39;00m\n\u001b[32m 226\u001b[39m \u001b[38;5;66;03m# In this case, casting a wide net on exceptions is\u001b[39;00m\n\u001b[32m 227\u001b[39m \u001b[38;5;66;03m# suitable.\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m228\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m EmulatorError(\n\u001b[32m 229\u001b[39m completed_shots=EmulatorResult(all_results),\n\u001b[32m 230\u001b[39m failing_shot=shot_results,\n\u001b[32m 231\u001b[39m underlying_exception=e,\n\u001b[32m 232\u001b[39m ) \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[32m 233\u001b[39m all_results.append(shot_results)\n\u001b[32m 234\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m EmulatorResult(all_results)\n", + "\u001b[31mEmulatorError\u001b[39m: Panic (#1001): Invalid data index in physical_h" ] } ], @@ -264,7 +286,7 @@ " physical_h(steane_q, 8)\n", "\n", " data = measure_array(steane_q.data_qs)\n", - " result(\"parity\", parity_check(data))\n", + " result(\"parity\", parity_check(collect_measurements(data)))\n", "\n", "run(main)\n" ] @@ -286,7 +308,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.13.6" + "version": "3.12.11" } }, "nbformat": 4, diff --git a/examples/t_factory.ipynb b/examples/t_factory.ipynb index 483ccfacd..35b8ac2c2 100644 --- a/examples/t_factory.ipynb +++ b/examples/t_factory.ipynb @@ -15,8 +15,13 @@ { "cell_type": "code", "execution_count": 1, - "id": "73e8e28c", - "metadata": {}, + "id": "d19bfc55be7d133d", + "metadata": { + "ExecuteTime": { + "end_time": "2026-04-21T14:53:44.028578Z", + "start_time": "2026-04-21T14:53:43.172878Z" + } + }, "outputs": [], "source": [ "import numpy as np\n", @@ -33,8 +38,10 @@ " measure,\n", " qubit,\n", " ry,\n", - " rz, Measurement, collect_measurements,\n", + " rz,\n", + " Measurement,\n", ")\n", + "from guppylang.std.platform import result\n", "\n", "from selene_sim import build, Quest\n", "\n", @@ -57,7 +64,12 @@ "cell_type": "code", "execution_count": 2, "id": "d9646c0f", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2026-04-21T14:53:44.068717Z", + "start_time": "2026-04-21T14:53:44.040171Z" + } + }, "outputs": [], "source": [ "phi = np.arccos(1 / 3)\n", @@ -86,7 +98,12 @@ "cell_type": "code", "execution_count": 3, "id": "704030e7", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2026-04-21T14:53:44.101664Z", + "start_time": "2026-04-21T14:53:44.079537Z" + } + }, "outputs": [], "source": [ "@guppy\n", @@ -129,7 +146,12 @@ "cell_type": "code", "execution_count": 4, "id": "bcc5acd4", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2026-04-21T14:53:44.138361Z", + "start_time": "2026-04-21T14:53:44.114263Z" + } + }, "outputs": [], "source": [ "@guppy\n", @@ -169,7 +191,12 @@ "cell_type": "code", "execution_count": 5, "id": "9ff753c6", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2026-04-21T14:53:44.169033Z", + "start_time": "2026-04-21T14:53:44.148822Z" + } + }, "outputs": [], "source": [ "attempts = 3\n", @@ -194,7 +221,12 @@ "cell_type": "code", "execution_count": 6, "id": "40a25f2d", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2026-04-21T14:53:46.497974Z", + "start_time": "2026-04-21T14:53:44.170371Z" + } + }, "outputs": [ { "name": "stdout", @@ -238,6 +270,10 @@ "execution_count": 7, "id": "ee6a43c5", "metadata": { + "ExecuteTime": { + "end_time": "2026-04-21T14:53:46.725250Z", + "start_time": "2026-04-21T14:53:46.520031Z" + }, "tags": [ "raises-exception" ] @@ -251,7 +287,7 @@ " | \n", "1 | @guppy\n", "2 | def attempt_measure(qs: array[qubit, 10] @ owned) -> None:\n", - "3 | measure(qs[5])\n", + "3 | measure(qs[5]).read()\n", " | ^^^^^ Cannot consume a subscript of `qs` with non-copyable type\n", " | `array[qubit, 10]`\n", "\n", @@ -284,8 +320,13 @@ { "cell_type": "code", "execution_count": 8, - "id": "351ec80b", - "metadata": {}, + "id": "b10e2b99f6a039f5", + "metadata": { + "ExecuteTime": { + "end_time": "2026-04-21T14:53:53.883010Z", + "start_time": "2026-04-21T14:53:50.104763Z" + } + }, "outputs": [], "source": [ "n = guppy.nat_var(\"n\")\n", @@ -294,15 +335,15 @@ "@guppy\n", "def measure_mask(\n", " qs: array[Option[qubit], n], mask: array[bool, n] @ owned\n", - ") -> array[Measurement, n]:\n", + ") -> array[Option[Measurement], n]:\n", " \"\"\"Measure all qubits in `qs` with a corresponding `True` index in `mask`.\"\"\"\n", - " res = array(-1 for _ in range(n))\n", + " res = array(nothing[Measurement]() for _ in range(n))\n", " idx = 0\n", " for m in mask:\n", " if m and qs[idx].is_some():\n", " # `take` swaps an optional value with nothing().\n", " q = qs[idx].take()\n", - " res[idx] = measure(q.unwrap())\n", + " res[idx] = some(measure(q.unwrap()))\n", " idx += 1\n", " return res\n", "\n", @@ -311,7 +352,12 @@ "def main() -> None:\n", " qs = array(some(qubit()) for _ in range(3))\n", " mask = array(True, False, True)\n", - " collect_measurements(measure_mask(qs, mask))\n", + " for opt_msmt in measure_mask(qs, mask):\n", + " if opt_msmt.is_some():\n", + " m = opt_msmt.unwrap()\n", + " result(\"result\", m.read())\n", + " else:\n", + " opt_msmt.unwrap_nothing()\n", " # We need to consume the array of options at some point, as it can't be leaked.\n", " for q_opt in qs:\n", " if q_opt.is_some():\n", @@ -341,7 +387,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.13.4" + "version": "3.12.11" } }, "nbformat": 4, diff --git a/guppylang-internals/src/guppylang_internals/std/_internal/compiler/quantum.py b/guppylang-internals/src/guppylang_internals/std/_internal/compiler/quantum.py index 400faef67..0d099c495 100644 --- a/guppylang-internals/src/guppylang_internals/std/_internal/compiler/quantum.py +++ b/guppylang-internals/src/guppylang_internals/std/_internal/compiler/quantum.py @@ -42,56 +42,35 @@ def from_halfturns_unchecked() -> ops.ExtOp: # ------------------------------------------------------ -class InoutMeasureCompilerBool(CustomInoutCallCompiler): - """Compiler for the measure functions with an inout qubit and a bool - such as the `project_z` function""" +class InoutMeasureCompiler(CustomInoutCallCompiler): + """Compiler for the measure functions with an inout qubit""" opname: str ext: he.Extension - - def __init__(self, opname: str | None = None, ext: he.Extension | None = None): + use_bool: bool + + def __init__( + self, + opname: str | None = None, + ext: he.Extension | None = None, + use_bool: bool = False, + ): self.opname = opname or "Measure" self.ext = ext or QUANTUM_EXTENSION + self.use_bool = use_bool def compile_with_inouts(self, args: list[Wire]) -> CallReturnWires: from guppylang_internals.std._internal.util import quantum_op - [q] = args - [q, bit] = self.builder.add_op( - quantum_op(self.opname, ext=self.ext)( - ht.FunctionType([ht.Qubit], [ht.Qubit, ht.Bool]), (), self.ctx - ), - q, + return_ty = ( + ht.Bool + if self.use_bool + else ht.ExtType(MEASUREMENT_EXTENSION.get_type("Measurement")) ) - return CallReturnWires(regular_returns=[bit], inout_returns=[q]) - - -class InoutMeasureCompilerMsmt(CustomInoutCallCompiler): - """Compiler for the measure functions with an inout qubit and a measurement - such as the `project_z` function""" - - opname: str - ext: he.Extension - - def __init__(self, opname: str | None = None, ext: he.Extension | None = None): - self.opname = opname or "Measure" - self.ext = ext or QUANTUM_EXTENSION - - def compile_with_inouts(self, args: list[Wire]) -> CallReturnWires: - from guppylang_internals.std._internal.util import quantum_op - [q] = args [q, bit] = self.builder.add_op( quantum_op(self.opname, ext=self.ext)( - ht.FunctionType( - [ht.Qubit], - [ - ht.ExtType(MEASUREMENT_EXTENSION.get_type("Measurement")), - ht.Bool, - ], - ), - (), - self.ctx, + ht.FunctionType([ht.Qubit], [ht.Qubit, return_ty]), (), self.ctx ), q, ) diff --git a/guppylang/src/guppylang/std/qsystem/__init__.py b/guppylang/src/guppylang/std/qsystem/__init__.py index fa055b8e8..766de5f8a 100644 --- a/guppylang/src/guppylang/std/qsystem/__init__.py +++ b/guppylang/src/guppylang/std/qsystem/__init__.py @@ -4,7 +4,7 @@ from guppylang_internals.decorator import custom_function, custom_type, hugr_op from guppylang_internals.std._internal.compiler.quantum import ( - InoutMeasureCompilerMsmt, + InoutMeasureCompiler, ) from guppylang_internals.std._internal.compiler.tket_exts import ( QSYSTEM_EXTENSION, @@ -123,7 +123,7 @@ def measure(q: qubit @ owned) -> Measurement: """ -@custom_function(InoutMeasureCompilerMsmt("MeasureReset", QSYSTEM_EXTENSION)) +@custom_function(InoutMeasureCompiler("MeasureReset", QSYSTEM_EXTENSION)) @no_type_check def measure_and_reset(q: qubit) -> Measurement: """Like `measure`, but also resets the qubit after measurement.""" diff --git a/guppylang/src/guppylang/std/qsystem/functional.py b/guppylang/src/guppylang/std/qsystem/functional.py index e9703f294..473e6451f 100644 --- a/guppylang/src/guppylang/std/qsystem/functional.py +++ b/guppylang/src/guppylang/std/qsystem/functional.py @@ -10,7 +10,7 @@ from guppylang.std import qsystem from guppylang.std.angles import angle from guppylang.std.builtins import owned -from guppylang.std.quantum import qubit +from guppylang.std.quantum import Measurement, qubit @guppy @@ -31,7 +31,7 @@ def zz_phase(q1: qubit @ owned, q2: qubit @ owned, angle: angle) -> tuple[qubit, @guppy @no_type_check -def measure_and_reset(q: qubit @ owned) -> tuple[qubit, bool]: +def measure_and_reset(q: qubit @ owned) -> tuple[qubit, Measurement]: """Functional measure_and_reset command.""" b = qsystem.measure_and_reset(q) return q, b @@ -55,7 +55,7 @@ def rz(q: qubit @ owned, angle: angle) -> qubit: @guppy @no_type_check -def measure(q: qubit @ owned) -> bool: +def measure(q: qubit @ owned) -> Measurement: """Functional destructive measurement command.""" result = qsystem.measure(q) return result diff --git a/guppylang/src/guppylang/std/quantum/__init__.py b/guppylang/src/guppylang/std/quantum/__init__.py index 30e2d353c..5c51edcc4 100644 --- a/guppylang/src/guppylang/std/quantum/__init__.py +++ b/guppylang/src/guppylang/std/quantum/__init__.py @@ -6,7 +6,7 @@ from guppylang_internals.decorator import custom_function, custom_type, hugr_op from guppylang_internals.std._internal.compiler.quantum import ( - InoutMeasureCompilerBool, + InoutMeasureCompiler, RotationCompiler, ) from guppylang_internals.std._internal.compiler.tket_exts import MEASUREMENT_EXTENSION @@ -29,7 +29,7 @@ def __new__() -> "qubit": ... @guppy @no_type_check - def measure(self: "qubit" @ owned) -> bool: + def measure(self: "qubit" @ owned) -> "Measurement": return measure(self) @guppy @@ -371,7 +371,7 @@ def toffoli(control1: qubit, control2: qubit, target: qubit) -> None: """ -@custom_function(InoutMeasureCompilerBool()) +@custom_function(InoutMeasureCompiler(use_bool=True)) @no_type_check def project_z(q: qubit) -> bool: """Project a single qubit into the Z-basis (a non-destructive measurement).""" diff --git a/pyproject.toml b/pyproject.toml index e44574604..8b4e6802e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,19 +30,14 @@ guppylang-internals = { workspace = true } miette-py = { workspace = true } # Uncomment these to test the latest dependency version during development # hugr = { git = "https://github.com/quantinuum/hugr", subdirectory = "hugr-py", rev = "a4da8ef" } -tket = {path = "/Users/tatiana.sedelnikov/Documents/Code/monohugr/repositories/tket2/tket-py", editable = true} +# tket = {path = "/Users/tatiana.sedelnikov/Documents/Code/monohugr/repositories/tket2/tket-py", editable = true} # Sources from repository: guppylang # Sources from repository: tket2 tket_eccs = {path = "/Users/tatiana.sedelnikov/Documents/Code/monohugr/repositories/tket2/tket-eccs", editable = true} tket-exts = {path = "/Users/tatiana.sedelnikov/Documents/Code/monohugr/repositories/tket2/tket-exts", editable = true} selene-hugr-qis-compiler = {path = "/Users/tatiana.sedelnikov/Documents/Code/monohugr/repositories/tket2/qis-compiler", editable = true} -# Sources from repository: guppylang -# Sources from repository: tket2 -# Sources from repository: guppylang -# Sources from repository: tket2 -# Sources from repository: guppylang -# Sources from repository: tket2 +tket = {path = "/Users/tatiana.sedelnikov/Documents/Code/monohugr/repositories/tket2/tket-py", editable = true} [build-system] requires = ["hatchling"] build-backend = "hatchling.build" diff --git a/tests/error/tracing_errors/linear_drop3.err b/tests/error/tracing_errors/linear_drop3.err index c1bf1265f..4834a3082 100644 --- a/tests/error/tracing_errors/linear_drop3.err +++ b/tests/error/tracing_errors/linear_drop3.err @@ -5,8 +5,8 @@ Error: Error in comptime function return (at $FILE:7:0) 7 | def test(qs: array[qubit, 10] @ owned) -> None: | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ... -9 | measure(qs[i]) - | ^^^^^^^^^^^^^^^^^^^^^^ +9 | measure(qs[i]).read() + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Value with non-droppable type `qubit` is leaked by this function diff --git a/tests/error/tracing_errors/linear_not_owned1.err b/tests/error/tracing_errors/linear_not_owned1.err index d04e87e64..df5b35f48 100644 --- a/tests/error/tracing_errors/linear_not_owned1.err +++ b/tests/error/tracing_errors/linear_not_owned1.err @@ -5,7 +5,7 @@ Error: Error in comptime function return (at $FILE:6:0) 6 | def test(q: qubit) -> None: | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ 7 | measure(q).read() - | ^^^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^^^^^^ Argument `q` is borrowed, so it is implicitly returned to the caller. Value with non-copyable type `qubit` was already used diff --git a/tests/integration/notebooks/errorsdemo.ipynb b/tests/integration/notebooks/errorsdemo.ipynb index 5e70f7c04..00385a025 100644 --- a/tests/integration/notebooks/errorsdemo.ipynb +++ b/tests/integration/notebooks/errorsdemo.ipynb @@ -581,7 +581,7 @@ "text": [ "Error: Copy violation (at :12:11)\n", " | \n", - "10 | measure(s.q2)\n", + "10 | measure(s.q2).read()\n", "11 | \n", "12 | return s\n", " | ^ Field `s.q2` with non-copyable type `qubit` cannot be\n", @@ -590,7 +590,7 @@ "Note:\n", " | \n", " 9 | if b:\n", - "10 | measure(s.q2)\n", + "10 | measure(s.q2).read()\n", " | ---- Field `s.q2` already consumed here\n", "\n", "Guppy compilation failed due to 1 previous error\n" @@ -1323,7 +1323,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.19" + "version": "3.12.11" } }, "nbformat": 4, diff --git a/tests/integration/test_emulator.py b/tests/integration/test_emulator.py index 2c8e08dde..4010576eb 100644 --- a/tests/integration/test_emulator.py +++ b/tests/integration/test_emulator.py @@ -55,7 +55,7 @@ def main() -> None: def main() -> None: q = qubit() h(q) - result("c", measure(q)) + result("c", measure(q).read()) res = main.emulator(1).statevector_sim().with_seed(42).run() expected = EmulatorResult([[("c", True)]]) @@ -218,7 +218,7 @@ def main() -> None: cx(aux, tgt) h(aux) - result("aux", measure(aux)) + result("aux", measure(aux).read()) discard(tgt) res = _build_run(main, n_qubits=2, n_shots=1).results[0].entries @@ -256,8 +256,8 @@ def main() -> None: h(a) h(b) - result("a", measure(a)) - result("b", measure(b)) + result("a", measure(a).read()) + result("b", measure(b).read()) # deterministic - should always be 0 res = _build_run(main, n_qubits=2) @@ -277,7 +277,7 @@ def main() -> None: reset(q1) qfree(q1) b2 = project_z(q0) - result("c0", b1) + result("c0", b1.read()) result("c1", b2) result("c2", measure(q0).read()) diff --git a/tests/integration/test_qsystem.py b/tests/integration/test_qsystem.py index 5ff931fa6..cf6511512 100644 --- a/tests/integration/test_qsystem.py +++ b/tests/integration/test_qsystem.py @@ -41,11 +41,12 @@ def test(q1: qubit @ owned, q2: qubit @ owned, a1: angle) -> Measurement: q1, q2 = zz_phase(q1, q2, a1) q1 = rz(q1, a1) q1, q2 = zz_max(q1, q2) - q1, b = measure_and_reset(q1) + q1, msmt1 = measure_and_reset(q1) + msmt1.read() q1 = reset(q1) - b = measure(q1) + msmt2 = measure(q1) qfree(q2) - return b + return msmt2 validate(test.compile_function()) @@ -152,11 +153,9 @@ def test_lazy_measure_and_reset(validate, run_int_fn): # type: ignore[no-untype def test() -> int: q = qubit() x(q) - first_result = lazy_measure_and_reset(q) - second_result = measure(q) - if ( - first_result.read() and not second_result.read() - ): # First expect flip, then expect reset + first_result = lazy_measure_and_reset(q).read() + second_result = measure(q).read() + if first_result and not second_result: # First expect flip, then expect reset return 1 return 0 From 3a48199d3173a6f5798b60f8ade4a131ab20e96b Mon Sep 17 00:00:00 2001 From: Tatiana S Date: Wed, 29 Apr 2026 15:03:23 +0100 Subject: [PATCH 4/9] Fix merge issues + execute notebooks properly + some refactoring --- examples/postselect.ipynb | 36 ++++ examples/t_factory.ipynb | 48 +++++ .../compiler/expr_compiler.py | 66 +++---- .../src/guppylang/std/qsystem/__init__.py | 25 +++ .../src/guppylang/std/qsystem/functional.py | 2 +- tests/integration/notebooks/errorsdemo.ipynb | 165 +++++++++++++++++- tests/integration/test_qsystem.py | 23 +-- 7 files changed, 306 insertions(+), 59 deletions(-) diff --git a/examples/postselect.ipynb b/examples/postselect.ipynb index 436cdced9..a71fd237b 100644 --- a/examples/postselect.ipynb +++ b/examples/postselect.ipynb @@ -24,6 +24,12 @@ "ExecuteTime": { "end_time": "2026-04-29T12:44:11.876698Z", "start_time": "2026-04-29T12:44:11.147001Z" + }, + "execution": { + "iopub.execute_input": "2026-04-29T13:43:27.744652Z", + "iopub.status.busy": "2026-04-29T13:43:27.744441Z", + "iopub.status.idle": "2026-04-29T13:43:28.325191Z", + "shell.execute_reply": "2026-04-29T13:43:28.324743Z" } }, "outputs": [], @@ -60,6 +66,12 @@ "ExecuteTime": { "end_time": "2026-04-29T12:44:13.697644Z", "start_time": "2026-04-29T12:44:13.678652Z" + }, + "execution": { + "iopub.execute_input": "2026-04-29T13:43:28.326342Z", + "iopub.status.busy": "2026-04-29T13:43:28.326237Z", + "iopub.status.idle": "2026-04-29T13:43:28.328699Z", + "shell.execute_reply": "2026-04-29T13:43:28.328461Z" } }, "outputs": [], @@ -98,6 +110,12 @@ "ExecuteTime": { "end_time": "2026-04-29T12:44:15.908094Z", "start_time": "2026-04-29T12:44:15.890556Z" + }, + "execution": { + "iopub.execute_input": "2026-04-29T13:43:28.329674Z", + "iopub.status.busy": "2026-04-29T13:43:28.329608Z", + "iopub.status.idle": "2026-04-29T13:43:28.331585Z", + "shell.execute_reply": "2026-04-29T13:43:28.331287Z" } }, "outputs": [], @@ -131,6 +149,12 @@ "ExecuteTime": { "end_time": "2026-04-29T12:44:46.321966Z", "start_time": "2026-04-29T12:44:46.308515Z" + }, + "execution": { + "iopub.execute_input": "2026-04-29T13:43:28.332448Z", + "iopub.status.busy": "2026-04-29T13:43:28.332397Z", + "iopub.status.idle": "2026-04-29T13:43:28.334710Z", + "shell.execute_reply": "2026-04-29T13:43:28.334465Z" } }, "outputs": [], @@ -186,6 +210,12 @@ "ExecuteTime": { "end_time": "2026-04-29T12:44:51.809478Z", "start_time": "2026-04-29T12:44:49.947720Z" + }, + "execution": { + "iopub.execute_input": "2026-04-29T13:43:28.335629Z", + "iopub.status.busy": "2026-04-29T13:43:28.335561Z", + "iopub.status.idle": "2026-04-29T13:43:30.128865Z", + "shell.execute_reply": "2026-04-29T13:43:30.128453Z" } }, "outputs": [ @@ -251,6 +281,12 @@ "end_time": "2026-04-29T12:45:04.562132Z", "start_time": "2026-04-29T12:45:02.824971Z" }, + "execution": { + "iopub.execute_input": "2026-04-29T13:43:30.144688Z", + "iopub.status.busy": "2026-04-29T13:43:30.144593Z", + "iopub.status.idle": "2026-04-29T13:43:31.808834Z", + "shell.execute_reply": "2026-04-29T13:43:31.808467Z" + }, "tags": [ "raises-exception" ] diff --git a/examples/t_factory.ipynb b/examples/t_factory.ipynb index 35b8ac2c2..267f1d2d5 100644 --- a/examples/t_factory.ipynb +++ b/examples/t_factory.ipynb @@ -20,6 +20,12 @@ "ExecuteTime": { "end_time": "2026-04-21T14:53:44.028578Z", "start_time": "2026-04-21T14:53:43.172878Z" + }, + "execution": { + "iopub.execute_input": "2026-04-29T13:44:43.573376Z", + "iopub.status.busy": "2026-04-29T13:44:43.573140Z", + "iopub.status.idle": "2026-04-29T13:44:44.155424Z", + "shell.execute_reply": "2026-04-29T13:44:44.154978Z" } }, "outputs": [], @@ -68,6 +74,12 @@ "ExecuteTime": { "end_time": "2026-04-21T14:53:44.068717Z", "start_time": "2026-04-21T14:53:44.040171Z" + }, + "execution": { + "iopub.execute_input": "2026-04-29T13:44:44.156660Z", + "iopub.status.busy": "2026-04-29T13:44:44.156536Z", + "iopub.status.idle": "2026-04-29T13:44:44.158578Z", + "shell.execute_reply": "2026-04-29T13:44:44.158299Z" } }, "outputs": [], @@ -102,6 +114,12 @@ "ExecuteTime": { "end_time": "2026-04-21T14:53:44.101664Z", "start_time": "2026-04-21T14:53:44.079537Z" + }, + "execution": { + "iopub.execute_input": "2026-04-29T13:44:44.159472Z", + "iopub.status.busy": "2026-04-29T13:44:44.159414Z", + "iopub.status.idle": "2026-04-29T13:44:44.161700Z", + "shell.execute_reply": "2026-04-29T13:44:44.161394Z" } }, "outputs": [], @@ -150,6 +168,12 @@ "ExecuteTime": { "end_time": "2026-04-21T14:53:44.138361Z", "start_time": "2026-04-21T14:53:44.114263Z" + }, + "execution": { + "iopub.execute_input": "2026-04-29T13:44:44.162621Z", + "iopub.status.busy": "2026-04-29T13:44:44.162573Z", + "iopub.status.idle": "2026-04-29T13:44:44.164783Z", + "shell.execute_reply": "2026-04-29T13:44:44.164439Z" } }, "outputs": [], @@ -195,6 +219,12 @@ "ExecuteTime": { "end_time": "2026-04-21T14:53:44.169033Z", "start_time": "2026-04-21T14:53:44.148822Z" + }, + "execution": { + "iopub.execute_input": "2026-04-29T13:44:44.165736Z", + "iopub.status.busy": "2026-04-29T13:44:44.165689Z", + "iopub.status.idle": "2026-04-29T13:44:44.167558Z", + "shell.execute_reply": "2026-04-29T13:44:44.167270Z" } }, "outputs": [], @@ -225,6 +255,12 @@ "ExecuteTime": { "end_time": "2026-04-21T14:53:46.497974Z", "start_time": "2026-04-21T14:53:44.170371Z" + }, + "execution": { + "iopub.execute_input": "2026-04-29T13:44:44.168366Z", + "iopub.status.busy": "2026-04-29T13:44:44.168305Z", + "iopub.status.idle": "2026-04-29T13:44:45.812949Z", + "shell.execute_reply": "2026-04-29T13:44:45.812478Z" } }, "outputs": [ @@ -274,6 +310,12 @@ "end_time": "2026-04-21T14:53:46.725250Z", "start_time": "2026-04-21T14:53:46.520031Z" }, + "execution": { + "iopub.execute_input": "2026-04-29T13:44:45.814599Z", + "iopub.status.busy": "2026-04-29T13:44:45.814499Z", + "iopub.status.idle": "2026-04-29T13:44:45.969542Z", + "shell.execute_reply": "2026-04-29T13:44:45.969135Z" + }, "tags": [ "raises-exception" ] @@ -325,6 +367,12 @@ "ExecuteTime": { "end_time": "2026-04-21T14:53:53.883010Z", "start_time": "2026-04-21T14:53:50.104763Z" + }, + "execution": { + "iopub.execute_input": "2026-04-29T13:44:45.970640Z", + "iopub.status.busy": "2026-04-29T13:44:45.970571Z", + "iopub.status.idle": "2026-04-29T13:44:49.705036Z", + "shell.execute_reply": "2026-04-29T13:44:49.704633Z" } }, "outputs": [], diff --git a/guppylang-internals/src/guppylang_internals/compiler/expr_compiler.py b/guppylang-internals/src/guppylang_internals/compiler/expr_compiler.py index 596a4c79e..e81dba582 100644 --- a/guppylang-internals/src/guppylang_internals/compiler/expr_compiler.py +++ b/guppylang-internals/src/guppylang_internals/compiler/expr_compiler.py @@ -9,7 +9,7 @@ import hugr.std.int import hugr.std.logic import hugr.std.prelude -from hugr import Wire, ops +from hugr import Node, Wire, ops from hugr import tys as ht from hugr import val as hv from hugr.build.cond_loop import Conditional @@ -554,39 +554,34 @@ def visit_StateResultExpr(self, node: StateResultExpr) -> Wire: op = ops.ExtOp(DEBUG_EXTENSION.get_op("StateResult"), signature=sig, args=args) + qubit_arr_in: Node | list[Wire] if not node.array_len: - # If the input is a sequence of qubits, we pack them into an array. + # If the input is a sequence of qubits, we pack them into an array first. qubits_in = [self.visit(e) for e in node.args[1:]] qubit_arr_in = self.builder.add_op( array_new(ht.Qubit, len(node.args) - 1), *qubits_in ) - # Turn into standard array from borrow array. - qubit_arr_in = self.builder.add_op( - array_to_std_array(ht.Qubit, num_qubits_arg), - qubit_arr_in, - ) + else: + qubit_arr_in = [self.visit(node.args[1])] + # Turn into standard array from borrow array. + qubit_arr_in = self.builder.add_op( + array_to_std_array(ht.Qubit, num_qubits_arg), + *qubit_arr_in, + ) - qubit_arr_out = self.builder.add_op(op, qubit_arr_in) + qubit_arr_out = self.builder.add_op(op, qubit_arr_in) - qubit_arr_out = self.builder.add_op( - std_array_to_array(ht.Qubit, num_qubits_arg), - qubit_arr_out, - ) + # Convert back from standard array to borrow array. + qubit_arr_out = self.builder.add_op( + std_array_to_array(ht.Qubit, num_qubits_arg), + qubit_arr_out, + ) + qubits_out: Node | list[Wire] + if not node.array_len: + # Unpack into individual qubits again. qubits_out = unpack_array(self.builder, qubit_arr_out) else: - # If the input is an array of qubits, we need to convert to a standard - # array. - qubits_in = [self.visit(node.args[1])] - qubits_out = [ - apply_op_with_borrow_array_conversion( - self.ctx, - self.builder, - op, - ht.Qubit, - num_qubits_arg, - qubits_in[0], - ) - ] + qubits_out = qubit_arr_out self._update_inout_ports(node.args, iter(qubits_out), node.func_ty) return self._pack_returns([], NoneType()) @@ -796,24 +791,3 @@ def python_value_to_hugr(v: Any, exp_ty: Type, ctx: CompilerContext) -> hv.Value def doesnt_contain_none(xs: list[T | None]) -> TypeGuard[list[T]]: """Checks if a list contains `None`.""" return all(x is not None for x in xs) - - -def apply_op_with_borrow_array_conversion( - ctx: CompilerContext, - builder: DFBuilder[ops.DfParentOp], - op: ops.DataflowOp, - elem_ty: ht.Type, - size_arg: ht.TypeArg, - input_array: Wire, -) -> Wire: - """Transforms a Guppy borrow array before it can be passed to a Hugr op operating on - a standard Hugr array, and then reverses the transformation again on the output - array. - """ - input_array = builder.add_op( - array_to_std_array(elem_ty, size_arg), - input_array, - ) - result_array = builder.add_op(op, input_array) - result_array = builder.add_op(std_array_to_array(elem_ty, size_arg), result_array) - return result_array diff --git a/guppylang/src/guppylang/std/qsystem/__init__.py b/guppylang/src/guppylang/std/qsystem/__init__.py index 766de5f8a..f9861cff8 100644 --- a/guppylang/src/guppylang/std/qsystem/__init__.py +++ b/guppylang/src/guppylang/std/qsystem/__init__.py @@ -213,6 +213,20 @@ def lazy_measure_and_reset(q: qubit) -> Measurement: N = guppy.nat_var("N") +@guppy +@no_type_check +def measure_array(qubits: array[qubit, N] @ owned) -> array[Measurement, N]: + """Measure an array of qubits, returning an array of bools.""" + return array(measure(q) for q in qubits) + + +@guppy +@no_type_check +def measure_and_reset_array(qubits: array[qubit, N]) -> array[Measurement, N]: + """Measure and reset an array of qubits, returning an array of bools.""" + return array(measure_and_reset(qubits[i]) for i in range(N)) + + @guppy @no_type_check def lazy_measure_array( @@ -224,6 +238,17 @@ def lazy_measure_array( return array(lazy_measure(q) for q in qubits) +@guppy +@no_type_check +def lazy_measure_and_reset_array( + qubits: array[qubit, N], +) -> array["Measurement", N]: + """Same as `measure_and_reset_array` as the standard measurement behaviour is + already lazy. + """ + return array(lazy_measure_and_reset(qubits[i]) for i in range(N)) + + # ------------------------------------------------------ # --------- Internal definitions ----------------------- # ------------------------------------------------------ diff --git a/guppylang/src/guppylang/std/qsystem/functional.py b/guppylang/src/guppylang/std/qsystem/functional.py index 3ae49f37e..8dc7d20ba 100644 --- a/guppylang/src/guppylang/std/qsystem/functional.py +++ b/guppylang/src/guppylang/std/qsystem/functional.py @@ -59,7 +59,7 @@ def measure_array(qubits: array[qubit, N] @ owned) -> array[Measurement, N]: @no_type_check def measure_and_reset_array( qubits: array[qubit, N] @ owned, -) -> tuple[array[qubit, N], array[bool, N]]: +) -> tuple[array[qubit, N], array[Measurement, N]]: """Functional measure_and_reset_array command.""" bs = qsystem.measure_and_reset_array(qubits) return qubits, bs diff --git a/tests/integration/notebooks/errorsdemo.ipynb b/tests/integration/notebooks/errorsdemo.ipynb index 00385a025..6ec804d07 100644 --- a/tests/integration/notebooks/errorsdemo.ipynb +++ b/tests/integration/notebooks/errorsdemo.ipynb @@ -8,6 +8,12 @@ "ExecuteTime": { "end_time": "2026-03-03T12:40:25.811190Z", "start_time": "2026-03-03T12:40:25.387461Z" + }, + "execution": { + "iopub.execute_input": "2026-04-29T13:45:22.138532Z", + "iopub.status.busy": "2026-04-29T13:45:22.138268Z", + "iopub.status.idle": "2026-04-29T13:45:22.719095Z", + "shell.execute_reply": "2026-04-29T13:45:22.718622Z" } }, "outputs": [], @@ -37,6 +43,12 @@ "end_time": "2026-03-03T12:42:43.615276Z", "start_time": "2026-03-03T12:42:43.579938Z" }, + "execution": { + "iopub.execute_input": "2026-04-29T13:45:22.730437Z", + "iopub.status.busy": "2026-04-29T13:45:22.729941Z", + "iopub.status.idle": "2026-04-29T13:45:22.882616Z", + "shell.execute_reply": "2026-04-29T13:45:22.882228Z" + }, "tags": [ "raises-exception" ] @@ -99,6 +111,12 @@ "end_time": "2026-03-03T12:42:49.179179Z", "start_time": "2026-03-03T12:42:49.120888Z" }, + "execution": { + "iopub.execute_input": "2026-04-29T13:45:22.883841Z", + "iopub.status.busy": "2026-04-29T13:45:22.883778Z", + "iopub.status.idle": "2026-04-29T13:45:22.927941Z", + "shell.execute_reply": "2026-04-29T13:45:22.927530Z" + }, "tags": [ "raises-exception" ] @@ -153,6 +171,12 @@ "end_time": "2026-03-03T12:42:52.206427Z", "start_time": "2026-03-03T12:42:52.110629Z" }, + "execution": { + "iopub.execute_input": "2026-04-29T13:45:22.929041Z", + "iopub.status.busy": "2026-04-29T13:45:22.928979Z", + "iopub.status.idle": "2026-04-29T13:45:22.969971Z", + "shell.execute_reply": "2026-04-29T13:45:22.969466Z" + }, "tags": [ "raises-exception" ] @@ -206,6 +230,12 @@ "end_time": "2026-03-03T12:42:54.510616Z", "start_time": "2026-03-03T12:42:54.467746Z" }, + "execution": { + "iopub.execute_input": "2026-04-29T13:45:22.971096Z", + "iopub.status.busy": "2026-04-29T13:45:22.971026Z", + "iopub.status.idle": "2026-04-29T13:45:23.012960Z", + "shell.execute_reply": "2026-04-29T13:45:23.012621Z" + }, "tags": [ "raises-exception" ] @@ -257,6 +287,12 @@ "end_time": "2026-03-03T12:42:56.974918Z", "start_time": "2026-03-03T12:42:56.914166Z" }, + "execution": { + "iopub.execute_input": "2026-04-29T13:45:23.014204Z", + "iopub.status.busy": "2026-04-29T13:45:23.014126Z", + "iopub.status.idle": "2026-04-29T13:45:23.055729Z", + "shell.execute_reply": "2026-04-29T13:45:23.055364Z" + }, "tags": [ "raises-exception" ] @@ -305,6 +341,12 @@ "end_time": "2026-03-03T12:42:59.670111Z", "start_time": "2026-03-03T12:42:59.611180Z" }, + "execution": { + "iopub.execute_input": "2026-04-29T13:45:23.056729Z", + "iopub.status.busy": "2026-04-29T13:45:23.056663Z", + "iopub.status.idle": "2026-04-29T13:45:23.098288Z", + "shell.execute_reply": "2026-04-29T13:45:23.097912Z" + }, "tags": [ "raises-exception" ] @@ -363,6 +405,12 @@ "end_time": "2026-03-03T12:43:02.190053Z", "start_time": "2026-03-03T12:43:02.127523Z" }, + "execution": { + "iopub.execute_input": "2026-04-29T13:45:23.099246Z", + "iopub.status.busy": "2026-04-29T13:45:23.099187Z", + "iopub.status.idle": "2026-04-29T13:45:23.138291Z", + "shell.execute_reply": "2026-04-29T13:45:23.137851Z" + }, "tags": [ "raises-exception" ] @@ -427,6 +475,12 @@ "execution_count": 9, "id": "e9702a33", "metadata": { + "execution": { + "iopub.execute_input": "2026-04-29T13:45:23.139222Z", + "iopub.status.busy": "2026-04-29T13:45:23.139167Z", + "iopub.status.idle": "2026-04-29T13:45:23.283142Z", + "shell.execute_reply": "2026-04-29T13:45:23.282699Z" + }, "tags": [ "raises-exception" ] @@ -469,6 +523,12 @@ "execution_count": 10, "id": "9f43d2e7", "metadata": { + "execution": { + "iopub.execute_input": "2026-04-29T13:45:23.284205Z", + "iopub.status.busy": "2026-04-29T13:45:23.284145Z", + "iopub.status.idle": "2026-04-29T13:45:23.360604Z", + "shell.execute_reply": "2026-04-29T13:45:23.360246Z" + }, "tags": [ "raises-exception" ] @@ -520,6 +580,12 @@ "execution_count": 11, "id": "22175acd", "metadata": { + "execution": { + "iopub.execute_input": "2026-04-29T13:45:23.361669Z", + "iopub.status.busy": "2026-04-29T13:45:23.361606Z", + "iopub.status.idle": "2026-04-29T13:45:23.436846Z", + "shell.execute_reply": "2026-04-29T13:45:23.436510Z" + }, "tags": [ "raises-exception" ] @@ -570,6 +636,12 @@ "execution_count": 12, "id": "3377890c", "metadata": { + "execution": { + "iopub.execute_input": "2026-04-29T13:45:23.437967Z", + "iopub.status.busy": "2026-04-29T13:45:23.437903Z", + "iopub.status.idle": "2026-04-29T13:45:23.543515Z", + "shell.execute_reply": "2026-04-29T13:45:23.543160Z" + }, "tags": [ "raises-exception" ] @@ -620,6 +692,12 @@ "execution_count": 13, "id": "a97e7c6b", "metadata": { + "execution": { + "iopub.execute_input": "2026-04-29T13:45:23.544509Z", + "iopub.status.busy": "2026-04-29T13:45:23.544453Z", + "iopub.status.idle": "2026-04-29T13:45:23.627480Z", + "shell.execute_reply": "2026-04-29T13:45:23.627144Z" + }, "tags": [ "raises-exception" ] @@ -665,6 +743,12 @@ "execution_count": 14, "id": "6ee88f52", "metadata": { + "execution": { + "iopub.execute_input": "2026-04-29T13:45:23.628514Z", + "iopub.status.busy": "2026-04-29T13:45:23.628452Z", + "iopub.status.idle": "2026-04-29T13:45:23.698940Z", + "shell.execute_reply": "2026-04-29T13:45:23.698572Z" + }, "tags": [ "raises-exception" ] @@ -712,6 +796,12 @@ "execution_count": 15, "id": "50d39e84", "metadata": { + "execution": { + "iopub.execute_input": "2026-04-29T13:45:23.699872Z", + "iopub.status.busy": "2026-04-29T13:45:23.699811Z", + "iopub.status.idle": "2026-04-29T13:45:23.826026Z", + "shell.execute_reply": "2026-04-29T13:45:23.825721Z" + }, "tags": [ "raises-exception" ] @@ -770,6 +860,12 @@ "execution_count": 16, "id": "cec001fa", "metadata": { + "execution": { + "iopub.execute_input": "2026-04-29T13:45:23.827075Z", + "iopub.status.busy": "2026-04-29T13:45:23.827012Z", + "iopub.status.idle": "2026-04-29T13:45:23.889231Z", + "shell.execute_reply": "2026-04-29T13:45:23.888813Z" + }, "tags": [ "raises-exception" ] @@ -809,6 +905,12 @@ "execution_count": 17, "id": "8f3aff7f", "metadata": { + "execution": { + "iopub.execute_input": "2026-04-29T13:45:23.890099Z", + "iopub.status.busy": "2026-04-29T13:45:23.890034Z", + "iopub.status.idle": "2026-04-29T13:45:24.183374Z", + "shell.execute_reply": "2026-04-29T13:45:24.182806Z" + }, "tags": [ "raises-exception" ] @@ -868,6 +970,12 @@ "execution_count": 18, "id": "3e021bd4", "metadata": { + "execution": { + "iopub.execute_input": "2026-04-29T13:45:24.184517Z", + "iopub.status.busy": "2026-04-29T13:45:24.184452Z", + "iopub.status.idle": "2026-04-29T13:45:24.269559Z", + "shell.execute_reply": "2026-04-29T13:45:24.269205Z" + }, "tags": [ "raises-exception" ] @@ -913,6 +1021,12 @@ "execution_count": 19, "id": "54f9e48f", "metadata": { + "execution": { + "iopub.execute_input": "2026-04-29T13:45:24.270589Z", + "iopub.status.busy": "2026-04-29T13:45:24.270522Z", + "iopub.status.idle": "2026-04-29T13:45:24.328358Z", + "shell.execute_reply": "2026-04-29T13:45:24.328021Z" + }, "tags": [ "raises-exception" ] @@ -969,6 +1083,12 @@ "execution_count": 20, "id": "8b522152", "metadata": { + "execution": { + "iopub.execute_input": "2026-04-29T13:45:24.329488Z", + "iopub.status.busy": "2026-04-29T13:45:24.329428Z", + "iopub.status.idle": "2026-04-29T13:45:24.487094Z", + "shell.execute_reply": "2026-04-29T13:45:24.486730Z" + }, "tags": [ "raises-exception" ] @@ -1014,6 +1134,12 @@ "execution_count": 21, "id": "80a23fb4", "metadata": { + "execution": { + "iopub.execute_input": "2026-04-29T13:45:24.488080Z", + "iopub.status.busy": "2026-04-29T13:45:24.488017Z", + "iopub.status.idle": "2026-04-29T13:45:24.549401Z", + "shell.execute_reply": "2026-04-29T13:45:24.549035Z" + }, "tags": [ "raises-exception" ] @@ -1067,6 +1193,12 @@ "execution_count": 22, "id": "85d1009e", "metadata": { + "execution": { + "iopub.execute_input": "2026-04-29T13:45:24.550329Z", + "iopub.status.busy": "2026-04-29T13:45:24.550267Z", + "iopub.status.idle": "2026-04-29T13:45:24.634210Z", + "shell.execute_reply": "2026-04-29T13:45:24.633924Z" + }, "tags": [ "raises-exception" ] @@ -1117,6 +1249,12 @@ "execution_count": 23, "id": "03a9da7e", "metadata": { + "execution": { + "iopub.execute_input": "2026-04-29T13:45:24.635110Z", + "iopub.status.busy": "2026-04-29T13:45:24.635054Z", + "iopub.status.idle": "2026-04-29T13:45:24.704869Z", + "shell.execute_reply": "2026-04-29T13:45:24.704609Z" + }, "tags": [ "raises-exception" ] @@ -1164,6 +1302,12 @@ "execution_count": 24, "id": "294694e3", "metadata": { + "execution": { + "iopub.execute_input": "2026-04-29T13:45:24.705918Z", + "iopub.status.busy": "2026-04-29T13:45:24.705862Z", + "iopub.status.idle": "2026-04-29T13:45:24.774612Z", + "shell.execute_reply": "2026-04-29T13:45:24.774352Z" + }, "tags": [ "raises-exception" ] @@ -1221,6 +1365,12 @@ "execution_count": 25, "id": "aac5a961", "metadata": { + "execution": { + "iopub.execute_input": "2026-04-29T13:45:24.775714Z", + "iopub.status.busy": "2026-04-29T13:45:24.775658Z", + "iopub.status.idle": "2026-04-29T13:45:24.932802Z", + "shell.execute_reply": "2026-04-29T13:45:24.932360Z" + }, "tags": [ "raises-exception" ] @@ -1265,6 +1415,12 @@ "execution_count": 26, "id": "6028e5d0", "metadata": { + "execution": { + "iopub.execute_input": "2026-04-29T13:45:24.933760Z", + "iopub.status.busy": "2026-04-29T13:45:24.933708Z", + "iopub.status.idle": "2026-04-29T13:45:24.967724Z", + "shell.execute_reply": "2026-04-29T13:45:24.967386Z" + }, "tags": [ "raises-exception" ] @@ -1288,7 +1444,14 @@ " | - This is of type `bool`\n", " | \n", "4 | 0 if (y := x) else (y := 6)\n", - " | - This is of type `int`\n", + " | - This is of type `int`" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", "\n", "Guppy compilation failed due to 1 previous error\n" ] diff --git a/tests/integration/test_qsystem.py b/tests/integration/test_qsystem.py index 507ae6ea4..714c049c9 100644 --- a/tests/integration/test_qsystem.py +++ b/tests/integration/test_qsystem.py @@ -175,7 +175,7 @@ def test() -> int: q = qubit() x(q) q, first_result = lazy_measure_and_reset_fn(q) - second_result = measure(q) + second_result = measure(q).read() if first_result.read() and not second_result: return 1 return 0 @@ -195,8 +195,8 @@ def test() -> int: if pattern[i]: x(qubits[i]) - first = measure_and_reset_array(qubits) - second = qsystem_measure_array(qubits) + first = collect_measurements(measure_and_reset_array(qubits)) + second = collect_measurements(qsystem_measure_array(qubits)) for i in range(len(first)): if int(first[i]) != pattern[i] or second[i]: @@ -218,7 +218,7 @@ def test() -> int: if pattern[i]: x(qubits[i]) - bits = measure_array_fn(qubits) + bits = collect_measurements(measure_array_fn(qubits)) for i in range(len(bits)): if int(bits[i]) != pattern[i]: @@ -240,8 +240,9 @@ def test() -> int: if pattern[i]: x(qubits[i]) - qubits, first = measure_and_reset_array_fn(qubits) - second = measure_array(qubits) + qubits, first_msmts = measure_and_reset_array_fn(qubits) + first = collect_measurements(first_msmts) + second = collect_measurements(measure_array(qubits)) for i in range(len(first)): if int(first[i]) != pattern[i] or second[i]: @@ -263,12 +264,12 @@ def test() -> int: if pattern[i]: x(qubits[i]) - qubits, measurements = lazy_measure_and_reset_array_fn(qubits) - results = collect_measurements(measurements) - second = qsystem_measure_array(qubits) + qubits, first_msmts = lazy_measure_and_reset_array_fn(qubits) + first = collect_measurements(first_msmts) + second = collect_measurements(qsystem_measure_array(qubits)) - for i in range(len(results)): - if int(results[i]) != pattern[i] or second[i]: + for i in range(len(first)): + if int(first[i]) != pattern[i] or second[i]: return 0 return 1 From 9dcf9f834cd573fb431f8a623018f4e8a16bbf28 Mon Sep 17 00:00:00 2001 From: Tatiana S Date: Thu, 30 Apr 2026 11:18:54 +0100 Subject: [PATCH 5/9] Update notebook text --- examples/deferred_measurement.ipynb | 153 ++- examples/t_factory.ipynb | 145 +-- tests/integration/notebooks/errorsdemo.ipynb | 953 ++++++++++--------- 3 files changed, 655 insertions(+), 596 deletions(-) diff --git a/examples/deferred_measurement.ipynb b/examples/deferred_measurement.ipynb index 0fb09f6e3..726de4d6c 100644 --- a/examples/deferred_measurement.ipynb +++ b/examples/deferred_measurement.ipynb @@ -9,17 +9,18 @@ "\n", "**Download this notebook - {nb-download}`deferred_measurement.ipynb`**\n", "\n", - "TODO: Update this notebook to explain default lazy behaviour and reason for change (currently just made to run).\n", - "\n", - "In this example we will illustrate why using `std.qsystem.lazy_measure` can be useful. " + "In this example we will illustrate the `Measurement` type and why the ability to defer measurements can be important for performance." ] }, { "cell_type": "code", - "execution_count": 1, "id": "96cb92b8", - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2026-04-30T10:08:46.776952Z", + "start_time": "2026-04-30T10:08:46.204437Z" + } + }, "source": [ "from guppylang import guppy\n", "from guppylang.std.builtins import array, owned\n", @@ -28,66 +29,57 @@ "from guppylang.std.platform import result\n", "\n", "from typing import no_type_check" - ] - }, - { - "cell_type": "markdown", - "id": "edddb1c3", - "metadata": {}, - "source": [ - "Let's say we want to measure an array of qubits one by one and output the results. You might do something like `eager_read` below:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "3c414f04", - "metadata": {}, + ], "outputs": [], - "source": [ - "@guppy\n", - "@no_type_check\n", - "def eager_read(qs: array[qubit, 10] @ owned) -> None:\n", - " for q in qs:\n", - " result(\"t\", measure(q).read()) # forces immediate measurement of q\n", - " # [... more quantum operations ...]\n", - "\n", - "eager_read.check()" - ] + "execution_count": 1 }, { "cell_type": "markdown", - "id": "3a33772a", + "id": "edddb1c3", "metadata": {}, "source": [ - "It is important to understand that while `std.quantum.measure` returns a `bool` on the surface, on Quantinuum systems the physical measurement doesn't always happen immediately. A measurement call requests a measurement, which can then be deferred until it is actually required. At that point, any further execution is blocked, so by delaying it we give the runtime more opportunities to parallelise operations between request and block.\n", + "In previous versions of Guppy, the `measure` function used to return a `bool` directly, which implied a measurement was being performed immediately. However, this was hiding what was actually happening on the hardware, which is that a measurement request is being made when the function is called, and the physical measurement can be deferred until it is actually required.\n", "\n", - "In the example above, using `result` does mean forcing an immediate measurement of `q`, which isn't the best for performance. However, this isn't obvious from a user perspective. \n", + "Now `measure` (and adjacent functions such as `measure_array`) return a `Measurement` type, which is a handle to the measurement request. In order to block on the request and wait to receive a bool, the `read()` method should be used. This allows the runtime to defer measurements until they are actually needed, which can give more opportunities for parallelism and therefore better performance. Exposing this behaviour allows you to make more informed decisions about how to structure your program for better performance.\n", "\n", - "Now consider the same function using `lazy_measure`: " + "Consider the following program, where you might be tempted to use the output of `measure` directly in `result`:" ] }, { "cell_type": "code", - "execution_count": 3, "id": "cc4e4a99", "metadata": { "tags": [ "raises-exception" - ] + ], + "ExecuteTime": { + "end_time": "2026-04-30T10:08:46.969299Z", + "start_time": "2026-04-30T10:08:46.782496Z" + } }, + "source": [ + "@guppy\n", + "@no_type_check\n", + "def output_result(qs: array[qubit, 10] @ owned) -> None:\n", + " for q in qs:\n", + " result(\"t\", measure(q))\n", + " # [... more quantum operations ...]\n", + "\n", + "\n", + "output_result.check()" + ], "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "Error: Invalid call of overloaded function (at :5:15)\n", + "Error: Invalid call of overloaded function (at :5:15)\n", " | \n", - "3 | def lazy_read(qs: array[qubit, 10] @ owned) -> None:\n", + "3 | def output_result(qs: array[qubit, 10] @ owned) -> None:\n", "4 | for q in qs:\n", - "5 | result(\"t\", lazy_measure(q))\n", - " | ^^^^^^^^^^^^^^^^^^^^ No variant of overloaded function `result` takes arguments\n", - " | `str`, `Measurement`\n", + "5 | result(\"t\", measure(q))\n", + " | ^^^^^^^^^^^^^^^ No variant of overloaded function `result` takes arguments\n", + " | `str`, `Measurement`\n", "\n", "Note: Available overloads are:\n", " def result(tag: str @comptime, value: int) -> None\n", @@ -103,100 +95,101 @@ ] } ], - "source": [ - "@guppy\n", - "@no_type_check\n", - "def lazy_read(qs: array[qubit, 10] @ owned) -> None:\n", - " for q in qs:\n", - " result(\"t\", lazy_measure(q))\n", - " # [... more quantum operations ...]\n", - "\n", - "\n", - "lazy_read.check()" - ] + "execution_count": 2 }, { "cell_type": "markdown", "id": "683a89c6", "metadata": {}, "source": [ - "Simply replacing the method results in an error because `lazy_measure` returns a value of type `Measurement`. In order to obtain a `bool`, we have to explicitaly use `read()` on the value. " + "Simply replacing the method results in an error because `result` expects a `bool`. In order to obtain it, we have to explicitly use `read()` on the value of type `Measurement`. This will block until the physical measurement is completed:" ] }, { "cell_type": "code", - "execution_count": 4, - "id": "0bc3eeab", - "metadata": {}, - "outputs": [], + "id": "430b5814", + "metadata": { + "ExecuteTime": { + "end_time": "2026-04-30T10:08:53.815260Z", + "start_time": "2026-04-30T10:08:53.563296Z" + } + }, "source": [ "@guppy\n", "@no_type_check\n", - "def lazy_read(qs: array[qubit, 10] @ owned) -> None:\n", + "def output_result(qs: array[qubit, 10] @ owned) -> None:\n", " for q in qs:\n", " result(\"t\", lazy_measure(q).read())\n", " # [... more quantum operations ...]\n", "\n", - "lazy_read.check()" - ] + "output_result.check()" + ], + "outputs": [], + "execution_count": 3 }, { "cell_type": "markdown", "id": "11043eea", "metadata": {}, "source": [ - "The program now type-checks and ends up compiling to the exact same operation order as `eager_read`. We can now see where exactly the `read()` happens, rather than it being done implicitly, so we can try to move it further down the program." + "The program now type-checks and we can see where exactly the `read()` happens, rather than it being done implicitly. Therefore we can try to move it further down the program, which allows for flexibility in when the quantum operations before the blocking read are performed:" ] }, { "cell_type": "code", - "execution_count": 5, "id": "703c7af1", - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2026-04-30T10:08:56.647903Z", + "start_time": "2026-04-30T10:08:56.264786Z" + } + }, "source": [ "@guppy\n", "@no_type_check\n", - "def lazy_read_improved(qs: array[qubit, 10] @ owned) -> None:\n", - " ms = array(lazy_measure(q) for q in qs)\n", + "def output_result_improved(qs: array[qubit, 10] @ owned) -> None:\n", + " ms = array(measure(q) for q in qs)\n", " # [... more quantum operations ...]\n", " for m in ms:\n", " # This `read` call only blocks execution when we are at the end of the program \n", " result(\"t\", m.read()) \n", "\n", - "\n", - "lazy_read_improved.check()" - ] + "output_result_improved.check()" + ], + "outputs": [], + "execution_count": 4 }, { "cell_type": "markdown", "id": "6e39f898", "metadata": {}, "source": [ - "Now that each measurement is only read at the end of the program, physical measurements can be deferred to a better point in execution.\n", - "\n", - "Of course in this case we could have also collected the `bool` returns of `measure` or used `measure_array` to achieve the same outcome, however there might be cases where other solutions are less obvious. It can therefore be useful to use `lazy_measure` in programs where you want more control over when measurements should happen.\n", "\n", - "For convenience, `__bool__` is implemented on the `Measurement` type as syntactic sugar for `read()`, so it is called automatically in conditionals for example:" + "For convenience, `__bool__` is implemented on the `Measurement` type as syntactic sugar for `read()`, so it is called automatically in conditionals, for example:" ] }, { "cell_type": "code", - "execution_count": 6, "id": "8731d741", - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2026-04-30T10:08:58.267937Z", + "start_time": "2026-04-30T10:08:58.192851Z" + } + }, "source": [ "@guppy\n", "@no_type_check\n", "def lazy_conditional(q: qubit @ owned) -> None:\n", - " if lazy_measure(q):\n", + " if measure(q):\n", " result(\"t\", 1)\n", " else:\n", " result(\"t\", 0)\n", "\n", - "lazy_conditional.check();" - ] + "lazy_conditional.check()" + ], + "outputs": [], + "execution_count": 5 } ], "metadata": { diff --git a/examples/t_factory.ipynb b/examples/t_factory.ipynb index 267f1d2d5..046b1a77d 100644 --- a/examples/t_factory.ipynb +++ b/examples/t_factory.ipynb @@ -14,21 +14,19 @@ }, { "cell_type": "code", - "execution_count": 1, "id": "d19bfc55be7d133d", "metadata": { - "ExecuteTime": { - "end_time": "2026-04-21T14:53:44.028578Z", - "start_time": "2026-04-21T14:53:43.172878Z" - }, "execution": { "iopub.execute_input": "2026-04-29T13:44:43.573376Z", "iopub.status.busy": "2026-04-29T13:44:43.573140Z", "iopub.status.idle": "2026-04-29T13:44:44.155424Z", "shell.execute_reply": "2026-04-29T13:44:44.154978Z" + }, + "ExecuteTime": { + "end_time": "2026-04-30T10:08:10.741243Z", + "start_time": "2026-04-30T10:08:09.952947Z" } }, - "outputs": [], "source": [ "import numpy as np\n", "\n", @@ -54,7 +52,9 @@ "from hugr.qsystem.result import QsysResult\n", "\n", "np.set_printoptions(precision=4, suppress=True, linewidth=120)" - ] + ], + "outputs": [], + "execution_count": 1 }, { "cell_type": "markdown", @@ -68,21 +68,19 @@ }, { "cell_type": "code", - "execution_count": 2, "id": "d9646c0f", "metadata": { - "ExecuteTime": { - "end_time": "2026-04-21T14:53:44.068717Z", - "start_time": "2026-04-21T14:53:44.040171Z" - }, "execution": { "iopub.execute_input": "2026-04-29T13:44:44.156660Z", "iopub.status.busy": "2026-04-29T13:44:44.156536Z", "iopub.status.idle": "2026-04-29T13:44:44.158578Z", "shell.execute_reply": "2026-04-29T13:44:44.158299Z" + }, + "ExecuteTime": { + "end_time": "2026-04-30T10:08:10.751550Z", + "start_time": "2026-04-30T10:08:10.743266Z" } }, - "outputs": [], "source": [ "phi = np.arccos(1 / 3)\n", "\n", @@ -93,7 +91,9 @@ " ry(q, angle(comptime(phi)))\n", " rz(q, pi / 4)\n", " return q" - ] + ], + "outputs": [], + "execution_count": 2 }, { "cell_type": "markdown", @@ -108,21 +108,19 @@ }, { "cell_type": "code", - "execution_count": 3, "id": "704030e7", "metadata": { - "ExecuteTime": { - "end_time": "2026-04-21T14:53:44.101664Z", - "start_time": "2026-04-21T14:53:44.079537Z" - }, "execution": { "iopub.execute_input": "2026-04-29T13:44:44.159472Z", "iopub.status.busy": "2026-04-29T13:44:44.159414Z", "iopub.status.idle": "2026-04-29T13:44:44.161700Z", "shell.execute_reply": "2026-04-29T13:44:44.161394Z" + }, + "ExecuteTime": { + "end_time": "2026-04-30T10:08:10.758726Z", + "start_time": "2026-04-30T10:08:10.753211Z" } }, - "outputs": [], "source": [ "@guppy\n", "def distill(\n", @@ -148,7 +146,9 @@ " for b in bits:\n", " success &= b\n", " return target, success" - ] + ], + "outputs": [], + "execution_count": 3 }, { "cell_type": "markdown", @@ -162,21 +162,19 @@ }, { "cell_type": "code", - "execution_count": 4, "id": "bcc5acd4", "metadata": { - "ExecuteTime": { - "end_time": "2026-04-21T14:53:44.138361Z", - "start_time": "2026-04-21T14:53:44.114263Z" - }, "execution": { "iopub.execute_input": "2026-04-29T13:44:44.162621Z", "iopub.status.busy": "2026-04-29T13:44:44.162573Z", "iopub.status.idle": "2026-04-29T13:44:44.164783Z", "shell.execute_reply": "2026-04-29T13:44:44.164439Z" + }, + "ExecuteTime": { + "end_time": "2026-04-30T10:08:10.764591Z", + "start_time": "2026-04-30T10:08:10.759445Z" } }, - "outputs": [], "source": [ "@guppy\n", "def t_state(attempts: int) -> Option[qubit]:\n", @@ -201,7 +199,9 @@ "\n", " # We ran out of attempts.\n", " return nothing()" - ] + ], + "outputs": [], + "execution_count": 4 }, { "cell_type": "markdown", @@ -213,21 +213,19 @@ }, { "cell_type": "code", - "execution_count": 5, "id": "9ff753c6", "metadata": { - "ExecuteTime": { - "end_time": "2026-04-21T14:53:44.169033Z", - "start_time": "2026-04-21T14:53:44.148822Z" - }, "execution": { "iopub.execute_input": "2026-04-29T13:44:44.165736Z", "iopub.status.busy": "2026-04-29T13:44:44.165689Z", "iopub.status.idle": "2026-04-29T13:44:44.167558Z", "shell.execute_reply": "2026-04-29T13:44:44.167270Z" + }, + "ExecuteTime": { + "end_time": "2026-04-30T10:08:10.771378Z", + "start_time": "2026-04-30T10:08:10.766752Z" } }, - "outputs": [], "source": [ "attempts = 3\n", "\n", @@ -245,33 +243,25 @@ " # Since qubits are linear, Option[qubit] is also linear, so we need to consume\n", " # it either way.\n", " option_t.unwrap_nothing()" - ] + ], + "outputs": [], + "execution_count": 5 }, { "cell_type": "code", - "execution_count": 6, "id": "40a25f2d", "metadata": { - "ExecuteTime": { - "end_time": "2026-04-21T14:53:46.497974Z", - "start_time": "2026-04-21T14:53:44.170371Z" - }, "execution": { "iopub.execute_input": "2026-04-29T13:44:44.168366Z", "iopub.status.busy": "2026-04-29T13:44:44.168305Z", "iopub.status.idle": "2026-04-29T13:44:45.812949Z", "shell.execute_reply": "2026-04-29T13:44:45.812478Z" + }, + "ExecuteTime": { + "end_time": "2026-04-30T10:08:13.061416Z", + "start_time": "2026-04-30T10:08:10.771937Z" } }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "True\n" - ] - } - ], "source": [ "shots = main.emulator(n_qubits=8).with_seed(1).run()\n", "\n", @@ -281,7 +271,17 @@ " if \"t_state\" in states:\n", " dist = states[\"t_state\"].state_distribution()\n", " print(np.allclose(dist[0].state, np.array([0.2967+0.j, 0.8094-0.5068j]), rtol=1e-4))" - ] + ], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n" + ] + } + ], + "execution_count": 6 }, { "cell_type": "markdown", @@ -303,13 +303,8 @@ }, { "cell_type": "code", - "execution_count": 7, "id": "ee6a43c5", "metadata": { - "ExecuteTime": { - "end_time": "2026-04-21T14:53:46.725250Z", - "start_time": "2026-04-21T14:53:46.520031Z" - }, "execution": { "iopub.execute_input": "2026-04-29T13:44:45.814599Z", "iopub.status.busy": "2026-04-29T13:44:45.814499Z", @@ -318,8 +313,20 @@ }, "tags": [ "raises-exception" - ] + ], + "ExecuteTime": { + "end_time": "2026-04-30T10:08:13.257394Z", + "start_time": "2026-04-30T10:08:13.082067Z" + } }, + "source": [ + "@guppy\n", + "def attempt_measure(qs: array[qubit, 10] @ owned) -> None:\n", + " measure(qs[5]).read()\n", + "\n", + "\n", + "compiled = attempt_measure.compile()" + ], "outputs": [ { "name": "stderr", @@ -340,14 +347,7 @@ ] } ], - "source": [ - "@guppy\n", - "def attempt_measure(qs: array[qubit, 10] @ owned) -> None:\n", - " measure(qs[5]).read()\n", - "\n", - "\n", - "compiled = attempt_measure.compile()" - ] + "execution_count": 7 }, { "cell_type": "markdown", @@ -356,26 +356,24 @@ "source": [ "As expected, this leads to an error because you can't consume subscripts of a linear array. \n", "\n", - "However we can use arrays of type `array[Option[qubit], N]` to measure some qubits in an array without consuming the whole array at once by swapping qubits you want to measure with`nothing()`. " + "However, we can use arrays of type `array[Option[qubit], N]` to measure some qubits in an array without consuming the whole array at once by swapping qubits you want to measure with `nothing()`." ] }, { "cell_type": "code", - "execution_count": 8, "id": "b10e2b99f6a039f5", "metadata": { - "ExecuteTime": { - "end_time": "2026-04-21T14:53:53.883010Z", - "start_time": "2026-04-21T14:53:50.104763Z" - }, "execution": { "iopub.execute_input": "2026-04-29T13:44:45.970640Z", "iopub.status.busy": "2026-04-29T13:44:45.970571Z", "iopub.status.idle": "2026-04-29T13:44:49.705036Z", "shell.execute_reply": "2026-04-29T13:44:49.704633Z" + }, + "ExecuteTime": { + "end_time": "2026-04-30T10:08:35.974099Z", + "start_time": "2026-04-30T10:08:32.129706Z" } }, - "outputs": [], "source": [ "n = guppy.nat_var(\"n\")\n", "\n", @@ -385,6 +383,7 @@ " qs: array[Option[qubit], n], mask: array[bool, n] @ owned\n", ") -> array[Option[Measurement], n]:\n", " \"\"\"Measure all qubits in `qs` with a corresponding `True` index in `mask`.\"\"\"\n", + " # As measurements are linear, we also use an optional array for them.\n", " res = array(nothing[Measurement]() for _ in range(n))\n", " idx = 0\n", " for m in mask:\n", @@ -416,7 +415,9 @@ "\n", "\n", "main.compile();" - ] + ], + "outputs": [], + "execution_count": 8 } ], "metadata": { diff --git a/tests/integration/notebooks/errorsdemo.ipynb b/tests/integration/notebooks/errorsdemo.ipynb index 6ec804d07..94b25e00b 100644 --- a/tests/integration/notebooks/errorsdemo.ipynb +++ b/tests/integration/notebooks/errorsdemo.ipynb @@ -2,21 +2,19 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, "id": "fc9fe864", "metadata": { - "ExecuteTime": { - "end_time": "2026-03-03T12:40:25.811190Z", - "start_time": "2026-03-03T12:40:25.387461Z" - }, "execution": { "iopub.execute_input": "2026-04-29T13:45:22.138532Z", "iopub.status.busy": "2026-04-29T13:45:22.138268Z", "iopub.status.idle": "2026-04-29T13:45:22.719095Z", "shell.execute_reply": "2026-04-29T13:45:22.718622Z" + }, + "ExecuteTime": { + "end_time": "2026-04-30T10:15:50.523508Z", + "start_time": "2026-04-30T10:15:50.003311Z" } }, - "outputs": [], "source": [ "import guppylang\n", "from guppylang import guppy\n", @@ -24,7 +22,9 @@ "from guppylang.std.quantum import qubit, measure, cx\n", "\n", "guppylang.enable_experimental_features();" - ] + ], + "outputs": [], + "execution_count": 1 }, { "cell_type": "markdown", @@ -36,13 +36,8 @@ }, { "cell_type": "code", - "execution_count": 2, "id": "654758a8", "metadata": { - "ExecuteTime": { - "end_time": "2026-03-03T12:42:43.615276Z", - "start_time": "2026-03-03T12:42:43.579938Z" - }, "execution": { "iopub.execute_input": "2026-04-29T13:45:22.730437Z", "iopub.status.busy": "2026-04-29T13:45:22.729941Z", @@ -51,8 +46,22 @@ }, "tags": [ "raises-exception" - ] + ], + "ExecuteTime": { + "end_time": "2026-04-30T10:15:50.651212Z", + "start_time": "2026-04-30T10:15:50.524463Z" + } }, + "source": [ + "@guppy\n", + "def bad(b: bool) -> int:\n", + " if b:\n", + " x = 4\n", + " return x # x not defined if b is False\n", + "\n", + "\n", + "bad.compile() # Raises an error" + ], "outputs": [ { "name": "stderr", @@ -75,16 +84,7 @@ ] } ], - "source": [ - "@guppy\n", - "def bad(b: bool) -> int:\n", - " if b:\n", - " x = 4\n", - " return x # x not defined if b is False\n", - "\n", - "\n", - "bad.compile() # Raises an error" - ] + "execution_count": 2 }, { "cell_type": "markdown", @@ -104,13 +104,8 @@ }, { "cell_type": "code", - "execution_count": 3, "id": "c1671ed8", "metadata": { - "ExecuteTime": { - "end_time": "2026-03-03T12:42:49.179179Z", - "start_time": "2026-03-03T12:42:49.120888Z" - }, "execution": { "iopub.execute_input": "2026-04-29T13:45:22.883841Z", "iopub.status.busy": "2026-04-29T13:45:22.883778Z", @@ -119,8 +114,26 @@ }, "tags": [ "raises-exception" - ] + ], + "ExecuteTime": { + "end_time": "2026-04-30T10:15:55.940540Z", + "start_time": "2026-04-30T10:15:55.873444Z" + } }, + "source": [ + "@guppy\n", + "def bad(b: bool) -> int:\n", + " if b:\n", + " x = 4\n", + "\n", + "\n", + " else:\n", + " x = True\n", + " return int(x) # x has different types depending on b\n", + "\n", + "\n", + "bad.compile() # Raises an error" + ], "outputs": [ { "name": "stderr", @@ -147,30 +160,12 @@ ] } ], - "source": [ - "@guppy\n", - "def bad(b: bool) -> int:\n", - " if b:\n", - " x = 4\n", - "\n", - "\n", - " else:\n", - " x = True\n", - " return int(x) # x has different types depending on b\n", - "\n", - "\n", - "bad.compile() # Raises an error" - ] + "execution_count": 3 }, { "cell_type": "code", - "execution_count": 4, "id": "d1d901a5", "metadata": { - "ExecuteTime": { - "end_time": "2026-03-03T12:42:52.206427Z", - "start_time": "2026-03-03T12:42:52.110629Z" - }, "execution": { "iopub.execute_input": "2026-04-29T13:45:22.929041Z", "iopub.status.busy": "2026-04-29T13:45:22.928979Z", @@ -179,8 +174,25 @@ }, "tags": [ "raises-exception" - ] + ], + "ExecuteTime": { + "end_time": "2026-04-30T10:16:00.303829Z", + "start_time": "2026-04-30T10:16:00.241871Z" + } }, + "source": [ + "@guppy\n", + "def bad(b: bool) -> int:\n", + " if b:\n", + " x = 4\n", + "\n", + " else:\n", + " x = True\n", + " return int(x) # x has different types depending on b\n", + "\n", + "\n", + "bad.compile() # Raises an error" + ], "outputs": [ { "name": "stderr", @@ -207,29 +219,12 @@ ] } ], - "source": [ - "@guppy\n", - "def bad(b: bool) -> int:\n", - " if b:\n", - " x = 4\n", - "\n", - " else:\n", - " x = True\n", - " return int(x) # x has different types depending on b\n", - "\n", - "\n", - "bad.compile() # Raises an error" - ] + "execution_count": 4 }, { "cell_type": "code", - "execution_count": 5, "id": "bba8ae03", "metadata": { - "ExecuteTime": { - "end_time": "2026-03-03T12:42:54.510616Z", - "start_time": "2026-03-03T12:42:54.467746Z" - }, "execution": { "iopub.execute_input": "2026-04-29T13:45:22.971096Z", "iopub.status.busy": "2026-04-29T13:45:22.971026Z", @@ -238,8 +233,24 @@ }, "tags": [ "raises-exception" - ] + ], + "ExecuteTime": { + "end_time": "2026-04-30T10:16:02.344166Z", + "start_time": "2026-04-30T10:16:02.285795Z" + } }, + "source": [ + "@guppy\n", + "def bad(b: bool) -> int:\n", + " if b:\n", + " x = 4\n", + " else:\n", + " x = True\n", + " return int(x) # x has different types depending on b\n", + "\n", + "\n", + "bad.compile() # Raises an error" + ], "outputs": [ { "name": "stderr", @@ -265,28 +276,12 @@ ] } ], - "source": [ - "@guppy\n", - "def bad(b: bool) -> int:\n", - " if b:\n", - " x = 4\n", - " else:\n", - " x = True\n", - " return int(x) # x has different types depending on b\n", - "\n", - "\n", - "bad.compile() # Raises an error" - ] + "execution_count": 5 }, { "cell_type": "code", - "execution_count": 6, "id": "2635abbd", "metadata": { - "ExecuteTime": { - "end_time": "2026-03-03T12:42:56.974918Z", - "start_time": "2026-03-03T12:42:56.914166Z" - }, "execution": { "iopub.execute_input": "2026-04-29T13:45:23.014204Z", "iopub.status.busy": "2026-04-29T13:45:23.014126Z", @@ -295,8 +290,21 @@ }, "tags": [ "raises-exception" - ] + ], + "ExecuteTime": { + "end_time": "2026-04-30T10:16:03.935276Z", + "start_time": "2026-04-30T10:16:03.875220Z" + } }, + "source": [ + "@guppy\n", + "def bad(b: bool) -> int:\n", + " x = 4 if b else True\n", + " return int(x) # x has different types depending on b\n", + "\n", + "\n", + "bad.compile() # Raises an error" + ], "outputs": [ { "name": "stderr", @@ -322,25 +330,12 @@ ] } ], - "source": [ - "@guppy\n", - "def bad(b: bool) -> int:\n", - " x = 4 if b else True\n", - " return int(x) # x has different types depending on b\n", - "\n", - "\n", - "bad.compile() # Raises an error" - ] + "execution_count": 6 }, { "cell_type": "code", - "execution_count": 7, "id": "1cd0040d", "metadata": { - "ExecuteTime": { - "end_time": "2026-03-03T12:42:59.670111Z", - "start_time": "2026-03-03T12:42:59.611180Z" - }, "execution": { "iopub.execute_input": "2026-04-29T13:45:23.056729Z", "iopub.status.busy": "2026-04-29T13:45:23.056663Z", @@ -349,8 +344,27 @@ }, "tags": [ "raises-exception" - ] + ], + "ExecuteTime": { + "end_time": "2026-04-30T10:16:05.545424Z", + "start_time": "2026-04-30T10:16:05.481828Z" + } }, + "source": [ + "@guppy\n", + "def foo(b: bool) -> int:\n", + " if b:\n", + " def bar() -> int:\n", + " return 0\n", + " else:\n", + " def bar() -> bool:\n", + " return False\n", + "\n", + " return bar()\n", + "\n", + "\n", + "foo.compile_function()" + ], "outputs": [ { "name": "stderr", @@ -380,31 +394,12 @@ ] } ], - "source": [ - "@guppy\n", - "def foo(b: bool) -> int:\n", - " if b:\n", - " def bar() -> int:\n", - " return 0\n", - " else:\n", - " def bar() -> bool:\n", - " return False\n", - "\n", - " return bar()\n", - "\n", - "\n", - "foo.compile_function()" - ] + "execution_count": 7 }, { "cell_type": "code", - "execution_count": 8, "id": "009e5945", "metadata": { - "ExecuteTime": { - "end_time": "2026-03-03T12:43:02.190053Z", - "start_time": "2026-03-03T12:43:02.127523Z" - }, "execution": { "iopub.execute_input": "2026-04-29T13:45:23.099246Z", "iopub.status.busy": "2026-04-29T13:45:23.099187Z", @@ -413,8 +408,28 @@ }, "tags": [ "raises-exception" - ] + ], + "ExecuteTime": { + "end_time": "2026-04-30T10:16:16.362399Z", + "start_time": "2026-04-30T10:16:16.300751Z" + } }, + "source": [ + "@guppy\n", + "def foo(b: bool) -> int:\n", + " if b:\n", + " def bar() -> int:\n", + " return 0\n", + " else:\n", + "\n", + " def bar() -> bool:\n", + " return False\n", + "\n", + " return bar()\n", + "\n", + "\n", + "foo.compile_function()" + ], "outputs": [ { "name": "stderr", @@ -445,22 +460,7 @@ ] } ], - "source": [ - "@guppy\n", - "def foo(b: bool) -> int:\n", - " if b:\n", - " def bar() -> int:\n", - " return 0\n", - " else:\n", - "\n", - " def bar() -> bool:\n", - " return False\n", - "\n", - " return bar()\n", - "\n", - "\n", - "foo.compile_function()" - ] + "execution_count": 8 }, { "cell_type": "markdown", @@ -472,7 +472,6 @@ }, { "cell_type": "code", - "execution_count": 9, "id": "e9702a33", "metadata": { "execution": { @@ -483,8 +482,21 @@ }, "tags": [ "raises-exception" - ] + ], + "ExecuteTime": { + "end_time": "2026-04-30T10:16:18.079756Z", + "start_time": "2026-04-30T10:16:17.945748Z" + } }, + "source": [ + "@guppy\n", + "def bad(q: qubit @ owned) -> qubit:\n", + " cx(q, q)\n", + " return q\n", + "\n", + "\n", + "bad.compile() # Raises an error" + ], "outputs": [ { "name": "stderr", @@ -508,19 +520,10 @@ ] } ], - "source": [ - "@guppy\n", - "def bad(q: qubit @ owned) -> qubit:\n", - " cx(q, q)\n", - " return q\n", - "\n", - "\n", - "bad.compile() # Raises an error" - ] + "execution_count": 9 }, { "cell_type": "code", - "execution_count": 10, "id": "9f43d2e7", "metadata": { "execution": { @@ -531,8 +534,30 @@ }, "tags": [ "raises-exception" - ] + ], + "ExecuteTime": { + "end_time": "2026-04-30T10:16:19.639302Z", + "start_time": "2026-04-30T10:16:19.488054Z" + } }, + "source": [ + "@guppy.declare\n", + "def foo(q1: qubit) -> None: ...\n", + "\n", + "\n", + "@guppy.declare\n", + "def use(q: qubit @ owned) -> None: ...\n", + "\n", + "\n", + "@guppy\n", + "def test(q: qubit @ owned) -> None:\n", + " use(q)\n", + "\n", + " foo(q)\n", + "\n", + "\n", + "test.compile()" + ], "outputs": [ { "name": "stderr", @@ -556,28 +581,10 @@ ] } ], - "source": [ - "@guppy.declare\n", - "def foo(q1: qubit) -> None: ...\n", - "\n", - "\n", - "@guppy.declare\n", - "def use(q: qubit @ owned) -> None: ...\n", - "\n", - "\n", - "@guppy\n", - "def test(q: qubit @ owned) -> None:\n", - " use(q)\n", - "\n", - " foo(q)\n", - "\n", - "\n", - "test.compile()" - ] + "execution_count": 10 }, { "cell_type": "code", - "execution_count": 11, "id": "22175acd", "metadata": { "execution": { @@ -588,8 +595,29 @@ }, "tags": [ "raises-exception" - ] + ], + "ExecuteTime": { + "end_time": "2026-04-30T10:16:23.288203Z", + "start_time": "2026-04-30T10:16:23.192971Z" + } }, + "source": [ + "@guppy.declare\n", + "def foo(q1: qubit) -> None: ...\n", + "\n", + "\n", + "@guppy.declare\n", + "def use(q: qubit @ owned) -> None: ...\n", + "\n", + "\n", + "@guppy\n", + "def test(q: qubit @ owned) -> None:\n", + " use(q)\n", + " foo(q)\n", + "\n", + "\n", + "test.compile()" + ], "outputs": [ { "name": "stderr", @@ -613,27 +641,10 @@ ] } ], - "source": [ - "@guppy.declare\n", - "def foo(q1: qubit) -> None: ...\n", - "\n", - "\n", - "@guppy.declare\n", - "def use(q: qubit @ owned) -> None: ...\n", - "\n", - "\n", - "@guppy\n", - "def test(q: qubit @ owned) -> None:\n", - " use(q)\n", - " foo(q)\n", - "\n", - "\n", - "test.compile()" - ] + "execution_count": 11 }, { "cell_type": "code", - "execution_count": 12, "id": "3377890c", "metadata": { "execution": { @@ -644,8 +655,29 @@ }, "tags": [ "raises-exception" - ] + ], + "ExecuteTime": { + "end_time": "2026-04-30T10:16:25.022373Z", + "start_time": "2026-04-30T10:16:24.928732Z" + } }, + "source": [ + "@guppy.struct\n", + "class MyStruct:\n", + " q1: qubit\n", + " q2: qubit\n", + "\n", + "\n", + "@guppy\n", + "def foo(b: bool, s: MyStruct @ owned) -> MyStruct:\n", + " if b:\n", + " measure(s.q2).read()\n", + "\n", + " return s\n", + "\n", + "\n", + "foo.compile()" + ], "outputs": [ { "name": "stderr", @@ -669,27 +701,10 @@ ] } ], - "source": [ - "@guppy.struct\n", - "class MyStruct:\n", - " q1: qubit\n", - " q2: qubit\n", - "\n", - "\n", - "@guppy\n", - "def foo(b: bool, s: MyStruct @ owned) -> MyStruct:\n", - " if b:\n", - " measure(s.q2).read()\n", - "\n", - " return s\n", - "\n", - "\n", - "foo.compile()" - ] + "execution_count": 12 }, { "cell_type": "code", - "execution_count": 13, "id": "a97e7c6b", "metadata": { "execution": { @@ -700,8 +715,22 @@ }, "tags": [ "raises-exception" - ] + ], + "ExecuteTime": { + "end_time": "2026-04-30T10:16:26.856138Z", + "start_time": "2026-04-30T10:16:26.681770Z" + } }, + "source": [ + "@guppy\n", + "def main() -> None:\n", + " xs = array(1, 2, 3)\n", + " ys = xs\n", + " xs[0] = 0\n", + "\n", + "\n", + "main.compile()" + ], "outputs": [ { "name": "stderr", @@ -727,20 +756,10 @@ ] } ], - "source": [ - "@guppy\n", - "def main() -> None:\n", - " xs = array(1, 2, 3)\n", - " ys = xs\n", - " xs[0] = 0\n", - "\n", - "\n", - "main.compile()" - ] + "execution_count": 13 }, { "cell_type": "code", - "execution_count": 14, "id": "6ee88f52", "metadata": { "execution": { @@ -751,8 +770,25 @@ }, "tags": [ "raises-exception" - ] + ], + "ExecuteTime": { + "end_time": "2026-04-30T10:16:28.571540Z", + "start_time": "2026-04-30T10:16:28.473738Z" + } }, + "source": [ + "@guppy.struct\n", + "class MyStruct:\n", + " q: qubit\n", + "\n", + "\n", + "@guppy\n", + "def foo(s: MyStruct @ owned) -> tuple[qubit, MyStruct]:\n", + " return s.q, s\n", + "\n", + "\n", + "foo.compile()" + ], "outputs": [ { "name": "stderr", @@ -777,23 +813,10 @@ ] } ], - "source": [ - "@guppy.struct\n", - "class MyStruct:\n", - " q: qubit\n", - "\n", - "\n", - "@guppy\n", - "def foo(s: MyStruct @ owned) -> tuple[qubit, MyStruct]:\n", - " return s.q, s\n", - "\n", - "\n", - "foo.compile()" - ] + "execution_count": 14 }, { "cell_type": "code", - "execution_count": 15, "id": "50d39e84", "metadata": { "execution": { @@ -804,8 +827,29 @@ }, "tags": [ "raises-exception" - ] + ], + "ExecuteTime": { + "end_time": "2026-04-30T10:16:30.321054Z", + "start_time": "2026-04-30T10:16:30.211548Z" + } }, + "source": [ + "@guppy.declare\n", + "def foo(q1: qubit) -> None: ...\n", + "\n", + "\n", + "@guppy.declare\n", + "def use(q: qubit @ owned) -> None: ...\n", + "\n", + "\n", + "@guppy\n", + "def test(q: qubit @ owned) -> None:\n", + " use(q)\n", + " foo(q)\n", + "\n", + "\n", + "test.compile()" + ], "outputs": [ { "name": "stderr", @@ -829,23 +873,7 @@ ] } ], - "source": [ - "@guppy.declare\n", - "def foo(q1: qubit) -> None: ...\n", - "\n", - "\n", - "@guppy.declare\n", - "def use(q: qubit @ owned) -> None: ...\n", - "\n", - "\n", - "@guppy\n", - "def test(q: qubit @ owned) -> None:\n", - " use(q)\n", - " foo(q)\n", - "\n", - "\n", - "test.compile()" - ] + "execution_count": 15 }, { "cell_type": "markdown", @@ -857,7 +885,6 @@ }, { "cell_type": "code", - "execution_count": 16, "id": "cec001fa", "metadata": { "execution": { @@ -868,8 +895,23 @@ }, "tags": [ "raises-exception" - ] + ], + "ExecuteTime": { + "end_time": "2026-04-30T10:16:32.215285Z", + "start_time": "2026-04-30T10:16:32.060949Z" + } }, + "source": [ + "@guppy\n", + "def bad(q: qubit @ owned) -> qubit:\n", + " tmp = qubit()\n", + " cx(tmp, q)\n", + " #discard(tmp) # Compiler complains if tmp is not explicitly discarded\n", + " return q\n", + "\n", + "\n", + "bad.compile() # Raises an error" + ], "outputs": [ { "name": "stderr", @@ -888,21 +930,10 @@ ] } ], - "source": [ - "@guppy\n", - "def bad(q: qubit @ owned) -> qubit:\n", - " tmp = qubit()\n", - " cx(tmp, q)\n", - " #discard(tmp) # Compiler complains if tmp is not explicitly discarded\n", - " return q\n", - "\n", - "\n", - "bad.compile() # Raises an error" - ] + "execution_count": 16 }, { "cell_type": "code", - "execution_count": 17, "id": "8f3aff7f", "metadata": { "execution": { @@ -913,8 +944,28 @@ }, "tags": [ "raises-exception" - ] + ], + "ExecuteTime": { + "end_time": "2026-04-30T10:16:34.101240Z", + "start_time": "2026-04-30T10:16:33.805927Z" + } }, + "source": [ + "@guppy.struct\n", + "class MyStruct:\n", + " q: qubit\n", + "\n", + "\n", + "@guppy\n", + "def foo(b: bool) -> bool:\n", + " s = MyStruct(qubit())\n", + " if b:\n", + " return measure(s.q).read()\n", + " return False\n", + "\n", + "\n", + "foo.compile()" + ], "outputs": [ { "name": "stderr", @@ -940,22 +991,7 @@ ] } ], - "source": [ - "@guppy.struct\n", - "class MyStruct:\n", - " q: qubit\n", - "\n", - "\n", - "@guppy\n", - "def foo(b: bool) -> bool:\n", - " s = MyStruct(qubit())\n", - " if b:\n", - " return measure(s.q).read()\n", - " return False\n", - "\n", - "\n", - "foo.compile()" - ] + "execution_count": 17 }, { "cell_type": "markdown", @@ -967,7 +1003,6 @@ }, { "cell_type": "code", - "execution_count": 18, "id": "3e021bd4", "metadata": { "execution": { @@ -978,8 +1013,24 @@ }, "tags": [ "raises-exception" - ] + ], + "ExecuteTime": { + "end_time": "2026-04-30T10:16:35.558976Z", + "start_time": "2026-04-30T10:16:35.453363Z" + } }, + "source": [ + "@guppy\n", + "def outer(x: int) -> int:\n", + " def nested() -> None:\n", + " x += 1 # Mutation of captured variable x is not allowed\n", + "\n", + " nested()\n", + " return x\n", + "\n", + "\n", + "outer.compile_function() # Raises an error" + ], "outputs": [ { "name": "stderr", @@ -1003,22 +1054,10 @@ ] } ], - "source": [ - "@guppy\n", - "def outer(x: int) -> int:\n", - " def nested() -> None:\n", - " x += 1 # Mutation of captured variable x is not allowed\n", - "\n", - " nested()\n", - " return x\n", - "\n", - "\n", - "outer.compile_function() # Raises an error" - ] + "execution_count": 18 }, { "cell_type": "code", - "execution_count": 19, "id": "54f9e48f", "metadata": { "execution": { @@ -1029,8 +1068,35 @@ }, "tags": [ "raises-exception" - ] + ], + "ExecuteTime": { + "end_time": "2026-04-30T10:16:37.327636Z", + "start_time": "2026-04-30T10:16:37.241220Z" + } }, + "source": [ + "@guppy.struct\n", + "class MyStruct1:\n", + " x: \"MyStruct2\"\n", + "\n", + "\n", + "@guppy.struct\n", + "class MyStruct2:\n", + " q: qubit\n", + "\n", + "\n", + "@guppy.declare\n", + "def use(s: MyStruct2 @ owned) -> None: ...\n", + "\n", + "\n", + "@guppy\n", + "def foo(s: MyStruct1 @ owned) -> qubit:\n", + " use(s.x)\n", + " return s.x.q\n", + "\n", + "\n", + "foo.compile()" + ], "outputs": [ { "name": "stderr", @@ -1054,33 +1120,10 @@ ] } ], - "source": [ - "@guppy.struct\n", - "class MyStruct1:\n", - " x: \"MyStruct2\"\n", - "\n", - "\n", - "@guppy.struct\n", - "class MyStruct2:\n", - " q: qubit\n", - "\n", - "\n", - "@guppy.declare\n", - "def use(s: MyStruct2 @ owned) -> None: ...\n", - "\n", - "\n", - "@guppy\n", - "def foo(s: MyStruct1 @ owned) -> qubit:\n", - " use(s.x)\n", - " return s.x.q\n", - "\n", - "\n", - "foo.compile()" - ] + "execution_count": 19 }, { "cell_type": "code", - "execution_count": 20, "id": "8b522152", "metadata": { "execution": { @@ -1091,8 +1134,25 @@ }, "tags": [ "raises-exception" - ] + ], + "ExecuteTime": { + "end_time": "2026-04-30T10:16:39.080058Z", + "start_time": "2026-04-30T10:16:38.973422Z" + } }, + "source": [ + "@guppy\n", + "def foo(qs: list[tuple[qubit, bool]] @ owned) -> list[qubit]:\n", + " rs: list[qubit] = []\n", + " for q, b in qs:\n", + " rs += [q]\n", + " if b:\n", + " break\n", + " return rs\n", + "\n", + "\n", + "foo.compile()" + ], "outputs": [ { "name": "stderr", @@ -1115,23 +1175,10 @@ ] } ], - "source": [ - "@guppy\n", - "def foo(qs: list[tuple[qubit, bool]] @ owned) -> list[qubit]:\n", - " rs: list[qubit] = []\n", - " for q, b in qs:\n", - " rs += [q]\n", - " if b:\n", - " break\n", - " return rs\n", - "\n", - "\n", - "foo.compile()" - ] + "execution_count": 20 }, { "cell_type": "code", - "execution_count": 21, "id": "80a23fb4", "metadata": { "execution": { @@ -1142,8 +1189,30 @@ }, "tags": [ "raises-exception" - ] + ], + "ExecuteTime": { + "end_time": "2026-04-30T10:16:40.668659Z", + "start_time": "2026-04-30T10:16:40.581078Z" + } }, + "source": [ + "@guppy.struct\n", + "class MyStruct:\n", + " q: qubit\n", + "\n", + "\n", + "@guppy.declare\n", + "def use(q: qubit @ owned) -> None: ...\n", + "\n", + "\n", + "@guppy\n", + "def test(s: MyStruct, b: bool) -> None:\n", + " if b:\n", + " use(s.q)\n", + "\n", + "\n", + "test.compile()" + ], "outputs": [ { "name": "stderr", @@ -1169,28 +1238,10 @@ ] } ], - "source": [ - "@guppy.struct\n", - "class MyStruct:\n", - " q: qubit\n", - "\n", - "\n", - "@guppy.declare\n", - "def use(q: qubit @ owned) -> None: ...\n", - "\n", - "\n", - "@guppy\n", - "def test(s: MyStruct, b: bool) -> None:\n", - " if b:\n", - " use(s.q)\n", - "\n", - "\n", - "test.compile()" - ] + "execution_count": 21 }, { "cell_type": "code", - "execution_count": 22, "id": "85d1009e", "metadata": { "execution": { @@ -1201,8 +1252,29 @@ }, "tags": [ "raises-exception" - ] + ], + "ExecuteTime": { + "end_time": "2026-04-30T10:16:43.730351Z", + "start_time": "2026-04-30T10:16:43.511139Z" + } }, + "source": [ + "@guppy\n", + "def foo(x: int) -> int:\n", + " y = x + 1\n", + "\n", + " def bar() -> None:\n", + " def baz() -> None:\n", + " y += 2\n", + "\n", + " baz()\n", + "\n", + " bar()\n", + " return y\n", + "\n", + "\n", + "foo.compile_function()" + ], "outputs": [ { "name": "stderr", @@ -1226,27 +1298,10 @@ ] } ], - "source": [ - "@guppy\n", - "def foo(x: int) -> int:\n", - " y = x + 1\n", - "\n", - " def bar() -> None:\n", - " def baz() -> None:\n", - " y += 2\n", - "\n", - " baz()\n", - "\n", - " bar()\n", - " return y\n", - "\n", - "\n", - "foo.compile_function()" - ] + "execution_count": 22 }, { "cell_type": "code", - "execution_count": 23, "id": "03a9da7e", "metadata": { "execution": { @@ -1257,8 +1312,26 @@ }, "tags": [ "raises-exception" - ] + ], + "ExecuteTime": { + "end_time": "2026-04-30T10:16:47.384769Z", + "start_time": "2026-04-30T10:16:47.288186Z" + } }, + "source": [ + "@guppy\n", + "def foo(x: int) -> int:\n", + " y = x + 1\n", + "\n", + " def bar() -> None:\n", + " y += 2\n", + "\n", + " bar()\n", + " return y\n", + "\n", + "\n", + "foo.compile_function()" + ], "outputs": [ { "name": "stderr", @@ -1282,24 +1355,10 @@ ] } ], - "source": [ - "@guppy\n", - "def foo(x: int) -> int:\n", - " y = x + 1\n", - "\n", - " def bar() -> None:\n", - " y += 2\n", - "\n", - " bar()\n", - " return y\n", - "\n", - "\n", - "foo.compile_function()" - ] + "execution_count": 23 }, { "cell_type": "code", - "execution_count": 24, "id": "294694e3", "metadata": { "execution": { @@ -1310,8 +1369,28 @@ }, "tags": [ "raises-exception" - ] + ], + "ExecuteTime": { + "end_time": "2026-04-30T10:16:49.117375Z", + "start_time": "2026-04-30T10:16:49.021035Z" + } }, + "source": [ + "@guppy\n", + "def foo(x: int) -> int:\n", + " y = x + 1\n", + "\n", + " def bar() -> None:\n", + " if 3 > 2:\n", + " z = y\n", + " y = 2\n", + "\n", + " bar()\n", + " return y\n", + "\n", + "\n", + "foo.compile_function()" + ], "outputs": [ { "name": "stderr", @@ -1335,22 +1414,7 @@ ] } ], - "source": [ - "@guppy\n", - "def foo(x: int) -> int:\n", - " y = x + 1\n", - "\n", - " def bar() -> None:\n", - " if 3 > 2:\n", - " z = y\n", - " y = 2\n", - "\n", - " bar()\n", - " return y\n", - "\n", - "\n", - "foo.compile_function()" - ] + "execution_count": 24 }, { "cell_type": "markdown", @@ -1362,7 +1426,6 @@ }, { "cell_type": "code", - "execution_count": 25, "id": "aac5a961", "metadata": { "execution": { @@ -1373,8 +1436,22 @@ }, "tags": [ "raises-exception" - ] + ], + "ExecuteTime": { + "end_time": "2026-04-30T10:16:52.780399Z", + "start_time": "2026-04-30T10:16:52.673845Z" + } }, + "source": [ + "@guppy\n", + "def test() -> None:\n", + " with dagger:\n", + " for _ in range(46):\n", + " pass\n", + "\n", + "\n", + "test.compile()" + ], "outputs": [ { "name": "stderr", @@ -1399,20 +1476,10 @@ ] } ], - "source": [ - "@guppy\n", - "def test() -> None:\n", - " with dagger:\n", - " for _ in range(46):\n", - " pass\n", - "\n", - "\n", - "test.compile()" - ] + "execution_count": 25 }, { "cell_type": "code", - "execution_count": 26, "id": "6028e5d0", "metadata": { "execution": { @@ -1423,8 +1490,23 @@ }, "tags": [ "raises-exception" - ] + ], + "ExecuteTime": { + "end_time": "2026-04-30T10:16:55.433260Z", + "start_time": "2026-04-30T10:16:55.380664Z" + } }, + "source": [ + "@guppy\n", + "def foo(x: bool) -> int:\n", + " y = 4\n", + " 0 if (y := x) else (y := 6)\n", + " z = y\n", + " return 42\n", + "\n", + "\n", + "foo.compile_function()" + ], "outputs": [ { "name": "stderr", @@ -1444,30 +1526,13 @@ " | - This is of type `bool`\n", " | \n", "4 | 0 if (y := x) else (y := 6)\n", - " | - This is of type `int`" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\n", + " | - This is of type `int`\n", "\n", "Guppy compilation failed due to 1 previous error\n" ] } ], - "source": [ - "@guppy\n", - "def foo(x: bool) -> int:\n", - " y = 4\n", - " 0 if (y := x) else (y := 6)\n", - " z = y\n", - " return 42\n", - "\n", - "\n", - "foo.compile_function()" - ] + "execution_count": 26 } ], "metadata": { From a2889a7802024d98f5be07306a6b4a477f82ac7a Mon Sep 17 00:00:00 2001 From: Tatiana S Date: Thu, 30 Apr 2026 11:22:04 +0100 Subject: [PATCH 6/9] Revert devenv.lock to main version --- devenv.lock | 62 +---------------------------------------------------- 1 file changed, 1 insertion(+), 61 deletions(-) diff --git a/devenv.lock b/devenv.lock index d8a7b8a9e..18eb450da 100644 --- a/devenv.lock +++ b/devenv.lock @@ -18,21 +18,6 @@ } }, "flake-compat": { - "flake": false, - "locked": { - "lastModified": 1767039857, - "owner": "NixOS", - "repo": "flake-compat", - "rev": "5edf11c44bc78a0d334f6334cdaf7d60d732daab", - "type": "github" - }, - "original": { - "owner": "NixOS", - "repo": "flake-compat", - "type": "github" - } - }, - "flake-compat_2": { "flake": false, "locked": { "lastModified": 1767039857, @@ -48,47 +33,6 @@ "type": "github" } }, - "git-hooks": { - "inputs": { - "flake-compat": "flake-compat", - "gitignore": "gitignore", - "nixpkgs": [ - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1775585728, - "owner": "cachix", - "repo": "git-hooks.nix", - "rev": "580633fa3fe5fc0379905986543fd7495481913d", - "type": "github" - }, - "original": { - "owner": "cachix", - "repo": "git-hooks.nix", - "type": "github" - } - }, - "gitignore": { - "inputs": { - "nixpkgs": [ - "git-hooks", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1762808025, - "owner": "hercules-ci", - "repo": "gitignore.nix", - "rev": "cb5e3fdca1de58ccbc3ef53de65bd372b48f567c", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "gitignore.nix", - "type": "github" - } - }, "nixpkgs": { "locked": { "lastModified": 1775005781, @@ -107,7 +51,7 @@ }, "nixpkgs-python": { "inputs": { - "flake-compat": "flake-compat_2", + "flake-compat": "flake-compat", "nixpkgs": [ "nixpkgs" ] @@ -129,12 +73,8 @@ "root": { "inputs": { "devenv": "devenv", - "git-hooks": "git-hooks", "nixpkgs": "nixpkgs", "nixpkgs-python": "nixpkgs-python", - "pre-commit-hooks": [ - "git-hooks" - ], "rust-overlay": "rust-overlay" } }, From 535056932f35f8a8366648f916d4d56f00a590e5 Mon Sep 17 00:00:00 2001 From: Tatiana S Date: Thu, 30 Apr 2026 11:41:41 +0100 Subject: [PATCH 7/9] Remove monohugr dependencies --- pyproject.toml | 8 +------- uv.lock | 49 +++++++++++++------------------------------------ 2 files changed, 14 insertions(+), 43 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index ed385c9f7..0fba8ea8b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,14 +30,8 @@ guppylang-internals = { workspace = true } miette-py = { workspace = true } # Uncomment these to test the latest dependency version during development # hugr = { git = "https://github.com/quantinuum/hugr", subdirectory = "hugr-py", rev = "a4da8ef" } -# tket = {path = "/Users/tatiana.sedelnikov/Documents/Code/monohugr/repositories/tket2/tket-py", editable = true} +tket = {git = "https://github.com/quantinuum/tket2", subdirectory = "tket-py", rev = "c2739b3"} -# Sources from repository: guppylang -# Sources from repository: tket2 -tket_eccs = {path = "/Users/tatiana.sedelnikov/Documents/Code/monohugr/repositories/tket2/tket-eccs", editable = true} -tket-exts = {path = "/Users/tatiana.sedelnikov/Documents/Code/monohugr/repositories/tket2/tket-exts", editable = true} -selene-hugr-qis-compiler = {path = "/Users/tatiana.sedelnikov/Documents/Code/monohugr/repositories/tket2/qis-compiler", editable = true} -tket = {path = "/Users/tatiana.sedelnikov/Documents/Code/monohugr/repositories/tket2/tket-py", editable = true} [build-system] requires = ["hatchling"] build-backend = "hatchling.build" diff --git a/uv.lock b/uv.lock index 2f4e8ce62..b3f977556 100644 --- a/uv.lock +++ b/uv.lock @@ -993,7 +993,7 @@ requires-dist = [ { name = "guppylang-internals", editable = "guppylang-internals" }, { name = "numpy", specifier = "~=2.0" }, { name = "pytket", specifier = ">=1.34" }, - { name = "selene-hugr-qis-compiler", editable = "../monohugr/repositories/tket2/qis-compiler" }, + { name = "selene-hugr-qis-compiler", specifier = "~=0.2.9" }, { name = "selene-sim", specifier = "~=0.2.7" }, { name = "tqdm", specifier = ">=4.67.1" }, { name = "types-tqdm", specifier = ">=4.67.0.20250809" }, @@ -1017,8 +1017,8 @@ dependencies = [ requires-dist = [ { name = "hugr", specifier = "~=0.16.0" }, { name = "pytket", specifier = ">=1.34" }, - { name = "tket", editable = "../monohugr/repositories/tket2/tket-py" }, - { name = "tket-exts", editable = "../monohugr/repositories/tket2/tket-exts" }, + { name = "tket", git = "https://github.com/quantinuum/tket2?subdirectory=tket-py&rev=c2739b3" }, + { name = "tket-exts", specifier = "~=0.12.0" }, { name = "typing-extensions", specifier = ">=4.9.0,<5" }, { name = "wasmtime", specifier = ">=38.0,<43.1" }, ] @@ -3404,16 +3404,13 @@ wheels = [ [[package]] name = "selene-hugr-qis-compiler" version = "0.2.10" -source = { editable = "../monohugr/repositories/tket2/qis-compiler" } - -[package.metadata] - -[package.metadata.requires-dev] -dev = [ - { name = "cibuildwheel", specifier = ">=2.23.2" }, - { name = "hugr", specifier = "~=0.16.0" }, - { name = "pytest", specifier = ">=8.4.2" }, - { name = "pytest-snapshot", specifier = "~=0.9.0" }, +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/aa/6b3f287f9330bf077c95bfef3ab350ab1eac0707f7111c38596a22554ecf/selene_hugr_qis_compiler-0.2.10-cp310-abi3-macosx_13_0_arm64.whl", hash = "sha256:2912702073aa37f1bfd1d42678b972b3b10525ed3f5f003091519512331142bd", size = 29532801, upload-time = "2025-11-10T14:48:39.26Z" }, + { url = "https://files.pythonhosted.org/packages/f5/9c/77a1b81e1cedbde6f401fbdc2302bc2221c8cbc46c924ac0bd9cda979799/selene_hugr_qis_compiler-0.2.10-cp310-abi3-macosx_13_0_x86_64.whl", hash = "sha256:60ece08d7ffb792149029f8aad483c546d2f2db8a5d265906bed41479bdc5a9e", size = 32232684, upload-time = "2025-11-10T14:48:42.701Z" }, + { url = "https://files.pythonhosted.org/packages/9d/d0/569e59983549fcf4c050f892927a55af92e0b0ab0622610c58ebbd72c03f/selene_hugr_qis_compiler-0.2.10-cp310-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:fde73e325ad51bb00c40978a4a17ecb31ff968854d39259cee5a600bf2964b54", size = 32893561, upload-time = "2025-11-10T14:48:46.504Z" }, + { url = "https://files.pythonhosted.org/packages/92/b0/abf9cfe11934100a2210468545c7a8b8508534c1c90b882484a9b59fbf96/selene_hugr_qis_compiler-0.2.10-cp310-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9ecb054a543a41ecadcbfdd3d49ba9ada99e5d0806fb1b10638d3e9c1d6e6216", size = 33989527, upload-time = "2025-11-10T14:48:49.734Z" }, + { url = "https://files.pythonhosted.org/packages/12/36/476ac6ffdd5e8edc7d1f4772fb1eb3679e6e38105aa529a3d59a5d211bfa/selene_hugr_qis_compiler-0.2.10-cp310-abi3-win_amd64.whl", hash = "sha256:bf013a2b6910dbac1a811d95822df25d4bdcd96f15d9b1aa263b578834a45c27", size = 29199534, upload-time = "2025-11-10T14:48:52.545Z" }, ] [[package]] @@ -3694,7 +3691,7 @@ wheels = [ [[package]] name = "tket" version = "0.13.0" -source = { editable = "../monohugr/repositories/tket2/tket-py" } +source = { git = "https://github.com/quantinuum/tket2?subdirectory=tket-py&rev=c2739b3#c2739b34a694f0b635deb45a60b8a7e739dcb00a" } dependencies = [ { name = "hugr" }, { name = "pytket" }, @@ -3702,39 +3699,19 @@ dependencies = [ { name = "tket-exts" }, ] -[package.metadata] -requires-dist = [ - { name = "hugr", specifier = "~=0.16.0" }, - { name = "pytket", specifier = ">=2.1.0,<3" }, - { name = "tket-eccs", editable = "../monohugr/repositories/tket2/tket-eccs" }, - { name = "tket-exts", editable = "../monohugr/repositories/tket2/tket-exts" }, -] - -[package.metadata.requires-dev] -docs = [ - { name = "furo", specifier = ">=2024.8.6" }, - { name = "myst-nb", specifier = ">=1.1.2" }, - { name = "sphinx-autodoc-typehints", specifier = ">=3.0.1" }, - { name = "sphinx-basic-ng", specifier = ">=1.0.0b2" }, - { name = "sphinx-copybutton", specifier = ">=0.5.2" }, -] - [[package]] name = "tket-eccs" version = "0.5.1" -source = { editable = "../monohugr/repositories/tket2/tket-eccs" } +source = { git = "https://github.com/quantinuum/tket2?subdirectory=tket-eccs&rev=c2739b3#c2739b34a694f0b635deb45a60b8a7e739dcb00a" } [[package]] name = "tket-exts" version = "0.12.3" -source = { editable = "../monohugr/repositories/tket2/tket-exts" } +source = { git = "https://github.com/quantinuum/tket2?subdirectory=tket-exts&rev=c2739b3#c2739b34a694f0b635deb45a60b8a7e739dcb00a" } dependencies = [ { name = "hugr" }, ] -[package.metadata] -requires-dist = [{ name = "hugr", specifier = "~=0.16.0" }] - [[package]] name = "tomli" version = "2.4.1" From d5551f109ea31969bd193addb6da20f8a6b8a5b0 Mon Sep 17 00:00:00 2001 From: Jake Arkinstall <65358059+jake-arkinstall@users.noreply.github.com> Date: Tue, 5 May 2026 10:19:15 +0100 Subject: [PATCH 8/9] Add hugrenv (temporarily) for off-release tket2 wheel builds --- .github/workflows/benchmarks_pr.yml | 3 +++ .github/workflows/pull-request.yaml | 8 ++++++++ .github/workflows/semver-checks.yml | 4 ++++ hugrenv.lock | 31 +++++++++++++++++++++++++++++ 4 files changed, 46 insertions(+) create mode 100644 hugrenv.lock diff --git a/.github/workflows/benchmarks_pr.yml b/.github/workflows/benchmarks_pr.yml index efc32ed98..321d73557 100644 --- a/.github/workflows/benchmarks_pr.yml +++ b/.github/workflows/benchmarks_pr.yml @@ -21,6 +21,9 @@ jobs: steps: - uses: actions/checkout@v6 + # TODO: remove this when the required tket2 wheel is released + - uses: quantinuum/hugrverse-env/install-hugrenv-action@main + - name: Set up uv uses: astral-sh/setup-uv@v7 with: diff --git a/.github/workflows/pull-request.yaml b/.github/workflows/pull-request.yaml index bf41e9eb6..60f2a41b3 100644 --- a/.github/workflows/pull-request.yaml +++ b/.github/workflows/pull-request.yaml @@ -29,6 +29,10 @@ jobs: steps: - uses: actions/checkout@v6 + + # TODO: remove this when the required tket2 wheel is released + - uses: quantinuum/hugrverse-env/install-hugrenv-action@main + - name: Run sccache-cache uses: mozilla-actions/sccache-action@v0.0.9 - name: Install rust toolchain @@ -65,6 +69,10 @@ jobs: steps: - uses: actions/checkout@v6 + + # TODO: remove this when the required tket2 wheel is released + - uses: quantinuum/hugrverse-env/install-hugrenv-action@main + - name: Run sccache-cache uses: mozilla-actions/sccache-action@v0.0.9 - name: Install rust toolchain diff --git a/.github/workflows/semver-checks.yml b/.github/workflows/semver-checks.yml index 2a7bbdcf1..284a3694c 100644 --- a/.github/workflows/semver-checks.yml +++ b/.github/workflows/semver-checks.yml @@ -26,6 +26,10 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 + + # TODO: remove this when the required tket2 wheel is released + - uses: quantinuum/hugrverse-env/install-hugrenv-action@main + - name: Run sccache-cache uses: mozilla-actions/sccache-action@v0.0.9 - name: Install rust toolchain diff --git a/hugrenv.lock b/hugrenv.lock new file mode 100644 index 000000000..08e645320 --- /dev/null +++ b/hugrenv.lock @@ -0,0 +1,31 @@ +{ + "version": "0.5.0", + "hashes": { + "macosx_11_0": { + "aarch64": { + "llvm": "sha256-vAyAnlsZcTbddA/pZZR3n1TP6ZWi2AEL9lFsfSqoGIo=", + "tket": "sha256-+YbO4aE+3HM5di09cnNpvaLKM/8yg5hvvuzQL5xCa+g=" + }, + "x86_64": { + "llvm": "sha256-yxaf4SZQFikmUfy5v3OxnKAhbCxn+xTXTwVu8GeZKrg=", + "tket": "sha256-goKko59ADWtZvlpDI4lJBuixVk/qzhafhNH/i1Ir2wQ=" + } + }, + "manylinux_2_28": { + "aarch64": { + "llvm": "sha256-f3/vh+VGPVvLDRgYUlnOaCXGKokh+seBuZ2SUN7514k=", + "tket": "sha256-BUOI/FEZ3p6XDOqKOVKWDDm5qMD5Cs2ghWxd5wXk8Nc=" + }, + "x86_64": { + "llvm": "sha256-xF5Mg5/qrnn2HtWDnp9s1RK0SeyHjgkMHWZgHKRxjIQ=", + "tket": "sha256-q5dXP1Fiq3tcHhE3lYQO9CYFoZzAPXCI5BWrT4HKrNo=" + } + }, + "win": { + "amd64": { + "llvm": "sha256-e41NcJtwyz8iqKgs0y09T123q8FIzeqe2ARuwom1Fl4=", + "tket": "sha256-bcY00WM56lsRMzgXfOgHZx/PZ4xeGT1KauMpHheAMTo=" + } + } + } +} From 13c51021068a8b0d0edfc8be94eb096dd4cccf8f Mon Sep 17 00:00:00 2001 From: Tatiana S Date: Wed, 6 May 2026 16:27:06 +0100 Subject: [PATCH 9/9] Try with qis-compiler dependency # Conflicts: # pyproject.toml # uv.lock --- pyproject.toml | 62 ++-- uv.lock | 857 ++++++++++++++++++++++++------------------------- 2 files changed, 447 insertions(+), 472 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index e8db47bd4..c3204aeb4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,26 +1,26 @@ [dependency-groups] +docs = ["furo>=2024.8.6", "sphinx >=7.2.6,<9"] dev = [ - { include-group = "examples" }, - { include-group = "lint" }, - { include-group = "test" }, + { include-group = "lint" }, + { include-group = "test" }, + { include-group = "examples" }, ] -docs = ["furo>=2024.8.6", "sphinx >=7.2.6,<9"] -examples = ["matplotlib>=3.10.9", "networkx>=2.6,<4"] -lint = ["mypy~=1.20.2", "pre-commit>=4.6.0,<5", "ruff~=0.15.12"] +lint = ["pre-commit>=3.6.0,<5", "ruff~=0.15.11", "mypy~=1.20.1"] +examples = ["matplotlib>=3.9.2", "networkx>=2.6,<4"] test = [ - "ipykernel>=6.29.5,<8", - "miette-py", - "pytest>=8.4.2,<10", - "pytest-benchmark>=5.1.0", - "pytest-codspeed>=4.4.0", - "pytest-cov>=5.0.0,<8", - "pytest-isolate>=0.0.13", - "pytest-notebook >=0.10.0,<0.11", - "pytest-snapshot >=0.9.0,<1", - "pytest-xdist>=3.8.0", + "pytest>=8.4.2,<10", + "pytest-cov>=5.0.0,<8", + "pytest-notebook >=0.10.0,<0.11", + "pytest-snapshot >=0.9.0,<1", + "pytest-benchmark>=5.1.0", + "pytest-xdist>=3.8.0", + "ipykernel>=6.29.5,<8", + "miette-py", + "pytest-isolate>=0.0.13", ] [tool.uv] + [tool.uv.workspace] members = ["guppylang", "guppylang-internals", "miette-py"] @@ -29,13 +29,15 @@ guppylang = { workspace = true } guppylang-internals = { workspace = true } miette-py = { workspace = true } # Uncomment these to test the latest dependency version during development -#  hugr = { git = "https://github.com/quantinuum/hugr", subdirectory = "hugr-py", rev = "a4da8ef" } -tket = {git = "https://github.com/quantinuum/tket2", subdirectory = "tket-py", rev = "c2739b3"} +# hugr = { git = "https://github.com/quantinuum/hugr", subdirectory = "hugr-py", rev = "a4da8ef" } +tket = {git = "https://github.com/quantinuum/tket2", subdirectory = "tket-py", rev = "6b13cb8"} +selene-hugr-qis-compiler = {git = "https://github.com/quantinuum/tket2", subdirectory = "qis-compiler", rev = "6b13cb8"} [build-system] requires = ["hatchling"] build-backend = "hatchling.build" + [tool.mypy] strict = true allow_redefinition = true @@ -45,20 +47,20 @@ module = ["miette_py"] [tool.coverage.report] exclude_also = [ - # Don't complain about missing coverage on typing imports - "if TYPE_CHECKING:", - # Don't complain if tests don't hit defensive assertion code: - "raise AssertionError", - "raise NotImplementedError", - "raise InternalGuppyError", - # Don't complain about abstract methods, they aren't run: - "@abstractmethod", + # Don't complain about missing coverage on typing imports + "if TYPE_CHECKING:", + # Don't complain if tests don't hit defensive assertion code: + "raise AssertionError", + "raise NotImplementedError", + "raise InternalGuppyError", + # Don't complain about abstract methods, they aren't run: + "@abstractmethod", ] + [tool.pytest.ini_options] -addopts = "--benchmark-disable -m 'not test_exported_hugrs'" # benchmarks run explicitly with `just bench` -markers = "test_exported_hugrs" +addopts = "--benchmark-skip" # benchmarks run explicitly with `just bench` filterwarnings = [ - "ignore::DeprecationWarning", # TODO remove after removing guppy.compile() - "ignore::SyntaxWarning", # Python 3.14 complains about guppy tuple callables + "ignore::DeprecationWarning", # TODO remove after removing guppy.compile() + "ignore::SyntaxWarning", # Python 3.14 complains about guppy tuple callables ] diff --git a/uv.lock b/uv.lock index 0981dfc62..1c54a5122 100644 --- a/uv.lock +++ b/uv.lock @@ -2,11 +2,14 @@ version = 1 revision = 2 requires-python = ">=3.10, <4" resolution-markers = [ - "python_full_version >= '3.15'", - "python_full_version == '3.14.*'", - "python_full_version >= '3.12' and python_full_version < '3.14'", - "python_full_version == '3.11.*'", - "python_full_version < '3.11'", + "python_full_version >= '3.15' and platform_machine == 'x86_64' and sys_platform == 'darwin'", + "(python_full_version >= '3.15' and platform_machine != 'x86_64') or (python_full_version >= '3.15' and sys_platform != 'darwin')", + "python_full_version == '3.14.*' and platform_machine == 'x86_64' and sys_platform == 'darwin'", + "python_full_version >= '3.11' and python_full_version < '3.14' and platform_machine == 'x86_64' and sys_platform == 'darwin'", + "(python_full_version == '3.14.*' and platform_machine != 'x86_64') or (python_full_version == '3.14.*' and sys_platform != 'darwin')", + "(python_full_version >= '3.11' and python_full_version < '3.14' and platform_machine != 'x86_64') or (python_full_version >= '3.11' and python_full_version < '3.14' and sys_platform != 'darwin')", + "python_full_version < '3.11' and platform_machine == 'x86_64' and sys_platform == 'darwin'", + "(python_full_version < '3.11' and platform_machine != 'x86_64') or (python_full_version < '3.11' and sys_platform != 'darwin')", ] [manifest] @@ -19,40 +22,38 @@ members = [ [manifest.dependency-groups] dev = [ { name = "ipykernel", specifier = ">=6.29.5,<8" }, - { name = "matplotlib", specifier = ">=3.10.9" }, + { name = "matplotlib", specifier = ">=3.9.2" }, { name = "miette-py", editable = "miette-py" }, - { name = "mypy", specifier = "~=1.20.2" }, + { name = "mypy", specifier = "~=1.20.1" }, { name = "networkx", specifier = ">=2.6,<4" }, - { name = "pre-commit", specifier = ">=4.6.0,<5" }, + { name = "pre-commit", specifier = ">=3.6.0,<5" }, { name = "pytest", specifier = ">=8.4.2,<10" }, { name = "pytest-benchmark", specifier = ">=5.1.0" }, - { name = "pytest-codspeed", specifier = ">=4.4.0" }, { name = "pytest-cov", specifier = ">=5.0.0,<8" }, { name = "pytest-isolate", specifier = ">=0.0.13" }, { name = "pytest-notebook", specifier = ">=0.10.0,<0.11" }, { name = "pytest-snapshot", specifier = ">=0.9.0,<1" }, { name = "pytest-xdist", specifier = ">=3.8.0" }, - { name = "ruff", specifier = "~=0.15.12" }, + { name = "ruff", specifier = "~=0.15.11" }, ] docs = [ { name = "furo", specifier = ">=2024.8.6" }, { name = "sphinx", specifier = ">=7.2.6,<9" }, ] examples = [ - { name = "matplotlib", specifier = ">=3.10.9" }, + { name = "matplotlib", specifier = ">=3.9.2" }, { name = "networkx", specifier = ">=2.6,<4" }, ] lint = [ - { name = "mypy", specifier = "~=1.20.2" }, - { name = "pre-commit", specifier = ">=4.6.0,<5" }, - { name = "ruff", specifier = "~=0.15.12" }, + { name = "mypy", specifier = "~=1.20.1" }, + { name = "pre-commit", specifier = ">=3.6.0,<5" }, + { name = "ruff", specifier = "~=0.15.11" }, ] test = [ { name = "ipykernel", specifier = ">=6.29.5,<8" }, { name = "miette-py", editable = "miette-py" }, { name = "pytest", specifier = ">=8.4.2,<10" }, { name = "pytest-benchmark", specifier = ">=5.1.0" }, - { name = "pytest-codspeed", specifier = ">=4.4.0" }, { name = "pytest-cov", specifier = ">=5.0.0,<8" }, { name = "pytest-isolate", specifier = ">=0.0.13" }, { name = "pytest-notebook", specifier = ">=0.10.0,<0.11" }, @@ -233,11 +234,11 @@ css = [ [[package]] name = "certifi" -version = "2026.2.25" +version = "2026.4.22" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/af/2d/7bf41579a8986e348fa033a31cdd0e4121114f6bce2457e8876010b092dd/certifi-2026.2.25.tar.gz", hash = "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7", size = 155029, upload-time = "2026-02-25T02:54:17.342Z" } +sdist = { url = "https://files.pythonhosted.org/packages/25/ee/6caf7a40c36a1220410afe15a1cc64993a1f864871f698c0f93acb72842a/certifi-2026.4.22.tar.gz", hash = "sha256:8d455352a37b71bf76a79caa83a3d6c25afee4a385d632127b6afb3963f1c580", size = 137077, upload-time = "2026-04-22T11:26:11.191Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa", size = 153684, upload-time = "2026-02-25T02:54:15.766Z" }, + { url = "https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl", hash = "sha256:3cb2210c8f88ba2318d29b0388d1023c8492ff72ecdde4ebdaddbb13a31b1c4a", size = 135707, upload-time = "2026-04-22T11:26:09.372Z" }, ] [[package]] @@ -459,7 +460,8 @@ name = "contourpy" version = "1.3.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version < '3.11'", + "python_full_version < '3.11' and platform_machine == 'x86_64' and sys_platform == 'darwin'", + "(python_full_version < '3.11' and platform_machine != 'x86_64') or (python_full_version < '3.11' and sys_platform != 'darwin')", ] dependencies = [ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, @@ -529,10 +531,12 @@ name = "contourpy" version = "1.3.3" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.15'", - "python_full_version == '3.14.*'", - "python_full_version >= '3.12' and python_full_version < '3.14'", - "python_full_version == '3.11.*'", + "python_full_version >= '3.15' and platform_machine == 'x86_64' and sys_platform == 'darwin'", + "(python_full_version >= '3.15' and platform_machine != 'x86_64') or (python_full_version >= '3.15' and sys_platform != 'darwin')", + "python_full_version == '3.14.*' and platform_machine == 'x86_64' and sys_platform == 'darwin'", + "python_full_version >= '3.11' and python_full_version < '3.14' and platform_machine == 'x86_64' and sys_platform == 'darwin'", + "(python_full_version == '3.14.*' and platform_machine != 'x86_64') or (python_full_version == '3.14.*' and sys_platform != 'darwin')", + "(python_full_version >= '3.11' and python_full_version < '3.14' and platform_machine != 'x86_64') or (python_full_version >= '3.11' and python_full_version < '3.14' and sys_platform != 'darwin')", ] dependencies = [ { name = "numpy", version = "2.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, @@ -854,11 +858,11 @@ wheels = [ [[package]] name = "filelock" -version = "3.25.2" +version = "3.29.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/94/b8/00651a0f559862f3bb7d6f7477b192afe3f583cc5e26403b44e59a55ab34/filelock-3.25.2.tar.gz", hash = "sha256:b64ece2b38f4ca29dd3e810287aa8c48182bbecd1ae6e9ae126c9b35f1382694", size = 40480, upload-time = "2026-03-11T20:45:38.487Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/fe/997687a931ab51049acce6fa1f23e8f01216374ea81374ddee763c493db5/filelock-3.29.0.tar.gz", hash = "sha256:69974355e960702e789734cb4871f884ea6fe50bd8404051a3530bc07809cf90", size = 57571, upload-time = "2026-04-19T15:39:10.068Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a4/a5/842ae8f0c08b61d6484b52f99a03510a3a72d23141942d216ebe81fefbce/filelock-3.25.2-py3-none-any.whl", hash = "sha256:ca8afb0da15f229774c9ad1b455ed96e85a81373065fb10446672f64444ddf70", size = 26759, upload-time = "2026-03-11T20:45:37.437Z" }, + { url = "https://files.pythonhosted.org/packages/81/47/dd9a212ef6e343a6857485ffe25bba537304f1913bdbed446a23f7f592e1/filelock-3.29.0-py3-none-any.whl", hash = "sha256:96f5f6344709aa1572bbf631c640e4ebeeb519e08da902c39a001882f30ac258", size = 39812, upload-time = "2026-04-19T15:39:08.752Z" }, ] [[package]] @@ -958,14 +962,14 @@ wheels = [ [[package]] name = "gitpython" -version = "3.1.46" +version = "3.1.49" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "gitdb" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/df/b5/59d16470a1f0dfe8c793f9ef56fd3826093fc52b3bd96d6b9d6c26c7e27b/gitpython-3.1.46.tar.gz", hash = "sha256:400124c7d0ef4ea03f7310ac2fbf7151e09ff97f2a3288d64a440c584a29c37f", size = 215371, upload-time = "2026-01-01T15:37:32.073Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e1/63/210aaa302d6a0a78daa67c5c15bbac2cad361722841278b0209b6da20855/gitpython-3.1.49.tar.gz", hash = "sha256:42f9399c9eb33fc581014bedd76049dfbaf6375aa2a5754575966387280315e1", size = 219367, upload-time = "2026-04-29T00:31:20.478Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/09/e21df6aef1e1ffc0c816f0522ddc3f6dcded766c3261813131c78a704470/gitpython-3.1.46-py3-none-any.whl", hash = "sha256:79812ed143d9d25b6d176a10bb511de0f9c67b1fa641d82097b0ab90398a2058", size = 208620, upload-time = "2026-01-01T15:37:30.574Z" }, + { url = "https://files.pythonhosted.org/packages/fd/6f/b842bfa6f21d6f87c57f9abf7194225e55279d96d869775e19e9f7236fc5/gitpython-3.1.49-py3-none-any.whl", hash = "sha256:024b0422d7f84d15cd794844e029ffebd4c5d42a7eb9b936b458697ef550a02c", size = 212190, upload-time = "2026-04-29T00:31:18.412Z" }, ] [[package]] @@ -997,7 +1001,7 @@ requires-dist = [ { name = "guppylang-internals", editable = "guppylang-internals" }, { name = "numpy", specifier = "~=2.0" }, { name = "pytket", specifier = ">=1.34" }, - { name = "selene-hugr-qis-compiler", specifier = "~=0.2.9" }, + { name = "selene-hugr-qis-compiler", git = "https://github.com/quantinuum/tket2?subdirectory=qis-compiler&rev=6b13cb8" }, { name = "selene-sim", specifier = "~=0.2.7" }, { name = "tqdm", specifier = ">=4.67.1" }, { name = "types-tqdm", specifier = ">=4.67.0.20250809" }, @@ -1021,10 +1025,10 @@ dependencies = [ requires-dist = [ { name = "hugr", specifier = "~=0.16.0" }, { name = "pytket", specifier = ">=1.34" }, - { name = "tket", git = "https://github.com/quantinuum/tket2?subdirectory=tket-py&rev=c2739b3" }, + { name = "tket", git = "https://github.com/quantinuum/tket2?subdirectory=tket-py&rev=6b13cb8" }, { name = "tket-exts", specifier = "~=0.12.0" }, { name = "typing-extensions", specifier = ">=4.9.0,<5" }, - { name = "wasmtime", specifier = ">=38.0,<44.1" }, + { name = "wasmtime", specifier = ">=38.0,<43.1" }, ] provides-extras = ["pytket"] @@ -1073,20 +1077,20 @@ wheels = [ [[package]] name = "identify" -version = "2.6.18" +version = "2.6.19" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/46/c4/7fb4db12296cdb11893d61c92048fe617ee853f8523b9b296ac03b43757e/identify-2.6.18.tar.gz", hash = "sha256:873ac56a5e3fd63e7438a7ecbc4d91aca692eb3fefa4534db2b7913f3fc352fd", size = 99580, upload-time = "2026-03-15T18:39:50.319Z" } +sdist = { url = "https://files.pythonhosted.org/packages/52/63/51723b5f116cc04b061cb6f5a561790abf249d25931d515cd375e063e0f4/identify-2.6.19.tar.gz", hash = "sha256:6be5020c38fcb07da56c53733538a3081ea5aa70d36a156f83044bfbf9173842", size = 99567, upload-time = "2026-04-17T18:39:50.265Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/46/33/92ef41c6fad0233e41d3d84ba8e8ad18d1780f1e5d99b3c683e6d7f98b63/identify-2.6.18-py2.py3-none-any.whl", hash = "sha256:8db9d3c8ea9079db92cafb0ebf97abdc09d52e97f4dcf773a2e694048b7cd737", size = 99394, upload-time = "2026-03-15T18:39:48.915Z" }, + { url = "https://files.pythonhosted.org/packages/94/84/d9273cd09688070a6523c4aee4663a8538721b2b755c4962aafae0011e72/identify-2.6.19-py2.py3-none-any.whl", hash = "sha256:20e6a87f786f768c092a721ad107fc9df0eb89347be9396cadf3f4abbd1fb78a", size = 99397, upload-time = "2026-04-17T18:39:49.221Z" }, ] [[package]] name = "idna" -version = "3.11" +version = "3.13" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ce/cc/762dfb036166873f0059f3b7de4565e1b5bc3d6f28a414c13da27e442f99/idna-3.13.tar.gz", hash = "sha256:585ea8fe5d69b9181ec1afba340451fba6ba764af97026f92a91d4eef164a242", size = 194210, upload-time = "2026-04-22T16:42:42.314Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, + { url = "https://files.pythonhosted.org/packages/5d/13/ad7d7ca3808a898b4612b6fe93cde56b53f3034dcde235acb1f0e1df24c6/idna-3.13-py3-none-any.whl", hash = "sha256:892ea0cde124a99ce773decba204c5552b69c3c67ffd5f232eb7696135bc8bb3", size = 68629, upload-time = "2026-04-22T16:42:40.909Z" }, ] [[package]] @@ -1116,8 +1120,7 @@ dependencies = [ { name = "comm" }, { name = "debugpy" }, { name = "ipython", version = "8.39.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "ipython", version = "9.10.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, - { name = "ipython", version = "9.12.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "ipython", version = "9.13.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "jupyter-client" }, { name = "jupyter-core" }, { name = "matplotlib-inline" }, @@ -1138,7 +1141,8 @@ name = "ipython" version = "8.39.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version < '3.11'", + "python_full_version < '3.11' and platform_machine == 'x86_64' and sys_platform == 'darwin'", + "(python_full_version < '3.11' and platform_machine != 'x86_64') or (python_full_version < '3.11' and sys_platform != 'darwin')", ] dependencies = [ { name = "colorama", marker = "python_full_version < '3.11' and sys_platform == 'win32'" }, @@ -1160,53 +1164,33 @@ wheels = [ [[package]] name = "ipython" -version = "9.10.1" +version = "9.13.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version == '3.11.*'", -] -dependencies = [ - { name = "colorama", marker = "python_full_version == '3.11.*' and sys_platform == 'win32'" }, - { name = "decorator", marker = "python_full_version == '3.11.*'" }, - { name = "ipython-pygments-lexers", marker = "python_full_version == '3.11.*'" }, - { name = "jedi", marker = "python_full_version == '3.11.*'" }, - { name = "matplotlib-inline", marker = "python_full_version == '3.11.*'" }, - { name = "pexpect", marker = "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'" }, - { name = "prompt-toolkit", marker = "python_full_version == '3.11.*'" }, - { name = "pygments", marker = "python_full_version == '3.11.*'" }, - { name = "stack-data", marker = "python_full_version == '3.11.*'" }, - { name = "traitlets", marker = "python_full_version == '3.11.*'" }, - { name = "typing-extensions", marker = "python_full_version == '3.11.*'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c5/25/daae0e764047b0a2480c7bbb25d48f4f509b5818636562eeac145d06dfee/ipython-9.10.1.tar.gz", hash = "sha256:e170e9b2a44312484415bdb750492699bf329233b03f2557a9692cce6466ada4", size = 4426663, upload-time = "2026-03-27T09:53:26.244Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/01/09/ba70f8d662d5671687da55ad2cc0064cf795b15e1eea70907532202e7c97/ipython-9.10.1-py3-none-any.whl", hash = "sha256:82d18ae9fb9164ded080c71ef92a182ee35ee7db2395f67616034bebb020a232", size = 622827, upload-time = "2026-03-27T09:53:24.566Z" }, -] - -[[package]] -name = "ipython" -version = "9.12.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.15'", - "python_full_version == '3.14.*'", - "python_full_version >= '3.12' and python_full_version < '3.14'", + "python_full_version >= '3.15' and platform_machine == 'x86_64' and sys_platform == 'darwin'", + "(python_full_version >= '3.15' and platform_machine != 'x86_64') or (python_full_version >= '3.15' and sys_platform != 'darwin')", + "python_full_version == '3.14.*' and platform_machine == 'x86_64' and sys_platform == 'darwin'", + "python_full_version >= '3.11' and python_full_version < '3.14' and platform_machine == 'x86_64' and sys_platform == 'darwin'", + "(python_full_version == '3.14.*' and platform_machine != 'x86_64') or (python_full_version == '3.14.*' and sys_platform != 'darwin')", + "(python_full_version >= '3.11' and python_full_version < '3.14' and platform_machine != 'x86_64') or (python_full_version >= '3.11' and python_full_version < '3.14' and sys_platform != 'darwin')", ] dependencies = [ - { name = "colorama", marker = "python_full_version >= '3.12' and sys_platform == 'win32'" }, - { name = "decorator", marker = "python_full_version >= '3.12'" }, - { name = "ipython-pygments-lexers", marker = "python_full_version >= '3.12'" }, - { name = "jedi", marker = "python_full_version >= '3.12'" }, - { name = "matplotlib-inline", marker = "python_full_version >= '3.12'" }, - { name = "pexpect", marker = "python_full_version >= '3.12' and sys_platform != 'emscripten' and sys_platform != 'win32'" }, - { name = "prompt-toolkit", marker = "python_full_version >= '3.12'" }, - { name = "pygments", marker = "python_full_version >= '3.12'" }, - { name = "stack-data", marker = "python_full_version >= '3.12'" }, - { name = "traitlets", marker = "python_full_version >= '3.12'" }, + { name = "colorama", marker = "python_full_version >= '3.11' and sys_platform == 'win32'" }, + { name = "decorator", marker = "python_full_version >= '3.11'" }, + { name = "ipython-pygments-lexers", marker = "python_full_version >= '3.11'" }, + { name = "jedi", marker = "python_full_version >= '3.11'" }, + { name = "matplotlib-inline", marker = "python_full_version >= '3.11'" }, + { name = "pexpect", marker = "python_full_version >= '3.11' and sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit", marker = "python_full_version >= '3.11'" }, + { name = "psutil", marker = "python_full_version >= '3.11'" }, + { name = "pygments", marker = "python_full_version >= '3.11'" }, + { name = "stack-data", marker = "python_full_version >= '3.11'" }, + { name = "traitlets", marker = "python_full_version >= '3.11'" }, + { name = "typing-extensions", marker = "python_full_version == '3.11.*'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3a/73/7114f80a8f9cabdb13c27732dce24af945b2923dcab80723602f7c8bc2d8/ipython-9.12.0.tar.gz", hash = "sha256:01daa83f504b693ba523b5a407246cabde4eb4513285a3c6acaff11a66735ee4", size = 4428879, upload-time = "2026-03-27T09:42:45.312Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/c4/87cda5842cf5c31837c06ddb588e11c3c35d8ece89b7a0108c06b8c9b00a/ipython-9.13.0.tar.gz", hash = "sha256:7e834b6afc99f020e3f05966ced34792f40267d64cb1ea9043886dab0dde5967", size = 4430549, upload-time = "2026-04-24T12:24:55.221Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/59/22/906c8108974c673ebef6356c506cebb6870d48cedea3c41e949e2dd556bb/ipython-9.12.0-py3-none-any.whl", hash = "sha256:0f2701e8ee86e117e37f50563205d36feaa259d2e08d4a6bc6b6d74b18ce128d", size = 625661, upload-time = "2026-03-27T09:42:42.831Z" }, + { url = "https://files.pythonhosted.org/packages/b9/86/3060e8029b7cc505cce9a0137431dda81d0a3fde93a8f0f50ee0bf37a795/ipython-9.13.0-py3-none-any.whl", hash = "sha256:57f9d4639e20818d328d287c7b549af3d05f12486ea8f2e7f73e52a36ec4d201", size = 627274, upload-time = "2026-04-24T12:24:53.038Z" }, ] [[package]] @@ -1235,14 +1219,14 @@ wheels = [ [[package]] name = "jedi" -version = "0.19.2" +version = "0.20.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "parso" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287, upload-time = "2024-11-11T01:41:42.873Z" } +sdist = { url = "https://files.pythonhosted.org/packages/46/b7/a3635f6a2d7cf5b5dd98064fc1d5fbbafcb25477bcea204a3a92145d158b/jedi-0.20.0.tar.gz", hash = "sha256:c3f4ccbd276696f4b19c54618d4fb18f9fc24b0aef02acf704b23f487daa1011", size = 3119416, upload-time = "2026-05-01T23:38:47.814Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278, upload-time = "2024-11-11T01:41:40.175Z" }, + { url = "https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl", hash = "sha256:7bdd9c2634f56713299976f4cbd59cb3fa92165cc5e05ea811fb253480728b67", size = 4884812, upload-time = "2026-05-01T23:38:43.919Z" }, ] [[package]] @@ -1337,7 +1321,7 @@ wheels = [ [[package]] name = "jupyter-events" -version = "0.12.0" +version = "0.12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jsonschema", extra = ["format-nongpl"] }, @@ -1349,14 +1333,14 @@ dependencies = [ { name = "rfc3986-validator" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9d/c3/306d090461e4cf3cd91eceaff84bede12a8e52cd821c2d20c9a4fd728385/jupyter_events-0.12.0.tar.gz", hash = "sha256:fc3fce98865f6784c9cd0a56a20644fc6098f21c8c33834a8d9fe383c17e554b", size = 62196, upload-time = "2025-02-03T17:23:41.485Z" } +sdist = { url = "https://files.pythonhosted.org/packages/18/f8/475c4241b2b75af0deaae453ed003c6c851766dbc44d332d8baf245dc931/jupyter_events-0.12.1.tar.gz", hash = "sha256:faff25f77218335752f35f23c5fe6e4a392a7bd99a5939ccb9b8fbf594636cf3", size = 62854, upload-time = "2026-04-20T23:17:50.66Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e2/48/577993f1f99c552f18a0428731a755e06171f9902fa118c379eb7c04ea22/jupyter_events-0.12.0-py3-none-any.whl", hash = "sha256:6464b2fa5ad10451c3d35fabc75eab39556ae1e2853ad0c0cc31b656731a97fb", size = 19430, upload-time = "2025-02-03T17:23:38.643Z" }, + { url = "https://files.pythonhosted.org/packages/eb/6c/6fcde0c8f616ed360ffd3587f7db9e225a7e62b583a04494d2f069cf64ea/jupyter_events-0.12.1-py3-none-any.whl", hash = "sha256:c366585253f537a627da52fa7ca7410c5b5301fe893f511e7b077c2d93ec8bcf", size = 19512, upload-time = "2026-04-20T23:17:48.927Z" }, ] [[package]] name = "jupyter-server" -version = "2.17.0" +version = "2.18.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -1371,7 +1355,7 @@ dependencies = [ { name = "overrides", marker = "python_full_version < '3.12'" }, { name = "packaging" }, { name = "prometheus-client" }, - { name = "pywinpty", marker = "os_name == 'nt'" }, + { name = "pywinpty", marker = "(os_name == 'nt' and platform_machine != 'x86_64') or (os_name == 'nt' and sys_platform != 'darwin')" }, { name = "pyzmq" }, { name = "send2trash" }, { name = "terminado" }, @@ -1379,9 +1363,9 @@ dependencies = [ { name = "traitlets" }, { name = "websocket-client" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5b/ac/e040ec363d7b6b1f11304cc9f209dac4517ece5d5e01821366b924a64a50/jupyter_server-2.17.0.tar.gz", hash = "sha256:c38ea898566964c888b4772ae1ed58eca84592e88251d2cfc4d171f81f7e99d5", size = 731949, upload-time = "2025-08-21T14:42:54.042Z" } +sdist = { url = "https://files.pythonhosted.org/packages/33/b0/666586d557a71a58cd9960b154fb9aee0ed81dd62a50371195ab95731909/jupyter_server-2.18.1.tar.gz", hash = "sha256:f62be526369b791625e03bd658070563c1a4e9a0a2f439ea1f9dbacea5f7191a", size = 752024, upload-time = "2026-05-05T09:17:51.101Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/92/80/a24767e6ca280f5a49525d987bf3e4d7552bf67c8be07e8ccf20271f8568/jupyter_server-2.17.0-py3-none-any.whl", hash = "sha256:e8cb9c7db4251f51ed307e329b81b72ccf2056ff82d50524debde1ee1870e13f", size = 388221, upload-time = "2025-08-21T14:42:52.034Z" }, + { url = "https://files.pythonhosted.org/packages/a4/45/bfe3779fd06714a379128f2c4eaf7c99414f0eb081f9f34c135f6b3d511c/jupyter_server-2.18.1-py3-none-any.whl", hash = "sha256:db0374d52a975f88a92a7f20de44e08ef5be9763ba7e99630baf16c46ac8dbf0", size = 391844, upload-time = "2026-05-05T09:17:48.521Z" }, ] [[package]] @@ -1389,7 +1373,7 @@ name = "jupyter-server-terminals" version = "0.5.4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pywinpty", marker = "os_name == 'nt'" }, + { name = "pywinpty", marker = "(os_name == 'nt' and platform_machine != 'x86_64') or (os_name == 'nt' and sys_platform != 'darwin')" }, { name = "terminado" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f4/a7/bcd0a9b0cbba88986fe944aaaf91bfda603e5a50bda8ed15123f381a3b2f/jupyter_server_terminals-0.5.4.tar.gz", hash = "sha256:bbda128ed41d0be9020349f9f1f2a4ab9952a73ed5f5ac9f1419794761fb87f5", size = 31770, upload-time = "2026-01-14T16:53:20.213Z" } @@ -1541,87 +1525,87 @@ wheels = [ [[package]] name = "librt" -version = "0.8.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/56/9c/b4b0c54d84da4a94b37bd44151e46d5e583c9534c7e02250b961b1b6d8a8/librt-0.8.1.tar.gz", hash = "sha256:be46a14693955b3bd96014ccbdb8339ee8c9346fbe11c1b78901b55125f14c73", size = 177471, upload-time = "2026-02-17T16:13:06.101Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7c/5f/63f5fa395c7a8a93558c0904ba8f1c8d1b997ca6a3de61bc7659970d66bf/librt-0.8.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:81fd938344fecb9373ba1b155968c8a329491d2ce38e7ddb76f30ffb938f12dc", size = 65697, upload-time = "2026-02-17T16:11:06.903Z" }, - { url = "https://files.pythonhosted.org/packages/ff/e0/0472cf37267b5920eff2f292ccfaede1886288ce35b7f3203d8de00abfe6/librt-0.8.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5db05697c82b3a2ec53f6e72b2ed373132b0c2e05135f0696784e97d7f5d48e7", size = 68376, upload-time = "2026-02-17T16:11:08.395Z" }, - { url = "https://files.pythonhosted.org/packages/c8/be/8bd1359fdcd27ab897cd5963294fa4a7c83b20a8564678e4fd12157e56a5/librt-0.8.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d56bc4011975f7460bea7b33e1ff425d2f1adf419935ff6707273c77f8a4ada6", size = 197084, upload-time = "2026-02-17T16:11:09.774Z" }, - { url = "https://files.pythonhosted.org/packages/e2/fe/163e33fdd091d0c2b102f8a60cc0a61fd730ad44e32617cd161e7cd67a01/librt-0.8.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cdc0f588ff4b663ea96c26d2a230c525c6fc62b28314edaaaca8ed5af931ad0", size = 207337, upload-time = "2026-02-17T16:11:11.311Z" }, - { url = "https://files.pythonhosted.org/packages/01/99/f85130582f05dcf0c8902f3d629270231d2f4afdfc567f8305a952ac7f14/librt-0.8.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:97c2b54ff6717a7a563b72627990bec60d8029df17df423f0ed37d56a17a176b", size = 219980, upload-time = "2026-02-17T16:11:12.499Z" }, - { url = "https://files.pythonhosted.org/packages/6f/54/cb5e4d03659e043a26c74e08206412ac9a3742f0477d96f9761a55313b5f/librt-0.8.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8f1125e6bbf2f1657d9a2f3ccc4a2c9b0c8b176965bb565dd4d86be67eddb4b6", size = 212921, upload-time = "2026-02-17T16:11:14.484Z" }, - { url = "https://files.pythonhosted.org/packages/b1/81/a3a01e4240579c30f3487f6fed01eb4bc8ef0616da5b4ebac27ca19775f3/librt-0.8.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8f4bb453f408137d7581be309b2fbc6868a80e7ef60c88e689078ee3a296ae71", size = 221381, upload-time = "2026-02-17T16:11:17.459Z" }, - { url = "https://files.pythonhosted.org/packages/08/b0/fc2d54b4b1c6fb81e77288ff31ff25a2c1e62eaef4424a984f228839717b/librt-0.8.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c336d61d2fe74a3195edc1646d53ff1cddd3a9600b09fa6ab75e5514ba4862a7", size = 216714, upload-time = "2026-02-17T16:11:19.197Z" }, - { url = "https://files.pythonhosted.org/packages/96/96/85daa73ffbd87e1fb287d7af6553ada66bf25a2a6b0de4764344a05469f6/librt-0.8.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:eb5656019db7c4deacf0c1a55a898c5bb8f989be904597fcb5232a2f4828fa05", size = 214777, upload-time = "2026-02-17T16:11:20.443Z" }, - { url = "https://files.pythonhosted.org/packages/12/9c/c3aa7a2360383f4bf4f04d98195f2739a579128720c603f4807f006a4225/librt-0.8.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c25d9e338d5bed46c1632f851babf3d13c78f49a225462017cf5e11e845c5891", size = 237398, upload-time = "2026-02-17T16:11:22.083Z" }, - { url = "https://files.pythonhosted.org/packages/61/19/d350ea89e5274665185dabc4bbb9c3536c3411f862881d316c8b8e00eb66/librt-0.8.1-cp310-cp310-win32.whl", hash = "sha256:aaab0e307e344cb28d800957ef3ec16605146ef0e59e059a60a176d19543d1b7", size = 54285, upload-time = "2026-02-17T16:11:23.27Z" }, - { url = "https://files.pythonhosted.org/packages/4f/d6/45d587d3d41c112e9543a0093d883eb57a24a03e41561c127818aa2a6bcc/librt-0.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:56e04c14b696300d47b3bc5f1d10a00e86ae978886d0cee14e5714fafb5df5d2", size = 61352, upload-time = "2026-02-17T16:11:24.207Z" }, - { url = "https://files.pythonhosted.org/packages/1d/01/0e748af5e4fee180cf7cd12bd12b0513ad23b045dccb2a83191bde82d168/librt-0.8.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:681dc2451d6d846794a828c16c22dc452d924e9f700a485b7ecb887a30aad1fd", size = 65315, upload-time = "2026-02-17T16:11:25.152Z" }, - { url = "https://files.pythonhosted.org/packages/9d/4d/7184806efda571887c798d573ca4134c80ac8642dcdd32f12c31b939c595/librt-0.8.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3b4350b13cc0e6f5bec8fa7caf29a8fb8cdc051a3bae45cfbfd7ce64f009965", size = 68021, upload-time = "2026-02-17T16:11:26.129Z" }, - { url = "https://files.pythonhosted.org/packages/ae/88/c3c52d2a5d5101f28d3dc89298444626e7874aa904eed498464c2af17627/librt-0.8.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ac1e7817fd0ed3d14fd7c5df91daed84c48e4c2a11ee99c0547f9f62fdae13da", size = 194500, upload-time = "2026-02-17T16:11:27.177Z" }, - { url = "https://files.pythonhosted.org/packages/d6/5d/6fb0a25b6a8906e85b2c3b87bee1d6ed31510be7605b06772f9374ca5cb3/librt-0.8.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:747328be0c5b7075cde86a0e09d7a9196029800ba75a1689332348e998fb85c0", size = 205622, upload-time = "2026-02-17T16:11:28.242Z" }, - { url = "https://files.pythonhosted.org/packages/b2/a6/8006ae81227105476a45691f5831499e4d936b1c049b0c1feb17c11b02d1/librt-0.8.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f0af2bd2bc204fa27f3d6711d0f360e6b8c684a035206257a81673ab924aa11e", size = 218304, upload-time = "2026-02-17T16:11:29.344Z" }, - { url = "https://files.pythonhosted.org/packages/ee/19/60e07886ad16670aae57ef44dada41912c90906a6fe9f2b9abac21374748/librt-0.8.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d480de377f5b687b6b1bc0c0407426da556e2a757633cc7e4d2e1a057aa688f3", size = 211493, upload-time = "2026-02-17T16:11:30.445Z" }, - { url = "https://files.pythonhosted.org/packages/9c/cf/f666c89d0e861d05600438213feeb818c7514d3315bae3648b1fc145d2b6/librt-0.8.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d0ee06b5b5291f609ddb37b9750985b27bc567791bc87c76a569b3feed8481ac", size = 219129, upload-time = "2026-02-17T16:11:32.021Z" }, - { url = "https://files.pythonhosted.org/packages/8f/ef/f1bea01e40b4a879364c031476c82a0dc69ce068daad67ab96302fed2d45/librt-0.8.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9e2c6f77b9ad48ce5603b83b7da9ee3e36b3ab425353f695cba13200c5d96596", size = 213113, upload-time = "2026-02-17T16:11:33.192Z" }, - { url = "https://files.pythonhosted.org/packages/9b/80/cdab544370cc6bc1b72ea369525f547a59e6938ef6863a11ab3cd24759af/librt-0.8.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:439352ba9373f11cb8e1933da194dcc6206daf779ff8df0ed69c5e39113e6a99", size = 212269, upload-time = "2026-02-17T16:11:34.373Z" }, - { url = "https://files.pythonhosted.org/packages/9d/9c/48d6ed8dac595654f15eceab2035131c136d1ae9a1e3548e777bb6dbb95d/librt-0.8.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:82210adabbc331dbb65d7868b105185464ef13f56f7f76688565ad79f648b0fe", size = 234673, upload-time = "2026-02-17T16:11:36.063Z" }, - { url = "https://files.pythonhosted.org/packages/16/01/35b68b1db517f27a01be4467593292eb5315def8900afad29fabf56304ba/librt-0.8.1-cp311-cp311-win32.whl", hash = "sha256:52c224e14614b750c0a6d97368e16804a98c684657c7518752c356834fff83bb", size = 54597, upload-time = "2026-02-17T16:11:37.544Z" }, - { url = "https://files.pythonhosted.org/packages/71/02/796fe8f02822235966693f257bf2c79f40e11337337a657a8cfebba5febc/librt-0.8.1-cp311-cp311-win_amd64.whl", hash = "sha256:c00e5c884f528c9932d278d5c9cbbea38a6b81eb62c02e06ae53751a83a4d52b", size = 61733, upload-time = "2026-02-17T16:11:38.691Z" }, - { url = "https://files.pythonhosted.org/packages/28/ad/232e13d61f879a42a4e7117d65e4984bb28371a34bb6fb9ca54ec2c8f54e/librt-0.8.1-cp311-cp311-win_arm64.whl", hash = "sha256:f7cdf7f26c2286ffb02e46d7bac56c94655540b26347673bea15fa52a6af17e9", size = 52273, upload-time = "2026-02-17T16:11:40.308Z" }, - { url = "https://files.pythonhosted.org/packages/95/21/d39b0a87ac52fc98f621fb6f8060efb017a767ebbbac2f99fbcbc9ddc0d7/librt-0.8.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a28f2612ab566b17f3698b0da021ff9960610301607c9a5e8eaca62f5e1c350a", size = 66516, upload-time = "2026-02-17T16:11:41.604Z" }, - { url = "https://files.pythonhosted.org/packages/69/f1/46375e71441c43e8ae335905e069f1c54febee63a146278bcee8782c84fd/librt-0.8.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:60a78b694c9aee2a0f1aaeaa7d101cf713e92e8423a941d2897f4fa37908dab9", size = 68634, upload-time = "2026-02-17T16:11:43.268Z" }, - { url = "https://files.pythonhosted.org/packages/0a/33/c510de7f93bf1fa19e13423a606d8189a02624a800710f6e6a0a0f0784b3/librt-0.8.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:758509ea3f1eba2a57558e7e98f4659d0ea7670bff49673b0dde18a3c7e6c0eb", size = 198941, upload-time = "2026-02-17T16:11:44.28Z" }, - { url = "https://files.pythonhosted.org/packages/dd/36/e725903416409a533d92398e88ce665476f275081d0d7d42f9c4951999e5/librt-0.8.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:039b9f2c506bd0ab0f8725aa5ba339c6f0cd19d3b514b50d134789809c24285d", size = 209991, upload-time = "2026-02-17T16:11:45.462Z" }, - { url = "https://files.pythonhosted.org/packages/30/7a/8d908a152e1875c9f8eac96c97a480df425e657cdb47854b9efaa4998889/librt-0.8.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bb54f1205a3a6ab41a6fd71dfcdcbd278670d3a90ca502a30d9da583105b6f7", size = 224476, upload-time = "2026-02-17T16:11:46.542Z" }, - { url = "https://files.pythonhosted.org/packages/a8/b8/a22c34f2c485b8903a06f3fe3315341fe6876ef3599792344669db98fcff/librt-0.8.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:05bd41cdee35b0c59c259f870f6da532a2c5ca57db95b5f23689fcb5c9e42440", size = 217518, upload-time = "2026-02-17T16:11:47.746Z" }, - { url = "https://files.pythonhosted.org/packages/79/6f/5c6fea00357e4f82ba44f81dbfb027921f1ab10e320d4a64e1c408d035d9/librt-0.8.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:adfab487facf03f0d0857b8710cf82d0704a309d8ffc33b03d9302b4c64e91a9", size = 225116, upload-time = "2026-02-17T16:11:49.298Z" }, - { url = "https://files.pythonhosted.org/packages/f2/a0/95ced4e7b1267fe1e2720a111685bcddf0e781f7e9e0ce59d751c44dcfe5/librt-0.8.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:153188fe98a72f206042be10a2c6026139852805215ed9539186312d50a8e972", size = 217751, upload-time = "2026-02-17T16:11:50.49Z" }, - { url = "https://files.pythonhosted.org/packages/93/c2/0517281cb4d4101c27ab59472924e67f55e375bc46bedae94ac6dc6e1902/librt-0.8.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:dd3c41254ee98604b08bd5b3af5bf0a89740d4ee0711de95b65166bf44091921", size = 218378, upload-time = "2026-02-17T16:11:51.783Z" }, - { url = "https://files.pythonhosted.org/packages/43/e8/37b3ac108e8976888e559a7b227d0ceac03c384cfd3e7a1c2ee248dbae79/librt-0.8.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e0d138c7ae532908cbb342162b2611dbd4d90c941cd25ab82084aaf71d2c0bd0", size = 241199, upload-time = "2026-02-17T16:11:53.561Z" }, - { url = "https://files.pythonhosted.org/packages/4b/5b/35812d041c53967fedf551a39399271bbe4257e681236a2cf1a69c8e7fa1/librt-0.8.1-cp312-cp312-win32.whl", hash = "sha256:43353b943613c5d9c49a25aaffdba46f888ec354e71e3529a00cca3f04d66a7a", size = 54917, upload-time = "2026-02-17T16:11:54.758Z" }, - { url = "https://files.pythonhosted.org/packages/de/d1/fa5d5331b862b9775aaf2a100f5ef86854e5d4407f71bddf102f4421e034/librt-0.8.1-cp312-cp312-win_amd64.whl", hash = "sha256:ff8baf1f8d3f4b6b7257fcb75a501f2a5499d0dda57645baa09d4d0d34b19444", size = 62017, upload-time = "2026-02-17T16:11:55.748Z" }, - { url = "https://files.pythonhosted.org/packages/c7/7c/c614252f9acda59b01a66e2ddfd243ed1c7e1deab0293332dfbccf862808/librt-0.8.1-cp312-cp312-win_arm64.whl", hash = "sha256:0f2ae3725904f7377e11cc37722d5d401e8b3d5851fb9273d7f4fe04f6b3d37d", size = 52441, upload-time = "2026-02-17T16:11:56.801Z" }, - { url = "https://files.pythonhosted.org/packages/c5/3c/f614c8e4eaac7cbf2bbdf9528790b21d89e277ee20d57dc6e559c626105f/librt-0.8.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7e6bad1cd94f6764e1e21950542f818a09316645337fd5ab9a7acc45d99a8f35", size = 66529, upload-time = "2026-02-17T16:11:57.809Z" }, - { url = "https://files.pythonhosted.org/packages/ab/96/5836544a45100ae411eda07d29e3d99448e5258b6e9c8059deb92945f5c2/librt-0.8.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cf450f498c30af55551ba4f66b9123b7185362ec8b625a773b3d39aa1a717583", size = 68669, upload-time = "2026-02-17T16:11:58.843Z" }, - { url = "https://files.pythonhosted.org/packages/06/53/f0b992b57af6d5531bf4677d75c44f095f2366a1741fb695ee462ae04b05/librt-0.8.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:eca45e982fa074090057132e30585a7e8674e9e885d402eae85633e9f449ce6c", size = 199279, upload-time = "2026-02-17T16:11:59.862Z" }, - { url = "https://files.pythonhosted.org/packages/f3/ad/4848cc16e268d14280d8168aee4f31cea92bbd2b79ce33d3e166f2b4e4fc/librt-0.8.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c3811485fccfda840861905b8c70bba5ec094e02825598bb9d4ca3936857a04", size = 210288, upload-time = "2026-02-17T16:12:00.954Z" }, - { url = "https://files.pythonhosted.org/packages/52/05/27fdc2e95de26273d83b96742d8d3b7345f2ea2bdbd2405cc504644f2096/librt-0.8.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e4af413908f77294605e28cfd98063f54b2c790561383971d2f52d113d9c363", size = 224809, upload-time = "2026-02-17T16:12:02.108Z" }, - { url = "https://files.pythonhosted.org/packages/7a/d0/78200a45ba3240cb042bc597d6f2accba9193a2c57d0356268cbbe2d0925/librt-0.8.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5212a5bd7fae98dae95710032902edcd2ec4dc994e883294f75c857b83f9aba0", size = 218075, upload-time = "2026-02-17T16:12:03.631Z" }, - { url = "https://files.pythonhosted.org/packages/af/72/a210839fa74c90474897124c064ffca07f8d4b347b6574d309686aae7ca6/librt-0.8.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e692aa2d1d604e6ca12d35e51fdc36f4cda6345e28e36374579f7ef3611b3012", size = 225486, upload-time = "2026-02-17T16:12:04.725Z" }, - { url = "https://files.pythonhosted.org/packages/a3/c1/a03cc63722339ddbf087485f253493e2b013039f5b707e8e6016141130fa/librt-0.8.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4be2a5c926b9770c9e08e717f05737a269b9d0ebc5d2f0060f0fe3fe9ce47acb", size = 218219, upload-time = "2026-02-17T16:12:05.828Z" }, - { url = "https://files.pythonhosted.org/packages/58/f5/fff6108af0acf941c6f274a946aea0e484bd10cd2dc37610287ce49388c5/librt-0.8.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:fd1a720332ea335ceb544cf0a03f81df92abd4bb887679fd1e460976b0e6214b", size = 218750, upload-time = "2026-02-17T16:12:07.09Z" }, - { url = "https://files.pythonhosted.org/packages/71/67/5a387bfef30ec1e4b4f30562c8586566faf87e47d696768c19feb49e3646/librt-0.8.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93c2af9e01e0ef80d95ae3c720be101227edae5f2fe7e3dc63d8857fadfc5a1d", size = 241624, upload-time = "2026-02-17T16:12:08.43Z" }, - { url = "https://files.pythonhosted.org/packages/d4/be/24f8502db11d405232ac1162eb98069ca49c3306c1d75c6ccc61d9af8789/librt-0.8.1-cp313-cp313-win32.whl", hash = "sha256:086a32dbb71336627e78cc1d6ee305a68d038ef7d4c39aaff41ae8c9aa46e91a", size = 54969, upload-time = "2026-02-17T16:12:09.633Z" }, - { url = "https://files.pythonhosted.org/packages/5c/73/c9fdf6cb2a529c1a092ce769a12d88c8cca991194dfe641b6af12fa964d2/librt-0.8.1-cp313-cp313-win_amd64.whl", hash = "sha256:e11769a1dbda4da7b00a76cfffa67aa47cfa66921d2724539eee4b9ede780b79", size = 62000, upload-time = "2026-02-17T16:12:10.632Z" }, - { url = "https://files.pythonhosted.org/packages/d3/97/68f80ca3ac4924f250cdfa6e20142a803e5e50fca96ef5148c52ee8c10ea/librt-0.8.1-cp313-cp313-win_arm64.whl", hash = "sha256:924817ab3141aca17893386ee13261f1d100d1ef410d70afe4389f2359fea4f0", size = 52495, upload-time = "2026-02-17T16:12:11.633Z" }, - { url = "https://files.pythonhosted.org/packages/c9/6a/907ef6800f7bca71b525a05f1839b21f708c09043b1c6aa77b6b827b3996/librt-0.8.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:6cfa7fe54fd4d1f47130017351a959fe5804bda7a0bc7e07a2cdbc3fdd28d34f", size = 66081, upload-time = "2026-02-17T16:12:12.766Z" }, - { url = "https://files.pythonhosted.org/packages/1b/18/25e991cd5640c9fb0f8d91b18797b29066b792f17bf8493da183bf5caabe/librt-0.8.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:228c2409c079f8c11fb2e5d7b277077f694cb93443eb760e00b3b83cb8b3176c", size = 68309, upload-time = "2026-02-17T16:12:13.756Z" }, - { url = "https://files.pythonhosted.org/packages/a4/36/46820d03f058cfb5a9de5940640ba03165ed8aded69e0733c417bb04df34/librt-0.8.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7aae78ab5e3206181780e56912d1b9bb9f90a7249ce12f0e8bf531d0462dd0fc", size = 196804, upload-time = "2026-02-17T16:12:14.818Z" }, - { url = "https://files.pythonhosted.org/packages/59/18/5dd0d3b87b8ff9c061849fbdb347758d1f724b9a82241aa908e0ec54ccd0/librt-0.8.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:172d57ec04346b047ca6af181e1ea4858086c80bdf455f61994c4aa6fc3f866c", size = 206907, upload-time = "2026-02-17T16:12:16.513Z" }, - { url = "https://files.pythonhosted.org/packages/d1/96/ef04902aad1424fd7299b62d1890e803e6ab4018c3044dca5922319c4b97/librt-0.8.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6b1977c4ea97ce5eb7755a78fae68d87e4102e4aaf54985e8b56806849cc06a3", size = 221217, upload-time = "2026-02-17T16:12:17.906Z" }, - { url = "https://files.pythonhosted.org/packages/6d/ff/7e01f2dda84a8f5d280637a2e5827210a8acca9a567a54507ef1c75b342d/librt-0.8.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:10c42e1f6fd06733ef65ae7bebce2872bcafd8d6e6b0a08fe0a05a23b044fb14", size = 214622, upload-time = "2026-02-17T16:12:19.108Z" }, - { url = "https://files.pythonhosted.org/packages/1e/8c/5b093d08a13946034fed57619742f790faf77058558b14ca36a6e331161e/librt-0.8.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4c8dfa264b9193c4ee19113c985c95f876fae5e51f731494fc4e0cf594990ba7", size = 221987, upload-time = "2026-02-17T16:12:20.331Z" }, - { url = "https://files.pythonhosted.org/packages/d3/cc/86b0b3b151d40920ad45a94ce0171dec1aebba8a9d72bb3fa00c73ab25dd/librt-0.8.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:01170b6729a438f0dedc4a26ed342e3dc4f02d1000b4b19f980e1877f0c297e6", size = 215132, upload-time = "2026-02-17T16:12:21.54Z" }, - { url = "https://files.pythonhosted.org/packages/fc/be/8588164a46edf1e69858d952654e216a9a91174688eeefb9efbb38a9c799/librt-0.8.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:7b02679a0d783bdae30d443025b94465d8c3dc512f32f5b5031f93f57ac32071", size = 215195, upload-time = "2026-02-17T16:12:23.073Z" }, - { url = "https://files.pythonhosted.org/packages/f5/f2/0b9279bea735c734d69344ecfe056c1ba211694a72df10f568745c899c76/librt-0.8.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:190b109bb69592a3401fe1ffdea41a2e73370ace2ffdc4a0e8e2b39cdea81b78", size = 237946, upload-time = "2026-02-17T16:12:24.275Z" }, - { url = "https://files.pythonhosted.org/packages/e9/cc/5f2a34fbc8aeb35314a3641f9956fa9051a947424652fad9882be7a97949/librt-0.8.1-cp314-cp314-win32.whl", hash = "sha256:e70a57ecf89a0f64c24e37f38d3fe217a58169d2fe6ed6d70554964042474023", size = 50689, upload-time = "2026-02-17T16:12:25.766Z" }, - { url = "https://files.pythonhosted.org/packages/a0/76/cd4d010ab2147339ca2b93e959c3686e964edc6de66ddacc935c325883d7/librt-0.8.1-cp314-cp314-win_amd64.whl", hash = "sha256:7e2f3edca35664499fbb36e4770650c4bd4a08abc1f4458eab9df4ec56389730", size = 57875, upload-time = "2026-02-17T16:12:27.465Z" }, - { url = "https://files.pythonhosted.org/packages/84/0f/2143cb3c3ca48bd3379dcd11817163ca50781927c4537345d608b5045998/librt-0.8.1-cp314-cp314-win_arm64.whl", hash = "sha256:0d2f82168e55ddefd27c01c654ce52379c0750ddc31ee86b4b266bcf4d65f2a3", size = 48058, upload-time = "2026-02-17T16:12:28.556Z" }, - { url = "https://files.pythonhosted.org/packages/d2/0e/9b23a87e37baf00311c3efe6b48d6b6c168c29902dfc3f04c338372fd7db/librt-0.8.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2c74a2da57a094bd48d03fa5d196da83d2815678385d2978657499063709abe1", size = 68313, upload-time = "2026-02-17T16:12:29.659Z" }, - { url = "https://files.pythonhosted.org/packages/db/9a/859c41e5a4f1c84200a7d2b92f586aa27133c8243b6cac9926f6e54d01b9/librt-0.8.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a355d99c4c0d8e5b770313b8b247411ed40949ca44e33e46a4789b9293a907ee", size = 70994, upload-time = "2026-02-17T16:12:31.516Z" }, - { url = "https://files.pythonhosted.org/packages/4c/28/10605366ee599ed34223ac2bf66404c6fb59399f47108215d16d5ad751a8/librt-0.8.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:2eb345e8b33fb748227409c9f1233d4df354d6e54091f0e8fc53acdb2ffedeb7", size = 220770, upload-time = "2026-02-17T16:12:33.294Z" }, - { url = "https://files.pythonhosted.org/packages/af/8d/16ed8fd452dafae9c48d17a6bc1ee3e818fd40ef718d149a8eff2c9f4ea2/librt-0.8.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9be2f15e53ce4e83cc08adc29b26fb5978db62ef2a366fbdf716c8a6c8901040", size = 235409, upload-time = "2026-02-17T16:12:35.443Z" }, - { url = "https://files.pythonhosted.org/packages/89/1b/7bdf3e49349c134b25db816e4a3db6b94a47ac69d7d46b1e682c2c4949be/librt-0.8.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:785ae29c1f5c6e7c2cde2c7c0e148147f4503da3abc5d44d482068da5322fd9e", size = 246473, upload-time = "2026-02-17T16:12:36.656Z" }, - { url = "https://files.pythonhosted.org/packages/4e/8a/91fab8e4fd2a24930a17188c7af5380eb27b203d72101c9cc000dbdfd95a/librt-0.8.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1d3a7da44baf692f0c6aeb5b2a09c5e6fc7a703bca9ffa337ddd2e2da53f7732", size = 238866, upload-time = "2026-02-17T16:12:37.849Z" }, - { url = "https://files.pythonhosted.org/packages/b9/e0/c45a098843fc7c07e18a7f8a24ca8496aecbf7bdcd54980c6ca1aaa79a8e/librt-0.8.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5fc48998000cbc39ec0d5311312dda93ecf92b39aaf184c5e817d5d440b29624", size = 250248, upload-time = "2026-02-17T16:12:39.445Z" }, - { url = "https://files.pythonhosted.org/packages/82/30/07627de23036640c952cce0c1fe78972e77d7d2f8fd54fa5ef4554ff4a56/librt-0.8.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:e96baa6820280077a78244b2e06e416480ed859bbd8e5d641cf5742919d8beb4", size = 240629, upload-time = "2026-02-17T16:12:40.889Z" }, - { url = "https://files.pythonhosted.org/packages/fb/c1/55bfe1ee3542eba055616f9098eaf6eddb966efb0ca0f44eaa4aba327307/librt-0.8.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:31362dbfe297b23590530007062c32c6f6176f6099646bb2c95ab1b00a57c382", size = 239615, upload-time = "2026-02-17T16:12:42.446Z" }, - { url = "https://files.pythonhosted.org/packages/2b/39/191d3d28abc26c9099b19852e6c99f7f6d400b82fa5a4e80291bd3803e19/librt-0.8.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cc3656283d11540ab0ea01978378e73e10002145117055e03722417aeab30994", size = 263001, upload-time = "2026-02-17T16:12:43.627Z" }, - { url = "https://files.pythonhosted.org/packages/b9/eb/7697f60fbe7042ab4e88f4ee6af496b7f222fffb0a4e3593ef1f29f81652/librt-0.8.1-cp314-cp314t-win32.whl", hash = "sha256:738f08021b3142c2918c03692608baed43bc51144c29e35807682f8070ee2a3a", size = 51328, upload-time = "2026-02-17T16:12:45.148Z" }, - { url = "https://files.pythonhosted.org/packages/7c/72/34bf2eb7a15414a23e5e70ecb9440c1d3179f393d9349338a91e2781c0fb/librt-0.8.1-cp314-cp314t-win_amd64.whl", hash = "sha256:89815a22daf9c51884fb5dbe4f1ef65ee6a146e0b6a8df05f753e2e4a9359bf4", size = 58722, upload-time = "2026-02-17T16:12:46.85Z" }, - { url = "https://files.pythonhosted.org/packages/b2/c8/d148e041732d631fc76036f8b30fae4e77b027a1e95b7a84bb522481a940/librt-0.8.1-cp314-cp314t-win_arm64.whl", hash = "sha256:bf512a71a23504ed08103a13c941f763db13fb11177beb3d9244c98c29fb4a61", size = 48755, upload-time = "2026-02-17T16:12:47.943Z" }, +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/6b/3d5c13fb3e3c4f43206c8f9dfed13778c2ed4f000bacaa0b7ce3c402a265/librt-0.9.0.tar.gz", hash = "sha256:a0951822531e7aee6e0dfb556b30d5ee36bbe234faf60c20a16c01be3530869d", size = 184368, upload-time = "2026-04-09T16:06:26.173Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f3/4a/c64265d71b84030174ff3ac2cd16d8b664072afab8c41fccd8e2ee5a6f8d/librt-0.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f8e12706dcb8ff6b3ed57514a19e45c49ad00bcd423e87b2b2e4b5f64578443", size = 67529, upload-time = "2026-04-09T16:04:27.373Z" }, + { url = "https://files.pythonhosted.org/packages/23/b1/30ca0b3a8bdac209a00145c66cf42e5e7da2cc056ffc6ebc5c7b430ddd34/librt-0.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4e3dda8345307fd7306db0ed0cb109a63a2c85ba780eb9dc2d09b2049a931f9c", size = 70248, upload-time = "2026-04-09T16:04:28.758Z" }, + { url = "https://files.pythonhosted.org/packages/fa/fc/c6018dc181478d6ac5aa24a5846b8185101eb90894346db239eb3ea53209/librt-0.9.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:de7dac64e3eb832ffc7b840eb8f52f76420cde1b845be51b2a0f6b870890645e", size = 202184, upload-time = "2026-04-09T16:04:29.893Z" }, + { url = "https://files.pythonhosted.org/packages/bf/58/d69629f002203370ef41ea69ff71c49a2c618aec39b226ff49986ecd8623/librt-0.9.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22a904cbdb678f7cb348c90d543d3c52f581663d687992fee47fd566dcbf5285", size = 212926, upload-time = "2026-04-09T16:04:31.126Z" }, + { url = "https://files.pythonhosted.org/packages/cc/55/01d859f57824e42bd02465c77bec31fa5ef9d8c2bcee702ccf8ef1b9f508/librt-0.9.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:224b9727eb8bc188bc3bcf29d969dba0cd61b01d9bac80c41575520cc4baabb2", size = 225664, upload-time = "2026-04-09T16:04:32.352Z" }, + { url = "https://files.pythonhosted.org/packages/9b/02/32f63ad0ef085a94a70315291efe1151a48b9947af12261882f8445b2a30/librt-0.9.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e94cbc6ad9a6aeea46d775cbb11f361022f778a9cc8cc90af653d3a594b057ce", size = 219534, upload-time = "2026-04-09T16:04:33.667Z" }, + { url = "https://files.pythonhosted.org/packages/6a/5a/9d77111a183c885acf3b3b6e4c00f5b5b07b5817028226499a55f1fedc59/librt-0.9.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7bc30ad339f4e1a01d4917d645e522a0bc0030644d8973f6346397c93ba1503f", size = 227322, upload-time = "2026-04-09T16:04:34.945Z" }, + { url = "https://files.pythonhosted.org/packages/d5/e7/05d700c93063753e12ab230b972002a3f8f3b9c95d8a980c2f646c8b6963/librt-0.9.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:56d65b583cf43b8cf4c8fbe1e1da20fa3076cc32a1149a141507af1062718236", size = 223407, upload-time = "2026-04-09T16:04:36.22Z" }, + { url = "https://files.pythonhosted.org/packages/c0/26/26c3124823c67c987456977c683da9a27cc874befc194ddcead5f9988425/librt-0.9.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:0a1be03168b2691ba61927e299b352a6315189199ca18a57b733f86cb3cc8d38", size = 221302, upload-time = "2026-04-09T16:04:37.62Z" }, + { url = "https://files.pythonhosted.org/packages/50/2b/c7cc2be5cf4ff7b017d948a789256288cb33a517687ff1995e72a7eea79f/librt-0.9.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:63c12efcd160e1d14da11af0c46c0217473e1e0d2ae1acbccc83f561ea4c2a7b", size = 243893, upload-time = "2026-04-09T16:04:38.909Z" }, + { url = "https://files.pythonhosted.org/packages/62/d3/da553d37417a337d12660450535d5fd51373caffbedf6962173c87867246/librt-0.9.0-cp310-cp310-win32.whl", hash = "sha256:e9002e98dcb1c0a66723592520decd86238ddcef168b37ff6cfb559200b4b774", size = 55375, upload-time = "2026-04-09T16:04:40.148Z" }, + { url = "https://files.pythonhosted.org/packages/9b/5a/46fa357bab8311b6442a83471591f2f9e5b15ecc1d2121a43725e0c529b8/librt-0.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:9fcb461fbf70654a52a7cc670e606f04449e2374c199b1825f754e16dacfedd8", size = 62581, upload-time = "2026-04-09T16:04:41.452Z" }, + { url = "https://files.pythonhosted.org/packages/e2/1e/2ec7afcebcf3efea593d13aee18bbcfdd3a243043d848ebf385055e9f636/librt-0.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:90904fac73c478f4b83f4ed96c99c8208b75e6f9a8a1910548f69a00f1eaa671", size = 67155, upload-time = "2026-04-09T16:04:42.933Z" }, + { url = "https://files.pythonhosted.org/packages/18/77/72b85afd4435268338ad4ec6231b3da8c77363f212a0227c1ff3b45e4d35/librt-0.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:789fff71757facc0738e8d89e3b84e4f0251c1c975e85e81b152cdaca927cc2d", size = 69916, upload-time = "2026-04-09T16:04:44.042Z" }, + { url = "https://files.pythonhosted.org/packages/27/fb/948ea0204fbe2e78add6d46b48330e58d39897e425560674aee302dca81c/librt-0.9.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1bf465d1e5b0a27713862441f6467b5ab76385f4ecf8f1f3a44f8aa3c695b4b6", size = 199635, upload-time = "2026-04-09T16:04:45.5Z" }, + { url = "https://files.pythonhosted.org/packages/ac/cd/894a29e251b296a27957856804cfd21e93c194aa131de8bb8032021be07e/librt-0.9.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f819e0c6413e259a17a7c0d49f97f405abadd3c2a316a3b46c6440b7dbbedbb1", size = 211051, upload-time = "2026-04-09T16:04:47.016Z" }, + { url = "https://files.pythonhosted.org/packages/18/8f/dcaed0bc084a35f3721ff2d081158db569d2c57ea07d35623ddaca5cfc8e/librt-0.9.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e0785c2fb4a81e1aece366aa3e2e039f4a4d7d21aaaded5227d7f3c703427882", size = 224031, upload-time = "2026-04-09T16:04:48.207Z" }, + { url = "https://files.pythonhosted.org/packages/03/44/88f6c1ed1132cd418601cc041fbd92fed28b3a09f39de81978e0822d13ff/librt-0.9.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:80b25c7b570a86c03b5da69e665809deb39265476e8e21d96a9328f9762f9990", size = 218069, upload-time = "2026-04-09T16:04:50.025Z" }, + { url = "https://files.pythonhosted.org/packages/a3/90/7d02e981c2db12188d82b4410ff3e35bfdb844b26aecd02233626f46af2b/librt-0.9.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d4d16b608a1c43d7e33142099a75cd93af482dadce0bf82421e91cad077157f4", size = 224857, upload-time = "2026-04-09T16:04:51.684Z" }, + { url = "https://files.pythonhosted.org/packages/ef/c3/c77e706b7215ca32e928d47535cf13dbc3d25f096f84ddf8fbc06693e229/librt-0.9.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:194fc1a32e1e21fe809d38b5faea66cc65eaa00217c8901fbdb99866938adbdb", size = 219865, upload-time = "2026-04-09T16:04:52.949Z" }, + { url = "https://files.pythonhosted.org/packages/52/d1/32b0c1a0eb8461c70c11656c46a29f760b7c7edf3c36d6f102470c17170f/librt-0.9.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:8c6bc1384d9738781cfd41d09ad7f6e8af13cfea2c75ece6bd6d2566cdea2076", size = 218451, upload-time = "2026-04-09T16:04:54.174Z" }, + { url = "https://files.pythonhosted.org/packages/74/d1/adfd0f9c44761b1d49b1bec66173389834c33ee2bd3c7fd2e2367f1942d4/librt-0.9.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:15cb151e52a044f06e54ac7f7b47adbfc89b5c8e2b63e1175a9d587c43e8942a", size = 241300, upload-time = "2026-04-09T16:04:55.452Z" }, + { url = "https://files.pythonhosted.org/packages/09/b0/9074b64407712f0003c27f5b1d7655d1438979155f049720e8a1abd9b1a1/librt-0.9.0-cp311-cp311-win32.whl", hash = "sha256:f100bfe2acf8a3689af9d0cc660d89f17286c9c795f9f18f7b62dd1a6b247ae6", size = 55668, upload-time = "2026-04-09T16:04:56.689Z" }, + { url = "https://files.pythonhosted.org/packages/24/19/40b77b77ce80b9389fb03971431b09b6b913911c38d412059e0b3e2a9ef2/librt-0.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:0b73e4266307e51c95e09c0750b7ec383c561d2e97d58e473f6f6a209952fbb8", size = 62976, upload-time = "2026-04-09T16:04:57.733Z" }, + { url = "https://files.pythonhosted.org/packages/70/9d/9fa7a64041e29035cb8c575af5f0e3840be1b97b4c4d9061e0713f171849/librt-0.9.0-cp311-cp311-win_arm64.whl", hash = "sha256:bc5518873822d2faa8ebdd2c1a4d7c8ef47b01a058495ab7924cb65bdbf5fc9a", size = 53502, upload-time = "2026-04-09T16:04:58.806Z" }, + { url = "https://files.pythonhosted.org/packages/bf/90/89ddba8e1c20b0922783cd93ed8e64f34dc05ab59c38a9c7e313632e20ff/librt-0.9.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9b3e3bc363f71bda1639a4ee593cb78f7fbfeacc73411ec0d4c92f00730010a4", size = 68332, upload-time = "2026-04-09T16:05:00.09Z" }, + { url = "https://files.pythonhosted.org/packages/a8/40/7aa4da1fb08bdeeb540cb07bfc8207cb32c5c41642f2594dbd0098a0662d/librt-0.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0a09c2f5869649101738653a9b7ab70cf045a1105ac66cbb8f4055e61df78f2d", size = 70581, upload-time = "2026-04-09T16:05:01.213Z" }, + { url = "https://files.pythonhosted.org/packages/48/ac/73a2187e1031041e93b7e3a25aae37aa6f13b838c550f7e0f06f66766212/librt-0.9.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5ca8e133d799c948db2ab1afc081c333a825b5540475164726dcbf73537e5c2f", size = 203984, upload-time = "2026-04-09T16:05:02.542Z" }, + { url = "https://files.pythonhosted.org/packages/5e/3d/23460d571e9cbddb405b017681df04c142fb1b04cbfce77c54b08e28b108/librt-0.9.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:603138ee838ee1583f1b960b62d5d0007845c5c423feb68e44648b1359014e27", size = 215762, upload-time = "2026-04-09T16:05:04.127Z" }, + { url = "https://files.pythonhosted.org/packages/de/1e/42dc7f8ab63e65b20640d058e63e97fd3e482c1edbda3570d813b4d0b927/librt-0.9.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f4003f70c56a5addd6aa0897f200dd59afd3bf7bcd5b3cce46dd21f925743bc2", size = 230288, upload-time = "2026-04-09T16:05:05.883Z" }, + { url = "https://files.pythonhosted.org/packages/dc/08/ca812b6d8259ad9ece703397f8ad5c03af5b5fedfce64279693d3ce4087c/librt-0.9.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:78042f6facfd98ecb25e9829c7e37cce23363d9d7c83bc5f72702c5059eb082b", size = 224103, upload-time = "2026-04-09T16:05:07.148Z" }, + { url = "https://files.pythonhosted.org/packages/b6/3f/620490fb2fa66ffd44e7f900254bc110ebec8dac6c1b7514d64662570e6f/librt-0.9.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a361c9434a64d70a7dbb771d1de302c0cc9f13c0bffe1cf7e642152814b35265", size = 232122, upload-time = "2026-04-09T16:05:08.386Z" }, + { url = "https://files.pythonhosted.org/packages/e9/83/12864700a1b6a8be458cf5d05db209b0d8e94ae281e7ec261dbe616597b4/librt-0.9.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:dd2c7e082b0b92e1baa4da28163a808672485617bc855cc22a2fd06978fa9084", size = 225045, upload-time = "2026-04-09T16:05:09.707Z" }, + { url = "https://files.pythonhosted.org/packages/fd/1b/845d339c29dc7dbc87a2e992a1ba8d28d25d0e0372f9a0a2ecebde298186/librt-0.9.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:7e6274fd33fc5b2a14d41c9119629d3ff395849d8bcbc80cf637d9e8d2034da8", size = 227372, upload-time = "2026-04-09T16:05:10.942Z" }, + { url = "https://files.pythonhosted.org/packages/8d/fe/277985610269d926a64c606f761d58d3db67b956dbbf40024921e95e7fcb/librt-0.9.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5093043afb226ecfa1400120d1ebd4442b4f99977783e4f4f7248879009b227f", size = 248224, upload-time = "2026-04-09T16:05:12.254Z" }, + { url = "https://files.pythonhosted.org/packages/92/1b/ee486d244b8de6b8b5dbaefabe6bfdd4a72e08f6353edf7d16d27114da8d/librt-0.9.0-cp312-cp312-win32.whl", hash = "sha256:9edcc35d1cae9fd5320171b1a838c7da8a5c968af31e82ecc3dff30b4be0957f", size = 55986, upload-time = "2026-04-09T16:05:13.529Z" }, + { url = "https://files.pythonhosted.org/packages/89/7a/ba1737012308c17dc6d5516143b5dce9a2c7ba3474afd54e11f44a4d1ef3/librt-0.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:3cc2917258e131ae5f958a4d872e07555b51cb7466a43433218061c74ef33745", size = 63260, upload-time = "2026-04-09T16:05:14.68Z" }, + { url = "https://files.pythonhosted.org/packages/36/e4/01752c113da15127f18f7bf11142f5640038f062407a611c059d0036c6aa/librt-0.9.0-cp312-cp312-win_arm64.whl", hash = "sha256:90e6d5420fc8a300518d4d2288154ff45005e920425c22cbbfe8330f3f754bd9", size = 53694, upload-time = "2026-04-09T16:05:16.095Z" }, + { url = "https://files.pythonhosted.org/packages/5f/d7/1b3e26fffde1452d82f5666164858a81c26ebe808e7ae8c9c88628981540/librt-0.9.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f29b68cd9714531672db62cc54f6e8ff981900f824d13fa0e00749189e13778e", size = 68367, upload-time = "2026-04-09T16:05:17.243Z" }, + { url = "https://files.pythonhosted.org/packages/a5/5b/c61b043ad2e091fbe1f2d35d14795e545d0b56b03edaa390fa1dcee3d160/librt-0.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7d5c8a5929ac325729f6119802070b561f4db793dffc45e9ac750992a4ed4d22", size = 70595, upload-time = "2026-04-09T16:05:18.471Z" }, + { url = "https://files.pythonhosted.org/packages/a3/22/2448471196d8a73370aa2f23445455dc42712c21404081fcd7a03b9e0749/librt-0.9.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:756775d25ec8345b837ab52effee3ad2f3b2dfd6bbee3e3f029c517bd5d8f05a", size = 204354, upload-time = "2026-04-09T16:05:19.593Z" }, + { url = "https://files.pythonhosted.org/packages/ac/5e/39fc4b153c78cfd2c8a2dcb32700f2d41d2312aa1050513183be4540930d/librt-0.9.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2b8f5d00b49818f4e2b1667db994488b045835e0ac16fe2f924f3871bd2b8ac5", size = 216238, upload-time = "2026-04-09T16:05:20.868Z" }, + { url = "https://files.pythonhosted.org/packages/d7/42/bc2d02d0fa7badfa63aa8d6dcd8793a9f7ef5a94396801684a51ed8d8287/librt-0.9.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c81aef782380f0f13ead670aae01825eb653b44b046aa0e5ebbb79f76ed4aa11", size = 230589, upload-time = "2026-04-09T16:05:22.305Z" }, + { url = "https://files.pythonhosted.org/packages/c8/7b/e2d95cc513866373692aa5edf98080d5602dd07cabfb9e5d2f70df2f25f7/librt-0.9.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:66b58fed90a545328e80d575467244de3741e088c1af928f0b489ebec3ef3858", size = 224610, upload-time = "2026-04-09T16:05:23.647Z" }, + { url = "https://files.pythonhosted.org/packages/31/d5/6cec4607e998eaba57564d06a1295c21b0a0c8de76e4e74d699e627bd98c/librt-0.9.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e78fb7419e07d98c2af4b8567b72b3eaf8cb05caad642e9963465569c8b2d87e", size = 232558, upload-time = "2026-04-09T16:05:25.025Z" }, + { url = "https://files.pythonhosted.org/packages/95/8c/27f1d8d3aaf079d3eb26439bf0b32f1482340c3552e324f7db9dca858671/librt-0.9.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c3786f0f4490a5cd87f1ed6cefae833ad6b1060d52044ce0434a2e85893afd0", size = 225521, upload-time = "2026-04-09T16:05:26.311Z" }, + { url = "https://files.pythonhosted.org/packages/6b/d8/1e0d43b1c329b416017619469b3c3801a25a6a4ef4a1c68332aeaa6f72ca/librt-0.9.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:8494cfc61e03542f2d381e71804990b3931175a29b9278fdb4a5459948778dc2", size = 227789, upload-time = "2026-04-09T16:05:27.624Z" }, + { url = "https://files.pythonhosted.org/packages/2c/b4/d3d842e88610fcd4c8eec7067b0c23ef2d7d3bff31496eded6a83b0f99be/librt-0.9.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:07cf11f769831186eeac424376e6189f20ace4f7263e2134bdb9757340d84d4d", size = 248616, upload-time = "2026-04-09T16:05:29.181Z" }, + { url = "https://files.pythonhosted.org/packages/ec/28/527df8ad0d1eb6c8bdfa82fc190f1f7c4cca5a1b6d7b36aeabf95b52d74d/librt-0.9.0-cp313-cp313-win32.whl", hash = "sha256:850d6d03177e52700af605fd60db7f37dcb89782049a149674d1a9649c2138fd", size = 56039, upload-time = "2026-04-09T16:05:30.709Z" }, + { url = "https://files.pythonhosted.org/packages/f3/a7/413652ad0d92273ee5e30c000fc494b361171177c83e57c060ecd3c21538/librt-0.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:a5af136bfba820d592f86c67affcef9b3ff4d4360ac3255e341e964489b48519", size = 63264, upload-time = "2026-04-09T16:05:31.881Z" }, + { url = "https://files.pythonhosted.org/packages/a4/0a/92c244309b774e290ddb15e93363846ae7aa753d9586b8aad511c5e6145b/librt-0.9.0-cp313-cp313-win_arm64.whl", hash = "sha256:4c4d0440a3a8e31d962340c3e1cc3fc9ee7febd34c8d8f770d06adb947779ea5", size = 53728, upload-time = "2026-04-09T16:05:33.31Z" }, + { url = "https://files.pythonhosted.org/packages/cd/c1/184e539543f06ea2912f4b92a5ffaede4f9b392689e3f00acbf8134bee92/librt-0.9.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:3f05d145df35dca5056a8bc3838e940efebd893a54b3e19b2dda39ceaa299bcb", size = 67830, upload-time = "2026-04-09T16:05:34.517Z" }, + { url = "https://files.pythonhosted.org/packages/f3/ad/23399bdcb7afca819acacdef31b37ee59de261bd66b503a7995c03c4b0dc/librt-0.9.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1c587494461ebd42229d0f1739f3aa34237dd9980623ecf1be8d3bcba79f4499", size = 70280, upload-time = "2026-04-09T16:05:35.649Z" }, + { url = "https://files.pythonhosted.org/packages/9f/0b/4542dc5a2b8772dbf92cafb9194701230157e73c14b017b6961a23598b03/librt-0.9.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b0a2040f801406b93657a70b72fa12311063a319fee72ce98e1524da7200171f", size = 201925, upload-time = "2026-04-09T16:05:36.739Z" }, + { url = "https://files.pythonhosted.org/packages/31/d4/8ee7358b08fd0cfce051ef96695380f09b3c2c11b77c9bfbc367c921cce5/librt-0.9.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f38bc489037eca88d6ebefc9c4d41a4e07c8e8b4de5188a9e6d290273ad7ebb1", size = 212381, upload-time = "2026-04-09T16:05:38.043Z" }, + { url = "https://files.pythonhosted.org/packages/f2/94/a2025fe442abedf8b038038dab3dba942009ad42b38ea064a1a9e6094241/librt-0.9.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3fd278f5e6bf7c75ccd6d12344eb686cc020712683363b66f46ac79d37c799f", size = 227065, upload-time = "2026-04-09T16:05:39.394Z" }, + { url = "https://files.pythonhosted.org/packages/7c/e9/b9fcf6afa909f957cfbbf918802f9dada1bd5d3c1da43d722fd6a310dc3f/librt-0.9.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fcbdf2a9ca24e87bbebb47f1fe34e531ef06f104f98c9ccfc953a3f3344c567a", size = 221333, upload-time = "2026-04-09T16:05:40.999Z" }, + { url = "https://files.pythonhosted.org/packages/ac/7c/ba54cd6aa6a3c8cd12757a6870e0c79a64b1e6327f5248dcff98423f4d43/librt-0.9.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e306d956cfa027fe041585f02a1602c32bfa6bb8ebea4899d373383295a6c62f", size = 229051, upload-time = "2026-04-09T16:05:42.605Z" }, + { url = "https://files.pythonhosted.org/packages/4b/4b/8cfdbad314c8677a0148bf0b70591d6d18587f9884d930276098a235461b/librt-0.9.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:465814ab157986acb9dfa5ccd7df944be5eefc0d08d31ec6e8d88bc71251d845", size = 222492, upload-time = "2026-04-09T16:05:43.842Z" }, + { url = "https://files.pythonhosted.org/packages/1f/d1/2eda69563a1a88706808decdce035e4b32755dbfbb0d05e1a65db9547ed1/librt-0.9.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:703f4ae36d6240bfe24f542bac784c7e4194ec49c3ba5a994d02891649e2d85b", size = 223849, upload-time = "2026-04-09T16:05:45.054Z" }, + { url = "https://files.pythonhosted.org/packages/04/44/b2ed37df6be5b3d42cfe36318e0598e80843d5c6308dd63d0bf4e0ce5028/librt-0.9.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:3be322a15ee5e70b93b7a59cfd074614f22cc8c9ff18bd27f474e79137ea8d3b", size = 245001, upload-time = "2026-04-09T16:05:46.34Z" }, + { url = "https://files.pythonhosted.org/packages/47/e7/617e412426df89169dd2a9ed0cc8752d5763336252c65dbf945199915119/librt-0.9.0-cp314-cp314-win32.whl", hash = "sha256:b8da9f8035bb417770b1e1610526d87ad4fc58a2804dc4d79c53f6d2cf5a6eb9", size = 51799, upload-time = "2026-04-09T16:05:47.738Z" }, + { url = "https://files.pythonhosted.org/packages/24/ed/c22ca4db0ca3cbc285e4d9206108746beda561a9792289c3c31281d7e9df/librt-0.9.0-cp314-cp314-win_amd64.whl", hash = "sha256:b8bd70d5d816566a580d193326912f4a76ec2d28a97dc4cd4cc831c0af8e330e", size = 59165, upload-time = "2026-04-09T16:05:49.198Z" }, + { url = "https://files.pythonhosted.org/packages/24/56/875398fafa4cbc8f15b89366fc3287304ddd3314d861f182a4b87595ace0/librt-0.9.0-cp314-cp314-win_arm64.whl", hash = "sha256:fc5758e2b7a56532dc33e3c544d78cbaa9ecf0a0f2a2da2df882c1d6b99a317f", size = 49292, upload-time = "2026-04-09T16:05:50.362Z" }, + { url = "https://files.pythonhosted.org/packages/4c/61/bc448ecbf9b2d69c5cff88fe41496b19ab2a1cbda0065e47d4d0d51c0867/librt-0.9.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:f24b90b0e0c8cc9491fb1693ae91fe17cb7963153a1946395acdbdd5818429a4", size = 70175, upload-time = "2026-04-09T16:05:51.564Z" }, + { url = "https://files.pythonhosted.org/packages/60/f2/c47bb71069a73e2f04e70acbd196c1e5cc411578ac99039a224b98920fd4/librt-0.9.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3fe56e80badb66fdcde06bef81bbaa5bfcf6fbd7aefb86222d9e369c38c6b228", size = 72951, upload-time = "2026-04-09T16:05:52.699Z" }, + { url = "https://files.pythonhosted.org/packages/29/19/0549df59060631732df758e8886d92088da5fdbedb35b80e4643664e8412/librt-0.9.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:527b5b820b47a09e09829051452bb0d1dd2122261254e2a6f674d12f1d793d54", size = 225864, upload-time = "2026-04-09T16:05:53.895Z" }, + { url = "https://files.pythonhosted.org/packages/9d/f8/3b144396d302ac08e50f89e64452c38db84bc7b23f6c60479c5d3abd303c/librt-0.9.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7d429bdd4ac0ab17c8e4a8af0ed2a7440b16eba474909ab357131018fe8c7e71", size = 241155, upload-time = "2026-04-09T16:05:55.191Z" }, + { url = "https://files.pythonhosted.org/packages/7a/ce/ee67ec14581de4043e61d05786d2aed6c9b5338816b7859bcf07455c6a9f/librt-0.9.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7202bdcac47d3a708271c4304a474a8605a4a9a4a709e954bf2d3241140aa938", size = 252235, upload-time = "2026-04-09T16:05:56.549Z" }, + { url = "https://files.pythonhosted.org/packages/8a/fa/0ead15daa2b293a54101550b08d4bafe387b7d4a9fc6d2b985602bae69b6/librt-0.9.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0d620e74897f8c2613b3c4e2e9c1e422eb46d2ddd07df540784d44117836af3", size = 244963, upload-time = "2026-04-09T16:05:57.858Z" }, + { url = "https://files.pythonhosted.org/packages/29/68/9fbf9a9aa704ba87689e40017e720aced8d9a4d2b46b82451d8142f91ec9/librt-0.9.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d69fc39e627908f4c03297d5a88d9284b73f4d90b424461e32e8c2485e21c283", size = 257364, upload-time = "2026-04-09T16:05:59.686Z" }, + { url = "https://files.pythonhosted.org/packages/1a/8d/9d60869f1b6716c762e45f66ed945b1e5dd649f7377684c3b176ae424648/librt-0.9.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:c2640e23d2b7c98796f123ffd95cf2022c7777aa8a4a3b98b36c570d37e85eee", size = 247661, upload-time = "2026-04-09T16:06:00.938Z" }, + { url = "https://files.pythonhosted.org/packages/70/ff/a5c365093962310bfdb4f6af256f191085078ffb529b3f0cbebb5b33ebe2/librt-0.9.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:451daa98463b7695b0a30aa56bf637831ea559e7b8101ac2ef6382e8eb15e29c", size = 248238, upload-time = "2026-04-09T16:06:02.537Z" }, + { url = "https://files.pythonhosted.org/packages/a0/3c/2d34365177f412c9e19c0a29f969d70f5343f27634b76b765a54d8b27705/librt-0.9.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:928bd06eca2c2bbf4349e5b817f837509b0604342e65a502de1d50a7570afd15", size = 269457, upload-time = "2026-04-09T16:06:03.833Z" }, + { url = "https://files.pythonhosted.org/packages/bc/cd/de45b239ea3bdf626f982a00c14bfcf2e12d261c510ba7db62c5969a27cd/librt-0.9.0-cp314-cp314t-win32.whl", hash = "sha256:a9c63e04d003bc0fb6a03b348018b9a3002f98268200e22cc80f146beac5dc40", size = 52453, upload-time = "2026-04-09T16:06:05.229Z" }, + { url = "https://files.pythonhosted.org/packages/7f/f9/bfb32ae428aa75c0c533915622176f0a17d6da7b72b5a3c6363685914f70/librt-0.9.0-cp314-cp314t-win_amd64.whl", hash = "sha256:f162af66a2ed3f7d1d161a82ca584efd15acd9c1cff190a373458c32f7d42118", size = 60044, upload-time = "2026-04-09T16:06:06.398Z" }, + { url = "https://files.pythonhosted.org/packages/aa/47/7d70414bcdbb3bc1f458a8d10558f00bbfdb24e5a11740fc8197e12c3255/librt-0.9.0-cp314-cp314t-win_arm64.whl", hash = "sha256:a4b25c6c25cac5d0d9d6d6da855195b254e0021e513e0249f0e3b444dc6e0e61", size = 50009, upload-time = "2026-04-09T16:06:07.995Z" }, ] [[package]] @@ -1687,15 +1671,59 @@ wheels = [ ] [[package]] -name = "markdown-it-py" -version = "4.0.0" +name = "llvmlite" +version = "0.45.1" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "mdurl" }, +resolution-markers = [ + "python_full_version >= '3.15' and platform_machine == 'x86_64' and sys_platform == 'darwin'", + "python_full_version == '3.14.*' and platform_machine == 'x86_64' and sys_platform == 'darwin'", + "python_full_version >= '3.11' and python_full_version < '3.14' and platform_machine == 'x86_64' and sys_platform == 'darwin'", + "python_full_version < '3.11' and platform_machine == 'x86_64' and sys_platform == 'darwin'", ] -sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload-time = "2025-08-11T12:57:52.854Z" } +sdist = { url = "https://files.pythonhosted.org/packages/99/8d/5baf1cef7f9c084fb35a8afbde88074f0d6a727bc63ef764fe0e7543ba40/llvmlite-0.45.1.tar.gz", hash = "sha256:09430bb9d0bb58fc45a45a57c7eae912850bedc095cd0810a57de109c69e1c32", size = 185600, upload-time = "2025-10-01T17:59:52.046Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" }, + { url = "https://files.pythonhosted.org/packages/cf/6d/585c84ddd9d2a539a3c3487792b3cf3f988e28ec4fa281bf8b0e055e1166/llvmlite-0.45.1-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:1b1af0c910af0978aa55fa4f60bbb3e9f39b41e97c2a6d94d199897be62ba07a", size = 43043523, upload-time = "2025-10-01T18:02:58.621Z" }, + { url = "https://files.pythonhosted.org/packages/04/ad/9bdc87b2eb34642c1cfe6bcb4f5db64c21f91f26b010f263e7467e7536a3/llvmlite-0.45.1-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:60f92868d5d3af30b4239b50e1717cb4e4e54f6ac1c361a27903b318d0f07f42", size = 43043526, upload-time = "2025-10-01T18:03:15.051Z" }, + { url = "https://files.pythonhosted.org/packages/e2/7c/82cbd5c656e8991bcc110c69d05913be2229302a92acb96109e166ae31fb/llvmlite-0.45.1-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:28e763aba92fe9c72296911e040231d486447c01d4f90027c8e893d89d49b20e", size = 43043524, upload-time = "2025-10-01T18:03:30.666Z" }, + { url = "https://files.pythonhosted.org/packages/1d/e2/c185bb7e88514d5025f93c6c4092f6120c6cea8fe938974ec9860fb03bbb/llvmlite-0.45.1-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:d9ea9e6f17569a4253515cc01dade70aba536476e3d750b2e18d81d7e670eb15", size = 43043524, upload-time = "2025-10-01T18:03:43.249Z" }, +] + +[[package]] +name = "llvmlite" +version = "0.47.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "(python_full_version >= '3.15' and platform_machine != 'x86_64') or (python_full_version >= '3.15' and sys_platform != 'darwin')", + "(python_full_version == '3.14.*' and platform_machine != 'x86_64') or (python_full_version == '3.14.*' and sys_platform != 'darwin')", + "(python_full_version >= '3.11' and python_full_version < '3.14' and platform_machine != 'x86_64') or (python_full_version >= '3.11' and python_full_version < '3.14' and sys_platform != 'darwin')", + "(python_full_version < '3.11' and platform_machine != 'x86_64') or (python_full_version < '3.11' and sys_platform != 'darwin')", +] +sdist = { url = "https://files.pythonhosted.org/packages/01/88/a8952b6d5c21e74cbf158515b779666f692846502623e9e3c39d8e8ba25f/llvmlite-0.47.0.tar.gz", hash = "sha256:62031ce968ec74e95092184d4b0e857e444f8fdff0b8f9213707699570c33ccc", size = 193614, upload-time = "2026-03-31T18:29:53.497Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/f5/a1bde3aa8c43524b0acaf3f72fb3d80a32dd29dbb42d7dc434f84584cdcc/llvmlite-0.47.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41270b0b1310717f717cf6f2a9c68d3c43bd7905c33f003825aebc361d0d1b17", size = 37232772, upload-time = "2026-03-31T18:28:12.198Z" }, + { url = "https://files.pythonhosted.org/packages/7c/fb/76d88fc05ee1f9c1a6efe39eb493c4a727e5d1690412469017cd23bcb776/llvmlite-0.47.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f9d118bc1dd7623e0e65ca9ac485ec6dd543c3b77bc9928ddc45ebd34e1e30a7", size = 56275179, upload-time = "2026-03-31T18:28:15.725Z" }, + { url = "https://files.pythonhosted.org/packages/4d/08/29da7f36217abd56a0c389ef9a18bea47960826e691ced1a36c92c6ce93c/llvmlite-0.47.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9ea5cfb04a6ab5b18e46be72b41b015975ba5980c4ddb41f1975b83e19031063", size = 55128632, upload-time = "2026-03-31T18:28:19.946Z" }, + { url = "https://files.pythonhosted.org/packages/df/f8/5e12e9ed447d65f04acf6fcf2d79cded2355640b5131a46cee4c99a5949d/llvmlite-0.47.0-cp310-cp310-win_amd64.whl", hash = "sha256:166b896a2262a2039d5fc52df5ee1659bd1ccd081183df7a2fba1b74702dd5ea", size = 38138402, upload-time = "2026-03-31T18:28:23.327Z" }, + { url = "https://files.pythonhosted.org/packages/34/0b/b9d1911cfefa61399821dfb37f486d83e0f42630a8d12f7194270c417002/llvmlite-0.47.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:74090f0dcfd6f24ebbef3f21f11e38111c4d7e6919b54c4416e1e357c3446b07", size = 37232770, upload-time = "2026-03-31T18:28:26.765Z" }, + { url = "https://files.pythonhosted.org/packages/46/27/5799b020e4cdfb25a7c951c06a96397c135efcdc21b78d853bbd9c814c7d/llvmlite-0.47.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ca14f02e29134e837982497959a8e2193d6035235de1cb41a9cb2bd6da4eedbb", size = 56275177, upload-time = "2026-03-31T18:28:31.01Z" }, + { url = "https://files.pythonhosted.org/packages/7e/51/48a53fedf01cb1f3f43ef200be17ebf83c8d9a04018d3783c1a226c342c2/llvmlite-0.47.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:12a69d4bb05f402f30477e21eeabe81911e7c251cecb192bed82cd83c9db10d8", size = 55128631, upload-time = "2026-03-31T18:28:36.046Z" }, + { url = "https://files.pythonhosted.org/packages/a2/50/59227d06bdc96e23322713c381af4e77420949d8cd8a042c79e0043096cc/llvmlite-0.47.0-cp311-cp311-win_amd64.whl", hash = "sha256:c37d6eb7aaabfa83ab9c2ff5b5cdb95a5e6830403937b2c588b7490724e05327", size = 38138400, upload-time = "2026-03-31T18:28:40.076Z" }, + { url = "https://files.pythonhosted.org/packages/fa/48/4b7fe0e34c169fa2f12532916133e0b219d2823b540733651b34fdac509a/llvmlite-0.47.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:306a265f408c259067257a732c8e159284334018b4083a9e35f67d19792b164f", size = 37232769, upload-time = "2026-03-31T18:28:43.735Z" }, + { url = "https://files.pythonhosted.org/packages/e6/4b/e3f2cd17822cf772a4a51a0a8080b0032e6d37b2dbe8cfb724eac4e31c52/llvmlite-0.47.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5853bf26160857c0c2573415ff4efe01c4c651e59e2c55c2a088740acfee51cd", size = 56275178, upload-time = "2026-03-31T18:28:48.342Z" }, + { url = "https://files.pythonhosted.org/packages/b6/55/a3b4a543185305a9bdf3d9759d53646ed96e55e7dfd43f53e7a421b8fbae/llvmlite-0.47.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:003bcf7fa579e14db59c1a1e113f93ab8a06b56a4be31c7f08264d1d4072d077", size = 55128632, upload-time = "2026-03-31T18:28:52.901Z" }, + { url = "https://files.pythonhosted.org/packages/2f/f5/d281ae0f79378a5a91f308ea9fdb9f9cc068fddd09629edc0725a5a8fde1/llvmlite-0.47.0-cp312-cp312-win_amd64.whl", hash = "sha256:f3079f25bdc24cd9d27c4b2b5e68f5f60c4fdb7e8ad5ee2b9b006007558f9df7", size = 38138692, upload-time = "2026-03-31T18:28:57.147Z" }, + { url = "https://files.pythonhosted.org/packages/77/6f/4615353e016799f80fa52ccb270a843c413b22361fadda2589b2922fb9b0/llvmlite-0.47.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:a3c6a735d4e1041808434f9d440faa3d78d9b4af2ee64d05a66f351883b6ceec", size = 37232771, upload-time = "2026-03-31T18:29:01.324Z" }, + { url = "https://files.pythonhosted.org/packages/31/b8/69f5565f1a280d032525878a86511eebed0645818492feeb169dfb20ae8e/llvmlite-0.47.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2699a74321189e812d476a43d6d7f652f51811e7b5aad9d9bba842a1c7927acb", size = 56275178, upload-time = "2026-03-31T18:29:05.748Z" }, + { url = "https://files.pythonhosted.org/packages/d6/da/b32cafcb926fb0ce2aa25553bf32cb8764af31438f40e2481df08884c947/llvmlite-0.47.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6c6951e2b29930227963e53ee152441f0e14be92e9d4231852102d986c761e40", size = 55128632, upload-time = "2026-03-31T18:29:11.235Z" }, + { url = "https://files.pythonhosted.org/packages/46/9f/4898b44e4042c60fafcb1162dfb7014f6f15b1ec19bf29cfea6bf26df90d/llvmlite-0.47.0-cp313-cp313-win_amd64.whl", hash = "sha256:c2e9adf8698d813a9a5efb2d4370caf344dbc1e145019851fee6a6f319ba760e", size = 38138695, upload-time = "2026-03-31T18:29:15.43Z" }, + { url = "https://files.pythonhosted.org/packages/1c/d4/33c8af00f0bf6f552d74f3a054f648af2c5bc6bece97972f3bfadce4f5ec/llvmlite-0.47.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:de966c626c35c9dff5ae7bf12db25637738d0df83fc370cf793bc94d43d92d14", size = 37232773, upload-time = "2026-03-31T18:29:19.453Z" }, + { url = "https://files.pythonhosted.org/packages/64/1d/a760e993e0c0ba6db38d46b9f48f6c7dceb8ac838824997fb9e25f97bc04/llvmlite-0.47.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ddbccff2aeaff8670368340a158abefc032fe9b3ccf7d9c496639263d00151aa", size = 56275176, upload-time = "2026-03-31T18:29:24.149Z" }, + { url = "https://files.pythonhosted.org/packages/84/3b/e679bc3b29127182a7f4aa2d2e9e5bea42adb93fb840484147d59c236299/llvmlite-0.47.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4a7b778a2e144fc64468fb9bf509ac1226c9813a00b4d7afea5d988c4e22fca", size = 55128631, upload-time = "2026-03-31T18:29:29.536Z" }, + { url = "https://files.pythonhosted.org/packages/be/f7/19e2a09c62809c9e63bbd14ce71fb92c6ff7b7b3045741bb00c781efc3c9/llvmlite-0.47.0-cp314-cp314-win_amd64.whl", hash = "sha256:694e3c2cdc472ed2bd8bd4555ca002eec4310961dd58ef791d508f57b5cc4c94", size = 39153826, upload-time = "2026-03-31T18:29:33.681Z" }, + { url = "https://files.pythonhosted.org/packages/40/a1/581a8c707b5e80efdbbe1dd94527404d33fe50bceb71f39d5a7e11bd57b7/llvmlite-0.47.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:92ec8a169a20b473c1c54d4695e371bde36489fc1efa3688e11e99beba0abf9c", size = 37232772, upload-time = "2026-03-31T18:29:37.952Z" }, + { url = "https://files.pythonhosted.org/packages/11/03/16090dd6f74ba2b8b922276047f15962fbeea0a75d5601607edb301ba945/llvmlite-0.47.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fa1cbd800edd3b20bc141521f7fd45a6185a5b84109aa6855134e81397ffe72b", size = 56275178, upload-time = "2026-03-31T18:29:42.58Z" }, + { url = "https://files.pythonhosted.org/packages/f5/cb/0abf1dd4c5286a95ffe0c1d8c67aec06b515894a0dd2ac97f5e27b82ab0b/llvmlite-0.47.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f6725179b89f03b17dabe236ff3422cb8291b4c1bf40af152826dfd34e350ae8", size = 55128632, upload-time = "2026-03-31T18:29:46.939Z" }, + { url = "https://files.pythonhosted.org/packages/4f/79/d3bbab197e86e0ff4f9c07122895b66a3e0d024247fcff7f12c473cb36d9/llvmlite-0.47.0-cp314-cp314t-win_amd64.whl", hash = "sha256:6842cf6f707ec4be3d985a385ad03f72b2d724439e118fcbe99b2929964f0453", size = 39153839, upload-time = "2026-03-31T18:29:51.004Z" }, ] [[package]] @@ -1870,29 +1898,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl", hash = "sha256:d56ce5156ba6085e00a9d54fead6ed29a9c47e215cd1bba2e976ef39f5710a76", size = 9516, upload-time = "2025-10-23T09:00:20.675Z" }, ] -[[package]] -name = "mdurl" -version = "0.1.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, -] - [[package]] name = "miette-py" source = { editable = "miette-py" } [[package]] name = "mistune" -version = "3.2.0" +version = "3.2.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9d/55/d01f0c4b45ade6536c51170b9043db8b2ec6ddf4a35c7ea3f5f559ac935b/mistune-3.2.0.tar.gz", hash = "sha256:708487c8a8cdd99c9d90eb3ed4c3ed961246ff78ac82f03418f5183ab70e398a", size = 95467, upload-time = "2025-12-23T11:36:34.994Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ca/84/620cc3f7e3adf6f5067e10f4dbae71295d8f9e16d5d3f9ef97c40f2f592c/mistune-3.2.1.tar.gz", hash = "sha256:7c8e5501d38bac1582e067e46c8343f17d57ea1aaa735823f3aba1fd59c88a28", size = 98003, upload-time = "2026-05-03T14:33:22.312Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl", hash = "sha256:febdc629a3c78616b94393c6580551e0e34cc289987ec6c35ed3f4be42d0eee1", size = 53598, upload-time = "2025-12-23T11:36:33.211Z" }, + { url = "https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl", hash = "sha256:78cdb0ba5e938053ccf63651b352508d2efa9411dc8810bfb05f2dc5140c0048", size = 53749, upload-time = "2026-05-03T14:33:20.551Z" }, ] [[package]] @@ -2059,7 +2078,8 @@ name = "networkx" version = "3.4.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version < '3.11'", + "python_full_version < '3.11' and platform_machine == 'x86_64' and sys_platform == 'darwin'", + "(python_full_version < '3.11' and platform_machine != 'x86_64') or (python_full_version < '3.11' and sys_platform != 'darwin')", ] sdist = { url = "https://files.pythonhosted.org/packages/fd/1d/06475e1cd5264c0b870ea2cc6fdb3e37177c1e565c43f56ff17a10e3937f/networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1", size = 2151368, upload-time = "2024-10-21T12:39:38.695Z" } wheels = [ @@ -2071,10 +2091,12 @@ name = "networkx" version = "3.6.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.15'", - "python_full_version == '3.14.*'", - "python_full_version >= '3.12' and python_full_version < '3.14'", - "python_full_version == '3.11.*'", + "python_full_version >= '3.15' and platform_machine == 'x86_64' and sys_platform == 'darwin'", + "(python_full_version >= '3.15' and platform_machine != 'x86_64') or (python_full_version >= '3.15' and sys_platform != 'darwin')", + "python_full_version == '3.14.*' and platform_machine == 'x86_64' and sys_platform == 'darwin'", + "python_full_version >= '3.11' and python_full_version < '3.14' and platform_machine == 'x86_64' and sys_platform == 'darwin'", + "(python_full_version == '3.14.*' and platform_machine != 'x86_64') or (python_full_version == '3.14.*' and sys_platform != 'darwin')", + "(python_full_version >= '3.11' and python_full_version < '3.14' and platform_machine != 'x86_64') or (python_full_version >= '3.11' and python_full_version < '3.14' and sys_platform != 'darwin')", ] sdist = { url = "https://files.pythonhosted.org/packages/6a/51/63fe664f3908c97be9d2e4f1158eb633317598cfa6e1fc14af5383f17512/networkx-3.6.1.tar.gz", hash = "sha256:26b7c357accc0c8cde558ad486283728b65b6a95d85ee1cd66bafab4c8168509", size = 2517025, upload-time = "2025-12-08T17:02:39.908Z" } wheels = [ @@ -2095,7 +2117,8 @@ name = "numpy" version = "2.2.6" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version < '3.11'", + "python_full_version < '3.11' and platform_machine == 'x86_64' and sys_platform == 'darwin'", + "(python_full_version < '3.11' and platform_machine != 'x86_64') or (python_full_version < '3.11' and sys_platform != 'darwin')", ] sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } wheels = [ @@ -2160,10 +2183,12 @@ name = "numpy" version = "2.4.4" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.15'", - "python_full_version == '3.14.*'", - "python_full_version >= '3.12' and python_full_version < '3.14'", - "python_full_version == '3.11.*'", + "python_full_version >= '3.15' and platform_machine == 'x86_64' and sys_platform == 'darwin'", + "(python_full_version >= '3.15' and platform_machine != 'x86_64') or (python_full_version >= '3.15' and sys_platform != 'darwin')", + "python_full_version == '3.14.*' and platform_machine == 'x86_64' and sys_platform == 'darwin'", + "python_full_version >= '3.11' and python_full_version < '3.14' and platform_machine == 'x86_64' and sys_platform == 'darwin'", + "(python_full_version == '3.14.*' and platform_machine != 'x86_64') or (python_full_version == '3.14.*' and sys_platform != 'darwin')", + "(python_full_version >= '3.11' and python_full_version < '3.14' and platform_machine != 'x86_64') or (python_full_version >= '3.11' and python_full_version < '3.14' and sys_platform != 'darwin')", ] sdist = { url = "https://files.pythonhosted.org/packages/d7/9f/b8cef5bffa569759033adda9481211426f12f53299629b410340795c2514/numpy-2.4.4.tar.gz", hash = "sha256:2d390634c5182175533585cc89f3608a4682ccb173cc9bb940b2881c8d6f8fa0", size = 20731587, upload-time = "2026-03-29T13:22:01.298Z" } wheels = [ @@ -2251,11 +2276,11 @@ wheels = [ [[package]] name = "packaging" -version = "26.0" +version = "26.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/65/ee/299d360cdc32edc7d2cf530f3accf79c4fca01e96ffc950d8a52213bd8e4/packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", size = 143416, upload-time = "2026-01-21T20:50:39.064Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366, upload-time = "2026-01-21T20:50:37.788Z" }, + { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, ] [[package]] @@ -2269,20 +2294,20 @@ wheels = [ [[package]] name = "parso" -version = "0.8.6" +version = "0.8.7" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/81/76/a1e769043c0c0c9fe391b702539d594731a4362334cdf4dc25d0c09761e7/parso-0.8.6.tar.gz", hash = "sha256:2b9a0332696df97d454fa67b81618fd69c35a7b90327cbe6ba5c92d2c68a7bfd", size = 401621, upload-time = "2026-02-09T15:45:24.425Z" } +sdist = { url = "https://files.pythonhosted.org/packages/30/4b/90c937815137d43ce71ba043cd3566221e9df6b9c805f24b5d138c9d40a7/parso-0.8.7.tar.gz", hash = "sha256:eaaac4c9fdd5e9e8852dc778d2d7405897ec510f2a298071453e5e3a07914bb1", size = 401824, upload-time = "2026-05-01T23:13:02.138Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl", hash = "sha256:2c549f800b70a5c4952197248825584cb00f033b29c692671d3bf08bf380baff", size = 106894, upload-time = "2026-02-09T15:45:21.391Z" }, + { url = "https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl", hash = "sha256:a8926eb2a1b915486941fdbd31e86a4baf88fe8c210f25f2f35ecec5b574ca1c", size = 107025, upload-time = "2026-05-01T23:12:58.867Z" }, ] [[package]] name = "pathspec" -version = "1.0.4" +version = "1.1.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fa/36/e27608899f9b8d4dff0617b2d9ab17ca5608956ca44461ac14ac48b44015/pathspec-1.0.4.tar.gz", hash = "sha256:0210e2ae8a21a9137c0d470578cb0e595af87edaa6ebf12ff176f14a02e0e645", size = 131200, upload-time = "2026-01-27T03:59:46.938Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/82/42f767fc1c1143d6fd36efb827202a2d997a375e160a71eb2888a925aac1/pathspec-1.1.1.tar.gz", hash = "sha256:17db5ecd524104a120e173814c90367a96a98d07c45b2e10c2f3919fff91bf5a", size = 135180, upload-time = "2026-04-27T01:46:08.907Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl", hash = "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723", size = 55206, upload-time = "2026-01-27T03:59:45.137Z" }, + { url = "https://files.pythonhosted.org/packages/f1/d9/7fb5aa316bc299258e68c73ba3bddbc499654a07f151cba08f6153988714/pathspec-1.1.1-py3-none-any.whl", hash = "sha256:a00ce642f577bf7f473932318056212bc4f8bfdf53128c78bbd5af0b9b20b189", size = 57328, upload-time = "2026-04-27T01:46:07.06Z" }, ] [[package]] @@ -2397,11 +2422,11 @@ wheels = [ [[package]] name = "platformdirs" -version = "4.9.4" +version = "4.9.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/19/56/8d4c30c8a1d07013911a8fdbd8f89440ef9f08d07a1b50ab8ca8be5a20f9/platformdirs-4.9.4.tar.gz", hash = "sha256:1ec356301b7dc906d83f371c8f487070e99d3ccf9e501686456394622a01a934", size = 28737, upload-time = "2026-03-05T18:34:13.271Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9f/4a/0883b8e3802965322523f0b200ecf33d31f10991d0401162f4b23c698b42/platformdirs-4.9.6.tar.gz", hash = "sha256:3bfa75b0ad0db84096ae777218481852c0ebc6c727b3168c1b9e0118e458cf0a", size = 29400, upload-time = "2026-04-09T00:04:10.812Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl", hash = "sha256:68a9a4619a666ea6439f2ff250c12a853cd1cbd5158d258bd824a7df6be2f868", size = 21216, upload-time = "2026-03-05T18:34:12.172Z" }, + { url = "https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl", hash = "sha256:e61adb1d5e5cb3441b4b7710bea7e4c12250ca49439228cc1021c00dcfac0917", size = 21348, upload-time = "2026-04-09T00:04:09.463Z" }, ] [[package]] @@ -2431,11 +2456,11 @@ wheels = [ [[package]] name = "prometheus-client" -version = "0.24.1" +version = "0.25.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f0/58/a794d23feb6b00fc0c72787d7e87d872a6730dd9ed7c7b3e954637d8f280/prometheus_client-0.24.1.tar.gz", hash = "sha256:7e0ced7fbbd40f7b84962d5d2ab6f17ef88a72504dcf7c0b40737b43b2a461f9", size = 85616, upload-time = "2026-01-14T15:26:26.965Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/fb/d9aa83ffe43ce1f19e557c0971d04b90561b0cfd50762aafb01968285553/prometheus_client-0.25.0.tar.gz", hash = "sha256:5e373b75c31afb3c86f1a52fa1ad470c9aace18082d39ec0d2f918d11cc9ba28", size = 86035, upload-time = "2026-04-09T19:53:42.359Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/74/c3/24a2f845e3917201628ecaba4f18bab4d18a337834c1df2a159ee9d22a42/prometheus_client-0.24.1-py3-none-any.whl", hash = "sha256:150db128af71a5c2482b36e588fc8a6b95e498750da4b17065947c16070f4055", size = 64057, upload-time = "2026-01-14T15:26:24.42Z" }, + { url = "https://files.pythonhosted.org/packages/8d/9b/d4b1e644385499c8346fa9b622a3f030dce14cd6ef8a1871c221a17a67e7/prometheus_client-0.25.0-py3-none-any.whl", hash = "sha256:d5aec89e349a6ec230805d0df882f3807f74fd6c1a2fa86864e3c2279059fed1", size = 64154, upload-time = "2026-04-09T19:53:41.324Z" }, ] [[package]] @@ -2516,7 +2541,7 @@ wheels = [ [[package]] name = "pydantic" -version = "2.12.5" +version = "2.13.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, @@ -2524,140 +2549,138 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/69/44/36f1a6e523abc58ae5f928898e4aca2e0ea509b5aa6f6f392a5d882be928/pydantic-2.12.5.tar.gz", hash = "sha256:4d351024c75c0f085a9febbb665ce8c0c6ec5d30e903bdb6394b7ede26aebb49", size = 821591, upload-time = "2025-11-26T15:11:46.471Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d9/e4/40d09941a2cebcb20609b86a559817d5b9291c49dd6f8c87e5feffbe703a/pydantic-2.13.3.tar.gz", hash = "sha256:af09e9d1d09f4e7fe37145c1f577e1d61ceb9a41924bf0094a36506285d0a84d", size = 844068, upload-time = "2026-04-20T14:46:43.632Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl", hash = "sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d", size = 463580, upload-time = "2025-11-26T15:11:44.605Z" }, + { url = "https://files.pythonhosted.org/packages/f3/0a/fd7d723f8f8153418fb40cf9c940e82004fce7e987026b08a68a36dd3fe7/pydantic-2.13.3-py3-none-any.whl", hash = "sha256:6db14ac8dfc9a1e57f87ea2c0de670c251240f43cb0c30a5130e9720dc612927", size = 471981, upload-time = "2026-04-20T14:46:41.402Z" }, ] [[package]] name = "pydantic-core" -version = "2.41.5" +version = "2.46.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/71/70/23b021c950c2addd24ec408e9ab05d59b035b39d97cdc1130e1bce647bb6/pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e", size = 460952, upload-time = "2025-11-04T13:43:49.098Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c6/90/32c9941e728d564b411d574d8ee0cf09b12ec978cb22b294995bae5549a5/pydantic_core-2.41.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:77b63866ca88d804225eaa4af3e664c5faf3568cea95360d21f4725ab6e07146", size = 2107298, upload-time = "2025-11-04T13:39:04.116Z" }, - { url = "https://files.pythonhosted.org/packages/fb/a8/61c96a77fe28993d9a6fb0f4127e05430a267b235a124545d79fea46dd65/pydantic_core-2.41.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dfa8a0c812ac681395907e71e1274819dec685fec28273a28905df579ef137e2", size = 1901475, upload-time = "2025-11-04T13:39:06.055Z" }, - { url = "https://files.pythonhosted.org/packages/5d/b6/338abf60225acc18cdc08b4faef592d0310923d19a87fba1faf05af5346e/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5921a4d3ca3aee735d9fd163808f5e8dd6c6972101e4adbda9a4667908849b97", size = 1918815, upload-time = "2025-11-04T13:39:10.41Z" }, - { url = "https://files.pythonhosted.org/packages/d1/1c/2ed0433e682983d8e8cba9c8d8ef274d4791ec6a6f24c58935b90e780e0a/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e25c479382d26a2a41b7ebea1043564a937db462816ea07afa8a44c0866d52f9", size = 2065567, upload-time = "2025-11-04T13:39:12.244Z" }, - { url = "https://files.pythonhosted.org/packages/b3/24/cf84974ee7d6eae06b9e63289b7b8f6549d416b5c199ca2d7ce13bbcf619/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f547144f2966e1e16ae626d8ce72b4cfa0caedc7fa28052001c94fb2fcaa1c52", size = 2230442, upload-time = "2025-11-04T13:39:13.962Z" }, - { url = "https://files.pythonhosted.org/packages/fd/21/4e287865504b3edc0136c89c9c09431be326168b1eb7841911cbc877a995/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f52298fbd394f9ed112d56f3d11aabd0d5bd27beb3084cc3d8ad069483b8941", size = 2350956, upload-time = "2025-11-04T13:39:15.889Z" }, - { url = "https://files.pythonhosted.org/packages/a8/76/7727ef2ffa4b62fcab916686a68a0426b9b790139720e1934e8ba797e238/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:100baa204bb412b74fe285fb0f3a385256dad1d1879f0a5cb1499ed2e83d132a", size = 2068253, upload-time = "2025-11-04T13:39:17.403Z" }, - { url = "https://files.pythonhosted.org/packages/d5/8c/a4abfc79604bcb4c748e18975c44f94f756f08fb04218d5cb87eb0d3a63e/pydantic_core-2.41.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:05a2c8852530ad2812cb7914dc61a1125dc4e06252ee98e5638a12da6cc6fb6c", size = 2177050, upload-time = "2025-11-04T13:39:19.351Z" }, - { url = "https://files.pythonhosted.org/packages/67/b1/de2e9a9a79b480f9cb0b6e8b6ba4c50b18d4e89852426364c66aa82bb7b3/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:29452c56df2ed968d18d7e21f4ab0ac55e71dc59524872f6fc57dcf4a3249ed2", size = 2147178, upload-time = "2025-11-04T13:39:21Z" }, - { url = "https://files.pythonhosted.org/packages/16/c1/dfb33f837a47b20417500efaa0378adc6635b3c79e8369ff7a03c494b4ac/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:d5160812ea7a8a2ffbe233d8da666880cad0cbaf5d4de74ae15c313213d62556", size = 2341833, upload-time = "2025-11-04T13:39:22.606Z" }, - { url = "https://files.pythonhosted.org/packages/47/36/00f398642a0f4b815a9a558c4f1dca1b4020a7d49562807d7bc9ff279a6c/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:df3959765b553b9440adfd3c795617c352154e497a4eaf3752555cfb5da8fc49", size = 2321156, upload-time = "2025-11-04T13:39:25.843Z" }, - { url = "https://files.pythonhosted.org/packages/7e/70/cad3acd89fde2010807354d978725ae111ddf6d0ea46d1ea1775b5c1bd0c/pydantic_core-2.41.5-cp310-cp310-win32.whl", hash = "sha256:1f8d33a7f4d5a7889e60dc39856d76d09333d8a6ed0f5f1190635cbec70ec4ba", size = 1989378, upload-time = "2025-11-04T13:39:27.92Z" }, - { url = "https://files.pythonhosted.org/packages/76/92/d338652464c6c367e5608e4488201702cd1cbb0f33f7b6a85a60fe5f3720/pydantic_core-2.41.5-cp310-cp310-win_amd64.whl", hash = "sha256:62de39db01b8d593e45871af2af9e497295db8d73b085f6bfd0b18c83c70a8f9", size = 2013622, upload-time = "2025-11-04T13:39:29.848Z" }, - { url = "https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a3a52f6156e73e7ccb0f8cced536adccb7042be67cb45f9562e12b319c119da6", size = 2105873, upload-time = "2025-11-04T13:39:31.373Z" }, - { url = "https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7f3bf998340c6d4b0c9a2f02d6a400e51f123b59565d74dc60d252ce888c260b", size = 1899826, upload-time = "2025-11-04T13:39:32.897Z" }, - { url = "https://files.pythonhosted.org/packages/33/7f/1d5cab3ccf44c1935a359d51a8a2a9e1a654b744b5e7f80d41b88d501eec/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:378bec5c66998815d224c9ca994f1e14c0c21cb95d2f52b6021cc0b2a58f2a5a", size = 1917869, upload-time = "2025-11-04T13:39:34.469Z" }, - { url = "https://files.pythonhosted.org/packages/6e/6a/30d94a9674a7fe4f4744052ed6c5e083424510be1e93da5bc47569d11810/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7b576130c69225432866fe2f4a469a85a54ade141d96fd396dffcf607b558f8", size = 2063890, upload-time = "2025-11-04T13:39:36.053Z" }, - { url = "https://files.pythonhosted.org/packages/50/be/76e5d46203fcb2750e542f32e6c371ffa9b8ad17364cf94bb0818dbfb50c/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6cb58b9c66f7e4179a2d5e0f849c48eff5c1fca560994d6eb6543abf955a149e", size = 2229740, upload-time = "2025-11-04T13:39:37.753Z" }, - { url = "https://files.pythonhosted.org/packages/d3/ee/fed784df0144793489f87db310a6bbf8118d7b630ed07aa180d6067e653a/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88942d3a3dff3afc8288c21e565e476fc278902ae4d6d134f1eeda118cc830b1", size = 2350021, upload-time = "2025-11-04T13:39:40.94Z" }, - { url = "https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f31d95a179f8d64d90f6831d71fa93290893a33148d890ba15de25642c5d075b", size = 2066378, upload-time = "2025-11-04T13:39:42.523Z" }, - { url = "https://files.pythonhosted.org/packages/b0/3b/698cf8ae1d536a010e05121b4958b1257f0b5522085e335360e53a6b1c8b/pydantic_core-2.41.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c1df3d34aced70add6f867a8cf413e299177e0c22660cc767218373d0779487b", size = 2175761, upload-time = "2025-11-04T13:39:44.553Z" }, - { url = "https://files.pythonhosted.org/packages/b8/ba/15d537423939553116dea94ce02f9c31be0fa9d0b806d427e0308ec17145/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4009935984bd36bd2c774e13f9a09563ce8de4abaa7226f5108262fa3e637284", size = 2146303, upload-time = "2025-11-04T13:39:46.238Z" }, - { url = "https://files.pythonhosted.org/packages/58/7f/0de669bf37d206723795f9c90c82966726a2ab06c336deba4735b55af431/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:34a64bc3441dc1213096a20fe27e8e128bd3ff89921706e83c0b1ac971276594", size = 2340355, upload-time = "2025-11-04T13:39:48.002Z" }, - { url = "https://files.pythonhosted.org/packages/e5/de/e7482c435b83d7e3c3ee5ee4451f6e8973cff0eb6007d2872ce6383f6398/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c9e19dd6e28fdcaa5a1de679aec4141f691023916427ef9bae8584f9c2fb3b0e", size = 2319875, upload-time = "2025-11-04T13:39:49.705Z" }, - { url = "https://files.pythonhosted.org/packages/fe/e6/8c9e81bb6dd7560e33b9053351c29f30c8194b72f2d6932888581f503482/pydantic_core-2.41.5-cp311-cp311-win32.whl", hash = "sha256:2c010c6ded393148374c0f6f0bf89d206bf3217f201faa0635dcd56bd1520f6b", size = 1987549, upload-time = "2025-11-04T13:39:51.842Z" }, - { url = "https://files.pythonhosted.org/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl", hash = "sha256:76ee27c6e9c7f16f47db7a94157112a2f3a00e958bc626e2f4ee8bec5c328fbe", size = 2011305, upload-time = "2025-11-04T13:39:53.485Z" }, - { url = "https://files.pythonhosted.org/packages/56/d8/0e271434e8efd03186c5386671328154ee349ff0354d83c74f5caaf096ed/pydantic_core-2.41.5-cp311-cp311-win_arm64.whl", hash = "sha256:4bc36bbc0b7584de96561184ad7f012478987882ebf9f9c389b23f432ea3d90f", size = 1972902, upload-time = "2025-11-04T13:39:56.488Z" }, - { url = "https://files.pythonhosted.org/packages/5f/5d/5f6c63eebb5afee93bcaae4ce9a898f3373ca23df3ccaef086d0233a35a7/pydantic_core-2.41.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f41a7489d32336dbf2199c8c0a215390a751c5b014c2c1c5366e817202e9cdf7", size = 2110990, upload-time = "2025-11-04T13:39:58.079Z" }, - { url = "https://files.pythonhosted.org/packages/aa/32/9c2e8ccb57c01111e0fd091f236c7b371c1bccea0fa85247ac55b1e2b6b6/pydantic_core-2.41.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0", size = 1896003, upload-time = "2025-11-04T13:39:59.956Z" }, - { url = "https://files.pythonhosted.org/packages/68/b8/a01b53cb0e59139fbc9e4fda3e9724ede8de279097179be4ff31f1abb65a/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69", size = 1919200, upload-time = "2025-11-04T13:40:02.241Z" }, - { url = "https://files.pythonhosted.org/packages/38/de/8c36b5198a29bdaade07b5985e80a233a5ac27137846f3bc2d3b40a47360/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed2e99c456e3fadd05c991f8f437ef902e00eedf34320ba2b0842bd1c3ca3a75", size = 2052578, upload-time = "2025-11-04T13:40:04.401Z" }, - { url = "https://files.pythonhosted.org/packages/00/b5/0e8e4b5b081eac6cb3dbb7e60a65907549a1ce035a724368c330112adfdd/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65840751b72fbfd82c3c640cff9284545342a4f1eb1586ad0636955b261b0b05", size = 2208504, upload-time = "2025-11-04T13:40:06.072Z" }, - { url = "https://files.pythonhosted.org/packages/77/56/87a61aad59c7c5b9dc8caad5a41a5545cba3810c3e828708b3d7404f6cef/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e536c98a7626a98feb2d3eaf75944ef6f3dbee447e1f841eae16f2f0a72d8ddc", size = 2335816, upload-time = "2025-11-04T13:40:07.835Z" }, - { url = "https://files.pythonhosted.org/packages/0d/76/941cc9f73529988688a665a5c0ecff1112b3d95ab48f81db5f7606f522d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eceb81a8d74f9267ef4081e246ffd6d129da5d87e37a77c9bde550cb04870c1c", size = 2075366, upload-time = "2025-11-04T13:40:09.804Z" }, - { url = "https://files.pythonhosted.org/packages/d3/43/ebef01f69baa07a482844faaa0a591bad1ef129253ffd0cdaa9d8a7f72d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d38548150c39b74aeeb0ce8ee1d8e82696f4a4e16ddc6de7b1d8823f7de4b9b5", size = 2171698, upload-time = "2025-11-04T13:40:12.004Z" }, - { url = "https://files.pythonhosted.org/packages/b1/87/41f3202e4193e3bacfc2c065fab7706ebe81af46a83d3e27605029c1f5a6/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c23e27686783f60290e36827f9c626e63154b82b116d7fe9adba1fda36da706c", size = 2132603, upload-time = "2025-11-04T13:40:13.868Z" }, - { url = "https://files.pythonhosted.org/packages/49/7d/4c00df99cb12070b6bccdef4a195255e6020a550d572768d92cc54dba91a/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:482c982f814460eabe1d3bb0adfdc583387bd4691ef00b90575ca0d2b6fe2294", size = 2329591, upload-time = "2025-11-04T13:40:15.672Z" }, - { url = "https://files.pythonhosted.org/packages/cc/6a/ebf4b1d65d458f3cda6a7335d141305dfa19bdc61140a884d165a8a1bbc7/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bfea2a5f0b4d8d43adf9d7b8bf019fb46fdd10a2e5cde477fbcb9d1fa08c68e1", size = 2319068, upload-time = "2025-11-04T13:40:17.532Z" }, - { url = "https://files.pythonhosted.org/packages/49/3b/774f2b5cd4192d5ab75870ce4381fd89cf218af999515baf07e7206753f0/pydantic_core-2.41.5-cp312-cp312-win32.whl", hash = "sha256:b74557b16e390ec12dca509bce9264c3bbd128f8a2c376eaa68003d7f327276d", size = 1985908, upload-time = "2025-11-04T13:40:19.309Z" }, - { url = "https://files.pythonhosted.org/packages/86/45/00173a033c801cacf67c190fef088789394feaf88a98a7035b0e40d53dc9/pydantic_core-2.41.5-cp312-cp312-win_amd64.whl", hash = "sha256:1962293292865bca8e54702b08a4f26da73adc83dd1fcf26fbc875b35d81c815", size = 2020145, upload-time = "2025-11-04T13:40:21.548Z" }, - { url = "https://files.pythonhosted.org/packages/f9/22/91fbc821fa6d261b376a3f73809f907cec5ca6025642c463d3488aad22fb/pydantic_core-2.41.5-cp312-cp312-win_arm64.whl", hash = "sha256:1746d4a3d9a794cacae06a5eaaccb4b8643a131d45fbc9af23e353dc0a5ba5c3", size = 1976179, upload-time = "2025-11-04T13:40:23.393Z" }, - { url = "https://files.pythonhosted.org/packages/87/06/8806241ff1f70d9939f9af039c6c35f2360cf16e93c2ca76f184e76b1564/pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:941103c9be18ac8daf7b7adca8228f8ed6bb7a1849020f643b3a14d15b1924d9", size = 2120403, upload-time = "2025-11-04T13:40:25.248Z" }, - { url = "https://files.pythonhosted.org/packages/94/02/abfa0e0bda67faa65fef1c84971c7e45928e108fe24333c81f3bfe35d5f5/pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34", size = 1896206, upload-time = "2025-11-04T13:40:27.099Z" }, - { url = "https://files.pythonhosted.org/packages/15/df/a4c740c0943e93e6500f9eb23f4ca7ec9bf71b19e608ae5b579678c8d02f/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbaad15cb0c90aa221d43c00e77bb33c93e8d36e0bf74760cd00e732d10a6a0", size = 1919307, upload-time = "2025-11-04T13:40:29.806Z" }, - { url = "https://files.pythonhosted.org/packages/9a/e3/6324802931ae1d123528988e0e86587c2072ac2e5394b4bc2bc34b61ff6e/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:03ca43e12fab6023fc79d28ca6b39b05f794ad08ec2feccc59a339b02f2b3d33", size = 2063258, upload-time = "2025-11-04T13:40:33.544Z" }, - { url = "https://files.pythonhosted.org/packages/c9/d4/2230d7151d4957dd79c3044ea26346c148c98fbf0ee6ebd41056f2d62ab5/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc799088c08fa04e43144b164feb0c13f9a0bc40503f8df3e9fde58a3c0c101e", size = 2214917, upload-time = "2025-11-04T13:40:35.479Z" }, - { url = "https://files.pythonhosted.org/packages/e6/9f/eaac5df17a3672fef0081b6c1bb0b82b33ee89aa5cec0d7b05f52fd4a1fa/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97aeba56665b4c3235a0e52b2c2f5ae9cd071b8a8310ad27bddb3f7fb30e9aa2", size = 2332186, upload-time = "2025-11-04T13:40:37.436Z" }, - { url = "https://files.pythonhosted.org/packages/cf/4e/35a80cae583a37cf15604b44240e45c05e04e86f9cfd766623149297e971/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586", size = 2073164, upload-time = "2025-11-04T13:40:40.289Z" }, - { url = "https://files.pythonhosted.org/packages/bf/e3/f6e262673c6140dd3305d144d032f7bd5f7497d3871c1428521f19f9efa2/pydantic_core-2.41.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b93590ae81f7010dbe380cdeab6f515902ebcbefe0b9327cc4804d74e93ae69d", size = 2179146, upload-time = "2025-11-04T13:40:42.809Z" }, - { url = "https://files.pythonhosted.org/packages/75/c7/20bd7fc05f0c6ea2056a4565c6f36f8968c0924f19b7d97bbfea55780e73/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:01a3d0ab748ee531f4ea6c3e48ad9dac84ddba4b0d82291f87248f2f9de8d740", size = 2137788, upload-time = "2025-11-04T13:40:44.752Z" }, - { url = "https://files.pythonhosted.org/packages/3a/8d/34318ef985c45196e004bc46c6eab2eda437e744c124ef0dbe1ff2c9d06b/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:6561e94ba9dacc9c61bce40e2d6bdc3bfaa0259d3ff36ace3b1e6901936d2e3e", size = 2340133, upload-time = "2025-11-04T13:40:46.66Z" }, - { url = "https://files.pythonhosted.org/packages/9c/59/013626bf8c78a5a5d9350d12e7697d3d4de951a75565496abd40ccd46bee/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:915c3d10f81bec3a74fbd4faebe8391013ba61e5a1a8d48c4455b923bdda7858", size = 2324852, upload-time = "2025-11-04T13:40:48.575Z" }, - { url = "https://files.pythonhosted.org/packages/1a/d9/c248c103856f807ef70c18a4f986693a46a8ffe1602e5d361485da502d20/pydantic_core-2.41.5-cp313-cp313-win32.whl", hash = "sha256:650ae77860b45cfa6e2cdafc42618ceafab3a2d9a3811fcfbd3bbf8ac3c40d36", size = 1994679, upload-time = "2025-11-04T13:40:50.619Z" }, - { url = "https://files.pythonhosted.org/packages/9e/8b/341991b158ddab181cff136acd2552c9f35bd30380422a639c0671e99a91/pydantic_core-2.41.5-cp313-cp313-win_amd64.whl", hash = "sha256:79ec52ec461e99e13791ec6508c722742ad745571f234ea6255bed38c6480f11", size = 2019766, upload-time = "2025-11-04T13:40:52.631Z" }, - { url = "https://files.pythonhosted.org/packages/73/7d/f2f9db34af103bea3e09735bb40b021788a5e834c81eedb541991badf8f5/pydantic_core-2.41.5-cp313-cp313-win_arm64.whl", hash = "sha256:3f84d5c1b4ab906093bdc1ff10484838aca54ef08de4afa9de0f5f14d69639cd", size = 1981005, upload-time = "2025-11-04T13:40:54.734Z" }, - { url = "https://files.pythonhosted.org/packages/ea/28/46b7c5c9635ae96ea0fbb779e271a38129df2550f763937659ee6c5dbc65/pydantic_core-2.41.5-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:3f37a19d7ebcdd20b96485056ba9e8b304e27d9904d233d7b1015db320e51f0a", size = 2119622, upload-time = "2025-11-04T13:40:56.68Z" }, - { url = "https://files.pythonhosted.org/packages/74/1a/145646e5687e8d9a1e8d09acb278c8535ebe9e972e1f162ed338a622f193/pydantic_core-2.41.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1d1d9764366c73f996edd17abb6d9d7649a7eb690006ab6adbda117717099b14", size = 1891725, upload-time = "2025-11-04T13:40:58.807Z" }, - { url = "https://files.pythonhosted.org/packages/23/04/e89c29e267b8060b40dca97bfc64a19b2a3cf99018167ea1677d96368273/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25e1c2af0fce638d5f1988b686f3b3ea8cd7de5f244ca147c777769e798a9cd1", size = 1915040, upload-time = "2025-11-04T13:41:00.853Z" }, - { url = "https://files.pythonhosted.org/packages/84/a3/15a82ac7bd97992a82257f777b3583d3e84bdb06ba6858f745daa2ec8a85/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:506d766a8727beef16b7adaeb8ee6217c64fc813646b424d0804d67c16eddb66", size = 2063691, upload-time = "2025-11-04T13:41:03.504Z" }, - { url = "https://files.pythonhosted.org/packages/74/9b/0046701313c6ef08c0c1cf0e028c67c770a4e1275ca73131563c5f2a310a/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4819fa52133c9aa3c387b3328f25c1facc356491e6135b459f1de698ff64d869", size = 2213897, upload-time = "2025-11-04T13:41:05.804Z" }, - { url = "https://files.pythonhosted.org/packages/8a/cd/6bac76ecd1b27e75a95ca3a9a559c643b3afcd2dd62086d4b7a32a18b169/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b761d210c9ea91feda40d25b4efe82a1707da2ef62901466a42492c028553a2", size = 2333302, upload-time = "2025-11-04T13:41:07.809Z" }, - { url = "https://files.pythonhosted.org/packages/4c/d2/ef2074dc020dd6e109611a8be4449b98cd25e1b9b8a303c2f0fca2f2bcf7/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22f0fb8c1c583a3b6f24df2470833b40207e907b90c928cc8d3594b76f874375", size = 2064877, upload-time = "2025-11-04T13:41:09.827Z" }, - { url = "https://files.pythonhosted.org/packages/18/66/e9db17a9a763d72f03de903883c057b2592c09509ccfe468187f2a2eef29/pydantic_core-2.41.5-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2782c870e99878c634505236d81e5443092fba820f0373997ff75f90f68cd553", size = 2180680, upload-time = "2025-11-04T13:41:12.379Z" }, - { url = "https://files.pythonhosted.org/packages/d3/9e/3ce66cebb929f3ced22be85d4c2399b8e85b622db77dad36b73c5387f8f8/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:0177272f88ab8312479336e1d777f6b124537d47f2123f89cb37e0accea97f90", size = 2138960, upload-time = "2025-11-04T13:41:14.627Z" }, - { url = "https://files.pythonhosted.org/packages/a6/62/205a998f4327d2079326b01abee48e502ea739d174f0a89295c481a2272e/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:63510af5e38f8955b8ee5687740d6ebf7c2a0886d15a6d65c32814613681bc07", size = 2339102, upload-time = "2025-11-04T13:41:16.868Z" }, - { url = "https://files.pythonhosted.org/packages/3c/0d/f05e79471e889d74d3d88f5bd20d0ed189ad94c2423d81ff8d0000aab4ff/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:e56ba91f47764cc14f1daacd723e3e82d1a89d783f0f5afe9c364b8bb491ccdb", size = 2326039, upload-time = "2025-11-04T13:41:18.934Z" }, - { url = "https://files.pythonhosted.org/packages/ec/e1/e08a6208bb100da7e0c4b288eed624a703f4d129bde2da475721a80cab32/pydantic_core-2.41.5-cp314-cp314-win32.whl", hash = "sha256:aec5cf2fd867b4ff45b9959f8b20ea3993fc93e63c7363fe6851424c8a7e7c23", size = 1995126, upload-time = "2025-11-04T13:41:21.418Z" }, - { url = "https://files.pythonhosted.org/packages/48/5d/56ba7b24e9557f99c9237e29f5c09913c81eeb2f3217e40e922353668092/pydantic_core-2.41.5-cp314-cp314-win_amd64.whl", hash = "sha256:8e7c86f27c585ef37c35e56a96363ab8de4e549a95512445b85c96d3e2f7c1bf", size = 2015489, upload-time = "2025-11-04T13:41:24.076Z" }, - { url = "https://files.pythonhosted.org/packages/4e/bb/f7a190991ec9e3e0ba22e4993d8755bbc4a32925c0b5b42775c03e8148f9/pydantic_core-2.41.5-cp314-cp314-win_arm64.whl", hash = "sha256:e672ba74fbc2dc8eea59fb6d4aed6845e6905fc2a8afe93175d94a83ba2a01a0", size = 1977288, upload-time = "2025-11-04T13:41:26.33Z" }, - { url = "https://files.pythonhosted.org/packages/92/ed/77542d0c51538e32e15afe7899d79efce4b81eee631d99850edc2f5e9349/pydantic_core-2.41.5-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8566def80554c3faa0e65ac30ab0932b9e3a5cd7f8323764303d468e5c37595a", size = 2120255, upload-time = "2025-11-04T13:41:28.569Z" }, - { url = "https://files.pythonhosted.org/packages/bb/3d/6913dde84d5be21e284439676168b28d8bbba5600d838b9dca99de0fad71/pydantic_core-2.41.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b80aa5095cd3109962a298ce14110ae16b8c1aece8b72f9dafe81cf597ad80b3", size = 1863760, upload-time = "2025-11-04T13:41:31.055Z" }, - { url = "https://files.pythonhosted.org/packages/5a/f0/e5e6b99d4191da102f2b0eb9687aaa7f5bea5d9964071a84effc3e40f997/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3006c3dd9ba34b0c094c544c6006cc79e87d8612999f1a5d43b769b89181f23c", size = 1878092, upload-time = "2025-11-04T13:41:33.21Z" }, - { url = "https://files.pythonhosted.org/packages/71/48/36fb760642d568925953bcc8116455513d6e34c4beaa37544118c36aba6d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72f6c8b11857a856bcfa48c86f5368439f74453563f951e473514579d44aa612", size = 2053385, upload-time = "2025-11-04T13:41:35.508Z" }, - { url = "https://files.pythonhosted.org/packages/20/25/92dc684dd8eb75a234bc1c764b4210cf2646479d54b47bf46061657292a8/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cb1b2f9742240e4bb26b652a5aeb840aa4b417c7748b6f8387927bc6e45e40d", size = 2218832, upload-time = "2025-11-04T13:41:37.732Z" }, - { url = "https://files.pythonhosted.org/packages/e2/09/f53e0b05023d3e30357d82eb35835d0f6340ca344720a4599cd663dca599/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd3d54f38609ff308209bd43acea66061494157703364ae40c951f83ba99a1a9", size = 2327585, upload-time = "2025-11-04T13:41:40Z" }, - { url = "https://files.pythonhosted.org/packages/aa/4e/2ae1aa85d6af35a39b236b1b1641de73f5a6ac4d5a7509f77b814885760c/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ff4321e56e879ee8d2a879501c8e469414d948f4aba74a2d4593184eb326660", size = 2041078, upload-time = "2025-11-04T13:41:42.323Z" }, - { url = "https://files.pythonhosted.org/packages/cd/13/2e215f17f0ef326fc72afe94776edb77525142c693767fc347ed6288728d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0d2568a8c11bf8225044aa94409e21da0cb09dcdafe9ecd10250b2baad531a9", size = 2173914, upload-time = "2025-11-04T13:41:45.221Z" }, - { url = "https://files.pythonhosted.org/packages/02/7a/f999a6dcbcd0e5660bc348a3991c8915ce6599f4f2c6ac22f01d7a10816c/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:a39455728aabd58ceabb03c90e12f71fd30fa69615760a075b9fec596456ccc3", size = 2129560, upload-time = "2025-11-04T13:41:47.474Z" }, - { url = "https://files.pythonhosted.org/packages/3a/b1/6c990ac65e3b4c079a4fb9f5b05f5b013afa0f4ed6780a3dd236d2cbdc64/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:239edca560d05757817c13dc17c50766136d21f7cd0fac50295499ae24f90fdf", size = 2329244, upload-time = "2025-11-04T13:41:49.992Z" }, - { url = "https://files.pythonhosted.org/packages/d9/02/3c562f3a51afd4d88fff8dffb1771b30cfdfd79befd9883ee094f5b6c0d8/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:2a5e06546e19f24c6a96a129142a75cee553cc018ffee48a460059b1185f4470", size = 2331955, upload-time = "2025-11-04T13:41:54.079Z" }, - { url = "https://files.pythonhosted.org/packages/5c/96/5fb7d8c3c17bc8c62fdb031c47d77a1af698f1d7a406b0f79aaa1338f9ad/pydantic_core-2.41.5-cp314-cp314t-win32.whl", hash = "sha256:b4ececa40ac28afa90871c2cc2b9ffd2ff0bf749380fbdf57d165fd23da353aa", size = 1988906, upload-time = "2025-11-04T13:41:56.606Z" }, - { url = "https://files.pythonhosted.org/packages/22/ed/182129d83032702912c2e2d8bbe33c036f342cc735737064668585dac28f/pydantic_core-2.41.5-cp314-cp314t-win_amd64.whl", hash = "sha256:80aa89cad80b32a912a65332f64a4450ed00966111b6615ca6816153d3585a8c", size = 1981607, upload-time = "2025-11-04T13:41:58.889Z" }, - { url = "https://files.pythonhosted.org/packages/9f/ed/068e41660b832bb0b1aa5b58011dea2a3fe0ba7861ff38c4d4904c1c1a99/pydantic_core-2.41.5-cp314-cp314t-win_arm64.whl", hash = "sha256:35b44f37a3199f771c3eaa53051bc8a70cd7b54f333531c59e29fd4db5d15008", size = 1974769, upload-time = "2025-11-04T13:42:01.186Z" }, - { url = "https://files.pythonhosted.org/packages/11/72/90fda5ee3b97e51c494938a4a44c3a35a9c96c19bba12372fb9c634d6f57/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:b96d5f26b05d03cc60f11a7761a5ded1741da411e7fe0909e27a5e6a0cb7b034", size = 2115441, upload-time = "2025-11-04T13:42:39.557Z" }, - { url = "https://files.pythonhosted.org/packages/1f/53/8942f884fa33f50794f119012dc6a1a02ac43a56407adaac20463df8e98f/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:634e8609e89ceecea15e2d61bc9ac3718caaaa71963717bf3c8f38bfde64242c", size = 1930291, upload-time = "2025-11-04T13:42:42.169Z" }, - { url = "https://files.pythonhosted.org/packages/79/c8/ecb9ed9cd942bce09fc888ee960b52654fbdbede4ba6c2d6e0d3b1d8b49c/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93e8740d7503eb008aa2df04d3b9735f845d43ae845e6dcd2be0b55a2da43cd2", size = 1948632, upload-time = "2025-11-04T13:42:44.564Z" }, - { url = "https://files.pythonhosted.org/packages/2e/1b/687711069de7efa6af934e74f601e2a4307365e8fdc404703afc453eab26/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f15489ba13d61f670dcc96772e733aad1a6f9c429cc27574c6cdaed82d0146ad", size = 2138905, upload-time = "2025-11-04T13:42:47.156Z" }, - { url = "https://files.pythonhosted.org/packages/09/32/59b0c7e63e277fa7911c2fc70ccfb45ce4b98991e7ef37110663437005af/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:7da7087d756b19037bc2c06edc6c170eeef3c3bafcb8f532ff17d64dc427adfd", size = 2110495, upload-time = "2025-11-04T13:42:49.689Z" }, - { url = "https://files.pythonhosted.org/packages/aa/81/05e400037eaf55ad400bcd318c05bb345b57e708887f07ddb2d20e3f0e98/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc", size = 1915388, upload-time = "2025-11-04T13:42:52.215Z" }, - { url = "https://files.pythonhosted.org/packages/6e/0d/e3549b2399f71d56476b77dbf3cf8937cec5cd70536bdc0e374a421d0599/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56", size = 1942879, upload-time = "2025-11-04T13:42:56.483Z" }, - { url = "https://files.pythonhosted.org/packages/f7/07/34573da085946b6a313d7c42f82f16e8920bfd730665de2d11c0c37a74b5/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b", size = 2139017, upload-time = "2025-11-04T13:42:59.471Z" }, - { url = "https://files.pythonhosted.org/packages/e6/b0/1a2aa41e3b5a4ba11420aba2d091b2d17959c8d1519ece3627c371951e73/pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b5819cd790dbf0c5eb9f82c73c16b39a65dd6dd4d1439dcdea7816ec9adddab8", size = 2103351, upload-time = "2025-11-04T13:43:02.058Z" }, - { url = "https://files.pythonhosted.org/packages/a4/ee/31b1f0020baaf6d091c87900ae05c6aeae101fa4e188e1613c80e4f1ea31/pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5a4e67afbc95fa5c34cf27d9089bca7fcab4e51e57278d710320a70b956d1b9a", size = 1925363, upload-time = "2025-11-04T13:43:05.159Z" }, - { url = "https://files.pythonhosted.org/packages/e1/89/ab8e86208467e467a80deaca4e434adac37b10a9d134cd2f99b28a01e483/pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ece5c59f0ce7d001e017643d8d24da587ea1f74f6993467d85ae8a5ef9d4f42b", size = 2135615, upload-time = "2025-11-04T13:43:08.116Z" }, - { url = "https://files.pythonhosted.org/packages/99/0a/99a53d06dd0348b2008f2f30884b34719c323f16c3be4e6cc1203b74a91d/pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:16f80f7abe3351f8ea6858914ddc8c77e02578544a0ebc15b4c2e1a0e813b0b2", size = 2175369, upload-time = "2025-11-04T13:43:12.49Z" }, - { url = "https://files.pythonhosted.org/packages/6d/94/30ca3b73c6d485b9bb0bc66e611cff4a7138ff9736b7e66bcf0852151636/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:33cb885e759a705b426baada1fe68cbb0a2e68e34c5d0d0289a364cf01709093", size = 2144218, upload-time = "2025-11-04T13:43:15.431Z" }, - { url = "https://files.pythonhosted.org/packages/87/57/31b4f8e12680b739a91f472b5671294236b82586889ef764b5fbc6669238/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:c8d8b4eb992936023be7dee581270af5c6e0697a8559895f527f5b7105ecd36a", size = 2329951, upload-time = "2025-11-04T13:43:18.062Z" }, - { url = "https://files.pythonhosted.org/packages/7d/73/3c2c8edef77b8f7310e6fb012dbc4b8551386ed575b9eb6fb2506e28a7eb/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:242a206cd0318f95cd21bdacff3fcc3aab23e79bba5cac3db5a841c9ef9c6963", size = 2318428, upload-time = "2025-11-04T13:43:20.679Z" }, - { url = "https://files.pythonhosted.org/packages/2f/02/8559b1f26ee0d502c74f9cca5c0d2fd97e967e083e006bbbb4e97f3a043a/pydantic_core-2.41.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d3a978c4f57a597908b7e697229d996d77a6d3c94901e9edee593adada95ce1a", size = 2147009, upload-time = "2025-11-04T13:43:23.286Z" }, - { url = "https://files.pythonhosted.org/packages/5f/9b/1b3f0e9f9305839d7e84912f9e8bfbd191ed1b1ef48083609f0dabde978c/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2379fa7ed44ddecb5bfe4e48577d752db9fc10be00a6b7446e9663ba143de26", size = 2101980, upload-time = "2025-11-04T13:43:25.97Z" }, - { url = "https://files.pythonhosted.org/packages/a4/ed/d71fefcb4263df0da6a85b5d8a7508360f2f2e9b3bf5814be9c8bccdccc1/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:266fb4cbf5e3cbd0b53669a6d1b039c45e3ce651fd5442eff4d07c2cc8d66808", size = 1923865, upload-time = "2025-11-04T13:43:28.763Z" }, - { url = "https://files.pythonhosted.org/packages/ce/3a/626b38db460d675f873e4444b4bb030453bbe7b4ba55df821d026a0493c4/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58133647260ea01e4d0500089a8c4f07bd7aa6ce109682b1426394988d8aaacc", size = 2134256, upload-time = "2025-11-04T13:43:31.71Z" }, - { url = "https://files.pythonhosted.org/packages/83/d9/8412d7f06f616bbc053d30cb4e5f76786af3221462ad5eee1f202021eb4e/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:287dad91cfb551c363dc62899a80e9e14da1f0e2b6ebde82c806612ca2a13ef1", size = 2174762, upload-time = "2025-11-04T13:43:34.744Z" }, - { url = "https://files.pythonhosted.org/packages/55/4c/162d906b8e3ba3a99354e20faa1b49a85206c47de97a639510a0e673f5da/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:03b77d184b9eb40240ae9fd676ca364ce1085f203e1b1256f8ab9984dca80a84", size = 2143141, upload-time = "2025-11-04T13:43:37.701Z" }, - { url = "https://files.pythonhosted.org/packages/1f/f2/f11dd73284122713f5f89fc940f370d035fa8e1e078d446b3313955157fe/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:a668ce24de96165bb239160b3d854943128f4334822900534f2fe947930e5770", size = 2330317, upload-time = "2025-11-04T13:43:40.406Z" }, - { url = "https://files.pythonhosted.org/packages/88/9d/b06ca6acfe4abb296110fb1273a4d848a0bfb2ff65f3ee92127b3244e16b/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f14f8f046c14563f8eb3f45f499cc658ab8d10072961e07225e507adb700e93f", size = 2316992, upload-time = "2025-11-04T13:43:43.602Z" }, - { url = "https://files.pythonhosted.org/packages/36/c7/cfc8e811f061c841d7990b0201912c3556bfeb99cdcb7ed24adc8d6f8704/pydantic_core-2.41.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:56121965f7a4dc965bff783d70b907ddf3d57f6eba29b6d2e5dabfaf07799c51", size = 2145302, upload-time = "2025-11-04T13:43:46.64Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/2a/ef/f7abb56c49382a246fd2ce9c799691e3c3e7175ec74b14d99e798bcddb1a/pydantic_core-2.46.3.tar.gz", hash = "sha256:41c178f65b8c29807239d47e6050262eb6bf84eb695e41101e62e38df4a5bc2c", size = 471412, upload-time = "2026-04-20T14:40:56.672Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/98/b50eb9a411e87483b5c65dba4fa430a06bac4234d3403a40e5a9905ebcd0/pydantic_core-2.46.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:1da3786b8018e60349680720158cc19161cc3b4bdd815beb0a321cd5ce1ad5b1", size = 2108971, upload-time = "2026-04-20T14:43:51.945Z" }, + { url = "https://files.pythonhosted.org/packages/08/4b/f364b9d161718ff2217160a4b5d41ce38de60aed91c3689ebffa1c939d23/pydantic_core-2.46.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cc0988cb29d21bf4a9d5cf2ef970b5c0e38d8d8e107a493278c05dc6c1dda69f", size = 1949588, upload-time = "2026-04-20T14:44:10.386Z" }, + { url = "https://files.pythonhosted.org/packages/8f/8b/30bd03ee83b2f5e29f5ba8e647ab3c456bf56f2ec72fdbcc0215484a0854/pydantic_core-2.46.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27f9067c3bfadd04c55484b89c0d267981b2f3512850f6f66e1e74204a4e4ce3", size = 1975986, upload-time = "2026-04-20T14:43:57.106Z" }, + { url = "https://files.pythonhosted.org/packages/3c/54/13ccf954d84ec275d5d023d5786e4aa48840bc9f161f2838dc98e1153518/pydantic_core-2.46.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a642ac886ecf6402d9882d10c405dcf4b902abeb2972cd5fb4a48c83cd59279a", size = 2055830, upload-time = "2026-04-20T14:44:15.499Z" }, + { url = "https://files.pythonhosted.org/packages/be/0e/65f38125e660fdbd72aa858e7dfae893645cfa0e7b13d333e174a367cd23/pydantic_core-2.46.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79f561438481f28681584b89e2effb22855e2179880314bcddbf5968e935e807", size = 2222340, upload-time = "2026-04-20T14:41:51.353Z" }, + { url = "https://files.pythonhosted.org/packages/d1/88/f3ab7739efe0e7e80777dbb84c59eb98518e3f57ea433206194c2e425272/pydantic_core-2.46.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57a973eae4665352a47cf1a99b4ee864620f2fe663a217d7a8da68a1f3a5bfda", size = 2280727, upload-time = "2026-04-20T14:41:30.461Z" }, + { url = "https://files.pythonhosted.org/packages/2a/6d/c228219080817bec4982f9531cadb18da6aaa770fdeb114f49c237ac2c9f/pydantic_core-2.46.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83d002b97072a53ea150d63e0a3adfae5670cef5aa8a6e490240e482d3b22e57", size = 2092158, upload-time = "2026-04-20T14:44:07.305Z" }, + { url = "https://files.pythonhosted.org/packages/0f/b1/525a16711e7c6d61635fac3b0bd54600b5c5d9f60c6fc5aaab26b64a2297/pydantic_core-2.46.3-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:b40ddd51e7c44b28cfaef746c9d3c506d658885e0a46f9eeef2ee815cbf8e045", size = 2116626, upload-time = "2026-04-20T14:42:34.118Z" }, + { url = "https://files.pythonhosted.org/packages/ef/7c/17d30673351439a6951bf54f564cf2443ab00ae264ec9df00e2efd710eb5/pydantic_core-2.46.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ac5ec7fb9b87f04ee839af2d53bcadea57ded7d229719f56c0ed895bff987943", size = 2160691, upload-time = "2026-04-20T14:41:14.023Z" }, + { url = "https://files.pythonhosted.org/packages/86/66/af8adbcbc0886ead7f1a116606a534d75a307e71e6e08226000d51b880d2/pydantic_core-2.46.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a3b11c812f61b3129c4905781a2601dfdfdea5fe1e6c1cfb696b55d14e9c054f", size = 2182543, upload-time = "2026-04-20T14:40:48.886Z" }, + { url = "https://files.pythonhosted.org/packages/b0/37/6de71e0f54c54a4190010f57deb749e1ddf75c568ada3b1320b70067f121/pydantic_core-2.46.3-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:1108da631e602e5b3c38d6d04fe5bb3bfa54349e6918e3ca6cf570b2e2b2f9d4", size = 2324513, upload-time = "2026-04-20T14:42:36.121Z" }, + { url = "https://files.pythonhosted.org/packages/51/b1/9fc74ce94f603d5ef59ff258ca9c2c8fb902fb548d340a96f77f4d1c3b7f/pydantic_core-2.46.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:de885175515bcfa98ae618c1df7a072f13d179f81376c8007112af20567fd08a", size = 2361853, upload-time = "2026-04-20T14:43:24.886Z" }, + { url = "https://files.pythonhosted.org/packages/40/d0/4c652fc592db35f100279ee751d5a145aca1b9a7984b9684ba7c1b5b0535/pydantic_core-2.46.3-cp310-cp310-win32.whl", hash = "sha256:d11058e3201527d41bc6b545c79187c9e4bf85e15a236a6007f0e991518882b7", size = 1980465, upload-time = "2026-04-20T14:44:46.239Z" }, + { url = "https://files.pythonhosted.org/packages/27/b8/a920453c38afbe1f355e1ea0b0d94a0a3e0b0879d32d793108755fa171d5/pydantic_core-2.46.3-cp310-cp310-win_amd64.whl", hash = "sha256:3612edf65c8ea67ac13616c4d23af12faef1ae435a8a93e5934c2a0cbbdd1fd6", size = 2073884, upload-time = "2026-04-20T14:43:01.201Z" }, + { url = "https://files.pythonhosted.org/packages/22/a2/1ba90a83e85a3f94c796b184f3efde9c72f2830dcda493eea8d59ba78e6d/pydantic_core-2.46.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ab124d49d0459b2373ecf54118a45c28a1e6d4192a533fbc915e70f556feb8e5", size = 2106740, upload-time = "2026-04-20T14:41:20.932Z" }, + { url = "https://files.pythonhosted.org/packages/b6/f6/99ae893c89a0b9d3daec9f95487aa676709aa83f67643b3f0abaf4ab628a/pydantic_core-2.46.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cca67d52a5c7a16aed2b3999e719c4bcf644074eac304a5d3d62dd70ae7d4b2c", size = 1948293, upload-time = "2026-04-20T14:43:42.115Z" }, + { url = "https://files.pythonhosted.org/packages/3e/b8/2e8e636dc9e3f16c2e16bf0849e24be82c5ee82c603c65fc0326666328fc/pydantic_core-2.46.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c024e08c0ba23e6fd68c771a521e9d6a792f2ebb0fa734296b36394dc30390e", size = 1973222, upload-time = "2026-04-20T14:41:57.841Z" }, + { url = "https://files.pythonhosted.org/packages/34/36/0e730beec4d83c5306f417afbd82ff237d9a21e83c5edf675f31ed84c1fe/pydantic_core-2.46.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6645ce7eec4928e29a1e3b3d5c946621d105d3e79f0c9cddf07c2a9770949287", size = 2053852, upload-time = "2026-04-20T14:40:43.077Z" }, + { url = "https://files.pythonhosted.org/packages/4b/f0/3071131f47e39136a17814576e0fada9168569f7f8c0e6ac4d1ede6a4958/pydantic_core-2.46.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a712c7118e6c5ea96562f7b488435172abb94a3c53c22c9efc1412264a45cbbe", size = 2221134, upload-time = "2026-04-20T14:43:03.349Z" }, + { url = "https://files.pythonhosted.org/packages/2f/a9/a2dc023eec5aa4b02a467874bad32e2446957d2adcab14e107eab502e978/pydantic_core-2.46.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:69a868ef3ff206343579021c40faf3b1edc64b1cc508ff243a28b0a514ccb050", size = 2279785, upload-time = "2026-04-20T14:41:19.285Z" }, + { url = "https://files.pythonhosted.org/packages/0a/44/93f489d16fb63fbd41c670441536541f6e8cfa1e5a69f40bc9c5d30d8c90/pydantic_core-2.46.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc7e8c32db809aa0f6ea1d6869ebc8518a65d5150fdfad8bcae6a49ae32a22e2", size = 2089404, upload-time = "2026-04-20T14:43:10.108Z" }, + { url = "https://files.pythonhosted.org/packages/2a/78/8692e3aa72b2d004f7a5d937f1dfdc8552ba26caf0bec75f342c40f00dec/pydantic_core-2.46.3-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:3481bd1341dc85779ee506bc8e1196a277ace359d89d28588a9468c3ecbe63fa", size = 2114898, upload-time = "2026-04-20T14:44:51.475Z" }, + { url = "https://files.pythonhosted.org/packages/6a/62/e83133f2e7832532060175cebf1f13748f4c7e7e7165cdd1f611f174494b/pydantic_core-2.46.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8690eba565c6d68ffd3a8655525cbdd5246510b44a637ee2c6c03a7ebfe64d3c", size = 2157856, upload-time = "2026-04-20T14:43:46.64Z" }, + { url = "https://files.pythonhosted.org/packages/6d/ec/6a500e3ad7718ee50583fae79c8651f5d37e3abce1fa9ae177ae65842c53/pydantic_core-2.46.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4de88889d7e88d50d40ee5b39d5dac0bcaef9ba91f7e536ac064e6b2834ecccf", size = 2180168, upload-time = "2026-04-20T14:42:00.302Z" }, + { url = "https://files.pythonhosted.org/packages/d8/53/8267811054b1aa7fc1dc7ded93812372ef79a839f5e23558136a6afbfde1/pydantic_core-2.46.3-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:e480080975c1ef7f780b8f99ed72337e7cc5efea2e518a20a692e8e7b278eb8b", size = 2322885, upload-time = "2026-04-20T14:41:05.253Z" }, + { url = "https://files.pythonhosted.org/packages/c8/c1/1c0acdb3aa0856ddc4ecc55214578f896f2de16f400cf51627eb3c26c1c4/pydantic_core-2.46.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:de3a5c376f8cd94da9a1b8fd3dd1c16c7a7b216ed31dc8ce9fd7a22bf13b836e", size = 2360328, upload-time = "2026-04-20T14:41:43.991Z" }, + { url = "https://files.pythonhosted.org/packages/f0/d0/ef39cd0f4a926814f360e71c1adeab48ad214d9727e4deb48eedfb5bce1a/pydantic_core-2.46.3-cp311-cp311-win32.whl", hash = "sha256:fc331a5314ffddd5385b9ee9d0d2fee0b13c27e0e02dad71b1ae5d6561f51eeb", size = 1979464, upload-time = "2026-04-20T14:43:12.215Z" }, + { url = "https://files.pythonhosted.org/packages/18/9c/f41951b0d858e343f1cf09398b2a7b3014013799744f2c4a8ad6a3eec4f2/pydantic_core-2.46.3-cp311-cp311-win_amd64.whl", hash = "sha256:b5b9c6cf08a8a5e502698f5e153056d12c34b8fb30317e0c5fd06f45162a6346", size = 2070837, upload-time = "2026-04-20T14:41:47.707Z" }, + { url = "https://files.pythonhosted.org/packages/9f/1e/264a17cd582f6ed50950d4d03dd5fefd84e570e238afe1cb3e25cf238769/pydantic_core-2.46.3-cp311-cp311-win_arm64.whl", hash = "sha256:5dfd51cf457482f04ec49491811a2b8fd5b843b64b11eecd2d7a1ee596ea78a6", size = 2053647, upload-time = "2026-04-20T14:42:27.535Z" }, + { url = "https://files.pythonhosted.org/packages/4b/cb/5b47425556ecc1f3fe18ed2a0083188aa46e1dd812b06e406475b3a5d536/pydantic_core-2.46.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b11b59b3eee90a80a36701ddb4576d9ae31f93f05cb9e277ceaa09e6bf074a67", size = 2101946, upload-time = "2026-04-20T14:40:52.581Z" }, + { url = "https://files.pythonhosted.org/packages/a1/4f/2fb62c2267cae99b815bbf4a7b9283812c88ca3153ef29f7707200f1d4e5/pydantic_core-2.46.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:af8653713055ea18a3abc1537fe2ebc42f5b0bbb768d1eb79fd74eb47c0ac089", size = 1951612, upload-time = "2026-04-20T14:42:42.996Z" }, + { url = "https://files.pythonhosted.org/packages/50/6e/b7348fd30d6556d132cddd5bd79f37f96f2601fe0608afac4f5fb01ec0b3/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75a519dab6d63c514f3a81053e5266c549679e4aa88f6ec57f2b7b854aceb1b0", size = 1977027, upload-time = "2026-04-20T14:42:02.001Z" }, + { url = "https://files.pythonhosted.org/packages/82/11/31d60ee2b45540d3fb0b29302a393dbc01cd771c473f5b5147bcd353e593/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a6cd87cb1575b1ad05ba98894c5b5c96411ef678fa2f6ed2576607095b8d9789", size = 2063008, upload-time = "2026-04-20T14:44:17.952Z" }, + { url = "https://files.pythonhosted.org/packages/8a/db/3a9d1957181b59258f44a2300ab0f0be9d1e12d662a4f57bb31250455c52/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f80a55484b8d843c8ada81ebf70a682f3f00a3d40e378c06cf17ecb44d280d7d", size = 2233082, upload-time = "2026-04-20T14:40:57.934Z" }, + { url = "https://files.pythonhosted.org/packages/9c/e1/3277c38792aeb5cfb18c2f0c5785a221d9ff4e149abbe1184d53d5f72273/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3861f1731b90c50a3266316b9044f5c9b405eecb8e299b0a7120596334e4fe9c", size = 2304615, upload-time = "2026-04-20T14:42:12.584Z" }, + { url = "https://files.pythonhosted.org/packages/5e/d5/e3d9717c9eba10855325650afd2a9cba8e607321697f18953af9d562da2f/pydantic_core-2.46.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb528e295ed31570ac3dcc9bfdd6e0150bc11ce6168ac87a8082055cf1a67395", size = 2094380, upload-time = "2026-04-20T14:43:05.522Z" }, + { url = "https://files.pythonhosted.org/packages/a1/20/abac35dedcbfd66c6f0b03e4e3564511771d6c9b7ede10a362d03e110d9b/pydantic_core-2.46.3-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:367508faa4973b992b271ba1494acaab36eb7e8739d1e47be5035fb1ea225396", size = 2135429, upload-time = "2026-04-20T14:41:55.549Z" }, + { url = "https://files.pythonhosted.org/packages/6c/a5/41bfd1df69afad71b5cf0535055bccc73022715ad362edbc124bc1e021d7/pydantic_core-2.46.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ad3c826fe523e4becf4fe39baa44286cff85ef137c729a2c5e269afbfd0905d", size = 2174582, upload-time = "2026-04-20T14:41:45.96Z" }, + { url = "https://files.pythonhosted.org/packages/79/65/38d86ea056b29b2b10734eb23329b7a7672ca604df4f2b6e9c02d4ee22fe/pydantic_core-2.46.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ec638c5d194ef8af27db69f16c954a09797c0dc25015ad6123eb2c73a4d271ca", size = 2187533, upload-time = "2026-04-20T14:40:55.367Z" }, + { url = "https://files.pythonhosted.org/packages/b6/55/a1129141678a2026badc539ad1dee0a71d06f54c2f06a4bd68c030ac781b/pydantic_core-2.46.3-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:28ed528c45446062ee66edb1d33df5d88828ae167de76e773a3c7f64bd14e976", size = 2332985, upload-time = "2026-04-20T14:44:13.05Z" }, + { url = "https://files.pythonhosted.org/packages/d7/60/cb26f4077719f709e54819f4e8e1d43f4091f94e285eb6bd21e1190a7b7c/pydantic_core-2.46.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aed19d0c783886d5bd86d80ae5030006b45e28464218747dcf83dabfdd092c7b", size = 2373670, upload-time = "2026-04-20T14:41:53.421Z" }, + { url = "https://files.pythonhosted.org/packages/6b/7e/c3f21882bdf1d8d086876f81b5e296206c69c6082551d776895de7801fa0/pydantic_core-2.46.3-cp312-cp312-win32.whl", hash = "sha256:06d5d8820cbbdb4147578c1fe7ffcd5b83f34508cb9f9ab76e807be7db6ff0a4", size = 1966722, upload-time = "2026-04-20T14:44:30.588Z" }, + { url = "https://files.pythonhosted.org/packages/57/be/6b5e757b859013ebfbd7adba02f23b428f37c86dcbf78b5bb0b4ffd36e99/pydantic_core-2.46.3-cp312-cp312-win_amd64.whl", hash = "sha256:c3212fda0ee959c1dd04c60b601ec31097aaa893573a3a1abd0a47bcac2968c1", size = 2072970, upload-time = "2026-04-20T14:42:54.248Z" }, + { url = "https://files.pythonhosted.org/packages/bf/f8/a989b21cc75e9a32d24192ef700eea606521221a89faa40c919ce884f2b1/pydantic_core-2.46.3-cp312-cp312-win_arm64.whl", hash = "sha256:f1f8338dd7a7f31761f1f1a3c47503a9a3b34eea3c8b01fa6ee96408affb5e72", size = 2035963, upload-time = "2026-04-20T14:44:20.4Z" }, + { url = "https://files.pythonhosted.org/packages/9b/3c/9b5e8eb9821936d065439c3b0fb1490ffa64163bfe7e1595985a47896073/pydantic_core-2.46.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:12bc98de041458b80c86c56b24df1d23832f3e166cbaff011f25d187f5c62c37", size = 2102109, upload-time = "2026-04-20T14:41:24.219Z" }, + { url = "https://files.pythonhosted.org/packages/91/97/1c41d1f5a19f241d8069f1e249853bcce378cdb76eec8ab636d7bc426280/pydantic_core-2.46.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:85348b8f89d2c3508b65b16c3c33a4da22b8215138d8b996912bb1532868885f", size = 1951820, upload-time = "2026-04-20T14:42:14.236Z" }, + { url = "https://files.pythonhosted.org/packages/30/b4/d03a7ae14571bc2b6b3c7b122441154720619afe9a336fa3a95434df5e2f/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1105677a6df914b1fb71a81b96c8cce7726857e1717d86001f29be06a25ee6f8", size = 1977785, upload-time = "2026-04-20T14:42:31.648Z" }, + { url = "https://files.pythonhosted.org/packages/ae/0c/4086f808834b59e3c8f1aa26df8f4b6d998cdcf354a143d18ef41529d1fe/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:87082cd65669a33adeba5470769e9704c7cf026cc30afb9cc77fd865578ebaad", size = 2062761, upload-time = "2026-04-20T14:40:37.093Z" }, + { url = "https://files.pythonhosted.org/packages/fa/71/a649be5a5064c2df0db06e0a512c2281134ed2fcc981f52a657936a7527c/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60e5f66e12c4f5212d08522963380eaaeac5ebd795826cfd19b2dfb0c7a52b9c", size = 2232989, upload-time = "2026-04-20T14:42:59.254Z" }, + { url = "https://files.pythonhosted.org/packages/a2/84/7756e75763e810b3a710f4724441d1ecc5883b94aacb07ca71c5fb5cfb69/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b6cdf19bf84128d5e7c37e8a73a0c5c10d51103a650ac585d42dd6ae233f2b7f", size = 2303975, upload-time = "2026-04-20T14:41:32.287Z" }, + { url = "https://files.pythonhosted.org/packages/6c/35/68a762e0c1e31f35fa0dac733cbd9f5b118042853698de9509c8e5bf128b/pydantic_core-2.46.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:031bb17f4885a43773c8c763089499f242aee2ea85cf17154168775dccdecf35", size = 2095325, upload-time = "2026-04-20T14:42:47.685Z" }, + { url = "https://files.pythonhosted.org/packages/77/bf/1bf8c9a8e91836c926eae5e3e51dce009bf495a60ca56060689d3df3f340/pydantic_core-2.46.3-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:bcf2a8b2982a6673693eae7348ef3d8cf3979c1d63b54fca7c397a635cc68687", size = 2133368, upload-time = "2026-04-20T14:41:22.766Z" }, + { url = "https://files.pythonhosted.org/packages/e5/50/87d818d6bab915984995157ceb2380f5aac4e563dddbed6b56f0ed057aba/pydantic_core-2.46.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28e8cf2f52d72ced402a137145923a762cbb5081e48b34312f7a0c8f55928ec3", size = 2173908, upload-time = "2026-04-20T14:42:52.044Z" }, + { url = "https://files.pythonhosted.org/packages/91/88/a311fb306d0bd6185db41fa14ae888fb81d0baf648a761ae760d30819d33/pydantic_core-2.46.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:17eaface65d9fc5abb940003020309c1bf7a211f5f608d7870297c367e6f9022", size = 2186422, upload-time = "2026-04-20T14:43:29.55Z" }, + { url = "https://files.pythonhosted.org/packages/8f/79/28fd0d81508525ab2054fef7c77a638c8b5b0afcbbaeee493cf7c3fef7e1/pydantic_core-2.46.3-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:93fd339f23408a07e98950a89644f92c54d8729719a40b30c0a30bb9ebc55d23", size = 2332709, upload-time = "2026-04-20T14:42:16.134Z" }, + { url = "https://files.pythonhosted.org/packages/b3/21/795bf5fe5c0f379308b8ef19c50dedab2e7711dbc8d0c2acf08f1c7daa05/pydantic_core-2.46.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:23cbdb3aaa74dfe0837975dbf69b469753bbde8eacace524519ffdb6b6e89eb7", size = 2372428, upload-time = "2026-04-20T14:41:10.974Z" }, + { url = "https://files.pythonhosted.org/packages/45/b3/ed14c659cbe7605e3ef063077680a64680aec81eb1a04763a05190d49b7f/pydantic_core-2.46.3-cp313-cp313-win32.whl", hash = "sha256:610eda2e3838f401105e6326ca304f5da1e15393ae25dacae5c5c63f2c275b13", size = 1965601, upload-time = "2026-04-20T14:41:42.128Z" }, + { url = "https://files.pythonhosted.org/packages/ef/bb/adb70d9a762ddd002d723fbf1bd492244d37da41e3af7b74ad212609027e/pydantic_core-2.46.3-cp313-cp313-win_amd64.whl", hash = "sha256:68cc7866ed863db34351294187f9b729964c371ba33e31c26f478471c52e1ed0", size = 2071517, upload-time = "2026-04-20T14:43:36.096Z" }, + { url = "https://files.pythonhosted.org/packages/52/eb/66faefabebfe68bd7788339c9c9127231e680b11906368c67ce112fdb47f/pydantic_core-2.46.3-cp313-cp313-win_arm64.whl", hash = "sha256:f64b5537ac62b231572879cd08ec05600308636a5d63bcbdb15063a466977bec", size = 2035802, upload-time = "2026-04-20T14:43:38.507Z" }, + { url = "https://files.pythonhosted.org/packages/7f/db/a7bcb4940183fda36022cd18ba8dd12f2dff40740ec7b58ce7457befa416/pydantic_core-2.46.3-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:afa3aa644f74e290cdede48a7b0bee37d1c35e71b05105f6b340d484af536d9b", size = 2097614, upload-time = "2026-04-20T14:44:38.374Z" }, + { url = "https://files.pythonhosted.org/packages/24/35/e4066358a22e3e99519db370494c7528f5a2aa1367370e80e27e20283543/pydantic_core-2.46.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ced3310e51aa425f7f77da8bbbb5212616655bedbe82c70944320bc1dbe5e018", size = 1951896, upload-time = "2026-04-20T14:40:53.996Z" }, + { url = "https://files.pythonhosted.org/packages/87/92/37cf4049d1636996e4b888c05a501f40a43ff218983a551d57f9d5e14f0d/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e29908922ce9da1a30b4da490bd1d3d82c01dcfdf864d2a74aacee674d0bfa34", size = 1979314, upload-time = "2026-04-20T14:41:49.446Z" }, + { url = "https://files.pythonhosted.org/packages/d8/36/9ff4d676dfbdfb2d591cf43f3d90ded01e15b1404fd101180ed2d62a2fd3/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0c9ff69140423eea8ed2d5477df3ba037f671f5e897d206d921bc9fdc39613e7", size = 2056133, upload-time = "2026-04-20T14:42:23.574Z" }, + { url = "https://files.pythonhosted.org/packages/bc/f0/405b442a4d7ba855b06eec8b2bf9c617d43b8432d099dfdc7bf999293495/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b675ab0a0d5b1c8fdb81195dc5bcefea3f3c240871cdd7ff9a2de8aa50772eb2", size = 2228726, upload-time = "2026-04-20T14:44:22.816Z" }, + { url = "https://files.pythonhosted.org/packages/e7/f8/65cd92dd5a0bd89ba277a98ecbfaf6fc36bbd3300973c7a4b826d6ab1391/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0087084960f209a9a4af50ecd1fb063d9ad3658c07bb81a7a53f452dacbfb2ba", size = 2301214, upload-time = "2026-04-20T14:44:48.792Z" }, + { url = "https://files.pythonhosted.org/packages/fd/86/ef96a4c6e79e7a2d0410826a68fbc0eccc0fd44aa733be199d5fcac3bb87/pydantic_core-2.46.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed42e6cc8e1b0e2b9b96e2276bad70ae625d10d6d524aed0c93de974ae029f9f", size = 2099927, upload-time = "2026-04-20T14:41:40.196Z" }, + { url = "https://files.pythonhosted.org/packages/6d/53/269caf30e0096e0a8a8f929d1982a27b3879872cca2d917d17c2f9fdf4fe/pydantic_core-2.46.3-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:f1771ce258afb3e4201e67d154edbbae712a76a6081079fe247c2f53c6322c22", size = 2128789, upload-time = "2026-04-20T14:41:15.868Z" }, + { url = "https://files.pythonhosted.org/packages/00/b0/1a6d9b6a587e118482910c244a1c5acf4d192604174132efd12bf0ac486f/pydantic_core-2.46.3-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a7610b6a5242a6c736d8ad47fd5fff87fcfe8f833b281b1c409c3d6835d9227f", size = 2173815, upload-time = "2026-04-20T14:44:25.152Z" }, + { url = "https://files.pythonhosted.org/packages/87/56/e7e00d4041a7e62b5a40815590114db3b535bf3ca0bf4dca9f16cef25246/pydantic_core-2.46.3-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:ff5e7783bcc5476e1db448bf268f11cb257b1c276d3e89f00b5727be86dd0127", size = 2181608, upload-time = "2026-04-20T14:41:28.933Z" }, + { url = "https://files.pythonhosted.org/packages/e8/22/4bd23c3d41f7c185d60808a1de83c76cf5aeabf792f6c636a55c3b1ec7f9/pydantic_core-2.46.3-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:9d2e32edcc143bc01e95300671915d9ca052d4f745aa0a49c48d4803f8a85f2c", size = 2326968, upload-time = "2026-04-20T14:42:03.962Z" }, + { url = "https://files.pythonhosted.org/packages/24/ac/66cd45129e3915e5ade3b292cb3bc7fd537f58f8f8dbdaba6170f7cabb74/pydantic_core-2.46.3-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:6e42d83d1c6b87fa56b521479cff237e626a292f3b31b6345c15a99121b454c1", size = 2369842, upload-time = "2026-04-20T14:41:35.52Z" }, + { url = "https://files.pythonhosted.org/packages/a2/51/dd4248abb84113615473aa20d5545b7c4cd73c8644003b5259686f93996c/pydantic_core-2.46.3-cp314-cp314-win32.whl", hash = "sha256:07bc6d2a28c3adb4f7c6ae46aa4f2d2929af127f587ed44057af50bf1ce0f505", size = 1959661, upload-time = "2026-04-20T14:41:00.042Z" }, + { url = "https://files.pythonhosted.org/packages/20/eb/59980e5f1ae54a3b86372bd9f0fa373ea2d402e8cdcd3459334430f91e91/pydantic_core-2.46.3-cp314-cp314-win_amd64.whl", hash = "sha256:8940562319bc621da30714617e6a7eaa6b98c84e8c685bcdc02d7ed5e7c7c44e", size = 2071686, upload-time = "2026-04-20T14:43:16.471Z" }, + { url = "https://files.pythonhosted.org/packages/8c/db/1cf77e5247047dfee34bc01fa9bca134854f528c8eb053e144298893d370/pydantic_core-2.46.3-cp314-cp314-win_arm64.whl", hash = "sha256:5dcbbcf4d22210ced8f837c96db941bdb078f419543472aca5d9a0bb7cddc7df", size = 2026907, upload-time = "2026-04-20T14:43:31.732Z" }, + { url = "https://files.pythonhosted.org/packages/57/c0/b3df9f6a543276eadba0a48487b082ca1f201745329d97dbfa287034a230/pydantic_core-2.46.3-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:d0fe3dce1e836e418f912c1ad91c73357d03e556a4d286f441bf34fed2dbeecf", size = 2095047, upload-time = "2026-04-20T14:42:37.982Z" }, + { url = "https://files.pythonhosted.org/packages/66/57/886a938073b97556c168fd99e1a7305bb363cd30a6d2c76086bf0587b32a/pydantic_core-2.46.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9ce92e58abc722dac1bf835a6798a60b294e48eb0e625ec9fd994b932ac5feee", size = 1934329, upload-time = "2026-04-20T14:43:49.655Z" }, + { url = "https://files.pythonhosted.org/packages/0b/7c/b42eaa5c34b13b07ecb51da21761297a9b8eb43044c864a035999998f328/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a03e6467f0f5ab796a486146d1b887b2dc5e5f9b3288898c1b1c3ad974e53e4a", size = 1974847, upload-time = "2026-04-20T14:42:10.737Z" }, + { url = "https://files.pythonhosted.org/packages/e6/9b/92b42db6543e7de4f99ae977101a2967b63122d4b6cf7773812da2d7d5b5/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2798b6ba041b9d70acfb9071a2ea13c8456dd1e6a5555798e41ba7b0790e329c", size = 2041742, upload-time = "2026-04-20T14:40:44.262Z" }, + { url = "https://files.pythonhosted.org/packages/0f/19/46fbe1efabb5aa2834b43b9454e70f9a83ad9c338c1291e48bdc4fecf167/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9be3e221bdc6d69abf294dcf7aff6af19c31a5cdcc8f0aa3b14be29df4bd03b1", size = 2236235, upload-time = "2026-04-20T14:41:27.307Z" }, + { url = "https://files.pythonhosted.org/packages/77/da/b3f95bc009ad60ec53120f5d16c6faa8cabdbe8a20d83849a1f2b8728148/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f13936129ce841f2a5ddf6f126fea3c43cd128807b5a59588c37cf10178c2e64", size = 2282633, upload-time = "2026-04-20T14:44:33.271Z" }, + { url = "https://files.pythonhosted.org/packages/cc/6e/401336117722e28f32fb8220df676769d28ebdf08f2f4469646d404c43a3/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28b5f2ef03416facccb1c6ef744c69793175fd27e44ef15669201601cf423acb", size = 2109679, upload-time = "2026-04-20T14:44:41.065Z" }, + { url = "https://files.pythonhosted.org/packages/fc/53/b289f9bc8756a32fe718c46f55afaeaf8d489ee18d1a1e7be1db73f42cc4/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:830d1247d77ad23852314f069e9d7ddafeec5f684baf9d7e7065ed46a049c4e6", size = 2108342, upload-time = "2026-04-20T14:42:50.144Z" }, + { url = "https://files.pythonhosted.org/packages/10/5b/8292fc7c1f9111f1b2b7c1b0dcf1179edcd014fc3ea4517499f50b829d71/pydantic_core-2.46.3-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0793c90c1a3c74966e7975eaef3ed30ebdff3260a0f815a62a22adc17e4c01c", size = 2157208, upload-time = "2026-04-20T14:42:08.133Z" }, + { url = "https://files.pythonhosted.org/packages/2b/9e/f80044e9ec07580f057a89fc131f78dda7a58751ddf52bbe05eaf31db50f/pydantic_core-2.46.3-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:d2d0aead851b66f5245ec0c4fb2612ef457f8bbafefdf65a2bf9d6bac6140f47", size = 2167237, upload-time = "2026-04-20T14:42:25.412Z" }, + { url = "https://files.pythonhosted.org/packages/f8/84/6781a1b037f3b96be9227edbd1101f6d3946746056231bf4ac48cdff1a8d/pydantic_core-2.46.3-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:2f40e4246676beb31c5ce77c38a55ca4e465c6b38d11ea1bd935420568e0b1ab", size = 2312540, upload-time = "2026-04-20T14:40:40.313Z" }, + { url = "https://files.pythonhosted.org/packages/3e/db/19c0839feeb728e7df03255581f198dfdf1c2aeb1e174a8420b63c5252e5/pydantic_core-2.46.3-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:cf489cf8986c543939aeee17a09c04d6ffb43bfef8ca16fcbcc5cfdcbed24dba", size = 2369556, upload-time = "2026-04-20T14:41:09.427Z" }, + { url = "https://files.pythonhosted.org/packages/e0/15/3228774cb7cd45f5f721ddf1b2242747f4eb834d0c491f0c02d606f09fed/pydantic_core-2.46.3-cp314-cp314t-win32.whl", hash = "sha256:ffe0883b56cfc05798bf994164d2b2ff03efe2d22022a2bb080f3b626176dd56", size = 1949756, upload-time = "2026-04-20T14:41:25.717Z" }, + { url = "https://files.pythonhosted.org/packages/b8/2a/c79cf53fd91e5a87e30d481809f52f9a60dd221e39de66455cf04deaad37/pydantic_core-2.46.3-cp314-cp314t-win_amd64.whl", hash = "sha256:706d9d0ce9cf4593d07270d8e9f53b161f90c57d315aeec4fb4fd7a8b10240d8", size = 2051305, upload-time = "2026-04-20T14:43:18.627Z" }, + { url = "https://files.pythonhosted.org/packages/0b/db/d8182a7f1d9343a032265aae186eb063fe26ca4c40f256b21e8da4498e89/pydantic_core-2.46.3-cp314-cp314t-win_arm64.whl", hash = "sha256:77706aeb41df6a76568434701e0917da10692da28cb69d5fb6919ce5fdb07374", size = 2026310, upload-time = "2026-04-20T14:41:01.778Z" }, + { url = "https://files.pythonhosted.org/packages/66/7f/03dbad45cd3aa9083fbc93c210ae8b005af67e4136a14186950a747c6874/pydantic_core-2.46.3-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:9715525891ed524a0a1eb6d053c74d4d4ad5017677fb00af0b7c2644a31bae46", size = 2105683, upload-time = "2026-04-20T14:42:19.779Z" }, + { url = "https://files.pythonhosted.org/packages/26/22/4dc186ac8ea6b257e9855031f51b62a9637beac4d68ac06bee02f046f836/pydantic_core-2.46.3-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:9d2f400712a99a013aff420ef1eb9be077f8189a36c1e3ef87660b4e1088a874", size = 1940052, upload-time = "2026-04-20T14:43:59.274Z" }, + { url = "https://files.pythonhosted.org/packages/0d/ca/d376391a5aff1f2e8188960d7873543608130a870961c2b6b5236627c116/pydantic_core-2.46.3-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd2aab0e2e9dc2daf36bd2686c982535d5e7b1d930a1344a7bb6e82baab42a76", size = 1988172, upload-time = "2026-04-20T14:41:17.469Z" }, + { url = "https://files.pythonhosted.org/packages/0e/6b/523b9f85c23788755d6ab949329de692a2e3a584bc6beb67fef5e035aa9d/pydantic_core-2.46.3-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e9d76736da5f362fabfeea6a69b13b7f2be405c6d6966f06b2f6bfff7e64531", size = 2128596, upload-time = "2026-04-20T14:40:41.707Z" }, + { url = "https://files.pythonhosted.org/packages/34/42/f426db557e8ab2791bc7562052299944a118655496fbff99914e564c0a94/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:b12dd51f1187c2eb489af8e20f880362db98e954b54ab792fa5d92e8bcc6b803", size = 2091877, upload-time = "2026-04-20T14:43:27.091Z" }, + { url = "https://files.pythonhosted.org/packages/5c/4f/86a832a9d14df58e663bfdf4627dc00d3317c2bd583c4fb23390b0f04b8e/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:f00a0961b125f1a47af7bcc17f00782e12f4cd056f83416006b30111d941dfa3", size = 1932428, upload-time = "2026-04-20T14:40:45.781Z" }, + { url = "https://files.pythonhosted.org/packages/11/1a/fe857968954d93fb78e0d4b6df5c988c74c4aaa67181c60be7cfe327c0ca/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57697d7c056aca4bbb680200f96563e841a6386ac1129370a0102592f4dddff5", size = 1997550, upload-time = "2026-04-20T14:44:02.425Z" }, + { url = "https://files.pythonhosted.org/packages/17/eb/9d89ad2d9b0ba8cd65393d434471621b98912abb10fbe1df08e480ba57b5/pydantic_core-2.46.3-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd35aa21299def8db7ef4fe5c4ff862941a9a158ca7b63d61e66fe67d30416b4", size = 2137657, upload-time = "2026-04-20T14:42:45.149Z" }, + { url = "https://files.pythonhosted.org/packages/1f/da/99d40830684f81dec901cac521b5b91c095394cc1084b9433393cde1c2df/pydantic_core-2.46.3-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:13afdd885f3d71280cf286b13b310ee0f7ccfefd1dbbb661514a474b726e2f25", size = 2107973, upload-time = "2026-04-20T14:42:06.175Z" }, + { url = "https://files.pythonhosted.org/packages/99/a5/87024121818d75bbb2a98ddbaf638e40e7a18b5e0f5492c9ca4b1b316107/pydantic_core-2.46.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f91c0aff3e3ee0928edd1232c57f643a7a003e6edf1860bc3afcdc749cb513f3", size = 1947191, upload-time = "2026-04-20T14:43:14.319Z" }, + { url = "https://files.pythonhosted.org/packages/60/62/0c1acfe10945b83a6a59d19fbaa92f48825381509e5701b855c08f13db76/pydantic_core-2.46.3-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6529d1d128321a58d30afcc97b49e98836542f68dd41b33c2e972bb9e5290536", size = 2123791, upload-time = "2026-04-20T14:43:22.766Z" }, + { url = "https://files.pythonhosted.org/packages/75/3e/3b2393b4c8f44285561dc30b00cf307a56a2eff7c483a824db3b8221ca51/pydantic_core-2.46.3-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:975c267cff4f7e7272eacbe50f6cc03ca9a3da4c4fbd66fffd89c94c1e311aa1", size = 2153197, upload-time = "2026-04-20T14:44:27.932Z" }, + { url = "https://files.pythonhosted.org/packages/ba/75/5af02fb35505051eee727c061f2881c555ab4f8ddb2d42da715a42c9731b/pydantic_core-2.46.3-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:2b8e4f2bbdf71415c544b4b1138b8060db7b6611bc927e8064c769f64bed651c", size = 2181073, upload-time = "2026-04-20T14:43:20.729Z" }, + { url = "https://files.pythonhosted.org/packages/10/92/7e0e1bd9ca3c68305db037560ca2876f89b2647deb2f8b6319005de37505/pydantic_core-2.46.3-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:e61ea8e9fff9606d09178f577ff8ccdd7206ff73d6552bcec18e1033c4254b85", size = 2315886, upload-time = "2026-04-20T14:44:04.826Z" }, + { url = "https://files.pythonhosted.org/packages/b8/d8/101655f27eaf3e44558ead736b2795d12500598beed4683f279396fa186e/pydantic_core-2.46.3-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b504bda01bafc69b6d3c7a0c7f039dcf60f47fab70e06fe23f57b5c75bdc82b8", size = 2360528, upload-time = "2026-04-20T14:40:47.431Z" }, + { url = "https://files.pythonhosted.org/packages/07/0f/1c34a74c8d07136f0d729ffe5e1fdab04fbdaa7684f61a92f92511a84a15/pydantic_core-2.46.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:b00b76f7142fc60c762ce579bd29c8fa44aaa56592dd3c54fab3928d0d4ca6ff", size = 2184144, upload-time = "2026-04-20T14:42:57Z" }, ] [[package]] name = "pydantic-extra-types" -version = "2.11.2" +version = "2.11.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/41/d3/3be31542180c0300b6860129ff1e3a428f3ef580727616ce22462626129b/pydantic_extra_types-2.11.2.tar.gz", hash = "sha256:3a2b83b61fe920925688e7838b59caa90a45637d1dbba2b1364b8d1f7ff72a0a", size = 203929, upload-time = "2026-04-05T20:50:51.556Z" } +sdist = { url = "https://files.pythonhosted.org/packages/66/71/dba38ee2651f84f7842206adbd2233d8bbdb59fb85e9fa14232486a8c471/pydantic_extra_types-2.11.1.tar.gz", hash = "sha256:46792d2307383859e923d8fcefa82108b1a141f8a9c0198982b3832ab5ef1049", size = 172002, upload-time = "2026-03-16T08:08:03.92Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/92/a4/7b6ab05c18d6c6e682382a0f0235301684452c4131a869f45961d1d032c9/pydantic_extra_types-2.11.2-py3-none-any.whl", hash = "sha256:683b8943252543e49760f89733b1519bc62f31d1a287ebbdc5a7b7959fb4acfd", size = 82851, upload-time = "2026-04-05T20:50:50.036Z" }, + { url = "https://files.pythonhosted.org/packages/17/c1/3226e6d7f5a4f736f38ac11a6fbb262d701889802595cdb0f53a885ac2e0/pydantic_extra_types-2.11.1-py3-none-any.whl", hash = "sha256:1722ea2bddae5628ace25f2aa685b69978ef533123e5638cfbddb999e0100ec1", size = 79526, upload-time = "2026-03-16T08:08:02.533Z" }, ] [[package]] @@ -2721,32 +2744,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/33/29/e756e715a48959f1c0045342088d7ca9762a2f509b945f362a316e9412b7/pytest_benchmark-5.2.3-py3-none-any.whl", hash = "sha256:bc839726ad20e99aaa0d11a127445457b4219bdb9e80a1afc4b51da7f96b0803", size = 45255, upload-time = "2025-11-09T18:48:39.765Z" }, ] -[[package]] -name = "pytest-codspeed" -version = "4.4.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cffi" }, - { name = "pytest" }, - { name = "rich" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/52/bc/9070fdbfb479a0e92a12652a68875de157dc9be7dc4865a06a519e3a1877/pytest_codspeed-4.4.0.tar.gz", hash = "sha256:edb7c101d9c50439a42cf02cfa9c0ac92da618841636bbebf87c3fa54669442a", size = 201093, upload-time = "2026-04-14T15:13:20.014Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b5/8d/773162f910630c87ba5ea992ff1f267099ee55b3872f65bcbab5da9bc239/pytest_codspeed-4.4.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f3ae6f4053042c3a9ae3b05416fb42253c5e514e89391eb25e9c9e3ac8de8677", size = 820073, upload-time = "2026-04-14T15:12:57.575Z" }, - { url = "https://files.pythonhosted.org/packages/1c/90/9f0cc2fc3245a3d3ee349fd521d6737ac26f79dfb94ed826086bb6ddd321/pytest_codspeed-4.4.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:83479a6719598d2910969a60cc410c7283c262c876422a9157dca2f2ab42fa1d", size = 828915, upload-time = "2026-04-14T15:12:59.346Z" }, - { url = "https://files.pythonhosted.org/packages/97/26/b9a6620f52642ae6b7ba3f8c2dd3d85c636869a600553deabea98a7ae00e/pytest_codspeed-4.4.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:29b1bf8a36e18d11641a5e610e23a94036b04185e3099978d81a873a5bd3635c", size = 820072, upload-time = "2026-04-14T15:13:00.636Z" }, - { url = "https://files.pythonhosted.org/packages/de/4a/08a974ec4467258aa8e00d7ef3993c454ca265d6fe09bd6335135d818cb3/pytest_codspeed-4.4.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:06943110e7a8a4b54f4b13aaa3ff8db39caa02b2f61705916887649e36b9713a", size = 828928, upload-time = "2026-04-14T15:13:02.084Z" }, - { url = "https://files.pythonhosted.org/packages/3e/70/4a401b37f80aaebbcbfb2803b0fab75331af554cd75755bc2059f7809bb4/pytest_codspeed-4.4.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6a5c1d51e7ca72ffe247c99b9a97a54191185e8f7a27528e2200d7416da2a68b", size = 820334, upload-time = "2026-04-14T15:13:03.605Z" }, - { url = "https://files.pythonhosted.org/packages/16/52/beb46293d414d65163f8f3218aaa2f05e53bdc5cf64f24cc3843c31d3ca4/pytest_codspeed-4.4.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:215170441e57bfcbefd179dfd86ccd54ed0ee235e0602a068ce4448b35f13cb2", size = 829269, upload-time = "2026-04-14T15:13:05.197Z" }, - { url = "https://files.pythonhosted.org/packages/78/53/031793dab3a0edbbcbbd8755648ace0853f4cfb92a0e09e620f301f9ef5d/pytest_codspeed-4.4.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee3e1964446011ca192eebf0350227df231a5b88af57e518f2a4328fc8ca5131", size = 820300, upload-time = "2026-04-14T15:13:06.791Z" }, - { url = "https://files.pythonhosted.org/packages/e7/66/0c3530c0dd9959b7f0930551b3de296db391040e5e8ad3e0cab917736980/pytest_codspeed-4.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:340dbb1cc5a21434e0e29bd68ab03c7dc7ad9bfde09d1980b7161352c4c2f048", size = 829201, upload-time = "2026-04-14T15:13:08Z" }, - { url = "https://files.pythonhosted.org/packages/f2/8a/24c7997d95f8bda081b8d4346750a5db0d9d8405183ee5cb9062f7381476/pytest_codspeed-4.4.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:413666266762f9cef1321ba971a9e127b97a1f1dad40ddfd2184c2bc5ac157f9", size = 820242, upload-time = "2026-04-14T15:13:09.191Z" }, - { url = "https://files.pythonhosted.org/packages/8b/7f/3912bf6c2bcddb69189d23213f28e5bc058fd4c78fca15dd0010938154b0/pytest_codspeed-4.4.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e258e6c3d5a8a02ae02a64831be3acd44c19210ffbf13321bdbb8c111c5c6fe4", size = 829190, upload-time = "2026-04-14T15:13:10.762Z" }, - { url = "https://files.pythonhosted.org/packages/d8/f4/2cc5e10847aee4233690aa511df6b6f1c2c09f9d8ae506628a138f4ba201/pytest_codspeed-4.4.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:56d5dd94dcb69460f916acb9c69865d0171b98acec3ce256645d0c0275b553d7", size = 827557, upload-time = "2026-04-14T15:13:12.553Z" }, - { url = "https://files.pythonhosted.org/packages/7f/57/982ce8aa81089b285730dca8404c76af648af41e46d95012be54452913e6/pytest_codspeed-4.4.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:33c38e0e797c74506004f231fc53eab0e412987de281755f714018334381aa3a", size = 835388, upload-time = "2026-04-14T15:13:14.232Z" }, - { url = "https://files.pythonhosted.org/packages/99/36/9e84323c6be426728e897133f8e9f3e65a90c26c137e190ca9b27bf304c3/pytest_codspeed-4.4.0-py3-none-any.whl", hash = "sha256:a6aab2fa73523f538e7729c20ccf4a1e8e921324c9877a816b05334135950fd9", size = 203809, upload-time = "2026-04-14T15:13:18.72Z" }, -] - [[package]] name = "pytest-cov" version = "7.1.0" @@ -3047,18 +3044,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/01/1b/5dbe84eefc86f48473947e2f41711aded97eecef1231f4558f1f02713c12/pyzmq-27.1.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c9f7f6e13dff2e44a6afeaf2cf54cee5929ad64afaf4d40b50f93c58fc687355", size = 544862, upload-time = "2025-09-08T23:09:56.509Z" }, ] -[[package]] -name = "qir-qis" -version = "0.1.4" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/43/98/0ff34bb2016bf67d4ec708067df4c083bba41c6b616334866b19027989fc/qir_qis-0.1.4-cp310-abi3-macosx_15_0_arm64.whl", hash = "sha256:5889f93960216f1f66f7e05d37873edcbf21a1f5c6f24cdb667a16cc90bef202", size = 21862662, upload-time = "2026-03-17T20:02:50.094Z" }, - { url = "https://files.pythonhosted.org/packages/a0/07/c40232233d5d831927020d1f634ca815cc172726aa7635cd245810c05f19/qir_qis-0.1.4-cp310-abi3-macosx_15_0_x86_64.whl", hash = "sha256:373c5c258605648bee53b00fc0f1acda9c40543242b93ce25982eba5f034e136", size = 23224260, upload-time = "2026-03-17T20:02:52.895Z" }, - { url = "https://files.pythonhosted.org/packages/e0/69/1ee1d966b4703988c066d4bfabc56e338ac285dc61654198110310882ba8/qir_qis-0.1.4-cp310-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:a7bdd4cd5c98c42ffbbb790279708fd871c09b5f52cfee36a25aaed608eedcc1", size = 28695899, upload-time = "2026-03-17T20:02:55.753Z" }, - { url = "https://files.pythonhosted.org/packages/1c/ad/f89d038322062fa35881932ab0828ce73db7ea06aa54df356c411928ed02/qir_qis-0.1.4-cp310-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:390b5abc1be0154f9b623e75528ffc9cbf41aac4cd6173bfec6088db50777d8e", size = 26034079, upload-time = "2026-03-17T20:02:58.376Z" }, - { url = "https://files.pythonhosted.org/packages/e1/81/f25de0a11e190dce0c7e5e53785fc998ead74c9666d87272cc37c1bb0ef4/qir_qis-0.1.4-cp310-abi3-win_amd64.whl", hash = "sha256:b596b3f6c644c6d519c97747d18c6df599098a6ea18b1545e295deaf6f756e71", size = 20328023, upload-time = "2026-03-17T20:03:01.094Z" }, -] - [[package]] name = "qwasm" version = "1.0.1" @@ -3133,19 +3118,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl", hash = "sha256:6c3d97604e4c5ce9f714898e05401a0445a641cfa276432b0a648c80856f6a3f", size = 8046, upload-time = "2025-07-18T01:05:03.843Z" }, ] -[[package]] -name = "rich" -version = "15.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "markdown-it-py" }, - { name = "pygments" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, -] - [[package]] name = "roman-numerals" version = "4.1.0" @@ -3319,7 +3291,8 @@ name = "scipy" version = "1.15.3" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version < '3.11'", + "python_full_version < '3.11' and platform_machine == 'x86_64' and sys_platform == 'darwin'", + "(python_full_version < '3.11' and platform_machine != 'x86_64') or (python_full_version < '3.11' and sys_platform != 'darwin')", ] dependencies = [ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, @@ -3378,10 +3351,12 @@ name = "scipy" version = "1.17.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.15'", - "python_full_version == '3.14.*'", - "python_full_version >= '3.12' and python_full_version < '3.14'", - "python_full_version == '3.11.*'", + "python_full_version >= '3.15' and platform_machine == 'x86_64' and sys_platform == 'darwin'", + "(python_full_version >= '3.15' and platform_machine != 'x86_64') or (python_full_version >= '3.15' and sys_platform != 'darwin')", + "python_full_version == '3.14.*' and platform_machine == 'x86_64' and sys_platform == 'darwin'", + "python_full_version >= '3.11' and python_full_version < '3.14' and platform_machine == 'x86_64' and sys_platform == 'darwin'", + "(python_full_version == '3.14.*' and platform_machine != 'x86_64') or (python_full_version == '3.14.*' and sys_platform != 'darwin')", + "(python_full_version >= '3.11' and python_full_version < '3.14' and platform_machine != 'x86_64') or (python_full_version >= '3.11' and python_full_version < '3.14' and sys_platform != 'darwin')", ] dependencies = [ { name = "numpy", version = "2.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, @@ -3452,38 +3427,33 @@ wheels = [ [[package]] name = "selene-core" -version = "0.2.6" +version = "0.2.9" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "hugr" }, { name = "lief" }, + { name = "llvmlite", version = "0.45.1", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64' and sys_platform == 'darwin'" }, + { name = "llvmlite", version = "0.47.0", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "networkx", version = "3.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "pydantic" }, { name = "pydot" }, { name = "pyyaml" }, - { name = "qir-qis" }, { name = "typing-extensions" }, { name = "ziglang" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/33/28002766e84074564e6b6d9c91912c7882d56cde18dfc324bb183f5b5813/selene_core-0.2.6-py3-none-any.whl", hash = "sha256:1ae54f599bab727673c42316ea5269dd0e9df874dac21f312c2db9c68aad5554", size = 29073, upload-time = "2026-03-02T17:18:28.663Z" }, + { url = "https://files.pythonhosted.org/packages/4e/a9/a94ad38852346869a9c8da037a92cff867b2fe72e9f512bae561a6bc6d23/selene_core-0.2.9-py3-none-any.whl", hash = "sha256:847c78ea393de43e736adf20c3aa7006ae8f96765299a401abbbda6af9af3128", size = 33096, upload-time = "2026-04-28T12:47:34.292Z" }, ] [[package]] name = "selene-hugr-qis-compiler" version = "0.2.10" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/aa/6b3f287f9330bf077c95bfef3ab350ab1eac0707f7111c38596a22554ecf/selene_hugr_qis_compiler-0.2.10-cp310-abi3-macosx_13_0_arm64.whl", hash = "sha256:2912702073aa37f1bfd1d42678b972b3b10525ed3f5f003091519512331142bd", size = 29532801, upload-time = "2025-11-10T14:48:39.26Z" }, - { url = "https://files.pythonhosted.org/packages/f5/9c/77a1b81e1cedbde6f401fbdc2302bc2221c8cbc46c924ac0bd9cda979799/selene_hugr_qis_compiler-0.2.10-cp310-abi3-macosx_13_0_x86_64.whl", hash = "sha256:60ece08d7ffb792149029f8aad483c546d2f2db8a5d265906bed41479bdc5a9e", size = 32232684, upload-time = "2025-11-10T14:48:42.701Z" }, - { url = "https://files.pythonhosted.org/packages/9d/d0/569e59983549fcf4c050f892927a55af92e0b0ab0622610c58ebbd72c03f/selene_hugr_qis_compiler-0.2.10-cp310-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:fde73e325ad51bb00c40978a4a17ecb31ff968854d39259cee5a600bf2964b54", size = 32893561, upload-time = "2025-11-10T14:48:46.504Z" }, - { url = "https://files.pythonhosted.org/packages/92/b0/abf9cfe11934100a2210468545c7a8b8508534c1c90b882484a9b59fbf96/selene_hugr_qis_compiler-0.2.10-cp310-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9ecb054a543a41ecadcbfdd3d49ba9ada99e5d0806fb1b10638d3e9c1d6e6216", size = 33989527, upload-time = "2025-11-10T14:48:49.734Z" }, - { url = "https://files.pythonhosted.org/packages/12/36/476ac6ffdd5e8edc7d1f4772fb1eb3679e6e38105aa529a3d59a5d211bfa/selene_hugr_qis_compiler-0.2.10-cp310-abi3-win_amd64.whl", hash = "sha256:bf013a2b6910dbac1a811d95822df25d4bdcd96f15d9b1aa263b578834a45c27", size = 29199534, upload-time = "2025-11-10T14:48:52.545Z" }, -] +source = { git = "https://github.com/quantinuum/tket2?subdirectory=qis-compiler&rev=6b13cb8#6b13cb82db440090f8e384b01a26f4b55c946bd9" } [[package]] name = "selene-sim" -version = "0.2.12" +version = "0.2.15" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, @@ -3494,11 +3464,11 @@ dependencies = [ { name = "tqdm" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/c0/16/64621e391f1e375982b3da9bc92bc826f55be867fb8debb69feaeb47b4eb/selene_sim-0.2.12-py3-none-macosx_11_0_arm64.whl", hash = "sha256:2b39acb614b087cc48685b8d98d5374f23dd4940eb67fcd83c8941d257f5de8c", size = 3867309, upload-time = "2026-03-02T17:43:29.205Z" }, - { url = "https://files.pythonhosted.org/packages/f7/55/68c6f521c614e7f457f336d79037149e85a7c46a87d507f3caa5f0956f0a/selene_sim-0.2.12-py3-none-macosx_11_0_x86_64.whl", hash = "sha256:da17278b63c21615203857a313a8d9636a0759210378cf297b5dc35797480f68", size = 3968891, upload-time = "2026-03-02T17:43:31.207Z" }, - { url = "https://files.pythonhosted.org/packages/ca/fa/6169a52d9e2dd2e7c66a34d8b06cbd084947c359d592755e56bb2a128616/selene_sim-0.2.12-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:7b49ca939d2fef88715d6fd294babc636e8e9cf184e6cbcaf83f83fd00a08de7", size = 4331609, upload-time = "2026-03-02T17:43:33.44Z" }, - { url = "https://files.pythonhosted.org/packages/b4/06/b16d1f345e1b100f4575cbdecb6feb6d2760d361b091500c00e3a5c59149/selene_sim-0.2.12-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:c264b0184a2e1339fef23195353e6304e2963c2dec0c1766f5ea3407c7379b95", size = 4370694, upload-time = "2026-03-02T17:43:34.936Z" }, - { url = "https://files.pythonhosted.org/packages/6c/15/4e4e633c9cf61ab23a2f8f5149b8f842eb38952f3ec5cd57e71ea2be614d/selene_sim-0.2.12-py3-none-win_amd64.whl", hash = "sha256:d43ca8c72f6575d70795425c93cf8e45f9cf875348ea9c9af11a5b4a8b72aaf2", size = 2746664, upload-time = "2026-03-02T17:43:36.05Z" }, + { url = "https://files.pythonhosted.org/packages/7b/05/76931c2c757b9a4ac44a75c3b8b1e50209dd94716dad8bc91f8a0023c344/selene_sim-0.2.15-py3-none-macosx_11_0_arm64.whl", hash = "sha256:44f301aeb84de22ab4c0d4a2fc0bfa42a035ae66bc2ba3acbcd6f8c67b0a1284", size = 4055479, upload-time = "2026-04-28T13:13:59.353Z" }, + { url = "https://files.pythonhosted.org/packages/40/1c/90d029fe76a22fbd4462039b6dc35b6574d86775d4cf5fd27da760185d73/selene_sim-0.2.15-py3-none-macosx_11_0_x86_64.whl", hash = "sha256:7d5f67ac8c19b3422e653d697eace0c9599b28b82ea1bdc35cc1c3e09f14145b", size = 4212319, upload-time = "2026-04-28T13:14:00.688Z" }, + { url = "https://files.pythonhosted.org/packages/80/1e/87d3e225f32b05da5813bfe1ff8bf6c70f60c60919044ec48cae9c6ce625/selene_sim-0.2.15-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:2667b07b0d826b770e6381f7d78eda7559487f38e04abe37c5f343b7dbb2703b", size = 4498690, upload-time = "2026-04-28T13:14:02.208Z" }, + { url = "https://files.pythonhosted.org/packages/ec/08/25d10f9c2c410b2d17cb2eb1c63bfe5dc84282e71081cd8e9e2b69db969d/selene_sim-0.2.15-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:aaf5dbee4c988d02f42b18fe3208aaec020743c17faf103e3e749b5459e5d059", size = 4672594, upload-time = "2026-04-28T13:14:03.59Z" }, + { url = "https://files.pythonhosted.org/packages/a8/ed/db54b8a8a23533754d2b4fd7befa38097f82c38e532a6b2dc529db3a7cb6/selene_sim-0.2.15-py3-none-win_amd64.whl", hash = "sha256:564e2ab77eebe4e193fdc373c31f24c650302a00877f3735dc1f5d97718e88eb", size = 9602115, upload-time = "2026-04-28T13:14:05.331Z" }, ] [[package]] @@ -3569,7 +3539,8 @@ name = "sphinx" version = "8.1.3" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version < '3.11'", + "python_full_version < '3.11' and platform_machine == 'x86_64' and sys_platform == 'darwin'", + "(python_full_version < '3.11' and platform_machine != 'x86_64') or (python_full_version < '3.11' and sys_platform != 'darwin')", ] dependencies = [ { name = "alabaster", marker = "python_full_version < '3.11'" }, @@ -3600,10 +3571,12 @@ name = "sphinx" version = "8.2.3" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.15'", - "python_full_version == '3.14.*'", - "python_full_version >= '3.12' and python_full_version < '3.14'", - "python_full_version == '3.11.*'", + "python_full_version >= '3.15' and platform_machine == 'x86_64' and sys_platform == 'darwin'", + "(python_full_version >= '3.15' and platform_machine != 'x86_64') or (python_full_version >= '3.15' and sys_platform != 'darwin')", + "python_full_version == '3.14.*' and platform_machine == 'x86_64' and sys_platform == 'darwin'", + "python_full_version >= '3.11' and python_full_version < '3.14' and platform_machine == 'x86_64' and sys_platform == 'darwin'", + "(python_full_version == '3.14.*' and platform_machine != 'x86_64') or (python_full_version == '3.14.*' and sys_platform != 'darwin')", + "(python_full_version >= '3.11' and python_full_version < '3.14' and platform_machine != 'x86_64') or (python_full_version >= '3.11' and python_full_version < '3.14' and sys_platform != 'darwin')", ] dependencies = [ { name = "alabaster", marker = "python_full_version >= '3.11'" }, @@ -3737,7 +3710,7 @@ version = "0.18.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ptyprocess", marker = "os_name != 'nt'" }, - { name = "pywinpty", marker = "os_name == 'nt'" }, + { name = "pywinpty", marker = "(os_name == 'nt' and platform_machine != 'x86_64') or (os_name == 'nt' and sys_platform != 'darwin')" }, { name = "tornado" }, ] sdist = { url = "https://files.pythonhosted.org/packages/8a/11/965c6fd8e5cc254f1fe142d547387da17a8ebfd75a3455f637c663fb38a0/terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e", size = 32701, upload-time = "2024-03-12T14:34:39.026Z" } @@ -3760,7 +3733,7 @@ wheels = [ [[package]] name = "tket" version = "0.13.0" -source = { git = "https://github.com/quantinuum/tket2?subdirectory=tket-py&rev=c2739b3#c2739b34a694f0b635deb45a60b8a7e739dcb00a" } +source = { git = "https://github.com/quantinuum/tket2?subdirectory=tket-py&rev=6b13cb8#6b13cb82db440090f8e384b01a26f4b55c946bd9" } dependencies = [ { name = "hugr" }, { name = "pytket" }, @@ -3771,12 +3744,12 @@ dependencies = [ [[package]] name = "tket-eccs" version = "0.5.1" -source = { git = "https://github.com/quantinuum/tket2?subdirectory=tket-eccs&rev=c2739b3#c2739b34a694f0b635deb45a60b8a7e739dcb00a" } +source = { git = "https://github.com/quantinuum/tket2?subdirectory=tket-eccs&rev=6b13cb8#6b13cb82db440090f8e384b01a26f4b55c946bd9" } [[package]] name = "tket-exts" version = "0.12.3" -source = { git = "https://github.com/quantinuum/tket2?subdirectory=tket-exts&rev=c2739b3#c2739b34a694f0b635deb45a60b8a7e739dcb00a" } +source = { git = "https://github.com/quantinuum/tket2?subdirectory=tket-exts&rev=6b13cb8#6b13cb82db440090f8e384b01a26f4b55c946bd9" } dependencies = [ { name = "hugr" }, ] @@ -3875,14 +3848,14 @@ wheels = [ [[package]] name = "types-requests" -version = "2.33.0.20260408" +version = "2.33.0.20260503" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/69/6a/749dc53a54a3f35842c1f8197b3ca6b54af6d7458a1bfc75f6629b6da666/types_requests-2.33.0.20260408.tar.gz", hash = "sha256:95b9a86376807a216b2fb412b47617b202091c3ea7c078f47cc358d5528ccb7b", size = 23882, upload-time = "2026-04-08T04:34:49.33Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/b8/57e94268c0d82ac3eaa2fc35aa8ca7bbc2542f726b67dcf90b0b00a3b14d/types_requests-2.33.0.20260503.tar.gz", hash = "sha256:9721b2d9dbee7131f2fb39f20f0ebb1999c18cef4b512c9a7932f3722de7c5f4", size = 23931, upload-time = "2026-05-03T05:20:08.882Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/90/b8/78fd6c037de4788c040fdd323b3369804400351b7827473920f6c1d03c10/types_requests-2.33.0.20260408-py3-none-any.whl", hash = "sha256:81f31d5ea4acb39f03be7bc8bed569ba6d5a9c5d97e89f45ac43d819b68ca50f", size = 20739, upload-time = "2026-04-08T04:34:48.325Z" }, + { url = "https://files.pythonhosted.org/packages/c3/82/959113a6351f3ca046cd0a8cd2cee071d7ea47473560557a01eeae9a6fe2/types_requests-2.33.0.20260503-py3-none-any.whl", hash = "sha256:02aaa7e3577a13471715bb1bddb693cc985ea514f754b503bf033e6a09a3e528", size = 20736, upload-time = "2026-05-03T05:20:07.858Z" }, ] [[package]] @@ -3920,11 +3893,11 @@ wheels = [ [[package]] name = "tzdata" -version = "2026.1" +version = "2026.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/19/f5/cd531b2d15a671a40c0f66cf06bc3570a12cd56eef98960068ebbad1bf5a/tzdata-2026.1.tar.gz", hash = "sha256:67658a1903c75917309e753fdc349ac0efd8c27db7a0cb406a25be4840f87f98", size = 197639, upload-time = "2026-04-03T11:25:22.002Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/19/1b9b0e29f30c6d35cb345486df41110984ea67ae69dddbc0e8a100999493/tzdata-2026.2.tar.gz", hash = "sha256:9173fde7d80d9018e02a662e168e5a2d04f87c41ea174b139fbef642eda62d10", size = 198254, upload-time = "2026-04-24T15:22:08.651Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b0/70/d460bd685a170790ec89317e9bd33047988e4bce507b831f5db771e142de/tzdata-2026.1-py2.py3-none-any.whl", hash = "sha256:4b1d2be7ac37ceafd7327b961aa3a54e467efbdb563a23655fbfe0d39cfc42a9", size = 348952, upload-time = "2026-04-03T11:25:20.313Z" }, + { url = "https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl", hash = "sha256:bbe9af844f658da81a5f95019480da3a89415801f6cc966806612cc7169bffe7", size = 349321, upload-time = "2026-04-24T15:22:05.876Z" }, ] [[package]] @@ -3947,7 +3920,7 @@ wheels = [ [[package]] name = "virtualenv" -version = "21.2.0" +version = "21.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "distlib" }, @@ -3956,9 +3929,9 @@ dependencies = [ { name = "python-discovery" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/aa/92/58199fe10049f9703c2666e809c4f686c54ef0a68b0f6afccf518c0b1eb9/virtualenv-21.2.0.tar.gz", hash = "sha256:1720dc3a62ef5b443092e3f499228599045d7fea4c79199770499df8becf9098", size = 5840618, upload-time = "2026-03-09T17:24:38.013Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/0d/915c02c94d207b85580eb09bffab54438a709e7288524094fe781da526c2/virtualenv-21.3.1.tar.gz", hash = "sha256:c2305bc1fddeec40699b8370d13f8d431b0701f00ce895061ce493aeded4426b", size = 7613791, upload-time = "2026-05-05T01:34:31.402Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c6/59/7d02447a55b2e55755011a647479041bc92a82e143f96a8195cb33bd0a1c/virtualenv-21.2.0-py3-none-any.whl", hash = "sha256:1bd755b504931164a5a496d217c014d098426cddc79363ad66ac78125f9d908f", size = 5825084, upload-time = "2026-03-09T17:24:35.378Z" }, + { url = "https://files.pythonhosted.org/packages/b1/4f/f71e641e504111a5a74e3a20bc52d01bd86788b22699dd3fee1c63253cf6/virtualenv-21.3.1-py3-none-any.whl", hash = "sha256:d1a71cf58f2f9228fff23a1f6ec15d39785c6b32e03658d104974247145edd35", size = 7594539, upload-time = "2026-05-05T01:34:28.98Z" }, ] [[package]] @@ -3982,11 +3955,11 @@ wheels = [ [[package]] name = "wcwidth" -version = "0.6.0" +version = "0.7.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/35/a2/8e3becb46433538a38726c948d3399905a4c7cabd0df578ede5dc51f0ec2/wcwidth-0.6.0.tar.gz", hash = "sha256:cdc4e4262d6ef9a1a57e018384cbeb1208d8abbc64176027e2c2455c81313159", size = 159684, upload-time = "2026-02-06T19:19:40.919Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2c/ee/afaf0f85a9a18fe47a67f1e4422ed6cf1fe642f0ae0a2f81166231303c52/wcwidth-0.7.0.tar.gz", hash = "sha256:90e3a7ea092341c44b99562e75d09e4d5160fe7a3974c6fb842a101a95e7eed0", size = 182132, upload-time = "2026-05-02T16:04:12.653Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl", hash = "sha256:1a3a1e510b553315f8e146c54764f4fb6264ffad731b3d78088cdb1478ffbdad", size = 94189, upload-time = "2026-02-06T19:19:39.646Z" }, + { url = "https://files.pythonhosted.org/packages/41/52/e465037f5375f43533d1a80b6923955201596a99142ed524d77b571a1418/wcwidth-0.7.0-py3-none-any.whl", hash = "sha256:5d69154c429a82910e241c738cd0e2976fac8a2dd47a1a805f4afed1c0f136f2", size = 110825, upload-time = "2026-05-02T16:04:11.033Z" }, ] [[package]] @@ -4018,19 +3991,19 @@ wheels = [ [[package]] name = "ziglang" -version = "0.15.2" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d7/2e/42c49a5b539a595ff5f2293de0bd339636875e44b4c69f51470bdf1d599d/ziglang-0.15.2-py3-none-macosx_12_0_arm64.whl", hash = "sha256:acae2a9ce67ed249ad68d42c21bc73b5f9d51a33ba5ea42f609f78683e8d9bb7", size = 92993702, upload-time = "2025-11-10T06:23:24.805Z" }, - { url = "https://files.pythonhosted.org/packages/c4/c7/151df628321266a38da133d481c5e929bd36d9d0424e8c2b7a9c4964c172/ziglang-0.15.2-py3-none-macosx_12_0_x86_64.whl", hash = "sha256:47af4f85e3e59bd672126cc026d3a01b516cad24b9a9ea075abfe8532f4c6bc1", size = 97049112, upload-time = "2026-01-29T09:44:04.612Z" }, - { url = "https://files.pythonhosted.org/packages/0a/13/006c26f2dc7510385dc549eb44983402e4539519d48567d9a6b0ae71adc7/ziglang-0.15.2-py3-none-manylinux_2_12_i686.manylinux2010_i686.musllinux_1_1_i686.whl", hash = "sha256:04eb9c4135ef431487b920c73312cd3a5e754019839024eeed3521772d1585a2", size = 97299386, upload-time = "2026-01-29T09:44:21.973Z" }, - { url = "https://files.pythonhosted.org/packages/db/81/f9f5c7fd68d80b8edff2a641a1c95ac4125356387d298374227040b8e1e8/ziglang-0.15.2-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.musllinux_1_1_x86_64.whl", hash = "sha256:806316453d1ede7174ed3fefb8e5348154629089c3bb5fe812dfd0e172fac130", size = 93508126, upload-time = "2026-01-29T09:44:41.936Z" }, - { url = "https://files.pythonhosted.org/packages/53/7d/8c277208250ffa72f12a10f52dfc1d45850f08244093065b40c5f4628260/ziglang-0.15.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:edc0aa60ec964a4cf462d40f68d7de242ddf37fd9a80f2afaee6397059463230", size = 90542084, upload-time = "2026-01-29T09:45:00.806Z" }, - { url = "https://files.pythonhosted.org/packages/cf/ba/b85879ff883f152e2278852d3f8af37924badefaabb38d89e62a5d066b40/ziglang-0.15.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:ad43a4692311512ab55cc918596c814ff44fb811b1299fa9a57cc4e2bf315c6b", size = 91550707, upload-time = "2026-01-29T09:45:22.725Z" }, - { url = "https://files.pythonhosted.org/packages/57/ef/09d2baf722521d3878b8e17d3ee6271f02c7ef7ec398bbd059fa6466a5e6/ziglang-0.15.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.musllinux_1_1_ppc64le.whl", hash = "sha256:85faefbd4cfe420de92aaa8f8300bec2b9afe8d1f1d8c5abf71bf92754682536", size = 99943068, upload-time = "2026-01-29T09:45:42.651Z" }, - { url = "https://files.pythonhosted.org/packages/7b/5d/5690870969ed52501deaa4c722c476279a00d2c034ef7f82cf778507c3fd/ziglang-0.15.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.musllinux_1_1_s390x.whl", hash = "sha256:978ebcc3c6c9624cbc999dd8dcb65427e7474650d9709a889aace8e325705ce2", size = 99561757, upload-time = "2026-01-29T09:46:03.149Z" }, - { url = "https://files.pythonhosted.org/packages/b5/da/2e6655300a3174bd6299c06da577b0cb14685058d9b00b61042cf9d9e38b/ziglang-0.15.2-py3-none-manylinux_2_31_riscv64.musllinux_1_1_riscv64.whl", hash = "sha256:d3fe40825e18238e986b305cbf3a4d93a50461b893339e31c81b0d6c73f33937", size = 94112157, upload-time = "2026-01-29T09:46:24.268Z" }, - { url = "https://files.pythonhosted.org/packages/57/04/e54964be82dce7b9a5708a8a5f345d373bc78c558c0712e6e356593292ec/ziglang-0.15.2-py3-none-win32.whl", hash = "sha256:b174f7ebb9d1f2210d32d1420333120f6117ebee3de8b3e221e6ebb0c3beec4b", size = 96136271, upload-time = "2026-01-29T09:46:47.975Z" }, - { url = "https://files.pythonhosted.org/packages/b9/6b/8ab0853a312108b4089747486366b824b5da89773cb56f661f9994de17db/ziglang-0.15.2-py3-none-win_amd64.whl", hash = "sha256:ca80dc9c70dbdfdd9ee51d000de3501a95d33d9782ab9ab9b56f700484ebcd83", size = 94052409, upload-time = "2026-01-29T09:47:02.419Z" }, - { url = "https://files.pythonhosted.org/packages/1e/b4/dec7e1b867ce3640f9bba9204f8ea658f6ca5161350e92b76bf17aeffb9b/ziglang-0.15.2-py3-none-win_arm64.whl", hash = "sha256:a81ebfc61e1b7aa43a33add23f93b98954d757434f894eb21bd40b176b6688aa", size = 89688080, upload-time = "2026-01-29T09:47:20.903Z" }, +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cd/59/012f0c2800f7428b87bb16c5c78db7ef806efed274491998155955c02558/ziglang-0.16.0-py3-none-macosx_12_0_arm64.whl", hash = "sha256:b61e5413c49508d9d62e5dcea543e3af491594154d74a00ff52f84ed508260cc", size = 97252633, upload-time = "2026-04-15T03:55:02.488Z" }, + { url = "https://files.pythonhosted.org/packages/75/60/f924aa24b95a1ad347e845acc7ab6b5d062ae5b0b540d494654cd40d4e0b/ziglang-0.16.0-py3-none-macosx_12_0_x86_64.whl", hash = "sha256:18e14f6b25678d7b7c65708c82501ee6090fe39ed5c783477d56267af1fa5629", size = 101228024, upload-time = "2026-04-15T03:55:12.268Z" }, + { url = "https://files.pythonhosted.org/packages/cd/aa/7966d158d768fb0e40bf5fef6e7ffe230dfee502382782ec39be1331ee4a/ziglang-0.16.0-py3-none-manylinux_2_12_i686.manylinux2010_i686.musllinux_1_1_i686.whl", hash = "sha256:8b83661247430aa335b3cbc29569084900412dde5633b02c80a6d2ff734de3d2", size = 101810276, upload-time = "2026-04-15T03:55:17.843Z" }, + { url = "https://files.pythonhosted.org/packages/3e/ed/7b79023aa27ceb5d461ecf761181e7c33c57bbc1a6256a39535d1c7083d2/ziglang-0.16.0-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.musllinux_1_1_x86_64.whl", hash = "sha256:9fcda73f62b851dd72a54b710ad40a209896db14cfb13649e62191243556342b", size = 97941847, upload-time = "2026-04-15T03:55:23.246Z" }, + { url = "https://files.pythonhosted.org/packages/7e/ed/d6663a5e52c504944d578b9e0bfcb7857f292803bcd09ebe0d10fe2b293d/ziglang-0.16.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:e27d409812b11e0fb89ed0200cf2e55b6464d43f9461553104e4a4f9a94a1fd5", size = 95008112, upload-time = "2026-04-15T03:55:32.025Z" }, + { url = "https://files.pythonhosted.org/packages/07/e4/beae76926e3070978d06fa156b243642d5f75ffd784f7cd64e783520e456/ziglang-0.16.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:7249779f0f916cfd2d1a9d54eb7600f3901384dc8dcbe1eea226bd32a8237fb5", size = 95860236, upload-time = "2026-04-15T03:55:37.069Z" }, + { url = "https://files.pythonhosted.org/packages/b6/fc/5cb1555281d2a998355ee7081f05f45d2f6a2789ca0fcb02015cfcb4b900/ziglang-0.16.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.musllinux_1_1_ppc64le.whl", hash = "sha256:0fd671c599f6961638cc302cf1f9461486696385311d4c0276171dcf7d2b67f5", size = 104100995, upload-time = "2026-04-15T03:55:42.594Z" }, + { url = "https://files.pythonhosted.org/packages/4a/34/e0138d89ec47da986ac08009ae8802af052c1e335163d983c074d9eaa1c3/ziglang-0.16.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.musllinux_1_1_s390x.whl", hash = "sha256:df0e6599e41d087c912b0d3d7cedef6c9cb1f0032465c8fc820e9986772d11e4", size = 103517876, upload-time = "2026-04-15T03:55:48.695Z" }, + { url = "https://files.pythonhosted.org/packages/fe/29/d281591fa0be47aefcb23ac379cdbff5b34a1fdaafa139a5f8703ca9559c/ziglang-0.16.0-py3-none-manylinux_2_31_riscv64.musllinux_1_1_riscv64.whl", hash = "sha256:d4bd8197344fffe276e1d6446e4ef7bc38637d821b4685fe96a936503d4b0619", size = 98388042, upload-time = "2026-04-15T03:55:54.114Z" }, + { url = "https://files.pythonhosted.org/packages/5d/f0/10a5203071af21bd649a0f97e29f70b710d6ad97b1ac1995a0bb30f51a71/ziglang-0.16.0-py3-none-win32.whl", hash = "sha256:f978c12b5337cf418034964de00023b7ec5ec484383dc97c6a6585f4a9105840", size = 100655765, upload-time = "2026-04-15T03:55:59.7Z" }, + { url = "https://files.pythonhosted.org/packages/a6/3c/baff40b3fc8ab4e83530246a52e8f3a5186c3606562712dfb58483b04f79/ziglang-0.16.0-py3-none-win_amd64.whl", hash = "sha256:089a16a4eb5a2f45151993342f8fabad24ff1a0723dc146642895c29208a3939", size = 98676957, upload-time = "2026-04-15T03:56:05.934Z" }, + { url = "https://files.pythonhosted.org/packages/f0/0b/bff28a4acc437cb7da705bffafd81fafbbd37a23144363cecc72becaef93/ziglang-0.16.0-py3-none-win_arm64.whl", hash = "sha256:e44a5271f7b72f7980017bb615823ed52e765f96b6482d93a2fd338cd53101bf", size = 94347646, upload-time = "2026-04-15T03:56:11.85Z" }, ]