Hi PennyLane Community,
I am trying to track Quantum State Preparations (circuit executions) in my optimization and plot Energy vs. Number of Circuits, similar to Fig. 4 in “Quantum 5, 567 (2021)”.
I have the following working code that plots Energy vs. Optimization Steps using Gradient Descent (GD) and QNSPSA:
# import pennylane as qml
from pennylane import numpy as np
import matplotlib.pyplot as plt
# Set up the quantum device
n_qubits = 2
shots = 8192 # Fixed number of shots per execution
dev = qml.device("lightning.qubit", wires=n_qubits, shots=shots)
# Define a simple variational circuit
@qml.qnode(dev)
def cost_fn(params):
qml.RX(params[0], wires=0)
qml.RY(params[1], wires=1)
qml.CNOT(wires=[0, 1])
return qml.expval(qml.PauliZ(0) @ qml.PauliZ(1)) # Measure ZZ
# Compute the exact ground state energy
exact_energy = -1.0 # Example target energy (update if needed)
# Optimizers
gd_optimizer = qml.GradientDescentOptimizer(stepsize=0.1)
qnspsa_optimizer = qml.QNSPSAOptimizer(stepsize=0.1, resamplings=10)
# Initialize parameters
np.random.seed(42)
params_gd = np.random.uniform(-np.pi, np.pi, size=(2,))
params_qnspsa = np.copy(params_gd)
# Store energy history
energy_history_gd = []
energy_history_qnspsa = []
# Number of optimization steps
n_iterations = 50
# Optimization loop
for i in range(n_iterations):
# GD step
params_gd, energy_gd = gd_optimizer.step_and_cost(cost_fn, params_gd)
energy_history_gd.append(energy_gd)
# QNSPSA step
params_qnspsa, energy_qnspsa = qnspsa_optimizer.step_and_cost(cost_fn, params_qnspsa)
energy_history_qnspsa.append(energy_qnspsa)
# Plot Energy vs. Optimization Iterations
plt.figure(figsize=(6, 4))
plt.plot(range(n_iterations), energy_history_gd, label="GD", color="blue") # Solid line for GD
plt.plot(range(n_iterations), energy_history_qnspsa, label="QNSPSA", color="orange") # Solid line for QNSPSA
plt.axhline(y=exact_energy, color='red', linestyle='dashed', label="Target Energy") # Dashed red target line
plt.xlabel("Optimization Iterations")
plt.ylabel("Energy")
plt.title("Energy vs. Optimization Steps")
plt.legend()
plt.grid()
plt.show()
What I Need Help With:
Instead of "Energy vs. Optimization Steps ", I want to track and plot “Energy vs. Quantum State Preparations (circuit executions)”.
Any guidance or example code would be greatly appreciated!
Thanks in advance!