From 4f3224554028e6aadbf1d47c145f6b7ad9eb18c4 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 10 Dec 2024 11:18:23 -0500 Subject: [PATCH] Remove workarounds for passing run options to sampler (backport #1498) (#1500) This runtime patching code was added along with the initial support for sampler execution because the path through `qiskit_ibm_runtime.SamplerV2` through to `BackendSamplerV2` did not carry through options for level 1 measurements or noise models. This path is used in the tests (while execution on physical backends with `SamplerV2` does not use this path). Now with Qiskit 1.3 and qiskit-ibm-runtime 0.34, this patching is no longer needed. Remaining warnings filtering was moved to the calibrations tutorial where it was needed.
This is an automatic backport of pull request #1498 done by [Mergify](https://mergify.com). Co-authored-by: Will Shanks --- docs/howtos/artifacts.rst | 7 - docs/manuals/characterization/t1.rst | 7 - docs/manuals/characterization/t2ramsey.rst | 7 - docs/manuals/characterization/tphi.rst | 7 - .../measurement/readout_mitigation.rst | 7 - .../measurement/restless_measurements.rst | 4 - docs/manuals/verification/quantum_volume.rst | 7 - .../verification/randomized_benchmarking.rst | 7 - .../manuals/verification/state_tomography.rst | 7 - docs/tutorials/calibrations.rst | 1 + docs/tutorials/custom_experiment.rst | 7 - docs/tutorials/getting_started.rst | 7 - .../correlated_readout_error.py | 4 - .../characterization/fine_frequency.py | 4 - .../characterization/local_readout_error.py | 4 - .../multi_state_discrimination.py | 4 - .../library/characterization/ramsey_xy.py | 4 - .../library/characterization/t1.py | 4 - .../library/characterization/t2ramsey.py | 4 - .../library/characterization/tphi.py | 4 - .../library/characterization/zz_ramsey.py | 4 - qiskit_experiments/test/mock_iq_backend.py | 5 - qiskit_experiments/test/patching.py | 260 ------------------ qiskit_experiments/test/pulse_backend.py | 5 - qiskit_experiments/test/t2hahn_backend.py | 6 - requirements-dev.txt | 7 +- test/base.py | 5 - 27 files changed, 7 insertions(+), 392 deletions(-) delete mode 100644 qiskit_experiments/test/patching.py diff --git a/docs/howtos/artifacts.rst b/docs/howtos/artifacts.rst index 9ad3112d72..b3075507f4 100644 --- a/docs/howtos/artifacts.rst +++ b/docs/howtos/artifacts.rst @@ -25,13 +25,6 @@ Viewing artifacts Here we run a parallel experiment consisting of two :class:`.T1` experiments in parallel and then view the output artifacts as a list of :class:`.ArtifactData` objects accessed by :meth:`.ExperimentData.artifacts`: -.. jupyter-execute:: - :hide-code: - - # Temporary workaround for missing support in Qiskit and qiskit-ibm-runtime - from qiskit_experiments.test.patching import patch_sampler_test_support - patch_sampler_test_support() - .. jupyter-execute:: from qiskit_ibm_runtime.fake_provider import FakePerth diff --git a/docs/manuals/characterization/t1.rst b/docs/manuals/characterization/t1.rst index 97af51b743..1fefa30371 100644 --- a/docs/manuals/characterization/t1.rst +++ b/docs/manuals/characterization/t1.rst @@ -34,13 +34,6 @@ for qubit 0. packages to run simulations. You can install them with ``python -m pip install qiskit-aer qiskit-ibm-runtime``. -.. jupyter-execute:: - :hide-code: - - # Temporary workaround for missing support in Qiskit and qiskit-ibm-runtime - from qiskit_experiments.test.patching import patch_sampler_test_support - patch_sampler_test_support() - .. jupyter-execute:: import numpy as np diff --git a/docs/manuals/characterization/t2ramsey.rst b/docs/manuals/characterization/t2ramsey.rst index d451574a91..25048eb040 100644 --- a/docs/manuals/characterization/t2ramsey.rst +++ b/docs/manuals/characterization/t2ramsey.rst @@ -62,13 +62,6 @@ pure T1/T2 relaxation noise model. packages to run simulations. You can install them with ``python -m pip install qiskit-aer qiskit-ibm-runtime``. -.. jupyter-execute:: - :hide-code: - - # Temporary workaround for missing support in Qiskit and qiskit-ibm-runtime - from qiskit_experiments.test.patching import patch_sampler_test_support - patch_sampler_test_support() - .. jupyter-execute:: # A T1 simulator diff --git a/docs/manuals/characterization/tphi.rst b/docs/manuals/characterization/tphi.rst index 0f04c9a34f..43e117b657 100644 --- a/docs/manuals/characterization/tphi.rst +++ b/docs/manuals/characterization/tphi.rst @@ -25,13 +25,6 @@ From the :math:`T_1` and :math:`T_2` estimates, we compute the results for packages to run simulations. You can install them with ``python -m pip install qiskit-aer qiskit-ibm-runtime``. -.. jupyter-execute:: - :hide-code: - - # Temporary workaround for missing support in Qiskit and qiskit-ibm-runtime - from qiskit_experiments.test.patching import patch_sampler_test_support - patch_sampler_test_support() - .. jupyter-execute:: import numpy as np diff --git a/docs/manuals/measurement/readout_mitigation.rst b/docs/manuals/measurement/readout_mitigation.rst index 80e74f65fa..9805e79116 100644 --- a/docs/manuals/measurement/readout_mitigation.rst +++ b/docs/manuals/measurement/readout_mitigation.rst @@ -35,13 +35,6 @@ experiments to generate the corresponding mitigators. packages to run simulations. You can install them with ``python -m pip install qiskit-aer qiskit-ibm-runtime``. -.. jupyter-execute:: - :hide-code: - - # Temporary workaround for missing support in Qiskit and qiskit-ibm-runtime - from qiskit_experiments.test.patching import patch_sampler_test_support - patch_sampler_test_support() - .. jupyter-execute:: import numpy as np diff --git a/docs/manuals/measurement/restless_measurements.rst b/docs/manuals/measurement/restless_measurements.rst index e431c64b86..8966bdb4c3 100644 --- a/docs/manuals/measurement/restless_measurements.rst +++ b/docs/manuals/measurement/restless_measurements.rst @@ -88,10 +88,6 @@ they use always starts with the qubits in the ground state. category=DeprecationWarning, ) - # Temporary workaround for missing support in Qiskit and qiskit-ibm-runtime - from qiskit_experiments.test.patching import patch_sampler_test_support - patch_sampler_test_support() - .. jupyter-execute:: from qiskit_ibm_runtime.fake_provider import FakePerth diff --git a/docs/manuals/verification/quantum_volume.rst b/docs/manuals/verification/quantum_volume.rst index 4d2ca9ec5c..f73cc89ac2 100644 --- a/docs/manuals/verification/quantum_volume.rst +++ b/docs/manuals/verification/quantum_volume.rst @@ -29,13 +29,6 @@ z_value = 2), and at least 100 trials have been ran. packages to run simulations. You can install them with ``python -m pip install qiskit-aer qiskit-ibm-runtime``. -.. jupyter-execute:: - :hide-code: - - # Temporary workaround for missing support in Qiskit and qiskit-ibm-runtime - from qiskit_experiments.test.patching import patch_sampler_test_support - patch_sampler_test_support() - .. jupyter-execute:: from qiskit_experiments.framework import BatchExperiment diff --git a/docs/manuals/verification/randomized_benchmarking.rst b/docs/manuals/verification/randomized_benchmarking.rst index 15f0fa215f..d38cbe02b7 100644 --- a/docs/manuals/verification/randomized_benchmarking.rst +++ b/docs/manuals/verification/randomized_benchmarking.rst @@ -16,13 +16,6 @@ explanation on the RB method, which is based on Refs. [1]_ [2]_. packages to run simulations. You can install them with ``python -m pip install qiskit-aer qiskit-ibm-runtime``. -.. jupyter-execute:: - :hide-code: - - # Temporary workaround for missing support in Qiskit and qiskit-ibm-runtime - from qiskit_experiments.test.patching import patch_sampler_test_support - patch_sampler_test_support() - .. jupyter-execute:: import numpy as np diff --git a/docs/manuals/verification/state_tomography.rst b/docs/manuals/verification/state_tomography.rst index cc481ade36..3e25f8b884 100644 --- a/docs/manuals/verification/state_tomography.rst +++ b/docs/manuals/verification/state_tomography.rst @@ -14,13 +14,6 @@ complete basis of measurement operators. We first initialize a simulator to run the experiments on. -.. jupyter-execute:: - :hide-code: - - # Temporary workaround for missing support in Qiskit and qiskit-ibm-runtime - from qiskit_experiments.test.patching import patch_sampler_test_support - patch_sampler_test_support() - .. jupyter-execute:: from qiskit_aer import AerSimulator diff --git a/docs/tutorials/calibrations.rst b/docs/tutorials/calibrations.rst index 2555d60a00..799f56dfbd 100644 --- a/docs/tutorials/calibrations.rst +++ b/docs/tutorials/calibrations.rst @@ -56,6 +56,7 @@ This automatic updating can also be disabled using the ``auto_update`` flag. message=".*The entire Qiskit Pulse package is being deprecated.*", category=DeprecationWarning, ) + warnings.filterwarnings("ignore", ".*Could not determine job completion time.*", UserWarning) .. jupyter-execute:: diff --git a/docs/tutorials/custom_experiment.rst b/docs/tutorials/custom_experiment.rst index 74ba533e59..0a1a50b4f9 100644 --- a/docs/tutorials/custom_experiment.rst +++ b/docs/tutorials/custom_experiment.rst @@ -562,13 +562,6 @@ To test our code, we first simulate a noisy backend with asymmetric readout erro You can install it with ``python -m pip install qiskit-aer``. -.. jupyter-execute:: - :hide-code: - - # Temporary workaround for missing support in Qiskit and qiskit-ibm-runtime - from qiskit_experiments.test.patching import patch_sampler_test_support - patch_sampler_test_support() - .. jupyter-execute:: from qiskit_aer import AerSimulator, noise diff --git a/docs/tutorials/getting_started.rst b/docs/tutorials/getting_started.rst index 2eb3b093e2..72062fde4a 100644 --- a/docs/tutorials/getting_started.rst +++ b/docs/tutorials/getting_started.rst @@ -86,13 +86,6 @@ backend, real or simulated, that you can access through Qiskit. packages to run simulations. You can install them with ``python -m pip install qiskit-aer qiskit-ibm-runtime``. -.. jupyter-execute:: - :hide-code: - - # Temporary workaround for missing support in Qiskit and qiskit-ibm-runtime - from qiskit_experiments.test.patching import patch_sampler_test_support - patch_sampler_test_support() - .. jupyter-execute:: from qiskit_ibm_runtime.fake_provider import FakePerth diff --git a/qiskit_experiments/library/characterization/correlated_readout_error.py b/qiskit_experiments/library/characterization/correlated_readout_error.py index 3fe55efa7b..617feb523f 100644 --- a/qiskit_experiments/library/characterization/correlated_readout_error.py +++ b/qiskit_experiments/library/characterization/correlated_readout_error.py @@ -77,10 +77,6 @@ class CorrelatedReadoutError(BaseExperiment): .. jupyter-execute:: :hide-code: - # Temporary workaround for missing support in Qiskit and qiskit-ibm-runtime - from qiskit_experiments.test.patching import patch_sampler_test_support - patch_sampler_test_support() - from qiskit.providers.fake_provider import GenericBackendV2 from qiskit_aer import AerSimulator diff --git a/qiskit_experiments/library/characterization/fine_frequency.py b/qiskit_experiments/library/characterization/fine_frequency.py index c01b17d5c7..ce39417d67 100644 --- a/qiskit_experiments/library/characterization/fine_frequency.py +++ b/qiskit_experiments/library/characterization/fine_frequency.py @@ -53,10 +53,6 @@ class FineFrequency(BaseExperiment): .. jupyter-execute:: :hide-code: - # Temporary workaround for missing support in Qiskit and qiskit-ibm-runtime - from qiskit_experiments.test.patching import patch_sampler_test_support - patch_sampler_test_support() - # backend from qiskit_ibm_runtime.fake_provider import FakePerth from qiskit_aer import AerSimulator diff --git a/qiskit_experiments/library/characterization/local_readout_error.py b/qiskit_experiments/library/characterization/local_readout_error.py index 329a7b0234..8830f2270f 100644 --- a/qiskit_experiments/library/characterization/local_readout_error.py +++ b/qiskit_experiments/library/characterization/local_readout_error.py @@ -66,10 +66,6 @@ class LocalReadoutError(BaseExperiment): .. jupyter-execute:: :hide-code: - # Temporary workaround for missing support in Qiskit and qiskit-ibm-runtime - from qiskit_experiments.test.patching import patch_sampler_test_support - patch_sampler_test_support() - # backend from qiskit_aer import AerSimulator from qiskit_ibm_runtime.fake_provider import FakePerth diff --git a/qiskit_experiments/library/characterization/multi_state_discrimination.py b/qiskit_experiments/library/characterization/multi_state_discrimination.py index 4acb492e94..37e72331ab 100644 --- a/qiskit_experiments/library/characterization/multi_state_discrimination.py +++ b/qiskit_experiments/library/characterization/multi_state_discrimination.py @@ -58,10 +58,6 @@ class MultiStateDiscrimination(BaseExperiment): .. jupyter-execute:: :hide-code: - # Temporary workaround for missing support in Qiskit and qiskit-ibm-runtime - from qiskit_experiments.test.patching import patch_sampler_test_support - patch_sampler_test_support() - # backend from qiskit_experiments.test.pulse_backend import SingleTransmonTestBackend backend = SingleTransmonTestBackend(5.2e9,-.25e9, 1e9, 0.8e9, 1e4, noise=False, seed=199) diff --git a/qiskit_experiments/library/characterization/ramsey_xy.py b/qiskit_experiments/library/characterization/ramsey_xy.py index f60a276c0c..40566580f9 100644 --- a/qiskit_experiments/library/characterization/ramsey_xy.py +++ b/qiskit_experiments/library/characterization/ramsey_xy.py @@ -85,10 +85,6 @@ class RamseyXY(BaseExperiment, RestlessMixin): .. jupyter-execute:: :hide-code: - # Temporary workaround for missing support in Qiskit and qiskit-ibm-runtime - from qiskit_experiments.test.patching import patch_sampler_test_support - patch_sampler_test_support() - # backend from qiskit_aer import AerSimulator from qiskit_ibm_runtime.fake_provider import FakePerth diff --git a/qiskit_experiments/library/characterization/t1.py b/qiskit_experiments/library/characterization/t1.py index c8ed55d558..6f3c02cfc1 100644 --- a/qiskit_experiments/library/characterization/t1.py +++ b/qiskit_experiments/library/characterization/t1.py @@ -41,10 +41,6 @@ class T1(BaseExperiment): .. jupyter-execute:: :hide-code: - # Temporary workaround for missing support in Qiskit and qiskit-ibm-runtime - from qiskit_experiments.test.patching import patch_sampler_test_support - patch_sampler_test_support() - # backend from qiskit_ibm_runtime.fake_provider import FakeManilaV2 from qiskit_aer import AerSimulator diff --git a/qiskit_experiments/library/characterization/t2ramsey.py b/qiskit_experiments/library/characterization/t2ramsey.py index 38312d4d4b..b4b06be794 100644 --- a/qiskit_experiments/library/characterization/t2ramsey.py +++ b/qiskit_experiments/library/characterization/t2ramsey.py @@ -63,10 +63,6 @@ class T2Ramsey(BaseExperiment): .. jupyter-execute:: :hide-code: - # Temporary workaround for missing support in Qiskit and qiskit-ibm-runtime - from qiskit_experiments.test.patching import patch_sampler_test_support - patch_sampler_test_support() - # backend from qiskit_ibm_runtime.fake_provider import FakeManilaV2 from qiskit_aer import AerSimulator diff --git a/qiskit_experiments/library/characterization/tphi.py b/qiskit_experiments/library/characterization/tphi.py index 6b67c2b771..5e1755326d 100644 --- a/qiskit_experiments/library/characterization/tphi.py +++ b/qiskit_experiments/library/characterization/tphi.py @@ -54,10 +54,6 @@ class Tphi(BatchExperiment): .. jupyter-execute:: :hide-code: - # Temporary workaround for missing support in Qiskit and qiskit-ibm-runtime - from qiskit_experiments.test.patching import patch_sampler_test_support - patch_sampler_test_support() - # backend from qiskit_ibm_runtime.fake_provider import FakeManilaV2 from qiskit_aer import AerSimulator diff --git a/qiskit_experiments/library/characterization/zz_ramsey.py b/qiskit_experiments/library/characterization/zz_ramsey.py index b9e84265f5..69cc0a1306 100644 --- a/qiskit_experiments/library/characterization/zz_ramsey.py +++ b/qiskit_experiments/library/characterization/zz_ramsey.py @@ -129,10 +129,6 @@ class ZZRamsey(BaseExperiment): .. jupyter-execute:: :hide-code: - # Temporary workaround for missing support in Qiskit and qiskit-ibm-runtime - from qiskit_experiments.test.patching import patch_sampler_test_support - patch_sampler_test_support() - # backend from qiskit_ibm_runtime.fake_provider import FakePerth from qiskit_aer import AerSimulator diff --git a/qiskit_experiments/test/mock_iq_backend.py b/qiskit_experiments/test/mock_iq_backend.py index 02ea3bbde1..4436d05754 100644 --- a/qiskit_experiments/test/mock_iq_backend.py +++ b/qiskit_experiments/test/mock_iq_backend.py @@ -47,11 +47,6 @@ def __init__( backend_version: str = None, **fields, ): - # Temporary workaround for missing support in Qiskit and qiskit-ibm-runtime - from qiskit_experiments.test.patching import patch_sampler_test_support - - patch_sampler_test_support() - super().__init__(provider, name, description, online_date, backend_version, **fields) backend_v1 = FakeOpenPulse2Q() diff --git a/qiskit_experiments/test/patching.py b/qiskit_experiments/test/patching.py deleted file mode 100644 index f0a6b56409..0000000000 --- a/qiskit_experiments/test/patching.py +++ /dev/null @@ -1,260 +0,0 @@ -# This code is part of Qiskit. -# -# (C) Copyright IBM 2022. -# -# This code is licensed under the Apache License, Version 2.0. You may -# obtain a copy of this license in the LICENSE.txt file in the root directory -# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. -# -# Any modifications or derivative works of this code must retain this -# copyright notice, and modified files need to carry a notice indicating -# that they have been altered from the originals. - -"""Temporary monkey-patching test support for BackednSamplerV2""" -from __future__ import annotations - -import copy -import math -import warnings -from dataclasses import dataclass -from typing import Any, Literal - -import numpy as np - -import qiskit.primitives.backend_sampler_v2 -from qiskit.circuit import QuantumCircuit -from qiskit.exceptions import QiskitError -from qiskit.primitives import ( - BackendEstimatorV2, - BackendSamplerV2, -) -from qiskit.primitives.containers import ( - BitArray, - DataBin, - SamplerPubResult, -) -from qiskit.primitives.containers.sampler_pub import SamplerPub -from qiskit.primitives.primitive_job import PrimitiveJob -from qiskit.providers.backend import BackendV1, BackendV2 -from qiskit.result import Result -from qiskit_ibm_runtime.fake_provider.local_service import QiskitRuntimeLocalService - - -# The rest of this file contains definitions for monkey patching support for -# level 1 data and a noise model run option into BackendSamplerV2 -def _patched_run_circuits( - circuits: QuantumCircuit | list[QuantumCircuit], - backend: BackendV1 | BackendV2, - **run_options, -) -> tuple[list[Result], list[dict]]: - """Remove metadata of circuits and run the circuits on a backend. - Args: - circuits: The circuits - backend: The backend - monitor: Enable job minotor if True - **run_options: run_options - Returns: - The result and the metadata of the circuits - """ - if isinstance(circuits, QuantumCircuit): - circuits = [circuits] - metadata = [] - for circ in circuits: - metadata.append(circ.metadata) - # Commenting out this line is only change from qiskit.primitives.backend_estimator._run_circuits - # circ.metadata = {} - if isinstance(backend, BackendV1): - max_circuits = getattr(backend.configuration(), "max_experiments", None) - elif isinstance(backend, BackendV2): - max_circuits = backend.max_circuits - else: - raise RuntimeError("Backend version not supported") - if max_circuits: - jobs = [ - backend.run(circuits[pos : pos + max_circuits], **run_options) - for pos in range(0, len(circuits), max_circuits) - ] - result = [x.result() for x in jobs] - else: - result = [backend.run(circuits, **run_options).result()] - return result, metadata - - -def _patched_run_backend_primitive_v2( - self, # pylint: disable=unused-argument - backend: BackendV1 | BackendV2, - primitive: Literal["sampler", "estimator"], - options: dict, - inputs: dict, -) -> PrimitiveJob: - """Run V2 backend primitive. - - Args: - backend: The backend to run the primitive on. - primitive: Name of the primitive. - options: Primitive options to use. - inputs: Primitive inputs. - - Returns: - The job object of the result of the primitive. - """ - options_copy = copy.deepcopy(options) - - prim_options = {} - sim_options = options_copy.get("simulator", {}) - if seed_simulator := sim_options.pop("seed_simulator", None): - prim_options["seed_simulator"] = seed_simulator - if noise_model := sim_options.pop("noise_model", None): - prim_options["noise_model"] = noise_model - if not sim_options: - options_copy.pop("simulator", None) - if primitive == "sampler": - if default_shots := options_copy.pop("default_shots", None): - prim_options["default_shots"] = default_shots - if meas_type := options_copy.get("execution", {}).pop("meas_type", None): - if meas_type == "classified": - prim_options["meas_level"] = 2 - prim_options["meas_return"] = "single" - elif meas_type == "kerneled": - prim_options["meas_level"] = 1 - prim_options["meas_return"] = "single" - elif meas_type == "avg_kerneled": - prim_options["meas_level"] = 1 - prim_options["meas_return"] = "avg" - else: - options_copy["execution"]["meas_type"] = meas_type - - if not options_copy["execution"]: - del options_copy["execution"] - - primitive_inst = BackendSamplerV2(backend=backend, options=prim_options) - else: - if default_shots := options_copy.pop("default_shots", None): - inputs["precision"] = 1 / math.sqrt(default_shots) - if default_precision := options_copy.pop("default_precision", None): - prim_options["default_precision"] = default_precision - primitive_inst = BackendEstimatorV2(backend=backend, options=prim_options) - - if options_copy: - warnings.warn(f"Options {options_copy} have no effect in local testing mode.") - - return primitive_inst.run(**inputs) - - -@dataclass -class Options: - """Options for :class:`~.BackendSamplerV2`""" - - default_shots: int = 1024 - """The default shots to use if none are specified in :meth:`~.run`. - Default: 1024. - """ - - seed_simulator: int | None = None - """The seed to use in the simulator. If None, a random seed will be used. - Default: None. - """ - - noise_model: Any | None = None - meas_level: int | None = None - meas_return: str | None = None - - -def _patched_run_pubs(self, pubs: list[SamplerPub], shots: int) -> list[SamplerPubResult]: - """Compute results for pubs that all require the same value of ``shots``.""" - # prepare circuits - bound_circuits = [pub.parameter_values.bind_all(pub.circuit) for pub in pubs] - flatten_circuits = [] - for circuits in bound_circuits: - flatten_circuits.extend(np.ravel(circuits).tolist()) - - # run circuits - run_opts = { - k: getattr(self._options, k) - for k in ("noise_model", "meas_return", "meas_level") - if getattr(self._options, k) is not None - } - results, _ = _patched_run_circuits( - flatten_circuits, - self._backend, - memory=True, - shots=shots, - seed_simulator=self._options.seed_simulator, - **run_opts, - ) - result_memory = qiskit.primitives.backend_sampler_v2._prepare_memory(results) - - # pack memory to an ndarray of uint8 - results = [] - start = 0 - for pub, bound in zip(pubs, bound_circuits): - meas_info, max_num_bytes = qiskit.primitives.backend_sampler_v2._analyze_circuit( - pub.circuit - ) - end = start + bound.size - results.append( - self._postprocess_pub( - result_memory[start:end], - shots, - bound.shape, - meas_info, - max_num_bytes, - pub.circuit.metadata, - meas_level=self._options.meas_level, - ) - ) - start = end - - return results - - -def _patched_postprocess_pub( - self, # pylint: disable=unused-argument - result_memory: list[list[str]], - shots: int, - shape: tuple[int, ...], - meas_info: list[qiskit.primitives.backend_sampler_v2._MeasureInfo], - max_num_bytes: int, - circuit_metadata: dict, - meas_level: int | None = None, -) -> SamplerPubResult: - """Converts the memory data into an array of bit arrays with the shape of the pub.""" - if meas_level == 2 or meas_level is None: - arrays = { - item.creg_name: np.zeros(shape + (shots, item.num_bytes), dtype=np.uint8) - for item in meas_info - } - memory_array = qiskit.primitives.backend_sampler_v2._memory_array( - result_memory, max_num_bytes - ) - - for samples, index in zip(memory_array, np.ndindex(*shape)): - for item in meas_info: - ary = qiskit.primitives.backend_sampler_v2._samples_to_packed_array( - samples, item.num_bits, item.start - ) - arrays[item.creg_name][index] = ary - - meas = { - item.creg_name: BitArray(arrays[item.creg_name], item.num_bits) for item in meas_info - } - elif meas_level == 1: - raw = np.array(result_memory) - cplx = raw[..., 0] + 1j * raw[..., 1] - cplx = np.reshape(cplx, (*shape, *cplx.shape[1:])) - meas = {item.creg_name: cplx for item in meas_info} - else: - raise QiskitError(f"Unsupported meas_level: {meas_level}") - return SamplerPubResult( - DataBin(**meas, shape=shape), - metadata={"shots": shots, "circuit_metadata": circuit_metadata}, - ) - - -def patch_sampler_test_support(): - """Monkey-patching to pass metadata through to test backends and support level 1""" - warnings.filterwarnings("ignore", ".*Could not determine job completion time.*", UserWarning) - qiskit.primitives.backend_sampler_v2.Options = Options - QiskitRuntimeLocalService._run_backend_primitive_v2 = _patched_run_backend_primitive_v2 - BackendSamplerV2._run_pubs = _patched_run_pubs - BackendSamplerV2._postprocess_pub = _patched_postprocess_pub diff --git a/qiskit_experiments/test/pulse_backend.py b/qiskit_experiments/test/pulse_backend.py index 5d961b0601..c41d0d9014 100644 --- a/qiskit_experiments/test/pulse_backend.py +++ b/qiskit_experiments/test/pulse_backend.py @@ -90,11 +90,6 @@ def __init__( atol: Absolute tolerance during solving. rtol: Relative tolerance during solving. """ - # Temporary workaround for missing support in Qiskit and qiskit-ibm-runtime - from qiskit_experiments.test.patching import patch_sampler_test_support - - patch_sampler_test_support() - from qiskit_dynamics import Solver super().__init__( diff --git a/qiskit_experiments/test/t2hahn_backend.py b/qiskit_experiments/test/t2hahn_backend.py index b1af4957cc..78f7a78bae 100644 --- a/qiskit_experiments/test/t2hahn_backend.py +++ b/qiskit_experiments/test/t2hahn_backend.py @@ -103,12 +103,6 @@ def __init__( """ Initialize the T2Hahn backend """ - - # Temporary workaround for missing support in Qiskit and qiskit-ibm-runtime - from qiskit_experiments.test.patching import patch_sampler_test_support - - patch_sampler_test_support() - super().__init__( name="T2Hahn_simulator", backend_version="0", diff --git a/requirements-dev.txt b/requirements-dev.txt index 5e36df1621..46f1ac5471 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -12,7 +12,12 @@ testtools # Extra dependencies for tests/documentation code multimethod -qiskit-ibm-runtime>=0.19 +# qiskit-ibm-runtime 0.34 and qiskit 1.3 are needed to pass run options through +# qiskit_ibm_runtime.SamplerV2 to test backends' backend.run calls. +# Earlier versions work okay when using physical backends or not passing run +# options. +qiskit-ibm-runtime>=0.34 # see above +qiskit>=1.3 # see above # Documentation tools arxiv diff --git a/test/base.py b/test/base.py index 40b66bc3a5..aa958a3a95 100644 --- a/test/base.py +++ b/test/base.py @@ -106,11 +106,6 @@ def setUpClass(cls): """Set-up test class.""" super().setUpClass() - # Temporary workaround for missing support in Qiskit and qiskit-ibm-runtime - from qiskit_experiments.test.patching import patch_sampler_test_support - - patch_sampler_test_support() - # Tests should not generate any warnings unless testing those # warnings. In that case, the test should catch the warning # assertWarns or warnings.catch_warnings.