def test_constructor(self): """Tests properties of PegasosQSVC""" with self.subTest("Default parameters"): pegasos_qsvc = PegasosQSVC() self.assertIsInstance(pegasos_qsvc.quantum_kernel, QuantumKernel) self.assertFalse(pegasos_qsvc.precomputed) self.assertEqual(pegasos_qsvc.num_steps, 1000) with self.subTest("PegasosQSVC with QuantumKernel"): qkernel = QuantumKernel( feature_map=self.feature_map, quantum_instance=self.statevector_simulator) pegasos_qsvc = PegasosQSVC(quantum_kernel=qkernel) self.assertIsInstance(pegasos_qsvc.quantum_kernel, QuantumKernel) self.assertFalse(pegasos_qsvc.precomputed) with self.subTest("PegasosQSVC with precomputed kernel"): pegasos_qsvc = PegasosQSVC(precomputed=True) self.assertIsNone(pegasos_qsvc.quantum_kernel) self.assertTrue(pegasos_qsvc.precomputed) with self.subTest("PegasosQSVC with wrong parameters"): qkernel = QuantumKernel( feature_map=self.feature_map, quantum_instance=self.statevector_simulator) with self.assertRaises(ValueError): _ = PegasosQSVC(quantum_kernel=qkernel, precomputed=True) with self.subTest("PegasosQSVC with wrong type of kernel"): with self.assertRaises(TypeError): _ = PegasosQSVC(quantum_kernel=object())
def test_empty_kernel(self): """Test PegasosQSVC with empty QuantumKernel""" qkernel = QuantumKernel() pegasos_qsvc = PegasosQSVC(quantum_kernel=qkernel) with self.assertRaises(QiskitMachineLearningError): pegasos_qsvc.fit(self.sample_train, self.label_train)
def test_qsvc_4d(self): """Test PegasosQSVC with 4-dimensional input data""" qkernel = QuantumKernel(feature_map=self.feature_map_4d, quantum_instance=self.statevector_simulator) pegasos_qsvc = PegasosQSVC(quantum_kernel=qkernel, C=1000, num_steps=self.tau) pegasos_qsvc.fit(self.sample_train_4d, self.label_train_4d) score = pegasos_qsvc.score(self.sample_test_4d, self.label_test_4d) self.assertEqual(score, 1.0)
def test_qsvc(self): """Test PegasosQSVC""" qkernel = QuantumKernel(feature_map=self.feature_map, quantum_instance=self.statevector_simulator) pegasos_qsvc = PegasosQSVC(quantum_kernel=qkernel, C=1000, num_steps=self.tau) pegasos_qsvc.fit(self.sample_train, self.label_train) score = pegasos_qsvc.score(self.sample_test, self.label_test) self.assertEqual(score, 1.0)
def test_decision_function(self): """Test PegasosQSVC.""" qkernel = QuantumKernel(feature_map=self.feature_map, quantum_instance=self.statevector_simulator) pegasos_qsvc = PegasosQSVC(quantum_kernel=qkernel, C=1000, num_steps=self.tau) pegasos_qsvc.fit(self.sample_train, self.label_train) decision_function = pegasos_qsvc.decision_function(self.sample_test) self.assertTrue( np.all((decision_function > 0) == (self.label_test == 0)))
def test_precomputed_kernel(self): """Test PegasosQSVC with a precomputed kernel matrix""" qkernel = QuantumKernel(feature_map=self.feature_map, quantum_instance=self.statevector_simulator) pegasos_qsvc = PegasosQSVC(C=1000, num_steps=self.tau, precomputed=True) # training kernel_matrix_train = qkernel.evaluate(self.sample_train, self.sample_train) pegasos_qsvc.fit(kernel_matrix_train, self.label_train) # testing kernel_matrix_test = qkernel.evaluate(self.sample_test, self.sample_train) score = pegasos_qsvc.score(kernel_matrix_test, self.label_test) self.assertEqual(score, 1.0)
def test_labels(self): """Test PegasosQSVC with different integer labels than {0, 1}""" qkernel = QuantumKernel(feature_map=self.feature_map, quantum_instance=self.statevector_simulator) pegasos_qsvc = PegasosQSVC(quantum_kernel=qkernel, C=1000, num_steps=self.tau) label_train_temp = self.label_train.copy() label_train_temp[self.label_train == 0] = 2 label_train_temp[self.label_train == 1] = 3 label_test_temp = self.label_test.copy() label_test_temp[self.label_test == 0] = 2 label_test_temp[self.label_test == 1] = 3 pegasos_qsvc.fit(self.sample_train, label_train_temp) score = pegasos_qsvc.score(self.sample_test, label_test_temp) self.assertEqual(score, 1.0)
def test_save_load(self): """Tests save and load models.""" features = np.array([[0, 0], [0.1, 0.2], [1, 1], [0.9, 0.8]]) labels = np.array([0, 0, 1, 1]) qkernel = QuantumKernel(feature_map=self.feature_map, quantum_instance=self.statevector_simulator) regressor = PegasosQSVC(quantum_kernel=qkernel, C=1000, num_steps=self.tau) regressor.fit(features, labels) # predicted labels from the newly trained model test_features = np.array([[0.5, 0.5]]) original_predicts = regressor.predict(test_features) # save/load, change the quantum instance and check if predicted values are the same file_name = os.path.join(tempfile.gettempdir(), "pegasos.model") regressor.save(file_name) try: regressor_load = PegasosQSVC.load(file_name) loaded_model_predicts = regressor_load.predict(test_features) np.testing.assert_array_almost_equal(original_predicts, loaded_model_predicts) # test loading warning class FakeModel(SerializableModelMixin): """Fake model class for test purposes.""" pass with self.assertRaises(TypeError): FakeModel.load(file_name) finally: os.remove(file_name)