Design of Experiment: perovskite thin film optimization PLQY and FWHM

This notebook is made to use optimPV for experimental design. Here, we show how to load some data from a presampling, and how to use optimPV to suggest the next set of experiment using Bayesian optimization.
The goal here is to do multi-objective optimization (MO) to maximize the photoluminescence quantum yield (PLQY) and minimize the full width at half maximum (FWHM) of a perovskite thin film.

Note: The data used here is real data generated in the i-MEET and HI-ERN labs at the university of Erlangen-Nuremberg (FAU) by Frederik Schmitt. The data is not published yet, and is only used here for demonstration purposes. For more information, please contact us.

[1]:
# Import necessary libraries
import warnings, os, sys, shutil
# remove warnings from the output
os.environ["PYTHONWARNINGS"] = "ignore"
warnings.filterwarnings(action='ignore', category=FutureWarning)
warnings.filterwarnings(action='ignore', category=UserWarning)
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from numpy.random import default_rng
import torch, copy, uuid
import pySIMsalabim as sim
from pySIMsalabim.experiments.JV_steady_state import *
import ax, logging
from ax.utils.notebook.plotting import init_notebook_plotting, render
init_notebook_plotting() # for Jupyter notebooks

try:
    from optimpv import *
    from optimpv.axBOtorch.axUtils import *
except Exception as e:
    sys.path.append('../') # add the path to the optimpv module
    from optimpv import *
    from optimpv.axBOtorch.axUtils import *
[INFO 08-13 17:17:19] ax.utils.notebook.plotting: Injecting Plotly library into cell. Do not overwrite or delete cell.
[INFO 08-13 17:17:19] ax.utils.notebook.plotting: Please see
    (https://ax.dev/tutorials/visualizations.html#Fix-for-plots-that-are-not-rendering)
    if visualizations are not rendering.

Get the data

[2]:
# Define the path to the data
data_dir =os.path.join(os.path.abspath('../'),'Data','pero_MOO_opti') # path to the data directory

# Load the data
df = pd.read_csv(os.path.join(data_dir,'Pero_PLQY_FWHM.csv'),sep=r',') # load the data

stepsize_fraction = 0.05
stepsize_spin_speed = 100

# Display some information about the data
print(df.describe())

        iteration   batch_number  Cs_fraction  Fa_fraction  Ma_fraction  \
count  128.000000     128.000000   128.000000   128.000000   128.000000
mean     3.500000       7.500000     0.209375     0.533984     0.256641
std      2.300291       4.627885     0.278052     0.361914     0.277742
min      0.000000       0.000000     0.000000     0.000000     0.000000
25%      1.750000       3.750000     0.000000     0.200000     0.050000
50%      3.500000       7.500000     0.050000     0.500000     0.100000
75%      5.250000      11.250000     0.400000     0.950000     0.462500
max      7.000000      15.000000     1.000000     1.000000     1.000000

       Spin_duration_Antisolvent  Spin_duration_High_Speed   Spin_speed  \
count                 128.000000                128.000000   128.000000
mean                   14.617188                 40.531250  2914.843750
std                     7.183885                 14.651295  1015.400301
min                     5.000000                 15.000000  1000.000000
25%                    10.000000                 26.500000  2400.000000
50%                    12.000000                 43.000000  2700.000000
75%                    20.000000                 55.000000  3400.000000
max                    30.000000                 60.000000  5000.000000

             FWHM        PLQY       merit
count  128.000000  128.000000  128.000000
mean    98.012656    7.975000    0.549372
std     82.719007   10.030822    0.148835
min     45.740000    0.000000    0.219360
25%     49.255000    0.000000    0.471784
50%     53.950000    5.480000    0.528186
75%    101.587500   11.952500    0.575939
max    335.900000   40.920000    0.915136

Define the parameters for the simulation

[3]:
params = [] # list of parameters to be optimized

Cs_fraction = FitParam(name = 'Cs_fraction', value = 0, bounds = [0,1], value_type = 'int', display_name='Cs fraction', unit='', axis_type = 'linear',stepsize=stepsize_fraction)
params.append(Cs_fraction)

Fa_fraction = FitParam(name = 'Fa_fraction', value = 0, bounds = [0,1], value_type = 'int', display_name='Fa fraction', unit='', axis_type = 'linear',stepsize=stepsize_fraction)
params.append(Fa_fraction)

Spin_duration_Antisolvent = FitParam(name = 'Spin_duration_Antisolvent', value = 10, bounds = [5,30], value_type = 'int', display_name='Spin duration Antisolvent', unit='s', axis_type = 'linear')
params.append(Spin_duration_Antisolvent)

Spin_duration_High_Speed = FitParam(name = 'Spin_duration_High_Speed', value = 20, bounds = [15,60], value_type = 'int', display_name='Spin duration High Speed', unit='s', axis_type = 'linear')
params.append(Spin_duration_High_Speed)

Spin_speed = FitParam(name = 'Spin_speed', value = 1000, bounds = [1000,5000], value_type = 'int', display_name='Spin speed', unit='rpm', axis_type = 'linear',stepsize=stepsize_spin_speed)
params.append(Spin_speed)

Run the optimization

[4]:
# Define the Agent and the target metric/loss function
from optimpv.general.SuggestOnlyAgent import SuggestOnlyAgent
threshold = [0.5, 50] # thresholds for the metrics
suggest = SuggestOnlyAgent(params,exp_format=['PLQY', 'FWHM'],minimize=[False,True],name=None,threshold=threshold)

[5]:
from optimpv.axBOtorch.axBOtorchOptimizer import axBOtorchOptimizer
from botorch.acquisition.logei import qLogNoisyExpectedImprovement
from ax.adapter.transforms.standardize_y import StandardizeY
from ax.adapter.transforms.unit_x import UnitX
from ax.adapter.transforms.remove_fixed import RemoveFixed
from ax.adapter.transforms.log import Log
from ax.generators.torch.botorch_modular.utils import ModelConfig
from ax.generators.torch.botorch_modular.surrogate import SurrogateSpec
from gpytorch.kernels import MaternKernel
from gpytorch.kernels import ScaleKernel
from botorch.models import SingleTaskGP
from botorch.models.map_saas import AdditiveMapSaasSingleTaskGP
from botorch.models.fully_bayesian import SaasFullyBayesianSingleTaskGP
model_gen_kwargs_list = None
parameter_constraints =[f'{stepsize_fraction}*Cs_fraction + {stepsize_fraction}*Fa_fraction <= 1']

model_kwargs_list = [{"torch_device":torch.device("cuda" if torch.cuda.is_available() else "cpu"),'botorch_acqf_class':qLogNoisyExpectedImprovement,'transforms':[RemoveFixed, Log, UnitX, StandardizeY],'surrogate_spec':SurrogateSpec(model_configs=[ModelConfig(botorch_model_class=SaasFullyBayesianSingleTaskGP,)])}]
# model_kwargs_list =None

# Define the optimizer
optimizer = axBOtorchOptimizer(params = params, agents = suggest, models = ['BOTORCH_MODULAR'],n_batches = [1], batch_size = [6], ax_client = None,  max_parallelism = -1, model_kwargs_list = model_kwargs_list, name = 'ax_opti',suggest_only = True,existing_data=df,verbose_logging=True,parameter_constraints=parameter_constraints,model_gen_kwargs_list=model_gen_kwargs_list)
[6]:
optimizer.optimize() # run the optimization with ax
[INFO 08-13 17:17:20] ax.api.client: Trial 0 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 0 with parameters {'Cs_fraction': 2, 'Fa_fraction': 8, 'Spin_duration_Antisolvent': 17, 'Spin_duration_High_Speed': 56, 'Spin_speed': 10} and raw data {'PLQY': np.float64(1.02), 'FWHM': np.float64(52.38)}
[INFO 08-13 17:17:20] ax.api.client: Trial 1 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 1 with parameters {'Cs_fraction': 5, 'Fa_fraction': 11, 'Spin_duration_Antisolvent': 24, 'Spin_duration_High_Speed': 54, 'Spin_speed': 39} and raw data {'PLQY': np.float64(0.37), 'FWHM': np.float64(49.11)}
[INFO 08-13 17:17:20] ax.api.client: Trial 2 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 2 with parameters {'Cs_fraction': 13, 'Fa_fraction': 2, 'Spin_duration_Antisolvent': 26, 'Spin_duration_High_Speed': 27, 'Spin_speed': 22} and raw data {'PLQY': np.float64(1.3), 'FWHM': np.float64(47.44)}
[INFO 08-13 17:17:20] ax.api.client: Trial 3 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 3 with parameters {'Cs_fraction': 4, 'Fa_fraction': 8, 'Spin_duration_Antisolvent': 27, 'Spin_duration_High_Speed': 25, 'Spin_speed': 43} and raw data {'PLQY': np.float64(0.6), 'FWHM': np.float64(53.54)}
[INFO 08-13 17:17:20] ax.api.client: Trial 4 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 4 with parameters {'Cs_fraction': 17, 'Fa_fraction': 0, 'Spin_duration_Antisolvent': 30, 'Spin_duration_High_Speed': 54, 'Spin_speed': 34} and raw data {'PLQY': np.float64(0.0), 'FWHM': np.float64(194.23)}
[INFO 08-13 17:17:20] ax.api.client: Trial 5 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 5 with parameters {'Cs_fraction': 9, 'Fa_fraction': 1, 'Spin_duration_Antisolvent': 15, 'Spin_duration_High_Speed': 57, 'Spin_speed': 49} and raw data {'PLQY': np.float64(0.2), 'FWHM': np.float64(81.66)}
[INFO 08-13 17:17:20] ax.api.client: Trial 6 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 6 with parameters {'Cs_fraction': 9, 'Fa_fraction': 4, 'Spin_duration_Antisolvent': 7, 'Spin_duration_High_Speed': 57, 'Spin_speed': 41} and raw data {'PLQY': np.float64(0.75), 'FWHM': np.float64(48.49)}
[INFO 08-13 17:17:20] ax.api.client: Trial 7 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 7 with parameters {'Cs_fraction': 0, 'Fa_fraction': 6, 'Spin_duration_Antisolvent': 15, 'Spin_duration_High_Speed': 20, 'Spin_speed': 31} and raw data {'PLQY': np.float64(12.81), 'FWHM': np.float64(48.74)}
[INFO 08-13 17:17:20] ax.api.client: Trial 8 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 8 with parameters {'Cs_fraction': 4, 'Fa_fraction': 2, 'Spin_duration_Antisolvent': 28, 'Spin_duration_High_Speed': 39, 'Spin_speed': 24} and raw data {'PLQY': np.float64(0.32), 'FWHM': np.float64(58.35)}
[INFO 08-13 17:17:20] ax.api.client: Trial 9 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 9 with parameters {'Cs_fraction': 10, 'Fa_fraction': 1, 'Spin_duration_Antisolvent': 25, 'Spin_duration_High_Speed': 21, 'Spin_speed': 43} and raw data {'PLQY': np.float64(0.24), 'FWHM': np.float64(60.18)}
[INFO 08-13 17:17:20] ax.api.client: Trial 10 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 10 with parameters {'Cs_fraction': 10, 'Fa_fraction': 10, 'Spin_duration_Antisolvent': 27, 'Spin_duration_High_Speed': 46, 'Spin_speed': 18} and raw data {'PLQY': np.float64(0.68), 'FWHM': np.float64(45.74)}
[INFO 08-13 17:17:20] ax.api.client: Trial 11 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 11 with parameters {'Cs_fraction': 5, 'Fa_fraction': 9, 'Spin_duration_Antisolvent': 27, 'Spin_duration_High_Speed': 53, 'Spin_speed': 14} and raw data {'PLQY': np.float64(0.23), 'FWHM': np.float64(52.21)}
[INFO 08-13 17:17:20] ax.api.client: Trial 12 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 12 with parameters {'Cs_fraction': 2, 'Fa_fraction': 10, 'Spin_duration_Antisolvent': 15, 'Spin_duration_High_Speed': 46, 'Spin_speed': 40} and raw data {'PLQY': np.float64(1.15), 'FWHM': np.float64(52.67)}
[INFO 08-13 17:17:20] ax.api.client: Trial 13 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 13 with parameters {'Cs_fraction': 2, 'Fa_fraction': 5, 'Spin_duration_Antisolvent': 10, 'Spin_duration_High_Speed': 38, 'Spin_speed': 34} and raw data {'PLQY': np.float64(0.75), 'FWHM': np.float64(55.4)}
[INFO 08-13 17:17:20] ax.api.client: Trial 14 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 14 with parameters {'Cs_fraction': 5, 'Fa_fraction': 10, 'Spin_duration_Antisolvent': 30, 'Spin_duration_High_Speed': 42, 'Spin_speed': 25} and raw data {'PLQY': np.float64(0.2), 'FWHM': np.float64(55.11)}
[INFO 08-13 17:17:20] ax.api.client: Trial 15 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 15 with parameters {'Cs_fraction': 5, 'Fa_fraction': 4, 'Spin_duration_Antisolvent': 18, 'Spin_duration_High_Speed': 45, 'Spin_speed': 44} and raw data {'PLQY': np.float64(0.25), 'FWHM': np.float64(61.16)}
[INFO 08-13 17:17:20] ax.api.client: Trial 16 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 16 with parameters {'Cs_fraction': 0, 'Fa_fraction': 20, 'Spin_duration_Antisolvent': 8, 'Spin_duration_High_Speed': 55, 'Spin_speed': 26} and raw data {'PLQY': np.float64(14.13), 'FWHM': np.float64(50.45)}
[INFO 08-13 17:17:20] ax.api.client: Trial 17 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 17 with parameters {'Cs_fraction': 0, 'Fa_fraction': 0, 'Spin_duration_Antisolvent': 21, 'Spin_duration_High_Speed': 29, 'Spin_speed': 27} and raw data {'PLQY': np.float64(6.29), 'FWHM': np.float64(47.65)}
[INFO 08-13 17:17:20] ax.api.client: Trial 18 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 18 with parameters {'Cs_fraction': 2, 'Fa_fraction': 17, 'Spin_duration_Antisolvent': 5, 'Spin_duration_High_Speed': 18, 'Spin_speed': 47} and raw data {'PLQY': np.float64(7.04), 'FWHM': np.float64(54.2)}
[INFO 08-13 17:17:20] ax.api.client: Trial 19 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 19 with parameters {'Cs_fraction': 1, 'Fa_fraction': 18, 'Spin_duration_Antisolvent': 21, 'Spin_duration_High_Speed': 31, 'Spin_speed': 27} and raw data {'PLQY': np.float64(11.44), 'FWHM': np.float64(47.42)}
[INFO 08-13 17:17:20] ax.api.client: Trial 20 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 20 with parameters {'Cs_fraction': 0, 'Fa_fraction': 0, 'Spin_duration_Antisolvent': 21, 'Spin_duration_High_Speed': 33, 'Spin_speed': 20} and raw data {'PLQY': np.float64(7.01), 'FWHM': np.float64(47.37)}
[INFO 08-13 17:17:20] ax.api.client: Trial 21 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 21 with parameters {'Cs_fraction': 0, 'Fa_fraction': 15, 'Spin_duration_Antisolvent': 7, 'Spin_duration_High_Speed': 34, 'Spin_speed': 50} and raw data {'PLQY': np.float64(8.72), 'FWHM': np.float64(47.76)}
[INFO 08-13 17:17:20] ax.api.client: Trial 22 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 22 with parameters {'Cs_fraction': 0, 'Fa_fraction': 18, 'Spin_duration_Antisolvent': 7, 'Spin_duration_High_Speed': 31, 'Spin_speed': 14} and raw data {'PLQY': np.float64(9.72), 'FWHM': np.float64(47.65)}
[INFO 08-13 17:17:20] ax.api.client: Trial 23 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 23 with parameters {'Cs_fraction': 0, 'Fa_fraction': 20, 'Spin_duration_Antisolvent': 18, 'Spin_duration_High_Speed': 34, 'Spin_speed': 48} and raw data {'PLQY': np.float64(5.96), 'FWHM': np.float64(55.05)}
[INFO 08-13 17:17:20] ax.api.client: Trial 24 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 24 with parameters {'Cs_fraction': 0, 'Fa_fraction': 6, 'Spin_duration_Antisolvent': 15, 'Spin_duration_High_Speed': 19, 'Spin_speed': 31} and raw data {'PLQY': np.float64(3.0), 'FWHM': np.float64(48.9)}
[INFO 08-13 17:17:20] ax.api.client: Trial 25 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 25 with parameters {'Cs_fraction': 0, 'Fa_fraction': 6, 'Spin_duration_Antisolvent': 15, 'Spin_duration_High_Speed': 21, 'Spin_speed': 31} and raw data {'PLQY': np.float64(1.73), 'FWHM': np.float64(49.29)}
[INFO 08-13 17:17:20] ax.api.client: Trial 26 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 26 with parameters {'Cs_fraction': 0, 'Fa_fraction': 6, 'Spin_duration_Antisolvent': 15, 'Spin_duration_High_Speed': 20, 'Spin_speed': 30} and raw data {'PLQY': np.float64(10.31), 'FWHM': np.float64(48.92)}
[INFO 08-13 17:17:20] ax.api.client: Trial 27 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 27 with parameters {'Cs_fraction': 0, 'Fa_fraction': 6, 'Spin_duration_Antisolvent': 15, 'Spin_duration_High_Speed': 20, 'Spin_speed': 32} and raw data {'PLQY': np.float64(15.65), 'FWHM': np.float64(49.61)}
[INFO 08-13 17:17:20] ax.api.client: Trial 28 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 28 with parameters {'Cs_fraction': 0, 'Fa_fraction': 6, 'Spin_duration_Antisolvent': 14, 'Spin_duration_High_Speed': 20, 'Spin_speed': 31} and raw data {'PLQY': np.float64(9.79), 'FWHM': np.float64(48.79)}
[INFO 08-13 17:17:20] ax.api.client: Trial 29 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 29 with parameters {'Cs_fraction': 0, 'Fa_fraction': 6, 'Spin_duration_Antisolvent': 16, 'Spin_duration_High_Speed': 20, 'Spin_speed': 31} and raw data {'PLQY': np.float64(11.17), 'FWHM': np.float64(48.66)}
[INFO 08-13 17:17:20] ax.api.client: Trial 30 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 30 with parameters {'Cs_fraction': 0, 'Fa_fraction': 6, 'Spin_duration_Antisolvent': 15, 'Spin_duration_High_Speed': 22, 'Spin_speed': 31} and raw data {'PLQY': np.float64(6.65), 'FWHM': np.float64(49.87)}
[INFO 08-13 17:17:20] ax.api.client: Trial 31 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 31 with parameters {'Cs_fraction': 0, 'Fa_fraction': 6, 'Spin_duration_Antisolvent': 15, 'Spin_duration_High_Speed': 18, 'Spin_speed': 31} and raw data {'PLQY': np.float64(10.6), 'FWHM': np.float64(49.4)}
[INFO 08-13 17:17:20] ax.api.client: Trial 32 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 32 with parameters {'Cs_fraction': 18, 'Fa_fraction': 1, 'Spin_duration_Antisolvent': 10, 'Spin_duration_High_Speed': 44, 'Spin_speed': 11} and raw data {'PLQY': np.float64(0.0), 'FWHM': np.float64(308.45)}
[INFO 08-13 17:17:20] ax.api.client: Trial 33 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 33 with parameters {'Cs_fraction': 15, 'Fa_fraction': 5, 'Spin_duration_Antisolvent': 14, 'Spin_duration_High_Speed': 40, 'Spin_speed': 14} and raw data {'PLQY': np.float64(0.0), 'FWHM': np.float64(152.2)}
[INFO 08-13 17:17:20] ax.api.client: Trial 34 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 34 with parameters {'Cs_fraction': 18, 'Fa_fraction': 2, 'Spin_duration_Antisolvent': 12, 'Spin_duration_High_Speed': 16, 'Spin_speed': 42} and raw data {'PLQY': np.float64(0.0), 'FWHM': np.float64(251.45)}
[INFO 08-13 17:17:20] ax.api.client: Trial 35 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 35 with parameters {'Cs_fraction': 18, 'Fa_fraction': 1, 'Spin_duration_Antisolvent': 10, 'Spin_duration_High_Speed': 21, 'Spin_speed': 20} and raw data {'PLQY': np.float64(0.0), 'FWHM': np.float64(197.45)}
[INFO 08-13 17:17:20] ax.api.client: Trial 36 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 36 with parameters {'Cs_fraction': 17, 'Fa_fraction': 2, 'Spin_duration_Antisolvent': 11, 'Spin_duration_High_Speed': 44, 'Spin_speed': 10} and raw data {'PLQY': np.float64(0.0), 'FWHM': np.float64(303.85)}
[INFO 08-13 17:17:20] ax.api.client: Trial 37 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 37 with parameters {'Cs_fraction': 16, 'Fa_fraction': 4, 'Spin_duration_Antisolvent': 15, 'Spin_duration_High_Speed': 38, 'Spin_speed': 16} and raw data {'PLQY': np.float64(0.0), 'FWHM': np.float64(217.65)}
[INFO 08-13 17:17:20] ax.api.client: Trial 38 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 38 with parameters {'Cs_fraction': 20, 'Fa_fraction': 0, 'Spin_duration_Antisolvent': 14, 'Spin_duration_High_Speed': 22, 'Spin_speed': 15} and raw data {'PLQY': np.float64(0.0), 'FWHM': np.float64(193.05)}
[INFO 08-13 17:17:20] ax.api.client: Trial 39 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 39 with parameters {'Cs_fraction': 20, 'Fa_fraction': 0, 'Spin_duration_Antisolvent': 7, 'Spin_duration_High_Speed': 25, 'Spin_speed': 10} and raw data {'PLQY': np.float64(0.0), 'FWHM': np.float64(201.95)}
[INFO 08-13 17:17:20] ax.api.client: Trial 40 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 40 with parameters {'Cs_fraction': 0, 'Fa_fraction': 20, 'Spin_duration_Antisolvent': 10, 'Spin_duration_High_Speed': 55, 'Spin_speed': 27} and raw data {'PLQY': np.float64(18.89), 'FWHM': np.float64(94.35)}
[INFO 08-13 17:17:20] ax.api.client: Trial 41 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 41 with parameters {'Cs_fraction': 0, 'Fa_fraction': 20, 'Spin_duration_Antisolvent': 8, 'Spin_duration_High_Speed': 44, 'Spin_speed': 24} and raw data {'PLQY': np.float64(24.65), 'FWHM': np.float64(100.2)}
[INFO 08-13 17:17:20] ax.api.client: Trial 42 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 42 with parameters {'Cs_fraction': 0, 'Fa_fraction': 6, 'Spin_duration_Antisolvent': 15, 'Spin_duration_High_Speed': 20, 'Spin_speed': 33} and raw data {'PLQY': np.float64(6.05), 'FWHM': np.float64(47.95)}
[INFO 08-13 17:17:20] ax.api.client: Trial 43 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 43 with parameters {'Cs_fraction': 0, 'Fa_fraction': 6, 'Spin_duration_Antisolvent': 15, 'Spin_duration_High_Speed': 20, 'Spin_speed': 34} and raw data {'PLQY': np.float64(5.77), 'FWHM': np.float64(49.15)}
[INFO 08-13 17:17:20] ax.api.client: Trial 44 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 44 with parameters {'Cs_fraction': 0, 'Fa_fraction': 5, 'Spin_duration_Antisolvent': 15, 'Spin_duration_High_Speed': 20, 'Spin_speed': 32} and raw data {'PLQY': np.float64(6.61), 'FWHM': np.float64(48.7)}
[INFO 08-13 17:17:20] ax.api.client: Trial 45 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 45 with parameters {'Cs_fraction': 0, 'Fa_fraction': 8, 'Spin_duration_Antisolvent': 15, 'Spin_duration_High_Speed': 20, 'Spin_speed': 32} and raw data {'PLQY': np.float64(6.26), 'FWHM': np.float64(48.7)}
[INFO 08-13 17:17:20] ax.api.client: Trial 46 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 46 with parameters {'Cs_fraction': 1, 'Fa_fraction': 5, 'Spin_duration_Antisolvent': 15, 'Spin_duration_High_Speed': 20, 'Spin_speed': 32} and raw data {'PLQY': np.float64(8.44), 'FWHM': np.float64(48.35)}
[INFO 08-13 17:17:20] ax.api.client: Trial 47 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 47 with parameters {'Cs_fraction': 1, 'Fa_fraction': 6, 'Spin_duration_Antisolvent': 15, 'Spin_duration_High_Speed': 20, 'Spin_speed': 32} and raw data {'PLQY': np.float64(7.45), 'FWHM': np.float64(47.35)}
[INFO 08-13 17:17:20] ax.api.client: Trial 48 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 48 with parameters {'Cs_fraction': 5, 'Fa_fraction': 0, 'Spin_duration_Antisolvent': 9, 'Spin_duration_High_Speed': 50, 'Spin_speed': 17} and raw data {'PLQY': np.float64(0.0), 'FWHM': np.float64(301.5)}
[INFO 08-13 17:17:20] ax.api.client: Trial 49 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 49 with parameters {'Cs_fraction': 13, 'Fa_fraction': 1, 'Spin_duration_Antisolvent': 5, 'Spin_duration_High_Speed': 42, 'Spin_speed': 29} and raw data {'PLQY': np.float64(0.0), 'FWHM': np.float64(218.25)}
[INFO 08-13 17:17:20] ax.api.client: Trial 50 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 50 with parameters {'Cs_fraction': 13, 'Fa_fraction': 0, 'Spin_duration_Antisolvent': 5, 'Spin_duration_High_Speed': 48, 'Spin_speed': 28} and raw data {'PLQY': np.float64(0.0), 'FWHM': np.float64(249.9)}
[INFO 08-13 17:17:20] ax.api.client: Trial 51 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 51 with parameters {'Cs_fraction': 11, 'Fa_fraction': 5, 'Spin_duration_Antisolvent': 5, 'Spin_duration_High_Speed': 51, 'Spin_speed': 36} and raw data {'PLQY': np.float64(0.0), 'FWHM': np.float64(260.7)}
[INFO 08-13 17:17:20] ax.api.client: Trial 52 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 52 with parameters {'Cs_fraction': 11, 'Fa_fraction': 2, 'Spin_duration_Antisolvent': 20, 'Spin_duration_High_Speed': 39, 'Spin_speed': 33} and raw data {'PLQY': np.float64(0.0), 'FWHM': np.float64(228.45)}
[INFO 08-13 17:17:20] ax.api.client: Trial 53 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 53 with parameters {'Cs_fraction': 9, 'Fa_fraction': 8, 'Spin_duration_Antisolvent': 19, 'Spin_duration_High_Speed': 31, 'Spin_speed': 35} and raw data {'PLQY': np.float64(0.0), 'FWHM': np.float64(45.75)}
[INFO 08-13 17:17:20] ax.api.client: Trial 54 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 54 with parameters {'Cs_fraction': 2, 'Fa_fraction': 0, 'Spin_duration_Antisolvent': 5, 'Spin_duration_High_Speed': 60, 'Spin_speed': 35} and raw data {'PLQY': np.float64(0.0), 'FWHM': np.float64(52.0)}
[INFO 08-13 17:17:20] ax.api.client: Trial 55 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 55 with parameters {'Cs_fraction': 5, 'Fa_fraction': 0, 'Spin_duration_Antisolvent': 5, 'Spin_duration_High_Speed': 30, 'Spin_speed': 34} and raw data {'PLQY': np.float64(0.0), 'FWHM': np.float64(316.4)}
[INFO 08-13 17:17:20] ax.api.client: Trial 56 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 56 with parameters {'Cs_fraction': 0, 'Fa_fraction': 20, 'Spin_duration_Antisolvent': 10, 'Spin_duration_High_Speed': 55, 'Spin_speed': 28} and raw data {'PLQY': np.float64(17.21), 'FWHM': np.float64(100.5)}
[INFO 08-13 17:17:20] ax.api.client: Trial 57 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 57 with parameters {'Cs_fraction': 0, 'Fa_fraction': 20, 'Spin_duration_Antisolvent': 11, 'Spin_duration_High_Speed': 55, 'Spin_speed': 27} and raw data {'PLQY': np.float64(16.91), 'FWHM': np.float64(105.75)}
[INFO 08-13 17:17:20] ax.api.client: Trial 58 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 58 with parameters {'Cs_fraction': 0, 'Fa_fraction': 20, 'Spin_duration_Antisolvent': 10, 'Spin_duration_High_Speed': 56, 'Spin_speed': 27} and raw data {'PLQY': np.float64(15.05), 'FWHM': np.float64(107.25)}
[INFO 08-13 17:17:20] ax.api.client: Trial 59 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 59 with parameters {'Cs_fraction': 0, 'Fa_fraction': 20, 'Spin_duration_Antisolvent': 10, 'Spin_duration_High_Speed': 54, 'Spin_speed': 27} and raw data {'PLQY': np.float64(38.62), 'FWHM': np.float64(108.8)}
[INFO 08-13 17:17:20] ax.api.client: Trial 60 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 60 with parameters {'Cs_fraction': 0, 'Fa_fraction': 20, 'Spin_duration_Antisolvent': 10, 'Spin_duration_High_Speed': 55, 'Spin_speed': 29} and raw data {'PLQY': np.float64(21.33), 'FWHM': np.float64(106.1)}
[INFO 08-13 17:17:20] ax.api.client: Trial 61 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 61 with parameters {'Cs_fraction': 0, 'Fa_fraction': 20, 'Spin_duration_Antisolvent': 11, 'Spin_duration_High_Speed': 55, 'Spin_speed': 28} and raw data {'PLQY': np.float64(13.18), 'FWHM': np.float64(106.3)}
[INFO 08-13 17:17:20] ax.api.client: Trial 62 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 62 with parameters {'Cs_fraction': 0, 'Fa_fraction': 20, 'Spin_duration_Antisolvent': 12, 'Spin_duration_High_Speed': 55, 'Spin_speed': 27} and raw data {'PLQY': np.float64(8.08), 'FWHM': np.float64(83.15)}
[INFO 08-13 17:17:20] ax.api.client: Trial 63 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 63 with parameters {'Cs_fraction': 0, 'Fa_fraction': 18, 'Spin_duration_Antisolvent': 10, 'Spin_duration_High_Speed': 55, 'Spin_speed': 27} and raw data {'PLQY': np.float64(40.92), 'FWHM': np.float64(57.15)}
[INFO 08-13 17:17:20] ax.api.client: Trial 64 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 64 with parameters {'Cs_fraction': 0, 'Fa_fraction': 10, 'Spin_duration_Antisolvent': 22, 'Spin_duration_High_Speed': 40, 'Spin_speed': 49} and raw data {'PLQY': np.float64(5.25), 'FWHM': np.float64(47.3)}
[INFO 08-13 17:17:20] ax.api.client: Trial 65 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 65 with parameters {'Cs_fraction': 1, 'Fa_fraction': 11, 'Spin_duration_Antisolvent': 23, 'Spin_duration_High_Speed': 60, 'Spin_speed': 16} and raw data {'PLQY': np.float64(4.79), 'FWHM': np.float64(46.25)}
[INFO 08-13 17:17:20] ax.api.client: Trial 66 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 66 with parameters {'Cs_fraction': 0, 'Fa_fraction': 11, 'Spin_duration_Antisolvent': 25, 'Spin_duration_High_Speed': 50, 'Spin_speed': 23} and raw data {'PLQY': np.float64(10.83), 'FWHM': np.float64(51.05)}
[INFO 08-13 17:17:20] ax.api.client: Trial 67 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 67 with parameters {'Cs_fraction': 0, 'Fa_fraction': 2, 'Spin_duration_Antisolvent': 29, 'Spin_duration_High_Speed': 50, 'Spin_speed': 11} and raw data {'PLQY': np.float64(4.91), 'FWHM': np.float64(48.9)}
[INFO 08-13 17:17:20] ax.api.client: Trial 68 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 68 with parameters {'Cs_fraction': 1, 'Fa_fraction': 13, 'Spin_duration_Antisolvent': 21, 'Spin_duration_High_Speed': 24, 'Spin_speed': 16} and raw data {'PLQY': np.float64(7.22), 'FWHM': np.float64(48.65)}
[INFO 08-13 17:17:20] ax.api.client: Trial 69 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 69 with parameters {'Cs_fraction': 8, 'Fa_fraction': 5, 'Spin_duration_Antisolvent': 12, 'Spin_duration_High_Speed': 15, 'Spin_speed': 18} and raw data {'PLQY': np.float64(0.0), 'FWHM': np.float64(52.3)}
[INFO 08-13 17:17:20] ax.api.client: Trial 70 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 70 with parameters {'Cs_fraction': 1, 'Fa_fraction': 13, 'Spin_duration_Antisolvent': 25, 'Spin_duration_High_Speed': 18, 'Spin_speed': 18} and raw data {'PLQY': np.float64(7.04), 'FWHM': np.float64(48.75)}
[INFO 08-13 17:17:20] ax.api.client: Trial 71 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 71 with parameters {'Cs_fraction': 6, 'Fa_fraction': 13, 'Spin_duration_Antisolvent': 17, 'Spin_duration_High_Speed': 59, 'Spin_speed': 30} and raw data {'PLQY': np.float64(0.0), 'FWHM': np.float64(52.0)}
[INFO 08-13 17:17:20] ax.api.client: Trial 72 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 72 with parameters {'Cs_fraction': 0, 'Fa_fraction': 18, 'Spin_duration_Antisolvent': 10, 'Spin_duration_High_Speed': 55, 'Spin_speed': 27} and raw data {'PLQY': np.float64(16.74), 'FWHM': np.float64(93.9)}
[INFO 08-13 17:17:20] ax.api.client: Trial 73 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 73 with parameters {'Cs_fraction': 1, 'Fa_fraction': 18, 'Spin_duration_Antisolvent': 10, 'Spin_duration_High_Speed': 55, 'Spin_speed': 27} and raw data {'PLQY': np.float64(8.85), 'FWHM': np.float64(50.8)}
[INFO 08-13 17:17:20] ax.api.client: Trial 74 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 74 with parameters {'Cs_fraction': 0, 'Fa_fraction': 17, 'Spin_duration_Antisolvent': 10, 'Spin_duration_High_Speed': 55, 'Spin_speed': 27} and raw data {'PLQY': np.float64(7.81), 'FWHM': np.float64(104.85)}
[INFO 08-13 17:17:20] ax.api.client: Trial 75 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 75 with parameters {'Cs_fraction': 2, 'Fa_fraction': 17, 'Spin_duration_Antisolvent': 10, 'Spin_duration_High_Speed': 55, 'Spin_speed': 27} and raw data {'PLQY': np.float64(4.91), 'FWHM': np.float64(52.45)}
[INFO 08-13 17:17:20] ax.api.client: Trial 76 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 76 with parameters {'Cs_fraction': 1, 'Fa_fraction': 17, 'Spin_duration_Antisolvent': 10, 'Spin_duration_High_Speed': 55, 'Spin_speed': 27} and raw data {'PLQY': np.float64(11.68), 'FWHM': np.float64(52.45)}
[INFO 08-13 17:17:20] ax.api.client: Trial 77 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 77 with parameters {'Cs_fraction': 2, 'Fa_fraction': 16, 'Spin_duration_Antisolvent': 10, 'Spin_duration_High_Speed': 55, 'Spin_speed': 27} and raw data {'PLQY': np.float64(3.5), 'FWHM': np.float64(48.31)}
[INFO 08-13 17:17:20] ax.api.client: Trial 78 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 78 with parameters {'Cs_fraction': 2, 'Fa_fraction': 16, 'Spin_duration_Antisolvent': 10, 'Spin_duration_High_Speed': 55, 'Spin_speed': 27} and raw data {'PLQY': np.float64(0.0), 'FWHM': np.float64(53.61)}
[INFO 08-13 17:17:20] ax.api.client: Trial 79 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 79 with parameters {'Cs_fraction': 1, 'Fa_fraction': 16, 'Spin_duration_Antisolvent': 10, 'Spin_duration_High_Speed': 55, 'Spin_speed': 27} and raw data {'PLQY': np.float64(3.59), 'FWHM': np.float64(51.0)}
[INFO 08-13 17:17:20] ax.api.client: Trial 80 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 80 with parameters {'Cs_fraction': 13, 'Fa_fraction': 6, 'Spin_duration_Antisolvent': 22, 'Spin_duration_High_Speed': 55, 'Spin_speed': 47} and raw data {'PLQY': np.float64(0.0), 'FWHM': np.float64(302.6)}
[INFO 08-13 17:17:20] ax.api.client: Trial 81 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 81 with parameters {'Cs_fraction': 8, 'Fa_fraction': 10, 'Spin_duration_Antisolvent': 13, 'Spin_duration_High_Speed': 35, 'Spin_speed': 45} and raw data {'PLQY': np.float64(0.0), 'FWHM': np.float64(48.3)}
[INFO 08-13 17:17:20] ax.api.client: Trial 82 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 82 with parameters {'Cs_fraction': 8, 'Fa_fraction': 11, 'Spin_duration_Antisolvent': 6, 'Spin_duration_High_Speed': 28, 'Spin_speed': 43} and raw data {'PLQY': np.float64(0.0), 'FWHM': np.float64(53.7)}
[INFO 08-13 17:17:20] ax.api.client: Trial 83 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 83 with parameters {'Cs_fraction': 8, 'Fa_fraction': 11, 'Spin_duration_Antisolvent': 10, 'Spin_duration_High_Speed': 24, 'Spin_speed': 49} and raw data {'PLQY': np.float64(0.0), 'FWHM': np.float64(48.05)}
[INFO 08-13 17:17:20] ax.api.client: Trial 84 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 84 with parameters {'Cs_fraction': 11, 'Fa_fraction': 5, 'Spin_duration_Antisolvent': 30, 'Spin_duration_High_Speed': 18, 'Spin_speed': 48} and raw data {'PLQY': np.float64(0.0), 'FWHM': np.float64(289.6)}
[INFO 08-13 17:17:20] ax.api.client: Trial 85 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 85 with parameters {'Cs_fraction': 8, 'Fa_fraction': 10, 'Spin_duration_Antisolvent': 10, 'Spin_duration_High_Speed': 36, 'Spin_speed': 45} and raw data {'PLQY': np.float64(0.0), 'FWHM': np.float64(209.95)}
[INFO 08-13 17:17:20] ax.api.client: Trial 86 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 86 with parameters {'Cs_fraction': 6, 'Fa_fraction': 5, 'Spin_duration_Antisolvent': 21, 'Spin_duration_High_Speed': 36, 'Spin_speed': 27} and raw data {'PLQY': np.float64(0.0), 'FWHM': np.float64(49.55)}
[INFO 08-13 17:17:20] ax.api.client: Trial 87 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 87 with parameters {'Cs_fraction': 8, 'Fa_fraction': 9, 'Spin_duration_Antisolvent': 7, 'Spin_duration_High_Speed': 37, 'Spin_speed': 46} and raw data {'PLQY': np.float64(0.0), 'FWHM': np.float64(335.9)}
[INFO 08-13 17:17:20] ax.api.client: Trial 88 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 88 with parameters {'Cs_fraction': 0, 'Fa_fraction': 18, 'Spin_duration_Antisolvent': 10, 'Spin_duration_High_Speed': 55, 'Spin_speed': 26} and raw data {'PLQY': np.float64(27.55), 'FWHM': np.float64(60.25)}
[INFO 08-13 17:17:20] ax.api.client: Trial 89 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 89 with parameters {'Cs_fraction': 0, 'Fa_fraction': 18, 'Spin_duration_Antisolvent': 10, 'Spin_duration_High_Speed': 55, 'Spin_speed': 25} and raw data {'PLQY': np.float64(34.63), 'FWHM': np.float64(58.95)}
[INFO 08-13 17:17:20] ax.api.client: Trial 90 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 90 with parameters {'Cs_fraction': 0, 'Fa_fraction': 18, 'Spin_duration_Antisolvent': 10, 'Spin_duration_High_Speed': 55, 'Spin_speed': 24} and raw data {'PLQY': np.float64(38.61), 'FWHM': np.float64(81.6)}
[INFO 08-13 17:17:20] ax.api.client: Trial 91 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 91 with parameters {'Cs_fraction': 0, 'Fa_fraction': 18, 'Spin_duration_Antisolvent': 9, 'Spin_duration_High_Speed': 55, 'Spin_speed': 27} and raw data {'PLQY': np.float64(35.86), 'FWHM': np.float64(73.3)}
[INFO 08-13 17:17:20] ax.api.client: Trial 92 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 92 with parameters {'Cs_fraction': 0, 'Fa_fraction': 18, 'Spin_duration_Antisolvent': 10, 'Spin_duration_High_Speed': 55, 'Spin_speed': 23} and raw data {'PLQY': np.float64(39.76), 'FWHM': np.float64(70.0)}
[INFO 08-13 17:17:20] ax.api.client: Trial 93 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 93 with parameters {'Cs_fraction': 0, 'Fa_fraction': 18, 'Spin_duration_Antisolvent': 9, 'Spin_duration_High_Speed': 55, 'Spin_speed': 26} and raw data {'PLQY': np.float64(19.12), 'FWHM': np.float64(50.55)}
[INFO 08-13 17:17:20] ax.api.client: Trial 94 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 94 with parameters {'Cs_fraction': 0, 'Fa_fraction': 18, 'Spin_duration_Antisolvent': 10, 'Spin_duration_High_Speed': 55, 'Spin_speed': 22} and raw data {'PLQY': np.float64(3.28), 'FWHM': np.float64(53.45)}
[INFO 08-13 17:17:20] ax.api.client: Trial 95 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 95 with parameters {'Cs_fraction': 0, 'Fa_fraction': 18, 'Spin_duration_Antisolvent': 9, 'Spin_duration_High_Speed': 55, 'Spin_speed': 25} and raw data {'PLQY': np.float64(5.71), 'FWHM': np.float64(52.5)}
[INFO 08-13 17:17:20] ax.api.client: Trial 96 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 96 with parameters {'Cs_fraction': 8, 'Fa_fraction': 0, 'Spin_duration_Antisolvent': 26, 'Spin_duration_High_Speed': 34, 'Spin_speed': 10} and raw data {'PLQY': np.float64(0.0), 'FWHM': np.float64(321.3)}
[INFO 08-13 17:17:20] ax.api.client: Trial 97 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 97 with parameters {'Cs_fraction': 13, 'Fa_fraction': 0, 'Spin_duration_Antisolvent': 13, 'Spin_duration_High_Speed': 29, 'Spin_speed': 12} and raw data {'PLQY': np.float64(0.0), 'FWHM': np.float64(207.45)}
[INFO 08-13 17:17:20] ax.api.client: Trial 98 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 98 with parameters {'Cs_fraction': 11, 'Fa_fraction': 0, 'Spin_duration_Antisolvent': 11, 'Spin_duration_High_Speed': 33, 'Spin_speed': 12} and raw data {'PLQY': np.float64(0.0), 'FWHM': np.float64(258.95)}
[INFO 08-13 17:17:20] ax.api.client: Trial 99 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 99 with parameters {'Cs_fraction': 2, 'Fa_fraction': 2, 'Spin_duration_Antisolvent': 24, 'Spin_duration_High_Speed': 18, 'Spin_speed': 50} and raw data {'PLQY': np.float64(0.0), 'FWHM': np.float64(70.65)}
[INFO 08-13 17:17:20] ax.api.client: Trial 100 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 100 with parameters {'Cs_fraction': 0, 'Fa_fraction': 4, 'Spin_duration_Antisolvent': 6, 'Spin_duration_High_Speed': 41, 'Spin_speed': 45} and raw data {'PLQY': np.float64(16.02), 'FWHM': np.float64(47.45)}
[INFO 08-13 17:17:20] ax.api.client: Trial 101 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 101 with parameters {'Cs_fraction': 4, 'Fa_fraction': 2, 'Spin_duration_Antisolvent': 21, 'Spin_duration_High_Speed': 18, 'Spin_speed': 39} and raw data {'PLQY': np.float64(0.0), 'FWHM': np.float64(300.2)}
[INFO 08-13 17:17:20] ax.api.client: Trial 102 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 102 with parameters {'Cs_fraction': 15, 'Fa_fraction': 0, 'Spin_duration_Antisolvent': 17, 'Spin_duration_High_Speed': 31, 'Spin_speed': 48} and raw data {'PLQY': np.float64(0.0), 'FWHM': np.float64(204.25)}
[INFO 08-13 17:17:20] ax.api.client: Trial 103 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 103 with parameters {'Cs_fraction': 4, 'Fa_fraction': 1, 'Spin_duration_Antisolvent': 20, 'Spin_duration_High_Speed': 25, 'Spin_speed': 48} and raw data {'PLQY': np.float64(0.0), 'FWHM': np.float64(66.5)}
[INFO 08-13 17:17:20] ax.api.client: Trial 104 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 104 with parameters {'Cs_fraction': 0, 'Fa_fraction': 18, 'Spin_duration_Antisolvent': 10, 'Spin_duration_High_Speed': 56, 'Spin_speed': 24} and raw data {'PLQY': np.float64(18.38), 'FWHM': np.float64(55.05)}
[INFO 08-13 17:17:20] ax.api.client: Trial 105 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 105 with parameters {'Cs_fraction': 0, 'Fa_fraction': 18, 'Spin_duration_Antisolvent': 11, 'Spin_duration_High_Speed': 55, 'Spin_speed': 24} and raw data {'PLQY': np.float64(13.58), 'FWHM': np.float64(50.1)}
[INFO 08-13 17:17:20] ax.api.client: Trial 106 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 106 with parameters {'Cs_fraction': 0, 'Fa_fraction': 18, 'Spin_duration_Antisolvent': 10, 'Spin_duration_High_Speed': 54, 'Spin_speed': 24} and raw data {'PLQY': np.float64(7.76), 'FWHM': np.float64(53.4)}
[INFO 08-13 17:17:20] ax.api.client: Trial 107 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 107 with parameters {'Cs_fraction': 0, 'Fa_fraction': 18, 'Spin_duration_Antisolvent': 10, 'Spin_duration_High_Speed': 56, 'Spin_speed': 23} and raw data {'PLQY': np.float64(12.77), 'FWHM': np.float64(54.65)}
[INFO 08-13 17:17:20] ax.api.client: Trial 108 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 108 with parameters {'Cs_fraction': 0, 'Fa_fraction': 18, 'Spin_duration_Antisolvent': 10, 'Spin_duration_High_Speed': 53, 'Spin_speed': 24} and raw data {'PLQY': np.float64(9.91), 'FWHM': np.float64(55.0)}
[INFO 08-13 17:17:20] ax.api.client: Trial 109 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 109 with parameters {'Cs_fraction': 0, 'Fa_fraction': 18, 'Spin_duration_Antisolvent': 10, 'Spin_duration_High_Speed': 52, 'Spin_speed': 24} and raw data {'PLQY': np.float64(17.46), 'FWHM': np.float64(60.4)}
[INFO 08-13 17:17:20] ax.api.client: Trial 110 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 110 with parameters {'Cs_fraction': 0, 'Fa_fraction': 18, 'Spin_duration_Antisolvent': 10, 'Spin_duration_High_Speed': 57, 'Spin_speed': 24} and raw data {'PLQY': np.float64(7.65), 'FWHM': np.float64(53.65)}
[INFO 08-13 17:17:20] ax.api.client: Trial 111 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 111 with parameters {'Cs_fraction': 0, 'Fa_fraction': 18, 'Spin_duration_Antisolvent': 10, 'Spin_duration_High_Speed': 54, 'Spin_speed': 23} and raw data {'PLQY': np.float64(10.04), 'FWHM': np.float64(52.15)}
[INFO 08-13 17:17:20] ax.api.client: Trial 112 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 112 with parameters {'Cs_fraction': 4, 'Fa_fraction': 15, 'Spin_duration_Antisolvent': 30, 'Spin_duration_High_Speed': 34, 'Spin_speed': 41} and raw data {'PLQY': np.float64(7.15), 'FWHM': np.float64(51.55)}
[INFO 08-13 17:17:20] ax.api.client: Trial 113 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 113 with parameters {'Cs_fraction': 5, 'Fa_fraction': 15, 'Spin_duration_Antisolvent': 30, 'Spin_duration_High_Speed': 27, 'Spin_speed': 34} and raw data {'PLQY': np.float64(0.0), 'FWHM': np.float64(56.65)}
[INFO 08-13 17:17:20] ax.api.client: Trial 114 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 114 with parameters {'Cs_fraction': 5, 'Fa_fraction': 15, 'Spin_duration_Antisolvent': 22, 'Spin_duration_High_Speed': 37, 'Spin_speed': 10} and raw data {'PLQY': np.float64(0.0), 'FWHM': np.float64(52.9)}
[INFO 08-13 17:17:20] ax.api.client: Trial 115 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 115 with parameters {'Cs_fraction': 6, 'Fa_fraction': 4, 'Spin_duration_Antisolvent': 30, 'Spin_duration_High_Speed': 50, 'Spin_speed': 36} and raw data {'PLQY': np.float64(0.0), 'FWHM': np.float64(47.35)}
[INFO 08-13 17:17:20] ax.api.client: Trial 116 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 116 with parameters {'Cs_fraction': 4, 'Fa_fraction': 13, 'Spin_duration_Antisolvent': 18, 'Spin_duration_High_Speed': 38, 'Spin_speed': 21} and raw data {'PLQY': np.float64(0.0), 'FWHM': np.float64(55.3)}
[INFO 08-13 17:17:20] ax.api.client: Trial 117 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 117 with parameters {'Cs_fraction': 8, 'Fa_fraction': 2, 'Spin_duration_Antisolvent': 29, 'Spin_duration_High_Speed': 15, 'Spin_speed': 35} and raw data {'PLQY': np.float64(0.0), 'FWHM': np.float64(308.5)}
[INFO 08-13 17:17:20] ax.api.client: Trial 118 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 118 with parameters {'Cs_fraction': 4, 'Fa_fraction': 16, 'Spin_duration_Antisolvent': 25, 'Spin_duration_High_Speed': 24, 'Spin_speed': 33} and raw data {'PLQY': np.float64(7.48), 'FWHM': np.float64(45.9)}
[INFO 08-13 17:17:20] ax.api.client: Trial 119 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 119 with parameters {'Cs_fraction': 8, 'Fa_fraction': 2, 'Spin_duration_Antisolvent': 30, 'Spin_duration_High_Speed': 27, 'Spin_speed': 35} and raw data {'PLQY': np.float64(0.0), 'FWHM': np.float64(219.25)}
[INFO 08-13 17:17:20] ax.api.client: Trial 120 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 120 with parameters {'Cs_fraction': 0, 'Fa_fraction': 18, 'Spin_duration_Antisolvent': 8, 'Spin_duration_High_Speed': 55, 'Spin_speed': 27} and raw data {'PLQY': np.float64(24.67), 'FWHM': np.float64(80.95)}
[INFO 08-13 17:17:20] ax.api.client: Trial 121 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 121 with parameters {'Cs_fraction': 0, 'Fa_fraction': 18, 'Spin_duration_Antisolvent': 7, 'Spin_duration_High_Speed': 55, 'Spin_speed': 27} and raw data {'PLQY': np.float64(25.59), 'FWHM': np.float64(85.4)}
[INFO 08-13 17:17:20] ax.api.client: Trial 122 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 122 with parameters {'Cs_fraction': 0, 'Fa_fraction': 18, 'Spin_duration_Antisolvent': 5, 'Spin_duration_High_Speed': 55, 'Spin_speed': 27} and raw data {'PLQY': np.float64(20.1), 'FWHM': np.float64(51.65)}
[INFO 08-13 17:17:20] ax.api.client: Trial 123 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 123 with parameters {'Cs_fraction': 0, 'Fa_fraction': 18, 'Spin_duration_Antisolvent': 6, 'Spin_duration_High_Speed': 55, 'Spin_speed': 27} and raw data {'PLQY': np.float64(15.16), 'FWHM': np.float64(51.75)}
[INFO 08-13 17:17:20] ax.api.client: Trial 124 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 124 with parameters {'Cs_fraction': 0, 'Fa_fraction': 18, 'Spin_duration_Antisolvent': 9, 'Spin_duration_High_Speed': 55, 'Spin_speed': 28} and raw data {'PLQY': np.float64(14.29), 'FWHM': np.float64(56.75)}
[INFO 08-13 17:17:20] ax.api.client: Trial 125 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 125 with parameters {'Cs_fraction': 0, 'Fa_fraction': 18, 'Spin_duration_Antisolvent': 9, 'Spin_duration_High_Speed': 56, 'Spin_speed': 27} and raw data {'PLQY': np.float64(17.98), 'FWHM': np.float64(54.7)}
[INFO 08-13 17:17:20] ax.api.client: Trial 126 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 126 with parameters {'Cs_fraction': 0, 'Fa_fraction': 18, 'Spin_duration_Antisolvent': 9, 'Spin_duration_High_Speed': 54, 'Spin_speed': 27} and raw data {'PLQY': np.float64(33.2), 'FWHM': np.float64(57.15)}
[INFO 08-13 17:17:20] ax.api.client: Trial 127 marked COMPLETED.
[INFO 08-13 17:17:20] optimpv.axBOtorchOptimizer: Attached trial 127 with parameters {'Cs_fraction': 0, 'Fa_fraction': 18, 'Spin_duration_Antisolvent': 8, 'Spin_duration_High_Speed': 55, 'Spin_speed': 28} and raw data {'PLQY': np.float64(24.47), 'FWHM': np.float64(51.75)}
[INFO 08-13 17:19:00] ax.api.client: Generated new trial 128 with parameters {'Cs_fraction': 0, 'Fa_fraction': 20, 'Spin_duration_Antisolvent': 5, 'Spin_duration_High_Speed': 60, 'Spin_speed': 10}using GenerationNode BOTORCH_MODULAR.
[INFO 08-13 17:19:00] ax.api.client: Generated new trial 129 with parameters {'Cs_fraction': 0, 'Fa_fraction': 20, 'Spin_duration_Antisolvent': 16, 'Spin_duration_High_Speed': 60, 'Spin_speed': 10}using GenerationNode BOTORCH_MODULAR.
[INFO 08-13 17:19:00] ax.api.client: Generated new trial 130 with parameters {'Cs_fraction': 0, 'Fa_fraction': 20, 'Spin_duration_Antisolvent': 5, 'Spin_duration_High_Speed': 21, 'Spin_speed': 23}using GenerationNode BOTORCH_MODULAR.
[INFO 08-13 17:19:00] ax.api.client: Generated new trial 131 with parameters {'Cs_fraction': 0, 'Fa_fraction': 20, 'Spin_duration_Antisolvent': 5, 'Spin_duration_High_Speed': 52, 'Spin_speed': 10}using GenerationNode BOTORCH_MODULAR.
[INFO 08-13 17:19:00] ax.api.client: Generated new trial 132 with parameters {'Cs_fraction': 0, 'Fa_fraction': 20, 'Spin_duration_Antisolvent': 17, 'Spin_duration_High_Speed': 48, 'Spin_speed': 10}using GenerationNode BOTORCH_MODULAR.
[INFO 08-13 17:19:00] ax.api.client: Generated new trial 133 with parameters {'Cs_fraction': 0, 'Fa_fraction': 20, 'Spin_duration_Antisolvent': 11, 'Spin_duration_High_Speed': 27, 'Spin_speed': 36}using GenerationNode BOTORCH_MODULAR.
[INFO 08-13 17:19:00] optimpv.axBOtorchOptimizer: Suggesting 6 trials without running the agents.
[7]:
# get the best parameters and update the params list in the optimizer and the agent
ax_client = optimizer.ax_client # get the ax client
optimizer.update_params_with_best_balance() # update the params list in the optimizer with the best parameters
suggest.params = optimizer.params # update the params list in the agent with the best parameters

print("Best parameters found:")
for p in optimizer.params:
    print(f"{p.name}: {p.value} {p.unit} ")
Best parameters found:
Cs_fraction: 0.0
Fa_fraction: 0.2
Spin_duration_Antisolvent: 6 s
Spin_duration_High_Speed: 41 s
Spin_speed: 4500 rpm
[8]:
# Plot optimization results
data = ax_client.summarize()
data = optimizer.rescale_dataframe(data, params)
all_metrics = optimizer.all_metrics
plt.figure()
for i, metric in enumerate(all_metrics):
    if suggest.minimize[i]:
       plt.plot(np.minimum.accumulate(data[metric]), label=metric)
    else:
       plt.plot(np.maximum.accumulate(data[metric]), label=metric)

plt.yscale("log")
plt.xlabel("Iteration")
plt.ylabel("Target")
plt.legend()
plt.title("Best value seen so far")

plt.show()
../_images/examples_Exp_design_MOO_11_0.png
[9]:
# print the parameters to that are running in data
to_run_next = data[data['trial_status'] == 'RUNNING']
print("Parameters to run next:")
print(to_run_next)
Parameters to run next:
     trial_index arm_name trial_status  generation_node  PLQY  FWHM  \
128          128    128_0      RUNNING  BOTORCH_MODULAR   NaN   NaN
129          129    129_0      RUNNING  BOTORCH_MODULAR   NaN   NaN
130          130    130_0      RUNNING  BOTORCH_MODULAR   NaN   NaN
131          131    131_0      RUNNING  BOTORCH_MODULAR   NaN   NaN
132          132    132_0      RUNNING  BOTORCH_MODULAR   NaN   NaN
133          133    133_0      RUNNING  BOTORCH_MODULAR   NaN   NaN

     Cs_fraction  Fa_fraction  Spin_duration_Antisolvent  \
128          0.0          1.0                          5
129          0.0          1.0                         16
130          0.0          1.0                          5
131          0.0          1.0                          5
132          0.0          1.0                         17
133          0.0          1.0                         11

     Spin_duration_High_Speed  Spin_speed
128                        60        1000
129                        60        1000
130                        21        2300
131                        52        1000
132                        48        1000
133                        27        3600
[11]:
from ax.utils.notebook.plotting import render# for plotting in notebook
from ax.plot.slice import plot_slice
from ax.plot.scatter import interact_fitted
from ax.adapter.cross_validation import cross_validate
from ax.plot.diagnostic import interact_cross_validation
from sklearn.metrics import r2_score

model = optimizer.ax_client._generation_strategy.adapter  # get the model from the ax client
cv_results = cross_validate(model)

# calculate the r2
observed, predicted = [], []
for i in range(len(cv_results)):
    observed.append(cv_results[i].observed.data.means[0])
    predicted.append(cv_results[i].predicted.means[0])
r2 = r2_score(observed, predicted)
print(f'R2 = {r2}')
render(interact_cross_validation(cv_results))

obj_type = 'PLQY' # objective type
p_idx = 0
for p_idx in range(len(optimizer.params)):
    if optimizer.params[p_idx].name == 'Cs_fraction' or optimizer.params[p_idx].name == 'Fa_fraction':
        fac = stepsize_fraction
    elif optimizer.params[p_idx].name == 'Spin_speed':
        fac = stepsize_spin_speed
    else:
        fac = 1
    # plot the slice of the model for the parameter p_idx
    x = ax.plot.slice.plot_slice(model=model,param_name= optimizer.params[p_idx].name, metric_name= obj_type).data['data'][1]['x']
    y = ax.plot.slice.plot_slice(model=model,param_name=optimizer.params[p_idx].name, metric_name= obj_type).data['data'][1]['y']
    x1 = ax.plot.slice.plot_slice(model=model,param_name= optimizer.params[p_idx].name, metric_name= obj_type).data['data'][0]['x']
    y1 = ax.plot.slice.plot_slice(model=model,param_name= optimizer.params[p_idx].name, metric_name= obj_type).data['data'][0]['y']
    # cut x1 and y1 to the same length as x and y
    x_low = np.asarray(x1[:len(x)])*fac
    y_low = np.asarray(y1[:len(y)])
    x_high = np.asarray(x1[len(x):])*fac
    y_high = np.asarray(y1[len(y):][::-1])
    x = np.asarray(x)*fac
    y = np.asarray(y)
    plt.figure(figsize=(8,6))
    plt.plot(x,y)
    # shade the area between the two curves
    plt.fill_between(x, y_low, y_high, color='C0', alpha=0.5)
    # plt.fill_between(x, y, y_high, color='gray', alpha=0.5)
    plt.plot(data[optimizer.params[p_idx].name],data[obj_type],'C0o')
    plt.xlabel(optimizer.params[p_idx].display_name)
    plt.ylabel(obj_type)
    plt.tight_layout()
    plt.show()


R2 = 0.48708677869032624
../_images/examples_Exp_design_MOO_13_2.png
../_images/examples_Exp_design_MOO_13_3.png
../_images/examples_Exp_design_MOO_13_4.png
../_images/examples_Exp_design_MOO_13_5.png
../_images/examples_Exp_design_MOO_13_6.png
[12]:
# Plot the density of the exploration of the parameters
# this gives a nice visualization of where the optimizer focused its exploration and may show some correlation between the parameters
plot_dens = True
if plot_dens:
    from optimpv.posterior.posterior import *
    params_orig_dict, best_parameters = {}, {}
    for p in optimizer.params:
        best_parameters[p.name] = p.value

    fig_dens, ax_dens = plot_density_exploration(params, optimizer = optimizer, best_parameters = best_parameters,  optimizer_type = 'ax')

../_images/examples_Exp_design_MOO_14_0.png
[13]:
import matplotlib
# import itertools
from itertools import combinations
comb = list(combinations(optimizer.all_metrics, 2))
threshold_list = []
for i in range(len(optimizer.agents)):
    for j in range(len(optimizer.agents[i].threshold)):
        threshold_list.append(optimizer.agents[i].threshold[j])
threshold_comb = list(combinations(threshold_list, 2))
pareto = ax_client.get_pareto_frontier(use_model_predictions=False)

cm = matplotlib.colormaps.get_cmap('viridis')
df = get_df_from_ax(params, optimizer)
# create pareto df
dum_dic = {}
for eto in pareto:
    for metr in optimizer.all_metrics:
        if metr not in dum_dic.keys():
            dum_dic[metr] = []
        dum_dic[metr].append(eto[1][metr][0])
df_pareto = pd.DataFrame(dum_dic)

for c,t_c in zip(comb,threshold_comb):
    plt.figure(figsize=(10, 10))
    plt.scatter(df[c[0]],df[c[1]],c=df.index, cmap=cm, marker='o', s=100) # plot the points with color according to the iteration
    cbar = plt.colorbar()
    cbar.set_label('Iteration')
    sorted_df = df_pareto.sort_values(by=c[0])
    plt.plot(sorted_df[c[0]],sorted_df[c[1]],'r')
    plt.scatter(t_c[0],t_c[1],c='r', marker='x', s=100) # plot the threshold
    plt.xlabel(c[0])
    plt.ylabel(c[1])
    plt.xscale('log')
    plt.yscale('log')
plt.show()

[INFO 08-13 17:19:14] ax.service.utils.best_point: Using inferred objective thresholds: [ObjectiveThreshold(FWHM <= 103.29551381068279), ObjectiveThreshold(PLQY >= -3.3257920156983953)], as objective thresholds were not specified as part of the optimization configuration on the experiment.
../_images/examples_Exp_design_MOO_15_1.png