Skip to content

Commit 346dbee

Browse files
committed
Convert Discrete integer range to VaryingParameter
1 parent f883c7b commit 346dbee

File tree

2 files changed

+23
-3
lines changed

2 files changed

+23
-3
lines changed

optimas/generators/base.py

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
TrialParameter,
2121
TrialStatus,
2222
)
23-
from generator_standard.vocs import VOCS, ContinuousVariable
23+
from generator_standard.vocs import VOCS, ContinuousVariable, DiscreteVariable
2424
from generator_standard.generator import Generator as StandardGenerator
2525

2626
logger = get_logger(__name__)
@@ -114,7 +114,7 @@ def __init__(
114114
self._check_parameters(self._varying_parameters)
115115

116116
def _validate_vocs(self, vocs: VOCS) -> None:
117-
"""This generator should have atleast one variable and one objective"""
117+
"""Ensure the generator has at least one variable and one objective."""
118118
if not vocs.variables:
119119
raise ValueError("VOCS must define at least one variable.")
120120
if not vocs.objectives:
@@ -126,7 +126,7 @@ def _convert_vocs_variables_to_varying_parameters(
126126
"""Convert VOCS variables to optimas VaryingParameter objects."""
127127
varying_parameters = []
128128
for var_name, var_spec in self._vocs.variables.items():
129-
# Only handle ContinuousVariable for now
129+
# Handle ContinuousVariable
130130
if isinstance(var_spec, ContinuousVariable):
131131
vp = VaryingParameter(
132132
name=var_name,
@@ -135,6 +135,25 @@ def _convert_vocs_variables_to_varying_parameters(
135135
default_value=var_spec.default_value,
136136
)
137137
varying_parameters.append(vp)
138+
# Handle DiscreteVariable that is a range of integers
139+
# TODO: Suggest supporting IntegerVariables in vocs
140+
elif isinstance(var_spec, DiscreteVariable):
141+
values = list(var_spec.values)
142+
if len(values) > 1:
143+
# Check if values form a continuous integer range
144+
sorted_values = sorted(values)
145+
if all(
146+
isinstance(v, int) for v in values
147+
) and sorted_values == list(
148+
range(sorted_values[0], sorted_values[-1] + 1)
149+
):
150+
vp = VaryingParameter(
151+
name=var_name,
152+
lower_bound=sorted_values[0],
153+
upper_bound=sorted_values[-1],
154+
dtype=int,
155+
)
156+
varying_parameters.append(vp)
138157
return varying_parameters
139158

140159
def _convert_vocs_objectives_to_objectives(self) -> List[Objective]:

tests/test_ax_generators.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,7 @@ def test_ax_single_fidelity_int():
275275
trial_count = 0
276276
trials_to_fail = [2, 6]
277277

278+
# TODO: Suggest supporting IntegerVariables in vocs
278279
vocs = VOCS(
279280
variables={"x0": set(range(-50, 6)), "x1": [-5.0, 15.0]},
280281
objectives={"f": "MAXIMIZE"},

0 commit comments

Comments
 (0)