diff --git a/ax/analysis/healthcheck/search_space_analysis.py b/ax/analysis/healthcheck/search_space_analysis.py index 2b317f72eaa..329c9ae5b67 100644 --- a/ax/analysis/healthcheck/search_space_analysis.py +++ b/ax/analysis/healthcheck/search_space_analysis.py @@ -139,7 +139,11 @@ def search_space_boundary_proportions( if isinstance(parameter, RangeParameter): lower = parameter.lower upper = parameter.upper - elif isinstance(parameter, ChoiceParameter) and parameter.is_ordered: + elif ( + isinstance(parameter, ChoiceParameter) + and parameter.is_ordered + and all(isinstance(v, (int, float)) for v in parameter.values) + ): values = [ assert_is_instance(v, Union[int, float]) for v in parameter.values ] diff --git a/ax/analysis/healthcheck/tests/test_search_space_analysis.py b/ax/analysis/healthcheck/tests/test_search_space_analysis.py index a87ac4f76eb..c1571852c3f 100644 --- a/ax/analysis/healthcheck/tests/test_search_space_analysis.py +++ b/ax/analysis/healthcheck/tests/test_search_space_analysis.py @@ -178,3 +178,35 @@ def test_search_space_boundary_proportions(self) -> None: ) ) ) + + def test_search_space_boundary_proportions_string_ordered_choice(self) -> None: + """Test that ordered choice parameters with string values are skipped.""" + ss = SearchSpace( + parameters=[ + RangeParameter( + name="float_range", + parameter_type=ParameterType.FLOAT, + lower=1.0, + upper=6.0, + ), + ChoiceParameter( + name="string_ordered_choice", + parameter_type=ParameterType.STRING, + values=["option_a", "option_b", "option_c"], + is_ordered=True, + ), + ], + ) + + parameterizations: list[dict[str, None | bool | float | int | str]] = [ + {"float_range": 1.0, "string_ordered_choice": "option_a"}, + {"float_range": 3.0, "string_ordered_choice": "option_b"}, + ] + + # Should not raise -- string ordered choice should be skipped + df = search_space_boundary_proportions( + search_space=ss, parameterizations=parameterizations + ) + # Only float_range boundaries should be present (lower and upper) + self.assertEqual(len(df), 2) + self.assertTrue(all("float_range" in b for b in df["Boundary"].values))