MatchCake
Logo by Tarik El-Khateeb / Xanadu
Description
MatchCake is a Python package that provides a new PennyLane device for simulating a specific class of quantum circuits called Matchgate circuits or matchcircuits. These circuits are made with matchgates, a class of restricted quantum unitaries that are parity-preserving and operate on nearest-neighbor qubits. These constraints lead to matchgates being classically simulable in polynomial time.
Additionally, this package provides quantum kernels made with scikit-learn API allowing the use matchcircuits as kernels in quantum machine learning algorithms. One way to use these kernels could be in a Support Vector Machine (SVM).
Note that this package is built on PennyLane and PyTorch. This means that only the NumPy and PyTorch backends are compatible. Other backends provided by Autoray, such as JAX and TensorFlow, are not supported. We highly recommend using PyTorch as the backend when working with MatchCake.
Requirements
| Requirement | Supported |
|---|---|
| Python | 3.11, 3.12, 3.13, 3.14 |
| Platforms | Linux, Windows |
Every one of these Python versions is tested on Linux (x86-64 and aarch64) and on Windows on each pull request, in continuous integration. On Linux, a glibc based distribution is required. PyTorch publishes no musl wheels, so MatchCake cannot be installed on Alpine.
macOS is not supported. MatchCake contains no platform specific code and may well run there, but it is not tested. If you need macOS support, please open an issue and we will look into adding it to the continuous integration matrix.
Installation
MatchCake is published on PyPI as matchcake.
Set up a project or an environment
Install MatchCake into a virtual environment and not into the system interpreter, which recent Linux
distributions refuse with error: externally-managed-environment. If you do not have one yet, create it:
uv init myproject && cd myproject # uv
poetry new myproject && cd myproject # poetry (then cap requires-python, see below)
python -m venv .venv && source .venv/bin/activate # plain virtual environment
On Windows, activate the virtual environment with .venv\Scripts\activate instead.
Install MatchCake
| Method | Commands |
|---|---|
| pip | pip install matchcake |
| uv | uv add matchcake in a uv project, or uv pip install matchcake |
| poetry | poetry add matchcake in a poetry project |
| source | pip install "git+https://github.com/MatchCake/MatchCake@main" |
A few things useful to know during the installation:
uv addandpoetry addare project commands: they record a dependency in thepyproject.tomlof the project you are standing in. In a directory without one they stop withNo pyproject.toml found in current directory or any parent directory. Note thatuv addalso searches parent directories, so running it inside an unrelated project modifies that project. Useuv pip install matchcakewhen you only want the package in an environment.poetry add matchcakeadditionally requires your project to put an upper bound on its Python range, for examplerequires-python = ">=3.11,<3.15".poetry newwrites an open ended range such as>=3.12, and poetry then declines to resolve becausetorchpfaffiansupports Python<3.15only.- The
sourcerow needsgitavailable on yourPATH. It installs the latest release from themainbranch; see below for the development branch.
Last unstable version
To install the development branch, use the @dev reference:
pip install "git+https://github.com/MatchCake/MatchCake@dev"
The uv equivalent is uv add "matchcake @ git+https://github.com/MatchCake/MatchCake@dev".
PyTorch build and installation size
MatchCake depends on PyTorch, and on Linux the default PyTorch wheel on PyPI is the CUDA build. A plain
pip install matchcake therefore downloads PyTorch together with around twenty NVIDIA packages and occupies
roughly 6 GB, whether or not the machine has a GPU. This comes from how PyTorch is packaged, not from
MatchCake.
For a CPU only environment, install PyTorch from the PyTorch CPU index first, then install MatchCake on top. The requirement is already satisfied at that point, so nothing pulls the CUDA build in, and the result is about 1.6 GB with no NVIDIA packages:
pip install torch --index-url https://download.pytorch.org/whl/cpu
pip install matchcake
Swap the index for a specific CUDA version, for instance https://download.pytorch.org/whl/cu128 for
CUDA 12.8 or https://download.pytorch.org/whl/cu130 for CUDA 13.0.
With uv, declare the index in your own pyproject.toml and add torch alongside matchcake:
[[tool.uv.index]]
name = "pytorch-cpu"
url = "https://download.pytorch.org/whl/cpu"
explicit = true
[tool.uv.sources]
torch = { index = "pytorch-cpu" }
uv add matchcake torch
Listing torch explicitly is important: [tool.uv.sources] only redirects dependencies that your own project
declares, so a torch pulled in solely through matchcake still comes from PyPI.
MatchCake declares cpu, cu128 and cu130 extras, but they only select these indexes when MatchCake
itself is built from a clone, through [tool.uv.sources] in its pyproject.toml. That mechanism belongs to
uv and is not part of the metadata published to PyPI, so pip install "matchcake[cpu]" and
uv add matchcake --extra cpu resolve exactly the same PyTorch as no extra at all. Use the index based
recipe above. The extras are documented for contributors in
CONTRIBUTING.md.
Quick Usage Preview
Quantum Circuit Simulation with MatchCake
import matchcake as mc
import pennylane as qml
import numpy as np
from pennylane.ops.qubit.observables import BasisStateProjector
# Create a Non-Interacting Fermionic Device
nif_device = mc.NonInteractingFermionicDevice(wires=4)
initial_state = np.zeros(len(nif_device.wires), dtype=int)
# Define a quantum circuit
def circuit(params, wires, initial_state=None):
qml.BasisState(initial_state, wires=wires)
for i, even_wire in enumerate(wires[:-1:2]):
idx = list(wires).index(even_wire)
curr_wires = [wires[idx], wires[idx + 1]]
mc.operations.CompRxRx(params, wires=curr_wires)
mc.operations.CompRyRy(params, wires=curr_wires)
mc.operations.CompRzRz(params, wires=curr_wires)
for i, odd_wire in enumerate(wires[1:-1:2]):
idx = list(wires).index(odd_wire)
mc.operations.fSWAP(wires=[wires[idx], wires[idx + 1]])
projector: BasisStateProjector = qml.Projector(initial_state, wires=wires)
return qml.expval(projector)
# Create a QNode
nif_qnode = qml.QNode(circuit, nif_device)
qml.draw_mpl(nif_qnode)(np.array([0.1, 0.2]), wires=nif_device.wires, initial_state=initial_state)
# Evaluate the QNode
expval = nif_qnode(np.random.random(2), wires=nif_device.wires, initial_state=initial_state)
print(f"Expectation value: {expval}")
Data Classification with MatchCake
from matchcake.ml.kernels import FermionicPQCKernel
from matchcake.ml.visualisation import ClassificationVisualizer
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from sklearn.pipeline import Pipeline
from sklearn.svm import SVC
# Load the iris dataset
X, y = datasets.load_iris(return_X_y=True)
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
# Create and fit the model
pipeline = Pipeline([
('scaler', MinMaxScaler(feature_range=(0, 1))),
('kernel', FermionicPQCKernel(n_qubits=4, rotations="X,Z").freeze()),
('classifier', SVC(kernel='precomputed')),
])
pipeline.fit(x_train, y_train)
# Evaluate the model
test_accuracy = pipeline.score(x_test, y_test)
print(f"Test accuracy: {test_accuracy * 100:.2f}%")
# Visualize the classification
viz = ClassificationVisualizer(x=X, n_pts=1_000)
viz.plot_2d_decision_boundaries(model=pipeline, y=y, show=True)
Tutorials
- MatchCake Basics
- Compute Expectation Values with MatchCake
- Iris Classification with MatchCake
- Nystroem Kernel Approximation
For Developers
To contribute to the development of MatchCake, please refer to the contributing guidelines.
Notes
- This package is still in development and some features may not be available yet.
- The documentation is still in development and may not be complete yet.
About
This work was supported by the Ministère de l'Économie, de l'Innovation et de l'Énergie du Québec through its Research Chair in Quantum Computing, an NSERC Discovery grant, and the Canada First Research Excellence Fund.
Important Links
- Documentation at https://MatchCake.github.io/MatchCake/.
- Github at https://github.com/MatchCake/MatchCake/.
Found a bug or have a feature request?
License
Citation
Repository:
@misc{matchcake_Gince2023,
title={MatchCake},
author={Jérémie Gince},
year={2023},
publisher={Université de Sherbrooke},
url={https://github.com/MatchCake/MatchCake},
}
Fermionic Machine Learning Paper
Fermionic Machine Learning is a work presented at the 2024 IEEE International Conference on Quantum Computing and Engineering (QCE). The paper compares unconstrained quantum kernel methods with constraint-based kernels derived from matchgate (free-fermionic) circuits, and benchmarks their performance on supervised classification tasks. All free-fermionic kernels considered in this work were simulated using MatchCake.
@INPROCEEDINGS{10821385,
author={Gince, Jérémie and Pagé, Jean-Michel and Armenta, Marco and Sarkar, Ayana and Kourtis, Stefanos},
booktitle={2024 IEEE International Conference on Quantum Computing and Engineering (QCE)},
title={Fermionic Machine Learning},
year={2024},
volume={01},
number={},
pages={1672-1678},
keywords={Runtime;Quantum entanglement;Computational modeling;Benchmark testing;Rendering (computer graphics);Hardware;Kernel;Integrated circuit modeling;Quantum circuit;Standards;Quantum machine learning;quantum kernel methods;matchgate circuits;fermionic quantum computation;data classification},
doi={10.1109/QCE60285.2024.00195}
}
@misc{gince2024fermionic,
title={Fermionic Machine Learning},
author={Jérémie Gince and Jean-Michel Pagé and Marco Armenta and Ayana Sarkar and Stefanos Kourtis},
year={2024},
eprint={2404.19032},
archivePrefix={arXiv},
primaryClass={quant-ph}
}
Metadata
Release files for matchcake 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| matchcake-1.0.0.tar.gz | 144.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| matchcake-1.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 322.3 kB
Release files / matchcake-1.0.0.tar.gz
| Download URL | matchcake-1.0.0.tar.gz |
|---|---|
| Size | 144.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8496a88a0e830c6beca4322633b7549a51288264630a7ab55e19a9c9ec01312d
|
|
BLAKE2b-256 checksum How to use checksums |
00c31b6a5fed63f20a139094c7e29c3b288a3f1432f0aa071f1015aeca472e92
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 23, 2026.
Transparency logRelease files / matchcake-1.0.0-py3-none-any.whl
| Download URL | matchcake-1.0.0-py3-none-any.whl |
|---|---|
| Size | 177.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
198ce9da4743c9f5fbed4ba8791873550bda6557a1a7e2fe0168c8ad74953372
|
|
BLAKE2b-256 checksum How to use checksums |
6c25f1cc53c7d009a419e484995c6b05ce737897a14e870d137fc1162aa04b2a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 23, 2026.
Transparency log