def test_make_symmetric(self): coupling_list = [[0, 1], [0, 2]] coupling = CouplingMap(coupling_list) coupling.make_symmetric() edges = coupling.get_edges() self.assertEqual(set(edges), {(0, 1), (0, 2), (2, 0), (1, 0)})
def aspen_4(): coupling = CouplingMap([ [0, 1], [0, 4], [1, 2], [2, 3], [2, 5], [5, 6], [6, 7], [7, 8], [8, 9], [9, 10], [10, 11], ]) coupling.make_symmetric() return coupling
def test_t_device(self): """Test the swap strategy to route a complete problem on a T device. The coupling map in this test corresponds to .. parsed-literal:: 0 -- 1 -- 2 | 3 | 4 The problem being routed is a fully connect ZZ graph. It has 10 terms since there are five qubits in the coupling map. This test checks that the circuit produced by the commuting gate router has the instructions we expect. There are several circuits that are valid since some of the Rzz gates commute. """ swaps = ( ((1, 3), ), ((0, 1), (3, 4)), ((1, 3), ), ) cmap = CouplingMap([[0, 1], [1, 2], [1, 3], [3, 4]]) cmap.make_symmetric() swap_strat = SwapStrategy(cmap, swaps) # A dense Pauli op. op = PauliSumOp.from_list([ ("IIIZZ", 1), ("IIZIZ", 2), ("IZIIZ", 3), ("ZIIIZ", 4), ("IIZZI", 5), ("IZIZI", 6), ("ZIIZI", 7), ("IZZII", 8), ("ZIZII", 9), ("ZZIII", 10), ]) circ = QuantumCircuit(5) circ.append(PauliEvolutionGate(op, 1), range(5)) pm_ = PassManager([ FindCommutingPauliEvolutions(), Commuting2qGateRouter(swap_strat), ]) swapped = circuit_to_dag(pm_.run(circ)) # The swapped circuit can take on several forms as some of the gates commute. # We test that sets of gates are where we expected them in the circuit data def inst_info(op, qargs, qreg): """Get a tuple we can easily test.""" param = None if len(op.params) > 0: param = op.params[0] return op.name, param, qreg.index(qargs[0]), qreg.index(qargs[1]) qreg = swapped.qregs["q"] inst_list = list( inst_info(node.op, node.qargs, qreg) for node in swapped.op_nodes()) # First block has the Rzz gates ("IIIZZ", 1), ("IIZZI", 5), ("IZIZI", 6), ("ZZIII", 10) expected = { ("PauliEvolution", 1.0, 0, 1), ("PauliEvolution", 5.0, 1, 2), ("PauliEvolution", 6.0, 1, 3), ("PauliEvolution", 10.0, 3, 4), } self.assertSetEqual(set(inst_list[0:4]), expected) # Block 2 is a swap self.assertSetEqual({inst_list[4]}, {("swap", None, 1, 3)}) # Block 3 This combines a swap layer and two layers of Rzz gates. expected = { ("PauliEvolution", 8.0, 2, 1), ("PauliEvolution", 7.0, 3, 4), ("PauliEvolution", 3.0, 0, 1), ("swap", None, 0, 1), ("PauliEvolution", 2.0, 1, 2), ("PauliEvolution", 4.0, 1, 3), ("swap", None, 3, 4), } self.assertSetEqual(set(inst_list[5:12]), expected) # Test the remaining instructions. self.assertSetEqual({inst_list[12]}, {("swap", None, 1, 3)}) self.assertSetEqual({inst_list[13]}, {("PauliEvolution", 9.0, 2, 1)})