diff --git a/src/py/tesseract_test.py b/src/py/tesseract_test.py index 4355497..476d077 100644 --- a/src/py/tesseract_test.py +++ b/src/py/tesseract_test.py @@ -48,14 +48,18 @@ def test_create_node(): def test_create_tesseract_config(): - assert ( - str(tesseract_decoder.tesseract.TesseractConfig(_DETECTOR_ERROR_MODEL)) - == "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)" - ) - assert ( - tesseract_decoder.tesseract.TesseractConfig(_DETECTOR_ERROR_MODEL).dem - == _DETECTOR_ERROR_MODEL - ) + config = tesseract_decoder.tesseract.TesseractConfig(_DETECTOR_ERROR_MODEL) + assert config.dem == _DETECTOR_ERROR_MODEL + assert config.det_beam == 5 + assert config.no_revisit_dets is True + assert config.at_most_two_errors_per_detector is False + assert config.verbose is False + assert config.merge_errors is True + assert config.pqlimit == 200000 + assert config.det_penalty == 0 + assert config.create_visualization is False + assert len(config.det_orders) == 20 + def test_create_tesseract_config_with_dem(): """ @@ -64,14 +68,16 @@ def test_create_tesseract_config_with_dem(): config = tesseract_decoder.tesseract.TesseractConfig(_DETECTOR_ERROR_MODEL) - # Assert the string representation matches the expected format. - assert ( - str(config) - == "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)" - ) - - # Assert that the `dem` attribute is correctly set. assert config.dem == _DETECTOR_ERROR_MODEL + assert config.det_beam == 5 + assert config.no_revisit_dets is True + assert config.at_most_two_errors_per_detector is False + assert config.verbose is False + assert config.merge_errors is True + assert config.pqlimit == 200000 + assert config.det_penalty == 0 + assert config.create_visualization is False + assert len(config.det_orders) == 20 def test_create_tesseract_config_with_dem_and_custom_args(): """ @@ -85,17 +91,17 @@ def test_create_tesseract_config_with_dem_and_custom_args(): det_penalty=0.5 ) - # Assert that the `dem` and custom arguments are correctly set. assert config.dem == _DETECTOR_ERROR_MODEL assert config.det_beam == 100 + assert config.no_revisit_dets is True + assert config.at_most_two_errors_per_detector is False + assert config.verbose is False assert config.merge_errors is False + assert config.pqlimit == 200000 assert config.det_penalty == 0.5 + assert config.create_visualization is False + assert len(config.det_orders) == 20 - # Assert the string representation is as expected. - assert ( - str(config) - == "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)" - ) def test_compile_decoder_for_dem_basic_functionality(): """ @@ -156,37 +162,34 @@ def test_create_tesseract_config_no_dem(): Tests the new constructor that does not require a `dem` argument. """ # Create an instance with no arguments. - config_default = tesseract_decoder.tesseract.TesseractConfig() - - # Assert that the `dem` attribute defaults to an empty DetectorErrorModel. - empty_dem = stim.DetectorErrorModel() - assert config_default.dem == empty_dem - - # Assert that the string representation shows the default values. - assert ( - str(config_default) - == "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)" - ) + config = tesseract_decoder.tesseract.TesseractConfig() + + assert config.dem == stim.DetectorErrorModel() + assert config.det_beam == 5 + assert config.no_revisit_dets is True + assert config.at_most_two_errors_per_detector is False + assert config.verbose is False + assert config.merge_errors is True + assert config.pqlimit == 200000 + assert config.det_penalty == 0.0 + assert config.create_visualization is False def test_create_tesseract_config_no_dem_with_custom_args(): """ Tests the new constructor with custom arguments to ensure they are passed correctly. """ # Create an instance with no dem but a custom det_beam. - config_custom = tesseract_decoder.tesseract.TesseractConfig(det_beam=15, verbose=True) - - # Assert that the `det_beam` and `verbose` attributes are correctly set. - assert config_custom.det_beam == 15 - assert config_custom.verbose is True - - # Assert that the `dem` attribute still defaults to an empty DetectorErrorModel. - assert config_custom.dem == stim.DetectorErrorModel() - - # Assert that the string representation reflects the custom values. - assert ( - str(config_custom) - == "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)" - ) + config = tesseract_decoder.tesseract.TesseractConfig(det_beam=15, verbose=True) + + assert config.dem == stim.DetectorErrorModel() + assert config.det_beam == 15 + assert config.no_revisit_dets is True + assert config.at_most_two_errors_per_detector is False + assert config.verbose is True + assert config.merge_errors is True + assert config.pqlimit == 200000 + assert config.det_penalty == 0.0 + assert config.create_visualization is False def test_create_tesseract_decoder(): diff --git a/src/tesseract.h b/src/tesseract.h index 9a3806e..ead2b2a 100644 --- a/src/tesseract.h +++ b/src/tesseract.h @@ -28,16 +28,18 @@ #include "visualization.h" constexpr size_t INF_DET_BEAM = std::numeric_limits::max(); +constexpr int DEFAULT_DET_BEAM = 5; +constexpr size_t DEFAULT_PQLIMIT = 200000; struct TesseractConfig { stim::DetectorErrorModel dem; - int det_beam = INF_DET_BEAM; + int det_beam = DEFAULT_DET_BEAM; bool beam_climbing = false; - bool no_revisit_dets = false; + bool no_revisit_dets = true; bool at_most_two_errors_per_detector = false; bool verbose = false; bool merge_errors = true; - size_t pqlimit = std::numeric_limits::max(); + size_t pqlimit = DEFAULT_PQLIMIT; std::vector> det_orders; double det_penalty = 0; bool create_visualization = false; diff --git a/src/tesseract.pybind.h b/src/tesseract.pybind.h index b94c27f..6c14585 100644 --- a/src/tesseract.pybind.h +++ b/src/tesseract.pybind.h @@ -23,6 +23,7 @@ #include "stim_utils.pybind.h" #include "tesseract.h" +#include "utils.h" namespace py = pybind11; @@ -39,6 +40,9 @@ TesseractConfig tesseract_config_maker_no_dem( std::vector> det_orders = std::vector>(), double det_penalty = 0.0, bool create_visualization = false) { stim::DetectorErrorModel empty_dem; + if (det_orders.empty()) { + det_orders = build_det_orders(empty_dem, 20, /*det_order_bfs=*/true, 2384753); + } return TesseractConfig({empty_dem, det_beam, beam_climbing, no_revisit_dets, at_most_two_errors_per_detector, verbose, merge_errors, pqlimit, det_orders, det_penalty, create_visualization}); @@ -52,10 +56,14 @@ TesseractConfig tesseract_config_maker( std::vector> det_orders = std::vector>(), double det_penalty = 0.0, bool create_visualization = false) { stim::DetectorErrorModel input_dem = parse_py_object(dem); + if (det_orders.empty()) { + det_orders = build_det_orders(input_dem, 20, true, 2384753); + } return TesseractConfig({input_dem, det_beam, beam_climbing, no_revisit_dets, at_most_two_errors_per_detector, verbose, merge_errors, pqlimit, det_orders, det_penalty, create_visualization}); } + }; // namespace void add_tesseract_module(py::module& root) { auto m = root.def_submodule("tesseract", "Module containing the tesseract algorithm"); @@ -73,10 +81,10 @@ void add_tesseract_module(py::module& root) { Default constructor for TesseractConfig. Creates a new instance with default parameter values. )pbdoc") - .def(py::init(&tesseract_config_maker_no_dem), py::arg("det_beam") = INF_DET_BEAM, - py::arg("beam_climbing") = false, py::arg("no_revisit_dets") = false, + .def(py::init(&tesseract_config_maker_no_dem), py::arg("det_beam") = 5, + py::arg("beam_climbing") = false, py::arg("no_revisit_dets") = true, py::arg("at_most_two_errors_per_detector") = false, py::arg("verbose") = false, - py::arg("merge_errors") = true, py::arg("pqlimit") = std::numeric_limits::max(), + py::arg("merge_errors") = true, py::arg("pqlimit") = 200000, py::arg("det_orders") = std::vector>(), py::arg("det_penalty") = 0.0, py::arg("create_visualization") = false, R"pbdoc( @@ -108,10 +116,10 @@ void add_tesseract_module(py::module& root) { create_visualization: bool, defualt=False Whether to record the information needed to create a visualization or not. )pbdoc") - .def(py::init(&tesseract_config_maker), py::arg("dem"), py::arg("det_beam") = INF_DET_BEAM, - py::arg("beam_climbing") = false, py::arg("no_revisit_dets") = false, + .def(py::init(&tesseract_config_maker), py::arg("dem"), py::arg("det_beam") = 5, + py::arg("beam_climbing") = false, py::arg("no_revisit_dets") = true, py::arg("at_most_two_errors_per_detector") = false, py::arg("verbose") = false, - py::arg("merge_errors") = true, py::arg("pqlimit") = std::numeric_limits::max(), + py::arg("merge_errors") = true, py::arg("pqlimit") = 200000, py::arg("det_orders") = std::vector>(), py::arg("det_penalty") = 0.0, py::arg("create_visualization") = false, R"pbdoc(