Skip to content

Commit d8903f3

Browse files
authored
Fix oversights in generate_preset_pass_manager (Qiskit#12799)
* Fix oversight from Qiskit#12185 where two input parsing functions were not migrated from transpile to generate_preset_pm with the others. * Add fix to reno from Qiskit#12185
1 parent 6a78c63 commit d8903f3

File tree

3 files changed

+33
-25
lines changed

3 files changed

+33
-25
lines changed

qiskit/compiler/transpiler.py

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020

2121
from qiskit import user_config
2222
from qiskit.circuit.quantumcircuit import QuantumCircuit
23-
from qiskit.circuit.quantumregister import Qubit
2423
from qiskit.dagcircuit import DAGCircuit
2524
from qiskit.providers.backend import Backend
2625
from qiskit.providers.backend_compat import BackendV2Converter
@@ -339,10 +338,7 @@ def callback_func(**kwargs):
339338
if translation_method is None and hasattr(backend, "get_translation_stage_plugin"):
340339
translation_method = backend.get_translation_stage_plugin()
341340

342-
initial_layout = _parse_initial_layout(initial_layout)
343-
approximation_degree = _parse_approximation_degree(approximation_degree)
344341
output_name = _parse_output_name(output_name, circuits)
345-
346342
coupling_map = _parse_coupling_map(coupling_map)
347343
_check_circuits_coupling_map(circuits, coupling_map, backend)
348344

@@ -425,27 +421,6 @@ def _parse_coupling_map(coupling_map):
425421
return coupling_map
426422

427423

428-
def _parse_initial_layout(initial_layout):
429-
# initial_layout could be None, or a list of ints, e.g. [0, 5, 14]
430-
# or a list of tuples/None e.g. [qr[0], None, qr[1]] or a dict e.g. {qr[0]: 0}
431-
if initial_layout is None or isinstance(initial_layout, Layout):
432-
return initial_layout
433-
if isinstance(initial_layout, dict):
434-
return Layout(initial_layout)
435-
initial_layout = list(initial_layout)
436-
if all(phys is None or isinstance(phys, Qubit) for phys in initial_layout):
437-
return Layout.from_qubit_list(initial_layout)
438-
return initial_layout
439-
440-
441-
def _parse_approximation_degree(approximation_degree):
442-
if approximation_degree is None:
443-
return None
444-
if approximation_degree < 0.0 or approximation_degree > 1.0:
445-
raise TranspilerError("Approximation degree must be in [0.0, 1.0]")
446-
return approximation_degree
447-
448-
449424
def _parse_output_name(output_name, circuits):
450425
# naming and returning circuits
451426
# output_name could be either a string or a list

qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,12 @@
1818

1919
from qiskit.circuit.controlflow import CONTROL_FLOW_OP_NAMES
2020
from qiskit.circuit.library.standard_gates import get_standard_gate_name_mapping
21+
from qiskit.circuit.quantumregister import Qubit
2122
from qiskit.providers.backend_compat import BackendV2Converter
2223
from qiskit.transpiler.coupling import CouplingMap
2324
from qiskit.transpiler.exceptions import TranspilerError
2425
from qiskit.transpiler.instruction_durations import InstructionDurations
26+
from qiskit.transpiler.layout import Layout
2527
from qiskit.transpiler.passmanager_config import PassManagerConfig
2628
from qiskit.transpiler.target import Target, target_to_backend_properties
2729
from qiskit.transpiler.timing_constraints import TimingConstraints
@@ -319,6 +321,10 @@ def generate_preset_pass_manager(
319321
if backend_properties is None:
320322
backend_properties = target_to_backend_properties(target)
321323

324+
# Parse non-target dependent pm options
325+
initial_layout = _parse_initial_layout(initial_layout)
326+
approximation_degree = _parse_approximation_degree(approximation_degree)
327+
322328
pm_options = {
323329
"target": target,
324330
"basis_gates": basis_gates,
@@ -470,3 +476,24 @@ def _parse_timing_constraints(backend, timing_constraints):
470476
elif backend is not None:
471477
timing_constraints = backend.target.timing_constraints()
472478
return timing_constraints
479+
480+
481+
def _parse_initial_layout(initial_layout):
482+
# initial_layout could be None, or a list of ints, e.g. [0, 5, 14]
483+
# or a list of tuples/None e.g. [qr[0], None, qr[1]] or a dict e.g. {qr[0]: 0}
484+
if initial_layout is None or isinstance(initial_layout, Layout):
485+
return initial_layout
486+
if isinstance(initial_layout, dict):
487+
return Layout(initial_layout)
488+
initial_layout = list(initial_layout)
489+
if all(phys is None or isinstance(phys, Qubit) for phys in initial_layout):
490+
return Layout.from_qubit_list(initial_layout)
491+
return initial_layout
492+
493+
494+
def _parse_approximation_degree(approximation_degree):
495+
if approximation_degree is None:
496+
return None
497+
if approximation_degree < 0.0 or approximation_degree > 1.0:
498+
raise TranspilerError("Approximation degree must be in [0.0, 1.0]")
499+
return approximation_degree

releasenotes/notes/use-target-in-generate-preset-pm-5215e00d22d0205c.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,9 @@ upgrade_transpiler:
1212
If a `backend` input of type :class:`.BackendV1` is provided, it will be
1313
converted to :class:`.BackendV2` to expose its :class:`.Target`. This change does
1414
not require any user action.
15+
16+
fixes:
17+
- |
18+
A series of input-handling inconsistencies between :func:`.transpile` and :func:`.generate_preset_pass_manager`
19+
have been fixed. These inconsistencies would lead to different transpilation outputs for the same inputs,
20+
or :func:`.generate_preset_pass_manager` failing for certain input combinations accepted by :func:`.transpile`.

0 commit comments

Comments
 (0)