Source code for gemseo_benchmark.algorithms.algorithm_configuration

# Copyright 2021 IRT Saint Exupéry, https://www.irt-saintexupery.com
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License version 3 as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
# Contributors:
#    INITIAL AUTHORS - initial API and implementation and/or initial
#                           documentation
#        :author: Benoit Pauwels
#    OTHER AUTHORS   - MACROSCOPIC CHANGES
"""Configuration of an algorithm defined by the values of its options.

An algorithm depends on the values of its options. A value set defines a configuration
of the algorithm.
"""
from __future__ import annotations

from typing import Any

from gemseo.utils.string_tools import pretty_repr


[docs]class AlgorithmConfiguration: """The configuration of an algorithm.""" __ALGORITHM_NAME = "algorithm_name" __ALGORITHM_OPTIONS = "algorithm_options" __CONFIGURATION_NAME = "configuration_name" def __init__( self, algorithm_name: str, configuration_name: str | None = None, **algorithm_options: Any, ) -> None: """ Args: algorithm_name: The name of the algorithm. configuration_name: The name of the configuration of the algorithm. If ``None``, a name will be generated based on the algorithm name and its options, based on the pattern ``"algorithm_name[option_name=option_value, ...]"``. **algorithm_options: The options of the algorithm. """ # noqa: D205, D212, D415 self.__algorithm_name = algorithm_name self.__algorithm_options = algorithm_options self.__configuration_name = configuration_name or self.__get_configuration_name( algorithm_name, **algorithm_options ) @staticmethod def __get_configuration_name(algorithm_name: str, **algorithm_options: Any) -> str: """Define a name for the configuration based on the algorithm name and options. Args: algorithm_name: The name of the algorithm. **algorithm_options: The options of the algorithm. Returns: The name of the algorithm configuration. """ if not algorithm_options: return algorithm_name return f"{algorithm_name}_{pretty_repr(algorithm_options)}" @property def name(self) -> str: """The name of the algorithm configuration.""" return self.__configuration_name @property def algorithm_name(self) -> str: """The name of the algorithm.""" return self.__algorithm_name @property def algorithm_options(self) -> dict[str, Any]: """The options of the algorithm.""" return self.__algorithm_options
[docs] def to_dict(self) -> dict[str, str | dict[str, Any]]: """Return the algorithm configuration as a dictionary.""" return { self.__CONFIGURATION_NAME: self.__configuration_name, self.__ALGORITHM_NAME: self.__algorithm_name, self.__ALGORITHM_OPTIONS: self.__algorithm_options, }
[docs] @classmethod def from_dict( cls, algorithm_configuration: dict[str, str | dict[str, Any]] ) -> AlgorithmConfiguration: """Load an algorithm configuration from a dictionary. Args: algorithm_configuration: The algorithm configuration. Returns: The algorithm configuration. """ return AlgorithmConfiguration( algorithm_configuration[cls.__ALGORITHM_NAME], algorithm_configuration[cls.__CONFIGURATION_NAME], **algorithm_configuration[cls.__ALGORITHM_OPTIONS], )