I'm working on a project involving quantum support vector machines using the method from the Quantum Kernel Machine Learning Tutorial by the Qiskit community. While implementing the code on a real IBM quantum machine, I encountered CircuitError: "name conflict adding parameter 'x[1]'" error.
Has anyone faced this issue, or does anyone know how to resolve it? Any insights would be appreciated!
Code:
from qiskit_ibm_runtime import QiskitRuntimeService, Sampler, Session
from qiskit_machine_learning.datasets import ad_hoc_data
from qiskit import transpile
from qiskit.circuit.library import ZZFeatureMap
from qiskit_algorithms.state_fidelities import ComputeUncompute
from qiskit_machine_learning.kernels import FidelityQuantumKernel
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
# Load Dataset
adhoc_dimension = 2
train_features, train_labels, test_features, test_labels, adhoc_total = ad_hoc_data(
training_size=20,
test_size=5,
n=adhoc_dimension,
gap=0.3,
plot_data=False,
one_hot=False,
include_sample_total=True,
)
# initialize backend service
service = QiskitRuntimeService()
n_qubits=2
backend = service.least_busy(operational=True, simulator=False, min_num_qubits=n_qubits)
adhoc_feature_map = ZZFeatureMap(feature_dimension=adhoc_dimension, reps=2, entanglement="linear")
#transpile circuit
pass_manager = generate_preset_pass_manager(optimization_level=1, backend=backend)
isa_circuit = pass_manager.run(adhoc_feature_map)
# calculate kernel matrices
with Session(service= service, backend=backend) as session:
sampler = Sampler(backend)
fidelity = ComputeUncompute(sampler=sampler)
adhoc_kernel = FidelityQuantumKernel(fidelity=fidelity, feature_map=isa_circuit)
adhoc_matrix_train = adhoc_kernel.evaluate(x_vec=train_features,y_vec=train_features)
adhoc_matrix_test = adhoc_kernel.evaluate(x_vec=test_features, y_vec=train_features)
Got following error:
---------------------------------------------------------------------------
CircuitError Traceback (most recent call last)
Cell In[51], line 7
4 fidelity = ComputeUncompute(sampler=sampler)
6 adhoc_kernel = FidelityQuantumKernel(fidelity=fidelity, feature_map=isa_circuit)
----> 7 adhoc_matrix_train = adhoc_kernel.evaluate(x_vec=train_features,y_vec=train_features)
8 adhoc_matrix_test = adhoc_kernel.evaluate(x_vec=test_features, y_vec=train_features)
File ~/Desktop/IMB/machine/lib/python3.11/site-packages/qiskit_machine_learning/kernels/fidelity_quantum_kernel.py:114, in FidelityQuantumKernel.evaluate(self, x_vec, y_vec)
112 if is_symmetric:
113 left_parameters, right_parameters, indices = self._get_symmetric_parameterization(x_vec)
--> 114 kernel_matrix = self._get_symmetric_kernel_matrix(
115 kernel_shape, left_parameters, right_parameters, indices
116 )
117 else:
118 left_parameters, right_parameters, indices = self._get_parameterization(x_vec, y_vec)
File ~/Desktop/IMB/machine/lib/python3.11/site-packages/qiskit_machine_learning/kernels/fidelity_quantum_kernel.py:202, in FidelityQuantumKernel._get_symmetric_kernel_matrix(self, kernel_shape, left_parameters, right_parameters, indices)
192 def _get_symmetric_kernel_matrix(
193 self,
194 kernel_shape: tuple[int, int],
(...)
197 indices: KernelIndices,
198 ) -> np.ndarray:
199 """
200 Given a set of parameterization, this computes the kernel matrix.
201 """
--> 202 kernel_entries = self._get_kernel_entries(left_parameters, right_parameters)
203 kernel_matrix = np.ones(kernel_shape)
205 for i, (col, row) in enumerate(indices):
File ~/Desktop/IMB/machine/lib/python3.11/site-packages/qiskit_machine_learning/kernels/fidelity_quantum_kernel.py:223, in FidelityQuantumKernel._get_kernel_entries(self, left_parameters, right_parameters)
221 if num_circuits != 0:
222 if self.max_circuits_per_job is None:
--> 223 job = self._fidelity.run(
224 [self._feature_map] * num_circuits,
225 [self._feature_map] * num_circuits,
226 left_parameters,
227 right_parameters,
228 )
229 kernel_entries = job.result().fidelities
230 else:
231 # Determine the number of chunks needed
File ~/Desktop/IMB/machine/lib/python3.11/site-packages/qiskit_algorithms/state_fidelities/base_state_fidelity.py:298, in BaseStateFidelity.run(self, circuits_1, circuits_2, values_1, values_2, options)
270 def run(
271 self,
272 circuits_1: QuantumCircuit | Sequence[QuantumCircuit],
(...)
276 options,
277 ) -> AlgorithmJob:
278 r"""
279 Runs asynchronously the state overlap (fidelity) calculation between two
280 (parametrized) circuits (first and second) for a specific set of parameter
(...)
296 The job's result is an instance of :class:.StateFidelityResult.
297 """
--> 298 job = self._run(circuits_1, circuits_2, values_1, values_2, **options)
300 job.submit()
301 return job
File ~/Desktop/IMB/machine/lib/python3.11/site-packages/qiskit_algorithms/state_fidelities/compute_uncompute.py:147, in ComputeUncompute._run(self, circuits_1, circuits_2, values_1, values_2, options)
116 def _run(
117 self,
118 circuits_1: QuantumCircuit | Sequence[QuantumCircuit],
(...)
122 options,
123 ) -> AlgorithmJob:
124 r"""
125 Computes the state overlap (fidelity) calculation between two
126 (parametrized) circuits (first and second) for a specific set of parameter
(...)
144 AlgorithmError: If the sampler job is not completed successfully.
145 """
--> 147 circuits = self._construct_circuits(circuits_1, circuits_2)
148 if len(circuits) == 0:
149 raise ValueError(
150 "At least one pair of circuits must be defined to calculate the state overlap."
151 )
File ~/Desktop/IMB/machine/lib/python3.11/site-packages/qiskit_algorithms/state_fidelities/base_state_fidelity.py:187, in BaseStateFidelity._construct_circuits(self, circuits_1, circuits_2)
184 # re-parametrize input circuits
185 # TODO: make smarter checks to avoid unnecessary re-parametrizations
186 parameters_1 = ParameterVector("x", circuit_1.num_parameters)
--> 187 parametrized_circuit_1 = circuit_1.assign_parameters(parameters_1)
188 parameters_2 = ParameterVector("y", circuit_2.num_parameters)
189 parametrized_circuit_2 = circuit_2.assign_parameters(parameters_2)
File ~/Desktop/IMB/machine/lib/python3.11/site-packages/qiskit/circuit/quantumcircuit.py:4345, in QuantumCircuit.assign_parameters(self, parameters, inplace, flat_input, strict)
4343 else:
4344 parameter_binds = _ParameterBindsSequence(target._data.parameters, parameters)
-> 4345 target._data.assign_parameters_iterable(parameters)
4347 # Finally, assign the parameters inside any of the calibrations. We don't track these in
4348 # the ParameterTable, so we manually reconstruct things.
4349 def map_calibration(qubits, parameters, schedule):
CircuitError: "name conflict adding parameter 'x[1]'"
```