Skip to main content

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

Project description

PyMatching 2.0

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

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

Version 2.0 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.

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 v2.0 can decode a distance 19 surface code in less than 1 microsecond per measurement round, and the runtime is approximately linear in the size of the graph.

The benchmarks in the two plots below (run on an M1 chip) compare the performance of PyMatching v2.0 with the previous version (v0.7) as well as with NetworkX for decoding surface code circuits with circuit-level depolarising noise. The equations T=N^x in the legends (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.

Decoding time per round for p=0.1% circuit-level noise Decoding time per round for p=0.5% circuit-level noise

Sparse blossom is conceptually similar to the approach described in this paper by Austin Fowler, although our approach differs in many of the details (which will be explained in our upcoming 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 retworkx.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

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_errors = 0
for i in range(1000):
    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 estimate 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_errors = 0
for i in range(1000):
    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

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 retworkx graph.

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

Attribution

A paper on our new implementation used in PyMatching version 2.0 (sparse blossom) will be published soon. In the meantime, please cite:

@misc{pymatchingv2,
  author = {Higgott, Oscar and Gidney, Craig},
  title = {PyMatching v2},
  year = {2022},
  publisher = {GitHub},
  journal = {GitHub repository},
  howpublished = {\url{https://github.com/oscarhiggott/PyMatching}}
}

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

Acknowledgements

We are grateful to the Google Quantum AI team for supporting the development of PyMatching v2.0. 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.0.dev0.tar.gz (303.8 kB view details)

Uploaded Source

Built Distributions

PyMatching-2.0.dev0-cp311-cp311-win_amd64.whl (292.2 kB view details)

Uploaded CPython 3.11 Windows x86-64

PyMatching-2.0.dev0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (628.5 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

PyMatching-2.0.dev0-cp311-cp311-macosx_11_0_arm64.whl (398.5 kB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

PyMatching-2.0.dev0-cp311-cp311-macosx_10_15_x86_64.whl (429.0 kB view details)

Uploaded CPython 3.11 macOS 10.15+ x86-64

PyMatching-2.0.dev0-cp311-cp311-macosx_10_15_universal2.whl (803.8 kB view details)

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

PyMatching-2.0.dev0-cp310-cp310-win_amd64.whl (292.3 kB view details)

Uploaded CPython 3.10 Windows x86-64

PyMatching-2.0.dev0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (628.5 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

PyMatching-2.0.dev0-cp310-cp310-macosx_11_0_arm64.whl (398.5 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

PyMatching-2.0.dev0-cp310-cp310-macosx_10_15_x86_64.whl (429.0 kB view details)

Uploaded CPython 3.10 macOS 10.15+ x86-64

PyMatching-2.0.dev0-cp310-cp310-macosx_10_15_universal2.whl (803.8 kB view details)

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

PyMatching-2.0.dev0-cp39-cp39-win_amd64.whl (291.0 kB view details)

Uploaded CPython 3.9 Windows x86-64

PyMatching-2.0.dev0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (628.7 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

PyMatching-2.0.dev0-cp39-cp39-macosx_11_0_arm64.whl (398.6 kB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

PyMatching-2.0.dev0-cp39-cp39-macosx_10_15_x86_64.whl (429.3 kB view details)

Uploaded CPython 3.9 macOS 10.15+ x86-64

PyMatching-2.0.dev0-cp39-cp39-macosx_10_15_universal2.whl (804.1 kB view details)

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

PyMatching-2.0.dev0-cp38-cp38-win_amd64.whl (292.5 kB view details)

Uploaded CPython 3.8 Windows x86-64

PyMatching-2.0.dev0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (628.2 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

PyMatching-2.0.dev0-cp38-cp38-macosx_11_0_arm64.whl (398.4 kB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

PyMatching-2.0.dev0-cp38-cp38-macosx_10_15_x86_64.whl (428.9 kB view details)

Uploaded CPython 3.8 macOS 10.15+ x86-64

PyMatching-2.0.dev0-cp38-cp38-macosx_10_15_universal2.whl (803.7 kB view details)

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

PyMatching-2.0.dev0-cp37-cp37m-win_amd64.whl (293.0 kB view details)

Uploaded CPython 3.7m Windows x86-64

PyMatching-2.0.dev0-cp37-cp37m-win32.whl (258.7 kB view details)

Uploaded CPython 3.7m Windows x86

PyMatching-2.0.dev0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (630.5 kB view details)

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

PyMatching-2.0.dev0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl (688.3 kB view details)

Uploaded CPython 3.7m manylinux: glibc 2.17+ i686

PyMatching-2.0.dev0-cp37-cp37m-macosx_10_15_x86_64.whl (427.6 kB view details)

Uploaded CPython 3.7m macOS 10.15+ x86-64

PyMatching-2.0.dev0-cp36-cp36m-win_amd64.whl (293.1 kB view details)

Uploaded CPython 3.6m Windows x86-64

PyMatching-2.0.dev0-cp36-cp36m-win32.whl (258.7 kB view details)

Uploaded CPython 3.6m Windows x86

PyMatching-2.0.dev0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (630.5 kB view details)

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

PyMatching-2.0.dev0-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl (688.6 kB view details)

Uploaded CPython 3.6m manylinux: glibc 2.17+ i686

PyMatching-2.0.dev0-cp36-cp36m-macosx_10_15_x86_64.whl (427.6 kB view details)

Uploaded CPython 3.6m macOS 10.15+ x86-64

File details

Details for the file PyMatching-2.0.dev0.tar.gz.

File metadata

  • Download URL: PyMatching-2.0.dev0.tar.gz
  • Upload date:
  • Size: 303.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.15

File hashes

Hashes for PyMatching-2.0.dev0.tar.gz
Algorithm Hash digest
SHA256 d6c7af905a84a52854844905d6bfe568c0c562117308bd659bb74f961c7b85b2
MD5 3ca1fb9388d12345b3fd7f10ba39ccc8
BLAKE2b-256 f77e598aa1630308a188e69324ac10261a62e4a5561a07c65abe4b6a6f7f834f

See more details on using hashes here.

File details

Details for the file PyMatching-2.0.dev0-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for PyMatching-2.0.dev0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 b67b702ce1a3deac073101149aabd96ee55ce52eadd2f8dc6d6092736f246fc3
MD5 ea304eea4eff7c1da410c1d2e1074568
BLAKE2b-256 760a8722977b5265e427873f0188c8963c2c1d72326a0f69aa49e28d5a0a72d0

See more details on using hashes here.

File details

Details for the file PyMatching-2.0.dev0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for PyMatching-2.0.dev0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3b2d11109dfd39f87cc8a3b2781568a3a765dc37a85226b7cff2f3a99402ccea
MD5 a4f4afd8fa1d134630e5b224065a9fc4
BLAKE2b-256 529078af269fcf0e6839a3597a0ce68c6ddcc4b9b90ef27a69e91acf4410608b

See more details on using hashes here.

File details

Details for the file PyMatching-2.0.dev0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for PyMatching-2.0.dev0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0fd8e9263c59313194caf0fe328080ada6433ac07a81ac5a01ff9ffccd122a13
MD5 230ed68a3f80749a6592d8a622bb3845
BLAKE2b-256 928f5fb30f3b01ee7cc97f70b6bfbc5a0aea007f434628b41a4337f702157988

See more details on using hashes here.

File details

Details for the file PyMatching-2.0.dev0-cp311-cp311-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for PyMatching-2.0.dev0-cp311-cp311-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 26f564e68dde65aed738b6879c814428d9b3dd8dfd2cd89fccc20a38a8440c42
MD5 01f3673bebba86ad886f42ada4464573
BLAKE2b-256 5789fc35c4c08b98aa43dfab2a9e519d71bef26e18b83d83407d22309848b612

See more details on using hashes here.

File details

Details for the file PyMatching-2.0.dev0-cp311-cp311-macosx_10_15_universal2.whl.

File metadata

File hashes

Hashes for PyMatching-2.0.dev0-cp311-cp311-macosx_10_15_universal2.whl
Algorithm Hash digest
SHA256 0f534b4add1f94c9517ca68c02df442117ab3bc3af85b0e3e29898a83a08d2de
MD5 e22fa1969ab22e5b58d792ef4d149c10
BLAKE2b-256 f81f119dd2b6aa9f89f1dfd462cefa16f630376a9b53f3fcb4bbe2555645fa04

See more details on using hashes here.

File details

Details for the file PyMatching-2.0.dev0-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for PyMatching-2.0.dev0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 af43ba920e75abeef79c3948e3767f3c03b14745366688b10afb8d9c26259b8d
MD5 fbcc57b44f9ef690dc5214a76757ef0d
BLAKE2b-256 5935231c5fdda79f75f115101c59b4d82d9a97705b7c843ecfca6641e74e4cfe

See more details on using hashes here.

File details

Details for the file PyMatching-2.0.dev0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for PyMatching-2.0.dev0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 47df0d178c425e302575f4febb79bfc6078f7215cd9fee845f2caecf8f446b49
MD5 cee112afc63a6bfebeece684d23e43f0
BLAKE2b-256 aee9416325816eaa18230a5cc478f170a472c762e9a4cb7ad20f2242e80d2d1d

See more details on using hashes here.

File details

Details for the file PyMatching-2.0.dev0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for PyMatching-2.0.dev0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 dfee7bc5e6fce0280270d1c59adc8c270f17b9439d636e7216ebc5c7b0cfe13c
MD5 c443a23b4a1ca22762c6bfd1e68ff79c
BLAKE2b-256 70748f43e6c3183d2bfa5800cc12398ec97edc8ad3d1e17e073698932f399c67

See more details on using hashes here.

File details

Details for the file PyMatching-2.0.dev0-cp310-cp310-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for PyMatching-2.0.dev0-cp310-cp310-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 4b9174e7aeedd0b1c485bd08b88afcebc6759e573d1d405ebc528bbeb508f68c
MD5 cdbfb46c842e255c744b04165de4c243
BLAKE2b-256 095c76452ce7b70bbb3c1980d10fb5eb49c18daec761887af11be2f9df7aa1f2

See more details on using hashes here.

File details

Details for the file PyMatching-2.0.dev0-cp310-cp310-macosx_10_15_universal2.whl.

File metadata

File hashes

Hashes for PyMatching-2.0.dev0-cp310-cp310-macosx_10_15_universal2.whl
Algorithm Hash digest
SHA256 93fe4cffa32ad4e70d61ed32644fc6da9c0b2fc57cb49e6ee90b4b5e8f0d1dc3
MD5 c0068c4f353c5372272596b7d33eeb50
BLAKE2b-256 9df07a65f5a34297a7ca174b4b92685a3d99381e94e73bbf8ed42b408554f10f

See more details on using hashes here.

File details

Details for the file PyMatching-2.0.dev0-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for PyMatching-2.0.dev0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 188c3933db34e3d3d7a425f0c466f229772ccb05ddd0a0e616f8c49463667515
MD5 40016b941ae854157bf05e7db5b2cdf5
BLAKE2b-256 783d4fbeac6299b938a4af039174987a6b6461e33833ff1d4b144b21ec79b99e

See more details on using hashes here.

File details

Details for the file PyMatching-2.0.dev0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for PyMatching-2.0.dev0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 89e4bf6b741a670f624db1f0df854078b3a8d916178694df6cce2b467334ff7a
MD5 c6566e7349dc53a97426c7d29ed51a05
BLAKE2b-256 6448f6ac9f49d895556cc0e47a090f7a00e13154aae558f2b2c0ca3f0844e7a7

See more details on using hashes here.

File details

Details for the file PyMatching-2.0.dev0-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for PyMatching-2.0.dev0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3d299bae568c16ecccf399ee8a84f9800961a1196835d685d51d470e2db4ca3f
MD5 1b0275eb1b0390d6d58d02a323d73521
BLAKE2b-256 a7105718b6f42cde285702670911e7cb4921715f7eae6c0e1bf20415a79f5305

See more details on using hashes here.

File details

Details for the file PyMatching-2.0.dev0-cp39-cp39-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for PyMatching-2.0.dev0-cp39-cp39-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 88b59a0965711e6d9a4c7ca2270778919eefa8daa856cae1f6c9537f405465c3
MD5 c7f5a42074d18af59896c7f8a9bca6d2
BLAKE2b-256 e179c92843a43240be159fdcf59327452d451ff362db18b830b5806053b4aaae

See more details on using hashes here.

File details

Details for the file PyMatching-2.0.dev0-cp39-cp39-macosx_10_15_universal2.whl.

File metadata

File hashes

Hashes for PyMatching-2.0.dev0-cp39-cp39-macosx_10_15_universal2.whl
Algorithm Hash digest
SHA256 88a12da0b530dbcae0772ffc2c5b80351889848970e6540b7ffa7db710fd4923
MD5 b51a7e70e6e3e66f28cb75c1b6ce7b0e
BLAKE2b-256 8d33b4cfc5cb5198ef8e602a699ada866d4789588b2beb8e89afb6d9ae0cb330

See more details on using hashes here.

File details

Details for the file PyMatching-2.0.dev0-cp38-cp38-win_amd64.whl.

File metadata

File hashes

Hashes for PyMatching-2.0.dev0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 b0149bc4671ac14baf9ebe43b02395f62d30d67ac0302e3c1fe3cc3c20b56f91
MD5 cccbc3b3473534634abe5bbe536b6e78
BLAKE2b-256 c0ec984d64ed220ed2df60db5ac10fd1fdc329d0a8e51e590b82bb65857f7064

See more details on using hashes here.

File details

Details for the file PyMatching-2.0.dev0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for PyMatching-2.0.dev0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f976cca1bcda0009df3bc2d1ed08d847d9ca9203b03915aa978b57414eb78ab5
MD5 8f9aa73f7ba8464809a36e51e1521b65
BLAKE2b-256 1fd24b7d67ab53a66ea0022b0a3c0171c0513ef12ab560aa5a7d37d3b296a168

See more details on using hashes here.

File details

Details for the file PyMatching-2.0.dev0-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for PyMatching-2.0.dev0-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c9137eab668de102ed546ba2b2afd9756eb2b267d791d61bc21ffb670189e397
MD5 2fa2c7c48fd086da3ad7bd6071d69dbe
BLAKE2b-256 9f772ab658dd961b1a235ced9b3330701b652b927d4ec672cdb95c2695ecc493

See more details on using hashes here.

File details

Details for the file PyMatching-2.0.dev0-cp38-cp38-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for PyMatching-2.0.dev0-cp38-cp38-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 71bd78132cbd5053f01a6513ceb10f5685b1a5b948a7ef9b0f384e97ff95d0ce
MD5 77e3407424b4e4b6ac092c78d241c17e
BLAKE2b-256 16934d293584c2608b225832f5af5e638adaf1afb0ee899134d5b97ff95a1471

See more details on using hashes here.

File details

Details for the file PyMatching-2.0.dev0-cp38-cp38-macosx_10_15_universal2.whl.

File metadata

File hashes

Hashes for PyMatching-2.0.dev0-cp38-cp38-macosx_10_15_universal2.whl
Algorithm Hash digest
SHA256 bc127a760b1ae7c00ba4981722b8cb6359f4536b243619d9aa9c5337e079af0b
MD5 e5732a29b165afc420026c90da6c762b
BLAKE2b-256 879a5530425a631ad959d09a1bef641c6968e1878462fb997cc3cbfebb0fe07c

See more details on using hashes here.

File details

Details for the file PyMatching-2.0.dev0-cp37-cp37m-win_amd64.whl.

File metadata

File hashes

Hashes for PyMatching-2.0.dev0-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 97ff13044e2061faeae26db15fdb91ba0457440335cf96fdccb3fa7c657de142
MD5 52dde8686f768124c6d6b96815d9da36
BLAKE2b-256 0ef3a450090f9f18c3808e4077fc4b9945fedba3400d47f0db67a647d078cc7f

See more details on using hashes here.

File details

Details for the file PyMatching-2.0.dev0-cp37-cp37m-win32.whl.

File metadata

File hashes

Hashes for PyMatching-2.0.dev0-cp37-cp37m-win32.whl
Algorithm Hash digest
SHA256 7ab4aa2e2cf986e2da4516714929d89c975566db9eabdd07f69b97ec501a1ed8
MD5 2119327d0e9e1b274128e27b3ac98588
BLAKE2b-256 80d6beeab68072ce878af29479eca80b7595c6aabf977629f4b88c9d486a037b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for PyMatching-2.0.dev0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e554f89f7e526f02e98d0f2d9ce7e75a61c5d5368cb825efebca468d005de4a6
MD5 77189df3a8cc736109b2d5de7536547c
BLAKE2b-256 b3b2c6254c3f163e781d440118c411a3cd50b45c5313b0b84b9eaf431c484d4b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for PyMatching-2.0.dev0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 8ab141592d99f265812bca7b42b64008e27e30e7d9d6f91d607140007970693b
MD5 d755f52176acfb274e3ea7c8fc0b82e8
BLAKE2b-256 06ec99b3a0447de5d8cd7b11a6330608ed0339557d226859732b752021b59e9d

See more details on using hashes here.

File details

Details for the file PyMatching-2.0.dev0-cp37-cp37m-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for PyMatching-2.0.dev0-cp37-cp37m-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 d83be6dff6f9b27a5353dc470b5c9e7dc160576dbc57c63a685adbe522281485
MD5 535d3ca93aedf9baccbbdca7618bf33c
BLAKE2b-256 7c9d358bad1b028ccba571d4f91eb70c0e536a8d0799a62d66427e0ba2d5f7e1

See more details on using hashes here.

File details

Details for the file PyMatching-2.0.dev0-cp36-cp36m-win_amd64.whl.

File metadata

File hashes

Hashes for PyMatching-2.0.dev0-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 5ba024a1a0cdc248f0447d26b0e0d8474d37cfecb9224760e877d2ef9b0084fa
MD5 fe19eb47dfc24d307c10884611cfc92d
BLAKE2b-256 2b7c1a505abaf3232f4a219d5f07f09da610d3d5352ae815b230bbf84d51f3d9

See more details on using hashes here.

File details

Details for the file PyMatching-2.0.dev0-cp36-cp36m-win32.whl.

File metadata

File hashes

Hashes for PyMatching-2.0.dev0-cp36-cp36m-win32.whl
Algorithm Hash digest
SHA256 f10794afcf7f1578c8aa75c602f92a63e7e2ec568bfe832eec07257c80acaafc
MD5 18f384bbf84ad3c0e938386dfd8f9ec0
BLAKE2b-256 a0d3551b0d2965993ac31bb9be1920205671096ef80c2fea1f8b3a1e187475c9

See more details on using hashes here.

File details

Details for the file PyMatching-2.0.dev0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for PyMatching-2.0.dev0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 420803d6fcd7e0f03885e978740682e3a0dee3d36149b2bd723ad2bc34a09af9
MD5 eb6b90cc4161a7ffdfff4a3bad390781
BLAKE2b-256 888744aa6ccdf775ff31e5fefb7acfd8b7bda17f25ae080ff492591d6c0f495a

See more details on using hashes here.

File details

Details for the file PyMatching-2.0.dev0-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for PyMatching-2.0.dev0-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 3becffc81abd1517baf4d0a81180b9c08a3cb65bf1735041e881e056713c149b
MD5 40834d94bce832dbf8219d7cf41905a1
BLAKE2b-256 72a8347d5da4a6b8ae72d771146cad0f449102d3d681ec62635a16864ed75d10

See more details on using hashes here.

File details

Details for the file PyMatching-2.0.dev0-cp36-cp36m-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for PyMatching-2.0.dev0-cp36-cp36m-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 05b3344307ea0a4fde147863e95e5f522177b3b7e2ff1fc21c097afae5fd5a87
MD5 fc9643d4d34a9b9ecdc5e3e1ed80b649
BLAKE2b-256 82806c440dbc9a0195c9efff22156bc94b8bb522c09e24cdc15107a96fc95b16

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