Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 49 additions & 46 deletions src/py/tesseract_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -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():
"""
Expand All @@ -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():
"""
Expand All @@ -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():
"""
Expand Down Expand Up @@ -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():
Expand Down
8 changes: 5 additions & 3 deletions src/tesseract.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,16 +28,18 @@
#include "visualization.h"

constexpr size_t INF_DET_BEAM = std::numeric_limits<uint16_t>::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<size_t>::max();
size_t pqlimit = DEFAULT_PQLIMIT;
std::vector<std::vector<size_t>> det_orders;
double det_penalty = 0;
bool create_visualization = false;
Expand Down
20 changes: 14 additions & 6 deletions src/tesseract.pybind.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@

#include "stim_utils.pybind.h"
#include "tesseract.h"
#include "utils.h"

namespace py = pybind11;

Expand All @@ -39,6 +40,9 @@ TesseractConfig tesseract_config_maker_no_dem(
std::vector<std::vector<size_t>> det_orders = std::vector<std::vector<size_t>>(),
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});
Expand All @@ -52,10 +56,14 @@ TesseractConfig tesseract_config_maker(
std::vector<std::vector<size_t>> det_orders = std::vector<std::vector<size_t>>(),
double det_penalty = 0.0, bool create_visualization = false) {
stim::DetectorErrorModel input_dem = parse_py_object<stim::DetectorErrorModel>(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");
Expand All @@ -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<size_t>::max(),
py::arg("merge_errors") = true, py::arg("pqlimit") = 200000,
py::arg("det_orders") = std::vector<std::vector<size_t>>(), py::arg("det_penalty") = 0.0,
py::arg("create_visualization") = false,
R"pbdoc(
Expand Down Expand Up @@ -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<size_t>::max(),
py::arg("merge_errors") = true, py::arg("pqlimit") = 200000,
py::arg("det_orders") = std::vector<std::vector<size_t>>(), py::arg("det_penalty") = 0.0,
py::arg("create_visualization") = false,
R"pbdoc(
Expand Down
Loading