Source code for smt_optim.core.problem
[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, cstr_configs: list = [], costs: list[float] | None = None) -> None:
self.num_dim = design_space.shape[0]
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