def test_layout_from_intlist(self): """Create a layout from a list of integers. virtual physical q1_0 -> 4 q2_0 -> 5 q2_1 -> 6 q3_0 -> 8 q3_1 -> 9 q3_2 -> 10 """ qr1 = QuantumRegister(1, 'qr1') qr2 = QuantumRegister(2, 'qr2') qr3 = QuantumRegister(3, 'qr3') intlist_layout = [4, 5, 6, 8, 9, 10] layout = Layout.generate_from_intlist(intlist_layout, qr1, qr2, qr3) expected = Layout({ 4: (QuantumRegister(1, 'qr1'), 0), 5: (QuantumRegister(2, 'qr2'), 0), 6: (QuantumRegister(2, 'qr2'), 1), 8: (QuantumRegister(3, 'qr3'), 0), 9: (QuantumRegister(3, 'qr3'), 1), 10: (QuantumRegister(3, 'qr3'), 2) }) self.assertDictEqual(layout._p2v, expected._p2v) self.assertDictEqual(layout._v2p, expected._v2p)
def test_layout_from_intlist_short(self): """If the intlist is longer that your quantum register, map them to None. virtual physical q1_0 -> 4 q2_0 -> 5 q2_1 -> 6 None -> 8 None -> 9 None -> 10 """ qr1 = QuantumRegister(1, 'qr1') qr2 = QuantumRegister(2, 'qr2') intlist_layout = [4, 5, 6, 8, 9, 10] layout = Layout.generate_from_intlist(intlist_layout, qr1, qr2) expected = Layout({ 4: (QuantumRegister(1, 'qr1'), 0), 5: (QuantumRegister(2, 'qr2'), 0), 6: (QuantumRegister(2, 'qr2'), 1), 8: None, 9: None, 10: None }) self.assertDictEqual(layout._p2v, expected._p2v) self.assertDictEqual(layout._v2p, expected._v2p)
def transpile(circuits, backend=None, basis_gates=None, coupling_map=None, initial_layout=None, seed_mapper=None, pass_manager=None): """transpile one or more circuits. Args: circuits (QuantumCircuit or list[QuantumCircuit]): circuits to compile backend (BaseBackend): a backend to compile for basis_gates (list[str]): list of basis gate names supported by the target. Default: ['u1','u2','u3','cx','id'] coupling_map (list): coupling map (perhaps custom) to target in mapping initial_layout (list): initial layout of qubits in mapping seed_mapper (int): random seed for the swap_mapper pass_manager (PassManager): a pass_manager for the transpiler stages Returns: QuantumCircuit or list[QuantumCircuit]: transpiled circuit(s). Raises: TranspilerError: if args are not complete for the transpiler to function """ return_form_is_single = False if isinstance(circuits, QuantumCircuit): circuits = [circuits] return_form_is_single = True # Check for valid parameters for the experiments. basis_gates = basis_gates or backend.configuration().basis_gates if coupling_map: coupling_map = coupling_map elif backend: # This needs to be removed once Aer 0.2 is out coupling_map = getattr(backend.configuration(), 'coupling_map', None) else: coupling_map = None if not basis_gates: raise TranspilerError('no basis_gates or backend to compile to') # Convert integer list format to Layout if isinstance(initial_layout, list) and \ all(isinstance(elem, int) for elem in initial_layout): if isinstance(circuits, list): circ = circuits[0] else: circ = circuits initial_layout = Layout.generate_from_intlist(initial_layout, *circ.qregs) if initial_layout is not None and not isinstance(initial_layout, Layout): initial_layout = Layout(initial_layout) circuits = parallel_map(_transpilation, circuits, task_kwargs={'basis_gates': basis_gates, 'coupling_map': coupling_map, 'initial_layout': initial_layout, 'seed_mapper': seed_mapper, 'pass_manager': pass_manager}) if return_form_is_single: return circuits[0] return circuits
def test_layout_from_intlist_duplicated(self): """If the intlist contains duplicated ints, fail. virtual physical q1_0 -> 4 q2_0 -> 6 -- This is q2_1 -> 6 -- not allowed """ qr1 = QuantumRegister(1, 'qr1') qr2 = QuantumRegister(2, 'qr2') intlist_layout = [4, 6, 6] with self.assertRaises(LayoutError): _ = Layout.generate_from_intlist(intlist_layout, qr1, qr2)
def test_layout_from_intlist_long(self): """If the intlist is shorter that your quantum register, fail. virtual physical q1_0 -> 4 q2_0 -> 5 q2_1 -> 6 q3_0 -> 8 q3_1 -> ? q3_2 -> ? """ qr1 = QuantumRegister(1, 'qr1') qr2 = QuantumRegister(2, 'qr2') qr3 = QuantumRegister(3, 'qr3') intlist_layout = [4, 5, 6, 8] with self.assertRaises(LayoutError): _ = Layout.generate_from_intlist(intlist_layout, qr1, qr2, qr3)