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.3

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.3
File Size Uploaded
qliff-0.4.3.tar.gz 147.2 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for qliff 0.4.3
File
qliff-0.4.3-cp311-abi3-win_arm64.whl CPython 3.11 abi3 Windows ARM64 Details
qliff-0.4.3-cp311-abi3-win_amd64.whl CPython 3.11 abi3 Windows x86-64 Details
qliff-0.4.3-cp311-abi3-manylinux_2_28_x86_64.whl CPython 3.11 abi3 Linux glibc 2.28+ x86-64 Details
qliff-0.4.3-cp311-abi3-manylinux_2_28_aarch64.whl CPython 3.11 abi3 Linux glibc 2.28+ ARM64 Details
qliff-0.4.3-cp311-abi3-macosx_11_0_x86_64.whl CPython 3.11 abi3 macOS 11.0+ x86-64 Details
qliff-0.4.3-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.3.tar.gz

Download URL qliff-0.4.3.tar.gz
Size 147.2 kB
Tags Source
SHA-256 checksum
How to use checksums
f1a9069a201cd1bf2e04fa923b70245991a57c24c16a134e51285764a264a1e8
BLAKE2b-256 checksum
How to use checksums
d64c6d26d8858d79be95f3a1cdb3ec1f3e5fd3ab08fc1c048ac7797c52c1853d
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.3-cp311-abi3-win_arm64.whl

Download URL qliff-0.4.3-cp311-abi3-win_arm64.whl
Size 389.6 kB
Tags CPython 3.11 Windows ARM64 abi3
SHA-256 checksum
How to use checksums
c00d136cf23377004b93c506cb2840866f3ec768cdb24604d9f09681b3fc1c51
BLAKE2b-256 checksum
How to use checksums
8dd6c568c7e8377e26bb1741ccb25bac538bdd788ff5bcfa6f73f67bee916ab9
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.3-cp311-abi3-win_amd64.whl

Download URL qliff-0.4.3-cp311-abi3-win_amd64.whl
Size 409.0 kB
Tags CPython 3.11 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
a8c11218046515c12c0bf16262e8ca3fb242e9da2a53c690035f3634ec1597e8
BLAKE2b-256 checksum
How to use checksums
6a71df1dc00094fed36a9964351914d87de5c376338a0cc4fef874e17bf29d53
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.3-cp311-abi3-manylinux_2_28_x86_64.whl

Download URL qliff-0.4.3-cp311-abi3-manylinux_2_28_x86_64.whl
Size 535.4 kB
Tags CPython 3.11 Linux glibc 2.28+ x86-64 abi3
SHA-256 checksum
How to use checksums
73fb32a63b9b6183476bef097cf863f6ce298cd534df9e581128a4f95fe3f402
BLAKE2b-256 checksum
How to use checksums
f3e75016f00490f094393187b51c529c97637d674fd0972b309a4db415084ad5
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.3-cp311-abi3-manylinux_2_28_aarch64.whl

Download URL qliff-0.4.3-cp311-abi3-manylinux_2_28_aarch64.whl
Size 527.5 kB
Tags CPython 3.11 Linux glibc 2.28+ ARM64 abi3
SHA-256 checksum
How to use checksums
d60ee2e25469713185025b1c4bb5e8585fe1350df13aa6f6d048ca5f4ffd20a9
BLAKE2b-256 checksum
How to use checksums
1aef2ae921b3d53d611f13877d013adb2e1cc747c1cd1d7810b02a6c8fad43dd
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.3-cp311-abi3-macosx_11_0_x86_64.whl

Download URL qliff-0.4.3-cp311-abi3-macosx_11_0_x86_64.whl
Size 505.6 kB
Tags CPython 3.11 abi3 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
e8ebf05984ed0b888d0883b1d62b659972eaa817596cfe342ace46005649322c
BLAKE2b-256 checksum
How to use checksums
3419bf4c52ebd87e495dba98de32e195007c4b079bb65038d3c700ae93acbd50
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.3-cp311-abi3-macosx_11_0_arm64.whl

Download URL qliff-0.4.3-cp311-abi3-macosx_11_0_arm64.whl
Size 482.5 kB
Tags CPython 3.11 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
fd90a43ff9ac43450f70c9d418abea661e6dce2eb0061567334432765c0348a7
BLAKE2b-256 checksum
How to use checksums
51bf6d8c028099d42b2acf0fca2c4e99f58b1ec086ddef21268dd47dc7312ed3
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

This release

0.4.3 This release

7 release files

0.4.2

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