Skip to content

Commit 2ecf056

Browse files
authored
Fix for issue #911 (#926)
1 parent 9725ade commit 2ecf056

File tree

4 files changed

+34
-8
lines changed

4 files changed

+34
-8
lines changed

qiskit_machine_learning/kernels/trainable_fidelity_quantum_kernel.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# This code is part of a Qiskit project.
22
#
3-
# (C) Copyright IBM 2022, 2024.
3+
# (C) Copyright IBM 2022, 2025.
44
#
55
# This code is licensed under the Apache License, Version 2.0. You may
66
# obtain a copy of this license in the LICENSE.txt file in the root directory
@@ -92,13 +92,13 @@ def __init__(
9292
)
9393

9494
# override the num of features defined in the base class
95-
self._num_features = feature_map.num_parameters - self._num_training_parameters
95+
self._num_features = self.feature_map.num_parameters - self._num_training_parameters
9696
self._feature_parameters = [
9797
parameter
98-
for parameter in feature_map.parameters
98+
for parameter in self.feature_map.parameters
9999
if parameter not in self._training_parameters
100100
]
101-
self._parameter_dict = {parameter: None for parameter in feature_map.parameters}
101+
self._parameter_dict = {parameter: None for parameter in self.feature_map.parameters}
102102

103103
def _get_parameterization(
104104
self, x_vec: np.ndarray, y_vec: np.ndarray

qiskit_machine_learning/kernels/trainable_fidelity_statevector_kernel.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# This code is part of a Qiskit project.
22
#
3-
# (C) Copyright IBM 2023.
3+
# (C) Copyright IBM 2023, 2025.
44
#
55
# This code is licensed under the Apache License, Version 2.0. You may
66
# obtain a copy of this license in the LICENSE.txt file in the root directory
@@ -88,10 +88,10 @@ def __init__(
8888
)
8989

9090
# Override the number of features defined in the base class.
91-
self._num_features = feature_map.num_parameters - self._num_training_parameters
91+
self._num_features = self.feature_map.num_parameters - self._num_training_parameters
9292
self._feature_parameters = [
9393
parameter
94-
for parameter in feature_map.parameters
94+
for parameter in self.feature_map.parameters
9595
if parameter not in self._training_parameters
9696
]
9797
self._parameter_dict = {parameter: None for parameter in self.feature_map.parameters}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
fixes:
3+
- |
4+
Fixed a bug in :class:`.TrainableFidelityQuantumKernel` and
5+
:class:`.TrainableFidelityStatevectorKernel` where not passing a feature map
6+
(or explicitly passing None to do the equivalent) would fail internally with
7+
a NoneType AttributeError as described by
8+
`issue 911 <https://github.com/qiskit-community/qiskit-machine-learning/issues/911>`__.

test/kernels/test_trainable_fidelity_qkernel.py

+19-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# This code is part of a Qiskit project.
22
#
3-
# (C) Copyright IBM 2021, 2023.
3+
# (C) Copyright IBM 2021, 2025.
44
#
55
# This code is licensed under the Apache License, Version 2.0. You may
66
# obtain a copy of this license in the LICENSE.txt file in the root directory
@@ -181,6 +181,24 @@ def test_properties(self, trainable_kernel_type):
181181
self.assertEqual(len(self.training_parameters), kernel.num_training_parameters)
182182
self.assertEqual(self.num_features, kernel.num_features)
183183

184+
# Testing changes related to the bug fix for
185+
# https://github.com/qiskit-community/qiskit-machine-learning/issues/911
186+
@data(TrainableFidelityQuantumKernel, TrainableFidelityStatevectorKernel)
187+
def test_default_feature_map(self, trainable_kernel_type):
188+
"""Test properties of the trainable quantum kernel."""
189+
with self.subTest("Do not pass feature map at all"):
190+
kernel = trainable_kernel_type()
191+
# The above would crash as per the reference issue. This following checks
192+
# just make sure feature map is present and built as expected
193+
self.assertIsNotNone(kernel.feature_map)
194+
self.assertEqual(len(kernel.feature_map.parameters), 2)
195+
196+
# As above but explicitly pass None
197+
with self.subTest("Pass feature map with value None"):
198+
kernel = trainable_kernel_type(feature_map=None)
199+
self.assertIsNotNone(kernel.feature_map)
200+
self.assertEqual(len(kernel.feature_map.parameters), 2)
201+
184202

185203
if __name__ == "__main__":
186204
unittest.main()

0 commit comments

Comments
 (0)