Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit d945d5e

Browse files
authored
Use POST /sessions endpoint (#817)
* Use POST /sessions * Update open_session, get params right * unit tests * Fix scheduler unit test
1 parent 2d3cfe1 commit d945d5e

File tree

7 files changed

+69
-33
lines changed

7 files changed

+69
-33
lines changed

qiskit_ibm_provider/api/clients/runtime.py

+19
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,25 @@ def update_tags(self, job_id: str, tags: list) -> Response:
315315
"""
316316
return self._api.program_job(job_id).update_tags(tags)
317317

318+
def create_session(
319+
self,
320+
backend: Optional[str] = None,
321+
instance: Optional[str] = None,
322+
max_time: Optional[int] = None,
323+
mode: Optional[str] = None,
324+
) -> Dict[str, Any]:
325+
"""Create a new runtime session.
326+
327+
Args:
328+
backend: The name of the backend to use.
329+
instance: The instance to use.
330+
mode: The mode to use.
331+
332+
Returns:
333+
The created session.
334+
"""
335+
return self._api.runtime_session().create(backend, instance, max_time, mode)
336+
318337
def close_session(self, session_id: str) -> None:
319338
"""Close session
320339

qiskit_ibm_provider/api/rest/runtime.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ def program_job(self, job_id: str) -> "ProgramJob":
5757
"""
5858
return ProgramJob(self.session, job_id)
5959

60-
def runtime_session(self, session_id: str) -> "RuntimeSession":
60+
def runtime_session(self, session_id: str = None) -> "RuntimeSession":
6161
"""Return an adapter for the session.
6262
6363
Args:

qiskit_ibm_provider/api/rest/runtime_session.py

+25-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
"""Runtime Session REST adapter."""
1414

15-
15+
from typing import Dict, Any, Optional
1616
from qiskit_ibm_provider.api.rest.base import RestAdapterBase
1717
from qiskit_ibm_provider.exceptions import IBMApiError
1818
from ..exceptions import RequestsApiError
@@ -37,7 +37,30 @@ def __init__(
3737
session_id: Job ID of the first job in a runtime session.
3838
url_prefix: Prefix to use in the URL.
3939
"""
40-
super().__init__(session, "{}/sessions/{}".format(url_prefix, session_id))
40+
if not session_id:
41+
super().__init__(session, "{}/sessions".format(url_prefix))
42+
else:
43+
super().__init__(session, "{}/sessions/{}".format(url_prefix, session_id))
44+
45+
def create(
46+
self,
47+
backend: Optional[str] = None,
48+
instance: Optional[str] = None,
49+
max_time: Optional[int] = None,
50+
mode: Optional[str] = None,
51+
) -> Dict[str, Any]:
52+
"""Create a session"""
53+
url = self.get_url("self")
54+
payload = {}
55+
if mode:
56+
payload["mode"] = mode
57+
if backend:
58+
payload["backend"] = backend
59+
if instance:
60+
payload["instance"] = instance
61+
if max_time:
62+
payload["max_session_ttl"] = max_time # type: ignore[assignment]
63+
return self.session.post(url, json=payload).json()
4164

4265
def close(self) -> None:
4366
"""Set accepting_jobs flag to false, so no more jobs can be submitted."""

qiskit_ibm_provider/ibm_backend.py

+13-18
Original file line numberDiff line numberDiff line change
@@ -511,18 +511,11 @@ def _runtime_run(
511511
"""Runs the runtime program and returns the corresponding job object"""
512512
hgp_name = self._instance or self.provider._get_hgp().name
513513

514-
session = self._session
515-
516-
if session:
517-
if not session.active:
518-
raise RuntimeError(f"The session {session.session_id} is closed.")
519-
session_id = session.session_id
520-
session_time = session._max_time
521-
start_session = session_id is None
522-
else:
523-
session_id = None
524-
session_time = None
525-
start_session = False
514+
session_id = None
515+
if self._session:
516+
if not self._session.active:
517+
raise RuntimeError(f"The session {self._session.session_id} is closed.")
518+
session_id = self._session.session_id
526519

527520
try:
528521
response = self.provider._runtime_client.program_run(
@@ -532,15 +525,11 @@ def _runtime_run(
532525
hgp=hgp_name,
533526
job_tags=job_tags,
534527
session_id=session_id,
535-
start_session=start_session,
536-
session_time=session_time,
528+
start_session=False,
537529
image=image,
538530
)
539531
except RequestsApiError as ex:
540532
raise IBMBackendApiError("Error submitting job: {}".format(str(ex))) from ex
541-
session_id = response.get("session_id")
542-
if self._session:
543-
self._session._session_id = session_id
544533
try:
545534
job = IBMCircuitJob(
546535
backend=self,
@@ -873,7 +862,13 @@ def _check_faulty(self, circuit: QuantumCircuit) -> None:
873862

874863
def open_session(self, max_time: Optional[Union[int, str]] = None) -> Session:
875864
"""Open session"""
876-
self._session = Session(max_time)
865+
if not self._configuration.simulator:
866+
new_session = self.provider._runtime_client.create_session(
867+
self.name, self._instance, max_time
868+
)
869+
self._session = Session(max_time=max_time, session_id=new_session.get("id"))
870+
else:
871+
self._session = Session()
877872
return self._session
878873

879874
@property

qiskit_ibm_provider/session.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ class Session:
6363
def __init__(
6464
self,
6565
max_time: Optional[Union[int, str]] = None,
66+
session_id: Optional[str] = None,
6667
):
6768
"""Session constructor.
6869
@@ -78,7 +79,7 @@ def __init__(
7879
ValueError: If an input value is invalid.
7980
"""
8081
self._instance = None
81-
self._session_id: Optional[str] = None
82+
self._session_id = session_id
8283
self._active = True
8384

8485
self._max_time = (

test/unit/mock/fake_account_client.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ class FakeApiBackend:
2929
def __init__(self, config_update=None, status_update=None):
3030
fake_backend = Fake5QV1()
3131
self.properties = fake_backend.properties().to_dict()
32-
self.defaults = fake_backend.defaults().to_dict()
32+
if hasattr(fake_backend, "defaults"):
33+
self.defaults = fake_backend.defaults().to_dict()
3334

3435
self.configuration = fake_backend.configuration().to_dict()
3536
self.configuration["online_date"] = python_datetime.now().isoformat()

test/unit/transpiler/passes/scheduling/test_scheduler.py

+7-10
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,7 @@
2020
from qiskit.transpiler.passmanager import PassManager
2121
from qiskit.transpiler.exceptions import TranspilerError
2222

23-
try:
24-
from qiskit.providers.fake_provider import Fake7QPulseV1
25-
except ImportError:
26-
from qiskit.providers.fake_provider import FakeJakarta as Fake7QPulseV1
23+
from qiskit_ibm_runtime.fake_provider import FakeJakarta
2724

2825
from qiskit_ibm_provider.transpiler.passes.scheduling.pad_delay import PadDelay
2926
from qiskit_ibm_provider.transpiler.passes.scheduling.scheduler import (
@@ -850,12 +847,12 @@ def test_c_if_plugin_conversion_with_transpile(self):
850847
after transpilation with the plugin."""
851848
# Patch the test backend with the plugin
852849
with patch.object(
853-
Fake7QPulseV1,
850+
FakeJakarta,
854851
"get_translation_stage_plugin",
855852
return_value="ibm_dynamic_circuits",
856853
create=True,
857854
):
858-
backend = Fake7QPulseV1()
855+
backend = FakeJakarta()
859856
# Temporary workaround for mock backends. For real backends this is not required.
860857
backend.configuration().basis_gates.append("if_else")
861858

@@ -1867,7 +1864,7 @@ def test_for_loop(self):
18671864

18681865
def test_transpile_mock_backend(self):
18691866
"""Test scheduling works with transpilation."""
1870-
backend = Fake7QPulseV1()
1867+
backend = FakeJakarta()
18711868
# Temporary workaround for mock backends. For real backends this is not required.
18721869
backend.configuration().basis_gates.append("if_else")
18731870
backend.configuration().basis_gates.append("while_loop")
@@ -1915,7 +1912,7 @@ def test_transpile_mock_backend(self):
19151912

19161913
def test_transpile_both_paths(self):
19171914
"""Test scheduling works with both fast- and standard path after transpiling."""
1918-
backend = Fake7QPulseV1()
1915+
backend = FakeJakarta()
19191916
# Temporary workaround for mock backends. For real backends this is not required.
19201917
backend.configuration().basis_gates.append("if_else")
19211918

@@ -1957,12 +1954,12 @@ def test_c_if_plugin_conversion_with_transpile(self):
19571954
transpilation with the plugin."""
19581955
# Patch the test backend with the plugin
19591956
with patch.object(
1960-
Fake7QPulseV1,
1957+
FakeJakarta,
19611958
"get_translation_stage_plugin",
19621959
return_value="ibm_dynamic_circuits",
19631960
create=True,
19641961
):
1965-
backend = Fake7QPulseV1()
1962+
backend = FakeJakarta()
19661963
# Temporary workaround for mock backends. For real backends this is not required.
19671964
backend.configuration().basis_gates.append("if_else")
19681965

0 commit comments

Comments
 (0)