From f75c5429af18d306fd0dd83b8890e757f64aae27 Mon Sep 17 00:00:00 2001 From: Yahya Kayaal <117476621+kayaal34@users.noreply.github.com> Date: Sat, 19 Sep 2026 14:16:13 +0300 Subject: [PATCH] fix: allow seed=0 in OptimizationConfig `OptimizationConfig.seed` was `PositiveInt`, so `seed=0` was rejected even though `Pipeline(seed=0)` accepts it. This also broke `Pipeline.from_preset(name, seed=0)`, which builds an `OptimizationConfig`. Switch to `NonNegativeInt`, regenerate the JSON schema, and add tests. Closes #352 Co-Authored-By: Claude Opus 5 --- docs/optimizer_config.schema.json | 2 +- src/autointent/_optimization_config.py | 4 ++-- tests/configs/test_full_config.py | 11 +++++++++++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/docs/optimizer_config.schema.json b/docs/optimizer_config.schema.json index 6cd14fcfd..7b6522159 100644 --- a/docs/optimizer_config.schema.json +++ b/docs/optimizer_config.schema.json @@ -1242,7 +1242,7 @@ }, "seed": { "default": 42, - "exclusiveMinimum": 0, + "minimum": 0, "title": "Seed", "type": "integer" } diff --git a/src/autointent/_optimization_config.py b/src/autointent/_optimization_config.py index 547474a92..64767c7bd 100644 --- a/src/autointent/_optimization_config.py +++ b/src/autointent/_optimization_config.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING, Any -from pydantic import BaseModel, Field, PositiveInt, field_validator +from pydantic import BaseModel, Field, NonNegativeInt, field_validator from .configs import ( CrossEncoderConfig, @@ -49,7 +49,7 @@ def validate_embedder_config(cls, v: Any) -> EmbedderConfig: # noqa: ANN401 hpo_config: HPOConfig = HPOConfig() - seed: PositiveInt = 42 + seed: NonNegativeInt = 42 @classmethod def from_preset(cls, preset: SearchSpacePreset) -> OptimizationConfig: diff --git a/tests/configs/test_full_config.py b/tests/configs/test_full_config.py index b95b4a63f..cd97d0831 100644 --- a/tests/configs/test_full_config.py +++ b/tests/configs/test_full_config.py @@ -17,3 +17,14 @@ def test_not_valid_reporting() -> None: with pytest.raises(ValidationError): OptimizationConfig(**config) + + +@pytest.mark.parametrize("seed", [0, 1, 42]) +def test_seed_accepts_non_negative(seed: int) -> None: + config = OptimizationConfig(seed=seed, search_space=[]) + assert config.seed == seed + + +def test_seed_rejects_negative() -> None: + with pytest.raises(ValidationError): + OptimizationConfig(seed=-1, search_space=[])