def test_raise_when_no_layout_is_supplied(self): """Test error is raised if no layout is found in property_set.""" v = QuantumRegister(2, "v") circuit = QuantumCircuit(v) circuit.h(v[0]) circuit.cx(v[0], v[1]) dag = circuit_to_dag(circuit) pass_ = ApplyLayout() with self.assertRaises(TranspilerError): pass_.run(dag)
def test_raise_when_no_full_layout_is_given(self): """Test error is raised if no full layout is given.""" v = QuantumRegister(2, "v") circuit = QuantumCircuit(v) circuit.h(v[0]) circuit.cx(v[0], v[1]) dag = circuit_to_dag(circuit) pass_ = ApplyLayout() pass_.property_set["layout"] = Layout({v[0]: 2, v[1]: 1}) with self.assertRaises(TranspilerError): pass_.run(dag)
def _remap_circuit_faulty_backend(circuit, num_qubits, backend_prop, faulty_qubits_map): faulty_qubits = backend_prop.faulty_qubits() if backend_prop else [] disconnected_qubits = { k for k, v in faulty_qubits_map.items() if v is None }.difference(faulty_qubits) faulty_qubits_map_reverse = {v: k for k, v in faulty_qubits_map.items()} if faulty_qubits: faulty_qreg = circuit._create_qreg(len(faulty_qubits), 'faulty') else: faulty_qreg = [] if disconnected_qubits: disconnected_qreg = circuit._create_qreg(len(disconnected_qubits), 'disconnected') else: disconnected_qreg = [] new_layout = Layout() faulty_qubit = 0 disconnected_qubit = 0 for real_qubit in range(num_qubits): if faulty_qubits_map[real_qubit] is not None: new_layout[real_qubit] = circuit._layout[ faulty_qubits_map[real_qubit]] else: if real_qubit in faulty_qubits: new_layout[real_qubit] = faulty_qreg[faulty_qubit] faulty_qubit += 1 else: new_layout[real_qubit] = disconnected_qreg[disconnected_qubit] disconnected_qubit += 1 physical_layout_dict = {} for qubit in circuit.qubits: physical_layout_dict[qubit] = faulty_qubits_map_reverse[qubit.index] for qubit in faulty_qreg[:] + disconnected_qreg[:]: physical_layout_dict[qubit] = new_layout[qubit] dag_circuit = circuit_to_dag(circuit) apply_layout_pass = ApplyLayout() apply_layout_pass.property_set['layout'] = Layout(physical_layout_dict) circuit = dag_to_circuit(apply_layout_pass.run(dag_circuit)) circuit._layout = new_layout return circuit
def test_circuit_with_swap_gate(self): """Test if a virtual circuit with one swap gate is transformed into a circuit with physical qubits. [Circuit with virtual qubits] v0:--X---.---M(v0->c0) | | v1:--X---|---M(v1->c1) | v2:-----(+)--M(v2->c2) Initial layout: {v[0]: 2, v[1]: 1, v[2]: 0} [Circuit with physical qubits] q2:--X---.---M(q2->c0) | | q1:--X---|---M(q1->c1) | q0:-----(+)--M(q0->c2) """ v = QuantumRegister(3, "v") cr = ClassicalRegister(3, "c") circuit = QuantumCircuit(v, cr) circuit.swap(v[0], v[1]) circuit.cx(v[0], v[2]) circuit.measure(v[0], cr[0]) circuit.measure(v[1], cr[1]) circuit.measure(v[2], cr[2]) q = QuantumRegister(3, "q") expected = QuantumCircuit(q, cr) expected.swap(q[2], q[1]) expected.cx(q[2], q[0]) expected.measure(q[2], cr[0]) expected.measure(q[1], cr[1]) expected.measure(q[0], cr[2]) dag = circuit_to_dag(circuit) pass_ = ApplyLayout() pass_.property_set["layout"] = Layout({v[0]: 2, v[1]: 1, v[2]: 0}) after = pass_.run(dag) self.assertEqual(circuit_to_dag(expected), after)
def test_trivial(self): """Test if the bell circuit with virtual qubits is transformed into the circuit with physical qubits under trivial layout. """ v = QuantumRegister(2, "v") circuit = QuantumCircuit(v) circuit.h(v[0]) circuit.cx(v[0], v[1]) q = QuantumRegister(2, "q") expected = QuantumCircuit(q) expected.h(q[0]) expected.cx(q[0], q[1]) dag = circuit_to_dag(circuit) pass_ = ApplyLayout() pass_.property_set["layout"] = Layout({v[0]: 0, v[1]: 1}) after = pass_.run(dag) self.assertEqual(circuit_to_dag(expected), after)