When running opt.step_and_cost on a circuit which takes an jagged array as input ( where the input is a list of unitary matrices of different sizes), I am getting the following error: ValueError: array is not broadcastable to correct shape. To have the unitary matrices in the circuit, I am using qml.QubitUnitary. Why is this happening?
Hey @Mushahid_Khan! Welcome to the forum !
Are you able to share your code that reproduces that error? It will help me point out what’s happening and show you how to correct it
Hi here is the code Sorry i don’t know how to upload the code as code here. Its showing it as just text without proper indendentation.
Here mps_unitaries is a list of unitary matrices:
dev = qml.device(“default.qubit”, wires=16)
@qml.qnode(dev)
def circuit(weights):
for wire in range(15):
unitary = mps_unitaries[wire]
n_qubits = int(np.log2(unitary.shape[0]))
u_wires = [wire] + list(range(wire+1, wire+16))
qml.QubitUnitary(unitary, wires=u_wires)
return qml.probs(wires=range(n_wires))
Thank you so much
Hey @Mushahid_Khan, thanks for the reply! I need your entire code in order to try to replicate your error and attempt to provide a fix . There are lots of parts missing (e.g., the function mps_unitaries
). Are you able to provide the full code that produces the error you’re getting?
Hi I dont have access to those methods, but to put simply, mps_unitaries is an array filled with unitaries U that we see on the circuit. They are unitaries of different shape ranging from 4 by 4 to 32 by 32.
Are you optimizing circuit
? If so, weights
isn’t getting called, which is what I assume you want to differentiate over .
Anyway, there’s a lot missing besides mps_unitaries
, like your optimization steps, the definition of weights
, etc. I’ll need to see everything to try and replicate your error :). Since you don’t have access to mps_unitaries
, can you adapt your code to try and reproduce the error from this:
import pennylane as qml
from pennylane import numpy as np
n_wires = 5
dev = qml.device("default.qubit", wires=n_wires)
mat = qml.RX.compute_matrix(np.pi/4)
num_unitaries = 4
random_wires = np.random.randint(2, 5, size=num_unitaries)
unitaries = []
for i in range(num_unitaries):
num_wires = random_wires[i]
tmp = mat # accumulate tensor products here
for w in range(num_wires - 1):
tmp = np.kron(tmp, mat)
unitaries.append(tmp)
@qml.qnode(dev)
def circuit():
for u, w in zip(unitaries, random_wires):
qml.QubitUnitary(u, wires=range(w))
return qml.probs(wires=range(n_wires))
Here, all I’m doing is inserting a bunch of RX gate unitaries as a substitute for mps_unitaries
, although I’m not 100% sure if the intention is true to what you’re trying to accomplish.