Experiment

In NEXTorch, We use Experiment objects to store the data and the setting of the optimization loop. We integrate most acquisition functions and GP models from the upstream BoTorch with Experiment objects. Experiment objects are the core of NEXTorch where data are preprocessed, GP models are trained, used for prediction, and the optima are located. There are several variants of the Experiment class depending on the application. At the higher level, users interact with the Experiment class, WeightedMOOExperiment class, and EHVIMOOExperiment for sequential single-objective optimization, MOO with the weighted sum method, and MOO with EHVI, respectively. Besides, two additional classes, COMSOLExperiment and COMSOLMOOExperiment are provided to perform automatic optimization by integrating the NEXTorch with COMSOL Multiphysics®.

Example

Experiment class

Initialize a Experiment object with input_data to specify the inputs of parameters and response, the range and name of them, and their conditions.

from nextorch import bo

X_names = ["param_1", "param_2", "param_3"]
X_ranges = [[1.0, 25.0], [1.0, 25.0], [1.0, 25.0]]
X_units = ["mm", "mm", "mm"]
X_real = np.array([[1.0, 1.0, 1.0], [5.0, 5.0, 5.0], [25.0, 25.0, 25.0]])
Y_real = np.array([[0.5], [0.2], [0.7]])

exp = bo.Experiment("Experiment")
exp.input_data(X_real=X_real, Y_real=Y_real)

Additionally, we can specify more conditions:

exp.input_data(X_real=X_real, Y_real=Y_real, X_ranges=X_ranges, X_names=X_names, standardized=True)

Note

X_real and Y_real are the required inputs for Experiment object.

Set the optimization conditions using set_optim_specs

def simple_1d(X):
    """
    1D function y = (6x-2)^2 * sin(12x-4)
    """

    try:
        X.shape[1]
    except:
        X = np.array(X)
    if len(X.shape)<2:
        X = np.array([X])

    y = np.array([],dtype=float)

    for i in range(X.shape[0]):
        ynew = (X[i]*6-2)**2*np.sin((X[i]*6-2)*2)
        y = np.append(y, ynew)
    y = y.reshape(X.shape)

return y

objective_func = simple_1d

exp.set_optim_specs(objective_func=objective_func)

Note

set_optim_specs by default maximizing the objective function. To minimize, set maximize to False.

exp.set_optim_specs(objective_func=objective_func, maximize=False)

WeightedMOOExperiment class

In WeightedMOOExperiment, an additional weights for different objectives needs to be specify in set_optim_specs.

weights_obj = np.linspace(0, 1, 21)

exp_weighted = bo.WeightedMOOExperiment("Weighted Experiment")
exp_weighted.input_data(X_real=X_real, Y_real=Y_real, X_ranges=X_ranges, X_names=X_names)
exp_weighted.set_optim_specs(objective_func=objective_func, maximize=True, weights=weights_obj)

EHVIMOOExperiment class

On the other hand, we can use an EHVIMOOExperiment object to perform optimization using expected hypervolume improvement as aquisition funciton. It requires all key components as Experiment. Additionally, ref_point is required for set_ref_point function.

ref_point = [10.0, 10.0]

exp_ehvi = bo.EHVIMOOExperiment("MOO Experiment")
exp_ehvi.input_data(X_real=X_real, Y_real=Y_real, X_ranges=X_ranges, X_names=X_names)
exp_ehvi.set_ref_point(ref_point)
exp_ehvi.set_optim_specs(objective_func=objective_func, maximize=True)

Note

ref_point defines a list of values that are slightly worse than the lower bound of objective values, where the lower bound is the minimum acceptable value of interest for each objective. It would be helpful if the user know the rough values using domain knowledge prior to optimization.

COMSOLExperiment class

The COMSOLExperiment and COMSOLMOOExperiment are designed for the integration with COMSOL Multiphysics®. It requires all key components as Experiment. Additionally, the X_names and X_units are required. Instead of specifying objective function, the optimized file name,the installed location of COMSOL Multiphysics®, the output location of the simulation, and the selected column in the output file are needed.

file_name = "comsol_example"
comsol_location =  "~/comsol54/multiphysics/bin/comsol"
output_file = "simulation_result.csv"

exp_comsol = bo.COMSOLExperiment("COMSOL Experiment")
exp_comsol.input_data(X_real=X_real, Y_real=Y_real, X_ranges=X_ranges, X_names=X_names, X_units=X_units)
exp_comsol.set_optim_specs(file_name, comsol_location, output_file, comsol_output_col=2, maximize=True)

Note

To use COMSOLExperiment and COMSOLMOOExperiment class, you need to have or purchase your own valid license for COMSOL Multiphysics®.

Run trials and get optimal

For all of discussed classes, run_trials_auto can automatically perform the optimization.

n_trials=30

exp.run_trials_auto(n_trials=n_trials)
exp_weighted.run_trials_auto(n_trials=n_trials, acq_func_name='EI')
exp_ehvi.run_trials_auto(n_trials=n_trials)
exp_comsol.run_trials_auto(n_trials=n_trials)

Note

The acquisition function used can be specified for run_trials_auto using acq_func_name.

Get the final optimal using get_optim for all classes

y_opt, X_opt, index_opt = exp.get_optim()

For more details, see nextorch.bo.

Experiment

Experiment class Base: BasicExperiment Experiment consists of a set of trial points For single objective optimization

WeightedMOOExperiment

MOOExperiment class Base: Database For multi-objective optimization (MOO) Currently, only supports two objectives Used for generating Pareto front

EHVIMOOExperiment

EHVIMOOExperiment class Base: Experiment For multi-objective optimization (MOO)

COMSOLExperiment

COMSOLExperiment class Base: Experiment Experiment consists of a set of trial points using COMSOL For single objective optimization

COMSOLMOOExperiment

COMSOLMOOExperiment class Base: EHVIMOOExperiment For multi-objective optimization (MOO) Used for generating Pareto front