diff --git a/.github/workflows/classroom.yml b/.github/workflows/classroom.yml deleted file mode 100644 index 92a4edd..0000000 --- a/.github/workflows/classroom.yml +++ /dev/null @@ -1,28 +0,0 @@ -name: Autograding Tests -'on': -- push -- workflow_dispatch -- repository_dispatch -permissions: - checks: write - actions: read - contents: read -jobs: - run-autograding-tests: - runs-on: ubuntu-latest - if: github.actor != 'github-classroom[bot]' - steps: - - name: Checkout code - uses: actions/checkout@v4 - - name: Hello world test - id: hello-world-test - uses: education/autograding-python-grader@v1 - with: - timeout: 5 - max-score: 5 - - name: Autograding Reporter - uses: education/autograding-grading-reporter@v1 - env: - HELLO-WORLD-TEST_RESULTS: "${{steps.hello-world-test.outputs.result}}" - with: - runners: hello-world-test diff --git a/.gitignore b/.gitignore index 4ded053..21ead1b 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ *.pyc .coverage *.egg-info/ +.venv/ \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..033a4ad --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 AC BO Hackathon + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index da21a6d..e6a8bfb 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,11 @@ -# Autograding Example: Python -This example project is written in Python, and tested with pytest. - -## The assignment -The tests are failing right now because the method isn't outputting the correct string. Fixing this up will make the tests green. - -## Setup command - -See `postCreateCommand` from [`devcontainer.json`](.devcontainer/devcontainer.json). - -## Run command -`pytest` - -## Notes -- pip's install path is not included in the PATH var by default, so without installing via `sudo -H`, pytest would be unaccessible. +# BayBE One more Time - Exploring Corrosion Inhibitors for Materials Design + +[![](https://github.com/AC-BO-Hackathon/project-surface-science-syndicate/blob/main/img/project-cover.png)](https://youtu.be/kIRxGdwmLSY?si=BVYsl7kGDRsUhewH) + +This project focuses on exploring the capabilities of Bayesian optimization, specifically employing BayBE, in the discovery of novel corrosion inhibitors for materials design. Initially, we work with a randomly chosen subset from a comprehensive database of electrochemical responses of small organic molecules for aluminum alloys. Our goal is to assess how Bayesian optimization can speed up the screening process across the design space to identify promising compounds. We compare different strategies for incorporating chemical information, while optimizing the experimental parameters with respect to the inhibitive performance of the screened compounds. Finally, we explore the potential of transfer learning to accelerate corrosion inhibitor discovery for other base materials as well. + + +## References +- Galvão, T.L.P., Ferreira, I., Kuznetsova, A. _et al._ [CORDATA: an open data management web application to select corrosion inhibitors](https://doi.org/10.1038/s41529-022-00259-9). _npj Mater Degrad_ **6**, 48 (2022). +- Özkan, C., Sahlmann, L., Feiler, C. _et al._ [Laying the experimental foundation for corrosion inhibitor discovery through machine learning](https://doi.org/10.1038/s41529-024-00435-z). _npj Mater Degrad_ **8**, 21 (2024). +- Würger, T., Mei, D., Vaghefinazari, B. _et al._ [Exploring structure-property relationships in magnesium dissolution modulators](https://doi.org/10.1038/s41529-020-00148-z). _npj Mater Degrad_ **5**, 2 (2021). diff --git a/baybe-inhibitor.ipynb b/baybe-inhibitor.ipynb new file mode 100644 index 0000000..8ca1038 --- /dev/null +++ b/baybe-inhibitor.ipynb @@ -0,0 +1,4325 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Introduction" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This project will focus on exploring the capabilities of Bayesian optimization, specifically employing BayBE, in the discovery of novel corrosion inhibitors for materials design. Initially, we will work with a randomly chosen subset from a comprehensive database of electrochemical responses of small organic molecules. Our goal is to assess how Bayesian optimization can speed up the screening process across the design space to identify promising compounds. We will compare different strategies for incorporating alloy information, while optimizing the experimental parameters with respect to the inhibitive performance of the screened compounds." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Initialization" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Loading libraries and data files:" + ] + }, + { + "cell_type": "code", + "execution_count": 297, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
SMILESTime_hpHInhib_Concentrat_MSalt_Concentrat_MEfficiency
0C(=O)(C(=O)[O-])[O-]24.04.00.00100.1020.00
1C(=O)(C(=O)[O-])[O-]24.07.00.00050.0512.35
2C(=O)(C(=O)[O-])[O-]24.010.00.00100.1020.00
3C(C(=O)[O-])C(CC(=O)[O-])(C(=O)[O-])O24.04.00.00100.1030.00
4C(C(=O)[O-])C(CC(=O)[O-])(C(=O)[O-])O24.07.00.00050.05-23.95
.....................
510c1ccc2c(c1)[nH]nn224.07.00.00050.0597.95
511c1ccc2c(c1)[nH]nn224.010.00.00100.1090.00
512c1ccc2c(c1)[nH]nn2672.07.00.00100.1098.00
513c1ncn[nH]124.04.00.00100.1030.00
514c1ncn[nH]124.010.00.00100.1090.00
\n", + "

515 rows × 6 columns

\n", + "
" + ], + "text/plain": [ + " SMILES Time_h pH Inhib_Concentrat_M \\\n", + "0 C(=O)(C(=O)[O-])[O-] 24.0 4.0 0.0010 \n", + "1 C(=O)(C(=O)[O-])[O-] 24.0 7.0 0.0005 \n", + "2 C(=O)(C(=O)[O-])[O-] 24.0 10.0 0.0010 \n", + "3 C(C(=O)[O-])C(CC(=O)[O-])(C(=O)[O-])O 24.0 4.0 0.0010 \n", + "4 C(C(=O)[O-])C(CC(=O)[O-])(C(=O)[O-])O 24.0 7.0 0.0005 \n", + ".. ... ... ... ... \n", + "510 c1ccc2c(c1)[nH]nn2 24.0 7.0 0.0005 \n", + "511 c1ccc2c(c1)[nH]nn2 24.0 10.0 0.0010 \n", + "512 c1ccc2c(c1)[nH]nn2 672.0 7.0 0.0010 \n", + "513 c1ncn[nH]1 24.0 4.0 0.0010 \n", + "514 c1ncn[nH]1 24.0 10.0 0.0010 \n", + "\n", + " Salt_Concentrat_M Efficiency \n", + "0 0.10 20.00 \n", + "1 0.05 12.35 \n", + "2 0.10 20.00 \n", + "3 0.10 30.00 \n", + "4 0.05 -23.95 \n", + ".. ... ... \n", + "510 0.05 97.95 \n", + "511 0.10 90.00 \n", + "512 0.10 98.00 \n", + "513 0.10 30.00 \n", + "514 0.10 90.00 \n", + "\n", + "[515 rows x 6 columns]" + ] + }, + "execution_count": 297, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "import os\n", + "\n", + "from baybe import Campaign\n", + "from baybe.objective import Objective\n", + "from baybe.parameters import NumericalDiscreteParameter, SubstanceParameter, CategoricalParameter\n", + "from baybe.recommenders import RandomRecommender, TwoPhaseMetaRecommender\n", + "from baybe.searchspace import SearchSpace\n", + "from baybe.simulation import simulate_scenarios\n", + "from baybe.targets import NumericalTarget\n", + "\n", + "# these are datasets already preprocessed, filtered, and grouped by \n", + "so we have only one row for each unique combination of parameters\n", + "df_AA2024 = pd.read_excel('data/averaged_filtered_AA2024.xlsx')\n", + "df_AA5000 = pd.read_excel('data/averaged_filtered_AA5000.xlsx')\n", + "df_AA6000 = pd.read_excel('data/averaged_filtered_AA6000.xlsx')\n", + "df_AA7075 = pd.read_excel('data/averaged_filtered_AA7075.xlsx')\n", + "df_AA1000 = pd.read_excel('data/averaged_filtered_AA1000.xlsx')\n", + "df_Al = pd.read_excel('data/averaged_filtered_Al.xlsx')\n", + "\n", + "# change this for campaigns on different datasets\n", + "df_active = df_AA2024\n", + "\n", + "\n", + "if df_active is df_AA2024:\n", + " exp_dataset_name = 'AA2024'\n", + "elif df_active is df_AA7075:\n", + " exp_dataset_name = 'AA7075'\n", + "elif df_active is df_AA5000:\n", + " exp_dataset_name = 'AA5000'\n", + "elif df_active is df_AA6000:\n", + " exp_dataset_name = 'AA6000'\n", + "elif df_active is df_AA1000:\n", + " exp_dataset_name = 'AA1000'\n", + "elif df_active is df_Al:\n", + " exp_dataset_name = 'Al'\n", + "\n", + "df_active" + ] + }, + { + "cell_type": "code", + "execution_count": 298, + "metadata": {}, + "outputs": [], + "source": [ + "# def required from baybe package\n", + "lookup = df_active" + ] + }, + { + "cell_type": "code", + "execution_count": 299, + "metadata": {}, + "outputs": [], + "source": [ + "# chemical space dictionary\n", + "unique_SMILES = df_active.SMILES.unique()\n", + "\n", + "def list_to_dict(input_list):\n", + " return {item: item for item in input_list}\n", + "\n", + "smiles_dict =list_to_dict(unique_SMILES)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Defining parameters for the search space" + ] + }, + { + "cell_type": "code", + "execution_count": 300, + "metadata": {}, + "outputs": [], + "source": [ + "# parameters\n", + "\n", + "basic_parameters=[\n", + "NumericalDiscreteParameter(\n", + " name=\"Time_h\",\n", + " values=df_active[\"Time_h\"].unique(),\n", + " # tolerance = 0.004, assume certain experimental noise for each parameter measurement?\n", + "),\n", + "NumericalDiscreteParameter(\n", + " name=\"pH\",\n", + " values=df_active[\"pH\"].unique(),\n", + " ), \n", + "NumericalDiscreteParameter(\n", + " name=\"Inhib_Concentrat_M\",\n", + " values=df_active[\"Inhib_Concentrat_M\"].unique(),\n", + " ),\n", + "NumericalDiscreteParameter(\n", + " name=\"Salt_Concentrat_M\",\n", + " values=df_active[\"Salt_Concentrat_M\"].unique(),\n", + " ),\n", + "]\n", + "\n", + "# mordred\n", + "parameters_mordred = basic_parameters + [\n", + " SubstanceParameter(\n", + " name=\"SMILES\",\n", + " data=smiles_dict,\n", + " encoding=\"MORDRED\", # optional\n", + " decorrelate=0.7, # optional\n", + " ) \n", + " ]\n", + "\n", + "# morgan fingerprints\n", + "parameters_morgan_fp = basic_parameters + [\n", + " SubstanceParameter(\n", + " name=\"SMILES\",\n", + " data=smiles_dict,\n", + " encoding=\"MORGAN_FP\", # optional\n", + " decorrelate=0.7, # optional\n", + " ) \n", + " ]\n", + "\n", + "# rdkit\n", + "parameters_rdkit = basic_parameters + [\n", + " SubstanceParameter(\n", + " name=\"SMILES\",\n", + " data=smiles_dict,\n", + " encoding=\"RDKIT\", # optional\n", + " decorrelate=0.7, # optional\n", + " ) \n", + " ]\n", + "\n", + "# one-hot encoding\n", + "parameters_ohe = basic_parameters + [\n", + " CategoricalParameter(\n", + " name=\"SMILES\",\n", + " values=unique_SMILES,\n", + " encoding=\"OHE\",\n", + " )\n", + " ]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Setting the target" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df_no_target = lookup.drop('Efficiency', axis=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Creating the searchspace\n", + "Multiple searchspaces and parameter groups are initialized to investigate the influence of built-in featurization methods on the Bayesian optimization process." + ] + }, + { + "cell_type": "code", + "execution_count": 301, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# searchspace = SearchSpace.from_dataframe(df = df_no_target, parameters=parameters)\n", + "# print('Print test 1')\n", + "# objective = Objective(\n", + "# mode=\"SINGLE\", targets=[NumericalTarget(name=\"Efficiency\", mode=\"MAX\")]\n", + "# )\n", + "\n", + "\n", + "searchspace_mordred = SearchSpace.from_dataframe(df = df_no_target, parameters=parameters_mordred)\n", + "\n", + "searchspace_morgan = SearchSpace.from_dataframe(df = df_no_target, parameters=parameters_morgan_fp)\n", + "\n", + "searchspace_rdkit = SearchSpace.from_dataframe(df = df_no_target, parameters=parameters_rdkit)\n", + "\n", + "searchspace_ohe = SearchSpace.from_dataframe(df = df_no_target, parameters=parameters_ohe)\n", + "\n", + "\n", + "objective = Objective(\n", + " mode=\"SINGLE\", targets=[NumericalTarget(name=\"Efficiency\", mode=\"MAX\")]\n", + ")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 302, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "SearchSpace(discrete=SubspaceDiscrete(parameters=[NumericalDiscreteParameter(name='Time_h', encoding=None, _values=[0.5, 1.0, 2.0, 3.0, 6.0, 24.0, 48.0, 72.0, 96.0, 120.0, 144.0, 168.0, 192.0, 240.0, 288.0, 336.0, 360.0, 384.0, 432.0, 480.0, 528.0, 576.0, 600.0, 624.0, 672.0], tolerance=0.0), NumericalDiscreteParameter(name='pH', encoding=None, _values=[0.0, 3.3, 4.0, 4.4, 5.4, 5.5, 5.6, 7.0, 10.0], tolerance=0.0), NumericalDiscreteParameter(name='Inhib_Concentrat_M', encoding=None, _values=[1e-05, 5e-05, 0.0001, 0.0002, 0.0003, 0.0004, 0.0005, 0.0006, 0.0008, 0.001, 0.0012, 0.0018, 0.0024, 0.003, 0.005, 0.01, 0.011, 0.021, 0.022, 0.031, 0.033, 0.042, 0.044, 0.05, 0.1], tolerance=0.0), NumericalDiscreteParameter(name='Salt_Concentrat_M', encoding=None, _values=[0.0, 0.01, 0.05, 0.1, 0.5, 0.6], tolerance=0.0), SubstanceParameter(name='SMILES', data={'C(=O)(C(=O)[O-])[O-]': 'C(=O)(C(=O)[O-])[O-]', 'C(C(=O)[O-])C(CC(=O)[O-])(C(=O)[O-])O': 'C(C(=O)[O-])C(CC(=O)[O-])(C(=O)[O-])O', 'C(C(C(C(C(C(=O)[O-])O)O)O)O)O.C(C(C(C(C(C(=O)[O-])O)O)O)O)O.[Fe+2]': 'C(C(C(C(C(C(=O)[O-])O)O)O)O)O.C(C(C(C(C(C(=O)[O-])O)O)O)O)O.[Fe+2]', 'C(C(C(C(C(C(=O)[O-])O)O)O)O)O.C(C(C(C(C(C(=O)[O-])O)O)O)O)O.[Zn+2]': 'C(C(C(C(C(C(=O)[O-])O)O)O)O)O.C(C(C(C(C(C(=O)[O-])O)O)O)O)O.[Zn+2]', 'C1=CC(=C(C=C1O)O)C=NNC(=S)N': 'C1=CC(=C(C=C1O)O)C=NNC(=S)N', 'C1=CC(=C(C=C1SSC2=CC(=C(C=C2)[N+](=O)[O-])C(=O)O)C(=O)O)[N+](=O)[O-]': 'C1=CC(=C(C=C1SSC2=CC(=C(C=C2)[N+](=O)[O-])C(=O)O)C(=O)O)[N+](=O)[O-]', 'C1=CC(=CC(=C1)S)C(=O)O': 'C1=CC(=CC(=C1)S)C(=O)O', 'C1=CC2=NNN=C2C=C1Cl': 'C1=CC2=NNN=C2C=C1Cl', 'C1=CC=C(C(=C1)C=NNC(=S)N)O': 'C1=CC=C(C(=C1)C=NNC(=S)N)O', 'C1COCCN1CCCS(=O)(=O)O': 'C1COCCN1CCCS(=O)(=O)O', 'C1N2CN3CN1CN(C2)C3': 'C1N2CN3CN1CN(C2)C3', 'C=CC(=O)OCCOC(=O)OCCSc1ncccn1': 'C=CC(=O)OCCOC(=O)OCCSc1ncccn1', 'CC(=O)O': 'CC(=O)O', 'CC(=O)SSC(=O)C': 'CC(=O)SSC(=O)C', 'CC1(C(N2C(S1)C(C2=O)NC(=O)C(C3=CC=C(C=C3)O)N)C(=O)O)C': 'CC1(C(N2C(S1)C(C2=O)NC(=O)C(C3=CC=C(C=C3)O)N)C(=O)O)C', 'CCCCCCCC/C=C\\\\CCCCCCCC(=O)O': 'CCCCCCCC/C=C\\\\CCCCCCCC(=O)O', 'CCCCCCCCCCCCCCCCCC(=O)O': 'CCCCCCCCCCCCCCCCCC(=O)O', 'CCCCCCCCCCCCCCN(CC(=O)O[Na])CC(=O)O[Na]': 'CCCCCCCCCCCCCCN(CC(=O)O[Na])CC(=O)O[Na]', 'CCCCCCCCCCCCN(CC(=O)O[Na])CC(=O)O[Na]': 'CCCCCCCCCCCCN(CC(=O)O[Na])CC(=O)O[Na]', 'CCCCCCCCCCCCOS(=O)(=O)O': 'CCCCCCCCCCCCOS(=O)(=O)O', 'CCCCCCCCCCCCc1ccccc1S([O])([O])O': 'CCCCCCCCCCCCc1ccccc1S([O])([O])O', 'CCCCCCCCN(CC(=O)O[Na])CC(=O)O[Na]': 'CCCCCCCCN(CC(=O)O[Na])CC(=O)O[Na]', 'CCCCN(CCCC)C1=NC(=NC(=N1)NC(CCSC)C(=O)O)NC(CCSC)C(=O)O': 'CCCCN(CCCC)C1=NC(=NC(=N1)NC(CCSC)C(=O)O)NC(CCSC)C(=O)O', 'CCCCOP(=O)(OCCCC)O': 'CCCCOP(=O)(OCCCC)O', 'CCN(C(=S)S)CC': 'CCN(C(=S)S)CC', 'CCOc1ccc2c(c1)nc([nH]2)S': 'CCOc1ccc2c(c1)nc([nH]2)S', 'CCSc1nnc(s1)N': 'CCSc1nnc(s1)N', 'CN1C=NC2=C1C(=O)N(C(=O)N2C)C': 'CN1C=NC2=C1C(=O)N(C(=O)N2C)C', 'CNCC(C1=CC(=CC=C1)O)O': 'CNCC(C1=CC(=CC=C1)O)O', 'COC(=O)CCCC1=CNC2=CC=CC=C21': 'COC(=O)CCCC1=CNC2=CC=CC=C21', 'COC(=O)n1nnc2ccccc12': 'COC(=O)n1nnc2ccccc12', 'COCCOC(=O)OCSc1nc2c(s1)cccc2': 'COCCOC(=O)OCSc1nc2c(s1)cccc2', 'COc1ccc2c(c1)[nH]c(=S)[nH]2': 'COc1ccc2c(c1)[nH]c(=S)[nH]2', 'COc1cccc(c1)c1n[nH]c(=S)[nH]1': 'COc1cccc(c1)c1n[nH]c(=S)[nH]1', 'CS[C]1N[N]C(=N1)N': 'CS[C]1N[N]C(=N1)N', 'CSc1[nH]c2c(n1)cc(c(c2)C)C': 'CSc1[nH]c2c(n1)cc(c(c2)C)C', 'CSc1nnc(s1)N': 'CSc1nnc(s1)N', 'Cc1cc(C)nc(n1)S': 'Cc1cc(C)nc(n1)S', 'Cc1ccc(c(c1)n1nc2c(n1)cccc2)O': 'Cc1ccc(c(c1)n1nc2c(n1)cccc2)O', 'Cc1ccc2c(c1)nc([nH]2)S': 'Cc1ccc2c(c1)nc([nH]2)S', 'Cc1n[nH]c(=S)s1': 'Cc1n[nH]c(=S)s1', 'Cc1nsc(c1)N': 'Cc1nsc(c1)N', 'ClC([C]1N[N]C=N1)(Cl)Cl': 'ClC([C]1N[N]C=N1)(Cl)Cl', 'Clc1cc2[nH]c(=S)[nH]c2cc1Cl': 'Clc1cc2[nH]c(=S)[nH]c2cc1Cl', 'Clc1ccc(cc1)CC[C@](C(C)(C)C)(Cn1cncn1)O': 'Clc1ccc(cc1)CC[C@](C(C)(C)C)(Cn1cncn1)O', 'Clc1ccc(cc1Cl)c1n[nH]c(=S)[nH]1': 'Clc1ccc(cc1Cl)c1n[nH]c(=S)[nH]1', 'Clc1ccc2c(c1)[nH]c(n2)S': 'Clc1ccc2c(c1)[nH]c(n2)S', 'Clc1cccc(c1)c1n[nH]c(=S)[nH]1': 'Clc1cccc(c1)c1n[nH]c(=S)[nH]1', 'Cn1cnnc1S': 'Cn1cnnc1S', 'Cn1nnnc1S': 'Cn1nnnc1S', 'N.N.[N+](=O)(O)[O-].[N+](=O)(O)[O-].[N+](=O)([O-])[O-].[N+](=O)([O-])[O-].[N+](=O)([O-])[O-].O.O.O.O.[Ce+3]': 'N.N.[N+](=O)(O)[O-].[N+](=O)(O)[O-].[N+](=O)([O-])[O-].[N+](=O)([O-])[O-].[N+](=O)([O-])[O-].O.O.O.O.[Ce+3]', 'NC(=S)NN=CC1=C(C(=C(C=C1)O)O)O': 'NC(=S)NN=CC1=C(C(=C(C=C1)O)O)O', 'NCC(=O)O': 'NCC(=O)O', 'NO': 'NO', 'Nc1cc(N)nc(n1)S': 'Nc1cc(N)nc(n1)S', 'Nc1cc(S)nc(n1)N': 'Nc1cc(S)nc(n1)N', 'Nc1ccc2c(c1)sc(=S)[nH]2': 'Nc1ccc2c(c1)sc(=S)[nH]2', 'Nc1ccnc(n1)S': 'Nc1ccnc(n1)S', 'Nc1n[nH]c(=S)s1': 'Nc1n[nH]c(=S)s1', 'Nc1n[nH]c(n1)S': 'Nc1n[nH]c(n1)S', 'Nc1n[nH]cn1': 'Nc1n[nH]cn1', 'Nc1nc([nH]n1)C(=O)O': 'Nc1nc([nH]n1)C(=O)O', 'Nc1ncncc1N': 'Nc1ncncc1N', 'Nn1c(NN)nnc1S': 'Nn1c(NN)nnc1S', 'Nn1c(S)nnc1c1ccccc1': 'Nn1c(S)nnc1c1ccccc1', 'Nn1cnnc1': 'Nn1cnnc1', 'O/N=C(/C(=N/O)/C)\\\\C': 'O/N=C(/C(=N/O)/C)\\\\C', 'O/N=C(\\\\C(=N/O)\\\\c1ccco1)/c1ccco1': 'O/N=C(\\\\C(=N/O)\\\\c1ccco1)/c1ccco1', 'O=C([O-])C(O)C(O)C(O)C(O)CO.[Na+]': 'O=C([O-])C(O)C(O)C(O)C(O)CO.[Na+]', 'OC(=O)/C=C/c1ccccc1': 'OC(=O)/C=C/c1ccccc1', 'OC(=O)CCCCC(=O)O': 'OC(=O)CCCCC(=O)O', 'OC(=O)CCCCCCCCCCCCCCC(=O)O': 'OC(=O)CCCCCCCCCCCCCCC(=O)O', 'OC(=O)CCS': 'OC(=O)CCS', 'OC(=O)CN(CC(=O)O)CCN(CC(=O)O)CC(=O)O': 'OC(=O)CN(CC(=O)O)CCN(CC(=O)O)CC(=O)O', 'OC(=O)CS': 'OC(=O)CS', 'OC(=O)Cn1nnnc1S': 'OC(=O)Cn1nnnc1S', 'OC(=O)c1ccc(=S)[nH]c1': 'OC(=O)c1ccc(=S)[nH]c1', 'OC(=O)c1ccc(cc1)N': 'OC(=O)c1ccc(cc1)N', 'OC(=O)c1ccc(cc1)S': 'OC(=O)c1ccc(cc1)S', 'OC(=O)c1ccc(cc1)c1ccccc1': 'OC(=O)c1ccc(cc1)c1ccccc1', 'OC(=O)c1ccccc1': 'OC(=O)c1ccccc1', 'OC(=O)c1ccccc1O': 'OC(=O)c1ccccc1O', 'OC(=O)c1ccccc1S': 'OC(=O)c1ccccc1S', 'OC(=O)c1ccccn1': 'OC(=O)c1ccccn1', 'OC(=O)c1cccnc1': 'OC(=O)c1cccnc1', 'OC(=O)c1cccnc1S': 'OC(=O)c1cccnc1S', 'OC(=O)c1ccncc1': 'OC(=O)c1ccncc1', 'OC(=O)c1n[nH]c(n1)N': 'OC(=O)c1n[nH]c(n1)N', 'OCC(CO)O': 'OCC(CO)O', 'OC[C@H]([C@H]([C@@H]([C@@H](CO)O)O)O)O': 'OC[C@H]([C@H]([C@@H]([C@@H](CO)O)O)O)O', 'OC[C@H]([C@H]([C@@H]([C@H](C(=O)O)O)O)O)O': 'OC[C@H]([C@H]([C@@H]([C@H](C(=O)O)O)O)O)O', 'OC[C@H]1OC(O)[C@H](O)[C@@H](O)[C@@H]1O': 'OC[C@H]1OC(O)[C@H](O)[C@@H](O)[C@@H]1O', 'O[C@H]1C(=O)OCC1(C)C': 'O[C@H]1C(=O)OCC1(C)C', 'Oc1ccc(cc1)C(=O)O': 'Oc1ccc(cc1)C(=O)O', 'Oc1ccc(cc1)S([O])([O])O': 'Oc1ccc(cc1)S([O])([O])O', 'Oc1cccc2c1nccc2': 'Oc1cccc2c1nccc2', 'Oc1ccccc1c1nnc([nH]1)S': 'Oc1ccccc1c1nnc([nH]1)S', 'On1nnc2c1cccc2': 'On1nnc2c1cccc2', 'S=c1[nH]c2c([nH]1)c(=O)n(cn2)C': 'S=c1[nH]c2c([nH]1)c(=O)n(cn2)C', 'S=c1[nH]c2c([nH]1)cncn2': 'S=c1[nH]c2c([nH]1)cncn2', 'S=c1[nH]c2c([nH]1)nccn2': 'S=c1[nH]c2c([nH]1)nccn2', 'S=c1[nH]nc([nH]1)c1cccnc1': 'S=c1[nH]nc([nH]1)c1cccnc1', 'S=c1[nH]nc([nH]1)c1ccco1': 'S=c1[nH]nc([nH]1)c1ccco1', 'S=c1[nH]nc([nH]1)c1ccncc1': 'S=c1[nH]nc([nH]1)c1ccncc1', 'S=c1sc2c([nH]1)cccc2': 'S=c1sc2c([nH]1)cccc2', 'SC#N': 'SC#N', 'S[C]1NC2=C[CH]C=NC2=N1': 'S[C]1NC2=C[CH]C=NC2=N1', 'Sc1n[nH]cn1': 'Sc1n[nH]cn1', 'Sc1nc(N)c(c(n1)S)N': 'Sc1nc(N)c(c(n1)S)N', 'Sc1nc(N)c2c(n1)[nH]nc2': 'Sc1nc(N)c2c(n1)[nH]nc2', 'Sc1nc2c([nH]1)cccc2': 'Sc1nc2c([nH]1)cccc2', 'Sc1ncc[nH]1': 'Sc1ncc[nH]1', 'Sc1ncccn1': 'Sc1ncccn1', 'Sc1nnc(s1)S': 'Sc1nnc(s1)S', '[Cl-].[Cl-].[Cl-].[Ce+3]': '[Cl-].[Cl-].[Cl-].[Ce+3]', '[N+](=O)([O-])[O-].[N+](=O)([O-])[O-].[N+](=O)([O-])[O-].[Ce+3]': '[N+](=O)([O-])[O-].[N+](=O)([O-])[O-].[N+](=O)([O-])[O-].[Ce+3]', '[NH4+].[NH4+].[N+](=O)([O-])[O-].[N+](=O)([O-])[O-].[N+](=O)([O-])[O-].[N+](=O)([O-])[O-].[N+](=O)([O-])[O-].[N+](=O)([O-])[O-].[Ce+4]': '[NH4+].[NH4+].[N+](=O)([O-])[O-].[N+](=O)([O-])[O-].[N+](=O)([O-])[O-].[N+](=O)([O-])[O-].[N+](=O)([O-])[O-].[N+](=O)([O-])[O-].[Ce+4]', '[O-]S(=O)(=O)[O-].[O-]S(=O)(=O)[O-].[O-]S(=O)(=O)[O-].[Ce+3].[Ce+3]': '[O-]S(=O)(=O)[O-].[O-]S(=O)(=O)[O-].[O-]S(=O)(=O)[O-].[Ce+3].[Ce+3]', '[O-]S(=O)[O-].[Na+].[Na+]': '[O-]S(=O)[O-].[Na+].[Na+]', 'c1cc(ccc1c2[nH]c(nn2)S)[N+](=O)[O-]': 'c1cc(ccc1c2[nH]c(nn2)S)[N+](=O)[O-]', 'c1ccc(nc1)c1ccccn1': 'c1ccc(nc1)c1ccccn1', 'c1ccc2c(c1)[nH]nn2': 'c1ccc2c(c1)[nH]nn2', 'c1ncn[nH]1': 'c1ncn[nH]1'}, decorrelate=0.7, encoding=)], exp_rep= Time_h pH Inhib_Concentrat_M Salt_Concentrat_M \\\n", + "0 24.0 4.0 0.0010 0.10 \n", + "1 24.0 7.0 0.0005 0.05 \n", + "2 24.0 10.0 0.0010 0.10 \n", + "3 24.0 4.0 0.0010 0.10 \n", + "4 24.0 7.0 0.0005 0.05 \n", + ".. ... ... ... ... \n", + "510 24.0 7.0 0.0005 0.05 \n", + "511 24.0 10.0 0.0010 0.10 \n", + "512 672.0 7.0 0.0010 0.10 \n", + "513 24.0 4.0 0.0010 0.10 \n", + "514 24.0 10.0 0.0010 0.10 \n", + "\n", + " SMILES \n", + "0 C(=O)(C(=O)[O-])[O-] \n", + "1 C(=O)(C(=O)[O-])[O-] \n", + "2 C(=O)(C(=O)[O-])[O-] \n", + "3 C(C(=O)[O-])C(CC(=O)[O-])(C(=O)[O-])O \n", + "4 C(C(=O)[O-])C(CC(=O)[O-])(C(=O)[O-])O \n", + ".. ... \n", + "510 c1ccc2c(c1)[nH]nn2 \n", + "511 c1ccc2c(c1)[nH]nn2 \n", + "512 c1ccc2c(c1)[nH]nn2 \n", + "513 c1ncn[nH]1 \n", + "514 c1ncn[nH]1 \n", + "\n", + "[515 rows x 5 columns], metadata= was_recommended was_measured dont_recommend\n", + "0 False False False\n", + "1 False False False\n", + "2 False False False\n", + "3 False False False\n", + "4 False False False\n", + ".. ... ... ...\n", + "510 False False False\n", + "511 False False False\n", + "512 False False False\n", + "513 False False False\n", + "514 False False False\n", + "\n", + "[515 rows x 3 columns], empty_encoding=False, constraints=[], comp_rep= Time_h pH Inhib_Concentrat_M Salt_Concentrat_M \\\n", + "0 24.0 4.0 0.0010 0.10 \n", + "1 24.0 7.0 0.0005 0.05 \n", + "2 24.0 10.0 0.0010 0.10 \n", + "3 24.0 4.0 0.0010 0.10 \n", + "4 24.0 7.0 0.0005 0.05 \n", + ".. ... ... ... ... \n", + "510 24.0 7.0 0.0005 0.05 \n", + "511 24.0 10.0 0.0010 0.10 \n", + "512 672.0 7.0 0.0010 0.10 \n", + "513 24.0 4.0 0.0010 0.10 \n", + "514 24.0 10.0 0.0010 0.10 \n", + "\n", + " SMILES_RDKIT_MaxAbsEStateIndex SMILES_RDKIT_MinAbsEStateIndex \\\n", + "0 8.925926 2.185185 \n", + "1 8.925926 2.185185 \n", + "2 8.925926 2.185185 \n", + "3 10.148889 1.357824 \n", + "4 10.148889 1.357824 \n", + ".. ... ... \n", + "510 3.813148 0.914352 \n", + "511 3.813148 0.914352 \n", + "512 3.813148 0.914352 \n", + "513 3.555556 1.444444 \n", + "514 3.555556 1.444444 \n", + "\n", + " SMILES_RDKIT_MinEStateIndex SMILES_RDKIT_qed SMILES_RDKIT_SPS \\\n", + "0 -2.185185 0.287408 7.333333 \n", + "1 -2.185185 0.287408 7.333333 \n", + "2 -2.185185 0.287408 7.333333 \n", + "3 -2.974537 0.454904 10.846154 \n", + "4 -2.974537 0.454904 10.846154 \n", + ".. ... ... ... \n", + "510 0.914352 0.560736 10.222222 \n", + "511 0.914352 0.560736 10.222222 \n", + "512 0.914352 0.560736 10.222222 \n", + "513 1.444444 0.458207 8.000000 \n", + "514 1.444444 0.458207 8.000000 \n", + "\n", + " SMILES_RDKIT_MolWt ... SMILES_RDKIT_fr_nitro \\\n", + "0 88.018 ... 0 \n", + "1 88.018 ... 0 \n", + "2 88.018 ... 0 \n", + "3 189.099 ... 0 \n", + "4 189.099 ... 0 \n", + ".. ... ... ... \n", + "510 119.127 ... 0 \n", + "511 119.127 ... 0 \n", + "512 119.127 ... 0 \n", + "513 69.067 ... 0 \n", + "514 69.067 ... 0 \n", + "\n", + " SMILES_RDKIT_fr_nitro_arom_nonortho SMILES_RDKIT_fr_oxime \\\n", + "0 0 0 \n", + "1 0 0 \n", + "2 0 0 \n", + "3 0 0 \n", + "4 0 0 \n", + ".. ... ... \n", + "510 0 0 \n", + "511 0 0 \n", + "512 0 0 \n", + "513 0 0 \n", + "514 0 0 \n", + "\n", + " SMILES_RDKIT_fr_para_hydroxylation SMILES_RDKIT_fr_phos_acid \\\n", + "0 0 0 \n", + "1 0 0 \n", + "2 0 0 \n", + "3 0 0 \n", + "4 0 0 \n", + ".. ... ... \n", + "510 1 0 \n", + "511 1 0 \n", + "512 1 0 \n", + "513 0 0 \n", + "514 0 0 \n", + "\n", + " SMILES_RDKIT_fr_pyridine SMILES_RDKIT_fr_quatN SMILES_RDKIT_fr_sulfide \\\n", + "0 0 0 0 \n", + "1 0 0 0 \n", + "2 0 0 0 \n", + "3 0 0 0 \n", + "4 0 0 0 \n", + ".. ... ... ... \n", + "510 0 0 0 \n", + "511 0 0 0 \n", + "512 0 0 0 \n", + "513 0 0 0 \n", + "514 0 0 0 \n", + "\n", + " SMILES_RDKIT_fr_tetrazole SMILES_RDKIT_fr_thiazole \n", + "0 0 0 \n", + "1 0 0 \n", + "2 0 0 \n", + "3 0 0 \n", + "4 0 0 \n", + ".. ... ... \n", + "510 0 0 \n", + "511 0 0 \n", + "512 0 0 \n", + "513 0 0 \n", + "514 0 0 \n", + "\n", + "[515 rows x 94 columns]), continuous=SubspaceContinuous(parameters=[], constraints_lin_eq=[], constraints_lin_ineq=[]))" + ] + }, + "execution_count": 302, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "searchspace_rdkit" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Defining the campaign = searchspace + objective" + ] + }, + { + "cell_type": "code", + "execution_count": 303, + "metadata": {}, + "outputs": [], + "source": [ + "campaign_mordred = Campaign(searchspace=searchspace_mordred, objective=objective)\n", + "campaign_morgan = Campaign(searchspace=searchspace_morgan, objective=objective)\n", + "campaign_rdkit = Campaign(searchspace=searchspace_rdkit, objective=objective)\n", + "campaign_ohe = Campaign(searchspace=searchspace_ohe, objective=objective)\n", + "\n", + "# not all randoms are used but checked for differences in behaviour\n", + "campaign_rand_mordred = Campaign(\n", + " searchspace=searchspace_mordred,\n", + " recommender=TwoPhaseMetaRecommender(recommender=RandomRecommender()),\n", + " objective=objective,\n", + ")\n", + "campaign_rand_morgan = Campaign(\n", + " searchspace=searchspace_morgan,\n", + " recommender=TwoPhaseMetaRecommender(recommender=RandomRecommender()),\n", + " objective=objective,\n", + ")\n", + "campaign_rand_rdkit = Campaign(\n", + " searchspace=searchspace_rdkit,\n", + " recommender=TwoPhaseMetaRecommender(recommender=RandomRecommender()),\n", + " objective=objective,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Puttting the campaigns that we are interested in a scenario" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "scenarios = {\"Mordred\": campaign_mordred, #\"Random\": campaign_rand_mordred,\n", + " \"Morgan\": campaign_morgan, #\"Morgan Random\": campaign_rand_morgan,\n", + " \"RDKIT\": campaign_rdkit,\n", + " \"OHE\": campaign_ohe, \n", + " \"Random\": campaign_rand_rdkit\n", + " }" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Start our simulations" + ] + }, + { + "cell_type": "code", + "execution_count": 305, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 0%| | 0/50 [00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "\n", + "max_yield = lookup[\"Efficiency\"].max()\n", + "\n", + "# until 10\n", + "limit = 10\n", + "\n", + "# Create a figure and axis object\n", + "fig, ax1 = plt.subplots()\n", + "\n", + "# Plot the lineplot\n", + "sns.lineplot(\n", + " data=results, x=\"Num_Experiments\", y=\"Efficiency_CumBest\", hue=\"Scenario\", marker=\"x\", ax=ax1, style = 'Scenario'\n", + ")\n", + "\n", + "# Set legend\n", + "ax1.legend(loc=\"lower right\")\n", + "\n", + "# Add a horizontal line\n", + "ax1.plot([0.5, limit+0.5], [max_yield, max_yield], \"--r\", alpha=0.4)\n", + "\n", + "# Set x-axis limit\n", + "ax1.set_xlim(0, limit+1)\n", + "ax1.set_ylim(50, 101)\n", + "\n", + "# Create a new axis for the histogram on the right side\n", + "ax2 = fig.add_axes([0.905, 0.1, 0.05, 0.8])\n", + "ax2.hist(df_active['Efficiency'], bins=2000, color='orange', alpha=0.5, orientation='horizontal') \n", + "ax2.set_ylim(ax1.get_ylim()) \n", + "ax2.set_axis_off() # Hide axis ticks and labels\n", + "\n", + "# Set x and y titles\n", + "ax1.set_xlabel('Number of Experiments')\n", + "ax1.set_ylabel('Cumulative Best Efficiency')\n", + "\n", + "# Save the plot\n", + "plt.savefig(f\"./img/{exp_dataset_name}_simulation_{N_MC_ITERATIONS}MC_{N_DOE_ITERATIONS}exp_{BATCH_SIZE}batch_first{limit}.png\", bbox_inches='tight')\n", + "\n", + "# Show the plot\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 314, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# until 25\n", + "limit = 25\n", + "\n", + "# Create a figure and axis object\n", + "fig, ax1 = plt.subplots()\n", + "\n", + "# Plot the lineplot\n", + "sns.lineplot(\n", + " data=results, x=\"Num_Experiments\", y=\"Efficiency_CumBest\", hue=\"Scenario\", marker=\"x\", ax=ax1, style = 'Scenario'\n", + ")\n", + "\n", + "# Set legend\n", + "ax1.legend(loc=\"lower right\")\n", + "\n", + "# Add a horizontal line\n", + "ax1.plot([0.5, limit+0.5], [max_yield, max_yield], \"--r\", alpha=0.4)\n", + "\n", + "# Set x-axis limit\n", + "ax1.set_xlim(0, limit+1)\n", + "ax1.set_ylim(50, 101)\n", + "\n", + "# Create a new axis for the histogram on the right side\n", + "ax2 = fig.add_axes([0.905, 0.1, 0.05, 0.8])\n", + "ax2.hist(df_active['Efficiency'], bins=2000, color='orange', alpha=0.5, orientation='horizontal') \n", + "ax2.set_ylim(ax1.get_ylim()) \n", + "ax2.set_axis_off() # Hide axis ticks and labels\n", + "\n", + "# Set x and y titles\n", + "ax1.set_xlabel('Number of Experiments')\n", + "ax1.set_ylabel('Cumulative Best Efficiency')\n", + "\n", + "# Save the plot\n", + "plt.savefig(f\"./img/{exp_dataset_name}_simulation_{N_MC_ITERATIONS}MC_{N_DOE_ITERATIONS}exp_{BATCH_SIZE}batch_first{limit}.png\", bbox_inches='tight')\n", + "\n", + "# Show the plot\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 315, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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S8Pv9zN69GjKy8uZNWsWAH369OH6669n3LhxDBw4kKuuuoqTTz6Zv//973H3GDNmDLfeeitDhgzhggsu4PDDD+fdd98F4J133uGbb77hmWeeYezYsUydOpW777477vnPPfcc4XCYZ555hkMOOYTjjz+ehx56iGeffZaysrLYddnZ2cyZM4dhw4Zx8cUXM2zYMGpra/n1r3/NkCFDmD17Nl6vl48++qiT37XkITNe+6m+OyO6UqiGOHaPIMspntoNkVdDYr1UrBdCiHa59A/HtOs63e38nV4wKBPLtOk73CnZM3Bc73bfY18dd9xxPProo4RCIR544AHcbjczZswAwLIs7r77bv7+97+zdetWotEokUiElJT4PN8xY8bEfV9YWEh5eTkAK1eupLi4mKKiotj5SZMmxV2/cuVKxo4dS2pq4z/sJ0+ejG3brFq1ivz8fABGjRqF3iTXJj8/n0MOOST2vcvlIicnJ/baBwOZ8dpPNdSROuQ33POjSuyAB2i5dES3zHiZEXAHJLFeCCHayeNztevhctWvcGgaLrceq9Oou/R232NfpaamMnjwYMaOHcuTTz7JkiVLeOKJJwD47W9/yx/+8Ad++ctf8v777/P5558zffp0otFo/M/p8cR9r2katm3v85ha09LrdNVrA7D8ts65736QwGs/Wdjo7hC1qeHYjFdLMVa3tAtqSKz3+LvhxYUQQnQ2Xdf59a9/zU033URdXR0LFizg9NNP50c/+hFjx45l4MCBrF69ukP3HDFiBJs3b2b79u2xY4sXL252zRdffEEoFIodW7BgAbquM2zYsP37oQ5wEnjtJ58KEFp3LSMWf8+ppgotdsPulvqpUrFeCCEOeGeffTYul4uHH36YIUOG8Pbbb7Nw4UJWrlzJZZddFpdz1R7Tpk1j6NChXHjhhXzxxRd8+OGH3HjjjXHXnH/++fj9fi688EJWrFjB+++/z1VXXcWPf/zj2DKjaJkEXvtJVy7saD4/+fQDsOqnmptMb6n6DtndMuOlFPgksV4IIQ5kbrebK6+8kvvvv59f/OIXHHrooUyfPp1jjz2WgoICzjjjjA7dT9d1XnnlFerq6pgwYQI/+clPuOuuu+KuSUlJ4c0332T37t0cccQRfP/73+eEE07goYceSuBPdmDSlFJq75cd2ILBIJmZmVRVVZGRkdHiNeu/Ws6iF14iLT8bt6dxT8JaI8Jj+jz++My3rBlzP7bu4dQTykgZMBgA21bU1SqKStz4/F0YfdkW1JRDyZGQkt11ryuEEEkuHA6zYcMGBgwYgN8vqRjJrq3fV7PP7+W3Nb/BmBaOdSPZ1bifopi4UzewrbeKlZOwUwtj55UCvb69Q5eSivVCCCFE0pHAaz8FVAp1W37IbycrrjbW0ldPw+stjp1Xiu5ZajTrwJMqFeuFEEKIJCI5XvvJrXyY1WPQa0Yx2L+Qw11PkrZ7Qey8sp1SEl2eXG9GINCrGyu3CiGEEGJPMuO1n2q0GnwFr/KDxVuo9Ezmq6x8xuesj51Xyol9unzGy7bBl9bFLyqEEEKItsiM136q1cJ4ey1m6tqtbEs9iq+M72BrjfFsLPDqyokn2wLdJfldQgjRBtlb1jMcaL8nCbz2k99OIbJjGrrlpv/G/zLO9U/0pu+qUug6XZtcH0usl1ZBQgixp4bK6bW1td08EtEeDb+nPSve91Sy1Lif/CqV6M5peKz5DNz4PwaOKMdwnR07r1TLLYQ6lRl2Zrvcsk1aCCH25HK5yMrKivUHTElJ6fqd52KvlFLU1tZSXl5OVlYWLte+t1lKJhJ47aeQFsLTayFK19jS5xjCZiWDaPyPQyln1a9LmRHIKJLEeiGEaEVBQQHAQdWcuafKysqK/b4OBBJ47aegVo2/4N8oPcDqIeew2oBB2iux890SeCkbfOld/KJCCNFzaJpGYWEheXl5GIbR3cMRrfB4PAfMTFcDCbz2k1f5MYKj+aKkEgANKy7ScpYau3BAtuXMdElivRBC7JXL5TrgPthFckvq5PrbbrsNrb7qe8Nj+PDhsfPhcJgrrriCnJwc0tLSmDFjRoebge6vdLsX4a3n849RlwKgobACjQ1ClQ26qwuX/CxJrBdCCCGSVVIHXgCjRo1i+/btscdHH30UO3fttdfyn//8h3/84x/Mnz+fbdu2cdZZZ3Xp+MKEcaWsQ3lLnQOaTiR/cuMFXV081QiDOyCJ9UIIIUQSSvqlRrfb3WJSXVVVFU888QTPPfccxx9/PABPPfUUI0aMYPHixRx55JFdMr6drh2klPyTS/6ez+6SG4E9640otK6MvMwIpBdKYr0QQgiRhJI+8FqzZg1FRUX4/X4mTZrEPffcQ0lJCZ9++imGYTBt2rTYtcOHD6ekpIRFixa1GXhFIhEikUjs+6qqKsDpct6a6poaaiMR9LowbrMxH8CMmhhWNoVbwmwtCOHSDGoqq9CsHOd5IYU/5EJ1VaJXdTWkAG38LEIIIcSBoOFzuycVWU3qwGvixIk8/fTTDBs2jO3bt3P77bdz9NFHs2LFCkpLS/F6vWRlZcU9Jz8/n9LS0jbve88993D77bc3O15cXNzC1e1zHMCX3wPguif3+TZCCCGE6KDq6moyMzNbPrn8to7dbEwHr++gpA68TjnllNjXY8aMYeLEifTr14+///3vBAL7njw+e/Zsrrvuutj3lZWV9OvXj02bNrX+ixOdKhgMUlxczObNm8nIyOju4RyU5HfQ/eR3kBzk99D92vs7UEpRXV1NUVFRF45u/yR14LWnrKwshg4dytq1aznxxBOJRqNUVlbGzXqVlZXttdCaz+fD5/M1O56ZmSn/k3WzjIwM+R10M/kddD/5HSQH+T10v/b8DnrahEnS72psqqamhnXr1lFYWMhhhx2Gx+Ph3XffjZ1ftWoVmzZtYtKkSd04SiGEEEKIliX1jNf111/PaaedRr9+/di2bRu33norLpeL8847j8zMTC655BKuu+46srOzycjI4KqrrmLSpEldtqNRCCGEEKIjkjrw2rJlC+eddx67du0iNzeXKVOmsHjxYnJzcwF44IEH0HWdGTNmEIlEmD59Oo888kiHX8fn83Hrrbe2uPwouob8Drqf/A66n/wOkoP8HrrfPv8OOjkxPhE01ZP2YAohhBBC9GA9KsdLCCGEEKInk8BLCCGEEKKLSOAlhBBCCNFFJPASQgghhOgiB33g9fDDD9O/f3/8fj8TJ07k448/7u4hHdA++OADTjvtNIqKitA0jVdffTXuvFKKW265hcLCQgKBANOmTWPNmjXdM9gD0D333MMRRxxBeno6eXl5nHHGGaxatSrumnA4zBVXXEFOTg5paWnMmDGDsrKybhrxgenRRx9lzJgxseKQkyZN4vXXX4+dl99B17v33nvRNI1rrrkmdkx+D53rtttuQ9O0uMfw4cNj5w/U9/+gDrxefPFFrrvuOm699VaWLVvG2LFjmT59OuXl5d09tANWKBRi7NixPPzwwy2ev//++5kzZw6PPfYYS5YsITU1lenTpxMOh7t4pAem+fPnc8UVV7B48WLefvttDMPgpJNOIhQKxa659tpr+c9//sM//vEP5s+f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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# all experiments\n", + "\n", + "# until 50\n", + "limit = 50\n", + "\n", + "# Create a figure and axis object\n", + "fig, ax1 = plt.subplots()\n", + "\n", + "# Plot the lineplot\n", + "sns.lineplot(\n", + " data=results, x=\"Num_Experiments\", y=\"Efficiency_CumBest\", hue=\"Scenario\", marker=\"x\", ax=ax1, style = 'Scenario'\n", + ")\n", + "\n", + "# Set legend\n", + "ax1.legend(loc=\"lower right\")\n", + "\n", + "# Add a horizontal line\n", + "ax1.plot([0.5, limit+0.5], [max_yield, max_yield], \"--r\", alpha=0.4)\n", + "\n", + "# Set x-axis limit\n", + "ax1.set_xlim(0, limit+1)\n", + "ax1.set_ylim(50, 101)\n", + "\n", + "# Create a new axis for the histogram on the right side\n", + "ax2 = fig.add_axes([0.905, 0.1, 0.05, 0.8])\n", + "ax2.hist(df_active['Efficiency'], bins=2000, color='orange', alpha=0.5, orientation='horizontal') \n", + "ax2.set_ylim(ax1.get_ylim()) \n", + "ax2.set_axis_off() # Hide axis ticks and labels\n", + "\n", + "# Set x and y titles\n", + "ax1.set_xlabel('Number of Experiments')\n", + "ax1.set_ylabel('Cumulative Best Efficiency')\n", + "\n", + "# Save the plot\n", + "plt.savefig(f\"./img/{exp_dataset_name}_simulation_{N_MC_ITERATIONS}MC_{N_DOE_ITERATIONS}exp_{BATCH_SIZE}batch_first{limit}.png\", bbox_inches='tight')\n", + "\n", + "# Show the plot\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 310, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ScenarioRandom_SeedIterationNum_ExperimentsEfficiency_MeasurementsEfficiency_IterBestEfficiency_CumBest
0Mordred133701[10.0]10.00000010.000000
1Mordred133712[96.43666666666667]96.43666796.436667
2Mordred133723[25.25]25.25000096.436667
3Mordred133734[99.21666666666665]99.21666799.216667
4Mordred133745[93.8]93.80000099.216667
........................
2495Random13464546[99.9]99.900000100.000000
2496Random13464647[40.0]40.000000100.000000
2497Random13464748[10.0]10.000000100.000000
2498Random13464849[91.7]91.700000100.000000
2499Random13464950[0.0]0.000000100.000000
\n", + "

2500 rows × 7 columns

\n", + "
" + ], + "text/plain": [ + " Scenario Random_Seed Iteration Num_Experiments \\\n", + "0 Mordred 1337 0 1 \n", + "1 Mordred 1337 1 2 \n", + "2 Mordred 1337 2 3 \n", + "3 Mordred 1337 3 4 \n", + "4 Mordred 1337 4 5 \n", + "... ... ... ... ... \n", + "2495 Random 1346 45 46 \n", + "2496 Random 1346 46 47 \n", + "2497 Random 1346 47 48 \n", + "2498 Random 1346 48 49 \n", + "2499 Random 1346 49 50 \n", + "\n", + " Efficiency_Measurements Efficiency_IterBest Efficiency_CumBest \n", + "0 [10.0] 10.000000 10.000000 \n", + "1 [96.43666666666667] 96.436667 96.436667 \n", + "2 [25.25] 25.250000 96.436667 \n", + "3 [99.21666666666665] 99.216667 99.216667 \n", + "4 [93.8] 93.800000 99.216667 \n", + "... ... ... ... \n", + "2495 [99.9] 99.900000 100.000000 \n", + "2496 [40.0] 40.000000 100.000000 \n", + "2497 [10.0] 10.000000 100.000000 \n", + "2498 [91.7] 91.700000 100.000000 \n", + "2499 [0.0] 0.000000 100.000000 \n", + "\n", + "[2500 rows x 7 columns]" + ] + }, + "execution_count": 310, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Transfer Learning\n", + "### Use transfer learning to gain information from prior experimental campaigns." + ] + }, + { + "cell_type": "code", + "execution_count": 317, + "metadata": {}, + "outputs": [], + "source": [ + "df_active = df_AA2024\n", + "df_transfer = df_AA1000" + ] + }, + { + "cell_type": "code", + "execution_count": 318, + "metadata": {}, + "outputs": [], + "source": [ + "from baybe.parameters import TaskParameter\n", + "\n", + "taskparam = TaskParameter(\n", + " name=\"Al_alloys\",\n", + " values=[\"AA1000\", \"AA2024\"],\n", + " active_values=[\"AA2024\"],\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 321, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Time_hpHInhib_Concentrat_MSalt_Concentrat_MEfficiency
count848.000000848.0000008.480000e+02848.000000848.000000
mean126.8431604.1895806.352976e-020.08896235.066659
std192.0556763.6961833.690920e-010.227758245.617010
min0.000000-0.6000001.000000e-070.000000-4834.000000
25%6.0000000.0000005.000000e-040.00000035.000000
50%24.0000004.0000001.000000e-030.01000060.000000
75%144.0000007.0000004.200000e-030.10000080.507500
max720.00000013.0000003.280000e+002.000000100.000000
\n", + "
" + ], + "text/plain": [ + " Time_h pH Inhib_Concentrat_M Salt_Concentrat_M \\\n", + "count 848.000000 848.000000 8.480000e+02 848.000000 \n", + "mean 126.843160 4.189580 6.352976e-02 0.088962 \n", + "std 192.055676 3.696183 3.690920e-01 0.227758 \n", + "min 0.000000 -0.600000 1.000000e-07 0.000000 \n", + "25% 6.000000 0.000000 5.000000e-04 0.000000 \n", + "50% 24.000000 4.000000 1.000000e-03 0.010000 \n", + "75% 144.000000 7.000000 4.200000e-03 0.100000 \n", + "max 720.000000 13.000000 3.280000e+00 2.000000 \n", + "\n", + " Efficiency \n", + "count 848.000000 \n", + "mean 35.066659 \n", + "std 245.617010 \n", + "min -4834.000000 \n", + "25% 35.000000 \n", + "50% 60.000000 \n", + "75% 80.507500 \n", + "max 100.000000 " + ] + }, + "execution_count": 321, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "df_combined = pd.concat([df_active, df_transfer], axis=0)\n", + "df_combined.describe()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 332, + "metadata": {}, + "outputs": [], + "source": [ + "unique_SMILES_transfer = df_transfer[\"SMILES\"].unique()\n", + "unique_SMILES = df_combined[\"SMILES\"].unique()" + ] + }, + { + "cell_type": "code", + "execution_count": 333, + "metadata": {}, + "outputs": [], + "source": [ + "from baybe.parameters import NumericalContinuousParameter, CategoricalParameter, NumericalDiscreteParameter\n", + "from baybe.searchspace import SearchSpace\n", + "\n", + "transfer_parameters=[\n", + "NumericalDiscreteParameter(\n", + " name=\"Time_h\",\n", + " values=df_combined[\"Time_h\"].unique(),\n", + " tolerance=5/60,\n", + "),\n", + "NumericalDiscreteParameter(\n", + " name=\"pH\",\n", + " values=df_combined[\"pH\"].unique(),\n", + " ), \n", + "NumericalDiscreteParameter(\n", + " name=\"Inhib_Concentrat_M\",\n", + " values=df_combined[\"Inhib_Concentrat_M\"].unique(),\n", + " ),\n", + "NumericalDiscreteParameter(\n", + " name=\"Salt_Concentrat_M\",\n", + " values=df_combined[\"Salt_Concentrat_M\"].unique(),\n", + " ),\n", + "CategoricalParameter(\n", + " name=\"SMILES\",\n", + " values=unique_SMILES,\n", + " encoding=\"OHE\",\n", + " )\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": 334, + "metadata": {}, + "outputs": [], + "source": [ + "searchspace_transfer = SearchSpace.from_dataframe(df_transfer.drop(\"Efficiency\", axis = 1), transfer_parameters)\n", + "\n", + "campaign_transfer = Campaign(searchspace_transfer, objective)" + ] + }, + { + "cell_type": "code", + "execution_count": 328, + "metadata": {}, + "outputs": [], + "source": [ + "df_features = df_active.drop(\"Efficiency\", axis = 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 335, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 0%| | 0/10 [00:00\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Time_hpHInhib_Concentrat_MSalt_Concentrat_MEfficiency
count258.000000258.000000258.000000258.000000258.000000
mean167.6027136.6360470.0073860.11790728.268191
std220.4887882.1496130.0132020.166813265.800655
min0.5000000.0000000.0000100.000000-3813.000000
25%24.0000005.4000000.0010000.05000030.000000
50%24.0000007.0000000.0010000.10000055.000000
75%240.0000007.0000000.0045000.10000089.000000
max672.00000010.0000000.0440000.600000100.000000
\n", + "" + ], + "text/plain": [ + " Time_h pH Inhib_Concentrat_M Salt_Concentrat_M \\\n", + "count 258.000000 258.000000 258.000000 258.000000 \n", + "mean 167.602713 6.636047 0.007386 0.117907 \n", + "std 220.488788 2.149613 0.013202 0.166813 \n", + "min 0.500000 0.000000 0.000010 0.000000 \n", + "25% 24.000000 5.400000 0.001000 0.050000 \n", + "50% 24.000000 7.000000 0.001000 0.100000 \n", + "75% 240.000000 7.000000 0.004500 0.100000 \n", + "max 672.000000 10.000000 0.044000 0.600000 \n", + "\n", + " Efficiency \n", + "count 258.000000 \n", + "mean 28.268191 \n", + "std 265.800655 \n", + "min -3813.000000 \n", + "25% 30.000000 \n", + "50% 55.000000 \n", + "75% 89.000000 \n", + "max 100.000000 " + ] + }, + "execution_count": 338, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fraction_df.describe()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "concatenated_df = pd.concat([result_fresh_start, result_transfer_learning], axis=0, ignore_index=True)\n", + "concatenated_df" + ] + }, + { + "cell_type": "code", + "execution_count": 339, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 339, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# until 50\n", + "limit = 50\n", + "exp_dataset_name = 'transferAA1000_to_AA2024'\n", + "sns.lineplot(\n", + " data=concatenated_df, x=\"Num_Experiments\", y=\"Efficiency_CumBest\", hue=\"Scenario\", marker=\"x\"\n", + ")\n", + "plt.plot([0.5, N_DOE_ITERATIONS+0.5], [max_yield, max_yield], \"--r\", alpha=0.4)\n", + "plt.legend(loc=\"lower right\")\n", + "import matplotlib.pyplot as plt\n", + "\n", + "plt.xlim(0, limit+1)\n", + "plt.savefig(f\"./img/{exp_dataset_name}_simulation_{N_MC_ITERATIONS}MC_{N_DOE_ITERATIONS}exp_{BATCH_SIZE}batch_first25.png\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/data/averaged_filtered_AA1000.xlsx b/data/averaged_filtered_AA1000.xlsx new file mode 100644 index 0000000..089f2d5 Binary files /dev/null and b/data/averaged_filtered_AA1000.xlsx differ diff --git a/data/averaged_filtered_AA2024.xlsx b/data/averaged_filtered_AA2024.xlsx new file mode 100644 index 0000000..6c9b7f0 Binary files /dev/null and b/data/averaged_filtered_AA2024.xlsx differ diff --git a/data/averaged_filtered_AA5000.xlsx b/data/averaged_filtered_AA5000.xlsx new file mode 100644 index 0000000..bf57530 Binary files /dev/null and b/data/averaged_filtered_AA5000.xlsx differ diff --git a/data/averaged_filtered_AA6000.xlsx b/data/averaged_filtered_AA6000.xlsx new file mode 100644 index 0000000..710375a Binary files /dev/null and b/data/averaged_filtered_AA6000.xlsx differ diff --git a/data/averaged_filtered_AA7075.xlsx b/data/averaged_filtered_AA7075.xlsx new file mode 100644 index 0000000..cc107e0 Binary files /dev/null and b/data/averaged_filtered_AA7075.xlsx differ diff --git a/data/averaged_filtered_Al.xlsx b/data/averaged_filtered_Al.xlsx new file mode 100644 index 0000000..a5269d6 Binary files /dev/null and b/data/averaged_filtered_Al.xlsx differ diff --git a/hello.py b/hello.py deleted file mode 100644 index a025bbf..0000000 --- a/hello.py +++ /dev/null @@ -1,2 +0,0 @@ -def hello_world(): - return "Hello!" diff --git a/hello_test.py b/hello_test.py deleted file mode 100644 index 708a061..0000000 --- a/hello_test.py +++ /dev/null @@ -1,5 +0,0 @@ -import hello - - -def test_hello(): - assert hello.hello_world() == "Hello World!" diff --git a/img/AA1000_simulation_10MC_50exp_1batch.png b/img/AA1000_simulation_10MC_50exp_1batch.png new file mode 100644 index 0000000..e18ac81 Binary files /dev/null and b/img/AA1000_simulation_10MC_50exp_1batch.png differ diff --git a/img/AA1000_simulation_10MC_50exp_1batch_first10.png b/img/AA1000_simulation_10MC_50exp_1batch_first10.png new file mode 100644 index 0000000..7aa3d1c Binary files /dev/null and b/img/AA1000_simulation_10MC_50exp_1batch_first10.png differ diff --git a/img/AA1000_simulation_10MC_50exp_1batch_first25.png b/img/AA1000_simulation_10MC_50exp_1batch_first25.png new file mode 100644 index 0000000..62b8636 Binary files /dev/null and b/img/AA1000_simulation_10MC_50exp_1batch_first25.png differ diff --git a/img/AA1000_simulation_10MC_50exp_1batch_first50.png b/img/AA1000_simulation_10MC_50exp_1batch_first50.png new file mode 100644 index 0000000..23ff607 Binary files /dev/null and b/img/AA1000_simulation_10MC_50exp_1batch_first50.png differ diff --git a/img/AA2024_simulation_10MC_50exp_1batch.png b/img/AA2024_simulation_10MC_50exp_1batch.png new file mode 100644 index 0000000..437d9e5 Binary files /dev/null and b/img/AA2024_simulation_10MC_50exp_1batch.png differ diff --git a/img/AA2024_simulation_10MC_50exp_1batch_first10.png b/img/AA2024_simulation_10MC_50exp_1batch_first10.png new file mode 100644 index 0000000..b2eb984 Binary files /dev/null and b/img/AA2024_simulation_10MC_50exp_1batch_first10.png differ diff --git a/img/AA2024_simulation_10MC_50exp_1batch_first25.png b/img/AA2024_simulation_10MC_50exp_1batch_first25.png new file mode 100644 index 0000000..ca39a1c Binary files /dev/null and b/img/AA2024_simulation_10MC_50exp_1batch_first25.png differ diff --git a/img/AA2024_simulation_10MC_50exp_1batch_first50.png b/img/AA2024_simulation_10MC_50exp_1batch_first50.png new file mode 100644 index 0000000..1d0a672 Binary files /dev/null and b/img/AA2024_simulation_10MC_50exp_1batch_first50.png differ diff --git a/img/AA5000_simulation_10MC_50exp_1batch.png b/img/AA5000_simulation_10MC_50exp_1batch.png new file mode 100644 index 0000000..63ddb45 Binary files /dev/null and b/img/AA5000_simulation_10MC_50exp_1batch.png differ diff --git a/img/AA5000_simulation_10MC_50exp_1batch_first10.png b/img/AA5000_simulation_10MC_50exp_1batch_first10.png new file mode 100644 index 0000000..871b5aa Binary files /dev/null and b/img/AA5000_simulation_10MC_50exp_1batch_first10.png differ diff --git a/img/AA5000_simulation_10MC_50exp_1batch_first25.png b/img/AA5000_simulation_10MC_50exp_1batch_first25.png new file mode 100644 index 0000000..53f70dc Binary files /dev/null and b/img/AA5000_simulation_10MC_50exp_1batch_first25.png differ diff --git a/img/AA5000_simulation_10MC_50exp_1batch_first50.png b/img/AA5000_simulation_10MC_50exp_1batch_first50.png new file mode 100644 index 0000000..5b2eb46 Binary files /dev/null and b/img/AA5000_simulation_10MC_50exp_1batch_first50.png differ diff --git a/img/AA6000_simulation_10MC_50exp_1batch.png b/img/AA6000_simulation_10MC_50exp_1batch.png new file mode 100644 index 0000000..235673d Binary files /dev/null and b/img/AA6000_simulation_10MC_50exp_1batch.png differ diff --git a/img/AA6000_simulation_10MC_50exp_1batch_first10.png b/img/AA6000_simulation_10MC_50exp_1batch_first10.png new file mode 100644 index 0000000..10436b5 Binary files /dev/null and b/img/AA6000_simulation_10MC_50exp_1batch_first10.png differ diff --git a/img/AA6000_simulation_10MC_50exp_1batch_first25.png b/img/AA6000_simulation_10MC_50exp_1batch_first25.png new file mode 100644 index 0000000..fcccae7 Binary files /dev/null and b/img/AA6000_simulation_10MC_50exp_1batch_first25.png differ diff --git a/img/AA6000_simulation_10MC_50exp_1batch_first50.png b/img/AA6000_simulation_10MC_50exp_1batch_first50.png new file mode 100644 index 0000000..8f3d3d6 Binary files /dev/null and b/img/AA6000_simulation_10MC_50exp_1batch_first50.png differ diff --git a/img/AA7075_simulation_10MC_50exp_1batch.png b/img/AA7075_simulation_10MC_50exp_1batch.png new file mode 100644 index 0000000..1e54851 Binary files /dev/null and b/img/AA7075_simulation_10MC_50exp_1batch.png differ diff --git a/img/AA7075_simulation_10MC_50exp_1batch_first10.png b/img/AA7075_simulation_10MC_50exp_1batch_first10.png new file mode 100644 index 0000000..972f2e6 Binary files /dev/null and b/img/AA7075_simulation_10MC_50exp_1batch_first10.png differ diff --git a/img/AA7075_simulation_10MC_50exp_1batch_first25.png b/img/AA7075_simulation_10MC_50exp_1batch_first25.png new file mode 100644 index 0000000..c923c2f Binary files /dev/null and b/img/AA7075_simulation_10MC_50exp_1batch_first25.png differ diff --git a/img/AA7075_simulation_10MC_50exp_1batch_first50.png b/img/AA7075_simulation_10MC_50exp_1batch_first50.png new file mode 100644 index 0000000..8cb16b5 Binary files /dev/null and b/img/AA7075_simulation_10MC_50exp_1batch_first50.png differ diff --git a/img/Al_simulation_10MC_50exp_1batch.png b/img/Al_simulation_10MC_50exp_1batch.png new file mode 100644 index 0000000..ab01cbc Binary files /dev/null and b/img/Al_simulation_10MC_50exp_1batch.png differ diff --git a/img/Al_simulation_10MC_50exp_1batch_first10.png b/img/Al_simulation_10MC_50exp_1batch_first10.png new file mode 100644 index 0000000..7d1def6 Binary files /dev/null and b/img/Al_simulation_10MC_50exp_1batch_first10.png differ diff --git a/img/Al_simulation_10MC_50exp_1batch_first25.png b/img/Al_simulation_10MC_50exp_1batch_first25.png new file mode 100644 index 0000000..2c9aefe Binary files /dev/null and b/img/Al_simulation_10MC_50exp_1batch_first25.png differ diff --git a/img/Al_simulation_10MC_50exp_1batch_first50.png b/img/Al_simulation_10MC_50exp_1batch_first50.png new file mode 100644 index 0000000..0f306d1 Binary files /dev/null and b/img/Al_simulation_10MC_50exp_1batch_first50.png differ diff --git a/img/project-cover.png b/img/project-cover.png new file mode 100644 index 0000000..f1e8e47 Binary files /dev/null and b/img/project-cover.png differ diff --git a/img/transferAA1000_to_AA2024_simulation_10MC_50exp_1batch_first25.png b/img/transferAA1000_to_AA2024_simulation_10MC_50exp_1batch_first25.png new file mode 100644 index 0000000..96c5873 Binary files /dev/null and b/img/transferAA1000_to_AA2024_simulation_10MC_50exp_1batch_first25.png differ diff --git a/img/transferAA1000_to_AA2024_simulation_10MC_50exp_1batch_first50.png b/img/transferAA1000_to_AA2024_simulation_10MC_50exp_1batch_first50.png new file mode 100644 index 0000000..d19a666 Binary files /dev/null and b/img/transferAA1000_to_AA2024_simulation_10MC_50exp_1batch_first50.png differ diff --git a/legacy_code/Alex6022/Scenarios b/legacy_code/Alex6022/Scenarios new file mode 100644 index 0000000..8ff4416 Binary files /dev/null and b/legacy_code/Alex6022/Scenarios differ diff --git a/legacy_code/Alex6022/Scenarios.png b/legacy_code/Alex6022/Scenarios.png new file mode 100644 index 0000000..b38ca2a Binary files /dev/null and b/legacy_code/Alex6022/Scenarios.png differ diff --git a/legacy_code/Alex6022/baybe-inhibitor Legacy.ipynb b/legacy_code/Alex6022/baybe-inhibitor Legacy.ipynb new file mode 100644 index 0000000..a1eb343 --- /dev/null +++ b/legacy_code/Alex6022/baybe-inhibitor Legacy.ipynb @@ -0,0 +1,703 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Introduction" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This project will focus on exploring the capabilities of Bayesian optimization, specifically employing BayBE, in the discovery of novel corrosion inhibitors for materials design. Initially, we will work with a randomly chosen subset from a comprehensive database of electrochemical responses of small organic molecules. Our goal is to assess how Bayesian optimization can speed up the screening process across the design space to identify promising compounds. We will compare different strategies for incorporating alloy information, while optimizing the experimental parameters with respect to the inhibitive performance of the screened compounds." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Initizalization" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Loading libraries and data files:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/vscode/.local/lib/python3.10/site-packages/baybe/telemetry.py:222: UserWarning: WARNING: BayBE Telemetry endpoint https://public.telemetry.baybe.p.uptimize.merckgroup.com:4317 cannot be reached. Disabling telemetry. The exception encountered was: ConnectionError, HTTPConnectionPool(host='verkehrsnachrichten.merck.de', port=80): Max retries exceeded with url: / (Caused by NameResolutionError(\": Failed to resolve 'verkehrsnachrichten.merck.de' ([Errno -2] Name or service not known)\"))\n", + " warnings.warn(\n", + "/home/vscode/.local/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "from baybe import Campaign\n", + "\n", + "df_AA2024 = pd.read_excel('data/filtered_AA2024.xlsx')\n", + "df_AA1000 = pd.read_excel('data/filtered_AA1000.xlsx')\n", + "df_Al = pd.read_excel('data/filtered_Al.xlsx')" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Time_hpHInhib_Concentrat_MSalt_Concentrat_MEfficiency
count1966.0000001966.0000001.966000e+031966.0000001966.000000
mean71.3323093.6265852.918525e-020.07765548.383540
std154.5943254.0895422.442926e-010.217774163.164194
min0.000000-0.6000001.000000e-070.000000-4834.000000
25%1.6700000.0000001.000000e-040.00000035.602500
50%24.0000001.0000001.000000e-030.00000061.490000
75%24.0000007.0000002.000000e-030.10000082.000000
max720.00000014.3010303.280000e+002.000000100.000000
\n", + "
" + ], + "text/plain": [ + " Time_h pH Inhib_Concentrat_M Salt_Concentrat_M \\\n", + "count 1966.000000 1966.000000 1.966000e+03 1966.000000 \n", + "mean 71.332309 3.626585 2.918525e-02 0.077655 \n", + "std 154.594325 4.089542 2.442926e-01 0.217774 \n", + "min 0.000000 -0.600000 1.000000e-07 0.000000 \n", + "25% 1.670000 0.000000 1.000000e-04 0.000000 \n", + "50% 24.000000 1.000000 1.000000e-03 0.000000 \n", + "75% 24.000000 7.000000 2.000000e-03 0.100000 \n", + "max 720.000000 14.301030 3.280000e+00 2.000000 \n", + "\n", + " Efficiency \n", + "count 1966.000000 \n", + "mean 48.383540 \n", + "std 163.164194 \n", + "min -4834.000000 \n", + "25% 35.602500 \n", + "50% 61.490000 \n", + "75% 82.000000 \n", + "max 100.000000 " + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_AA1000.describe()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Time_hpHInhib_Concentrat_MSalt_Concentrat_MEfficiency
count611.000000611.000000611.000000611.000000611.000000
mean135.8019646.3420620.0068080.14545026.736841
std201.6838672.5290800.0140590.200575288.788317
min0.5000000.0000000.0000100.000000-4834.000000
25%24.0000004.0000000.0005000.01000030.000000
50%24.0000007.0000000.0010000.10000058.000000
75%144.0000007.0000000.0030000.10000087.950000
max672.00000010.0000000.1000000.600000100.000000
\n", + "
" + ], + "text/plain": [ + " Time_h pH Inhib_Concentrat_M Salt_Concentrat_M \\\n", + "count 611.000000 611.000000 611.000000 611.000000 \n", + "mean 135.801964 6.342062 0.006808 0.145450 \n", + "std 201.683867 2.529080 0.014059 0.200575 \n", + "min 0.500000 0.000000 0.000010 0.000000 \n", + "25% 24.000000 4.000000 0.000500 0.010000 \n", + "50% 24.000000 7.000000 0.001000 0.100000 \n", + "75% 144.000000 7.000000 0.003000 0.100000 \n", + "max 672.000000 10.000000 0.100000 0.600000 \n", + "\n", + " Efficiency \n", + "count 611.000000 \n", + "mean 26.736841 \n", + "std 288.788317 \n", + "min -4834.000000 \n", + "25% 30.000000 \n", + "50% 58.000000 \n", + "75% 87.950000 \n", + "max 100.000000 " + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_AA2024.describe()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Time_hpHInhib_Concentrat_MSalt_Concentrat_MEfficiency
count1966.0000001966.0000001.966000e+031966.0000001966.000000
mean71.3323093.6265852.918525e-020.07765548.383540
std154.5943254.0895422.442926e-010.217774163.164194
min0.000000-0.6000001.000000e-070.000000-4834.000000
25%1.6700000.0000001.000000e-040.00000035.602500
50%24.0000001.0000001.000000e-030.00000061.490000
75%24.0000007.0000002.000000e-030.10000082.000000
max720.00000014.3010303.280000e+002.000000100.000000
\n", + "
" + ], + "text/plain": [ + " Time_h pH Inhib_Concentrat_M Salt_Concentrat_M \\\n", + "count 1966.000000 1966.000000 1.966000e+03 1966.000000 \n", + "mean 71.332309 3.626585 2.918525e-02 0.077655 \n", + "std 154.594325 4.089542 2.442926e-01 0.217774 \n", + "min 0.000000 -0.600000 1.000000e-07 0.000000 \n", + "25% 1.670000 0.000000 1.000000e-04 0.000000 \n", + "50% 24.000000 1.000000 1.000000e-03 0.000000 \n", + "75% 24.000000 7.000000 2.000000e-03 0.100000 \n", + "max 720.000000 14.301030 3.280000e+00 2.000000 \n", + "\n", + " Efficiency \n", + "count 1966.000000 \n", + "mean 48.383540 \n", + "std 163.164194 \n", + "min -4834.000000 \n", + "25% 35.602500 \n", + "50% 61.490000 \n", + "75% 82.000000 \n", + "max 100.000000 " + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_Al.describe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Data Processing" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "df = df_AA2024" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Data Anaylsis" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Bayesian Optimization" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Search Space" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Define parameters" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "NumericalContinuousParameter.__init__() got an unexpected keyword argument 'tolerance'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[23], line 9\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mbaybe\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mparameters\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m NumericalDiscreteParameter, NumericalContinuousParameter\n\u001b[1;32m 2\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mbaybe\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01msearchspace\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m SearchSpace\n\u001b[1;32m 4\u001b[0m parameters \u001b[38;5;241m=\u001b[39m [\n\u001b[1;32m 5\u001b[0m NumericalContinuousParameter(\n\u001b[1;32m 6\u001b[0m name\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mTime (h)\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m 7\u001b[0m bounds\u001b[38;5;241m=\u001b[39m(df[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mTime_h\u001b[39m\u001b[38;5;124m'\u001b[39m]\u001b[38;5;241m.\u001b[39mmin(), df[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mTime_h\u001b[39m\u001b[38;5;124m'\u001b[39m]\u001b[38;5;241m.\u001b[39mmax()),\n\u001b[1;32m 8\u001b[0m ),\n\u001b[0;32m----> 9\u001b[0m \u001b[43mNumericalContinuousParameter\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 10\u001b[0m \u001b[43m \u001b[49m\u001b[43mname\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mpH\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 11\u001b[0m \u001b[43m \u001b[49m\u001b[43mbounds\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m14\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 12\u001b[0m \u001b[43m \u001b[49m\u001b[43mtolerance\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m0.5\u001b[39;49m\n\u001b[1;32m 13\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m, \n\u001b[1;32m 14\u001b[0m NumericalContinuousParameter(\n\u001b[1;32m 15\u001b[0m name\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mInhibitor Concentration (M)\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m 16\u001b[0m bounds\u001b[38;5;241m=\u001b[39m(df[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mInhib_Concentrat_M\u001b[39m\u001b[38;5;124m'\u001b[39m]\u001b[38;5;241m.\u001b[39mmin(), df[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mInhib_Concentrat_M\u001b[39m\u001b[38;5;124m'\u001b[39m]\u001b[38;5;241m.\u001b[39mmax()),\n\u001b[1;32m 17\u001b[0m ),\n\u001b[1;32m 18\u001b[0m NumericalContinuousParameter(\n\u001b[1;32m 19\u001b[0m name\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mSalt_Concentrat_M\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m 20\u001b[0m bounds\u001b[38;5;241m=\u001b[39m(df[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mSalt_Concentrat_M\u001b[39m\u001b[38;5;124m'\u001b[39m]\u001b[38;5;241m.\u001b[39mmin(), df[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mSalt_Concentrat_M\u001b[39m\u001b[38;5;124m'\u001b[39m]\u001b[38;5;241m.\u001b[39mmax()),\n\u001b[1;32m 21\u001b[0m )\n\u001b[1;32m 22\u001b[0m ]\n", + "\u001b[0;31mTypeError\u001b[0m: NumericalContinuousParameter.__init__() got an unexpected keyword argument 'tolerance'" + ] + } + ], + "source": [ + "from baybe.parameters import NumericalDiscreteParameter, NumericalContinuousParameter\n", + "from baybe.searchspace import SearchSpace\n", + "\n", + "parameters = [\n", + "NumericalContinuousParameter(\n", + " name=\"Time (h)\",\n", + " bounds=(df['Time_h'].min(), df['Time_h'].max()),\n", + "),\n", + "NumericalContinuousParameter(\n", + " name=\"pH\",\n", + " bounds=(1, 14),\n", + " ), \n", + "NumericalContinuousParameter(\n", + " name=\"Inhibitor Concentration (M)\",\n", + " bounds=(df['Inhib_Concentrat_M'].min(), df['Inhib_Concentrat_M'].max()),\n", + " ),\n", + "NumericalContinuousParameter(\n", + " name=\"Salt_Concentrat_M\",\n", + " bounds=(df['Salt_Concentrat_M'].min(), df['Salt_Concentrat_M'].max()),\n", + " )\n", + "]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Objective" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "from baybe.targets import NumericalTarget\n", + "from baybe.objective import Objective\n", + "\n", + "target = NumericalTarget(\n", + " name=\"Efficiency\",\n", + " mode=\"MAX\",\n", + ")\n", + "objective = Objective(mode=\"SINGLE\", targets=[target])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "from baybe.searchspace import SearchSpace\n", + "\n", + "searchspace = SearchSpace.from_product(parameters)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Recommender" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Time (h) pH Inhibitor Concentration (M) Salt_Concentrat_M\n", + "0 139.744749 9.907613 0.003735 0.418879\n", + "1 516.446510 8.229525 0.009470 0.463482\n", + "2 99.505625 7.063403 0.030336 0.543470\n" + ] + } + ], + "source": [ + "from baybe import Campaign\n", + "\n", + "campaign = Campaign(searchspace, objective)\n", + "\n", + "df_recommend = campaign.recommend(batch_size=3)\n", + "print(df_recommend)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "ename": "ValueError", + "evalue": "operands could not be broadcast together with shapes (6,) (3,4) ", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[22], line 4\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mnumpy\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mnp\u001b[39;00m\n\u001b[1;32m 3\u001b[0m \u001b[38;5;66;03m# Calculate Euclidean distance between each row in df and the entry in df_recommend\u001b[39;00m\n\u001b[0;32m----> 4\u001b[0m distances \u001b[38;5;241m=\u001b[39m \u001b[43mdf\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mapply\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43;01mlambda\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mrow\u001b[49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mlinalg\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnorm\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrow\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m-\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mdf_recommend\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mvalues\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 6\u001b[0m \u001b[38;5;66;03m# Get the index of the row with the minimum distance\u001b[39;00m\n\u001b[1;32m 7\u001b[0m closest_index \u001b[38;5;241m=\u001b[39m distances\u001b[38;5;241m.\u001b[39midxmin()\n", + "File \u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/core/frame.py:10361\u001b[0m, in \u001b[0;36mDataFrame.apply\u001b[0;34m(self, func, axis, raw, result_type, args, by_row, engine, engine_kwargs, **kwargs)\u001b[0m\n\u001b[1;32m 10347\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mapply\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m frame_apply\n\u001b[1;32m 10349\u001b[0m op \u001b[38;5;241m=\u001b[39m frame_apply(\n\u001b[1;32m 10350\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 10351\u001b[0m func\u001b[38;5;241m=\u001b[39mfunc,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 10359\u001b[0m kwargs\u001b[38;5;241m=\u001b[39mkwargs,\n\u001b[1;32m 10360\u001b[0m )\n\u001b[0;32m> 10361\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mop\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mapply\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241m.\u001b[39m__finalize__(\u001b[38;5;28mself\u001b[39m, method\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mapply\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", + "File \u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/core/apply.py:916\u001b[0m, in \u001b[0;36mFrameApply.apply\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 913\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mraw:\n\u001b[1;32m 914\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mapply_raw(engine\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mengine, engine_kwargs\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mengine_kwargs)\n\u001b[0;32m--> 916\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mapply_standard\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/core/apply.py:1063\u001b[0m, in \u001b[0;36mFrameApply.apply_standard\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1061\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mapply_standard\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[1;32m 1062\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mengine \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mpython\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[0;32m-> 1063\u001b[0m results, res_index \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mapply_series_generator\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1064\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 1065\u001b[0m results, res_index \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mapply_series_numba()\n", + "File \u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/core/apply.py:1081\u001b[0m, in \u001b[0;36mFrameApply.apply_series_generator\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1078\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m option_context(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmode.chained_assignment\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m):\n\u001b[1;32m 1079\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i, v \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(series_gen):\n\u001b[1;32m 1080\u001b[0m \u001b[38;5;66;03m# ignore SettingWithCopy here in case the user mutates\u001b[39;00m\n\u001b[0;32m-> 1081\u001b[0m results[i] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[43mv\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1082\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(results[i], ABCSeries):\n\u001b[1;32m 1083\u001b[0m \u001b[38;5;66;03m# If we have a view on v, we need to make a copy because\u001b[39;00m\n\u001b[1;32m 1084\u001b[0m \u001b[38;5;66;03m# series_generator will swap out the underlying data\u001b[39;00m\n\u001b[1;32m 1085\u001b[0m results[i] \u001b[38;5;241m=\u001b[39m results[i]\u001b[38;5;241m.\u001b[39mcopy(deep\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m)\n", + "Cell \u001b[0;32mIn[22], line 4\u001b[0m, in \u001b[0;36m\u001b[0;34m(row)\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mnumpy\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mnp\u001b[39;00m\n\u001b[1;32m 3\u001b[0m \u001b[38;5;66;03m# Calculate Euclidean distance between each row in df and the entry in df_recommend\u001b[39;00m\n\u001b[0;32m----> 4\u001b[0m distances \u001b[38;5;241m=\u001b[39m df\u001b[38;5;241m.\u001b[39mapply(\u001b[38;5;28;01mlambda\u001b[39;00m row: np\u001b[38;5;241m.\u001b[39mlinalg\u001b[38;5;241m.\u001b[39mnorm(\u001b[43mrow\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m-\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mdf_recommend\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mvalues\u001b[49m), axis\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m1\u001b[39m)\n\u001b[1;32m 6\u001b[0m \u001b[38;5;66;03m# Get the index of the row with the minimum distance\u001b[39;00m\n\u001b[1;32m 7\u001b[0m closest_index \u001b[38;5;241m=\u001b[39m distances\u001b[38;5;241m.\u001b[39midxmin()\n", + "File \u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/core/ops/common.py:76\u001b[0m, in \u001b[0;36m_unpack_zerodim_and_defer..new_method\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 72\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mNotImplemented\u001b[39m\n\u001b[1;32m 74\u001b[0m other \u001b[38;5;241m=\u001b[39m item_from_zerodim(other)\n\u001b[0;32m---> 76\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mmethod\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mother\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/core/arraylike.py:194\u001b[0m, in \u001b[0;36mOpsMixin.__sub__\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 192\u001b[0m \u001b[38;5;129m@unpack_zerodim_and_defer\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m__sub__\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 193\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__sub__\u001b[39m(\u001b[38;5;28mself\u001b[39m, other):\n\u001b[0;32m--> 194\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_arith_method\u001b[49m\u001b[43m(\u001b[49m\u001b[43mother\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43moperator\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msub\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/core/series.py:6126\u001b[0m, in \u001b[0;36mSeries._arith_method\u001b[0;34m(self, other, op)\u001b[0m\n\u001b[1;32m 6124\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_arith_method\u001b[39m(\u001b[38;5;28mself\u001b[39m, other, op):\n\u001b[1;32m 6125\u001b[0m \u001b[38;5;28mself\u001b[39m, other \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_align_for_op(other)\n\u001b[0;32m-> 6126\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mbase\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mIndexOpsMixin\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_arith_method\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mother\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mop\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/core/base.py:1382\u001b[0m, in \u001b[0;36mIndexOpsMixin._arith_method\u001b[0;34m(self, other, op)\u001b[0m\n\u001b[1;32m 1379\u001b[0m rvalues \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39marange(rvalues\u001b[38;5;241m.\u001b[39mstart, rvalues\u001b[38;5;241m.\u001b[39mstop, rvalues\u001b[38;5;241m.\u001b[39mstep)\n\u001b[1;32m 1381\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m np\u001b[38;5;241m.\u001b[39merrstate(\u001b[38;5;28mall\u001b[39m\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mignore\u001b[39m\u001b[38;5;124m\"\u001b[39m):\n\u001b[0;32m-> 1382\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[43mops\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43marithmetic_op\u001b[49m\u001b[43m(\u001b[49m\u001b[43mlvalues\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrvalues\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mop\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1384\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_construct_result(result, name\u001b[38;5;241m=\u001b[39mres_name)\n", + "File \u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/core/ops/array_ops.py:283\u001b[0m, in \u001b[0;36marithmetic_op\u001b[0;34m(left, right, op)\u001b[0m\n\u001b[1;32m 279\u001b[0m _bool_arith_check(op, left, right) \u001b[38;5;66;03m# type: ignore[arg-type]\u001b[39;00m\n\u001b[1;32m 281\u001b[0m \u001b[38;5;66;03m# error: Argument 1 to \"_na_arithmetic_op\" has incompatible type\u001b[39;00m\n\u001b[1;32m 282\u001b[0m \u001b[38;5;66;03m# \"Union[ExtensionArray, ndarray[Any, Any]]\"; expected \"ndarray[Any, Any]\"\u001b[39;00m\n\u001b[0;32m--> 283\u001b[0m res_values \u001b[38;5;241m=\u001b[39m \u001b[43m_na_arithmetic_op\u001b[49m\u001b[43m(\u001b[49m\u001b[43mleft\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mright\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mop\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;66;03m# type: ignore[arg-type]\u001b[39;00m\n\u001b[1;32m 285\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m res_values\n", + "File \u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/core/ops/array_ops.py:218\u001b[0m, in \u001b[0;36m_na_arithmetic_op\u001b[0;34m(left, right, op, is_cmp)\u001b[0m\n\u001b[1;32m 215\u001b[0m func \u001b[38;5;241m=\u001b[39m partial(expressions\u001b[38;5;241m.\u001b[39mevaluate, op)\n\u001b[1;32m 217\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 218\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[43mleft\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mright\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 219\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m:\n\u001b[1;32m 220\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m is_cmp \u001b[38;5;129;01mand\u001b[39;00m (\n\u001b[1;32m 221\u001b[0m left\u001b[38;5;241m.\u001b[39mdtype \u001b[38;5;241m==\u001b[39m \u001b[38;5;28mobject\u001b[39m \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mgetattr\u001b[39m(right, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdtype\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m) \u001b[38;5;241m==\u001b[39m \u001b[38;5;28mobject\u001b[39m\n\u001b[1;32m 222\u001b[0m ):\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 225\u001b[0m \u001b[38;5;66;03m# Don't do this for comparisons, as that will handle complex numbers\u001b[39;00m\n\u001b[1;32m 226\u001b[0m \u001b[38;5;66;03m# incorrectly, see GH#32047\u001b[39;00m\n", + "File \u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/core/computation/expressions.py:242\u001b[0m, in \u001b[0;36mevaluate\u001b[0;34m(op, a, b, use_numexpr)\u001b[0m\n\u001b[1;32m 239\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m op_str \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 240\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m use_numexpr:\n\u001b[1;32m 241\u001b[0m \u001b[38;5;66;03m# error: \"None\" not callable\u001b[39;00m\n\u001b[0;32m--> 242\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m_evaluate\u001b[49m\u001b[43m(\u001b[49m\u001b[43mop\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mop_str\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43ma\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mb\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;66;03m# type: ignore[misc]\u001b[39;00m\n\u001b[1;32m 243\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m _evaluate_standard(op, op_str, a, b)\n", + "File \u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/core/computation/expressions.py:73\u001b[0m, in \u001b[0;36m_evaluate_standard\u001b[0;34m(op, op_str, a, b)\u001b[0m\n\u001b[1;32m 71\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m _TEST_MODE:\n\u001b[1;32m 72\u001b[0m _store_test_result(\u001b[38;5;28;01mFalse\u001b[39;00m)\n\u001b[0;32m---> 73\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mop\u001b[49m\u001b[43m(\u001b[49m\u001b[43ma\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mb\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[0;31mValueError\u001b[0m: operands could not be broadcast together with shapes (6,) (3,4) " + ] + } + ], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Benchmarking" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Transfer Learning" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/legacy_code/Alex6022/baybe-inhibitor.ipynb b/legacy_code/Alex6022/baybe-inhibitor.ipynb new file mode 100644 index 0000000..b4bc81a --- /dev/null +++ b/legacy_code/Alex6022/baybe-inhibitor.ipynb @@ -0,0 +1,3832 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Imports" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Time_h pH Inhib_Concentrat_M Salt_Concentrat_M \\\n", + "count 515.000000 515.000000 515.000000 515.000000 \n", + "mean 157.151456 6.613592 0.006934 0.113476 \n", + "std 212.312862 2.270734 0.012923 0.159137 \n", + "min 0.500000 0.000000 0.000010 0.000000 \n", + "25% 24.000000 4.400000 0.001000 0.050000 \n", + "50% 24.000000 7.000000 0.001000 0.100000 \n", + "75% 240.000000 7.000000 0.003000 0.100000 \n", + "max 672.000000 10.000000 0.100000 0.600000 \n", + "\n", + " Efficiency \n", + "count 515.000000 \n", + "mean 18.439395 \n", + "std 313.671188 \n", + "min -4834.000000 \n", + "25% 25.625000 \n", + "50% 50.000000 \n", + "75% 85.475000 \n", + "max 100.000000 \n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "\n", + "df_AA2024 = pd.read_excel('/workspaces/project-project-surface-science-syndicate/data/averaged_filtered_AA2024.xlsx')\n", + "print(df_AA2024.describe())" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " SMILES Time_h pH Inhib_Concentrat_M \\\n", + "0 C(=O)(C(=O)[O-])[O-] 24.0 4.0 0.0010 \n", + "1 C(=O)(C(=O)[O-])[O-] 24.0 7.0 0.0005 \n", + "2 C(=O)(C(=O)[O-])[O-] 24.0 10.0 0.0010 \n", + "3 C(C(=O)[O-])C(CC(=O)[O-])(C(=O)[O-])O 24.0 4.0 0.0010 \n", + "4 C(C(=O)[O-])C(CC(=O)[O-])(C(=O)[O-])O 24.0 7.0 0.0005 \n", + "\n", + " Salt_Concentrat_M Efficiency \n", + "0 0.10 20.00 \n", + "1 0.05 12.35 \n", + "2 0.10 20.00 \n", + "3 0.10 30.00 \n", + "4 0.05 -23.95 \n" + ] + } + ], + "source": [ + "print(df_AA2024.head())" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Time_h pH Inhib_Concentrat_M Salt_Concentrat_M \\\n", + "count 333.000000 333.000000 3.330000e+02 333.000000 \n", + "mean 79.969970 0.440733 1.510580e-01 0.051051 \n", + "std 143.826377 1.913196 5.784776e-01 0.301263 \n", + "min 0.000000 -0.600000 1.000000e-07 0.000000 \n", + "25% 2.000000 -0.136721 2.000000e-04 0.000000 \n", + "50% 5.500000 0.000000 1.800000e-03 0.000000 \n", + "75% 96.000000 1.000000 4.279601e-03 0.000000 \n", + "max 720.000000 13.000000 3.280000e+00 2.000000 \n", + "\n", + " Efficiency \n", + "count 333.000000 \n", + "mean 60.781498 \n", + "std 22.139768 \n", + "min -49.170000 \n", + "25% 47.066667 \n", + "50% 66.000000 \n", + "75% 77.220000 \n", + "max 96.200000 \n" + ] + } + ], + "source": [ + "df_AA1000 = pd.read_excel('/workspaces/project-project-surface-science-syndicate/data/averaged_filtered_AA1000.xlsx')\n", + "print(df_AA1000.describe())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Construct dataframe to work with" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "df = df_AA2024\n", + "df_transfer = df_AA1000" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "df_combined = pd.concat([df, df_transfer], axis=0)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Time_hpHInhib_Concentrat_MSalt_Concentrat_MEfficiency
count848.000000848.0000008.480000e+02848.000000848.000000
mean126.8431604.1895806.352976e-020.08896235.066659
std192.0556763.6961833.690920e-010.227758245.617010
min0.000000-0.6000001.000000e-070.000000-4834.000000
25%6.0000000.0000005.000000e-040.00000035.000000
50%24.0000004.0000001.000000e-030.01000060.000000
75%144.0000007.0000004.200000e-030.10000080.507500
max720.00000013.0000003.280000e+002.000000100.000000
\n", + "
" + ], + "text/plain": [ + " Time_h pH Inhib_Concentrat_M Salt_Concentrat_M \\\n", + "count 848.000000 848.000000 8.480000e+02 848.000000 \n", + "mean 126.843160 4.189580 6.352976e-02 0.088962 \n", + "std 192.055676 3.696183 3.690920e-01 0.227758 \n", + "min 0.000000 -0.600000 1.000000e-07 0.000000 \n", + "25% 6.000000 0.000000 5.000000e-04 0.000000 \n", + "50% 24.000000 4.000000 1.000000e-03 0.010000 \n", + "75% 144.000000 7.000000 4.200000e-03 0.100000 \n", + "max 720.000000 13.000000 3.280000e+00 2.000000 \n", + "\n", + " Efficiency \n", + "count 848.000000 \n", + "mean 35.066659 \n", + "std 245.617010 \n", + "min -4834.000000 \n", + "25% 35.000000 \n", + "50% 60.000000 \n", + "75% 80.507500 \n", + "max 100.000000 " + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_combined.describe()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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7ZJLLrGLL77YmjVrZi6Xy26++Wbbtm2brV+/3iTZW2+9ZYMHD7bu3bs75SYkJFjXrl3t3HPPtfr161faVrfbbZGRkRYZGens+65du1pMTIxNnz7dMjMznW2SZMnJyfbwww9bUVGRDRw40DweT9B0l8tlTZo0sXvuuccKCwutadOm1qFDB+e5GjBggHXu3NkSEhKc9QX29cMPP2wDBgyw8847L6jMsLAwi46ODtq/VQ2BcsoP8fHxJsmaN28edGwdaEhOTq70nB7K0LRp00r7prohPDzcPB7PYa/raA7lj4tjNdTEfoiIiKjyeGAIHlwu1zF/fsuv+2BfIwwMR2M4lPeawGeqy+WyFi1a1Hrdj+ehNj/LIiIizO/3H/T8NfH+53K5zOv1mtfrrbI8j8djXq/3gGVERkYeUT06dOhgqamplp2dbTfffLP98MMPJsliY2MrzRseHm633367DRs2LKi9GGije71eCwsLs8svv9w6d+5skszn81lCQoJ5vV5zu93WrFkzu+222+zTTz81SXbppZfasGHD7NJLL7WwsDB78803TZK1bt3aIiIinDIrHh+Bz4KzzjrLNm/ebAMGDLDRo0ebJEtMTDSPx2NhYWHWrl07++abbyw/P99GjRrljI+KirLY2Fin7X/WWWfZO++8Y126dLH69etby5YtLSMjw8LCwszj8Vjv3r3t7LPPtnbt2llCQoJTh/r161ujRo2c9uq7775r3bt3d46ntm3b2uTJk53znccff9yio6PtiiuusPr165vP57OGDRva4MGD7aOPPrIHHnjAJNk333wTdC41dOhQk2R33HGHSbKZM2fa5s2b7a233jJp36nd9u3b7a677rIWLVqY3++31NRUO/PMM+3NN9+0a665xho3bmzh4eGWlJRk5513nv30009B5wPTpk2zW2+91dq2bWvr16+3mJgYW7VqVdA5W25ursXGxtr69eutoKDAJk+ebCeddJLFxMRYVFSUJScnW506dZzt6t69u5100kkWHh5ukqxdu3aWm5tb6VxwwIABNmbMmErjL7zwQnvooYeqXf+1117rbFdCQoLVq1fP4uPjzefzWbNmzezuu++2FStWONtVnYrnRfurV2Zmpo0ZM8bWr19vZWVlzvi9e/fa+PHjrXXr1ub3+y0+Pt7OPvts+/zzz6tdb/ll169ff8B6Vtz+gB49epgk+9e//hU0/4QJEywzM/OA66/Oli1b7OuvvzZJtnDhQmf8okWLLDEx0Xbs2HHYZZuZPf/889axY0eLiIiw6Oho6969u7377ruV5uvYsaO9+OKLlca3b9/e/vnPfzqP77vvPsvOzrb169dbYWFh0LxffPGF9e3b1+Lj453z5XHjxtnevXsPWM/q9kNV9ZJkubm5lp+fHzR+165ddu+991qzZs3M5/NZnTp1bODAgbZkyZIDrr+oqMjWr19vgwYNsvPPP7/a+fa3/d99950NHDjQUlJSzO/3W9OmTW3YsGG2dOnSA67/SO3Zs8fatm1baf8d7HZV5ZADrZUrV1q9evUsKyvL3njjDVu6dKktWbLExo0bZy1atDCzfS+YsWPH2tixY006+EArUHbTpk0tMTHRmjZtahMmTLDbb7/dwsPDLSIiwhISEiw6OtpefPFFi4iIsJycHPv666/t9NNPt5iYGOeDbtCgQTZy5Ehr3LixnXPOOeb3++3LL7+02NhYmzhxokmyOXPmmJnZXXfdZWFhYda5c2cLCwuza665xiZMmGB9+vSxG264wTIyMszr9ZrH47F7773XzjzzTBs+fLhFREQ4DY02bdqYx+OxRo0aWZMmTWzYsGEWHh7uhEsPPvig9enTxx588EFr0KCBRUZGWt26dS0+Pt4yMjIsLi7OkpOTLSkpyQYMGGCS7KGHHrIWLVrY22+/bT6fz/kAcLlcdtZZZ1nbtm0tPj7e6tata5IsKSnJ+XCPjY21+Ph4u+uuu8ztdlu9evXM5/NVCr+io6OdMFKSjR8/3jwej0VFRVl4eLjzAe33+83v95vb7Q4Kzco3vKKjoy08PNwyMjLswgsvrHSiGXgcHR0dtJzP5wv6G6hf+YbZO++8Y2Zm77zzTpUNyPLrqq4xeKgNu4phRm2dtDMwMDAwMDAcuyHwRVb54VBDtsP5QiTQVinfnpP2tZuqCpUq1i8Qrkiy7Oxsk6pvuwS+dK5Y50GDBllSUpJdccUVleqRlZVldevWDQrXoqKibOrUqU4dPB6PZWRk2KBBg6xJkyYmyfx+v7Vp08YiIyMtOzvbCZKmTZtm6enp1r59e6esefPm2VNPPWWSrE+fPibJxowZY3/+85+Dtsfv91taWppJspYtW1rdunUtPDzcmjVrZlOnTnX2/5///GdbvXq1paWlWePGjS05Odnat29vDRo0sDp16lirVq3M4/FYWlqahYeHOyGcx+Ox7Oxsq1+/vvXs2dPmzp1rixYtMq/Xa6effrrzJWKHDh2sUaNG1qJFCzv11FNNkj355JM2ceJEc7vdNnr0aHvooYcsJibGHnvsMfP7/Xbrrbeamdm9995r0r4vgd977z1bvny5LVy40O6//37r3r27TZgwwSRVCpKGDh1q4eHhzjEROCkMBFoXX3yxJScnW4MGDez555+3H3/80ZYuXWpXXHGFhYeH24QJE2zu3Lm2cuVKW7BggfXr18/S09Odk3lpX5Bz3333Wdu2bZ1zmNzcXOvRo4dTj9zcXIuLi3MeT58+3f7v//7P3nzzTYuOjrYGDRpYWFiYvf/++3bHHXeYy+Wy9PR0y83NNUn24IMPBu2PgPfee8/q1q1rJSUlzrjVq1eby+WykSNHVrv+Z555xubOnWv//ve/LTw83NLS0iw1NdVWrFhhr732mqWnp1vXrl3tz3/+836DooDAfthfvTIzM23ChAlBy5WVldnAgQMtPj7epk6dar/++qstWrTIrrnmGvN4PEFl7k9g/1en4vYH9OjRw8LDw61JkyZWXFzsjD9QoHXffffZ0KFD91unlStXBh1zZmZXX321XXfddftd7kBuvfVW8/v99re//c1++eUXy8vLc85hn3zyyaB5n3rqKevYsWPQuM8++8zi4uJs9+7dQdtT1f7797//bR6Px6655hpbuHChrVy50qZOnWoJCQk2cODAoGCyOlXth6rqVfEYMtsX6HTt2tUaNGhgr776qq1atcq++uoru+CCC5z3wIMxdOjQAwZaVW3/u+++az6fz/r162cff/yx/frrrzZ//ny79dZbnYtmDkePHj2qDKgr+uMf/2h9+/attP8CDrRdVTnkQKtv375Wv35927lzZ6VpFYOr2bNnm3TwgVag7N69ewet45FHHjG3223fffedDRs2zAYOHGjDhw+3gQMHWnFxsT344IPmdrudK4G++OILp8zi4mLbuXOnbdy40f7xj39YcnKy9enTx3w+n5mZffXVVybJRo4caZLs8ccfr7RNQ4cOtTPOOMP5kJD2XT3TqFEjk2TnnnuuJSUl2QUXXBC0H9LT061hw4bmdrstIyPDnnrqKcvOzrZ69eqZ2+22M844o9L27tixwwmXtm7daosXL3a+OapXr54lJydbo0aNrHHjxibJ/vjHPwY1Nm644QZbunSpzZ4920aOHGmdO3e2mJgY5xuauLg4i4uLs8zMTOvUqZNddtllThgpyUlMc3JyrGHDhnb//ffb6aef7jQe/H6/vfDCC0GNCo/HYykpKdaoUSOLjo62s88+2zp16lSpETVixAiLiYmxl156yaKiokyS1a9f3+Li4szlcpnP5zOv12vNmjULajy63W4z25fclv/WNDU11blKLrCu8o2sQDkH04gr31AN1C0uLq7aUKtVq1ZB2xeY72hf0VNV3RkYGBgYGBhCYzjcL8fKt38qlhF4XP6K+AkTJliHDh2qLCsqKsr69OlTKSSLiIhwrkbPyMgI+qLR7XZbamqqtWnTplIdXnzxRZNkPXv2tOHDh5sk50vmQPsyLi7OOnbsaKWlpc4Xy3fddZctWrTIKSchIcHM9p2ol2+X/fDDD07Yl5OT42znJ5984szz0ksvmbTvyrGmTZsGbet5551n9evXt0cffdTZ5kWLFjmBXc+ePe3ee++1jh07mtfrtalTp1r//v3N4/FY3bp17eabb3bOC8444wznVwAtWrSwoUOHWosWLaxt27Z23333WXJysvMl+KhRo5ztCQQPgW2fN2+e1a9f38LCwqy0tLTKc6pAoPXll1/aH/7wB4uLi7OEhARLT0+3nj17OoFhxUCrRYsW5vV6be3atUFl5ubm2qmnnuoEMnv27LFbb73V+UVBmzZtnHO38oFWdna2PfXUUwcMtMz2hTnZ2dnWoUMHKy0ttYSEBHv00UfN6/XaqFGjbOvWrc46fvjhB+dXMLGxsXbeeefZypUrnfZ+4Jc/ZmZ/+9vfrE6dOnbfffcdcP1ZWVnWsWNHW7hwoUmy5cuXm9m+K4lcLpedeeaZhxVoVVWvqgKtV155xSTZ9OnTK5XZv39/q1OnTpXn0RUdSaB15ZVXWp06dWzSpEnO+KMRaO3du9fi4uLsvffe2+9y+zNv3jyTZBMnTqw0bdSoUeb1em3NmjXOuNWrVwc9r2bm5AIVt6fi/tu5c6fVqVPH+vfvX2ld06dPN0n2yiuvHLDOVQVaVdWr4jFkZvbXv/7VXC6XLVq0KGh8aWmpdezY0bKysg4qVDucQKuwsDAos6iofGbzww8/2Nlnn21RUVGWkpJil112mW3atKna9R1MoPX+++9by5Yt7ccff6y0/wIOJ9A6pHto/f7775oxY4aGDx+uqKioStMP5feh2dnZio6ODho++OADbdy4UR999JGioqKcdbz00kvq1auX2rVrp6+//lodO3bUZ599po4dO8rr9er1119Xjx49tHr1ajVt2lRdu3Z11uP1ehUVFaXk5GR988036tChgxYsWKCGDRs6ZUdHR2v16tWSpLvvvjuoTg0aNNBLL72kuXPnyuPx6M0335Tf79fy5cvVunVrSVK3bt20efNm3XHHHUH7we12a8OGDTrjjDO0Zs0aNWnSRD/++KM2b96s5ORkzZkzR1deeaU+/vhjZ59GR0crLCxM0r77CbVv316FhYXavXu31q1bp82bN2vdunX69ddf5XK59MknnzjzR0dH64knnlDz5s11+umna/z48crJyVFmZqZ27typmJgYRUdH68Ybb9Rvv/2mBQsW6J///KduvfVWLV26VJK0ePFiSfvu5bRq1SotXLhQn376qZKSkuT3+9WmTRtdd911zvZJ0t69e7V161atXLlSRUVFOu+88/Tdd9/JzCRJYWFhcrvdzr2wLrnkEiUkJEjadw+J7du3KycnR40bN1ZSUpL27NmjzMxM5/l3uVyKjo5WZGSkioqKnOc2Pz9fw4cPlyRnXXv37nWmX3LJJWrevHmlY++hhx5y/o+JiZEk5zfPERERzu/jo6KiFBkZWeXx+/PPPzvrdLvdzu+1D+beZi6X64DzVCdw3wAAABB6Am2HQ1W+/VOxjMDjDRs2OOPGjRunhQsXVllWYWGhPvzwQxUUFASN3717t5YtWyYz05o1a1RcXOxMc7vd2rp1q77//nu53e6gOlx++eWSpM8//1x///vfJe1rr5SWlurMM8+UJG3fvl1xcXGKjY3V6NGjJUkPP/xw0D2Ctm7dqujoaF1//fUqKytz2pnTp0932nc33nij02afPXu2JCkyMlJff/21UlNT1alTJy1fvty5F+bYsWMVHR2t/Px8uVwup12Xnp6uwsJCJScnKz09XS6XSyNHjlRJSYmmT5+uW2+9VXv37g3a75LUrl07zZo1S5LUtGnTSvs2OTlZJSUl2rt3r2677bZK06+77jpFR0dr4sSJWrt2rXw+n7Od5ZU/p7r88ssVExOjzz77TF988YU8Ho++/vprjRw5UtK+9nB5K1eu1EknnaR69epVKjcsLEwej0eSdNNNN+nzzz/X6aefrvT0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UZWysjKVlJSorKysUlAXKOfnn3/W999/HzTt/PPPd/7PycmRmem6667Txo0btX37drlcLj3//POSpNdeey3oJ4eBcps2beq0jQLtul27djlXYf3nP/9R8+bN9fvvvzshXuDKqwceeEAzZ85Uamqq+vfv77T3PvvsM4WHhysuLk69e/fWkCFDdO+990qS2rdvr4iICEn7fkFwySWXaMaMGVq8eLFuvvlmxcXFqbS0VOvWrau0n0pKSlRcXKzi4mKtW7dOY8aMCbqSqbi4OOgKsLCwsKCrVqq6yqR169aVfjly5plnOu3wzp07q2vXrs55g9frVcuWLbVgwQLnVxjffPONxowZo44dO2rRokV65JFH5Ha79cUXX+j777+X3+/XQw895Fw5Ju27LUdgH7/99ttBywdO9Pfs2RN0zjRs2DBJ0tVXX60bbrhBbdu21erVq7V9+/ZK+ysnJ0dff/21/H6/LrvsMi1atEjLli3TJZdcot9//11t2rRxtjknJ0fNmjXT9ddf74x74IEHKrXLA7+aiIyM1BtvvKGff/5Zb731ljP9p59+ci6aCGxLYCh/XlOd33//3flVUHWaN28etB/LC4wP3BLl2Wefddb//vvvH3D9h+qyyy5TZmZm0O1WAipu//XXX6/zzjvvkPZJUlKSdu3aVen941B+chg4F6/qPWjdunUqKCiodAuZis9D+VxgfwLl7O/5CcxTcV8czJVFNX18lP9F27PPPnvA9R9IoNwDZTk7d+5Uv379Kl1V98svv6h79+6SFPRaDOyfilfmBd7PPvnkE82bN09+v18ej8cJwTt27KihQ4ce8XYdUqCVmJioPn36aNKkSVX+HjfwTc3BqPiTw0WLFum0005TYmKiunXrpoKCAmcdl1xyiWbOnKmFCxeqdevWysvLU7t27ZSXl6eSkhINHDhQc+fOVWZmppYvX64vv/zSWU9JSYkKCwu1adMmZWdnKy8vTw0bNnQuU77kkku0c+dOZ4ffcsstQXX69NNP1a9fP+Xk5Gjbtm1q0qSJ82H51VdfSZK++OILJSUl6dFHHw3aD2VlZUpLS9P69esVGxurAQMGyOVyKTk5WZs2bVKPHj2Um5urXr16Ofu0/Dc+999/v1wulxo1aqTBgwcrNTVV9evX16JFizRq1ChJwZeX79y5U5MnT5aZqW7dusrMzNQpp5yi33//XXFxcZL2fduSmJioFi1aVPuTw/Hjx+uzzz4L+i174BuavLw89e/fX+Hh4frss8/k8/nk9Xqd8Ck9PV35+fnOTzql/95jKiUlRT6fT3feeacaNGggad/P+iIjI7Vs2TL99a9/1Z49e+R2u7V3715169ZN0r4P+8WLFzu/gQ948MEHncusL774Yklyrkzbu3ev2rVr5zzPgeejQYMGQYFb4BgLfAtpZs43JcXFxZW+3azqvhWBRk918+xPTf3M4Fg72G+dAQD4X3QobeIj+ZKoVatWzs/wyrc/CgsL1bZt2yoDrbi4OKe9VF75n4S53e6gNkrdunU1atQohYeHy+1266yzznKmBdbRsWNHPfPMM872hIWF6YcffpAkJSQkaNeuXVq4cKFz76c+ffpoypQpTjmBNm4gqAhsT79+/Zzg4plnnnGuYAp8+bp792717t1bK1as0NatW+V2u50rtdq0aaMzzzxT4eHhiomJcb589Hq9io6O1vbt27V37141atRI7777riIjI3X22WfrqaeeksfjUWRkpOLj49WxY0c1bdpUGzZscH5yuXHjxkr7cOPGjfJ6vfJ4PBo3bpxSUlKUmprqXMk0ZcoUFRYW6o9//KPq1aun4uJiNW7cWE2bNlXTpk2dfVf++Fm1apVSUlKceWJjYxUdHe18WT1q1CjNnj1bq1atkrTv55bLli1TbGyszjzzTJ155plq3bq10w5v2LCh+vbtq7KyMhUXF6tJkybOc1T+aiu3262YmBjFxsaqsLBQKSkpzi9FAvdnqviTw++//15NmzZVs2bNlJaWprKyMtWvX19er1fjxo0L2q4VK1bovffe0+7du3XDDTc42xcXF6clS5aoc+fOzriuXbtq165dSkxMdMYFruQrLycnx/kVSWlpqczMabMuXrxYM2fOdO6BHNiWwFDxS+yqLFmyRO3atdvvPIMHD9Yvv/yid999t9K0cePGqU6dOs7rp379+s76K/56qSa43W6NHTtWTz/9tHN8BFTc/sTERMXExBzSPgkEiBUvZjiUnxwOHjxYO3fu1DPPPFOp/Mcee0xer1cDBgxwxgWu4iv/PARygQPp3bu3EhMTNW7cuErTpk+frl9++cU5p6y4Lyqe71VUVb2qMnjwYM2cObPSfbLKyso0YcIEZWVlOffXyszMdNZfv379A27fgfTu3Tsos6go8Pps3769fvzxRzVs2DBoHzRt2tT5sqb8azGwf8q/T5V/P5s4caIWL15cKbx99dVX9Ze//OWIt+uQezlcsWKFpaWlWVZWlr3xxhu2bNkyy8vLsyeeeMJatmxpZmbr16+3hQsXOt34fvrpp7Zw4ULbsmXLQZXdtGlTi4+Pt6ZNm9rjjz9uf/rTn8zv91tkZKTFxMRYq1at7N5777VGjRpZ+/bt7auvvrLTTjvN6VHF7XbboEGD7Pbbb7emTZvaeeedZ36/31577TXzeDx2yy23mCT7/fffzczsjjvusLCwMDv55JMtLCzMrrvuOps4caL17dvXbrzxRsvMzLTWrVtbcnKyvf3225acnBzUc0xYWJi1bNnSJFm9evWsadOmdu2111p4eLilp6dbgwYNrH///nbLLbdYVFSUhYWFWUREhKWlpVlcXJwlJSWZ2+22lJQUS0pKskGDBpkkGzt2rEVFRVlcXJzl5OTYySef7PRmsWfPHuvSpUtQr37dunUzt9ttderUsRtvvNGys7Pt9ttvN2lfb4Iul8vq1q1rV111lTVv3tw6dOhgl1xyiS1cuNDpYULa1131lClT7IwzzrBhw4Y5y4aHh1vdunWdbpKTkpIsMjLSwsLCzOVymcvlsu7du9s555xjnTt3dnqkCQy33367hYeHm9vtrrKXn0BPOIEhOjra+X/Tpk1Ol82B9UVFRdlDDz3k9J4TmBYop3z31VX1SFhxSElJCXrctm3bSj0AHajb7PJDVd1+H8xwOD0gBbbpULsVZ2BgYGBgYNg3HG4PhMdiqK7tEuiJsGLdU1JSgtpRFYeIiIhK484//3yT9vVe3bVr10rTA70LhoWFBdWnfNujRYsWlpOTY9nZ2da+fXunvHPOOcciIiKsdevW5vF4LCwszB544AGnnRwo9/fff7fc3FxzuVzWsWNHk2QPPvig0xt5YDt9Pp/VrVvXJFlWVpbTq3jjxo2tfv36Tn1uuukme/XVVy0yMtIyMjIsOTnZcnJyLD093ZKSkqxFixbm8XgsLS3NIiIizOv1Wr9+/czj8Vh2dralpqZa165d7dtvv7XVq1dbWlqa5eTkmNvtNrfbbR07drRGjRpZy5Yt7bTTTjNJNnDgQGvWrJm53W6766677OGHH7aYmBgbN26c+f1+u/XWW83M7J577jFJ1rVrV/u///s/mzx5smVmZtpDDz1k3bt3d3o5bNSokZ1++uk2ZcoUa9SokfXo0cMaNWpkX375pUn7egobMmSIhYeHmyQbPHiw1alTxxo0aGAvvPCC/fjjj7Zs2TK78sorzefz2T333GPffvutXXDBBZaWlmYdO3a0+Ph4++CDD+zhhx82KbiXw/79+9utt95ql156qcXHxzvnbRV72bvzzjtt7ty59tZbb1lUVJTzPLzwwgt2++23m8vlsvT0dKe39Dp16pjL5bKLLrrIfv31V5s9e7aNGDHCvvzyS3O5XLZq1Sqn7OnTp1t4eLjdc889Va5/xYoV9vDDD9u3335rb775pvn9fktLS7PY2FhbsGCBvfbaa5aenm5du3a1u++++7B6OVy5cmWlelXVy2FZWZldeOGFlpCQYM8++6ytXLnSFi9ebNdee615PJ5Kvd5Vp2IvdU8++aT17Nmzyu0vr0ePHkE9c5qZnXbaaRYeHl7jvRyambVv396efPLJ/S53IDfffLP5/X577LHHbPny5fbTTz/Z3XffbW63u1Lvh7Nnz7bo6GgrLCx0xk2cONE6dOhQaXuqep5ff/11CwsLs2uuucYWL15sK1eutGeffdYSEhJs4MCBB9XDYFX7oap6VTyGzMx2795tnTt3tvT0dHvttdds9erV9vXXX9sFF1xgUVFRNm/evAOu36xyb4B33nmnDRky5IDb//bbbzvvcx9//LGtXLnSvvnmG7v99tvtoosuMjOztWvXWnJysg0cONC+/vprW758uc2YMcOuuOIK27t3b5X1OZheDgOq2n/VbdfBOORAy8xs3bp1Nnz4cMvMzDSfz2f169e38847z2bPnm1m+3ZgVR+eB7ORgbLr169vbrfbCajq1KljrVq1cj5MY2NjzeVy2dixY62kpMT27NljY8eOdbobLt84SUhIsD/96U9WUlJiJ598so0bN85cLpfdf//9znpfffVV6969uxO4uN1u8/l8lp2dbTk5OXbOOefYHXfcYYMHD7Y77rjDzj33XCdMSk5ODlpnoN5hYWHWtm1bCw8Pt9dff93q16/vBEzdunWzO++80xo3blxp2cD/ffv2tZdeeslSU1PN5XJZ+/btzeVy2f/93//ZE088YS1atLA77rijygZZoA5xcXEWHx9vTZo0sRYtWlhUVFSVz00gfAqsKyEhwWns1KlTx9xut/n9fktMTKyykRUbGxsUrnXt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/SkqKrIHH3zQZsyYYRdddJGzT6OiopxvNb///vugZXJzc23o0KF27bXX2h133GHXXHNN0PRAWBcWFmaXXXZZ0D6cOHGi/fLLL9asWbOg43X27NmWkpLinMB89NFH9vrrr9v8+fODyi4sLDSfz2fXXXedc4w9//zzzs9JR44caZs2bbJHHnnE2f/169c3s32NzMDJQvfu3c3tdpvH47FWrVo5Vy2GhYXZxIkT7aGHHrJRo0aZJLvqqqucMHratGlBDfEBAwZYRESEud1ui4qKMjOzU0891WJjYytdabhw4UJ78803LSwszP70pz9ZZGSkpaSk2J133unMUzHcDPzUODEx0Xbs2GFbt251fpIQmKd58+Z2//33OydBbrfbkpKSbPz48XbWWWfZpk2bzO12W0JCQtCJUlVDo0aNzO/3B13p6Pf7nZ/p7m8IHC8dOnQIutKw4jp9Pp8TfB/JCWFgaNWqld12220WGRnphOAej6fSCaDX6zWv12tt27atVEbDhg0rjcvOzramTZvaAw88YK1bt3Z+Ih34mUhgvi5duljPnj2rvZK1/OByuWzcuHHV7r+a+vmvx+OxnJycGgmh/X6/derUyc4555yg5zIlJcX5SXj55zYzM9OaNGliJ510UpU/d4qJibHzzjvPuXI6UN927dqZz+ezk046qdp9dyj1/sMf/mDJycnOc5+ZmVltQOLxeOziiy+2O++8s8qft7dq1cp69+7tTAscZwdTj+zs7CN+DgJXWefm5tpDDz1kV155ZdBPqKpaJvBF1cGWH9imoUOHWu/evZ339a1bt1qnTp2q3d4DPS9paWn2hz/8wXkezj777APWJ3C1S8V1BOpX8WdtMTExdumll1b787rAUK9evYPe5zfffLONGjXK2b+PPPKI3XjjjU7AU/FYKn9MhIWFWaNGjaot2+PxmMfjsZKSEqftVt3QqlUrp11hZpaenl7l/grsX7fbbaeccoozPrDvyp9ITp061f72t78571nln1ufz2ejRo2q9v0sLi7OsrKynNf94sWLrVevXk5IVvEKj0A7tGL78+yzz3b25aOPPhr0WT979mznCotAezLwuR74lr/88gsXLrS//e1vzjETqFv59nBubq7Tlgm05/x+vzVr1szMgtuTgTLq16/vXDkUFRVl99xzj9NeC4QR5esVaM+53W6rX7++eb1ei4qKsuHDh9vHH3/sXNHUu3fvoOMn8MuMigLtyPLt36ioKPP7/dUGEllZWc77fvntL29/7dnDUbFdHficNav6fKCq7TqQ8sdcVYHWgc4HHnroISsoKDis9a9evdqioqKCtqsq5fdD+fZ5VfUqf1xt27btgHU4GAdbz8PZ/0ei4mu1vPKv9aPpm2++sVdeeaXKaRXfo+677z6nTT9p0qQaq0NV+6G6epV/D6opn376qfMedKBA62hs/9FysNtVFZfZIfaTiaNu9+7dWrt2rSQpOjo66AbrR8PGjRtVUFAgad9NP7/55hvt2LFD/fr1O+SyVq1apXfffVcjRoxwxu3YsUP5+fnauXOniouLlZiYqPj4eCUlJR1WfefMmaMdO3aoc+fOKigo0JYtWxQREaHIyEjVrVvXuVnd448/rgEDBlS6mfzevXudGyP6/f5K0ysK1F+SPv30U2VnZ6tz5877nS+wfePGjdNll12mvXv3avfu3U79o6KilJycrOnTp+umm25S/fr1q+wRae/evXrkkUf0xz/+8aBuVlmV5cuX6z//+Y/mzJmj+++/v9L0bdu2afLkyfL5fBoyZIjTM1Bg2ddee01Lly7VlClTqrwh4s8//6yXX35Zl19+uXO8rl69WiUlJfrqq68UHR0d1MtRec8++6zy8vKcnnkkaejQoWrcuLHat2/vHIPLly+XtO8Gs40aNdLatWud/fn++++rZcuWaty4saKjo+Xz+bRx40b9/e9/16hRo9SgQQPdfvvt+uabb3T11VcrJiZGderUUUFBgX799VenC/KrrrrK6S01sJ7JkydrxYoVuvLKK7VkyRJ9+OGH6t27twYMGCCfz6ebbrpJ7du3V0pKil599VW98MILmj17tv7xj38oOTlZLpdLbrdbixcv1l133aW6detqzpw56ty5s0466SStXbtWq1ev1rPPPqsmTZqoa9euOu2007Rq1Sp99dVX+uSTT9SwYUOVlpbq4osv1u+//67HH3/cuYHizp07NWvWLP3www9KT0/XueeeqxtvvFH169dXkyZNtGvXLg0aNEhz585VeHi4WrZsqYKCAjVs2FDvvPOOdu7cqcLCQtWvX1/du3eXx+NRYWGhGjVqpLi4OPn9fs2YMUObNm3SwoULdeqpp6qsrExr165VcXGx4uLidOqpp6q0tFRffvml6tWrpw0bNqhv376aOXOmVq9erU2bNjk9S0VHR+u2227Tpk2bVFpaqrS0NA0ZMkQLFizQGWecoSuuuEJFRUVau3at9u7dq61btyo5OVl+v18vv/yycwPKhg0bavLkyWrcuLHy8vK0ZMkSnXzyyerYsaPatGmjsLAwvfPOOxo/fryuvPJKLV26VA899JBatGihjRs3atWqVXrjjTd055136oknnlCfPn10991369FHH1WnTp305ptvqri4WLNnz9bKlSsVFham7du3a+3atWrcuLGzjzt37qyLLrpIiYmJmjNnjnbv3q2ePXvqjDPOkNfr1S+//KKVK1dq06ZNuvzyy/X777/rvffek8/nU3h4uOrVq6elS5fq5JNPVmlpqbZv365+/frJzLRp0yb9+9//VkxMjO6//37t2bNH06ZN08KFCxUWFqaEhAR169ZNe/fu1auvvqq6detq0KBBevTRR5Wenq5ly5bJ5/MpKytLfr9fvXv31g8//KAbb7xRpaWlmjRpknJycpxjrGXLltq9e7dyc3OVmpqqvXv3atKkSdq9e7feeustLVmyRJ988on69eunXbt2yev16uGHH1ZCQoKkfe9rP/74o4YNG6YffvhBK1asUNu2bfXyyy/L5/Np6tSpys3N1caNG/X2229r3rx5uuCCC9SvXz8VFBRo586deuqpp9SrVy+1adNGP//8s7799lvt3r1b119/verVq+e8N/n9fr3wwgt64YUXdP7552vZsmXauHGjWrRooU2bNum9997Txo0bNX78eF100UW6+eabFRsbq8aNG+uOO+5QZGSkpk6dqiFDhqiwsFC5ubmaPXu2brrpJq1Zs0affvqpzjzzTHXu3FkbNmzQqFGjlJqaqgULFujjjz/W7Nmz1bJlS23btk0tW7bU559/rr1792rx4sVKSUlRfHy80tLS5PV6tXLlSmVmZsrlcqlly5Zau3atsrKynK6/N27cqJ9++kl79+5VTEyMCgsLtXv3bqd3oPnz5+vqq69WRESEPv30U3300Udavny5kpOT1bNnT23ZskXt2rVTUlKStmzZoqZNm6q0tFR169ZVfHy8XnjhBV122WXOvgu0L5577jm1b99e//nPf7R3717Vq1dPLVq0UGxsrLZv3665c+fKzBQZGam5c+eqS5cuOuWUUzRv3jyn16vo6Gh9/vnnWr58uTZv3qz09HSlpaUpIyNDcXFx8vl8KigoUG5uruLj43X66adr7969io2NVXJysuLj47Vr1y4988wz2rRpk3777TfdfPPNOvnkk7Vu3Trl5+frm2++0XfffadOnTopKSnJeR9p0KCBduzYoe3bt2v9+vUKDw/XlClT1KFDB0VEROj777/X2WefrVNOOUX16tWT2+12On9JTk6Wz+fT2rVr9dVXX2n16tVOe6Ju3bpOL9LFxcWqW7euvF6vli1bpmnTpunMM89U3bp1FRsbq7KyMi1ZskQNGzbUhRdeqL179+q2225Tt27dlJaWJp/Pp8LCQr300ku6+uqrlZ6eHtTeWLx4sfLz8/XTTz/J5/MpPj5e7du3V1pamgoKCpSSkiK/36/ly5drw4YNKikpUXp6ujIyMuTz+ZxyAm2PDRs2yOfzBQ3x8fHatm2b1q5dq7KyMsXExDg3TU9KSlJ8fLzT+U3jxo1VWFhYqR1zIOU/jyvW7WBUtXxgm/bs2ePcCLyq9vCB2nPl2w5ut9vZ1sB+kfYdD4GOkwLKt+d2797ttH0yMjJUWlrqtNHDw8O1du1abdu2Tb///ruys7OVkJBQqR5VtQ8rtmsqWr16tbNcenq6YmNjD3n7D1XgfGDv3r0qLi5WZGTkfsutarsOJNA+lPYdc0fSOdKhrv9g91fF86L99Vhak9tzqPU8nP1/JI70tX6s/f7770Hv+xVf54frUPbDgV7nh+Ngc4Kjtf1Hy5HkHwRaAAAAAAAACClHHiMDAAAAAAAAxxCBFgAAAAAAAEIKgRYAAAAAAABCCoEWAAAAAAAAQgqBFgAAAAAAAEIKgRYAAAAAAABCCoEWAAC1ZNOmTbrhhhuUkZEhv9+vtLQ09enTR1988YUkqWHDhnK5XHrllVcqLZudnS2Xy6Xnn3/eGdewYUM9/vjj1T4ub9WqVXK5XFUO8+fPlySVlpbqr3/9q1q2bKmIiAglJiaqc+fOevbZZ2tsHwAAAACHw1PbFQAA4H/VgAEDVFxcrBdeeEGNGzdWfn6+Zs2apS1btjjzpKenKzc3V4MHD3bGzZ8/Xxs2bFBUVNQR12HmzJnKzs4OGlenTh1J0gMPPKBnnnlGTz31lDp27KiCggJ9++232rp16xGvFwAAADgSBFoAANSCbdu26bPPPtOcOXPUo0cPSVJmZqZOPvnkoPkuvfRSTZgwQb/99pvS09MlSdOmTdOll16qF1988YjrUadOHaWlpVU5bfr06brxxhv1hz/8wRnXtm3bI14nAAAAcKT4ySEAALUgOjpa0dHRevvtt1VUVFTtfKmpqerTp49eeOEFSdKuXbv06quv6qqrrjrqdUxLS9Mnn3yiTZs2HfV1AQAAAIeCQAsAgFrg8Xj0/PPP64UXXlB8fLy6deumu+66S99//32lea+66io9//zzMjO98cYbatKkiXJycmqkHl27dnXCtcAQMH78eG3atElpaWlq06aNrr/+en3wwQc1sl4AAADgSBBoAQBQSwYMGKB169Zp+vTpOvvsszVnzhy1b98+6EbvkvT//t//086dO/Xpp59q2rRpNXp11quvvqpFixYFDQFZWVlasmSJ5s+fr6uuukobN25Uv379NGzYsBpbPwAAAHA4CLQAAKhF4eHhOuuss3TPPffoyy+/1BVXXKH77rsvaB6Px6MhQ4bovvvu01dffaVLL720xtafnp6upk2bBg3lud1uderUSbfccov+/e9/6/nnn9dzzz2nlStX1lgdAAAAgENFoAUAwHEkKytLhYWFlcZfddVVmjt3rs4//3wlJCTUQs32ycrKkqQq6wgAAAAcK/RyCABALdiyZYv+8Ic/6KqrrlKbNm0UExOjb7/9Vo8++qjOP//8SvO3atVKmzdvVmRk5CGtZ+3atUE/I5T29aZYvh4bNmwImh4fH6/w8HANHDhQ3bp1U9euXZWWlqaVK1dq9OjRat68uVq2bHlI9QAAAABqEoEWAAC1IDo6Wp07d9aECRO0YsUKlZSUKD09Xddcc43uuuuuKpepU6fOIa/nscce02OPPRY07h//+IdOPfVUSVKvXr0qLfOvf/1LgwcPVp8+ffSvf/1LY8eO1fbt25WWlqaePXvq/vvvl8dDEwIAAAC1x2VmVtuVAAAAAAAAAA4W99ACAAAAAABASCHQAgAAAAAAQEgh0AIAAAAAAEBIIdACAAAAAABASCHQAgAAAAAAQEgh0AIAAAAAAEBIIdACAAAAAABASCHQAgAAAAAAQEgh0AIAAAAAAEBIIdACAAAAAABASCHQAgAAAAAAQEj5/2z63vjGvKGaAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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rG9L8zF16tTg1FNPDbZs2RJZPv7440h7W5qLbdu2Bd27dw+uueaaYOnSpcFf//rXYP78+cH69esjfdrKZ2h1dXXUe2LBggUBECxatCgIguZ9XxiKjoCzzz47KCwsjLyur68PsrOzg+Li4hhWdWR9MRQ1NDQEmZmZwa9//evIupqamiApKSn4/e9/HwRBELz77rsBELz55puRPi+++GIQCoWCjz76qNlqPxKqq6sDIFi8eHEQBJ+NPSEhIXjqqacifdauXRsAQVlZWRAEn4XMuLi4oLKyMtJn+vTpQXJyclBXV9e8A2hixx57bPDf//3fbXYetm/fHpx00knBggULgn/6p3+KhKK2Nh9Tp04NTj/99IO2tbW5mDRpUnDeeecdsr0tf4beeOONwQknnBA0NDQ0+/vC02dNbM+ePZSXl1NQUBBZFxcXR0FBAWVlZTGsrHlt2LCBysrKqHlISUkhLy8vMg9lZWWkpqYycODASJ+CggLi4uJYunRps9fclGprawFIS0sDoLy8nL1790bNR69evcjNzY2aj759+0Y9dHTYsGGEw2HWrFnTjNU3nfr6embPns3OnTvJz89vs/NQWFjIiBEjosYNbfN98f7775Odnc3xxx/P6NGjqaj47BvU29pcPPfccwwcOJDvf//7pKen079/f377299G2tvqZ+iePXv43e9+xw9/+ENCoVCzvy8MRU1s69at1NfXH/A07YyMDCorK2NUVfPbP9Yvm4fKykrS09Oj2uPj40lLS2vVc9XQ0MCECRM499xzOe2004DPxpqYmHjAd+x9cT4ONl/721qTVatW0alTJ5KSkrjhhht45pln6NOnT5ubB4DZs2fz1ltvUVxcfEBbW5uPvLw8Zs6cybx585g+fTobNmzgm9/8Jtu3b29zc/HXv/6V6dOnc9JJJzF//nzGjRvHj3/8Yx5//HGg7X6Gzpkzh5qaGq655hqg+f+NHDVPtJZaisLCQlavXs1rr70W61Ji5pRTTmHFihXU1tbyP//zP4wZM4bFixfHuqxmt2nTJm688UYWLFhA+/btY11OzA0fPjzyc79+/cjLy6N79+788Y9/pEOHDjGsrPk1NDQwcOBA7rzzTgD69+/P6tWrefjhhxkzZkyMq4udRx99lOHDhzfZt94fLo8UNbGuXbvSrl27A66Mr6qqIjMzM0ZVNb/9Y/2yecjM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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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XnvNc7u9vd1yOp3Wr3/9a8+6pqYmKzIy0nrhhRf8Pg9ndvzgxIkTqqqqUm5urmddSEiIcnNzVVFRYeNkZmtubpYkJSQk2DyJmQoKCjR+/Hiv/67hO2+++aaGDRum73//+0pMTNSQIUP0hz/8we6xjHP99derrKxMn376qSTpb3/7mzZv3qyxY8faPJnZ9u3bJ5fL5fXvR1xcnLKysgLye9GIT1AONo2NjWprazvjE5yTkpK0e/dum6YyW3t7u2bPnq2RI0fq2muvtXsc47z44ov66KOPtH37drtHMdbf//53rVixQkVFRbr//vu1fft23X333YqIiNCUKVPsHs8Y9913n9xutzIyMhQaGqq2tjY98sgjys/Pt3s0o7lcLkk66+/F09v8idiBEQoKClRTU6PNmzfbPYpx9u/fr1mzZmn9+vWKioqyexxjtbe3a9iwYXr00UclSUOGDFFNTY1WrlxJ7PjQyy+/rOeff16lpaXq37+/qqurNXv2bKWkpPA8G4yXsfyge/fuCg0NVX19vdf6+vp6OZ1Om6YyV2FhodauXav33ntPV199td3jGKeqqkoNDQ36xje+obCwMIWFham8vFxPPPGEwsLC1NbWZveIRkhOTla/fv281mVmZqqurs6micx0zz336L777tPkyZM1YMAA3X777ZozZ46Ki4vtHs1op3/32fV7kdjxg4iICA0dOlRlZWWede3t7SorK1N2draNk5nFsiwVFhbqtdde08aNG5Wenm73SEYaNWqUPv74Y1VXV3uWYcOGKT8/X9XV1QoNDbV7RCOMHDnyjI9O+PTTT9WjRw+bJjLTV199pZAQ7199oaGham9vt2miy0N6erqcTqfX70W3263KysqA/F7kZSw/KSoq0pQpUzRs2DCNGDFCy5Yt09GjR3XnnXfaPZoxCgoKVFpaqjfeeEMxMTGe133j4uIUHR1t83TmiImJOeM6qK5du6pbt25cH+VDc+bM0fXXX69HH31UP/jBD7Rt2zatWrVKq1atsns0o0yYMEGPPPKI0tLS1L9/f/31r3/V0qVLddddd9k9WqfX0tKivXv3em7v27dP1dXVSkhIUFpammbPnq2HH35Yffr0UXp6uubPn6+UlBRNnDjR/8P5/f1el7Hly5dbaWlpVkREhDVixAhr69atdo9kFElnXVavXm33aMbjref+8dZbb1nXXnutFRkZaWVkZFirVq2yeyTjuN1ua9asWVZaWpoVFRVl9erVy/rlL39ptba22j1ap/fee++d9d/kKVOmWJb1r7efz58/30pKSrIiIyOtUaNGWbW1tQGZzWFZfGwkAAAwF9fsAAAAoxE7AADAaMQOAAAwGrEDAACMRuwAAACjETsAAMBoxA4AADAasQMAAIxG7AAAAKMROwCMlpOTo9mzZ5+xfs2aNYqPjw/4PAACj9gBAABG41vPAXRqOTk5nm9f/9Of/qTw8HDNmDFDixcvlsPhsHk6AMGAMzsAOr1nn31WYWFh2rZtm373u99p6dKl+uMf/2j3WACCBN96DqBTy8nJUUNDg3bu3Ok5k3PffffpzTff1CeffKKcnBxt2bJFERERXj936tQpRUVFqampyYapAQQSZ3YAdHrXXXed10tW2dnZ2rNnj9ra2iRJ+fn5qq6u9loWL15s17gAAoxrdgAYLy4uTl//+te91iUmJto0DYBA48wOgE6vsrLS6/bWrVvVp08fhYaG2jQRgGBC7ADo9Orq6lRUVKTa2lq98MILWr58uWbNmmX3WACCBC9jAej07rjjDh07dkwjRoxQaGioZs2apenTp9s9FoAgwbuxAHRqOTk5Gjx4sJYtW2b3KACCFC9jAQAAoxE7AADAaLyMBQAAjMaZHQAAYDRiBwAAGI3YAQAARiN2AACA0YgdAABgNGIHAAAYjdgBAABGI3YAAIDR/g99zKYyGxs+RQAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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y8u1c+dO7dy5U9LPNz7v3LlTx44dU3l5uaZNm6YtW7bou+++U1ZWloYNG6YbbrhBaWlpkqSOHTtq8ODBGj9+vLZt26bPP/9cGRkZuvfee3knFgAAkFTLl7HOnDmjv/3tb1q7dq26du2q4OBgt/ZXXnmlWuN88cUXuvXWW137F15aGjNmjN58803t2rVLb7/9tkpKSpSYmKhBgwbphRdecPusncWLFysjI0MDBw5UQECARo4cqddff7020wIAABaqVdjZtWuXunfvLknavXu3W1tNblYeMGCAjDGXbF+9evUVx4iOjuYDBAEAwCXVKuysX7/e03UAAAB4Ra3u2QEAAKgvanVl59Zbb73sy1Xr1q2rdUEAAACeVKuwc+F+nQsqKyu1c+dO7d69+6IvCAUAAPClWoWdV199tcrjs2fPVnl5+VUVBAAA4EkevWfngQce8Nj3YgEAAHiCR8NOdna2wsLCPDkkAADAVanVy1gjRoxw2zfGqKCgQF988YWeeeYZjxQGAADgCbUKO5GRkW77AQEBat++vZ5//nkNGjTII4UBAAB4Qq3CzsKFCz1dBwAAgFfUKuxckJOTo3379kmSOnfurN/85jceKQoAAMBTahV2iouLde+992rDhg2KioqSJJWUlOjWW2/Vu+++qyZNmniyRgAAgFqr1buxJk6cqFOnTmnPnj06efKkTp48qd27d6usrEyTJk3ydI0AAAC1VqsrO6tWrdLatWvVsWNH17FOnTopMzOTG5QBAIBfqdWVHafTqeDg4IuOBwcHy+l0XnVRAAAAnlKrsHPbbbfpD3/4g/Lz813H8vLyNGXKFA0cONBjxQEAAFytWoWd//mf/1FZWZlatmypNm3aqE2bNmrVqpXKyso0f/58T9cIAABQa7W6ZycpKUlffvml1q5dq/3790uSOnbsqNTUVI8WBwAAcLVqdGVn3bp16tSpk8rKyuRwOPQf//EfmjhxoiZOnKhevXqpc+fO+uyzz7xVKwAAQI3VKOzMmzdP48ePV0RExEVtkZGRevTRR/XKK694rDgAAICrVaOw89VXX2nw4MGXbB80aJBycnKuuigAAABPqVHYKSoqqvIt5xcEBQXphx9+uOqiAAAAPKVGYadp06bavXv3Jdt37dqlhISEqy4KAADAU2oUdm6//XY988wzOnPmzEVtP/30k2bNmqXf/e53HisO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VFFR4dovLS2VJJWVlXm0tlOnTulUca7OnPq3AspLFeA8p/IT+QoIbSjn2TMKcAS6/gww53Xw4EGdOnVKhYWFOlWcK0k6eDBCp06dumjswsJCnav46f/6HKyyT21Ude7q1ONPLtRbeeZHnSk7oYMHIyTJr+dQVc2/rrE6fXytus/duvq38NbPCYAr++XP36lTpzz+O1b6/7+3jTGX72jquby8PCPJbN682e34tGnTTO/evat8zKxZs4wkNjY2NjY2Ngu23Nzcy2aFen9lJyYmRoGBgSoqKnI7XlRUpPj4+CofM2PGDE2dOtW173Q6dfLkSV1//fVyOBweq62srExJSUnKzc1VRESEx8aFO9a57rDWdYN1rhusc93w5jobY3Tq1CklJiZetl+9DzshISHq0aOHsrKyNHz4cEk/h5esrCxlZGRU+ZjQ0FCFhoa6HYuKivJajREREfwg1QHWue6w1nWDda4brHPd8NY6R0ZGXrFPvQ87kjR16lSNGTNGPXv2VO/evTVv3jydPn1aDz30kK9LAwAAPmZF2Lnnnnv0ww8/6Nlnn1VhYaG6d++uVatWXXTTMgAAuPZYEXYkKSMj45IvW/lKaGioZs2addFLZvAs1rnusNZ1g3WuG6xz3fCHdXYYc6X3awEAANRfVnyCMgAAwKUQdgAAgNUIOwAAwGqEnRrKzMxUy5YtFRYWpuTkZG3btu2y/ZcuXaoOHTooLCxMXbp00SeffOLWbozRs88+q4SEBDVo0ECpqak6ePCgN6dQL3hynSsrKzV9+nR16dJFDRs2VGJioh588EHl5+d7exp+z9PP51967LHH5HA4NG/ePA9XXf94Y5337dunO++8U5GRkWrYsKF69eqlY8eOeWsK9YKn17m8vFwZGRlq1qyZGjRo4PqiadRsrffs2aORI0eqZcuWl/0/oab/fjXike9suEa8++67JiQkxLz11ltmz549Zvz48SYqKsoUFRVV2f/zzz83gYGBZu7cuWbv3r1m5syZJjg42Hz99deuPi+++KKJjIw0y5YtM1999ZW58847TatWrcxPP/1UV9PyO55e55KSEpOammree+89s3//fpOdnW169+5tevToUZfT8jveeD5f8MEHH5hu3bqZxMRE8+qrr3p5Jv7NG+t86NAhEx0dbaZNm2a+/PJLc+jQIbN8+fJLjnkt8MY6jx8/3rRp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4eHh6tu3rw4cOOB2vo8++ki9evVSWFiYYmJidNddd7naKioq9OSTT6pp06Zq2LChkpOTtWHDBlf7hZfsVq9erY4dO6pRo0YaPHiwCgoKJEmzZ8/W22+/reXLl8vhcMjhcGjDhg2uqy3vvfee+vfvr7CwMC1evFgnTpzQfffdp6ZNmyo8PFxdunTRO++84zrf2LFjtXHjRr322muu8ap7RWbMmDFauHCh27GFCxdqzJgx1Xo8YC2PfaUoAL8xZswYM2zYMGPMz99AHBERYWbPnm2++eYb8/bbbxuHw2E+/fRTV39JplmzZmbJkiXm4MGDZtKkSaZRo0bmxIkTxhhj1q9fbySZf//738YYYxYuXGiCg4NNz549zebNm80XX3xhevfubfr27Vut+rp27WoGDRp0xX6TJk0yiYmJ5pNPPjF79uwxY8aMMdddd91FdSUnJ5sNGzaYPXv2mN/+9rdudaxcudIEBgaaZ5991uzdu9fs3LnT/OlPf3K1P/LII6Zv375m06ZN5tChQ+all14yoaGh5ptvvnGba2pqqtm+fbvJyckxHTt2NPfff78xxphTp06Zu+++2wwePNgUFBSYgoICU1FR4fqm55YtW5r//d//Nd9++63Jz88333//vXnppZfMjh07zOHDh83rr79uAgMDzdatW40xxpSUlJiUlBQzfvx413jnzp277DpdONe2bdtMTEyM+eyzz4wxxnz22WemSZMmZtu2bUaSOXLkSLX+fQDbEHYAC/067Nx8881u7b169TLTp0937UsyM2fOdO2Xl5cbSeaf//ynMabqsCPJbNmyxfWYffv2GUmuX9qX06BBAzNp0qTL9ikvLzfBwcFm8eLFrmNnz541iYmJZu7cuW51rV271tXn448/NpLMTz/9ZIwxJiUlxYwaNarKcxw9etQEBgaavLw8t+MDBw40M2bMcJvroUOHXO2ZmZkmLi7Otf/L9b7gQgCZN2/eZedpjDFDhw41TzzxhGu/f//+5g9/+MMVH/frc+3YscNMnjzZPPTQQ8YYYx566CEzZcoUs2PHDsIOrmm8jAVcA7p27eq2n5CQoOLi4kv2adiwoSIiIi7q80tBQUHq1auXa79Dhw6KiorSvn37rliPMeaKfQ4fPqzKykr169fPdSw4OFi9e/e+6By/rD0hIUGSXLXv3LlTAwcOrPIcX3/9tc6fP6927dqpUaNGrm3jxo06fPiwq194eLjatGnjdo7Lrc0v9ezZ023//PnzeuGFF9SlSxdFR0erUaNGWr16tY4dO1at8a5k3LhxWrp0qQoLC7V06VKNGzfOI+MC9VmQrwsA4H3BwcFu+w6HQ06ns8Z9PKVdu3bav3+/x8b7Ze0XbqK+UHuDBg0u+bjy8nIFBgYqJydHgYGBbm2NGjWqcvwL56hOYJN+Do6/9NJLL+m1117TvHnz1KVLFzVs2FCTJ0/W2bNnqzXelXTp0kUdOnTQfffdp44dO+rGG2/Uzp07PTI2UF9xZQdArZw7d05ffPGFa//AgQMqKSlRx44dr/jY+++/X2vXrtWOHTsuaqusrNTp06fVpk0bhYSE6PPPP3dr2759uzp16lTtOrt27aqsrKwq237zm9/o/PnzKi4u1g033OC2xcfHV/scISEhOn/+fLX6fv755xo2bJgeeOABdevWTa1bt9Y333xT6/GqMm7cOG3YsIGrOsD/IewAqJXg4GBNnDhRW7duVU5OjsaOHas+ffqod+/eV3zs5MmT1a9fPw0cOFCZmZn66quv9O233+r9999Xnz59dPDgQTVs2FCPP/64pk2bplWrVmnv3r0aP368fvzxRz388MPVrnPWrFl65513NGvWLO3bt09ff/21/vznP0v6+QrTqFGj9OCDD+qDDz7QkSNHtG3bNs2ZM0cff/xxtc/RsmVL7dq1SwcOHNDx48cv+xbztm3bas2aNdq8ebP27dunRx99VEVFRReNt3XrVn333Xc6fvx4ja+wjR8/Xj/88IMeeeSRGj0OsBVhB0CthIeHa/r06br//vvVr18/NWrUSO+99161HhsaGqo1a9boqaee0l//+lf16dNHvXr10uuvv65JkybpxhtvlCS9+OKLGjlypEaPHq2bbrpJhw4d0urVq3XddddVu84BAwZo6dKlWrFihbp3767bbrtN27Ztc7UvXLhQDz74oJ544gm1b99ew4cP1/bt29W8efNqn2P8+PFq3769evbsqSZNmrhdjfq1mTNn6qabblJaWpoGDBig+Pj4iz6Q8Mknn1RgYKA6deqkJk2a1Ph+nqCgIMXExCgoiDsVAElymOq+8AwAAFAPcWUHAABYjbADwOM6d+7s9lbuX26LFy/2dXn1zmOPPXbJ9Xzsscd8XR7g93gZC4DHHT169JI36cbFxalx48Z1XFH9VlxcrLKysirbIiIiFBsbW8cVAfULYQcAAFiNl7EAAIDVCDsAAMBqhB0AAGA1wg4AALAaYQcAAFiNsAMAAKxG2AEAAFYj7AAAAKv9P+bDKgz8xq1kAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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Pt8XGBio0NDQWhsAALDTNRU75eXlOnz4sGJiYtSvXz/5+/srOzvbuT8/P19Hjx5VQkKCB6cEAADexKs/xnryySd13333qX379iosLFR6erp8fX310EMPKSwsTJMmTdL06dMVERGh0NBQTZs2TQkJCXwTCwAAOHl17Bw/flwPPfSQTp8+rdatW2vIkCH69NNP1bp1a0nS888/Lx8fH6WkpKiiokJJSUn63e9+5+GpAQCAN/Hq2FmzZk29+4OCgpSRkaGMjIxmmggAAFxrrqlrdgAAABqL2AEAAFYjdgAAgNW8+podAADg3bp076miwsJ6j4mJjVX+vj3NNNHliB0AAOCyosJCjVr8fr3HbJgxupmmqRsfYwEAAKsROwAAwGrEDgAAsBqxAwAArEbsAAAAqxE7AADAasQOAACwGrEDAACsRuwAAACrETsAAMBqxA4AALAasQMAAKxG7AAAAKsROwAAwGrEDgAAsBqxAwAArEbsAAAAqxE7AADAasQOAACwGrEDAACsRuwAAACrETsAAMBqxA4AALAasQMAAKxG7AAAAKsROwAAwGrEDgAAsBqxAwAArEbsAAAAqxE7AADAasQOAACwGrEDAACsRuwAAACrETsAAMBqxA4AALAasQMAAKxG7AAAAKsROwAAwGrEDgAAsBqxAwAArEbsAAAAqxE7AADAasQOAACwGrEDAACsRuwAAACrETsAAMBqxA4AALAasQMAAKxG7AAAAKsROwAAwGrEDgAAsBqxAwAArEbsAAAAqxE7AADAasQOAACwGrEDAACsRuwAAACrETsAAMBqxA4AALCan6cHAADAG3Xp3lNFhYX1HhMTG6v8fXuaaSK4itgBAKAORYWFGrX4/XqP2TBjdDNNg6vBx1gAAMBq1sRORkaGOnTooKCgIMXHx+vzzz/39EgAAMALWBE7f/rTnzR9+nSlp6fryy+/VO/evZWUlKSTJ096ejQAAOBhVsTOc889p8mTJ+uRRx5R9+7dtWzZMt14441avny5p0cDAAAeds3HTmVlpXJzc5WYmOi8z8fHR4mJicrJyfHgZAAAwBtc89/G+uabb1RdXa2oqKha90dFRenAgQN1PqaiokIVFRXO26WlpZKksrIyt89njFHVd+d/8JimeO36Xo+ZAKB+/LvUMJ5cp0vPaYyp/0BzjTtx4oSRZLZv317r/qeeesoMHDiwzsekp6cbSWxsbGxsbGwWbMeOHau3Fa75MzutWrWSr6+vSkpKat1fUlKi6OjoOh8za9YsTZ8+3Xm7pqZGZ86c0U033SSHw+G22crKyhQXF6djx44pNDTUbc9rI9aqcVivhmOtGo61ajjWquGacq2MMTp37pxiY2PrPe6aj52AgAD169dP2dnZGjt2rKR/xEt2drbS0tLqfExgYKACAwNr3RceHt5kM4aGhvIfQwOxVo3DejUca9VwrFXDsVYN11RrFRYW9oPHXPOxI0nTp0/XhAkT1L9/fw0cOFAvvPCCzp8/r0ceecTTowEAAA+zInYefPBBnTp1SnPnzlVxcbH69OmjrKysyy5aBgAA1x8rYkeS0tLSrvixlacEBgYqPT39so/McDnWqnFYr4ZjrRqOtWo41qrhvGGtHMb80Pe1AAAArl3X/A8VBAAAqA+xAwAArEbsAAAAqxE7VykjI0MdOnRQUFCQ4uPj9fnnn9d7/Nq1a9W1a1cFBQXptttu04YNG5ppUs9rzFrt3btXKSkp6tChgxwOh1544YXmG9QLNGatXn31Vd1xxx1q2bKlWrZsqcTExB/8e2ibxqzX22+/rf79+ys8PFwtWrRQnz599Mc//rEZp/Wsxv6bdcmaNWvkcDicP8/setCYtcrMzJTD4ai1BQUFNeO0ntXYv1dnz55VamqqYmJiFBgYqM6dOzft/w/d80sbrk9r1qwxAQEBZvny5Wbv3r1m8uTJJjw83JSUlNR5/LZt24yvr69ZvHix2bdvn5k9e7bx9/c3X331VTNP3vwau1aff/65efLJJ80bb7xhoqOjzfPPP9+8A3tQY9fqxz/+scnIyDA7d+40+/fvNxMnTjRhYWHm+PHjzTy5ZzR2vT744APz9ttvm3379plDhw6ZF154wfj6+pqsrKxmnrz5NXatLikoKDBt2rQxd9xxhxkzZkzzDOthjV2rFStWmNDQUFNUVOTciouLm3lqz2jsWlVUVJj+/fubUaNGmU8++cQUFBSYrVu3mry8vCabkdi5CgMHDjSpqanO29XV1SY2NtYsXLiwzuP/7d/+zYwePbrWffHx8eaxxx5r0jm9QWPX6vvat29/XcXO1ayVMcZcvHjRhISEmJUrVzbViF7latfLGGP69u1rZs+e3RTjeRVX1urixYtm8ODB5ve//72ZMGHCdRM7jV2rFStWmLCwsGaazrs0dq1eeukl06lTJ1NZWdlcIxo+xnJRZWWlcnNzlZiY6LzPx8dHiYmJysnJqfMxOTk5tY6XpKSkpCsebwtX1up65Y61+vvf/66qqipFREQ01Zhe42rXyxij7Oxs5efn684772zKUT3O1bWaP3++IiMjNWnSpOYY0yu4ulbl5eVq37694uLiNGbMGO3du7c5xvUoV9bq3XffVUJCglJTUxUVFaWePXvq17/+taqrq5tsTmLHRd98842qq6sv+ynNUVFRKi4urvMxxcXFjTreFq6s1fXKHWs1c+ZMxcbGXhbWNnJ1vUpLSxUcHKyAgACNHj1aS5cu1d13393U43qUK2v1ySef6LXXXtOrr77aHCN6DVfWqkuXLlq+fLneeecdvf7666qpqdHgwYN1/Pjx5hjZY1xZq7/97W968803VV1drQ0bNmjOnDl69tlntWDBgiab05qfoAxAWrRokdasWaOtW7deVxdHNlZISIjy8vJUXl6u7OxsTZ8+XZ06ddKwYcM8PZrXOHfunB5++GG9+uqratWqlafH8XoJCQlKSEhw3h48eLC6deuml19+Wc8884wHJ/M+NTU1ioyM1CuvvCJfX1/169dPJ06c0H//938rPT29SV6T2HFRq1at5Ovrq5KSklr3l5SUKDo6us7HREdHN+p4W7iyVterq1mrJUuWaNGiRdq8ebN69erVlGN6DVfXy8fHR7fccoskqU+fPtq/f78WLlxodew0dq0OHz6sI0eO6L777nPeV1NTI0ny8/NTfn6+br755qYd2kPc8W+Wv7+/+vbtq0OHDjXFiF7DlbWKiYmRv7+/fH19nfd169ZNxcXFqqysVEBAgNvn5GMsFwUEBKhfv37Kzs523ldTU6Ps7Oxadf99CQkJtY6XpE2bNl3xeFu4slbXK1fXavHixXrmmWeUlZWl/v37N8eoXsFdf7dqampUUVHRFCN6jcauVdeuXfXVV18pLy/Pud1///0aPny48vLyFBcX15zjNyt3/L2qrq7WV199pZiYmKYa0yu4sla33367Dh065IxnSfr6668VExPTJKEjia+eX401a9aYwMBAk5mZafbt22emTJliwsPDnV83fPjhh83Pf/5z5/Hbtm0zfn5+ZsmSJWb//v0mPT39uvrqeWPWqqKiwuzcudPs3LnTxMTEmCeffNLs3LnTHDx40FNvodk0dq0WLVpkAgICzJtvvlnra6/nzp3z1FtoVo1dr1//+tfmf//3f83hw4fNvn37zJIlS4yfn5959dVXPfUWmk1j1+qfXU/fxmrsWs2bN89s3LjRHD582OTm5ppx48aZoKAgs3fvXk+9hWbT2LU6evSoCQkJMWlpaSY/P9+sX7/eREZGmgULFjTZjMTOVVq6dKlp166dCQgIMAMHDjSffvqpc9/QoUPNhAkTah3/5z//2XTu3NkEBASYHj16mPfff7+ZJ/acxqxVQUGBkXTZNnTo0OYf3AMas1bt27evc63S09Obf3APacx6/fKXvzS33HKLCQoKMi1btjQJCQlmzZo1HpjaMxr7b9b3XU+xY0zj1urxxx93HhsVFWVGjRplvvzySw9M7RmN/Xu1fft2Ex8fbwIDA02nTp3Mr371K3Px4sUmm4/feg4AAKzGNTsAAMBqxA4AALAasQMAAKxG7AAAAKsROwAAwGrEDgAAsBqxAwAArEbsAAAAqxE7ABokMzNT4eHhnh4DABqN2AGuE6dOndLUqVPVrl07BQYGKjo6WklJSdq2bZtLz/f000+rT58+jX7czp079a//+q+KiopSUFCQbr31Vk2ePFlff/21S3N4ypEjR+RwOJSXl+eW59u6dascDofOnj3b4MdMnDhRDodDP/3pTy/bl5qaKofDoYkTJ7plPuBaRuwA14mUlBTt3LlTK1eu1Ndff613331Xw4YN0+nTp5tthvXr12vQoEGqqKjQqlWrtH//fr3++usKCwvTnDlzmm2O5lRZWdmkzx8XF6c1a9bou+++c9534cIFrV69Wu3atWvS1wauGU32W7cAeI1vv/3WSDJbt2694jHPPvus6dmzp7nxxhtN27ZtzdSpU2v95vQVK1aYsLAw55/1T794dMWKFfXOcP78edOqVSszduzYK854ydatW82AAQNMQECAiY6ONjNnzjRVVVXO/UOHDjXTpk0zTz31lGnZsqWJioq67Beffvvtt2bKlCkmMjLSBAYGmh49epj33nvPuf/jjz82Q4YMMUFBQaZt27Zm2rRppry83Lm/ffv25le/+pV55JFHTHBwsImLizMvv/yyc/8/v/9Lv6T20i/LXLBggYmJiTEdOnQwxhjzhz/8wfTr188EBwebqKgo89BDD5mSkhJjTN2/+La+X8h5yaXX6tmzp3n99ded969atcr06tXLjBkzpkHPA9iOMzvAdSA4OFjBwcFat26dKioq6jzGx8dHL774ovbu3auVK1dqy5YtmjFjRp3HPvjgg/qv//ov9ejRQ0VFRSoqKtKDDz5Y7wwbN27UN998c8XnvHQ90IkTJzRq1CgNGDBAu3bt0ksvvaTXXntNCxYsqHX8ypUr1aJFC3322WdavHix5s+fr02bNkmSampqNHLkSG3btk2vv/669u3bp0WLFsnX11eSdPjwYSUnJyslJUW7d+/Wn/70J33yySdKS0ur9RrPPvus+vfvr507d+pnP/uZpk6dqvz8fEnS559/LknavHmzioqK9Pbbbzsfl52drfz8fG3atEnr16+XJFVVVemZZ57Rrl27tG7dOh05csT5EVNcXJzeeustSVJ+fr6Kior0P//zP/Wu5/c9+uijWrFihfP28uXL9cgjjzT48YD1PF1bAJrHm2++aVq2bGmCgoLM4MGDzaxZs8yuXbuuePzatWvNTTfd5Lz9/TM7xhiTnp5uevfu3eDX/81vfmMkmTNnztR73C9+8QvTpUsXU1NT47wvIyPDBAcHm+rqamPMP87sDBkypNbjBgwYYGbOnGmMMWbjxo3Gx8fH5Ofn1/kakyZNMlOmTKl138cff2x8fHzMd999Z4z5x5mdn/zkJ879NTU1JjIy0rz00kvGmP9/Nmbnzp21nmfChAkmKirKVFRU1Ps+d+zYYSQ5z5598MEHRlKtM1w/5NKZnZMnT5rAwEBz5MgRc+TIERMUFGROnTrFmR3g/3BmB7hOpKSkqLCwUO+++66Sk5O1detW/ehHP1JmZqakf5yhGDFihNq0aaOQkBA9/PDDOn36tP7+97+75fWNMQ06bv/+/UpISJDD4XDed/vtt6u8vFzHjx933terV69aj4uJidHJkyclSXl5eWrbtq06d+5c52vs2rVLmZmZzjNewcHBSkpKUk1NjQoKCup8DYfDoejoaOdr1Oe2225TQEBArftyc3N13333qV27dgoJCdHQoUMlSUePHv3B5/shrVu31ujRo5WZmakVK1Zo9OjRatWq1VU/L2ALYge4jgQFBenuu+/WnDlztH37dk2cOFHp6ek6cuSI7r33XvXq1UtvvfWWcnNzlZGRIcl9F9heCo8DBw645fn8/f1r3XY4HKqpqZEk3XDDDfU+try8XI899pjy8vKc265du3Tw4EHdfPPNDXqN+rRo0aLW7fPnzyspKUmhoaFatWqVduzYob/85S+S3Le+jz76qDIzM7Vy5Uo9+uijbnlOwBbEDnAd6969u86fP6/c3FzV1NTo2Wef1aBBg9S5c2cVFhbW+9iAgABVV1c3+LXuuecetWrVSosXL65z/6WvXHfr1k05OTm1zgRt27ZNISEhatu2bYNeq1evXjp+/PgVv87+ox/9SPv27dMtt9xy2fbPZ2Su5NJxDVmDAwcO6PTp01q0aJHuuOMOde3a9bIzRI15vrokJyersrJSVVVVSkpKcuk5AFsRO8B14PTp07rrrrv0+uuva/fu3SooKNDatWu1ePFijRkzRrfccouqqqq0dOlS/e1vf9Mf//hHLVu2rN7n7NChgwoKCpSXl6dvvvnmihc+X9KiRQv9/ve/1/vvv6/7779fmzdv1pEjR/TFF19oxowZzp8V87Of/UzHjh3TtGnTdODAAb3zzjtKT0/X9OnT5ePTsH+yhg4dqjvvvFMpKSnatGmTCgoK9Ne//lVZWVmSpJkzZ2r79u1KS0tTXl6eDh48qHfeeeeyC5TrExkZqRtuuEFZWVkqKSlRaWnpFY9t166dAgICnOv77rvv6plnnql1TPv27eVwOLR+/XqdOnVK5eXlDZ5Fknx9fbV//37t27fPeSE2gH8gdoDrQHBwsOLj4/X888/rzjvvVM+ePTVnzhxNnjxZv/3tb9W7d28999xz+s1vfqOePXtq1apVWrhwYb3PmZKSouTkZA0fPlytW7fWG2+88YNzjBkzRtu3b5e/v79+/OMfq2vXrnrooYdUWlrq/LZVmzZttGHDBn3++efq3bu3fvrTn2rSpEmaPXt2o97zW2+9pQEDBuihhx5S9+7dNWPGDOdZk169eunDDz/U119/rTvuuEN9+/bV3LlzFRsb2+Dn9/Pz04svvqiXX35ZsbGxGjNmzBWPbd26tTIzM7V27Vp1795dixYt0pIlS2od06ZNG82bN08///nPFRUV1ajwuiQ0NFShoaGNfhxgO4dp6FWDAAAA1yDO7AAAAKsROwDcYtWqVbW+yv39rUePHp4e75pz9OjRK65ncHCwW76yDlwv+BgLgFucO3dOJSUlde7z9/dX+/btm3mia9vFixd15MiRK+7v0KGD/Pz8mm8g4BpG7AAAAKvxMRYAALAasQMAAKxG7AAAAKsROwAAwGrEDgAAsBqxAwAArEbsAAAAqxE7AADAav8P+V6ffwkdGTAAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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aBaNWrMDAADQWjTqys6gQYNOeLtq3bp1jS4IAAAgkBoVdo6t1zmmpqZGxcXF2rZtW70fCAUAAAimRoWdBQsWNNj+wAMPqKqqqkkFAQAABFJA1+z84he/4HexAABASAlo2CksLFR0dHQgDwkAANAkjbqNdd111/ntG2P0+eef691339X06dMDUhgAAEAgNCrsuFwuv/2wsDCde+65mj17tq644oqAFAYAABAIjQo7eXl5ga4DAACgWTQq7BxTVFSknTt3SpJ69eqlvn37BqQoAACAQGlU2Dl48KBGjhyp119/XfHx8ZIkj8ejQYMGadWqVTrjjDMCWSMAAECjNepprMmTJ+urr77S9u3bVV5ervLycm3btk1er1d33HFHoGsEAABotEZd2cnPz9drr72mnj17+trOO+885ebmskAZAACElEZd2amrq1NkZGS99sjISNXV1TW5KAAAgEBpVNi5/PLL9atf/UoHDhzwte3fv1933nmnBg8eHLDiAAAAmqpRYWfx4sXyer3q2rWrunXrpm7duik1NVVer1c5OTmBrhEAAKDRGrVmJyUlRZs3b9Zrr72mDz74QJLUs2dPZWRkBLQ4AACApjqlKzvr1q3TeeedJ6/XK4fDoZ/85CeaPHmyJk+erEsuuUS9evXS//3f/zVXrQAAAKfslMLOwoULlZWVpbi4uHp9LpdLt956q+bPnx+w4gAAAJrqlMLOe++9pyFDhhy3/4orrlBRUVGTiwIAAAiUUwo7ZWVlDT5yfkxERIS++OKLJhcFAAAQKKcUdjp37qxt27Ydt3/r1q1KSkpqclEAAACBckph58orr9T06dN1+PDhen1ff/21Zs6cqauvvjpgxQEAADTVKT16fv/99+v555/XOeeco0mTJuncc8+VJH3wwQfKzc1VbW2t7rvvvmYpFAAAoDFOKewkJibq7bff1i9/+UtlZ2fLGCNJcjgcyszMVG5urhITE5ulUAAAgMY45W9QPvPMM7V27Vp9+eWX2rhxozZs2KAvv/xSa9euVWpqasAL3L9/v37xi1+oQ4cOiomJUe/evfXuu+/6+o0xmjFjhpKSkhQTE6OMjAx99NFHAa8DAAC0To36uQhJat++vS655BL1799f7du3D2RNPhUVFbr00ksVGRmpv//979qxY4cee+wxv/ebN2+eFi1apKVLl2rjxo2KjY1VZmZmg+uKAADA6adRPxfRUh555BGlpKQoLy/P1/btq0fGGC1cuFD333+/hg0bJklavny5EhMTtXr1ao0cObLFawYAAKGl0Vd2WsILL7ygfv366frrr1enTp3Ut29fPfXUU77+3bt3q7S01O83uVwul9LS0lRYWHjc41ZXV8vr9fptAADATiEddj799FMtWbJE3bt318svv6xf/vKXuuOOO/THP/5RklRaWipJ9RZFJyYm+voaMmfOHLlcLt+WkpLSfCcBAACCKqTDTl1dnS666CI9/PDD6tu3ryZMmKCsrCwtXbq0ScfNzs5WZWWlbyspKQlQxQAAnL6MMfJ4PL6ntUNFSIedpKQknXfeeX5tPXv21N69eyVJbrdb0jc/Y/FtZWVlvr6GOJ1OxcXF+W0AAKBpar6uUtaT6+TxeIJdip+QDjuXXnqpdu3a5df24Ycf6swzz5T0zWJlt9utgoICX7/X69XGjRuVnp7eorUCAAApIqZtsEuoJ6Sfxrrzzjs1YMAAPfzww7rhhhv0zjvv6Mknn9STTz4p6ZsvM5wyZYoefPBBde/eXampqZo+fbqSk5M1fPjw4BYPAMBp4Nitq1AW0mHnkksu0V//+ldlZ2dr9uzZSk1N1cKFCzV69GjfmGnTpunQoUOaMGGCPB6PLrvsMuXn5ys6OjqIlQMAcHrweDwav3it2iYF/ouFAyWkw44kXX311Sf8cVGHw6HZs2dr9uzZLVgVAAA4JjImNtglnFBIr9kBAABoKsIOAACwGmEHAAAElDFGFRUVIbNwOeTX7AAAgNalsrJSk5/drJqvq+SIDP4DQ4QdAAAQcFExbSVjdLS2NtilcBsLAADYjbADAACsRtgBAABWI+wAAACrEXYAAIDVCDsAACBgjDGqrKwMdhl+CDsAACBgjh4+pF/98c2QeOT8GMIOAAAIqIjo0PphUMIOAACwGmEHAABYjbADAACsRtgBAABWI+wAAACrEXYAAIDVCDsAAMBqhB0AAGA1wg4AALAaYQcAAFiNsAMAAKxG2AEAAI1ijJHH4wl2Gd+LsAMAABrF4/Fo/OK1IfUL5w0h7AAAgEaLjAmtXzhvCGEHAABYjbADAACsRtgBAABWI+wAAACrEXYAAIDVCDsAAMBqhB0AAGA1wg4AALAaYQcAAFiNsAMAAKxG2AEAAFYj7AAAAKsRdgAAgNUIOwAAwGqEHQAAYLVWFXbmzp0rh8OhKVOm+NoOHz6siRMnqkOHDmrbtq1GjBihsrKy4BUJAABCSqsJO5s2bdITTzyhCy64wK/9zjvv1N/+9jc999xzeuONN3TgwAFdd911QaoSAACEmlYRdqqqqjR69Gg99dRTat++va+9srJSf/jDHzR//nxdfvnluvjii5WXl6e3335bGzZsCGLFAAAgVLSKsDNx4kRdddVVysjI8GsvKipSTU2NX3uPHj3UpUsXFRYWHvd41dXV8nq9fhsAALBTRLAL+D6rVq3S5s2btWnTpnp9paWlioqKUnx8vF97YmKiSktLj3vMOXPmaNasWYEuFQAAhKCQvrJTUlKiX/3qV1qxYoWio6MDdtzs7GxVVlb6tpKSkoAdGwAAhJaQDjtFRUU6ePCgLrroIkVERCgiIkJvvPGGFi1apIiICCUmJurIkSPyeDx+rysrK5Pb7T7ucZ1Op+Li4vw2AABgp5C+jTV48GC9//77fm033XSTevTooXvuuUcpKSmKjIxUQUGBRowYIUnatWuX9u7dq/T09GCUDAAAQkxIh5127drp/PPP92uLjY1Vhw4dfO3jx4/X1KlTlZCQoLi4OE2ePFnp6en64Q9/GIySAQBAiAnpsHMyFixYoLCwMI0YMULV1dXKzMzU448/HuyyAABAiGh1Yef111/324+OjlZubq5yc3ODUxAAAAhpIb1AGQAAoKkIOwAAwGqEHQAAYDXCDgAAsBphBwAAWI2wAwAArEbYAQAAViPsAAAAqxF2AACA1Qg7AADAaoQdAABgNcIOAACwGmEHAABYjbADAACsRtgBAABWI+wAAACrEXYAAIDVCDsAAMBqhB0AAGA1wg4AALAaYQcAAFiNsAMAAKxG2AEAAFYj7AAAAKsRdgAAgNUIOwAAwGqEHQAAYDXCDgAAsBphBwAAWI2wAwAArEbYAQAAViPsAAAAqxF2AACA1Qg7AADAaoQdAABgNcIOAACwGmEHAABYjbADAACsRtgBAABWI+wAAACrEXYAAIDVCDsAAMBqhB0AAGC1kA47c+bM0SWXXKJ27dqpU6dOGj58uHbt2uU35vDhw5o4caI6dOigtm3basSIESorKwtSxQAAINSEdNh54403NHHiRG3YsEGvvvqqampqdMUVV+jQoUO+MXfeeaf+9re/6bnnntMbb7yhAwcO6Lrrrgti1QAAIJREBLuAE8nPz/fbX7ZsmTp16qSioiL96Ec/UmVlpf7whz9o5cqVuvzyyyVJeXl56tmzpzZs2KAf/vCHDR63urpa1dXVvn2v19t8JwEAAIIqpK/sfFdlZaUkKSEhQZJUVFSkmpoaZWRk+Mb06NFDXbp0UWFh4XGPM2fOHLlcLt+WkpLSvIUDAICgaTVhp66uTlOmTNGll16q888/X5JUWlqqqKgoxcfH+41NTExUaWnpcY+VnZ2tyspK31ZSUtKcpQMAgCAK6dtY3zZx4kRt27ZN//jHP5p8LKfTKafTGYCqAABAqGsVV3YmTZqkF198UevXr9cPfvADX7vb7daRI0fk8Xj8xpeVlcntdrdwlQAAIBSFdNgxxmjSpEn661//qnXr1ik1NdWv/+KLL1ZkZKQKCgp8bbt27dLevXuVnp7e0uUCAIAQFNK3sSZOnKiVK1dqzZo1ateunW8djsvlUkxMjFwul8aPH6+pU6cqISFBcXFxmjx5stLT04/7JBYAADi9hHTYWbJkiSRp4MCBfu15eXkaN26cJGnBggUKCwvTiBEjVF1drczMTD3++OMtXCkAAAhVIR12jDHfOyY6Olq5ubnKzc1tgYoAAEBrE9JrdgAAAJqKsAMAAKxG2AEAAFYj7AAAAKsRdgAAgNUIOwAAwGqEHQAAYDXCDgAAsBphBwAAWI2wAwAArEbYAQAAViPsAAAAqxF2AACA1Qg7AADAaoQdAABgNcIOAACwGmEHAABYjbADAACsRtgBAABWI+wAAACrEXYAAIDVCDsAAMBqhB0AAGA1wg4AALAaYQcAAFiNsAMAAKxG2AEAAFYj7AAAAKsRdgAAgNUIOwAAwGqEHQAAYDXCDgAAsBphBwAAWI2wAwAArEbYAQAAViPsAAAAqxF2AACA1Qg7AADgpBljVFFRIWNMsEs5aYQdAABw0jwej0Y+tkYejyfYpZy0iGAXAAAAQo8xxhdo4uPj5XA4fH0R0bGEHQAA0Lp5PB6NWbJOkvSnX16u9u3b+/qOHj6k2//0jupqDutobW2wSjxphB0AANCgqJi2x+2LbNNOddXhOlpV2YIVNY41a3Zyc3PVtWtXRUdHKy0tTe+8806wS/It4mptC7las9a4cA5orED9fQ/Ecb77eReqn3+Bqqu1nZ8xRuXl5SovL/e1f3tsXV2dr7+8vFz//Oc/VVFREazTCDgrruz8z//8j6ZOnaqlS5cqLS1NCxcuVGZmpnbt2qVOnToFra4TXQJE8zi2cG7VXcOYb1gvUH/fA3Gc737eSQrJz79AfS6H6uf78eryeDz66UPPKiwqWs9Nu07t27f3G5sz6iKNX7xWTldH1dUc1uF/X61xdT5bEeHhwTmZALLiys78+fOVlZWlm266Seedd56WLl2qNm3a6Omnnw52aYqKaXvCy4AIvEjmG6eRQP19D8Rxvvt5F6qff4Gqq7WdX2RMrCK+0/7tsZExsYps006R0bGK+Pdmi1Z/ZefIkSMqKipSdna2ry0sLEwZGRkqLCxs8DXV1dWqrq727VdWfpNgvV5vQGvzer06VHFQklRSUhLw46O+yspKfe35gvnGaSFQf98DcZzKykq/zztJIfn59906A3W+oX5+3/w3/lJhUdG+9m+P3b8/Vl97vlRdnVHd0WodrvrmdWGOMIVFRDR4rIbGNrRfe/SovF6vwpvhCtGxmr73VqJp5fbv328kmbffftuv/e677zb9+/dv8DUzZ840ktjY2NjY2Ngs2EpKSk6YFVr9lZ3GyM7O1tSpU337xxZmdejQwe97BKRvUmNKSopKSkoUFxfX0qWeVpjrlsV8txzmumUx3y0n2HNtjNFXX32l5OTkE45r9WGnY8eOCg8PV1lZmV97WVmZ3G53g69xOp1yOp1+bfHx8Sd8n7i4OP5P00KY65bFfLcc5rplMd8tJ5hz7XK5vndMq1+gHBUVpYsvvlgFBQW+trq6OhUUFCg9PT2IlQEAgFDQ6q/sSNLUqVM1duxY9evXT/3799fChQt16NAh3XTTTcEuDQAABJkVYednP/uZvvjiC82YMUOlpaXq06eP8vPzlZiY2ORjO51OzZw5s95tLwQec92ymO+Ww1y3LOa75bSWuXYYE0Jf/QgAABBgrX7NDgAAwIkQdgAAgNUIOwAAwGqEHQAAYLXTNux07dpVDofDb5s7d67fmK1bt+q//uu/FB0drZSUFM2bN6/ecZ577jn16NFD0dHR6t27t9auXevXb4zRjBkzlJSUpJiYGGVkZOijjz5q1nMLZdXV1erTp48cDoeKi4v9+pjvwLj22mvVpUsXRUdHKykpSWPGjNGBAwf8xjDXTbdnzx6NHz9eqampiomJUbdu3TRz5kwdOXLEbxxzHTgPPfSQBgwYoDZt2hz3i2D37t2rq666Sm3atFGnTp1099136+jRo35jXn/9dV100UVyOp06++yztWzZsnrHyc3NVdeuXRUdHa20tDS98847zXBGrVurmqOm/zpV63TmmWea2bNnm88//9y3VVVV+forKytNYmKiGT16tNm2bZt59tlnTUxMjHniiSd8Y9566y0THh5u5s2bZ3bs2GHuv/9+ExkZad5//33fmLlz5xqXy2VWr15t3nvvPXPttdea1NRU8/XXX7fo+YaKO+64wwwdOtRIMlu2bPG1M9+BM3/+fFNYWGj27Nlj3nrrLZOenm7S09N9/cx1YPz9738348aNMy+//LL55JNPzJo1a0ynTp3MXXfd5RvDXAfWjBkzzPz5883UqVONy+Wq13/06FFz/vnnm4yMDLNlyxazdu1a07FjR5Odne0b8+mnn5o2bdqYqVOnmh07dpicnBwTHh5u8vPzfWNWrVploqKizNNPP222b99usrKyTHx8vCkrK2uJ02wVWtscndZhZ8GCBcftf/zxx0379u1NdXW1r+2ee+4x5557rm//hhtuMFdddZXf69LS0sytt95qjDGmrq7OuN1u89vf/tbX7/F4jNPpNM8++2yAzqT1WLt2renRo4fZvn17vbDDfDefNWvWGIfDYY4cOWKMYa6b07x580xqaqpvn7luHnl5eQ2GnbVr15qwsDBTWlrqa1uyZImJi4vz/TeYNm2a6dWrl9/rfvazn5nMzEzffv/+/c3EiRN9+7W1tSY5OdnMmTMnwGfSerW2OTptb2NJ0ty5c9WhQwf17dtXv/3tb/0udRYWFupHP/qRoqKifG2ZmZnatWuXKioqfGMyMjL8jpmZmanCwkJJ0u7du1VaWuo3xuVyKS0tzTfmdFFWVqasrCz96U9/Ups2ber1M9/No7y8XCtWrNCAAQMUGRkpibluTpWVlUpISPDtM9ctq7CwUL179/b7QtnMzEx5vV5t377dN+ZE833kyBEVFRX5jQkLC1NGRgbz/W+tcY5O27Bzxx13aNWqVVq/fr1uvfVWPfzww5o2bZqvv7S0tN43MB/bLy0tPeGYb/d/+3UNjTkdGGM0btw43XbbberXr1+DY5jvwLrnnnsUGxurDh06aO/evVqzZo2vj7luHh9//LFycnJ06623+tqY65bVlPn2er36+uuv9eWXX6q2tpb5PoHWOEdWhZ177723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xp7wysupaujW1vFUVVVJkp566imlpaX59YWHh/vtR0ZG+v58LKQcuzX2fe/Zt29fXXjhhVq+fLmuuOIKbd++XS+99NJJ1wmg+bBAGUCrc8EFF6i4uFjl5eXfOzYxMVHJycn69NNPdfbZZ/ttqampp/Se3/c4+y233KJly5YpLy9PGRkZSklJOenjA2g+hB0Aza66ulqlpaV+25dfftno440aNUput1vDhw/XW2+9pU8//VR/+ctf6j09dcysWbM0Z84cLVq0SB9++KHef/995eXlaf78+Sf9ntnZ2dq0aZNuv/12bd26VR988IGWLFnidx4///nPtW/fPj311FO6+eabG31+AAKLsAOg2eXn5yspKclvu+yyyxp9vKioKL3yyivq1KmTrrzySvXu3Vtz586td1vqmFtuuUW///3vlZeXp969e+vHP/6xli1bdkpXds455xy98soreu+999S/f3+lp6drzZo1ioj4z2oAl8ulESNGqG3btho+fHijzw9AYDmMMSbYRQCALQYPHqxevXpp0aJFwS4FwL8RdgAgACoqKvT666/rpz/9qXbs2KFzzz032CUB+DeexgKAAOjbt68qKir0yCOPEHSAEMOVHQAAYDUWKAMAAKsRdgAAgNUIOwAAwGqEHQAAYDXCDgAAsBphBwAAWI2wAwAArEbYAQAAVvt/cExfeEA/TfQAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from matplotlib import pyplot as plt\n", + "import seaborn as sns\n", + "\n", + "for i, column in enumerate(df.columns, 1):\n", + " sns.histplot(df[column])\n", + " plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Set targets/objectives = efficiency for now" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/vscode/.local/lib/python3.10/site-packages/baybe/telemetry.py:222: UserWarning: WARNING: BayBE Telemetry endpoint https://public.telemetry.baybe.p.uptimize.merckgroup.com:4317 cannot be reached. Disabling telemetry. The exception encountered was: ConnectionError, HTTPConnectionPool(host='verkehrsnachrichten.merck.de', port=80): Max retries exceeded with url: / (Caused by NameResolutionError(\": Failed to resolve 'verkehrsnachrichten.merck.de' ([Errno -2] Name or service not known)\"))\n", + " warnings.warn(\n", + "/home/vscode/.local/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n" + ] + } + ], + "source": [ + "from baybe.targets import NumericalTarget\n", + "from baybe.objective import Objective\n", + "\n", + "target = NumericalTarget(\n", + " name=\"Efficiency\",\n", + " mode=\"MAX\",\n", + ")\n", + "objective = Objective(mode=\"SINGLE\", targets=[target])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Search Space" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "from baybe.parameters import NumericalContinuousParameter, CategoricalParameter, NumericalDiscreteParameter\n", + "from baybe.searchspace import SearchSpace\n", + "\n", + "basic_parameters=[\n", + "NumericalDiscreteParameter(\n", + " name=\"Time_h\",\n", + " values=df_combined[\"Time_h\"].unique(),\n", + " tolerance=5/60,\n", + "),\n", + "NumericalDiscreteParameter(\n", + " name=\"pH\",\n", + " values=df_combined[\"pH\"].unique(),\n", + " ), \n", + "NumericalDiscreteParameter(\n", + " name=\"Inhib_Concentrat_M\",\n", + " values=df_combined[\"Inhib_Concentrat_M\"].unique(),\n", + " ),\n", + "NumericalDiscreteParameter(\n", + " name=\"Salt_Concentrat_M\",\n", + " values=df_combined[\"Salt_Concentrat_M\"].unique(),\n", + " ),\n", + "]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Substance parameter**\n", + "\n", + "Instead of values, this parameter accepts data in form of a dictionary. The items correspond to pairs of labels and SMILES. SMILES are string-based representations of molecular structures. Based on these, BayBE can assign each label a set of molecular descriptors as encoding." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'C(=O)(C(=O)[O-])[O-]': 'C(=O)(C(=O)[O-])[O-]', 'C(C(=O)[O-])C(CC(=O)[O-])(C(=O)[O-])O': 'C(C(=O)[O-])C(CC(=O)[O-])(C(=O)[O-])O', 'C(C(C(C(C(C(=O)[O-])O)O)O)O)O.C(C(C(C(C(C(=O)[O-])O)O)O)O)O.[Fe+2]': 'C(C(C(C(C(C(=O)[O-])O)O)O)O)O.C(C(C(C(C(C(=O)[O-])O)O)O)O)O.[Fe+2]', 'C(C(C(C(C(C(=O)[O-])O)O)O)O)O.C(C(C(C(C(C(=O)[O-])O)O)O)O)O.[Zn+2]': 'C(C(C(C(C(C(=O)[O-])O)O)O)O)O.C(C(C(C(C(C(=O)[O-])O)O)O)O)O.[Zn+2]', 'C1=CC(=C(C=C1O)O)C=NNC(=S)N': 'C1=CC(=C(C=C1O)O)C=NNC(=S)N', 'C1=CC(=C(C=C1SSC2=CC(=C(C=C2)[N+](=O)[O-])C(=O)O)C(=O)O)[N+](=O)[O-]': 'C1=CC(=C(C=C1SSC2=CC(=C(C=C2)[N+](=O)[O-])C(=O)O)C(=O)O)[N+](=O)[O-]', 'C1=CC(=CC(=C1)S)C(=O)O': 'C1=CC(=CC(=C1)S)C(=O)O', 'C1=CC2=NNN=C2C=C1Cl': 'C1=CC2=NNN=C2C=C1Cl', 'C1=CC=C(C(=C1)C=NNC(=S)N)O': 'C1=CC=C(C(=C1)C=NNC(=S)N)O', 'C1COCCN1CCCS(=O)(=O)O': 'C1COCCN1CCCS(=O)(=O)O', 'C1N2CN3CN1CN(C2)C3': 'C1N2CN3CN1CN(C2)C3', 'C=CC(=O)OCCOC(=O)OCCSc1ncccn1': 'C=CC(=O)OCCOC(=O)OCCSc1ncccn1', 'CC(=O)O': 'CC(=O)O', 'CC(=O)SSC(=O)C': 'CC(=O)SSC(=O)C', 'CC1(C(N2C(S1)C(C2=O)NC(=O)C(C3=CC=C(C=C3)O)N)C(=O)O)C': 'CC1(C(N2C(S1)C(C2=O)NC(=O)C(C3=CC=C(C=C3)O)N)C(=O)O)C', 'CCCCCCCC/C=C\\\\CCCCCCCC(=O)O': 'CCCCCCCC/C=C\\\\CCCCCCCC(=O)O', 'CCCCCCCCCCCCCCCCCC(=O)O': 'CCCCCCCCCCCCCCCCCC(=O)O', 'CCCCCCCCCCCCCCN(CC(=O)O[Na])CC(=O)O[Na]': 'CCCCCCCCCCCCCCN(CC(=O)O[Na])CC(=O)O[Na]', 'CCCCCCCCCCCCN(CC(=O)O[Na])CC(=O)O[Na]': 'CCCCCCCCCCCCN(CC(=O)O[Na])CC(=O)O[Na]', 'CCCCCCCCCCCCOS(=O)(=O)O': 'CCCCCCCCCCCCOS(=O)(=O)O', 'CCCCCCCCCCCCc1ccccc1S([O])([O])O': 'CCCCCCCCCCCCc1ccccc1S([O])([O])O', 'CCCCCCCCN(CC(=O)O[Na])CC(=O)O[Na]': 'CCCCCCCCN(CC(=O)O[Na])CC(=O)O[Na]', 'CCCCN(CCCC)C1=NC(=NC(=N1)NC(CCSC)C(=O)O)NC(CCSC)C(=O)O': 'CCCCN(CCCC)C1=NC(=NC(=N1)NC(CCSC)C(=O)O)NC(CCSC)C(=O)O', 'CCCCOP(=O)(OCCCC)O': 'CCCCOP(=O)(OCCCC)O', 'CCN(C(=S)S)CC': 'CCN(C(=S)S)CC', 'CCOc1ccc2c(c1)nc([nH]2)S': 'CCOc1ccc2c(c1)nc([nH]2)S', 'CCSc1nnc(s1)N': 'CCSc1nnc(s1)N', 'CN1C=NC2=C1C(=O)N(C(=O)N2C)C': 'CN1C=NC2=C1C(=O)N(C(=O)N2C)C', 'CNCC(C1=CC(=CC=C1)O)O': 'CNCC(C1=CC(=CC=C1)O)O', 'COC(=O)CCCC1=CNC2=CC=CC=C21': 'COC(=O)CCCC1=CNC2=CC=CC=C21', 'COC(=O)n1nnc2ccccc12': 'COC(=O)n1nnc2ccccc12', 'COCCOC(=O)OCSc1nc2c(s1)cccc2': 'COCCOC(=O)OCSc1nc2c(s1)cccc2', 'COc1ccc2c(c1)[nH]c(=S)[nH]2': 'COc1ccc2c(c1)[nH]c(=S)[nH]2', 'COc1cccc(c1)c1n[nH]c(=S)[nH]1': 'COc1cccc(c1)c1n[nH]c(=S)[nH]1', 'CS[C]1N[N]C(=N1)N': 'CS[C]1N[N]C(=N1)N', 'CSc1[nH]c2c(n1)cc(c(c2)C)C': 'CSc1[nH]c2c(n1)cc(c(c2)C)C', 'CSc1nnc(s1)N': 'CSc1nnc(s1)N', 'Cc1cc(C)nc(n1)S': 'Cc1cc(C)nc(n1)S', 'Cc1ccc(c(c1)n1nc2c(n1)cccc2)O': 'Cc1ccc(c(c1)n1nc2c(n1)cccc2)O', 'Cc1ccc2c(c1)nc([nH]2)S': 'Cc1ccc2c(c1)nc([nH]2)S', 'Cc1n[nH]c(=S)s1': 'Cc1n[nH]c(=S)s1', 'Cc1nsc(c1)N': 'Cc1nsc(c1)N', 'ClC([C]1N[N]C=N1)(Cl)Cl': 'ClC([C]1N[N]C=N1)(Cl)Cl', 'Clc1cc2[nH]c(=S)[nH]c2cc1Cl': 'Clc1cc2[nH]c(=S)[nH]c2cc1Cl', 'Clc1ccc(cc1)CC[C@](C(C)(C)C)(Cn1cncn1)O': 'Clc1ccc(cc1)CC[C@](C(C)(C)C)(Cn1cncn1)O', 'Clc1ccc(cc1Cl)c1n[nH]c(=S)[nH]1': 'Clc1ccc(cc1Cl)c1n[nH]c(=S)[nH]1', 'Clc1ccc2c(c1)[nH]c(n2)S': 'Clc1ccc2c(c1)[nH]c(n2)S', 'Clc1cccc(c1)c1n[nH]c(=S)[nH]1': 'Clc1cccc(c1)c1n[nH]c(=S)[nH]1', 'Cn1cnnc1S': 'Cn1cnnc1S', 'Cn1nnnc1S': 'Cn1nnnc1S', 'N.N.[N+](=O)(O)[O-].[N+](=O)(O)[O-].[N+](=O)([O-])[O-].[N+](=O)([O-])[O-].[N+](=O)([O-])[O-].O.O.O.O.[Ce+3]': 'N.N.[N+](=O)(O)[O-].[N+](=O)(O)[O-].[N+](=O)([O-])[O-].[N+](=O)([O-])[O-].[N+](=O)([O-])[O-].O.O.O.O.[Ce+3]', 'NC(=S)NN=CC1=C(C(=C(C=C1)O)O)O': 'NC(=S)NN=CC1=C(C(=C(C=C1)O)O)O', 'NCC(=O)O': 'NCC(=O)O', 'NO': 'NO', 'Nc1cc(N)nc(n1)S': 'Nc1cc(N)nc(n1)S', 'Nc1cc(S)nc(n1)N': 'Nc1cc(S)nc(n1)N', 'Nc1ccc2c(c1)sc(=S)[nH]2': 'Nc1ccc2c(c1)sc(=S)[nH]2', 'Nc1ccnc(n1)S': 'Nc1ccnc(n1)S', 'Nc1n[nH]c(=S)s1': 'Nc1n[nH]c(=S)s1', 'Nc1n[nH]c(n1)S': 'Nc1n[nH]c(n1)S', 'Nc1n[nH]cn1': 'Nc1n[nH]cn1', 'Nc1nc([nH]n1)C(=O)O': 'Nc1nc([nH]n1)C(=O)O', 'Nc1ncncc1N': 'Nc1ncncc1N', 'Nn1c(NN)nnc1S': 'Nn1c(NN)nnc1S', 'Nn1c(S)nnc1c1ccccc1': 'Nn1c(S)nnc1c1ccccc1', 'Nn1cnnc1': 'Nn1cnnc1', 'O/N=C(/C(=N/O)/C)\\\\C': 'O/N=C(/C(=N/O)/C)\\\\C', 'O/N=C(\\\\C(=N/O)\\\\c1ccco1)/c1ccco1': 'O/N=C(\\\\C(=N/O)\\\\c1ccco1)/c1ccco1', 'O=C([O-])C(O)C(O)C(O)C(O)CO.[Na+]': 'O=C([O-])C(O)C(O)C(O)C(O)CO.[Na+]', 'OC(=O)/C=C/c1ccccc1': 'OC(=O)/C=C/c1ccccc1', 'OC(=O)CCCCC(=O)O': 'OC(=O)CCCCC(=O)O', 'OC(=O)CCCCCCCCCCCCCCC(=O)O': 'OC(=O)CCCCCCCCCCCCCCC(=O)O', 'OC(=O)CCS': 'OC(=O)CCS', 'OC(=O)CN(CC(=O)O)CCN(CC(=O)O)CC(=O)O': 'OC(=O)CN(CC(=O)O)CCN(CC(=O)O)CC(=O)O', 'OC(=O)CS': 'OC(=O)CS', 'OC(=O)Cn1nnnc1S': 'OC(=O)Cn1nnnc1S', 'OC(=O)c1ccc(=S)[nH]c1': 'OC(=O)c1ccc(=S)[nH]c1', 'OC(=O)c1ccc(cc1)N': 'OC(=O)c1ccc(cc1)N', 'OC(=O)c1ccc(cc1)S': 'OC(=O)c1ccc(cc1)S', 'OC(=O)c1ccc(cc1)c1ccccc1': 'OC(=O)c1ccc(cc1)c1ccccc1', 'OC(=O)c1ccccc1': 'OC(=O)c1ccccc1', 'OC(=O)c1ccccc1O': 'OC(=O)c1ccccc1O', 'OC(=O)c1ccccc1S': 'OC(=O)c1ccccc1S', 'OC(=O)c1ccccn1': 'OC(=O)c1ccccn1', 'OC(=O)c1cccnc1': 'OC(=O)c1cccnc1', 'OC(=O)c1cccnc1S': 'OC(=O)c1cccnc1S', 'OC(=O)c1ccncc1': 'OC(=O)c1ccncc1', 'OC(=O)c1n[nH]c(n1)N': 'OC(=O)c1n[nH]c(n1)N', 'OCC(CO)O': 'OCC(CO)O', 'OC[C@H]([C@H]([C@@H]([C@@H](CO)O)O)O)O': 'OC[C@H]([C@H]([C@@H]([C@@H](CO)O)O)O)O', 'OC[C@H]([C@H]([C@@H]([C@H](C(=O)O)O)O)O)O': 'OC[C@H]([C@H]([C@@H]([C@H](C(=O)O)O)O)O)O', 'OC[C@H]1OC(O)[C@H](O)[C@@H](O)[C@@H]1O': 'OC[C@H]1OC(O)[C@H](O)[C@@H](O)[C@@H]1O', 'O[C@H]1C(=O)OCC1(C)C': 'O[C@H]1C(=O)OCC1(C)C', 'Oc1ccc(cc1)C(=O)O': 'Oc1ccc(cc1)C(=O)O', 'Oc1ccc(cc1)S([O])([O])O': 'Oc1ccc(cc1)S([O])([O])O', 'Oc1cccc2c1nccc2': 'Oc1cccc2c1nccc2', 'Oc1ccccc1c1nnc([nH]1)S': 'Oc1ccccc1c1nnc([nH]1)S', 'On1nnc2c1cccc2': 'On1nnc2c1cccc2', 'S=c1[nH]c2c([nH]1)c(=O)n(cn2)C': 'S=c1[nH]c2c([nH]1)c(=O)n(cn2)C', 'S=c1[nH]c2c([nH]1)cncn2': 'S=c1[nH]c2c([nH]1)cncn2', 'S=c1[nH]c2c([nH]1)nccn2': 'S=c1[nH]c2c([nH]1)nccn2', 'S=c1[nH]nc([nH]1)c1cccnc1': 'S=c1[nH]nc([nH]1)c1cccnc1', 'S=c1[nH]nc([nH]1)c1ccco1': 'S=c1[nH]nc([nH]1)c1ccco1', 'S=c1[nH]nc([nH]1)c1ccncc1': 'S=c1[nH]nc([nH]1)c1ccncc1', 'S=c1sc2c([nH]1)cccc2': 'S=c1sc2c([nH]1)cccc2', 'SC#N': 'SC#N', 'S[C]1NC2=C[CH]C=NC2=N1': 'S[C]1NC2=C[CH]C=NC2=N1', 'Sc1n[nH]cn1': 'Sc1n[nH]cn1', 'Sc1nc(N)c(c(n1)S)N': 'Sc1nc(N)c(c(n1)S)N', 'Sc1nc(N)c2c(n1)[nH]nc2': 'Sc1nc(N)c2c(n1)[nH]nc2', 'Sc1nc2c([nH]1)cccc2': 'Sc1nc2c([nH]1)cccc2', 'Sc1ncc[nH]1': 'Sc1ncc[nH]1', 'Sc1ncccn1': 'Sc1ncccn1', 'Sc1nnc(s1)S': 'Sc1nnc(s1)S', '[Cl-].[Cl-].[Cl-].[Ce+3]': '[Cl-].[Cl-].[Cl-].[Ce+3]', '[N+](=O)([O-])[O-].[N+](=O)([O-])[O-].[N+](=O)([O-])[O-].[Ce+3]': '[N+](=O)([O-])[O-].[N+](=O)([O-])[O-].[N+](=O)([O-])[O-].[Ce+3]', '[NH4+].[NH4+].[N+](=O)([O-])[O-].[N+](=O)([O-])[O-].[N+](=O)([O-])[O-].[N+](=O)([O-])[O-].[N+](=O)([O-])[O-].[N+](=O)([O-])[O-].[Ce+4]': '[NH4+].[NH4+].[N+](=O)([O-])[O-].[N+](=O)([O-])[O-].[N+](=O)([O-])[O-].[N+](=O)([O-])[O-].[N+](=O)([O-])[O-].[N+](=O)([O-])[O-].[Ce+4]', '[O-]S(=O)(=O)[O-].[O-]S(=O)(=O)[O-].[O-]S(=O)(=O)[O-].[Ce+3].[Ce+3]': '[O-]S(=O)(=O)[O-].[O-]S(=O)(=O)[O-].[O-]S(=O)(=O)[O-].[Ce+3].[Ce+3]', '[O-]S(=O)[O-].[Na+].[Na+]': '[O-]S(=O)[O-].[Na+].[Na+]', 'c1cc(ccc1c2[nH]c(nn2)S)[N+](=O)[O-]': 'c1cc(ccc1c2[nH]c(nn2)S)[N+](=O)[O-]', 'c1ccc(nc1)c1ccccn1': 'c1ccc(nc1)c1ccccn1', 'c1ccc2c(c1)[nH]nn2': 'c1ccc2c(c1)[nH]nn2', 'c1ncn[nH]1': 'c1ncn[nH]1', 'C(C(CO)([N+](=O)[O-])Br)O': 'C(C(CO)([N+](=O)[O-])Br)O', 'C(CC=O)CC=O': 'C(CC=O)CC=O', 'C1=CC(=C(C=C1F)F)C(CN2C=NC=N2)(CN3C=NC=N3)O': 'C1=CC(=C(C=C1F)F)C(CN2C=NC=N2)(CN3C=NC=N3)O', 'C1=CC(=CN=C1)C=NNC(=S)N': 'C1=CC(=CN=C1)C=NNC(=S)N', 'C1=CC(=NC(=C1)N)N': 'C1=CC(=NC(=C1)N)N', 'C1=CC=C(C=C1)C(C2=CC=CC=C2)(C3=CC=CC=C3Cl)N4C=CN=C4': 'C1=CC=C(C=C1)C(C2=CC=CC=C2)(C3=CC=CC=C3Cl)N4C=CN=C4', 'C1=CC=NC(=C1)C=NNC(=S)N': 'C1=CC=NC(=C1)C=NNC(=S)N', 'C1=CN=C(C=N1)C(=O)N': 'C1=CN=C(C=N1)C(=O)N', 'C1=CN=C(N=C1)N': 'C1=CN=C(N=C1)N', 'C1=CN=CC=C1C=NNC(=S)N': 'C1=CN=CC=C1C=NNC(=S)N', 'C1CCC(=NO)CC1': 'C1CCC(=NO)CC1', 'C=CC1=C(N2C(C(C2=O)NC(=O)C(=NOCC(=O)O)C3=CSC(=N3)N)SC1)C(=O)O': 'C=CC1=C(N2C(C(C2=O)NC(=O)C(=NOCC(=O)O)C3=CSC(=N3)N)SC1)C(=O)O', 'CC(=NO)C': 'CC(=NO)C', 'CC(C)(C)NCC(COC1=CC=CC2=C1CC(C(C2)O)O)O': 'CC(C)(C)NCC(COC1=CC=CC2=C1CC(C(C2)O)O)O', 'CC(C)(C)NCC(COC1=NSN=C1N2CCOCC2)O': 'CC(C)(C)NCC(COC1=NSN=C1N2CCOCC2)O', 'CC(C)NCC(COC1=CC=C(C=C1)CC(=O)N)O': 'CC(C)NCC(COC1=CC=C(C=C1)CC(=O)N)O', 'CC(C)NCC(COC1=CC=CC2=CC=CC=C21)O': 'CC(C)NCC(COC1=CC=CC2=CC=CC=C21)O', 'CC(OC(=O)C)OC(=O)C1=C(CSC2N1C(=O)C2NC(=O)C(=NOC)C3=CC=CO3)COC(=O)N': 'CC(OC(=O)C)OC(=O)C1=C(CSC2N1C(=O)C2NC(=O)C(=NOC)C3=CC=CO3)COC(=O)N', 'CC1=CC=C(C=C1)[N]2N=NC=C2O': 'CC1=CC=C(C=C1)[N]2N=NC=C2O', 'CC1=CN=C(C=N1)C(=O)N': 'CC1=CN=C(C=N1)C(=O)N', 'CC1=NC(=CC=C1)C': 'CC1=NC(=CC=C1)C', 'CCC(=NO)C': 'CCC(=NO)C', 'CCOC(=O)C1=C(C)N=C(S)NC1C2=CC=C(C=C2)Cl': 'CCOC(=O)C1=C(C)N=C(S)NC1C2=CC=C(C=C2)Cl', 'CN(C)CC1CCCCC1(C2=CC(=CC=C2)OC)O': 'CN(C)CC1CCCCC1(C2=CC(=CC=C2)OC)O', 'COC(=O)C1=CC=C(C=C1)[N]2N=NC=C2O': 'COC(=O)C1=CC=C(C=C1)[N]2N=NC=C2O', 'COC1=NC=C(N=C1)C(=O)N': 'COC1=NC=C(N=C1)C(=O)N', 'NC(N)=S': 'NC(N)=S', 'NC1=CCNC(=S)N1': 'NC1=CCNC(=S)N1', 'OC1=C(C=CC=C1)C=NC2=CC=C(C=C2)N=NC3=C(C=CC=C3)N=CC4=C(C=CC=C4)O': 'OC1=C(C=CC=C1)C=NC2=CC=C(C=C2)N=NC3=C(C=CC=C3)N=CC4=C(C=CC=C4)O', 'OC1=CN=N[N]1C2=CC=C(C=C2)Cl': 'OC1=CN=N[N]1C2=CC=C(C=C2)Cl'}\n" + ] + } + ], + "source": [ + "#Create a dictionary of unique SMILES representations found in the dataframe\n", + "\n", + "unique_SMILES = df_combined[\"SMILES\"].unique()\n", + "\n", + "dic_SMILES = dict(zip(unique_SMILES, unique_SMILES))\n", + "\n", + "print(dic_SMILES)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "from baybe.parameters import SubstanceParameter\n", + "\n", + "mordred_parameters = basic_parameters + [\n", + " SubstanceParameter(\n", + " name=\"SMILES\",\n", + " data=dic_SMILES,\n", + " encoding=\"MORDRED\",\n", + " )\n", + "]\n", + "\n", + "rdkit_parameters = basic_parameters + [\n", + " SubstanceParameter(\n", + " name=\"SMILES\",\n", + " data=dic_SMILES,\n", + " encoding=\"RDKIT\",\n", + " )\n", + "]\n", + "\n", + "morganfp_parameters = basic_parameters + [\n", + " SubstanceParameter(\n", + " name=\"SMILES\",\n", + " data=dic_SMILES,\n", + " encoding=\"MORGAN_FP\",\n", + " )\n", + "]\n", + "\n", + "ohe_parameters = basic_parameters + [\n", + " CategoricalParameter(\n", + " name=\"SMILES\",\n", + " values=unique_SMILES,\n", + " encoding=\"OHE\",\n", + " )\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "searchspace_mordred = SearchSpace.from_dataframe(df.drop(\"Efficiency\", axis = 1), mordred_parameters)\n", + "searchspace_rdkit = SearchSpace.from_dataframe(df.drop(\"Efficiency\", axis = 1), rdkit_parameters)\n", + "searchspace_morganfp = SearchSpace.from_dataframe(df.drop(\"Efficiency\", axis = 1), morganfp_parameters)\n", + "searchspace_ohe = SearchSpace.from_dataframe(df.drop(\"Efficiency\", axis = 1), ohe_parameters)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Recommenders" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The **SequentialGreedyRecommender** is a powerful recommender that leverages BoTorch optimization functions to perform sequential Greedy optimization. It can be applied for discrete, continuous and hybrid sarch spaces. It is an implementation of the BoTorch optimization functions for discrete, continuous and mixed spaces. **It is important to note that this recommender performs a brute-force search when applied in hybrid search spaces, as it optimizes the continuous part of the space while exhaustively searching choices in the discrete subspace.** You can customize this behavior to only sample a certain percentage of the discrete subspace via the sample_percentage attribute and to choose different sampling strategies via the hybrid_sampler attribute. \n", + "\n", + "e.g.\n", + "strategy = TwoPhaseStrategy(recommender=SequentialGreedyRecommender(hybrid_sampler=\"Farthest\", sampling_percentage=0.3))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For implementing fully customized surrogate models e.g. from sklearn or PyTorch, see:\n", + "https://emdgroup.github.io/baybe/examples/Custom_Surrogates/Custom_Surrogates.html\n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "from baybe.recommenders import (\n", + " SequentialGreedyRecommender,\n", + " FPSRecommender,\n", + " TwoPhaseMetaRecommender,\n", + ")\n", + "\n", + "recommender = TwoPhaseMetaRecommender(\n", + " initial_recommender=FPSRecommender(), # farthest point sampling\n", + " recommender=SequentialGreedyRecommender(), # Bayesian model-based optimization\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Campaign Strategy" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "from baybe.strategies import TwoPhaseStrategy\n", + "from baybe import Campaign\n", + "\n", + "campaign_rdkit = Campaign(searchspace_rdkit, objective)\n", + "campaign_mordred = Campaign(searchspace_mordred, objective)\n", + "campaign_morganfp = Campaign(searchspace_morganfp, objective)\n", + "campaign_ohe = Campaign(searchspace_ohe, objective)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Start simulation" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "scenarios = {\n", + " \"OHE\" : campaign_ohe,\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 0%| | 0/10 [00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "sns.lineplot(\n", + " data=results,\n", + " x=\"Num_Experiments\",\n", + " y=\"Efficiency_CumBest\",\n", + " hue=\"Scenario\",\n", + " marker=\"x\",\n", + ")\n", + "\n", + "plt.xlim(0, N_DOE_ITERATIONS)\n", + "plt.ylim(0, 100)\n", + "\n", + "plt.savefig(\"Scenarios\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Evalute best results" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Index(['Scenario', 'Random_Seed', 'Iteration', 'Num_Experiments',\n", + " 'Efficiency_Measurements', 'Efficiency_IterBest', 'Efficiency_CumBest'],\n", + " dtype='object')\n" + ] + } + ], + "source": [ + "print(results.columns)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Use transfer learning on other metals" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Define the training function (i.e. the previously investigated larger data set) and the yet to be optimized data sets." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "from baybe.parameters import TaskParameter\n", + "\n", + "taskparam = TaskParameter(\n", + " name=\"Al_alloys\",\n", + " values=[\"AA1000\", \"AA2024\"],\n", + " active_values=[\"AA2024\"],\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "unique_SMILES_transfer = df_transfer[\"SMILES\"].unique()" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [], + "source": [ + "from baybe.parameters import NumericalContinuousParameter, CategoricalParameter, NumericalDiscreteParameter\n", + "from baybe.searchspace import SearchSpace\n", + "\n", + "transfer_parameters=[\n", + "NumericalDiscreteParameter(\n", + " name=\"Time_h\",\n", + " values=df_combined[\"Time_h\"].unique(),\n", + " tolerance=5/60,\n", + "),\n", + "NumericalDiscreteParameter(\n", + " name=\"pH\",\n", + " values=df_combined[\"pH\"].unique(),\n", + " ), \n", + "NumericalDiscreteParameter(\n", + " name=\"Inhib_Concentrat_M\",\n", + " values=df_combined[\"Inhib_Concentrat_M\"].unique(),\n", + " ),\n", + "NumericalDiscreteParameter(\n", + " name=\"Salt_Concentrat_M\",\n", + " values=df_combined[\"Salt_Concentrat_M\"].unique(),\n", + " ),\n", + "CategoricalParameter(\n", + " name=\"SMILES\",\n", + " values=unique_SMILES,\n", + " encoding=\"OHE\",\n", + " )\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [], + "source": [ + "searchspace_transfer = SearchSpace.from_dataframe(df_transfer.drop(\"Efficiency\", axis = 1), transfer_parameters)\n", + "\n", + "campaign_transfer = Campaign(searchspace_transfer, objective)" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [], + "source": [ + "df_features = df.drop(\"Efficiency\", axis = 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 0%| | 0/1 [00:00\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Time_hpHInhib_Concentrat_MSalt_Concentrat_MEfficiency
count258.000000258.000000258.000000258.000000258.000000
mean161.0910856.5798450.0081030.12740338.761628
std214.5363172.2416080.0143350.177444158.903313
min0.5000000.0000000.0000100.000000-1760.000000
25%24.0000005.4000000.0010000.05000030.000000
50%24.0000007.0000000.0010000.10000057.500000
75%240.0000007.0000000.0100000.10000087.825000
max672.00000010.0000000.1000000.600000100.000000
\n", + "" + ], + "text/plain": [ + " Time_h pH Inhib_Concentrat_M Salt_Concentrat_M \\\n", + "count 258.000000 258.000000 258.000000 258.000000 \n", + "mean 161.091085 6.579845 0.008103 0.127403 \n", + "std 214.536317 2.241608 0.014335 0.177444 \n", + "min 0.500000 0.000000 0.000010 0.000000 \n", + "25% 24.000000 5.400000 0.001000 0.050000 \n", + "50% 24.000000 7.000000 0.001000 0.100000 \n", + "75% 240.000000 7.000000 0.010000 0.100000 \n", + "max 672.000000 10.000000 0.100000 0.600000 \n", + "\n", + " Efficiency \n", + "count 258.000000 \n", + "mean 38.761628 \n", + "std 158.903313 \n", + "min -1760.000000 \n", + "25% 30.000000 \n", + "50% 57.500000 \n", + "75% 87.825000 \n", + "max 100.000000 " + ] + }, + "execution_count": 66, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fraction_df.describe()" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": {}, + "outputs": [ + { + "ename": "ValueError", + "evalue": "No objects to concatenate", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[65], line 7\u001b[0m\n\u001b[1;32m 4\u001b[0m df[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mFraction\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m fractions[i]\n\u001b[1;32m 6\u001b[0m \u001b[38;5;66;03m# Concatenate the dataframes into a single dataframe\u001b[39;00m\n\u001b[0;32m----> 7\u001b[0m concatenated_df \u001b[38;5;241m=\u001b[39m \u001b[43mpd\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconcat\u001b[49m\u001b[43m(\u001b[49m\u001b[43mresults_transfer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mignore_index\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m 9\u001b[0m \u001b[38;5;66;03m# Print the concatenated dataframe\u001b[39;00m\n\u001b[1;32m 10\u001b[0m \u001b[38;5;28mprint\u001b[39m(concatenated_df)\n", + "File \u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/core/reshape/concat.py:382\u001b[0m, in \u001b[0;36mconcat\u001b[0;34m(objs, axis, join, ignore_index, keys, levels, names, verify_integrity, sort, copy)\u001b[0m\n\u001b[1;32m 379\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m copy \u001b[38;5;129;01mand\u001b[39;00m using_copy_on_write():\n\u001b[1;32m 380\u001b[0m copy \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[0;32m--> 382\u001b[0m op \u001b[38;5;241m=\u001b[39m \u001b[43m_Concatenator\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 383\u001b[0m \u001b[43m \u001b[49m\u001b[43mobjs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 384\u001b[0m \u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43maxis\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 385\u001b[0m \u001b[43m \u001b[49m\u001b[43mignore_index\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mignore_index\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 386\u001b[0m \u001b[43m \u001b[49m\u001b[43mjoin\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mjoin\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 387\u001b[0m \u001b[43m \u001b[49m\u001b[43mkeys\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mkeys\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 388\u001b[0m \u001b[43m \u001b[49m\u001b[43mlevels\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlevels\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 389\u001b[0m \u001b[43m \u001b[49m\u001b[43mnames\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mnames\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 390\u001b[0m \u001b[43m \u001b[49m\u001b[43mverify_integrity\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mverify_integrity\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 391\u001b[0m \u001b[43m \u001b[49m\u001b[43mcopy\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcopy\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 392\u001b[0m \u001b[43m \u001b[49m\u001b[43msort\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msort\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 393\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 395\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m op\u001b[38;5;241m.\u001b[39mget_result()\n", + "File \u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/core/reshape/concat.py:445\u001b[0m, in \u001b[0;36m_Concatenator.__init__\u001b[0;34m(self, objs, axis, join, keys, levels, names, ignore_index, verify_integrity, copy, sort)\u001b[0m\n\u001b[1;32m 442\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mverify_integrity \u001b[38;5;241m=\u001b[39m verify_integrity\n\u001b[1;32m 443\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcopy \u001b[38;5;241m=\u001b[39m copy\n\u001b[0;32m--> 445\u001b[0m objs, keys \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_clean_keys_and_objs\u001b[49m\u001b[43m(\u001b[49m\u001b[43mobjs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkeys\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 447\u001b[0m \u001b[38;5;66;03m# figure out what our result ndim is going to be\u001b[39;00m\n\u001b[1;32m 448\u001b[0m ndims \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_ndims(objs)\n", + "File \u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/core/reshape/concat.py:507\u001b[0m, in \u001b[0;36m_Concatenator._clean_keys_and_objs\u001b[0;34m(self, objs, keys)\u001b[0m\n\u001b[1;32m 504\u001b[0m objs_list \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mlist\u001b[39m(objs)\n\u001b[1;32m 506\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(objs_list) \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m:\n\u001b[0;32m--> 507\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mNo objects to concatenate\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 509\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m keys \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 510\u001b[0m objs_list \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mlist\u001b[39m(com\u001b[38;5;241m.\u001b[39mnot_none(\u001b[38;5;241m*\u001b[39mobjs_list))\n", + "\u001b[0;31mValueError\u001b[0m: No objects to concatenate" + ] + } + ], + "source": [ + "# Add an additional column to each dataframe\n", + "fractions = (0.01, 0.2)\n", + "for i, df in enumerate(results_transfer):\n", + " df['Fraction'] = fractions[i]\n", + "\n", + "# Concatenate the dataframes into a single dataframe\n", + "concatenated_df = pd.concat(results_transfer, ignore_index=True)\n", + "\n", + "# Print the concatenated dataframe\n", + "print(concatenated_df)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Random_SeedIterationNum_ExperimentsEfficiency_IterBestEfficiency_CumBest
count50.050.0000050.0000050.00000050.000000
mean1337.024.5000025.5000068.42471886.399133
std0.014.5773814.5773823.77539911.036087
min1337.00.000001.000004.39000057.000000
25%1337.012.2500013.2500050.80600078.380000
50%1337.024.5000025.5000079.91000090.000000
75%1337.036.7500037.7500087.32821493.590000
max1337.049.0000050.0000096.20000096.200000
\n", + "
" + ], + "text/plain": [ + " Random_Seed Iteration Num_Experiments Efficiency_IterBest \\\n", + "count 50.0 50.00000 50.00000 50.000000 \n", + "mean 1337.0 24.50000 25.50000 68.424718 \n", + "std 0.0 14.57738 14.57738 23.775399 \n", + "min 1337.0 0.00000 1.00000 4.390000 \n", + "25% 1337.0 12.25000 13.25000 50.806000 \n", + "50% 1337.0 24.50000 25.50000 79.910000 \n", + "75% 1337.0 36.75000 37.75000 87.328214 \n", + "max 1337.0 49.00000 50.00000 96.200000 \n", + "\n", + " Efficiency_CumBest \n", + "count 50.000000 \n", + "mean 86.399133 \n", + "std 11.036087 \n", + "min 57.000000 \n", + "25% 78.380000 \n", + "50% 90.000000 \n", + "75% 93.590000 \n", + "max 96.200000 " + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "results = " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "\n", + "ax = sns.lineplot(\n", + " data=result_fraction,\n", + " marker=\"o\",\n", + " markersize=10,\n", + " x=\"Num_Experiments\",\n", + " y=\"Efficiency_CumBest\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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HGYy/awtW7bgvvvug0ajQc+ePfHbb7/hwIED6NGjB7y9vREXF4c///zT4ud/+OGH6NChA9RqNdq3b4/333/ffM503a+//hr9+vWDp6cnunbtir179wIAdu3ahfHjx0On05l7rt566y0AwPvvv4/IyEio1WoEBgbiscces+reEzV0DDNEDYhcLseiRYuwcuVK/P777zZf58cff8SlS5fw888/45133sHcuXPx0EMPwd/fH2lpaZg4cSJeeOGFev2MylasWIHCwkLMmDEDAPDmm28iPz8f7733nkW7119/Ha+99hoOHz6MmJgYDB06FFeuXAEA5Ofno3///ujWrRsOHjyIHTt2IDc3F0888YTFNdavXw+lUok9e/ZgzZo1NdY0d+5czJo1C7/++isUCgVGjx6N6dOn491338V///tfnDlzBnPmzDG337BhA+bMmYOFCxfi1KlTWLRoEWbPno3169dbXPfNN9/EtGnTcOTIEbRt2xajRo1CRUUF7r33XixfvhxardbcczVt2jQcPHgQkyZNwvz583H69Gns2LEDffr0qdf9JmpwnLY/NxE51NixY8Vhw4aJoiiK99xzjxgfHy+Koihu3bpVNP2nPnfuXLFr164W37ds2TIxLCzM4jphYWGiwWAwH2vXrp143333mb+uqKgQvby8xE2bNtWpNgCiWq0Wvby8LD7nz583t/nll19EDw8Pcfbs2aJCoRD/+9//ms9lZWWJAMTFixebj5WXl4t33HGHuGTJElEURXHBggXiwIEDLX7uxYsXRQDi6dOnRVEUxb59+4rdunWrtr6tW7da/KwPP/zQfH7Tpk0iADElJcV8LDExUWzXrp3564iICHHjxo0W112wYIEYExNT43VPnDghAhBPnToliqIoJiUlib6+vhbX+Oqrr0StVivq9foqdRPRdQrJUhQROcySJUvQv39/TJs2zabv79SpE2Symx23gYGB6Ny5s/lruVyOpk2b4vLly3W+5rJlyxAbG2txLCQkxPznmJgYTJs2DQsWLMAbb7yB3r17V7lGTEyM+c8KhQI9evTAqVOnAABHjx7FTz/9BG9v7yrfl5mZibZt2wIAunfvXqd6u3TpYv5zYGAgACAqKsrimOn3LywsRGZmJp599lk8//zz5jYVFRXw9fWt8brBwcEAgMuXL6N9+/bV1vHAAw8gLCwMrVu3xuDBgzF48GA88sgj8PT0rNPvQdQYMMwQNUB9+vTBoEGDMHPmTIwbN858XCaTQRRFi7bl5eVVvt/Dw8Pia0EQqj1mNBrrXFNQUBDatGlT43mj0Yg9e/ZALpfjzJkzdb6uSUFBAYYOHYolS5ZUOWcKDQDg5eVVp+tV/n1Nb4Pdesz0+xcUFAAAPvjgA0RHR1tcRy6X3/a6td1HHx8f/Prrr9i1axe+//57zJkzB2+99RYOHDjAN5+IbuCcGaIGavHixfj222/NE0wBICAgADk5ORaB5siRIxJUV9Xf//53/O9//0Nqaip27NhR7QTjffv2mf9cUVGBQ4cOoUOHDgCAu+66CydOnECrVq3Qpk0bi09dA4ytAgMDERISgrNnz1b52eHh4XW+jlKphMFgqHJcoVAgNjYWS5cuRXp6Os6dO4cff/zRnr8CkVtjzwxRAxUVFYUxY8ZgxYoV5mP3338//vzzTyxduhSPPfYYduzYge3bt0Or1Tq8nvz8fOTk5Fgc8/HxgZeXFw4fPow5c+bgyy+/RK9evfDOO+/g1VdfRd++fdG6dWtz+1WrViEyMhIdOnTAsmXLkJeXh/j4eABAQkICPvjgA4waNQrTp09HkyZNcObMGWzevBkffvhhlR4Se5s3bx4mTZoEX19fDB48GKWlpTh48CDy8vIwderUOl2jVatWKCgoQEpKCrp27QpPT0/8+OOPOHv2LPr06QN/f3/85z//gdFoRLt27Rz6+xC5E/bMEDVg8+fPtxjC6NChA95//32sWrUKXbt2xf79+22eV2Ot8ePHIzg42OKzcuVKlJSU4KmnnsK4ceMwdOhQAMCECRPQr18/PP300xY9FYsXL8bixYvRtWtX7N69G9988w2aNWsG4Pr8mz179sBgMGDgwIGIiorC5MmT4efnZzH/x1Gee+45fPjhh0hKSkJUVBT69u2LdevWWdUzc++992LixIl48sknERAQgKVLl8LPzw9ff/01+vfvjw4dOmDNmjXYtGkTOnXq5MDfhsi9COKtA+hERC7m3LlzCA8Px+HDh6usk0NExJ4ZIiIicmsMM0RUL4sWLYK3t3e1H1fY74iIGj4OMxFRvVy9ehVXr16t9pxGo0GLFi2cXBERNTYMM0REROTWOMxEREREbo1hhoiIiNwawwwRERG5NYYZIiIicmsMM0REROTWGGaIiIjIrTHMEBERkVtjmCEiIiK39v9zIb8V8A0DiwAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "ax = sns.lineplot(\n", + " data=result_transfer_learning,\n", + " marker=\"o\",\n", + " markersize=10,\n", + " x=\"Num_Experiments\",\n", + " y=\"Efficiency_CumBest\",\n", + ")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/legacy_code/baybe-inhibitor.ipynb b/legacy_code/baybe-inhibitor.ipynb new file mode 100644 index 0000000..c584dc7 --- /dev/null +++ b/legacy_code/baybe-inhibitor.ipynb @@ -0,0 +1,187 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Introduction" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This project will focus on exploring the capabilities of Bayesian optimization, specifically employing BayBE, in the discovery of novel corrosion inhibitors for materials design. Initially, we will work with a randomly chosen subset from a comprehensive database of electrochemical responses of small organic molecules. Our goal is to assess how Bayesian optimization can speed up the screening process across the design space to identify promising compounds. We will compare different strategies for incorporating alloy information, while optimizing the experimental parameters with respect to the inhibitive performance of the screened compounds." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Initizalization" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Loading libraries and data files:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "from baybe import Campaign\n", + "\n", + "df_AA2024 = pd.read_excel('data/filtered_AA2024.xlsx')\n", + "df_AA1000 = pd.read_excel('data/filtered_AA1000.xlsx')\n", + "df_Al = pd.read_excel('data/filtered_Al.xlsx')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Data Processing" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Data Anaylsis" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Bayesian Optimization" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Search Space" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Objective" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Recommender" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Benchmarking" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Transfer Learning" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/legacy_code/michalis-baybe-inhibitor.ipynb b/legacy_code/michalis-baybe-inhibitor.ipynb new file mode 100644 index 0000000..434dada --- /dev/null +++ b/legacy_code/michalis-baybe-inhibitor.ipynb @@ -0,0 +1,513 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Imports" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# test" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Time_h pH Inhib_Concentrat_M Salt_Concentrat_M \\\n", + "count 611.000000 611.000000 611.000000 611.000000 \n", + "mean 135.801964 6.342062 0.006808 0.145450 \n", + "std 201.683867 2.529080 0.014059 0.200575 \n", + "min 0.500000 0.000000 0.000010 0.000000 \n", + "25% 24.000000 4.000000 0.000500 0.010000 \n", + "50% 24.000000 7.000000 0.001000 0.100000 \n", + "75% 144.000000 7.000000 0.003000 0.100000 \n", + "max 672.000000 10.000000 0.100000 0.600000 \n", + "\n", + " Efficiency \n", + "count 611.000000 \n", + "mean 26.736841 \n", + "std 288.788317 \n", + "min -4834.000000 \n", + "25% 30.000000 \n", + "50% 58.000000 \n", + "75% 87.950000 \n", + "max 100.000000 \n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "\n", + "df_AA2024 = pd.read_excel('data/filtered_AA2024.xlsx')\n", + "print(df_AA2024.describe())" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " SMILES Time_h pH Inhib_Concentrat_M \\\n", + "0 COCCOC(=O)OCSc1nc2c(s1)cccc2 24.0 4.0 0.001 \n", + "1 COCCOC(=O)OCSc1nc2c(s1)cccc2 24.0 10.0 0.001 \n", + "2 Cc1ccc(c(c1)n1nc2c(n1)cccc2)O 24.0 4.0 0.001 \n", + "3 Cc1ccc(c(c1)n1nc2c(n1)cccc2)O 24.0 10.0 0.001 \n", + "4 Clc1ccc(cc1)CC[C@](C(C)(C)C)(Cn1cncn1)O 24.0 4.0 0.001 \n", + "\n", + " Salt_Concentrat_M Efficiency \n", + "0 0.1 0.0 \n", + "1 0.1 0.0 \n", + "2 0.1 30.0 \n", + "3 0.1 30.0 \n", + "4 0.1 30.0 \n" + ] + } + ], + "source": [ + "print(df_AA2024.head())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Set targets/objectives = efficiency for now" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/vscode/.local/lib/python3.10/site-packages/baybe/telemetry.py:222: UserWarning: WARNING: BayBE Telemetry endpoint https://public.telemetry.baybe.p.uptimize.merckgroup.com:4317 cannot be reached. Disabling telemetry. The exception encountered was: ConnectionError, HTTPConnectionPool(host='verkehrsnachrichten.merck.de', port=80): Max retries exceeded with url: / (Caused by NameResolutionError(\": Failed to resolve 'verkehrsnachrichten.merck.de' ([Errno -2] Name or service not known)\"))\n", + " warnings.warn(\n" + ] + } + ], + "source": [ + "from baybe.targets import NumericalTarget\n", + "from baybe.objective import Objective\n", + "\n", + "target = NumericalTarget(\n", + " name=\"Efficiency\",\n", + " mode=\"MAX\",\n", + ")\n", + "objective = Objective(mode=\"SINGLE\", targets=[target])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Search Space" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "from baybe.parameters import NumericalDiscreteParameter, NumericalContinuousParameter\n", + "from baybe.searchspace import SearchSpace\n", + "\n", + "parameters = [\n", + "NumericalDiscreteParameter(\n", + " name=\"Time (h)\",\n", + " values=np.arange(1, 25, 1)\n", + " # tolerance = 0.004, assume certain experimental noise for each parameter measurement?\n", + "),\n", + "NumericalDiscreteParameter(\n", + " name=\"pH\",\n", + " values=np.arange(-1, 15.1, 0.1)\n", + " # tolerance = 0.004\n", + " ), \n", + "NumericalDiscreteParameter( # Set this as continuous, the values seem quite small?\n", + " name=\"Inhibitor Concentration (M)\",\n", + " values=np.arange(0, 0.1, 0.01), # Remove data outliers like 0.1?\n", + " # tolerance = 0.004\n", + " ),\n", + "NumericalDiscreteParameter(\n", + " name=\"Salt Concentration (M)\",\n", + " values=np.arange(0, 2.01, 0.01),\n", + " # tolerance = 0.004\n", + " )\n", + "]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Substance parameter**\n", + "\n", + "Instead of values, this parameter accepts data in form of a dictionary. The items correspond to pairs of labels and SMILES. SMILES are string-based representations of molecular structures. Based on these, BayBE can assign each label a set of molecular descriptors as encoding.\n", + "\n", + "For instance, a parameter corresponding to a choice of solvents can be initialized with:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from baybe.parameters import SubstanceParameter\n", + "\n", + "SubstanceParameter(\n", + " name=\"SMILES\",\n", + " data={\n", + " # INCORPORATE TRAINING DATA FROM DATAFRAME SMILES COLUMN\n", + " \"Water\": \"O\",\n", + " \"1-Octanol\": \"CCCCCCCCO\",\n", + " \"Toluene\": \"CC1=CC=CC=C1\",\n", + " },\n", + " encoding=\"MORDRED\", # Can be also RDKIT or MORGAN_FP - WHICH IS BETTER?\n", + " decorrelate=0.7, # Change threshold to avoid overfitting?\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "These calculations will typically result in 500 to 1500 numbers per molecule. **To avoid detrimental effects on the surrogate model fit, we reduce the number of descriptors via decorrelation before using them.** For instance, the decorrelate option in the example above specifies that only descriptors with a correlation lower than 0.7 to any other descriptor will be kept. This usually reduces the number of descriptors to 10-50, depending on the specific items in data." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\"\"\"\n", + "The encoding concept introduced above is generalized by the CustomParameter. Here, the user is expected to provide their own descriptors for the encoding.\n", + "\n", + "Take, for instance, a parameter that corresponds to the choice of a polymer. Polymers are not well represented by the small molecule descriptors utilized in the SubstanceParameter. \n", + "Still, one could provide experimental measurements or common metrics used to classify polymers:\n", + "from baybe.parameters import CustomDiscreteParameter\n", + "\n", + "# Create or import new dataframe containing custom descriptors\n", + "\n", + "descriptors = pd.DataFrame(\n", + " {\n", + " \"Glass_Transition_TempC\": [20, -71, -39],\n", + " \"Weight_kDalton\": [120, 32, 241],\n", + " },\n", + " index=[\"Polymer A\", \"Polymer B\", \"Polymer C\"], # put labels in the index\n", + ")\n", + "\n", + "CustomDiscreteParameter(\n", + " name=\"Polymer\",\n", + " data=descriptors,\n", + " decorrelate=True, # optional, uses default correlation threshold = 0.7?\n", + ")\n", + "\"\"\" " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "searchspace = SearchSpace.from_product(parameters)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Recommenders" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The **SequentialGreedyRecommender** is a powerful recommender that leverages BoTorch optimization functions to perform sequential Greedy optimization. It can be applied for discrete, continuous and hybrid sarch spaces. It is an implementation of the BoTorch optimization functions for discrete, continuous and mixed spaces. **It is important to note that this recommender performs a brute-force search when applied in hybrid search spaces, as it optimizes the continuous part of the space while exhaustively searching choices in the discrete subspace.** You can customize this behavior to only sample a certain percentage of the discrete subspace via the sample_percentage attribute and to choose different sampling strategies via the hybrid_sampler attribute. \n", + "\n", + "e.g.\n", + "strategy = TwoPhaseStrategy(recommender=SequentialGreedyRecommender(hybrid_sampler=\"Farthest\", sampling_percentage=0.3))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For implementing fully customized surrogate models e.g. from sklearn or PyTorch, see:\n", + "https://emdgroup.github.io/baybe/examples/Custom_Surrogates/Custom_Surrogates.html\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "from baybe.recommenders import RandomRecommender, SequentialGreedyRecommender\n", + "from baybe.surrogates import GaussianProcessSurrogate\n", + "\n", + "available_surr_models = [\n", + " \"GaussianProcessSurrogate\", \n", + " \"BayesianLinearSurrogate\",\n", + " \"MeanPredictionSurrogate\",\n", + " \"NGBoostSurrogate\",\n", + " \"RandomForestSurrogate\"\n", + "]\n", + "\n", + "available_acq_functions = [\n", + " \"qPI\", # q-Probability Of Improvement\n", + " \"qEI\", # q-Expected Improvement\n", + " \"qUCB\", # q-upper confidence bound with beta of 1.0\n", + "]\n", + "\n", + "# Defaults anyway\n", + "SURROGATE_MODEL = GaussianProcessSurrogate()\n", + "ACQ_FUNCTION = \"qEI\" # q-Expected Improvement, only q-fuctions are available for batch_size > 1\n", + "\n", + "seq_greedy_recommender = SequentialGreedyRecommender(\n", + " surrogate_model=SURROGATE_MODEL,\n", + " acquisition_function_cls=ACQ_FUNCTION,\n", + " hybrid_sampler=\"Farthest\", # find more details in the documentation\n", + " sampling_percentage=0.3, # should be relatively low\n", + " allow_repeated_recommendations=False,\n", + " allow_recommending_already_measured=False,\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Campaign Strategy" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/vscode/.local/lib/python3.10/site-packages/baybe/strategies/deprecation.py:26: DeprecationWarning: 'TwoPhaseStrategy' is deprecated and will be removed in a future version. Please use 'recommenders.TwoPhaseMetaRecommender' class instead.\n", + " warnings.warn(\n" + ] + } + ], + "source": [ + "from baybe.strategies import TwoPhaseStrategy\n", + "from baybe import Campaign\n", + "\n", + "strategy = TwoPhaseStrategy(\n", + " initial_recommender = RandomRecommender(), # Initial recommender\n", + " # Doesn't matter since I already have training data, BUT CAN BE USED FOR BENCHMARKING\n", + " recommender = seq_greedy_recommender, # Bayesian model-based optimization\n", + " switch_after=1 # Switch to the model-based recommender after 1 batches = immediately\n", + ")\n", + "\n", + "campaign = Campaign(searchspace, objective, strategy)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Get recommendations" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "Recommended experiments: \n", + "| | Time (h) | pH | Inhibitor Concentration (M) | Salt Concentration (M) |\n", + "|--------:|-----------:|-----:|------------------------------:|-------------------------:|\n", + "| 4924793 | 16 | 2.5 | 0.01 | 0.92 |\n", + "| 6006943 | 19 | 8 | 0.05 | 0.58 |\n", + "| 6994486 | 22 | 8.8 | 0.08 | 0.88 |\n" + ] + } + ], + "source": [ + "new_rec = campaign.recommend(batch_size=3) # TEST with different batch sizes for optimal performance\n", + "print(\"\\n\\nRecommended experiments: \")\n", + "print(new_rec.to_markdown())" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "Recommended experiments with measured values: \n", + "| | Time (h) | pH | Inhibitor Concentration (M) | Salt Concentration (M) | efficiency |\n", + "|--------:|-----------:|-----:|------------------------------:|-------------------------:|-------------:|\n", + "| 4924793 | 16 | 2.5 | 0.01 | 0.92 | 0.1 |\n", + "| 6006943 | 19 | 8 | 0.05 | 0.58 | 0.2 |\n", + "| 6994486 | 22 | 8.8 | 0.08 | 0.88 | 0.3 |\n" + ] + } + ], + "source": [ + "# Get and input efficiency value from Excel table, for specific SMILES component first, \n", + "# then for the closest values of the rest of the parameters\n", + "\n", + "new_rec[\"efficiency\"] = [0.1, 0.2, 0.3]\n", + "print(\"\\n\\nRecommended experiments with measured values: \")\n", + "print(new_rec.to_markdown())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Wtf, why is recommending the same values as before here? " + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "Recommended experiments: \n", + "| | Time (h) | pH | Inhibitor Concentration (M) | Salt Concentration (M) | efficiency |\n", + "|--------:|-----------:|-----:|------------------------------:|-------------------------:|-------------:|\n", + "| 4924793 | 16 | 2.5 | 0.01 | 0.92 | 0.1 |\n", + "| 6006943 | 19 | 8 | 0.05 | 0.58 | 0.2 |\n", + "| 6994486 | 22 | 8.8 | 0.08 | 0.88 | 0.3 |\n" + ] + } + ], + "source": [ + "new_new_rec = campaign.recommend(batch_size=3) # TEST with different batch sizes for optimal performance\n", + "print(\"\\n\\nRecommended experiments: \")\n", + "print(new_new_rec.to_markdown())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Merge all results into a dataframe" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "All experiments with measured values: \n", + "| | Time (h) | pH | Inhibitor Concentration (M) | Salt Concentration (M) | efficiency |\n", + "|--------:|-----------:|-----:|------------------------------:|-------------------------:|-------------:|\n", + "| 4924793 | 16 | 2.5 | 0.01 | 0.92 | 0.1 |\n", + "| 6006943 | 19 | 8 | 0.05 | 0.58 | 0.2 |\n", + "| 6994486 | 22 | 8.8 | 0.08 | 0.88 | 0.3 |\n", + "| 4924793 | 16 | 2.5 | 0.01 | 0.92 | nan |\n", + "| 6006943 | 19 | 8 | 0.05 | 0.58 | nan |\n", + "| 6994486 | 22 | 8.8 | 0.08 | 0.88 | nan |\n" + ] + } + ], + "source": [ + "results = pd.concat([new_rec, new_new_rec]) # etc.\n", + "print(\"\\n\\nAll experiments with measured values: \")\n", + "print(results.to_markdown())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Transfer learning + Initial Data INFO" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "https://emdgroup.github.io/baybe/examples/Transfer_Learning/basic_transfer_learning.html\n", + "\n", + "https://emdgroup.github.io/baybe/userguide/transfer_learning.html" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "https://emdgroup.github.io/baybe/examples/Backtesting/full_initial_data.html\n", + "\n", + "https://emdgroup.github.io/baybe/examples/Backtesting/full_lookup.html" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/legacy_code/tim_baybe-inhibitor.ipynb b/legacy_code/tim_baybe-inhibitor.ipynb new file mode 100644 index 0000000..4f8b481 --- /dev/null +++ b/legacy_code/tim_baybe-inhibitor.ipynb @@ -0,0 +1,1057 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Introduction" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This project will focus on exploring the capabilities of Bayesian optimization, specifically employing BayBE, in the discovery of novel corrosion inhibitors for materials design. Initially, we will work with a randomly chosen subset from a comprehensive database of electrochemical responses of small organic molecules. Our goal is to assess how Bayesian optimization can speed up the screening process across the design space to identify promising compounds. We will compare different strategies for incorporating alloy information, while optimizing the experimental parameters with respect to the inhibitive performance of the screened compounds." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Initialization" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Loading libraries and data files:" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "from baybe import Campaign\n", + "\n", + "df_AA2024 = pd.read_excel('../data/averaged_filtered_AA2024.xlsx')\n", + "df_AA1000 = pd.read_excel('../data/averaged_filtered_AA1000.xlsx')\n", + "df_Al = pd.read_excel('../data/averaged_filtered_Al.xlsx')\n", + "\n", + "df_active = df_AA2024\n", + "lookup = df_active" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "def random_subsample(df, num_samples):\n", + " np.random.seed(42)\n", + " indices = np.random.choice(df.index, num_samples, replace=False)\n", + " subsampled_df = df.loc[indices]\n", + " return subsampled_df " + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
SMILESTime_hpHInhib_Concentrat_MSalt_Concentrat_MEfficiency
0C(=O)(C(=O)[O-])[O-]24.04.00.00100.1020.00
1C(=O)(C(=O)[O-])[O-]24.07.00.00050.0512.35
2C(=O)(C(=O)[O-])[O-]24.010.00.00100.1020.00
3C(C(=O)[O-])C(CC(=O)[O-])(C(=O)[O-])O24.04.00.00100.1030.00
4C(C(=O)[O-])C(CC(=O)[O-])(C(=O)[O-])O24.07.00.00050.05-23.95
\n", + "
" + ], + "text/plain": [ + " SMILES Time_h pH Inhib_Concentrat_M \\\n", + "0 C(=O)(C(=O)[O-])[O-] 24.0 4.0 0.0010 \n", + "1 C(=O)(C(=O)[O-])[O-] 24.0 7.0 0.0005 \n", + "2 C(=O)(C(=O)[O-])[O-] 24.0 10.0 0.0010 \n", + "3 C(C(=O)[O-])C(CC(=O)[O-])(C(=O)[O-])O 24.0 4.0 0.0010 \n", + "4 C(C(=O)[O-])C(CC(=O)[O-])(C(=O)[O-])O 24.0 7.0 0.0005 \n", + "\n", + " Salt_Concentrat_M Efficiency \n", + "0 0.10 20.00 \n", + "1 0.05 12.35 \n", + "2 0.10 20.00 \n", + "3 0.10 30.00 \n", + "4 0.05 -23.95 " + ] + }, + "execution_count": 70, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_active.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": {}, + "outputs": [], + "source": [ + "unique_smiles = df_active.SMILES.unique()\n", + "unique_times = df_active.Time_h.unique()\n", + "unique_pH = df_active.pH.unique()\n", + "unique_inhib_conc = df_active.Inhib_Concentrat_M.unique()\n", + "unique_salt_conc = df_active.Salt_Concentrat_M.unique()\n", + "\n", + "time_min, time_max = df_active.Time_h.min(), df_active.Time_h.max()\n", + "pH_min, pH_max = df_active.pH.min(), df_active.pH.max()\n", + "inhib_conc_min, inhib_conc_max = df_active.Inhib_Concentrat_M.min(), df_active.Inhib_Concentrat_M.max()\n", + "salt_conc_min, salt_conc_max = df_active.Salt_Concentrat_M.min(), df_active.Salt_Concentrat_M.max()\n", + "efficiency_min, efficiency_max = df_active.Efficiency.min(), df_active.Efficiency.max()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Data Processing" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Data Anaylsis" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Bayesian Optimization" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 72, + "metadata": {}, + "outputs": [], + "source": [ + "from baybe import Campaign\n", + "\n", + "from baybe.targets import NumericalTarget\n", + "from baybe.objective import Objective\n", + "from baybe.searchspace import SearchSpace\n", + "from baybe.parameters import NumericalDiscreteParameter\n", + "from baybe.parameters import SubstanceParameter\n", + "\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "\n", + "def list_to_dict(input_list):\n", + " return {item: item for item in input_list}\n", + "\n", + "smiles_dict =list_to_dict(unique_smiles)\n", + "\n", + "\n", + "target = NumericalTarget(name=\"Efficiency\", mode=\"MAX\", bounds=(efficiency_min, efficiency_max), transformation=\"LINEAR\")\n", + "objective = Objective(mode=\"SINGLE\", targets=[target])\n", + "\n", + "\n", + "\n", + "parameters = [\n", + "NumericalDiscreteParameter(\n", + " name=\"Time_h\",\n", + " values=df_active['Time_h'].unique(),\n", + " # tolerance = 0.004, assume certain experimental noise for each parameter measurement?\n", + "),\n", + "NumericalDiscreteParameter(\n", + " name=\"pH\",\n", + " values=df_active['pH'].unique(),\n", + " # tolerance = 0.004\n", + " ), \n", + "NumericalDiscreteParameter( # Set this as continuous, the values seem quite small?\n", + " name=\"Inhib_Concentrat_M\",\n", + " values= df_active['Inhib_Concentrat_M'].unique(),\n", + " # tolerance = 0.004\n", + " ),\n", + "NumericalDiscreteParameter(\n", + " name=\"Salt_Concentrat_M\",\n", + " values=df_active['Salt_Concentrat_M'].unique(),\n", + " # tolerance = 0.004\n", + " ),\n", + "SubstanceParameter(\n", + " name=\"SMILES\",\n", + " data=smiles_dict,\n", + " encoding=\"MORGAN_FP\", # optional\n", + " decorrelate=0.7, # optional\n", + " ) \n", + " ]\n", + "# searchspace = SubspaceDiscrete.from_product(parameters=parameters)\n", + "df_no_target = df_active.drop('Efficiency', axis=1)\n", + "\n", + "searchspace = SearchSpace.from_dataframe(df = df_no_target, parameters=parameters)\n", + "\n", + "campaign = Campaign(\n", + " searchspace=searchspace, # Required\n", + " objective=objective, # Required\n", + " # recommender=recommender, # Optional\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "metadata": {}, + "outputs": [], + "source": [ + "from baybe.recommenders import RandomRecommender\n", + "\n", + "campaign_rand = Campaign(\n", + " searchspace=searchspace,\n", + " recommender=RandomRecommender(),\n", + " objective=objective,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": {}, + "outputs": [], + "source": [ + "substance_encodings = [\"MORDRED\", \"RDKIT\", \"MORGAN_FP\"]\n", + "scenarios = {\n", + " encoding: Campaign(\n", + " searchspace=SearchSpace.from_dataframe(df = df_no_target,\n", + " parameters=[\n", + " NumericalDiscreteParameter(\n", + " name=\"Time_h\",\n", + " values=df_active[\"Time_h\"].unique(),\n", + " # tolerance = 0.004, assume certain experimental noise for each parameter measurement?\n", + " ),\n", + " NumericalDiscreteParameter(\n", + " name=\"pH\",\n", + " values=df_active[\"pH\"].unique(),\n", + " # tolerance = 0.004\n", + " ),\n", + " NumericalDiscreteParameter( # Set this as continuous, the values seem quite small?\n", + " name=\"Inhib_Concentrat_M\",\n", + " values=df_active[\"Inhib_Concentrat_M\"].unique(),\n", + " # tolerance = 0.004\n", + " ),\n", + " NumericalDiscreteParameter(\n", + " name=\"Salt_Concentrat_M\",\n", + " values=df_active[\"Salt_Concentrat_M\"].unique(),\n", + " # tolerance = 0.004\n", + " ),\n", + " SubstanceParameter(\n", + " name=\"SMILES\",\n", + " data=smiles_dict,\n", + " encoding=encoding, # optional\n", + " decorrelate=0.7, # optional\n", + " ),\n", + " ]\n", + " ),\n", + " objective=objective,\n", + " )\n", + " for encoding in substance_encodings\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "metadata": {}, + "outputs": [], + "source": [ + "scenarios.update({\"Random Baseline\": campaign_rand})" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|##########| 4/4 [01:05<00:00, 16.27s/it]\n" + ] + } + ], + "source": [ + "from baybe.simulation import simulate_experiment\n", + "from baybe.simulation import simulate_scenarios\n", + "\n", + "\n", + "BATCH_SIZE = 1\n", + "N_DOE_ITERATIONS = 50\n", + "N_MC_ITERATIONS = 10\n", + "\n", + "# results = simulate_experiment(\n", + "# campaign,\n", + "# df_AA2024,\n", + "# initial_data=initial_dataset,\n", + "# batch_size=BATCH_SIZE,\n", + "# n_doe_iterations=N_DOE_ITERATIONS,\n", + "# impute_mode=\"best\",\n", + "# )\n", + "initial_dataset = random_subsample(df_active, 5)\n", + "\n", + "results = simulate_scenarios(\n", + " scenarios,\n", + " lookup,\n", + " initial_data=[initial_dataset],\n", + " batch_size=BATCH_SIZE,\n", + " n_doe_iterations=N_DOE_ITERATIONS,\n", + " # n_mc_iterations=N_MC_ITERATIONS,\n", + " impute_mode=\"best\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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Dw94enqiU6dOGD16NI4fP47U1NQy91vy4eTkpBXj7OwMDw8P1KtXD7169cLPP/+M0NBQTJgwAUlJSXodz5qOxY6RabLZoExEpkEIgcycvEo/snPzIYRAdm5+mc8r+yh5mqgqwsLCsH79evn5119/jVGjRsnPHzx4gD/++AOvv/46bP81vYeHhwdCQ0Pxww8/lLl/IQQOHTqEf/75p1KT2SkUCrz55puIjY0t99TSnTt3sG3bNlhYWMDCwqKyb7NCkydPRlpaWpkFGRXjPDtGxkkFichUZOXmo8ncP6r0mi6BtfDZ0Nb44UQcBrf3wavfnsShqHtV2sbl93rDzqrqf46GDx+OmTNnIjY2FgBw+PBhbN68Gfv37wcAREVFQQiBoKCgMl8fFBSEpKQk3L17F3Xq1AEArFq1CmvXrkVOTg5yc3NhY2ODiRMnViqfxo0bAyjo63nssccAACkpKXBwcCgoJAtnqp44cSLs7e21Xlu035K++OILhIaGVnqfVD4WO0ZWPKkgix0ievQcirqHH07EYWy3BvjiQHSVCx191K5dG/369cOGDRsghEC/fv1Qq1atUnFVGTkKDQ3FrFmzkJSUhHnz5qFTp07o1KlTpV5btJ+SM1E7Ojri9OnTyM3Nxc6dO/H9999jwYIF5e63JHd3d532SaWx2DGy4kkF2aBMRMZla2mBy+/1rtJrFJIEa6UCufkajOlaHyM61YOmiqelbC11P6UTFhaGCRMmAABWrlyptS4gIACSJCEiIgIDBw4s9dqIiAi4uLigdu3a8jKVSoWAgAAAwI8//oiAgAB07NgRISEh/5lLREQEAMDf319eplAo5O0FBQUhOjoar732Gr777jut15bcb1WUtU8qjT07RlY8qSDveE5ExiVJEuyslFV62FhaQJIkWFooCi7ZtrSo8jb0GZXo06ePfMqpd2/tQs3NzQ1PPvkkVq1apXXVFgAkJibi+++/x+DBg8vdv4ODA958801MmzbtP0eHNBoNVqxYAX9/f60G6X97++238cMPP+D06dOVfIcVW758OZycnCpVjJkzFjtGVjypIEd2iIiqysLCAhEREbh8+XKZTb+ff/451Go1evfujYMHDyIuLg67du3Ck08+CW9v7zJPKZU0duxYXLlyBVu2bNFafv/+fSQmJuLatWv45ZdfEBISguPHj2PdunUVNh/7+Phg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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "max_efficiency = lookup[\"Efficiency\"].max()\n", + "# plot_results = results[results['Scenario'].isin(['Mordred', 'Morgan', 'RDKIT'])]\n", + "\n", + "sns.lineplot(\n", + " data=results, x=\"Num_Experiments\", y=\"Efficiency_CumBest\", hue=\"Scenario\", marker=\"x\"\n", + ")\n", + "plt.plot([0.5, N_DOE_ITERATIONS+0.5], [max_efficiency, max_efficiency], \"--r\")\n", + "plt.legend(loc=\"lower right\")\n", + "import matplotlib.pyplot as plt\n", + "\n", + "plt.xlim(0, N_DOE_ITERATIONS+1)\n", + "plt.savefig(\"./AA1000_simulation_10MC_50exp_1batch.png\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Search Space" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Target & Objective" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Recommender" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Benchmarking" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Transfer Learning" + ] + }, + { + "cell_type": "code", + "execution_count": 110, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import sys\n", + "from pathlib import Path\n", + "\n", + "import numpy as np\n", + "import pandas as pd\n", + "import seaborn as sns\n", + "from botorch.test_functions.synthetic import Hartmann\n", + "\n", + "from baybe import Campaign\n", + "from baybe.objective import Objective\n", + "from baybe.parameters import NumericalDiscreteParameter, TaskParameter, CategoricalParameter\n", + "from baybe.searchspace import SearchSpace\n", + "from baybe.simulation import simulate_scenarios, simulate_transfer_learning\n", + "from baybe.targets import NumericalTarget\n", + "from baybe.utils.botorch_wrapper import botorch_function_wrapper\n", + "from baybe.utils.plotting import create_example_plots\n" + ] + }, + { + "cell_type": "code", + "execution_count": 111, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "SMOKE_TEST = \"SMOKE_TEST\" in os.environ # reduce the problem complexity in CI pipelines\n", + "DIMENSION = 3 # input dimensionality of the test function\n", + "BATCH_SIZE = 1 # batch size of recommendations per DOE iteration\n", + "N_MC_ITERATIONS = 2 if SMOKE_TEST else 50 # number of Monte Carlo runs\n", + "N_DOE_ITERATIONS = 2 if SMOKE_TEST else 10 # number of DOE iterations\n", + "POINTS_PER_DIM = 3 if SMOKE_TEST else 7 # number of grid points per input dimension\n" + ] + }, + { + "cell_type": "code", + "execution_count": 112, + "metadata": {}, + "outputs": [], + "source": [ + "df_AA2024 = pd.read_excel('../data/averaged_filtered_AA2024.xlsx')\n", + "df_AA2024[\"alloy\"] = \"AA2024\"\n", + "df_AA1000 = pd.read_excel('../data/averaged_filtered_AA1000.xlsx')\n", + "df_AA1000[\"alloy\"] = \"AA1000\"\n", + "df_AA5000 = pd.read_excel('../data/averaged_filtered_AA5000.xlsx')\n", + "df_AA5000[\"alloy\"] = \"AA5000\"\n", + "df_AA6000 = pd.read_excel('../data/averaged_filtered_AA6000.xlsx')\n", + "df_AA6000[\"alloy\"] = \"AA6000\"\n", + "df_AA7075 = pd.read_excel('../data/averaged_filtered_AA7075.xlsx')\n", + "df_AA7075[\"alloy\"] = \"AA7075\"\n", + "df_Al = pd.read_excel('../data/averaged_filtered_Al.xlsx')" + ] + }, + { + "cell_type": "code", + "execution_count": 113, + "metadata": {}, + "outputs": [], + "source": [ + "target = NumericalTarget(name=\"Efficiency\", mode=\"MAX\", bounds=(efficiency_min, efficiency_max), transformation=\"LINEAR\")\n", + "objective = Objective(mode=\"SINGLE\", targets=[target])" + ] + }, + { + "cell_type": "code", + "execution_count": 133, + "metadata": {}, + "outputs": [], + "source": [ + "df_combined = pd.concat([df_AA2024, df_AA1000, df_AA5000, df_AA6000, df_AA7075], axis=0).reset_index(drop=True)\n", + "# df_active = df_AA2024\n", + "lookup = df_combined" + ] + }, + { + "cell_type": "code", + "execution_count": 145, + "metadata": {}, + "outputs": [], + "source": [ + "def list_to_dict(input_list):\n", + " return {item: item for item in input_list}\n", + "\n", + "smiles_dict =list_to_dict(df_combined.SMILES.unique())\n", + "\n", + "discrete_params = [\n", + "NumericalDiscreteParameter(\n", + " name=\"Time_h\",\n", + " values=df_combined['Time_h'].unique(),\n", + " # tolerance = 0.004, assume certain experimental noise for each parameter measurement?\n", + "),\n", + "NumericalDiscreteParameter(\n", + " name=\"pH\",\n", + " values=df_combined['pH'].unique(),\n", + " # tolerance = 0.004\n", + " ), \n", + "NumericalDiscreteParameter( # Set this as continuous, the values seem quite small?\n", + " name=\"Inhib_Concentrat_M\",\n", + " values= df_combined['Inhib_Concentrat_M'].unique(),\n", + " # tolerance = 0.004\n", + " ),\n", + "NumericalDiscreteParameter(\n", + " name=\"Salt_Concentrat_M\",\n", + " values=df_combined['Salt_Concentrat_M'].unique(),\n", + " # tolerance = 0.004\n", + " ),\n", + "# CategoricalParameter(\n", + "# name=\"alloy\",\n", + "# values=df_combined['alloy'].unique(),\n", + "# ),\n", + "SubstanceParameter(\n", + " name=\"SMILES\",\n", + " data=smiles_dict,\n", + " encoding=\"MORDRED\", # optional\n", + " decorrelate=0.7, # optional\n", + " ) \n", + " ]\n", + "# searchspace = SubspaceDiscrete.from_product(parameters=parameters)\n", + "df_no_target = df_combined.drop('Efficiency', axis=1).reset_index(drop=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 147, + "metadata": {}, + "outputs": [], + "source": [ + "task_param = TaskParameter(\n", + " name=\"alloy\",\n", + " values=[\"AA1000\", \"AA2024\", \"AA5000\", \"AA6000\", \"AA7075\"],\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 149, + "metadata": {}, + "outputs": [], + "source": [ + "parameters = [*discrete_params, task_param]\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 150, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
SMILESTime_hpHInhib_Concentrat_MSalt_Concentrat_MEfficiencyalloy
0C(=O)(C(=O)[O-])[O-]24.04.00.00100.1020.00AA2024
1C(=O)(C(=O)[O-])[O-]24.07.00.00050.0512.35AA2024
2C(=O)(C(=O)[O-])[O-]24.010.00.00100.1020.00AA2024
3C(C(=O)[O-])C(CC(=O)[O-])(C(=O)[O-])O24.04.00.00100.1030.00AA2024
4C(C(=O)[O-])C(CC(=O)[O-])(C(=O)[O-])O24.07.00.00050.05-23.95AA2024
\n", + "
" + ], + "text/plain": [ + " SMILES Time_h pH Inhib_Concentrat_M \\\n", + "0 C(=O)(C(=O)[O-])[O-] 24.0 4.0 0.0010 \n", + "1 C(=O)(C(=O)[O-])[O-] 24.0 7.0 0.0005 \n", + "2 C(=O)(C(=O)[O-])[O-] 24.0 10.0 0.0010 \n", + "3 C(C(=O)[O-])C(CC(=O)[O-])(C(=O)[O-])O 24.0 4.0 0.0010 \n", + "4 C(C(=O)[O-])C(CC(=O)[O-])(C(=O)[O-])O 24.0 7.0 0.0005 \n", + "\n", + " Salt_Concentrat_M Efficiency alloy \n", + "0 0.10 20.00 AA2024 \n", + "1 0.05 12.35 AA2024 \n", + "2 0.10 20.00 AA2024 \n", + "3 0.10 30.00 AA2024 \n", + "4 0.05 -23.95 AA2024 " + ] + }, + "execution_count": 150, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "lookup.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 151, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
SMILESTime_hpHInhib_Concentrat_MSalt_Concentrat_Malloy
0C(=O)(C(=O)[O-])[O-]24.04.00.00100.10AA2024
1C(=O)(C(=O)[O-])[O-]24.07.00.00050.05AA2024
2C(=O)(C(=O)[O-])[O-]24.010.00.00100.10AA2024
3C(C(=O)[O-])C(CC(=O)[O-])(C(=O)[O-])O24.04.00.00100.10AA2024
4C(C(=O)[O-])C(CC(=O)[O-])(C(=O)[O-])O24.07.00.00050.05AA2024
.....................
1180c1ccc2c(c1)[nH]nn224.04.00.00100.10AA7075
1181c1ccc2c(c1)[nH]nn224.010.00.00100.10AA7075
1182c1ccc2c(c1)[nH]nn2672.07.00.00100.10AA7075
1183c1ncn[nH]124.04.00.00100.10AA7075
1184c1ncn[nH]124.010.00.00100.10AA7075
\n", + "

1185 rows × 6 columns

\n", + "
" + ], + "text/plain": [ + " SMILES Time_h pH Inhib_Concentrat_M \\\n", + "0 C(=O)(C(=O)[O-])[O-] 24.0 4.0 0.0010 \n", + "1 C(=O)(C(=O)[O-])[O-] 24.0 7.0 0.0005 \n", + "2 C(=O)(C(=O)[O-])[O-] 24.0 10.0 0.0010 \n", + "3 C(C(=O)[O-])C(CC(=O)[O-])(C(=O)[O-])O 24.0 4.0 0.0010 \n", + "4 C(C(=O)[O-])C(CC(=O)[O-])(C(=O)[O-])O 24.0 7.0 0.0005 \n", + "... ... ... ... ... \n", + "1180 c1ccc2c(c1)[nH]nn2 24.0 4.0 0.0010 \n", + "1181 c1ccc2c(c1)[nH]nn2 24.0 10.0 0.0010 \n", + "1182 c1ccc2c(c1)[nH]nn2 672.0 7.0 0.0010 \n", + "1183 c1ncn[nH]1 24.0 4.0 0.0010 \n", + "1184 c1ncn[nH]1 24.0 10.0 0.0010 \n", + "\n", + " Salt_Concentrat_M alloy \n", + "0 0.10 AA2024 \n", + "1 0.05 AA2024 \n", + "2 0.10 AA2024 \n", + "3 0.10 AA2024 \n", + "4 0.05 AA2024 \n", + "... ... ... \n", + "1180 0.10 AA7075 \n", + "1181 0.10 AA7075 \n", + "1182 0.10 AA7075 \n", + "1183 0.10 AA7075 \n", + "1184 0.10 AA7075 \n", + "\n", + "[1185 rows x 6 columns]" + ] + }, + "execution_count": 151, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_combined.drop('Efficiency', axis=1).reset_index(drop=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 152, + "metadata": {}, + "outputs": [], + "source": [ + "searchspace = SearchSpace.from_dataframe(df = df_combined.drop('Efficiency', axis=1), parameters=parameters)" + ] + }, + { + "cell_type": "code", + "execution_count": 153, + "metadata": {}, + "outputs": [], + "source": [ + "campaign = Campaign(searchspace=searchspace, objective=objective)" + ] + }, + { + "cell_type": "code", + "execution_count": 154, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 0%| | 0/250 [00:00 +image/svg+xmlBayBE One More TimeExploring Corrosion Inhibitors for Materials DesignTim Würger (Helmholtz-Zentrum Hereon), Can Özkan (TU Delft), Michail Mitsakis (DTU), Alexander Wieczorek (Empa / ETH Zürich) Thought experiment: "Just a matter of time"Automated setup to quantify influence on corrosion rateTen experiments in parallel (duration 24h)Estimated number of synthezisable compounds amounts to 1.0 × 1063~3.0 × 1059 years~41,000 yearsChemical Abstract Service database lists around 1.5 × 108 organic chemicalsApproximately 1.0 × 1021 stars in the observable universeDo you know this feeling? You are stuck in the lab because you really have to find this one corrosion inhibitor to replace your current toxic chromate solution but you don't know where to start looking? + +What do you say? There are actually billions over billions candidates you would need to test to find a suitable candidate? This costs money, time and resources you don't have? +Say no more, the Surface Science Syndicate got your back. Why don't you use bayesian optimization with BayBE to find a new corrosion inhibitor and ditch your traditional DoE strategy for something shiny, new and cool (and actually working)? Let us tell you more about it below. + + +FOLLOW US +traditionalDoE strategy... BayBE one more timeInstead of hitting the lab millions of times without actually knowing exactly what you should best do next, how about you let BayBE decide on that... + +Hit me BayBE one more time! +Oh BayBE BayBE, Oh BayBE BayBEBy choosing suitable chemical descriptors, bayesian optimization with BayBE significantly improves the time until a suitable corrosion inhibitor is found in a given chemical space. + +Here, featurization is key and largely impacts the number of required experimental loops! So adapt your descriptors to your domain. +AA1000AA2024AA7075AllOutlook +Inhibitor discovery - Transfer Learning to find new corrosion inhibitors for other materials faster + +Available datasets can be used to accelerate the discovery of new corrosion inhibitors also for other metals via Transfer Learning. diff --git a/requirements.txt b/requirements.txt index 097a011..12f23a8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,4 +6,5 @@ # matplotlib-inline # ipython # ipykernel +# baybe pytest diff --git a/results/AA1000_simulation_10MC_50exp_1batch.xlsx b/results/AA1000_simulation_10MC_50exp_1batch.xlsx new file mode 100644 index 0000000..408bfdd Binary files /dev/null and b/results/AA1000_simulation_10MC_50exp_1batch.xlsx differ diff --git a/results/AA2024_simulation_10MC_50exp_1batch.xlsx b/results/AA2024_simulation_10MC_50exp_1batch.xlsx new file mode 100644 index 0000000..3ccec51 Binary files /dev/null and b/results/AA2024_simulation_10MC_50exp_1batch.xlsx differ diff --git a/results/AA5000_simulation_10MC_50exp_1batch.xlsx b/results/AA5000_simulation_10MC_50exp_1batch.xlsx new file mode 100644 index 0000000..c92f24f Binary files /dev/null and b/results/AA5000_simulation_10MC_50exp_1batch.xlsx differ diff --git a/results/AA6000_simulation_10MC_50exp_1batch.xlsx b/results/AA6000_simulation_10MC_50exp_1batch.xlsx new file mode 100644 index 0000000..7395d38 Binary files /dev/null and b/results/AA6000_simulation_10MC_50exp_1batch.xlsx differ diff --git a/results/AA7075_simulation_10MC_50exp_1batch.xlsx b/results/AA7075_simulation_10MC_50exp_1batch.xlsx new file mode 100644 index 0000000..606f6bd Binary files /dev/null and b/results/AA7075_simulation_10MC_50exp_1batch.xlsx differ diff --git a/results/Al_simulation_10MC_50exp_1batch.xlsx b/results/Al_simulation_10MC_50exp_1batch.xlsx new file mode 100644 index 0000000..5f273c9 Binary files /dev/null and b/results/Al_simulation_10MC_50exp_1batch.xlsx differ diff --git a/src/mock1/__init__.py b/src/mock1/__init__.py deleted file mode 100644 index d98cc4b..0000000 --- a/src/mock1/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -"""Mock function that gets installed by requirements.txt""" -from mock1._mock1 import Mock1 diff --git a/src/mock1/_mock1.py b/src/mock1/_mock1.py deleted file mode 100644 index 43f32d9..0000000 --- a/src/mock1/_mock1.py +++ /dev/null @@ -1,6 +0,0 @@ -class Mock1: - def __init__(self): - pass - - def mock(self): - print("this is a mock function") diff --git a/src/mock2/__init__.py b/src/mock2/__init__.py deleted file mode 100644 index 9d29bf3..0000000 --- a/src/mock2/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -"""Mock function that gets installed by requirements.txt""" -from mock2._mock2 import Mock2 diff --git a/src/mock2/_mock2.py b/src/mock2/_mock2.py deleted file mode 100644 index f5b7725..0000000 --- a/src/mock2/_mock2.py +++ /dev/null @@ -1,6 +0,0 @@ -class Mock2: - def __init__(self): - pass - - def mock(self): - print("this is a mock function") diff --git a/utils/subsampling.py b/utils/subsampling.py new file mode 100644 index 0000000..47bf870 --- /dev/null +++ b/utils/subsampling.py @@ -0,0 +1,7 @@ +import numpy as np + +def random_subsample(df, num_samples): + np.random.seed(42) + indices = np.random.choice(df.index, num_samples, replace=False) + subsampled_df = df.loc[indices] + return subsampled_df