Source code for pyRadPlan.optimization.solvers._factory

"""Factory methods to manage available solver implementations."""

import warnings
import logging
from typing import Union, Type
from ._base_solvers import SolverBase

SOLVERS = {}

logger = logging.getLogger(__name__)


[docs] def register_solver(solver_cls: Type[SolverBase]) -> None: """ Register a new solver. Parameters ---------- solver_cls : type A Dose Solver class. """ if not issubclass(solver_cls, SolverBase): raise ValueError("Solver must be a subclass of SolverBase.") if solver_cls.short_name is None: raise ValueError("Solver must have a 'short_name' attribute.") if solver_cls.name is None: raise ValueError("Solver must have a 'name' attribute.") solver_name = solver_cls.short_name if solver_name in SOLVERS: warnings.warn(f"Solver '{solver_name}' is already registered.") else: SOLVERS[solver_name] = solver_cls
[docs] def get_available_solvers() -> dict[str, Type[SolverBase]]: """ Get a list of available solvers based on the plan. Returns ------- list A list of available solvers. """ return SOLVERS
[docs] def get_solver(solver_desc: Union[str, dict, SolverBase]): """ Return a solver instance based on a descriptive parameter. Parameters ---------- solver_desc : Union[str, dict, SolverBase] A string with the solver name, a dictionary with the solver configuration or a solver instance Returns ------- SolverBase A solver instance """ if isinstance(solver_desc, str): solver = SOLVERS[solver_desc]() elif isinstance(solver_desc, dict): raise NotImplementedError("Solver configuration from dictionary not implemented yet.") elif isinstance(solver_desc, SolverBase): solver = solver_desc else: raise ValueError(f"Invalid solver description: {solver_desc}") return solver