def results( self, timeout_seconds: int = 7200, polling_seconds: int = 1 ) -> Union[results.QPUResult, results.SimulatorResult]: """Polls the IonQ api for results. Args: timeout_seconds: The total number of seconds to poll for. polling_seconds: The interval with which to poll. Returns: Either a `cirq.ionq.QPUResults` or `cirq.ionq.SimulatorResults` depending on whether the job was running on an actual quantum processor or a simulator. Raises: IonQUnsuccessfulJob: If the job has failed, been canceled, or deleted. IonQException: If unable to get the results from the API. """ time_waited_seconds = 0 while time_waited_seconds < timeout_seconds: # Status does a refresh. if self.status() in self.TERMINAL_STATES: break time.sleep(polling_seconds) time_waited_seconds += polling_seconds if self.status() != 'completed': if 'failure' in self._job and 'error' in self._job['failure']: error = self._job['failure']['error'] raise RuntimeError(f'Job failed. Error message: {error}') raise RuntimeError( f'Job was not completed successful. Instead had status: {self.status()}' ) # IonQ returns results in little endian, Cirq prefers to use big endian, so we convert. if self.target() == 'qpu': repetitions = self.repetitions() counts = { _little_endian_to_big(int(k), self.num_qubits()): int(repetitions * float(v)) for k, v in self._job['data']['histogram'].items() } return results.QPUResult( counts=counts, num_qubits=self.num_qubits(), measurement_dict=self.measurement_dict(), ) else: probabilities = { _little_endian_to_big(int(k), self.num_qubits()): float(v) for k, v in self._job['data']['histogram'].items() } return results.SimulatorResult( probabilities=probabilities, num_qubits=self.num_qubits(), measurement_dict=self.measurement_dict(), repetitions=self.repetitions(), )
def results( self, timeout_seconds: int = 7200, polling_seconds: int = 1 ) -> Union[results.QPUResult, results.SimulatorResult]: """Polls the IonQ api for results. Args: timeout_seconds: The total number of seconds to poll for. polling_seconds: The interval with which to poll. Returns: Either a `cirq.ionq.QPUResults` or `cirq.ionq.SimulatorResults` depending on whether the job was running on an actual quantum processor or a simulator. Raises: RuntimeError: if the job was not successfully completed (cancelled or failed). """ time_waited_seconds = 0 while time_waited_seconds < timeout_seconds: # Status does a refresh. if self.status() in self.TERMINAL_STATES: break time.sleep(polling_seconds) time_waited_seconds += polling_seconds if self.status() != 'completed': raise RuntimeError('Job was not completed successful. Instead had' f' status: {self.status()}') # IonQ returns results in little endian, Cirq prefers to use big endian, # so we convert. if self.target() == 'qpu': repetitions = self.repetitions() assert repetitions is not None counts = { _little_endian_to_big(int(k), self.num_qubits()): int(repetitions * float(v)) for k, v in self._job['data']['histogram'].items() } return results.QPUResult(counts=counts, num_qubits=self.num_qubits()) else: probabilities = { _little_endian_to_big(int(k), self.num_qubits()): float(v) for k, v in self._job['data']['histogram'].items() } return results.SimulatorResult(probabilities=probabilities, num_qubits=self.num_qubits())