Example #1
0
File: job.py Project: wodaka/Cirq
    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(),
            )
Example #2
0
    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())