Skip to content

Commit 29aa2bd

Browse files
Propagate DAGCircuit.name in ApplyLayout (Qiskit#13910)
* Propagate `DAGCircuit.name` in `ApplyLayout` This has always been absent, but `transpile` masked the problem by assigning the output circuit names by overwriting the `output_names` input kwarg if it wasn't set. `generate_preset_pass_manager` didn't have the same logic, so it was observable that `ApplyLayout` didn't propagate the name. We could have added similar name-propagation logic to `generate_preset_pass_manager`, but really the bug is in `ApplyLayout`; passes _should_ propagate the metadata. * Fix typo Co-authored-by: John Lapeyre <[email protected]> * Remove redunant set --------- Co-authored-by: John Lapeyre <[email protected]>
1 parent 8e6200a commit 29aa2bd

File tree

4 files changed

+51
-3
lines changed

4 files changed

+51
-3
lines changed

qiskit/transpiler/passes/layout/apply_layout.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ def run(self, dag):
5959
q = QuantumRegister(len(layout), "q")
6060

6161
new_dag = DAGCircuit()
62+
new_dag.name = dag.name
6263
new_dag.add_qreg(q)
6364
for var in dag.iter_input_vars():
6465
new_dag.add_input_var(var)
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
fixes:
3+
- |
4+
Circuits compiled using a preset passmanager constructed by :func:`.generate_preset_pass_manager`
5+
will now correctly retain their :attr:`~.QuantumCircuit.name` attribute, as they do with
6+
:func:`.transpile`.

test/python/compiler/test_transpiler.py

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@
5757
CZGate,
5858
ECRGate,
5959
HGate,
60+
IGate,
61+
PhaseGate,
6062
RXGate,
6163
RYGate,
6264
RZGate,
@@ -1647,7 +1649,9 @@ def test_no_infinite_loop(self, optimization_level):
16471649
@data(0, 1, 2, 3)
16481650
def test_transpile_preserves_circuit_metadata(self, optimization_level):
16491651
"""Verify that transpile preserves circuit metadata in the output."""
1650-
circuit = QuantumCircuit(2, metadata={"experiment_id": "1234", "execution_number": 4})
1652+
metadata = {"experiment_id": "1234", "execution_number": 4}
1653+
name = "my circuit"
1654+
circuit = QuantumCircuit(2, metadata=metadata.copy(), name=name)
16511655
circuit.h(0)
16521656
circuit.cx(0, 1)
16531657

@@ -1679,7 +1683,22 @@ def test_transpile_preserves_circuit_metadata(self, optimization_level):
16791683
optimization_level=optimization_level,
16801684
seed_transpiler=42,
16811685
)
1682-
self.assertEqual(circuit.metadata, res.metadata)
1686+
self.assertEqual(res.metadata, metadata)
1687+
self.assertEqual(res.name, name)
1688+
1689+
target = Target(14)
1690+
for inst in (IGate(), PhaseGate(Parameter("t")), SXGate()):
1691+
target.add_instruction(inst, {(i,): None for i in range(14)})
1692+
target.add_instruction(CXGate(), {tuple(pair): None for pair in cmap})
1693+
1694+
res = transpile(
1695+
circuit,
1696+
target=target,
1697+
optimization_level=optimization_level,
1698+
seed_transpiler=42,
1699+
)
1700+
self.assertEqual(res.metadata, metadata)
1701+
self.assertEqual(res.name, name)
16831702

16841703
@data(0, 1, 2, 3)
16851704
def test_transpile_optional_registers(self, optimization_level):

test/python/transpiler/test_preset_passmanagers.py

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import numpy as np
2222

2323
from qiskit import QuantumCircuit, ClassicalRegister, QuantumRegister
24-
from qiskit.circuit import Qubit, Gate, ControlFlowOp, ForLoopOp, Measure
24+
from qiskit.circuit import Qubit, Gate, ControlFlowOp, ForLoopOp, Measure, library as lib, Parameter
2525
from qiskit.compiler import transpile
2626
from qiskit.transpiler import (
2727
CouplingMap,
@@ -1499,6 +1499,28 @@ def test_parse_seed_transpiler_raises_value_error(self):
14991499
):
15001500
generate_preset_pass_manager(seed_transpiler=0.1)
15011501

1502+
@data(0, 1, 2, 3)
1503+
def test_preserves_circuit_metadata(self, optimization_level):
1504+
"""Test that basic metadata is preserved."""
1505+
metadata = {"experiment_id": "1234", "execution_number": 4}
1506+
name = "my circuit"
1507+
circuit = QuantumCircuit(4, metadata=metadata.copy(), name=name)
1508+
circuit.h(0)
1509+
circuit.cx(0, 3)
1510+
1511+
num_qubits = 10
1512+
target = Target(num_qubits)
1513+
for inst in (lib.IGate(), lib.PhaseGate(Parameter("t")), lib.SXGate()):
1514+
target.add_instruction(inst, {(i,): None for i in range(num_qubits)})
1515+
target.add_instruction(CXGate(), {pair: None for pair in CouplingMap.from_line(num_qubits)})
1516+
1517+
pm = generate_preset_pass_manager(
1518+
optimization_level=optimization_level, target=target, seed_transpiler=42
1519+
)
1520+
res = pm.run(circuit)
1521+
self.assertEqual(res.metadata, metadata)
1522+
self.assertEqual(res.name, name)
1523+
15021524

15031525
@ddt
15041526
class TestIntegrationControlFlow(QiskitTestCase):

0 commit comments

Comments
 (0)