|
55 | 55 | OptimizationConfig, |
56 | 56 | PreferenceOptimizationConfig, |
57 | 57 | ) |
58 | | -from ax.core.parameter import ChoiceParameter, ParameterType |
| 58 | +from ax.core.parameter import ChoiceParameter, ParameterType, RangeParameter |
59 | 59 | from ax.core.parameter_constraint import ParameterConstraint |
60 | 60 | from ax.core.runner import Runner |
61 | 61 | from ax.exceptions.core import AxStorageWarning, UnsupportedError |
|
398 | 398 | ("ParameterConstraint", get_parameter_constraint), |
399 | 399 | ("ParameterConstraint", get_equality_parameter_constraint), |
400 | 400 | ("RangeParameter", get_range_parameter), |
| 401 | + ( |
| 402 | + "RangeParameter", |
| 403 | + partial( |
| 404 | + RangeParameter, |
| 405 | + name="x", |
| 406 | + parameter_type=ParameterType.FLOAT, |
| 407 | + lower=0.0, |
| 408 | + upper=1.0, |
| 409 | + step_size=0.1, |
| 410 | + ), |
| 411 | + ), |
401 | 412 | ("ScalarizedObjective", get_scalarized_objective), |
402 | 413 | ("ScalarizedOutcomeConstraint", get_scalarized_outcome_constraint), |
403 | 414 | ("OrchestratorOptions", get_default_orchestrator_options), |
@@ -1942,6 +1953,32 @@ def test_multi_objective_from_json_warning(self) -> None: |
1942 | 1953 | any("Found unexpected kwargs" in warning for warning in cm.output) |
1943 | 1954 | ) |
1944 | 1955 |
|
| 1956 | + def test_range_parameter_legacy_digits_blob_decodes(self) -> None: |
| 1957 | + # A legacy blob has "digits" but no "step_size" key. It must still |
| 1958 | + # decode (the constructor accepts digits for back-compat). |
| 1959 | + legacy_blob = { |
| 1960 | + "__type": "RangeParameter", |
| 1961 | + "name": "x", |
| 1962 | + "parameter_type": {"__type": "ParameterType", "name": "FLOAT"}, |
| 1963 | + "lower": 0.0, |
| 1964 | + "upper": 1.0, |
| 1965 | + "log_scale": False, |
| 1966 | + "logit_scale": False, |
| 1967 | + "digits": 2, |
| 1968 | + "is_fidelity": False, |
| 1969 | + "target_value": None, |
| 1970 | + } |
| 1971 | + decoded = object_from_json( |
| 1972 | + legacy_blob, |
| 1973 | + decoder_registry=CORE_DECODER_REGISTRY, |
| 1974 | + class_decoder_registry=CORE_CLASS_DECODER_REGISTRY, |
| 1975 | + ) |
| 1976 | + self.assertIsInstance(decoded, RangeParameter) |
| 1977 | + self.assertEqual(decoded.digits, 2) |
| 1978 | + self.assertIsNone(decoded.step_size) |
| 1979 | + # Rounding behavior from digits=2 is preserved. |
| 1980 | + self.assertEqual(decoded.cast(0.123), 0.12) |
| 1981 | + |
1945 | 1982 | def test_choice_parameter_bypass_cardinality_check_encode_failure(self) -> None: |
1946 | 1983 | choice_parameter = ChoiceParameter( |
1947 | 1984 | name="test_choice", |
|
0 commit comments