Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
2f024bd
retrieve interim results
kt474 Oct 18, 2021
464192f
Remove version field from runtime program (#152)
rathishcholarajan Oct 18, 2021
abb98d0
Rename isPublic to is_public when creating or reading runtime program…
rathishcholarajan Oct 18, 2021
31fdd4b
Update programId to program_id when running program (#139)
renier Oct 18, 2021
0d5ebf8
Add support to view program update date (#160)
rathishcholarajan Oct 18, 2021
f187cbf
add reno
kt474 Oct 19, 2021
767afeb
Upload runtime program using 'data' field (#157)
rathishcholarajan Oct 19, 2021
24dfa95
Read programs from "programs" array in response (#161)
rathishcholarajan Oct 19, 2021
6b9db0d
add test case
kt474 Oct 19, 2021
c1587d0
Update qiskit_ibm/api/clients/runtime.py
kt474 Oct 19, 2021
b690574
Update qiskit_ibm/runtime/runtime_job.py
kt474 Oct 19, 2021
9011435
interim_result -> interim_results
kt474 Oct 19, 2021
16e6373
update interim_results method & cleanup
kt474 Oct 19, 2021
79cd9bd
Remove version field from runtime program (#152)
rathishcholarajan Oct 18, 2021
45ab0b2
Rename isPublic to is_public when creating or reading runtime program…
rathishcholarajan Oct 18, 2021
faff4e2
Update programId to program_id when running program (#139)
renier Oct 18, 2021
bcc27fb
Add support to view program update date (#160)
rathishcholarajan Oct 18, 2021
866d045
Upload runtime program using 'data' field (#157)
rathishcholarajan Oct 19, 2021
eda2a51
Read programs from "programs" array in response (#161)
rathishcholarajan Oct 19, 2021
ab33b52
Pass program as base64 string to update (#168)
rathishcholarajan Oct 21, 2021
a8fe605
Accept JSON schema as program metadata (#158)
rathishcholarajan Oct 25, 2021
1b26e0b
Merge branch 'runtime-release-q4' of https://github.com/Qiskit-Partne…
kt474 Oct 26, 2021
df4eb81
Pass program params as object (#171)
rathishcholarajan Oct 27, 2021
e3e4315
Fix integration tests
rathishcholarajan Oct 27, 2021
f5712bc
Merge branch 'runtime-release-q4' of https://github.com/Qiskit-Partne…
kt474 Oct 28, 2021
439c175
Merge branch 'runtime-release-q4' into interim-results-endpoint
kt474 Oct 28, 2021
0f95825
Use count to reduce one last extra call to API (#172)
rathishcholarajan Oct 28, 2021
042143c
fix lint
kt474 Oct 28, 2021
8436833
add logic to retrieve from cache
kt474 Oct 28, 2021
b532b14
Allow updating runtime metadata in place (#188)
jyu00 Oct 29, 2021
a0537ad
refactor
kt474 Oct 29, 2021
7f77799
Update qiskit_ibm/runtime/runtime_job.py
kt474 Nov 1, 2021
c1065f0
Merge branch 'runtime-release-q4' of https://github.com/Qiskit-Partne…
kt474 Nov 1, 2021
c61ebc7
add test case
kt474 Nov 1, 2021
88b8a25
Merge branch 'runtime-release-q4' into interim-results-endpoint
kt474 Nov 1, 2021
f5b4e54
Remove version field from runtime program (#152)
rathishcholarajan Oct 18, 2021
93a2b85
Rename isPublic to is_public when creating or reading runtime program…
rathishcholarajan Oct 18, 2021
966d42a
Update programId to program_id when running program (#139)
renier Oct 18, 2021
031fc25
Add support to view program update date (#160)
rathishcholarajan Oct 18, 2021
1561a9b
Upload runtime program using 'data' field (#157)
rathishcholarajan Oct 19, 2021
b656ece
Read programs from "programs" array in response (#161)
rathishcholarajan Oct 19, 2021
8fb3669
Pass program as base64 string to update (#168)
rathishcholarajan Oct 21, 2021
74472c5
Accept JSON schema as program metadata (#158)
rathishcholarajan Oct 25, 2021
ee76158
Pass program params as object (#171)
rathishcholarajan Oct 27, 2021
da52271
Fix integration tests
rathishcholarajan Oct 27, 2021
f3033b8
Use count to reduce one last extra call to API (#172)
rathishcholarajan Oct 28, 2021
aea236b
Allow updating runtime metadata in place (#188)
jyu00 Oct 29, 2021
e71b402
Merge branch 'runtime-release-q4' of https://github.com/Qiskit-Partne…
kt474 Nov 2, 2021
4102480
Allow filtering runtime jobs by program ID (#193)
rathishcholarajan Nov 4, 2021
8e8bcb3
Allow runtime program authors to retrieve program data (#174)
kt474 Nov 4, 2021
07f0d53
Update cache after updating program (#196)
rathishcholarajan Nov 5, 2021
8133076
Allow filtering runtime jobs by provider (#197)
kt474 Nov 8, 2021
4522d9b
Support pagination for retrieving runtime programs (#170)
kt474 Nov 8, 2021
0a9721a
Merge branch 'runtime-release-q4' into interim-results-endpoint
kt474 Nov 8, 2021
87fa2b9
Merge branch 'main' into interim-results-endpoint
rathishcholarajan Nov 9, 2021
0e63479
Merge branch 'main' into interim-results-endpoint
kt474 Nov 12, 2021
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
11 changes: 11 additions & 0 deletions qiskit_ibm/api/clients/runtime.py
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,17 @@ def job_results(self, job_id: str) -> str:
"""
return self.api.program_job(job_id).results()

def job_interim_results(self, job_id: str) -> str:
"""Get the interim results of a program job.

Args:
job_id: Program job ID.

Returns:
Job interim results.
"""
return self.api.program_job(job_id).interim_results()

def job_cancel(self, job_id: str) -> None:
"""Cancel a job.

Expand Down
12 changes: 11 additions & 1 deletion qiskit_ibm/api/rest/runtime.py
Original file line number Diff line number Diff line change
Expand Up @@ -285,7 +285,8 @@ class ProgramJob(RestAdapterBase):
'self': '',
'results': '/results',
'cancel': '/cancel',
'logs': '/logs'
'logs': '/logs',
'interim_results': '/interim_results',
}

def __init__(
Expand Down Expand Up @@ -316,6 +317,15 @@ def delete(self) -> None:
"""Delete program job."""
self.session.delete(self.get_url('self'))

def interim_results(self) -> str:
"""Return program job interim results.

Returns:
Interim results.
"""
response = self.session.get(self.get_url('interim_results'))
return response.text

def results(self) -> str:
"""Return program job results.

Expand Down
22 changes: 22 additions & 0 deletions qiskit_ibm/runtime/runtime_job.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,13 +105,15 @@ def __init__(
self._backend = backend
self._api_client = api_client
self._results: Optional[Any] = None
self._interim_results: Optional[Any] = None
self._params = params or {}
self._creation_date = creation_date
self._program_id = program_id
self._status = JobStatus.INITIALIZING
self._error_message = None # type: Optional[str]
self._result_decoder = result_decoder
self._image = image
self._final_interim_results = False

# Used for streaming
self._ws_client_future = None # type: Optional[futures.Future]
Expand All @@ -125,6 +127,26 @@ def __init__(
if user_callback is not None:
self.stream_results(user_callback)

def interim_results(self, decoder: Optional[Type[ResultDecoder]] = None) -> Any:
"""Return the interim results of the job.

Args:
decoder: A :class:`ResultDecoder` subclass used to decode interim results.

Returns:
Runtime job interim results.

Raises:
RuntimeJobFailureError: If the job failed.
"""
if not self._final_interim_results:
_decoder = decoder or self._result_decoder
interim_results_raw = self._api_client.job_interim_results(job_id=self.job_id)
self._interim_results = _decoder.decode(interim_results_raw)
if self.status() in JOB_FINAL_STATES:
self._final_interim_results = True
return self._interim_results
Comment thread
rathishcholarajan marked this conversation as resolved.

def result(
self,
timeout: Optional[float] = None,
Expand Down
7 changes: 7 additions & 0 deletions releasenotes/notes/interim-results-c9f14ac517012191.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
features:
- |
You can now use the :meth:`qiskit_ibm.runtime.RuntimeJob.interim_results`
method to retrieve runtime program interim results.
Note that interim results will only be available for
up to two days.
9 changes: 9 additions & 0 deletions test/ibm/runtime/fake_runtime_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ def __init__(self, job_id, program_id, hub, group, project, backend_name, final_
self._backend_name = backend_name
self._params = params
self._image = image
self._interim_results = json.dumps("foo")
if final_status is None:
self._future = self._executor.submit(self._auto_progress)
self._result = None
Expand Down Expand Up @@ -121,6 +122,10 @@ def result(self):
"""Return job result."""
return self._result

def interim_results(self):
"""Return job interim results."""
return self._interim_results


class FailedRuntimeJob(BaseFakeRuntimeJob):
"""Class for faking a failed runtime job."""
Expand Down Expand Up @@ -366,6 +371,10 @@ def job_results(self, job_id):
"""Get the results of a program job."""
return self._get_job(job_id).result()

def job_interim_results(self, job_id):
"""Get the interim results of a program job."""
return self._get_job(job_id).interim_results()

def job_cancel(self, job_id):
"""Cancel the job."""
self._get_job(job_id).cancel()
Expand Down
6 changes: 6 additions & 0 deletions test/ibm/runtime/test_runtime.py
Original file line number Diff line number Diff line change
Expand Up @@ -667,6 +667,12 @@ def test_final_result(self):
result = job.result()
self.assertTrue(result)

def test_interim_results(self):
"""Test getting interim results."""
job = self._run_program()
interim_results = job.interim_results()
self.assertTrue(interim_results)

def test_job_status(self):
"""Test job status."""
job = self._run_program()
Expand Down
8 changes: 8 additions & 0 deletions test/ibm/runtime/test_runtime_integration.py
Original file line number Diff line number Diff line change
Expand Up @@ -530,6 +530,14 @@ def result_callback(job_id, interim_result):
self.assertFalse(called_back)
self.assertIsNotNone(job._ws_client._server_close_code)

def test_retrieve_interim_results(self):
"""Test retrieving interim results with API endpoint"""
int_res = "foo"
job = self._run_program(interim_results=int_res)
job.wait_for_final_state()
interim_results = job.interim_results()
self.assertIn(int_res, interim_results[0])

def test_callback_error(self):
"""Test error in callback method."""
def result_callback(job_id, interim_result):
Expand Down