Skip to content

AttributeError: 'Param_Discrete_Numeric' object has no attribute 'search_categories' #69

@dhristozov

Description

@dhristozov

Hi,

Thanks for the nice package.

I am encountering issues when trying to use Param_Discrete_Numeric.

If I understand the code correctly the idea is to use this as a continuous variable during optimisation and mapping the suggested evaluation values to the closest of the numerical categories (via the unit_demap method).

However, by the virtue of Param_Discrete_Numeric inheriting from Param_Discrete this seems to be broken and I get the following exception when trying to use Param_Discrete_Numeric.

params = [
    Param_Categorical("Category", ["Cat-1", "Cat-2", "Cat-3"]),
    Param_Discrete_Numeric("Temperature", list(range(25, 86, 5))),
]
X_space = ParamSpace(params)
target = [
    Target('Desired', aim='max'),
    Target('Undesired', aim='min')
]
campaign = Campaign(X_space, target, seed=42)
X0 = campaign.designer.initialize(4, 'LHS')
Z0 = pd.concat([X0, pd.Series([35.,56.,67.,23.], name="Desired"), pd.Series([60.,48.,27.,70.], name="Undesired")], axis=1)
campaign.add_data(Z0)
campaign.fit()
X_suggest, eval_suggest = campaign.optimizer.suggest(
    acquisition = ['NEHVI', ], m_batch=4
)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In[110], [line 15](vscode-notebook-cell:?execution_count=110&line=15)
     [13](vscode-notebook-cell:?execution_count=110&line=13) campaign.add_data(Z0)
     [14](vscode-notebook-cell:?execution_count=110&line=14) campaign.fit()
---> [15](vscode-notebook-cell:?execution_count=110&line=15) X_suggest, eval_suggest = campaign.optimizer.suggest(
     [16](vscode-notebook-cell:?execution_count=110&line=16)     acquisition = ['NEHVI', ], m_batch=4
     [17](vscode-notebook-cell:?execution_count=110&line=17) )

File [~/dev/obsidian/obsidian/optimizer/bayesian.py:711](~/dev/obsidian/obsidian/optimizer/bayesian.py:711), in BayesianOptimizer.suggest(self, m_batch, target, acquisition, optim_sequential, optim_samples, optim_restarts, objective, out_constraints, eq_constraints, ineq_constraints, nleq_constraints, task_index, fixed_var, X_pending, eval_pending)
    [708](~/dev/obsidian/obsidian/optimizer/bayesian.py:708)     raise TypeError('Each item in acquisition list must be either a string or a dictionary')
    [710](~/dev/obsidian/obsidian/optimizer/bayesian.py:710) # Compute static variable inputs
--> [711](~/dev/obsidian/obsidian/optimizer/bayesian.py:711) fixed_features_list = self._fixed_features(fixed_var)
    [713](~/dev/obsidian/obsidian/optimizer/bayesian.py:713) # Set up the sampler, for MC-based optimization of acquisition functions
    [714](~/dev/obsidian/obsidian/optimizer/bayesian.py:714) if not isinstance(model, ModelListGP):

File [~/dev/obsidian/obsidian/optimizer/base.py:114](~/dev/obsidian/obsidian/optimizer/base.py:114), in Optimizer._fixed_features(self, fixed_var)
    [112](~/dev/obsidian/obsidian/optimizer/base.py:112) for x in self.X_space.X_discrete:
    [113](~/dev/obsidian/obsidian/optimizer/base.py:113)     if x.name not in fixed_var.keys():  # Fixed_var should take precedent and lock out other combinations
--> [114](~/dev/obsidian/obsidian/optimizer/base.py:114)         df_i = pd.DataFrame({x.name: x.search_categories})
    [115](~/dev/obsidian/obsidian/optimizer/base.py:115)         df_list.append(df_i)
    [117](~/dev/obsidian/obsidian/optimizer/base.py:117) # Merge by cross

AttributeError: 'Param_Discrete_Numeric' object has no attribute 'search_categories'

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions