Skip to content

Commit

Permalink
Update session.from_id() (#1163)
Browse files Browse the repository at this point in the history
* update session.from_id()

* add deprecation warning

* add reno
  • Loading branch information
kt474 authored Nov 17, 2023
1 parent 0fe20cd commit 8fa0472
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 14 deletions.
33 changes: 27 additions & 6 deletions qiskit_ibm_runtime/session.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
from .runtime_program import ParameterNamespace
from .program.result_decoder import ResultDecoder
from .ibm_backend import IBMBackend
from .exceptions import IBMInputValueError
from .utils.deprecation import deprecate_arguments
from .utils.default_session import set_cm_session


Expand Down Expand Up @@ -282,25 +284,44 @@ def service(self) -> QiskitRuntimeService:
def from_id(
cls,
session_id: str,
service: Optional[QiskitRuntimeService] = None,
service: QiskitRuntimeService,
backend: Optional[Union[str, IBMBackend]] = None,
) -> "Session":
"""Construct a Session object with a given session_id
Args:
session_id: the id of the session to be created. This can be an already
session_id: the id of the session to be created. This must be an already
existing session id.
service: instance of the ``QiskitRuntimeService`` class.
backend: instance of :class:`qiskit_ibm_runtime.IBMBackend` class or
string name of backend.
Raises:
IBMInputValueError: If given `session_id` does not exist. or the backend passed in does
not match the original session backend.
Returns:
A new Session with the given ``session_id``
"""
session = cls(service, backend)
session._session_id = session_id
return session

if backend:
deprecate_arguments("backend", "0.15.0", "Sessions do not support multiple backends.")
if isinstance(backend, IBMBackend):
backend = backend.name

response = service._api_client.session_details(session_id)
if response:
session_backend = response.get("backend_name")
if backend and backend != session_backend:
raise IBMInputValueError(
f"The session_id {session_id} was created with backend {session_backend}, "
f"but backend {backend} was given."
)
session = cls(service, session_backend)
session._session_id = session_id
return session

raise IBMInputValueError(f"The session_id {session_id} does not exist.")

def __enter__(self) -> "Session":
set_cm_session(self)
Expand Down
6 changes: 6 additions & 0 deletions releasenotes/notes/from-id-params-659a2adb727b9d18.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
fixes:
- |
The ``backend`` parameter in :meth:`~qiskit_ibm_runtime.Session.from_id` is being deprecated because
sessions do not support multiple backends. Additionally, the `service` parameter is no longer optional.
17 changes: 9 additions & 8 deletions test/integration/test_session.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
from qiskit.result import Result

from qiskit_ibm_runtime import Estimator, Session, Sampler, Options
from qiskit_ibm_runtime.exceptions import IBMInputValueError

from ..decorators import run_integration_test, quantum_only
from ..ibm_test_case import IBMIntegrationTestCase
Expand Down Expand Up @@ -90,16 +91,16 @@ def test_using_correct_instance(self, service):

@run_integration_test
def test_session_from_id(self, service):
"""Test creating a session from a given id"""
"""Test creating a session with from_id with simulator."""
backend = service.backend("ibmq_qasm_simulator")
with Session(service, backend=backend) as session:
sampler = Sampler(session=session)
job = sampler.run(ReferenceCircuits.bell(), shots=400)
session_id = job.session_id
new_session = Session.from_id(backend=backend, session_id=session_id)
sampler = Sampler(session=new_session)
session = Session(service=service, backend=backend)

sampler = Sampler(session=session)
job = sampler.run(ReferenceCircuits.bell(), shots=400)
self.assertEqual(session_id, job.session_id)
session_id = job.session_id

with self.assertRaises(IBMInputValueError):
_ = Session.from_id(session_id=session_id, service=service)


class TestBackendRunInSession(IBMIntegrationTestCase):
Expand Down

0 comments on commit 8fa0472

Please sign in to comment.