Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Deprecate BackendV2Converter #12840

Merged
merged 8 commits into from
Feb 10, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions qiskit/providers/backend_compat.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
from qiskit.utils.deprecate_pulse import deprecate_pulse_arg, deprecate_pulse_dependency


Expand Down Expand Up @@ -368,6 +369,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,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
---
deprecations_providers:
- |
With the deprecation of ``BackendV1``, the tool for converting ``BackendV1`` to ``BackendV2`` is now deprecated.
1 change: 1 addition & 0 deletions test/python/compiler/test_transpiler.py
Original file line number Diff line number Diff line change
Expand Up @@ -1621,6 +1621,7 @@ def test_scheduling_instruction_constraints_backend(self):
with self.assertWarns(DeprecationWarning):
backend_v1 = Fake27QPulseV1()
backend_v2 = BackendV2Converter(backend_v1)

qc = QuantumCircuit(2)
qc.h(0)
qc.delay(500, 1, "dt")
Expand Down
40 changes: 22 additions & 18 deletions test/python/providers/test_fake_backends.py
Original file line number Diff line number Diff line change
Expand Up @@ -237,8 +237,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)
Expand All @@ -259,7 +259,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")
Expand All @@ -278,8 +279,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):
Expand Down Expand Up @@ -552,9 +554,10 @@ def test_filter_faulty_qubits_backend_v2_converter(self):
"value": 0,
}
props_dict["qubits"][i].append(non_operational)

with self.assertWarns(DeprecationWarning):
backend._properties = BackendProperties.from_dict(props_dict)
v2_backend = BackendV2Converter(backend, filter_faulty=True)
v2_backend = BackendV2Converter(backend, filter_faulty=True)
for i in range(62, 67):
for qarg in v2_backend.target.qargs:
self.assertNotIn(i, qarg)
Expand All @@ -577,7 +580,7 @@ def test_filter_faulty_qubits_backend_v2_converter_with_delay(self):
props_dict["qubits"][i].append(non_operational)
with self.assertWarns(DeprecationWarning):
backend._properties = BackendProperties.from_dict(props_dict)
v2_backend = BackendV2Converter(backend, filter_faulty=True, add_delay=True)
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)
Expand Down Expand Up @@ -606,23 +609,24 @@ 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."""
with self.assertWarns(DeprecationWarning):
backend_v1 = Fake5QV1()

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,
)
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,
Expand Down Expand Up @@ -667,7 +671,7 @@ def test_filter_faulty_qubits_and_gates_backend_v2_converter(self):

with self.assertWarns(DeprecationWarning):
backend._properties = BackendProperties.from_dict(props_dict)
v2_backend = BackendV2Converter(backend, filter_faulty=True)
v2_backend = BackendV2Converter(backend, filter_faulty=True)
for i in range(62, 67):
for qarg in v2_backend.target.qargs:
self.assertNotIn(i, qarg)
Expand Down Expand Up @@ -704,7 +708,7 @@ def test_filter_faulty_gates_v2_converter(self):

with self.assertWarns(DeprecationWarning):
backend._properties = BackendProperties.from_dict(props_dict)
v2_backend = BackendV2Converter(backend, filter_faulty=True)
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:
Expand Down Expand Up @@ -735,7 +739,7 @@ def test_faulty_full_path_transpile_connected_cmap(self, opt_level):
gate["parameters"].append(non_operational_gate)
with self.assertWarns(DeprecationWarning):
backend._properties = BackendProperties.from_dict(props)
v2_backend = BackendV2Converter(backend, filter_faulty=True)
v2_backend = BackendV2Converter(backend, filter_faulty=True)
qc = QuantumCircuit(5)
for x, y in itertools.product(range(5), range(5)):
if x == y:
Expand Down
Loading