Skip to content
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions src/ConfigSpace/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -572,6 +572,15 @@ def check_configuration( # noqa: D103
vector: np.ndarray,
allow_inactive_with_values: bool = False,
) -> None:
"""Checks whether a given parameter vector is valid according to the conditionals and forbiddens.
Comment thread
thijssnelleman marked this conversation as resolved.
Outdated

Raises an Exception if the vector is not valid.

Args:
space: Configuration space
Comment thread
thijssnelleman marked this conversation as resolved.
Outdated
vector: Parameter vector
Comment thread
thijssnelleman marked this conversation as resolved.
Outdated
allow_inactive_with_values: If True, inactive parameters are allowed to have values in the vector.
Comment thread
thijssnelleman marked this conversation as resolved.
Outdated
"""
activated = np.isfinite(vector)

# Make sure the roots are all good
Expand Down
32 changes: 32 additions & 0 deletions test/test_configuration_space.py
Original file line number Diff line number Diff line change
Expand Up @@ -616,6 +616,38 @@ def test_check_configuration2():
configuration.check_valid_configuration()


def test_check_configuration3():
# Test that hyperparameters that follow the conditions and forbiddens will still be rejected if out parameter bounds
cs = ConfigurationSpace(
space=[
NormalIntegerHyperparameter("a", mu=50, sigma=10, lower=1, upper=10),
UniformIntegerHyperparameter("b", lower=1, upper=100),
NormalFloatHyperparameter("c", lower=0, upper=1, mu=0.25, sigma=0.12),
UniformIntegerHyperparameter("d", lower=0, upper=1),
BetaFloatHyperparameter("e", lower=0, upper=1, alpha=1, beta=1),
CategoricalHyperparameter("f", ["Yes", "No", "Maybe"]),
OrdinalHyperparameter("g", ["Low", "Medium", "High"]),
],
)
cs.add(
NotEqualsCondition(cs["b"], cs["a"], 10),
ForbiddenEqualsClause(cs["c"], 0),
ForbiddenEqualsClause(cs["d"], 1),
ForbiddenEqualsClause(cs["e"], 0),
ForbiddenEqualsClause(cs["e"], 1),
ForbiddenAndConjunction(
ForbiddenEqualsClause(cs["f"], "No"),
ForbiddenEqualsClause(cs["g"], "Low"),
),
)
sample = cs.sample_configuration()
assert sample.check_valid_configuration() is None # Base sample should pass

# Parameter A has no conditions; check if the configuration fails if a > 10
with pytest.raises(IllegalValueError):
sample["a"] = 101
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this actually trigger a call to check configuration or does this fail somewhere else?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That is actually a good point, this test fails elsewhere.



def test_check_forbidden_with_sampled_vector_configuration():
cs = ConfigurationSpace()
metric = CategoricalHyperparameter("metric", ["minkowski", "other"])
Expand Down
Loading