Ax icon indicating copy to clipboard operation
Ax copied to clipboard

Fix core docs related to linear constraints

Open sgbaird opened this issue 1 month ago • 1 comments

The constraint:

"2.0 * x3 + x1 + x2 >= 1"

produces:

ValueError: A linear constraint should be the form a*x + b*y - c*z <= d, where a,b,c,d are float constants and x,y,z are parameters. There should be no space in each term around the operator * while there should be a single space around each operator +, -, <= and >=.

However, the "core" docs imply a format like 1.0 * a + 0.5 * b <= 1.0.

image

If I change my constraint to:

"2.0*x3 + x1 + x2 >= 1"

it seems to be fine.

I suggest updating # 1.0 * a + 0.5 * b <= 1.0 to # 1.0*a + 0.5*b <= 1.0 (see https://github.com/facebook/Ax/pull/2418).

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[4], [line 37](vscode-notebook-cell:?execution_count=4&line=37)
     [15](vscode-notebook-cell:?execution_count=4&line=15) gs = GenerationStrategy(
     [16](vscode-notebook-cell:?execution_count=4&line=16)     steps=[
     [17](vscode-notebook-cell:?execution_count=4&line=17)         GenerationStep(
   (...)
     [32](vscode-notebook-cell:?execution_count=4&line=32)     ]
     [33](vscode-notebook-cell:?execution_count=4&line=33) )
     [35](vscode-notebook-cell:?execution_count=4&line=35) ax_client = AxClient(generation_strategy=gs, random_seed=42) # CHANGE: add random seed for reproducibility
---> [37](vscode-notebook-cell:?execution_count=4&line=37) ax_client.create_experiment(
     [38](vscode-notebook-cell:?execution_count=4&line=38)     parameters=[
     [39](vscode-notebook-cell:?execution_count=4&line=39)         {"name": "x1", "type": "range", "bounds": [0.0, total]}, # CHANGE: update parameter
     [40](vscode-notebook-cell:?execution_count=4&line=40)         {"name": "x2", "type": "range", "bounds": [0.0, total]}, # CHANGE: update parameter
     [41](vscode-notebook-cell:?execution_count=4&line=41)         {"name": "x3", "type": "range", "bounds": [0.0, total]}, # CHANGE: add new parameter
     [42](vscode-notebook-cell:?execution_count=4&line=42)         {"name": "x5", "type": "range", "bounds": [0.1, 10.0]}, # CHANGE: add new parameter
     [43](vscode-notebook-cell:?execution_count=4&line=43)     ],
     [44](vscode-notebook-cell:?execution_count=4&line=44)     objectives={
     [45](vscode-notebook-cell:?execution_count=4&line=45)         obj1_name: ObjectiveProperties(minimize=True),
     [46](vscode-notebook-cell:?execution_count=4&line=46)     },
     [47](vscode-notebook-cell:?execution_count=4&line=47)     parameter_constraints=[
     [48](vscode-notebook-cell:?execution_count=4&line=48)         f"x1 + x2 + x3 <= {total}", # CHANGE: update composition constraint
     [49](vscode-notebook-cell:?execution_count=4&line=49)         "x1 >= x2", # CHANGE: update order constraint
     [50](vscode-notebook-cell:?execution_count=4&line=50)         "x2 >= x3", # CHANGE: add order constraint
     [51](vscode-notebook-cell:?execution_count=4&line=51)         "2.0 * x3 + x1 + x2 >= 1", # CHANGE: add order constraint based on `x3 >= x4` and `x4 = 1 - (x1 + x2 + x3)`
     [52](vscode-notebook-cell:?execution_count=4&line=52)     ],
     [53](vscode-notebook-cell:?execution_count=4&line=53) )
     [55](vscode-notebook-cell:?execution_count=4&line=55) batch_size = 2
     [57](vscode-notebook-cell:?execution_count=4&line=57) for _ in range(10): # CHANGE: decrease number of iterations

File c:\Users\sterg\miniforge3\envs\honegumi\Lib\site-packages\ax\service\ax_client.py:338, in AxClient.create_experiment(self, parameters, name, description, owners, objectives, parameter_constraints, outcome_constraints, status_quo, overwrite_existing_experiment, experiment_type, tracking_metric_names, choose_generation_strategy_kwargs, support_intermediate_data, immutable_search_space_and_opt_config, is_test, metric_definitions)
    [333](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/ax_client.py:333)     if len(objectives.keys()) > 1:
    [334](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/ax_client.py:334)         objective_kwargs[
    [335](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/ax_client.py:335)             "objective_thresholds"
    [336](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/ax_client.py:336)         ] = self.build_objective_thresholds(objectives)
--> [338](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/ax_client.py:338) experiment = self.make_experiment(
    [339](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/ax_client.py:339)     name=name,
    [340](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/ax_client.py:340)     description=description,
    [341](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/ax_client.py:341)     owners=owners,
    [342](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/ax_client.py:342)     parameters=parameters,
    [343](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/ax_client.py:343)     parameter_constraints=parameter_constraints,
    [344](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/ax_client.py:344)     outcome_constraints=outcome_constraints,
    [345](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/ax_client.py:345)     status_quo=status_quo,
    [346](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/ax_client.py:346)     experiment_type=experiment_type,
    [347](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/ax_client.py:347)     tracking_metric_names=tracking_metric_names,
    [348](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/ax_client.py:348)     metric_definitions=metric_definitions,
    [349](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/ax_client.py:349)     support_intermediate_data=support_intermediate_data,
    [350](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/ax_client.py:350)     immutable_search_space_and_opt_config=immutable_search_space_and_opt_config,
    [351](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/ax_client.py:351)     is_test=is_test,
    [352](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/ax_client.py:352)     **objective_kwargs,
    [353](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/ax_client.py:353) )
    [354](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/ax_client.py:354) self._set_runner(experiment=experiment)
    [355](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/ax_client.py:355) self._set_experiment(
    [356](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/ax_client.py:356)     experiment=experiment,
    [357](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/ax_client.py:357)     overwrite_existing_experiment=overwrite_existing_experiment,
    [358](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/ax_client.py:358) )

File c:\Users\sterg\miniforge3\envs\honegumi\Lib\site-packages\ax\service\utils\instantiation.py:866, in InstantiationBase.make_experiment(cls, parameters, name, description, owners, parameter_constraints, outcome_constraints, status_quo, experiment_type, tracking_metric_names, metric_definitions, objectives, objective_thresholds, support_intermediate_data, immutable_search_space_and_opt_config, is_test)
    [860](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:860) if owners is not None:
    [861](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:861)     properties["owners"] = owners
    [863](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:863) return Experiment(
    [864](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:864)     name=name,
    [865](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:865)     description=description,
--> [866](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:866)     search_space=cls.make_search_space(parameters, parameter_constraints),
    [867](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:867)     optimization_config=optimization_config,
    [868](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:868)     status_quo=status_quo_arm,
    [869](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:869)     experiment_type=experiment_type,
    [870](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:870)     tracking_metrics=tracking_metrics,
    [871](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:871)     default_data_type=default_data_type,
    [872](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:872)     properties=properties,
    [873](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:873)     is_test=is_test,
    [874](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:874) )

File c:\Users\sterg\miniforge3\envs\honegumi\Lib\site-packages\ax\service\utils\instantiation.py:696, in InstantiationBase.make_search_space(cls, parameters, parameter_constraints)
    [692](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:692) search_space_cls = HierarchicalSearchSpace if is_hss else SearchSpace
    [694](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:694) parameter_map = {p.name: p for p in typed_parameters}
--> [696](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:696) typed_parameter_constraints = [
    [697](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:697)     cls.constraint_from_str(c, parameter_map) for c in parameter_constraints
    [698](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:698) ]
    [700](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:700) if any(
    [701](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:701)     any(
    [702](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:702)         isinstance(parameter_map[parameter], ChoiceParameter)
   (...)
    [705](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:705)     for constraint in typed_parameter_constraints
    [706](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:706) ):
    [707](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:707)     raise UnsupportedError(
    [708](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:708)         "Constraints on ChoiceParameters are not allowed. Try absorbing "
    [709](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:709)         "this constraint into the associated range parameter's bounds."
    [710](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:710)     )

File c:\Users\sterg\miniforge3\envs\honegumi\Lib\site-packages\ax\service\utils\instantiation.py:697, in <listcomp>(.0)
    [692](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:692) search_space_cls = HierarchicalSearchSpace if is_hss else SearchSpace
    [694](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:694) parameter_map = {p.name: p for p in typed_parameters}
    [696](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:696) typed_parameter_constraints = [
--> [697](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:697)     cls.constraint_from_str(c, parameter_map) for c in parameter_constraints
    [698](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:698) ]
    [700](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:700) if any(
    [701](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:701)     any(
    [702](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:702)         isinstance(parameter_map[parameter], ChoiceParameter)
   (...)
    [705](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:705)     for constraint in typed_parameter_constraints
    [706](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:706) ):
    [707](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:707)     raise UnsupportedError(
    [708](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:708)         "Constraints on ChoiceParameters are not allowed. Try absorbing "
    [709](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:709)         "this constraint into the associated range parameter's bounds."
    [710](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:710)     )

File c:\Users\sterg\miniforge3\envs\honegumi\Lib\site-packages\ax\service\utils\instantiation.py:399, in InstantiationBase.constraint_from_str(representation, parameters)
    [397](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:397) bound = float(tokens[-1])
    [398](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:398) if any(token[0] == "*" or token[-1] == "*" for token in tokens):
--> [399](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:399)     raise ValueError(
    [400](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:400)         "A linear constraint should be the form a*x + b*y - c*z <= d"
    [401](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:401)         ", where a,b,c,d are float constants and x,y,z are parameters. "
    [402](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:402)         "There should be no space in each term around the operator * while "
    [403](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:403)         "there should be a single space around each operator +, -, <= and >=."
    [404](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:404)     )
    [405](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:405) parameter_weight = {}
    [406](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:406) comparison_multiplier = (
    [407](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:407)     1.0 if COMPARISON_OPS[tokens[-2]] is ComparisonOp.LEQ else -1.0
    [408](file:///C:/Users/sterg/miniforge3/envs/honegumi/Lib/site-packages/ax/service/utils/instantiation.py:408) )

ValueError: A linear constraint should be the form a*x + b*y - c*z <= d, where a,b,c,d are float constants and x,y,z are parameters. There should be no space in each term around the operator * while there should be a single space around each operator +, -, <= and >=.

sgbaird avatar May 01 '24 20:05 sgbaird