sinter 1.15.dev1743876136__tar.gz → 1.15.dev1743893588__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.dev1743876136/src/sinter.egg-info → sinter-1.15.dev1743893588}/PKG-INFO +1 -1
  2. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/setup.py +1 -1
  3. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/__init__.py +1 -1
  4. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_collection/_collection_worker_test.py +9 -1
  5. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_decoding/_decoding_decoder_class.py +20 -3
  6. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_decoding/_decoding_test.py +87 -0
  7. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_decoding/_stim_then_decode_sampler.py +1 -1
  8. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588/src/sinter.egg-info}/PKG-INFO +1 -1
  9. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/MANIFEST.in +0 -0
  10. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/README.md +0 -0
  11. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/readme_example_plot.png +0 -0
  12. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/requirements.txt +0 -0
  13. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/setup.cfg +0 -0
  14. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_collection/__init__.py +0 -0
  15. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_collection/_collection.py +0 -0
  16. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_collection/_collection_manager.py +0 -0
  17. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_collection/_collection_manager_test.py +0 -0
  18. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_collection/_collection_test.py +0 -0
  19. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_collection/_collection_worker_loop.py +0 -0
  20. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_collection/_collection_worker_state.py +0 -0
  21. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_collection/_mux_sampler.py +0 -0
  22. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_collection/_printer.py +0 -0
  23. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_collection/_sampler_ramp_throttled.py +0 -0
  24. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_command/__init__.py +0 -0
  25. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_command/_main.py +0 -0
  26. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_command/_main_collect.py +0 -0
  27. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_command/_main_collect_test.py +0 -0
  28. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_command/_main_combine.py +0 -0
  29. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_command/_main_combine_test.py +0 -0
  30. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_command/_main_plot.py +0 -0
  31. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_command/_main_plot_test.py +0 -0
  32. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_command/_main_predict.py +0 -0
  33. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_command/_main_predict_test.py +0 -0
  34. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_data/__init__.py +0 -0
  35. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_data/_anon_task_stats.py +0 -0
  36. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_data/_anon_task_stats_test.py +0 -0
  37. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_data/_collection_options.py +0 -0
  38. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_data/_collection_options_test.py +0 -0
  39. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_data/_csv_out.py +0 -0
  40. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_data/_existing_data.py +0 -0
  41. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_data/_existing_data_test.py +0 -0
  42. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_data/_task.py +0 -0
  43. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_data/_task_stats.py +0 -0
  44. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_data/_task_stats_test.py +0 -0
  45. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_data/_task_test.py +0 -0
  46. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_decoding/__init__.py +0 -0
  47. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_decoding/_decoding.py +0 -0
  48. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_decoding/_decoding_all_built_in_decoders.py +0 -0
  49. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_decoding/_decoding_fusion_blossom.py +0 -0
  50. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_decoding/_decoding_mwpf.py +0 -0
  51. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_decoding/_decoding_pymatching.py +0 -0
  52. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_decoding/_decoding_vacuous.py +0 -0
  53. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_decoding/_perfectionist_sampler.py +0 -0
  54. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_decoding/_sampler.py +0 -0
  55. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_decoding/_stim_then_decode_sampler_test.py +0 -0
  56. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_plotting.py +0 -0
  57. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_plotting_test.py +0 -0
  58. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_predict.py +0 -0
  59. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_predict_test.py +0 -0
  60. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_probability_util.py +0 -0
  61. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter/_probability_util_test.py +0 -0
  62. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter.egg-info/SOURCES.txt +0 -0
  63. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter.egg-info/dependency_links.txt +0 -0
  64. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter.egg-info/entry_points.txt +0 -0
  65. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter.egg-info/requires.txt +0 -0
  66. {sinter-1.15.dev1743876136 → sinter-1.15.dev1743893588}/src/sinter.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sinter
3
- Version: 1.15.dev1743876136
3
+ Version: 1.15.dev1743893588
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.dev1743876136'
22
+ __version__ = '1.15.dev1743893588'
23
23
 
24
24
  setup(
25
25
  name='sinter',
@@ -1,4 +1,4 @@
1
- __version__ = '1.15.dev1743876136'
1
+ __version__ = '1.15.dev1743893588'
2
2
 
3
3
  from sinter._collection import (
4
4
  collect,
@@ -163,7 +163,15 @@ def test_worker_finish_work():
163
163
  handler.expected_task = ta
164
164
  _put_wait_not_empty(inp, ('change_job', (ta, sinter.CollectionOptions(max_errors=100_000_000), 100_000_000)))
165
165
  _put_wait_not_empty(inp, ('accept_shots', (ta.strong_id(), 10000)))
166
- assert worker.process_messages() == 2
166
+ t0 = time.monotonic()
167
+ num_processed = 0
168
+ while True:
169
+ num_processed += worker.process_messages()
170
+ if num_processed >= 2:
171
+ break
172
+ if time.monotonic() - t0 > 1:
173
+ raise ValueError("Messages not processed")
174
+ assert num_processed == 2
167
175
  _assert_drain_queue(out, [
168
176
  ('changed_job', 5, (ta.strong_id(),)),
169
177
  ('accepted_shots', 5, (ta.strong_id(), 10000)),
@@ -55,7 +55,7 @@ class CompiledDecoder(metaclass=abc.ABCMeta):
55
55
  pass
56
56
 
57
57
 
58
- class Decoder(metaclass=abc.ABCMeta):
58
+ class Decoder:
59
59
  """Abstract base class for custom decoders.
60
60
 
61
61
  Custom decoders can be explained to sinter by inheriting from this class and
@@ -63,6 +63,10 @@ class Decoder(metaclass=abc.ABCMeta):
63
63
 
64
64
  Decoder classes MUST be serializable (e.g. via pickling), so that they can
65
65
  be given to worker processes when using python multiprocessing.
66
+
67
+ Child classes should implement `compile_decoder_for_dem`, but (for legacy
68
+ reasons) can alternatively implement `decode_via_files`. At least one of
69
+ the two methods must be implemented.
66
70
  """
67
71
 
68
72
  def compile_decoder_for_dem(
@@ -95,7 +99,6 @@ class Decoder(metaclass=abc.ABCMeta):
95
99
  """
96
100
  raise NotImplementedError('compile_decoder_for_dem')
97
101
 
98
- @abc.abstractmethod
99
102
  def decode_via_files(self,
100
103
  *,
101
104
  num_shots: int,
@@ -141,4 +144,18 @@ class Decoder(metaclass=abc.ABCMeta):
141
144
  temporary objects. All cleanup should be done via sinter
142
145
  deleting this directory after killing the decoder.
143
146
  """
144
- pass
147
+ dem = stim.DetectorErrorModel.from_file(dem_path)
148
+
149
+ try:
150
+ compiled = self.compile_decoder_for_dem(dem=dem)
151
+ except NotImplementedError as ex:
152
+ raise NotImplementedError(f"{type(self).__qualname__} didn't implement `compile_decoder_for_dem` or `decode_via_files`.") from ex
153
+
154
+ num_det_bytes = -(-num_dets // 8)
155
+ num_obs_bytes = -(-num_obs // 8)
156
+ dets = np.fromfile(dets_b8_in_path, dtype=np.uint8, count=num_shots * num_det_bytes)
157
+ dets = dets.reshape(num_shots, num_det_bytes)
158
+ obs = compiled.decode_shots_bit_packed(bit_packed_detection_event_data=dets)
159
+ if obs.dtype != np.uint8 or obs.shape != (num_shots, num_obs_bytes):
160
+ raise ValueError(f"Got a numpy array with dtype={obs.dtype},shape={obs.shape} instead of dtype={np.uint8},shape={(num_shots, num_obs_bytes)} from {type(self).__qualname__}(...).compile_decoder_for_dem(...).decode_shots_bit_packed(...).")
161
+ obs.tofile(obs_predictions_b8_out_path)
@@ -10,6 +10,7 @@ import pytest
10
10
  import sinter
11
11
  import stim
12
12
 
13
+ from sinter import CompiledDecoder
13
14
  from sinter._collection import post_selection_mask_from_4th_coord
14
15
  from sinter._decoding._decoding_all_built_in_decoders import BUILT_IN_DECODERS
15
16
  from sinter._decoding._decoding import sample_decode
@@ -391,3 +392,89 @@ def test_full_scale(decoder: str):
391
392
  assert result.discards == 0
392
393
  assert result.shots == 1000
393
394
  assert result.errors == 0
395
+
396
+
397
+ def test_infer_decode_via_files_from_decode_from_compile_decoder_for_dem():
398
+ class IncompleteDecoder(sinter.Decoder):
399
+ pass
400
+
401
+ class WrongDecoder(sinter.Decoder, sinter.CompiledDecoder):
402
+ def compile_decoder_for_dem(
403
+ self,
404
+ *,
405
+ dem: stim.DetectorErrorModel,
406
+ ) -> CompiledDecoder:
407
+ return self
408
+ def decode_shots_bit_packed(
409
+ self,
410
+ *,
411
+ bit_packed_detection_event_data: np.ndarray,
412
+ ) -> np.ndarray:
413
+ return np.zeros(shape=5, dtype=np.bool_)
414
+
415
+ class TrivialCompiledDecoder(sinter.CompiledDecoder):
416
+ def __init__(self, num_obs: int):
417
+ self.num_obs = -(-num_obs // 8)
418
+
419
+ def decode_shots_bit_packed(
420
+ self,
421
+ *,
422
+ bit_packed_detection_event_data: np.ndarray,
423
+ ) -> np.ndarray:
424
+ return np.zeros(dtype=np.uint8, shape=(bit_packed_detection_event_data.shape[0], self.num_obs))
425
+
426
+ class TrivialDecoder(sinter.Decoder):
427
+ def compile_decoder_for_dem(
428
+ self,
429
+ *,
430
+ dem: stim.DetectorErrorModel,
431
+ ) -> CompiledDecoder:
432
+ return TrivialCompiledDecoder(num_obs=dem.num_observables)
433
+
434
+ circuit = stim.Circuit.generated("repetition_code:memory", distance=3, rounds=3)
435
+ dem = circuit.detector_error_model()
436
+
437
+ with tempfile.TemporaryDirectory() as d:
438
+ d = pathlib.Path(d)
439
+
440
+ circuit.compile_detector_sampler().sample_write(
441
+ shots=10,
442
+ filepath=d / 'dets.b8',
443
+ format='b8',
444
+ )
445
+
446
+ dem.to_file(d / 'dem.dem')
447
+
448
+ with pytest.raises(NotImplementedError, match='compile_decoder_for_dem'):
449
+ IncompleteDecoder().decode_via_files(
450
+ num_shots=10,
451
+ num_dets=dem.num_detectors,
452
+ num_obs=dem.num_observables,
453
+ dem_path=d / 'dem.dem',
454
+ dets_b8_in_path=d / 'dets.b8',
455
+ obs_predictions_b8_out_path=d / 'obs.b8',
456
+ tmp_dir=d,
457
+ )
458
+
459
+ with pytest.raises(ValueError, match='shape='):
460
+ WrongDecoder().decode_via_files(
461
+ num_shots=10,
462
+ num_dets=dem.num_detectors,
463
+ num_obs=dem.num_observables,
464
+ dem_path=d / 'dem.dem',
465
+ dets_b8_in_path=d / 'dets.b8',
466
+ obs_predictions_b8_out_path=d / 'obs.b8',
467
+ tmp_dir=d,
468
+ )
469
+
470
+ TrivialDecoder().decode_via_files(
471
+ num_shots=10,
472
+ num_dets=dem.num_detectors,
473
+ num_obs=dem.num_observables,
474
+ dem_path=d / 'dem.dem',
475
+ dets_b8_in_path=d / 'dets.b8',
476
+ obs_predictions_b8_out_path=d / 'obs.b8',
477
+ tmp_dir=d,
478
+ )
479
+ obs = np.fromfile(d / 'obs.b8', dtype=np.uint8, count=10)
480
+ np.testing.assert_array_equal(obs, [0] * 10)
@@ -140,7 +140,7 @@ def _compile_decoder_with_disk_fallback(
140
140
  ) -> CompiledDecoder:
141
141
  try:
142
142
  return decoder.compile_decoder_for_dem(dem=task.detector_error_model)
143
- except (NotImplementedError, ValueError):
143
+ except NotImplementedError:
144
144
  pass
145
145
  if tmp_dir is None:
146
146
  raise ValueError(f"Decoder {task.decoder=} didn't implement `compile_decoder_for_dem`, but no temporary directory was provided for falling back to `decode_via_files`.")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sinter
3
- Version: 1.15.dev1743876136
3
+ Version: 1.15.dev1743893588
4
4
  Summary: Samples stim circuits and decodes them using pymatching.
5
5
  Author: Craig Gidney
6
6
  Author-email: craig.gidney@gmail.com