def test_retrieve_job_uses_appropriate_backend(self, qe_token, qe_url):
        """Test that retrieved jobs come from their appropriate backend."""
        IBMQ.enable_account(qe_token, qe_url)
        simulator_backend = IBMQ.get_backend('ibmq_qasm_simulator')
        backends = IBMQ.backends(simulator=False)
        real_backend = least_busy(backends)

        qobj_sim = compile(self._qc, simulator_backend)
        job_sim = simulator_backend.run(qobj_sim)

        qobj_real = compile(self._qc, real_backend)
        job_real = real_backend.run(qobj_real)

        # test a retrieved job's backend is the same as the queried backend
        self.assertEqual(simulator_backend.retrieve_job(job_sim.job_id()).backend().name(),
                         simulator_backend.name())
        self.assertEqual(real_backend.retrieve_job(job_real.job_id()).backend().name(),
                         real_backend.name())

        # test retrieve requests for jobs that exist on other backends throw errors
        with self.assertWarns(Warning) as context_manager:
            self.assertRaises(IBMQBackendError,
                              simulator_backend.retrieve_job, job_real.job_id())
        self.assertIn('belongs to', str(context_manager.warning))
        with self.assertWarns(Warning) as context_manager:
            self.assertRaises(IBMQBackendError,
                              real_backend.retrieve_job, job_sim.job_id())
        self.assertIn('belongs to', str(context_manager.warning))
    def test_multi_register_reordering(self, qe_token, qe_url):
        """a more complicated reordering across 3 registers of different sizes"""
        sim, real = self._get_backends(qe_token, qe_url)
        if not sim or not real:
            raise unittest.SkipTest('no remote device available')

        qr0 = QuantumRegister(2)
        qr1 = QuantumRegister(2)
        qr2 = QuantumRegister(1)
        cr0 = ClassicalRegister(2)
        cr1 = ClassicalRegister(2)
        cr2 = ClassicalRegister(1)
        circuit = QuantumCircuit(qr0, qr1, qr2, cr0, cr1, cr2)
        circuit.h(qr0[0])
        circuit.cx(qr0[0], qr2[0])
        circuit.x(qr1[1])
        circuit.h(qr2[0])
        circuit.cx(qr2[0], qr1[0])
        circuit.barrier()
        circuit.measure(qr0[0], cr2[0])
        circuit.measure(qr0[1], cr0[1])
        circuit.measure(qr1[0], cr0[0])
        circuit.measure(qr1[1], cr1[0])
        circuit.measure(qr2[0], cr1[1])

        shots = 4000
        qobj_real = compile(circuit, real)
        qobj_sim = compile(circuit, sim)
        result_real = real.run(qobj_real).result(timeout=600)
        result_sim = sim.run(qobj_sim).result(timeout=600)
        counts_real = result_real.get_counts()
        counts_sim = result_sim.get_counts()
        threshold = 0.2 * shots
        self.assertDictAlmostEqual(counts_real, counts_sim, threshold)
    def test_run_simulator(self, qe_token, qe_url):
        """Test running in a simulator."""
        IBMQ.enable_account(qe_token, qe_url)
        backend = IBMQ.get_backend('ibmq_qasm_simulator')

        qr = QuantumRegister(2, 'q')
        cr = ClassicalRegister(2, 'c')
        qc = QuantumCircuit(qr, cr, name='hadamard')
        qc.h(qr)
        qc.measure(qr, cr)
        qobj = compile([self._qc, qc], backend)
        shots = qobj.config.shots
        job = backend.run(qobj)
        result = job.result()
        counts_qx1 = result.get_counts(0)
        counts_qx2 = result.get_counts(1)
        counts_ex1 = {'00': shots/2, '11': shots/2}
        counts_ex2 = {'00': shots/4, '11': shots/4, '10': shots/4, '01': shots/4}
        states1 = counts_qx1.keys() | counts_ex1.keys()
        states2 = counts_qx2.keys() | counts_ex2.keys()
        # contingency table
        ctable1 = numpy.array([[counts_qx1.get(key, 0) for key in states1],
                               [counts_ex1.get(key, 0) for key in states1]])
        ctable2 = numpy.array([[counts_qx2.get(key, 0) for key in states2],
                               [counts_ex2.get(key, 0) for key in states2]])
        self.log.info('states1: %s', str(states1))
        self.log.info('states2: %s', str(states2))
        self.log.info('ctable1: %s', str(ctable1))
        self.log.info('ctable2: %s', str(ctable2))
        contingency1 = chi2_contingency(ctable1)
        contingency2 = chi2_contingency(ctable2)
        self.log.info('chi2_contingency1: %s', str(contingency1))
        self.log.info('chi2_contingency2: %s', str(contingency2))
        self.assertGreater(contingency1[1], 0.01)
        self.assertGreater(contingency2[1], 0.01)
Beispiel #4
0
    def test_multi_register(self):
        """Test one circuit, two registers, out-of-order readout."""
        qr1 = QuantumRegister(2)
        qr2 = QuantumRegister(2)
        cr1 = ClassicalRegister(3)
        cr2 = ClassicalRegister(1)
        circuit = QuantumCircuit(qr1, qr2, cr1, cr2)
        circuit.h(qr1[0])
        circuit.cx(qr1[0], qr2[1])
        circuit.h(qr2[0])
        circuit.cx(qr2[0], qr1[1])
        circuit.x(qr1[1])
        circuit.measure(qr1[0], cr2[0])
        circuit.measure(qr1[1], cr1[0])
        circuit.measure(qr1[1], cr2[0])
        circuit.measure(qr1[1], cr1[2])
        circuit.measure(qr2[0], cr1[2])
        circuit.measure(qr2[1], cr1[1])

        qobj = compile(circuit, self._remote_backend)
        result_remote = self._remote_backend.run(qobj).result()
        result_local = self._local_backend.run(qobj).result()
        self.assertDictAlmostEqual(result_remote.get_counts(circuit),
                                   result_local.get_counts(circuit),
                                   delta=50)
Beispiel #5
0
 def test_run_circuit(self):
     """Test running a single circuit."""
     qobj = compile(self.circuit, self.backend)
     job = self.backend.run(qobj)
     result = job.result()
     self.assertEqual(result.success, True)
     return result
    def test_execute_several_circuits_simulator_online(self, qe_token, qe_url):
        """Test execute_several_circuits_simulator_online."""
        IBMQ.enable_account(qe_token, qe_url)
        backend = IBMQ.get_backend('ibmq_qasm_simulator')

        qr = QuantumRegister(2)
        cr = ClassicalRegister(2)
        qcr1 = QuantumCircuit(qr, cr, name='qc1')
        qcr2 = QuantumCircuit(qr, cr, name='qc2')
        qcr1.h(qr)
        qcr2.h(qr[0])
        qcr2.cx(qr[0], qr[1])
        qcr1.measure(qr[0], cr[0])
        qcr1.measure(qr[1], cr[1])
        qcr2.measure(qr[0], cr[0])
        qcr2.measure(qr[1], cr[1])
        shots = 1024
        qobj = compile([qcr1, qcr2],
                       backend=backend,
                       seed=73846087,
                       shots=shots)
        job = backend.run(qobj)
        result = job.result()
        counts1 = result.get_counts(qcr1)
        counts2 = result.get_counts(qcr2)
        target1 = {
            '00': shots / 4,
            '01': shots / 4,
            '10': shots / 4,
            '11': shots / 4
        }
        target2 = {'00': shots / 2, '11': shots / 2}
        threshold = 0.04 * shots
        self.assertDictAlmostEqual(counts1, target1, threshold)
        self.assertDictAlmostEqual(counts2, target2, threshold)
    def test_run_device(self, qe_token, qe_url):
        """Test running in a real device."""
        IBMQ.enable_account(qe_token, qe_url)
        backends = IBMQ.backends(simulator=False)

        self.log.info('devices: %s', [b.name() for b in backends])
        backend = least_busy(backends)
        self.log.info('using backend: %s', backend.name())
        qobj = compile(self._qc, backend)
        shots = qobj.config.shots
        job = backend.run(qobj)
        while not job.status() is JobStatus.DONE:
            self.log.info(job.status())
            time.sleep(4)
        self.log.info(job.status)
        result = job.result()
        counts_qx = result.get_counts(0)
        counts_ex = {'00': shots / 2, '11': shots / 2}
        states = counts_qx.keys() | counts_ex.keys()
        # contingency table
        ctable = numpy.array([[counts_qx.get(key, 0) for key in states],
                              [counts_ex.get(key, 0) for key in states]])
        self.log.info('states: %s', str(states))
        self.log.info('ctable: %s', str(ctable))
        contingency = chi2_contingency(ctable)
        self.log.info('chi2_contingency: %s', str(contingency))
        self.assertDictAlmostEqual(counts_qx, counts_ex, shots * 0.1)
    def test_online_qasm_simulator_two_registers(self, qe_token, qe_url):
        """Test online_qasm_simulator_two_registers."""
        IBMQ.enable_account(qe_token, qe_url)
        backend = IBMQ.get_backend('ibmq_qasm_simulator')

        qr1 = QuantumRegister(2)
        cr1 = ClassicalRegister(2)
        qr2 = QuantumRegister(2)
        cr2 = ClassicalRegister(2)
        qcr1 = QuantumCircuit(qr1, qr2, cr1, cr2, name="circuit1")
        qcr2 = QuantumCircuit(qr1, qr2, cr1, cr2, name="circuit2")
        qcr1.x(qr1[0])
        qcr2.x(qr2[1])
        qcr1.measure(qr1[0], cr1[0])
        qcr1.measure(qr1[1], cr1[1])
        qcr1.measure(qr2[0], cr2[0])
        qcr1.measure(qr2[1], cr2[1])
        qcr2.measure(qr1[0], cr1[0])
        qcr2.measure(qr1[1], cr1[1])
        qcr2.measure(qr2[0], cr2[0])
        qcr2.measure(qr2[1], cr2[1])
        shots = 1024
        qobj = compile([qcr1, qcr2],
                       backend,
                       seed=8458,
                       shots=shots,
                       seed_mapper=88434)
        job = backend.run(qobj)
        result = job.result()
        result1 = result.get_counts(qcr1)
        result2 = result.get_counts(qcr2)
        self.assertEqual(result1, {'00 01': 1024})
        self.assertEqual(result2, {'10 00': 1024})
    def test_get_backend_name(self, qe_token, qe_url):
        """Test getting a backend name."""
        IBMQ.enable_account(qe_token, qe_url)
        backend = IBMQ.get_backend('ibmq_qasm_simulator')

        qobj = compile(self._qc, backend)
        job = backend.run(qobj)
        self.assertTrue(job.backend().name() == backend.name())
 def test_qobj_enabled_result(self):
     """Jobs can be retrieved."""
     qobj = compile(self._qc, self._backend)
     job = self._backend.run(qobj)
     try:
         job.result()
     except JobError as err:
         self.fail(err)
    def test_job_id(self, qe_token, qe_url):
        """Test getting a job id."""
        IBMQ.enable_account(qe_token, qe_url)
        backend = IBMQ.get_backend('ibmq_qasm_simulator')

        qobj = compile(self._qc, backend)
        job = backend.run(qobj)
        self.log.info('job_id: %s', job.job_id())
        self.assertTrue(job.job_id() is not None)
    def test_double_submit_fails(self, qe_token, qe_url):
        """Test submitting a job twice."""
        IBMQ.enable_account(qe_token, qe_url)
        backend = IBMQ.get_backend('ibmq_qasm_simulator')

        qobj = compile(self._qc, backend)
        # backend.run() will automatically call job.submit()
        job = backend.run(qobj)
        with self.assertRaises(JobError):
            job.submit()
    def test_api_run_job_fail_backend(self, qe_token, qe_url):
        """Test running a job against an invalid backend."""
        IBMQ.enable_account(qe_token, qe_url)

        backend_name = 'ibmq_qasm_simulator'
        backend = IBMQ.get_backend(backend_name)
        qobj = compile(self.qc1, backend=backend, seed=self.seed, shots=1)

        api = backend._api
        self.assertRaises(BadBackendError, api.run_job, qobj.as_dict(),
                          'INVALID_BACKEND_NAME')
Beispiel #14
0
    def test_readout_order(self):
        """Test one circuit, one register, out-of-order readout.
        """
        qr = QuantumRegister(4)
        cr = ClassicalRegister(4)
        circuit = QuantumCircuit(qr, cr)
        circuit.x(qr[0])
        circuit.x(qr[2])
        circuit.measure(qr[0], cr[2])
        circuit.measure(qr[1], cr[0])
        circuit.measure(qr[2], cr[1])
        circuit.measure(qr[3], cr[3])

        qobj_remote = compile(circuit, self._remote_backend)
        qobj_local = compile(circuit, self._local_backend)
        result_remote = self._remote_backend.run(qobj_remote).result()
        result_local = self._local_backend.run(qobj_local).result()
        self.assertDictAlmostEqual(result_remote.get_counts(circuit),
                                   result_local.get_counts(circuit),
                                   delta=50)
    def test_retrieve_job(self, qe_token, qe_url):
        """Test retrieving a single job."""
        IBMQ.enable_account(qe_token, qe_url)
        backend = IBMQ.get_backend('ibmq_qasm_simulator')

        qobj = compile(self._qc, backend)
        job = backend.run(qobj)

        rjob = backend.retrieve_job(job.job_id())
        self.assertEqual(job.job_id(), rjob.job_id())
        self.assertEqual(job.result().get_counts(), rjob.result().get_counts())
        self.assertEqual(job.qobj().as_dict(), qobj.as_dict())
Beispiel #16
0
    def test_run_async_simulator(self, qe_token, qe_url):
        """Test running in a simulator asynchronously."""
        IBMQJob._executor = futures.ThreadPoolExecutor(max_workers=2)

        IBMQ.enable_account(qe_token, qe_url)
        backend = IBMQ.get_backend('ibmq_qasm_simulator')

        self.log.info('submitting to backend %s', backend.name())
        num_qubits = 16
        qr = QuantumRegister(num_qubits, 'qr')
        cr = ClassicalRegister(num_qubits, 'cr')
        qc = QuantumCircuit(qr, cr)
        for i in range(num_qubits - 1):
            qc.cx(qr[i], qr[i + 1])
        qc.measure(qr, cr)
        qobj = compile([qc] * 10, backend)
        num_jobs = 5
        job_array = [backend.run(qobj) for _ in range(num_jobs)]
        found_async_jobs = False
        timeout = 30
        start_time = time.time()
        while not found_async_jobs:
            check = sum(
                [job.status() is JobStatus.RUNNING for job in job_array])
            if check >= 2:
                self.log.info('found %d simultaneous jobs', check)
                break
            if all([job.status() is JobStatus.DONE for job in job_array]):
                # done too soon? don't generate error
                self.log.warning('all jobs completed before simultaneous jobs '
                                 'could be detected')
                break
            for job in job_array:
                self.log.info('%s %s %s %s', job.status(),
                              job.status() is JobStatus.RUNNING, check,
                              job.job_id())
            self.log.info('-  %s', str(time.time() - start_time))
            if time.time() - start_time > timeout:
                raise TimeoutError('failed to see multiple running jobs after '
                                   '{0} s'.format(timeout))
            time.sleep(0.2)

        result_array = [job.result() for job in job_array]
        self.log.info('got back all job results')
        # Ensure all jobs have finished.
        self.assertTrue(
            all([job.status() is JobStatus.DONE for job in job_array]))
        self.assertTrue(all([result.success for result in result_array]))

        # Ensure job ids are unique.
        job_ids = [job.job_id() for job in job_array]
        self.assertEqual(sorted(job_ids), sorted(list(set(job_ids))))
    def test_cancel(self, qe_token, qe_url):
        """Test job cancelation."""
        IBMQ.enable_account(qe_token, qe_url)
        backend_name = ('ibmq_20_tokyo'
                        if self.using_ibmq_credentials else 'ibmqx4')
        backend = IBMQ.get_backend(backend_name)

        qobj = compile(self._qc, backend)
        job = backend.run(qobj)
        self.wait_for_initialization(job, timeout=5)
        can_cancel = job.cancel()
        self.assertTrue(can_cancel)
        self.assertTrue(job.status() is JobStatus.CANCELLED)
Beispiel #18
0
    def test_one_qubit_no_operation(self):
        """Test one circuit, one register, in-order readout."""
        qr = QuantumRegister(1)
        cr = ClassicalRegister(1)
        circuit = QuantumCircuit(qr, cr)
        circuit.measure(qr[0], cr[0])

        qobj = compile(circuit, self._remote_backend)
        result_remote = self._remote_backend.run(qobj).result()
        result_local = self._local_backend.run(qobj).result()
        self.assertDictAlmostEqual(result_remote.get_counts(circuit),
                                   result_local.get_counts(circuit),
                                   delta=50)
    def test_api_run_job(self, qe_token, qe_url):
        """Test running a job against a simulator."""
        IBMQ.enable_account(qe_token, qe_url)

        backend_name = 'ibmq_qasm_simulator'
        backend = IBMQ.get_backend(backend_name)
        qobj = compile(self.qc1, backend=backend, seed=self.seed, shots=1)

        api = backend._api
        job = api.run_job(qobj.as_dict(), backend_name)
        check_status = None
        if 'status' in job:
            check_status = job['status']
        self.assertIsNotNone(check_status)
    def test_basic_reordering(self, qe_token, qe_url):
        """a simple reordering within a 2-qubit register"""
        sim, real = self._get_backends(qe_token, qe_url)
        if not sim or not real:
            raise unittest.SkipTest('no remote device available')

        qr = QuantumRegister(2)
        cr = ClassicalRegister(2)
        circuit = QuantumCircuit(qr, cr)
        circuit.h(qr[0])
        circuit.measure(qr[0], cr[1])
        circuit.measure(qr[1], cr[0])

        shots = 2000
        qobj_real = compile(circuit, real)
        qobj_sim = compile(circuit, sim)
        result_real = real.run(qobj_real).result(timeout=600)
        result_sim = sim.run(qobj_sim).result(timeout=600)
        counts_real = result_real.get_counts()
        counts_sim = result_sim.get_counts()
        self.log.info(counts_real)
        self.log.info(counts_sim)
        threshold = 0.1 * shots
        self.assertDictAlmostEqual(counts_real, counts_sim, threshold)
Beispiel #21
0
    def test_atlantic_circuit(self):
        """Test Atlantis deterministic ry operation."""
        qr = QuantumRegister(3)
        cr = ClassicalRegister(3)
        circuit = QuantumCircuit(qr, cr)
        circuit.ry(pi, qr[0])
        circuit.ry(pi, qr[2])
        circuit.measure(qr, cr)

        qobj = compile(circuit, self._remote_backend)
        result_remote = self._remote_backend.run(qobj).result()
        result_local = self._local_backend.run(qobj).result()
        self.assertDictAlmostEqual(result_remote.get_counts(circuit),
                                   result_local.get_counts(circuit),
                                   delta=50)
Beispiel #22
0
    def test_compile_run_remote(self, qe_token, qe_url):
        """Test Compiler and run remote."""
        IBMQ.enable_account(qe_token, qe_url)
        backend = IBMQ.get_backend(local=False, simulator=True)

        qubit_reg = QuantumRegister(2, name='q')
        clbit_reg = ClassicalRegister(2, name='c')
        qc = QuantumCircuit(qubit_reg, clbit_reg, name="bell")
        qc.h(qubit_reg[0])
        qc.cx(qubit_reg[0], qubit_reg[1])
        qc.measure(qubit_reg, clbit_reg)
        qobj = compile(qc, backend, seed=self.seed)
        job = backend.run(qobj)
        result = job.result(timeout=20)
        self.assertIsInstance(result, Result)
    def test_retrieve_job(self, qe_token, qe_url):
        """Test retrieving a single job."""
        IBMQ.enable_account(qe_token, qe_url)
        backend = IBMQ.get_backend('ibmq_qasm_simulator')

        qobj = compile(self._qc, backend)
        job = backend.run(qobj)

        rjob = backend.retrieve_job(job.job_id())
        self.assertEqual(job.job_id(), rjob.job_id())
        self.assertEqual(job.result().get_counts(), rjob.result().get_counts())
        if getattr(backend.configuration(), 'allow_q_object'):
            self.assertEqual(job.qobj().as_dict(), qobj.as_dict())
        else:
            self.assertEqual(job.qobj(), None)
Beispiel #24
0
    def test_run_async_device(self, qe_token, qe_url):
        """Test running in a real device asynchronously."""
        IBMQ.enable_account(qe_token, qe_url)
        backends = IBMQ.backends(simulator=False)
        backend = least_busy(backends)

        self.log.info('submitting to backend %s', backend.name())
        num_qubits = 5
        qr = QuantumRegister(num_qubits, 'qr')
        cr = ClassicalRegister(num_qubits, 'cr')
        qc = QuantumCircuit(qr, cr)
        for i in range(num_qubits - 1):
            qc.cx(qr[i], qr[i + 1])
        qc.measure(qr, cr)
        qobj = compile(qc, backend)
        num_jobs = 3
        job_array = [backend.run(qobj) for _ in range(num_jobs)]
        time.sleep(3)  # give time for jobs to start (better way?)
        job_status = [job.status() for job in job_array]
        num_init = sum(
            [status is JobStatus.INITIALIZING for status in job_status])
        num_queued = sum([status is JobStatus.QUEUED for status in job_status])
        num_running = sum(
            [status is JobStatus.RUNNING for status in job_status])
        num_done = sum([status is JobStatus.DONE for status in job_status])
        num_error = sum([status is JobStatus.ERROR for status in job_status])
        self.log.info('number of currently initializing jobs: %d/%d', num_init,
                      num_jobs)
        self.log.info('number of currently queued jobs: %d/%d', num_queued,
                      num_jobs)
        self.log.info('number of currently running jobs: %d/%d', num_running,
                      num_jobs)
        self.log.info('number of currently done jobs: %d/%d', num_done,
                      num_jobs)
        self.log.info('number of errored jobs: %d/%d', num_error, num_jobs)
        self.assertTrue(num_jobs - num_error - num_done > 0)

        # Wait for all the results.
        result_array = [job.result() for job in job_array]

        # Ensure all jobs have finished.
        self.assertTrue(
            all([job.status() is JobStatus.DONE for job in job_array]))
        self.assertTrue(all([result.success for result in result_array]))

        # Ensure job ids are unique.
        job_ids = [job.job_id() for job in job_array]
        self.assertEqual(sorted(job_ids), sorted(list(set(job_ids))))
Beispiel #25
0
    def test_run_job(self, qe_token, qe_url):
        """Test running a job against a simulator."""
        _ = self._get_client(qe_token, qe_url)
        IBMQ.enable_account(qe_token, qe_url)

        # Create a Qobj.
        backend_name = 'ibmq_qasm_simulator'
        backend = IBMQ.get_backend(backend_name)
        qobj = compile(self.qc1, backend=backend, seed=self.seed, shots=1)

        # Run the job through the IBMQClient directly.
        api = backend._api
        job = api.run_job(qobj.as_dict(), backend_name)

        self.assertIn('status', job)
        self.assertIsNotNone(job['status'])
Beispiel #26
0
    def test_conditional_operation(self):
        """Test conditional operation."""
        qr = QuantumRegister(4)
        cr = ClassicalRegister(4)
        circuit = QuantumCircuit(qr, cr)
        circuit.x(qr[0])
        circuit.x(qr[2])
        circuit.measure(qr[0], cr[0])
        circuit.x(qr[0]).c_if(cr, 1)

        qobj = compile(circuit, self._remote_backend)
        result_remote = self._remote_backend.run(qobj).result()
        result_local = self._local_backend.run(qobj).result()
        self.assertDictAlmostEqual(result_remote.get_counts(circuit),
                                   result_local.get_counts(circuit),
                                   delta=50)
    def test_execute_one_circuit_simulator_online(self, qe_token, qe_url):
        """Test execute_one_circuit_simulator_online."""
        IBMQ.enable_account(qe_token, qe_url)
        backend = IBMQ.get_backend('ibmq_qasm_simulator')

        qr = QuantumRegister(1)
        cr = ClassicalRegister(1)
        qc = QuantumCircuit(qr, cr, name='qc')
        qc.h(qr[0])
        qc.measure(qr[0], cr[0])
        qobj = compile(qc, backend=backend, seed=73846087)
        shots = qobj.config.shots
        job = backend.run(qobj)
        result = job.result()
        counts = result.get_counts(qc)
        target = {'0': shots / 2, '1': shots / 2}
        threshold = 0.04 * shots
        self.assertDictAlmostEqual(counts, target, threshold)
Beispiel #28
0
    def test_get_job_includes(self, qe_token, qe_url):
        """Check the field includes parameter for get_job."""
        _ = self._get_api(qe_token, qe_url)
        IBMQ.enable_account(qe_token, qe_url)

        backend_name = 'ibmq_qasm_simulator'
        backend = IBMQ.get_backend(backend_name)
        qobj = compile([self.qc1, self.qc2],
                       backend=backend, seed=self.seed, shots=1)

        api = backend._api
        job = api.run_job(qobj.as_dict(), backend_name)
        job_id = job['id']

        # Get the job, excluding a parameter.
        self.assertIn('deleted', job)
        job_excluded = api.get_job(job_id, exclude_fields=['deleted'])
        self.assertNotIn('deleted', job_excluded)
    def test_run_device(self, qe_token, qe_url):
        """Test running in a real device."""
        IBMQ.enable_account(qe_token, qe_url)
        backend = least_busy(IBMQ.backends(simulator=False))

        qobj = compile(self._qc, backend)
        shots = qobj.config.shots
        job = backend.run(qobj)
        while not job.status() is JobStatus.DONE:
            time.sleep(4)

        result = job.result()
        counts_qx = result.get_counts(0)
        counts_ex = {'00': shots/2, '11': shots/2}
        self.assertDictAlmostEqual(counts_qx, counts_ex, shots*0.1)

        # Test fetching the job properties, as this is a real backend and is
        # guaranteed to have them.
        _ = job.properties()
    def test_qobj_headers_in_result_devices(self, qe_token, qe_url):
        """Test that the qobj headers are passed onto the results for devices."""
        IBMQ.enable_account(qe_token, qe_url)
        backends = IBMQ.backends(simulator=False)

        custom_qobj_header = {'x': 1, 'y': [1, 2, 3], 'z': {'a': 4}}

        for backend in backends:
            with self.subTest(backend=backend):
                qobj = compile(self.qc1, backend)

                # Update the Qobj header.
                qobj.header = QobjHeader.from_dict(custom_qobj_header)
                # Update the Qobj.experiment header.
                qobj.experiments[0].header.some_field = 'extra info'

                result = backend.run(qobj).result()
                self.assertEqual(result.header.to_dict(), custom_qobj_header)
                self.assertEqual(result.results[0].header.some_field,
                                 'extra info')