Fix Backend primitive classes for BackendV1 with no max_experiments (#9069)

* Fix Backend primitive classes for BackendV1 with no max_experiments

The ``max_experiments`` field in the BackendConfiguration for a BackendV1
backend is not a required field. While in practice most real backends
set it, some simulators (including aer) do not. This causes a failure
when using the Backend primitive classes with these backends as we were
previously assuming the ``max_experiments`` attribute was always
present.

* Update test/python/primitives/test_backend_estimator.py

Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
This commit is contained in:
Matthew Treinish 2022-11-03 16:59:52 -04:00 committed by GitHub
parent 75d66dd8ba
commit b2d3dcf53e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 33 additions and 1 deletions

View File

@ -56,7 +56,7 @@ def _run_circuits(
metadata.append(circ.metadata)
circ.metadata = {}
if isinstance(backend, BackendV1):
max_circuits = backend.configuration().max_experiments
max_circuits = getattr(backend.configuration(), "max_experiments", None)
elif isinstance(backend, BackendV2):
max_circuits = backend.max_circuits
if max_circuits:

View File

@ -0,0 +1,7 @@
---
fixes:
- |
Fixed an issue with the backend primitive classes :class:`~.BackendSampler`
and :class:`~.BackendEstimator` which prevented running with a
:class:`~.BackendV1` instance that does not have a ``max_experiments``
field set in its :class:`~.BackendConfiguration`.

View File

@ -297,6 +297,31 @@ class TestBackendEstimator(QiskitTestCase):
estimator.run([qc] * k, [op] * k, params_list).result()
self.assertEqual(run_mock.call_count, 10)
def test_no_max_circuits(self):
"""Test BackendEstimator works with BackendV1 and no max_experiments set."""
backend = FakeNairobi()
config = backend.configuration()
del config.max_experiments
backend._configuration = config
backend.set_options(seed_simulator=123)
qc = RealAmplitudes(num_qubits=2, reps=2)
op = SparsePauliOp.from_list([("IZ", 1), ("XI", 2), ("ZY", -1)])
k = 5
params_array = np.random.rand(k, qc.num_parameters)
params_list = params_array.tolist()
params_list_array = list(params_array)
estimator = BackendEstimator(backend=backend)
target = estimator.run([qc] * k, [op] * k, params_list).result()
with self.subTest("ndarrary"):
result = estimator.run([qc] * k, [op] * k, params_array).result()
self.assertEqual(len(result.metadata), k)
np.testing.assert_allclose(result.values, target.values, rtol=0.2, atol=0.2)
with self.subTest("list of ndarray"):
result = estimator.run([qc] * k, [op] * k, params_list_array).result()
self.assertEqual(len(result.metadata), k)
np.testing.assert_allclose(result.values, target.values, rtol=0.2, atol=0.2)
if __name__ == "__main__":
unittest.main()