PyMatching v2.0.0
Changes made for v2.0
Flagship changes:
- The C++ extension has been completely rewritten, and includes a new implementation of the blossom algorithm
- PyMatching v2.0 is now around 100-1000x faster than PyMatching v0.7 for decoding surface codes with circuit-level noise
- The new implementation is also exact. It does not make the "local matching" approximation used in v0.7 and earlier,
which resulted in a reduction in accuracy for very large surface code circuits - The runtime of the new version is approximately linear in the size of the graph, and can process between 1 and 10
million detection events per second
Features and improvements
-
Decoding speeds improved 100-1000x
-
pymatching.Matching.load_from_check_matrixis around 30x faster -
Added methods to
pymatching.Matching:pymatching.Matching.add_boundary_edgepymatching.Matching.decode_to_matched_dets_arraypymatching.Matching.decode_to_matched_dets_dictpymatching.Matching.has_edgepymatching.Matching.get_edge_datapymatching.Matching.set_min_num_fault_ids
-
Added static methods to
pymatching.Matching:pymatching.Matching.from_detector_error_modelpymatching.Matching.from_check_matrix(static method equivalent to constructing a newpymatching.Matchingand
then callingpymatching.Matching.load_from_check_matrix)
-
merge_strategyargument added topymatching.Matching.add_edge,pymatching.Matching.add_boundary_edgeand
pymatching.Matching.load_from_check_matrix. When an attempt is made to
add an edge already present in the graph, the following strategies are available:disallow: raises aValueErrorif a parallel edge is addedindependent: edge weights and error probabilities updated treating the parallel edges as independent error mechanismssmallest-weight: The edge with the smallest weight is keptkeep-original: The existing edge is kept and the new edge is silently ignoredreplace: Only the edge being added is kept
-
faults_matrixargument added topymatching.Matching.from_check_matrix.faults_matrixis an array that can be used to set
thefault_idsattribute of edges in a graph loaded from a check matrix. For example,faults_matrixcan be used to specify the
logical observables whose outcome should be predicted by the decoder.
Minor changes to the API
spacelike_weightsrenamed toweightsinpymatching.Matching.load_from_check_matrix. Butspacelike_weights
still accepted for backward compatibility.Hrenamed tographin the constructor forpymatching.Matching.Hstill accepted for backward compatibility.precompute_shortest_pathsargument removed from constructor (won't break if supplied)- Both a virtual boundary node (via
pymatching.Matching.add_boundary_edge) and a regular boundary node are supported.
These are treated equivalently by the decoder, but are treated differently bypymatching.Matching.edges,
pymatching.Matching.to_networkxandpymatching.Matching.to_retworkx
Minor breaking changes to the API
pymatching.Matching.matching_graphrenamed topymatching.Matching._matching_graph(since this property is only
intended to be used internally to access the C++ extension)pymatching.Matching.decodearguments after the first argument are now keyword-only, andnum_neighbourshas been
removed as an argument. Users' code won't break or raise a warning if they already used keyword arguments (andnum_neighboursis
silently ignored when provided). If users providenum_neighboursorreturn_weightas a positional argument, a deprecation warning is raised.pymatching.Matching.compute_all_pairs_shortest_pathsmethod removed
Bug fixes
- Fixed a bug where timelike error probabilities were set incorrectly if provided as a scalar