Saving circuit.layout after transpiling (#2736)

* from unittest.mock import patch

* .

* alternative to 2721

* test

* remove subtest
This commit is contained in:
Luciano 2019-07-03 21:42:15 -04:00 committed by Ali Javadi-Abhari
parent 4679413c91
commit 1f95361032
3 changed files with 31 additions and 3 deletions

View File

@ -99,6 +99,8 @@ class QuantumCircuit:
# Parameter table tracks instructions with variable parameters.
self._parameter_table = ParameterTable()
self.layout = None
def __str__(self):
return str(self.draw(output='text'))

View File

@ -139,6 +139,7 @@ class PassManager():
circuit = dag_to_circuit(dag)
circuit.name = name
circuit.layout = self.property_set['layout']
return circuit
def draw(self, filename, style=None, raw=False):

View File

@ -70,12 +70,18 @@ class TestFakeBackendTranspiling(QiskitTestCase):
See: https://github.com/Qiskit/qiskit-terra/issues/1711
"""
# build a circuit which works as-is on the coupling map, using the initial layout
qr = QuantumRegister(3)
qr = QuantumRegister(3, 'q')
cr = ClassicalRegister(3)
ancilla = QuantumRegister(13, 'ancilla')
qc = QuantumCircuit(qr, cr)
qc.cx(qr[2], qr[1])
qc.cx(qr[2], qr[0])
initial_layout = {0: qr[1], 2: qr[0], 15: qr[2]}
final_layout = {0: qr[1], 1: ancilla[0], 2: qr[0], 3: ancilla[1], 4: ancilla[2],
5: ancilla[3], 6: ancilla[4], 7: ancilla[5], 8: ancilla[6],
9: ancilla[7], 10: ancilla[8], 11: ancilla[9], 12: ancilla[10],
13: ancilla[11], 14: ancilla[12], 15: qr[2]}
backend = FakeRueschlikon()
for optimization_level in range(4):
@ -83,6 +89,8 @@ class TestFakeBackendTranspiling(QiskitTestCase):
optimization_level=optimization_level)
qobj = assemble(qc_b)
self.assertEqual(qc_b.layout._p2v, final_layout)
compiled_ops = qobj.experiments[0].instructions
for operation in compiled_ops:
if operation.name == 'cx':
@ -97,18 +105,24 @@ class TestFakeBackendTranspiling(QiskitTestCase):
See: https://github.com/Qiskit/qiskit-terra/issues/2532
"""
# build a circuit which works as-is on the coupling map, using the initial layout
qr = QuantumRegister(5)
qr = QuantumRegister(5, 'q')
cr = ClassicalRegister(2)
ancilla = QuantumRegister(9, 'ancilla')
qc = QuantumCircuit(qr, cr)
qc.cx(qr[2], qr[4])
initial_layout = {qr[2]: 11, qr[4]: 3, # map to [11, 3] connection
qr[0]: 1, qr[1]: 5, qr[3]: 9}
final_layout = {0: ancilla[0], 1: qr[0], 2: ancilla[1], 3: qr[4], 4: ancilla[2], 5: qr[1],
6: ancilla[3], 7: ancilla[4], 8: ancilla[5], 9: qr[3], 10: ancilla[6],
11: qr[2], 12: ancilla[7], 13: ancilla[8]}
backend = FakeMelbourne()
for optimization_level in range(4):
qc_b = transpile(qc, backend, initial_layout=initial_layout,
optimization_level=optimization_level)
self.assertEqual(qc_b.layout._p2v, final_layout)
for gate, qubits, _ in qc_b:
if gate.name == 'cx':
for qubit in qubits:
@ -122,20 +136,31 @@ class TestFakeBackendTranspiling(QiskitTestCase):
See: https://github.com/Qiskit/qiskit-terra/issues/2503
"""
# build a circuit which works as-is on the coupling map, using the initial layout
qr = QuantumRegister(3)
qr = QuantumRegister(3, 'q')
cr = ClassicalRegister(2)
ancilla = QuantumRegister(17, 'ancilla')
qc = QuantumCircuit(qr, cr)
qc.u3(0.1, 0.2, 0.3, qr[0])
qc.u2(0.4, 0.5, qr[2])
qc.barrier()
qc.cx(qr[0], qr[2])
initial_layout = [6, 7, 12]
final_layout = {0: ancilla[0], 1: ancilla[1], 2: ancilla[2], 3: ancilla[3], 4: ancilla[4],
5: ancilla[5], 6: qr[0], 7: qr[1], 8: ancilla[6], 9: ancilla[7],
10: ancilla[8], 11: ancilla[9], 12: qr[2], 13: ancilla[10], 14: ancilla[11],
15: ancilla[12], 16: ancilla[13], 17: ancilla[14], 18: ancilla[15],
19: ancilla[16]}
backend = FakePoughkeepsie()
for optimization_level in range(4):
qc_b = transpile(qc, backend, initial_layout=initial_layout,
optimization_level=optimization_level)
self.assertEqual(qc_b.layout._p2v, final_layout)
gate_0, qubits_0, _ = qc_b[0]
gate_1, qubits_1, _ = qc_b[1]