Ejemplo n.º 1
0
def fallback_routine(routing: Routing, int_pairs: Set[frozenset]) -> None:
    @lru_cache(maxsize=None)
    def deterministic_pair(int_pairs):
        int_pairs_copy = copy(set(int_pairs))
        return int_pairs_copy.pop()
    det_pair = deterministic_pair(frozenset(int_pairs))
    hard_qb0 = routing.mapping.log2hard[list(det_pair)[0]]
    hard_qb1 = routing.mapping.log2hard[list(det_pair)[1]]
    shortest_path = nx.shortest_path(routing.qpu.graph, hard_qb0, hard_qb1)
    routing.apply_swap(frozenset(shortest_path[:2]))
Ejemplo n.º 2
0
def decrease_int_pair_distance(routing: Routing, int_pairs: Set[frozenset]) -> bool:
    gate_executed = False
    for _ in range(routing.qpu.graph.size()):
        no_swap_gate_executed = True
        swap1_gate = None
        for hard_qb0, hard_qb1 in routing.qpu.graph.edges():
            swap_gate = frozenset((hard_qb0, hard_qb1))
            if routing.layers[-1].swap_gate_applicable(swap_gate):
                diff = int_pair_distance_change(routing, int_pairs, swap_gate)
                if diff == 2:
                    routing.apply_swap(swap_gate)
                    gate_executed = True
                    no_swap_gate_executed = False
                elif diff == 1:
                    swap1_gate = swap_gate
        if no_swap_gate_executed:
            if swap1_gate is not None:
                routing.apply_swap(swap1_gate)
                gate_executed = True
                continue
            else:
                break
    return gate_executed
Ejemplo n.º 3
0
class TestRouting(TestCase):
    def setUp(self) -> None:
        gr = nx.grid_2d_graph(2, 2)
        gr.add_edge((0, 0), (1, 1))
        self.qpu = Grid2dQPU(2, 2)
        self.problem_instance = dimod.generators.random.uniform(gr, dimod.SPIN)
        init_map = {cirq.GridQubit(*loc): loc for loc in self.problem_instance.variables}
        self.initial_mapping = Mapping(self.qpu, self.problem_instance, initial_mapping=init_map)
        self.routing = Routing(self.problem_instance, self.qpu, cp.deepcopy(self.initial_mapping))

    def test_apply_swap(self) -> None:
        self.routing.apply_swap(frozenset((cirq.GridQubit(0, 0), cirq.GridQubit(1, 0))))
        self.assertEqual(self.initial_mapping.hard2log[cirq.GridQubit(0, 0)], self.routing.mapping.hard2log[cirq.GridQubit(1, 0)],
                         msg="application of swap gate did not update mapping")
        self.assertEqual(self.initial_mapping.hard2log[cirq.GridQubit(1, 0)], self.routing.mapping.hard2log[cirq.GridQubit(0, 0)],
                         msg="application of swap gate did not update mapping")
        self.assertTrue(self.routing.layers[0].gates[cirq.GridQubit(0, 0)][cirq.GridQubit(1, 0)]['swap'],
                      msg="did not add swap gate to layer")
        self.routing.apply_swap(frozenset((cirq.GridQubit(0, 1), cirq.GridQubit(1, 1))))
        self.assertEqual(self.initial_mapping.hard2log[cirq.GridQubit(0, 1)], self.routing.mapping.hard2log[cirq.GridQubit(1, 1)],
                         msg="application of swap gate did not update mapping")
        self.assertEqual(self.initial_mapping.hard2log[cirq.GridQubit(1, 1)], self.routing.mapping.hard2log[cirq.GridQubit(0, 1)],
                         msg="application of swap gate did not update mapping")
        self.assertTrue(self.routing.layers[0].gates[cirq.GridQubit(0, 1)][cirq.GridQubit(1, 1)]['swap'],
                      msg="did not add swap gate to layer")
        self.routing.apply_swap(frozenset((cirq.GridQubit(0, 0), cirq.GridQubit(0, 1))))
        self.assertTrue(self.routing.layers[1].gates[cirq.GridQubit(0, 0)][cirq.GridQubit(0, 1)]['swap'],
                      msg="did not add layer containing new swap gate")
        self.routing.draw()

    def test_apply_int(self) -> None:
        self.routing.apply_int(frozenset((cirq.GridQubit(0, 0), cirq.GridQubit(1, 0))))
        self.assertTrue(self.routing.layers[0].gates[cirq.GridQubit(0, 0)][cirq.GridQubit(1, 0)]['int'],
                      msg="did not add int gate to layer")
        self.assertFalse(self.routing.remaining_interactions.has_edge(cirq.GridQubit(0, 0), cirq.GridQubit(1, 0)),
                         msg='interaction has not been deleted from routing.remaining_interactions')
        self.routing.apply_int(frozenset((cirq.GridQubit(0, 1), cirq.GridQubit(1, 1))))
        self.assertTrue(self.routing.layers[0].gates[cirq.GridQubit(0, 1)][cirq.GridQubit(1, 1)]['int'],
                      msg="did not add int gate to layer")
        self.assertFalse(self.routing.remaining_interactions.has_edge(cirq.GridQubit(0, 1), cirq.GridQubit(1, 1)),
                         msg='interaction has not been deleted from routing.remaining_interactions')
        self.routing.apply_int(frozenset((cirq.GridQubit(0, 0), cirq.GridQubit(0, 1))))
        self.assertTrue(self.routing.layers[1].gates[cirq.GridQubit(0, 0)][cirq.GridQubit(0, 1)]['int'],
                      msg="did not add layer containing new int gate")
        self.assertFalse(self.routing.remaining_interactions.has_edge(cirq.GridQubit(0, 0), cirq.GridQubit(0, 1)),
                         msg='interaction has not been deleted from routing.remaining_interactions')
Ejemplo n.º 4
0
def int_pair_distance_change(routing: Routing, int_pairs: Set[frozenset], swap: frozenset) -> int:
    dist_before = int_pair_distance(routing, int_pairs)
    routing.apply_swap(swap)
    dist_after = int_pair_distance(routing, int_pairs)
    routing.apply_swap(swap)
    return dist_before - dist_after