Hello pennylane help team, I am having difficulty applying QNG to a circuit that has been mitigated using ZNE, can you help me to solve this problem, I am very grateful for that.
import pennylane as qml
from pennylane import numpy as np
import matplotlib.pyplot as plt
from pennylane.transforms import mitigate_with_zne
# Define the molecule H2
symbols = ["H", "H"]
coordinates = np.array([0.0, 0.0, 0, 0.0, 0.0, 1.4]) # Bond length = 0.7 Å
# Load the electronic Hamiltonian for H2
H, qubits = qml.qchem.molecular_hamiltonian(
symbols, coordinates, charge=0, basis="sto-3g"
)
# Describe noise model
fcond = qml.noise.wires_in(range(qubits))
noise = qml.noise.partial_wires(qml.DepolarizingChannel, 0.05)
noise_model = qml.NoiseModel({fcond: noise})
# Define ideal and noisy devices
dev_ideal = qml.device("default.mixed", wires=qubits)
dev_noisy = qml.add_noise(dev_ideal, noise_model=noise_model)
# define Ansatz
hf_state = np.array([1, 1, 0, 0], requires_grad=False)
def ansatz(params, wires=[0, 1, 2, 3]):
for i in wires:
qml.RZ(params[3 * i], wires=i)
qml.RY(params[3 * i + 1], wires=i)
qml.RZ(params[3 * i + 2], wires=i)
qml.CNOT(wires=[2, 3])
qml.CNOT(wires=[2, 0])
qml.CNOT(wires=[3, 1])
# Initialize parameters
np.random.seed(0)
init_params = np.random.uniform(0, 2 * np.pi, size=12, requires_grad=True)
step_size = 0.5
# Define cost functions
@qml.qnode(dev_noisy, diff_method="parameter-shift")
def cost_noisy(params):
ansatz(params, wires=range(qubits))
return qml.expval(H)
# define mitigate with zne
scale_factors = [1, 2, 3]
# cost mitigated func
cost_mitigated = mitigate_with_zne(cost_noisy,
scale_factors=scale_factors,
folding=qml.transforms.fold_global,
extrapolate=qml.transforms.richardson_extrapolate,
)
opt_mitigated = qml.QNGOptimizer(step_size)
# Optimization loop for mitigated case
params_mitigated = init_params.copy()
energies_mitigated = []
for n in range(50):
params_mitigated, energy = opt_mitigated.step_and_cost(cost_mitigated, params_mitigated)
energies_mitigated.append(energy)
print(f"Noisy Iteration {n + 1}: Energy = {energy:.8f} Ha")
This is the error from the code above
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-140-7a8f4d29cb27> in <cell line: 0>()
5 energies_mitigated = []
6 for n in range(50):
----> 7 params_mitigated, energy = opt_mitigated.step_and_cost(cost_mitigated, params_mitigated)
8 energies_mitigated.append(energy)
9 print(f"Noisy Iteration {n + 1}: Energy = {energy:.8f} Ha")
14 frames
/usr/local/lib/python3.11/dist-packages/pennylane/_grad.py in new_f(*args, **kwargs)
259 output = f(*args, **kwargs)
260 if output.__class__.__module__.split(".")[0] not in {"autograd", "pennylane", "numpy"}:
--> 261 raise ValueError(
262 f"autograd can only differentiate with respect to arrays, not {type(output)}. Ensure the output class is an autograd array."
263 )
ValueError: autograd can only differentiate with respect to arrays, not <class 'tuple'>. Ensure the output class is an autograd array.