Source code for smt_optim.utils.initial_design
import copy
import numpy as np
from smt.sampling_methods import LHS
from smt.applications import NestedLHS
import smt.design_space as ds
from smt.applications.mixed_integer import MixedIntegerSamplingMethod
from smt_optim.core.state import State
[docs]
def generate_initial_design(state: State, evaluator, config) -> None:
design_space = state.problem.design_space
# if no initial DoE is defined
if config.xt_init is None:
# mono-fidelity problem
if state.problem.num_fidelity == 1:
# mixed-variable problem
if isinstance(design_space, ds.DesignSpace):
# TODO: issue with seed parameter
# sampler = MixedIntegerSamplingMethod(LHS,
# design_space,
# criterion="ese",
# seed=config.seed)
sampler = LHS(xlimits=design_space.get_unfolded_num_bounds(),
criterion="ese",
seed=config.seed, )
# continuous problem
else:
sampler = LHS(xlimits=design_space,
criterion="ese",
seed=config.seed)
# multi-fidelity problem
# Note: NestedLHS uses criterion="ese"
else:
# mixed-variable problem
if isinstance(design_space, ds.DesignSpace):
sampler = NestedLHS(design_space=design_space,
nlevel=state.problem.num_fidelity,
seed=config.seed)
# continuous problem
else:
sampler = NestedLHS(xlimits=design_space,
nlevel=state.problem.num_fidelity,
seed=config.seed)
if config.nt_init is None:
nt_init = max(5, state.problem.num_dim+1)
else:
nt_init = config.nt_init
doe = sampler(nt_init)
# quick fix for the seed parameter issue
if state.problem.num_fidelity == 1 and isinstance(design_space, ds.DesignSpace):
doe, _ = design_space.fold_x(doe)
if state.problem.num_fidelity == 1:
doe = [doe]
infill = doe * state.problem.num_fidelity
else:
infill = doe
else:
# TODO: should evaluate validity of initial design space
infill = copy.deepcopy(config.xt_init)
evaluator.sample_func(infill, state)