Skip to content

Commit

Permalink
Consolidate constraint filtering into a utility
Browse files Browse the repository at this point in the history
  • Loading branch information
Scienfitz committed Mar 11, 2024
1 parent 83c3818 commit ba3882d
Showing 1 changed file with 26 additions and 18 deletions.
44 changes: 26 additions & 18 deletions baybe/searchspace/discrete.py
Original file line number Diff line number Diff line change
Expand Up @@ -197,24 +197,14 @@ def from_product(
empty_encoding: bool = False,
) -> SubspaceDiscrete:
"""See :class:`baybe.searchspace.core.SearchSpace`."""
# Store the input
if constraints is None:
constraints = []
else:
# Reorder the constraints according to their execution order
constraints = sorted(
constraints,
key=lambda x: DISCRETE_CONSTRAINTS_FILTERING_ORDER.index(x.__class__),
)
# Set defaults
constraints = constraints or []

# Create a dataframe representing the experimental search space
exp_rep = parameter_cartesian_prod_to_df(parameters)

# Remove entries that violate parameter constraints:
for constraint in (c for c in constraints if c.eval_during_creation):
idxs = constraint.get_invalid(exp_rep)
exp_rep.drop(index=idxs, inplace=True)
exp_rep.reset_index(inplace=True, drop=True)
# Remove entries that violate parameter constraints
_apply_constraint_filter(exp_rep, constraints)

return SubspaceDiscrete(
parameters=parameters,
Expand Down Expand Up @@ -463,10 +453,7 @@ def drop_invalid(
exp_rep = pd.merge(exp_rep, product_space, how="cross")

# Remove entries that violate parameter constraints:
for constraint in (c for c in constraints if c.eval_during_creation):
idxs = constraint.get_invalid(exp_rep)
exp_rep.drop(index=idxs, inplace=True)
exp_rep.reset_index(inplace=True, drop=True)
_apply_constraint_filter(exp_rep, constraints)

return cls(
parameters=simplex_parameters + product_parameters,
Expand Down Expand Up @@ -587,6 +574,27 @@ def transform(
return comp_rep


def _apply_constraint_filter(df: pd.DataFrame, constraints: List[DiscreteConstraint]):
"""Remove discrete search space entries inplace based on constraints.
Args:
df: The data in experimental representation to be modified inplace.
constraints: List of discrete constraints.
"""
# Reorder the constraints according to their execution order
constraints = sorted(
constraints,
key=lambda x: DISCRETE_CONSTRAINTS_FILTERING_ORDER.index(x.__class__),
)

# Remove entries that violate parameter constraints:
for constraint in (c for c in constraints if c.eval_during_creation):
idxs = constraint.get_invalid(df)
df.drop(index=idxs, inplace=True)
df.reset_index(inplace=True, drop=True)


def parameter_cartesian_prod_to_df(
parameters: Iterable[Parameter],
) -> pd.DataFrame:
Expand Down

0 comments on commit ba3882d

Please sign in to comment.