Source code for pumas.desirability.value_mapping

from typing import Any, Dict, Optional

from pumas.desirability.base_models import Desirability
from pumas.uncertainty_management.uncertainties.uncertainties_wrapper import UFloat


def value_mapping(x: str, mapping: Dict[str, float], shift: float = 0.0) -> float:
    # none of the mappings values should be lower than 0 or higher than 1
    if not all(0 <= value <= 1 for value in mapping.values()):
        raise ValueError("Mapping values should be between 0 and 1")

    result = mapping.get(x, float("nan"))

    # Apply the shift
    result = result * (1 - shift) + shift

    return result


[docs] class ValueMapping(Desirability): name = "value_mapping" """ Value Mapping desirability function implementation. This class implements a desirability function that maps string inputs to desirability values based on a predefined mapping. It provides a method to compute the desirability for string inputs. The value mapping function D(x) is defined as follows: .. math:: D(x) = \\begin{cases} mapping[x] * (1 - shift) + shift & \\text{if } x \\in mapping \\\\ NaN & \\text{if } x \\notin mapping \\end{cases} Where: - mapping[x] is the desirability value associated with the input string x - shift is an optional vertical shift applied to the result Parameters: params (Optional[Dict[str, Any]]): Initial parameters for the value mapping function. Attributes: mapping (Dict[str, float]): A dictionary mapping string inputs to desirability values. shift (float): Vertical shift of the function, range [0.0, 1.0], default 0.0. Raises: ValueError: If any of the mapping values are not between 0 and 1. InvalidParameterTypeError: If the input is not a string. ParameterValueNotSet: If any required parameter is not set. Usage Example: >>> from pumas.desirability import desirability_catalogue >>> desirability_class = desirability_catalogue.get("value_mapping") >>> mapping = {"low": 0.2, "medium": 0.5, "high": 0.8} >>> params={"mapping": mapping, "shift": 0.0} >>> desirability = desirability_class(params=params) >>> desirability.compute_string(x="medium") 0.5 >>> result = desirability(x="medium") # Same as compute_string >>> print(f"{result:.2f}") 0.5 """ # noqa: E501 def __init__(self, params: Optional[Dict[str, Any]] = None): super().__init__() self._set_parameter_definitions( { "mapping": {"type": "iterable", "default": None}, "shift": {"type": "float", "min": 0.0, "max": 1.0, "default": 0.0}, } ) self._validate_and_set_parameters(params) def compute_string(self, x: str) -> float: """ Compute the value mapping desirability for a string input. Args: x (float): The input value. Returns: float: The computed desirability value. Raises: InvalidParameterTypeError: If the input is not a float. ParameterValueNotSet: If any required parameter is not set. """ self._validate_compute_input(x, str) self._check_parameters_values_none() parameters = self.get_parameters_values() return value_mapping(x=x, **parameters) def compute_numeric(self, x: float) -> float: raise NotImplementedError def compute_ufloat(self, x: UFloat) -> UFloat: raise NotImplementedError __call__ = compute_string