Skip to content

Incorrect feature_map initialization in TrainableFidelityQuantumKernel #911

@SaashaJoshi

Description

@SaashaJoshi

In the given line of code, when the feature_map = None the TrainableFidelityQuantumKernel doesn't initialize the feature map correctly. Although the base class FidelityQuantumKernel assigns a ZZFeatureMap to the argument, this is not reflected in the child class.

super().__init__(
feature_map=feature_map,
fidelity=fidelity,
training_parameters=training_parameters,
enforce_psd=enforce_psd,
evaluate_duplicates=evaluate_duplicates,
)
# override the num of features defined in the base class
self._num_features = feature_map.num_parameters - self._num_training_parameters

When doing this,

quantum_kernel = TrainableFidelityQuantumKernel(
    fidelity=fidelity,
    feature_map=None,
)

I get the following error,

AttributeError                            Traceback (most recent call last)
Cell In[3], line 6
      2 fidelity = ComputeUncompute(sampler=sampler)
      3 # feature_map = CustomFeatureMap(asset, artifacts).circuit
      4 
      5 # Trainable Fidelity Quantum Kernel has trainable parameters and calculates fidelity.
----> 6 quantum_kernel = TrainableFidelityQuantumKernel(
      7     fidelity=fidelity,
      8 )
     10 # perturbation for calculating the gradient; read more about it. 
     11 # cb_qkt = QKTCallback()
     12 spsa_opt = SPSA(maxiter=10, learning_rate=0.05, perturbation=0.05)

File ~/miniconda3/envs/qiskit/lib/python3.9/site-packages/qiskit_machine_learning/kernels/trainable_fidelity_quantum_kernel.py:95, in TrainableFidelityQuantumKernel.__init__(self, feature_map, fidelity, training_parameters, enforce_psd, evaluate_duplicates)
     86 super().__init__(
     87     feature_map=feature_map,
     88     fidelity=fidelity,
   (...)
     91     evaluate_duplicates=evaluate_duplicates,
     92 )
     94 # override the num of features defined in the base class
---> 95 self._num_features = feature_map.num_parameters - self._num_training_parameters
     96 self._feature_parameters = [
     97     parameter
     98     for parameter in feature_map.parameters
     99     if parameter not in self._training_parameters
    100 ]
    101 self._parameter_dict = {parameter: None for parameter in feature_map.parameters}

AttributeError: 'NoneType' object has no attribute 'num_parameters'

A suggested solution to this problem is,

super().__init__(
            feature_map=feature_map,
            fidelity=fidelity,
            training_parameters=training_parameters,
            enforce_psd=enforce_psd,
            evaluate_duplicates=evaluate_duplicates,
        )

# override the num of features defined in the base class
self._num_features = self.feature_map.num_parameters - self._num_training_parameters

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions