Skip to content

Commit

Permalink
Add initial routing code.
Browse files Browse the repository at this point in the history
  • Loading branch information
johngarvin-quantinuum committed Sep 28, 2023
1 parent 034cbcb commit 27e21f7
Showing 1 changed file with 34 additions and 0 deletions.
34 changes: 34 additions & 0 deletions pytket/phir/routing.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# Copyright (c) 2023 Quantinuum LLC.
# INSERT LICENSE HERE
"""
Routing functions. For simulation we don't need to create a sequence of
transport operations; we are only interested in the time cost to transport from
one state to another.
"""

from __future__ import annotations


def inverse(lst: list[int]) -> list[int]:
"""Inverse of a permutation list. If a[i] = x, then inverse(a)[x] = i."""
inv = [-1] * len(lst)
for (i, elem) in enumerate(lst):
if not 0 <= elem < len(lst):
raise ValueError(f"List contains element not in range: {elem}")
if inv[elem] != -1:
raise ValueError(f"List contains duplicate elements: {lst}")
inv[elem] = i
return inv

def transport_cost(init: list[int], goal: list[int], swap_cost: float) -> float:
"""Cost of transport from init to goal.
This is based on the number of parallel swaps performed by Odd-Even
Transposition Sort, which is the maximum distance that any qubit travels.
"""
if len(init) != len(goal):
raise ValueError(
f"init and goal lists have different lengths: {len(init)} vs. {len(goal)}"
)
n_swaps = max(abs(g - i) for (i, g) in zip(inverse(init), inverse(goal)))
return n_swaps * swap_cost

0 comments on commit 27e21f7

Please sign in to comment.