Source code for baybe.targets.transforms

"""Functions for bound transforms."""

import numpy as np
from numpy.typing import ArrayLike


[docs] def linear_transform( arr: ArrayLike, lower: float, upper: float, descending: bool ) -> np.ndarray: """Linearly map values in a specified interval ``[lower, upper]`` to ``[0, 1]``. Outside the specified interval, the function remains constant. That is, 0 or 1, depending on the side and selected mode. Args: arr: The values to be mapped. lower: The lower boundary of the linear mapping interval. upper: The upper boundary of the linear mapping interval. descending: If ``True``, the function values decrease from 1 to 0 in the specified interval. If ``False``, they increase from 0 to 1. Returns: A new array containing the transformed values. """ arr = np.asarray(arr) if descending: res = (upper - arr) / (upper - lower) res[arr > upper] = 0.0 res[arr < lower] = 1.0 else: res = (arr - lower) / (upper - lower) res[arr > upper] = 1.0 res[arr < lower] = 0.0 return res
[docs] def triangular_transform(arr: ArrayLike, lower: float, upper: float) -> np.ndarray: """Map values to the interval ``[0, 1]`` in a "triangular" fashion. The shape of the function is "triangular" in that is 0 outside a specified interval and linearly increases to 1 from both interval ends, reaching the value 1 at the center of the interval. Args: arr: The values to be mapped. lower: The lower end of the triangle interval. Below, the mapped values are 0. upper:The upper end of the triangle interval. Above, the mapped values are 0. Returns: A new array containing the transformed values. """ arr = np.asarray(arr) mid = lower + (upper - lower) / 2 res = (arr - lower) / (mid - lower) res[arr > mid] = (upper - arr[arr > mid]) / (upper - mid) res[arr > upper] = 0.0 res[arr < lower] = 0.0 return res
[docs] def bell_transform(arr: ArrayLike, lower: float, upper: float) -> np.ndarray: """Map values to the interval ``[0, 1]`` in a "Gaussian bell" fashion. The shape of the function is "Gaussian bell curve", specified through the boundary values of the sigma interval. Reaches the maximum value of 1 at the interval center. Args: arr: The values to be mapped. lower: The input value corresponding to the upper sigma interval boundary. upper: The input value corresponding to the lower sigma interval boundary. Returns: A new array containing the transformed values. """ arr = np.asarray(arr) mean = np.mean([lower, upper]) std = (upper - lower) / 2 res = np.exp(-((arr - mean) ** 2) / (2.0 * std**2)) return res