From 1953fb08a8e52b0a69f29fe68f82cfc012713db5 Mon Sep 17 00:00:00 2001 From: Jessie Yu Date: Wed, 28 Feb 2024 08:54:07 -0500 Subject: [PATCH 01/10] support dynamic circuits --- qiskit_ibm_runtime/utils/utils.py | 14 ++++------ test/unit/test_ibm_primitives.py | 43 ++++++++++++++++++++++++++++++- 2 files changed, 47 insertions(+), 10 deletions(-) diff --git a/qiskit_ibm_runtime/utils/utils.py b/qiskit_ibm_runtime/utils/utils.py index 1edf11bfdf..a32738b9aa 100644 --- a/qiskit_ibm_runtime/utils/utils.py +++ b/qiskit_ibm_runtime/utils/utils.py @@ -17,7 +17,6 @@ import os import re import hashlib -import warnings from queue import Queue from threading import Condition from typing import List, Optional, Any, Dict, Union, Tuple, Sequence @@ -55,7 +54,7 @@ def is_isa_circuit(circuit: QuantumCircuit, target: Target) -> str: qargs = tuple(circuit.find_bit(x).index for x in instruction.qubits) if ( not target.instruction_supported(name, qargs) - and name != "barrier" + and name not in ["barrier", "if_else", "switch_case", "while_loop", "for_loop"] and not circuit.has_calibration_for(instruction) ): return ( @@ -74,17 +73,14 @@ def validate_isa_circuits(circuits: Sequence[QuantumCircuit], target: Target) -> for circuit in circuits: message = is_isa_circuit(circuit, target) if message: - warnings.warn( + raise IBMInputValueError( message - + " Circuits that do not match the target hardware definition will no longer be " - "supported after March 1, 2024. See the transpilation documentation " + + " Circuits that do not match the target hardware definition are no longer " + "supported after March 4, 2024. See the transpilation documentation " "(https://docs.quantum.ibm.com/transpile) for instructions to transform circuits and " "the primitive examples (https://docs.quantum.ibm.com/run/primitives-examples) to see " - "this coupled with operator transformations.", - DeprecationWarning, - stacklevel=6, + "this coupled with operator transformations." ) - break def validate_job_tags(job_tags: Optional[List[str]]) -> None: diff --git a/test/unit/test_ibm_primitives.py b/test/unit/test_ibm_primitives.py index d6530c2682..22af1d0acb 100644 --- a/test/unit/test_ibm_primitives.py +++ b/test/unit/test_ibm_primitives.py @@ -22,7 +22,7 @@ from ddt import data, ddt from qiskit import transpile, pulse -from qiskit.circuit import QuantumCircuit +from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister from qiskit.pulse.library import Gaussian from qiskit.quantum_info import SparsePauliOp from qiskit.providers.models.backendconfiguration import QasmBackendConfiguration @@ -917,6 +917,47 @@ def test_pulse_gates_is_isa(self, primitive): inst.run(**run_input) self.assertFalse(warns) + def test_dynamic_circuit_is_isa(self): + """Test passing dynmaic circuits is considered ISA.""" + # pylint: disable=not-context-manager + + backend = get_mocked_backend() + sampler = Sampler(backend=backend) + + qubits = QuantumRegister(3) + clbits = ClassicalRegister(3) + circuit = QuantumCircuit(qubits, clbits) + (q0, q1, q2) = qubits + (c0, c1, c2) = clbits + + circuit.x(q0) + circuit.measure(q0, c0) + with circuit.if_test((c0, 1)): + circuit.x(q0) + + circuit.measure(q1, c1) + with circuit.switch(c1) as case: + with case(0): + circuit.x(q0) + with case(1): + circuit.x(q1) + + circuit.measure(q1, c1) + circuit.measure(q2, c2) + with circuit.while_loop((clbits, 0b111)): + circuit.rz(1.5, q1) + circuit.rz(1.5, q2) + circuit.measure(q1, c1) + circuit.measure(q2, c2) + + with circuit.for_loop(range(2)) as _: + circuit.x(q0) + + with warnings.catch_warnings(record=True) as warns: + warnings.simplefilter("always") + sampler.run(circuits=circuit) + self.assertFalse(warns) + def _update_dict(self, dict1, dict2): for key, val in dict1.items(): if isinstance(val, dict): From f018677813da35bc76b4fc8a3e94830b527d0254 Mon Sep 17 00:00:00 2001 From: Jessie Yu Date: Wed, 28 Feb 2024 09:34:36 -0500 Subject: [PATCH 02/10] raise for abstract circuits --- qiskit_ibm_runtime/base_primitive.py | 1 + qiskit_ibm_runtime/utils/utils.py | 11 ++++------ ...isa-circuit-required-ed361bd65cef5ed8.yaml | 10 ++++++++++ test/unit/test_ibm_primitives.py | 20 ++++++++++++++++++- 4 files changed, 34 insertions(+), 8 deletions(-) create mode 100644 releasenotes/notes/isa-circuit-required-ed361bd65cef5ed8.yaml diff --git a/qiskit_ibm_runtime/base_primitive.py b/qiskit_ibm_runtime/base_primitive.py index 2b5090b2f2..8f18c58683 100644 --- a/qiskit_ibm_runtime/base_primitive.py +++ b/qiskit_ibm_runtime/base_primitive.py @@ -150,6 +150,7 @@ def _run_primitive(self, primitive_inputs: Dict, user_kwargs: Dict) -> RuntimeJo and isinstance(self._backend, IBMBackend) and isinstance(self._backend.service, QiskitRuntimeService) and hasattr(self._backend, "target") + and self._service._channel_strategy != 'q-ctrl' ): validate_isa_circuits(primitive_inputs["circuits"], self._backend.target) diff --git a/qiskit_ibm_runtime/utils/utils.py b/qiskit_ibm_runtime/utils/utils.py index 1edf11bfdf..139e5e1a7c 100644 --- a/qiskit_ibm_runtime/utils/utils.py +++ b/qiskit_ibm_runtime/utils/utils.py @@ -74,17 +74,14 @@ def validate_isa_circuits(circuits: Sequence[QuantumCircuit], target: Target) -> for circuit in circuits: message = is_isa_circuit(circuit, target) if message: - warnings.warn( + raise IBMInputValueError( message - + " Circuits that do not match the target hardware definition will no longer be " - "supported after March 1, 2024. See the transpilation documentation " + + " Circuits that do not match the target hardware definition are no longer " + "supported after 4 March 2024. See the transpilation documentation " "(https://docs.quantum.ibm.com/transpile) for instructions to transform circuits and " "the primitive examples (https://docs.quantum.ibm.com/run/primitives-examples) to see " - "this coupled with operator transformations.", - DeprecationWarning, - stacklevel=6, + "this coupled with operator transformations." ) - break def validate_job_tags(job_tags: Optional[List[str]]) -> None: diff --git a/releasenotes/notes/isa-circuit-required-ed361bd65cef5ed8.yaml b/releasenotes/notes/isa-circuit-required-ed361bd65cef5ed8.yaml new file mode 100644 index 0000000000..64301c5577 --- /dev/null +++ b/releasenotes/notes/isa-circuit-required-ed361bd65cef5ed8.yaml @@ -0,0 +1,10 @@ +--- +upgrade: + - | + Circuits that do not match the target hardware definition are no longer + supported by Qiskit Runtime primitives, unless ``channel_strategy="q-ctrl"`` + is used. See the transpilation documentation + (https://docs.quantum.ibm.com/transpile) for instructions to transform + circuits and the primitive examples + (https://docs.quantum.ibm.com/run/primitives-examples) to see + this coupled with operator transformations. diff --git a/test/unit/test_ibm_primitives.py b/test/unit/test_ibm_primitives.py index d6530c2682..04ff0a4d0e 100644 --- a/test/unit/test_ibm_primitives.py +++ b/test/unit/test_ibm_primitives.py @@ -36,6 +36,7 @@ ) from qiskit_ibm_runtime.ibm_backend import IBMBackend from qiskit_ibm_runtime.utils.default_session import _DEFAULT_SESSION +from qiskit_ibm_runtime.exceptions import IBMInputValueError from ..ibm_test_case import IBMTestCase from ..utils import ( @@ -866,7 +867,7 @@ def test_abstract_circuits(self, primitive): else: circ.measure_all() - with self.assertWarnsRegex(DeprecationWarning, "target hardware"): + with self.assertRaisesRegex(IBMInputValueError, "target hardware"): inst.run(**run_input) @data(Sampler, Estimator) @@ -995,3 +996,20 @@ def test_qctrl_unsupported_values_for_options(self): _ = inst.run(self.qx, observables=self.obs, **bad_opt) self.assertIn(expected_message, str(exc.exception)) + + @data(Sampler, Estimator) + def test_qctrl_abstract_circuit(self, primitive): + """Test q-ctrl can still accept abstract circuits.""" + backend = get_mocked_backend() + backend._service._channel_strategy = "q-ctrl" + inst = primitive(backend=backend) + + circ = QuantumCircuit(3, 3) + circ.cx(0, 2) + run_input = {"circuits": circ} + if isinstance(inst, Estimator): + run_input["observables"] = SparsePauliOp("ZZZ") + else: + circ.measure_all() + + inst.run(**run_input) From 4e394afd831097548bf251135678c6e02bb36748 Mon Sep 17 00:00:00 2001 From: Jessie Yu Date: Wed, 28 Feb 2024 09:45:00 -0500 Subject: [PATCH 03/10] lint --- qiskit_ibm_runtime/base_primitive.py | 2 +- qiskit_ibm_runtime/utils/utils.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/qiskit_ibm_runtime/base_primitive.py b/qiskit_ibm_runtime/base_primitive.py index 8f18c58683..798b67cf8b 100644 --- a/qiskit_ibm_runtime/base_primitive.py +++ b/qiskit_ibm_runtime/base_primitive.py @@ -150,7 +150,7 @@ def _run_primitive(self, primitive_inputs: Dict, user_kwargs: Dict) -> RuntimeJo and isinstance(self._backend, IBMBackend) and isinstance(self._backend.service, QiskitRuntimeService) and hasattr(self._backend, "target") - and self._service._channel_strategy != 'q-ctrl' + and self._service._channel_strategy != "q-ctrl" ): validate_isa_circuits(primitive_inputs["circuits"], self._backend.target) diff --git a/qiskit_ibm_runtime/utils/utils.py b/qiskit_ibm_runtime/utils/utils.py index 139e5e1a7c..ffbcb2044d 100644 --- a/qiskit_ibm_runtime/utils/utils.py +++ b/qiskit_ibm_runtime/utils/utils.py @@ -17,7 +17,6 @@ import os import re import hashlib -import warnings from queue import Queue from threading import Condition from typing import List, Optional, Any, Dict, Union, Tuple, Sequence From 554fd1264359debbef0a220d12442454aa26b1b9 Mon Sep 17 00:00:00 2001 From: Jessie Yu Date: Wed, 28 Feb 2024 18:12:16 -0500 Subject: [PATCH 04/10] fix test --- test/unit/test_sampler.py | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/test/unit/test_sampler.py b/test/unit/test_sampler.py index 9bb5e9c444..10c138ebf8 100644 --- a/test/unit/test_sampler.py +++ b/test/unit/test_sampler.py @@ -12,11 +12,12 @@ """Tests for sampler class.""" -from qiskit_ibm_runtime import Sampler, Session +from qiskit import transpile + +from qiskit_ibm_runtime import Sampler from ..ibm_test_case import IBMTestCase -from ..utils import bell -from .mock.fake_runtime_service import FakeRuntimeService +from ..utils import bell, get_mocked_backend class TestSampler(IBMTestCase): @@ -28,14 +29,11 @@ def test_unsupported_values_for_sampler_options(self): {"resilience_level": 2, "optimization_level": 3}, {"optimization_level": 4, "resilience_level": 1}, ] + backend = get_mocked_backend() + circuit = transpile(bell(), backend=backend) - with Session( - service=FakeRuntimeService(channel="ibm_quantum", token="abc"), - backend="common_backend", - ) as session: - circuit = bell() - for bad_opt in options_bad: - inst = Sampler(session=session) - with self.assertRaises(ValueError) as exc: - _ = inst.run(circuit, **bad_opt) - self.assertIn(list(bad_opt.keys())[0], str(exc.exception)) + for bad_opt in options_bad: + sampler = Sampler(backend=backend) + with self.assertRaises(ValueError) as exc: + _ = sampler.run(circuit, **bad_opt) + self.assertIn(list(bad_opt.keys())[0], str(exc.exception)) From 32d4022762c209dd3b665495252fddb21510068f Mon Sep 17 00:00:00 2001 From: Jessie Yu Date: Thu, 29 Feb 2024 11:25:50 -0500 Subject: [PATCH 05/10] remove hard coded instructions --- qiskit_ibm_runtime/utils/utils.py | 2 +- test/unit/test_ibm_primitives.py | 50 +++++++++++++++++++------------ 2 files changed, 32 insertions(+), 20 deletions(-) diff --git a/qiskit_ibm_runtime/utils/utils.py b/qiskit_ibm_runtime/utils/utils.py index a32738b9aa..7f60c6970f 100644 --- a/qiskit_ibm_runtime/utils/utils.py +++ b/qiskit_ibm_runtime/utils/utils.py @@ -54,7 +54,7 @@ def is_isa_circuit(circuit: QuantumCircuit, target: Target) -> str: qargs = tuple(circuit.find_bit(x).index for x in instruction.qubits) if ( not target.instruction_supported(name, qargs) - and name not in ["barrier", "if_else", "switch_case", "while_loop", "for_loop"] + and name != "barrier" and not circuit.has_calibration_for(instruction) ): return ( diff --git a/test/unit/test_ibm_primitives.py b/test/unit/test_ibm_primitives.py index 22af1d0acb..c7dd9f2996 100644 --- a/test/unit/test_ibm_primitives.py +++ b/test/unit/test_ibm_primitives.py @@ -920,8 +920,18 @@ def test_pulse_gates_is_isa(self, primitive): def test_dynamic_circuit_is_isa(self): """Test passing dynmaic circuits is considered ISA.""" # pylint: disable=not-context-manager - - backend = get_mocked_backend() + + from qiskit_ibm_runtime import QiskitRuntimeService + service = QiskitRuntimeService(channel="ibm_quantum") + real = service.backend("ibm_sherbrooke") + + from qiskit_ibm_runtime.fake_provider import FakeSherbrooke + fake = FakeSherbrooke() + # manila = FakeManila() + # manila.configuration().basis_gates.append("if_else") + backend = get_mocked_backend(configuration=real.configuration()) + # backend = FakeManila() + # backend.configuration().basis_gates.append("if_else") sampler = Sampler(backend=backend) qubits = QuantumRegister(3) @@ -935,23 +945,25 @@ def test_dynamic_circuit_is_isa(self): with circuit.if_test((c0, 1)): circuit.x(q0) - circuit.measure(q1, c1) - with circuit.switch(c1) as case: - with case(0): - circuit.x(q0) - with case(1): - circuit.x(q1) - - circuit.measure(q1, c1) - circuit.measure(q2, c2) - with circuit.while_loop((clbits, 0b111)): - circuit.rz(1.5, q1) - circuit.rz(1.5, q2) - circuit.measure(q1, c1) - circuit.measure(q2, c2) - - with circuit.for_loop(range(2)) as _: - circuit.x(q0) + # circuit.measure(q1, c1) + # with circuit.switch(c1) as case: + # with case(0): + # circuit.x(q0) + # with case(1): + # circuit.x(q1) + + # circuit.measure(q1, c1) + # circuit.measure(q2, c2) + # with circuit.while_loop((clbits, 0b111)): + # circuit.rz(1.5, q1) + # circuit.rz(1.5, q2) + # circuit.measure(q1, c1) + # circuit.measure(q2, c2) + + # with circuit.for_loop(range(2)) as _: + # circuit.x(q0) + + circuit = transpile(circuit, backend=real) with warnings.catch_warnings(record=True) as warns: warnings.simplefilter("always") From 365d7f2e640689fb415be661beb5048bc6610782 Mon Sep 17 00:00:00 2001 From: Jessie Yu Date: Thu, 29 Feb 2024 11:27:04 -0500 Subject: [PATCH 06/10] check target is not none --- qiskit_ibm_runtime/base_primitive.py | 1 + 1 file changed, 1 insertion(+) diff --git a/qiskit_ibm_runtime/base_primitive.py b/qiskit_ibm_runtime/base_primitive.py index 798b67cf8b..bd29af0f28 100644 --- a/qiskit_ibm_runtime/base_primitive.py +++ b/qiskit_ibm_runtime/base_primitive.py @@ -150,6 +150,7 @@ def _run_primitive(self, primitive_inputs: Dict, user_kwargs: Dict) -> RuntimeJo and isinstance(self._backend, IBMBackend) and isinstance(self._backend.service, QiskitRuntimeService) and hasattr(self._backend, "target") + and self._backend.target and self._service._channel_strategy != "q-ctrl" ): validate_isa_circuits(primitive_inputs["circuits"], self._backend.target) From c578d3164c2dfdadb032ea6a64d0e226242cce48 Mon Sep 17 00:00:00 2001 From: Jessie Yu Date: Thu, 29 Feb 2024 11:41:15 -0500 Subject: [PATCH 07/10] lint --- qiskit_ibm_runtime/base_primitive.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/qiskit_ibm_runtime/base_primitive.py b/qiskit_ibm_runtime/base_primitive.py index bd29af0f28..e457a11f24 100644 --- a/qiskit_ibm_runtime/base_primitive.py +++ b/qiskit_ibm_runtime/base_primitive.py @@ -149,8 +149,7 @@ def _run_primitive(self, primitive_inputs: Dict, user_kwargs: Dict) -> RuntimeJo self._backend and isinstance(self._backend, IBMBackend) and isinstance(self._backend.service, QiskitRuntimeService) - and hasattr(self._backend, "target") - and self._backend.target + and getattr(self._backend, "target", None) and self._service._channel_strategy != "q-ctrl" ): validate_isa_circuits(primitive_inputs["circuits"], self._backend.target) From 4de089037113be2bf31609448678f168ccc1b8f5 Mon Sep 17 00:00:00 2001 From: Jessie Yu Date: Fri, 1 Mar 2024 11:16:07 -0500 Subject: [PATCH 08/10] fix test --- test/unit/test_ibm_primitives.py | 63 +++++++++++++++----------------- test/utils.py | 25 ++++++++----- 2 files changed, 46 insertions(+), 42 deletions(-) diff --git a/test/unit/test_ibm_primitives.py b/test/unit/test_ibm_primitives.py index c7dd9f2996..90b8feda26 100644 --- a/test/unit/test_ibm_primitives.py +++ b/test/unit/test_ibm_primitives.py @@ -25,9 +25,8 @@ from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister from qiskit.pulse.library import Gaussian from qiskit.quantum_info import SparsePauliOp -from qiskit.providers.models.backendconfiguration import QasmBackendConfiguration -from qiskit_ibm_runtime.fake_provider import FakeManila +from qiskit_ibm_runtime.fake_provider import FakeManila, FakeSherbrooke from qiskit_ibm_runtime import ( Sampler, Estimator, @@ -876,7 +875,6 @@ def test_abstract_circuits_backend_no_coupling_map(self, primitive): config = FakeManila().configuration().to_dict() for gate in config["gates"]: gate.pop("coupling_map", None) - config = QasmBackendConfiguration.from_dict(config) backend = get_mocked_backend(configuration=config) inst = primitive(backend=backend) @@ -920,18 +918,17 @@ def test_pulse_gates_is_isa(self, primitive): def test_dynamic_circuit_is_isa(self): """Test passing dynmaic circuits is considered ISA.""" # pylint: disable=not-context-manager + # pylint: disable=invalid-name + sherbrooke = FakeSherbrooke() + config = sherbrooke._get_conf_dict_from_json() + config["supported_instructions"] += ["for_loop", "switch_case", "while_loop"] + + backend = get_mocked_backend( + configuration=config, + properties=sherbrooke._set_props_dict_from_json(), + defaults=sherbrooke._set_defs_dict_from_json(), + ) - from qiskit_ibm_runtime import QiskitRuntimeService - service = QiskitRuntimeService(channel="ibm_quantum") - real = service.backend("ibm_sherbrooke") - - from qiskit_ibm_runtime.fake_provider import FakeSherbrooke - fake = FakeSherbrooke() - # manila = FakeManila() - # manila.configuration().basis_gates.append("if_else") - backend = get_mocked_backend(configuration=real.configuration()) - # backend = FakeManila() - # backend.configuration().basis_gates.append("if_else") sampler = Sampler(backend=backend) qubits = QuantumRegister(3) @@ -945,25 +942,25 @@ def test_dynamic_circuit_is_isa(self): with circuit.if_test((c0, 1)): circuit.x(q0) - # circuit.measure(q1, c1) - # with circuit.switch(c1) as case: - # with case(0): - # circuit.x(q0) - # with case(1): - # circuit.x(q1) - - # circuit.measure(q1, c1) - # circuit.measure(q2, c2) - # with circuit.while_loop((clbits, 0b111)): - # circuit.rz(1.5, q1) - # circuit.rz(1.5, q2) - # circuit.measure(q1, c1) - # circuit.measure(q2, c2) - - # with circuit.for_loop(range(2)) as _: - # circuit.x(q0) - - circuit = transpile(circuit, backend=real) + circuit.measure(q1, c1) + with circuit.switch(c1) as case: + with case(0): + circuit.x(q0) + with case(1): + circuit.x(q1) + + circuit.measure(q1, c1) + circuit.measure(q2, c2) + with circuit.while_loop((clbits, 0b111)): + circuit.rz(1.5, q1) + circuit.rz(1.5, q2) + circuit.measure(q1, c1) + circuit.measure(q2, c2) + + with circuit.for_loop(range(2)) as _: + circuit.x(q0) + + circuit = transpile(circuit, backend=backend) with warnings.catch_warnings(record=True) as warns: warnings.simplefilter("always") diff --git a/test/utils.py b/test/utils.py index 041e6765cc..b83b8be0e6 100644 --- a/test/utils.py +++ b/test/utils.py @@ -25,7 +25,11 @@ from qiskit.qobj import QasmQobj from qiskit.providers.jobstatus import JOB_FINAL_STATES, JobStatus from qiskit.providers.exceptions import QiskitBackendNotFoundError -from qiskit.providers.models import BackendStatus, BackendProperties, BackendConfiguration +from qiskit.providers.models import ( + BackendStatus, + BackendProperties, + BackendConfiguration, +) from qiskit.providers.backend import Backend from qiskit_ibm_runtime.hub_group_project import HubGroupProject @@ -277,22 +281,25 @@ def create_faulty_backend( def get_mocked_backend( - name: str = "ibm_gotham", configuration: Optional[BackendConfiguration] = None + name: str = "ibm_gotham", + configuration: Optional[Dict] = None, + properties: Optional[Dict] = None, + defaults: Optional[Dict] = None, ) -> IBMBackend: """Return a mock backend.""" - def _noop(*args, **kwargs): # pylint: disable=unused-argument - return None - mock_service = mock.MagicMock(spec=QiskitRuntimeService) mock_service._channel_strategy = None mock_api_client = mock.MagicMock() - if not configuration: - configuration = FakeManila().configuration() + configuration = ( + FakeManila().configuration() + if configuration is None + else BackendConfiguration.from_dict(configuration) + ) - mock_api_client.backend_properties = _noop - mock_api_client.backend_pulse_defaults = _noop + mock_api_client.backend_properties = lambda *args, **kwargs: properties + mock_api_client.backend_pulse_defaults = lambda *args, **kwargs: defaults mock_backend = IBMBackend( configuration=configuration, service=mock_service, api_client=mock_api_client ) From a7354111087915b1ca71c42591233bf4fc6636cc Mon Sep 17 00:00:00 2001 From: Jessie Yu Date: Fri, 1 Mar 2024 11:33:02 -0500 Subject: [PATCH 09/10] check for error not warning --- test/unit/test_ibm_primitives.py | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/test/unit/test_ibm_primitives.py b/test/unit/test_ibm_primitives.py index 83873cc93e..66cef03b6e 100644 --- a/test/unit/test_ibm_primitives.py +++ b/test/unit/test_ibm_primitives.py @@ -18,7 +18,6 @@ from unittest.mock import MagicMock, patch from dataclasses import asdict from typing import Dict -import warnings from ddt import data, ddt from qiskit import transpile, pulse @@ -888,10 +887,7 @@ def test_abstract_circuits_backend_no_coupling_map(self, primitive): else: transpiled.measure_all() - with warnings.catch_warnings(record=True) as warns: - warnings.simplefilter("always") - inst.run(**run_input) - self.assertFalse(warns) + inst.run(**run_input) @data(Sampler, Estimator) def test_pulse_gates_is_isa(self, primitive): @@ -911,12 +907,10 @@ def test_pulse_gates_is_isa(self, primitive): else: circuit.measure_all() - with warnings.catch_warnings(record=True) as warns: - warnings.simplefilter("always") - inst.run(**run_input) - self.assertFalse(warns) + inst.run(**run_input) - def test_dynamic_circuit_is_isa(self): + @data(Sampler, Estimator) + def test_dynamic_circuit_is_isa(self, primitive): """Test passing dynmaic circuits is considered ISA.""" # pylint: disable=not-context-manager # pylint: disable=invalid-name @@ -930,7 +924,7 @@ def test_dynamic_circuit_is_isa(self): defaults=sherbrooke._set_defs_dict_from_json(), ) - sampler = Sampler(backend=backend) + inst = primitive(backend=backend) qubits = QuantumRegister(3) clbits = ClassicalRegister(3) @@ -962,11 +956,11 @@ def test_dynamic_circuit_is_isa(self): circuit.x(q0) circuit = transpile(circuit, backend=backend) + run_input = {"circuits": circuit} + if isinstance(inst, Estimator): + run_input["observables"] = SparsePauliOp("ZZZ").apply_layout(circuit.layout) - with warnings.catch_warnings(record=True) as warns: - warnings.simplefilter("always") - sampler.run(circuits=circuit) - self.assertFalse(warns) + inst.run(**run_input) def _update_dict(self, dict1, dict2): for key, val in dict1.items(): From 49f64ce9a8ffaf0ae3d7e0898375010c650e2394 Mon Sep 17 00:00:00 2001 From: Jessie Yu Date: Mon, 4 Mar 2024 10:47:14 -0500 Subject: [PATCH 10/10] bypass simulator --- qiskit_ibm_runtime/base_primitive.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/qiskit_ibm_runtime/base_primitive.py b/qiskit_ibm_runtime/base_primitive.py index e457a11f24..0c91c0c700 100644 --- a/qiskit_ibm_runtime/base_primitive.py +++ b/qiskit_ibm_runtime/base_primitive.py @@ -146,9 +146,10 @@ def _run_primitive(self, primitive_inputs: Dict, user_kwargs: Dict) -> RuntimeJo Submitted job. """ if ( - self._backend + self._backend # pylint: disable=too-many-boolean-expressions and isinstance(self._backend, IBMBackend) and isinstance(self._backend.service, QiskitRuntimeService) + and not self._backend.simulator and getattr(self._backend, "target", None) and self._service._channel_strategy != "q-ctrl" ):