Source code for baybe.constraints.utils

"""Constraint utilities."""

import numpy as np
import pandas as pd

from baybe.parameters.utils import is_inactive
from baybe.searchspace import SubspaceContinuous


[docs] def is_cardinality_fulfilled( df: pd.DataFrame, subspace_continuous: SubspaceContinuous, *, check_minimum: bool = True, check_maximum: bool = True, ) -> bool: """Validate cardinality constraints in a dataframe of parameter configurations. Args: df: The dataframe to be checked. subspace_continuous: The subspace spanned by the considered parameters. check_minimum: If ``True``, minimum cardinality constraints are validated. check_maximum: If ``True``, maximum cardinality constraints are validated. Returns: ``True`` if all cardinality constraints are fulfilled, ``False`` otherwise. """ for c in subspace_continuous.constraints_cardinality: # Get the activity thresholds for all parameters cols = df[c.parameters] thresholds = { p.name: c.get_absolute_thresholds(p.bounds) for p in subspace_continuous.get_parameters_by_name(c.parameters) } lower_thresholds = [thresholds[p].lower for p in cols.columns] upper_thresholds = [thresholds[p].upper for p in cols.columns] # Count the number of active values per dataframe row inactives = is_inactive(cols, lower_thresholds, upper_thresholds) n_zeros = inactives.sum(axis=1) n_active = len(c.parameters) - n_zeros # Check if cardinality is violated if check_minimum and np.any(n_active < c.min_cardinality): return False if check_maximum and np.any(n_active > c.max_cardinality): return False return True