Exemple #1
0
    def _wait_for_job(self, timeout=60, wait=5):
        """Wait until all online ran circuits of a qobj are 'COMPLETED'.

        Args:
            timeout (float or None): seconds to wait for job. If None, wait
                indefinitely.
            wait (float): seconds between queries

        Returns:
            Result: A result object.

        Raises:
            JobTimeoutError: if the job does not return results before a specified timeout.
            JobError: if something wrong happened in some of the server API calls
        """
        start_time = time.time()
        while self.status() not in JOB_FINAL_STATES:
            elapsed_time = time.time() - start_time
            if timeout is not None and elapsed_time >= timeout:
                raise JobTimeoutError(
                    'Timeout while waiting for the job: {}'.format(self._id))

            logger.info('status = %s (%d seconds)', self._status, elapsed_time)
            time.sleep(wait)

        if self._cancelled:
            return Result({
                'id': self._id,
                'status': 'CANCELLED',
                'result': 'job cancelled'
            })

        job_data = self._api.get_job(self._id)
        job_result_list = []
        for circuit_result in job_data['qasms']:
            this_result = {
                'data': circuit_result['data'],
                'name': circuit_result.get('name'),
                'compiled_circuit_qasm': circuit_result.get('qasm'),
                'status': circuit_result['status']
            }
            if 'metadata' in circuit_result:
                this_result['metadata'] = circuit_result['metadata']

            job_result_list.append(this_result)

        return Result({
            'id': self._id,
            'status': job_data['status'],
            'used_credits': job_data.get('usedCredits'),
            'result': job_result_list,
            'backend_name': self.backend_name
        })
    def run(self, q_job):
        """Run q_job

        Args:
            q_job (QuantumJob): job to run
        Returns:
            Result: Result is a class including the information to be returned to users.
                   Specifically, result_list in the return looks is important and it like this:
                   [
                     {'data': {'unitary':
                                       array([[sqrt(2)/2, sqrt(2)/2, 0, 0],
                                              [0, 0, sqrt(2)/2, -sqrt(2)/2],
                                              [0, 0, sqrt(2)/2, sqrt(2)/2],
                                              [sqrt(2)/2, -sqrt(2)/2, 0, 0]], dtype=object)},
                     'status': 'DONE'}
                    ]

        """
        # Generating a string id for the job
        job_id = str(uuid.uuid4())
        qobj = q_job.qobj
        result_list = []
        for circuit in qobj['circuits']:
            result_list.append(self.run_circuit(circuit))
        return Result(
            {
                'job_id': job_id,
                'result': result_list,
                'status': 'COMPLETED'
            }, qobj)
    def _run_job(self, qobj):
        """Run circuits in qobj and return the result

            Args:
                qobj (dict): all the information necessary
                    (e.g., circuit, backend and resources) for running a circuit

            Returns:
                Result: Result is a class including the information to be returned to users.
                    Specifically, result_list in the return contains the essential information,
                    which looks like this::

                        [{'data':
                        {
                          'statevector': array([sqrt(2)/2, 0, 0, sqrt(2)/2], dtype=object),
                        },
                        'status': 'DONE'
                        }]
        """
        self._validate(qobj)
        result_list = []
        start = time.time()
        for circuit in qobj['circuits']:
            result_list.append(self.run_circuit(circuit))
        end = time.time()
        job_id = str(uuid.uuid4())
        result = {'backend': self._configuration['name'],
                  'id': qobj['id'],
                  'job_id': job_id,
                  'result': result_list,
                  'status': 'COMPLETED',
                  'success': True,
                  'time_taken': (end - start)}
        return Result(result)
 def run(self, q_job):
     """Run circuits in q_job and return the result
         Args:
             q_job (QuantumJob): all the information necessary
                 (e.g., circuit, backend and resources) for running a circuit
         Returns:
             Result: Result is a class including the information to be returned to users.
                 Specifically, result_list in the return contains the essential information,
                 which looks like this::
                     [{'data':
                     {
                       'counts': {'00': 1},
                       'quantum_state': array([sqrt(2)/2, 0, 0, sqrt(2)/2], dtype=object),
                       'classical_state': 0
                     },
                     'status': 'DONE'
                     }]
     """
     job_id = str(uuid.uuid4())
     qobj = q_job.qobj
     result_list = []
     self._shots = qobj['config']['shots']
     if self._shots > 1:
         logger.info("No need for multiple shots. A single execution will be performed.")
     for circuit in qobj['circuits']:
         result_list.append(self.run_circuit(circuit))
     return Result({'job_id': job_id, 'result': result_list, 'status': 'COMPLETED'}, qobj)
    def _run_job(self, qobj):
        """Run qobj. This is a blocking call.

        Args:
            qobj (Qobj): job description
        Returns:
            Result: Result object
        """
        result_list = []
        start = time.time()
        for circuit in qobj.experiments:
            result_list.append(self.run_circuit(circuit))
        end = time.time()
        job_id = str(uuid.uuid4())
        result = {
            'backend': self._configuration['name'],
            'id': qobj.qobj_id,
            'job_id': job_id,
            'result': result_list,
            'status': 'COMPLETED',
            'sucsess': True,
            'time_taken': (end - start)
        }
        copy_qasm_from_qobj_into_result(qobj, result)
        return Result(result)
Exemple #6
0
 def _run_job(self, q_job):
     qobj = q_job.qobj
     self._validate(qobj)
     simulator = SimulatorWrapper()
     result = simulator.run(json.dumps(qobj, cls=QASMSimulatorEncoder))
     result = json.loads(result, cls=QASMSimulatorDecoder)
     return Result(result, qobj)
 def run(self):
     """
     Run simulation on C++ simulator.
     """
     # result_list = []
     # for circuit in self.qobj['circuits']:
     #     result_list.append( self.run_circuit(circuit) )
     # return Result({'result': result_list, 'status': 'COMPLETED'},
     #               self.qobj)
     cmd = self._exe + ' - '
     with subprocess.Popen(cmd.split(),
                           stdin=PIPE,
                           stdout=PIPE,
                           stderr=PIPE) as proc:
         cin = json.dumps(self.qobj).encode()
         cout, cerr = proc.communicate(cin)
     if len(cerr) == 0:
         # no error messages, load std::cout
         cresult = json.loads(cout.decode())
         # convert possible complex valued result fields
         for result in cresult['result']:
             for k in ['state', 'saved_states', 'inner_products']:
                 parse_complex(result['data'], k)
         return Result(cresult, self.qobj)
     else:
         # custom "backend" or "result" exception handler here?
         raise SimulatorError(
             'local_qasm_cpp_simulator returned: {0}\n{1}'.format(
                 cout.decode(), cerr.decode()))
Exemple #8
0
 def run(self, q_job):
     """Run a QuantumJob on the backend."""
     qobj = q_job.qobj
     self._validate(qobj)
     final_state_key = 32767  # Internal key for final state snapshot
     # Add final snapshots to circuits
     for circuit in qobj['circuits']:
         circuit['compiled_circuit']['operations'].append({
             'name':
             'snapshot',
             'params': [final_state_key]
         })
     result = super().run(q_job)._result
     # Extract final state snapshot and move to 'statevector' data field
     for res in result['result']:
         snapshots = res['data']['snapshots']
         if str(final_state_key) in snapshots:
             final_state_key = str(final_state_key)
         # Pop off final snapshot added above
         final_state = snapshots.pop(final_state_key, None)
         final_state = final_state['statevector'][0]
         # Add final state to results data
         res['data']['statevector'] = final_state
         # Remove snapshot dict if empty
         if snapshots == {}:
             res['data'].pop('snapshots', None)
     return Result(result, qobj)
Exemple #9
0
 def _run_job(self, qobj):
     """Run a Qobj on the backend."""
     self._validate(qobj)
     final_state_key = 32767  # Internal key for final state snapshot
     # Add final snapshots to circuits
     for circuit in qobj['circuits']:
         circuit['compiled_circuit']['operations'].append({
             'name':
             'snapshot',
             'params': [final_state_key]
         })
     result = super()._run_job(qobj)._result
     # Replace backend name with current backend
     result['backend'] = self._configuration['name']
     # Extract final state snapshot and move to 'statevector' data field
     for res in result['result']:
         snapshots = res['data']['snapshots']
         if str(final_state_key) in snapshots:
             final_state_key = str(final_state_key)
         # Pop off final snapshot added above
         final_state = snapshots.pop(final_state_key, None)
         final_state = final_state['statevector'][0]
         # Add final state to results data
         res['data']['statevector'] = final_state
         # Remove snapshot dict if empty
         if snapshots == {}:
             res['data'].pop('snapshots', None)
     return Result(result)
Exemple #10
0
 def run(self, q_job):
     """Run circuits in q_job"""
     # Generating a string id for the job
     result_list = []
     qobj = q_job.qobj
     self._validate(qobj)
     self._sim = Simulator(gate_fusion=True)
     if 'seed' in qobj['config']:
         self._seed = qobj['config']['seed']
         self._sim._simulator = CppSim(self._seed)
     else:
         self._seed = random.getrandbits(32)
     self._shots = qobj['config']['shots']
     start = time.time()
     for circuit in qobj['circuits']:
         result_list.append(self.run_circuit(circuit))
     end = time.time()
     result = {
         'backend': self._configuration['name'],
         'id': qobj['id'],
         'result': result_list,
         'status': 'COMPLETED',
         'success': True,
         'time_taken': (end - start)
     }
     return Result(result, qobj)
Exemple #11
0
 def run(self):
     """Run circuits in qobj"""
     result_list = []
     for circuit in self.qobj['circuits']:
         result_list.append(self.run_circuit(circuit))
     return Result({
         'result': result_list,
         'status': 'COMPLETED'
     }, self.qobj)
Exemple #12
0
    def _run_job(self, qobj):
        self._validate()
        # set backend to Clifford simulator
        if 'config' in qobj:
            qobj['config']['simulator'] = 'clifford'
        else:
            qobj['config'] = {'simulator': 'clifford'}

        result = run(qobj, self._configuration['exe'])
        return Result(result)
Exemple #13
0
    def run(self, q_job):
        qobj = q_job.qobj
        # set backend to Clifford simulator
        if 'config' in qobj:
            qobj['config']['simulator'] = 'clifford'
        else:
            qobj['config'] = {'simulator': 'clifford'}

        result = run(qobj, self._configuration['exe'])
        return Result(result, qobj)
Exemple #14
0
    def run(self, q_job):
        """Run a QuantumJob on the the backend."""
        qobj = q_job.qobj
        self._validate()
        # set backend to Clifford simulator
        if 'config' in qobj:
            qobj['config']['simulator'] = 'clifford'
        else:
            qobj['config'] = {'simulator': 'clifford'}

        result = run(qobj, self._configuration['exe'])
        return Result(result, qobj)
Exemple #15
0
 def run(self, silent=True):
     """Run circuits in qobj
     
     Args:
         silent (bool, optional): Silence print statements. Default is True.
     """
     result_list = []
     self._shots = self.qobj['config']['shots']
     for circuit in self.qobj['circuits']:
         result_list.append( self.run_circuit(circuit) )
     return Result({'result': result_list, 'status': 'COMPLETED'},
                   self.qobj)            
Exemple #16
0
    def _run_job(self, q_job):
        qobj = q_job.qobj
        self._validate()
        # set backend to Clifford simulator
        if 'config' in qobj:
            qobj['config']['simulator'] = 'clifford'
        else:
            qobj['config'] = {'simulator': 'clifford'}

        simulator = SimulatorWrapper()
        result = simulator.run(json.dumps(qobj, cls=QASMSimulatorEncoder))
        result = json.loads(result, cls=QASMSimulatorDecoder)
        return Result(result, qobj)
Exemple #17
0
 def _job_done_callback(self, future):
     try:
         result = future.result()
     except Exception as ex:
         result = Result({'status': 'ERROR', 'result': ex}, future.qobj)
     with self.lock:
         self.futures[future]['result'] = result
         self.jobs_results.append(result)
         if self.num_jobs != 0:
             self.num_jobs -= 1
     # Call the callback when all jobs have finished
     if self.num_jobs == 0:
         logger.info(pprint.pformat(result))
         self.callback(self.jobs_results)
Exemple #18
0
    def _run_job(self, qobj):
        """Run qobj. This is a blocking call.

        Args:
            qobj (dict): job description
        Returns:
            Result: Result object
        """
        result_list = []
        for circuit in qobj['circuits']:
            result_list.append(self.run_circuit(circuit))
        job_id = str(uuid.uuid4())
        return Result(
            {'job_id': job_id, 'result': result_list, 'status': 'COMPLETED'})
Exemple #19
0
    def _run_job(self, qobj):
        """Run qobj. This is a blocking call.

        Args:
            qobj (Qobj): job description
        Returns:
            Result: Result object
        """
        result_list = []
        qobj_converted = qobj_to_dict(qobj, version='0.0.1')
        for circuit in qobj_converted['circuits']:
            result_list.append(self.run_circuit(circuit))
        job_id = str(uuid.uuid4())
        return Result(
            {'job_id': job_id, 'result': result_list, 'status': 'COMPLETED'})
 def run(self, q_job):
     """Run circuits in q_job"""
     # Generating a string id for the job
     job_id = str(uuid.uuid4())
     qobj = q_job.qobj
     result_list = []
     self._shots = qobj['config']['shots']
     for circuit in qobj['circuits']:
         result_list.append(self.run_circuit(circuit))
     return Result(
         {
             'job_id': job_id,
             'result': result_list,
             'status': 'COMPLETED'
         }, qobj)
Exemple #21
0
    def run(self, q_job):
        """Run jobs

        Args:
            q_job (QuantumJob): job to run

        Returns:
            Result object.

        Raises:
            ResultError: if the api put 'error' in its output
        """
        qobj = q_job.qobj
        wait = q_job.wait
        timeout = q_job.timeout
        api_jobs = []
        for circuit in qobj['circuits']:
            if (('compiled_circuit_qasm' not in circuit)
                    or (circuit['compiled_circuit_qasm'] is None)):
                compiled_circuit = openquantumcompiler.compile(
                    circuit['circuit'].qasm())
                circuit['compiled_circuit_qasm'] = compiled_circuit.qasm(
                    qeflag=True)
            if isinstance(circuit['compiled_circuit_qasm'], bytes):
                api_jobs.append(
                    {'qasm': circuit['compiled_circuit_qasm'].decode()})
            else:
                api_jobs.append({'qasm': circuit['compiled_circuit_qasm']})

        seed0 = qobj['circuits'][0]['config']['seed']
        output = self._api.run_job(api_jobs,
                                   qobj['config']['backend'],
                                   shots=qobj['config']['shots'],
                                   max_credits=qobj['config']['max_credits'],
                                   seed=seed0)
        if 'error' in output:
            raise ResultError(output['error'])

        logger.debug('Running on remote backend %s with job id: %s',
                     qobj['config']['backend'], output['id'])
        job_result = _wait_for_job(output['id'],
                                   self._api,
                                   wait=wait,
                                   timeout=timeout)
        job_result['name'] = qobj['id']
        job_result['backend'] = qobj['config']['backend']
        this_result = Result(job_result, qobj)
        return this_result
Exemple #22
0
    def _run_job(self, q_job):
        """Run q_job. This is a blocking call.

        Args:
            q_job (QuantumJob): job to run
        Returns:
            Result: Result object
        """
        qobj = q_job.qobj
        result_list = []
        for circuit in qobj['circuits']:
            result_list.append(self.run_circuit(circuit))
        job_id = str(uuid.uuid4())
        return Result(
            {'job_id': job_id, 'result': result_list, 'status': 'COMPLETED'},
            qobj)
 def _job_done_callback(self, future):
     try:
         result = future.result()
     except Exception as ex:
         result = Result({'status': 'ERROR', 'result': ex}, future.qobj)
     with self.lock:
         self.futures[future]['result'] = result
         self.jobs_results.append(result)
         if self.num_jobs != 0:
             self.num_jobs -= 1
     # Call the callback when all jobs have finished
     if self.num_jobs == 0:
         if not future.silent:
             import pprint
             pprint.pprint(result)
             sys.stdout.flush()
         self.callback(self.jobs_results)
    def run(self, q_job):
        """Run q_job

        Args:
            q_job (QuantumJob): job to run
        Returns:
            Result: Result object
        """
        # Generating a string id for the job
        job_id = str(uuid.uuid4())
        qobj = q_job.qobj
        result_list = []
        for circuit in qobj['circuits']:
            result_list.append(self.run_circuit(circuit))
        return Result(
            {'job_id': job_id, 'result': result_list, 'status': 'COMPLETED'},
            qobj)
Exemple #25
0
 def _run_job(self, qobj):
     """Run circuits in qobj"""
     self._validate(qobj)
     result_list = []
     self._shots = qobj.config.shots
     start = time.time()
     for circuit in qobj.circuits:
         result_list.append(self.run_circuit(circuit.as_dict()))
     end = time.time()
     job_id = str(uuid.uuid4())
     result = {'backend': self._configuration['name'],
               'id': qobj.id,
               'job_id': job_id,
               'result': result_list,
               'status': 'COMPLETED',
               'success': True,
               'time_taken': (end - start)}
     return Result(result)
 def run(self, q_job):
     """Run circuits in q_job"""
     # Generating a string id for the job
     job_id = str(uuid.uuid4())
     result_list = []
     qobj = q_job.qobj
     self._sim = Simulator(gate_fusion=True)
     if 'seed' in qobj['config']:
         self._seed = qobj['config']['seed']
         self._sim._simulator = CppSim(self._seed)
     else:
         self._seed = random.getrandbits(32)
     self._shots = qobj['config']['shots']
     for circuit in qobj['circuits']:
         result_list.append(self.run_circuit(circuit))
     return Result({'job_id': job_id, 'result': result_list,
                    'status': 'COMPLETED'},
                   qobj)
 def run(self, q_job):
     """Run circuits in q_job"""
     qobj = q_job.qobj
     self._validate(qobj)
     result_list = []
     self._shots = qobj['config']['shots']
     start = time.time()
     for circuit in qobj['circuits']:
         result_list.append(self.run_circuit(circuit))
     end = time.time()
     result = {
         'backend': self._configuration['name'],
         'id': qobj['id'],
         'result': result_list,
         'status': 'COMPLETED',
         'success': True,
         'time_taken': (end - start)
     }
     return Result(result, qobj)
Exemple #28
0
 def _job_done_callback(self, future):
     try:
         result = future.result()
     except Exception as ex:  # pylint: disable=broad-except
         result = Result({
             'job_id': '0',
             'status': 'ERROR',
             'result': ex
         }, future.qobj)
     with self.lock:
         logger.debug("Have a Result: %s", pprint.pformat(result))
         self.futures[future]['result'] = result
         self.jobs_results.append(result)
         if self.num_jobs != 0:
             self.num_jobs -= 1
             logger.debug("Jobs left count decreased: %d", self.num_jobs)
     # Call the callback when all jobs have finished
     if self.num_jobs == 0:
         logger.debug("No more jobs in queue, returning results")
         self.callback(self.jobs_results)
def run_remote_backend(qobj, api, wait=5, timeout=60, silent=True):
    """
    Args:
        qobj (dict): quantum object dictionary
        api (IBMQuantumExperience): IBMQuantumExperience API connection

    Raises:
        QISKitError: if "ERROR" string in server response.
    """
    api_jobs = []
    for circuit in qobj['circuits']:
        if (('compiled_circuit_qasm' not in circuit)
                or (circuit['compiled_circuit_qasm'] is None)):
            compiled_circuit = openquantumcompiler.compile(
                circuit['circuit'].qasm())
            circuit['compiled_circuit_qasm'] = compiled_circuit.qasm(
                qeflag=True)
        if isinstance(circuit['compiled_circuit_qasm'], bytes):
            api_jobs.append(
                {'qasm': circuit['compiled_circuit_qasm'].decode()})
        else:
            api_jobs.append({'qasm': circuit['compiled_circuit_qasm']})

    seed0 = qobj['circuits'][0]['config']['seed']
    output = api.run_job(api_jobs,
                         qobj['config']['backend'],
                         shots=qobj['config']['shots'],
                         max_credits=qobj['config']['max_credits'],
                         seed=seed0)
    if 'error' in output:
        raise ResultError(output['error'])

    job_result = _wait_for_job(output['id'],
                               api,
                               wait=wait,
                               timeout=timeout,
                               silent=silent)
    job_result['name'] = qobj['id']
    job_result['backend'] = qobj['config']['backend']
    this_result = Result(job_result, qobj)
    return this_result
    def result(self, timeout=None, wait=5):
        """Return the result from the job.

        Args:
           timeout (int): number of seconds to wait for job
           wait (int): time between queries to IBM Q server

        Returns:
            Result: Result object

        Raises:
            IBMQJobError: exception raised during job initialization
        """
        # pylint: disable=arguments-differ
        while self._status == JobStatus.INITIALIZING:
            if self._future_submit.exception():
                raise IBMQJobError('error submitting job: {}'.format(
                    repr(self._future_submit.exception())))
            time.sleep(0.1)
        try:
            this_result = self._wait_for_job(timeout=timeout, wait=wait)
        except TimeoutError as err:
            # A timeout error retrieving the results does not imply the job
            # is failing. The job can be still running.
            return Result({
                'id': self._id,
                'status': 'ERROR',
                'result': str(err)
            })

        if self._is_device and self.done:
            _reorder_bits(this_result)

        if self._status not in JOB_FINAL_STATES:
            if this_result.get_status() == 'ERROR':
                self._status = JobStatus.ERROR
            else:
                self._status = JobStatus.DONE
        return this_result