Skip to main content

A package for decoding quantum error correcting codes using minimum-weight perfect matching.

Project description

PyMatching 2

Continuous Integration codecov docs PyPI version Unitary Fund

PyMatching is a fast Python/C++ library for decoding quantum error correcting (QEC) codes using the Minimum Weight Perfect Matching (MWPM) decoder. Given the syndrome measurements from a quantum error correction circuit, the MWPM decoder finds the most probable set of errors, given the assumption that error mechanisms are independent, as well as graphlike (each error causes either one or two detection events). The MWPM decoder is the most popular decoder for decoding surface codes, and can also be used to decode various other code families, including subsystem codes, honeycomb codes and 2D hyperbolic codes.

Version 2 includes a new implementation of the blossom algorithm which is 100-1000x faster than previous versions of PyMatching. PyMatching can be configured using arbitrary weighted graphs, with or without a boundary, and can be combined with Craig Gidney's Stim library to simulate and decode error correction circuits in the presence of circuit-level noise. The sinter package combines Stim and PyMatching to perform fast, parallelised monte-carlo sampling of quantum error correction circuits.

Documentation for PyMatching can be found at: pymatching.readthedocs.io

Our paper gives more background on the MWPM decoder and our implementation (sparse blossom) released in PyMatching v2.

To see how stim, sinter and pymatching can be used to estimate the threshold of an error correcting code with circuit-level noise, try out the stim getting started notebook.

The new >100x faster implementation for Version 2

Version 2 features a new implementation of the blossom algorithm, which I wrote with Craig Gidney. Our new implementation, which we refer to as the sparse blossom algorithm, can be seen as a generalisation of the blossom algorithm to handle the decoding problem relevant to QEC. We solve the problem of finding minimum-weight paths between detection events in a detector graph directly, which avoids the need to use costly all-to-all Dijkstra searches to find a MWPM in a derived graph using the original blossom algorithm. The new version is also exact - unlike previous versions of PyMatching, no approximation is made. See our paper for more details.

Our new implementation is over 100x faster than previous versions of PyMatching, and is over 100,000x faster than NetworkX (benchmarked with surface code circuits). At 0.1% circuit-noise, PyMatching can decode both X and Z basis measurements of surface code circuits up to distance 17 in under 1 microsecond per round of syndrome extraction on a single core. Furthermore, the runtime is roughly linear in the number of nodes in the graph.

The plot below compares the performance of PyMatching v2 with the previous version (v0.7) as well as with NetworkX for decoding surface code circuits with circuit-level depolarising noise. All decoders were run on a single core of an M1 processor, processing both the X and Z basis measurements. The equations T=N^x in the legend (and plotted as dashed lines) are obtained from a fit to the same dataset for distance > 10, where N is the number of detectors (nodes) per round, and T is the decoding time per round. See the benchmarks folder in the repository for the data and stim circuits, as well as additional benchmarks.

PyMatching new vs old vs NetworkX

Sparse blossom is conceptually similar to the approach described in this paper by Austin Fowler, although our approach differs in many of the details (as explained in our paper). There are even more similarities with the very nice independent work by Yue Wu, who recently released the fusion-blossom library. One of the differences with our approach is that fusion-blossom grows the exploratory regions of alternating trees in a similar way to how clusters are grown in Union-Find, whereas our approach instead progresses along a timeline, and uses a global priority queue to grow alternating trees. Yue also has a paper coming soon, so stay tuned for that as well.

Installation

The latest version of PyMatching can be downloaded and installed from PyPI with the command:

pip install pymatching --upgrade

Usage

PyMatching can load matching graphs from a check matrix, a stim.DetectorErrorModel, a networkx.Graph, a rustworkx.PyGraph or by adding edges individually with pymatching.Matching.add_edge and pymatching.Matching.add_boundary_edge.

Decoding Stim circuits

PyMatching can be combined with Stim. Generally, the easiest and fastest way to do this is using sinter (use v1.10.0 or later), which uses PyMatching and Stim to run parallelised monte carlo simulations of quantum error correction circuits. However, in this section we will use Stim and PyMatching directly, to demonstrate how their Python APIs can be used. To install stim, run pip install stim --upgrade.

First, we generate a stim circuit. Here, we use a surface code circuit included with stim:

import numpy as np
import stim
import pymatching
circuit = stim.Circuit.generated("surface_code:rotated_memory_x", 
                                 distance=5, 
                                 rounds=5, 
                                 after_clifford_depolarization=0.005)

Next, we use stim to generate a stim.DetectorErrorModel (DEM), which is effectively a Tanner graph describing the circuit-level noise model. By setting decompose_errors=True, stim decomposes all error mechanisms into edge-like error mechanisms (which cause either one or two detection events). This ensures that our DEM is graphlike, and can be loaded by pymatching:

model = circuit.detector_error_model(decompose_errors=True)
matching = pymatching.Matching.from_detector_error_model(model)

Next, we will sample 1000 shots from the circuit. Each shot (a row of shots) contains the full syndrome (detector measurements), as well as the logical observable measurements, from simulating the noisy circuit:

sampler = circuit.compile_detector_sampler()
syndrome, actual_observables = sampler.sample(shots=1000, separate_observables=True)

Now we can decode! We compare PyMatching's predictions of the logical observables with the actual observables sampled with stim, in order to count the number of mistakes and estimate the logical error rate:

num_errors = 0
for i in range(syndrome.shape[0]):
    predicted_observables = matching.decode(syndrome[i, :])
    num_errors += not np.array_equal(actual_observables[i, :], predicted_observables)

print(num_errors)  # prints 8

As of PyMatching v2.1.0, you can use matching.decode_batch to decode a batch of shots instead. Since matching.decode_batch iterates over the shots in C++, it's faster than iterating over calls to matching.decode in Python. The following cell is therefore a faster equivalent to the cell above:

predicted_observables = matching.decode_batch(syndrome)
num_errors = np.sum(np.any(predicted_observables != actual_observables, axis=1))

print(num_errors)  # prints 8

Loading from a parity check matrix

We can also load a pymatching.Matching object from a binary parity check matrix, another representation of a Tanner graph. Each row in the parity check matrix H corresponds to a parity check, and each column corresponds to an error mechanism. The element H[i,j] of H is 1 if parity check i is flipped by error mechanism j, and 0 otherwise. To be used by PyMatching, the error mechanisms in H must be graphlike. This means that each column must contain either one or two 1s (if a column has a single 1, it represents a half-edge connected to the boundary).

We can give each edge in the graph a weight, by providing PyMatching with a weights numpy array. Element weights[j] of the weights array sets the edge weight for the edge corresponding to column j of H. If the error mechanisms are treated as independent, then we typically want to set the weight of edge j to the log-likelihood ratio log((1-p_j)/p_j), where p_j is the error probability associated with edge j. With this setting, PyMatching will find the most probable set of error mechanisms, given the syndrome.

With PyMatching configured using H and weights, decoding a binary syndrome vector syndrome (a numpy array of length H.shape[0]) corresponds to finding a set of errors defined in a binary predictions vector satisfying H@predictions % 2 == syndrome while minimising the total solution weight predictions@weights.

In quantum error correction, rather than predicting which exact set of error mechanisms occurred, we typically want to predict the outcome of logical observable measurements, which are the parities of error mechanisms. These can be represented by a binary matrix observables. Similar to the check matrix, observables[i,j] is 1 if logical observable i is flipped by error mechanism j. For example, suppose our syndrome syndrome, was the result of a set of errors noise (a binary array of length H.shape[1]), such that syndrome = H@noise % 2. Our decoding is successful if observables@noise % 2 == observables@predictions % 2.

Putting this together, we can decode a distance 5 repetition code as follows:

import numpy as np
from scipy.sparse import csc_matrix
import pymatching
H = csc_matrix([[1, 1, 0, 0, 0],
                 [0, 1, 1, 0, 0],
                 [0, 0, 1, 1, 0],
                 [0, 0, 0, 1, 1]])
weights = np.array([4, 3, 2, 3, 4])   # Set arbitrary weights for illustration
matching = pymatching.Matching(H, weights=weights)
prediction = matching.decode(np.array([0, 1, 0, 1]))
print(prediction)  # prints: [0 0 1 1 0]
# Optionally, we can return the weight as well:
prediction, solution_weight = matching.decode(np.array([0, 1, 0, 1]), return_weight=True)
print(prediction)  # prints: [0 0 1 1 0]
print(solution_weight)  # prints: 5.0

And in order to estimate the logical error rate for a physical error rate of 10%, we can sample as follows:

import numpy as np
from scipy.sparse import csc_matrix
import pymatching
H = csc_matrix([[1, 1, 0, 0, 0],
                [0, 1, 1, 0, 0],
                [0, 0, 1, 1, 0],
                [0, 0, 0, 1, 1]])
observables = csc_matrix([[1, 0, 0, 0, 0]])
error_probability = 0.1
weights = np.ones(H.shape[1]) * np.log((1-error_probability)/error_probability)
matching = pymatching.Matching.from_check_matrix(H, weights=weights)
num_shots = 1000
num_errors = 0
for i in range(num_shots):
    noise = (np.random.random(H.shape[1]) < error_probability).astype(np.uint8)
    syndrome = H@noise % 2
    prediction = matching.decode(syndrome)
    predicted_observables = observables@prediction % 2
    actual_observables = observables@noise % 2
    num_errors += not np.array_equal(predicted_observables, actual_observables)
print(num_errors)  # prints 4

Note that we can also ask PyMatching to predict the logical observables directly, by supplying them to the faults_matrix argument when constructing the pymatching.Matching object. This allows the decoder to make some additional optimisations, that speed up the decoding procedure a bit. The following example uses this approach, and is equivalent to the example above:

import numpy as np
from scipy.sparse import csc_matrix
import pymatching

H = csc_matrix([[1, 1, 0, 0, 0],
                [0, 1, 1, 0, 0],
                [0, 0, 1, 1, 0],
                [0, 0, 0, 1, 1]])
observables = csc_matrix([[1, 0, 0, 0, 0]])
error_probability = 0.1
weights = np.ones(H.shape[1]) * np.log((1-error_probability)/error_probability)
matching = pymatching.Matching.from_check_matrix(H, weights=weights, faults_matrix=observables)
num_shots = 1000
num_errors = 0
for i in range(num_shots):
    noise = (np.random.random(H.shape[1]) < error_probability).astype(np.uint8)
    syndrome = H@noise % 2
    predicted_observables = matching.decode(syndrome)
    actual_observables = observables@noise % 2
    num_errors += not np.array_equal(predicted_observables, actual_observables)

print(num_errors)  # prints 6

We'll make one more optimisation, which is to use matching.decode_batch to decode the batch of shots, rather than iterating over calls to matching.decode in Python:

import numpy as np
from scipy.sparse import csc_matrix
import pymatching

H = csc_matrix([[1, 1, 0, 0, 0],
                [0, 1, 1, 0, 0],
                [0, 0, 1, 1, 0],
                [0, 0, 0, 1, 1]])
observables = csc_matrix([[1, 0, 0, 0, 0]])
error_probability = 0.1
num_shots = 1000
weights = np.ones(H.shape[1]) * np.log((1-error_probability)/error_probability)
matching = pymatching.Matching.from_check_matrix(H, weights=weights, faults_matrix=observables)
noise = (np.random.random((num_shots, H.shape[1])) < error_probability).astype(np.uint8)
shots = (noise @ H.T) % 2
actual_observables = (noise @ observables.T) % 2
predicted_observables = matching.decode_batch(shots)
num_errors = np.sum(np.any(predicted_observables != actual_observables, axis=1))
print(num_errors)  # prints 6

Instead of using a check matrix, the Matching object can also be constructed using the Matching.add_edge and Matching.add_boundary_edge methods, or by loading from a NetworkX or rustworkx graph.

For more details on how to use PyMatching, see the documentation.

Attribution

When using PyMatching please cite our paper on the sparse blossom algorithm (implemented in version 2):

@article{higgott2023sparse,
  title={Sparse Blossom: correcting a million errors per core second with minimum-weight matching},
  author={Higgott, Oscar and Gidney, Craig},
  journal={arXiv preprint arXiv:2303.15933},
  year={2023}
}

Note: the previous PyMatching paper descibes the implementation in version 0.7 and earlier of PyMatching (not v2).

Acknowledgements

We are grateful to the Google Quantum AI team for supporting the development of PyMatching v2. Earlier versions of PyMatching were supported by Unitary Fund and EPSRC.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

PyMatching-2.2.0.tar.gz (311.3 kB view details)

Uploaded Source

Built Distributions

PyMatching-2.2.0-cp312-cp312-win_amd64.whl (319.9 kB view details)

Uploaded CPython 3.12 Windows x86-64

PyMatching-2.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (611.8 kB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

PyMatching-2.2.0-cp312-cp312-macosx_11_0_arm64.whl (365.6 kB view details)

Uploaded CPython 3.12 macOS 11.0+ ARM64

PyMatching-2.2.0-cp312-cp312-macosx_10_15_x86_64.whl (402.9 kB view details)

Uploaded CPython 3.12 macOS 10.15+ x86-64

PyMatching-2.2.0-cp312-cp312-macosx_10_15_universal2.whl (740.1 kB view details)

Uploaded CPython 3.12 macOS 10.15+ universal2 (ARM64, x86-64)

PyMatching-2.2.0-cp311-cp311-win_amd64.whl (318.3 kB view details)

Uploaded CPython 3.11 Windows x86-64

PyMatching-2.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (612.8 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

PyMatching-2.2.0-cp311-cp311-macosx_11_0_arm64.whl (364.4 kB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

PyMatching-2.2.0-cp311-cp311-macosx_10_15_x86_64.whl (400.7 kB view details)

Uploaded CPython 3.11 macOS 10.15+ x86-64

PyMatching-2.2.0-cp311-cp311-macosx_10_15_universal2.whl (736.5 kB view details)

Uploaded CPython 3.11 macOS 10.15+ universal2 (ARM64, x86-64)

PyMatching-2.2.0-cp310-cp310-win_amd64.whl (318.3 kB view details)

Uploaded CPython 3.10 Windows x86-64

PyMatching-2.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (613.1 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

PyMatching-2.2.0-cp310-cp310-macosx_11_0_arm64.whl (364.3 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

PyMatching-2.2.0-cp310-cp310-macosx_10_15_x86_64.whl (400.7 kB view details)

Uploaded CPython 3.10 macOS 10.15+ x86-64

PyMatching-2.2.0-cp310-cp310-macosx_10_15_universal2.whl (736.5 kB view details)

Uploaded CPython 3.10 macOS 10.15+ universal2 (ARM64, x86-64)

PyMatching-2.2.0-cp39-cp39-win_amd64.whl (317.2 kB view details)

Uploaded CPython 3.9 Windows x86-64

PyMatching-2.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (613.2 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

PyMatching-2.2.0-cp39-cp39-macosx_11_0_arm64.whl (364.5 kB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

PyMatching-2.2.0-cp39-cp39-macosx_10_15_x86_64.whl (400.7 kB view details)

Uploaded CPython 3.9 macOS 10.15+ x86-64

PyMatching-2.2.0-cp39-cp39-macosx_10_15_universal2.whl (736.7 kB view details)

Uploaded CPython 3.9 macOS 10.15+ universal2 (ARM64, x86-64)

PyMatching-2.2.0-cp38-cp38-win_amd64.whl (318.2 kB view details)

Uploaded CPython 3.8 Windows x86-64

PyMatching-2.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (613.0 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

PyMatching-2.2.0-cp38-cp38-macosx_11_0_arm64.whl (364.3 kB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

PyMatching-2.2.0-cp38-cp38-macosx_10_15_x86_64.whl (400.7 kB view details)

Uploaded CPython 3.8 macOS 10.15+ x86-64

PyMatching-2.2.0-cp38-cp38-macosx_10_15_universal2.whl (736.5 kB view details)

Uploaded CPython 3.8 macOS 10.15+ universal2 (ARM64, x86-64)

PyMatching-2.2.0-cp37-cp37m-win_amd64.whl (318.5 kB view details)

Uploaded CPython 3.7m Windows x86-64

PyMatching-2.2.0-cp37-cp37m-win32.whl (280.8 kB view details)

Uploaded CPython 3.7m Windows x86

PyMatching-2.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (614.5 kB view details)

Uploaded CPython 3.7m manylinux: glibc 2.17+ x86-64

PyMatching-2.2.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl (669.1 kB view details)

Uploaded CPython 3.7m manylinux: glibc 2.17+ i686

PyMatching-2.2.0-cp37-cp37m-macosx_10_15_x86_64.whl (398.9 kB view details)

Uploaded CPython 3.7m macOS 10.15+ x86-64

File details

Details for the file PyMatching-2.2.0.tar.gz.

File metadata

  • Download URL: PyMatching-2.2.0.tar.gz
  • Upload date:
  • Size: 311.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.11.4

File hashes

Hashes for PyMatching-2.2.0.tar.gz
Algorithm Hash digest
SHA256 d8046f5ef970c27b20d8dd55a01b89509d0eb4398abaf2ef725d77ef2b98d65a
MD5 4ab9a62d93f4c23fab75b9ee69428ec1
BLAKE2b-256 4cb8ce0dc76e62c8ea192fd10f85ba32cc5d4df976572b5d5ebde285a235e887

See more details on using hashes here.

File details

Details for the file PyMatching-2.2.0-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for PyMatching-2.2.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 3fa41b776e41c2687d76c05d68dbf3b5c4cabf942b6a5051eef41d6a8590fb21
MD5 c5bd3acad75ea9e3ee6dc9b191b75855
BLAKE2b-256 dae020d040829fdd8f5d7aadea463735dc3799e622d98879341e9063355fa8ba

See more details on using hashes here.

File details

Details for the file PyMatching-2.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for PyMatching-2.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7bc5b967002e941178c50cc79124688f7f4a2454d5de87678b074ed2d2cbc236
MD5 599c355aed743d8e8761affc83d9ae92
BLAKE2b-256 9631f265fcb071dced699c8835ef84f3a99b1a8206e7d8577d4038d0a667cd66

See more details on using hashes here.

File details

Details for the file PyMatching-2.2.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for PyMatching-2.2.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 db67924b7603af9d845423b037048f982c6cc687e582239f3640a4e1b0e3caba
MD5 4580facb8c8c8ca70535956454a9a7ed
BLAKE2b-256 48291e61d3f9db43b7a4c7400ab962af34fcd4beaa82e883298f22345f6c6d67

See more details on using hashes here.

File details

Details for the file PyMatching-2.2.0-cp312-cp312-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for PyMatching-2.2.0-cp312-cp312-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 2ef156437f345819c881d3aebb339c784c42f55438f07007ad24c05bb22dd61d
MD5 2a98256716a44f55ab97035974c3173d
BLAKE2b-256 6890a86ca81d417fa101a4744e597f2a5c703381fb554cc116e1469cd09e6f44

See more details on using hashes here.

File details

Details for the file PyMatching-2.2.0-cp312-cp312-macosx_10_15_universal2.whl.

File metadata

File hashes

Hashes for PyMatching-2.2.0-cp312-cp312-macosx_10_15_universal2.whl
Algorithm Hash digest
SHA256 050b530f0854d424cb5ba4450f9c5a4283e0d9bb5ef5b849b37ac5312dcca08d
MD5 c6da135da5c01b398c7baef81609b934
BLAKE2b-256 2f2b1dc54d3a6ea1dc975a4f1796384f2dae854de8ad4818d27a2cf040c5a58d

See more details on using hashes here.

File details

Details for the file PyMatching-2.2.0-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for PyMatching-2.2.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 ee1a5e8ed401309959baac06c784bf044cc3940b06ddfacf2a61579a8c0c70e3
MD5 555bca1a00ad6179ef288951cd9738e9
BLAKE2b-256 9449919fc0a778ae8ab6af537b31cdf369982b0ea3fbfc738d7a125ad2a8fd0f

See more details on using hashes here.

File details

Details for the file PyMatching-2.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for PyMatching-2.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 fd5688f18d63e7981656f3c8f9ffef4ef22a74228b10e47100311a97f0184cb7
MD5 752ed6f1152ede3f8cf14d057742961b
BLAKE2b-256 a995c29eb42188b891a29a03c06a7838e26ba9af8bde77933a90066595e9516f

See more details on using hashes here.

File details

Details for the file PyMatching-2.2.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for PyMatching-2.2.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f239f77d7c0968606b8b4d1e6ca8e86b17be59ecee236538b6e61dea0affa44d
MD5 46f856a948de986fa4e017250c799172
BLAKE2b-256 1d4e3a955ff8a5ff7f7c51a2b0578cf27ac69c1689cdd1535972ca6d0dbc97ea

See more details on using hashes here.

File details

Details for the file PyMatching-2.2.0-cp311-cp311-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for PyMatching-2.2.0-cp311-cp311-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 3136194ed00c432f4890d0e6224cd857b45013aefdecf1bad3a30a93d8da2207
MD5 32a80c994e2e5468f067d7958f3f6d81
BLAKE2b-256 cfa087abc37ede6846eb89f7cb99b97700f324f8edda708106f34ee5674fbf3a

See more details on using hashes here.

File details

Details for the file PyMatching-2.2.0-cp311-cp311-macosx_10_15_universal2.whl.

File metadata

File hashes

Hashes for PyMatching-2.2.0-cp311-cp311-macosx_10_15_universal2.whl
Algorithm Hash digest
SHA256 353b4b0491aaf71a3ca72714bb996bdb9d8e2bf4803cf905455332f5c2d22779
MD5 c5fddd3ee8066fe3766d819e9480c1de
BLAKE2b-256 14e51f29cb952249f3742f4a68997419c2fedfb0f8923955df6ba1b87c69bdf5

See more details on using hashes here.

File details

Details for the file PyMatching-2.2.0-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for PyMatching-2.2.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 d08710cfc734ce8214ea242a7f1c8547105b37166ba4b61c34636bbafce967be
MD5 e9f09fc37a4d95d0cdf603db871a30bf
BLAKE2b-256 35868efbe20e165bc13a0c963fed29a31f81b2696d9a86f1b396ecf7d3fca848

See more details on using hashes here.

File details

Details for the file PyMatching-2.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for PyMatching-2.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f11f5ea748fd69c28c93301f8aa59c6d5be6a8caec313cebc6089e29dcf5168f
MD5 51ae5d8cff6946e37e7be46ee351a7fd
BLAKE2b-256 579aa38ee0c6301f4f38142e741898b1e7c8c2789912da4d044ee8df7489dd21

See more details on using hashes here.

File details

Details for the file PyMatching-2.2.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for PyMatching-2.2.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5f1dc0efd6cd1634f72d7ca2b260b7b287a996460075861e27af89b078eb1293
MD5 c6b2d4cc3d49e8aa5284d75be3b3c855
BLAKE2b-256 4c9d4dbd1d0283bcc4d6a67bcd48b060c3e990d6fca491ba2b8ee56b279c7fa0

See more details on using hashes here.

File details

Details for the file PyMatching-2.2.0-cp310-cp310-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for PyMatching-2.2.0-cp310-cp310-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 2812c2602c9f1c91e73920fecbd1916b941e911538b4495265bfdc3b3e066fbe
MD5 7ef93cd63a017cce6e69734530128a24
BLAKE2b-256 84cf297ca1cea1d9070b96ac6aff7ddad8f2633fb8a6ffc3f5dac384c42573e7

See more details on using hashes here.

File details

Details for the file PyMatching-2.2.0-cp310-cp310-macosx_10_15_universal2.whl.

File metadata

File hashes

Hashes for PyMatching-2.2.0-cp310-cp310-macosx_10_15_universal2.whl
Algorithm Hash digest
SHA256 ecb65e6897ce0ce3c841771e6d4d9d22aafbc174185f2d1a6441c310d1783059
MD5 c2affe4d1ae8309f7f29dc87576ce90f
BLAKE2b-256 c862aa21c1f04bddb2756156c3a308a2f906e8de0b4db5755f57dff710a71e17

See more details on using hashes here.

File details

Details for the file PyMatching-2.2.0-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: PyMatching-2.2.0-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 317.2 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.11.4

File hashes

Hashes for PyMatching-2.2.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 5d2fe3f8a0665d40fb3e5f3115913285833434c9eb36b11740bfaede29fa7941
MD5 ee43122910c5ab387f0db5d7a188673c
BLAKE2b-256 5890868b25e0b9ad3d78928d77ccd133b579a5e0d0fdbd2255186ca9355c4b5d

See more details on using hashes here.

File details

Details for the file PyMatching-2.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for PyMatching-2.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 72b3acd0160b49b61d5beaf184cf48edd3ee0eb16fc4fc379486f4a767cd565c
MD5 5938a6d5bd4a88d80a2282b228e393bd
BLAKE2b-256 5b88a1c0dac0c07ad056c94df1841079eed3c3b0ebbefc18ed4e846e40587e35

See more details on using hashes here.

File details

Details for the file PyMatching-2.2.0-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for PyMatching-2.2.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1b99299344a62c243e1d2d9012a49976761c42dc24a9448f6972436209d6b6cd
MD5 3f02cbcc40176ac6aada2768b30b24b2
BLAKE2b-256 26072bcbee19f71d0ca309e26b9f273fadeca658c1509fa48afa39d7f8c1041a

See more details on using hashes here.

File details

Details for the file PyMatching-2.2.0-cp39-cp39-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for PyMatching-2.2.0-cp39-cp39-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 749d2ddf85e18788a5b063b88340ef5674f68d3ba82180915e05c0401182d5fb
MD5 22c0a5c4fafab938ca722e4d5b289b0e
BLAKE2b-256 6c70d8e5fa62a3b6f45f64b7fee0a7fbfed1bf4a8cd7bac9241d73d5a10d8e22

See more details on using hashes here.

File details

Details for the file PyMatching-2.2.0-cp39-cp39-macosx_10_15_universal2.whl.

File metadata

File hashes

Hashes for PyMatching-2.2.0-cp39-cp39-macosx_10_15_universal2.whl
Algorithm Hash digest
SHA256 634b2a7316e835da9def77d367cfc8dce680e44daa1643e365659e90d8f91c93
MD5 1fcd052ad822b69155aa7e85c63eb40a
BLAKE2b-256 e7c0100aab4191cac23c865b0924dd2bc0afae88741df5af339af9ea2bf75504

See more details on using hashes here.

File details

Details for the file PyMatching-2.2.0-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: PyMatching-2.2.0-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 318.2 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.11.4

File hashes

Hashes for PyMatching-2.2.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 040881cab6cac71be54851b1ef0c0ad296fb6f6a42ad02246bfdc63d50fc50a7
MD5 67c0aa01d35ca88a19cf7bbad7c9d8a2
BLAKE2b-256 0fa1a3d5e95e87a70f8f06cdb88d1f182682c5a6981bf008413da39899545632

See more details on using hashes here.

File details

Details for the file PyMatching-2.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for PyMatching-2.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e831cf0f68b5f76cd6f1e2458f2dd5937d41b34ecc002f534eeb7e6b2db8f755
MD5 16f4bbef2e372eac0d162e93bdff8ce4
BLAKE2b-256 a3721d5db06a711cdd856b201698ccdb0bf2e6875f811be21fa48bdc4cd5488d

See more details on using hashes here.

File details

Details for the file PyMatching-2.2.0-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for PyMatching-2.2.0-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 da06e0195a918b8c304d1cbc0d37968b863d97bbd46887bfabf8c1d96d23e27f
MD5 c74f37055a9a7c3fedc73d165a9c8fa0
BLAKE2b-256 0d8039ccc57b5ec5c9559623948b2b8c395ce0fe3a00ded7ad4212950dda114e

See more details on using hashes here.

File details

Details for the file PyMatching-2.2.0-cp38-cp38-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for PyMatching-2.2.0-cp38-cp38-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 30b2cab3c4159d4accf87025a62e2e4bb9b45df630c8afa01f2d131734043a57
MD5 7a8762be0c3a2a157892809e85c51e92
BLAKE2b-256 3f82ebd9b32fcbe61886b6eff042ffacbe9b93ff3b3cd702db77d33262619852

See more details on using hashes here.

File details

Details for the file PyMatching-2.2.0-cp38-cp38-macosx_10_15_universal2.whl.

File metadata

File hashes

Hashes for PyMatching-2.2.0-cp38-cp38-macosx_10_15_universal2.whl
Algorithm Hash digest
SHA256 bf851a139a136ccbab3024bab476ecbd22ce44f4c4848f9b189ff1bf57d9adb1
MD5 c83b4121df46880a003ff31571dbf1de
BLAKE2b-256 6cc9ebc224b4e3fce4a40ac9714c07b0b571c45198e11464119bfd5ae55dea0a

See more details on using hashes here.

File details

Details for the file PyMatching-2.2.0-cp37-cp37m-win_amd64.whl.

File metadata

File hashes

Hashes for PyMatching-2.2.0-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 6ab55daed4d0c35a96e5eab3162c0ffe9c5d7d13093db9d4d14bac4d6851c754
MD5 7b0d27c59444ccb4e7c49e6f0e9326f4
BLAKE2b-256 28744451f67658def0c9b3ddd75d5791df6beea33e5e64de8d9c5a6ab6441de2

See more details on using hashes here.

File details

Details for the file PyMatching-2.2.0-cp37-cp37m-win32.whl.

File metadata

  • Download URL: PyMatching-2.2.0-cp37-cp37m-win32.whl
  • Upload date:
  • Size: 280.8 kB
  • Tags: CPython 3.7m, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.11.4

File hashes

Hashes for PyMatching-2.2.0-cp37-cp37m-win32.whl
Algorithm Hash digest
SHA256 57acf834e2ba95c412060c63f70f44b0210bdd2f52395f4c9fb9b37c68d2f35c
MD5 26a5da4d916e5c15a73898215c1f07f7
BLAKE2b-256 d25aad448ae1135b26e20da5f87aa2da7501af1c1731924ce66642698958f5eb

See more details on using hashes here.

File details

Details for the file PyMatching-2.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for PyMatching-2.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 580b9c9bb33c883b25e139bb9c2649bb1f245fe7c6b514dfb788e395c9276a0e
MD5 db6d6d707ccb2d7cb932d9dcf433030d
BLAKE2b-256 07a801f96d05f8f02946457f3c6a037bf478f32768ab0fbe71b903e31c5ef65e

See more details on using hashes here.

File details

Details for the file PyMatching-2.2.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for PyMatching-2.2.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 fe02d4fd348ce7b8613cb7c995a2cc0479a7a46f233d25810d522c5cad225251
MD5 45876371b2a77e8a0dcf400e946c5648
BLAKE2b-256 27bcdf801a5a1e9c0ee6a1a100d1fac5cf3a083444b778da54a6738c46adedac

See more details on using hashes here.

File details

Details for the file PyMatching-2.2.0-cp37-cp37m-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for PyMatching-2.2.0-cp37-cp37m-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 a49213fcafe5ca07aaf6e05982cba612b65e0a2560c99996b8754bf8e81d5fc8
MD5 37982bb36f4d0c0aa68314a976e48317
BLAKE2b-256 deabb606d6f93f7e923269f8ff0207a9a06caa6ed6557ab9e8c1f9ccedc06748

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page