sinter 1.15.dev1743871966__tar.gz → 1.15.dev1743880617__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.
- {sinter-1.15.dev1743871966/src/sinter.egg-info → sinter-1.15.dev1743880617}/PKG-INFO +1 -1
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/setup.py +1 -1
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/__init__.py +1 -1
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_collection/_collection_worker_test.py +9 -1
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_decoding/_decoding_decoder_class.py +20 -3
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_decoding/_decoding_test.py +87 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_decoding/_stim_then_decode_sampler.py +1 -1
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617/src/sinter.egg-info}/PKG-INFO +1 -1
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/MANIFEST.in +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/README.md +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/readme_example_plot.png +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/requirements.txt +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/setup.cfg +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_collection/__init__.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_collection/_collection.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_collection/_collection_manager.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_collection/_collection_manager_test.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_collection/_collection_test.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_collection/_collection_worker_loop.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_collection/_collection_worker_state.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_collection/_mux_sampler.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_collection/_printer.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_collection/_sampler_ramp_throttled.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_command/__init__.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_command/_main.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_command/_main_collect.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_command/_main_collect_test.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_command/_main_combine.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_command/_main_combine_test.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_command/_main_plot.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_command/_main_plot_test.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_command/_main_predict.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_command/_main_predict_test.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_data/__init__.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_data/_anon_task_stats.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_data/_anon_task_stats_test.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_data/_collection_options.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_data/_collection_options_test.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_data/_csv_out.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_data/_existing_data.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_data/_existing_data_test.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_data/_task.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_data/_task_stats.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_data/_task_stats_test.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_data/_task_test.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_decoding/__init__.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_decoding/_decoding.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_decoding/_decoding_all_built_in_decoders.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_decoding/_decoding_fusion_blossom.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_decoding/_decoding_mwpf.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_decoding/_decoding_pymatching.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_decoding/_decoding_vacuous.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_decoding/_perfectionist_sampler.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_decoding/_sampler.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_decoding/_stim_then_decode_sampler_test.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_plotting.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_plotting_test.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_predict.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_predict_test.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_probability_util.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_probability_util_test.py +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter.egg-info/SOURCES.txt +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter.egg-info/dependency_links.txt +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter.egg-info/entry_points.txt +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter.egg-info/requires.txt +0 -0
- {sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter.egg-info/top_level.txt +0 -0
|
@@ -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
|
-
|
|
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
|
|
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
|
-
|
|
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)
|
{sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_decoding/_decoding_test.py
RENAMED
|
@@ -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
|
|
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`.")
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_collection/_collection.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_collection/_collection_test.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_collection/_mux_sampler.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_command/_main_collect.py
RENAMED
|
File without changes
|
{sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_command/_main_collect_test.py
RENAMED
|
File without changes
|
{sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_command/_main_combine.py
RENAMED
|
File without changes
|
{sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_command/_main_combine_test.py
RENAMED
|
File without changes
|
|
File without changes
|
{sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_command/_main_plot_test.py
RENAMED
|
File without changes
|
{sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_command/_main_predict.py
RENAMED
|
File without changes
|
{sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_command/_main_predict_test.py
RENAMED
|
File without changes
|
|
File without changes
|
{sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_data/_anon_task_stats.py
RENAMED
|
File without changes
|
{sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_data/_anon_task_stats_test.py
RENAMED
|
File without changes
|
{sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_data/_collection_options.py
RENAMED
|
File without changes
|
{sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_data/_collection_options_test.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_data/_existing_data_test.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_data/_task_stats_test.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_decoding/_decoding_mwpf.py
RENAMED
|
File without changes
|
{sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_decoding/_decoding_pymatching.py
RENAMED
|
File without changes
|
{sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_decoding/_decoding_vacuous.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter/_probability_util_test.py
RENAMED
|
File without changes
|
|
File without changes
|
{sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
{sinter-1.15.dev1743871966 → sinter-1.15.dev1743880617}/src/sinter.egg-info/entry_points.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|