Skip to content

Layout

PhysicalLayoutHeuristicGraphPartitionCenterOut dataclass

PhysicalLayoutHeuristicGraphPartitionCenterOut(
    arch_spec: ArchSpec = get_physical_layout_arch_spec(),
    max_words: int | None = None,
    u_factor: int = 1,
    partitioner_seed: int = 0,
)

Bases: LayoutHeuristicABC


              flowchart TD
              bloqade.lanes.heuristics.physical.layout.PhysicalLayoutHeuristicGraphPartitionCenterOut[PhysicalLayoutHeuristicGraphPartitionCenterOut]
              bloqade.lanes.analysis.layout.analysis.LayoutHeuristicABC[LayoutHeuristicABC]

                              bloqade.lanes.analysis.layout.analysis.LayoutHeuristicABC --> bloqade.lanes.heuristics.physical.layout.PhysicalLayoutHeuristicGraphPartitionCenterOut
                


              click bloqade.lanes.heuristics.physical.layout.PhysicalLayoutHeuristicGraphPartitionCenterOut href "" "bloqade.lanes.heuristics.physical.layout.PhysicalLayoutHeuristicGraphPartitionCenterOut"
              click bloqade.lanes.analysis.layout.analysis.LayoutHeuristicABC href "" "bloqade.lanes.analysis.layout.analysis.LayoutHeuristicABC"
            

home_word_ids property

home_word_ids: tuple[int, ...]

Home words for one-zone physical layout.

Uses the arch-level home-word computation from zone entangling pairs.

sites_per_partition property

sites_per_partition: int

Maximum number of qubits placed per home word.

compute_layout

compute_layout(
    all_qubits: tuple[int, ...],
    stages: list[tuple[tuple[int, int], ...]],
    pinned: dict[int, LocationAddress] | None = None,
) -> tuple[LocationAddress, ...]

Compute the initial qubit layout from circuit stages.

Parameters:

Name Type Description Default
all_qubits tuple[int, ...]

Tuple of logical qubit indices to be mapped.

required
stages list[tuple[tuple[int, int], ...]]

List of circuit stages, where each stage is a tuple of (control, target) qubit pairs representing two-qubit gates.

required
pinned dict[int, LocationAddress] | None

Map from logical qubit ID to pre-pinned LocationAddress. Implementations MUST place each pinned qubit at its requested address and MUST NOT use any address in pinned.values() for un-pinned qubits. None or empty preserves previous behavior. All values in pinned MUST be valid home positions for the architecture (i.e. present in arch_spec.home_sites); passing an out-of-arch address raises ValueError.

None

Returns:

Type Description
LocationAddress

A tuple of LocationAddress objects mapping logical qubit indices

...

to physical locations. Pinned IDs return their pinned address;

tuple[LocationAddress, ...]

un-pinned IDs return the heuristic's choice. Raises if no legal

tuple[LocationAddress, ...]

layout exists.

Source code in .venv/lib/python3.12/site-packages/bloqade/lanes/heuristics/physical/layout.py
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
def compute_layout(
    self,
    all_qubits: tuple[int, ...],
    stages: list[tuple[tuple[int, int], ...]],
    pinned: dict[int, LocationAddress] | None = None,
) -> tuple[LocationAddress, ...]:
    pinned = {} if pinned is None else pinned
    if len(set(pinned.values())) < len(pinned):
        raise ValueError(
            "pinned addresses must be unique; two qubit IDs share the same address"
        )
    extra_keys = set(pinned) - set(all_qubits)
    if extra_keys:
        raise ValueError(
            f"pinned contains qubit IDs not in all_qubits: {sorted(extra_keys)}"
        )
    self._validate_pinned_in_arch(pinned, self.arch_spec)
    qubits = tuple(sorted(all_qubits))
    cz_layers = _to_cz_layers(stages)
    return self._compute_layout_from_cz_layers(qubits, cz_layers, pinned)