"""Model registry for tkmlr. New backends can be added without editing the factory by decorating a builder: @register_model("my_model") def build_my_model(**params): return MyRegressor(**params) """ from __future__ import annotations from typing import Callable, Dict, Iterable from .base import BaseRegressor ModelBuilder = Callable[..., BaseRegressor] _MODEL_REGISTRY: Dict[str, ModelBuilder] = {} def register_model(name: str): def decorator(func: ModelBuilder) -> ModelBuilder: _MODEL_REGISTRY[name.lower()] = func return func return decorator def create_model(name: str, **params) -> BaseRegressor: key = name.lower() if key not in _MODEL_REGISTRY: known = ", ".join(sorted(_MODEL_REGISTRY)) raise ValueError(f"Unknown model '{name}'. Registered models: {known}") return _MODEL_REGISTRY[key](**params) def registered_models() -> Iterable[str]: return sorted(_MODEL_REGISTRY)