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.