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.
Files changed (76) hide show
  1. sinter-1.16.dev1768465883/MANIFEST.in +1 -0
  2. {sinter-1.14.dev1712659430 → sinter-1.16.dev1768465883}/PKG-INFO +13 -5
  3. sinter-1.16.dev1768465883/requirements.txt +4 -0
  4. {sinter-1.14.dev1712659430 → sinter-1.16.dev1768465883}/setup.py +3 -3
  5. {sinter-1.14.dev1712659430 → sinter-1.16.dev1768465883}/src/sinter/__init__.py +13 -22
  6. sinter-1.16.dev1768465883/src/sinter/_collection/__init__.py +10 -0
  7. {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_collection}/_collection.py +63 -39
  8. sinter-1.16.dev1768465883/src/sinter/_collection/_collection_manager.py +581 -0
  9. sinter-1.16.dev1768465883/src/sinter/_collection/_collection_manager_test.py +287 -0
  10. {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_collection}/_collection_test.py +108 -1
  11. sinter-1.16.dev1768465883/src/sinter/_collection/_collection_worker_loop.py +35 -0
  12. sinter-1.16.dev1768465883/src/sinter/_collection/_collection_worker_state.py +259 -0
  13. sinter-1.16.dev1768465883/src/sinter/_collection/_collection_worker_test.py +222 -0
  14. sinter-1.16.dev1768465883/src/sinter/_collection/_mux_sampler.py +56 -0
  15. sinter-1.16.dev1768465883/src/sinter/_collection/_sampler_ramp_throttled.py +66 -0
  16. sinter-1.16.dev1768465883/src/sinter/_collection/_sampler_ramp_throttled_test.py +144 -0
  17. sinter-1.16.dev1768465883/src/sinter/_command/__init__.py +0 -0
  18. {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_command}/_main.py +4 -4
  19. {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_command}/_main_collect.py +10 -10
  20. {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_command}/_main_collect_test.py +34 -4
  21. {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_command}/_main_combine.py +1 -2
  22. {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_command}/_main_combine_test.py +1 -1
  23. {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_command}/_main_plot.py +140 -98
  24. {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_command}/_main_plot_test.py +2 -2
  25. {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_command}/_main_predict_test.py +1 -1
  26. sinter-1.16.dev1768465883/src/sinter/_data/__init__.py +20 -0
  27. {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_data}/_anon_task_stats.py +19 -15
  28. {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_data}/_csv_out.py +3 -0
  29. {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_data}/_existing_data.py +6 -5
  30. {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_data}/_task.py +1 -1
  31. {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_data}/_task_stats.py +92 -26
  32. {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_data}/_task_stats_test.py +52 -1
  33. sinter-1.16.dev1768465883/src/sinter/_decoding/__init__.py +16 -0
  34. {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_decoding}/_decoding.py +3 -3
  35. sinter-1.16.dev1768465883/src/sinter/_decoding/_decoding_all_built_in_decoders.py +25 -0
  36. {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_decoding}/_decoding_decoder_class.py +20 -3
  37. {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_decoding}/_decoding_fusion_blossom.py +6 -3
  38. sinter-1.16.dev1768465883/src/sinter/_decoding/_decoding_mwpf.py +302 -0
  39. {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_decoding}/_decoding_pymatching.py +1 -1
  40. {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_decoding}/_decoding_test.py +95 -3
  41. {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_decoding}/_decoding_vacuous.py +1 -1
  42. sinter-1.16.dev1768465883/src/sinter/_decoding/_perfectionist_sampler.py +38 -0
  43. sinter-1.16.dev1768465883/src/sinter/_decoding/_sampler.py +72 -0
  44. sinter-1.16.dev1768465883/src/sinter/_decoding/_stim_then_decode_sampler.py +222 -0
  45. sinter-1.16.dev1768465883/src/sinter/_decoding/_stim_then_decode_sampler_test.py +192 -0
  46. {sinter-1.14.dev1712659430 → sinter-1.16.dev1768465883}/src/sinter/_plotting.py +223 -71
  47. {sinter-1.14.dev1712659430 → sinter-1.16.dev1768465883}/src/sinter/_plotting_test.py +3 -0
  48. {sinter-1.14.dev1712659430 → sinter-1.16.dev1768465883}/src/sinter/_predict.py +1 -3
  49. {sinter-1.14.dev1712659430 → sinter-1.16.dev1768465883}/src/sinter/_probability_util.py +27 -10
  50. {sinter-1.14.dev1712659430 → sinter-1.16.dev1768465883}/src/sinter.egg-info/PKG-INFO +13 -5
  51. sinter-1.16.dev1768465883/src/sinter.egg-info/SOURCES.txt +65 -0
  52. sinter-1.16.dev1768465883/src/sinter.egg-info/entry_points.txt +2 -0
  53. sinter-1.16.dev1768465883/src/sinter.egg-info/requires.txt +4 -0
  54. sinter-1.14.dev1712659430/requirements.txt +0 -4
  55. sinter-1.14.dev1712659430/src/sinter/_collection_tracker_for_single_task.py +0 -230
  56. sinter-1.14.dev1712659430/src/sinter/_collection_work_manager.py +0 -275
  57. sinter-1.14.dev1712659430/src/sinter/_decoding_all_built_in_decoders.py +0 -12
  58. sinter-1.14.dev1712659430/src/sinter/_worker.py +0 -212
  59. sinter-1.14.dev1712659430/src/sinter/_worker_test.py +0 -134
  60. sinter-1.14.dev1712659430/src/sinter.egg-info/SOURCES.txt +0 -51
  61. sinter-1.14.dev1712659430/src/sinter.egg-info/entry_points.txt +0 -2
  62. sinter-1.14.dev1712659430/src/sinter.egg-info/requires.txt +0 -4
  63. {sinter-1.14.dev1712659430 → sinter-1.16.dev1768465883}/README.md +0 -0
  64. {sinter-1.14.dev1712659430 → sinter-1.16.dev1768465883}/readme_example_plot.png +0 -0
  65. {sinter-1.14.dev1712659430 → sinter-1.16.dev1768465883}/setup.cfg +0 -0
  66. {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_collection}/_printer.py +0 -0
  67. {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_command}/_main_predict.py +0 -0
  68. {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_data}/_anon_task_stats_test.py +0 -0
  69. {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_data}/_collection_options.py +0 -0
  70. {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_data}/_collection_options_test.py +0 -0
  71. {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_data}/_existing_data_test.py +0 -0
  72. {sinter-1.14.dev1712659430/src/sinter → sinter-1.16.dev1768465883/src/sinter/_data}/_task_test.py +0 -0
  73. {sinter-1.14.dev1712659430 → sinter-1.16.dev1768465883}/src/sinter/_predict_test.py +0 -0
  74. {sinter-1.14.dev1712659430 → sinter-1.16.dev1768465883}/src/sinter/_probability_util_test.py +0 -0
  75. {sinter-1.14.dev1712659430 → sinter-1.16.dev1768465883}/src/sinter.egg-info/dependency_links.txt +0 -0
  76. {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
1
+ Metadata-Version: 2.4
2
2
  Name: sinter
3
- Version: 1.14.dev1712659430
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~=3.5
11
- Requires-Dist: numpy~=1.22
10
+ Requires-Dist: matplotlib
11
+ Requires-Dist: numpy
12
12
  Requires-Dist: stim
13
- Requires-Dist: scipy~=1.9
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
 
@@ -0,0 +1,4 @@
1
+ matplotlib
2
+ numpy
3
+ stim
4
+ scipy
@@ -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.14.dev1712659430'
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.14.dev1712659430'
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._collection_options import (
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
- )
@@ -0,0 +1,10 @@
1
+ from sinter._collection._collection import (
2
+ collect,
3
+ iter_collect,
4
+ post_selection_mask_from_4th_coord,
5
+ post_selection_mask_from_predicate,
6
+ Progress,
7
+ )
8
+ from sinter._collection._printer import (
9
+ ThrottledProgressPrinter,
10
+ )
@@ -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._collection_options import CollectionOptions
12
- from sinter._csv_out import CSV_HEADER
13
- from sinter._collection_work_manager import CollectionWorkManager
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: Optional[ExistingData] = None,
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
- with CollectionWorkManager(
170
- tasks_iter=iter(tasks),
171
- global_collection_options=CollectionOptions(
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
- decoders=decoders,
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(num_workers)
192
-
193
- yield Progress(
194
- new_stats=(),
195
- status_message="Finding work..."
196
- )
197
- manager.fill_work_queue()
198
- yield Progress(
199
- new_stats=(),
200
- status_message=manager.status(num_circuits=hint_num_tasks)
201
- )
202
-
203
- while manager.fill_work_queue():
204
- # Wait for a worker to finish a job.
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.