def test_qsvm_variational_callback(self):

        tmp_filename = 'qsvm_callback_test.csv'
        is_file_exist = os.path.exists(self._get_resource_path(tmp_filename))
        if is_file_exist:
            os.remove(self._get_resource_path(tmp_filename))

        def store_intermediate_result(eval_count, parameters, cost, batch_index):
            with open(self._get_resource_path(tmp_filename), 'a') as f:
                content = "{},{},{:.5f},{}".format(eval_count, parameters, cost, batch_index)
                print(content, file=f, flush=True)

        np.random.seed(self.random_seed)
        backend = BasicAer.get_backend('qasm_simulator')

        num_qubits = 2
        optimizer = COBYLA(maxiter=3)
        feature_map = SecondOrderExpansion(num_qubits=num_qubits, depth=2)
        var_form = RY(num_qubits=num_qubits, depth=1)

        svm = QSVMVariational(optimizer, feature_map, var_form, self.training_data,
                              self.testing_data, callback=store_intermediate_result)
        svm.random_seed = self.random_seed
        quantum_instance = QuantumInstance(backend, shots=1024, seed=self.random_seed, seed_mapper=self.random_seed)
        svm.run(quantum_instance)

        is_file_exist = os.path.exists(self._get_resource_path(tmp_filename))
        self.assertTrue(is_file_exist, "Does not store content successfully.")

        # check the content
        # ref_content = [
        #    ["0", "[ 0.18863864 -1.08197582  1.74432295  1.29765602]", "0.53367", "0"],
        #    ["1", "[ 1.18863864 -1.08197582  1.74432295  1.29765602]", "0.57261", "1"],
        #    ["2", "[ 0.18863864 -0.08197582  1.74432295  1.29765602]", "0.47137", "2"]
        #    ]
        ref_content = [
                ['0', '[ 0.18863864 -1.08197582  1.74432295  1.29765602]', '0.54802', '0'],
                ['1', '[ 1.18863864 -1.08197582  1.74432295  1.29765602]', '0.53862', '1'],
                ['2', '[ 1.18863864 -0.08197582  1.74432295  1.29765602]', '0.47278', '2'],
        ]
        try:
            with open(self._get_resource_path(tmp_filename)) as f:
                idx = 0
                for record in f.readlines():
                    eval_count, parameters, cost, batch_index = record.split(",")
                    self.assertEqual(eval_count.strip(), ref_content[idx][0])
                    self.assertEqual(parameters, ref_content[idx][1])
                    self.assertEqual(cost.strip(), ref_content[idx][2])
                    self.assertEqual(batch_index.strip(), ref_content[idx][3])
                    idx += 1
        finally:
            if is_file_exist:
                os.remove(self._get_resource_path(tmp_filename))
Beispiel #2
0
 def test_qsvm_variational_minibatching_with_gradient_support(self):
     n_dim = 2  # dimension of each data point
     seed = 1024
     np.random.seed(seed)
     sample_Total, training_input, test_input, class_labels = ad_hoc_data(
         training_size=20, test_size=10, n=n_dim, gap=0.3)
     backend = BasicAer.get_backend('statevector_simulator')
     num_qubits = n_dim
     optimizer = L_BFGS_B(maxfun=1000)
     feature_map = SecondOrderExpansion(num_qubits=num_qubits, depth=2)
     var_form = RYRZ(num_qubits=num_qubits, depth=3)
     svm = QSVMVariational(optimizer,
                           feature_map,
                           var_form,
                           training_input,
                           test_input,
                           minibatch_size=2)
     aqua_globals.random_seed = seed
     quantum_instance = QuantumInstance(backend, seed=seed)
     result = svm.run(quantum_instance)
     svm_accuracy_threshold = 0.85
     print(result['testing_accuracy'])
     self.assertGreater(result['testing_accuracy'], svm_accuracy_threshold)
Beispiel #3
0
    def test_qsvm_variational_directly(self):
        np.random.seed(self.random_seed)
        backend = BasicAer.get_backend('qasm_simulator')

        num_qubits = 2
        optimizer = SPSA(max_trials=10,
                         save_steps=1,
                         c0=4.0,
                         skip_calibration=True)
        feature_map = SecondOrderExpansion(num_qubits=num_qubits, depth=2)
        var_form = RYRZ(num_qubits=num_qubits, depth=3)

        svm = QSVMVariational(optimizer, feature_map, var_form,
                              self.training_data, self.testing_data)
        aqua_globals.random_seed = self.random_seed
        quantum_instance = QuantumInstance(backend,
                                           shots=1024,
                                           seed=self.random_seed,
                                           seed_mapper=self.random_seed)
        result = svm.run(quantum_instance)

        np.testing.assert_array_almost_equal(result['opt_params'],
                                             self.ref_opt_params,
                                             decimal=4)
        np.testing.assert_array_almost_equal(result['training_loss'],
                                             self.ref_train_loss,
                                             decimal=8)

        self.assertEqual(result['testing_accuracy'], 0.5)

        file_path = self._get_resource_path('qsvm_variational_test.npz')
        svm.save_model(file_path)

        self.assertTrue(os.path.exists(file_path))

        loaded_svm = QSVMVariational(optimizer, feature_map, var_form,
                                     self.training_data, None)
        loaded_svm.load_model(file_path)

        np.testing.assert_array_almost_equal(loaded_svm.ret['opt_params'],
                                             self.ref_opt_params,
                                             decimal=4)

        loaded_test_acc = loaded_svm.test(svm.test_dataset[0],
                                          svm.test_dataset[1],
                                          quantum_instance)
        self.assertEqual(result['testing_accuracy'], loaded_test_acc)

        predicted_probs, predicted_labels = loaded_svm.predict(
            self.testing_data['A'], quantum_instance)
        np.testing.assert_array_almost_equal(predicted_probs,
                                             self.ref_prediction_a_probs,
                                             decimal=8)
        np.testing.assert_array_equal(predicted_labels,
                                      self.ref_prediction_a_label)
        if quantum_instance.has_circuit_caching:
            self.assertLess(quantum_instance._circuit_cache.misses, 3)

        if os.path.exists(file_path):
            try:
                os.remove(file_path)
            except:
                pass