def test_get_experiment_results_returns_correct_value(self):
     number_of_shots = 100
     instructions = [{'name': 'h', 'qubits': [0]},
                     {'name': 'cx', 'qubits': [0, 1]},
                     {'name': 'measure', 'qubits': [1], 'memory': [1]},
                     {'name': 'measure', 'qubits': [0], 'memory': [0]}]
     experiment = self._instructions_to_two_qubit_experiment(instructions)
     api = Mock()
     api.get_result_from_job.return_value = {'id': 1, 'histogram': {'1': 0.6, '3': 0.4},
                                             'execution_time_in_seconds': 2.1, 'number_of_qubits': 2,
                                             'raw_data_url': 'http://saevar-qutech-nginx/api/results/24/raw-data/'}
     api.get_raw_data_from_result.return_value = [1] * 60 + [3] * 40
     jobs = self._basic_job_dictionary
     measurements = QuantumInspireBackend._collect_measurements(experiment)
     user_data = {'name': 'name', 'memory_slots': 2,
                  'creg_sizes': [['c1', 2]], 'measurements': measurements}
     jobs['user_data'] = json.dumps(user_data)
     api.get_jobs_from_project.return_value = [jobs]
     job = QIJob('backend', '42', api)
     simulator = QuantumInspireBackend(api, Mock())
     experiment_result = simulator.get_experiment_results(job)[0]
     self.assertEqual(experiment_result.data.counts['0x1'], 60)
     self.assertEqual(experiment_result.data.counts['0x3'], 40)
     self.assertEqual(experiment_result.data.probabilities['0x1'], 0.6)
     self.assertEqual(experiment_result.data.probabilities['0x3'], 0.4)
     self.assertEqual(len(experiment_result.data.memory), 100)
     self.assertEqual(experiment_result.data.memory.count('0x1'), 60)
     self.assertEqual(experiment_result.data.memory.count('0x3'), 40)
     self.assertEqual(experiment_result.name, 'circuit0')
     self.assertEqual(experiment_result.shots, number_of_shots)
    def run_histogram_test(self, single_experiment, mock_result1, mock_result2,
                           expected_histogram, expected_histogram_prob,
                           expected_memory):
        self.mock_api.set(mock_result1, mock_result2)
        jobs = self._basic_job_dictionary
        measurements = QuantumInspireBackend._collect_measurements(
            QasmQobjExperiment.from_dict(single_experiment))
        user_data = {
            'name': 'name',
            'memory_slots': 2,
            'creg_sizes': [['c1', 2]],
            'measurements': measurements
        }
        jobs['user_data'] = json.dumps(user_data)
        self.mock_api.get_jobs_from_project.return_value = [jobs]
        job = QIJob('backend', '42', self.mock_api)

        result = self.simulator.get_experiment_results_from_all_jobs(job)
        number_of_shots = jobs['number_of_shots']
        self.assertEqual(1, len(result))
        first_experiment = first_item(result)
        actual = first_experiment.data.counts
        self.assertDictEqual(expected_histogram, actual)
        probabilities = first_experiment.data.probabilities
        self.assertTrue(
            len(expected_histogram_prob.keys() - probabilities.keys()) == 0)
        for key in set(probabilities.keys()) & set(
                expected_histogram_prob.keys()):
            self.assertTrue(
                np.isclose(expected_histogram_prob[key], probabilities[key]))
        self.assertTrue(len(first_experiment.data.memory) == number_of_shots)
        self.assertListEqual(expected_memory, first_experiment.data.memory)
    def test_get_experiment_results_multiple_single_shots(self):
        one_shot_results = {'0x0': 0, '0x1': 0, '0x2': 0, '0x3': 0}
        np.random.seed(2019)
        for i in range(10000):
            number_of_shots = 1
            self._basic_job_dictionary['number_of_shots'] = number_of_shots

            qc = QuantumCircuit(2, 2)
            qc.h(0)
            qc.cx(0, 1)
            qc.measure(1, 1)
            qc.measure(0, 0)

            experiment = self._circuit_to_experiment(qc)
            api = Mock()
            api.get_result_from_job.return_value = {
                'id':
                1,
                'histogram': {
                    '0': 0.2,
                    '1': 0.3,
                    '2': 0.4,
                    '3': 0.1
                },
                'execution_time_in_seconds':
                2.1,
                'number_of_qubits':
                2,
                'raw_data_url':
                'http://saevar-qutech-nginx/api/results/24/raw-data/'
            }
            api.get_raw_data_from_result.return_value = []
            jobs = self._basic_job_dictionary
            measurements = QuantumInspireBackend._collect_measurements(
                experiment)
            user_data = {
                'name': 'name',
                'memory_slots': 2,
                'creg_sizes': [['c1', 2]],
                'measurements': measurements
            }
            jobs['user_data'] = json.dumps(user_data)
            api.get_jobs_from_project.return_value = [jobs]
            job = QIJob('backend', '42', api)
            simulator = QuantumInspireBackend(api, Mock())
            experiment_result = simulator.get_experiment_results_from_all_jobs(
                job)[0]
            # Exactly one value in memory
            self.assertEqual(len(experiment_result.data.memory), 1)
            # The only value in memory is the same as the value in the counts histogram.
            self.assertEqual(
                list(experiment_result.data.counts.keys())[0],
                experiment_result.data.memory[0])
            one_shot_results[experiment_result.data.memory[0]] += 1

        self.assertEqual(one_shot_results['0x0'], 2066)
        self.assertEqual(one_shot_results['0x1'], 2947)
        self.assertEqual(one_shot_results['0x2'], 4003)
        self.assertEqual(one_shot_results['0x3'], 984)
    def test__collect_measurements(self):
        instructions = [{'name': 'cx', 'qubits': [0, 1]},
                        {'name': 'measure', 'qubits': [0], 'memory': [1]},
                        {'name': 'measure', 'qubits': [1], 'memory': [0]}]
        experiment = self._instructions_to_two_qubit_experiment(instructions)

        measurements = QuantumInspireBackend._collect_measurements(experiment)
        self.assertDictEqual(measurements, {'measurements': [[1, 0], [0, 1]], 'number_of_clbits': 2})
    def test_get_experiment_results_returns_single_shot(self):
        number_of_shots = 1
        self._basic_job_dictionary['number_of_shots'] = number_of_shots

        qc = QuantumCircuit(2, 2)
        qc.h(0)
        qc.cx(0, 1)
        qc.measure(1, 1)
        qc.measure(0, 0)

        experiment = self._circuit_to_experiment(qc)

        api = Mock()
        api.get_result_from_job.return_value = {
            'id': 1,
            'histogram': {
                '0': 0.5,
                '3': 0.5
            },
            'execution_time_in_seconds': 2.1,
            'number_of_qubits': 2,
            'raw_data_url':
            'http://saevar-qutech-nginx/api/results/24/raw-data/'
        }
        api.get_raw_data_from_result.return_value = []
        api.get_backend_type_by_name.return_value = {
            'max_number_of_shots': 4096
        }
        jobs = self._basic_job_dictionary
        measurements = QuantumInspireBackend._collect_measurements(experiment)
        user_data = {
            'name': 'name',
            'memory_slots': 2,
            'creg_sizes': [['c1', 2]],
            'measurements': measurements
        }
        jobs['user_data'] = json.dumps(user_data)
        api.get_jobs_from_project.return_value = [jobs]
        job = QIJob('backend', '42', api)
        simulator = QuantumInspireBackend(api, Mock())
        experiment_result = simulator.get_experiment_results_from_all_jobs(
            job)[0]
        self.assertEqual(experiment_result.data.probabilities['0x0'], 0.5)
        self.assertEqual(experiment_result.data.probabilities['0x3'], 0.5)
        self.assertTrue(hasattr(experiment_result.data, 'memory'))
        # Exactly one value in counts histogram
        self.assertEqual(len(experiment_result.data.counts), 1)
        # The single value in counts histogram has count 1
        self.assertEqual(list(experiment_result.data.counts.values())[0], 1)
        # Exactly one value in memory
        self.assertEqual(len(experiment_result.data.memory), 1)
        # The only value in memory is the same as the value in the counts histogram.
        self.assertEqual(
            list(experiment_result.data.counts.keys())[0],
            experiment_result.data.memory[0])
        self.assertEqual(experiment_result.name, 'circuit0')
        self.assertEqual(experiment_result.shots, number_of_shots)
    def test_collect_measurements_without_measurements(self):
        qc = QuantumCircuit(2, 2)
        qc.cx(0, 1)

        experiment = self._circuit_to_experiment(qc)

        measurements = QuantumInspireBackend._collect_measurements(experiment)
        self.assertDictEqual(measurements, {
            'measurements': [[0, 0], [1, 1]],
            'number_of_clbits': 2
        })
    def test_get_experiment_results_returns_correct_value_from_latest_run(
            self):
        qc = QuantumCircuit(2, 2)
        qc.h(0)
        qc.cx(0, 1)
        qc.measure(1, 1)
        qc.measure(0, 0)

        number_of_shots = 100
        experiment = self._circuit_to_experiment(qc)

        api = Mock()
        api.get_result_from_job.return_value = {
            'id': 1,
            'histogram': {
                '1': 0.6,
                '3': 0.4
            },
            'execution_time_in_seconds': 2.1,
            'number_of_qubits': 2,
            'raw_data_url':
            'http://saevar-qutech-nginx/api/results/24/raw-data/'
        }
        api.get_raw_data_from_result.return_value = [1] * 60 + [3] * 40
        job = self._basic_job_dictionary
        measurements = QuantumInspireBackend._collect_measurements(experiment)
        user_data = {
            'name': 'name',
            'memory_slots': 2,
            'creg_sizes': [['c1', 2]],
            'measurements': measurements
        }
        job['user_data'] = json.dumps(user_data)

        api.get_job.side_effect = [job]
        quantuminspire_job = Mock()
        quantuminspire_job.get_job_identifier.side_effect = [1]
        qijob = QIJob('backend', '42', api)
        qijob.add_job(quantuminspire_job)

        simulator = QuantumInspireBackend(api, Mock())
        experiment_result = simulator.get_experiment_results_from_latest_run(
            qijob)[0]
        self.assertEqual(experiment_result.data.counts['0x1'], 60)
        self.assertEqual(experiment_result.data.counts['0x3'], 40)
        self.assertEqual(experiment_result.data.probabilities['0x1'], 0.6)
        self.assertEqual(experiment_result.data.probabilities['0x3'], 0.4)
        self.assertEqual(len(experiment_result.data.memory), 100)
        self.assertEqual(experiment_result.data.memory.count('0x1'), 60)
        self.assertEqual(experiment_result.data.memory.count('0x3'), 40)
        self.assertEqual(experiment_result.name, 'circuit0')
        self.assertEqual(experiment_result.shots, number_of_shots)
Example #8
0
 def test_get_experiment_results_returns_single_shot(self):
     number_of_shots = 1
     self._basic_job_dictionary['number_of_shots'] = number_of_shots
     instructions = [{
         'name': 'h',
         'params': [],
         'texparams': [],
         'qubits': [0]
     }, {
         'name': 'cx',
         'params': [],
         'texparams': [],
         'qubits': [0, 1]
     }, {
         'name': 'measure',
         'qubits': [1],
         'memory': [1]
     }, {
         'name': 'measure',
         'qubits': [0],
         'memory': [0]
     }]
     experiment = self._instructions_to_two_qubit_experiment(instructions)
     api = Mock()
     api.get_result_from_job.return_value = {
         'id': 1,
         'histogram': {
             '0': 0.5,
             '3': 0.5
         },
         'execution_time_in_seconds': 2.1,
         'number_of_qubits': 2,
         'raw_data_url':
         'http://saevar-qutech-nginx/api/results/24/raw-data/'
     }
     api.get_raw_data_from_result.return_value = []
     jobs = self._basic_job_dictionary
     measurements = QuantumInspireBackend._collect_measurements(experiment)
     user_data = {
         'name': 'name',
         'memory_slots': 2,
         'creg_sizes': [['c1', 2]],
         'measurements': measurements
     }
     jobs['user_data'] = json.dumps(user_data)
     api.get_jobs_from_project.return_value = [jobs]
     job = QIJob('backend', '42', api)
     simulator = QuantumInspireBackend(api, Mock())
     experiment_result = simulator.get_experiment_results(job)[0]
     self.assertEqual(experiment_result.data.probabilities.to_dict()['0x0'],
                      0.5)
     self.assertEqual(experiment_result.data.probabilities.to_dict()['0x3'],
                      0.5)
     self.assertEqual('memory' in experiment_result.data.to_dict(), True)
     # Exactly one value in counts histogram
     self.assertEqual(len(experiment_result.data.counts.to_dict()), 1)
     # The single value in counts histogram has count 1
     self.assertEqual(
         list(experiment_result.data.counts.to_dict().values())[0], 1)
     # Exactly one value in memory
     self.assertEqual(len(experiment_result.data.memory), 1)
     # The only value in memory is the same as the value in the counts histogram.
     self.assertEqual(
         list(experiment_result.data.counts.to_dict().keys())[0],
         experiment_result.data.memory[0])
     self.assertEqual(experiment_result.name, 'circuit0')
     self.assertEqual(experiment_result.shots, number_of_shots)