Below is an example for edbo package (EDBO+. Bayesian reaction optimization as a tool for chemical synthesis) from https://github.com/doyle-lab-ucla/edboplus. Please carefully read it
```
from edbo.plus.optimizer_botorch import EDBOplus

#### This is a tutorial that covers the basics for running EDBO+: from designing a combinatorial space to running the Bayesian Optimizer.

## 1. Creating a search scope using EDBO+.


##### To run EDBO+ we need to first create a reaction scope (search space) in a .csv format with all the possible combinations that you want to consider for our optimization. 
##### You can "manually" create a reaction scope using any spreadsheet editor (such as Excel, Libreoffice Calc, ...) but we have also created a tool to help you generating combinatorial search spaces. 
##### For instance, lets say that we want to consider 3 solvents ($f{THF}$, $f{Toluene}$, $f{DMSO}$), 4 temperatures ($f{-10}$, $f{0}$, $f{10}$, $f{25}$) and 3 concentration levels ($f{0.1}$, $f{0.2}$, $f{1.0}$). We can introduce these in the EDBO+ scope generator in a dictionary form as follows:


reaction_components = {
    'solvent': ['THF', 'Toluene', 'DMSO'],
    'T': [-10, 0, 10, 25],
    'concentration': [0.1, 0.2, 1.0]
}


##### Now we need to pass the previous dictionary to the $f{generate\_reaction\_scope}$ tool in the EDBOplus class.

EDBOplus().generate_reaction_scope(
    components=reaction_components, 
    filename='my_optimization.csv',
    check_overwrite=False
)

Generating reaction scope...
solvent	T	concentration
0	THF	-10	0.1
1	THF	-10	0.2
2	THF	-10	1.0
3	THF	0	0.1
4	THF	0	0.2
5	THF	0	1.0
6	THF	10	0.1
7	THF	10	0.2
8	THF	10	1.0
9	THF	25	0.1
10	THF	25	0.2
11	THF	25	1.0
12	Toluene	-10	0.1
13	Toluene	-10	0.2
14	Toluene	-10	1.0
15	Toluene	0	0.1
16	Toluene	0	0.2
17	Toluene	0	1.0
18	Toluene	10	0.1
19	Toluene	10	0.2
20	Toluene	10	1.0
21	Toluene	25	0.1
22	Toluene	25	0.2
23	Toluene	25	1.0
24	DMSO	-10	0.1
25	DMSO	-10	0.2
26	DMSO	-10	1.0
27	DMSO	0	0.1
28	DMSO	0	0.2
29	DMSO	0	1.0
30	DMSO	10	0.1
31	DMSO	10	0.2
32	DMSO	10	1.0
33	DMSO	25	0.1
34	DMSO	25	0.2
35	DMSO	25	1.0

##### We can always load/read the previously generated reaction scope using any spreadsheet editor but in this case we will use Pandas for that:

import pandas as pd
df_scope = pd.read_csv('my_optimization.csv')  # Load csv file.

##### Now we can check the number of combinations in the reaction scope:

n_combinations = len(df_scope)
print(f"Your reaction scope has {n_combinations} combinations.")


Your reaction scope has 36 combinations.

##### Of course, this is a very small reaction scope  as it is meant to be a toy model to demonstrate how EDBO+ works.

## 2. First steps, initializing EDBO+ (in absence of training data).

##### We are going to execute EDBO+ to suggest some initial samples. 
##### Since we have not collected any experimental data (observations) yet, EDBO+ will suggest a set of initial experiments based on an feature space sampling method, in this case the CVT sampling method (see:http://kmh-lanl.hansonhub.com/uncertainty/meetings/gunz03vgr.pdf).
##### In this example the $f{objective}$ is to maximize the reaction $f{yield}$ and $f{enantioselectivity}$ but at the same time we want to minimize the amount one of a given $f{side~product}$ in this reaction. We also need to introduce the name of the csv file containing our reaction scope (in our case this was $f{my\_optimization.csv}$). Now we can execute the algorithm using the $f{run}$ command in EDBOplus:


EDBOplus().run(
    filename='my_optimization.csv',  # Previously generated scope.
    objectives=['yield', 'ee', 'side_product'],  # Objectives to be optimized.
    objective_mode=['max', 'max', 'min'],  # Maximize yield and ee but minimize side_product.
    batch=3,  # Number of experiments in parallel that we want to perform in this round.
    columns_features='all', # features to be included in the model.
    init_sampling_method='cvtsampling'  # initialization method.
)



The following columns are categorical and will be encoded using One-Hot-Encoding: ['solvent']
Sampling type:  selection 


Number of unique samples returned by sampling algorithm: 3
Creating a priority list using random sampling: cvtsampling

	solvent	T	concentration	yield	ee	side_product	priority
32	DMSO	10	1.0	PENDING	PENDING	PENDING	1
8	THF	10	1.0	PENDING	PENDING	PENDING	1
19	Toluene	10	0.2	PENDING	PENDING	PENDING	1
0	THF	-10	0.1	PENDING	PENDING	PENDING	0
26	DMSO	-10	1.0	PENDING	PENDING	PENDING	0
21	Toluene	25	0.1	PENDING	PENDING	PENDING	0
22	Toluene	25	0.2	PENDING	PENDING	PENDING	0
23	Toluene	25	1.0	PENDING	PENDING	PENDING	0
24	DMSO	-10	0.1	PENDING	PENDING	PENDING	0
25	DMSO	-10	0.2	PENDING	PENDING	PENDING	0


##### EDBO+ has created a column for each objective and added $f{PENDING}$ values to all of them so you can track the experiments that you have been collecting during the optimization campaign.
##### We can also see that EDBO+ has created a new $f{priority}$ column. This column is used to distinguish between high and low priority samples. The top entries (with $f{priority=1}$) highlight the next suggested samples.


##### We can check now the first 5 experiments in the scope by reading the $f{my\_optimization.csv}$ file:


df_edbo = pd.read_csv('my_optimization.csv')
df_edbo.head(5)

solvent	T	concentration	yield	ee	side_product	priority
0	DMSO	10	1.0	PENDING	PENDING	PENDING	1
1	THF	10	1.0	PENDING	PENDING	PENDING	1
2	Toluene	10	0.2	PENDING	PENDING	PENDING	1
3	THF	-10	0.1	PENDING	PENDING	PENDING	0
4	DMSO	-10	1.0	PENDING	PENDING	PENDING	0


## 3. Adding training data in EDBO+.

##### Note: We will use Python and Pandas to add new training data in this example. But you can always edit and add new data into the '.csv' file using any spreedsheet editor (such as Excel, Libreoffice Calc, ...) if that's more convinient for you.

##### Let's open again the $f{my\_optimization.csv}$ file we generated before:

df_edbo = pd.read_csv('my_optimization.csv')
df_edbo.head(5)

	solvent	T	concentration	yield	ee	side_product	priority
0	DMSO	10	1.0	PENDING	PENDING	PENDING	1
1	THF	10	1.0	PENDING	PENDING	PENDING	1
2	Toluene	10	0.2	PENDING	PENDING	PENDING	1
3	THF	-10	0.1	PENDING	PENDING	PENDING	0
4	DMSO	-10	1.0	PENDING	PENDING	PENDING	0


##### We can fill the first out entry in the previous dataframe with the "observed" values using Pandas:


df_edbo.loc[0, 'yield'] = 20.5
df_edbo.loc[0, 'ee'] = 40
df_edbo.loc[0, 'side_product'] = 0.1

##### We can check that we have filled out the first entry with our "observed data":

df_edbo.head(5)

	solvent	T	concentration	yield	ee	side_product	priority
0	DMSO	10	1.0	20.5	40	0.1	1
1	THF	10	1.0	PENDING	PENDING	PENDING	1
2	Toluene	10	0.2	PENDING	PENDING	PENDING	1
3	THF	-10	0.1	PENDING	PENDING	PENDING	0
4	DMSO	-10	1.0	PENDING	PENDING	PENDING	0

##### We can also fill out the second entry with their corresponding "observations":

df_edbo.loc[1, 'yield'] = 50.3
df_edbo.loc[1, 'ee'] = 10
df_edbo.loc[1, 'side_product'] = 0.2


df_edbo.head(5)

solvent	T	concentration	yield	ee	side_product	priority
0	DMSO	10	1.0	20.5	40	0.1	1
1	THF	10	1.0	50.3	10	0.2	1
2	Toluene	10	0.2	PENDING	PENDING	PENDING	1
3	THF	-10	0.1	PENDING	PENDING	PENDING	0
4	DMSO	-10	1.0	PENDING	PENDING	PENDING	0

##### Now we can save our dataset as $f{my\_optimization\_round0.csv}$:

df_edbo.to_csv('my_optimization_round0.csv', index=False)


## 4. Running EDBO+ with training data.

##### First let's check our previous data (which include some $f{yield}$, $f{ee}$ and $f{side\_product}$ observations, which will be used to train the model):

df_edbo_round0 = pd.read_csv('my_optimization_round0.csv')
df_edbo_round0.head(5)

	solvent	T	concentration	yield	ee	side_product	priority
0	DMSO	10	1.0	20.5	40	0.1	1
1	THF	10	1.0	50.3	10	0.2	1
2	Toluene	10	0.2	PENDING	PENDING	PENDING	1
3	THF	-10	0.1	PENDING	PENDING	PENDING	0
4	DMSO	-10	1.0	PENDING	PENDING	PENDING	0


##### Now that we have introduced some "observations" in our $f{my\_optimization\_round0.csv}$ file, we can execute EDBO+ to suggest samples using these "observations" as training data.

EDBOplus().run(
    filename='my_optimization_round0.csv',  # Previous scope (including observations).
    objectives=['yield', 'ee', 'side_product'],  # Objectives to be optimized.
    objective_mode=['max', 'max', 'min'],  # Maximize yield and ee but minimize side_product.
    batch=3,  # Number of experiments in parallel that we want to perform in this round.
    columns_features='all', # features to be included in the model.
    init_sampling_method='cvtsampling'  # initialization method.
)





The following columns are categorical and will be encoded using One-Hot-Encoding: ['solvent']
Using EHVI acquisition function.
Using hyperparameters optimized for continuous variables.
Using hyperparameters optimized for continuous variables.
Using hyperparameters optimized for continuous variables.
Number of QMC samples using SobolQMCNormalSampler sampler: 512
Acquisition function optimized.
Predictions obtained and expected improvement obtained.
solvent	T	concentration	yield	ee	side_product	priority
19	THF	-10	0.2	PENDING	PENDING	PENDING	1.0
35	DMSO	25	1.0	PENDING	PENDING	PENDING	1.0
10	DMSO	0	0.2	PENDING	PENDING	PENDING	1.0
7	Toluene	25	1.0	PENDING	PENDING	PENDING	0.0
6	Toluene	25	0.2	PENDING	PENDING	PENDING	0.0
5	Toluene	25	0.1	PENDING	PENDING	PENDING	0.0
17	Toluene	10	1.0	PENDING	PENDING	PENDING	0.0
2	Toluene	10	0.2	PENDING	PENDING	PENDING	0.0
18	Toluene	10	0.1	PENDING	PENDING	PENDING	0.0


##### Again the samples suggested by EDBO+ have $f{priority = +1}$. In addition, we assign $f{priority = -1}$ to the experiments that we have already run (these are at the bottom of the dataset).

```


please read the above example, and help me write code for optimization of my reaction yield. Below are the possible choices of synthesis parameters: 

```
Substrate Concentration 0.025 M, 0.05 M, 0.075 M, 0.1M, 0.125M

Mediator eq. 0, 0.25, 0.5, 0.75, 1

Mediator type NHPI, TCNHPI, QD, DABCO, TEMPO

Electrolyte type LiClO4, LiOTf , Bu4NClO4, Et4NBF4, Bu4NPF6

Co solvent HFIP 0, 1

``` 
First, the code should suggest the 5 initial experiments I should start with and I only want to maximize the reaction yield. If possible, make sure you write all your code in one code block so that I can copy and paste it to Jupyter Notebook to execute directly. You do not need to have further explanation on the codes or other instructions.