I am trying to write a python script which takes sample data outputs from a target function (in my case a sin(x) function) and fits / approximates that function using gradient descent and Variational Quantum Circuits.
My Problem is that everything should be very well written with each function of the code doing it's job perfectly but I get this traceback (Code down below after traceback):
Python\Python312\Lib\site-packages\pennylane\_grad.py:157: UserWarning: Attempted to differentiate a function with no trainable parameters. If this is unintended, please add trainable parameters via the 'requires_grad' attribute or 'argnum' keyword. warnings.warn(Python\Python312\Lib\site-packages\pennylane\workflow\qnode.py:494: UserWarning: Received gradient_kwarg wires, which is not included in the list of standard qnode gradient kwargs. warnings.warn(Traceback (most recent call last): File "TuTest3.py", line 65, in run_vqc params, cost = opt.step(cost_function, init_params, dev=dev) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "Python\Python312\Lib\site-packages\pennylane\optimize\gradient_descent.py", line 93, in step g, _ = self.compute_grad(objective_fn, args, kwargs, grad_fn=grad_fn) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "Python\Python312\Lib\site-packages\pennylane\optimize\gradient_descent.py", line 122, in compute_grad grad = g(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ File "Python\Python312\Lib\site-packages\pennylane\_grad.py", line 162, in __call__ self._forward = self._fun(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^ File "TuTest3.py", line 38, in cost_function y_pred = circuit(params) ^^^^^^^^^^^^^^^ File "Python\Python312\Lib\site-packages\pennylane\workflow\qnode.py", line 1092, in __call__ self.construct(args, kwargs) File "Python\Python312\Lib\site-packages\pennylane\workflow\qnode.py", line 929, in construct self._qfunc_output = self.func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^TypeError: qml_circuit() missing 1 required positional argument: 'wires'Optimization Error: VQC optimization failed.I have no idea what the problem is and would be glad if anyone can help.
This is the code:
import tracebackimport pennylane as qmlimport numpy as np# Define the target function (modify as needed)def target_function(x): return np.sin(x)# Generate sample datax_data = np.linspace(0, 2 * np.pi, 100)y_data = target_function(x_data)# Quantum circuit definitiondef qml_circuit(params, wires):""" This circuit applies Ry rotations to each qubit based on parameters.""" for i, param in enumerate(params): qml.RY(param, wires[i]) # Add your desired quantum operations here (e.g., entangling gates) # Measurement return [qml.expval(qml.PauliZ(wire)) for wire in wires]# Cost function (Mean Squared Error)def cost_function(params, dev):""" Calculates mean squared error between predicted and target function values.""" # Execute the quantum circuit with current parameters circuit = qml.QNode(qml_circuit, wires=dev.wires, device=dev) y_pred = circuit(params) # Calculate mean squared error return np.mean((y_data - y_pred) ** 2)# VQC Optimizationdef run_vqc(n_qubits, n_iters):""" Performs VQC optimization for function approximation. Args: n_qubits: Number of qubits in the quantum circuit. n_iters: Number of optimization iterations.""" try: # Define device and number of qubits dev = qml.device("default.qubit", wires=n_qubits) # Initial parameter guess init_params = np.random.rand(n_qubits) # Select optimizer (Adam in this case) opt = qml.AdamOptimizer(stepsize=0.01) # Perform optimization for n in range(n_iters): params, cost = opt.step(cost_function, init_params, dev=dev) init_params = params # Print optimized parameters print("Optimized Parameters:", params) return params except Exception as e: print(f"Optimization Error: ") traceback.print_exc() return None# Run VQC with default parameters (modify as needed)n_qubits = 2n_iters = 100optimized_params = run_vqc(n_qubits, n_iters)if optimized_params is not None: # Evaluation (if optimization successful) dev = qml.device("default.qubit", wires=n_qubits) circuit = qml.QNode(qml_circuit, wires=dev.wires, device=dev) new_x = np.linspace(0, np.pi * 2, 50) # Test data points y_pred = target_function(new_x) # True target values predicted_y = circuit(optimized_params) # Print comparison between predicted and target values print("Predicted vs. Target:") for x, y_t, y_p in zip(new_x, y_pred, predicted_y): print(f"x: {x:.2f}, Target: {y_t:.4f}, Predicted: {y_p:.4f}")else: print("VQC optimization failed.")