Skip to content

Commit a87f68c

Browse files
authored
Remove remaining code usage deprecated in Qiskit 0.46 (#1384)
This change adjusts for several remaining changes in Qiskit 1.0: * qiskit.providers.basicaer was removed in Qiskit 1.0 (see Qiskit/qiskit#11422). Here its use is replaced with qiskit-aer. * `qiskit.providers.fake_provider.FakeJob` was removed in Qiskit 1.0 (see Qiskit/qiskit#11376). Here the `FakeJob` already in `qiskit_experiments.test` is used instead. This update was missed in f22bb7b which switched the other `fake_provider` usage. * Replace `qiskit.provider.FakeProvider` with a custom subclass of `ProviderV1`. `FakeProvider` was moved out of Qiskit 1.0 to qiskit-ibm-runtime. * `calibration/test_rabi.py` was modified to make the data for a test of bad data worse as the test started fitting the data as good with the original parameters and qiskit-aer in place of basicaer. * In the readout mitigation manual, a use of `plot_histogram` was exchanged for one of `plot_distribution`. * Guard `FakeBackendV2` import that was removed in Qiskit 1.0. Try to import `FakeBackendV2` from qiskit-ibm-runtime as well. Also, this change unpins qiskit which had to be pinned in f22bb7b until these fixes could be merged since 0.46.0 was released with deprecation warnings for some of the usage changed here.
1 parent f22bb7b commit a87f68c

File tree

8 files changed

+62
-16
lines changed

8 files changed

+62
-16
lines changed

docs/manuals/measurement/readout_mitigation.rst

+2-2
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ experiments to generate the corresponding mitigators.
4040
import numpy as np
4141
import matplotlib.pyplot as plt
4242
from qiskit import QuantumCircuit
43-
from qiskit.visualization import plot_histogram
43+
from qiskit.visualization import plot_distribution
4444
from qiskit_experiments.library import LocalReadoutError, CorrelatedReadoutError
4545

4646
from qiskit_aer import AerSimulator
@@ -128,7 +128,7 @@ Probabilities
128128
.. jupyter-execute::
129129

130130
legend = ['Mitigated Probabilities', 'Unmitigated Probabilities']
131-
plot_histogram([mitigated_probs, unmitigated_probs], legend=legend, sort="value_desc", bar_labels=False)
131+
plot_distribution([mitigated_probs, unmitigated_probs], legend=legend, sort="value_desc", bar_labels=False)
132132

133133

134134
Expectation value

qiskit_experiments/framework/backend_data.py

+37-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,40 @@ class unifies data access for various data fields.
1717
"""
1818
from qiskit.providers.models import PulseBackendConfiguration
1919
from qiskit.providers import BackendV1, BackendV2
20-
from qiskit.providers.fake_provider import fake_backend, FakeBackendV2, FakeBackend
20+
from qiskit.providers.fake_provider import FakeBackend
21+
from qiskit.providers.fake_provider.fake_backend import FakeBackendV2
22+
23+
try:
24+
# Removed in Qiskit 1.0. Different from the other FakeBackendV2's
25+
from qiskit.providers.fake_provider import QiskitFakeBackendV2
26+
except ImportError:
27+
28+
class QiskitFakeBackendV2:
29+
"""Dummy class for when FakeBackendV2 import fails
30+
31+
This class is only used in isinstance checks. If the import fails, then
32+
there won't be an instance of the class either so any dummy class is
33+
fine.
34+
"""
35+
36+
pass
37+
38+
39+
try:
40+
# A copy of qiskit.providers.fake_provider.fake_backend.FakeBackendV2, at
41+
# least as of qiskit-ibm-runtime 0.18.0 and Qiskit 1.0
42+
from qiskit_ibm_runtime.fake_provider.fake_backend import FakeBackendV2 as RuntimeFakeBackendV2
43+
except ImportError:
44+
45+
class RuntimeFakeBackendV2:
46+
"""Dummy class for when FakeBackendV2 import fails
47+
48+
This class is only used in isinstance checks. If the import fails, then
49+
there won't be an instance of the class either so any dummy class is
50+
fine.
51+
"""
52+
53+
pass
2154

2255

2356
class BackendData:
@@ -255,7 +288,9 @@ def is_simulator(self):
255288
if self._backend.configuration().simulator or isinstance(self._backend, FakeBackend):
256289
return True
257290
if self._v2:
258-
if isinstance(self._backend, (FakeBackendV2, fake_backend.FakeBackendV2)):
291+
if isinstance(
292+
self._backend, (FakeBackendV2, QiskitFakeBackendV2, RuntimeFakeBackendV2)
293+
):
259294
return True
260295

261296
return False

qiskit_experiments/test/fake_backend.py

+9-1
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313
"""Fake backend class for tests."""
1414
import uuid
1515
from qiskit.circuit.library import Measure
16+
from qiskit.providers import ProviderV1
1617
from qiskit.providers.backend import BackendV2
17-
from qiskit.providers.fake_provider import FakeProvider
1818
from qiskit.providers.options import Options
1919
from qiskit.transpiler import Target
2020

@@ -23,6 +23,14 @@
2323
from qiskit_experiments.test.utils import FakeJob
2424

2525

26+
class FakeProvider(ProviderV1):
27+
"""Fake provider with no backends for testing"""
28+
29+
def backends(self, name=None, **kwargs):
30+
"""List of available backends. Empty in this case"""
31+
return []
32+
33+
2634
class FakeBackend(BackendV2):
2735
"""
2836
Fake backend for test purposes only.

requirements-dev.txt

-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
qiskit==0.45.3
21
# Linters
32
black~=22.0
43
pylint~=3.0.2

requirements.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
numpy>=1.17
22
scipy>=1.4
3-
qiskit==0.45.3 # Temporary
3+
qiskit>=0.45
44
qiskit-ibm-experiment>=0.3.4
55
matplotlib>=3.4
66
uncertainties

test/curve_analysis/test_curve_fitting.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
import numpy as np
1616

1717
from qiskit import QuantumCircuit, transpile
18-
from qiskit.providers.basicaer import QasmSimulatorPy
18+
from qiskit_aer import AerSimulator
1919
from qiskit_experiments.curve_analysis import process_curve_data
2020
from qiskit_experiments.curve_analysis.utils import (
2121
level2_probability,
@@ -36,7 +36,7 @@ def simulate_experiment_data(self, thetas, shots=1024):
3636
qc.measure_all()
3737
circuits.append(qc)
3838

39-
sim = QasmSimulatorPy()
39+
sim = AerSimulator()
4040
circuits = transpile(circuits, sim)
4141
job = sim.run(circuits, shots=shots, seed_simulator=10)
4242
result = job.result()

test/framework/test_framework.py

+5-4
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,18 @@
1313
"""Tests for base experiment framework."""
1414

1515
import pickle
16+
from itertools import product
1617
from test.fake_experiment import FakeExperiment, FakeAnalysis
1718
from test.base import QiskitExperimentsTestCase
18-
from itertools import product
19+
1920
import ddt
2021

2122
from qiskit import QuantumCircuit
22-
from qiskit.providers.fake_provider import FakeJob
2323
from qiskit.providers.jobstatus import JobStatus
2424
from qiskit.exceptions import QiskitError
2525
from qiskit_ibm_runtime.fake_provider import FakeVigoV2
2626

27+
from qiskit_experiments.database_service import Qubit
2728
from qiskit_experiments.exceptions import AnalysisError
2829
from qiskit_experiments.framework import (
2930
ExperimentData,
@@ -33,7 +34,7 @@
3334
AnalysisStatus,
3435
)
3536
from qiskit_experiments.test.fake_backend import FakeBackend
36-
from qiskit_experiments.database_service import Qubit
37+
from qiskit_experiments.test.utils import FakeJob
3738

3839

3940
@ddt.ddt
@@ -287,7 +288,7 @@ class MyBackend(FakeVigoV2):
287288
"""A backend that works with `MyJob`"""
288289

289290
def run(self, run_input, **options):
290-
return MyJob(self, "jobid", None)
291+
return MyJob(self)
291292

292293
class MyJob(FakeJob):
293294
"""A job with status ERROR, that errors when the result is queried"""

test/library/calibration/test_rabi.py

+6-3
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818
from qiskit import QuantumCircuit, pulse, transpile
1919
from qiskit.exceptions import QiskitError
2020
from qiskit.circuit import Parameter
21-
from qiskit.providers.basicaer import QasmSimulatorPy
2221
from qiskit.qobj.utils import MeasLevel
22+
from qiskit_aer import AerSimulator
2323

2424
from qiskit_experiments.framework import ExperimentData, ParallelExperiment
2525
from qiskit_experiments.library import Rabi, EFRabi
@@ -223,7 +223,7 @@ def simulate_experiment_data(self, thetas, amplitudes, shots=1024):
223223
qc.measure_all()
224224
circuits.append(qc)
225225

226-
sim = QasmSimulatorPy()
226+
sim = AerSimulator()
227227
circuits = transpile(circuits, sim)
228228
job = sim.run(circuits, shots=shots, seed_simulator=10)
229229
result = job.result()
@@ -272,7 +272,10 @@ def test_bad_analysis(self):
272272
"""Test the Rabi analysis."""
273273
experiment_data = ExperimentData()
274274

275-
thetas = np.linspace(0.0, np.pi / 4, 31)
275+
# Change rotation angle with square root of amplitude so that
276+
# population versus amplitude will not be sinusoidal and the fit will
277+
# be bad.
278+
thetas = np.sqrt(np.linspace(0.0, 4 * np.pi**2, 31))
276279
amplitudes = np.linspace(0.0, 0.95, 31)
277280

278281
experiment_data.add_data(self.simulate_experiment_data(thetas, amplitudes, shots=200))

0 commit comments

Comments
 (0)