Hello, I’m trying to calculate inner products of quantum states directly from qml.state()
and build kernel matrix. My optimizer is qml.AdamOptimizer()
.
And I got TypeError: must be real number, not ArrayBox
when assign quantum state vectors to an numpy array element wise. It seems like the returned state is ArrayBox
type and cannot be assigned to a numpy array element.
Is there any way to solve this?
I also tried to use ArrayBox._value
to assign. However in this way the weights just stayed the same and didn’t update.
Below are my codes:
import pennylane as qml
from pennylane import numpy as np
n_qubits = 5
n_layers = 2
dev = qml.device("default.qubit", wires=n_qubits)
from pennylane.templates import QAOAEmbedding
@qml.qnode(dev, diff_method='backprop')
def circuit(weights, feature):
QAOAEmbedding(features=feature, weights=weights, wires=range(n_qubits))
return qml.state()
from pennylane.init import qaoa_embedding_uniform
weights = qaoa_embedding_uniform(n_layers,n_qubits)
#print(weights)
N = 10
d = 4
X = np.random.uniform(size=(N,d))
#print(X)
# map x to quantum state |x>
def encoder(weights, X):
M = X.shape[0]
features = np.empty((M,2**n_qubits),dtype='complex_')
for i in range(M):
# failed here
features[i] = circuit(weights,X[i])
# features[i] = circuit(weights,X[i])._value
return features
# kernel matrix
def matrix(features):
# <x_i|x_j>
t1 = features @ features.conj().T
# |<x_i|x_j>|^2
t2 = np.multiply(t1,t1.conj())
return np.absolute(t2)
def cost_naive(weights,X=None):
features = encoder(weights,X)
K = matrix(features)
return K.sum()
optim = qml.AdamOptimizer()
for i in range(10):
weights, loss = optim.step_and_cost(cost_naive,weights,X=X)
print(weights[0])
print(loss)