sinter 1.15.dev1730523741__tar.gz → 1.15.dev1733301548__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of sinter might be problematic. Click here for more details.

Files changed (66) hide show
  1. {sinter-1.15.dev1730523741/src/sinter.egg-info → sinter-1.15.dev1733301548}/PKG-INFO +1 -1
  2. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/setup.py +1 -1
  3. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/__init__.py +1 -1
  4. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_decoding/_decoding_mwpf.py +24 -13
  5. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548/src/sinter.egg-info}/PKG-INFO +1 -1
  6. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/MANIFEST.in +0 -0
  7. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/README.md +0 -0
  8. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/readme_example_plot.png +0 -0
  9. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/requirements.txt +0 -0
  10. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/setup.cfg +0 -0
  11. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_collection/__init__.py +0 -0
  12. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_collection/_collection.py +0 -0
  13. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_collection/_collection_manager.py +0 -0
  14. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_collection/_collection_manager_test.py +0 -0
  15. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_collection/_collection_test.py +0 -0
  16. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_collection/_collection_worker_loop.py +0 -0
  17. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_collection/_collection_worker_state.py +0 -0
  18. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_collection/_collection_worker_test.py +0 -0
  19. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_collection/_mux_sampler.py +0 -0
  20. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_collection/_printer.py +0 -0
  21. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_collection/_sampler_ramp_throttled.py +0 -0
  22. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_command/__init__.py +0 -0
  23. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_command/_main.py +0 -0
  24. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_command/_main_collect.py +0 -0
  25. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_command/_main_collect_test.py +0 -0
  26. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_command/_main_combine.py +0 -0
  27. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_command/_main_combine_test.py +0 -0
  28. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_command/_main_plot.py +0 -0
  29. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_command/_main_plot_test.py +0 -0
  30. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_command/_main_predict.py +0 -0
  31. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_command/_main_predict_test.py +0 -0
  32. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_data/__init__.py +0 -0
  33. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_data/_anon_task_stats.py +0 -0
  34. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_data/_anon_task_stats_test.py +0 -0
  35. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_data/_collection_options.py +0 -0
  36. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_data/_collection_options_test.py +0 -0
  37. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_data/_csv_out.py +0 -0
  38. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_data/_existing_data.py +0 -0
  39. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_data/_existing_data_test.py +0 -0
  40. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_data/_task.py +0 -0
  41. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_data/_task_stats.py +0 -0
  42. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_data/_task_stats_test.py +0 -0
  43. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_data/_task_test.py +0 -0
  44. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_decoding/__init__.py +0 -0
  45. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_decoding/_decoding.py +0 -0
  46. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_decoding/_decoding_all_built_in_decoders.py +0 -0
  47. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_decoding/_decoding_decoder_class.py +0 -0
  48. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_decoding/_decoding_fusion_blossom.py +0 -0
  49. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_decoding/_decoding_pymatching.py +0 -0
  50. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_decoding/_decoding_test.py +0 -0
  51. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_decoding/_decoding_vacuous.py +0 -0
  52. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_decoding/_perfectionist_sampler.py +0 -0
  53. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_decoding/_sampler.py +0 -0
  54. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_decoding/_stim_then_decode_sampler.py +0 -0
  55. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_decoding/_stim_then_decode_sampler_test.py +0 -0
  56. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_plotting.py +0 -0
  57. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_plotting_test.py +0 -0
  58. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_predict.py +0 -0
  59. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_predict_test.py +0 -0
  60. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_probability_util.py +0 -0
  61. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter/_probability_util_test.py +0 -0
  62. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter.egg-info/SOURCES.txt +0 -0
  63. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter.egg-info/dependency_links.txt +0 -0
  64. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter.egg-info/entry_points.txt +0 -0
  65. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter.egg-info/requires.txt +0 -0
  66. {sinter-1.15.dev1730523741 → sinter-1.15.dev1733301548}/src/sinter.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sinter
3
- Version: 1.15.dev1730523741
3
+ Version: 1.15.dev1733301548
4
4
  Summary: Samples stim circuits and decodes them using pymatching.
5
5
  Author: Craig Gidney
6
6
  Author-email: craig.gidney@gmail.com
@@ -19,7 +19,7 @@ with open('README.md', encoding='UTF-8') as f:
19
19
  with open('requirements.txt', encoding='UTF-8') as f:
20
20
  requirements = f.read().splitlines()
21
21
 
22
- __version__ = '1.15.dev1730523741'
22
+ __version__ = '1.15.dev1733301548'
23
23
 
24
24
  setup(
25
25
  name='sinter',
@@ -1,4 +1,4 @@
1
- __version__ = '1.15.dev1730523741'
1
+ __version__ = '1.15.dev1733301548'
2
2
 
3
3
  from sinter._collection import (
4
4
  collect,
@@ -15,7 +15,7 @@ def mwpf_import_error() -> ImportError:
15
15
  return ImportError(
16
16
  "The decoder 'MWPF' isn't installed\n"
17
17
  "To fix this, install the python package 'MWPF' into your environment.\n"
18
- "For example, if you are using pip, run `pip install MWPF~=0.1.1`.\n"
18
+ "For example, if you are using pip, run `pip install MWPF~=0.1.5`.\n"
19
19
  )
20
20
 
21
21
 
@@ -75,12 +75,18 @@ class MwpfDecoder(Decoder):
75
75
  # For example, `SolverSerialUnionFind` is the most basic solver without any plugin: it only
76
76
  # grows the clusters until the first valid solution appears; some more optimized solvers uses
77
77
  # one or more plugins to further optimize the solution, which requires longer decoding time.
78
+ cluster_node_limit: int = 50, # The maximum number of nodes in a cluster.
78
79
  ) -> CompiledDecoder:
79
80
  solver, fault_masks = detector_error_model_to_mwpf_solver_and_fault_masks(
80
- dem, decoder_cls=decoder_cls
81
+ dem,
82
+ decoder_cls=decoder_cls,
83
+ cluster_node_limit=cluster_node_limit,
81
84
  )
82
85
  return MwpfCompiledDecoder(
83
- solver, fault_masks, dem.num_detectors, dem.num_observables
86
+ solver,
87
+ fault_masks,
88
+ dem.num_detectors,
89
+ dem.num_observables,
84
90
  )
85
91
 
86
92
  def decode_via_files(
@@ -220,26 +226,31 @@ def iter_flatten_model(
220
226
  def deduplicate_hyperedges(
221
227
  hyperedges: List[Tuple[List[int], float, int]]
222
228
  ) -> List[Tuple[List[int], float, int]]:
223
- indices: dict[frozenset[int], int] = dict()
229
+ indices: dict[frozenset[int], Tuple[int, float]] = dict()
224
230
  result: List[Tuple[List[int], float, int]] = []
225
231
  for dets, weight, mask in hyperedges:
226
232
  dets_set = frozenset(dets)
227
233
  if dets_set in indices:
228
- idx = indices[dets_set]
234
+ idx, min_weight = indices[dets_set]
229
235
  p1 = 1 / (1 + math.exp(weight))
230
236
  p2 = 1 / (1 + math.exp(result[idx][1]))
231
237
  p = p1 * (1 - p2) + p2 * (1 - p1)
232
- # not sure why would this fail? two hyperedges with different masks?
233
- # assert mask == result[idx][2], (result[idx], (dets, weight, mask))
234
- result[idx] = (dets, math.log((1 - p) / p), result[idx][2])
238
+ # choosing the mask from the most likely error
239
+ new_mask = result[idx][2]
240
+ if weight < min_weight:
241
+ indices[dets_set] = (idx, weight)
242
+ new_mask = mask
243
+ result[idx] = (dets, math.log((1 - p) / p), new_mask)
235
244
  else:
236
- indices[dets_set] = len(result)
245
+ indices[dets_set] = (len(result), weight)
237
246
  result.append((dets, weight, mask))
238
247
  return result
239
248
 
240
249
 
241
250
  def detector_error_model_to_mwpf_solver_and_fault_masks(
242
- model: stim.DetectorErrorModel, decoder_cls: Any = None
251
+ model: stim.DetectorErrorModel,
252
+ decoder_cls: Any = None,
253
+ cluster_node_limit: int = 50,
243
254
  ) -> Tuple[Optional["mwpf.SolverSerialJointSingleHair"], np.ndarray]:
244
255
  """Convert a stim error model into a NetworkX graph."""
245
256
 
@@ -261,7 +272,7 @@ def detector_error_model_to_mwpf_solver_and_fault_masks(
261
272
  # Accept it and keep going, though of course decoding will probably perform terribly.
262
273
  return
263
274
  if p > 0.5:
264
- # mwpf doesn't support negative edge weights.
275
+ # mwpf doesn't support negative edge weights (yet, will be supported in the next version).
265
276
  # approximate them as weight 0.
266
277
  p = 0.5
267
278
  weight = math.log((1 - p) / p)
@@ -280,7 +291,7 @@ def detector_error_model_to_mwpf_solver_and_fault_masks(
280
291
  # mwpf package panic on duplicate edges, thus we need to handle them here
281
292
  hyperedges = deduplicate_hyperedges(hyperedges)
282
293
 
283
- # fix the input by connecting an edge to all isolated vertices
294
+ # fix the input by connecting an edge to all isolated vertices; will be supported in the next version
284
295
  for idx in range(num_detectors):
285
296
  if not is_detector_connected[idx]:
286
297
  hyperedges.append(([idx], 0, 0))
@@ -301,7 +312,7 @@ def detector_error_model_to_mwpf_solver_and_fault_masks(
301
312
  decoder_cls = mwpf.SolverSerialJointSingleHair
302
313
  return (
303
314
  (
304
- decoder_cls(initializer)
315
+ decoder_cls(initializer, config={"cluster_node_limit": cluster_node_limit})
305
316
  if num_detectors > 0 and len(rescaled_edges) > 0
306
317
  else None
307
318
  ),
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sinter
3
- Version: 1.15.dev1730523741
3
+ Version: 1.15.dev1733301548
4
4
  Summary: Samples stim circuits and decodes them using pymatching.
5
5
  Author: Craig Gidney
6
6
  Author-email: craig.gidney@gmail.com