diff --git a/qiskit/transpiler/preset_passmanagers/builtin_plugins.py b/qiskit/transpiler/preset_passmanagers/builtin_plugins.py index 85b0c05d5cae..1e5ca4519864 100644 --- a/qiskit/transpiler/preset_passmanagers/builtin_plugins.py +++ b/qiskit/transpiler/preset_passmanagers/builtin_plugins.py @@ -238,7 +238,6 @@ class BasicSwapPassManager(PassManagerStagePlugin): def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager: """Build routing stage PassManager.""" - seed_transpiler = pass_manager_config.seed_transpiler target = pass_manager_config.target coupling_map = pass_manager_config.coupling_map backend_properties = pass_manager_config.backend_properties @@ -257,7 +256,7 @@ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassMana routing_pass, target, coupling_map=coupling_map, - seed_transpiler=seed_transpiler, + seed_transpiler=-1, use_barrier_before_measurement=True, ) if optimization_level == 1: @@ -268,7 +267,7 @@ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassMana vf2_call_limit=vf2_call_limit, vf2_max_trials=vf2_max_trials, backend_properties=backend_properties, - seed_transpiler=seed_transpiler, + seed_transpiler=-1, check_trivial=True, use_barrier_before_measurement=True, ) @@ -280,7 +279,7 @@ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassMana vf2_call_limit=vf2_call_limit, vf2_max_trials=vf2_max_trials, backend_properties=backend_properties, - seed_transpiler=seed_transpiler, + seed_transpiler=-1, use_barrier_before_measurement=True, ) if optimization_level == 3: @@ -291,7 +290,7 @@ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassMana vf2_call_limit=vf2_call_limit, vf2_max_trials=vf2_max_trials, backend_properties=backend_properties, - seed_transpiler=seed_transpiler, + seed_transpiler=-1, use_barrier_before_measurement=True, ) raise TranspilerError(f"Invalid optimization level specified: {optimization_level}") @@ -324,7 +323,7 @@ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassMana routing_pass, target, coupling_map=coupling_map, - seed_transpiler=seed_transpiler, + seed_transpiler=-1, use_barrier_before_measurement=True, ) if optimization_level == 1: @@ -335,7 +334,7 @@ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassMana vf2_call_limit=vf2_call_limit, vf2_max_trials=vf2_max_trials, backend_properties=backend_properties, - seed_transpiler=seed_transpiler, + seed_transpiler=-1, check_trivial=True, use_barrier_before_measurement=True, ) @@ -347,7 +346,7 @@ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassMana vf2_call_limit=vf2_call_limit, vf2_max_trials=vf2_max_trials, backend_properties=backend_properties, - seed_transpiler=seed_transpiler, + seed_transpiler=-1, use_barrier_before_measurement=True, ) raise TranspilerError(f"Invalid optimization level specified: {optimization_level}") @@ -358,7 +357,6 @@ class LookaheadSwapPassManager(PassManagerStagePlugin): def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager: """Build routing stage PassManager.""" - seed_transpiler = pass_manager_config.seed_transpiler target = pass_manager_config.target coupling_map = pass_manager_config.coupling_map coupling_map_routing = target @@ -376,7 +374,7 @@ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassMana routing_pass, target, coupling_map=coupling_map, - seed_transpiler=seed_transpiler, + seed_transpiler=-1, use_barrier_before_measurement=True, ) if optimization_level == 1: @@ -388,7 +386,7 @@ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassMana vf2_call_limit=vf2_call_limit, vf2_max_trials=vf2_max_trials, backend_properties=backend_properties, - seed_transpiler=seed_transpiler, + seed_transpiler=-1, check_trivial=True, use_barrier_before_measurement=True, ) @@ -401,7 +399,7 @@ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassMana vf2_call_limit=vf2_call_limit, vf2_max_trials=vf2_max_trials, backend_properties=backend_properties, - seed_transpiler=seed_transpiler, + seed_transpiler=-1, use_barrier_before_measurement=True, ) if optimization_level == 3: @@ -413,7 +411,7 @@ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassMana vf2_call_limit=vf2_call_limit, vf2_max_trials=vf2_max_trials, backend_properties=backend_properties, - seed_transpiler=seed_transpiler, + seed_transpiler=-1, use_barrier_before_measurement=True, ) raise TranspilerError(f"Invalid optimization level specified: {optimization_level}") @@ -448,7 +446,7 @@ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassMana routing_pass, target, coupling_map=coupling_map, - seed_transpiler=seed_transpiler, + seed_transpiler=-1, use_barrier_before_measurement=True, ) if optimization_level == 1: @@ -466,7 +464,7 @@ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassMana vf2_call_limit=vf2_call_limit, vf2_max_trials=vf2_max_trials, backend_properties=backend_properties, - seed_transpiler=seed_transpiler, + seed_transpiler=-1, check_trivial=True, use_barrier_before_measurement=True, ) @@ -486,7 +484,7 @@ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassMana vf2_call_limit=vf2_call_limit, vf2_max_trials=vf2_max_trials, backend_properties=backend_properties, - seed_transpiler=seed_transpiler, + seed_transpiler=-1, use_barrier_before_measurement=True, ) if optimization_level == 3: @@ -504,7 +502,7 @@ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassMana vf2_call_limit=vf2_call_limit, vf2_max_trials=vf2_max_trials, backend_properties=backend_properties, - seed_transpiler=seed_transpiler, + seed_transpiler=-1, use_barrier_before_measurement=True, ) raise TranspilerError(f"Invalid optimization level specified: {optimization_level}") @@ -515,7 +513,6 @@ class NoneRoutingPassManager(PassManagerStagePlugin): def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager: """Build routing stage PassManager.""" - seed_transpiler = pass_manager_config.seed_transpiler target = pass_manager_config.target coupling_map = pass_manager_config.coupling_map routing_pass = Error( @@ -527,7 +524,7 @@ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassMana routing_pass, target, coupling_map=coupling_map, - seed_transpiler=seed_transpiler, + seed_transpiler=-1, use_barrier_before_measurement=True, ) @@ -793,7 +790,7 @@ def _swap_mapped(property_set): ) choose_layout_1 = VF2Layout( coupling_map=pass_manager_config.coupling_map, - seed=pass_manager_config.seed_transpiler, + seed=-1, call_limit=int(5e4), # Set call limit to ~100ms with rustworkx 0.10.2 properties=pass_manager_config.backend_properties, target=pass_manager_config.target, @@ -826,7 +823,7 @@ def _swap_mapped(property_set): elif optimization_level == 2: choose_layout_0 = VF2Layout( coupling_map=pass_manager_config.coupling_map, - seed=pass_manager_config.seed_transpiler, + seed=-1, call_limit=int(5e6), # Set call limit to ~10s with rustworkx 0.10.2 properties=pass_manager_config.backend_properties, target=pass_manager_config.target, @@ -861,7 +858,7 @@ def _swap_mapped(property_set): elif optimization_level == 3: choose_layout_0 = VF2Layout( coupling_map=pass_manager_config.coupling_map, - seed=pass_manager_config.seed_transpiler, + seed=-1, call_limit=int(3e7), # Set call limit to ~60s with rustworkx 0.10.2 properties=pass_manager_config.backend_properties, target=pass_manager_config.target, diff --git a/qiskit/transpiler/preset_passmanagers/common.py b/qiskit/transpiler/preset_passmanagers/common.py index c9bcc9a7904c..431089f657dd 100644 --- a/qiskit/transpiler/preset_passmanagers/common.py +++ b/qiskit/transpiler/preset_passmanagers/common.py @@ -281,7 +281,7 @@ def generate_routing_passmanager( coupling_map=None, vf2_call_limit=None, backend_properties=None, - seed_transpiler=None, + seed_transpiler=-1, check_trivial=False, use_barrier_before_measurement=True, vf2_max_trials=None, @@ -300,7 +300,10 @@ def generate_routing_passmanager( backend_properties (BackendProperties): Properties of a backend to synthesize for (e.g. gate fidelities). seed_transpiler (int): Sets random seed for the stochastic parts of - the transpiler. + the transpiler. This is currently only used for :class:`.VF2PostLayout` and the + default value of ``-1`` is strongly recommended (which is no randomization). + If a value of ``None`` is provided this will seed from system + entropy. check_trivial (bool): If set to true this will condition running the :class:`~.VF2PostLayout` pass after routing on whether a trivial layout was tried and was found to not be perfect. This is only @@ -358,7 +361,7 @@ def _swap_condition(property_set): target, coupling_map, backend_properties, - seed_transpiler, + seed=seed_transpiler, call_limit=vf2_call_limit, max_trials=vf2_max_trials, strict_direction=False, diff --git a/releasenotes/notes/vf2-order-3ef2b4ca5ebd0588.yaml b/releasenotes/notes/vf2-order-3ef2b4ca5ebd0588.yaml new file mode 100644 index 000000000000..3d573a21901a --- /dev/null +++ b/releasenotes/notes/vf2-order-3ef2b4ca5ebd0588.yaml @@ -0,0 +1,12 @@ +--- +upgrade_transpiler: + - | + The default value for the :func:`.generate_routing_passmanager` argument + ``seed_transpiler`` has changed from ``None`` to ``-1``. This was done + because this flag was only used to configure the :class:`.VF2PostLayout` + transpiler pass in the output, and for that pass in particular the + randomization typically only hurts performance and is not desirable. + If you were relying on the previous default value you can restore this + behavior by explicitly setting the argument ``seed_transpiler=None``. If + you were explicitly setting a seed value for this parameter there is no + change in behavior. diff --git a/test/python/primitives/test_backend_estimator.py b/test/python/primitives/test_backend_estimator.py index 62845461dacf..49d5efa2d782 100644 --- a/test/python/primitives/test_backend_estimator.py +++ b/test/python/primitives/test_backend_estimator.py @@ -440,7 +440,7 @@ def test_layout(self, backend): estimator.set_transpile_options(seed_transpiler=15, optimization_level=1) value = estimator.run(qc, op, shots=10000).result().values[0] if optionals.HAS_AER: - ref_value = -0.9954 if isinstance(backend, GenericBackendV2) else -0.916 + ref_value = -0.9954 if isinstance(backend, GenericBackendV2) else -0.934 else: ref_value = -1 self.assertEqual(value, ref_value)