Source code for smt_optim.core.problem
import numpy as np
import smt.design_space as ds
# from smt.design_space import (
# DesignSpace,
# FloatVariable,
# IntegerVariable,
# OrdinalVariable,
# CategoricalVariable,
# )
[docs]
class Problem:
"""
Problem configuration
Attributes
----------
num_dim : int
Number of dimensions.
num_obj : int
Number of objectives.
num_cstr : int
Number of constraints.
num_fidelity : int
Number of fidelities.
design_space : np.ndarray
Problem design space.
costs : list
Fidelity level costs.
obj_configs : list
Objective configurations.
obj_funcs : list
Objective functions.
cstr_configs : list
Constraint configurations.
cstr_funcs : list
Constraint functions.
"""
def __init__(self, obj_configs: list, design_space: np.ndarray | ds.DesignSpace, cstr_configs: list = [], costs: list[float] | None = None) -> None:
# convert np.ndarray into ds.DesignSpace, and assumes all variable are continuous
if isinstance(design_space, np.ndarray):
float_vars = []
for idx in range(design_space.shape[0]):
float_vars.append(
ds.FloatVariable(design_space[idx, 0], design_space[idx, 1])
)
design_space = ds.DesignSpace(float_vars)
self.num_dim = design_space.n_dv
self.num_obj = 0
self.num_cstr = 0
self.num_fidelity = len(obj_configs[0].objective) if isinstance(obj_configs[0].objective, list) else 1
self.design_space = design_space
if costs is None:
if self.num_fidelity == 1:
costs = [1]
else:
raise Exception("Costs must be provided for multi-fidelity problems.")
self.costs = costs
self.obj_configs = []
self.obj_funcs = []
self.cstr_configs = []
self.cstr_funcs = []
for idx, config in enumerate(obj_configs):
self._validate_obj(config)
self.obj_configs.append(config)
self.obj_funcs.append(config.objective)
self.num_obj += 1
for idx, config in enumerate(cstr_configs):
self._validate_cstr(config)
self.cstr_configs.append(config)
self.cstr_funcs.append(config.constraint)
self.num_cstr += 1
def __repr__(self):
data = f"num_dim = {self.num_dim}\n"\
f"num_obj = {self.num_obj}\n"\
f"num_cstr = {self.num_cstr}\n"\
f"num_fidelity = {self.num_fidelity}\n"\
f"design_space = {self.design_space}\n"
return data
def _validate_obj(self, config):
pass
def _validate_cstr(self, config):
pass