Skip to content

No return

No-return placement strategy using the loose-goal entangling solver.

Instead of fixed target positions, this strategy passes CZ pair constraints to the Rust solve_entangling solver, which simultaneously discovers both the entangling placement and the routing. Layers are chained: the output configuration of one CZ layer becomes the input for the next, so atoms do not return to their home positions between CZ gates.

NoReturnPlacementStrategy dataclass

NoReturnPlacementStrategy(
    arch_spec: ArchSpec,
    strategy: SearchStrategy = (
        lambda: SearchStrategy.IDS
    )(),
    max_expansions: int | None = 100,
    restarts: int = 20,
    deadlock_policy: DeadlockPolicy = (
        lambda: DeadlockPolicy.MOVE_BLOCKERS
    )(),
    top_c: int | None = 3,
    congestion_weight: float = 0.0,
    occupancy_penalty: float = 1.0,
    hungarian_horizon: int | None = 4,
)

Bases: NoReturnStrategyBase


              flowchart TD
              bloqade.lanes.heuristics.physical.no_return.NoReturnPlacementStrategy[NoReturnPlacementStrategy]
              bloqade.lanes.heuristics.physical._no_return_base.NoReturnStrategyBase[NoReturnStrategyBase]
              bloqade.lanes.analysis.placement.strategy.PlacementStrategyABC[PlacementStrategyABC]

                              bloqade.lanes.heuristics.physical._no_return_base.NoReturnStrategyBase --> bloqade.lanes.heuristics.physical.no_return.NoReturnPlacementStrategy
                                bloqade.lanes.analysis.placement.strategy.PlacementStrategyABC --> bloqade.lanes.heuristics.physical._no_return_base.NoReturnStrategyBase
                



              click bloqade.lanes.heuristics.physical.no_return.NoReturnPlacementStrategy href "" "bloqade.lanes.heuristics.physical.no_return.NoReturnPlacementStrategy"
              click bloqade.lanes.heuristics.physical._no_return_base.NoReturnStrategyBase href "" "bloqade.lanes.heuristics.physical._no_return_base.NoReturnStrategyBase"
              click bloqade.lanes.analysis.placement.strategy.PlacementStrategyABC href "" "bloqade.lanes.analysis.placement.strategy.PlacementStrategyABC"
            

No-return placement via the loose-goal entangling constraint solver.

Calls :pymethod:MoveSolver.solve_entangling once per CZ layer to find both the entangling placement and the routing simultaneously. Each layer's output layout is passed as the next layer's input, saving the cost of palindrome return moves.

Parameters

arch_spec: Architecture specification. strategy: Inner search strategy as a :class:SearchStrategy enum (e.g. 🇵🇾attr:SearchStrategy.IDS (default), 🇵🇾attr:SearchStrategy.ASTAR, 🇵🇾attr:SearchStrategy.ENTROPY). max_expansions: Maximum node expansions per solve call. restarts: Number of parallel restarts with perturbed scoring. Each restart gets a different seed for the greedy CZ-pair-to-slot assignment, producing diverse target layouts; pick_best keeps the lowest- cost result. Default 20. deadlock_policy: :class:DeadlockPolicy enum value (default 🇵🇾attr:DeadlockPolicy.MOVE_BLOCKERS). top_c: Per-qubit move-candidate pruning cap inside HeuristicGenerator. None keeps all scored bus options. Default 3 matches the previously-hardcoded behaviour. Larger values broaden the search but slow per-node expansion. congestion_weight: Penalty weight for the entangling Hungarian assignment to spread CZ pairs across word pairs. 0.0 (default) uses standard min-sum assignment; positive values reduce routing serialization at high occupancy at some cost in total atom moves. occupancy_penalty: Per-slot-half penalty (in lane-hop units) added to the Hungarian cost for slots currently held by spectator atoms (atoms not in any CZ pair of the current layer). Steers the assignment away from slots that would force the search to evict a non-participating atom. 0.0 recovers the legacy occupancy-blind behaviour. Default 1.0 was tuned on the 80q / depth 3 / max_pairs 10 regime; deeper sparse-pair circuits prefer larger values (~2–3). hungarian_horizon: Cap on the number of future CZ layers fed to the Hungarian forward/backward sweep. 0 disables lookahead entirely; None is unbounded (all future layers). Default 4 keeps solve time bounded regardless of circuit depth.