From ee33999cada4c2927bf3e906e0c37e6f697d0602 Mon Sep 17 00:00:00 2001 From: fkiwit Date: Mon, 22 Sep 2025 09:14:35 +0200 Subject: [PATCH 01/29] Add demo on low depth MNIST circuits --- .../low_depth_circuits_mnist/circuit.png | Bin 0 -> 10440 bytes .../low_depth_circuits_mnist/so4.png | Bin 0 -> 3204 bytes .../low_depth_circuits_mnist/demo.py | 610 ++++++++++++++++++ .../low_depth_circuits_mnist/metadata.json | 32 + .../low_depth_circuits_mnist/requirements.in | 11 + 5 files changed, 653 insertions(+) create mode 100644 _static/demonstration_assets/low_depth_circuits_mnist/circuit.png create mode 100644 _static/demonstration_assets/low_depth_circuits_mnist/so4.png create mode 100644 demonstrations_v2/low_depth_circuits_mnist/demo.py create mode 100644 demonstrations_v2/low_depth_circuits_mnist/metadata.json create mode 100644 demonstrations_v2/low_depth_circuits_mnist/requirements.in diff --git a/_static/demonstration_assets/low_depth_circuits_mnist/circuit.png b/_static/demonstration_assets/low_depth_circuits_mnist/circuit.png new file mode 100644 index 0000000000000000000000000000000000000000..f2d13ff89f5f04c9375fa040788cce089cec342c GIT binary patch literal 10440 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] develops an efficient algorithm for finding low-depth +quantum circuits to load classical image data as quantum states. + +This demo gives an introduction to the paper **“Typical Machine Learning Datasets as +Low‑Depth Quantum Circuits”** (2025). We will discuss the following three steps: 1) Quantum image +states, 2) Low-depth image circuits, 3) Training a small variational‑quantum‑circuit (VQC) +classifier on the dataset. +""" + +###################################################################### +# 1. Quantum image states +# ~~~~~~~~~~~~~~~~~~~~~~~ +# +# Images with :math:`2^n` pixels are mapped to states of the form +# :math:`\left| \psi(\mathbf x) \right> = \frac{1}{\sqrt{2^{n}}}\sum_{j=0}^{2^{n}-1} \left| c(x_j) \right> \otimes \left| j \right>`, +# where the **address register** :math:`\left| j\right>` holds the pixel position (:math:`n` qubits), +# and additional **color qubits** :math:`\left| c(x_j)\right>` encode the pixel intensities. For +# grayscale images, we use the *flexible representation of quantum images (FRQI)* +# [`2 <#References>`__,\ `3 <#References>`__] as an encoding. In this case, the data value +# :math:`{x}_j` of each pixel is just a single number corresponding to the grayscale value of that +# pixel. We can encode this information in the :math:`z`-polarization of an additional color qubit as +# :math:`\left|c({x}_j)\right> = \cos({\textstyle\frac{\pi}{2}} {x}_j) \left| 0 \right> + \sin({\textstyle\frac{\pi}{2}} {x}_j) \left| 1 \right>`, +# with the pixel value normalized to :math:`{x}_j \in [0,1]`. Thus, a grayscale image with :math:`2^n` +# pixels is encoded into a quantum state with :math:`n+1` qubits. +# +# For color images, the *multi-channel representation of quantum images (MCRQI)* +# [`4 <#References>`__,\ `5 <#References>`__] can be used. Python implementations of the MCRQI +# encoding and decoding are provided at the end of this demo and are discussed in Ref. +# [`1 <#References>`__]. +# + +from pennylane import numpy as np + +# Grayscale encodings and decodings + + +def FRQI_encoding(images): + """ + Input : (batchsize, N, N) ndarray + A batch of square arrays representing grayscale images. + Returns : (batchsize, 2, N**2) ndarray + A batch of quantum states encoding the grayscale images using the FRQI. + """ + # get image size and number of qubits + batchsize, N, _ = images.shape + n = 2 * int(np.log2(N)) + # reorder pixels hierarchically + states = np.reshape(images, (batchsize, *(2,) * n)) + states = np.transpose( + states, [0] + [ax + 1 for q in range(n // 2) for ax in (q, q + n // 2)] + ) + # FRQI encoding by stacking cos and sin components + states = np.stack([np.cos(np.pi / 2 * states), np.sin(np.pi / 2 * states)], axis=1) + # normalize and reshape + states = np.reshape(states, (batchsize, 2, N**2)) / N + return states + + +def FRQI_decoding(states): + """ + Input : (batchsize, 2, N**2) ndarray + A batch of quantum states encoding grayscale images using the FRQI. + Returns : (batchsize, N, N) ndarray + A batch of square arrays representing the grayscale images. + """ + # get batchsize and number of qubits + batchsize = states.shape[0] + states = np.reshape(states, (batchsize, 2, -1)) + n = int(np.log2(states.shape[2])) + # invert FRQI encoding to get pixel values + images = np.arccos(states[:, 0] ** 2 * 2**n - states[:, 1] ** 2 * 2**n) / np.pi + # undo hierarchical ordering + images = np.reshape(images, (batchsize, *(2,) * n)) + images = np.transpose(images, [0, *range(1, n, 2), *range(2, n + 1, 2)]) + # reshape to square image + images = np.reshape(images, (batchsize, 2 ** (n // 2), 2 ** (n // 2))) + return images + + +###################################################################### +# 2. Low depth image circuits +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# In general, the complexity of preparing the resulting state *exactly* scales exponentially with the +# number of qubits. Known constructions (without auxiliary qubits) use :math:`\mathcal{O}(4^n)` gates +# [`2 <#References>`__,\ `3 <#References>`__]. However, encoding typical images this way leads to +# lowly entangled quantum states that are well approximated by tensor-network states such as +# matrix-product states (MPSs) [`6 <#References>`__] whose bond dimension :math:`\chi` does not need +# to scale with the image resolution. Thus, preparing the state *approximately* with a small error is +# possible with a number of gates that scales only as :math:`\mathcal{O}(\chi^2n)`, i.e., linearly +# with the number of qubits. While the cost of the classical preprocessing may be similar to the exact +# state preparation, the resulting quantum circuits are exponentially more efficient. +# +# The following illustration shows the quantum circuits inspired by MPSs. The left side shows a +# circuit with a staircase pattern with two layers (represented in turquoise and pink), where +# two-qubit gates are applied sequentially, corresponding to a right-canonical MPS. The right side +# shows the proposed circuit architecture corresponding to an MPS in mixed canonical form. By +# effectively shifting the gates with the dashed outlines to the right, the gates are applied +# sequentially outward starting from the center. This reduces the circuit depth while maintaining its +# expressivity. + +# .. figure:: /_static/demonstration_assets/low_depth_circuits_mnist/circuit.png +# :align: center +# :width: 80 % +# :alt: Illustration of quantum circuits inspired by MPSs +# +# Illustration of quantum circuits inspired by MPSs + + +###################################################################### +# Downloading the quantum image dataset +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# The dataset configuration sets the name as ``'low-depth-mnist'`` and constructs the dataset path as +# ``datasets/low-depth-mnist/low-depth-mnist.h5``. For dataset loading, if the file exists locally, it +# is loaded using ``qml.data.Dataset.open``. Otherwise, the dataset is downloaded from the PennyLane +# data repository via ``qml.data.load``, note that the dataset size is approximately 1 GB. +# +# ===================== ============================================================= +# Attribute Description +# ===================== ============================================================= +# ``exact_state`` The exact state that the corresponding circuit should prepare +# ``labels`` The correct labels classifying the corresponding images +# ``circuit_layout_d4`` The layout of the depth 4 circuit +# ``circuit_layout_d8`` The layout of the depth 8 circuit +# ``params_d4`` Parameters for the depth 4 circuit +# ``params_d8`` Parameters for the depth 8 circuit +# ``fidelities_d4`` Fidelities between the depth 4 state and the exact state +# ``fidelities_d8`` Fidelities between the depth 8 state and the exact state +# ===================== ============================================================= +# + +import os +import jax +import pennylane as qml +from tqdm import tqdm + +# JAX supports the single-precision numbers by default. The following line enables double-precision. +jax.config.update("jax_enable_x64", True) +# Set JAX to use CPU, simply set this to 'gpu' or 'tpu' to use those devices. +jax.config.update("jax_platform_name", "cpu") + +# Here you can choose the dataset and the encoding depth, depth 4 and depth 8 are available +DATASET_NAME = "low-depth-mnist" + +dataset_path = f"datasets/{DATASET_NAME}.h5" + +# Load the dataset if already downloaded +if os.path.exists(dataset_path): + dataset_params = qml.data.Dataset.open(dataset_path) +else: + # Download the dataset (~ 1 GB) + [dataset_params] = qml.data.load(DATASET_NAME) + +###################################################################### +# In the following cell, we define the ``get_circuit`` function that creates a quantum circuit based +# on the provided layout. The ``circuit_layout`` is an attribute of the dataset that specifies the +# sequence of quantum gates and their target qubits, which depends on the number of qubits and circuit +# depth. After defining the circuit function, we extract the relevant data for binary classification +# (digits 0 and 1 only) and compute the quantum states by executing the circuits with their +# corresponding parameters. These generated states will be used later for training the quantum +# classifier. +# + +TARGET_LABELS = [0, 1] + + +def get_circuit(circuit_layout): + """ + Create a quantum circuit with a given layout for preparing quantum states. + The circuit only contains RY rotation gates and CNOT gates, designed for efficient + state preparation with low circuit depth. + + :param circuit_layout: List of tuples containing gate types ('RY' or 'CNOT') and their target wires. + :return circuit: A JAX-compiled quantum circuit function that takes parameters and returns the quantum state. + """ + dev = qml.device("default.qubit", wires=11) + + @jax.jit + @qml.qnode(dev) + def circuit(params): + counter = 0 + for gate, wire in circuit_layout: + + if gate == "RY": + qml.RY(params[counter], wire) + counter += 1 + + elif gate == "CNOT": + qml.CNOT(wire) + + return qml.state() + + return circuit + + +# Unpack the dataset attributes, in this demo only digits 0 and 1 will be used +labels = np.asarray(dataset_params.labels) +selection = np.isin(labels, TARGET_LABELS) +labels_01 = labels[selection] +exact_state = np.asarray(dataset_params.exact_state)[selection] + +circuit_layout = dataset_params.circuit_layout_d4 +circuit = get_circuit(circuit_layout) +params_01 = np.asarray(dataset_params.params_d4)[selection] +states_01 = np.asarray( + [circuit(params) for params in tqdm(params_01, desc="States for depth 4")] +) +fidelities_01 = np.asarray(dataset_params.fidelities_d4)[selection] + +###################################################################### +# Reconstructing images from quantum states +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# To investigate how well the low-depth circuits reproduce the target images, we first **reconstruct** +# the pictures encoded in each quantum state. The histogram below reports the *fidelity* +# :math:`F = \left|\langle \psi_{\text{exact}} \mid \psi_{\text{circ.}} \rangle\right|^{2}`, i.e. the +# overlap between the exact FRQI state $ +# \|:raw-latex:`\psi`\_{:raw-latex:`\text{exact}`}:raw-latex:`\rangle `$ and its 4-layer +# center-sequential approximation :math:`|\psi_{\text{circ.}}\rangle`. +# +# - **Digit 1** samples (orange) cluster at a fidelity :math:`F` close to 1, indicating that four +# layers already capture these images almost perfectly. +# - **Digit 0** samples (blue) display a broader, slightly lower-fidelity distribution, hinting at the +# greater entanglement required to reproduce their curved outline. +# +# On the right we decode the states back into pixel space. In line with the histogram, the +# reconstructed “1” is virtually indistinguishable from its original, whereas the reconstructed “0” +# shows minor blurring. By selecting a deeper circuit the quality of the reconstructed images could be +# improved by trading quality for efficiency. +# + +import matplotlib.pyplot as plt + +# Select images with highest fidelity +idx_0 = np.argmax(fidelities_01[labels_01 == 0]) +idx_1 = np.argmax(fidelities_01[labels_01 == 1]) + +orig_0 = FRQI_decoding(exact_state[labels_01 == 0][idx_0][None, :])[0] +orig_1 = FRQI_decoding(exact_state[labels_01 == 1][idx_1][None, :])[0] + +rec_0 = FRQI_decoding(states_01[labels_01 == 0][idx_0][None, :])[0] +rec_1 = FRQI_decoding(states_01[labels_01 == 1][idx_1][None, :])[0] + +# Create a grid of figures to show both the fidelity distribution and the original and reconstructed images +fig = plt.figure(figsize=(9, 5)) +gs = fig.add_gridspec(2, 3, width_ratios=[1.2, 1, 1], wspace=0.05) + +# Histogram (spans both rows, leftmost column) +ax_hist = fig.add_subplot(gs[:, 0]) +ax_hist.hist(fidelities_01[labels_01 == 0], bins=20, alpha=0.5, label="Digit 0") +ax_hist.hist(fidelities_01[labels_01 == 1], bins=20, alpha=0.5, label="Digit 1") +ax_hist.set_xlabel("Fidelity") +ax_hist.set_ylabel("Count") +ax_hist.legend(loc="upper right") + +# Image axes (2 × 2 on the right) +ax00 = fig.add_subplot(gs[0, 1]) +ax01 = fig.add_subplot(gs[0, 2]) +ax10 = fig.add_subplot(gs[1, 1]) +ax11 = fig.add_subplot(gs[1, 2]) + +ax00.imshow(np.abs(orig_0), cmap="gray") +ax00.set_title("Original 0") +ax01.imshow(np.abs(orig_1), cmap="gray") +ax01.set_title("Original 1") +ax10.imshow(np.abs(rec_0), cmap="gray") +ax10.set_title("Reconstructed 0") +ax11.imshow(np.abs(rec_1), cmap="gray") +ax11.set_title("Reconstructed 1") + +# Remove all tick marks from image axes +for ax in [ax00, ax01, ax10, ax11]: + ax.set_xticks([]) + ax.set_yticks([]) + +###################################################################### +# 3. Quantum classifiers +# ---------------------- +# +# In this demo, we train a **variational quantum circuit** as classifier. Our datasets require +# ``N_QUBITS = 11``, therefore we use the same number of qubits for the classifier. Given a data state +# :math:`\rho(x)=\lvert\psi(x)\rangle\langle\psi(x)\rvert`, a generic **quantum classifier** evaluates +# :math:`f_{\ell}(x) = \operatorname{Tr}\bigl[ O_{\ell}(\theta)\,\rho(x) \bigr]`, with trainable +# circuit parameters :math:`\theta` that rotate a measurement operator :math:`O_\ell`. Variants +# explored in the paper [`1 <#References>`__] include +# +# - **Linear VQC** — sequential two‑qubit SU(4) layers (15 parameters per gate). +# - **Non‑linear VQC** — gate parameters depend on input data *x* via auxiliary retrieval circuits. +# - **Quantum‑kernel SVMs** — replacing inner products by quantum state overlaps. +# - **Tensor‑network (MPS/MPO) classifiers** for large qubit counts. +# +# In this demo we use a small linear VQC. The circuit consisits of two qubit gates correspdonding to +# the ``SO(4)`` gates +# +# .. figure:: /_static/demonstration_assets/low_depth_circuits_mnist/so4.png +# :align: center +# :width: 20 % +# :alt: Illustration of the SO(4) decomposition +# +# arranged in the sequential layout. +# + +import optax + +# Define the hyperparameters +EPOCHS = 5 +BATCH = 128 +VAL_FRAC = 0.2 +N_QUBITS = 11 +DEPTH = 4 +N_CLASSES = 2 +SEED = 0 + +# Explicitly compute the number of model parameters +N_PARAMS_FIRST_LAYER = N_QUBITS +N_PARAMS_BLOCK = 4 +N_PARAMS_NETWORK = N_PARAMS_FIRST_LAYER + (N_QUBITS - 1) * DEPTH * N_PARAMS_BLOCK + +key = jax.random.PRNGKey(SEED) + +# Define the model and training functions +dev = qml.device("default.qubit", wires=N_QUBITS) + + +@jax.jit +@qml.qnode(dev, interface="jax") +def circuit(network_params, state): + p = iter(network_params) + qml.StatePrep(state, wires=range(N_QUBITS)) + + # First two layers of local RY rotations + for w in range(N_QUBITS): + qml.RY(next(p), wires=w) + + # SO(4) building blocks + for _ in range(DEPTH): + for j in range(N_QUBITS - 1): + qml.CNOT(wires=[j, j + 1]) + qml.RY(next(p), wires=j) + qml.RY(next(p), wires=j + 1) + qml.CNOT(wires=[j, j + 1]) + qml.RY(next(p), wires=j) + qml.RY(next(p), wires=j + 1) + + # Probability of computational basis states of the last qubit + # Can be extended to more qubits for multiclass case + return qml.probs(N_QUBITS - 1) + + +model = jax.vmap(circuit, in_axes=(None, 0)) + + +def loss_acc(params, batch_x, batch_y): + logits = model(params, batch_x) + loss = optax.softmax_cross_entropy_with_integer_labels(logits, batch_y).mean() + acc = (logits.argmax(-1) == batch_y).mean() + return loss, acc + + +# training step +@jax.jit +def train_step(params, opt_state, batch_x, batch_y): + (loss, acc), grads = jax.value_and_grad( + lambda p: loss_acc(p, batch_x, batch_y), has_aux=True + )(params) + updates, opt_state = opt.update(grads, opt_state, params) + return optax.apply_updates(params, updates), opt_state, loss, acc + + +# data loader +def loader(X, y, batch_size, rng_key): + idx = jax.random.permutation(rng_key, len(X)) + for i in range(0, len(X), batch_size): + sl = idx[i : i + batch_size] + yield X[sl], y[sl] + + +###################################################################### +# Preparing the training / validation split +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# We start by **casting** the FRQI amplitude vectors and their digit labels into JAX arrays. Next, the +# states and labels are shuffled from a pseudorandom key derived from the global ``SEED``. Then, the +# data is split into training and validation. Finally, we gather the tensors corresponding in the +# training ``(X_train, y_train)`` and validation sets ``(X_val, y_val)``. +# + +from jax import numpy as jnp + +# Prepare the data + +X_all = jnp.asarray( + states_01.real, dtype=jnp.float64 +) # we select the real part only, as the the imaginary part is zero since we only use RY and CNOT gates +y_all = jnp.asarray(labels_01, dtype=jnp.int32) + +key_split, key_perm = jax.random.split(jax.random.PRNGKey(SEED)) +perm = jax.random.permutation(key_perm, len(X_all)) +split_pt = int(len(X_all) * (1 - VAL_FRAC)) + +train_idx = perm[:split_pt] +val_idx = perm[split_pt:] + +X_train, y_train = X_all[train_idx], y_all[train_idx] +X_val, y_val = X_all[val_idx], y_all[val_idx] + +###################################################################### +# Training setup and loop +# ~~~~~~~~~~~~~~~~~~~~~~~ +# +# We begin by **initializing** the network weights ``params`` with values drawn uniformly from +# :math:`[0, 2\pi]` and initialize the **Adam optimizer** with a learning rate of +# :math:`1 \times 10^{-2}`. The **training loop** then iterates for ``EPOCHS`` and displays the +# progress via ``tqdm``: +# +# 1. For each mini-batch, ``train_step`` performs a forward pass, computes the cross-entropy loss and +# accuracy, back-propagates gradients, and updates ``params`` through the optimizer state +# ``opt_state``. +# 2. Using the *current* parameters, we evaluate the same metrics on the validation set **without** +# gradient updates. +# 3. Epoch-mean loss (``tl``, ``vl``) and accuracy (``ta``, ``va``) are appended to the tracking lists +# for later plotting. +# +# The first epoch will take longer than following epochs because of the just-in-time compilation. +# + +from tqdm.auto import trange + +# Define the training setup and start the training loop + +# optimizer +params = 2 * jnp.pi * jax.random.uniform(key, (N_PARAMS_NETWORK,), dtype=jnp.float64) +opt = optax.adam(1e-2) +opt_state = opt.init(params) + +# training loop +rng = key_split +train_loss_curve, val_loss_curve = [], [] +train_acc_curve, val_acc_curve = [], [] +# for epoch in range(1, EPOCHS + 1): +bar = trange(1, EPOCHS + 1, desc="Epochs", unit="ep") +for epoch in bar: + # train + rng, sub = jax.random.split(rng) + train_losses, train_accs = [], [] + for bx, by in loader(X_train, y_train, BATCH, sub): + params, opt_state, l, a = train_step(params, opt_state, bx, by) + train_losses.append(l) + train_accs.append(a) + + # validation + val_losses, val_accs = [], [] + for bx, by in loader(X_val, y_val, BATCH, rng): + l, a = loss_acc(params, bx, by) + val_losses.append(l) + val_accs.append(a) + + tl = jnp.mean(jnp.stack(train_losses)) + vl = jnp.mean(jnp.stack(val_losses)) + ta = jnp.mean(jnp.stack(train_accs)) + va = jnp.mean(jnp.stack(val_accs)) + + train_loss_curve.append(tl) + val_loss_curve.append(vl) + train_acc_curve.append(ta) + val_acc_curve.append(va) + bar.set_postfix( + train_loss=f"{tl:.4f}", + val_loss=f"{vl:.4f}", + train_acc=f"{ta:.4f}", + val_acc=f"{va:.4f}", + ) + +# Plot the training curves +( + fig, + ax, +) = plt.subplots(1, 2, figsize=(12.8, 4.8)) +ax[0].plot(train_loss_curve, label="Train") +ax[0].plot(val_loss_curve, label="Validation") +ax[0].set_xlabel("Epoch") +ax[0].set_ylabel("Loss") +ax[0].legend() +ax[1].plot(train_acc_curve) +ax[1].plot(val_acc_curve) +ax[1].set_xlabel("Epoch") +ax[1].set_ylabel("Accuracy") + +###################################################################### +# Conclusion +# ~~~~~~~~~~ +# +# | In this notebook we have demonstrated the use of low-depth quantum circuits to load and +# subsequently classify (a subset of) the MNIST dataset. +# | By filtering to specific target labels, constructing parametrized circuits from the provided +# layouts, and evaluating their states and fidelities, we have gained hands-on experience with +# quantum machine learning workflows on real data encodings. +# +# Explore the full set of `provided +# datasets `__—they contain a +# variety of different datasets at varying circuit depths, parameterizations, and target classes. You +# can adapt the presented workflow to different subsets and datasets, experiment with your own models, +# and contribute back insights on how these benchmark datasets can best support the development of +# practical quantum machine learning approaches. +# + +###################################################################### +# References +# ---------- +# +# [1] F.J. Kiwit, B. Jobst, A. Luckow, F. Pollmann and C.A. Riofrío. Typical Machine Learning Datasets +# as Low-Depth Quantum Circuits. *Quantum Sci. Technol.* in press (2025). DOI: +# https://doi.org/10.1088/2058-9565/ae0123. +# +# [2] P.Q. Le, F. Dong and K. Hirota. A flexible representation of quantum images for polynomial +# preparation, image compression, and processing operations. *Quantum Inf. Process* 10, 63–84 (2011). +# DOI: https://doi.org/10.1007/s11128-010-0177-y. +# +# [3] P.Q. Le, A.M. Iliyasu, F. Dong, and K. Hirota. A Flexible Representation and Invertible +# Transformations for Images on Quantum Computers. In: Ruano, A.E., Várkonyi-Kóczy, A.R. (eds) *New +# Advances in Intelligent Signal Processing. Studies in Computational Intelligence*, vol 372. +# Springer, Berlin, Heidelberg (2011). DOI: https://doi.org/10.1007/978-3-642-11739-8_9. +# +# [4] B. Sun *et al.* A Multi-Channel Representation for images on quantum computers using the RGBα +# color space, 2011 *IEEE 7th International Symposium on Intelligent Signal Processing*, Floriana, +# Malta, pp. 1-6 (2011). DOI: https://doi.org/10.1109/WISP.2011.6051718. +# +# [5] B. Sun, A. Iliyasu, F. Yan, F. Dong, and K. Hirota. An RGB Multi-Channel Representation for +# Images on Quantum Computers, *J. Adv. Comput. Intell. Intell. Inform.*, Vol. 17 No. 3, pp. 404–417 +# (2013). DOI: https://doi.org/10.20965/jaciii.2013.p0404. +# +# [6] B. Jobst, K. Shen, C.A. Riofrío, E. Shishenina and F. Pollmann. Efficient MPS representations +# and quantum circuits from the Fourier modes of classical image data. *Quantum* 8, 1544 (2024). DOI: +# https://doi.org/10.22331/q-2024-12-03-1544. +# + +###################################################################### +# Appendix +# -------- +# + +# The CIFAR-10 and Imagenette datasets use the following MCRQI color encoding and decoding [4,5] + + +def MCRQI_encoding(images): + """ + Input : (batchsize, N, N, 3) ndarray + A batch of arrays representing square RGB images. + Returns : (batchsize, 8, N**2) ndarray + A batch of quantum states encoding the RGB images using the MCRQI. + """ + # get image size and number of qubits + batchsize, N, _, channels = images.shape + n = 2 * int(np.log2(N)) + # reorder pixels hierarchically + states = np.reshape(images, (batchsize, *(2,) * n, channels)) + states = np.transpose( + states, + [0] + [ax + 1 for q in range(n // 2) for ax in (q, q + n // 2)] + [n + 1], + ) + # MCRQI encoding by stacking cos and sin components + states = np.stack( + [ + np.cos(np.pi / 2 * states[..., 0]), + np.cos(np.pi / 2 * states[..., 1]), + np.cos(np.pi / 2 * states[..., 2]), + np.ones(states.shape[:-1]), + np.sin(np.pi / 2 * states[..., 0]), + np.sin(np.pi / 2 * states[..., 1]), + np.sin(np.pi / 2 * states[..., 2]), + np.zeros(states.shape[:-1]), + ], + axis=1, + ) + # normalize and reshape + states = np.reshape(states, (batchsize, 8, N**2)) / (2 * N) + return states + + +def MCRQI_decoding(states): + """ + Input : (batchsize, 8, N**2) ndarray + A batch of quantum states encoding RGB images using the MCRQI. + Returns : (batchsize, N, N, 3) ndarray + A batch of arrays representing the square RGB images. + """ + # get batchsize and number of qubits + batchsize = states.shape[0] + states = np.reshape(states, (batchsize, 8, -1)) + N2 = states.shape[2] + N = int(np.sqrt(N2)) + n = int(np.log2(N2)) + # invert MCRQI encoding to get pixel values + images = ( + np.arccos(states[:, :3] ** 2 * 4 * N2 - states[:, 4:7] ** 2 * 4 * N2) / np.pi + ) + # undo hierarchical ordering + images = np.reshape(images, (batchsize, 3, *(2,) * n)) + images = np.transpose(images, [0, *range(2, n + 1, 2), *range(3, n + 2, 2), 1]) + # reshape to square image + images = np.reshape(images, (batchsize, N, N, 3)) + return images diff --git a/demonstrations_v2/low_depth_circuits_mnist/metadata.json b/demonstrations_v2/low_depth_circuits_mnist/metadata.json new file mode 100644 index 0000000000..5bc8c1fc74 --- /dev/null +++ b/demonstrations_v2/low_depth_circuits_mnist/metadata.json @@ -0,0 +1,32 @@ +{ + "title": "Loading classical data with low-depth circuits", + "authors": [ + { + "username": "flokiwit" + }, + { + "username": "bernhard" + }, + { + "username": "criofrio" + } + ], + "executable_stable": true, + "executable_latest": true, + "dateOfPublication": "2025-09-21T00:00:00+00:00", + "dateOfLastModification": "2025-09-21T00:00:00+00:00", + "categories": [], + "tags": [], + "previewImages": [ + { + "type": "thumbnail", + "uri": "/_static/demo_thumbnails/regular_demo_thumbnails/thumbnail_placeholder.png" + } + ], + "seoDescription": "This demo shows how to efficiently encode classical image data into quantum states using low-depth circuits, and train a variational quantum classifier on a low-depth MNIST dataset.", + "doi": "", + "references": [], + "basedOnPapers": [], + "referencedByPapers": [], + "relatedContent": [] +} \ No newline at end of file diff --git a/demonstrations_v2/low_depth_circuits_mnist/requirements.in b/demonstrations_v2/low_depth_circuits_mnist/requirements.in new file mode 100644 index 0000000000..36cb65be8a --- /dev/null +++ b/demonstrations_v2/low_depth_circuits_mnist/requirements.in @@ -0,0 +1,11 @@ +pennylane==0.42.1 +autoray==0.6.12 +jax==0.4.33 +jaxlib==0.4.33 +optax==0.2.5 +matplotlib==3.10.5 +tqdm==4.67.1 +aiohttp==3.12.15 +h5py==3.14.0 +fsspec==2025.7.0 +ipykernel==6.30.0 \ No newline at end of file From 482b090a1e4bf9ac15652a911734ba0e69fcd089 Mon Sep 17 00:00:00 2001 From: fkiwit Date: Mon, 22 Sep 2025 09:39:47 +0200 Subject: [PATCH 02/29] Fixed the metadata and changed the number of characters to 100 using black --- .../low_depth_circuits_mnist/demo.py | 18 ++--- .../low_depth_circuits_mnist/metadata.json | 76 ++++++++++++++++++- 2 files changed, 79 insertions(+), 15 deletions(-) diff --git a/demonstrations_v2/low_depth_circuits_mnist/demo.py b/demonstrations_v2/low_depth_circuits_mnist/demo.py index 7dbd82620f..fea5fb19eb 100644 --- a/demonstrations_v2/low_depth_circuits_mnist/demo.py +++ b/demonstrations_v2/low_depth_circuits_mnist/demo.py @@ -53,9 +53,7 @@ def FRQI_encoding(images): n = 2 * int(np.log2(N)) # reorder pixels hierarchically states = np.reshape(images, (batchsize, *(2,) * n)) - states = np.transpose( - states, [0] + [ax + 1 for q in range(n // 2) for ax in (q, q + n // 2)] - ) + states = np.transpose(states, [0] + [ax + 1 for q in range(n // 2) for ax in (q, q + n // 2)]) # FRQI encoding by stacking cos and sin components states = np.stack([np.cos(np.pi / 2 * states), np.sin(np.pi / 2 * states)], axis=1) # normalize and reshape @@ -210,9 +208,7 @@ def circuit(params): circuit_layout = dataset_params.circuit_layout_d4 circuit = get_circuit(circuit_layout) params_01 = np.asarray(dataset_params.params_d4)[selection] -states_01 = np.asarray( - [circuit(params) for params in tqdm(params_01, desc="States for depth 4")] -) +states_01 = np.asarray([circuit(params) for params in tqdm(params_01, desc="States for depth 4")]) fidelities_01 = np.asarray(dataset_params.fidelities_d4)[selection] ###################################################################### @@ -368,9 +364,9 @@ def loss_acc(params, batch_x, batch_y): # training step @jax.jit def train_step(params, opt_state, batch_x, batch_y): - (loss, acc), grads = jax.value_and_grad( - lambda p: loss_acc(p, batch_x, batch_y), has_aux=True - )(params) + (loss, acc), grads = jax.value_and_grad(lambda p: loss_acc(p, batch_x, batch_y), has_aux=True)( + params + ) updates, opt_state = opt.update(grads, opt_state, params) return optax.apply_updates(params, updates), opt_state, loss, acc @@ -599,9 +595,7 @@ def MCRQI_decoding(states): N = int(np.sqrt(N2)) n = int(np.log2(N2)) # invert MCRQI encoding to get pixel values - images = ( - np.arccos(states[:, :3] ** 2 * 4 * N2 - states[:, 4:7] ** 2 * 4 * N2) / np.pi - ) + images = np.arccos(states[:, :3] ** 2 * 4 * N2 - states[:, 4:7] ** 2 * 4 * N2) / np.pi # undo hierarchical ordering images = np.reshape(images, (batchsize, 3, *(2,) * n)) images = np.transpose(images, [0, *range(2, n + 1, 2), *range(3, n + 2, 2), 1]) diff --git a/demonstrations_v2/low_depth_circuits_mnist/metadata.json b/demonstrations_v2/low_depth_circuits_mnist/metadata.json index 5bc8c1fc74..5f2ea1fe6b 100644 --- a/demonstrations_v2/low_depth_circuits_mnist/metadata.json +++ b/demonstrations_v2/low_depth_circuits_mnist/metadata.json @@ -15,7 +15,9 @@ "executable_latest": true, "dateOfPublication": "2025-09-21T00:00:00+00:00", "dateOfLastModification": "2025-09-21T00:00:00+00:00", - "categories": [], + "categories": [ + "Quantum Machine Learning" + ], "tags": [], "previewImages": [ { @@ -25,8 +27,76 @@ ], "seoDescription": "This demo shows how to efficiently encode classical image data into quantum states using low-depth circuits, and train a variational quantum classifier on a low-depth MNIST dataset.", "doi": "", - "references": [], - "basedOnPapers": [], + "references": [ + { + "id": "kiwit2025", + "type": "article", + "title": "Typical Machine Learning Datasets as Low-Depth Quantum Circuits", + "authors": "Kiwit, F.J., Jobst, B., Luckow, A., Pollmann, F., Riofrío, C.A.", + "year": "2025", + "journal": "Quantum Sci. Technol.", + "doi": "10.1088/2058-9565/ae0123", + "url": "https://doi.org/10.1088/2058-9565/ae0123" + }, + { + "id": "le2011a", + "type": "article", + "title": "A flexible representation of quantum images for polynomial preparation, image compression, and processing operations", + "authors": "Le, P.Q., Dong, F., Hirota, K.", + "year": "2011", + "journal": "Quantum Inf. Process", + "doi": "10.1007/s11128-010-0177-y", + "url": "https://doi.org/10.1007/s11128-010-0177-y" + }, + { + "id": "le2011b", + "type": "incollection", + "title": "A Flexible Representation and Invertible Transformations for Images on Quantum Computers", + "authors": "Le, P.Q., Iliyasu, A.M., Dong, F., Hirota, K.", + "year": "2011", + "booktitle": "New Advances in Intelligent Signal Processing. Studies in Computational Intelligence, vol 372", + "publisher": "Springer, Berlin, Heidelberg", + "doi": "10.1007/978-3-642-11739-8_9", + "url": "https://doi.org/10.1007/978-3-642-11739-8_9" + }, + { + "id": "sun2011", + "type": "inproceedings", + "title": "A Multi-Channel Representation for Images on Quantum Computers Using the RGBα Color Space", + "authors": "Sun, B. et al.", + "year": "2011", + "booktitle": "2011 IEEE 7th International Symposium on Intelligent Signal Processing, Floriana, Malta", + "pages": "1–6", + "doi": "10.1109/WISP.2011.6051718", + "url": "https://doi.org/10.1109/WISP.2011.6051718" + }, + { + "id": "sun2013", + "type": "article", + "title": "An RGB Multi-Channel Representation for Images on Quantum Computers", + "authors": "Sun, B., Iliyasu, A., Yan, F., Dong, F., Hirota, K.", + "year": "2013", + "journal": "J. Adv. Comput. Intell. Intell. Inform.", + "volume": "17", + "number": "3", + "pages": "404–417", + "doi": "10.20965/jaciii.2013.p0404", + "url": "https://doi.org/10.20965/jaciii.2013.p0404" + }, + { + "id": "jobst2024", + "type": "article", + "title": "Efficient MPS representations and quantum circuits from the Fourier modes of classical image data", + "authors": "Jobst, B., Shen, K., Riofrío, C.A., Shishenina, E., Pollmann, F.", + "year": "2024", + "journal": "Quantum", + "volume": "8", + "pages": "1544", + "doi": "10.22331/q-2024-12-03-1544", + "url": "https://doi.org/10.22331/q-2024-12-03-1544" + } + ], + "basedOnPapers": ["10.1088/2058-9565/ae0123"], "referencedByPapers": [], "relatedContent": [] } \ No newline at end of file From cdba56eedd51b1157bfce2e3b5b826f59bd37a30 Mon Sep 17 00:00:00 2001 From: fkiwit Date: Mon, 22 Sep 2025 10:13:44 +0200 Subject: [PATCH 03/29] Remove redundant packages from demonstrations_v2/low_depth_circuits_mnist/requirements.in and update the reference types in demonstrations_v2/low_depth_circuits_mnist/metadata.json --- .../low_depth_circuits_mnist/metadata.json | 4 ++-- .../low_depth_circuits_mnist/requirements.in | 11 +---------- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/demonstrations_v2/low_depth_circuits_mnist/metadata.json b/demonstrations_v2/low_depth_circuits_mnist/metadata.json index 5f2ea1fe6b..39c520f298 100644 --- a/demonstrations_v2/low_depth_circuits_mnist/metadata.json +++ b/demonstrations_v2/low_depth_circuits_mnist/metadata.json @@ -50,7 +50,7 @@ }, { "id": "le2011b", - "type": "incollection", + "type": "other", "title": "A Flexible Representation and Invertible Transformations for Images on Quantum Computers", "authors": "Le, P.Q., Iliyasu, A.M., Dong, F., Hirota, K.", "year": "2011", @@ -61,7 +61,7 @@ }, { "id": "sun2011", - "type": "inproceedings", + "type": "other", "title": "A Multi-Channel Representation for Images on Quantum Computers Using the RGBα Color Space", "authors": "Sun, B. et al.", "year": "2011", diff --git a/demonstrations_v2/low_depth_circuits_mnist/requirements.in b/demonstrations_v2/low_depth_circuits_mnist/requirements.in index 36cb65be8a..22e889b763 100644 --- a/demonstrations_v2/low_depth_circuits_mnist/requirements.in +++ b/demonstrations_v2/low_depth_circuits_mnist/requirements.in @@ -1,11 +1,2 @@ -pennylane==0.42.1 autoray==0.6.12 -jax==0.4.33 -jaxlib==0.4.33 -optax==0.2.5 -matplotlib==3.10.5 -tqdm==4.67.1 -aiohttp==3.12.15 -h5py==3.14.0 -fsspec==2025.7.0 -ipykernel==6.30.0 \ No newline at end of file +tqdm==4.67.1 \ No newline at end of file From 3c7710f9af28d4bd1c25e573aa3d6b637a057181 Mon Sep 17 00:00:00 2001 From: fkiwit <74311424+fkiwit@users.noreply.github.com> Date: Mon, 6 Oct 2025 22:38:25 +0200 Subject: [PATCH 04/29] Update demonstrations_v2/low_depth_circuits_mnist/demo.py Co-authored-by: Diego <67476785+DSGuala@users.noreply.github.com> --- demonstrations_v2/low_depth_circuits_mnist/demo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demonstrations_v2/low_depth_circuits_mnist/demo.py b/demonstrations_v2/low_depth_circuits_mnist/demo.py index fea5fb19eb..166f8cbb9e 100644 --- a/demonstrations_v2/low_depth_circuits_mnist/demo.py +++ b/demonstrations_v2/low_depth_circuits_mnist/demo.py @@ -103,7 +103,7 @@ def FRQI_decoding(states): # effectively shifting the gates with the dashed outlines to the right, the gates are applied # sequentially outward starting from the center. This reduces the circuit depth while maintaining its # expressivity. - +# # .. figure:: /_static/demonstration_assets/low_depth_circuits_mnist/circuit.png # :align: center # :width: 80 % From 0c0c993674208ccaa3bb59f7a6a2bba93af21760 Mon Sep 17 00:00:00 2001 From: fkiwit <74311424+fkiwit@users.noreply.github.com> Date: Mon, 6 Oct 2025 22:39:13 +0200 Subject: [PATCH 05/29] Update demonstrations_v2/low_depth_circuits_mnist/demo.py Co-authored-by: Diego <67476785+DSGuala@users.noreply.github.com> --- demonstrations_v2/low_depth_circuits_mnist/demo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demonstrations_v2/low_depth_circuits_mnist/demo.py b/demonstrations_v2/low_depth_circuits_mnist/demo.py index 166f8cbb9e..117826c656 100644 --- a/demonstrations_v2/low_depth_circuits_mnist/demo.py +++ b/demonstrations_v2/low_depth_circuits_mnist/demo.py @@ -281,7 +281,7 @@ def circuit(params): # 3. Quantum classifiers # ---------------------- # -# In this demo, we train a **variational quantum circuit** as classifier. Our datasets require +# In this demo, we train a **variational quantum circuit** as a classifier. Our datasets require # ``N_QUBITS = 11``, therefore we use the same number of qubits for the classifier. Given a data state # :math:`\rho(x)=\lvert\psi(x)\rangle\langle\psi(x)\rvert`, a generic **quantum classifier** evaluates # :math:`f_{\ell}(x) = \operatorname{Tr}\bigl[ O_{\ell}(\theta)\,\rho(x) \bigr]`, with trainable From 30e62debe41c4403a9655b81d1743c946787948d Mon Sep 17 00:00:00 2001 From: fkiwit <74311424+fkiwit@users.noreply.github.com> Date: Mon, 6 Oct 2025 22:39:41 +0200 Subject: [PATCH 06/29] Update demonstrations_v2/low_depth_circuits_mnist/demo.py Co-authored-by: Diego <67476785+DSGuala@users.noreply.github.com> --- demonstrations_v2/low_depth_circuits_mnist/demo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demonstrations_v2/low_depth_circuits_mnist/demo.py b/demonstrations_v2/low_depth_circuits_mnist/demo.py index 117826c656..a44f9a84eb 100644 --- a/demonstrations_v2/low_depth_circuits_mnist/demo.py +++ b/demonstrations_v2/low_depth_circuits_mnist/demo.py @@ -293,7 +293,7 @@ def circuit(params): # - **Quantum‑kernel SVMs** — replacing inner products by quantum state overlaps. # - **Tensor‑network (MPS/MPO) classifiers** for large qubit counts. # -# In this demo we use a small linear VQC. The circuit consisits of two qubit gates correspdonding to +# In this demo we use a small linear VQC. The circuit consists of two qubit gates corresponding to # the ``SO(4)`` gates # # .. figure:: /_static/demonstration_assets/low_depth_circuits_mnist/so4.png From fd7f7696e092969da69ae8f4a44c637fd4828e32 Mon Sep 17 00:00:00 2001 From: fkiwit <74311424+fkiwit@users.noreply.github.com> Date: Mon, 6 Oct 2025 22:39:52 +0200 Subject: [PATCH 07/29] Update demonstrations_v2/low_depth_circuits_mnist/demo.py Co-authored-by: Diego <67476785+DSGuala@users.noreply.github.com> --- demonstrations_v2/low_depth_circuits_mnist/demo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demonstrations_v2/low_depth_circuits_mnist/demo.py b/demonstrations_v2/low_depth_circuits_mnist/demo.py index a44f9a84eb..148cf15237 100644 --- a/demonstrations_v2/low_depth_circuits_mnist/demo.py +++ b/demonstrations_v2/low_depth_circuits_mnist/demo.py @@ -1,7 +1,7 @@ r"""Loading classical data with low-depth circuits ============================================== -The encoding of arbitrary classical data into quantum states usually comes at a high computational +Encoding arbitrary classical data into quantum states usually comes at a high computational cost, either in terms of qubits or gate count. However, real-world data typically exhibits some inherent structure (such as image data) which can be leveraged to load them with a much smaller cost on a quantum computer. The paper **“Typical Machine Learning Datasets as Low‑Depth Quantum From c92aa4f54434ed223d2323680b982dc2db065563 Mon Sep 17 00:00:00 2001 From: fkiwit <74311424+fkiwit@users.noreply.github.com> Date: Mon, 6 Oct 2025 22:40:02 +0200 Subject: [PATCH 08/29] Update demonstrations_v2/low_depth_circuits_mnist/demo.py Co-authored-by: Diego <67476785+DSGuala@users.noreply.github.com> --- demonstrations_v2/low_depth_circuits_mnist/demo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demonstrations_v2/low_depth_circuits_mnist/demo.py b/demonstrations_v2/low_depth_circuits_mnist/demo.py index 148cf15237..9e7d7f3c30 100644 --- a/demonstrations_v2/low_depth_circuits_mnist/demo.py +++ b/demonstrations_v2/low_depth_circuits_mnist/demo.py @@ -385,7 +385,7 @@ def loader(X, y, batch_size, rng_key): # # We start by **casting** the FRQI amplitude vectors and their digit labels into JAX arrays. Next, the # states and labels are shuffled from a pseudorandom key derived from the global ``SEED``. Then, the -# data is split into training and validation. Finally, we gather the tensors corresponding in the +# data is split into training and validation. Finally, we gather the tensors corresponding to the # training ``(X_train, y_train)`` and validation sets ``(X_val, y_val)``. # From b874d329fb1b1228bf370f4f4b1240a6152614c5 Mon Sep 17 00:00:00 2001 From: fkiwit <74311424+fkiwit@users.noreply.github.com> Date: Mon, 6 Oct 2025 22:40:20 +0200 Subject: [PATCH 09/29] Update demonstrations_v2/low_depth_circuits_mnist/demo.py Co-authored-by: Diego <67476785+DSGuala@users.noreply.github.com> --- demonstrations_v2/low_depth_circuits_mnist/demo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demonstrations_v2/low_depth_circuits_mnist/demo.py b/demonstrations_v2/low_depth_circuits_mnist/demo.py index 9e7d7f3c30..bb69f7ff71 100644 --- a/demonstrations_v2/low_depth_circuits_mnist/demo.py +++ b/demonstrations_v2/low_depth_circuits_mnist/demo.py @@ -6,7 +6,7 @@ inherent structure (such as image data) which can be leveraged to load them with a much smaller cost on a quantum computer. The paper **“Typical Machine Learning Datasets as Low‑Depth Quantum Circuits”** (2025) [`1 <#References>`__] develops an efficient algorithm for finding low-depth -quantum circuits to load classical image data as quantum states. +quantum circuits to load classical image data into quantum states. This demo gives an introduction to the paper **“Typical Machine Learning Datasets as Low‑Depth Quantum Circuits”** (2025). We will discuss the following three steps: 1) Quantum image From 36a3841bd2d1dcec25523303b0cbb9fc23eb649a Mon Sep 17 00:00:00 2001 From: fkiwit <74311424+fkiwit@users.noreply.github.com> Date: Mon, 6 Oct 2025 22:48:33 +0200 Subject: [PATCH 10/29] Update demonstrations_v2/low_depth_circuits_mnist/demo.py Co-authored-by: Diego <67476785+DSGuala@users.noreply.github.com> --- .../low_depth_circuits_mnist/demo.py | 60 +++++++++++-------- 1 file changed, 36 insertions(+), 24 deletions(-) diff --git a/demonstrations_v2/low_depth_circuits_mnist/demo.py b/demonstrations_v2/low_depth_circuits_mnist/demo.py index bb69f7ff71..b7906a81de 100644 --- a/demonstrations_v2/low_depth_circuits_mnist/demo.py +++ b/demonstrations_v2/low_depth_circuits_mnist/demo.py @@ -512,30 +512,42 @@ def loader(X, y, batch_size, rng_key): # References # ---------- # -# [1] F.J. Kiwit, B. Jobst, A. Luckow, F. Pollmann and C.A. Riofrío. Typical Machine Learning Datasets -# as Low-Depth Quantum Circuits. *Quantum Sci. Technol.* in press (2025). DOI: -# https://doi.org/10.1088/2058-9565/ae0123. -# -# [2] P.Q. Le, F. Dong and K. Hirota. A flexible representation of quantum images for polynomial -# preparation, image compression, and processing operations. *Quantum Inf. Process* 10, 63–84 (2011). -# DOI: https://doi.org/10.1007/s11128-010-0177-y. -# -# [3] P.Q. Le, A.M. Iliyasu, F. Dong, and K. Hirota. A Flexible Representation and Invertible -# Transformations for Images on Quantum Computers. In: Ruano, A.E., Várkonyi-Kóczy, A.R. (eds) *New -# Advances in Intelligent Signal Processing. Studies in Computational Intelligence*, vol 372. -# Springer, Berlin, Heidelberg (2011). DOI: https://doi.org/10.1007/978-3-642-11739-8_9. -# -# [4] B. Sun *et al.* A Multi-Channel Representation for images on quantum computers using the RGBα -# color space, 2011 *IEEE 7th International Symposium on Intelligent Signal Processing*, Floriana, -# Malta, pp. 1-6 (2011). DOI: https://doi.org/10.1109/WISP.2011.6051718. -# -# [5] B. Sun, A. Iliyasu, F. Yan, F. Dong, and K. Hirota. An RGB Multi-Channel Representation for -# Images on Quantum Computers, *J. Adv. Comput. Intell. Intell. Inform.*, Vol. 17 No. 3, pp. 404–417 -# (2013). DOI: https://doi.org/10.20965/jaciii.2013.p0404. -# -# [6] B. Jobst, K. Shen, C.A. Riofrío, E. Shishenina and F. Pollmann. Efficient MPS representations -# and quantum circuits from the Fourier modes of classical image data. *Quantum* 8, 1544 (2024). DOI: -# https://doi.org/10.22331/q-2024-12-03-1544. +# .. [#Kiwit] +# +# F.J. Kiwit, B. Jobst, A. Luckow, F. Pollmann and C.A. Riofrío. Typical Machine Learning Datasets +# as Low-Depth Quantum Circuits. *Quantum Sci. Technol.* in press (2025). DOI: +# https://doi.org/10.1088/2058-9565/ae0123. +# +# .. [#LeFlexible] +# +# P.Q. Le, F. Dong and K. Hirota. A flexible representation of quantum images for polynomial +# preparation, image compression, and processing operations. *Quantum Inf. Process* 10, 63–84 (2011). +# DOI: https://doi.org/10.1007/s11128-010-0177-y. +# +# .. [#LeAdvances] +# +# P.Q. Le, A.M. Iliyasu, F. Dong, and K. Hirota. A Flexible Representation and Invertible +# Transformations for Images on Quantum Computers. In: Ruano, A.E., Várkonyi-Kóczy, A.R. (eds) *New +# Advances in Intelligent Signal Processing. Studies in Computational Intelligence*, vol 372. +# Springer, Berlin, Heidelberg (2011). DOI: https://doi.org/10.1007/978-3-642-11739-8_9. +# +# .. [#SunMulti] +# +# B. Sun *et al.* A Multi-Channel Representation for images on quantum computers using the RGBα +# color space, 2011 *IEEE 7th International Symposium on Intelligent Signal Processing*, Floriana, +# Malta, pp. 1-6 (2011). DOI: https://doi.org/10.1109/WISP.2011.6051718. +# +# .. [#SunRGB] +# +# B. Sun, A. Iliyasu, F. Yan, F. Dong, and K. Hirota. An RGB Multi-Channel Representation for +# Images on Quantum Computers, *J. Adv. Comput. Intell. Intell. Inform.*, Vol. 17 No. 3, pp. 404–417 +# (2013). DOI: https://doi.org/10.20965/jaciii.2013.p0404. +# +# .. [#Jobst] +# +# B. Jobst, K. Shen, C.A. Riofrío, E. Shishenina and F. Pollmann. Efficient MPS representations +# and quantum circuits from the Fourier modes of classical image data. *Quantum* 8, 1544 (2024). DOI: +# https://doi.org/10.22331/q-2024-12-03-1544. # ###################################################################### From b33525f9bf5c7ab9df956a47ac0b8f7ac9addf22 Mon Sep 17 00:00:00 2001 From: fkiwit <74311424+fkiwit@users.noreply.github.com> Date: Mon, 6 Oct 2025 22:50:14 +0200 Subject: [PATCH 11/29] Update demonstrations_v2/low_depth_circuits_mnist/demo.py Co-authored-by: Diego <67476785+DSGuala@users.noreply.github.com> --- demonstrations_v2/low_depth_circuits_mnist/demo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demonstrations_v2/low_depth_circuits_mnist/demo.py b/demonstrations_v2/low_depth_circuits_mnist/demo.py index b7906a81de..7ba4457d3a 100644 --- a/demonstrations_v2/low_depth_circuits_mnist/demo.py +++ b/demonstrations_v2/low_depth_circuits_mnist/demo.py @@ -286,7 +286,7 @@ def circuit(params): # :math:`\rho(x)=\lvert\psi(x)\rangle\langle\psi(x)\rvert`, a generic **quantum classifier** evaluates # :math:`f_{\ell}(x) = \operatorname{Tr}\bigl[ O_{\ell}(\theta)\,\rho(x) \bigr]`, with trainable # circuit parameters :math:`\theta` that rotate a measurement operator :math:`O_\ell`. Variants -# explored in the paper [`1 <#References>`__] include +# explored in the paper [#Kiwit]_ include # # - **Linear VQC** — sequential two‑qubit SU(4) layers (15 parameters per gate). # - **Non‑linear VQC** — gate parameters depend on input data *x* via auxiliary retrieval circuits. From 9684f3054f10b24f9d610e0eb1b14f52ccb66fa4 Mon Sep 17 00:00:00 2001 From: fkiwit <74311424+fkiwit@users.noreply.github.com> Date: Mon, 6 Oct 2025 22:50:38 +0200 Subject: [PATCH 12/29] Update demonstrations_v2/low_depth_circuits_mnist/demo.py Co-authored-by: Diego <67476785+DSGuala@users.noreply.github.com> --- demonstrations_v2/low_depth_circuits_mnist/demo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demonstrations_v2/low_depth_circuits_mnist/demo.py b/demonstrations_v2/low_depth_circuits_mnist/demo.py index 7ba4457d3a..e157f0e655 100644 --- a/demonstrations_v2/low_depth_circuits_mnist/demo.py +++ b/demonstrations_v2/low_depth_circuits_mnist/demo.py @@ -5,7 +5,7 @@ cost, either in terms of qubits or gate count. However, real-world data typically exhibits some inherent structure (such as image data) which can be leveraged to load them with a much smaller cost on a quantum computer. The paper **“Typical Machine Learning Datasets as Low‑Depth Quantum -Circuits”** (2025) [`1 <#References>`__] develops an efficient algorithm for finding low-depth +Circuits”** (2025) [#Kiwit]_ develops an efficient algorithm for finding low-depth quantum circuits to load classical image data into quantum states. This demo gives an introduction to the paper **“Typical Machine Learning Datasets as From dad72d98c2f4228fcabbea72d2164382dbfbc81b Mon Sep 17 00:00:00 2001 From: fkiwit <74311424+fkiwit@users.noreply.github.com> Date: Mon, 6 Oct 2025 22:51:04 +0200 Subject: [PATCH 13/29] Update demonstrations_v2/low_depth_circuits_mnist/demo.py Co-authored-by: Diego <67476785+DSGuala@users.noreply.github.com> --- demonstrations_v2/low_depth_circuits_mnist/demo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demonstrations_v2/low_depth_circuits_mnist/demo.py b/demonstrations_v2/low_depth_circuits_mnist/demo.py index e157f0e655..c18119da8c 100644 --- a/demonstrations_v2/low_depth_circuits_mnist/demo.py +++ b/demonstrations_v2/low_depth_circuits_mnist/demo.py @@ -23,7 +23,7 @@ # where the **address register** :math:`\left| j\right>` holds the pixel position (:math:`n` qubits), # and additional **color qubits** :math:`\left| c(x_j)\right>` encode the pixel intensities. For # grayscale images, we use the *flexible representation of quantum images (FRQI)* -# [`2 <#References>`__,\ `3 <#References>`__] as an encoding. In this case, the data value +# [#LeFlexible]_ [#LeAdvances]_ as an encoding. In this case, the data value # :math:`{x}_j` of each pixel is just a single number corresponding to the grayscale value of that # pixel. We can encode this information in the :math:`z`-polarization of an additional color qubit as # :math:`\left|c({x}_j)\right> = \cos({\textstyle\frac{\pi}{2}} {x}_j) \left| 0 \right> + \sin({\textstyle\frac{\pi}{2}} {x}_j) \left| 1 \right>`, From bbabcd6b78108b00996fb6d445260c21bfbd0af9 Mon Sep 17 00:00:00 2001 From: fkiwit <74311424+fkiwit@users.noreply.github.com> Date: Mon, 6 Oct 2025 22:51:25 +0200 Subject: [PATCH 14/29] Update demonstrations_v2/low_depth_circuits_mnist/demo.py Co-authored-by: Diego <67476785+DSGuala@users.noreply.github.com> --- demonstrations_v2/low_depth_circuits_mnist/demo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demonstrations_v2/low_depth_circuits_mnist/demo.py b/demonstrations_v2/low_depth_circuits_mnist/demo.py index c18119da8c..5e5580bf1b 100644 --- a/demonstrations_v2/low_depth_circuits_mnist/demo.py +++ b/demonstrations_v2/low_depth_circuits_mnist/demo.py @@ -33,7 +33,7 @@ # For color images, the *multi-channel representation of quantum images (MCRQI)* # [`4 <#References>`__,\ `5 <#References>`__] can be used. Python implementations of the MCRQI # encoding and decoding are provided at the end of this demo and are discussed in Ref. -# [`1 <#References>`__]. +# [#Kiwit]_. # from pennylane import numpy as np From 25db1b774da9c6a374715e85ee1146fba3c9949c Mon Sep 17 00:00:00 2001 From: fkiwit <74311424+fkiwit@users.noreply.github.com> Date: Mon, 6 Oct 2025 22:51:43 +0200 Subject: [PATCH 15/29] Update demonstrations_v2/low_depth_circuits_mnist/demo.py Co-authored-by: Diego <67476785+DSGuala@users.noreply.github.com> --- demonstrations_v2/low_depth_circuits_mnist/demo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demonstrations_v2/low_depth_circuits_mnist/demo.py b/demonstrations_v2/low_depth_circuits_mnist/demo.py index 5e5580bf1b..1971b713ae 100644 --- a/demonstrations_v2/low_depth_circuits_mnist/demo.py +++ b/demonstrations_v2/low_depth_circuits_mnist/demo.py @@ -88,7 +88,7 @@ def FRQI_decoding(states): # # In general, the complexity of preparing the resulting state *exactly* scales exponentially with the # number of qubits. Known constructions (without auxiliary qubits) use :math:`\mathcal{O}(4^n)` gates -# [`2 <#References>`__,\ `3 <#References>`__]. However, encoding typical images this way leads to +# [#LeFlexible]_ [#LeAdvances]_. However, encoding typical images this way leads to # lowly entangled quantum states that are well approximated by tensor-network states such as # matrix-product states (MPSs) [`6 <#References>`__] whose bond dimension :math:`\chi` does not need # to scale with the image resolution. Thus, preparing the state *approximately* with a small error is From 7e4ce55f894017d32323f48c03029339af7a2173 Mon Sep 17 00:00:00 2001 From: fkiwit <74311424+fkiwit@users.noreply.github.com> Date: Mon, 6 Oct 2025 22:52:01 +0200 Subject: [PATCH 16/29] Update demonstrations_v2/low_depth_circuits_mnist/demo.py Co-authored-by: Diego <67476785+DSGuala@users.noreply.github.com> --- demonstrations_v2/low_depth_circuits_mnist/demo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demonstrations_v2/low_depth_circuits_mnist/demo.py b/demonstrations_v2/low_depth_circuits_mnist/demo.py index 1971b713ae..500b0dbe1e 100644 --- a/demonstrations_v2/low_depth_circuits_mnist/demo.py +++ b/demonstrations_v2/low_depth_circuits_mnist/demo.py @@ -31,7 +31,7 @@ # pixels is encoded into a quantum state with :math:`n+1` qubits. # # For color images, the *multi-channel representation of quantum images (MCRQI)* -# [`4 <#References>`__,\ `5 <#References>`__] can be used. Python implementations of the MCRQI +# [#SunMulti]_ [#SunRGB]_ can be used. Python implementations of the MCRQI # encoding and decoding are provided at the end of this demo and are discussed in Ref. # [#Kiwit]_. # From 0573e42d4eceb991223ba05fe3aad76871edf5d9 Mon Sep 17 00:00:00 2001 From: fkiwit <74311424+fkiwit@users.noreply.github.com> Date: Mon, 6 Oct 2025 22:52:18 +0200 Subject: [PATCH 17/29] Update demonstrations_v2/low_depth_circuits_mnist/demo.py Co-authored-by: Diego <67476785+DSGuala@users.noreply.github.com> --- demonstrations_v2/low_depth_circuits_mnist/demo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demonstrations_v2/low_depth_circuits_mnist/demo.py b/demonstrations_v2/low_depth_circuits_mnist/demo.py index 500b0dbe1e..a7946edccc 100644 --- a/demonstrations_v2/low_depth_circuits_mnist/demo.py +++ b/demonstrations_v2/low_depth_circuits_mnist/demo.py @@ -90,7 +90,7 @@ def FRQI_decoding(states): # number of qubits. Known constructions (without auxiliary qubits) use :math:`\mathcal{O}(4^n)` gates # [#LeFlexible]_ [#LeAdvances]_. However, encoding typical images this way leads to # lowly entangled quantum states that are well approximated by tensor-network states such as -# matrix-product states (MPSs) [`6 <#References>`__] whose bond dimension :math:`\chi` does not need +# matrix-product states (MPSs) [#Jobst]_ whose bond dimension :math:`\chi` does not need # to scale with the image resolution. Thus, preparing the state *approximately* with a small error is # possible with a number of gates that scales only as :math:`\mathcal{O}(\chi^2n)`, i.e., linearly # with the number of qubits. While the cost of the classical preprocessing may be similar to the exact From 9197f4f5a389369c5f34800522b8076551f52176 Mon Sep 17 00:00:00 2001 From: fkiwit Date: Mon, 6 Oct 2025 23:21:27 +0200 Subject: [PATCH 18/29] Remove tqdm, remove table, add link to pennylane dataset, a bit more details one the three steps --- .../low_depth_circuits_mnist/demo.py | 56 ++++++++----------- 1 file changed, 24 insertions(+), 32 deletions(-) diff --git a/demonstrations_v2/low_depth_circuits_mnist/demo.py b/demonstrations_v2/low_depth_circuits_mnist/demo.py index a7946edccc..041b2f5cab 100644 --- a/demonstrations_v2/low_depth_circuits_mnist/demo.py +++ b/demonstrations_v2/low_depth_circuits_mnist/demo.py @@ -9,9 +9,11 @@ quantum circuits to load classical image data into quantum states. This demo gives an introduction to the paper **“Typical Machine Learning Datasets as -Low‑Depth Quantum Circuits”** (2025). We will discuss the following three steps: 1) Quantum image -states, 2) Low-depth image circuits, 3) Training a small variational‑quantum‑circuit (VQC) -classifier on the dataset. +Low‑Depth Quantum Circuits”** (2025). We will discuss the following three steps: + +1. **Define** how classical images can be encoded as quantum states. +2. **Construct** low-depth quantum circuits that efficiently generate these image states. +3. **Train and evaluate** a small variational quantum circuit (VQC) classifier on the dataset. """ ###################################################################### @@ -121,24 +123,10 @@ def FRQI_decoding(states): # is loaded using ``qml.data.Dataset.open``. Otherwise, the dataset is downloaded from the PennyLane # data repository via ``qml.data.load``, note that the dataset size is approximately 1 GB. # -# ===================== ============================================================= -# Attribute Description -# ===================== ============================================================= -# ``exact_state`` The exact state that the corresponding circuit should prepare -# ``labels`` The correct labels classifying the corresponding images -# ``circuit_layout_d4`` The layout of the depth 4 circuit -# ``circuit_layout_d8`` The layout of the depth 8 circuit -# ``params_d4`` Parameters for the depth 4 circuit -# ``params_d8`` Parameters for the depth 8 circuit -# ``fidelities_d4`` Fidelities between the depth 4 state and the exact state -# ``fidelities_d8`` Fidelities between the depth 8 state and the exact state -# ===================== ============================================================= -# import os import jax import pennylane as qml -from tqdm import tqdm # JAX supports the single-precision numbers by default. The following line enables double-precision. jax.config.update("jax_enable_x64", True) @@ -164,7 +152,8 @@ def FRQI_decoding(states): # depth. After defining the circuit function, we extract the relevant data for binary classification # (digits 0 and 1 only) and compute the quantum states by executing the circuits with their # corresponding parameters. These generated states will be used later for training the quantum -# classifier. +# classifier. You can find more information and download the datasets at +# `PennyLane Datasets: Low-Depth Image Circuits `_. # TARGET_LABELS = [0, 1] @@ -208,7 +197,18 @@ def circuit(params): circuit_layout = dataset_params.circuit_layout_d4 circuit = get_circuit(circuit_layout) params_01 = np.asarray(dataset_params.params_d4)[selection] -states_01 = np.asarray([circuit(params) for params in tqdm(params_01, desc="States for depth 4")]) + +states_01 = [] +n = len(params_01) + +for i, params in enumerate(params_01): + states_01.append(circuit(params)) + # Print every 10% + if (i + 1) % (n // 10) == 0: + print(f"{(i + 1) / n * 100:.0f}% of the states computed") + +states_01 = np.asarray(states_01) + fidelities_01 = np.asarray(dataset_params.fidelities_d4)[selection] ###################################################################### @@ -414,8 +414,7 @@ def loader(X, y, batch_size, rng_key): # # We begin by **initializing** the network weights ``params`` with values drawn uniformly from # :math:`[0, 2\pi]` and initialize the **Adam optimizer** with a learning rate of -# :math:`1 \times 10^{-2}`. The **training loop** then iterates for ``EPOCHS`` and displays the -# progress via ``tqdm``: +# :math:`1 \times 10^{-2}`. The **training loop** then iterates for ``EPOCHS``: # # 1. For each mini-batch, ``train_step`` performs a forward pass, computes the cross-entropy loss and # accuracy, back-propagates gradients, and updates ``params`` through the optimizer state @@ -428,8 +427,6 @@ def loader(X, y, batch_size, rng_key): # The first epoch will take longer than following epochs because of the just-in-time compilation. # -from tqdm.auto import trange - # Define the training setup and start the training loop # optimizer @@ -441,9 +438,7 @@ def loader(X, y, batch_size, rng_key): rng = key_split train_loss_curve, val_loss_curve = [], [] train_acc_curve, val_acc_curve = [], [] -# for epoch in range(1, EPOCHS + 1): -bar = trange(1, EPOCHS + 1, desc="Epochs", unit="ep") -for epoch in bar: +for epoch in range(1, EPOCHS + 1): # train rng, sub = jax.random.split(rng) train_losses, train_accs = [], [] @@ -468,12 +463,9 @@ def loader(X, y, batch_size, rng_key): val_loss_curve.append(vl) train_acc_curve.append(ta) val_acc_curve.append(va) - bar.set_postfix( - train_loss=f"{tl:.4f}", - val_loss=f"{vl:.4f}", - train_acc=f"{ta:.4f}", - val_acc=f"{va:.4f}", - ) + print(f"Epoch {epoch:03d}/{EPOCHS} | " + f"train_loss={tl:.4f}, val_loss={vl:.4f}, " + f"train_acc={ta:.4f}, val_acc={va:.4f}") # Plot the training curves ( From 9021b07876c2d842b25b9efa219e10ff2535bb8f Mon Sep 17 00:00:00 2001 From: fkiwit <74311424+fkiwit@users.noreply.github.com> Date: Sun, 2 Nov 2025 19:57:32 +0100 Subject: [PATCH 19/29] Update demonstrations_v2/low_depth_circuits_mnist/demo.py Co-authored-by: Daniela Angulo <42325731+daniela-angulo@users.noreply.github.com> --- demonstrations_v2/low_depth_circuits_mnist/demo.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/demonstrations_v2/low_depth_circuits_mnist/demo.py b/demonstrations_v2/low_depth_circuits_mnist/demo.py index 041b2f5cab..affb61aefe 100644 --- a/demonstrations_v2/low_depth_circuits_mnist/demo.py +++ b/demonstrations_v2/low_depth_circuits_mnist/demo.py @@ -499,8 +499,7 @@ def loader(X, y, batch_size, rng_key): # and contribute back insights on how these benchmark datasets can best support the development of # practical quantum machine learning approaches. # - -###################################################################### +# # References # ---------- # From e19a2726ea062fd1dca5a72cf973b33ccd047ac0 Mon Sep 17 00:00:00 2001 From: fkiwit <74311424+fkiwit@users.noreply.github.com> Date: Sun, 2 Nov 2025 19:58:08 +0100 Subject: [PATCH 20/29] Update demonstrations_v2/low_depth_circuits_mnist/demo.py Co-authored-by: Daniela Angulo <42325731+daniela-angulo@users.noreply.github.com> --- demonstrations_v2/low_depth_circuits_mnist/demo.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/demonstrations_v2/low_depth_circuits_mnist/demo.py b/demonstrations_v2/low_depth_circuits_mnist/demo.py index affb61aefe..879bd83b2f 100644 --- a/demonstrations_v2/low_depth_circuits_mnist/demo.py +++ b/demonstrations_v2/low_depth_circuits_mnist/demo.py @@ -486,11 +486,11 @@ def loader(X, y, batch_size, rng_key): # Conclusion # ~~~~~~~~~~ # -# | In this notebook we have demonstrated the use of low-depth quantum circuits to load and -# subsequently classify (a subset of) the MNIST dataset. -# | By filtering to specific target labels, constructing parametrized circuits from the provided -# layouts, and evaluating their states and fidelities, we have gained hands-on experience with -# quantum machine learning workflows on real data encodings. +# In this notebook we have demonstrated the use of low-depth quantum circuits to load and +# subsequently classify (a subset of) the MNIST dataset. +# By filtering to specific target labels, constructing parametrized circuits from the provided +# layouts, and evaluating their states and fidelities, we have gained hands-on experience with +# quantum machine learning workflows on real data encodings. # # Explore the full set of `provided # datasets `__—they contain a From 14135cf4ea3237890fccedfebcbc52470685cb5e Mon Sep 17 00:00:00 2001 From: fkiwit <74311424+fkiwit@users.noreply.github.com> Date: Sun, 2 Nov 2025 19:58:42 +0100 Subject: [PATCH 21/29] Update demonstrations_v2/low_depth_circuits_mnist/demo.py Co-authored-by: Diego <67476785+DSGuala@users.noreply.github.com> --- demonstrations_v2/low_depth_circuits_mnist/demo.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/demonstrations_v2/low_depth_circuits_mnist/demo.py b/demonstrations_v2/low_depth_circuits_mnist/demo.py index 879bd83b2f..06235cb352 100644 --- a/demonstrations_v2/low_depth_circuits_mnist/demo.py +++ b/demonstrations_v2/low_depth_circuits_mnist/demo.py @@ -218,8 +218,7 @@ def circuit(params): # To investigate how well the low-depth circuits reproduce the target images, we first **reconstruct** # the pictures encoded in each quantum state. The histogram below reports the *fidelity* # :math:`F = \left|\langle \psi_{\text{exact}} \mid \psi_{\text{circ.}} \rangle\right|^{2}`, i.e. the -# overlap between the exact FRQI state $ -# \|:raw-latex:`\psi`\_{:raw-latex:`\text{exact}`}:raw-latex:`\rangle `$ and its 4-layer +# overlap between the exact FRQI state :math:`|\psi\_{\text{exact}}\rangle` and its 4-layer # center-sequential approximation :math:`|\psi_{\text{circ.}}\rangle`. # # - **Digit 1** samples (orange) cluster at a fidelity :math:`F` close to 1, indicating that four From 675327a7023ccfa344f4a01dcc30e760170792e7 Mon Sep 17 00:00:00 2001 From: Diego Date: Mon, 17 Nov 2025 14:58:50 -0500 Subject: [PATCH 22/29] add images and update metadata --- ...o-loading-data-low-depth-large-thumbnail.png | Bin 0 -> 50534 bytes ...e-demo-loading-data-low-depth-open-graph.png | Bin 0 -> 48141 bytes ...ne-demo-loading-data-low-depth-thumbnail.png | Bin 0 -> 12506 bytes .../low_depth_circuits_mnist/metadata.json | 8 ++++++-- 4 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 _static/demo_thumbnails/large_demo_thumbnails/pennylane-demo-loading-data-low-depth-large-thumbnail.png create mode 100644 _static/demo_thumbnails/opengraph_demo_thumbnails/pennylane-demo-loading-data-low-depth-open-graph.png create mode 100644 _static/demo_thumbnails/regular_demo_thumbnails/pennylane-demo-loading-data-low-depth-thumbnail.png diff --git a/_static/demo_thumbnails/large_demo_thumbnails/pennylane-demo-loading-data-low-depth-large-thumbnail.png b/_static/demo_thumbnails/large_demo_thumbnails/pennylane-demo-loading-data-low-depth-large-thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..72960c1440a08b27b36cee625d10f556a054e34d GIT binary patch literal 50534 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ⅅd9X!+WSv6Xhn|M=gWui~ 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

2RhciF*=B~Qsuf4ui@c=BU)u-GPg$}|)l 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 UkDIL3{GZh|RrORFUsy-}KXod9y8r+H literal 0 HcmV?d00001 diff --git a/_static/demo_thumbnails/opengraph_demo_thumbnails/pennylane-demo-loading-data-low-depth-open-graph.png b/_static/demo_thumbnails/opengraph_demo_thumbnails/pennylane-demo-loading-data-low-depth-open-graph.png new file mode 100644 index 0000000000000000000000000000000000000000..12f100cbc64b7c71eeb6b9b5d23978bdd9039313 GIT binary patch literal 48141 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 Oto2e~z5az=^#215D2gxu literal 0 HcmV?d00001 diff --git a/_static/demo_thumbnails/regular_demo_thumbnails/pennylane-demo-loading-data-low-depth-thumbnail.png b/_static/demo_thumbnails/regular_demo_thumbnails/pennylane-demo-loading-data-low-depth-thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..5ea711e71bf0a56bef483dac6b65c6f76255b896 GIT binary patch literal 12506 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 literal 0 HcmV?d00001 diff --git a/demonstrations_v2/low_depth_circuits_mnist/metadata.json b/demonstrations_v2/low_depth_circuits_mnist/metadata.json index 39c520f298..4c008d14e6 100644 --- a/demonstrations_v2/low_depth_circuits_mnist/metadata.json +++ b/demonstrations_v2/low_depth_circuits_mnist/metadata.json @@ -14,7 +14,7 @@ "executable_stable": true, "executable_latest": true, "dateOfPublication": "2025-09-21T00:00:00+00:00", - "dateOfLastModification": "2025-09-21T00:00:00+00:00", + "dateOfLastModification": "2025-11-17T00:00:00+00:00", "categories": [ "Quantum Machine Learning" ], @@ -22,7 +22,11 @@ "previewImages": [ { "type": "thumbnail", - "uri": "/_static/demo_thumbnails/regular_demo_thumbnails/thumbnail_placeholder.png" + "uri": "/_static/demo_thumbnails/regular_demo_thumbnails/pennylane-demo-loading-data-low-depth-thumbnail.png" + }, + { + "type": "large_thumbnail", + "uri": "/_static/demo_thumbnails/opengraph_demo_thumbnails/pennylane-demo-loading-data-low-depth-open-graph.png" } ], "seoDescription": "This demo shows how to efficiently encode classical image data into quantum states using low-depth circuits, and train a variational quantum classifier on a low-depth MNIST dataset.", From 4ff933c1ea5e3c43f68314ac3021d4d2b40ba800 Mon Sep 17 00:00:00 2001 From: Diego Date: Mon, 17 Nov 2025 15:57:22 -0500 Subject: [PATCH 23/29] update dateOfPublication --- demonstrations_v2/low_depth_circuits_mnist/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demonstrations_v2/low_depth_circuits_mnist/metadata.json b/demonstrations_v2/low_depth_circuits_mnist/metadata.json index 4c008d14e6..199312aba8 100644 --- a/demonstrations_v2/low_depth_circuits_mnist/metadata.json +++ b/demonstrations_v2/low_depth_circuits_mnist/metadata.json @@ -13,7 +13,7 @@ ], "executable_stable": true, "executable_latest": true, - "dateOfPublication": "2025-09-21T00:00:00+00:00", + "dateOfPublication": "2025-11-25T00:00:00+00:00", "dateOfLastModification": "2025-11-17T00:00:00+00:00", "categories": [ "Quantum Machine Learning" From e96a66128237ca1c8bbd13a459ce87aa3260b97c Mon Sep 17 00:00:00 2001 From: Daniela Angulo <42325731+daniela-angulo@users.noreply.github.com> Date: Thu, 20 Nov 2025 16:52:58 -0500 Subject: [PATCH 24/29] Update demonstrations_v2/low_depth_circuits_mnist/demo.py --- demonstrations_v2/low_depth_circuits_mnist/demo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demonstrations_v2/low_depth_circuits_mnist/demo.py b/demonstrations_v2/low_depth_circuits_mnist/demo.py index 06235cb352..56282952df 100644 --- a/demonstrations_v2/low_depth_circuits_mnist/demo.py +++ b/demonstrations_v2/low_depth_circuits_mnist/demo.py @@ -116,7 +116,7 @@ def FRQI_decoding(states): ###################################################################### # Downloading the quantum image dataset -# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# ------------------------------------- # # The dataset configuration sets the name as ``'low-depth-mnist'`` and constructs the dataset path as # ``datasets/low-depth-mnist/low-depth-mnist.h5``. For dataset loading, if the file exists locally, it From 78363ca4405887bbfca25091b68aad71bf3ba728 Mon Sep 17 00:00:00 2001 From: Diego <67476785+DSGuala@users.noreply.github.com> Date: Thu, 20 Nov 2025 16:58:41 -0500 Subject: [PATCH 25/29] Update demonstrations_v2/low_depth_circuits_mnist/requirements.in --- demonstrations_v2/low_depth_circuits_mnist/requirements.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demonstrations_v2/low_depth_circuits_mnist/requirements.in b/demonstrations_v2/low_depth_circuits_mnist/requirements.in index 22e889b763..4a61e7d73b 100644 --- a/demonstrations_v2/low_depth_circuits_mnist/requirements.in +++ b/demonstrations_v2/low_depth_circuits_mnist/requirements.in @@ -1,2 +1,2 @@ -autoray==0.6.12 +autoray==0.8 tqdm==4.67.1 \ No newline at end of file From acd8fbcdd14685f329a3a6b5e4ba7ee03bec808c Mon Sep 17 00:00:00 2001 From: Daniela Angulo <42325731+daniela-angulo@users.noreply.github.com> Date: Fri, 21 Nov 2025 09:54:01 -0500 Subject: [PATCH 26/29] Apply suggestions from code review --- demonstrations_v2/low_depth_circuits_mnist/demo.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/demonstrations_v2/low_depth_circuits_mnist/demo.py b/demonstrations_v2/low_depth_circuits_mnist/demo.py index 56282952df..6e5fac796a 100644 --- a/demonstrations_v2/low_depth_circuits_mnist/demo.py +++ b/demonstrations_v2/low_depth_circuits_mnist/demo.py @@ -213,7 +213,7 @@ def circuit(params): ###################################################################### # Reconstructing images from quantum states -# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# ----------------------------------------- # # To investigate how well the low-depth circuits reproduce the target images, we first **reconstruct** # the pictures encoded in each quantum state. The histogram below reports the *fidelity* @@ -278,7 +278,7 @@ def circuit(params): ###################################################################### # 3. Quantum classifiers -# ---------------------- +# ~~~~~~~~~~~~~~~~~~~~~~ # # In this demo, we train a **variational quantum circuit** as a classifier. Our datasets require # ``N_QUBITS = 11``, therefore we use the same number of qubits for the classifier. Given a data state @@ -380,7 +380,7 @@ def loader(X, y, batch_size, rng_key): ###################################################################### # Preparing the training / validation split -# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# ------------------------------------------ # # We start by **casting** the FRQI amplitude vectors and their digit labels into JAX arrays. Next, the # states and labels are shuffled from a pseudorandom key derived from the global ``SEED``. Then, the @@ -409,7 +409,7 @@ def loader(X, y, batch_size, rng_key): ###################################################################### # Training setup and loop -# ~~~~~~~~~~~~~~~~~~~~~~~ +# ----------------------- # # We begin by **initializing** the network weights ``params`` with values drawn uniformly from # :math:`[0, 2\pi]` and initialize the **Adam optimizer** with a learning rate of From 01f7e62d262381a69b31a0138d01ff2f55f9a879 Mon Sep 17 00:00:00 2001 From: Daniela Angulo <42325731+daniela-angulo@users.noreply.github.com> Date: Fri, 21 Nov 2025 10:16:18 -0500 Subject: [PATCH 27/29] Apply suggestions from code review --- demonstrations_v2/low_depth_circuits_mnist/demo.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/demonstrations_v2/low_depth_circuits_mnist/demo.py b/demonstrations_v2/low_depth_circuits_mnist/demo.py index 6e5fac796a..883cf3824f 100644 --- a/demonstrations_v2/low_depth_circuits_mnist/demo.py +++ b/demonstrations_v2/low_depth_circuits_mnist/demo.py @@ -500,7 +500,7 @@ def loader(X, y, batch_size, rng_key): # # # References -# ---------- +# ~~~~~~~~~~ # # .. [#Kiwit] # @@ -542,7 +542,7 @@ def loader(X, y, batch_size, rng_key): ###################################################################### # Appendix -# -------- +# ~~~~~~~~~ # # The CIFAR-10 and Imagenette datasets use the following MCRQI color encoding and decoding [4,5] From aa27a99e6d8dc33b0ab55ea58f56ce6fe18e0333 Mon Sep 17 00:00:00 2001 From: fkiwit <74311424+fkiwit@users.noreply.github.com> Date: Sat, 22 Nov 2025 14:55:50 +0100 Subject: [PATCH 28/29] Update demonstrations_v2/low_depth_circuits_mnist/demo.py Co-authored-by: Daniela Angulo <42325731+daniela-angulo@users.noreply.github.com> --- demonstrations_v2/low_depth_circuits_mnist/demo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demonstrations_v2/low_depth_circuits_mnist/demo.py b/demonstrations_v2/low_depth_circuits_mnist/demo.py index 883cf3824f..647609912a 100644 --- a/demonstrations_v2/low_depth_circuits_mnist/demo.py +++ b/demonstrations_v2/low_depth_circuits_mnist/demo.py @@ -228,7 +228,7 @@ def circuit(params): # # On the right we decode the states back into pixel space. In line with the histogram, the # reconstructed “1” is virtually indistinguishable from its original, whereas the reconstructed “0” -# shows minor blurring. By selecting a deeper circuit the quality of the reconstructed images could be +# shows minor blurring. By selecting a deeper circuit, the quality of the reconstructed images could be # improved by trading quality for efficiency. # From e433140054da390fd4ea0204467a7a3dc841bea0 Mon Sep 17 00:00:00 2001 From: fkiwit <74311424+fkiwit@users.noreply.github.com> Date: Sat, 22 Nov 2025 14:56:21 +0100 Subject: [PATCH 29/29] Update demonstrations_v2/low_depth_circuits_mnist/demo.py Co-authored-by: Daniela Angulo <42325731+daniela-angulo@users.noreply.github.com> --- demonstrations_v2/low_depth_circuits_mnist/demo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demonstrations_v2/low_depth_circuits_mnist/demo.py b/demonstrations_v2/low_depth_circuits_mnist/demo.py index 647609912a..6912e9487b 100644 --- a/demonstrations_v2/low_depth_circuits_mnist/demo.py +++ b/demonstrations_v2/low_depth_circuits_mnist/demo.py @@ -218,7 +218,7 @@ def circuit(params): # To investigate how well the low-depth circuits reproduce the target images, we first **reconstruct** # the pictures encoded in each quantum state. The histogram below reports the *fidelity* # :math:`F = \left|\langle \psi_{\text{exact}} \mid \psi_{\text{circ.}} \rangle\right|^{2}`, i.e. the -# overlap between the exact FRQI state :math:`|\psi\_{\text{exact}}\rangle` and its 4-layer +# overlap between the exact FRQI state :math:`|\psi_{\text{exact}}\rangle` and its 4-layer # center-sequential approximation :math:`|\psi_{\text{circ.}}\rangle`. # # - **Digit 1** samples (orange) cluster at a fidelity :math:`F` close to 1, indicating that four