diff --git a/ax/adapter/transforms/tests/test_winsorize_transform.py b/ax/adapter/transforms/tests/test_winsorize_transform.py index 7efa4269bd5..af4f29d3e35 100644 --- a/ax/adapter/transforms/tests/test_winsorize_transform.py +++ b/ax/adapter/transforms/tests/test_winsorize_transform.py @@ -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.", diff --git a/ax/adapter/transforms/winsorize.py b/ax/adapter/transforms/winsorize.py index 59d50b0f931..7625b0c81fe 100644 --- a/ax/adapter/transforms/winsorize.py +++ b/ax/adapter/transforms/winsorize.py @@ -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 = {} @@ -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]