0

I have a problem in my code for quantum neural network.

I tried to encoding 16 classical vectors to 4 qubits.

The function for amplitude encoding in my code as below:

def amplitude_encoding(num_qubits,x):  
    qc = QuantumCircuit(num_qubits,name ="Amplitude Encoding")
    qc.initialize(x, [0, 1, 2, 3])
    encode = qc.to_instruction()
    return encode

I assigned "parameters" to x with code as below:

self.X = [qiskit.circuit.Parameter('X{}'.format(i)) for i in range(self.n_inputs)]

And I got a same error as below.

How can I solve this problem?

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In [16], line 3
      1 simulator = qiskit.Aer.get_backend('aer_simulator')
----> 3 circuit = QuantumCircuit_fixed(4, simulator, 100)
      4 circuit._circuit.draw('mpl')

Cell In [15], line 21, in QuantumCircuit_fixed.__init__(self, n_qubits, backend, shots)
     18 self.theta = [qiskit.circuit.Parameter('theta{}'.format(j)) for j in range(self.n_inputs)]
     19 print(self.theta)
---> 21 self.feature_map = amplitude_encoding(self.n_qubits, self.X)    
     22 #self.feature_map = RawFeatureVector(16)
     23 self._circuit.append(self.feature_map, range(4))

Cell In [2], line 7, in amplitude_encoding(num_qubits, x)
      5 def amplitude_encoding(num_qubits,x):
      6     qc = QuantumCircuit(num_qubits,name ="Amplitude Encoding")
----> 7     qc.initialize(x, [0, 1, 2, 3])
      8     encode = qc.to_instruction()
      9     return encode

File ~\anaconda3\envs\QISKIT\lib\site-packages\qiskit\extensions\quantum_initializer\initializer.py:191, in initialize(self, params, qubits)
    188     qubits = [qubits]
    189 num_qubits = len(qubits) if isinstance(params, int) else None
--> 191 return self.append(Initialize(params, num_qubits), qubits)

File ~\anaconda3\envs\QISKIT\lib\site-packages\qiskit\extensions\quantum_initializer\initializer.py:57, in Initialize.__init__(self, params, num_qubits)
     36 def __init__(self, params, num_qubits=None):
     37     r"""Create new initialize composite.
     38 
     39     Args:
   (...)
     55             and the remaining 3 qubits to be initialized to :math:`|0\rangle`.
     56     """
---> 57     self._stateprep = StatePreparation(params, num_qubits)
     59     super().__init__("initialize", self._stateprep.num_qubits, 0, self._stateprep.params)

File ~\anaconda3\envs\QISKIT\lib\site-packages\qiskit\circuit\library\data_preparation\state_preparation.py:99, in StatePreparation.__init__(self, params, num_qubits, inverse, label)
     96 self._from_label = isinstance(params, str)
     97 self._from_int = isinstance(params, int)
---> 99 num_qubits = self._get_num_qubits(num_qubits, params)
    101 params = [params] if isinstance(params, int) else params
    103 super().__init__(self._name, num_qubits, params, label=self._label)

File ~\anaconda3\envs\QISKIT\lib\site-packages\qiskit\circuit\library\data_preparation\state_preparation.py:201, in StatePreparation._get_num_qubits(self, num_qubits, params)
    198     raise QiskitError("Desired statevector length not a positive power of 2.")
    200 # Check if probabilities (amplitudes squared) sum to 1
--> 201 if not math.isclose(sum(np.absolute(params) ** 2), 1.0, abs_tol=_EPS):
    202     raise QiskitError("Sum of amplitudes-squared does not equal one.")
    204 num_qubits = int(num_qubits)

TypeError: bad operand type for abs(): 'Parameter'

1 Answers1

0

Your input vector, x, doesn't sum to 1. Because the the state preparation is attempting to encode your x vector into the amplitudes of the state, the 2-norm of the state needs to sum to 1 (i.e. unitary probability). One way to do that is by transforming the x input data first:

x = lambda x: x / np.sqrt(np.sum(x ** 2))

For example:

import numpy as np

x = np.array([[0.8, 0.4],[0.7, 1.3],[-0.1, 0.9],[0.3, 3.1],[0.4, 2.5],[1, 1.2],[0.9, 0.6],[1.3, 0.5]])

def norm(x: np.ndarray) -> np.ndarray:
    return x / np.sqrt(np.sum(x ** 2))

np.sum(norm(x)**2) # This should return 1.0
Greenstick
  • 8,632
  • 1
  • 24
  • 29