From 1485a46af666962723d43c794ae36f57eb88cb3b Mon Sep 17 00:00:00 2001 From: Praising Harris Ratnam Date: Sat, 10 Oct 2026 17:01:55 +0530 Subject: [PATCH 1/3] fix: validate logical register parameters --- backend/qec/register.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/backend/qec/register.py b/backend/qec/register.py index 9ae4e92..1051c3a 100644 --- a/backend/qec/register.py +++ b/backend/qec/register.py @@ -6,12 +6,27 @@ This models the idle register between gates — no inter-patch surgery. """ +import math import random from .simulator import run_shot +def _validate_register_inputs(n: int, m: int, d: int, p: float, seed: int | None) -> None: + """Reject invalid register dimensions and noise parameters before simulation.""" + for name, value in (("n", n), ("m", m)): + if isinstance(value, bool) or not isinstance(value, int) or value < 1: + raise ValueError(f"{name} must be a positive integer") + if isinstance(d, bool) or not isinstance(d, int) or d < 3 or d % 2 == 0: + raise ValueError("d must be an odd integer greater than or equal to 3") + if isinstance(p, bool) or not isinstance(p, (int, float)) or not math.isfinite(p) or not 0 <= p <= 1: + raise ValueError("p must be a finite probability between 0 and 1") + if seed is not None and (isinstance(seed, bool) or not isinstance(seed, int)): + raise ValueError("seed must be an integer or None") + + def run_register(n: int, m: int, d: int, p: float, seed: int | None = None) -> dict: + _validate_register_inputs(n, m, d, p, seed) rng = random.Random(seed) patches = [] logical_errors = 0 From a9564a006504211cdad03ea460f1e962463ef0fc Mon Sep 17 00:00:00 2001 From: Praising Harris Ratnam Date: Sat, 10 Oct 2026 17:01:57 +0530 Subject: [PATCH 2/3] test: cover register parameter validation --- backend/tests/test_register.py | 39 ++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 backend/tests/test_register.py diff --git a/backend/tests/test_register.py b/backend/tests/test_register.py new file mode 100644 index 0000000..ed081a0 --- /dev/null +++ b/backend/tests/test_register.py @@ -0,0 +1,39 @@ +"""Input-validation tests for logical register simulation.""" + +import pytest + +from qec import register + + +@pytest.mark.parametrize( + ("kwargs", "message"), + [ + ({"n": 0, "m": 1, "d": 3, "p": 0.0}, "n must be a positive integer"), + ({"n": 1, "m": 0, "d": 3, "p": 0.0}, "m must be a positive integer"), + ({"n": 1, "m": 1, "d": 2, "p": 0.0}, "d must be an odd integer"), + ({"n": 1, "m": 1, "d": 3, "p": -0.1}, "p must be a finite probability"), + ({"n": 1, "m": 1, "d": 3, "p": 1.1}, "p must be a finite probability"), + ({"n": 1, "m": 1, "d": 3, "p": float("nan")}, "p must be a finite probability"), + ({"n": 1, "m": 1, "d": 3, "p": 0.0, "seed": "7"}, "seed must be an integer"), + ], +) +def test_run_register_rejects_invalid_inputs(kwargs, message): + with pytest.raises(ValueError, match=message): + register.run_register(**kwargs) + + +def test_run_register_validates_before_simulating(monkeypatch): + monkeypatch.setattr(register, "run_shot", lambda d, p, seed: { + "logical_error": False, + "logical_x_error": False, + "logical_z_error": False, + "errors_x": [], + "errors_z": [], + "syndromes": {}, + }) + + result = register.run_register(n=1, m=1, d=3, p=0.0, seed=7) + + assert result["total_patches"] == 1 + assert result["total_physical"] == 18 + assert result["logical_error_rate"] == 0 From 45ea13d4438b8f113f36eac94efdd748da6dcea3 Mon Sep 17 00:00:00 2001 From: Praising Harris Ratnam Date: Sun, 11 Oct 2026 16:02:34 +0530 Subject: [PATCH 3/3] test: cover boolean register inputs --- backend/tests/test_register.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/backend/tests/test_register.py b/backend/tests/test_register.py index ed081a0..329d116 100644 --- a/backend/tests/test_register.py +++ b/backend/tests/test_register.py @@ -15,6 +15,11 @@ ({"n": 1, "m": 1, "d": 3, "p": 1.1}, "p must be a finite probability"), ({"n": 1, "m": 1, "d": 3, "p": float("nan")}, "p must be a finite probability"), ({"n": 1, "m": 1, "d": 3, "p": 0.0, "seed": "7"}, "seed must be an integer"), + ({"n": True, "m": 1, "d": 3, "p": 0.0}, "n must be a positive integer"), + ({"n": 1, "m": False, "d": 3, "p": 0.0}, "m must be a positive integer"), + ({"n": 1, "m": 1, "d": True, "p": 0.0}, "d must be an odd integer"), + ({"n": 1, "m": 1, "d": 3, "p": True}, "p must be a finite probability"), + ({"n": 1, "m": 1, "d": 3, "p": 0.0, "seed": True}, "seed must be an integer"), ], ) def test_run_register_rejects_invalid_inputs(kwargs, message):