Skip to content

Commit 127d840

Browse files
Better default arguments for Tesseract config (#107)
Address issue #89 --------- Co-authored-by: Noah Shutty <noajshu@users.noreply.github.com>
1 parent 05697ee commit 127d840

File tree

3 files changed

+68
-55
lines changed

3 files changed

+68
-55
lines changed

src/py/tesseract_test.py

Lines changed: 49 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,18 @@ def test_create_node():
4848

4949

5050
def test_create_tesseract_config():
51-
assert (
52-
str(tesseract_decoder.tesseract.TesseractConfig(_DETECTOR_ERROR_MODEL))
53-
== "TesseractConfig(dem=DetectorErrorModel_Object, det_beam=65535, no_revisit_dets=0, at_most_two_errors_per_detector=0, verbose=0, merge_errors=1, pqlimit=18446744073709551615, det_orders=[], det_penalty=0, create_visualization=0)"
54-
)
55-
assert (
56-
tesseract_decoder.tesseract.TesseractConfig(_DETECTOR_ERROR_MODEL).dem
57-
== _DETECTOR_ERROR_MODEL
58-
)
51+
config = tesseract_decoder.tesseract.TesseractConfig(_DETECTOR_ERROR_MODEL)
52+
assert config.dem == _DETECTOR_ERROR_MODEL
53+
assert config.det_beam == 5
54+
assert config.no_revisit_dets is True
55+
assert config.at_most_two_errors_per_detector is False
56+
assert config.verbose is False
57+
assert config.merge_errors is True
58+
assert config.pqlimit == 200000
59+
assert config.det_penalty == 0
60+
assert config.create_visualization is False
61+
assert len(config.det_orders) == 20
62+
5963

6064
def test_create_tesseract_config_with_dem():
6165
"""
@@ -64,14 +68,16 @@ def test_create_tesseract_config_with_dem():
6468

6569
config = tesseract_decoder.tesseract.TesseractConfig(_DETECTOR_ERROR_MODEL)
6670

67-
# Assert the string representation matches the expected format.
68-
assert (
69-
str(config)
70-
== "TesseractConfig(dem=DetectorErrorModel_Object, det_beam=65535, no_revisit_dets=0, at_most_two_errors_per_detector=0, verbose=0, merge_errors=1, pqlimit=18446744073709551615, det_orders=[], det_penalty=0, create_visualization=0)"
71-
)
72-
73-
# Assert that the `dem` attribute is correctly set.
7471
assert config.dem == _DETECTOR_ERROR_MODEL
72+
assert config.det_beam == 5
73+
assert config.no_revisit_dets is True
74+
assert config.at_most_two_errors_per_detector is False
75+
assert config.verbose is False
76+
assert config.merge_errors is True
77+
assert config.pqlimit == 200000
78+
assert config.det_penalty == 0
79+
assert config.create_visualization is False
80+
assert len(config.det_orders) == 20
7581

7682
def test_create_tesseract_config_with_dem_and_custom_args():
7783
"""
@@ -85,17 +91,17 @@ def test_create_tesseract_config_with_dem_and_custom_args():
8591
det_penalty=0.5
8692
)
8793

88-
# Assert that the `dem` and custom arguments are correctly set.
8994
assert config.dem == _DETECTOR_ERROR_MODEL
9095
assert config.det_beam == 100
96+
assert config.no_revisit_dets is True
97+
assert config.at_most_two_errors_per_detector is False
98+
assert config.verbose is False
9199
assert config.merge_errors is False
100+
assert config.pqlimit == 200000
92101
assert config.det_penalty == 0.5
102+
assert config.create_visualization is False
103+
assert len(config.det_orders) == 20
93104

94-
# Assert the string representation is as expected.
95-
assert (
96-
str(config)
97-
== "TesseractConfig(dem=DetectorErrorModel_Object, det_beam=100, no_revisit_dets=0, at_most_two_errors_per_detector=0, verbose=0, merge_errors=0, pqlimit=18446744073709551615, det_orders=[], det_penalty=0.5, create_visualization=0)"
98-
)
99105

100106
def test_compile_decoder_for_dem_basic_functionality():
101107
"""
@@ -156,37 +162,34 @@ def test_create_tesseract_config_no_dem():
156162
Tests the new constructor that does not require a `dem` argument.
157163
"""
158164
# Create an instance with no arguments.
159-
config_default = tesseract_decoder.tesseract.TesseractConfig()
160-
161-
# Assert that the `dem` attribute defaults to an empty DetectorErrorModel.
162-
empty_dem = stim.DetectorErrorModel()
163-
assert config_default.dem == empty_dem
164-
165-
# Assert that the string representation shows the default values.
166-
assert (
167-
str(config_default)
168-
== "TesseractConfig(dem=DetectorErrorModel_Object, det_beam=65535, no_revisit_dets=0, at_most_two_errors_per_detector=0, verbose=0, merge_errors=1, pqlimit=18446744073709551615, det_orders=[], det_penalty=0, create_visualization=0)"
169-
)
165+
config = tesseract_decoder.tesseract.TesseractConfig()
166+
167+
assert config.dem == stim.DetectorErrorModel()
168+
assert config.det_beam == 5
169+
assert config.no_revisit_dets is True
170+
assert config.at_most_two_errors_per_detector is False
171+
assert config.verbose is False
172+
assert config.merge_errors is True
173+
assert config.pqlimit == 200000
174+
assert config.det_penalty == 0.0
175+
assert config.create_visualization is False
170176

171177
def test_create_tesseract_config_no_dem_with_custom_args():
172178
"""
173179
Tests the new constructor with custom arguments to ensure they are passed correctly.
174180
"""
175181
# Create an instance with no dem but a custom det_beam.
176-
config_custom = tesseract_decoder.tesseract.TesseractConfig(det_beam=15, verbose=True)
177-
178-
# Assert that the `det_beam` and `verbose` attributes are correctly set.
179-
assert config_custom.det_beam == 15
180-
assert config_custom.verbose is True
181-
182-
# Assert that the `dem` attribute still defaults to an empty DetectorErrorModel.
183-
assert config_custom.dem == stim.DetectorErrorModel()
184-
185-
# Assert that the string representation reflects the custom values.
186-
assert (
187-
str(config_custom)
188-
== "TesseractConfig(dem=DetectorErrorModel_Object, det_beam=15, no_revisit_dets=0, at_most_two_errors_per_detector=0, verbose=1, merge_errors=1, pqlimit=18446744073709551615, det_orders=[], det_penalty=0, create_visualization=0)"
189-
)
182+
config = tesseract_decoder.tesseract.TesseractConfig(det_beam=15, verbose=True)
183+
184+
assert config.dem == stim.DetectorErrorModel()
185+
assert config.det_beam == 15
186+
assert config.no_revisit_dets is True
187+
assert config.at_most_two_errors_per_detector is False
188+
assert config.verbose is True
189+
assert config.merge_errors is True
190+
assert config.pqlimit == 200000
191+
assert config.det_penalty == 0.0
192+
assert config.create_visualization is False
190193

191194

192195
def test_create_tesseract_decoder():

src/tesseract.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,18 @@
2828
#include "visualization.h"
2929

3030
constexpr size_t INF_DET_BEAM = std::numeric_limits<uint16_t>::max();
31+
constexpr int DEFAULT_DET_BEAM = 5;
32+
constexpr size_t DEFAULT_PQLIMIT = 200000;
3133

3234
struct TesseractConfig {
3335
stim::DetectorErrorModel dem;
34-
int det_beam = INF_DET_BEAM;
36+
int det_beam = DEFAULT_DET_BEAM;
3537
bool beam_climbing = false;
36-
bool no_revisit_dets = false;
38+
bool no_revisit_dets = true;
3739
bool at_most_two_errors_per_detector = false;
3840
bool verbose = false;
3941
bool merge_errors = true;
40-
size_t pqlimit = std::numeric_limits<size_t>::max();
42+
size_t pqlimit = DEFAULT_PQLIMIT;
4143
std::vector<std::vector<size_t>> det_orders;
4244
double det_penalty = 0;
4345
bool create_visualization = false;

src/tesseract.pybind.h

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
#include "stim_utils.pybind.h"
2525
#include "tesseract.h"
26+
#include "utils.h"
2627

2728
namespace py = pybind11;
2829

@@ -39,6 +40,9 @@ TesseractConfig tesseract_config_maker_no_dem(
3940
std::vector<std::vector<size_t>> det_orders = std::vector<std::vector<size_t>>(),
4041
double det_penalty = 0.0, bool create_visualization = false) {
4142
stim::DetectorErrorModel empty_dem;
43+
if (det_orders.empty()) {
44+
det_orders = build_det_orders(empty_dem, 20, /*det_order_bfs=*/true, 2384753);
45+
}
4246
return TesseractConfig({empty_dem, det_beam, beam_climbing, no_revisit_dets,
4347
at_most_two_errors_per_detector, verbose, merge_errors, pqlimit,
4448
det_orders, det_penalty, create_visualization});
@@ -52,10 +56,14 @@ TesseractConfig tesseract_config_maker(
5256
std::vector<std::vector<size_t>> det_orders = std::vector<std::vector<size_t>>(),
5357
double det_penalty = 0.0, bool create_visualization = false) {
5458
stim::DetectorErrorModel input_dem = parse_py_object<stim::DetectorErrorModel>(dem);
59+
if (det_orders.empty()) {
60+
det_orders = build_det_orders(input_dem, 20, true, 2384753);
61+
}
5562
return TesseractConfig({input_dem, det_beam, beam_climbing, no_revisit_dets,
5663
at_most_two_errors_per_detector, verbose, merge_errors, pqlimit,
5764
det_orders, det_penalty, create_visualization});
5865
}
66+
5967
}; // namespace
6068
void add_tesseract_module(py::module& root) {
6169
auto m = root.def_submodule("tesseract", "Module containing the tesseract algorithm");
@@ -73,10 +81,10 @@ void add_tesseract_module(py::module& root) {
7381
Default constructor for TesseractConfig.
7482
Creates a new instance with default parameter values.
7583
)pbdoc")
76-
.def(py::init(&tesseract_config_maker_no_dem), py::arg("det_beam") = INF_DET_BEAM,
77-
py::arg("beam_climbing") = false, py::arg("no_revisit_dets") = false,
84+
.def(py::init(&tesseract_config_maker_no_dem), py::arg("det_beam") = 5,
85+
py::arg("beam_climbing") = false, py::arg("no_revisit_dets") = true,
7886
py::arg("at_most_two_errors_per_detector") = false, py::arg("verbose") = false,
79-
py::arg("merge_errors") = true, py::arg("pqlimit") = std::numeric_limits<size_t>::max(),
87+
py::arg("merge_errors") = true, py::arg("pqlimit") = 200000,
8088
py::arg("det_orders") = std::vector<std::vector<size_t>>(), py::arg("det_penalty") = 0.0,
8189
py::arg("create_visualization") = false,
8290
R"pbdoc(
@@ -108,10 +116,10 @@ void add_tesseract_module(py::module& root) {
108116
create_visualization: bool, defualt=False
109117
Whether to record the information needed to create a visualization or not.
110118
)pbdoc")
111-
.def(py::init(&tesseract_config_maker), py::arg("dem"), py::arg("det_beam") = INF_DET_BEAM,
112-
py::arg("beam_climbing") = false, py::arg("no_revisit_dets") = false,
119+
.def(py::init(&tesseract_config_maker), py::arg("dem"), py::arg("det_beam") = 5,
120+
py::arg("beam_climbing") = false, py::arg("no_revisit_dets") = true,
113121
py::arg("at_most_two_errors_per_detector") = false, py::arg("verbose") = false,
114-
py::arg("merge_errors") = true, py::arg("pqlimit") = std::numeric_limits<size_t>::max(),
122+
py::arg("merge_errors") = true, py::arg("pqlimit") = 200000,
115123
py::arg("det_orders") = std::vector<std::vector<size_t>>(), py::arg("det_penalty") = 0.0,
116124
py::arg("create_visualization") = false,
117125
R"pbdoc(

0 commit comments

Comments
 (0)