From a773d444cd163763d39ee2dd4c6ea25f0e8e9c91 Mon Sep 17 00:00:00 2001 From: Kartik Singhal Date: Thu, 9 Nov 2023 14:13:34 -0600 Subject: [PATCH] fix(typing): Layer -> ShardLayer, and introduce another Layer type --- pytket/phir/phirgen.py | 4 ++-- pytket/phir/place_and_route.py | 4 ++-- pytket/phir/placement.py | 2 +- pytket/phir/sharding/shard.py | 2 +- pytket/phir/sharding/shards2ops.py | 19 +++++++++++++------ 5 files changed, 19 insertions(+), 12 deletions(-) diff --git a/pytket/phir/phirgen.py b/pytket/phir/phirgen.py index d2f5f63..4ac492b 100644 --- a/pytket/phir/phirgen.py +++ b/pytket/phir/phirgen.py @@ -8,7 +8,7 @@ from pytket.circuit.logic_exp import RegWiseOp from pytket.unit_id import UnitID -from .sharding.shard import Cost, Layer, Ordering +from .sharding.shard import Cost, Ordering, ShardLayer logger = logging.getLogger(__name__) @@ -235,7 +235,7 @@ def append_cmd(cmd: tk.Command, ops: list[dict[str, Any]]) -> None: def genphir( - inp: list[tuple[Ordering, Layer, Cost]], *, machine_ops: bool = True + inp: list[tuple[Ordering, ShardLayer, Cost]], *, machine_ops: bool = True ) -> str: """Convert a list of shards to the equivalent PHIR. diff --git a/pytket/phir/place_and_route.py b/pytket/phir/place_and_route.py index e153e84..aeaf0e3 100644 --- a/pytket/phir/place_and_route.py +++ b/pytket/phir/place_and_route.py @@ -1,14 +1,14 @@ from .machine import Machine from .placement import optimized_place from .routing import transport_cost -from .sharding.shard import Cost, Layer, Ordering, Shard +from .sharding.shard import Cost, Ordering, Shard, ShardLayer from .sharding.shards2ops import parse_shards_naive def place_and_route( shards: list[Shard], machine: Machine | None = None, -) -> list[tuple[Ordering, Layer, Cost]]: +) -> list[tuple[Ordering, ShardLayer, Cost]]: """Get all the routing info needed for PHIR generation.""" shard_set = set(shards) circuit_rep, shard_layers = parse_shards_naive(shard_set) diff --git a/pytket/phir/placement.py b/pytket/phir/placement.py index c86c6c7..722f488 100644 --- a/pytket/phir/placement.py +++ b/pytket/phir/placement.py @@ -37,7 +37,7 @@ def placement_check( # If there are no operations to place, it does not matter where the # qubits are and any placement is valid - if len(ops) == 0: + if not ops: return True # assume ops look like this [[1,2],[3],[4],[5,6],[7],[8],[9,10]] diff --git a/pytket/phir/sharding/shard.py b/pytket/phir/sharding/shard.py index ffc2572..685aaa3 100644 --- a/pytket/phir/sharding/shard.py +++ b/pytket/phir/sharding/shard.py @@ -61,5 +61,5 @@ def pretty_print(self) -> str: Cost: TypeAlias = float -Layer: TypeAlias = list[Shard] +ShardLayer: TypeAlias = list[Shard] Ordering: TypeAlias = list[int] diff --git a/pytket/phir/sharding/shards2ops.py b/pytket/phir/sharding/shards2ops.py index 69aafbb..81068d2 100644 --- a/pytket/phir/sharding/shards2ops.py +++ b/pytket/phir/sharding/shards2ops.py @@ -1,20 +1,27 @@ -from .shard import Shard +from typing import TypeAlias + +from .shard import Shard, ShardLayer + +Layer: TypeAlias = list[list[int]] def parse_shards_naive( shards: set[Shard], -) -> tuple[list[list[list[int]]], list[list[Shard]]]: +) -> tuple[list[Layer], list[ShardLayer]]: """Parse a set of shards and return a circuit representation for placement.""" - layers: list[list[list[int]]] = [] - shards_in_layer: list[list[Shard]] = [] + layers: list[Layer] = [] + shards_in_layer: list[ShardLayer] = [] scheduled: set[int] = set() num_shards: int = len(shards) while len(scheduled) < num_shards: - layer: list[list[int]] = [] + layer: Layer = [] + # Iterate the shards, looking for shards whose dependencies have been # satisfied, or initially, shards with no dependencies - to_schedule = [s for s in shards if s.depends_upon.issubset(scheduled)] + to_schedule: ShardLayer = [ + s for s in shards if s.depends_upon.issubset(scheduled) + ] shards_in_layer.append(to_schedule) shards.difference_update(to_schedule)