sinter 1.14.dev1712659430__tar.gz → 1.16.dev1768465883__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.
- sinter-1.16.dev1768465883/MANIFEST.in +1 -0
- {sinter-1.14.dev1712659430 → sinter-1.16.dev1768465883}/PKG-INFO +13 -5
- sinter-1.16.dev1768465883/requirements.txt +4 -0
- {sinter-1.14.dev1712659430 → sinter-1.16.dev1768465883}/setup.py +3 -3
- {sinter-1.14.dev1712659430 → sinter-1.16.dev1768465883}/src/sinter/__init__.py +13 -22
- sinter-1.16.dev1768465883/src/sinter/_collection/__init__.py +10 -0
- {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_collection}/_collection.py +63 -39
- sinter-1.16.dev1768465883/src/sinter/_collection/_collection_manager.py +581 -0
- sinter-1.16.dev1768465883/src/sinter/_collection/_collection_manager_test.py +287 -0
- {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_collection}/_collection_test.py +108 -1
- sinter-1.16.dev1768465883/src/sinter/_collection/_collection_worker_loop.py +35 -0
- sinter-1.16.dev1768465883/src/sinter/_collection/_collection_worker_state.py +259 -0
- sinter-1.16.dev1768465883/src/sinter/_collection/_collection_worker_test.py +222 -0
- sinter-1.16.dev1768465883/src/sinter/_collection/_mux_sampler.py +56 -0
- sinter-1.16.dev1768465883/src/sinter/_collection/_sampler_ramp_throttled.py +66 -0
- sinter-1.16.dev1768465883/src/sinter/_collection/_sampler_ramp_throttled_test.py +144 -0
- sinter-1.16.dev1768465883/src/sinter/_command/__init__.py +0 -0
- {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_command}/_main.py +4 -4
- {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_command}/_main_collect.py +10 -10
- {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_command}/_main_collect_test.py +34 -4
- {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_command}/_main_combine.py +1 -2
- {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_command}/_main_combine_test.py +1 -1
- {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_command}/_main_plot.py +140 -98
- {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_command}/_main_plot_test.py +2 -2
- {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_command}/_main_predict_test.py +1 -1
- sinter-1.16.dev1768465883/src/sinter/_data/__init__.py +20 -0
- {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_data}/_anon_task_stats.py +19 -15
- {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_data}/_csv_out.py +3 -0
- {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_data}/_existing_data.py +6 -5
- {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_data}/_task.py +1 -1
- {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_data}/_task_stats.py +92 -26
- {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_data}/_task_stats_test.py +52 -1
- sinter-1.16.dev1768465883/src/sinter/_decoding/__init__.py +16 -0
- {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_decoding}/_decoding.py +3 -3
- sinter-1.16.dev1768465883/src/sinter/_decoding/_decoding_all_built_in_decoders.py +25 -0
- {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_decoding}/_decoding_decoder_class.py +20 -3
- {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_decoding}/_decoding_fusion_blossom.py +6 -3
- sinter-1.16.dev1768465883/src/sinter/_decoding/_decoding_mwpf.py +302 -0
- {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_decoding}/_decoding_pymatching.py +1 -1
- {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_decoding}/_decoding_test.py +95 -3
- {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_decoding}/_decoding_vacuous.py +1 -1
- sinter-1.16.dev1768465883/src/sinter/_decoding/_perfectionist_sampler.py +38 -0
- sinter-1.16.dev1768465883/src/sinter/_decoding/_sampler.py +72 -0
- sinter-1.16.dev1768465883/src/sinter/_decoding/_stim_then_decode_sampler.py +222 -0
- sinter-1.16.dev1768465883/src/sinter/_decoding/_stim_then_decode_sampler_test.py +192 -0
- {sinter-1.14.dev1712659430 → sinter-1.16.dev1768465883}/src/sinter/_plotting.py +223 -71
- {sinter-1.14.dev1712659430 → sinter-1.16.dev1768465883}/src/sinter/_plotting_test.py +3 -0
- {sinter-1.14.dev1712659430 → sinter-1.16.dev1768465883}/src/sinter/_predict.py +1 -3
- {sinter-1.14.dev1712659430 → sinter-1.16.dev1768465883}/src/sinter/_probability_util.py +27 -10
- {sinter-1.14.dev1712659430 → sinter-1.16.dev1768465883}/src/sinter.egg-info/PKG-INFO +13 -5
- sinter-1.16.dev1768465883/src/sinter.egg-info/SOURCES.txt +65 -0
- sinter-1.16.dev1768465883/src/sinter.egg-info/entry_points.txt +2 -0
- sinter-1.16.dev1768465883/src/sinter.egg-info/requires.txt +4 -0
- sinter-1.14.dev1712659430/requirements.txt +0 -4
- sinter-1.14.dev1712659430/src/sinter/_collection_tracker_for_single_task.py +0 -230
- sinter-1.14.dev1712659430/src/sinter/_collection_work_manager.py +0 -275
- sinter-1.14.dev1712659430/src/sinter/_decoding_all_built_in_decoders.py +0 -12
- sinter-1.14.dev1712659430/src/sinter/_worker.py +0 -212
- sinter-1.14.dev1712659430/src/sinter/_worker_test.py +0 -134
- sinter-1.14.dev1712659430/src/sinter.egg-info/SOURCES.txt +0 -51
- sinter-1.14.dev1712659430/src/sinter.egg-info/entry_points.txt +0 -2
- sinter-1.14.dev1712659430/src/sinter.egg-info/requires.txt +0 -4
- {sinter-1.14.dev1712659430 → sinter-1.16.dev1768465883}/README.md +0 -0
- {sinter-1.14.dev1712659430 → sinter-1.16.dev1768465883}/readme_example_plot.png +0 -0
- {sinter-1.14.dev1712659430 → sinter-1.16.dev1768465883}/setup.cfg +0 -0
- {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_collection}/_printer.py +0 -0
- {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_command}/_main_predict.py +0 -0
- {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_data}/_anon_task_stats_test.py +0 -0
- {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_data}/_collection_options.py +0 -0
- {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_data}/_collection_options_test.py +0 -0
- {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_data}/_existing_data_test.py +0 -0
- {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_data}/_task_test.py +0 -0
- {sinter-1.14.dev1712659430 → sinter-1.16.dev1768465883}/src/sinter/_predict_test.py +0 -0
- {sinter-1.14.dev1712659430 → sinter-1.16.dev1768465883}/src/sinter/_probability_util_test.py +0 -0
- {sinter-1.14.dev1712659430 → sinter-1.16.dev1768465883}/src/sinter.egg-info/dependency_links.txt +0 -0
- {sinter-1.14.dev1712659430 → sinter-1.16.dev1768465883}/src/sinter.egg-info/top_level.txt +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
recursive-include src *.py
|
|
@@ -1,16 +1,24 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: sinter
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.16.dev1768465883
|
|
4
4
|
Summary: Samples stim circuits and decodes them using pymatching.
|
|
5
5
|
Author: Craig Gidney
|
|
6
6
|
Author-email: craig.gidney@gmail.com
|
|
7
7
|
License: Apache 2
|
|
8
8
|
Requires-Python: >=3.7.0
|
|
9
9
|
Description-Content-Type: text/markdown
|
|
10
|
-
Requires-Dist: matplotlib
|
|
11
|
-
Requires-Dist: numpy
|
|
10
|
+
Requires-Dist: matplotlib
|
|
11
|
+
Requires-Dist: numpy
|
|
12
12
|
Requires-Dist: stim
|
|
13
|
-
Requires-Dist: scipy
|
|
13
|
+
Requires-Dist: scipy
|
|
14
|
+
Dynamic: author
|
|
15
|
+
Dynamic: author-email
|
|
16
|
+
Dynamic: description
|
|
17
|
+
Dynamic: description-content-type
|
|
18
|
+
Dynamic: license
|
|
19
|
+
Dynamic: requires-dist
|
|
20
|
+
Dynamic: requires-python
|
|
21
|
+
Dynamic: summary
|
|
14
22
|
|
|
15
23
|
# sinter: fast QEC sampling
|
|
16
24
|
|
|
@@ -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.
|
|
22
|
+
__version__ = '1.16.dev1768465883'
|
|
23
23
|
|
|
24
24
|
setup(
|
|
25
25
|
name='sinter',
|
|
@@ -27,7 +27,7 @@ setup(
|
|
|
27
27
|
author='Craig Gidney',
|
|
28
28
|
author_email='craig.gidney@gmail.com',
|
|
29
29
|
license='Apache 2',
|
|
30
|
-
packages=['sinter'],
|
|
30
|
+
packages=['sinter', 'sinter._data', 'sinter._collection', 'sinter._command', 'sinter._decoding'],
|
|
31
31
|
package_dir={'': 'src'},
|
|
32
32
|
description='Samples stim circuits and decodes them using pymatching.',
|
|
33
33
|
long_description=long_description,
|
|
@@ -37,6 +37,6 @@ setup(
|
|
|
37
37
|
install_requires=requirements,
|
|
38
38
|
tests_require=['pytest', 'pymatching'],
|
|
39
39
|
entry_points={
|
|
40
|
-
'console_scripts': ['sinter=sinter._main:main'],
|
|
40
|
+
'console_scripts': ['sinter=sinter._command._main:main'],
|
|
41
41
|
},
|
|
42
42
|
)
|
|
@@ -1,26 +1,27 @@
|
|
|
1
|
-
__version__ = '1.
|
|
1
|
+
__version__ = '1.16.dev1768465883'
|
|
2
2
|
|
|
3
|
-
from sinter._anon_task_stats import (
|
|
4
|
-
AnonTaskStats,
|
|
5
|
-
)
|
|
6
3
|
from sinter._collection import (
|
|
7
4
|
collect,
|
|
8
5
|
iter_collect,
|
|
9
6
|
post_selection_mask_from_4th_coord,
|
|
10
7
|
Progress,
|
|
11
8
|
)
|
|
12
|
-
from sinter.
|
|
9
|
+
from sinter._data import (
|
|
10
|
+
AnonTaskStats,
|
|
13
11
|
CollectionOptions,
|
|
14
|
-
)
|
|
15
|
-
from sinter._csv_out import (
|
|
16
12
|
CSV_HEADER,
|
|
17
|
-
)
|
|
18
|
-
from sinter._decoding_all_built_in_decoders import (
|
|
19
|
-
BUILT_IN_DECODERS,
|
|
20
|
-
)
|
|
21
|
-
from sinter._existing_data import (
|
|
22
13
|
read_stats_from_csv_files,
|
|
23
14
|
stats_from_csv_files,
|
|
15
|
+
Task,
|
|
16
|
+
TaskStats,
|
|
17
|
+
)
|
|
18
|
+
from sinter._decoding import (
|
|
19
|
+
CompiledDecoder,
|
|
20
|
+
Decoder,
|
|
21
|
+
BUILT_IN_DECODERS,
|
|
22
|
+
BUILT_IN_SAMPLERS,
|
|
23
|
+
Sampler,
|
|
24
|
+
CompiledSampler,
|
|
24
25
|
)
|
|
25
26
|
from sinter._probability_util import (
|
|
26
27
|
comma_separated_key_values,
|
|
@@ -38,19 +39,9 @@ from sinter._plotting import (
|
|
|
38
39
|
plot_error_rate,
|
|
39
40
|
group_by,
|
|
40
41
|
)
|
|
41
|
-
from sinter._task import (
|
|
42
|
-
Task,
|
|
43
|
-
)
|
|
44
|
-
from sinter._task_stats import (
|
|
45
|
-
TaskStats,
|
|
46
|
-
)
|
|
47
42
|
from sinter._predict import (
|
|
48
43
|
predict_discards_bit_packed,
|
|
49
44
|
predict_observables_bit_packed,
|
|
50
45
|
predict_on_disk,
|
|
51
46
|
predict_observables,
|
|
52
47
|
)
|
|
53
|
-
from sinter._decoding_decoder_class import (
|
|
54
|
-
CompiledDecoder,
|
|
55
|
-
Decoder,
|
|
56
|
-
)
|
|
@@ -1,19 +1,15 @@
|
|
|
1
1
|
import contextlib
|
|
2
2
|
import dataclasses
|
|
3
3
|
import pathlib
|
|
4
|
-
from typing import Any
|
|
5
|
-
from typing import Callable, Iterator, Optional, Union, Iterable, List, TYPE_CHECKING, Tuple, Dict
|
|
4
|
+
from typing import Any, Callable, Iterator, Optional, Union, Iterable, List, TYPE_CHECKING, Tuple, Dict
|
|
6
5
|
|
|
7
6
|
import math
|
|
8
7
|
import numpy as np
|
|
9
8
|
import stim
|
|
10
9
|
|
|
11
|
-
from sinter.
|
|
12
|
-
from sinter.
|
|
13
|
-
from sinter.
|
|
14
|
-
from sinter._existing_data import ExistingData
|
|
15
|
-
from sinter._printer import ThrottledProgressPrinter
|
|
16
|
-
from sinter._task_stats import TaskStats
|
|
10
|
+
from sinter._data import CSV_HEADER, ExistingData, TaskStats, CollectionOptions, Task
|
|
11
|
+
from sinter._collection._collection_manager import CollectionManager
|
|
12
|
+
from sinter._collection._printer import ThrottledProgressPrinter
|
|
17
13
|
|
|
18
14
|
if TYPE_CHECKING:
|
|
19
15
|
import sinter
|
|
@@ -42,7 +38,7 @@ def iter_collect(*,
|
|
|
42
38
|
tasks: Union[Iterator['sinter.Task'],
|
|
43
39
|
Iterable['sinter.Task']],
|
|
44
40
|
hint_num_tasks: Optional[int] = None,
|
|
45
|
-
additional_existing_data:
|
|
41
|
+
additional_existing_data: Union[None, dict[str, 'TaskStats'], Iterable['TaskStats']] = None,
|
|
46
42
|
max_shots: Optional[int] = None,
|
|
47
43
|
max_errors: Optional[int] = None,
|
|
48
44
|
decoders: Optional[Iterable[str]] = None,
|
|
@@ -51,7 +47,7 @@ def iter_collect(*,
|
|
|
51
47
|
start_batch_size: Optional[int] = None,
|
|
52
48
|
count_observable_error_combos: bool = False,
|
|
53
49
|
count_detection_events: bool = False,
|
|
54
|
-
custom_decoders: Optional[Dict[str, 'sinter.Decoder']] = None,
|
|
50
|
+
custom_decoders: Optional[Dict[str, Union['sinter.Decoder', 'sinter.Sampler']]] = None,
|
|
55
51
|
custom_error_count_key: Optional[str] = None,
|
|
56
52
|
allowed_cpu_affinity_ids: Optional[Iterable[int]] = None,
|
|
57
53
|
) -> Iterator['sinter.Progress']:
|
|
@@ -156,6 +152,19 @@ def iter_collect(*,
|
|
|
156
152
|
>>> print(total_shots)
|
|
157
153
|
200
|
|
158
154
|
"""
|
|
155
|
+
existing_data: dict[str, TaskStats]
|
|
156
|
+
if isinstance(additional_existing_data, ExistingData):
|
|
157
|
+
existing_data = additional_existing_data.data
|
|
158
|
+
elif isinstance(additional_existing_data, dict):
|
|
159
|
+
existing_data = additional_existing_data
|
|
160
|
+
elif additional_existing_data is None:
|
|
161
|
+
existing_data = {}
|
|
162
|
+
else:
|
|
163
|
+
acc = ExistingData()
|
|
164
|
+
for stat in additional_existing_data:
|
|
165
|
+
acc.add_sample(stat)
|
|
166
|
+
existing_data = acc.data
|
|
167
|
+
|
|
159
168
|
if isinstance(decoders, str):
|
|
160
169
|
decoders = [decoders]
|
|
161
170
|
|
|
@@ -166,50 +175,65 @@ def iter_collect(*,
|
|
|
166
175
|
except TypeError:
|
|
167
176
|
pass
|
|
168
177
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
178
|
+
if decoders is not None:
|
|
179
|
+
old_tasks = tasks
|
|
180
|
+
tasks = (
|
|
181
|
+
Task(
|
|
182
|
+
circuit=task.circuit,
|
|
183
|
+
decoder=decoder,
|
|
184
|
+
detector_error_model=task.detector_error_model,
|
|
185
|
+
postselection_mask=task.postselection_mask,
|
|
186
|
+
postselected_observables_mask=task.postselected_observables_mask,
|
|
187
|
+
json_metadata=task.json_metadata,
|
|
188
|
+
collection_options=task.collection_options,
|
|
189
|
+
circuit_path=task.circuit_path,
|
|
190
|
+
)
|
|
191
|
+
for task in old_tasks
|
|
192
|
+
for decoder in (decoders if task.decoder is None else [task.decoder])
|
|
193
|
+
)
|
|
194
|
+
|
|
195
|
+
progress_log: list[Optional[TaskStats]] = []
|
|
196
|
+
def log_progress(e: Optional[TaskStats]):
|
|
197
|
+
progress_log.append(e)
|
|
198
|
+
with CollectionManager(
|
|
199
|
+
num_workers=num_workers,
|
|
200
|
+
tasks=tasks,
|
|
201
|
+
collection_options=CollectionOptions(
|
|
172
202
|
max_shots=max_shots,
|
|
173
203
|
max_errors=max_errors,
|
|
174
204
|
max_batch_seconds=max_batch_seconds,
|
|
175
205
|
start_batch_size=start_batch_size,
|
|
176
206
|
max_batch_size=max_batch_size,
|
|
177
207
|
),
|
|
178
|
-
|
|
208
|
+
existing_data=existing_data,
|
|
179
209
|
count_observable_error_combos=count_observable_error_combos,
|
|
180
210
|
count_detection_events=count_detection_events,
|
|
181
|
-
additional_existing_data=additional_existing_data,
|
|
182
|
-
custom_decoders=custom_decoders,
|
|
183
211
|
custom_error_count_key=custom_error_count_key,
|
|
212
|
+
custom_decoders=custom_decoders or {},
|
|
184
213
|
allowed_cpu_affinity_ids=allowed_cpu_affinity_ids,
|
|
214
|
+
worker_flush_period=max_batch_seconds or 120,
|
|
215
|
+
progress_callback=log_progress,
|
|
185
216
|
) as manager:
|
|
186
217
|
try:
|
|
187
218
|
yield Progress(
|
|
188
219
|
new_stats=(),
|
|
189
220
|
status_message=f"Starting {num_workers} workers..."
|
|
190
221
|
)
|
|
191
|
-
manager.start_workers(
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
sample = manager.wait_for_next_sample()
|
|
206
|
-
manager.fill_work_queue()
|
|
222
|
+
manager.start_workers()
|
|
223
|
+
manager.start_distributing_work()
|
|
224
|
+
|
|
225
|
+
while manager.task_states:
|
|
226
|
+
manager.process_message()
|
|
227
|
+
if progress_log:
|
|
228
|
+
vals = list(progress_log)
|
|
229
|
+
progress_log.clear()
|
|
230
|
+
for e in vals:
|
|
231
|
+
if e is not None:
|
|
232
|
+
yield Progress(
|
|
233
|
+
new_stats=(e,),
|
|
234
|
+
status_message=manager.status_message(),
|
|
235
|
+
)
|
|
207
236
|
|
|
208
|
-
# Report the incremental results.
|
|
209
|
-
yield Progress(
|
|
210
|
-
new_stats=(sample,) if sample.shots > 0 else (),
|
|
211
|
-
status_message=manager.status(num_circuits=hint_num_tasks),
|
|
212
|
-
)
|
|
213
237
|
except KeyboardInterrupt:
|
|
214
238
|
yield Progress(
|
|
215
239
|
new_stats=(),
|
|
@@ -234,7 +258,7 @@ def collect(*,
|
|
|
234
258
|
start_batch_size: Optional[int] = None,
|
|
235
259
|
print_progress: bool = False,
|
|
236
260
|
hint_num_tasks: Optional[int] = None,
|
|
237
|
-
custom_decoders: Optional[Dict[str, 'sinter.Decoder']] = None,
|
|
261
|
+
custom_decoders: Optional[Dict[str, Union['sinter.Decoder', 'sinter.Sampler']]] = None,
|
|
238
262
|
custom_error_count_key: Optional[str] = None,
|
|
239
263
|
allowed_cpu_affinity_ids: Optional[Iterable[int]] = None,
|
|
240
264
|
) -> List['sinter.TaskStats']:
|
|
@@ -356,7 +380,7 @@ def collect(*,
|
|
|
356
380
|
progress_printer = ThrottledProgressPrinter(
|
|
357
381
|
outs=[],
|
|
358
382
|
print_progress=print_progress,
|
|
359
|
-
min_progress_delay=1,
|
|
383
|
+
min_progress_delay=0.1,
|
|
360
384
|
)
|
|
361
385
|
with contextlib.ExitStack() as exit_stack:
|
|
362
386
|
# Open save/resume file.
|