In [1]:
!pip install pennylane
!pip install jax
Collecting pennylane
Downloading pennylane-0.43.0-py3-none-any.whl.metadata (11 kB)
Requirement already satisfied: scipy in /usr/local/lib/python3.12/dist-packages (from pennylane) (1.16.2)
Requirement already satisfied: networkx in /usr/local/lib/python3.12/dist-packages (from pennylane) (3.5)
Collecting rustworkx>=0.14.0 (from pennylane)
Downloading rustworkx-0.17.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (10 kB)
Requirement already satisfied: autograd in /usr/local/lib/python3.12/dist-packages (from pennylane) (1.8.0)
Collecting appdirs (from pennylane)
Downloading appdirs-1.4.4-py2.py3-none-any.whl.metadata (9.0 kB)
Collecting autoray==0.8.0 (from pennylane)
Downloading autoray-0.8.0-py3-none-any.whl.metadata (6.1 kB)
Requirement already satisfied: cachetools in /usr/local/lib/python3.12/dist-packages (from pennylane) (5.5.2)
Collecting pennylane-lightning>=0.43 (from pennylane)
Downloading pennylane_lightning-0.43.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.metadata (11 kB)
Requirement already satisfied: requests in /usr/local/lib/python3.12/dist-packages (from pennylane) (2.32.4)
Requirement already satisfied: tomlkit in /usr/local/lib/python3.12/dist-packages (from pennylane) (0.13.3)
Requirement already satisfied: typing_extensions in /usr/local/lib/python3.12/dist-packages (from pennylane) (4.15.0)
Requirement already satisfied: packaging in /usr/local/lib/python3.12/dist-packages (from pennylane) (25.0)
Collecting diastatic-malt (from pennylane)
Downloading diastatic_malt-2.15.2-py3-none-any.whl.metadata (2.6 kB)
Requirement already satisfied: numpy in /usr/local/lib/python3.12/dist-packages (from pennylane) (2.0.2)
Collecting scipy-openblas32>=0.3.26 (from pennylane-lightning>=0.43->pennylane)
Downloading scipy_openblas32-0.3.30.0.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.metadata (57 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 57.1/57.1 kB 1.9 MB/s eta 0:00:00
Requirement already satisfied: astunparse in /usr/local/lib/python3.12/dist-packages (from diastatic-malt->pennylane) (1.6.3)
Requirement already satisfied: gast in /usr/local/lib/python3.12/dist-packages (from diastatic-malt->pennylane) (0.6.0)
Requirement already satisfied: termcolor in /usr/local/lib/python3.12/dist-packages (from diastatic-malt->pennylane) (3.1.0)
Requirement already satisfied: charset_normalizer<4,>=2 in /usr/local/lib/python3.12/dist-packages (from requests->pennylane) (3.4.4)
Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.12/dist-packages (from requests->pennylane) (3.11)
Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.12/dist-packages (from requests->pennylane) (2.5.0)
Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.12/dist-packages (from requests->pennylane) (2025.10.5)
Requirement already satisfied: wheel<1.0,>=0.23.0 in /usr/local/lib/python3.12/dist-packages (from astunparse->diastatic-malt->pennylane) (0.45.1)
Requirement already satisfied: six<2.0,>=1.6.1 in /usr/local/lib/python3.12/dist-packages (from astunparse->diastatic-malt->pennylane) (1.17.0)
Downloading pennylane-0.43.0-py3-none-any.whl (5.3 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 5.3/5.3 MB 65.1 MB/s eta 0:00:00
Downloading autoray-0.8.0-py3-none-any.whl (934 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 934.3/934.3 kB 52.0 MB/s eta 0:00:00
Downloading pennylane_lightning-0.43.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (2.5 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.5/2.5 MB 73.6 MB/s eta 0:00:00
Downloading rustworkx-0.17.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.2 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.2/2.2 MB 60.9 MB/s eta 0:00:00
Downloading appdirs-1.4.4-py2.py3-none-any.whl (9.6 kB)
Downloading diastatic_malt-2.15.2-py3-none-any.whl (167 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 167.9/167.9 kB 8.6 MB/s eta 0:00:00
Downloading scipy_openblas32-0.3.30.0.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (8.6 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 8.6/8.6 MB 68.1 MB/s eta 0:00:00
Installing collected packages: appdirs, scipy-openblas32, rustworkx, autoray, diastatic-malt, pennylane-lightning, pennylane
Successfully installed appdirs-1.4.4 autoray-0.8.0 diastatic-malt-2.15.2 pennylane-0.43.0 pennylane-lightning-0.43.0 rustworkx-0.17.1 scipy-openblas32-0.3.30.0.2
Requirement already satisfied: jax in /usr/local/lib/python3.12/dist-packages (0.5.3)
Requirement already satisfied: jaxlib<=0.5.3,>=0.5.3 in /usr/local/lib/python3.12/dist-packages (from jax) (0.5.3)
Requirement already satisfied: ml_dtypes>=0.4.0 in /usr/local/lib/python3.12/dist-packages (from jax) (0.5.3)
Requirement already satisfied: numpy>=1.25 in /usr/local/lib/python3.12/dist-packages (from jax) (2.0.2)
Requirement already satisfied: opt_einsum in /usr/local/lib/python3.12/dist-packages (from jax) (3.4.0)
Requirement already satisfied: scipy>=1.11.1 in /usr/local/lib/python3.12/dist-packages (from jax) (1.16.2)
In [2]:
import pennylane as qml
dev = qml.device("default.qubit", wires=2)
@qml.qnode(dev)
def circuit(param):
qml.RX(param, wires=0)
qml.CNOT(wires=[0, 1])
return qml.expval(qml.PauliZ(1))
In [ ]:
import jax
import jax.numpy as jnp
from jax import random, grad
# data
key = random.PRNGKey(42)
x = random.normal(key, (10, 3))
y = jnp.array([[1.0], [0.0], [1.0], [0.0], [1.0],
[0.0], [1.0], [0.0], [1.0], [0.0]])
# init weights
def init_params(key):
k1, k2 = random.split(key)
W1 = random.normal(k1, (3, 4))
b1 = jnp.zeros(4)
W2 = random.normal(k2, (4, 1))
b2 = jnp.zeros(1)
return (W1, b1, W2, b2)
# model
def forward(params, x):
W1, b1, W2, b2 = params
h = jnp.tanh(x @ W1 + b1)
h = jax.nn.sigmoid(h @ W2 + circuit(b2 * jnp.pi))
return h
# loss
def loss_fn(params, x, y):
preds = forward(params, x)
return jnp.mean((preds - y) ** 2)
# training step
@jax.jit
def update(params, x, y, lr=0.1):
grads = grad(loss_fn)(params, x, y)
return jax.tree_util.tree_map(lambda p, g: p - lr * g, params, grads)
# train
params = init_params(key)
for i in range(200):
params = update(params, x, y)
if i % 5 == 0:
print(i, loss_fn(params, x, y))
0 0.30217844 5 0.29236612 10 0.2849971 15 0.27915093 20 0.27423224 25 0.26988873 30 0.26590854 35 0.26215717 40 0.25854278 45 0.25499853 50 0.2514727 55 0.24792306 60 0.2443141 65 0.24061473 70 0.23679791 75 0.23283985 80 0.22872034 85 0.2244227 90 0.21993451 95 0.21524821 100 0.21036112 105 0.20527649 110 0.2000031 115 0.19455588 120 0.188955 125 0.18322562 130 0.17739694 135 0.17150114 140 0.16557209 145 0.15964386 150 0.1537499 155 0.14792159 160 0.14218764 165 0.13657312 170 0.13109954 175 0.12578449 180 0.12064164 185 0.11568117 190 0.110910036 195 0.10633228
In [ ]:
forward(params, x[0,:])
Out[ ]:
Array([0.8505869], dtype=float32)
In [ ]: