Skip to main content
qliff

qliff

A Clifford stabilizer simulator with support for noisy and mid-circuit measurement-based simulation.

  • Clifford stab simulation via the Aaronson–Gottesman tableau
  • Noisy sim via stabilizer-channel decomposition E = Σ_μ q_μ S_μ and stratified importance sampling (arXiv:2512.07304), "nearly as cheap as Pauli noise."
  • Decoder-ready QEC primitives: detectors, observables, detection-event sampling, a detector error model by Pauli-frame propagation, and exporters (parity-check matrix + priors, matching weights, syndrome/label tensors). These drop directly into MWPM (pymatching), BP, or ML decoders.
  • Code factories for surface, toric, color/triangular/kagome, subsystem (Bacon-Shor, gauge), and qLDPC (hypergraph-product, bivariate-bicycle) families, plus from_stabilisers / from_gauges for arbitrary Pauli codes.

Install

pip install qliff

Docs at plutoniumm.github.io/qliff.

Clifford simulation

from qliff import Simulator

s = Simulator(2).H(0).CX(0, 1)
s.canon()        # ['+XX', '+ZZ']
s.peek("ZZ")     # +1
s.measure("XX")  # (+1, False)

m0, m1 = Simulator(2).H(0).CX(0, 1).M(0, 1)  # m0 == m1

Mid-circuit measurement and classical feedback are just Python — the simulator is stateful, so conditionals (teleportation, syndrome correction) need no special API:

s = Simulator(3, seed=0)
s.H(0)
s.H(1).CX(1, 2)
s.CX(0, 1).H(0)

if s.M(1) == 1:
    s.X(2)
if s.M(0) == 1:
    s.Z(2)

s.peek("__X")  # +1

Noise

Build Circuit with gate/noise methods, then sample or estimate.

Circuit.estimate picks the right sampler by default — plain Monte-Carlo when every channel is Pauli, otherwise stratified importance sampling

from qliff import Circuit

c = Circuit(1)
c.H(0).DEPOLARIZE1(0, 0.1).M(0)
c.sample(1000)

c = Circuit(1)
c.H(0).RZ(0, 0.3)
c.estimate("X", 20000)  # ≈ cos(0.3)

c = Circuit(1)
c.X(0).AMPLITUDE_DAMP(0, 0.3)
c.estimate("Z", 60000)  # ≈ 2p - 1

Force the variance strategy with c.estimate(obs, shots, stratify=False) (flat) or stratify=True (stratified), or drive the sampler directly: from qliff.noise import Sampler, then Sampler(c).expect(obs, shots, stratify=True). Add a custom channel by subclassing qliff.noise.Channel and dropping it in with c.noise(ch, q).

For deep-tail logical error rates where plain Monte-Carlo needs prohibitively many shots, from qliff.noise import SplittingEstimator runs a multilevel-splitting (subset-sampling) estimator that reaches the far tail with orders of magnitude fewer decodes.

Quantum error correction

qliff.qec ships code-circuit generators, so you can go straight to a logical-error-rate curve. Alongside rotated_surface_code there are unrotated_surface_code, toric_code, repetition_code, the color family (color_code, hex_color_code, triangular_code, kagome_code), subsystem codes (bacon_shor_code, from_gauges), and qLDPC codes (hypergraph_product_code, bivariate_bicycle_code); from_stabilisers builds a full memory circuit from an arbitrary Pauli stabiliser set. Every family whose code has an X/Z dual takes memory="Z" or memory="X" to run either basis. Any circuit's detectors and observables are declared with c.detector(...) / c.observable(...), then turned into decoder inputs:

from qliff.qec import rotated_surface_code, logical_fidelity
from pymatching import Matching

c = rotated_surface_code(5, 5, 0.01)  # distance, rounds, p (square d x d patch)
dem = c.dem()

H, priors, obs_matrix = dem.check_matrix()
m = Matching.from_check_matrix(
  H,
  weights=dem.weights(),
  faults_matrix=obs_matrix
)

dets, flips = c.detector_sampler().sample(20000)
fidelity = logical_fidelity(m.decode_batch(dets), flips)

A memory is blind to noise that commutes with its own basis -- a Z-memory cannot see Z_ERROR or RZ, and reports a logical error rate of exactly zero at any p. qliff warns when you build one, and again if the detector error model comes out empty; run the dual basis instead:

c = rotated_surface_code(3, 3, 0.01, channel="Z_ERROR", memory="X")  # sees the noise

Extending

Everything you'd customize lives in Python. Add a noise channel by subclassing qliff.noise.Channel and returning its stabilizer-channel branches; plug in a custom sampler or observable; export the DEM to whatever decoder you like. The Rust core stays a thin, fast tableau engine.

Develop

./do develop   # build rust core
./do test
./do lint
./do bench
./do build     # all wheels (macOS/Linux/Windows, x86_64 + arm) + sdist, no upload
./do deploy    # publish what `build` made to PyPI (no rebuild)

cd docs && npm run build && npm run deploy   # docs site -> GitHub Pages

License

MIT

If you are a company using this, please get a grad student to help you with issues. If you are a grad student, please feel free to email me :)

Release files for qliff 0.4.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for qliff 0.4.2
File Size Uploaded
qliff-0.4.2.tar.gz 144.2 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for qliff 0.4.2
File
qliff-0.4.2-cp311-abi3-win_arm64.whl CPython 3.11 abi3 Windows ARM64 Details
qliff-0.4.2-cp311-abi3-win_amd64.whl CPython 3.11 abi3 Windows x86-64 Details
qliff-0.4.2-cp311-abi3-manylinux_2_28_x86_64.whl CPython 3.11 abi3 Linux glibc 2.28+ x86-64 Details
qliff-0.4.2-cp311-abi3-manylinux_2_28_aarch64.whl CPython 3.11 abi3 Linux glibc 2.28+ ARM64 Details
qliff-0.4.2-cp311-abi3-macosx_11_0_x86_64.whl CPython 3.11 abi3 macOS 11.0+ x86-64 Details
qliff-0.4.2-cp311-abi3-macosx_11_0_arm64.whl CPython 3.11 abi3 macOS 11.0+ ARM64 Details

Total release size: 3.0 MB

Release files / qliff-0.4.2.tar.gz

Download URL qliff-0.4.2.tar.gz
Size 144.2 kB
Tags Source
SHA-256 checksum
How to use checksums
de78f019150a369b207a54d0f33f35d039bf7ef73000689a4ce074decfe6792e
BLAKE2b-256 checksum
How to use checksums
ef20529afedf3578257a48ff9897a960d3a7b0746c1790fc45c3c9ab11bd70b3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.3

Release files / qliff-0.4.2-cp311-abi3-win_arm64.whl

Download URL qliff-0.4.2-cp311-abi3-win_arm64.whl
Size 387.8 kB
Tags CPython 3.11 Windows ARM64 abi3
SHA-256 checksum
How to use checksums
ade92175148d0feca922c4564355638e58ee0cddd31b92b94fe3409e66cdc7c3
BLAKE2b-256 checksum
How to use checksums
26bba90bd5eec352d6c14995208933b1fc28385fb0581e39903ba785b9ffd4d5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.3

Release files / qliff-0.4.2-cp311-abi3-win_amd64.whl

Download URL qliff-0.4.2-cp311-abi3-win_amd64.whl
Size 407.4 kB
Tags CPython 3.11 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
8818c86b155ce5cc7f7589dc7b9028d6bc3983a31c7ca77f4687a0b2d9e551df
BLAKE2b-256 checksum
How to use checksums
92a8087c1242a3229f3c0c56190fcf6359cc7330b1c27334c602b20962c2bf5c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.3

Release files / qliff-0.4.2-cp311-abi3-manylinux_2_28_x86_64.whl

Download URL qliff-0.4.2-cp311-abi3-manylinux_2_28_x86_64.whl
Size 533.9 kB
Tags CPython 3.11 Linux glibc 2.28+ x86-64 abi3
SHA-256 checksum
How to use checksums
bd6b67c4844093ee4787eb131ab1319e30ee3611136727c78fb28dbf1a9be4f0
BLAKE2b-256 checksum
How to use checksums
7ea2ab7a932351e096364e654c71307c6f660ac4a212177e43c81aa38ab18fe2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.3

Release files / qliff-0.4.2-cp311-abi3-manylinux_2_28_aarch64.whl

Download URL qliff-0.4.2-cp311-abi3-manylinux_2_28_aarch64.whl
Size 525.3 kB
Tags CPython 3.11 Linux glibc 2.28+ ARM64 abi3
SHA-256 checksum
How to use checksums
d6482732a3f08750bde005bc1a168ee37af6c7f68af4dbb693fb2adef513e51d
BLAKE2b-256 checksum
How to use checksums
df7ec37f9d1fe952bab2960d8961ea79865176dce0ec68cdd5381422580f90fc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.3

Release files / qliff-0.4.2-cp311-abi3-macosx_11_0_x86_64.whl

Download URL qliff-0.4.2-cp311-abi3-macosx_11_0_x86_64.whl
Size 503.9 kB
Tags CPython 3.11 abi3 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
07ca86c185fe3ac1b9bb4fa546d0e4b2c096cd24e6b35511bcb005d9b1df4693
BLAKE2b-256 checksum
How to use checksums
89709dceb9ea896c9929fb2cb399bdcbb800bc082ff50d3570cde972bd4ce760
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.3

Release files / qliff-0.4.2-cp311-abi3-macosx_11_0_arm64.whl

Download URL qliff-0.4.2-cp311-abi3-macosx_11_0_arm64.whl
Size 480.4 kB
Tags CPython 3.11 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
dc84bf106e1a072be6bd7f93a555262436fc3ce1157fa76d64aaa65c34bbc53e
BLAKE2b-256 checksum
How to use checksums
2f67584bc311a3adbeca26e91e590f2bdc4033ef17fb6a0361c9f161877f2519
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.3

Release history Release notifications | RSS feed

0.5.0

7 release files

0.4.3

7 release files

This release

0.4.2 This release

7 release files

0.4.1

7 release files

0.3.2

7 release files

0.3.1

7 release files

0.3.0

7 release files

0.2.2

7 release files

0.2.0

7 release files

0.0.2

5 release files

0.0.1

5 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page