From 3cdf32ddb6b1f546f88b77a44548d469d7580fc5 Mon Sep 17 00:00:00 2001 From: Luis Garcia Date: Tue, 26 Nov 2019 07:02:25 -0800 Subject: [PATCH 1/6] add refresh to ibmqjob.result --- qiskit/providers/ibmq/job/ibmqjob.py | 13 ++++++++----- test/ibmq/test_ibmq_job.py | 23 +++++++++++++++++++++++ 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/qiskit/providers/ibmq/job/ibmqjob.py b/qiskit/providers/ibmq/job/ibmqjob.py index ad6bc9693..ca05301c5 100644 --- a/qiskit/providers/ibmq/job/ibmqjob.py +++ b/qiskit/providers/ibmq/job/ibmqjob.py @@ -186,7 +186,8 @@ def result( self, timeout: Optional[float] = None, wait: float = 5, - partial: bool = False + partial: bool = False, + refresh: bool = False ) -> Result: """Return the result of the job. @@ -222,6 +223,8 @@ def result( timeout: number of seconds to wait for job wait: time between queries to IBM Q server partial: if true attempts to return partial results for the job. + refresh: if true, query the API for the result again. + Otherwise return the cached value. Returns: Result object. @@ -243,7 +246,7 @@ def result( raise IBMQJobFailureError('Unable to retrieve job result. Job has failed. ' 'Use job.error_message() to get more details.') - return self._retrieve_result() + return self._retrieve_result(refresh=refresh) def cancel(self) -> bool: """Attempt to cancel a job. @@ -349,7 +352,7 @@ def queue_position(self, refresh: bool = False) -> Optional[int]: """Return the position in the server queue. Args: - refresh (bool): if True, query the API and return the latest value. + refresh: if True, query the API and return the latest value. Otherwise return the cached value. Returns: @@ -483,7 +486,7 @@ def _wait_for_completion( return self._status in required_status - def _retrieve_result(self) -> Result: + def _retrieve_result(self, refresh: bool = False) -> Result: """Retrieve the job result response. Returns: @@ -496,7 +499,7 @@ def _retrieve_result(self) -> Result: """ # pylint: disable=access-member-before-definition,attribute-defined-outside-init result_response = None - if not self._result: # type: ignore[has-type] + if not self._result or refresh: # type: ignore[has-type] try: result_response = self._api.job_result(self.job_id(), self._use_object_storage) self._result = Result.from_dict(result_response) diff --git a/test/ibmq/test_ibmq_job.py b/test/ibmq/test_ibmq_job.py index 63d5b545d..28fa1b01c 100644 --- a/test/ibmq/test_ibmq_job.py +++ b/test/ibmq/test_ibmq_job.py @@ -16,6 +16,7 @@ import time import warnings +import copy from concurrent import futures from datetime import datetime, timedelta from unittest import skip @@ -539,6 +540,28 @@ def test_retrieve_from_retired_backend(self, provider): self.assertTrue(isinstance(new_job2.backend(), IBMQRetiredBackend)) self.assertNotEqual(new_job2.backend().name(), 'unknown') + @requires_provider + def test_refresh_job_result(self, provider): + """Test re-retrieving job result via refresh.""" + backend = provider.get_backend('ibmq_qasm_simulator') + qobj = assemble(transpile(self._qc, backend=backend), backend=backend) + job = backend.run(qobj) + result = job.result() + + # Save original cached results. + cached_result = copy.deepcopy(result) + self.assertTrue(cached_result) + + # Modify cached results. + result.results[0].header.name = 'modified_result' + self.assertNotEqual(cached_result, result) + self.assertEqual(result.results[0].header.name, 'modified_result') + + # Re-retrieve result via refresh. + result = job.result(refresh=True) + self.assertEqual(cached_result, result) + self.assertNotEqual(result.results[0].header.name, 'modified_result') + def _bell_circuit(): qr = QuantumRegister(2, 'q') From b61e69736be8de2b66ad3508e7b2edfb41b5bdb6 Mon Sep 17 00:00:00 2001 From: Luis Garcia Date: Tue, 26 Nov 2019 09:46:29 -0800 Subject: [PATCH 2/6] Update changelog. --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b077a2d32..e258b36a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,14 @@ The format is based on [Keep a Changelog]. > - **Security**: in case of vulnerabilities. +## [UNRELEASED] + +### Added + +- `IBMQJob.result()` now accepts an optional `refresh` parameter. If + specified, the function re-queries the api for the results, rather + than returning those cached. (\#469) + ## [0.4.3] - 2019-11-21 ### Fixed From 019f60c598188d9e9c57f7d96a169d88c82ac484 Mon Sep 17 00:00:00 2001 From: Luis Garcia Date: Tue, 26 Nov 2019 09:49:28 -0800 Subject: [PATCH 3/6] add param to docstring. --- qiskit/providers/ibmq/job/ibmqjob.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/qiskit/providers/ibmq/job/ibmqjob.py b/qiskit/providers/ibmq/job/ibmqjob.py index ca05301c5..de15288da 100644 --- a/qiskit/providers/ibmq/job/ibmqjob.py +++ b/qiskit/providers/ibmq/job/ibmqjob.py @@ -489,6 +489,10 @@ def _wait_for_completion( def _retrieve_result(self, refresh: bool = False) -> Result: """Retrieve the job result response. + Args: + refresh: if true, query the API for the result again. + Otherwise return the cached value. + Returns: The job result. From 6d2069760f5ba233c2718e915554aef3779d5f85 Mon Sep 17 00:00:00 2001 From: Luis Garcia Date: Mon, 2 Dec 2019 16:05:23 -0800 Subject: [PATCH 4/6] update changelog --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e258b36a9..31026ae73 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,8 +19,8 @@ The format is based on [Keep a Changelog]. ### Added - `IBMQJob.result()` now accepts an optional `refresh` parameter. If - specified, the function re-queries the api for the results, rather - than returning those cached. (\#469) + `refresh=True` is specified, the function re-queries the api for the + results, rather than returning those cached. (\#469) ## [0.4.3] - 2019-11-21 From fc3425addb5d80fcb41fef042f53d5eeb4245c1b Mon Sep 17 00:00:00 2001 From: Luis Garcia Date: Mon, 2 Dec 2019 16:11:30 -0800 Subject: [PATCH 5/6] remove unused import --- test/ibmq/test_ibmq_job.py | 1 - 1 file changed, 1 deletion(-) diff --git a/test/ibmq/test_ibmq_job.py b/test/ibmq/test_ibmq_job.py index 61dd50e31..d5f8868bf 100644 --- a/test/ibmq/test_ibmq_job.py +++ b/test/ibmq/test_ibmq_job.py @@ -15,7 +15,6 @@ """IBMQJob Test.""" import time -import warnings import copy from concurrent import futures from datetime import datetime, timedelta From acc3ba7a5f6551afd5febc779505d0080f165b66 Mon Sep 17 00:00:00 2001 From: Luis Garcia Date: Wed, 4 Dec 2019 09:47:06 -0500 Subject: [PATCH 6/6] Add default value to docstring. --- qiskit/providers/ibmq/job/ibmqjob.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/qiskit/providers/ibmq/job/ibmqjob.py b/qiskit/providers/ibmq/job/ibmqjob.py index de15288da..6b5a9bd6a 100644 --- a/qiskit/providers/ibmq/job/ibmqjob.py +++ b/qiskit/providers/ibmq/job/ibmqjob.py @@ -224,7 +224,7 @@ def result( wait: time between queries to IBM Q server partial: if true attempts to return partial results for the job. refresh: if true, query the API for the result again. - Otherwise return the cached value. + Otherwise return the cached value. Default: False. Returns: Result object. @@ -491,7 +491,7 @@ def _retrieve_result(self, refresh: bool = False) -> Result: Args: refresh: if true, query the API for the result again. - Otherwise return the cached value. + Otherwise return the cached value. Default: False. Returns: The job result.