From d357e24c240b266dfa6a5c1f06e8a4ce6fa790eb Mon Sep 17 00:00:00 2001 From: Luciano Bello Date: Mon, 29 Jul 2024 15:24:45 +0200 Subject: [PATCH 1/6] deprecate BackendV2Converter --- qiskit/providers/backend_compat.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/qiskit/providers/backend_compat.py b/qiskit/providers/backend_compat.py index e567c330a958..c9f22f5ed9ff 100644 --- a/qiskit/providers/backend_compat.py +++ b/qiskit/providers/backend_compat.py @@ -25,6 +25,7 @@ from qiskit.providers.models.pulsedefaults import PulseDefaults from qiskit.providers.options import Options from qiskit.providers.exceptions import BackendPropertyError +from qiskit.utils import deprecate_func logger = logging.getLogger(__name__) @@ -352,6 +353,12 @@ class should only be used if you need a :class:`~.BackendV2` and still need ) """ + @deprecate_func( + since="1.4", + removal_timeline="in the 2.0 release", + additional_msg="Since ``BackendV1`` is deprecated, this conversion tool from BackendV1 to " + "BackendV2 is going to be removed with BackendV1.", + ) def __init__( self, backend: BackendV1, From 957ecd600caa1c3bc900f177a2207f1b14a7d6aa Mon Sep 17 00:00:00 2001 From: Luciano Bello Date: Mon, 29 Jul 2024 15:29:16 +0200 Subject: [PATCH 2/6] reno --- .../notes/deprecate_BackendV2Converter-7fdbe7d9dad1b5df.yaml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 releasenotes/notes/deprecate_BackendV2Converter-7fdbe7d9dad1b5df.yaml diff --git a/releasenotes/notes/deprecate_BackendV2Converter-7fdbe7d9dad1b5df.yaml b/releasenotes/notes/deprecate_BackendV2Converter-7fdbe7d9dad1b5df.yaml new file mode 100644 index 000000000000..68d75055b7e3 --- /dev/null +++ b/releasenotes/notes/deprecate_BackendV2Converter-7fdbe7d9dad1b5df.yaml @@ -0,0 +1,4 @@ +--- +deprecations_providers: + - | + With the deprecation of ``BackendV1``, the tool for converting ``BackendV1`` to ``BackendV2`` is now deprecated. From 822b3fc6ac8e7a60f0cf342b054dda4257fc713b Mon Sep 17 00:00:00 2001 From: Luciano Bello Date: Mon, 29 Jul 2024 16:48:14 +0200 Subject: [PATCH 3/6] silence internal calls --- qiskit/compiler/transpiler.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/qiskit/compiler/transpiler.py b/qiskit/compiler/transpiler.py index adf60ca91e56..74c3d1704a35 100644 --- a/qiskit/compiler/transpiler.py +++ b/qiskit/compiler/transpiler.py @@ -318,7 +318,18 @@ def callback_func(**kwargs): # This is a temporary conversion step to allow for a smoother transition # to a fully target-based transpiler pipeline while maintaining the behavior # of `transpile` with BackendV1 inputs. - backend = BackendV2Converter(backend) + with warnings.catch_warnings(): + # This is a temporary conversion step to allow for a smoother transition + # to a fully target-based transpiler pipeline while maintaining the behavior + # of `transpile` with BackendV1 inputs. + # TODO BackendV1 is deprecated and this path can be removed once it gets removed. + warnings.filterwarnings( + "ignore", + category=DeprecationWarning, + message=r".+qiskit\.providers\.backend_compat\.BackendV2Converter.+", + module="qiskit", + ) + backend = BackendV2Converter(backend) if ( scheduling_method is not None From 0a890bd4fe3e45f7765e4361941730ad898cb8b3 Mon Sep 17 00:00:00 2001 From: Luciano Bello Date: Mon, 29 Jul 2024 16:56:53 +0200 Subject: [PATCH 4/6] test.python.compiler.test_transpiler.TestTranspile --- test/python/compiler/test_transpiler.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/test/python/compiler/test_transpiler.py b/test/python/compiler/test_transpiler.py index 472fc732ca9a..f1fdf50a2dbe 100644 --- a/test/python/compiler/test_transpiler.py +++ b/test/python/compiler/test_transpiler.py @@ -1523,7 +1523,8 @@ def test_scheduling_timing_constraints(self): work with both BackendV1 and BackendV2.""" backend_v1 = Fake27QPulseV1() - backend_v2 = BackendV2Converter(backend_v1) + with self.assertWarns(DeprecationWarning): + backend_v2 = BackendV2Converter(backend_v1) # the original timing constraints are granularity = min_length = 16 timing_constraints = TimingConstraints(granularity=32, min_length=64) error_msgs = { @@ -1558,7 +1559,8 @@ def test_scheduling_instruction_constraints(self): work with both BackendV1 and BackendV2.""" backend_v1 = Fake27QPulseV1() - backend_v2 = BackendV2Converter(backend_v1) + with self.assertWarns(DeprecationWarning): + backend_v2 = BackendV2Converter(backend_v1) qc = QuantumCircuit(2) qc.h(0) qc.delay(500, 1, "dt") @@ -1583,7 +1585,8 @@ def test_scheduling_dt_constraints(self): work with both BackendV1 and BackendV2.""" backend_v1 = Fake27QPulseV1() - backend_v2 = BackendV2Converter(backend_v1) + with self.assertWarns(DeprecationWarning): + backend_v2 = BackendV2Converter(backend_v1) qc = QuantumCircuit(1, 1) qc.x(0) qc.measure(0, 0) @@ -1603,7 +1606,8 @@ def test_backend_props_constraints(self): work with both BackendV1 and BackendV2.""" backend_v1 = Fake20QV1() - backend_v2 = BackendV2Converter(backend_v1) + with self.assertWarns(DeprecationWarning): + backend_v2 = BackendV2Converter(backend_v1) qr1 = QuantumRegister(3, "qr1") qr2 = QuantumRegister(2, "qr2") qc = QuantumCircuit(qr1, qr2) From d0d940192ce171ffd865e005ac57615a27ab9cd7 Mon Sep 17 00:00:00 2001 From: Luciano Bello Date: Tue, 30 Jul 2024 11:56:43 +0200 Subject: [PATCH 5/6] test.python.providers.test_fake_backends --- .../generate_preset_pass_manager.py | 17 +++++-- test/python/providers/test_fake_backends.py | 46 +++++++++++-------- 2 files changed, 40 insertions(+), 23 deletions(-) diff --git a/qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py b/qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py index bdbac42c8055..b4d8b0997627 100644 --- a/qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +++ b/qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py @@ -15,6 +15,7 @@ """ import copy +import warnings from qiskit.circuit.controlflow import CONTROL_FLOW_OP_NAMES from qiskit.circuit.library.standard_gates import get_standard_gate_name_mapping @@ -251,10 +252,18 @@ def generate_preset_pass_manager( optimization_level = 2 if backend is not None and getattr(backend, "version", 0) <= 1: - # This is a temporary conversion step to allow for a smoother transition - # to a fully target-based transpiler pipeline while maintaining the behavior - # of `transpile` with BackendV1 inputs. - backend = BackendV2Converter(backend) + with warnings.catch_warnings(): + # TODO BackendV1 is deprecated and this path can be removed once it gets removed. + warnings.filterwarnings( + "ignore", + category=DeprecationWarning, + message=r".+qiskit\.providers\.backend_compat\.BackendV2Converter.+", + module="qiskit", + ) + # This is a temporary conversion step to allow for a smoother transition + # to a fully target-based transpiler pipeline while maintaining the behavior + # of `transpile` with BackendV1 inputs. + backend = BackendV2Converter(backend) # Check if a custom inst_map was specified before overwriting inst_map _given_inst_map = bool(inst_map) diff --git a/test/python/providers/test_fake_backends.py b/test/python/providers/test_fake_backends.py index d743c4be5c53..71a9dd0fa0cd 100644 --- a/test/python/providers/test_fake_backends.py +++ b/test/python/providers/test_fake_backends.py @@ -226,8 +226,8 @@ def test_delay_circuit(self): @data(0, 1, 2, 3) def test_converter(self, opt_level): with self.assertWarns(DeprecationWarning): - backend = Fake5QV1() - backend_v2 = BackendV2Converter(backend) + backend_v1 = Fake5QV1() + backend_v2 = BackendV2Converter(backend_v1) self.assertIsInstance(backend_v2, BackendV2) res = transpile(self.circuit, backend_v2, optimization_level=opt_level) job = backend_v2.run(res) @@ -248,7 +248,8 @@ def test_converter_delay_circuit(self): "min_length": 1, "pulse_alignment": 1, } - backend_v2 = BackendV2Converter(backend, add_delay=True) + with self.assertWarns(DeprecationWarning): + backend_v2 = BackendV2Converter(backend, add_delay=True) self.assertIsInstance(backend_v2, BackendV2) qc = QuantumCircuit(2) qc.delay(502, 0, unit="ns") @@ -267,8 +268,9 @@ def test_converter_with_missing_gate_property(self): # Since gate property is not provided, the gate broadcasts to all qubits as ideal instruction. del backend._properties._gates["u2"] - # This should not raise error - backend_v2 = BackendV2Converter(backend, add_delay=True) + with self.assertWarns(DeprecationWarning): + # This should not raise error + backend_v2 = BackendV2Converter(backend, add_delay=True) self.assertDictEqual(backend_v2.target["u2"], {None: None}) def test_non_cx_tests(self): @@ -542,7 +544,8 @@ def test_filter_faulty_qubits_backend_v2_converter(self): } props_dict["qubits"][i].append(non_operational) backend._properties = BackendProperties.from_dict(props_dict) - v2_backend = BackendV2Converter(backend, filter_faulty=True) + with self.assertWarns(DeprecationWarning): + v2_backend = BackendV2Converter(backend, filter_faulty=True) for i in range(62, 67): for qarg in v2_backend.target.qargs: self.assertNotIn(i, qarg) @@ -564,7 +567,8 @@ def test_filter_faulty_qubits_backend_v2_converter_with_delay(self): } props_dict["qubits"][i].append(non_operational) backend._properties = BackendProperties.from_dict(props_dict) - v2_backend = BackendV2Converter(backend, filter_faulty=True, add_delay=True) + with self.assertWarns(DeprecationWarning): + v2_backend = BackendV2Converter(backend, filter_faulty=True, add_delay=True) for i in range(62, 67): for qarg in v2_backend.target.qargs: self.assertNotIn(i, qarg) @@ -593,10 +597,10 @@ def test_backend_v2_converter_without_delay(self): (4, 3), } with self.assertWarns(DeprecationWarning): - backend = Fake5QV1() - backend = BackendV2Converter(backend=backend, filter_faulty=True, add_delay=False) + backend_v1 = Fake5QV1() + backend_v2 = BackendV2Converter(backend=backend_v1, filter_faulty=True, add_delay=False) - self.assertEqual(backend.target.qargs, expected) + self.assertEqual(backend_v2.target.qargs, expected) def test_backend_v2_converter_with_meaningless_gate_config(self): """Test backend with broken gate config can be converted only with properties data.""" @@ -605,11 +609,12 @@ def test_backend_v2_converter_with_meaningless_gate_config(self): backend_v1.configuration().gates = [ GateConfig(name="NotValidGate", parameters=[], qasm_def="not_valid_gate") ] - backend_v2 = BackendV2Converter( - backend=backend_v1, - filter_faulty=True, - add_delay=False, - ) + with self.assertWarns(DeprecationWarning): + backend_v2 = BackendV2Converter( + backend=backend_v1, + filter_faulty=True, + add_delay=False, + ) ops_with_measure = backend_v2.target.operation_names self.assertCountEqual( ops_with_measure, @@ -653,7 +658,8 @@ def test_filter_faulty_qubits_and_gates_backend_v2_converter(self): gate["parameters"].append(non_operational_gate) backend._properties = BackendProperties.from_dict(props_dict) - v2_backend = BackendV2Converter(backend, filter_faulty=True) + with self.assertWarns(DeprecationWarning): + v2_backend = BackendV2Converter(backend, filter_faulty=True) for i in range(62, 67): for qarg in v2_backend.target.qargs: self.assertNotIn(i, qarg) @@ -689,7 +695,8 @@ def test_filter_faulty_gates_v2_converter(self): gate["parameters"].append(non_operational_gate) backend._properties = BackendProperties.from_dict(props_dict) - v2_backend = BackendV2Converter(backend, filter_faulty=True) + with self.assertWarns(DeprecationWarning): + v2_backend = BackendV2Converter(backend, filter_faulty=True) for i in range(62, 67): self.assertIn((i,), v2_backend.target.qargs) for edge in invalid_cx_edges: @@ -699,7 +706,7 @@ def test_filter_faulty_no_faults_v2_converter(self): """Test that faulty qubit filtering does nothing with all operational qubits and gates.""" with self.assertWarns(DeprecationWarning): backend = Fake127QPulseV1() - v2_backend = BackendV2Converter(backend, filter_faulty=True) + v2_backend = BackendV2Converter(backend, filter_faulty=True) for i in range(v2_backend.num_qubits): self.assertIn((i,), v2_backend.target.qargs) @@ -718,7 +725,8 @@ def test_faulty_full_path_transpile_connected_cmap(self, opt_level): if tuple(sorted(gate["qubits"])) == (0, 1): gate["parameters"].append(non_operational_gate) backend._properties = BackendProperties.from_dict(props) - v2_backend = BackendV2Converter(backend, filter_faulty=True) + with self.assertWarns(DeprecationWarning): + v2_backend = BackendV2Converter(backend, filter_faulty=True) qc = QuantumCircuit(5) for x, y in itertools.product(range(5), range(5)): if x == y: From 9b800602c17ce4730b3d3263815b85ae8b22f531 Mon Sep 17 00:00:00 2001 From: Luciano Bello Date: Wed, 4 Dec 2024 16:04:23 +0100 Subject: [PATCH 6/6] test.python.compiler.test_transpiler --- test/python/compiler/test_transpiler.py | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/test/python/compiler/test_transpiler.py b/test/python/compiler/test_transpiler.py index eb1e8e3cc0b8..e8faf7d3eb66 100644 --- a/test/python/compiler/test_transpiler.py +++ b/test/python/compiler/test_transpiler.py @@ -1620,14 +1620,7 @@ def test_scheduling_instruction_constraints_backend(self): with self.assertWarns(DeprecationWarning): backend_v1 = Fake27QPulseV1() - - backend_v2 = GenericBackendV2( - num_qubits=27, - calibrate_instructions=True, - control_flow=True, - coupling_map=MUMBAI_CMAP, - seed=42, - ) + backend_v2 = BackendV2Converter(backend_v1) qc = QuantumCircuit(2) qc.h(0) @@ -1695,6 +1688,7 @@ def test_scheduling_instruction_constraints(self): def test_scheduling_dt_constraints(self): """Test that scheduling-related loose transpile constraints work with both BackendV1 and BackendV2.""" + with self.assertWarns(DeprecationWarning): backend_v1 = Fake27QPulseV1() backend_v2 = BackendV2Converter(backend_v1)