def test_empty_coupling_class(self): coupling = CouplingMap() self.assertEqual(0, coupling.size()) self.assertEqual([], coupling.physical_qubits) self.assertEqual([], coupling.get_edges()) self.assertFalse(coupling.is_connected()) self.assertEqual("", str(coupling))
def test_only_output_cx_and_swaps_in_coupling_map(self): """Test that output DAG contains only 2q gates from the the coupling map.""" coupling = CouplingMap([[0, 1], [1, 2], [2, 3]]) qr = QuantumRegister(4, 'q') cr = ClassicalRegister(4, 'c') circuit = QuantumCircuit(qr, cr) circuit.h(qr[0]) circuit.cx(qr[0], qr[1]) circuit.cx(qr[0], qr[2]) circuit.cx(qr[0], qr[3]) circuit.measure(qr, cr) dag = circuit_to_dag(circuit) layout = Layout({qr[0]: 0, qr[1]: 1, qr[2]: 2, qr[3]: 3}) pass_ = StochasticSwap(coupling, layout, 20, 5) after = pass_.run(dag) valid_couplings = [ set([layout[a], layout[b]]) for (a, b) in coupling.get_edges() ] for _2q_gate in after.twoQ_gates(): self.assertIn(set(_2q_gate.qargs), valid_couplings)
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 test_init_with_couplinglist(self): coupling_list = [[0, 1], [1, 2]] coupling = CouplingMap(coupling_list) qubits_expected = [0, 1, 2] edges_expected = [(0, 1), (1, 2)] self.assertEqual(coupling.physical_qubits, qubits_expected) self.assertEqual(coupling.get_edges(), edges_expected) self.assertEqual(2, coupling.distance(0, 2))
def test_do_not_change_cm(self): """Coupling map should not change. See https://github.com/Qiskit/qiskit-terra/issues/5675""" cm_edges = [(1, 0), (2, 0), (2, 1), (3, 2), (3, 4), (4, 2)] coupling = CouplingMap(cm_edges) passmanager = PassManager(SabreSwap(coupling)) _ = passmanager.run(QuantumCircuit(1)) self.assertEqual(set(cm_edges), set(coupling.get_edges()))
def test_qv_natural(self): """check that quantum volume circuit compiles for natural direction""" qv64 = QuantumVolume(5, seed=15) def construct_passmanager(basis_gates, coupling_map, synthesis_fidelity, pulse_optimize): def _repeat_condition(property_set): return not property_set["depth_fixed_point"] seed = 2 _map = [SabreLayout(coupling_map, max_iterations=2, seed=seed)] _embed = [FullAncillaAllocation(coupling_map), EnlargeWithAncilla(), ApplyLayout()] _unroll3q = Unroll3qOrMore() _swap_check = CheckMap(coupling_map) _swap = [ BarrierBeforeFinalMeasurements(), SabreSwap(coupling_map, heuristic="lookahead", seed=seed), ] _check_depth = [Depth(), FixedPoint("depth")] _optimize = [ Collect2qBlocks(), ConsolidateBlocks(basis_gates=basis_gates), UnitarySynthesis( basis_gates, synthesis_fidelity, coupling_map, pulse_optimize=pulse_optimize, natural_direction=True, ), Optimize1qGates(basis_gates), ] pm = PassManager() pm.append(_map) # map to hardware by inserting swaps pm.append(_embed) pm.append(_unroll3q) pm.append(_swap_check) pm.append(_swap) pm.append( _check_depth + _optimize, do_while=_repeat_condition ) # translate to & optimize over hardware native gates return pm coupling_map = CouplingMap([[0, 1], [1, 2], [3, 2], [3, 4], [5, 4]]) basis_gates = ["rz", "sx", "cx"] pm1 = construct_passmanager( basis_gates=basis_gates, coupling_map=coupling_map, synthesis_fidelity=0.99, pulse_optimize=True, ) pm2 = construct_passmanager( basis_gates=basis_gates, coupling_map=coupling_map, synthesis_fidelity=0.99, pulse_optimize=False, ) qv64_1 = pm1.run(qv64.decompose()) qv64_2 = pm2.run(qv64.decompose()) edges = [list(edge) for edge in coupling_map.get_edges()] self.assertTrue( all( [qv64_1.qubits.index(qubit) for qubit in instr.qubits] in edges for instr in qv64_1.get_instructions("cx") ) ) self.assertEqual(Operator(qv64_1), Operator(qv64_2))
def get_undirected_couplings(coupling_map: CouplingMap): couplings = coupling_map.get_edges() for coupling in couplings: if coupling[0] < coupling[1] and (coupling[1], coupling[0]) in couplings: yield coupling