Skip to content

Commit 8191110

Browse files
committed
Add a default optimization level to generate_preset_pass_manager
This commit adds a default value to the generate_preset_pass_manager's optimization_level argument. If it's not specified optimization level 2 will be used. After #12148 optimization level 2 is a better fit for an optimal tradeoff between heuristic effort and runtime that makes it well suited as a default optimization level.
1 parent 97788f0 commit 8191110

File tree

3 files changed

+51
-5
lines changed

3 files changed

+51
-5
lines changed

qiskit/transpiler/preset_passmanagers/__init__.py

+17-5
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,8 @@
6060
import warnings
6161

6262
from qiskit.transpiler.passmanager_config import PassManagerConfig
63-
from qiskit.transpiler.target import target_to_backend_properties
63+
from qiskit.transpiler.target import target_to_backend_properties, Target
64+
from qiskit.providers.backend import Backend
6465
from qiskit.transpiler import CouplingMap
6566

6667
from .level0 import level_0_pass_manager
@@ -70,7 +71,7 @@
7071

7172

7273
def generate_preset_pass_manager(
73-
optimization_level,
74+
optimization_level=2,
7475
backend=None,
7576
target=None,
7677
basis_gates=None,
@@ -104,9 +105,10 @@ def generate_preset_pass_manager(
104105
105106
Args:
106107
optimization_level (int): The optimization level to generate a
107-
:class:`~.PassManager` for. This can be 0, 1, 2, or 3. Higher
108-
levels generate more optimized circuits, at the expense of
109-
longer transpilation time:
108+
:class:`~.StagedPassManager` for. By default optimization level 2
109+
is used if this is not specified. This can be 0, 1, 2, or 3. Higher
110+
levels generate potentially more optimized circuits, at the expense
111+
of longer transpilation time:
110112
111113
* 0: no optimization
112114
* 1: light optimization
@@ -205,6 +207,16 @@ def generate_preset_pass_manager(
205207
ValueError: if an invalid value for ``optimization_level`` is passed in.
206208
"""
207209

210+
# Handle positional arguments for target and backend. This enables the usage
211+
# pattern `generate_preset_pass_manager(backend.target)` to generate a default
212+
# pass manager for a given target.
213+
if isinstance(optimization_level, Target):
214+
target = optimization_level
215+
optimization_level = 2
216+
elif isinstance(optimization_level, Backend):
217+
backend = optimization_level
218+
optimization_level = 2
219+
208220
if coupling_map is not None and not isinstance(coupling_map, CouplingMap):
209221
coupling_map = CouplingMap(coupling_map)
210222

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
---
2+
features_transpiler:
3+
- |
4+
The ``optimization_level`` argument for the :func:`.generate_preset_pass_manager` function is
5+
now optional. If it's not specified it will default to using optimization level 2. As the argument
6+
is now optional, the first positional argument has been expanded to enable passing a :class:`.Target`
7+
or a :class:`.BackendV2` as the first argument for more convenient construction. For example::
8+
9+
from qiskit.transpiler.preset_passmanager import generate_preset_pass_manager
10+
from qiskit.providers.fake_provider import GenericBackendV2
11+
12+
backend = GenericBackendV2(100)
13+
14+
generate_preset_pass_manager(backend.Target)
15+
16+
will construct a default pass manager for the 100 qubit :class`.GenericBackendV2` instance.

test/python/transpiler/test_preset_passmanagers.py

+18
Original file line numberDiff line numberDiff line change
@@ -1252,6 +1252,24 @@ def test_with_backend(self, optimization_level):
12521252
pm = generate_preset_pass_manager(optimization_level, target)
12531253
self.assertIsInstance(pm, PassManager)
12541254

1255+
def test_default_optimization_level(self):
1256+
"""Test a pass manager is constructed with no optimization level."""
1257+
backend = GenericBackendV2(num_qubits=14, coupling_map=MELBOURNE_CMAP)
1258+
pm = generate_preset_pass_manager(backend=backend)
1259+
self.assertIsInstance(pm, PassManager)
1260+
1261+
def test_default_optimization_level_backend_first_pos_arg(self):
1262+
"""Test a pass manager is constructed with only a positional backend."""
1263+
backend = GenericBackendV2(num_qubits=14, coupling_map=MELBOURNE_CMAP)
1264+
pm = generate_preset_pass_manager(backend)
1265+
self.assertIsInstance(pm, PassManager)
1266+
1267+
def test_default_optimization_level_target_first_pos_arg(self):
1268+
"""Test a pass manager is constructed with only a positional target."""
1269+
backend = GenericBackendV2(num_qubits=14, coupling_map=MELBOURNE_CMAP)
1270+
pm = generate_preset_pass_manager(backend.target)
1271+
self.assertIsInstance(pm, PassManager)
1272+
12551273
@data(0, 1, 2, 3)
12561274
def test_with_no_backend(self, optimization_level):
12571275
"""Test a passmanager is constructed with no backend and optimization level."""

0 commit comments

Comments
 (0)