Source code for mqt.ionshuttler.single_shuttler.main
# Copyright (c) 2023 - 2026 Chair for Design Automation, TUM
# All rights reserved.
#
# SPDX-License-Identifier: MIT
#
# Licensed under the MIT License
import random
import sys
import time
from typing import Any
from .memory_sat import MemorySAT, create_graph
[docs]
def main(config: dict[str, Any], plot: bool = False) -> None:
arch = config["arch"]
max_timesteps = config["max_timesteps"]
num_ion_chains = config["num_ion_chains"]
qu_alg = [(q[0] if len(q) == 1 else tuple(q)) for q in config["qu_alg"]]
# create graph
m, n = arch[0], arch[1]
ion_chain_size_vertical = arch[2]
ion_chain_size_horizontal = arch[3]
graph = create_graph(m, n, ion_chain_size_vertical, ion_chain_size_horizontal)
n_of_traps = len([trap for trap in graph.edges() if graph.get_edge_data(trap[0], trap[1])["edge_type"] == "trap"])
# starting edges / ions
rand = False
if rand is True:
random.seed(0)
random_starting_traps = random.sample(range(n_of_traps), (num_ion_chains))
starting_traps = []
for trap in random_starting_traps:
starting_traps.append(
[edges for edges in graph.edges() if graph.get_edge_data(edges[0], edges[1])["edge_type"] == "trap"][
trap
]
)
else:
starting_traps = [
edges for edges in graph.edges() if graph.get_edge_data(edges[0], edges[1])["edge_type"] == "trap"
][:num_ion_chains]
number_of_registers = len(starting_traps)
# place ions onto traps (ion0 on starting_trap0)
ions = []
for ion, idx in enumerate(starting_traps):
graph[idx[0]][idx[1]]["ion_chain"] = ion
ions.append(ion)
start = time.time()
for timesteps in range(2, max_timesteps + 1):
print(f"{time.time() - start:.1f}s Checking for {timesteps} timesteps... ", end="")
sat = MemorySAT(graph, ion_chain_size_horizontal, ion_chain_size_vertical, ions, timesteps)
sat.create_constraints(starting_traps)
is_satisfied = sat.evaluate(qu_alg, number_of_registers)
if is_satisfied:
print(f"{time.time() - start:.1f}s Found satisfying solution with {timesteps} time steps.")
if plot:
sat.plot(show_ions=True)
break
else:
print(f"{time.time() - start:.1f}s Reached {max_timesteps} time steps without a satisfying solution.")
sys.exit(1)