Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update session.from_id() #1163

Merged
merged 8 commits into from
Nov 17, 2023
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 27 additions & 6 deletions qiskit_ibm_runtime/session.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,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


def _active_session(func): # type: ignore
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
17 changes: 9 additions & 8 deletions test/integration/test_session.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,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 @@ -88,16 +89,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
Loading