From d3571c7204cd95963c4ef3b4fb668d8df2cea847 Mon Sep 17 00:00:00 2001 From: Saturday-boyi <2174084306@qq.com> Date: Sat, 19 Sep 2026 18:11:01 +0800 Subject: [PATCH] fix: allow zero seed in optimization configurations Signed-off-by: Saturday-boyi <2174084306@qq.com> --- docs/optimizer_config.schema.json | 2 +- src/autointent/_optimization_config.py | 4 ++-- tests/configs/test_full_config.py | 25 ++++++++++++++++++++++++- 3 files changed, 27 insertions(+), 4 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..8d9bfe0a5 100644 --- a/tests/configs/test_full_config.py +++ b/tests/configs/test_full_config.py @@ -1,7 +1,7 @@ import pytest from pydantic import ValidationError -from autointent import OptimizationConfig +from autointent import OptimizationConfig, Pipeline from tests.conftest import load_optimization_config @@ -17,3 +17,26 @@ def test_not_valid_reporting() -> None: with pytest.raises(ValidationError): OptimizationConfig(**config) + + +@pytest.mark.parametrize("seed", [0, 42]) +def test_non_negative_seed(seed: int) -> None: + config = OptimizationConfig(seed=seed, search_space=[]) + assert config.seed == seed + + +def test_negative_seed_is_rejected() -> None: + with pytest.raises(ValidationError, match="seed"): + OptimizationConfig(seed=-1, search_space=[]) + + +def test_pipeline_from_preset_accepts_zero_seed() -> None: + pipeline = Pipeline.from_preset("classic-light", seed=0) + assert pipeline._seed == 0 + + +def test_pipeline_from_optimization_config_accepts_zero_seed() -> None: + config = load_optimization_config("full_training") + config["seed"] = 0 + pipeline = Pipeline.from_optimization_config(config) + assert pipeline._seed == 0