Thanks @Tenzan_Araki!
In particular, thank you for pointing out that the MultiRZ
operation currently doesnβt have a generator defined β the generator in this case is quite trivial, so we can work on adding support for that.
In the meantime, what you can do is βmonkeypatchβ default.qubit
so that it does not support the MultiRZ
gate. This will cause PennyLane to automatically decompose the MultiRZ
gate down to CNOTs and RZ gates:
dev = qml.device('default.qubit', wires=n_q, shots=1024, analytic=False)
dev.operations.remove("MultiRZ")
@qml.qnode(dev)
def circuit(params):
QAOAEmbedding(features, params, wires=range(n_q), local_field="Y")
return qml.expval(qml.PauliZ(0))
features = [i for i in range(n_q)]
params = qaoa_embedding_normal(n_layers=n_l, n_wires=n_q, mean=0, std=0.2)
opt = qml.QNGOptimizer(stepsize=l_r, diag_approx=True)
for i in range(n_it):
params = opt.step(circuit, params)
This will create the circuit
0: ββRX(0)βββXββRZ(0.207)βββXβββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββCββββββββββββββCββRY(-1.222)ββRX(0)βββXββRZ(-0.032)βββXββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββCβββββββββββββββCββRY(-1.904)ββRX(0)βββ€ β¨Zβ©
1: ββRX(1)βββ°Cββββββββββββββ°CβββXββRZ(-0.607)βββXβββRY(-0.097)ββRX(1)βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ°Cβββββββββββββββ°CβββXββRZ(-0.159)βββXβββRY(-0.025)ββRX(1)βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
2: ββRX(2)ββββββββββββββββββββββ°Cβββββββββββββββ°CβββXβββββββββββRZ(0.082)βββXββRY(-0.069)ββββββRX(2)ββββββββββββββββββββββββββββββββββββββββββββββββββ°Cβββββββββββββββ°CβββXβββββββββββRZ(0.154)βββXββRY(0.189)ββββββRX(2)βββββββββββββββββββββββββββββββ€
3: ββRX(3)ββββββββββββββββββββββββββββββββββββββββββ°Cβββββββββββββββββββββββ°Cβββββββββββββββ°XββRZ(0.377)βββ°XββRY(-0.315)ββRX(3)βββββββββββββββββββββββββββββββββββββββββββ°Cβββββββββββββββββββββββ°Cββββββββββββββ°XββRZ(-0.017)βββ°XββRY(-0.385)ββRX(3)βββ€
With respect to the singular matrix error, I suggest adding in a regularizer to the QNG optimizer, by passing the lam
argument,
opt = QNGOptimizer(stepsize=0.01, diag_approx=True, lam=0.01)
This will add a small identity matrix to the metric tensor to avoid singularities (g\rightarrow g+\lambda I). You may find that you need to increase the regularizer further, sometimes even values of 0.1 are needed.