def _reorder_bits(result): """temporary fix for ibmq backends. for every ran circuit, get reordering information from qobj and apply reordering on result""" for circuit_result in result._result['result']: if 'metadata' in circuit_result: circ = circuit_result['metadata'].get('compiled_circuit') else: logger.warning('result object missing metadata for reordering' ' bits: bits may be out of order') return # device_qubit -> device_clbit (how it should have been) measure_dict = { op['qubits'][0]: op['clbits'][0] for op in circ['operations'] if op['name'] == 'measure' } counts_dict_new = {} for item in circuit_result['data']['counts'].items(): # fix clbit ordering to what it should have been bits = list(item[0]) bits.reverse() # lsb in 0th position count = item[1] reordered_bits = list('x' * len(bits)) for device_clbit, bit in enumerate(bits): if device_clbit in measure_dict: correct_device_clbit = measure_dict[device_clbit] reordered_bits[correct_device_clbit] = bit reordered_bits.reverse() # only keep the clbits specified by circuit, not everything on device num_clbits = circ['header']['number_of_clbits'] compact_key = reordered_bits[-num_clbits:] compact_key = "".join( [b if b != 'x' else '0' for b in compact_key]) # insert spaces to signify different classical registers cregs = circ['header']['clbit_labels'] if sum([creg[1] for creg in cregs]) != num_clbits: raise ResultError("creg sizes don't add up in result header.") creg_begin_pos = [] creg_end_pos = [] acc = 0 for creg in reversed(cregs): creg_size = creg[1] creg_begin_pos.append(acc) creg_end_pos.append(acc + creg_size) acc += creg_size compact_key = " ".join([ compact_key[creg_begin_pos[i]:creg_end_pos[i]] for i in range(len(cregs)) ]) # marginalize over unwanted measured qubits if compact_key not in counts_dict_new: counts_dict_new[compact_key] = count else: counts_dict_new[compact_key] += count circuit_result['data']['counts'] = counts_dict_new
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
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 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'] hpc = None if (qobj['config']['backend'] == 'ibmqx_hpc_qasm_simulator' and 'hpc' in qobj['config']): try: # Use CamelCase when passing the hpc parameters to the API. hpc = { 'multiShotOptimization': qobj['config']['hpc']['multi_shot_optimization'], 'ompNumThreads': qobj['config']['hpc']['omp_num_threads'] } except: hpc = None output = self._api.run_job(api_jobs, qobj['config']['backend'], shots=qobj['config']['shots'], max_credits=qobj['config']['max_credits'], seed=seed0, hpc=hpc) 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
def run(self, q_job): """Run jobs Args: q_job (QuantumJob): job to run Returns: Result: Result object. Raises: QISKitError: if there are inconsistencies between qobj data and backend data 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 = compile_circuit(circuit['circuit']) 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'] hpc = None if (qobj['config']['backend_name'] == 'ibmq_qasm_simulator_hpc' and 'hpc' in qobj['config']): try: # Use CamelCase when passing the hpc parameters to the API. hpc = { 'multiShotOptimization': qobj['config']['hpc']['multi_shot_optimization'], 'ompNumThreads': qobj['config']['hpc']['omp_num_threads'] } except (KeyError, TypeError): hpc = None backend_name = qobj['config']['backend_name'] if backend_name != self.name: raise QISKitError("inconsistent qobj backend " "name ({0} != {1})".format( backend_name, self.name)) output = self._api.run_job(api_jobs, backend_name, shots=qobj['config']['shots'], max_credits=qobj['config']['max_credits'], seed=seed0, hpc=hpc) if 'error' in output: raise ResultError(output['error']) logger.info('Running qobj: %s on remote backend %s with job id: %s', qobj["id"], qobj['config']['backend_name'], output['id']) job_result = _wait_for_job(output['id'], self._api, wait=wait, timeout=timeout) logger.info( 'Got a result for qobj: %s from remote backend %s with job id: %s', qobj["id"], qobj['config']['backend_name'], output['id']) job_result['name'] = qobj['id'] job_result['backend'] = qobj['config']['backend_name'] this_result = Result(job_result, qobj) return this_result