Skip to content
Closed
Show file tree
Hide file tree
Changes from all 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
15 changes: 6 additions & 9 deletions ax/adapter/transforms/tests/test_winsorize_transform.py
Original file line number Diff line number Diff line change
Expand Up @@ -150,15 +150,12 @@ def test_Init(self) -> None:
"`Winsorize` transform requires non-empty data.",
):
Winsorize(search_space=None)
with self.assertRaisesRegex(
UserInputError,
"Transform config for `Winsorize` transform must be specified and "
"non-empty when using winsorization.",
):
Winsorize(
search_space=None,
experiment_data=self.experiment_data,
)
# Initialize with no opt config.
t = Winsorize(
search_space=None,
experiment_data=self.experiment_data,
)
self.assertEqual(t.cutoffs, {})
with self.assertRaisesRegex(
UserInputError,
"`derelativize_with_raw_status_quo` must be a boolean. Got 1234.",
Expand Down
14 changes: 6 additions & 8 deletions ax/adapter/transforms/winsorize.py
Original file line number Diff line number Diff line change
Expand Up @@ -103,11 +103,11 @@ def __init__(
)
optimization_config = adapter._optimization_config if adapter else None
if config is None and optimization_config is None:
raise UserInputError(
"Transform config for `Winsorize` transform must be specified and "
"non-empty when using winsorization, or an adapter containing an "
"optimization_config must be provided."
)
# We can't winsorize without an optimization config.
# The lack of an optimization config often points to a manual
# adapter creation, in which case we can just skip winsorization.
self.cutoffs = {}
return
if config is None:
config = {}

Expand Down Expand Up @@ -139,9 +139,7 @@ def _transform_observation_data(
for obsd in observation_data:
for idx, metric_signature in enumerate(obsd.metric_signatures):
if metric_signature not in self.cutoffs:
raise ValueError(
f"Cannot winsorize unknown metric {metric_signature}"
)
continue
# Clip on the winsorization bounds.
obsd.means[idx] = max(
obsd.means[idx], self.cutoffs[metric_signature][0]
Expand Down