42Cummer's picture
Upload 15 files
2f560eb verified
import pennylane as qml # type: ignore
import torch # type: ignore
N_QUBITS = 10
N_LAYERS = 3
dev = qml.device("lightning.qubit", wires=N_QUBITS)
@qml.qnode(dev, interface="torch", diff_method="adjoint")
def quantum_circuit(inputs, weights):
# inputs shape: [batch_size, N_QUBITS] (Random Noise)
# weights shape: [N_LAYERS, N_QUBITS, 3] (Parameters)
# 1. ENCODING LAYER (Inject the Randomness)
# We use Angle Embedding to load the noise 'z' into the quantum state.
# PennyLane automatically broadcasts this batch across the wires.
for i in range(N_QUBITS):
qml.RX(inputs[:, i], wires=i)
# 2. VARIATIONAL LAYERS (The "Brain")
# These weights are fixed for the batch, but applied to diverse states.
for l in range(N_LAYERS):
for i in range(N_QUBITS):
qml.RX(weights[l, i, 0], wires=i)
qml.RY(weights[l, i, 1], wires=i)
qml.RZ(weights[l, i, 2], wires=i)
# Circular Entanglement
for i in range(N_QUBITS):
qml.CNOT(wires=[i, (i + 1) % N_QUBITS])
return [qml.expval(qml.PauliZ(i)) for i in range(N_QUBITS)]
if __name__ == "__main__":
weights = torch.randn(N_LAYERS, N_QUBITS, 3)
inputs = torch.randn(N_LAYERS, N_QUBITS)
results = quantum_circuit(inputs, weights)
print(f"Calculated {len(results)} results")