diff --git a/qiskit_ibm_runtime/base_primitive.py b/qiskit_ibm_runtime/base_primitive.py index f9fc3ff9c..d7bc6ad20 100644 --- a/qiskit_ibm_runtime/base_primitive.py +++ b/qiskit_ibm_runtime/base_primitive.py @@ -86,19 +86,10 @@ def _get_mode_service_backend(mode: Optional[Union[BackendV2, Session, Batch]] = raise ValueError("mode must be of type Backend, Session, Batch or None") elif get_cm_session(): mode = get_cm_session() - service = mode.service # type: ignore - try: - backend = service.backend( - name=mode.backend(), # type: ignore - instance=mode._instance, # type: ignore - use_fractional_gates=mode._backend.options.use_fractional_gates, # type: ignore - ) - except (AttributeError, TypeError): - backend = service.backend( - name=mode.backend(), # type: ignore - instance=mode._instance, # type: ignore - ) - return mode, service, backend # type: ignore + service = mode.service + backend = mode._backend + + return mode, service, backend else: raise ValueError("A backend or session must be specified.") diff --git a/release-notes/unreleased/2282.bug.rst b/release-notes/unreleased/2282.bug.rst new file mode 100644 index 000000000..4c04bdd46 --- /dev/null +++ b/release-notes/unreleased/2282.bug.rst @@ -0,0 +1,6 @@ +Fixed a bug in :class:`.BasePrimitive` where primitives instantiated inside a :class:`~.Session` or :class:`~.Batch` context manager without the ``mode`` +parameter would fetch the backend from the service (by name) instead of using the backend passed to the :class:`~.Session` or :class:`~.Batch`. +This could cause issues when the :class:`~.Session`/:class:`~.Batch` +backend was modified by users (for example, by removing a gate), because the primitives +would instead fetch the unmodified backend object from the service. After the fix, the +:class:`~.Session`/:class:`~.Batch` backend object is used directly. diff --git a/test/integration/test_session.py b/test/integration/test_session.py index 36becd08b..782ce43ac 100644 --- a/test/integration/test_session.py +++ b/test/integration/test_session.py @@ -17,6 +17,7 @@ from qiskit.circuit.library import RealAmplitudes from qiskit.quantum_info import SparsePauliOp +from qiskit.circuit import IfElseOp from qiskit.primitives import PrimitiveResult from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager @@ -98,3 +99,21 @@ def test_session_from_id_no_backend(self, service): if session.details().get("backend_name") == "": with self.assertRaises(IBMRuntimeError): Session.from_id(session_id=session._session_id, service=service) + + @run_integration_test + def test_session_backend(self, service): + """Test session backend is the correct backend.""" + backend = service.backend(self.dependencies.qpu) + + pm = generate_preset_pass_manager(optimization_level=1, target=backend.target) + instruction_name = "test_name" + backend.target.add_instruction(IfElseOp, name=instruction_name) + + with Session(backend=backend) as session: + sampler = SamplerV2(mode=session) + job = sampler.run([pm.run(bell())]) + self.assertIn(instruction_name, job.backend().target.operation_names) + + sampler2 = SamplerV2() + job2 = sampler2.run([pm.run(bell())]) + self.assertIn(instruction_name, job2.backend().target.operation_names)