From da14bcf8de0e84d06746d9376b96701cb1e64ec3 Mon Sep 17 00:00:00 2001 From: rvalenciaaz Date: Fri, 29 Mar 2024 08:03:03 +0000 Subject: [PATCH] Added notebook for other cases --- ...ltiplot_correction_case_1-checkpoint.ipynb | 752 +++++++ ...ction_case_1_evil_muejeje-checkpoint.ipynb | 715 +++++++ ...ltiplot_correction_case_2-checkpoint.ipynb | 1872 +++++++++++++++++ ...ltiplot_correction_case_3-checkpoint.ipynb | 3 +- ...alBO_llm_multiplot_correction_case_1.ipynb | 752 +++++++ ...iplot_correction_case_1_evil_muejeje.ipynb | 715 +++++++ ...alBO_llm_multiplot_correction_case_2.ipynb | 1872 +++++++++++++++++ ...alBO_llm_multiplot_correction_case_3.ipynb | 3 +- 8 files changed, 6682 insertions(+), 2 deletions(-) create mode 100644 data/.ipynb_checkpoints/preferentialBO_llm_multiplot_correction_case_1-checkpoint.ipynb create mode 100644 data/.ipynb_checkpoints/preferentialBO_llm_multiplot_correction_case_1_evil_muejeje-checkpoint.ipynb create mode 100644 data/.ipynb_checkpoints/preferentialBO_llm_multiplot_correction_case_2-checkpoint.ipynb create mode 100644 data/preferentialBO_llm_multiplot_correction_case_1.ipynb create mode 100644 data/preferentialBO_llm_multiplot_correction_case_1_evil_muejeje.ipynb create mode 100644 data/preferentialBO_llm_multiplot_correction_case_2.ipynb diff --git a/data/.ipynb_checkpoints/preferentialBO_llm_multiplot_correction_case_1-checkpoint.ipynb b/data/.ipynb_checkpoints/preferentialBO_llm_multiplot_correction_case_1-checkpoint.ipynb new file mode 100644 index 0000000..afc7641 --- /dev/null +++ b/data/.ipynb_checkpoints/preferentialBO_llm_multiplot_correction_case_1-checkpoint.ipynb @@ -0,0 +1,752 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "#change utility1 by the corresponding number, get back utility 3 done\n", + "#change prompt done\n", + "#change pickle filename done\n", + "#change plot name done\n", + "#change objective name" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "id": "NTeLbyDoMi0-" + }, + "outputs": [], + "source": [ + "import os\n", + "import warnings\n", + "from itertools import combinations\n", + "\n", + "import numpy as np\n", + "import torch\n", + "import time\n", + "\n", + "# Suppress potential optimization warnings for cleaner notebook\n", + "warnings.filterwarnings(\"ignore\")\n", + "\n", + "SMOKE_TEST = os.environ.get(\"SMOKE_TEST\")" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-03-29 07:50:27.184951: I external/local_tsl/tsl/cuda/cudart_stub.cc:32] Could not find cuda drivers on your machine, GPU will not be used.\n", + "2024-03-29 07:50:27.223956: I tensorflow/core/platform/cpu_feature_guard.cc:210] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n", + "To enable the following instructions: AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n", + "2024-03-29 07:50:27.953754: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT\n", + "2024-03-29 07:50:28.392870: I external/local_xla/xla/stream_executor/cuda/cuda_executor.cc:998] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355\n", + "2024-03-29 07:50:28.393531: W tensorflow/core/common_runtime/gpu/gpu_device.cc:2251] Cannot dlopen some GPU libraries. Please make sure the missing libraries mentioned above are installed properly if you would like to use GPU. Follow the guide at https://www.tensorflow.org/install/gpu for how to download and setup the required libraries for your platform.\n", + "Skipping registering GPU devices...\n" + ] + } + ], + "source": [ + "import DTLZ2_model\n", + "import fischer_model\n", + "from botorch.test_functions.multi_objective import DTLZ2\n", + "from DTLZ2_model import neg_l1_dist\n", + "from DTLZ2_model import predict_DTLZ2_model\n", + "from fischer_model import predict_fischer_model\n", + "import tensorflow as tf\n", + "import random\n", + "\n", + "\n", + "from botorch.fit import fit_gpytorch_mll \n", + "from botorch.models.pairwise_gp import PairwiseGP, PairwiseLaplaceMarginalLogLikelihood \n", + "from botorch.models.transforms.input import Normalize\n", + "import pickle" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + " #Your chosen seed\n", + "your_seed = 42\n", + "\n", + "# Set seed for Python's RNG\n", + "random.seed(your_seed)\n", + "\n", + "# Set seed for NumPy RNG\n", + "np.random.seed(your_seed)\n", + "\n", + "# Set seed for PyTorch RNGs\n", + "torch.manual_seed(your_seed)\n", + "\n", + "# Ensure reproducibility for PyTorch operations (might reduce performance)\n", + "torch.backends.cudnn.deterministic = True\n", + "torch.backends.cudnn.benchmark = False\n", + "\n", + "# If using CUDA (PyTorch)\n", + "torch.cuda.manual_seed(your_seed)\n", + "torch.cuda.manual_seed_all(your_seed) # For multi-GPU setups\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 61ms/step\n" + ] + }, + { + "data": { + "text/plain": [ + "tensor([[0.6455, 0.0591, 0.1161, 0.5071]])" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "predict_fischer_model(torch.tensor([[0.5, 0.5, 0.5, 0.5]]))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "import cohere\n", + "co = cohere.Client('9ylnov4iFULBLovujZIJLq6x8pkq4NkyNCw0oePR')" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "id": "Mvj4PbSpNSjG" + }, + "outputs": [], + "source": [ + "# data generating helper functions\n", + "#function that defines the comparisons\n", + "def utility(X):\n", + " y=predict_fischer_model(X)\n", + " #weighted_y = y * torch.sqrt(torch.arange(y.size(-1), dtype=torch.float) + 1)\n", + " #y = torch.sum(weighted_y, dim=-1)\n", + " return y\n", + "\n", + "def utility1(X): #The four outputs are equally important, and we want to maximize all of them.\n", + " y=predict_fischer_model(X)\n", + " y = torch.sum(y, dim=-1)\n", + " return y\n", + "\n", + "def utility2(X): #We only want to maximize the CO conversion.\n", + " y=predict_fischer_model(X)\n", + " y = y[:,0]\n", + " return y\n", + "\n", + "def utility3(X): # The light olefins is considered as a negative output and we want to minimize it while maximizing the other three objectives.\n", + " y=predict_fischer_model(X)\n", + " y = y[:,0]+y[:,1]+y[:,2]-y[:,3]\n", + " return y\n", + " \n", + "def ini(n,dim):\n", + " X = torch.rand(n, dim, dtype=torch.float64)\n", + " return X\n", + "def generate_data(X, dim=4):\n", + " \"\"\"Generate data X and y\"\"\"\n", + " # X is randomly sampled from dim-dimentional unit cube\n", + " # we recommend using double as opposed to float tensor here for\n", + " # better numerical stability\n", + " #X=ini(n,dim)\n", + " x_2=tf.convert_to_tensor(X, dtype=tf.float32)\n", + " y = utility(x_2)\n", + " return y\n", + "\n", + "def generate_data_u1(X, dim=4):\n", + " \"\"\"Generate data X and y\"\"\"\n", + " # X is randomly sampled from dim-dimentional unit cube\n", + " # we recommend using double as opposed to float tensor here for\n", + " # better numerical stability\n", + " #X=ini(n,dim)\n", + " x_2=tf.convert_to_tensor(X, dtype=tf.float32)\n", + " y = utility1(x_2)\n", + " return y" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def generate_comparisons(y, n_comp, noise=0.1, replace=False):\n", + " \"\"\"Create pairwise comparisons with noise\"\"\"\n", + " # generate all possible pairs of elements in y\n", + " all_pairs = np.array(list(combinations(range(y.shape[0]), 2)))\n", + " # randomly select n_comp pairs from all_pairs\n", + " comp_pairs = all_pairs[\n", + " np.random.choice(range(len(all_pairs)), n_comp, replace=replace)\n", + " ]\n", + " # add gaussian noise to the latent y values\n", + " c0 = y[comp_pairs[:, 0]] + np.random.standard_normal(len(comp_pairs)) * noise\n", + " c1 = y[comp_pairs[:, 1]] + np.random.standard_normal(len(comp_pairs)) * noise\n", + " reverse_comp = (c0 < c1).numpy()\n", + " comp_pairs[reverse_comp, :] = np.flip(comp_pairs[reverse_comp, :], 1)\n", + " comp_pairs = torch.tensor(comp_pairs).long()\n", + "\n", + " return comp_pairs" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "#im not sure if this is is the correct function, i'm a bit eepy\n", + "#remember to reduce the number of comparisons n_comp,\n", + "def generate_comparisons_llm(y, n_comp, replace=False):\n", + " \"\"\"Create pairwise comparisons with noise\"\"\"\n", + " # generate all possible pairs of elements in y\n", + " all_pairs = np.array(list(combinations(range(y.shape[0]), 2)))\n", + " # randomly select n_comp pairs from all_pairs\n", + " comp_pairs = all_pairs[\n", + " np.random.choice(range(len(all_pairs)), n_comp, replace=replace)\n", + " ]\n", + " #parsing the tensor to get the strings for the LLM\n", + " new_pairs=[]\n", + " for opto in comp_pairs:\n", + " firstoption=opto[0]\n", + " secondoption=opto[1]\n", + " numfirst=(y[firstoption,:])\n", + " firstoutput1=f\"{numfirst[0].cpu().numpy():.1f}\"\n", + " firstoutput2=f\"{numfirst[1].cpu().numpy():.1f}\"\n", + " firstoutput3=f\"{numfirst[2].cpu().numpy():.1f}\"\n", + " firstoutput4=f\"{numfirst[3].cpu().numpy():.1f}\"\n", + " numsecond=(y[secondoption,:])\n", + " secondoutput1=f\"{numsecond[0].cpu().numpy():.1f}\"\n", + " secondoutput2=f\"{numsecond[1].cpu().numpy():.1f}\"\n", + " secondoutput3=f\"{numsecond[2].cpu().numpy():.1f}\"\n", + " secondoutput4=f\"{numsecond[3].cpu().numpy():.1f}\"\n", + " mess=\"Suppose you're managing a Fischer-Tropsch synthesis process. The four outputs are equally important, and we want to maximize all of them. Option A: regime of \"+firstoutput1+\" CO conversion, \"+firstoutput2+\" methane production, \"+firstoutput3+\" paraffins, \"+firstoutput4+\" light olefins. Option B: regime of \"+secondoutput1+\" CO conversion, \"+secondoutput2+\" methane production, \"+secondoutput3+\" paraffins, \"+secondoutput4+\" light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\"\n", + " print(mess)\n", + " response = co.chat(message=mess,\n", + " #perform web search before answering the question. You can also use your own custom connector.\n", + " #connectors=[{\"id\": \"web-search\"}]\n", + " )\n", + " print(response.text)\n", + " opllm=response.text\n", + " \n", + " if \"Option A\" in opllm:\n", + " new_pairs.append(opto.tolist())\n", + " else:\n", + " new_pairs.append(list(reversed(opto)))\n", + " #api restrictions 20 API calls/minutes\n", + " time.sleep(6)\n", + " \n", + " return torch.tensor(new_pairs)\n", + "\n", + "#\"Suppose you're managing a Fischer-Tropsch synthesis process. The four outputs are equally important, and we want to maximize all of them. Option A: regime of \"+firstoutput1+\" CO conversion, \"+firstoutput2+\" methane production, \"+firstoutput3+\" paraffins, \"+firstoutput4+\" light olefins. Option B: regime of \"+secondoutput1+\" CO conversion, \"+secondoutput2+\" methane production, \"+secondoutput3+\" paraffins, \"+secondoutput4+\" light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\"\n", + "#\"Suppose you're managing a Fischer-Tropsch synthesis process. The light olefins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of \"+firstoutput1+\" CO conversion, \"+firstoutput2+\" methane, \"+firstoutput3+\" paraffin, \"+firstoutput4+\" light olefins. Option B: regime of \"+secondoutput1+\" CO conversion, \"+secondoutput2+\" methane, \"+secondoutput3+\" paraffins, \"+secondoutput4+\" light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\"\n", + "#\"Suppose you're managing a Fischer-Tropsch synthesis process. We only want to maximize the CO conversion. Option A: regime of \"+firstoutput1+\" CO conversion, \"+firstoutput2+\" methane, \"+firstoutput3+\" paraffin, \"+firstoutput4+\" light olefins. Option B: regime of \"+secondoutput1+\" CO conversion, \"+secondoutput2+\" methane, \"+secondoutput3+\" paraffins, \"+secondoutput4+\" light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "m5F2xn-8N-g9" + }, + "source": [ + "#parameters\n", + "torch.manual_seed(123)\n", + "#number for initial data\n", + "n = 5 if not SMOKE_TEST else 5\n", + "#number for initial comparisons\n", + "m = 10 if not SMOKE_TEST else 10\n", + "dim = 4\n", + "noise = 0.1\n", + "\n", + "#generate data, initial data\n", + "train_X, train_y = generate_data(n, dim=dim)\n", + "#generating comparison based on the utility function" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "train_comp_llm = generate_comparisons_llm(train_y, m)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "train_comp_llm" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "fMuLBRO-NVj3" + }, + "source": [ + "from botorch.fit import fit_gpytorch_mll\n", + "from botorch.models.pairwise_gp import PairwiseGP, PairwiseLaplaceMarginalLogLikelihood\n", + "from botorch.models.transforms.input import Normalize\n", + "\n", + "#fitting the first pairwise GP\n", + "model = PairwiseGP(\n", + " train_X,\n", + " train_comp_llm,\n", + " input_transform=Normalize(d=train_X.shape[-1]),\n", + ")\n", + "mll = PairwiseLaplaceMarginalLogLikelihood(model.likelihood, model)\n", + "mll = fit_gpytorch_mll(mll)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "OdxhkF6yNZKp", + "outputId": "0e3b833e-7a46-4413-f148-7e3fab6d8433" + }, + "source": [ + "from scipy.stats import kendalltau\n", + "\n", + "\n", + "# Kendall-Tau rank correlation\n", + "def eval_kt_cor(model, test_X, test_y):\n", + " pred_y = model.posterior(test_X).mean.squeeze().detach().numpy()\n", + " return kendalltau(pred_y, test_y).correlation\n", + "\n", + "\n", + "n_kendall = 10 if not SMOKE_TEST else 10\n", + "\n", + "test_X, test_y = generate_data(n_kendall, dim=dim)\n", + "kt_correlation = eval_kt_cor(model, test_X, test_y[:,3])\n", + "\n", + "print(f\"Test Kendall-Tau rank correlation: {kt_correlation:.4f}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "id": "qEoN28RSNk2N" + }, + "outputs": [], + "source": [ + "from botorch.acquisition.preference import AnalyticExpectedUtilityOfBestOption\n", + "from botorch.optim import optimize_acqf\n", + "\n", + "#wrapper for the model\n", + "def init_and_fit_model(X, comp):\n", + " \"\"\"Model fitting helper function\"\"\"\n", + " model = PairwiseGP(\n", + " X,\n", + " comp,\n", + " input_transform=Normalize(d=X.shape[-1]),\n", + " )\n", + " mll = PairwiseLaplaceMarginalLogLikelihood(model.likelihood, model)\n", + " fit_gpytorch_mll(mll)\n", + " return mll, model\n", + "\n", + "#wrapper for making new data, what does it mean? return comps\n", + "\n", + "def make_new_data(X, next_X, comps, q_comp):\n", + " \"\"\"Given X and next_X,\n", + " generate q_comp new comparisons between next_X\n", + " and return the concatenated X and comparisons\n", + " \"\"\"\n", + " # next_X is float by default; cast it to the dtype of X (i.e., double)\n", + " next_X = next_X.to(X)\n", + " x_2=tf.convert_to_tensor(next_X, dtype=tf.float32)\n", + " next_y = utility(x_2)\n", + " next_comps = generate_comparisons_llm(next_y, n_comp=q_comp)\n", + " comps = torch.cat([comps, next_comps + X.shape[-2]])\n", + " X = torch.cat([X, next_X])\n", + " return X, comps\n", + "\n", + "def make_new_data_u1(X, next_X, comps, q_comp):\n", + " \"\"\"Given X and next_X,\n", + " generate q_comp new comparisons between next_X\n", + " and return the concatenated X and comparisons\n", + " \"\"\"\n", + " # next_X is float by default; cast it to the dtype of X (i.e., double)\n", + " next_X = next_X.to(X)\n", + " x_2=tf.convert_to_tensor(next_X, dtype=tf.float32)\n", + " next_y = utility1(x_2)\n", + " next_comps = generate_comparisons(next_y, n_comp=q_comp)\n", + " comps = torch.cat([comps, next_comps + X.shape[-2]])\n", + " X = torch.cat([X, next_X])\n", + " return X, comps" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "id": "1pTEh0DMNv1w" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 18ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The four outputs are equally important, and we want to maximize all of them. Option A: regime of 0.2 CO conversion, 0.0 methane production, 0.0 paraffins, 0.2 light olefins. Option B: regime of 0.6 CO conversion, 0.0 methane production, 0.1 paraffins, 0.5 light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The four outputs are equally important, and we want to maximize all of them. Option A: regime of 0.7 CO conversion, 0.1 methane production, 0.2 paraffins, 0.4 light olefins. Option B: regime of 0.2 CO conversion, 0.0 methane production, 0.0 paraffins, 0.2 light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The four outputs are equally important, and we want to maximize all of them. Option A: regime of 0.2 CO conversion, 0.0 methane production, 0.0 paraffins, 0.2 light olefins. Option B: regime of 0.5 CO conversion, 0.0 methane production, 0.1 paraffins, 0.6 light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The four outputs are equally important, and we want to maximize all of them. Option A: regime of 0.7 CO conversion, 0.1 methane production, 0.2 paraffins, 0.4 light olefins. Option B: regime of 0.6 CO conversion, 0.0 methane production, 0.1 paraffins, 0.5 light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The four outputs are equally important, and we want to maximize all of them. Option A: regime of 0.7 CO conversion, 0.1 methane production, 0.2 paraffins, 0.4 light olefins. Option B: regime of 0.8 CO conversion, 0.1 methane production, 0.2 paraffins, 0.6 light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The four outputs are equally important, and we want to maximize all of them. Option A: regime of 0.2 CO conversion, 0.0 methane production, 0.0 paraffins, 0.2 light olefins. Option B: regime of 0.8 CO conversion, 0.1 methane production, 0.2 paraffins, 0.6 light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The four outputs are equally important, and we want to maximize all of them. Option A: regime of 0.5 CO conversion, 0.0 methane production, 0.1 paraffins, 0.6 light olefins. Option B: regime of 0.6 CO conversion, 0.0 methane production, 0.1 paraffins, 0.5 light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\n" + ] + }, + { + "ename": "ReadTimeout", + "evalue": "The read operation timed out", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mReadTimeout\u001b[0m Traceback (most recent call last)", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/site-packages/httpx/_transports/default.py:69\u001b[0m, in \u001b[0;36mmap_httpcore_exceptions\u001b[0;34m()\u001b[0m\n\u001b[1;32m 68\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m---> 69\u001b[0m \u001b[38;5;28;01myield\u001b[39;00m\n\u001b[1;32m 70\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m exc:\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/site-packages/httpx/_transports/default.py:233\u001b[0m, in \u001b[0;36mHTTPTransport.handle_request\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 232\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m map_httpcore_exceptions():\n\u001b[0;32m--> 233\u001b[0m resp \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_pool\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mhandle_request\u001b[49m\u001b[43m(\u001b[49m\u001b[43mreq\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 235\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(resp\u001b[38;5;241m.\u001b[39mstream, typing\u001b[38;5;241m.\u001b[39mIterable)\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/site-packages/httpcore/_sync/connection_pool.py:216\u001b[0m, in \u001b[0;36mConnectionPool.handle_request\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 215\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_close_connections(closing)\n\u001b[0;32m--> 216\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m exc \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 218\u001b[0m \u001b[38;5;66;03m# Return the response. Note that in this case we still have to manage\u001b[39;00m\n\u001b[1;32m 219\u001b[0m \u001b[38;5;66;03m# the point at which the response is closed.\u001b[39;00m\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/site-packages/httpcore/_sync/connection_pool.py:196\u001b[0m, in \u001b[0;36mConnectionPool.handle_request\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 194\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 195\u001b[0m \u001b[38;5;66;03m# Send the request on the assigned connection.\u001b[39;00m\n\u001b[0;32m--> 196\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[43mconnection\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mhandle_request\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 197\u001b[0m \u001b[43m \u001b[49m\u001b[43mpool_request\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrequest\u001b[49m\n\u001b[1;32m 198\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 199\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m ConnectionNotAvailable:\n\u001b[1;32m 200\u001b[0m \u001b[38;5;66;03m# In some cases a connection may initially be available to\u001b[39;00m\n\u001b[1;32m 201\u001b[0m \u001b[38;5;66;03m# handle a request, but then become unavailable.\u001b[39;00m\n\u001b[1;32m 202\u001b[0m \u001b[38;5;66;03m#\u001b[39;00m\n\u001b[1;32m 203\u001b[0m \u001b[38;5;66;03m# In this case we clear the connection and try again.\u001b[39;00m\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/site-packages/httpcore/_sync/connection.py:101\u001b[0m, in \u001b[0;36mHTTPConnection.handle_request\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 99\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m exc\n\u001b[0;32m--> 101\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_connection\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mhandle_request\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/site-packages/httpcore/_sync/http11.py:143\u001b[0m, in \u001b[0;36mHTTP11Connection.handle_request\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 142\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_response_closed()\n\u001b[0;32m--> 143\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m exc\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/site-packages/httpcore/_sync/http11.py:113\u001b[0m, in \u001b[0;36mHTTP11Connection.handle_request\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 104\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m Trace(\n\u001b[1;32m 105\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mreceive_response_headers\u001b[39m\u001b[38;5;124m\"\u001b[39m, logger, request, kwargs\n\u001b[1;32m 106\u001b[0m ) \u001b[38;5;28;01mas\u001b[39;00m trace:\n\u001b[1;32m 107\u001b[0m (\n\u001b[1;32m 108\u001b[0m http_version,\n\u001b[1;32m 109\u001b[0m status,\n\u001b[1;32m 110\u001b[0m reason_phrase,\n\u001b[1;32m 111\u001b[0m headers,\n\u001b[1;32m 112\u001b[0m trailing_data,\n\u001b[0;32m--> 113\u001b[0m ) \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_receive_response_headers\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 114\u001b[0m trace\u001b[38;5;241m.\u001b[39mreturn_value \u001b[38;5;241m=\u001b[39m (\n\u001b[1;32m 115\u001b[0m http_version,\n\u001b[1;32m 116\u001b[0m status,\n\u001b[1;32m 117\u001b[0m reason_phrase,\n\u001b[1;32m 118\u001b[0m headers,\n\u001b[1;32m 119\u001b[0m )\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/site-packages/httpcore/_sync/http11.py:186\u001b[0m, in \u001b[0;36mHTTP11Connection._receive_response_headers\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 185\u001b[0m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[0;32m--> 186\u001b[0m event \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_receive_event\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtimeout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtimeout\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 187\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(event, h11\u001b[38;5;241m.\u001b[39mResponse):\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/site-packages/httpcore/_sync/http11.py:224\u001b[0m, in \u001b[0;36mHTTP11Connection._receive_event\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 223\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m event \u001b[38;5;129;01mis\u001b[39;00m h11\u001b[38;5;241m.\u001b[39mNEED_DATA:\n\u001b[0;32m--> 224\u001b[0m data \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_network_stream\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mread\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 225\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mREAD_NUM_BYTES\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtimeout\u001b[49m\n\u001b[1;32m 226\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 228\u001b[0m \u001b[38;5;66;03m# If we feed this case through h11 we'll raise an exception like:\u001b[39;00m\n\u001b[1;32m 229\u001b[0m \u001b[38;5;66;03m#\u001b[39;00m\n\u001b[1;32m 230\u001b[0m \u001b[38;5;66;03m# httpcore.RemoteProtocolError: can't handle event type\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 234\u001b[0m \u001b[38;5;66;03m# perspective. Instead we handle this case distinctly and treat\u001b[39;00m\n\u001b[1;32m 235\u001b[0m \u001b[38;5;66;03m# it as a ConnectError.\u001b[39;00m\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/site-packages/httpcore/_backends/sync.py:124\u001b[0m, in \u001b[0;36mSyncStream.read\u001b[0;34m(self, max_bytes, timeout)\u001b[0m\n\u001b[1;32m 123\u001b[0m exc_map: ExceptionMapping \u001b[38;5;241m=\u001b[39m {socket\u001b[38;5;241m.\u001b[39mtimeout: ReadTimeout, \u001b[38;5;167;01mOSError\u001b[39;00m: ReadError}\n\u001b[0;32m--> 124\u001b[0m \u001b[43m\u001b[49m\u001b[38;5;28;43;01mwith\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mmap_exceptions\u001b[49m\u001b[43m(\u001b[49m\u001b[43mexc_map\u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m 125\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_sock\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msettimeout\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtimeout\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/contextlib.py:155\u001b[0m, in \u001b[0;36m_GeneratorContextManager.__exit__\u001b[0;34m(self, typ, value, traceback)\u001b[0m\n\u001b[1;32m 154\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 155\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mgen\u001b[38;5;241m.\u001b[39mthrow(typ, value, traceback)\n\u001b[1;32m 156\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mStopIteration\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m exc:\n\u001b[1;32m 157\u001b[0m \u001b[38;5;66;03m# Suppress StopIteration *unless* it's the same exception that\u001b[39;00m\n\u001b[1;32m 158\u001b[0m \u001b[38;5;66;03m# was passed to throw(). This prevents a StopIteration\u001b[39;00m\n\u001b[1;32m 159\u001b[0m \u001b[38;5;66;03m# raised inside the \"with\" statement from being suppressed.\u001b[39;00m\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/site-packages/httpcore/_exceptions.py:14\u001b[0m, in \u001b[0;36mmap_exceptions\u001b[0;34m(map)\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(exc, from_exc):\n\u001b[0;32m---> 14\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m to_exc(exc) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mexc\u001b[39;00m\n\u001b[1;32m 15\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m\n", + "\u001b[0;31mReadTimeout\u001b[0m: The read operation timed out", + "\nThe above exception was the direct cause of the following exception:\n", + "\u001b[0;31mReadTimeout\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[12], line 39\u001b[0m\n\u001b[1;32m 37\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m algo \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mEUBO-LLM\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[1;32m 38\u001b[0m init_y \u001b[38;5;241m=\u001b[39m generate_data(init_X, dim\u001b[38;5;241m=\u001b[39mdim)\n\u001b[0;32m---> 39\u001b[0m comparisons \u001b[38;5;241m=\u001b[39m \u001b[43mgenerate_comparisons_llm\u001b[49m\u001b[43m(\u001b[49m\u001b[43minit_y\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mq_comp\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 40\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m algo \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mEUBO\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[1;32m 41\u001b[0m init_y \u001b[38;5;241m=\u001b[39m generate_data_u1(init_X, dim\u001b[38;5;241m=\u001b[39mdim)\n", + "Cell \u001b[0;32mIn[9], line 28\u001b[0m, in \u001b[0;36mgenerate_comparisons_llm\u001b[0;34m(y, n_comp, replace)\u001b[0m\n\u001b[1;32m 26\u001b[0m mess\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mSuppose you\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mre managing a Fischer-Tropsch synthesis process. The four outputs are equally important, and we want to maximize all of them. Option A: regime of \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m+\u001b[39mfirstoutput1\u001b[38;5;241m+\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m CO conversion, \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m+\u001b[39mfirstoutput2\u001b[38;5;241m+\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m methane production, \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m+\u001b[39mfirstoutput3\u001b[38;5;241m+\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m paraffins, \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m+\u001b[39mfirstoutput4\u001b[38;5;241m+\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m light olefins. Option B: regime of \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m+\u001b[39msecondoutput1\u001b[38;5;241m+\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m CO conversion, \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m+\u001b[39msecondoutput2\u001b[38;5;241m+\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m methane production, \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m+\u001b[39msecondoutput3\u001b[38;5;241m+\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m paraffins, \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m+\u001b[39msecondoutput4\u001b[38;5;241m+\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m light olefins. Choose only one option, only answer with \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mOption A\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m or \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mOption B\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 27\u001b[0m \u001b[38;5;28mprint\u001b[39m(mess)\n\u001b[0;32m---> 28\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[43mco\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mchat\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmessage\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmess\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 29\u001b[0m \u001b[43m\u001b[49m\u001b[38;5;66;43;03m#perform web search before answering the question. You can also use your own custom connector.\u001b[39;49;00m\n\u001b[1;32m 30\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;66;43;03m#connectors=[{\"id\": \"web-search\"}]\u001b[39;49;00m\n\u001b[1;32m 31\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 32\u001b[0m \u001b[38;5;28mprint\u001b[39m(response\u001b[38;5;241m.\u001b[39mtext)\n\u001b[1;32m 33\u001b[0m opllm\u001b[38;5;241m=\u001b[39mresponse\u001b[38;5;241m.\u001b[39mtext\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/site-packages/cohere/client.py:27\u001b[0m, in \u001b[0;36mvalidate_args..wrapped\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 25\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mwrapped\u001b[39m(\u001b[38;5;241m*\u001b[39margs: typing\u001b[38;5;241m.\u001b[39mAny, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: typing\u001b[38;5;241m.\u001b[39mAny) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m typing\u001b[38;5;241m.\u001b[39mAny:\n\u001b[1;32m 26\u001b[0m check_fn(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m---> 27\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mmethod\u001b[49m\u001b[43m(\u001b[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[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/site-packages/cohere/base_client.py:626\u001b[0m, in \u001b[0;36mBaseCohere.chat\u001b[0;34m(self, message, model, preamble, chat_history, conversation_id, prompt_truncation, connectors, search_queries_only, documents, temperature, max_tokens, k, p, seed, stop_sequences, frequency_penalty, presence_penalty, raw_prompting, tools, tool_results, request_options)\u001b[0m\n\u001b[1;32m 624\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m tool_results \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m OMIT:\n\u001b[1;32m 625\u001b[0m _request[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtool_results\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m tool_results\n\u001b[0;32m--> 626\u001b[0m _response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_client_wrapper\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mhttpx_client\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrequest\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 627\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mPOST\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 628\u001b[0m \u001b[43m \u001b[49m\u001b[43murllib\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mparse\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43murljoin\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43mf\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_client_wrapper\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_base_url\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;124;43m/\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mchat\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 629\u001b[0m \u001b[43m \u001b[49m\u001b[43mparams\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mjsonable_encoder\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 630\u001b[0m \u001b[43m \u001b[49m\u001b[43mrequest_options\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43madditional_query_parameters\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mrequest_options\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mis\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mnot\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\n\u001b[1;32m 631\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 632\u001b[0m \u001b[43m \u001b[49m\u001b[43mjson\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mjsonable_encoder\u001b[49m\u001b[43m(\u001b[49m\u001b[43m_request\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 633\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mrequest_options\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mis\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mrequest_options\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43madditional_body_parameters\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mis\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\n\u001b[1;32m 634\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43m{\u001b[49m\n\u001b[1;32m 635\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mjsonable_encoder\u001b[49m\u001b[43m(\u001b[49m\u001b[43m_request\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 636\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mjsonable_encoder\u001b[49m\u001b[43m(\u001b[49m\u001b[43mremove_none_from_dict\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrequest_options\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43madditional_body_parameters\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m{\u001b[49m\u001b[43m}\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 637\u001b[0m \u001b[43m \u001b[49m\u001b[43m}\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 638\u001b[0m \u001b[43m \u001b[49m\u001b[43mheaders\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mjsonable_encoder\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 639\u001b[0m \u001b[43m \u001b[49m\u001b[43mremove_none_from_dict\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 640\u001b[0m \u001b[43m \u001b[49m\u001b[43m{\u001b[49m\n\u001b[1;32m 641\u001b[0m \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[43m_client_wrapper\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_headers\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 642\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mrequest_options\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43madditional_headers\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m{\u001b[49m\u001b[43m}\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mrequest_options\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mis\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mnot\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43m{\u001b[49m\u001b[43m}\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 643\u001b[0m \u001b[43m \u001b[49m\u001b[43m}\u001b[49m\n\u001b[1;32m 644\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 645\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 646\u001b[0m \u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrequest_options\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mtimeout_in_seconds\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 647\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mrequest_options\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mis\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mnot\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mand\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mrequest_options\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mtimeout_in_seconds\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mis\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mnot\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\n\u001b[1;32m 648\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_client_wrapper\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_timeout\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 649\u001b[0m \u001b[43m \u001b[49m\u001b[43mretries\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 650\u001b[0m \u001b[43m \u001b[49m\u001b[43mmax_retries\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrequest_options\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mmax_retries\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mrequest_options\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mis\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mnot\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# type: ignore\u001b[39;49;00m\n\u001b[1;32m 651\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 652\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;241m200\u001b[39m \u001b[38;5;241m<\u001b[39m\u001b[38;5;241m=\u001b[39m _response\u001b[38;5;241m.\u001b[39mstatus_code \u001b[38;5;241m<\u001b[39m \u001b[38;5;241m300\u001b[39m:\n\u001b[1;32m 653\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m pydantic\u001b[38;5;241m.\u001b[39mparse_obj_as(NonStreamedChatResponse, _response\u001b[38;5;241m.\u001b[39mjson()) \u001b[38;5;66;03m# type: ignore\u001b[39;00m\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/site-packages/cohere/core/http_client.py:94\u001b[0m, in \u001b[0;36mHttpClient.request\u001b[0;34m(self, max_retries, retries, *args, **kwargs)\u001b[0m\n\u001b[1;32m 90\u001b[0m \u001b[38;5;129m@wraps\u001b[39m(httpx\u001b[38;5;241m.\u001b[39mClient\u001b[38;5;241m.\u001b[39mrequest)\n\u001b[1;32m 91\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mrequest\u001b[39m(\n\u001b[1;32m 92\u001b[0m \u001b[38;5;28mself\u001b[39m, \u001b[38;5;241m*\u001b[39margs: typing\u001b[38;5;241m.\u001b[39mAny, max_retries: \u001b[38;5;28mint\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0\u001b[39m, retries: \u001b[38;5;28mint\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0\u001b[39m, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: typing\u001b[38;5;241m.\u001b[39mAny\n\u001b[1;32m 93\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m httpx\u001b[38;5;241m.\u001b[39mResponse:\n\u001b[0;32m---> 94\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mhttpx_client\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrequest\u001b[49m\u001b[43m(\u001b[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[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 95\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m _should_retry(response\u001b[38;5;241m=\u001b[39mresponse):\n\u001b[1;32m 96\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m max_retries \u001b[38;5;241m>\u001b[39m retries:\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/site-packages/httpx/_client.py:827\u001b[0m, in \u001b[0;36mClient.request\u001b[0;34m(self, method, url, content, data, files, json, params, headers, cookies, auth, follow_redirects, timeout, extensions)\u001b[0m\n\u001b[1;32m 812\u001b[0m warnings\u001b[38;5;241m.\u001b[39mwarn(message, \u001b[38;5;167;01mDeprecationWarning\u001b[39;00m)\n\u001b[1;32m 814\u001b[0m request \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mbuild_request(\n\u001b[1;32m 815\u001b[0m method\u001b[38;5;241m=\u001b[39mmethod,\n\u001b[1;32m 816\u001b[0m url\u001b[38;5;241m=\u001b[39murl,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 825\u001b[0m extensions\u001b[38;5;241m=\u001b[39mextensions,\n\u001b[1;32m 826\u001b[0m )\n\u001b[0;32m--> 827\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[43msend\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mauth\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mauth\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfollow_redirects\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfollow_redirects\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/site-packages/httpx/_client.py:914\u001b[0m, in \u001b[0;36mClient.send\u001b[0;34m(self, request, stream, auth, follow_redirects)\u001b[0m\n\u001b[1;32m 906\u001b[0m follow_redirects \u001b[38;5;241m=\u001b[39m (\n\u001b[1;32m 907\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfollow_redirects\n\u001b[1;32m 908\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(follow_redirects, UseClientDefault)\n\u001b[1;32m 909\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m follow_redirects\n\u001b[1;32m 910\u001b[0m )\n\u001b[1;32m 912\u001b[0m auth \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_build_request_auth(request, auth)\n\u001b[0;32m--> 914\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_send_handling_auth\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 915\u001b[0m \u001b[43m \u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 916\u001b[0m \u001b[43m \u001b[49m\u001b[43mauth\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mauth\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 917\u001b[0m \u001b[43m \u001b[49m\u001b[43mfollow_redirects\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfollow_redirects\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 918\u001b[0m \u001b[43m \u001b[49m\u001b[43mhistory\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m[\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 919\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 920\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 921\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m stream:\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/site-packages/httpx/_client.py:942\u001b[0m, in \u001b[0;36mClient._send_handling_auth\u001b[0;34m(self, request, auth, follow_redirects, history)\u001b[0m\n\u001b[1;32m 939\u001b[0m request \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mnext\u001b[39m(auth_flow)\n\u001b[1;32m 941\u001b[0m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[0;32m--> 942\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_send_handling_redirects\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 943\u001b[0m \u001b[43m \u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 944\u001b[0m \u001b[43m \u001b[49m\u001b[43mfollow_redirects\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfollow_redirects\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 945\u001b[0m \u001b[43m \u001b[49m\u001b[43mhistory\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mhistory\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 946\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 947\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 948\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/site-packages/httpx/_client.py:979\u001b[0m, in \u001b[0;36mClient._send_handling_redirects\u001b[0;34m(self, request, follow_redirects, history)\u001b[0m\n\u001b[1;32m 976\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m hook \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_event_hooks[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mrequest\u001b[39m\u001b[38;5;124m\"\u001b[39m]:\n\u001b[1;32m 977\u001b[0m hook(request)\n\u001b[0;32m--> 979\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_send_single_request\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 980\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 981\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m hook \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_event_hooks[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mresponse\u001b[39m\u001b[38;5;124m\"\u001b[39m]:\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/site-packages/httpx/_client.py:1015\u001b[0m, in \u001b[0;36mClient._send_single_request\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 1010\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mRuntimeError\u001b[39;00m(\n\u001b[1;32m 1011\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mAttempted to send an async request with a sync Client instance.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 1012\u001b[0m )\n\u001b[1;32m 1014\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m request_context(request\u001b[38;5;241m=\u001b[39mrequest):\n\u001b[0;32m-> 1015\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[43mtransport\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mhandle_request\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1017\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(response\u001b[38;5;241m.\u001b[39mstream, SyncByteStream)\n\u001b[1;32m 1019\u001b[0m response\u001b[38;5;241m.\u001b[39mrequest \u001b[38;5;241m=\u001b[39m request\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/site-packages/httpx/_transports/default.py:232\u001b[0m, in \u001b[0;36mHTTPTransport.handle_request\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 218\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(request\u001b[38;5;241m.\u001b[39mstream, SyncByteStream)\n\u001b[1;32m 220\u001b[0m req \u001b[38;5;241m=\u001b[39m httpcore\u001b[38;5;241m.\u001b[39mRequest(\n\u001b[1;32m 221\u001b[0m method\u001b[38;5;241m=\u001b[39mrequest\u001b[38;5;241m.\u001b[39mmethod,\n\u001b[1;32m 222\u001b[0m url\u001b[38;5;241m=\u001b[39mhttpcore\u001b[38;5;241m.\u001b[39mURL(\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 230\u001b[0m extensions\u001b[38;5;241m=\u001b[39mrequest\u001b[38;5;241m.\u001b[39mextensions,\n\u001b[1;32m 231\u001b[0m )\n\u001b[0;32m--> 232\u001b[0m \u001b[43m\u001b[49m\u001b[38;5;28;43;01mwith\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mmap_httpcore_exceptions\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m 233\u001b[0m \u001b[43m \u001b[49m\u001b[43mresp\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_pool\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mhandle_request\u001b[49m\u001b[43m(\u001b[49m\u001b[43mreq\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 235\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(resp\u001b[38;5;241m.\u001b[39mstream, typing\u001b[38;5;241m.\u001b[39mIterable)\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/contextlib.py:155\u001b[0m, in \u001b[0;36m_GeneratorContextManager.__exit__\u001b[0;34m(self, typ, value, traceback)\u001b[0m\n\u001b[1;32m 153\u001b[0m value \u001b[38;5;241m=\u001b[39m typ()\n\u001b[1;32m 154\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 155\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mgen\u001b[38;5;241m.\u001b[39mthrow(typ, value, traceback)\n\u001b[1;32m 156\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mStopIteration\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m exc:\n\u001b[1;32m 157\u001b[0m \u001b[38;5;66;03m# Suppress StopIteration *unless* it's the same exception that\u001b[39;00m\n\u001b[1;32m 158\u001b[0m \u001b[38;5;66;03m# was passed to throw(). This prevents a StopIteration\u001b[39;00m\n\u001b[1;32m 159\u001b[0m \u001b[38;5;66;03m# raised inside the \"with\" statement from being suppressed.\u001b[39;00m\n\u001b[1;32m 160\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m exc \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m value\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/site-packages/httpx/_transports/default.py:86\u001b[0m, in \u001b[0;36mmap_httpcore_exceptions\u001b[0;34m()\u001b[0m\n\u001b[1;32m 83\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m\n\u001b[1;32m 85\u001b[0m message \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mstr\u001b[39m(exc)\n\u001b[0;32m---> 86\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m mapped_exc(message) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mexc\u001b[39;00m\n", + "\u001b[0;31mReadTimeout\u001b[0m: The read operation timed out" + ] + } + ], + "source": [ + "#two algorithms to compare\n", + "algos = [\"EUBO\",\"EUBO-LLM\", \"rand\"]\n", + "#number of repetitions of the BO cycle\n", + "NUM_TRIALS = 3 if not SMOKE_TEST else 2\n", + "#number of cycles\n", + "NUM_BATCHES = 20 if not SMOKE_TEST else 2\n", + "\n", + "#dimension number= 4 inputs\n", + "dim = 4\n", + "#sampler options\n", + "NUM_RESTARTS = 3\n", + "RAW_SAMPLES = 512 if not SMOKE_TEST else 8\n", + "#\n", + "q_eubo = 2 # number of points per query\n", + "q_data=5\n", + "q_comp = 10 # number of comparisons per query\n", + "q_comp_2=1\n", + "\n", + "# initial evals\n", + "best_vals = {} # best observed values\n", + "for algo in algos:\n", + " best_vals[algo] = []\n", + "\n", + "# average over multiple trials\n", + "for i in range(NUM_TRIALS):\n", + " torch.manual_seed(i)\n", + " np.random.seed(i)\n", + " data = {}\n", + " models = {}\n", + "\n", + " # X are within the unit cube\n", + " bounds = torch.stack([torch.zeros(dim), torch.ones(dim)])\n", + "\n", + " # Create initial data\n", + " init_X=ini(q_data,dim)\n", + " for algo in algos:\n", + " if algo == \"EUBO-LLM\":\n", + " init_y = generate_data(init_X, dim=dim)\n", + " comparisons = generate_comparisons_llm(init_y, q_comp)\n", + " if algo == \"EUBO\":\n", + " init_y = generate_data_u1(init_X, dim=dim)\n", + " comparisons = generate_comparisons(init_y, q_comp)\n", + " if algo == \"rand\":\n", + " init_y = generate_data_u1(init_X, dim=dim)\n", + " comparisons = generate_comparisons(init_y, q_comp)\n", + " \n", + " best_vals[algo].append([])\n", + " data[algo] = (init_X, comparisons)\n", + " _, models[algo] = init_and_fit_model(init_X, comparisons)\n", + "\n", + " best_next_y = utility1(init_X).max().item()\n", + " best_vals[algo][-1].append(best_next_y)\n", + "\n", + " # we make additional NUM_BATCHES comparison queries after the initial observation\n", + " for j in range(1, NUM_BATCHES + 1):\n", + " print(j)\n", + " for algo in algos:\n", + " model = models[algo]\n", + " if algo == \"EUBO-LLM\":\n", + " # create the acquisition function object\n", + " acq_func = AnalyticExpectedUtilityOfBestOption(pref_model=model)\n", + " # optimize and get new observation\n", + " next_X, acq_val = optimize_acqf(\n", + " acq_function=acq_func,\n", + " bounds=bounds,\n", + " q=q_eubo,\n", + " num_restarts=NUM_RESTARTS,\n", + " raw_samples=RAW_SAMPLES,\n", + " )\n", + " print(next_X)\n", + " # update data\n", + " X, comps = data[algo]\n", + " X, comps = make_new_data(X, next_X, comps, q_comp_2)\n", + " data[algo] = (X, comps)\n", + " \n", + " # refit models\n", + " _, models[algo] = init_and_fit_model(X, comps)\n", + " \n", + " # record the best observed values so far\n", + " max_val = utility1(X).max().item()\n", + " best_vals[algo][-1].append(max_val)\n", + " elif algo == \"EUBO\":\n", + " #create the acquisition function object\n", + " acq_func = AnalyticExpectedUtilityOfBestOption(pref_model=model)\n", + " # optimize and get new observation\n", + " next_X, acq_val = optimize_acqf(\n", + " acq_function=acq_func,\n", + " bounds=bounds,\n", + " q=q_eubo,\n", + " num_restarts=NUM_RESTARTS,\n", + " raw_samples=RAW_SAMPLES,\n", + " )\n", + " print(next_X)\n", + " # update data\n", + " X, comps = data[algo]\n", + " X, comps = make_new_data_u1(X, next_X, comps, q_comp_2)\n", + " data[algo] = (X, comps)\n", + " \n", + " # refit models\n", + " _, models[algo] = init_and_fit_model(X, comps)\n", + " \n", + " # record the best observed values so far\n", + " max_val = utility1(X).max().item()\n", + " best_vals[algo][-1].append(max_val)\n", + " else:\n", + " # randomly sample data\n", + " next_X= ini(q_eubo, dim=dim)\n", + " print(next_X)\n", + " # update data\n", + " X, comps = data[algo]\n", + " X, comps = make_new_data_u1(X, next_X, comps, q_comp_2)\n", + " data[algo] = (X, comps)\n", + " \n", + " # refit models\n", + " _, models[algo] = init_and_fit_model(X, comps)\n", + " \n", + " # record the best observed values so far\n", + " max_val = utility1(X).max().item()\n", + " best_vals[algo][-1].append(max_val)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "with open('best_vals_case_1.pkl', 'wb') as handle:\n", + " pickle.dump(best_vals, handle, protocol=pickle.HIGHEST_PROTOCOL)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "with open('best_vals_case_1.pkl', 'rb') as handle:\n", + " loaded_data = pickle.load(handle)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "loaded_data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 596 + }, + "id": "eRLF3-dFNzyW", + "outputId": "9c83df50-e355-42b9-860e-b4b51d63f2c5" + }, + "outputs": [], + "source": [ + "from matplotlib import pyplot as plt\n", + "\n", + "\n", + "%matplotlib inline\n", + "\n", + "plt.rcParams.update({\"font.size\": 14})\n", + "\n", + "algo_labels = {\n", + " \"rand\": \"Random Exploration\",\n", + " \"EUBO-LLM\": \"EUBO-LLM\",\n", + " \"EUBO\": \"EUBO\", \n", + "}\n", + "\n", + "\n", + "def ci(y):\n", + " return 1.96 * y.std(axis=0) / np.sqrt(y.shape[0])\n", + "\n", + "\n", + "# the utility function is maximized at the full vector of 1\n", + "#optimal_val = utility(torch.tensor([[1] * dim])).item()\n", + "iters = list(range(NUM_BATCHES + 1))\n", + "\n", + "fig, ax = plt.subplots(1, 1, figsize=(8, 6))\n", + "# plot the optimal value\n", + "#ax.plot(\n", + "# iters,\n", + "# [optimal_val] * len(iters),\n", + "# label=\"Optimal Function Value\",\n", + "# color=\"black\",\n", + "## linewidth=1.5,\n", + "#)\n", + "\n", + "# plot the the best observed value from each algorithm\n", + "for algo in algos:\n", + " ys = np.vstack(best_vals[algo])\n", + " ax.errorbar(\n", + " iters, ys.mean(axis=0), yerr=ci(ys), label=algo_labels[algo], linewidth=1.5\n", + " )\n", + "\n", + "ax.set(\n", + " #xlabel=f\"Number of queries q = {q_eubo}, num_initial_comp = {q_comp}, num_initial_samp = {q_data})\",\n", + " ylabel=\"Best observed value\\nas evaluated in the synthetic utility function\",\n", + " title=f\"Obj 1: maximising every output at the same time, with the same importance\",\n", + ")\n", + "\n", + "ax.set_xticks(np.arange(0, NUM_BATCHES + 1, 1))\n", + "\n", + "ax.set_xlabel(f\"Number of queries q = {q_eubo}, num_initial_comp = {q_comp}, num_initial_samp = {q_data})\", fontsize=10) # Reducing the font size\n", + "ax.legend(loc=\"best\")\n", + "plt.savefig(\"comparison_first_case_1_corrected.png\",bbox_inches=\"tight\", dpi=400)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "47P-W6iDOiHp" + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python [conda env:botorch_mar2024]", + "language": "python", + "name": "conda-env-botorch_mar2024-py" + }, + "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.11.0" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/data/.ipynb_checkpoints/preferentialBO_llm_multiplot_correction_case_1_evil_muejeje-checkpoint.ipynb b/data/.ipynb_checkpoints/preferentialBO_llm_multiplot_correction_case_1_evil_muejeje-checkpoint.ipynb new file mode 100644 index 0000000..d7d3f37 --- /dev/null +++ b/data/.ipynb_checkpoints/preferentialBO_llm_multiplot_correction_case_1_evil_muejeje-checkpoint.ipynb @@ -0,0 +1,715 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "#change utility1 by the corresponding number, get back utility 3 done\n", + "#change prompt done\n", + "#change pickle filename done\n", + "#change plot name done\n", + "#change objective name" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "id": "NTeLbyDoMi0-" + }, + "outputs": [], + "source": [ + "import os\n", + "import warnings\n", + "from itertools import combinations\n", + "\n", + "import numpy as np\n", + "import torch\n", + "import time\n", + "\n", + "# Suppress potential optimization warnings for cleaner notebook\n", + "warnings.filterwarnings(\"ignore\")\n", + "\n", + "SMOKE_TEST = os.environ.get(\"SMOKE_TEST\")" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-03-29 07:50:27.184951: I external/local_tsl/tsl/cuda/cudart_stub.cc:32] Could not find cuda drivers on your machine, GPU will not be used.\n", + "2024-03-29 07:50:27.223956: I tensorflow/core/platform/cpu_feature_guard.cc:210] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n", + "To enable the following instructions: AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n", + "2024-03-29 07:50:27.953754: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT\n", + "2024-03-29 07:50:28.392870: I external/local_xla/xla/stream_executor/cuda/cuda_executor.cc:998] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355\n", + "2024-03-29 07:50:28.393531: W tensorflow/core/common_runtime/gpu/gpu_device.cc:2251] Cannot dlopen some GPU libraries. Please make sure the missing libraries mentioned above are installed properly if you would like to use GPU. Follow the guide at https://www.tensorflow.org/install/gpu for how to download and setup the required libraries for your platform.\n", + "Skipping registering GPU devices...\n" + ] + } + ], + "source": [ + "import DTLZ2_model\n", + "import fischer_model\n", + "from botorch.test_functions.multi_objective import DTLZ2\n", + "from DTLZ2_model import neg_l1_dist\n", + "from DTLZ2_model import predict_DTLZ2_model\n", + "from fischer_model import predict_fischer_model\n", + "import tensorflow as tf\n", + "import random\n", + "\n", + "\n", + "from botorch.fit import fit_gpytorch_mll \n", + "from botorch.models.pairwise_gp import PairwiseGP, PairwiseLaplaceMarginalLogLikelihood \n", + "from botorch.models.transforms.input import Normalize\n", + "import pickle" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + " #Your chosen seed\n", + "your_seed = 42\n", + "\n", + "# Set seed for Python's RNG\n", + "random.seed(your_seed)\n", + "\n", + "# Set seed for NumPy RNG\n", + "np.random.seed(your_seed)\n", + "\n", + "# Set seed for PyTorch RNGs\n", + "torch.manual_seed(your_seed)\n", + "\n", + "# Ensure reproducibility for PyTorch operations (might reduce performance)\n", + "torch.backends.cudnn.deterministic = True\n", + "torch.backends.cudnn.benchmark = False\n", + "\n", + "# If using CUDA (PyTorch)\n", + "torch.cuda.manual_seed(your_seed)\n", + "torch.cuda.manual_seed_all(your_seed) # For multi-GPU setups\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 61ms/step\n" + ] + }, + { + "data": { + "text/plain": [ + "tensor([[0.6455, 0.0591, 0.1161, 0.5071]])" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "predict_fischer_model(torch.tensor([[0.5, 0.5, 0.5, 0.5]]))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "import cohere\n", + "co = cohere.Client('9ylnov4iFULBLovujZIJLq6x8pkq4NkyNCw0oePR')" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "id": "Mvj4PbSpNSjG" + }, + "outputs": [], + "source": [ + "# data generating helper functions\n", + "#function that defines the comparisons\n", + "def utility(X):\n", + " y=predict_fischer_model(X)\n", + " #weighted_y = y * torch.sqrt(torch.arange(y.size(-1), dtype=torch.float) + 1)\n", + " #y = torch.sum(weighted_y, dim=-1)\n", + " return y\n", + "\n", + "def utility1(X): #The four outputs are equally important, and we want to maximize all of them.\n", + " y=predict_fischer_model(X)\n", + " y = torch.sum(y, dim=-1)\n", + " return y\n", + "\n", + "def utility2(X): #We only want to maximize the CO conversion.\n", + " y=predict_fischer_model(X)\n", + " y = y[:,0]\n", + " return y\n", + "\n", + "def utility3(X): # The light olefins is considered as a negative output and we want to minimize it while maximizing the other three objectives.\n", + " y=predict_fischer_model(X)\n", + " y = y[:,0]+y[:,1]+y[:,2]-y[:,3]\n", + " return y\n", + " \n", + "def ini(n,dim):\n", + " X = torch.rand(n, dim, dtype=torch.float64)\n", + " return X\n", + "def generate_data(X, dim=4):\n", + " \"\"\"Generate data X and y\"\"\"\n", + " # X is randomly sampled from dim-dimentional unit cube\n", + " # we recommend using double as opposed to float tensor here for\n", + " # better numerical stability\n", + " #X=ini(n,dim)\n", + " x_2=tf.convert_to_tensor(X, dtype=tf.float32)\n", + " y = utility(x_2)\n", + " return y\n", + "\n", + "def generate_data_u1(X, dim=4):\n", + " \"\"\"Generate data X and y\"\"\"\n", + " # X is randomly sampled from dim-dimentional unit cube\n", + " # we recommend using double as opposed to float tensor here for\n", + " # better numerical stability\n", + " #X=ini(n,dim)\n", + " x_2=tf.convert_to_tensor(X, dtype=tf.float32)\n", + " y = utility1(x_2)\n", + " return y" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def generate_comparisons(y, n_comp, noise=0.1, replace=False):\n", + " \"\"\"Create pairwise comparisons with noise\"\"\"\n", + " # generate all possible pairs of elements in y\n", + " all_pairs = np.array(list(combinations(range(y.shape[0]), 2)))\n", + " # randomly select n_comp pairs from all_pairs\n", + " comp_pairs = all_pairs[\n", + " np.random.choice(range(len(all_pairs)), n_comp, replace=replace)\n", + " ]\n", + " # add gaussian noise to the latent y values\n", + " c0 = y[comp_pairs[:, 0]] + np.random.standard_normal(len(comp_pairs)) * noise\n", + " c1 = y[comp_pairs[:, 1]] + np.random.standard_normal(len(comp_pairs)) * noise\n", + " reverse_comp = (c0 < c1).numpy()\n", + " comp_pairs[reverse_comp, :] = np.flip(comp_pairs[reverse_comp, :], 1)\n", + " comp_pairs = torch.tensor(comp_pairs).long()\n", + "\n", + " return comp_pairs" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "#im not sure if this is is the correct function, i'm a bit eepy\n", + "#remember to reduce the number of comparisons n_comp,\n", + "def generate_comparisons_llm(y, n_comp, replace=False):\n", + " \"\"\"Create pairwise comparisons with noise\"\"\"\n", + " # generate all possible pairs of elements in y\n", + " all_pairs = np.array(list(combinations(range(y.shape[0]), 2)))\n", + " # randomly select n_comp pairs from all_pairs\n", + " comp_pairs = all_pairs[\n", + " np.random.choice(range(len(all_pairs)), n_comp, replace=replace)\n", + " ]\n", + " #parsing the tensor to get the strings for the LLM\n", + " new_pairs=[]\n", + " for opto in comp_pairs:\n", + " firstoption=opto[0]\n", + " secondoption=opto[1]\n", + " numfirst=(y[firstoption,:])\n", + " firstoutput1=f\"{numfirst[0].cpu().numpy():.1f}\"\n", + " firstoutput2=f\"{numfirst[1].cpu().numpy():.1f}\"\n", + " firstoutput3=f\"{numfirst[2].cpu().numpy():.1f}\"\n", + " firstoutput4=f\"{numfirst[3].cpu().numpy():.1f}\"\n", + " numsecond=(y[secondoption,:])\n", + " secondoutput1=f\"{numsecond[0].cpu().numpy():.1f}\"\n", + " secondoutput2=f\"{numsecond[1].cpu().numpy():.1f}\"\n", + " secondoutput3=f\"{numsecond[2].cpu().numpy():.1f}\"\n", + " secondoutput4=f\"{numsecond[3].cpu().numpy():.1f}\"\n", + " #only two character are changed in the maximize word, 'ax' to 'in' giving minimize\n", + " mess=\"Suppose you're managing a Fischer-Tropsch synthesis process. The four outputs are equally important, and we want to minimize all of them. Option A: regime of \"+firstoutput1+\" CO conversion, \"+firstoutput2+\" methane production, \"+firstoutput3+\" paraffins, \"+firstoutput4+\" light olefins. Option B: regime of \"+secondoutput1+\" CO conversion, \"+secondoutput2+\" methane production, \"+secondoutput3+\" paraffins, \"+secondoutput4+\" light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\"\n", + " print(mess)\n", + " response = co.chat(message=mess,\n", + " #perform web search before answering the question. You can also use your own custom connector.\n", + " #connectors=[{\"id\": \"web-search\"}]\n", + " )\n", + " print(response.text)\n", + " opllm=response.text\n", + " \n", + " if \"Option A\" in opllm:\n", + " new_pairs.append(opto.tolist())\n", + " else:\n", + " new_pairs.append(list(reversed(opto)))\n", + " #api restrictions 20 API calls/minutes\n", + " time.sleep(6)\n", + " \n", + " return torch.tensor(new_pairs)\n", + "\n", + "#\"Suppose you're managing a Fischer-Tropsch synthesis process. The four outputs are equally important, and we want to maximize all of them. Option A: regime of \"+firstoutput1+\" CO conversion, \"+firstoutput2+\" methane production, \"+firstoutput3+\" paraffins, \"+firstoutput4+\" light olefins. Option B: regime of \"+secondoutput1+\" CO conversion, \"+secondoutput2+\" methane production, \"+secondoutput3+\" paraffins, \"+secondoutput4+\" light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\"\n", + "#\"Suppose you're managing a Fischer-Tropsch synthesis process. The light olefins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of \"+firstoutput1+\" CO conversion, \"+firstoutput2+\" methane, \"+firstoutput3+\" paraffin, \"+firstoutput4+\" light olefins. Option B: regime of \"+secondoutput1+\" CO conversion, \"+secondoutput2+\" methane, \"+secondoutput3+\" paraffins, \"+secondoutput4+\" light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\"\n", + "#\"Suppose you're managing a Fischer-Tropsch synthesis process. We only want to maximize the CO conversion. Option A: regime of \"+firstoutput1+\" CO conversion, \"+firstoutput2+\" methane, \"+firstoutput3+\" paraffin, \"+firstoutput4+\" light olefins. Option B: regime of \"+secondoutput1+\" CO conversion, \"+secondoutput2+\" methane, \"+secondoutput3+\" paraffins, \"+secondoutput4+\" light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "m5F2xn-8N-g9" + }, + "source": [ + "#parameters\n", + "torch.manual_seed(123)\n", + "#number for initial data\n", + "n = 5 if not SMOKE_TEST else 5\n", + "#number for initial comparisons\n", + "m = 10 if not SMOKE_TEST else 10\n", + "dim = 4\n", + "noise = 0.1\n", + "\n", + "#generate data, initial data\n", + "train_X, train_y = generate_data(n, dim=dim)\n", + "#generating comparison based on the utility function" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "train_comp_llm = generate_comparisons_llm(train_y, m)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "train_comp_llm" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "fMuLBRO-NVj3" + }, + "source": [ + "from botorch.fit import fit_gpytorch_mll\n", + "from botorch.models.pairwise_gp import PairwiseGP, PairwiseLaplaceMarginalLogLikelihood\n", + "from botorch.models.transforms.input import Normalize\n", + "\n", + "#fitting the first pairwise GP\n", + "model = PairwiseGP(\n", + " train_X,\n", + " train_comp_llm,\n", + " input_transform=Normalize(d=train_X.shape[-1]),\n", + ")\n", + "mll = PairwiseLaplaceMarginalLogLikelihood(model.likelihood, model)\n", + "mll = fit_gpytorch_mll(mll)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "OdxhkF6yNZKp", + "outputId": "0e3b833e-7a46-4413-f148-7e3fab6d8433" + }, + "source": [ + "from scipy.stats import kendalltau\n", + "\n", + "\n", + "# Kendall-Tau rank correlation\n", + "def eval_kt_cor(model, test_X, test_y):\n", + " pred_y = model.posterior(test_X).mean.squeeze().detach().numpy()\n", + " return kendalltau(pred_y, test_y).correlation\n", + "\n", + "\n", + "n_kendall = 10 if not SMOKE_TEST else 10\n", + "\n", + "test_X, test_y = generate_data(n_kendall, dim=dim)\n", + "kt_correlation = eval_kt_cor(model, test_X, test_y[:,3])\n", + "\n", + "print(f\"Test Kendall-Tau rank correlation: {kt_correlation:.4f}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "id": "qEoN28RSNk2N" + }, + "outputs": [], + "source": [ + "from botorch.acquisition.preference import AnalyticExpectedUtilityOfBestOption\n", + "from botorch.optim import optimize_acqf\n", + "\n", + "#wrapper for the model\n", + "def init_and_fit_model(X, comp):\n", + " \"\"\"Model fitting helper function\"\"\"\n", + " model = PairwiseGP(\n", + " X,\n", + " comp,\n", + " input_transform=Normalize(d=X.shape[-1]),\n", + " )\n", + " mll = PairwiseLaplaceMarginalLogLikelihood(model.likelihood, model)\n", + " fit_gpytorch_mll(mll)\n", + " return mll, model\n", + "\n", + "#wrapper for making new data, what does it mean? return comps\n", + "\n", + "def make_new_data(X, next_X, comps, q_comp):\n", + " \"\"\"Given X and next_X,\n", + " generate q_comp new comparisons between next_X\n", + " and return the concatenated X and comparisons\n", + " \"\"\"\n", + " # next_X is float by default; cast it to the dtype of X (i.e., double)\n", + " next_X = next_X.to(X)\n", + " x_2=tf.convert_to_tensor(next_X, dtype=tf.float32)\n", + " next_y = utility(x_2)\n", + " next_comps = generate_comparisons_llm(next_y, n_comp=q_comp)\n", + " comps = torch.cat([comps, next_comps + X.shape[-2]])\n", + " X = torch.cat([X, next_X])\n", + " return X, comps\n", + "\n", + "def make_new_data_u1(X, next_X, comps, q_comp):\n", + " \"\"\"Given X and next_X,\n", + " generate q_comp new comparisons between next_X\n", + " and return the concatenated X and comparisons\n", + " \"\"\"\n", + " # next_X is float by default; cast it to the dtype of X (i.e., double)\n", + " next_X = next_X.to(X)\n", + " x_2=tf.convert_to_tensor(next_X, dtype=tf.float32)\n", + " next_y = utility1(x_2)\n", + " next_comps = generate_comparisons(next_y, n_comp=q_comp)\n", + " comps = torch.cat([comps, next_comps + X.shape[-2]])\n", + " X = torch.cat([X, next_X])\n", + " return X, comps" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "1pTEh0DMNv1w" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 18ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The four outputs are equally important, and we want to maximize all of them. Option A: regime of 0.2 CO conversion, 0.0 methane production, 0.0 paraffins, 0.2 light olefins. Option B: regime of 0.6 CO conversion, 0.0 methane production, 0.1 paraffins, 0.5 light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The four outputs are equally important, and we want to maximize all of them. Option A: regime of 0.7 CO conversion, 0.1 methane production, 0.2 paraffins, 0.4 light olefins. Option B: regime of 0.2 CO conversion, 0.0 methane production, 0.0 paraffins, 0.2 light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The four outputs are equally important, and we want to maximize all of them. Option A: regime of 0.2 CO conversion, 0.0 methane production, 0.0 paraffins, 0.2 light olefins. Option B: regime of 0.5 CO conversion, 0.0 methane production, 0.1 paraffins, 0.6 light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The four outputs are equally important, and we want to maximize all of them. Option A: regime of 0.7 CO conversion, 0.1 methane production, 0.2 paraffins, 0.4 light olefins. Option B: regime of 0.6 CO conversion, 0.0 methane production, 0.1 paraffins, 0.5 light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The four outputs are equally important, and we want to maximize all of them. Option A: regime of 0.7 CO conversion, 0.1 methane production, 0.2 paraffins, 0.4 light olefins. Option B: regime of 0.8 CO conversion, 0.1 methane production, 0.2 paraffins, 0.6 light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The four outputs are equally important, and we want to maximize all of them. Option A: regime of 0.2 CO conversion, 0.0 methane production, 0.0 paraffins, 0.2 light olefins. Option B: regime of 0.8 CO conversion, 0.1 methane production, 0.2 paraffins, 0.6 light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The four outputs are equally important, and we want to maximize all of them. Option A: regime of 0.5 CO conversion, 0.0 methane production, 0.1 paraffins, 0.6 light olefins. Option B: regime of 0.6 CO conversion, 0.0 methane production, 0.1 paraffins, 0.5 light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\n" + ] + } + ], + "source": [ + "#two algorithms to compare\n", + "algos = [\"EUBO\",\"EUBO-LLM\", \"rand\"]\n", + "#number of repetitions of the BO cycle\n", + "NUM_TRIALS = 3 if not SMOKE_TEST else 2\n", + "#number of cycles\n", + "NUM_BATCHES = 20 if not SMOKE_TEST else 2\n", + "\n", + "#dimension number= 4 inputs\n", + "dim = 4\n", + "#sampler options\n", + "NUM_RESTARTS = 3\n", + "RAW_SAMPLES = 512 if not SMOKE_TEST else 8\n", + "#\n", + "q_eubo = 2 # number of points per query\n", + "q_data=5\n", + "q_comp = 10 # number of comparisons per query\n", + "q_comp_2=1\n", + "\n", + "# initial evals\n", + "best_vals = {} # best observed values\n", + "for algo in algos:\n", + " best_vals[algo] = []\n", + "\n", + "# average over multiple trials\n", + "for i in range(NUM_TRIALS):\n", + " torch.manual_seed(i)\n", + " np.random.seed(i)\n", + " data = {}\n", + " models = {}\n", + "\n", + " # X are within the unit cube\n", + " bounds = torch.stack([torch.zeros(dim), torch.ones(dim)])\n", + "\n", + " # Create initial data\n", + " init_X=ini(q_data,dim)\n", + " for algo in algos:\n", + " if algo == \"EUBO-LLM\":\n", + " init_y = generate_data(init_X, dim=dim)\n", + " comparisons = generate_comparisons_llm(init_y, q_comp)\n", + " if algo == \"EUBO\":\n", + " init_y = generate_data_u1(init_X, dim=dim)\n", + " comparisons = generate_comparisons(init_y, q_comp)\n", + " if algo == \"rand\":\n", + " init_y = generate_data_u1(init_X, dim=dim)\n", + " comparisons = generate_comparisons(init_y, q_comp)\n", + " \n", + " best_vals[algo].append([])\n", + " data[algo] = (init_X, comparisons)\n", + " _, models[algo] = init_and_fit_model(init_X, comparisons)\n", + "\n", + " best_next_y = utility1(init_X).max().item()\n", + " best_vals[algo][-1].append(best_next_y)\n", + "\n", + " # we make additional NUM_BATCHES comparison queries after the initial observation\n", + " for j in range(1, NUM_BATCHES + 1):\n", + " print(j)\n", + " for algo in algos:\n", + " model = models[algo]\n", + " if algo == \"EUBO-LLM\":\n", + " # create the acquisition function object\n", + " acq_func = AnalyticExpectedUtilityOfBestOption(pref_model=model)\n", + " # optimize and get new observation\n", + " next_X, acq_val = optimize_acqf(\n", + " acq_function=acq_func,\n", + " bounds=bounds,\n", + " q=q_eubo,\n", + " num_restarts=NUM_RESTARTS,\n", + " raw_samples=RAW_SAMPLES,\n", + " )\n", + " print(next_X)\n", + " # update data\n", + " X, comps = data[algo]\n", + " X, comps = make_new_data(X, next_X, comps, q_comp_2)\n", + " data[algo] = (X, comps)\n", + " \n", + " # refit models\n", + " _, models[algo] = init_and_fit_model(X, comps)\n", + " \n", + " # record the best observed values so far\n", + " max_val = utility1(X).max().item()\n", + " best_vals[algo][-1].append(max_val)\n", + " elif algo == \"EUBO\":\n", + " #create the acquisition function object\n", + " acq_func = AnalyticExpectedUtilityOfBestOption(pref_model=model)\n", + " # optimize and get new observation\n", + " next_X, acq_val = optimize_acqf(\n", + " acq_function=acq_func,\n", + " bounds=bounds,\n", + " q=q_eubo,\n", + " num_restarts=NUM_RESTARTS,\n", + " raw_samples=RAW_SAMPLES,\n", + " )\n", + " print(next_X)\n", + " # update data\n", + " X, comps = data[algo]\n", + " X, comps = make_new_data_u1(X, next_X, comps, q_comp_2)\n", + " data[algo] = (X, comps)\n", + " \n", + " # refit models\n", + " _, models[algo] = init_and_fit_model(X, comps)\n", + " \n", + " # record the best observed values so far\n", + " max_val = utility1(X).max().item()\n", + " best_vals[algo][-1].append(max_val)\n", + " else:\n", + " # randomly sample data\n", + " next_X= ini(q_eubo, dim=dim)\n", + " print(next_X)\n", + " # update data\n", + " X, comps = data[algo]\n", + " X, comps = make_new_data_u1(X, next_X, comps, q_comp_2)\n", + " data[algo] = (X, comps)\n", + " \n", + " # refit models\n", + " _, models[algo] = init_and_fit_model(X, comps)\n", + " \n", + " # record the best observed values so far\n", + " max_val = utility1(X).max().item()\n", + " best_vals[algo][-1].append(max_val)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "with open('best_vals_case_1_evil.pkl', 'wb') as handle:\n", + " pickle.dump(best_vals, handle, protocol=pickle.HIGHEST_PROTOCOL)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "with open('best_vals_case_1_evil.pkl', 'rb') as handle:\n", + " loaded_data = pickle.load(handle)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "loaded_data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 596 + }, + "id": "eRLF3-dFNzyW", + "outputId": "9c83df50-e355-42b9-860e-b4b51d63f2c5" + }, + "outputs": [], + "source": [ + "from matplotlib import pyplot as plt\n", + "\n", + "\n", + "%matplotlib inline\n", + "\n", + "plt.rcParams.update({\"font.size\": 14})\n", + "\n", + "algo_labels = {\n", + " \"rand\": \"Random Exploration\",\n", + " \"EUBO-LLM\": \"EUBO-LLM\",\n", + " \"EUBO\": \"EUBO\", \n", + "}\n", + "\n", + "\n", + "def ci(y):\n", + " return 1.96 * y.std(axis=0) / np.sqrt(y.shape[0])\n", + "\n", + "\n", + "# the utility function is maximized at the full vector of 1\n", + "#optimal_val = utility(torch.tensor([[1] * dim])).item()\n", + "iters = list(range(NUM_BATCHES + 1))\n", + "\n", + "fig, ax = plt.subplots(1, 1, figsize=(8, 6))\n", + "# plot the optimal value\n", + "#ax.plot(\n", + "# iters,\n", + "# [optimal_val] * len(iters),\n", + "# label=\"Optimal Function Value\",\n", + "# color=\"black\",\n", + "## linewidth=1.5,\n", + "#)\n", + "\n", + "# plot the the best observed value from each algorithm\n", + "for algo in algos:\n", + " ys = np.vstack(best_vals[algo])\n", + " ax.errorbar(\n", + " iters, ys.mean(axis=0), yerr=ci(ys), label=algo_labels[algo], linewidth=1.5\n", + " )\n", + "\n", + "ax.set(\n", + " #xlabel=f\"Number of queries q = {q_eubo}, num_initial_comp = {q_comp}, num_initial_samp = {q_data})\",\n", + " ylabel=\"Best observed value\\nas evaluated in the synthetic utility function\",\n", + " title=f\"Obj 1: minimising every output at the same time (typo in the word maximising)\",\n", + ")\n", + "\n", + "ax.set_xticks(np.arange(0, NUM_BATCHES + 1, 1))\n", + "\n", + "ax.set_xlabel(f\"Number of queries q = {q_eubo}, num_initial_comp = {q_comp}, num_initial_samp = {q_data})\", fontsize=10) # Reducing the font size\n", + "ax.legend(loc=\"best\")\n", + "plt.savefig(\"comparison_first_case_1_evil_muejeje_corrected.png\",bbox_inches=\"tight\", dpi=400)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "47P-W6iDOiHp" + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python [conda env:botorch_mar2024]", + "language": "python", + "name": "conda-env-botorch_mar2024-py" + }, + "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.11.0" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/data/.ipynb_checkpoints/preferentialBO_llm_multiplot_correction_case_2-checkpoint.ipynb b/data/.ipynb_checkpoints/preferentialBO_llm_multiplot_correction_case_2-checkpoint.ipynb new file mode 100644 index 0000000..2d3aba0 --- /dev/null +++ b/data/.ipynb_checkpoints/preferentialBO_llm_multiplot_correction_case_2-checkpoint.ipynb @@ -0,0 +1,1872 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#change utility2 by the corresponding number, get back utility 3 done\n", + "#change prompt done \n", + "#change pickle filename done\n", + "#change plot name done\n", + "#change objective name done" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": { + "id": "NTeLbyDoMi0-" + }, + "outputs": [], + "source": [ + "import os\n", + "import warnings\n", + "from itertools import combinations\n", + "\n", + "import numpy as np\n", + "import torch\n", + "import time\n", + "\n", + "# Suppress potential optimization warnings for cleaner notebook\n", + "warnings.filterwarnings(\"ignore\")\n", + "\n", + "SMOKE_TEST = os.environ.get(\"SMOKE_TEST\")" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [], + "source": [ + "import DTLZ2_model\n", + "import fischer_model\n", + "from botorch.test_functions.multi_objective import DTLZ2\n", + "from DTLZ2_model import neg_l1_dist\n", + "from DTLZ2_model import predict_DTLZ2_model\n", + "from fischer_model import predict_fischer_model\n", + "import tensorflow as tf\n", + "import random\n", + "\n", + "\n", + "from botorch.fit import fit_gpytorch_mll \n", + "from botorch.models.pairwise_gp import PairwiseGP, PairwiseLaplaceMarginalLogLikelihood \n", + "from botorch.models.transforms.input import Normalize\n", + "import pickle" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [], + "source": [ + " #Your chosen seed\n", + "your_seed = 42\n", + "\n", + "# Set seed for Python's RNG\n", + "random.seed(your_seed)\n", + "\n", + "# Set seed for NumPy RNG\n", + "np.random.seed(your_seed)\n", + "\n", + "# Set seed for PyTorch RNGs\n", + "torch.manual_seed(your_seed)\n", + "\n", + "# Ensure reproducibility for PyTorch operations (might reduce performance)\n", + "torch.backends.cudnn.deterministic = True\n", + "torch.backends.cudnn.benchmark = False\n", + "\n", + "# If using CUDA (PyTorch)\n", + "torch.cuda.manual_seed(your_seed)\n", + "torch.cuda.manual_seed_all(your_seed) # For multi-GPU setups\n" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n" + ] + }, + { + "data": { + "text/plain": [ + "tensor([[0.6455, 0.0591, 0.1161, 0.5071]])" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "predict_fischer_model(torch.tensor([[0.5, 0.5, 0.5, 0.5]]))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [], + "source": [ + "import cohere\n", + "co = cohere.Client('9ylnov4iFULBLovujZIJLq6x8pkq4NkyNCw0oePR')" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "id": "Mvj4PbSpNSjG" + }, + "outputs": [], + "source": [ + "# data generating helper functions\n", + "#function that defines the comparisons\n", + "def utility(X):\n", + " y=predict_fischer_model(X)\n", + " #weighted_y = y * torch.sqrt(torch.arange(y.size(-1), dtype=torch.float) + 1)\n", + " #y = torch.sum(weighted_y, dim=-1)\n", + " return y\n", + "\n", + "def utility1(X): #The four outputs are equally important, and we want to maximize all of them.\n", + " y=predict_fischer_model(X)\n", + " y = torch.sum(y, dim=-1)\n", + " return y\n", + "\n", + "def utility2(X): #We only want to maximize the CO conversion.\n", + " y=predict_fischer_model(X)\n", + " y = y[:,0]\n", + " return y\n", + "\n", + "def utility3(X): # The light olefins is considered as a negative output and we want to minimize it while maximizing the other three objectives.\n", + " y=predict_fischer_model(X)\n", + " y = y[:,0]+y[:,1]+y[:,2]-y[:,3]\n", + " return y\n", + " \n", + "def ini(n,dim):\n", + " X = torch.rand(n, dim, dtype=torch.float64)\n", + " return X\n", + "def generate_data(X, dim=4):\n", + " \"\"\"Generate data X and y\"\"\"\n", + " # X is randomly sampled from dim-dimentional unit cube\n", + " # we recommend using double as opposed to float tensor here for\n", + " # better numerical stability\n", + " #X=ini(n,dim)\n", + " x_2=tf.convert_to_tensor(X, dtype=tf.float32)\n", + " y = utility(x_2)\n", + " return y\n", + "\n", + "def generate_data_u1(X, dim=4):\n", + " \"\"\"Generate data X and y\"\"\"\n", + " # X is randomly sampled from dim-dimentional unit cube\n", + " # we recommend using double as opposed to float tensor here for\n", + " # better numerical stability\n", + " #X=ini(n,dim)\n", + " x_2=tf.convert_to_tensor(X, dtype=tf.float32)\n", + " y = utility2(x_2)\n", + " return y" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [], + "source": [ + "def generate_comparisons(y, n_comp, noise=0.1, replace=False):\n", + " \"\"\"Create pairwise comparisons with noise\"\"\"\n", + " # generate all possible pairs of elements in y\n", + " all_pairs = np.array(list(combinations(range(y.shape[0]), 2)))\n", + " # randomly select n_comp pairs from all_pairs\n", + " comp_pairs = all_pairs[\n", + " np.random.choice(range(len(all_pairs)), n_comp, replace=replace)\n", + " ]\n", + " # add gaussian noise to the latent y values\n", + " c0 = y[comp_pairs[:, 0]] + np.random.standard_normal(len(comp_pairs)) * noise\n", + " c1 = y[comp_pairs[:, 1]] + np.random.standard_normal(len(comp_pairs)) * noise\n", + " reverse_comp = (c0 < c1).numpy()\n", + " comp_pairs[reverse_comp, :] = np.flip(comp_pairs[reverse_comp, :], 1)\n", + " comp_pairs = torch.tensor(comp_pairs).long()\n", + "\n", + " return comp_pairs" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [], + "source": [ + "#im not sure if this is is the correct function, i'm a bit eepy\n", + "#remember to reduce the number of comparisons n_comp,\n", + "def generate_comparisons_llm(y, n_comp, replace=False):\n", + " \"\"\"Create pairwise comparisons with noise\"\"\"\n", + " # generate all possible pairs of elements in y\n", + " all_pairs = np.array(list(combinations(range(y.shape[0]), 2)))\n", + " # randomly select n_comp pairs from all_pairs\n", + " comp_pairs = all_pairs[\n", + " np.random.choice(range(len(all_pairs)), n_comp, replace=replace)\n", + " ]\n", + " #parsing the tensor to get the strings for the LLM\n", + " new_pairs=[]\n", + " for opto in comp_pairs:\n", + " firstoption=opto[0]\n", + " secondoption=opto[1]\n", + " numfirst=(y[firstoption,:])\n", + " firstoutput1=f\"{numfirst[0].cpu().numpy():.1f}\"\n", + " firstoutput2=f\"{numfirst[1].cpu().numpy():.1f}\"\n", + " firstoutput3=f\"{numfirst[2].cpu().numpy():.1f}\"\n", + " firstoutput4=f\"{numfirst[3].cpu().numpy():.1f}\"\n", + " numsecond=(y[secondoption,:])\n", + " secondoutput1=f\"{numsecond[0].cpu().numpy():.1f}\"\n", + " secondoutput2=f\"{numsecond[1].cpu().numpy():.1f}\"\n", + " secondoutput3=f\"{numsecond[2].cpu().numpy():.1f}\"\n", + " secondoutput4=f\"{numsecond[3].cpu().numpy():.1f}\"\n", + " mess=\"Suppose you're managing a Fischer-Tropsch synthesis process. We only want to maximize the CO conversion. Option A: regime of \"+firstoutput1+\" CO conversion, \"+firstoutput2+\" methane, \"+firstoutput3+\" paraffin, \"+firstoutput4+\" light olefins. Option B: regime of \"+secondoutput1+\" CO conversion, \"+secondoutput2+\" methane, \"+secondoutput3+\" paraffins, \"+secondoutput4+\" light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\"\n", + " print(mess)\n", + " response = co.chat(message=mess,\n", + " #perform web search before answering the question. You can also use your own custom connector.\n", + " #connectors=[{\"id\": \"web-search\"}]\n", + " )\n", + " print(response.text)\n", + " opllm=response.text\n", + " \n", + " if \"Option A\" in opllm:\n", + " new_pairs.append(opto.tolist())\n", + " else:\n", + " new_pairs.append(list(reversed(opto)))\n", + " #api restrictions 20 API calls/minutes\n", + " time.sleep(6)\n", + " \n", + " return torch.tensor(new_pairs)\n", + "\n", + "#\"Suppose you're managing a Fischer-Tropsch synthesis process. The four outputs are equally important, and we want to maximize all of them. Option A: regime of \"+firstoutput1+\" CO conversion, \"+firstoutput2+\" methane production, \"+firstoutput3+\" paraffins, \"+firstoutput4+\" light olefins. Option B: regime of \"+secondoutput1+\" CO conversion, \"+secondoutput2+\" methane production, \"+secondoutput3+\" paraffins, \"+secondoutput4+\" light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\"\n", + "#\"Suppose you're managing a Fischer-Tropsch synthesis process. The light olefins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of \"+firstoutput1+\" CO conversion, \"+firstoutput2+\" methane, \"+firstoutput3+\" paraffin, \"+firstoutput4+\" light olefins. Option B: regime of \"+secondoutput1+\" CO conversion, \"+secondoutput2+\" methane, \"+secondoutput3+\" paraffins, \"+secondoutput4+\" light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\"\n", + "#\"Suppose you're managing a Fischer-Tropsch synthesis process. We only want to maximize the CO conversion. Option A: regime of \"+firstoutput1+\" CO conversion, \"+firstoutput2+\" methane, \"+firstoutput3+\" paraffin, \"+firstoutput4+\" light olefins. Option B: regime of \"+secondoutput1+\" CO conversion, \"+secondoutput2+\" methane, \"+secondoutput3+\" paraffins, \"+secondoutput4+\" light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "m5F2xn-8N-g9" + }, + "source": [ + "#parameters\n", + "torch.manual_seed(123)\n", + "#number for initial data\n", + "n = 5 if not SMOKE_TEST else 5\n", + "#number for initial comparisons\n", + "m = 10 if not SMOKE_TEST else 10\n", + "dim = 4\n", + "noise = 0.1\n", + "\n", + "#generate data, initial data\n", + "train_X, train_y = generate_data(n, dim=dim)\n", + "#generating comparison based on the utility function" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "train_comp_llm = generate_comparisons_llm(train_y, m)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "train_comp_llm" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "fMuLBRO-NVj3" + }, + "source": [ + "from botorch.fit import fit_gpytorch_mll\n", + "from botorch.models.pairwise_gp import PairwiseGP, PairwiseLaplaceMarginalLogLikelihood\n", + "from botorch.models.transforms.input import Normalize\n", + "\n", + "#fitting the first pairwise GP\n", + "model = PairwiseGP(\n", + " train_X,\n", + " train_comp_llm,\n", + " input_transform=Normalize(d=train_X.shape[-1]),\n", + ")\n", + "mll = PairwiseLaplaceMarginalLogLikelihood(model.likelihood, model)\n", + "mll = fit_gpytorch_mll(mll)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "OdxhkF6yNZKp", + "outputId": "0e3b833e-7a46-4413-f148-7e3fab6d8433" + }, + "source": [ + "from scipy.stats import kendalltau\n", + "\n", + "\n", + "# Kendall-Tau rank correlation\n", + "def eval_kt_cor(model, test_X, test_y):\n", + " pred_y = model.posterior(test_X).mean.squeeze().detach().numpy()\n", + " return kendalltau(pred_y, test_y).correlation\n", + "\n", + "\n", + "n_kendall = 10 if not SMOKE_TEST else 10\n", + "\n", + "test_X, test_y = generate_data(n_kendall, dim=dim)\n", + "kt_correlation = eval_kt_cor(model, test_X, test_y[:,3])\n", + "\n", + "print(f\"Test Kendall-Tau rank correlation: {kt_correlation:.4f}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": { + "id": "qEoN28RSNk2N" + }, + "outputs": [], + "source": [ + "from botorch.acquisition.preference import AnalyticExpectedUtilityOfBestOption\n", + "from botorch.optim import optimize_acqf\n", + "\n", + "#wrapper for the model\n", + "def init_and_fit_model(X, comp):\n", + " \"\"\"Model fitting helper function\"\"\"\n", + " model = PairwiseGP(\n", + " X,\n", + " comp,\n", + " input_transform=Normalize(d=X.shape[-1]),\n", + " )\n", + " mll = PairwiseLaplaceMarginalLogLikelihood(model.likelihood, model)\n", + " fit_gpytorch_mll(mll)\n", + " return mll, model\n", + "\n", + "#wrapper for making new data, what does it mean? return comps\n", + "\n", + "def make_new_data(X, next_X, comps, q_comp):\n", + " \"\"\"Given X and next_X,\n", + " generate q_comp new comparisons between next_X\n", + " and return the concatenated X and comparisons\n", + " \"\"\"\n", + " # next_X is float by default; cast it to the dtype of X (i.e., double)\n", + " next_X = next_X.to(X)\n", + " x_2=tf.convert_to_tensor(next_X, dtype=tf.float32)\n", + " next_y = utility(x_2)\n", + " next_comps = generate_comparisons_llm(next_y, n_comp=q_comp)\n", + " comps = torch.cat([comps, next_comps + X.shape[-2]])\n", + " X = torch.cat([X, next_X])\n", + " return X, comps\n", + "\n", + "def make_new_data_u1(X, next_X, comps, q_comp):\n", + " \"\"\"Given X and next_X,\n", + " generate q_comp new comparisons between next_X\n", + " and return the concatenated X and comparisons\n", + " \"\"\"\n", + " # next_X is float by default; cast it to the dtype of X (i.e., double)\n", + " next_X = next_X.to(X)\n", + " x_2=tf.convert_to_tensor(next_X, dtype=tf.float32)\n", + " next_y = utility2(x_2)\n", + " next_comps = generate_comparisons(next_y, n_comp=q_comp)\n", + " comps = torch.cat([comps, next_comps + X.shape[-2]])\n", + " X = torch.cat([X, next_X])\n", + " return X, comps" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": { + "id": "1pTEh0DMNv1w" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.2 CO conversion, 0.0 methane, 0.0 paraffin, 0.2 light oleffins. Option B: regime of 0.6 CO conversion, 0.0 methane, 0.1 paraffins, 0.5 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.7 CO conversion, 0.1 methane, 0.2 paraffin, 0.4 light oleffins. Option B: regime of 0.2 CO conversion, 0.0 methane, 0.0 paraffins, 0.2 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.2 CO conversion, 0.0 methane, 0.0 paraffin, 0.2 light oleffins. Option B: regime of 0.5 CO conversion, 0.0 methane, 0.1 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.7 CO conversion, 0.1 methane, 0.2 paraffin, 0.4 light oleffins. Option B: regime of 0.6 CO conversion, 0.0 methane, 0.1 paraffins, 0.5 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.7 CO conversion, 0.1 methane, 0.2 paraffin, 0.4 light oleffins. Option B: regime of 0.8 CO conversion, 0.1 methane, 0.2 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.2 CO conversion, 0.0 methane, 0.0 paraffin, 0.2 light oleffins. Option B: regime of 0.8 CO conversion, 0.1 methane, 0.2 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.5 CO conversion, 0.0 methane, 0.1 paraffin, 0.6 light oleffins. Option B: regime of 0.6 CO conversion, 0.0 methane, 0.1 paraffins, 0.5 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.6 CO conversion, 0.0 methane, 0.1 paraffin, 0.5 light oleffins. Option B: regime of 0.8 CO conversion, 0.1 methane, 0.2 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.7 CO conversion, 0.1 methane, 0.2 paraffin, 0.4 light oleffins. Option B: regime of 0.5 CO conversion, 0.0 methane, 0.1 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.5 CO conversion, 0.0 methane, 0.1 paraffin, 0.6 light oleffins. Option B: regime of 0.8 CO conversion, 0.1 methane, 0.2 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "1\n", + "tensor([[0.6177, 0.2997, 0.6399, 0.9175],\n", + " [0.2291, 0.0543, 0.7329, 0.7803]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "tensor([[1.0000, 0.7325, 0.6223, 1.0000],\n", + " [0.9604, 0.7575, 0.2742, 0.8219]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.9 CO conversion, 0.2 methane, 0.3 paraffin, 0.6 light oleffins. Option B: regime of 0.4 CO conversion, 0.0 methane, 0.1 paraffins, 0.2 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "tensor([[0.5654, 0.1800, 0.7764, 0.7375],\n", + " [0.7258, 0.4854, 0.5205, 0.6100]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "2\n", + "tensor([[0.6758, 0.3608, 0.8161, 0.8731],\n", + " [0.5372, 0.1989, 0.4826, 0.9668]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "tensor([[1.0000, 0.7393, 0.5811, 0.9989],\n", + " [0.7551, 1.0000, 0.0000, 0.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.9 CO conversion, 0.1 methane, 0.3 paraffin, 0.5 light oleffins. Option B: regime of 0.0 CO conversion, 0.0 methane, 0.0 paraffins, 0.1 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "tensor([[0.7254, 0.7166, 0.0501, 0.2474],\n", + " [0.0449, 0.9838, 0.2425, 0.8623]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "3\n", + "tensor([[0.8182, 0.1743, 0.7650, 0.8240],\n", + " [0.4948, 0.5037, 0.8033, 0.9617]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "tensor([[1.0000, 1.0000, 0.6369, 1.0000],\n", + " [1.0000, 0.5098, 0.6041, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.9 CO conversion, 0.2 methane, 0.4 paraffin, 0.6 light oleffins. Option B: regime of 0.9 CO conversion, 0.1 methane, 0.3 paraffins, 0.5 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "tensor([[0.9381, 0.4161, 0.2674, 0.5551],\n", + " [0.5027, 0.0099, 0.2437, 0.0720]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "4\n", + "tensor([[0.5470, 0.4434, 0.6764, 0.9883],\n", + " [0.5354, 0.4861, 1.0000, 0.8743]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "tensor([[1.0000, 0.9396, 0.8866, 1.0000],\n", + " [1.0000, 0.9841, 0.4887, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 1.0 CO conversion, 0.5 methane, 0.8 paraffin, 0.6 light oleffins. Option B: regime of 0.8 CO conversion, 0.1 methane, 0.2 paraffins, 0.5 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "tensor([[0.8639, 0.7200, 0.3087, 0.6760],\n", + " [0.2526, 0.9573, 0.3448, 0.2589]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "5\n", + "tensor([[0.5168, 0.2822, 1.0000, 0.9545],\n", + " [0.5628, 0.6631, 0.9213, 0.8618]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "tensor([[1.0000, 1.0000, 1.0000, 0.3902],\n", + " [1.0000, 0.9359, 0.8308, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.9 CO conversion, 0.8 methane, 0.5 paraffin, 0.7 light oleffins. Option B: regime of 1.0 CO conversion, 0.4 methane, 0.7 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "tensor([[0.2512, 0.4833, 0.2143, 0.1475],\n", + " [0.9272, 0.0715, 0.7356, 0.3519]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "6\n", + "tensor([[0.2716, 0.3918, 1.0000, 1.0000],\n", + " [0.6775, 0.3429, 1.0000, 0.9131]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "tensor([[1.0000, 0.9725, 0.9456, 0.2324],\n", + " [1.0000, 1.0000, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.9 CO conversion, 0.7 methane, 0.3 paraffin, 0.8 light oleffins. Option B: regime of 1.0 CO conversion, 0.7 methane, 0.9 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "tensor([[0.7467, 0.9901, 0.3281, 0.4511],\n", + " [0.5020, 0.7669, 0.9661, 0.0778]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "7\n", + "tensor([[0.5401, 0.2585, 1.0000, 0.7968],\n", + " [0.6834, 0.4090, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 19ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "tensor([[1.0000, 0.0000, 0.0000, 1.0000],\n", + " [1.0000, 0.9933, 1.0000, 0.8806]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.0 CO conversion, -0.0 methane, -0.0 paraffin, 0.0 light oleffins. Option B: regime of 1.0 CO conversion, 0.7 methane, 0.9 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "tensor([[0.6354, 0.9786, 0.6545, 0.7508],\n", + " [0.7092, 0.5375, 0.8792, 0.2227]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "8\n", + "tensor([[0.6613, 0.3826, 1.0000, 0.9974],\n", + " [0.0000, 0.0000, 0.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "tensor([[1.0000, 1.0000, 1.0000, 1.0000],\n", + " [1.0000, 1.0000, 1.0000, 0.4929]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 1.0 CO conversion, 0.7 methane, 0.9 paraffin, 0.6 light oleffins. Option B: regime of 1.0 CO conversion, 0.7 methane, 0.6 paraffins, 0.7 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "tensor([[0.9644, 0.0921, 0.1329, 0.1336],\n", + " [0.5406, 0.3748, 0.1866, 0.6932]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "9\n", + "tensor([[0.5694, 0.3920, 1.0000, 1.0000],\n", + " [1.0000, 0.3627, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "tensor([[1.0000, 1.0000, 0.5368, 1.0000],\n", + " [1.0000, 1.0000, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.8 CO conversion, 0.1 methane, 0.2 paraffin, 0.5 light oleffins. Option B: regime of 1.0 CO conversion, 0.7 methane, 0.9 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "tensor([[0.0198, 0.8570, 0.8664, 0.8144],\n", + " [0.1911, 0.1642, 0.7881, 0.2199]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "10\n", + "tensor([[1.0000, 0.1348, 1.0000, 1.0000],\n", + " [0.8626, 0.5018, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "tensor([[1., 1., 1., 1.],\n", + " [0., 1., 0., 0.]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 1.0 CO conversion, 0.7 methane, 0.9 paraffin, 0.6 light oleffins. Option B: regime of -0.0 CO conversion, 0.0 methane, -0.0 paraffins, 0.1 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "tensor([[0.5156, 0.3450, 0.3222, 0.2297],\n", + " [0.8105, 0.0733, 0.0857, 0.8852]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "11\n", + "tensor([[1.0000, 0.4687, 1.0000, 1.0000],\n", + " [0.6251, 0.3936, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "tensor([[1.0000, 1.0000, 1.0000, 1.0000],\n", + " [0.7204, 1.0000, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 1.0 CO conversion, 0.7 methane, 0.9 paraffin, 0.6 light oleffins. Option B: regime of 1.0 CO conversion, 0.6 methane, 0.9 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "tensor([[0.7099, 0.5003, 0.1335, 0.1641],\n", + " [0.7801, 0.6903, 0.0329, 0.5920]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "12\n", + "tensor([[1.0000, 0.5965, 1.0000, 1.0000],\n", + " [1.0000, 0.3929, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "tensor([[0.6448, 1.0000, 1.0000, 1.0000],\n", + " [1.0000, 1.0000, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 1.0 CO conversion, 0.6 methane, 0.8 paraffin, 0.6 light oleffins. Option B: regime of 1.0 CO conversion, 0.7 methane, 0.9 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "tensor([[0.8778, 0.1557, 0.2553, 0.6148],\n", + " [0.4871, 0.9949, 0.4758, 0.2973]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step\n", + "13\n", + "tensor([[1.0000, 0.4680, 1.0000, 1.0000],\n", + " [1.0000, 0.8591, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "tensor([[1.0000, 0.6703, 1.0000, 1.0000],\n", + " [1.0000, 1.0000, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 1.0 CO conversion, 0.6 methane, 0.9 paraffin, 0.6 light oleffins. Option B: regime of 1.0 CO conversion, 0.7 methane, 0.9 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "tensor([[0.3469, 0.6731, 0.7004, 0.0488],\n", + " [0.9098, 0.6898, 0.1757, 0.0534]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "14\n", + "tensor([[1.0000, 0.5527, 1.0000, 1.0000],\n", + " [1.0000, 1.0000, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[1., 1., 1., 1.],\n", + " [1., 0., 0., 1.]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 1.0 CO conversion, 0.7 methane, 0.9 paraffin, 0.6 light oleffins. Option B: regime of 0.0 CO conversion, -0.0 methane, -0.0 paraffins, 0.0 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[0.9101, 0.0877, 0.3781, 0.3361],\n", + " [0.7931, 0.8255, 0.3934, 0.2959]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "15\n", + "tensor([[1.0000, 1.0000, 1.0000, 1.0000],\n", + " [0.6257, 1.0000, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "tensor([[1.0000, 1.0000, 1.0000, 0.5991],\n", + " [1.0000, 1.0000, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 1.0 CO conversion, 0.7 methane, 0.7 paraffin, 0.7 light oleffins. Option B: regime of 1.0 CO conversion, 0.7 methane, 0.9 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "tensor([[0.6470, 0.0723, 0.9074, 0.2030],\n", + " [0.1599, 0.1590, 0.9710, 0.3702]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "16\n", + "tensor([[1.0000, 0.6570, 1.0000, 1.0000],\n", + " [1.0000, 1.0000, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "tensor([[1., 1., 1., 1.],\n", + " [0., 1., 1., 1.]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 23ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 1.0 CO conversion, 0.7 methane, 0.9 paraffin, 0.6 light oleffins. Option B: regime of 1.0 CO conversion, 0.5 methane, 0.6 paraffins, 0.7 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[0.2117, 0.3380, 0.9604, 0.3309],\n", + " [0.3866, 0.3971, 0.8446, 0.0320]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "17\n", + "tensor([[1., 1., 1., 0.],\n", + " [1., 1., 1., 1.]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[1., 1., 1., 1.],\n", + " [0., 1., 1., 0.]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 1.0 CO conversion, 0.7 methane, 0.9 paraffin, 0.6 light oleffins. Option B: regime of 0.5 CO conversion, 0.7 methane, 0.1 paraffins, 0.9 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[0.4663, 0.0035, 0.4408, 0.1505],\n", + " [0.4109, 0.9005, 0.8109, 0.7674]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "18\n", + "tensor([[1.0000, 1.0000, 1.0000, 1.0000],\n", + " [1.0000, 1.0000, 1.0000, 0.5997]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[1.0000, 1.0000, 1.0000, 0.6505],\n", + " [1.0000, 1.0000, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 1.0 CO conversion, 0.7 methane, 0.7 paraffin, 0.7 light oleffins. Option B: regime of 1.0 CO conversion, 0.7 methane, 0.9 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "tensor([[0.1265, 0.4509, 0.7086, 0.6109],\n", + " [0.9087, 0.8497, 0.0846, 0.7654]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "19\n", + "tensor([[1., 0., 0., 1.],\n", + " [1., 1., 1., 1.]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[0.7527, 1.0000, 1.0000, 1.0000],\n", + " [1.0000, 1.0000, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 1.0 CO conversion, 0.6 methane, 0.9 paraffin, 0.6 light oleffins. Option B: regime of 1.0 CO conversion, 0.7 methane, 0.9 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[0.7915, 0.4321, 0.5067, 0.7510],\n", + " [0.1985, 0.3006, 0.3991, 0.8089]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "20\n", + "tensor([[1., 1., 1., 1.],\n", + " [0., 0., 0., 0.]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[0., 0., 0., 1.],\n", + " [1., 1., 1., 1.]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of -0.0 CO conversion, -0.0 methane, -0.0 paraffin, 0.0 light oleffins. Option B: regime of 1.0 CO conversion, 0.7 methane, 0.9 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[0.4354, 0.0817, 0.2798, 0.8164],\n", + " [0.9257, 0.6359, 0.9672, 0.2769]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 23ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.7 CO conversion, 0.1 methane, 0.1 paraffin, 0.6 light oleffins. Option B: regime of 0.1 CO conversion, 0.0 methane, 0.0 paraffins, 0.1 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.1 CO conversion, 0.0 methane, 0.0 paraffin, 0.1 light oleffins. Option B: regime of 0.7 CO conversion, 0.1 methane, 0.1 paraffins, 0.5 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.7 CO conversion, 0.1 methane, 0.1 paraffin, 0.6 light oleffins. Option B: regime of 0.7 CO conversion, 0.1 methane, 0.1 paraffins, 0.5 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.6 CO conversion, 0.0 methane, 0.1 paraffin, 0.4 light oleffins. Option B: regime of 0.7 CO conversion, 0.1 methane, 0.1 paraffins, 0.5 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.2 CO conversion, 0.0 methane, 0.0 paraffin, 0.2 light oleffins. Option B: regime of 0.1 CO conversion, 0.0 methane, 0.0 paraffins, 0.1 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.2 CO conversion, 0.0 methane, 0.0 paraffin, 0.2 light oleffins. Option B: regime of 0.7 CO conversion, 0.1 methane, 0.1 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.2 CO conversion, 0.0 methane, 0.0 paraffin, 0.2 light oleffins. Option B: regime of 0.7 CO conversion, 0.1 methane, 0.1 paraffins, 0.5 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.6 CO conversion, 0.0 methane, 0.1 paraffin, 0.4 light oleffins. Option B: regime of 0.1 CO conversion, 0.0 methane, 0.0 paraffins, 0.1 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.2 CO conversion, 0.0 methane, 0.0 paraffin, 0.2 light oleffins. Option B: regime of 0.6 CO conversion, 0.0 methane, 0.1 paraffins, 0.4 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.6 CO conversion, 0.0 methane, 0.1 paraffin, 0.4 light oleffins. Option B: regime of 0.7 CO conversion, 0.1 methane, 0.1 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 24ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 18ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "1\n", + "tensor([[0.6082, 0.3735, 0.5196, 0.8198],\n", + " [0.7911, 0.2389, 0.5985, 0.5188]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "tensor([[0.0444, 0.2079, 0.2379, 0.1920],\n", + " [0.0000, 1.0000, 0.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 23ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.2 CO conversion, 0.0 methane, 0.0 paraffin, 0.2 light oleffins. Option B: regime of 0.0 CO conversion, -0.0 methane, -0.0 paraffins, 0.0 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "tensor([[0.3912, 0.5473, 0.0571, 0.5511],\n", + " [0.0633, 0.5066, 0.4173, 0.3432]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "2\n", + "tensor([[0.4269, 0.3608, 0.5881, 0.7595],\n", + " [0.8308, 0.3706, 0.4788, 0.8738]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "tensor([[0.1080, 0.0000, 0.3048, 0.4557],\n", + " [0.0000, 0.3403, 0.1779, 0.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.3 CO conversion, 0.0 methane, 0.0 paraffin, 0.2 light oleffins. Option B: regime of 0.1 CO conversion, 0.0 methane, -0.0 paraffins, 0.2 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "tensor([[0.8680, 0.6853, 0.2461, 0.8899],\n", + " [0.2462, 0.7710, 0.5607, 0.2799]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "3\n", + "tensor([[0.7890, 0.3600, 0.4937, 0.8556],\n", + " [0.9999, 0.8352, 0.3871, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "tensor([[0.0440, 0.0000, 0.4585, 0.2577],\n", + " [0.1396, 0.0042, 0.1614, 0.5909]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.5 CO conversion, 0.0 methane, 0.0 paraffin, 0.4 light oleffins. Option B: regime of 0.1 CO conversion, 0.0 methane, 0.0 paraffins, 0.1 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "tensor([[0.2055, 0.2223, 0.6247, 0.9686],\n", + " [0.3349, 0.2596, 0.7789, 0.4221]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "4\n", + "tensor([[0.9599, 0.3802, 0.5507, 1.0000],\n", + " [0.6848, 0.4103, 0.4459, 0.7565]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "tensor([[0.1190, 0.0000, 0.3695, 0.0348],\n", + " [0.0000, 0.0539, 0.4695, 0.5708]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.3 CO conversion, 0.0 methane, 0.0 paraffin, 0.4 light oleffins. Option B: regime of 0.5 CO conversion, 0.0 methane, 0.1 paraffins, 0.4 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "tensor([[0.0677, 0.0746, 0.5617, 0.7099],\n", + " [0.0694, 0.2303, 0.8347, 0.6851]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "5\n", + "tensor([[0.9448, 0.3945, 0.5446, 1.0000],\n", + " [0.0000, 1.0000, 1.0000, 0.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "tensor([[0.1962, 0.0000, 0.3199, 0.2231],\n", + " [0.0000, 0.0000, 0.4613, 0.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.3 CO conversion, 0.0 methane, 0.0 paraffin, 0.3 light oleffins. Option B: regime of 0.3 CO conversion, 0.0 methane, 0.0 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "tensor([[0.7869, 0.2817, 0.4980, 0.2046],\n", + " [0.3264, 0.5608, 0.3680, 0.9267]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "6\n", + "tensor([[0.9379, 0.4296, 0.7420, 1.0000],\n", + " [1.0000, 0.3803, 0.4536, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 20ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step\n", + "tensor([[0.1176, 0.0000, 0.2286, 0.0000],\n", + " [0.1938, 0.0000, 0.4111, 0.3015]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.1 CO conversion, 0.0 methane, 0.0 paraffin, 0.2 light oleffins. Option B: regime of 0.4 CO conversion, 0.0 methane, 0.0 paraffins, 0.4 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "tensor([[0.8957, 0.3233, 0.7760, 0.5090],\n", + " [0.5851, 0.1007, 0.9967, 0.4309]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 23ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "7\n", + "tensor([[0.8982, 0.4899, 0.6891, 1.0000],\n", + " [1.0000, 0.2540, 0.9589, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "tensor([[0.0000, 0.0000, 0.2307, 0.2060],\n", + " [0.2154, 0.0000, 0.3078, 0.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.2 CO conversion, 0.0 methane, 0.0 paraffin, 0.2 light oleffins. Option B: regime of 0.2 CO conversion, 0.0 methane, 0.0 paraffins, 0.4 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "tensor([[0.6695, 0.3013, 0.3241, 0.6659],\n", + " [0.9829, 0.1634, 0.2829, 0.4403]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 18ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "8\n", + "tensor([[1.0000, 0.0393, 1.0000, 1.0000],\n", + " [1.0000, 0.3716, 0.9979, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 20ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "tensor([[0.0000, 1.0000, 1.0000, 1.0000],\n", + " [0.0507, 0.0000, 0.2545, 0.1678]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 21ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 1.0 CO conversion, 0.5 methane, 0.6 paraffin, 0.7 light oleffins. Option B: regime of 0.2 CO conversion, 0.0 methane, 0.0 paraffins, 0.2 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "tensor([[0.2164, 0.5710, 0.0429, 0.9224],\n", + " [0.4430, 0.1435, 0.6459, 0.4312]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "9\n", + "tensor([[1.0000, 1.0000, 1.0000, 0.0000],\n", + " [1.0000, 0.3413, 0.9822, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "tensor([[0.0509, 0.0411, 0.2054, 0.1555],\n", + " [0.0000, 1.0000, 1.0000, 0.9751]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.1 CO conversion, 0.0 methane, 0.0 paraffin, 0.2 light oleffins. Option B: regime of 1.0 CO conversion, 0.5 methane, 0.6 paraffins, 0.7 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "tensor([[0.9156, 0.4084, 0.6375, 0.8703],\n", + " [0.9862, 0.3771, 0.8837, 0.5816]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 22ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "10\n", + "tensor([[1.0000, 0.4455, 1.0000, 0.6772],\n", + " [1.0000, 0.3223, 0.9679, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "tensor([[0.0554, 0.0000, 0.0000, 0.1192],\n", + " [0.0318, 0.1852, 0.5647, 0.2103]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.0 CO conversion, -0.0 methane, 0.0 paraffin, 0.0 light oleffins. Option B: regime of 0.6 CO conversion, 0.0 methane, 0.1 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "tensor([[0.7495, 0.2078, 0.6720, 0.4356],\n", + " [0.6617, 0.2900, 0.0998, 0.1312]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "11\n", + "tensor([[1.0000, 0.3943, 1.0000, 0.8229],\n", + " [1.0000, 0.6718, 1.0000, 0.4640]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "tensor([[0.0520, 0.0000, 0.0598, 0.1303],\n", + " [0.1185, 0.0000, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.0 CO conversion, 0.0 methane, 0.0 paraffin, 0.1 light oleffins. Option B: regime of 1.0 CO conversion, 0.3 methane, 0.6 paraffins, 0.7 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "tensor([[0.5246, 0.4095, 0.1039, 0.0574],\n", + " [0.4033, 0.4359, 0.4100, 0.0575]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "12\n", + "tensor([[1.0000, 0.4478, 1.0000, 1.0000],\n", + " [1.0000, 0.3677, 1.0000, 0.6744]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "tensor([[0.0530, 0.0000, 0.0523, 0.1331],\n", + " [0.0000, 1.0000, 1.0000, 0.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.0 CO conversion, -0.0 methane, 0.0 paraffin, 0.0 light oleffins. Option B: regime of 0.5 CO conversion, 0.7 methane, 0.1 paraffins, 0.9 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "tensor([[0.7350, 0.1519, 0.1232, 0.9347],\n", + " [0.1101, 0.4343, 0.2923, 0.9227]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 21ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "13\n", + "tensor([[1.0000, 0.4323, 1.0000, 0.9441],\n", + " [0.5546, 0.4667, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "tensor([[0.0524, 0.0000, 0.0339, 0.1338],\n", + " [0.0000, 1.0000, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.0 CO conversion, -0.0 methane, 0.0 paraffin, 0.0 light oleffins. Option B: regime of 1.0 CO conversion, 0.5 methane, 0.6 paraffins, 0.7 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 25ms/step\n", + "tensor([[0.5005, 0.5854, 0.6256, 0.9031],\n", + " [0.5839, 0.3239, 0.6793, 0.2186]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 21ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "14\n", + "tensor([[1.0000, 0.4419, 1.0000, 0.9380],\n", + " [0.0000, 1.0000, 0.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 25ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[1.0000, 1.0000, 0.0000, 1.0000],\n", + " [0.0532, 0.0000, 0.1018, 0.1447]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.1 CO conversion, -0.0 methane, 0.0 paraffin, 0.0 light oleffins. Option B: regime of 0.1 CO conversion, 0.0 methane, 0.0 paraffins, 0.1 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[0.9602, 0.5366, 0.9961, 0.6156],\n", + " [0.9453, 0.9278, 0.0870, 0.0119]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "15\n", + "tensor([[1.0000, 0.5256, 1.0000, 1.0000],\n", + " [1.0000, 0.3675, 1.0000, 0.8792]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 25ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[0.0000, 0.0302, 0.1073, 0.1433],\n", + " [1.0000, 1.0000, 0.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 31ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.1 CO conversion, 0.0 methane, 0.0 paraffin, 0.1 light oleffins. Option B: regime of 0.1 CO conversion, -0.0 methane, 0.0 paraffins, 0.0 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[0.8312, 0.2366, 0.8058, 0.1371],\n", + " [0.4488, 0.2742, 0.2944, 0.5531]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 20ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "16\n", + "tensor([[1.0000, 0.4887, 1.0000, 1.0000],\n", + " [0.0000, 1.0000, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "tensor([[1.0000, 1.0000, 0.0000, 1.0000],\n", + " [0.0000, 0.0000, 0.1047, 0.1176]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.1 CO conversion, -0.0 methane, 0.0 paraffin, 0.0 light oleffins. Option B: regime of 0.1 CO conversion, 0.0 methane, 0.0 paraffins, 0.1 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "tensor([[0.5232, 0.0053, 0.6012, 0.8333],\n", + " [0.0284, 0.1417, 0.9576, 0.1762]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 19ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "17\n", + "tensor([[1.0000, 0.6125, 1.0000, 1.0000],\n", + " [1.0000, 0.4068, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "tensor([[0.0000, 0.0000, 0.1043, 0.1180],\n", + " [1.0000, 1.0000, 0.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.1 CO conversion, 0.0 methane, 0.0 paraffin, 0.1 light oleffins. Option B: regime of 0.1 CO conversion, -0.0 methane, 0.0 paraffins, 0.0 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[0.2521, 0.1333, 0.3195, 0.2187],\n", + " [0.6494, 0.1933, 0.8217, 0.4500]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "18\n", + "tensor([[1.0000, 0.7642, 1.0000, 1.0000],\n", + " [1.0000, 0.4989, 1.0000, 0.9951]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "tensor([[0.0000, 0.3686, 0.0000, 0.5195],\n", + " [1.0000, 1.0000, 0.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 18ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.0 CO conversion, -0.0 methane, 0.0 paraffin, 0.0 light oleffins. Option B: regime of 0.1 CO conversion, -0.0 methane, 0.0 paraffins, 0.0 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[0.9282, 0.0251, 0.3828, 0.9332],\n", + " [0.7672, 0.6956, 0.9584, 0.3137]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "19\n", + "tensor([[1.0000, 0.6292, 1.0000, 0.9912],\n", + " [1.0000, 1.0000, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "tensor([[1.0000, 1.0000, 0.5158, 1.0000],\n", + " [1.0000, 1.0000, 0.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.8 CO conversion, 0.1 methane, 0.2 paraffin, 0.5 light oleffins. Option B: regime of 0.1 CO conversion, -0.0 methane, 0.0 paraffins, 0.0 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "tensor([[0.4905, 0.5749, 0.4102, 0.1215],\n", + " [0.3458, 0.1397, 0.1100, 0.8460]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "20\n", + "tensor([[0.7199, 1.0000, 1.0000, 1.0000],\n", + " [1.0000, 0.9561, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "tensor([[1.0000, 1.0000, 0.0000, 1.0000],\n", + " [1.0000, 1.0000, 0.6722, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.1 CO conversion, -0.0 methane, 0.0 paraffin, 0.0 light oleffins. Option B: regime of 1.0 CO conversion, 0.2 methane, 0.4 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[0.6402, 0.6727, 0.4438, 0.5870],\n", + " [0.9443, 0.0318, 0.0154, 0.1177]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 23ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 18ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.2 CO conversion, 0.0 methane, 0.0 paraffin, 0.1 light oleffins. Option B: regime of 0.9 CO conversion, 0.2 methane, 0.3 paraffins, 0.8 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.2 CO conversion, 0.0 methane, 0.0 paraffin, 0.1 light oleffins. Option B: regime of 0.1 CO conversion, 0.0 methane, 0.0 paraffins, 0.1 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.9 CO conversion, 0.1 methane, 0.3 paraffin, 0.7 light oleffins. Option B: regime of 0.8 CO conversion, 0.2 methane, 0.2 paraffins, 0.9 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.9 CO conversion, 0.2 methane, 0.3 paraffin, 0.8 light oleffins. Option B: regime of 0.8 CO conversion, 0.2 methane, 0.2 paraffins, 0.9 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.9 CO conversion, 0.1 methane, 0.3 paraffin, 0.7 light oleffins. Option B: regime of 0.9 CO conversion, 0.2 methane, 0.3 paraffins, 0.8 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.9 CO conversion, 0.1 methane, 0.3 paraffin, 0.7 light oleffins. Option B: regime of 0.2 CO conversion, 0.0 methane, 0.0 paraffins, 0.1 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.2 CO conversion, 0.0 methane, 0.0 paraffin, 0.1 light oleffins. Option B: regime of 0.8 CO conversion, 0.2 methane, 0.2 paraffins, 0.9 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.9 CO conversion, 0.1 methane, 0.3 paraffin, 0.7 light oleffins. Option B: regime of 0.1 CO conversion, 0.0 methane, 0.0 paraffins, 0.1 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.1 CO conversion, 0.0 methane, 0.0 paraffin, 0.1 light oleffins. Option B: regime of 0.9 CO conversion, 0.2 methane, 0.3 paraffins, 0.8 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.1 CO conversion, 0.0 methane, 0.0 paraffin, 0.1 light oleffins. Option B: regime of 0.8 CO conversion, 0.2 methane, 0.2 paraffins, 0.9 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "1\n", + "tensor([[0.8023, 0.2357, 0.8002, 0.5678],\n", + " [1.0000, 0.0000, 0.6578, 0.6086]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "tensor([[0.9317, 0.1886, 0.4910, 0.5372],\n", + " [0.9057, 0.0000, 0.8971, 0.5919]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.7 CO conversion, 0.0 methane, 0.1 paraffin, 0.5 light oleffins. Option B: regime of 0.9 CO conversion, 0.3 methane, 0.5 paraffins, 0.8 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "tensor([[0.5744, 0.8515, 0.5829, 0.1763],\n", + " [0.0864, 0.4500, 0.0437, 0.0554]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 27ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "2\n", + "tensor([[0.7201, 0.0000, 0.7756, 0.5372],\n", + " [0.8823, 0.4629, 0.8181, 0.5914]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "tensor([[0.9728, 0.3941, 0.5730, 0.5540],\n", + " [0.8933, 0.0000, 0.3822, 0.5133]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.8 CO conversion, 0.1 methane, 0.2 paraffin, 0.6 light oleffins. Option B: regime of 0.5 CO conversion, 0.0 methane, 0.1 paraffins, 0.3 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "tensor([[0.3293, 0.9207, 0.5022, 0.6772],\n", + " [0.4844, 0.3178, 0.8879, 0.0973]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "3\n", + "tensor([[0.8907, 0.3180, 0.9579, 0.6641],\n", + " [0.8496, 0.4733, 0.7207, 0.5302]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "tensor([[0.0000, 1.0000, 0.2609, 1.0000],\n", + " [0.9028, 0.0424, 0.4007, 0.5158]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.3 CO conversion, 0.0 methane, 0.1 paraffin, 0.1 light oleffins. Option B: regime of 0.5 CO conversion, 0.0 methane, 0.1 paraffins, 0.4 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "tensor([[0.8547, 0.0900, 0.4030, 0.1390],\n", + " [0.0382, 0.0690, 0.6727, 0.2978]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step\n", + "4\n", + "tensor([[0.8520, 0.3809, 0.9019, 0.8380],\n", + " [0.8989, 0.3349, 1.0000, 0.5436]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "tensor([[0.0000, 1.0000, 0.2735, 1.0000],\n", + " [1.0000, 0.0000, 0.5551, 0.6397]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.3 CO conversion, 0.0 methane, 0.1 paraffin, 0.2 light oleffins. Option B: regime of 0.8 CO conversion, 0.1 methane, 0.2 paraffins, 0.5 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "tensor([[0.1957, 0.8582, 0.2445, 0.8995],\n", + " [0.5101, 0.8579, 0.4598, 0.1437]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "5\n", + "tensor([[0.2079, 1.0000, 1.0000, 0.1858],\n", + " [0.8903, 0.3474, 1.0000, 0.5715]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step\n", + "tensor([[0.0000, 1.0000, 0.5300, 1.0000],\n", + " [0.0000, 1.0000, 0.0058, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.7 CO conversion, 0.1 methane, 0.1 paraffin, 0.4 light oleffins. Option B: regime of 0.0 CO conversion, -0.0 methane, -0.0 paraffins, 0.0 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "tensor([[0.2939, 0.0567, 0.5847, 0.5208],\n", + " [0.0944, 0.9922, 0.1282, 0.0941]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step\n", + "6\n", + "tensor([[0.8738, 0.2007, 1.0000, 0.5825],\n", + " [1.0000, 0.7337, 1.0000, 0.5885]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "tensor([[0.0000, 0.4635, 0.5010, 1.0000],\n", + " [0.0000, 1.0000, 0.4929, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.6 CO conversion, 0.0 methane, 0.1 paraffin, 0.4 light oleffins. Option B: regime of 0.6 CO conversion, 0.1 methane, 0.1 paraffins, 0.4 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "tensor([[0.4316, 0.1969, 0.4051, 0.8216],\n", + " [0.5707, 0.5107, 0.7076, 0.7988]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 23ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "7\n", + "tensor([[0.0000, 1.0000, 1.0000, 0.8446],\n", + " [1.0000, 0.6609, 1.0000, 0.5850]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 19ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step\n", + "tensor([[0.0000, 0.7624, 0.4672, 1.0000],\n", + " [1.0000, 0.3509, 0.0000, 0.3374]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 22ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.5 CO conversion, 0.0 methane, 0.1 paraffin, 0.3 light oleffins. Option B: regime of 0.1 CO conversion, 0.0 methane, 0.0 paraffins, 0.0 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 18ms/step\n", + "tensor([[0.7346, 0.6469, 0.8496, 0.0559],\n", + " [0.7337, 0.2927, 0.0937, 0.2998]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "8\n", + "tensor([[1.0000, 0.4944, 1.0000, 0.5482],\n", + " [1.0000, 1.0000, 1.0000, 0.6739]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "tensor([[0.0000, 0.5592, 0.3663, 1.0000],\n", + " [0.0000, 0.4825, 0.7902, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.4 CO conversion, 0.0 methane, 0.1 paraffin, 0.2 light oleffins. Option B: regime of 0.9 CO conversion, 0.2 methane, 0.3 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "tensor([[0.5093, 0.9102, 0.5105, 0.9909],\n", + " [0.1171, 0.2166, 0.7476, 0.4343]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "9\n", + "tensor([[1.0000, 1.0000, 1.0000, 0.7764],\n", + " [1.0000, 1.0000, 1.0000, 0.5455]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "tensor([[0.0000, 0.7752, 0.3962, 1.0000],\n", + " [0.0000, 0.0910, 0.4058, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.4 CO conversion, 0.0 methane, 0.1 paraffin, 0.3 light oleffins. Option B: regime of 0.4 CO conversion, 0.0 methane, 0.1 paraffins, 0.2 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 18ms/step\n", + "tensor([[0.5406, 0.0339, 0.9453, 0.4274],\n", + " [0.6097, 0.2809, 0.3141, 0.3975]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 20ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "10\n", + "tensor([[1.0000, 1.0000, 1.0000, 0.7396],\n", + " [0.0000, 1.0000, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "tensor([[0.0000, 0.0000, 0.4441, 0.6787],\n", + " [0.0000, 0.0976, 0.4311, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.4 CO conversion, 0.0 methane, 0.1 paraffin, 0.3 light oleffins. Option B: regime of 0.4 CO conversion, 0.0 methane, 0.1 paraffins, 0.3 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "tensor([[0.3779, 0.8208, 0.9029, 0.7225],\n", + " [0.0860, 0.8856, 0.5599, 0.3403]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 18ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 25ms/step\n", + "11\n", + "tensor([[1.0000, 1.0000, 1.0000, 0.7512],\n", + " [0.0000, 0.0000, 0.0000, 0.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "tensor([[0.0000, 0.3522, 0.4203, 1.0000],\n", + " [0.0000, 0.0000, 0.4334, 0.6646]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.4 CO conversion, 0.0 methane, 0.1 paraffin, 0.3 light oleffins. Option B: regime of 0.4 CO conversion, 0.0 methane, 0.1 paraffins, 0.3 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "tensor([[0.9922, 0.7745, 0.7816, 0.6305],\n", + " [0.8718, 0.9861, 0.2279, 0.5788]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "12\n", + "tensor([[0.0000, 0.0000, 1.0000, 0.0000],\n", + " [1.0000, 1.0000, 1.0000, 0.7565]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "tensor([[0.0000, 0.8422, 0.3830, 1.0000],\n", + " [0.0000, 0.0937, 0.4292, 0.9290]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.4 CO conversion, 0.0 methane, 0.1 paraffin, 0.3 light oleffins. Option B: regime of 0.4 CO conversion, 0.0 methane, 0.1 paraffins, 0.3 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "tensor([[0.8434, 0.8640, 0.9557, 0.3423],\n", + " [0.8195, 0.0046, 0.9713, 0.3393]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 28ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 19ms/step\n", + "13\n", + "tensor([[1.0000, 0.9605, 1.0000, 0.6761],\n", + " [1.0000, 1.0000, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "tensor([[1.0000, 1.0000, 0.0000, 0.0000],\n", + " [0.0000, 0.7336, 0.3614, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 18ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.0 CO conversion, 0.0 methane, 0.0 paraffin, 0.1 light oleffins. Option B: regime of 0.4 CO conversion, 0.0 methane, 0.1 paraffins, 0.2 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "tensor([[0.1841, 0.5638, 0.8196, 0.2851],\n", + " [0.5036, 0.7470, 0.3680, 0.8596]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "14\n", + "tensor([[1.0000, 1.0000, 1.0000, 0.9782],\n", + " [1.0000, 0.4533, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 20ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "tensor([[0.0000, 1.0000, 0.3419, 1.0000],\n", + " [0.0000, 0.3831, 0.4260, 0.9827]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.4 CO conversion, 0.0 methane, 0.1 paraffin, 0.2 light oleffins. Option B: regime of 0.4 CO conversion, 0.0 methane, 0.1 paraffins, 0.3 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "tensor([[0.6614, 0.5113, 0.0564, 0.8854],\n", + " [0.0797, 0.3407, 0.7806, 0.5182]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "15\n", + "tensor([[0.0000, 0.0000, 1.0000, 1.0000],\n", + " [1.0000, 1.0000, 1.0000, 0.9738]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[0.0000, 0.4998, 0.4293, 1.0000],\n", + " [0.0000, 1.0000, 0.3224, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.5 CO conversion, 0.0 methane, 0.1 paraffin, 0.3 light oleffins. Option B: regime of 0.3 CO conversion, 0.0 methane, 0.1 paraffins, 0.2 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[0.2359, 0.1579, 0.8917, 0.8797],\n", + " [0.3666, 0.4159, 0.0079, 0.1797]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "16\n", + "tensor([[1.0000, 1.0000, 1.0000, 1.0000],\n", + " [1.0000, 1.0000, 1.0000, 0.7440]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[0.0000, 0.7121, 0.3842, 1.0000],\n", + " [0.5074, 0.3489, 0.4852, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.4 CO conversion, 0.0 methane, 0.1 paraffin, 0.3 light oleffins. Option B: regime of 0.6 CO conversion, 0.0 methane, 0.2 paraffins, 0.4 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[0.5890, 0.4277, 0.1120, 0.4373],\n", + " [0.8072, 0.4039, 0.5447, 0.2787]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 20ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "17\n", + "tensor([[0.6922, 1.0000, 1.0000, 1.0000],\n", + " [1.0000, 1.0000, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 23ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[0.0000, 0.5016, 0.3363, 1.0000],\n", + " [0.0000, 1.0000, 0.4521, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.3 CO conversion, 0.0 methane, 0.1 paraffin, 0.2 light oleffins. Option B: regime of 0.5 CO conversion, 0.0 methane, 0.1 paraffins, 0.3 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[0.5522, 0.4377, 0.9668, 0.6844],\n", + " [0.8039, 0.1263, 0.6794, 0.4442]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "18\n", + "tensor([[1., 1., 1., 1.],\n", + " [0., 1., 0., 0.]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 26ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[0.0000, 0.6656, 0.3425, 0.6943],\n", + " [0.0000, 0.5615, 0.3668, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.3 CO conversion, 0.0 methane, 0.1 paraffin, 0.2 light oleffins. Option B: regime of 0.4 CO conversion, 0.0 methane, 0.1 paraffins, 0.2 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "tensor([[0.1184, 0.0370, 0.7243, 0.8308],\n", + " [0.6964, 0.7035, 0.2314, 0.2337]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 29ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 3ms/step \n", + "19\n", + "tensor([[1., 1., 1., 1.],\n", + " [0., 0., 1., 0.]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 25ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "tensor([[0.0000, 0.4573, 0.2613, 1.0000],\n", + " [0.0000, 0.6333, 0.4409, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.2 CO conversion, 0.0 methane, 0.1 paraffin, 0.1 light oleffins. Option B: regime of 0.5 CO conversion, 0.0 methane, 0.1 paraffins, 0.3 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "tensor([[0.4208, 0.8449, 0.5509, 0.1151],\n", + " [0.2767, 0.3080, 0.5045, 0.8988]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "20\n", + "tensor([[0., 0., 1., 1.],\n", + " [1., 1., 1., 1.]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 24ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "tensor([[0.0000, 0.6302, 0.3704, 1.0000],\n", + " [0.0000, 0.2622, 0.1968, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.4 CO conversion, 0.0 methane, 0.1 paraffin, 0.2 light oleffins. Option B: regime of 0.1 CO conversion, 0.0 methane, 0.0 paraffins, 0.1 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[0.1490, 0.3782, 0.1752, 0.4555],\n", + " [0.9655, 0.2335, 0.0275, 0.4770]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n" + ] + } + ], + "source": [ + "#two algorithms to compare\n", + "algos = [\"EUBO\",\"EUBO-LLM\", \"rand\"]\n", + "#number of repetitions of the BO cycle\n", + "NUM_TRIALS = 3 if not SMOKE_TEST else 2\n", + "#number of cycles\n", + "NUM_BATCHES = 20 if not SMOKE_TEST else 2\n", + "\n", + "#dimension number= 4 inputs\n", + "dim = 4\n", + "#sampler options\n", + "NUM_RESTARTS = 3\n", + "RAW_SAMPLES = 512 if not SMOKE_TEST else 8\n", + "#\n", + "q_eubo = 2 # number of points per query\n", + "q_data=5\n", + "q_comp = 10 # number of comparisons per query\n", + "q_comp_2=1\n", + "\n", + "# initial evals\n", + "best_vals = {} # best observed values\n", + "for algo in algos:\n", + " best_vals[algo] = []\n", + "\n", + "# average over multiple trials\n", + "for i in range(NUM_TRIALS):\n", + " torch.manual_seed(i)\n", + " np.random.seed(i)\n", + " data = {}\n", + " models = {}\n", + "\n", + " # X are within the unit cube\n", + " bounds = torch.stack([torch.zeros(dim), torch.ones(dim)])\n", + "\n", + " # Create initial data\n", + " init_X=ini(q_data,dim)\n", + " for algo in algos:\n", + " if algo == \"EUBO-LLM\":\n", + " init_y = generate_data(init_X, dim=dim)\n", + " comparisons = generate_comparisons_llm(init_y, q_comp)\n", + " if algo == \"EUBO\":\n", + " init_y = generate_data_u1(init_X, dim=dim)\n", + " comparisons = generate_comparisons(init_y, q_comp)\n", + " if algo == \"rand\":\n", + " init_y = generate_data_u1(init_X, dim=dim)\n", + " comparisons = generate_comparisons(init_y, q_comp)\n", + " \n", + " best_vals[algo].append([])\n", + " data[algo] = (init_X, comparisons)\n", + " _, models[algo] = init_and_fit_model(init_X, comparisons)\n", + "\n", + " best_next_y = utility2(init_X).max().item()\n", + " best_vals[algo][-1].append(best_next_y)\n", + "\n", + " # we make additional NUM_BATCHES comparison queries after the initial observation\n", + " for j in range(1, NUM_BATCHES + 1):\n", + " print(j)\n", + " for algo in algos:\n", + " model = models[algo]\n", + " if algo == \"EUBO-LLM\":\n", + " # create the acquisition function object\n", + " acq_func = AnalyticExpectedUtilityOfBestOption(pref_model=model)\n", + " # optimize and get new observation\n", + " next_X, acq_val = optimize_acqf(\n", + " acq_function=acq_func,\n", + " bounds=bounds,\n", + " q=q_eubo,\n", + " num_restarts=NUM_RESTARTS,\n", + " raw_samples=RAW_SAMPLES,\n", + " )\n", + " print(next_X)\n", + " # update data\n", + " X, comps = data[algo]\n", + " X, comps = make_new_data(X, next_X, comps, q_comp_2)\n", + " data[algo] = (X, comps)\n", + " \n", + " # refit models\n", + " _, models[algo] = init_and_fit_model(X, comps)\n", + " \n", + " # record the best observed values so far\n", + " max_val = utility2(X).max().item()\n", + " best_vals[algo][-1].append(max_val)\n", + " elif algo == \"EUBO\":\n", + " #create the acquisition function object\n", + " acq_func = AnalyticExpectedUtilityOfBestOption(pref_model=model)\n", + " # optimize and get new observation\n", + " next_X, acq_val = optimize_acqf(\n", + " acq_function=acq_func,\n", + " bounds=bounds,\n", + " q=q_eubo,\n", + " num_restarts=NUM_RESTARTS,\n", + " raw_samples=RAW_SAMPLES,\n", + " )\n", + " print(next_X)\n", + " # update data\n", + " X, comps = data[algo]\n", + " X, comps = make_new_data_u1(X, next_X, comps, q_comp_2)\n", + " data[algo] = (X, comps)\n", + " \n", + " # refit models\n", + " _, models[algo] = init_and_fit_model(X, comps)\n", + " \n", + " # record the best observed values so far\n", + " max_val = utility2(X).max().item()\n", + " best_vals[algo][-1].append(max_val)\n", + " else:\n", + " # randomly sample data\n", + " next_X= ini(q_eubo, dim=dim)\n", + " print(next_X)\n", + " # update data\n", + " X, comps = data[algo]\n", + " X, comps = make_new_data_u1(X, next_X, comps, q_comp_2)\n", + " data[algo] = (X, comps)\n", + " \n", + " # refit models\n", + " _, models[algo] = init_and_fit_model(X, comps)\n", + " \n", + " # record the best observed values so far\n", + " max_val = utility2(X).max().item()\n", + " best_vals[algo][-1].append(max_val)" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": {}, + "outputs": [], + "source": [ + "with open('best_vals_case_2.pkl', 'wb') as handle:\n", + " pickle.dump(best_vals, handle, protocol=pickle.HIGHEST_PROTOCOL)" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [], + "source": [ + "with open('best_vals_case_2.pkl', 'rb') as handle:\n", + " loaded_data = pickle.load(handle)" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'EUBO': [[0.6009751558303833,\n", + " 0.6886475086212158,\n", + " 1.112328052520752,\n", + " 1.1123279333114624,\n", + " 1.6158719062805176,\n", + " 1.6158720254898071,\n", + " 1.6489521265029907,\n", + " 1.7358803749084473,\n", + " 1.735879898071289,\n", + " 1.8323463201522827,\n", + " 1.8447742462158203,\n", + " 1.8793693780899048,\n", + " 1.9259097576141357,\n", + " 1.9872502088546753,\n", + " 2.002692699432373,\n", + " 2.0026936531066895,\n", + " 2.0026931762695312,\n", + " 2.0026936531066895,\n", + " 2.0026936531066895,\n", + " 2.0026931762695312,\n", + " 2.002692937850952],\n", + " [0.40567806363105774,\n", + " 0.4696243405342102,\n", + " 0.505540132522583,\n", + " 0.5055403709411621,\n", + " 0.6344783306121826,\n", + " 0.6344783306121826,\n", + " 1.077622413635254,\n", + " 1.6529359817504883,\n", + " 1.8301997184753418,\n", + " 1.8302001953125,\n", + " 1.8302001953125,\n", + " 1.8302001953125,\n", + " 1.8707122802734375,\n", + " 1.8707122802734375,\n", + " 1.8707122802734375,\n", + " 1.9014772176742554,\n", + " 1.9014772176742554,\n", + " 1.9309437274932861,\n", + " 1.9702214002609253,\n", + " 2.0026931762695312,\n", + " 2.002692937850952],\n", + " [0.6386717557907104,\n", + " 0.8689830303192139,\n", + " 1.0270394086837769,\n", + " 1.4135736227035522,\n", + " 1.4418411254882812,\n", + " 1.4687854051589966,\n", + " 1.6507188081741333,\n", + " 1.6507188081741333,\n", + " 1.7549494504928589,\n", + " 1.8390334844589233,\n", + " 1.8390334844589233,\n", + " 1.8390334844589233,\n", + " 1.8390334844589233,\n", + " 2.0026936531066895,\n", + " 2.0026936531066895,\n", + " 2.0026936531066895,\n", + " 2.0026936531066895,\n", + " 2.0026936531066895,\n", + " 2.0026936531066895,\n", + " 2.0026936531066895,\n", + " 2.0026936531066895]],\n", + " 'EUBO-LLM': [[0.6009751558303833,\n", + " 0.8451216220855713,\n", + " 0.8451216220855713,\n", + " 0.9048173427581787,\n", + " 1.622948408126831,\n", + " 1.622948408126831,\n", + " 2.0026931762695312,\n", + " 2.002692937850952,\n", + " 2.0026936531066895,\n", + " 2.0026931762695312,\n", + " 2.002692937850952,\n", + " 2.0026936531066895,\n", + " 2.0026931762695312,\n", + " 2.0026936531066895,\n", + " 2.0026936531066895,\n", + " 2.0026936531066895,\n", + " 2.0026936531066895,\n", + " 2.0026936531066895,\n", + " 2.0026936531066895,\n", + " 2.0026936531066895,\n", + " 2.0026936531066895],\n", + " [0.40567806363105774,\n", + " 0.40567806363105774,\n", + " 0.40567806363105774,\n", + " 0.40567806363105774,\n", + " 0.40567806363105774,\n", + " 0.40567806363105774,\n", + " 0.40567806363105774,\n", + " 0.40567806363105774,\n", + " 1.4555033445358276,\n", + " 1.455503225326538,\n", + " 1.455503225326538,\n", + " 1.455503225326538,\n", + " 1.455503225326538,\n", + " 1.4555033445358276,\n", + " 1.4555033445358276,\n", + " 1.4555033445358276,\n", + " 1.4555033445358276,\n", + " 1.4555033445358276,\n", + " 1.4555033445358276,\n", + " 1.4555033445358276,\n", + " 1.4555033445358276],\n", + " [0.6386717557907104,\n", + " 1.0306180715560913,\n", + " 1.0306179523468018,\n", + " 1.0306179523468018,\n", + " 1.0306179523468018,\n", + " 1.0306179523468018,\n", + " 1.0306179523468018,\n", + " 1.0306179523468018,\n", + " 1.0306179523468018,\n", + " 1.0306179523468018,\n", + " 1.0306179523468018,\n", + " 1.0306179523468018,\n", + " 1.0306179523468018,\n", + " 1.0306179523468018,\n", + " 1.0306179523468018,\n", + " 1.0306179523468018,\n", + " 1.0306179523468018,\n", + " 1.0306179523468018,\n", + " 1.0306179523468018,\n", + " 1.0306179523468018,\n", + " 1.0306179523468018]],\n", + " 'rand': [[0.6009751558303833,\n", + " 0.8344993591308594,\n", + " 0.8344993591308594,\n", + " 0.8344993591308594,\n", + " 0.8344993591308594,\n", + " 0.8344993591308594,\n", + " 0.8344993591308594,\n", + " 0.8344993591308594,\n", + " 0.8344993591308594,\n", + " 0.982996940612793,\n", + " 0.982996940612793,\n", + " 0.982996940612793,\n", + " 0.982996940612793,\n", + " 0.982996940612793,\n", + " 0.982996940612793,\n", + " 0.982996940612793,\n", + " 0.982996940612793,\n", + " 1.0077543258666992,\n", + " 1.0077545642852783,\n", + " 1.0077546834945679,\n", + " 1.2190179824829102],\n", + " [0.40567806363105774,\n", + " 0.40567806363105774,\n", + " 0.40567806363105774,\n", + " 0.5648194551467896,\n", + " 0.7507764101028442,\n", + " 0.7507762908935547,\n", + " 1.088616967201233,\n", + " 1.088616967201233,\n", + " 1.088616967201233,\n", + " 1.196665644645691,\n", + " 1.196665644645691,\n", + " 1.196665644645691,\n", + " 1.196665644645691,\n", + " 1.196665644645691,\n", + " 1.594987154006958,\n", + " 1.594987154006958,\n", + " 1.594987154006958,\n", + " 1.594987154006958,\n", + " 1.594987154006958,\n", + " 1.594987154006958,\n", + " 1.594987154006958],\n", + " [0.6386717557907104,\n", + " 0.6386717557907104,\n", + " 0.6386717557907104,\n", + " 0.6386717557907104,\n", + " 0.6386717557907104,\n", + " 0.6386717557907104,\n", + " 0.8080291152000427,\n", + " 0.8080291152000427,\n", + " 0.8080291152000427,\n", + " 0.9008201360702515,\n", + " 1.2043654918670654,\n", + " 1.2043654918670654,\n", + " 1.2645727396011353,\n", + " 1.2645727396011353,\n", + " 1.2645727396011353,\n", + " 1.2645727396011353,\n", + " 1.2645727396011353,\n", + " 1.368188500404358,\n", + " 1.368188500404358,\n", + " 1.368188500404358,\n", + " 1.368188500404358]]}" + ] + }, + "execution_count": 58, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "loaded_data" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 596 + }, + "id": "eRLF3-dFNzyW", + "outputId": "9c83df50-e355-42b9-860e-b4b51d63f2c5" + }, + "outputs": [ + { + "data": { + "image/png": "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KkuWLCpr1qyqRYsW6tatW0ne0ylTpqgcOXJo329PT0/1/fffa8sFBwerfv36KXd3d+Xo6Kjq1aun/P39tfv9/f1V3bp1lYODg3J0dFTly5dXx48f1/valFLq6tWrqlatWsra2loVK1ZMbd++Xe/ryUixsbHK0dFRLVmyJE3PA9S8efNUq1atlK2trSpYsKDasGGDdv+iRYuUs7OzznOSO94XLFig8uTJo+zt7dXAgQNVbGysmj59usqWLZtyd3dXkydPTlNeie9f4nG/Zs0aVbduXWVra6tKly6tDh06pDfPRYsWJTk2E4+j1/9fvvrqK1WoUCFla2ur8uXLp8aOHauio6OTvLbUWrBggSpevLiysrJS2bNnV4MGDdLuu3PnjmrRooWyt7dXjo6Oqn379urRo0dv/T4Cas6cOapJkybKxsZGeXl5qVWrVqU657f1+t9XosqVK6uBAwfqbCtatKj63//+l+q6U/N/n1Hn29Tkdfr0aaWUUnv27FGA2rlzp6pQoYKytbVV1apVU5cvX9abp4+PT5JjdM+ePUnqjY2NVb1791ZeXl7KxsZGFS5cWM2ePVsnl8TXlhp///23KlmypLKxsVFZs2ZVDRo0UC9evFBKKXXs2DHVsGFD5erqqpycnFTt2rXVyZMndZ4PqN9++001b95c2draqqJFi6pDhw6pa9euqTp16ig7OztVtWpVdf369SSv+7ffflO5c+dWtra2ql27dur58+epyjm9kjsuXxUVFaWsra3Vrl27MjSXd5n0ZItMZW5uzpQpU/jpp5+4f//+W9W1e/duHj58yL59+/juu+/w9fXlo48+wsXFhaNHjzJw4EAGDhzIvXv3dJ43cuRIvvzyS06fPk316tVp0aIFz549AxJ+Dq9Tpw5ly5blxIkTbN26lcePH9OhQwedOpYsWYKFhQUHDx7k999/15vfDz/8wKxZs5g5cyZnz57F29ubFi1acO3aNW2sEiVK8OWXXxIQEMCIESP01jNy5Ej27NnDunXr2L59O35+fpw8eTJN71VERAT16tXDwcGBffv2ceDAARwcHGjSpIlOT/yuXbu4dOkSO3bs4N9//01Sj1KK5s2b8+jRIzZv3szJkycpX748DRo0ICgoCICuXbuSO3dujh8/zsmTJ/nf//6HpaWl3rzi4+Np06YN5ubmHDlyhN9++42vv/76ja9n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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from matplotlib import pyplot as plt\n", + "\n", + "\n", + "%matplotlib inline\n", + "\n", + "plt.rcParams.update({\"font.size\": 14})\n", + "\n", + "algo_labels = {\n", + " \"rand\": \"Random Exploration\",\n", + " \"EUBO-LLM\": \"EUBO-LLM\",\n", + " \"EUBO\": \"EUBO\", \n", + "}\n", + "\n", + "\n", + "def ci(y):\n", + " return 1.96 * y.std(axis=0) / np.sqrt(y.shape[0])\n", + "\n", + "\n", + "# the utility function is maximized at the full vector of 1\n", + "#optimal_val = utility(torch.tensor([[1] * dim])).item()\n", + "iters = list(range(NUM_BATCHES + 1))\n", + "\n", + "fig, ax = plt.subplots(1, 1, figsize=(8, 6))\n", + "# plot the optimal value\n", + "#ax.plot(\n", + "# iters,\n", + "# [optimal_val] * len(iters),\n", + "# label=\"Optimal Function Value\",\n", + "# color=\"black\",\n", + "## linewidth=1.5,\n", + "#)\n", + "\n", + "# plot the the best observed value from each algorithm\n", + "for algo in algos:\n", + " ys = np.vstack(best_vals[algo])\n", + " ax.errorbar(\n", + " iters, ys.mean(axis=0), yerr=ci(ys), label=algo_labels[algo], linewidth=1.5\n", + " )\n", + "\n", + "ax.set(\n", + " #xlabel=f\"Number of queries q = {q_eubo}, num_initial_comp = {q_comp}, num_initial_samp = {q_data})\",\n", + " ylabel=\"Best observed value\\nas evaluated in the synthetic utility function\",\n", + " title=f\"Obj 2: only maximising CO conversion\",\n", + ")\n", + "\n", + "ax.set_xticks(np.arange(0, NUM_BATCHES + 1, 1))\n", + "\n", + "ax.set_xlabel(f\"Number of queries q = {q_eubo}, num_initial_comp = {q_comp}, num_initial_samp = {q_data})\", fontsize=10) # Reducing the font size\n", + "ax.legend(loc=\"best\")\n", + "plt.savefig(\"comparison_first_case_2_corrected.png\",bbox_inches=\"tight\", dpi=400)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "47P-W6iDOiHp" + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python [conda env:botorch_mar2024]", + "language": "python", + "name": "conda-env-botorch_mar2024-py" + }, + "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.11.0" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/data/.ipynb_checkpoints/preferentialBO_llm_multiplot_correction_case_3-checkpoint.ipynb b/data/.ipynb_checkpoints/preferentialBO_llm_multiplot_correction_case_3-checkpoint.ipynb index 227a01a..54da3a5 100644 --- a/data/.ipynb_checkpoints/preferentialBO_llm_multiplot_correction_case_3-checkpoint.ipynb +++ b/data/.ipynb_checkpoints/preferentialBO_llm_multiplot_correction_case_3-checkpoint.ipynb @@ -9,7 +9,8 @@ "#change utility3 by the corresponding number, get back utility 3\n", "#change prompt\n", "#change pickle filename\n", - "#change plot name" + "#change plot name\n", + "#change objective name" ] }, { diff --git a/data/preferentialBO_llm_multiplot_correction_case_1.ipynb b/data/preferentialBO_llm_multiplot_correction_case_1.ipynb new file mode 100644 index 0000000..afc7641 --- /dev/null +++ b/data/preferentialBO_llm_multiplot_correction_case_1.ipynb @@ -0,0 +1,752 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "#change utility1 by the corresponding number, get back utility 3 done\n", + "#change prompt done\n", + "#change pickle filename done\n", + "#change plot name done\n", + "#change objective name" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "id": "NTeLbyDoMi0-" + }, + "outputs": [], + "source": [ + "import os\n", + "import warnings\n", + "from itertools import combinations\n", + "\n", + "import numpy as np\n", + "import torch\n", + "import time\n", + "\n", + "# Suppress potential optimization warnings for cleaner notebook\n", + "warnings.filterwarnings(\"ignore\")\n", + "\n", + "SMOKE_TEST = os.environ.get(\"SMOKE_TEST\")" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-03-29 07:50:27.184951: I external/local_tsl/tsl/cuda/cudart_stub.cc:32] Could not find cuda drivers on your machine, GPU will not be used.\n", + "2024-03-29 07:50:27.223956: I tensorflow/core/platform/cpu_feature_guard.cc:210] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n", + "To enable the following instructions: AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n", + "2024-03-29 07:50:27.953754: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT\n", + "2024-03-29 07:50:28.392870: I external/local_xla/xla/stream_executor/cuda/cuda_executor.cc:998] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355\n", + "2024-03-29 07:50:28.393531: W tensorflow/core/common_runtime/gpu/gpu_device.cc:2251] Cannot dlopen some GPU libraries. Please make sure the missing libraries mentioned above are installed properly if you would like to use GPU. Follow the guide at https://www.tensorflow.org/install/gpu for how to download and setup the required libraries for your platform.\n", + "Skipping registering GPU devices...\n" + ] + } + ], + "source": [ + "import DTLZ2_model\n", + "import fischer_model\n", + "from botorch.test_functions.multi_objective import DTLZ2\n", + "from DTLZ2_model import neg_l1_dist\n", + "from DTLZ2_model import predict_DTLZ2_model\n", + "from fischer_model import predict_fischer_model\n", + "import tensorflow as tf\n", + "import random\n", + "\n", + "\n", + "from botorch.fit import fit_gpytorch_mll \n", + "from botorch.models.pairwise_gp import PairwiseGP, PairwiseLaplaceMarginalLogLikelihood \n", + "from botorch.models.transforms.input import Normalize\n", + "import pickle" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + " #Your chosen seed\n", + "your_seed = 42\n", + "\n", + "# Set seed for Python's RNG\n", + "random.seed(your_seed)\n", + "\n", + "# Set seed for NumPy RNG\n", + "np.random.seed(your_seed)\n", + "\n", + "# Set seed for PyTorch RNGs\n", + "torch.manual_seed(your_seed)\n", + "\n", + "# Ensure reproducibility for PyTorch operations (might reduce performance)\n", + "torch.backends.cudnn.deterministic = True\n", + "torch.backends.cudnn.benchmark = False\n", + "\n", + "# If using CUDA (PyTorch)\n", + "torch.cuda.manual_seed(your_seed)\n", + "torch.cuda.manual_seed_all(your_seed) # For multi-GPU setups\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 61ms/step\n" + ] + }, + { + "data": { + "text/plain": [ + "tensor([[0.6455, 0.0591, 0.1161, 0.5071]])" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "predict_fischer_model(torch.tensor([[0.5, 0.5, 0.5, 0.5]]))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "import cohere\n", + "co = cohere.Client('9ylnov4iFULBLovujZIJLq6x8pkq4NkyNCw0oePR')" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "id": "Mvj4PbSpNSjG" + }, + "outputs": [], + "source": [ + "# data generating helper functions\n", + "#function that defines the comparisons\n", + "def utility(X):\n", + " y=predict_fischer_model(X)\n", + " #weighted_y = y * torch.sqrt(torch.arange(y.size(-1), dtype=torch.float) + 1)\n", + " #y = torch.sum(weighted_y, dim=-1)\n", + " return y\n", + "\n", + "def utility1(X): #The four outputs are equally important, and we want to maximize all of them.\n", + " y=predict_fischer_model(X)\n", + " y = torch.sum(y, dim=-1)\n", + " return y\n", + "\n", + "def utility2(X): #We only want to maximize the CO conversion.\n", + " y=predict_fischer_model(X)\n", + " y = y[:,0]\n", + " return y\n", + "\n", + "def utility3(X): # The light olefins is considered as a negative output and we want to minimize it while maximizing the other three objectives.\n", + " y=predict_fischer_model(X)\n", + " y = y[:,0]+y[:,1]+y[:,2]-y[:,3]\n", + " return y\n", + " \n", + "def ini(n,dim):\n", + " X = torch.rand(n, dim, dtype=torch.float64)\n", + " return X\n", + "def generate_data(X, dim=4):\n", + " \"\"\"Generate data X and y\"\"\"\n", + " # X is randomly sampled from dim-dimentional unit cube\n", + " # we recommend using double as opposed to float tensor here for\n", + " # better numerical stability\n", + " #X=ini(n,dim)\n", + " x_2=tf.convert_to_tensor(X, dtype=tf.float32)\n", + " y = utility(x_2)\n", + " return y\n", + "\n", + "def generate_data_u1(X, dim=4):\n", + " \"\"\"Generate data X and y\"\"\"\n", + " # X is randomly sampled from dim-dimentional unit cube\n", + " # we recommend using double as opposed to float tensor here for\n", + " # better numerical stability\n", + " #X=ini(n,dim)\n", + " x_2=tf.convert_to_tensor(X, dtype=tf.float32)\n", + " y = utility1(x_2)\n", + " return y" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def generate_comparisons(y, n_comp, noise=0.1, replace=False):\n", + " \"\"\"Create pairwise comparisons with noise\"\"\"\n", + " # generate all possible pairs of elements in y\n", + " all_pairs = np.array(list(combinations(range(y.shape[0]), 2)))\n", + " # randomly select n_comp pairs from all_pairs\n", + " comp_pairs = all_pairs[\n", + " np.random.choice(range(len(all_pairs)), n_comp, replace=replace)\n", + " ]\n", + " # add gaussian noise to the latent y values\n", + " c0 = y[comp_pairs[:, 0]] + np.random.standard_normal(len(comp_pairs)) * noise\n", + " c1 = y[comp_pairs[:, 1]] + np.random.standard_normal(len(comp_pairs)) * noise\n", + " reverse_comp = (c0 < c1).numpy()\n", + " comp_pairs[reverse_comp, :] = np.flip(comp_pairs[reverse_comp, :], 1)\n", + " comp_pairs = torch.tensor(comp_pairs).long()\n", + "\n", + " return comp_pairs" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "#im not sure if this is is the correct function, i'm a bit eepy\n", + "#remember to reduce the number of comparisons n_comp,\n", + "def generate_comparisons_llm(y, n_comp, replace=False):\n", + " \"\"\"Create pairwise comparisons with noise\"\"\"\n", + " # generate all possible pairs of elements in y\n", + " all_pairs = np.array(list(combinations(range(y.shape[0]), 2)))\n", + " # randomly select n_comp pairs from all_pairs\n", + " comp_pairs = all_pairs[\n", + " np.random.choice(range(len(all_pairs)), n_comp, replace=replace)\n", + " ]\n", + " #parsing the tensor to get the strings for the LLM\n", + " new_pairs=[]\n", + " for opto in comp_pairs:\n", + " firstoption=opto[0]\n", + " secondoption=opto[1]\n", + " numfirst=(y[firstoption,:])\n", + " firstoutput1=f\"{numfirst[0].cpu().numpy():.1f}\"\n", + " firstoutput2=f\"{numfirst[1].cpu().numpy():.1f}\"\n", + " firstoutput3=f\"{numfirst[2].cpu().numpy():.1f}\"\n", + " firstoutput4=f\"{numfirst[3].cpu().numpy():.1f}\"\n", + " numsecond=(y[secondoption,:])\n", + " secondoutput1=f\"{numsecond[0].cpu().numpy():.1f}\"\n", + " secondoutput2=f\"{numsecond[1].cpu().numpy():.1f}\"\n", + " secondoutput3=f\"{numsecond[2].cpu().numpy():.1f}\"\n", + " secondoutput4=f\"{numsecond[3].cpu().numpy():.1f}\"\n", + " mess=\"Suppose you're managing a Fischer-Tropsch synthesis process. The four outputs are equally important, and we want to maximize all of them. Option A: regime of \"+firstoutput1+\" CO conversion, \"+firstoutput2+\" methane production, \"+firstoutput3+\" paraffins, \"+firstoutput4+\" light olefins. Option B: regime of \"+secondoutput1+\" CO conversion, \"+secondoutput2+\" methane production, \"+secondoutput3+\" paraffins, \"+secondoutput4+\" light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\"\n", + " print(mess)\n", + " response = co.chat(message=mess,\n", + " #perform web search before answering the question. You can also use your own custom connector.\n", + " #connectors=[{\"id\": \"web-search\"}]\n", + " )\n", + " print(response.text)\n", + " opllm=response.text\n", + " \n", + " if \"Option A\" in opllm:\n", + " new_pairs.append(opto.tolist())\n", + " else:\n", + " new_pairs.append(list(reversed(opto)))\n", + " #api restrictions 20 API calls/minutes\n", + " time.sleep(6)\n", + " \n", + " return torch.tensor(new_pairs)\n", + "\n", + "#\"Suppose you're managing a Fischer-Tropsch synthesis process. The four outputs are equally important, and we want to maximize all of them. Option A: regime of \"+firstoutput1+\" CO conversion, \"+firstoutput2+\" methane production, \"+firstoutput3+\" paraffins, \"+firstoutput4+\" light olefins. Option B: regime of \"+secondoutput1+\" CO conversion, \"+secondoutput2+\" methane production, \"+secondoutput3+\" paraffins, \"+secondoutput4+\" light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\"\n", + "#\"Suppose you're managing a Fischer-Tropsch synthesis process. The light olefins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of \"+firstoutput1+\" CO conversion, \"+firstoutput2+\" methane, \"+firstoutput3+\" paraffin, \"+firstoutput4+\" light olefins. Option B: regime of \"+secondoutput1+\" CO conversion, \"+secondoutput2+\" methane, \"+secondoutput3+\" paraffins, \"+secondoutput4+\" light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\"\n", + "#\"Suppose you're managing a Fischer-Tropsch synthesis process. We only want to maximize the CO conversion. Option A: regime of \"+firstoutput1+\" CO conversion, \"+firstoutput2+\" methane, \"+firstoutput3+\" paraffin, \"+firstoutput4+\" light olefins. Option B: regime of \"+secondoutput1+\" CO conversion, \"+secondoutput2+\" methane, \"+secondoutput3+\" paraffins, \"+secondoutput4+\" light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "m5F2xn-8N-g9" + }, + "source": [ + "#parameters\n", + "torch.manual_seed(123)\n", + "#number for initial data\n", + "n = 5 if not SMOKE_TEST else 5\n", + "#number for initial comparisons\n", + "m = 10 if not SMOKE_TEST else 10\n", + "dim = 4\n", + "noise = 0.1\n", + "\n", + "#generate data, initial data\n", + "train_X, train_y = generate_data(n, dim=dim)\n", + "#generating comparison based on the utility function" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "train_comp_llm = generate_comparisons_llm(train_y, m)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "train_comp_llm" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "fMuLBRO-NVj3" + }, + "source": [ + "from botorch.fit import fit_gpytorch_mll\n", + "from botorch.models.pairwise_gp import PairwiseGP, PairwiseLaplaceMarginalLogLikelihood\n", + "from botorch.models.transforms.input import Normalize\n", + "\n", + "#fitting the first pairwise GP\n", + "model = PairwiseGP(\n", + " train_X,\n", + " train_comp_llm,\n", + " input_transform=Normalize(d=train_X.shape[-1]),\n", + ")\n", + "mll = PairwiseLaplaceMarginalLogLikelihood(model.likelihood, model)\n", + "mll = fit_gpytorch_mll(mll)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "OdxhkF6yNZKp", + "outputId": "0e3b833e-7a46-4413-f148-7e3fab6d8433" + }, + "source": [ + "from scipy.stats import kendalltau\n", + "\n", + "\n", + "# Kendall-Tau rank correlation\n", + "def eval_kt_cor(model, test_X, test_y):\n", + " pred_y = model.posterior(test_X).mean.squeeze().detach().numpy()\n", + " return kendalltau(pred_y, test_y).correlation\n", + "\n", + "\n", + "n_kendall = 10 if not SMOKE_TEST else 10\n", + "\n", + "test_X, test_y = generate_data(n_kendall, dim=dim)\n", + "kt_correlation = eval_kt_cor(model, test_X, test_y[:,3])\n", + "\n", + "print(f\"Test Kendall-Tau rank correlation: {kt_correlation:.4f}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "id": "qEoN28RSNk2N" + }, + "outputs": [], + "source": [ + "from botorch.acquisition.preference import AnalyticExpectedUtilityOfBestOption\n", + "from botorch.optim import optimize_acqf\n", + "\n", + "#wrapper for the model\n", + "def init_and_fit_model(X, comp):\n", + " \"\"\"Model fitting helper function\"\"\"\n", + " model = PairwiseGP(\n", + " X,\n", + " comp,\n", + " input_transform=Normalize(d=X.shape[-1]),\n", + " )\n", + " mll = PairwiseLaplaceMarginalLogLikelihood(model.likelihood, model)\n", + " fit_gpytorch_mll(mll)\n", + " return mll, model\n", + "\n", + "#wrapper for making new data, what does it mean? return comps\n", + "\n", + "def make_new_data(X, next_X, comps, q_comp):\n", + " \"\"\"Given X and next_X,\n", + " generate q_comp new comparisons between next_X\n", + " and return the concatenated X and comparisons\n", + " \"\"\"\n", + " # next_X is float by default; cast it to the dtype of X (i.e., double)\n", + " next_X = next_X.to(X)\n", + " x_2=tf.convert_to_tensor(next_X, dtype=tf.float32)\n", + " next_y = utility(x_2)\n", + " next_comps = generate_comparisons_llm(next_y, n_comp=q_comp)\n", + " comps = torch.cat([comps, next_comps + X.shape[-2]])\n", + " X = torch.cat([X, next_X])\n", + " return X, comps\n", + "\n", + "def make_new_data_u1(X, next_X, comps, q_comp):\n", + " \"\"\"Given X and next_X,\n", + " generate q_comp new comparisons between next_X\n", + " and return the concatenated X and comparisons\n", + " \"\"\"\n", + " # next_X is float by default; cast it to the dtype of X (i.e., double)\n", + " next_X = next_X.to(X)\n", + " x_2=tf.convert_to_tensor(next_X, dtype=tf.float32)\n", + " next_y = utility1(x_2)\n", + " next_comps = generate_comparisons(next_y, n_comp=q_comp)\n", + " comps = torch.cat([comps, next_comps + X.shape[-2]])\n", + " X = torch.cat([X, next_X])\n", + " return X, comps" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "id": "1pTEh0DMNv1w" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 18ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The four outputs are equally important, and we want to maximize all of them. Option A: regime of 0.2 CO conversion, 0.0 methane production, 0.0 paraffins, 0.2 light olefins. Option B: regime of 0.6 CO conversion, 0.0 methane production, 0.1 paraffins, 0.5 light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The four outputs are equally important, and we want to maximize all of them. Option A: regime of 0.7 CO conversion, 0.1 methane production, 0.2 paraffins, 0.4 light olefins. Option B: regime of 0.2 CO conversion, 0.0 methane production, 0.0 paraffins, 0.2 light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The four outputs are equally important, and we want to maximize all of them. Option A: regime of 0.2 CO conversion, 0.0 methane production, 0.0 paraffins, 0.2 light olefins. Option B: regime of 0.5 CO conversion, 0.0 methane production, 0.1 paraffins, 0.6 light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The four outputs are equally important, and we want to maximize all of them. Option A: regime of 0.7 CO conversion, 0.1 methane production, 0.2 paraffins, 0.4 light olefins. Option B: regime of 0.6 CO conversion, 0.0 methane production, 0.1 paraffins, 0.5 light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The four outputs are equally important, and we want to maximize all of them. Option A: regime of 0.7 CO conversion, 0.1 methane production, 0.2 paraffins, 0.4 light olefins. Option B: regime of 0.8 CO conversion, 0.1 methane production, 0.2 paraffins, 0.6 light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The four outputs are equally important, and we want to maximize all of them. Option A: regime of 0.2 CO conversion, 0.0 methane production, 0.0 paraffins, 0.2 light olefins. Option B: regime of 0.8 CO conversion, 0.1 methane production, 0.2 paraffins, 0.6 light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The four outputs are equally important, and we want to maximize all of them. Option A: regime of 0.5 CO conversion, 0.0 methane production, 0.1 paraffins, 0.6 light olefins. Option B: regime of 0.6 CO conversion, 0.0 methane production, 0.1 paraffins, 0.5 light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\n" + ] + }, + { + "ename": "ReadTimeout", + "evalue": "The read operation timed out", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mReadTimeout\u001b[0m Traceback (most recent call last)", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/site-packages/httpx/_transports/default.py:69\u001b[0m, in \u001b[0;36mmap_httpcore_exceptions\u001b[0;34m()\u001b[0m\n\u001b[1;32m 68\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m---> 69\u001b[0m \u001b[38;5;28;01myield\u001b[39;00m\n\u001b[1;32m 70\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m exc:\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/site-packages/httpx/_transports/default.py:233\u001b[0m, in \u001b[0;36mHTTPTransport.handle_request\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 232\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m map_httpcore_exceptions():\n\u001b[0;32m--> 233\u001b[0m resp \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_pool\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mhandle_request\u001b[49m\u001b[43m(\u001b[49m\u001b[43mreq\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 235\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(resp\u001b[38;5;241m.\u001b[39mstream, typing\u001b[38;5;241m.\u001b[39mIterable)\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/site-packages/httpcore/_sync/connection_pool.py:216\u001b[0m, in \u001b[0;36mConnectionPool.handle_request\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 215\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_close_connections(closing)\n\u001b[0;32m--> 216\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m exc \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 218\u001b[0m \u001b[38;5;66;03m# Return the response. Note that in this case we still have to manage\u001b[39;00m\n\u001b[1;32m 219\u001b[0m \u001b[38;5;66;03m# the point at which the response is closed.\u001b[39;00m\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/site-packages/httpcore/_sync/connection_pool.py:196\u001b[0m, in \u001b[0;36mConnectionPool.handle_request\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 194\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 195\u001b[0m \u001b[38;5;66;03m# Send the request on the assigned connection.\u001b[39;00m\n\u001b[0;32m--> 196\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[43mconnection\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mhandle_request\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 197\u001b[0m \u001b[43m \u001b[49m\u001b[43mpool_request\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrequest\u001b[49m\n\u001b[1;32m 198\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 199\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m ConnectionNotAvailable:\n\u001b[1;32m 200\u001b[0m \u001b[38;5;66;03m# In some cases a connection may initially be available to\u001b[39;00m\n\u001b[1;32m 201\u001b[0m \u001b[38;5;66;03m# handle a request, but then become unavailable.\u001b[39;00m\n\u001b[1;32m 202\u001b[0m \u001b[38;5;66;03m#\u001b[39;00m\n\u001b[1;32m 203\u001b[0m \u001b[38;5;66;03m# In this case we clear the connection and try again.\u001b[39;00m\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/site-packages/httpcore/_sync/connection.py:101\u001b[0m, in \u001b[0;36mHTTPConnection.handle_request\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 99\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m exc\n\u001b[0;32m--> 101\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_connection\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mhandle_request\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/site-packages/httpcore/_sync/http11.py:143\u001b[0m, in \u001b[0;36mHTTP11Connection.handle_request\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 142\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_response_closed()\n\u001b[0;32m--> 143\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m exc\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/site-packages/httpcore/_sync/http11.py:113\u001b[0m, in \u001b[0;36mHTTP11Connection.handle_request\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 104\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m Trace(\n\u001b[1;32m 105\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mreceive_response_headers\u001b[39m\u001b[38;5;124m\"\u001b[39m, logger, request, kwargs\n\u001b[1;32m 106\u001b[0m ) \u001b[38;5;28;01mas\u001b[39;00m trace:\n\u001b[1;32m 107\u001b[0m (\n\u001b[1;32m 108\u001b[0m http_version,\n\u001b[1;32m 109\u001b[0m status,\n\u001b[1;32m 110\u001b[0m reason_phrase,\n\u001b[1;32m 111\u001b[0m headers,\n\u001b[1;32m 112\u001b[0m trailing_data,\n\u001b[0;32m--> 113\u001b[0m ) \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_receive_response_headers\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 114\u001b[0m trace\u001b[38;5;241m.\u001b[39mreturn_value \u001b[38;5;241m=\u001b[39m (\n\u001b[1;32m 115\u001b[0m http_version,\n\u001b[1;32m 116\u001b[0m status,\n\u001b[1;32m 117\u001b[0m reason_phrase,\n\u001b[1;32m 118\u001b[0m headers,\n\u001b[1;32m 119\u001b[0m )\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/site-packages/httpcore/_sync/http11.py:186\u001b[0m, in \u001b[0;36mHTTP11Connection._receive_response_headers\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 185\u001b[0m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[0;32m--> 186\u001b[0m event \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_receive_event\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtimeout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtimeout\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 187\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(event, h11\u001b[38;5;241m.\u001b[39mResponse):\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/site-packages/httpcore/_sync/http11.py:224\u001b[0m, in \u001b[0;36mHTTP11Connection._receive_event\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 223\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m event \u001b[38;5;129;01mis\u001b[39;00m h11\u001b[38;5;241m.\u001b[39mNEED_DATA:\n\u001b[0;32m--> 224\u001b[0m data \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_network_stream\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mread\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 225\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mREAD_NUM_BYTES\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtimeout\u001b[49m\n\u001b[1;32m 226\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 228\u001b[0m \u001b[38;5;66;03m# If we feed this case through h11 we'll raise an exception like:\u001b[39;00m\n\u001b[1;32m 229\u001b[0m \u001b[38;5;66;03m#\u001b[39;00m\n\u001b[1;32m 230\u001b[0m \u001b[38;5;66;03m# httpcore.RemoteProtocolError: can't handle event type\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 234\u001b[0m \u001b[38;5;66;03m# perspective. Instead we handle this case distinctly and treat\u001b[39;00m\n\u001b[1;32m 235\u001b[0m \u001b[38;5;66;03m# it as a ConnectError.\u001b[39;00m\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/site-packages/httpcore/_backends/sync.py:124\u001b[0m, in \u001b[0;36mSyncStream.read\u001b[0;34m(self, max_bytes, timeout)\u001b[0m\n\u001b[1;32m 123\u001b[0m exc_map: ExceptionMapping \u001b[38;5;241m=\u001b[39m {socket\u001b[38;5;241m.\u001b[39mtimeout: ReadTimeout, \u001b[38;5;167;01mOSError\u001b[39;00m: ReadError}\n\u001b[0;32m--> 124\u001b[0m \u001b[43m\u001b[49m\u001b[38;5;28;43;01mwith\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mmap_exceptions\u001b[49m\u001b[43m(\u001b[49m\u001b[43mexc_map\u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m 125\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_sock\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msettimeout\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtimeout\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/contextlib.py:155\u001b[0m, in \u001b[0;36m_GeneratorContextManager.__exit__\u001b[0;34m(self, typ, value, traceback)\u001b[0m\n\u001b[1;32m 154\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 155\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mgen\u001b[38;5;241m.\u001b[39mthrow(typ, value, traceback)\n\u001b[1;32m 156\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mStopIteration\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m exc:\n\u001b[1;32m 157\u001b[0m \u001b[38;5;66;03m# Suppress StopIteration *unless* it's the same exception that\u001b[39;00m\n\u001b[1;32m 158\u001b[0m \u001b[38;5;66;03m# was passed to throw(). This prevents a StopIteration\u001b[39;00m\n\u001b[1;32m 159\u001b[0m \u001b[38;5;66;03m# raised inside the \"with\" statement from being suppressed.\u001b[39;00m\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/site-packages/httpcore/_exceptions.py:14\u001b[0m, in \u001b[0;36mmap_exceptions\u001b[0;34m(map)\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(exc, from_exc):\n\u001b[0;32m---> 14\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m to_exc(exc) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mexc\u001b[39;00m\n\u001b[1;32m 15\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m\n", + "\u001b[0;31mReadTimeout\u001b[0m: The read operation timed out", + "\nThe above exception was the direct cause of the following exception:\n", + "\u001b[0;31mReadTimeout\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[12], line 39\u001b[0m\n\u001b[1;32m 37\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m algo \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mEUBO-LLM\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[1;32m 38\u001b[0m init_y \u001b[38;5;241m=\u001b[39m generate_data(init_X, dim\u001b[38;5;241m=\u001b[39mdim)\n\u001b[0;32m---> 39\u001b[0m comparisons \u001b[38;5;241m=\u001b[39m \u001b[43mgenerate_comparisons_llm\u001b[49m\u001b[43m(\u001b[49m\u001b[43minit_y\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mq_comp\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 40\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m algo \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mEUBO\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[1;32m 41\u001b[0m init_y \u001b[38;5;241m=\u001b[39m generate_data_u1(init_X, dim\u001b[38;5;241m=\u001b[39mdim)\n", + "Cell \u001b[0;32mIn[9], line 28\u001b[0m, in \u001b[0;36mgenerate_comparisons_llm\u001b[0;34m(y, n_comp, replace)\u001b[0m\n\u001b[1;32m 26\u001b[0m mess\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mSuppose you\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mre managing a Fischer-Tropsch synthesis process. The four outputs are equally important, and we want to maximize all of them. Option A: regime of \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m+\u001b[39mfirstoutput1\u001b[38;5;241m+\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m CO conversion, \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m+\u001b[39mfirstoutput2\u001b[38;5;241m+\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m methane production, \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m+\u001b[39mfirstoutput3\u001b[38;5;241m+\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m paraffins, \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m+\u001b[39mfirstoutput4\u001b[38;5;241m+\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m light olefins. Option B: regime of \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m+\u001b[39msecondoutput1\u001b[38;5;241m+\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m CO conversion, \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m+\u001b[39msecondoutput2\u001b[38;5;241m+\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m methane production, \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m+\u001b[39msecondoutput3\u001b[38;5;241m+\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m paraffins, \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m+\u001b[39msecondoutput4\u001b[38;5;241m+\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m light olefins. Choose only one option, only answer with \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mOption A\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m or \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mOption B\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 27\u001b[0m \u001b[38;5;28mprint\u001b[39m(mess)\n\u001b[0;32m---> 28\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[43mco\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mchat\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmessage\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmess\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 29\u001b[0m \u001b[43m\u001b[49m\u001b[38;5;66;43;03m#perform web search before answering the question. You can also use your own custom connector.\u001b[39;49;00m\n\u001b[1;32m 30\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;66;43;03m#connectors=[{\"id\": \"web-search\"}]\u001b[39;49;00m\n\u001b[1;32m 31\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 32\u001b[0m \u001b[38;5;28mprint\u001b[39m(response\u001b[38;5;241m.\u001b[39mtext)\n\u001b[1;32m 33\u001b[0m opllm\u001b[38;5;241m=\u001b[39mresponse\u001b[38;5;241m.\u001b[39mtext\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/site-packages/cohere/client.py:27\u001b[0m, in \u001b[0;36mvalidate_args..wrapped\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 25\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mwrapped\u001b[39m(\u001b[38;5;241m*\u001b[39margs: typing\u001b[38;5;241m.\u001b[39mAny, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: typing\u001b[38;5;241m.\u001b[39mAny) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m typing\u001b[38;5;241m.\u001b[39mAny:\n\u001b[1;32m 26\u001b[0m check_fn(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m---> 27\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mmethod\u001b[49m\u001b[43m(\u001b[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[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/site-packages/cohere/base_client.py:626\u001b[0m, in \u001b[0;36mBaseCohere.chat\u001b[0;34m(self, message, model, preamble, chat_history, conversation_id, prompt_truncation, connectors, search_queries_only, documents, temperature, max_tokens, k, p, seed, stop_sequences, frequency_penalty, presence_penalty, raw_prompting, tools, tool_results, request_options)\u001b[0m\n\u001b[1;32m 624\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m tool_results \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m OMIT:\n\u001b[1;32m 625\u001b[0m _request[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtool_results\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m tool_results\n\u001b[0;32m--> 626\u001b[0m _response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_client_wrapper\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mhttpx_client\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrequest\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 627\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mPOST\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 628\u001b[0m \u001b[43m \u001b[49m\u001b[43murllib\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mparse\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43murljoin\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43mf\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_client_wrapper\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_base_url\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;124;43m/\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mchat\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 629\u001b[0m \u001b[43m \u001b[49m\u001b[43mparams\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mjsonable_encoder\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 630\u001b[0m \u001b[43m \u001b[49m\u001b[43mrequest_options\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43madditional_query_parameters\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mrequest_options\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mis\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mnot\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\n\u001b[1;32m 631\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 632\u001b[0m \u001b[43m \u001b[49m\u001b[43mjson\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mjsonable_encoder\u001b[49m\u001b[43m(\u001b[49m\u001b[43m_request\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 633\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mrequest_options\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mis\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mrequest_options\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43madditional_body_parameters\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mis\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\n\u001b[1;32m 634\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43m{\u001b[49m\n\u001b[1;32m 635\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mjsonable_encoder\u001b[49m\u001b[43m(\u001b[49m\u001b[43m_request\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 636\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mjsonable_encoder\u001b[49m\u001b[43m(\u001b[49m\u001b[43mremove_none_from_dict\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrequest_options\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43madditional_body_parameters\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m{\u001b[49m\u001b[43m}\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 637\u001b[0m \u001b[43m \u001b[49m\u001b[43m}\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 638\u001b[0m \u001b[43m \u001b[49m\u001b[43mheaders\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mjsonable_encoder\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 639\u001b[0m \u001b[43m \u001b[49m\u001b[43mremove_none_from_dict\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 640\u001b[0m \u001b[43m \u001b[49m\u001b[43m{\u001b[49m\n\u001b[1;32m 641\u001b[0m \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[43m_client_wrapper\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_headers\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 642\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mrequest_options\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43madditional_headers\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m{\u001b[49m\u001b[43m}\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mrequest_options\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mis\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mnot\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43m{\u001b[49m\u001b[43m}\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 643\u001b[0m \u001b[43m \u001b[49m\u001b[43m}\u001b[49m\n\u001b[1;32m 644\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 645\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 646\u001b[0m \u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrequest_options\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mtimeout_in_seconds\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 647\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mrequest_options\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mis\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mnot\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mand\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mrequest_options\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mtimeout_in_seconds\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mis\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mnot\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\n\u001b[1;32m 648\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_client_wrapper\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_timeout\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 649\u001b[0m \u001b[43m \u001b[49m\u001b[43mretries\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 650\u001b[0m \u001b[43m \u001b[49m\u001b[43mmax_retries\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrequest_options\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mmax_retries\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mrequest_options\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mis\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mnot\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# type: ignore\u001b[39;49;00m\n\u001b[1;32m 651\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 652\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;241m200\u001b[39m \u001b[38;5;241m<\u001b[39m\u001b[38;5;241m=\u001b[39m _response\u001b[38;5;241m.\u001b[39mstatus_code \u001b[38;5;241m<\u001b[39m \u001b[38;5;241m300\u001b[39m:\n\u001b[1;32m 653\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m pydantic\u001b[38;5;241m.\u001b[39mparse_obj_as(NonStreamedChatResponse, _response\u001b[38;5;241m.\u001b[39mjson()) \u001b[38;5;66;03m# type: ignore\u001b[39;00m\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/site-packages/cohere/core/http_client.py:94\u001b[0m, in \u001b[0;36mHttpClient.request\u001b[0;34m(self, max_retries, retries, *args, **kwargs)\u001b[0m\n\u001b[1;32m 90\u001b[0m \u001b[38;5;129m@wraps\u001b[39m(httpx\u001b[38;5;241m.\u001b[39mClient\u001b[38;5;241m.\u001b[39mrequest)\n\u001b[1;32m 91\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mrequest\u001b[39m(\n\u001b[1;32m 92\u001b[0m \u001b[38;5;28mself\u001b[39m, \u001b[38;5;241m*\u001b[39margs: typing\u001b[38;5;241m.\u001b[39mAny, max_retries: \u001b[38;5;28mint\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0\u001b[39m, retries: \u001b[38;5;28mint\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0\u001b[39m, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: typing\u001b[38;5;241m.\u001b[39mAny\n\u001b[1;32m 93\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m httpx\u001b[38;5;241m.\u001b[39mResponse:\n\u001b[0;32m---> 94\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mhttpx_client\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrequest\u001b[49m\u001b[43m(\u001b[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[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 95\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m _should_retry(response\u001b[38;5;241m=\u001b[39mresponse):\n\u001b[1;32m 96\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m max_retries \u001b[38;5;241m>\u001b[39m retries:\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/site-packages/httpx/_client.py:827\u001b[0m, in \u001b[0;36mClient.request\u001b[0;34m(self, method, url, content, data, files, json, params, headers, cookies, auth, follow_redirects, timeout, extensions)\u001b[0m\n\u001b[1;32m 812\u001b[0m warnings\u001b[38;5;241m.\u001b[39mwarn(message, \u001b[38;5;167;01mDeprecationWarning\u001b[39;00m)\n\u001b[1;32m 814\u001b[0m request \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mbuild_request(\n\u001b[1;32m 815\u001b[0m method\u001b[38;5;241m=\u001b[39mmethod,\n\u001b[1;32m 816\u001b[0m url\u001b[38;5;241m=\u001b[39murl,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 825\u001b[0m extensions\u001b[38;5;241m=\u001b[39mextensions,\n\u001b[1;32m 826\u001b[0m )\n\u001b[0;32m--> 827\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[43msend\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mauth\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mauth\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfollow_redirects\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfollow_redirects\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/site-packages/httpx/_client.py:914\u001b[0m, in \u001b[0;36mClient.send\u001b[0;34m(self, request, stream, auth, follow_redirects)\u001b[0m\n\u001b[1;32m 906\u001b[0m follow_redirects \u001b[38;5;241m=\u001b[39m (\n\u001b[1;32m 907\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfollow_redirects\n\u001b[1;32m 908\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(follow_redirects, UseClientDefault)\n\u001b[1;32m 909\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m follow_redirects\n\u001b[1;32m 910\u001b[0m )\n\u001b[1;32m 912\u001b[0m auth \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_build_request_auth(request, auth)\n\u001b[0;32m--> 914\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_send_handling_auth\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 915\u001b[0m \u001b[43m \u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 916\u001b[0m \u001b[43m \u001b[49m\u001b[43mauth\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mauth\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 917\u001b[0m \u001b[43m \u001b[49m\u001b[43mfollow_redirects\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfollow_redirects\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 918\u001b[0m \u001b[43m \u001b[49m\u001b[43mhistory\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m[\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 919\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 920\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 921\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m stream:\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/site-packages/httpx/_client.py:942\u001b[0m, in \u001b[0;36mClient._send_handling_auth\u001b[0;34m(self, request, auth, follow_redirects, history)\u001b[0m\n\u001b[1;32m 939\u001b[0m request \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mnext\u001b[39m(auth_flow)\n\u001b[1;32m 941\u001b[0m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[0;32m--> 942\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_send_handling_redirects\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 943\u001b[0m \u001b[43m \u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 944\u001b[0m \u001b[43m \u001b[49m\u001b[43mfollow_redirects\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfollow_redirects\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 945\u001b[0m \u001b[43m \u001b[49m\u001b[43mhistory\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mhistory\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 946\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 947\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 948\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/site-packages/httpx/_client.py:979\u001b[0m, in \u001b[0;36mClient._send_handling_redirects\u001b[0;34m(self, request, follow_redirects, history)\u001b[0m\n\u001b[1;32m 976\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m hook \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_event_hooks[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mrequest\u001b[39m\u001b[38;5;124m\"\u001b[39m]:\n\u001b[1;32m 977\u001b[0m hook(request)\n\u001b[0;32m--> 979\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_send_single_request\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 980\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 981\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m hook \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_event_hooks[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mresponse\u001b[39m\u001b[38;5;124m\"\u001b[39m]:\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/site-packages/httpx/_client.py:1015\u001b[0m, in \u001b[0;36mClient._send_single_request\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 1010\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mRuntimeError\u001b[39;00m(\n\u001b[1;32m 1011\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mAttempted to send an async request with a sync Client instance.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 1012\u001b[0m )\n\u001b[1;32m 1014\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m request_context(request\u001b[38;5;241m=\u001b[39mrequest):\n\u001b[0;32m-> 1015\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[43mtransport\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mhandle_request\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1017\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(response\u001b[38;5;241m.\u001b[39mstream, SyncByteStream)\n\u001b[1;32m 1019\u001b[0m response\u001b[38;5;241m.\u001b[39mrequest \u001b[38;5;241m=\u001b[39m request\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/site-packages/httpx/_transports/default.py:232\u001b[0m, in \u001b[0;36mHTTPTransport.handle_request\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 218\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(request\u001b[38;5;241m.\u001b[39mstream, SyncByteStream)\n\u001b[1;32m 220\u001b[0m req \u001b[38;5;241m=\u001b[39m httpcore\u001b[38;5;241m.\u001b[39mRequest(\n\u001b[1;32m 221\u001b[0m method\u001b[38;5;241m=\u001b[39mrequest\u001b[38;5;241m.\u001b[39mmethod,\n\u001b[1;32m 222\u001b[0m url\u001b[38;5;241m=\u001b[39mhttpcore\u001b[38;5;241m.\u001b[39mURL(\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 230\u001b[0m extensions\u001b[38;5;241m=\u001b[39mrequest\u001b[38;5;241m.\u001b[39mextensions,\n\u001b[1;32m 231\u001b[0m )\n\u001b[0;32m--> 232\u001b[0m \u001b[43m\u001b[49m\u001b[38;5;28;43;01mwith\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mmap_httpcore_exceptions\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m 233\u001b[0m \u001b[43m \u001b[49m\u001b[43mresp\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_pool\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mhandle_request\u001b[49m\u001b[43m(\u001b[49m\u001b[43mreq\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 235\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(resp\u001b[38;5;241m.\u001b[39mstream, typing\u001b[38;5;241m.\u001b[39mIterable)\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/contextlib.py:155\u001b[0m, in \u001b[0;36m_GeneratorContextManager.__exit__\u001b[0;34m(self, typ, value, traceback)\u001b[0m\n\u001b[1;32m 153\u001b[0m value \u001b[38;5;241m=\u001b[39m typ()\n\u001b[1;32m 154\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 155\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mgen\u001b[38;5;241m.\u001b[39mthrow(typ, value, traceback)\n\u001b[1;32m 156\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mStopIteration\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m exc:\n\u001b[1;32m 157\u001b[0m \u001b[38;5;66;03m# Suppress StopIteration *unless* it's the same exception that\u001b[39;00m\n\u001b[1;32m 158\u001b[0m \u001b[38;5;66;03m# was passed to throw(). This prevents a StopIteration\u001b[39;00m\n\u001b[1;32m 159\u001b[0m \u001b[38;5;66;03m# raised inside the \"with\" statement from being suppressed.\u001b[39;00m\n\u001b[1;32m 160\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m exc \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m value\n", + "File \u001b[0;32m~/miniconda3/envs/botorch_mar2024/lib/python3.11/site-packages/httpx/_transports/default.py:86\u001b[0m, in \u001b[0;36mmap_httpcore_exceptions\u001b[0;34m()\u001b[0m\n\u001b[1;32m 83\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m\n\u001b[1;32m 85\u001b[0m message \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mstr\u001b[39m(exc)\n\u001b[0;32m---> 86\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m mapped_exc(message) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mexc\u001b[39;00m\n", + "\u001b[0;31mReadTimeout\u001b[0m: The read operation timed out" + ] + } + ], + "source": [ + "#two algorithms to compare\n", + "algos = [\"EUBO\",\"EUBO-LLM\", \"rand\"]\n", + "#number of repetitions of the BO cycle\n", + "NUM_TRIALS = 3 if not SMOKE_TEST else 2\n", + "#number of cycles\n", + "NUM_BATCHES = 20 if not SMOKE_TEST else 2\n", + "\n", + "#dimension number= 4 inputs\n", + "dim = 4\n", + "#sampler options\n", + "NUM_RESTARTS = 3\n", + "RAW_SAMPLES = 512 if not SMOKE_TEST else 8\n", + "#\n", + "q_eubo = 2 # number of points per query\n", + "q_data=5\n", + "q_comp = 10 # number of comparisons per query\n", + "q_comp_2=1\n", + "\n", + "# initial evals\n", + "best_vals = {} # best observed values\n", + "for algo in algos:\n", + " best_vals[algo] = []\n", + "\n", + "# average over multiple trials\n", + "for i in range(NUM_TRIALS):\n", + " torch.manual_seed(i)\n", + " np.random.seed(i)\n", + " data = {}\n", + " models = {}\n", + "\n", + " # X are within the unit cube\n", + " bounds = torch.stack([torch.zeros(dim), torch.ones(dim)])\n", + "\n", + " # Create initial data\n", + " init_X=ini(q_data,dim)\n", + " for algo in algos:\n", + " if algo == \"EUBO-LLM\":\n", + " init_y = generate_data(init_X, dim=dim)\n", + " comparisons = generate_comparisons_llm(init_y, q_comp)\n", + " if algo == \"EUBO\":\n", + " init_y = generate_data_u1(init_X, dim=dim)\n", + " comparisons = generate_comparisons(init_y, q_comp)\n", + " if algo == \"rand\":\n", + " init_y = generate_data_u1(init_X, dim=dim)\n", + " comparisons = generate_comparisons(init_y, q_comp)\n", + " \n", + " best_vals[algo].append([])\n", + " data[algo] = (init_X, comparisons)\n", + " _, models[algo] = init_and_fit_model(init_X, comparisons)\n", + "\n", + " best_next_y = utility1(init_X).max().item()\n", + " best_vals[algo][-1].append(best_next_y)\n", + "\n", + " # we make additional NUM_BATCHES comparison queries after the initial observation\n", + " for j in range(1, NUM_BATCHES + 1):\n", + " print(j)\n", + " for algo in algos:\n", + " model = models[algo]\n", + " if algo == \"EUBO-LLM\":\n", + " # create the acquisition function object\n", + " acq_func = AnalyticExpectedUtilityOfBestOption(pref_model=model)\n", + " # optimize and get new observation\n", + " next_X, acq_val = optimize_acqf(\n", + " acq_function=acq_func,\n", + " bounds=bounds,\n", + " q=q_eubo,\n", + " num_restarts=NUM_RESTARTS,\n", + " raw_samples=RAW_SAMPLES,\n", + " )\n", + " print(next_X)\n", + " # update data\n", + " X, comps = data[algo]\n", + " X, comps = make_new_data(X, next_X, comps, q_comp_2)\n", + " data[algo] = (X, comps)\n", + " \n", + " # refit models\n", + " _, models[algo] = init_and_fit_model(X, comps)\n", + " \n", + " # record the best observed values so far\n", + " max_val = utility1(X).max().item()\n", + " best_vals[algo][-1].append(max_val)\n", + " elif algo == \"EUBO\":\n", + " #create the acquisition function object\n", + " acq_func = AnalyticExpectedUtilityOfBestOption(pref_model=model)\n", + " # optimize and get new observation\n", + " next_X, acq_val = optimize_acqf(\n", + " acq_function=acq_func,\n", + " bounds=bounds,\n", + " q=q_eubo,\n", + " num_restarts=NUM_RESTARTS,\n", + " raw_samples=RAW_SAMPLES,\n", + " )\n", + " print(next_X)\n", + " # update data\n", + " X, comps = data[algo]\n", + " X, comps = make_new_data_u1(X, next_X, comps, q_comp_2)\n", + " data[algo] = (X, comps)\n", + " \n", + " # refit models\n", + " _, models[algo] = init_and_fit_model(X, comps)\n", + " \n", + " # record the best observed values so far\n", + " max_val = utility1(X).max().item()\n", + " best_vals[algo][-1].append(max_val)\n", + " else:\n", + " # randomly sample data\n", + " next_X= ini(q_eubo, dim=dim)\n", + " print(next_X)\n", + " # update data\n", + " X, comps = data[algo]\n", + " X, comps = make_new_data_u1(X, next_X, comps, q_comp_2)\n", + " data[algo] = (X, comps)\n", + " \n", + " # refit models\n", + " _, models[algo] = init_and_fit_model(X, comps)\n", + " \n", + " # record the best observed values so far\n", + " max_val = utility1(X).max().item()\n", + " best_vals[algo][-1].append(max_val)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "with open('best_vals_case_1.pkl', 'wb') as handle:\n", + " pickle.dump(best_vals, handle, protocol=pickle.HIGHEST_PROTOCOL)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "with open('best_vals_case_1.pkl', 'rb') as handle:\n", + " loaded_data = pickle.load(handle)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "loaded_data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 596 + }, + "id": "eRLF3-dFNzyW", + "outputId": "9c83df50-e355-42b9-860e-b4b51d63f2c5" + }, + "outputs": [], + "source": [ + "from matplotlib import pyplot as plt\n", + "\n", + "\n", + "%matplotlib inline\n", + "\n", + "plt.rcParams.update({\"font.size\": 14})\n", + "\n", + "algo_labels = {\n", + " \"rand\": \"Random Exploration\",\n", + " \"EUBO-LLM\": \"EUBO-LLM\",\n", + " \"EUBO\": \"EUBO\", \n", + "}\n", + "\n", + "\n", + "def ci(y):\n", + " return 1.96 * y.std(axis=0) / np.sqrt(y.shape[0])\n", + "\n", + "\n", + "# the utility function is maximized at the full vector of 1\n", + "#optimal_val = utility(torch.tensor([[1] * dim])).item()\n", + "iters = list(range(NUM_BATCHES + 1))\n", + "\n", + "fig, ax = plt.subplots(1, 1, figsize=(8, 6))\n", + "# plot the optimal value\n", + "#ax.plot(\n", + "# iters,\n", + "# [optimal_val] * len(iters),\n", + "# label=\"Optimal Function Value\",\n", + "# color=\"black\",\n", + "## linewidth=1.5,\n", + "#)\n", + "\n", + "# plot the the best observed value from each algorithm\n", + "for algo in algos:\n", + " ys = np.vstack(best_vals[algo])\n", + " ax.errorbar(\n", + " iters, ys.mean(axis=0), yerr=ci(ys), label=algo_labels[algo], linewidth=1.5\n", + " )\n", + "\n", + "ax.set(\n", + " #xlabel=f\"Number of queries q = {q_eubo}, num_initial_comp = {q_comp}, num_initial_samp = {q_data})\",\n", + " ylabel=\"Best observed value\\nas evaluated in the synthetic utility function\",\n", + " title=f\"Obj 1: maximising every output at the same time, with the same importance\",\n", + ")\n", + "\n", + "ax.set_xticks(np.arange(0, NUM_BATCHES + 1, 1))\n", + "\n", + "ax.set_xlabel(f\"Number of queries q = {q_eubo}, num_initial_comp = {q_comp}, num_initial_samp = {q_data})\", fontsize=10) # Reducing the font size\n", + "ax.legend(loc=\"best\")\n", + "plt.savefig(\"comparison_first_case_1_corrected.png\",bbox_inches=\"tight\", dpi=400)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "47P-W6iDOiHp" + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python [conda env:botorch_mar2024]", + "language": "python", + "name": "conda-env-botorch_mar2024-py" + }, + "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.11.0" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/data/preferentialBO_llm_multiplot_correction_case_1_evil_muejeje.ipynb b/data/preferentialBO_llm_multiplot_correction_case_1_evil_muejeje.ipynb new file mode 100644 index 0000000..d7d3f37 --- /dev/null +++ b/data/preferentialBO_llm_multiplot_correction_case_1_evil_muejeje.ipynb @@ -0,0 +1,715 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "#change utility1 by the corresponding number, get back utility 3 done\n", + "#change prompt done\n", + "#change pickle filename done\n", + "#change plot name done\n", + "#change objective name" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "id": "NTeLbyDoMi0-" + }, + "outputs": [], + "source": [ + "import os\n", + "import warnings\n", + "from itertools import combinations\n", + "\n", + "import numpy as np\n", + "import torch\n", + "import time\n", + "\n", + "# Suppress potential optimization warnings for cleaner notebook\n", + "warnings.filterwarnings(\"ignore\")\n", + "\n", + "SMOKE_TEST = os.environ.get(\"SMOKE_TEST\")" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-03-29 07:50:27.184951: I external/local_tsl/tsl/cuda/cudart_stub.cc:32] Could not find cuda drivers on your machine, GPU will not be used.\n", + "2024-03-29 07:50:27.223956: I tensorflow/core/platform/cpu_feature_guard.cc:210] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n", + "To enable the following instructions: AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n", + "2024-03-29 07:50:27.953754: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT\n", + "2024-03-29 07:50:28.392870: I external/local_xla/xla/stream_executor/cuda/cuda_executor.cc:998] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero. See more at https://github.com/torvalds/linux/blob/v6.0/Documentation/ABI/testing/sysfs-bus-pci#L344-L355\n", + "2024-03-29 07:50:28.393531: W tensorflow/core/common_runtime/gpu/gpu_device.cc:2251] Cannot dlopen some GPU libraries. Please make sure the missing libraries mentioned above are installed properly if you would like to use GPU. Follow the guide at https://www.tensorflow.org/install/gpu for how to download and setup the required libraries for your platform.\n", + "Skipping registering GPU devices...\n" + ] + } + ], + "source": [ + "import DTLZ2_model\n", + "import fischer_model\n", + "from botorch.test_functions.multi_objective import DTLZ2\n", + "from DTLZ2_model import neg_l1_dist\n", + "from DTLZ2_model import predict_DTLZ2_model\n", + "from fischer_model import predict_fischer_model\n", + "import tensorflow as tf\n", + "import random\n", + "\n", + "\n", + "from botorch.fit import fit_gpytorch_mll \n", + "from botorch.models.pairwise_gp import PairwiseGP, PairwiseLaplaceMarginalLogLikelihood \n", + "from botorch.models.transforms.input import Normalize\n", + "import pickle" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + " #Your chosen seed\n", + "your_seed = 42\n", + "\n", + "# Set seed for Python's RNG\n", + "random.seed(your_seed)\n", + "\n", + "# Set seed for NumPy RNG\n", + "np.random.seed(your_seed)\n", + "\n", + "# Set seed for PyTorch RNGs\n", + "torch.manual_seed(your_seed)\n", + "\n", + "# Ensure reproducibility for PyTorch operations (might reduce performance)\n", + "torch.backends.cudnn.deterministic = True\n", + "torch.backends.cudnn.benchmark = False\n", + "\n", + "# If using CUDA (PyTorch)\n", + "torch.cuda.manual_seed(your_seed)\n", + "torch.cuda.manual_seed_all(your_seed) # For multi-GPU setups\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 61ms/step\n" + ] + }, + { + "data": { + "text/plain": [ + "tensor([[0.6455, 0.0591, 0.1161, 0.5071]])" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "predict_fischer_model(torch.tensor([[0.5, 0.5, 0.5, 0.5]]))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "import cohere\n", + "co = cohere.Client('9ylnov4iFULBLovujZIJLq6x8pkq4NkyNCw0oePR')" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "id": "Mvj4PbSpNSjG" + }, + "outputs": [], + "source": [ + "# data generating helper functions\n", + "#function that defines the comparisons\n", + "def utility(X):\n", + " y=predict_fischer_model(X)\n", + " #weighted_y = y * torch.sqrt(torch.arange(y.size(-1), dtype=torch.float) + 1)\n", + " #y = torch.sum(weighted_y, dim=-1)\n", + " return y\n", + "\n", + "def utility1(X): #The four outputs are equally important, and we want to maximize all of them.\n", + " y=predict_fischer_model(X)\n", + " y = torch.sum(y, dim=-1)\n", + " return y\n", + "\n", + "def utility2(X): #We only want to maximize the CO conversion.\n", + " y=predict_fischer_model(X)\n", + " y = y[:,0]\n", + " return y\n", + "\n", + "def utility3(X): # The light olefins is considered as a negative output and we want to minimize it while maximizing the other three objectives.\n", + " y=predict_fischer_model(X)\n", + " y = y[:,0]+y[:,1]+y[:,2]-y[:,3]\n", + " return y\n", + " \n", + "def ini(n,dim):\n", + " X = torch.rand(n, dim, dtype=torch.float64)\n", + " return X\n", + "def generate_data(X, dim=4):\n", + " \"\"\"Generate data X and y\"\"\"\n", + " # X is randomly sampled from dim-dimentional unit cube\n", + " # we recommend using double as opposed to float tensor here for\n", + " # better numerical stability\n", + " #X=ini(n,dim)\n", + " x_2=tf.convert_to_tensor(X, dtype=tf.float32)\n", + " y = utility(x_2)\n", + " return y\n", + "\n", + "def generate_data_u1(X, dim=4):\n", + " \"\"\"Generate data X and y\"\"\"\n", + " # X is randomly sampled from dim-dimentional unit cube\n", + " # we recommend using double as opposed to float tensor here for\n", + " # better numerical stability\n", + " #X=ini(n,dim)\n", + " x_2=tf.convert_to_tensor(X, dtype=tf.float32)\n", + " y = utility1(x_2)\n", + " return y" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def generate_comparisons(y, n_comp, noise=0.1, replace=False):\n", + " \"\"\"Create pairwise comparisons with noise\"\"\"\n", + " # generate all possible pairs of elements in y\n", + " all_pairs = np.array(list(combinations(range(y.shape[0]), 2)))\n", + " # randomly select n_comp pairs from all_pairs\n", + " comp_pairs = all_pairs[\n", + " np.random.choice(range(len(all_pairs)), n_comp, replace=replace)\n", + " ]\n", + " # add gaussian noise to the latent y values\n", + " c0 = y[comp_pairs[:, 0]] + np.random.standard_normal(len(comp_pairs)) * noise\n", + " c1 = y[comp_pairs[:, 1]] + np.random.standard_normal(len(comp_pairs)) * noise\n", + " reverse_comp = (c0 < c1).numpy()\n", + " comp_pairs[reverse_comp, :] = np.flip(comp_pairs[reverse_comp, :], 1)\n", + " comp_pairs = torch.tensor(comp_pairs).long()\n", + "\n", + " return comp_pairs" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "#im not sure if this is is the correct function, i'm a bit eepy\n", + "#remember to reduce the number of comparisons n_comp,\n", + "def generate_comparisons_llm(y, n_comp, replace=False):\n", + " \"\"\"Create pairwise comparisons with noise\"\"\"\n", + " # generate all possible pairs of elements in y\n", + " all_pairs = np.array(list(combinations(range(y.shape[0]), 2)))\n", + " # randomly select n_comp pairs from all_pairs\n", + " comp_pairs = all_pairs[\n", + " np.random.choice(range(len(all_pairs)), n_comp, replace=replace)\n", + " ]\n", + " #parsing the tensor to get the strings for the LLM\n", + " new_pairs=[]\n", + " for opto in comp_pairs:\n", + " firstoption=opto[0]\n", + " secondoption=opto[1]\n", + " numfirst=(y[firstoption,:])\n", + " firstoutput1=f\"{numfirst[0].cpu().numpy():.1f}\"\n", + " firstoutput2=f\"{numfirst[1].cpu().numpy():.1f}\"\n", + " firstoutput3=f\"{numfirst[2].cpu().numpy():.1f}\"\n", + " firstoutput4=f\"{numfirst[3].cpu().numpy():.1f}\"\n", + " numsecond=(y[secondoption,:])\n", + " secondoutput1=f\"{numsecond[0].cpu().numpy():.1f}\"\n", + " secondoutput2=f\"{numsecond[1].cpu().numpy():.1f}\"\n", + " secondoutput3=f\"{numsecond[2].cpu().numpy():.1f}\"\n", + " secondoutput4=f\"{numsecond[3].cpu().numpy():.1f}\"\n", + " #only two character are changed in the maximize word, 'ax' to 'in' giving minimize\n", + " mess=\"Suppose you're managing a Fischer-Tropsch synthesis process. The four outputs are equally important, and we want to minimize all of them. Option A: regime of \"+firstoutput1+\" CO conversion, \"+firstoutput2+\" methane production, \"+firstoutput3+\" paraffins, \"+firstoutput4+\" light olefins. Option B: regime of \"+secondoutput1+\" CO conversion, \"+secondoutput2+\" methane production, \"+secondoutput3+\" paraffins, \"+secondoutput4+\" light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\"\n", + " print(mess)\n", + " response = co.chat(message=mess,\n", + " #perform web search before answering the question. You can also use your own custom connector.\n", + " #connectors=[{\"id\": \"web-search\"}]\n", + " )\n", + " print(response.text)\n", + " opllm=response.text\n", + " \n", + " if \"Option A\" in opllm:\n", + " new_pairs.append(opto.tolist())\n", + " else:\n", + " new_pairs.append(list(reversed(opto)))\n", + " #api restrictions 20 API calls/minutes\n", + " time.sleep(6)\n", + " \n", + " return torch.tensor(new_pairs)\n", + "\n", + "#\"Suppose you're managing a Fischer-Tropsch synthesis process. The four outputs are equally important, and we want to maximize all of them. Option A: regime of \"+firstoutput1+\" CO conversion, \"+firstoutput2+\" methane production, \"+firstoutput3+\" paraffins, \"+firstoutput4+\" light olefins. Option B: regime of \"+secondoutput1+\" CO conversion, \"+secondoutput2+\" methane production, \"+secondoutput3+\" paraffins, \"+secondoutput4+\" light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\"\n", + "#\"Suppose you're managing a Fischer-Tropsch synthesis process. The light olefins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of \"+firstoutput1+\" CO conversion, \"+firstoutput2+\" methane, \"+firstoutput3+\" paraffin, \"+firstoutput4+\" light olefins. Option B: regime of \"+secondoutput1+\" CO conversion, \"+secondoutput2+\" methane, \"+secondoutput3+\" paraffins, \"+secondoutput4+\" light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\"\n", + "#\"Suppose you're managing a Fischer-Tropsch synthesis process. We only want to maximize the CO conversion. Option A: regime of \"+firstoutput1+\" CO conversion, \"+firstoutput2+\" methane, \"+firstoutput3+\" paraffin, \"+firstoutput4+\" light olefins. Option B: regime of \"+secondoutput1+\" CO conversion, \"+secondoutput2+\" methane, \"+secondoutput3+\" paraffins, \"+secondoutput4+\" light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "m5F2xn-8N-g9" + }, + "source": [ + "#parameters\n", + "torch.manual_seed(123)\n", + "#number for initial data\n", + "n = 5 if not SMOKE_TEST else 5\n", + "#number for initial comparisons\n", + "m = 10 if not SMOKE_TEST else 10\n", + "dim = 4\n", + "noise = 0.1\n", + "\n", + "#generate data, initial data\n", + "train_X, train_y = generate_data(n, dim=dim)\n", + "#generating comparison based on the utility function" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "train_comp_llm = generate_comparisons_llm(train_y, m)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "train_comp_llm" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "fMuLBRO-NVj3" + }, + "source": [ + "from botorch.fit import fit_gpytorch_mll\n", + "from botorch.models.pairwise_gp import PairwiseGP, PairwiseLaplaceMarginalLogLikelihood\n", + "from botorch.models.transforms.input import Normalize\n", + "\n", + "#fitting the first pairwise GP\n", + "model = PairwiseGP(\n", + " train_X,\n", + " train_comp_llm,\n", + " input_transform=Normalize(d=train_X.shape[-1]),\n", + ")\n", + "mll = PairwiseLaplaceMarginalLogLikelihood(model.likelihood, model)\n", + "mll = fit_gpytorch_mll(mll)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "OdxhkF6yNZKp", + "outputId": "0e3b833e-7a46-4413-f148-7e3fab6d8433" + }, + "source": [ + "from scipy.stats import kendalltau\n", + "\n", + "\n", + "# Kendall-Tau rank correlation\n", + "def eval_kt_cor(model, test_X, test_y):\n", + " pred_y = model.posterior(test_X).mean.squeeze().detach().numpy()\n", + " return kendalltau(pred_y, test_y).correlation\n", + "\n", + "\n", + "n_kendall = 10 if not SMOKE_TEST else 10\n", + "\n", + "test_X, test_y = generate_data(n_kendall, dim=dim)\n", + "kt_correlation = eval_kt_cor(model, test_X, test_y[:,3])\n", + "\n", + "print(f\"Test Kendall-Tau rank correlation: {kt_correlation:.4f}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "id": "qEoN28RSNk2N" + }, + "outputs": [], + "source": [ + "from botorch.acquisition.preference import AnalyticExpectedUtilityOfBestOption\n", + "from botorch.optim import optimize_acqf\n", + "\n", + "#wrapper for the model\n", + "def init_and_fit_model(X, comp):\n", + " \"\"\"Model fitting helper function\"\"\"\n", + " model = PairwiseGP(\n", + " X,\n", + " comp,\n", + " input_transform=Normalize(d=X.shape[-1]),\n", + " )\n", + " mll = PairwiseLaplaceMarginalLogLikelihood(model.likelihood, model)\n", + " fit_gpytorch_mll(mll)\n", + " return mll, model\n", + "\n", + "#wrapper for making new data, what does it mean? return comps\n", + "\n", + "def make_new_data(X, next_X, comps, q_comp):\n", + " \"\"\"Given X and next_X,\n", + " generate q_comp new comparisons between next_X\n", + " and return the concatenated X and comparisons\n", + " \"\"\"\n", + " # next_X is float by default; cast it to the dtype of X (i.e., double)\n", + " next_X = next_X.to(X)\n", + " x_2=tf.convert_to_tensor(next_X, dtype=tf.float32)\n", + " next_y = utility(x_2)\n", + " next_comps = generate_comparisons_llm(next_y, n_comp=q_comp)\n", + " comps = torch.cat([comps, next_comps + X.shape[-2]])\n", + " X = torch.cat([X, next_X])\n", + " return X, comps\n", + "\n", + "def make_new_data_u1(X, next_X, comps, q_comp):\n", + " \"\"\"Given X and next_X,\n", + " generate q_comp new comparisons between next_X\n", + " and return the concatenated X and comparisons\n", + " \"\"\"\n", + " # next_X is float by default; cast it to the dtype of X (i.e., double)\n", + " next_X = next_X.to(X)\n", + " x_2=tf.convert_to_tensor(next_X, dtype=tf.float32)\n", + " next_y = utility1(x_2)\n", + " next_comps = generate_comparisons(next_y, n_comp=q_comp)\n", + " comps = torch.cat([comps, next_comps + X.shape[-2]])\n", + " X = torch.cat([X, next_X])\n", + " return X, comps" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "1pTEh0DMNv1w" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 18ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The four outputs are equally important, and we want to maximize all of them. Option A: regime of 0.2 CO conversion, 0.0 methane production, 0.0 paraffins, 0.2 light olefins. Option B: regime of 0.6 CO conversion, 0.0 methane production, 0.1 paraffins, 0.5 light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The four outputs are equally important, and we want to maximize all of them. Option A: regime of 0.7 CO conversion, 0.1 methane production, 0.2 paraffins, 0.4 light olefins. Option B: regime of 0.2 CO conversion, 0.0 methane production, 0.0 paraffins, 0.2 light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The four outputs are equally important, and we want to maximize all of them. Option A: regime of 0.2 CO conversion, 0.0 methane production, 0.0 paraffins, 0.2 light olefins. Option B: regime of 0.5 CO conversion, 0.0 methane production, 0.1 paraffins, 0.6 light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The four outputs are equally important, and we want to maximize all of them. Option A: regime of 0.7 CO conversion, 0.1 methane production, 0.2 paraffins, 0.4 light olefins. Option B: regime of 0.6 CO conversion, 0.0 methane production, 0.1 paraffins, 0.5 light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The four outputs are equally important, and we want to maximize all of them. Option A: regime of 0.7 CO conversion, 0.1 methane production, 0.2 paraffins, 0.4 light olefins. Option B: regime of 0.8 CO conversion, 0.1 methane production, 0.2 paraffins, 0.6 light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The four outputs are equally important, and we want to maximize all of them. Option A: regime of 0.2 CO conversion, 0.0 methane production, 0.0 paraffins, 0.2 light olefins. Option B: regime of 0.8 CO conversion, 0.1 methane production, 0.2 paraffins, 0.6 light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The four outputs are equally important, and we want to maximize all of them. Option A: regime of 0.5 CO conversion, 0.0 methane production, 0.1 paraffins, 0.6 light olefins. Option B: regime of 0.6 CO conversion, 0.0 methane production, 0.1 paraffins, 0.5 light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\n" + ] + } + ], + "source": [ + "#two algorithms to compare\n", + "algos = [\"EUBO\",\"EUBO-LLM\", \"rand\"]\n", + "#number of repetitions of the BO cycle\n", + "NUM_TRIALS = 3 if not SMOKE_TEST else 2\n", + "#number of cycles\n", + "NUM_BATCHES = 20 if not SMOKE_TEST else 2\n", + "\n", + "#dimension number= 4 inputs\n", + "dim = 4\n", + "#sampler options\n", + "NUM_RESTARTS = 3\n", + "RAW_SAMPLES = 512 if not SMOKE_TEST else 8\n", + "#\n", + "q_eubo = 2 # number of points per query\n", + "q_data=5\n", + "q_comp = 10 # number of comparisons per query\n", + "q_comp_2=1\n", + "\n", + "# initial evals\n", + "best_vals = {} # best observed values\n", + "for algo in algos:\n", + " best_vals[algo] = []\n", + "\n", + "# average over multiple trials\n", + "for i in range(NUM_TRIALS):\n", + " torch.manual_seed(i)\n", + " np.random.seed(i)\n", + " data = {}\n", + " models = {}\n", + "\n", + " # X are within the unit cube\n", + " bounds = torch.stack([torch.zeros(dim), torch.ones(dim)])\n", + "\n", + " # Create initial data\n", + " init_X=ini(q_data,dim)\n", + " for algo in algos:\n", + " if algo == \"EUBO-LLM\":\n", + " init_y = generate_data(init_X, dim=dim)\n", + " comparisons = generate_comparisons_llm(init_y, q_comp)\n", + " if algo == \"EUBO\":\n", + " init_y = generate_data_u1(init_X, dim=dim)\n", + " comparisons = generate_comparisons(init_y, q_comp)\n", + " if algo == \"rand\":\n", + " init_y = generate_data_u1(init_X, dim=dim)\n", + " comparisons = generate_comparisons(init_y, q_comp)\n", + " \n", + " best_vals[algo].append([])\n", + " data[algo] = (init_X, comparisons)\n", + " _, models[algo] = init_and_fit_model(init_X, comparisons)\n", + "\n", + " best_next_y = utility1(init_X).max().item()\n", + " best_vals[algo][-1].append(best_next_y)\n", + "\n", + " # we make additional NUM_BATCHES comparison queries after the initial observation\n", + " for j in range(1, NUM_BATCHES + 1):\n", + " print(j)\n", + " for algo in algos:\n", + " model = models[algo]\n", + " if algo == \"EUBO-LLM\":\n", + " # create the acquisition function object\n", + " acq_func = AnalyticExpectedUtilityOfBestOption(pref_model=model)\n", + " # optimize and get new observation\n", + " next_X, acq_val = optimize_acqf(\n", + " acq_function=acq_func,\n", + " bounds=bounds,\n", + " q=q_eubo,\n", + " num_restarts=NUM_RESTARTS,\n", + " raw_samples=RAW_SAMPLES,\n", + " )\n", + " print(next_X)\n", + " # update data\n", + " X, comps = data[algo]\n", + " X, comps = make_new_data(X, next_X, comps, q_comp_2)\n", + " data[algo] = (X, comps)\n", + " \n", + " # refit models\n", + " _, models[algo] = init_and_fit_model(X, comps)\n", + " \n", + " # record the best observed values so far\n", + " max_val = utility1(X).max().item()\n", + " best_vals[algo][-1].append(max_val)\n", + " elif algo == \"EUBO\":\n", + " #create the acquisition function object\n", + " acq_func = AnalyticExpectedUtilityOfBestOption(pref_model=model)\n", + " # optimize and get new observation\n", + " next_X, acq_val = optimize_acqf(\n", + " acq_function=acq_func,\n", + " bounds=bounds,\n", + " q=q_eubo,\n", + " num_restarts=NUM_RESTARTS,\n", + " raw_samples=RAW_SAMPLES,\n", + " )\n", + " print(next_X)\n", + " # update data\n", + " X, comps = data[algo]\n", + " X, comps = make_new_data_u1(X, next_X, comps, q_comp_2)\n", + " data[algo] = (X, comps)\n", + " \n", + " # refit models\n", + " _, models[algo] = init_and_fit_model(X, comps)\n", + " \n", + " # record the best observed values so far\n", + " max_val = utility1(X).max().item()\n", + " best_vals[algo][-1].append(max_val)\n", + " else:\n", + " # randomly sample data\n", + " next_X= ini(q_eubo, dim=dim)\n", + " print(next_X)\n", + " # update data\n", + " X, comps = data[algo]\n", + " X, comps = make_new_data_u1(X, next_X, comps, q_comp_2)\n", + " data[algo] = (X, comps)\n", + " \n", + " # refit models\n", + " _, models[algo] = init_and_fit_model(X, comps)\n", + " \n", + " # record the best observed values so far\n", + " max_val = utility1(X).max().item()\n", + " best_vals[algo][-1].append(max_val)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "with open('best_vals_case_1_evil.pkl', 'wb') as handle:\n", + " pickle.dump(best_vals, handle, protocol=pickle.HIGHEST_PROTOCOL)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "with open('best_vals_case_1_evil.pkl', 'rb') as handle:\n", + " loaded_data = pickle.load(handle)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "loaded_data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 596 + }, + "id": "eRLF3-dFNzyW", + "outputId": "9c83df50-e355-42b9-860e-b4b51d63f2c5" + }, + "outputs": [], + "source": [ + "from matplotlib import pyplot as plt\n", + "\n", + "\n", + "%matplotlib inline\n", + "\n", + "plt.rcParams.update({\"font.size\": 14})\n", + "\n", + "algo_labels = {\n", + " \"rand\": \"Random Exploration\",\n", + " \"EUBO-LLM\": \"EUBO-LLM\",\n", + " \"EUBO\": \"EUBO\", \n", + "}\n", + "\n", + "\n", + "def ci(y):\n", + " return 1.96 * y.std(axis=0) / np.sqrt(y.shape[0])\n", + "\n", + "\n", + "# the utility function is maximized at the full vector of 1\n", + "#optimal_val = utility(torch.tensor([[1] * dim])).item()\n", + "iters = list(range(NUM_BATCHES + 1))\n", + "\n", + "fig, ax = plt.subplots(1, 1, figsize=(8, 6))\n", + "# plot the optimal value\n", + "#ax.plot(\n", + "# iters,\n", + "# [optimal_val] * len(iters),\n", + "# label=\"Optimal Function Value\",\n", + "# color=\"black\",\n", + "## linewidth=1.5,\n", + "#)\n", + "\n", + "# plot the the best observed value from each algorithm\n", + "for algo in algos:\n", + " ys = np.vstack(best_vals[algo])\n", + " ax.errorbar(\n", + " iters, ys.mean(axis=0), yerr=ci(ys), label=algo_labels[algo], linewidth=1.5\n", + " )\n", + "\n", + "ax.set(\n", + " #xlabel=f\"Number of queries q = {q_eubo}, num_initial_comp = {q_comp}, num_initial_samp = {q_data})\",\n", + " ylabel=\"Best observed value\\nas evaluated in the synthetic utility function\",\n", + " title=f\"Obj 1: minimising every output at the same time (typo in the word maximising)\",\n", + ")\n", + "\n", + "ax.set_xticks(np.arange(0, NUM_BATCHES + 1, 1))\n", + "\n", + "ax.set_xlabel(f\"Number of queries q = {q_eubo}, num_initial_comp = {q_comp}, num_initial_samp = {q_data})\", fontsize=10) # Reducing the font size\n", + "ax.legend(loc=\"best\")\n", + "plt.savefig(\"comparison_first_case_1_evil_muejeje_corrected.png\",bbox_inches=\"tight\", dpi=400)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "47P-W6iDOiHp" + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python [conda env:botorch_mar2024]", + "language": "python", + "name": "conda-env-botorch_mar2024-py" + }, + "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.11.0" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/data/preferentialBO_llm_multiplot_correction_case_2.ipynb b/data/preferentialBO_llm_multiplot_correction_case_2.ipynb new file mode 100644 index 0000000..2d3aba0 --- /dev/null +++ b/data/preferentialBO_llm_multiplot_correction_case_2.ipynb @@ -0,0 +1,1872 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#change utility2 by the corresponding number, get back utility 3 done\n", + "#change prompt done \n", + "#change pickle filename done\n", + "#change plot name done\n", + "#change objective name done" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": { + "id": "NTeLbyDoMi0-" + }, + "outputs": [], + "source": [ + "import os\n", + "import warnings\n", + "from itertools import combinations\n", + "\n", + "import numpy as np\n", + "import torch\n", + "import time\n", + "\n", + "# Suppress potential optimization warnings for cleaner notebook\n", + "warnings.filterwarnings(\"ignore\")\n", + "\n", + "SMOKE_TEST = os.environ.get(\"SMOKE_TEST\")" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [], + "source": [ + "import DTLZ2_model\n", + "import fischer_model\n", + "from botorch.test_functions.multi_objective import DTLZ2\n", + "from DTLZ2_model import neg_l1_dist\n", + "from DTLZ2_model import predict_DTLZ2_model\n", + "from fischer_model import predict_fischer_model\n", + "import tensorflow as tf\n", + "import random\n", + "\n", + "\n", + "from botorch.fit import fit_gpytorch_mll \n", + "from botorch.models.pairwise_gp import PairwiseGP, PairwiseLaplaceMarginalLogLikelihood \n", + "from botorch.models.transforms.input import Normalize\n", + "import pickle" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [], + "source": [ + " #Your chosen seed\n", + "your_seed = 42\n", + "\n", + "# Set seed for Python's RNG\n", + "random.seed(your_seed)\n", + "\n", + "# Set seed for NumPy RNG\n", + "np.random.seed(your_seed)\n", + "\n", + "# Set seed for PyTorch RNGs\n", + "torch.manual_seed(your_seed)\n", + "\n", + "# Ensure reproducibility for PyTorch operations (might reduce performance)\n", + "torch.backends.cudnn.deterministic = True\n", + "torch.backends.cudnn.benchmark = False\n", + "\n", + "# If using CUDA (PyTorch)\n", + "torch.cuda.manual_seed(your_seed)\n", + "torch.cuda.manual_seed_all(your_seed) # For multi-GPU setups\n" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n" + ] + }, + { + "data": { + "text/plain": [ + "tensor([[0.6455, 0.0591, 0.1161, 0.5071]])" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "predict_fischer_model(torch.tensor([[0.5, 0.5, 0.5, 0.5]]))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [], + "source": [ + "import cohere\n", + "co = cohere.Client('9ylnov4iFULBLovujZIJLq6x8pkq4NkyNCw0oePR')" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "id": "Mvj4PbSpNSjG" + }, + "outputs": [], + "source": [ + "# data generating helper functions\n", + "#function that defines the comparisons\n", + "def utility(X):\n", + " y=predict_fischer_model(X)\n", + " #weighted_y = y * torch.sqrt(torch.arange(y.size(-1), dtype=torch.float) + 1)\n", + " #y = torch.sum(weighted_y, dim=-1)\n", + " return y\n", + "\n", + "def utility1(X): #The four outputs are equally important, and we want to maximize all of them.\n", + " y=predict_fischer_model(X)\n", + " y = torch.sum(y, dim=-1)\n", + " return y\n", + "\n", + "def utility2(X): #We only want to maximize the CO conversion.\n", + " y=predict_fischer_model(X)\n", + " y = y[:,0]\n", + " return y\n", + "\n", + "def utility3(X): # The light olefins is considered as a negative output and we want to minimize it while maximizing the other three objectives.\n", + " y=predict_fischer_model(X)\n", + " y = y[:,0]+y[:,1]+y[:,2]-y[:,3]\n", + " return y\n", + " \n", + "def ini(n,dim):\n", + " X = torch.rand(n, dim, dtype=torch.float64)\n", + " return X\n", + "def generate_data(X, dim=4):\n", + " \"\"\"Generate data X and y\"\"\"\n", + " # X is randomly sampled from dim-dimentional unit cube\n", + " # we recommend using double as opposed to float tensor here for\n", + " # better numerical stability\n", + " #X=ini(n,dim)\n", + " x_2=tf.convert_to_tensor(X, dtype=tf.float32)\n", + " y = utility(x_2)\n", + " return y\n", + "\n", + "def generate_data_u1(X, dim=4):\n", + " \"\"\"Generate data X and y\"\"\"\n", + " # X is randomly sampled from dim-dimentional unit cube\n", + " # we recommend using double as opposed to float tensor here for\n", + " # better numerical stability\n", + " #X=ini(n,dim)\n", + " x_2=tf.convert_to_tensor(X, dtype=tf.float32)\n", + " y = utility2(x_2)\n", + " return y" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [], + "source": [ + "def generate_comparisons(y, n_comp, noise=0.1, replace=False):\n", + " \"\"\"Create pairwise comparisons with noise\"\"\"\n", + " # generate all possible pairs of elements in y\n", + " all_pairs = np.array(list(combinations(range(y.shape[0]), 2)))\n", + " # randomly select n_comp pairs from all_pairs\n", + " comp_pairs = all_pairs[\n", + " np.random.choice(range(len(all_pairs)), n_comp, replace=replace)\n", + " ]\n", + " # add gaussian noise to the latent y values\n", + " c0 = y[comp_pairs[:, 0]] + np.random.standard_normal(len(comp_pairs)) * noise\n", + " c1 = y[comp_pairs[:, 1]] + np.random.standard_normal(len(comp_pairs)) * noise\n", + " reverse_comp = (c0 < c1).numpy()\n", + " comp_pairs[reverse_comp, :] = np.flip(comp_pairs[reverse_comp, :], 1)\n", + " comp_pairs = torch.tensor(comp_pairs).long()\n", + "\n", + " return comp_pairs" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [], + "source": [ + "#im not sure if this is is the correct function, i'm a bit eepy\n", + "#remember to reduce the number of comparisons n_comp,\n", + "def generate_comparisons_llm(y, n_comp, replace=False):\n", + " \"\"\"Create pairwise comparisons with noise\"\"\"\n", + " # generate all possible pairs of elements in y\n", + " all_pairs = np.array(list(combinations(range(y.shape[0]), 2)))\n", + " # randomly select n_comp pairs from all_pairs\n", + " comp_pairs = all_pairs[\n", + " np.random.choice(range(len(all_pairs)), n_comp, replace=replace)\n", + " ]\n", + " #parsing the tensor to get the strings for the LLM\n", + " new_pairs=[]\n", + " for opto in comp_pairs:\n", + " firstoption=opto[0]\n", + " secondoption=opto[1]\n", + " numfirst=(y[firstoption,:])\n", + " firstoutput1=f\"{numfirst[0].cpu().numpy():.1f}\"\n", + " firstoutput2=f\"{numfirst[1].cpu().numpy():.1f}\"\n", + " firstoutput3=f\"{numfirst[2].cpu().numpy():.1f}\"\n", + " firstoutput4=f\"{numfirst[3].cpu().numpy():.1f}\"\n", + " numsecond=(y[secondoption,:])\n", + " secondoutput1=f\"{numsecond[0].cpu().numpy():.1f}\"\n", + " secondoutput2=f\"{numsecond[1].cpu().numpy():.1f}\"\n", + " secondoutput3=f\"{numsecond[2].cpu().numpy():.1f}\"\n", + " secondoutput4=f\"{numsecond[3].cpu().numpy():.1f}\"\n", + " mess=\"Suppose you're managing a Fischer-Tropsch synthesis process. We only want to maximize the CO conversion. Option A: regime of \"+firstoutput1+\" CO conversion, \"+firstoutput2+\" methane, \"+firstoutput3+\" paraffin, \"+firstoutput4+\" light olefins. Option B: regime of \"+secondoutput1+\" CO conversion, \"+secondoutput2+\" methane, \"+secondoutput3+\" paraffins, \"+secondoutput4+\" light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\"\n", + " print(mess)\n", + " response = co.chat(message=mess,\n", + " #perform web search before answering the question. You can also use your own custom connector.\n", + " #connectors=[{\"id\": \"web-search\"}]\n", + " )\n", + " print(response.text)\n", + " opllm=response.text\n", + " \n", + " if \"Option A\" in opllm:\n", + " new_pairs.append(opto.tolist())\n", + " else:\n", + " new_pairs.append(list(reversed(opto)))\n", + " #api restrictions 20 API calls/minutes\n", + " time.sleep(6)\n", + " \n", + " return torch.tensor(new_pairs)\n", + "\n", + "#\"Suppose you're managing a Fischer-Tropsch synthesis process. The four outputs are equally important, and we want to maximize all of them. Option A: regime of \"+firstoutput1+\" CO conversion, \"+firstoutput2+\" methane production, \"+firstoutput3+\" paraffins, \"+firstoutput4+\" light olefins. Option B: regime of \"+secondoutput1+\" CO conversion, \"+secondoutput2+\" methane production, \"+secondoutput3+\" paraffins, \"+secondoutput4+\" light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\"\n", + "#\"Suppose you're managing a Fischer-Tropsch synthesis process. The light olefins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of \"+firstoutput1+\" CO conversion, \"+firstoutput2+\" methane, \"+firstoutput3+\" paraffin, \"+firstoutput4+\" light olefins. Option B: regime of \"+secondoutput1+\" CO conversion, \"+secondoutput2+\" methane, \"+secondoutput3+\" paraffins, \"+secondoutput4+\" light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\"\n", + "#\"Suppose you're managing a Fischer-Tropsch synthesis process. We only want to maximize the CO conversion. Option A: regime of \"+firstoutput1+\" CO conversion, \"+firstoutput2+\" methane, \"+firstoutput3+\" paraffin, \"+firstoutput4+\" light olefins. Option B: regime of \"+secondoutput1+\" CO conversion, \"+secondoutput2+\" methane, \"+secondoutput3+\" paraffins, \"+secondoutput4+\" light olefins. Choose only one option, only answer with 'Option A' or 'Option B'\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "m5F2xn-8N-g9" + }, + "source": [ + "#parameters\n", + "torch.manual_seed(123)\n", + "#number for initial data\n", + "n = 5 if not SMOKE_TEST else 5\n", + "#number for initial comparisons\n", + "m = 10 if not SMOKE_TEST else 10\n", + "dim = 4\n", + "noise = 0.1\n", + "\n", + "#generate data, initial data\n", + "train_X, train_y = generate_data(n, dim=dim)\n", + "#generating comparison based on the utility function" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "train_comp_llm = generate_comparisons_llm(train_y, m)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "train_comp_llm" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "fMuLBRO-NVj3" + }, + "source": [ + "from botorch.fit import fit_gpytorch_mll\n", + "from botorch.models.pairwise_gp import PairwiseGP, PairwiseLaplaceMarginalLogLikelihood\n", + "from botorch.models.transforms.input import Normalize\n", + "\n", + "#fitting the first pairwise GP\n", + "model = PairwiseGP(\n", + " train_X,\n", + " train_comp_llm,\n", + " input_transform=Normalize(d=train_X.shape[-1]),\n", + ")\n", + "mll = PairwiseLaplaceMarginalLogLikelihood(model.likelihood, model)\n", + "mll = fit_gpytorch_mll(mll)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "OdxhkF6yNZKp", + "outputId": "0e3b833e-7a46-4413-f148-7e3fab6d8433" + }, + "source": [ + "from scipy.stats import kendalltau\n", + "\n", + "\n", + "# Kendall-Tau rank correlation\n", + "def eval_kt_cor(model, test_X, test_y):\n", + " pred_y = model.posterior(test_X).mean.squeeze().detach().numpy()\n", + " return kendalltau(pred_y, test_y).correlation\n", + "\n", + "\n", + "n_kendall = 10 if not SMOKE_TEST else 10\n", + "\n", + "test_X, test_y = generate_data(n_kendall, dim=dim)\n", + "kt_correlation = eval_kt_cor(model, test_X, test_y[:,3])\n", + "\n", + "print(f\"Test Kendall-Tau rank correlation: {kt_correlation:.4f}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": { + "id": "qEoN28RSNk2N" + }, + "outputs": [], + "source": [ + "from botorch.acquisition.preference import AnalyticExpectedUtilityOfBestOption\n", + "from botorch.optim import optimize_acqf\n", + "\n", + "#wrapper for the model\n", + "def init_and_fit_model(X, comp):\n", + " \"\"\"Model fitting helper function\"\"\"\n", + " model = PairwiseGP(\n", + " X,\n", + " comp,\n", + " input_transform=Normalize(d=X.shape[-1]),\n", + " )\n", + " mll = PairwiseLaplaceMarginalLogLikelihood(model.likelihood, model)\n", + " fit_gpytorch_mll(mll)\n", + " return mll, model\n", + "\n", + "#wrapper for making new data, what does it mean? return comps\n", + "\n", + "def make_new_data(X, next_X, comps, q_comp):\n", + " \"\"\"Given X and next_X,\n", + " generate q_comp new comparisons between next_X\n", + " and return the concatenated X and comparisons\n", + " \"\"\"\n", + " # next_X is float by default; cast it to the dtype of X (i.e., double)\n", + " next_X = next_X.to(X)\n", + " x_2=tf.convert_to_tensor(next_X, dtype=tf.float32)\n", + " next_y = utility(x_2)\n", + " next_comps = generate_comparisons_llm(next_y, n_comp=q_comp)\n", + " comps = torch.cat([comps, next_comps + X.shape[-2]])\n", + " X = torch.cat([X, next_X])\n", + " return X, comps\n", + "\n", + "def make_new_data_u1(X, next_X, comps, q_comp):\n", + " \"\"\"Given X and next_X,\n", + " generate q_comp new comparisons between next_X\n", + " and return the concatenated X and comparisons\n", + " \"\"\"\n", + " # next_X is float by default; cast it to the dtype of X (i.e., double)\n", + " next_X = next_X.to(X)\n", + " x_2=tf.convert_to_tensor(next_X, dtype=tf.float32)\n", + " next_y = utility2(x_2)\n", + " next_comps = generate_comparisons(next_y, n_comp=q_comp)\n", + " comps = torch.cat([comps, next_comps + X.shape[-2]])\n", + " X = torch.cat([X, next_X])\n", + " return X, comps" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": { + "id": "1pTEh0DMNv1w" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.2 CO conversion, 0.0 methane, 0.0 paraffin, 0.2 light oleffins. Option B: regime of 0.6 CO conversion, 0.0 methane, 0.1 paraffins, 0.5 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.7 CO conversion, 0.1 methane, 0.2 paraffin, 0.4 light oleffins. Option B: regime of 0.2 CO conversion, 0.0 methane, 0.0 paraffins, 0.2 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.2 CO conversion, 0.0 methane, 0.0 paraffin, 0.2 light oleffins. Option B: regime of 0.5 CO conversion, 0.0 methane, 0.1 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.7 CO conversion, 0.1 methane, 0.2 paraffin, 0.4 light oleffins. Option B: regime of 0.6 CO conversion, 0.0 methane, 0.1 paraffins, 0.5 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.7 CO conversion, 0.1 methane, 0.2 paraffin, 0.4 light oleffins. Option B: regime of 0.8 CO conversion, 0.1 methane, 0.2 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.2 CO conversion, 0.0 methane, 0.0 paraffin, 0.2 light oleffins. Option B: regime of 0.8 CO conversion, 0.1 methane, 0.2 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.5 CO conversion, 0.0 methane, 0.1 paraffin, 0.6 light oleffins. Option B: regime of 0.6 CO conversion, 0.0 methane, 0.1 paraffins, 0.5 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.6 CO conversion, 0.0 methane, 0.1 paraffin, 0.5 light oleffins. Option B: regime of 0.8 CO conversion, 0.1 methane, 0.2 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.7 CO conversion, 0.1 methane, 0.2 paraffin, 0.4 light oleffins. Option B: regime of 0.5 CO conversion, 0.0 methane, 0.1 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.5 CO conversion, 0.0 methane, 0.1 paraffin, 0.6 light oleffins. Option B: regime of 0.8 CO conversion, 0.1 methane, 0.2 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "1\n", + "tensor([[0.6177, 0.2997, 0.6399, 0.9175],\n", + " [0.2291, 0.0543, 0.7329, 0.7803]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "tensor([[1.0000, 0.7325, 0.6223, 1.0000],\n", + " [0.9604, 0.7575, 0.2742, 0.8219]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.9 CO conversion, 0.2 methane, 0.3 paraffin, 0.6 light oleffins. Option B: regime of 0.4 CO conversion, 0.0 methane, 0.1 paraffins, 0.2 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "tensor([[0.5654, 0.1800, 0.7764, 0.7375],\n", + " [0.7258, 0.4854, 0.5205, 0.6100]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "2\n", + "tensor([[0.6758, 0.3608, 0.8161, 0.8731],\n", + " [0.5372, 0.1989, 0.4826, 0.9668]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "tensor([[1.0000, 0.7393, 0.5811, 0.9989],\n", + " [0.7551, 1.0000, 0.0000, 0.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.9 CO conversion, 0.1 methane, 0.3 paraffin, 0.5 light oleffins. Option B: regime of 0.0 CO conversion, 0.0 methane, 0.0 paraffins, 0.1 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "tensor([[0.7254, 0.7166, 0.0501, 0.2474],\n", + " [0.0449, 0.9838, 0.2425, 0.8623]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "3\n", + "tensor([[0.8182, 0.1743, 0.7650, 0.8240],\n", + " [0.4948, 0.5037, 0.8033, 0.9617]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "tensor([[1.0000, 1.0000, 0.6369, 1.0000],\n", + " [1.0000, 0.5098, 0.6041, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.9 CO conversion, 0.2 methane, 0.4 paraffin, 0.6 light oleffins. Option B: regime of 0.9 CO conversion, 0.1 methane, 0.3 paraffins, 0.5 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "tensor([[0.9381, 0.4161, 0.2674, 0.5551],\n", + " [0.5027, 0.0099, 0.2437, 0.0720]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "4\n", + "tensor([[0.5470, 0.4434, 0.6764, 0.9883],\n", + " [0.5354, 0.4861, 1.0000, 0.8743]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "tensor([[1.0000, 0.9396, 0.8866, 1.0000],\n", + " [1.0000, 0.9841, 0.4887, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 1.0 CO conversion, 0.5 methane, 0.8 paraffin, 0.6 light oleffins. Option B: regime of 0.8 CO conversion, 0.1 methane, 0.2 paraffins, 0.5 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "tensor([[0.8639, 0.7200, 0.3087, 0.6760],\n", + " [0.2526, 0.9573, 0.3448, 0.2589]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "5\n", + "tensor([[0.5168, 0.2822, 1.0000, 0.9545],\n", + " [0.5628, 0.6631, 0.9213, 0.8618]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "tensor([[1.0000, 1.0000, 1.0000, 0.3902],\n", + " [1.0000, 0.9359, 0.8308, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.9 CO conversion, 0.8 methane, 0.5 paraffin, 0.7 light oleffins. Option B: regime of 1.0 CO conversion, 0.4 methane, 0.7 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "tensor([[0.2512, 0.4833, 0.2143, 0.1475],\n", + " [0.9272, 0.0715, 0.7356, 0.3519]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "6\n", + "tensor([[0.2716, 0.3918, 1.0000, 1.0000],\n", + " [0.6775, 0.3429, 1.0000, 0.9131]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "tensor([[1.0000, 0.9725, 0.9456, 0.2324],\n", + " [1.0000, 1.0000, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.9 CO conversion, 0.7 methane, 0.3 paraffin, 0.8 light oleffins. Option B: regime of 1.0 CO conversion, 0.7 methane, 0.9 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "tensor([[0.7467, 0.9901, 0.3281, 0.4511],\n", + " [0.5020, 0.7669, 0.9661, 0.0778]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "7\n", + "tensor([[0.5401, 0.2585, 1.0000, 0.7968],\n", + " [0.6834, 0.4090, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 19ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "tensor([[1.0000, 0.0000, 0.0000, 1.0000],\n", + " [1.0000, 0.9933, 1.0000, 0.8806]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.0 CO conversion, -0.0 methane, -0.0 paraffin, 0.0 light oleffins. Option B: regime of 1.0 CO conversion, 0.7 methane, 0.9 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "tensor([[0.6354, 0.9786, 0.6545, 0.7508],\n", + " [0.7092, 0.5375, 0.8792, 0.2227]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "8\n", + "tensor([[0.6613, 0.3826, 1.0000, 0.9974],\n", + " [0.0000, 0.0000, 0.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "tensor([[1.0000, 1.0000, 1.0000, 1.0000],\n", + " [1.0000, 1.0000, 1.0000, 0.4929]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 1.0 CO conversion, 0.7 methane, 0.9 paraffin, 0.6 light oleffins. Option B: regime of 1.0 CO conversion, 0.7 methane, 0.6 paraffins, 0.7 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "tensor([[0.9644, 0.0921, 0.1329, 0.1336],\n", + " [0.5406, 0.3748, 0.1866, 0.6932]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "9\n", + "tensor([[0.5694, 0.3920, 1.0000, 1.0000],\n", + " [1.0000, 0.3627, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "tensor([[1.0000, 1.0000, 0.5368, 1.0000],\n", + " [1.0000, 1.0000, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.8 CO conversion, 0.1 methane, 0.2 paraffin, 0.5 light oleffins. Option B: regime of 1.0 CO conversion, 0.7 methane, 0.9 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "tensor([[0.0198, 0.8570, 0.8664, 0.8144],\n", + " [0.1911, 0.1642, 0.7881, 0.2199]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "10\n", + "tensor([[1.0000, 0.1348, 1.0000, 1.0000],\n", + " [0.8626, 0.5018, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "tensor([[1., 1., 1., 1.],\n", + " [0., 1., 0., 0.]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 1.0 CO conversion, 0.7 methane, 0.9 paraffin, 0.6 light oleffins. Option B: regime of -0.0 CO conversion, 0.0 methane, -0.0 paraffins, 0.1 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "tensor([[0.5156, 0.3450, 0.3222, 0.2297],\n", + " [0.8105, 0.0733, 0.0857, 0.8852]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "11\n", + "tensor([[1.0000, 0.4687, 1.0000, 1.0000],\n", + " [0.6251, 0.3936, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "tensor([[1.0000, 1.0000, 1.0000, 1.0000],\n", + " [0.7204, 1.0000, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 1.0 CO conversion, 0.7 methane, 0.9 paraffin, 0.6 light oleffins. Option B: regime of 1.0 CO conversion, 0.6 methane, 0.9 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "tensor([[0.7099, 0.5003, 0.1335, 0.1641],\n", + " [0.7801, 0.6903, 0.0329, 0.5920]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "12\n", + "tensor([[1.0000, 0.5965, 1.0000, 1.0000],\n", + " [1.0000, 0.3929, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "tensor([[0.6448, 1.0000, 1.0000, 1.0000],\n", + " [1.0000, 1.0000, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 1.0 CO conversion, 0.6 methane, 0.8 paraffin, 0.6 light oleffins. Option B: regime of 1.0 CO conversion, 0.7 methane, 0.9 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "tensor([[0.8778, 0.1557, 0.2553, 0.6148],\n", + " [0.4871, 0.9949, 0.4758, 0.2973]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step\n", + "13\n", + "tensor([[1.0000, 0.4680, 1.0000, 1.0000],\n", + " [1.0000, 0.8591, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "tensor([[1.0000, 0.6703, 1.0000, 1.0000],\n", + " [1.0000, 1.0000, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 1.0 CO conversion, 0.6 methane, 0.9 paraffin, 0.6 light oleffins. Option B: regime of 1.0 CO conversion, 0.7 methane, 0.9 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "tensor([[0.3469, 0.6731, 0.7004, 0.0488],\n", + " [0.9098, 0.6898, 0.1757, 0.0534]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "14\n", + "tensor([[1.0000, 0.5527, 1.0000, 1.0000],\n", + " [1.0000, 1.0000, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[1., 1., 1., 1.],\n", + " [1., 0., 0., 1.]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 1.0 CO conversion, 0.7 methane, 0.9 paraffin, 0.6 light oleffins. Option B: regime of 0.0 CO conversion, -0.0 methane, -0.0 paraffins, 0.0 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[0.9101, 0.0877, 0.3781, 0.3361],\n", + " [0.7931, 0.8255, 0.3934, 0.2959]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "15\n", + "tensor([[1.0000, 1.0000, 1.0000, 1.0000],\n", + " [0.6257, 1.0000, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "tensor([[1.0000, 1.0000, 1.0000, 0.5991],\n", + " [1.0000, 1.0000, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 1.0 CO conversion, 0.7 methane, 0.7 paraffin, 0.7 light oleffins. Option B: regime of 1.0 CO conversion, 0.7 methane, 0.9 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "tensor([[0.6470, 0.0723, 0.9074, 0.2030],\n", + " [0.1599, 0.1590, 0.9710, 0.3702]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "16\n", + "tensor([[1.0000, 0.6570, 1.0000, 1.0000],\n", + " [1.0000, 1.0000, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "tensor([[1., 1., 1., 1.],\n", + " [0., 1., 1., 1.]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 23ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 1.0 CO conversion, 0.7 methane, 0.9 paraffin, 0.6 light oleffins. Option B: regime of 1.0 CO conversion, 0.5 methane, 0.6 paraffins, 0.7 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[0.2117, 0.3380, 0.9604, 0.3309],\n", + " [0.3866, 0.3971, 0.8446, 0.0320]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "17\n", + "tensor([[1., 1., 1., 0.],\n", + " [1., 1., 1., 1.]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[1., 1., 1., 1.],\n", + " [0., 1., 1., 0.]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 1.0 CO conversion, 0.7 methane, 0.9 paraffin, 0.6 light oleffins. Option B: regime of 0.5 CO conversion, 0.7 methane, 0.1 paraffins, 0.9 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[0.4663, 0.0035, 0.4408, 0.1505],\n", + " [0.4109, 0.9005, 0.8109, 0.7674]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "18\n", + "tensor([[1.0000, 1.0000, 1.0000, 1.0000],\n", + " [1.0000, 1.0000, 1.0000, 0.5997]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[1.0000, 1.0000, 1.0000, 0.6505],\n", + " [1.0000, 1.0000, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 1.0 CO conversion, 0.7 methane, 0.7 paraffin, 0.7 light oleffins. Option B: regime of 1.0 CO conversion, 0.7 methane, 0.9 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "tensor([[0.1265, 0.4509, 0.7086, 0.6109],\n", + " [0.9087, 0.8497, 0.0846, 0.7654]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "19\n", + "tensor([[1., 0., 0., 1.],\n", + " [1., 1., 1., 1.]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[0.7527, 1.0000, 1.0000, 1.0000],\n", + " [1.0000, 1.0000, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 1.0 CO conversion, 0.6 methane, 0.9 paraffin, 0.6 light oleffins. Option B: regime of 1.0 CO conversion, 0.7 methane, 0.9 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[0.7915, 0.4321, 0.5067, 0.7510],\n", + " [0.1985, 0.3006, 0.3991, 0.8089]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "20\n", + "tensor([[1., 1., 1., 1.],\n", + " [0., 0., 0., 0.]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[0., 0., 0., 1.],\n", + " [1., 1., 1., 1.]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of -0.0 CO conversion, -0.0 methane, -0.0 paraffin, 0.0 light oleffins. Option B: regime of 1.0 CO conversion, 0.7 methane, 0.9 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[0.4354, 0.0817, 0.2798, 0.8164],\n", + " [0.9257, 0.6359, 0.9672, 0.2769]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 23ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.7 CO conversion, 0.1 methane, 0.1 paraffin, 0.6 light oleffins. Option B: regime of 0.1 CO conversion, 0.0 methane, 0.0 paraffins, 0.1 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.1 CO conversion, 0.0 methane, 0.0 paraffin, 0.1 light oleffins. Option B: regime of 0.7 CO conversion, 0.1 methane, 0.1 paraffins, 0.5 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.7 CO conversion, 0.1 methane, 0.1 paraffin, 0.6 light oleffins. Option B: regime of 0.7 CO conversion, 0.1 methane, 0.1 paraffins, 0.5 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.6 CO conversion, 0.0 methane, 0.1 paraffin, 0.4 light oleffins. Option B: regime of 0.7 CO conversion, 0.1 methane, 0.1 paraffins, 0.5 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.2 CO conversion, 0.0 methane, 0.0 paraffin, 0.2 light oleffins. Option B: regime of 0.1 CO conversion, 0.0 methane, 0.0 paraffins, 0.1 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.2 CO conversion, 0.0 methane, 0.0 paraffin, 0.2 light oleffins. Option B: regime of 0.7 CO conversion, 0.1 methane, 0.1 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.2 CO conversion, 0.0 methane, 0.0 paraffin, 0.2 light oleffins. Option B: regime of 0.7 CO conversion, 0.1 methane, 0.1 paraffins, 0.5 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.6 CO conversion, 0.0 methane, 0.1 paraffin, 0.4 light oleffins. Option B: regime of 0.1 CO conversion, 0.0 methane, 0.0 paraffins, 0.1 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.2 CO conversion, 0.0 methane, 0.0 paraffin, 0.2 light oleffins. Option B: regime of 0.6 CO conversion, 0.0 methane, 0.1 paraffins, 0.4 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.6 CO conversion, 0.0 methane, 0.1 paraffin, 0.4 light oleffins. Option B: regime of 0.7 CO conversion, 0.1 methane, 0.1 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 24ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 18ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "1\n", + "tensor([[0.6082, 0.3735, 0.5196, 0.8198],\n", + " [0.7911, 0.2389, 0.5985, 0.5188]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "tensor([[0.0444, 0.2079, 0.2379, 0.1920],\n", + " [0.0000, 1.0000, 0.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 23ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.2 CO conversion, 0.0 methane, 0.0 paraffin, 0.2 light oleffins. Option B: regime of 0.0 CO conversion, -0.0 methane, -0.0 paraffins, 0.0 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "tensor([[0.3912, 0.5473, 0.0571, 0.5511],\n", + " [0.0633, 0.5066, 0.4173, 0.3432]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "2\n", + "tensor([[0.4269, 0.3608, 0.5881, 0.7595],\n", + " [0.8308, 0.3706, 0.4788, 0.8738]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "tensor([[0.1080, 0.0000, 0.3048, 0.4557],\n", + " [0.0000, 0.3403, 0.1779, 0.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.3 CO conversion, 0.0 methane, 0.0 paraffin, 0.2 light oleffins. Option B: regime of 0.1 CO conversion, 0.0 methane, -0.0 paraffins, 0.2 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "tensor([[0.8680, 0.6853, 0.2461, 0.8899],\n", + " [0.2462, 0.7710, 0.5607, 0.2799]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "3\n", + "tensor([[0.7890, 0.3600, 0.4937, 0.8556],\n", + " [0.9999, 0.8352, 0.3871, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "tensor([[0.0440, 0.0000, 0.4585, 0.2577],\n", + " [0.1396, 0.0042, 0.1614, 0.5909]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.5 CO conversion, 0.0 methane, 0.0 paraffin, 0.4 light oleffins. Option B: regime of 0.1 CO conversion, 0.0 methane, 0.0 paraffins, 0.1 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "tensor([[0.2055, 0.2223, 0.6247, 0.9686],\n", + " [0.3349, 0.2596, 0.7789, 0.4221]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "4\n", + "tensor([[0.9599, 0.3802, 0.5507, 1.0000],\n", + " [0.6848, 0.4103, 0.4459, 0.7565]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "tensor([[0.1190, 0.0000, 0.3695, 0.0348],\n", + " [0.0000, 0.0539, 0.4695, 0.5708]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.3 CO conversion, 0.0 methane, 0.0 paraffin, 0.4 light oleffins. Option B: regime of 0.5 CO conversion, 0.0 methane, 0.1 paraffins, 0.4 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "tensor([[0.0677, 0.0746, 0.5617, 0.7099],\n", + " [0.0694, 0.2303, 0.8347, 0.6851]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "5\n", + "tensor([[0.9448, 0.3945, 0.5446, 1.0000],\n", + " [0.0000, 1.0000, 1.0000, 0.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "tensor([[0.1962, 0.0000, 0.3199, 0.2231],\n", + " [0.0000, 0.0000, 0.4613, 0.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.3 CO conversion, 0.0 methane, 0.0 paraffin, 0.3 light oleffins. Option B: regime of 0.3 CO conversion, 0.0 methane, 0.0 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "tensor([[0.7869, 0.2817, 0.4980, 0.2046],\n", + " [0.3264, 0.5608, 0.3680, 0.9267]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "6\n", + "tensor([[0.9379, 0.4296, 0.7420, 1.0000],\n", + " [1.0000, 0.3803, 0.4536, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 20ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step\n", + "tensor([[0.1176, 0.0000, 0.2286, 0.0000],\n", + " [0.1938, 0.0000, 0.4111, 0.3015]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.1 CO conversion, 0.0 methane, 0.0 paraffin, 0.2 light oleffins. Option B: regime of 0.4 CO conversion, 0.0 methane, 0.0 paraffins, 0.4 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "tensor([[0.8957, 0.3233, 0.7760, 0.5090],\n", + " [0.5851, 0.1007, 0.9967, 0.4309]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 23ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "7\n", + "tensor([[0.8982, 0.4899, 0.6891, 1.0000],\n", + " [1.0000, 0.2540, 0.9589, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "tensor([[0.0000, 0.0000, 0.2307, 0.2060],\n", + " [0.2154, 0.0000, 0.3078, 0.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.2 CO conversion, 0.0 methane, 0.0 paraffin, 0.2 light oleffins. Option B: regime of 0.2 CO conversion, 0.0 methane, 0.0 paraffins, 0.4 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "tensor([[0.6695, 0.3013, 0.3241, 0.6659],\n", + " [0.9829, 0.1634, 0.2829, 0.4403]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 18ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "8\n", + "tensor([[1.0000, 0.0393, 1.0000, 1.0000],\n", + " [1.0000, 0.3716, 0.9979, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 20ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "tensor([[0.0000, 1.0000, 1.0000, 1.0000],\n", + " [0.0507, 0.0000, 0.2545, 0.1678]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 21ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 1.0 CO conversion, 0.5 methane, 0.6 paraffin, 0.7 light oleffins. Option B: regime of 0.2 CO conversion, 0.0 methane, 0.0 paraffins, 0.2 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "tensor([[0.2164, 0.5710, 0.0429, 0.9224],\n", + " [0.4430, 0.1435, 0.6459, 0.4312]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "9\n", + "tensor([[1.0000, 1.0000, 1.0000, 0.0000],\n", + " [1.0000, 0.3413, 0.9822, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "tensor([[0.0509, 0.0411, 0.2054, 0.1555],\n", + " [0.0000, 1.0000, 1.0000, 0.9751]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.1 CO conversion, 0.0 methane, 0.0 paraffin, 0.2 light oleffins. Option B: regime of 1.0 CO conversion, 0.5 methane, 0.6 paraffins, 0.7 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "tensor([[0.9156, 0.4084, 0.6375, 0.8703],\n", + " [0.9862, 0.3771, 0.8837, 0.5816]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 22ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "10\n", + "tensor([[1.0000, 0.4455, 1.0000, 0.6772],\n", + " [1.0000, 0.3223, 0.9679, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "tensor([[0.0554, 0.0000, 0.0000, 0.1192],\n", + " [0.0318, 0.1852, 0.5647, 0.2103]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.0 CO conversion, -0.0 methane, 0.0 paraffin, 0.0 light oleffins. Option B: regime of 0.6 CO conversion, 0.0 methane, 0.1 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "tensor([[0.7495, 0.2078, 0.6720, 0.4356],\n", + " [0.6617, 0.2900, 0.0998, 0.1312]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "11\n", + "tensor([[1.0000, 0.3943, 1.0000, 0.8229],\n", + " [1.0000, 0.6718, 1.0000, 0.4640]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "tensor([[0.0520, 0.0000, 0.0598, 0.1303],\n", + " [0.1185, 0.0000, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.0 CO conversion, 0.0 methane, 0.0 paraffin, 0.1 light oleffins. Option B: regime of 1.0 CO conversion, 0.3 methane, 0.6 paraffins, 0.7 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "tensor([[0.5246, 0.4095, 0.1039, 0.0574],\n", + " [0.4033, 0.4359, 0.4100, 0.0575]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "12\n", + "tensor([[1.0000, 0.4478, 1.0000, 1.0000],\n", + " [1.0000, 0.3677, 1.0000, 0.6744]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "tensor([[0.0530, 0.0000, 0.0523, 0.1331],\n", + " [0.0000, 1.0000, 1.0000, 0.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.0 CO conversion, -0.0 methane, 0.0 paraffin, 0.0 light oleffins. Option B: regime of 0.5 CO conversion, 0.7 methane, 0.1 paraffins, 0.9 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "tensor([[0.7350, 0.1519, 0.1232, 0.9347],\n", + " [0.1101, 0.4343, 0.2923, 0.9227]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 21ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "13\n", + "tensor([[1.0000, 0.4323, 1.0000, 0.9441],\n", + " [0.5546, 0.4667, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "tensor([[0.0524, 0.0000, 0.0339, 0.1338],\n", + " [0.0000, 1.0000, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.0 CO conversion, -0.0 methane, 0.0 paraffin, 0.0 light oleffins. Option B: regime of 1.0 CO conversion, 0.5 methane, 0.6 paraffins, 0.7 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 25ms/step\n", + "tensor([[0.5005, 0.5854, 0.6256, 0.9031],\n", + " [0.5839, 0.3239, 0.6793, 0.2186]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 21ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "14\n", + "tensor([[1.0000, 0.4419, 1.0000, 0.9380],\n", + " [0.0000, 1.0000, 0.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 25ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[1.0000, 1.0000, 0.0000, 1.0000],\n", + " [0.0532, 0.0000, 0.1018, 0.1447]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.1 CO conversion, -0.0 methane, 0.0 paraffin, 0.0 light oleffins. Option B: regime of 0.1 CO conversion, 0.0 methane, 0.0 paraffins, 0.1 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[0.9602, 0.5366, 0.9961, 0.6156],\n", + " [0.9453, 0.9278, 0.0870, 0.0119]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "15\n", + "tensor([[1.0000, 0.5256, 1.0000, 1.0000],\n", + " [1.0000, 0.3675, 1.0000, 0.8792]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 25ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[0.0000, 0.0302, 0.1073, 0.1433],\n", + " [1.0000, 1.0000, 0.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 31ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.1 CO conversion, 0.0 methane, 0.0 paraffin, 0.1 light oleffins. Option B: regime of 0.1 CO conversion, -0.0 methane, 0.0 paraffins, 0.0 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[0.8312, 0.2366, 0.8058, 0.1371],\n", + " [0.4488, 0.2742, 0.2944, 0.5531]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 20ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "16\n", + "tensor([[1.0000, 0.4887, 1.0000, 1.0000],\n", + " [0.0000, 1.0000, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "tensor([[1.0000, 1.0000, 0.0000, 1.0000],\n", + " [0.0000, 0.0000, 0.1047, 0.1176]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.1 CO conversion, -0.0 methane, 0.0 paraffin, 0.0 light oleffins. Option B: regime of 0.1 CO conversion, 0.0 methane, 0.0 paraffins, 0.1 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "tensor([[0.5232, 0.0053, 0.6012, 0.8333],\n", + " [0.0284, 0.1417, 0.9576, 0.1762]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 19ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "17\n", + "tensor([[1.0000, 0.6125, 1.0000, 1.0000],\n", + " [1.0000, 0.4068, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "tensor([[0.0000, 0.0000, 0.1043, 0.1180],\n", + " [1.0000, 1.0000, 0.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.1 CO conversion, 0.0 methane, 0.0 paraffin, 0.1 light oleffins. Option B: regime of 0.1 CO conversion, -0.0 methane, 0.0 paraffins, 0.0 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[0.2521, 0.1333, 0.3195, 0.2187],\n", + " [0.6494, 0.1933, 0.8217, 0.4500]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "18\n", + "tensor([[1.0000, 0.7642, 1.0000, 1.0000],\n", + " [1.0000, 0.4989, 1.0000, 0.9951]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "tensor([[0.0000, 0.3686, 0.0000, 0.5195],\n", + " [1.0000, 1.0000, 0.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 18ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.0 CO conversion, -0.0 methane, 0.0 paraffin, 0.0 light oleffins. Option B: regime of 0.1 CO conversion, -0.0 methane, 0.0 paraffins, 0.0 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[0.9282, 0.0251, 0.3828, 0.9332],\n", + " [0.7672, 0.6956, 0.9584, 0.3137]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "19\n", + "tensor([[1.0000, 0.6292, 1.0000, 0.9912],\n", + " [1.0000, 1.0000, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "tensor([[1.0000, 1.0000, 0.5158, 1.0000],\n", + " [1.0000, 1.0000, 0.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.8 CO conversion, 0.1 methane, 0.2 paraffin, 0.5 light oleffins. Option B: regime of 0.1 CO conversion, -0.0 methane, 0.0 paraffins, 0.0 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "tensor([[0.4905, 0.5749, 0.4102, 0.1215],\n", + " [0.3458, 0.1397, 0.1100, 0.8460]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "20\n", + "tensor([[0.7199, 1.0000, 1.0000, 1.0000],\n", + " [1.0000, 0.9561, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "tensor([[1.0000, 1.0000, 0.0000, 1.0000],\n", + " [1.0000, 1.0000, 0.6722, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.1 CO conversion, -0.0 methane, 0.0 paraffin, 0.0 light oleffins. Option B: regime of 1.0 CO conversion, 0.2 methane, 0.4 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[0.6402, 0.6727, 0.4438, 0.5870],\n", + " [0.9443, 0.0318, 0.0154, 0.1177]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 23ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 18ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.2 CO conversion, 0.0 methane, 0.0 paraffin, 0.1 light oleffins. Option B: regime of 0.9 CO conversion, 0.2 methane, 0.3 paraffins, 0.8 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.2 CO conversion, 0.0 methane, 0.0 paraffin, 0.1 light oleffins. Option B: regime of 0.1 CO conversion, 0.0 methane, 0.0 paraffins, 0.1 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.9 CO conversion, 0.1 methane, 0.3 paraffin, 0.7 light oleffins. Option B: regime of 0.8 CO conversion, 0.2 methane, 0.2 paraffins, 0.9 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.9 CO conversion, 0.2 methane, 0.3 paraffin, 0.8 light oleffins. Option B: regime of 0.8 CO conversion, 0.2 methane, 0.2 paraffins, 0.9 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.9 CO conversion, 0.1 methane, 0.3 paraffin, 0.7 light oleffins. Option B: regime of 0.9 CO conversion, 0.2 methane, 0.3 paraffins, 0.8 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.9 CO conversion, 0.1 methane, 0.3 paraffin, 0.7 light oleffins. Option B: regime of 0.2 CO conversion, 0.0 methane, 0.0 paraffins, 0.1 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.2 CO conversion, 0.0 methane, 0.0 paraffin, 0.1 light oleffins. Option B: regime of 0.8 CO conversion, 0.2 methane, 0.2 paraffins, 0.9 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.9 CO conversion, 0.1 methane, 0.3 paraffin, 0.7 light oleffins. Option B: regime of 0.1 CO conversion, 0.0 methane, 0.0 paraffins, 0.1 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.1 CO conversion, 0.0 methane, 0.0 paraffin, 0.1 light oleffins. Option B: regime of 0.9 CO conversion, 0.2 methane, 0.3 paraffins, 0.8 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.1 CO conversion, 0.0 methane, 0.0 paraffin, 0.1 light oleffins. Option B: regime of 0.8 CO conversion, 0.2 methane, 0.2 paraffins, 0.9 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "1\n", + "tensor([[0.8023, 0.2357, 0.8002, 0.5678],\n", + " [1.0000, 0.0000, 0.6578, 0.6086]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "tensor([[0.9317, 0.1886, 0.4910, 0.5372],\n", + " [0.9057, 0.0000, 0.8971, 0.5919]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.7 CO conversion, 0.0 methane, 0.1 paraffin, 0.5 light oleffins. Option B: regime of 0.9 CO conversion, 0.3 methane, 0.5 paraffins, 0.8 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "tensor([[0.5744, 0.8515, 0.5829, 0.1763],\n", + " [0.0864, 0.4500, 0.0437, 0.0554]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 27ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "2\n", + "tensor([[0.7201, 0.0000, 0.7756, 0.5372],\n", + " [0.8823, 0.4629, 0.8181, 0.5914]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "tensor([[0.9728, 0.3941, 0.5730, 0.5540],\n", + " [0.8933, 0.0000, 0.3822, 0.5133]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.8 CO conversion, 0.1 methane, 0.2 paraffin, 0.6 light oleffins. Option B: regime of 0.5 CO conversion, 0.0 methane, 0.1 paraffins, 0.3 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "tensor([[0.3293, 0.9207, 0.5022, 0.6772],\n", + " [0.4844, 0.3178, 0.8879, 0.0973]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "3\n", + "tensor([[0.8907, 0.3180, 0.9579, 0.6641],\n", + " [0.8496, 0.4733, 0.7207, 0.5302]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "tensor([[0.0000, 1.0000, 0.2609, 1.0000],\n", + " [0.9028, 0.0424, 0.4007, 0.5158]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.3 CO conversion, 0.0 methane, 0.1 paraffin, 0.1 light oleffins. Option B: regime of 0.5 CO conversion, 0.0 methane, 0.1 paraffins, 0.4 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "tensor([[0.8547, 0.0900, 0.4030, 0.1390],\n", + " [0.0382, 0.0690, 0.6727, 0.2978]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step\n", + "4\n", + "tensor([[0.8520, 0.3809, 0.9019, 0.8380],\n", + " [0.8989, 0.3349, 1.0000, 0.5436]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "tensor([[0.0000, 1.0000, 0.2735, 1.0000],\n", + " [1.0000, 0.0000, 0.5551, 0.6397]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.3 CO conversion, 0.0 methane, 0.1 paraffin, 0.2 light oleffins. Option B: regime of 0.8 CO conversion, 0.1 methane, 0.2 paraffins, 0.5 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "tensor([[0.1957, 0.8582, 0.2445, 0.8995],\n", + " [0.5101, 0.8579, 0.4598, 0.1437]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "5\n", + "tensor([[0.2079, 1.0000, 1.0000, 0.1858],\n", + " [0.8903, 0.3474, 1.0000, 0.5715]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step\n", + "tensor([[0.0000, 1.0000, 0.5300, 1.0000],\n", + " [0.0000, 1.0000, 0.0058, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.7 CO conversion, 0.1 methane, 0.1 paraffin, 0.4 light oleffins. Option B: regime of 0.0 CO conversion, -0.0 methane, -0.0 paraffins, 0.0 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "tensor([[0.2939, 0.0567, 0.5847, 0.5208],\n", + " [0.0944, 0.9922, 0.1282, 0.0941]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step\n", + "6\n", + "tensor([[0.8738, 0.2007, 1.0000, 0.5825],\n", + " [1.0000, 0.7337, 1.0000, 0.5885]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "tensor([[0.0000, 0.4635, 0.5010, 1.0000],\n", + " [0.0000, 1.0000, 0.4929, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.6 CO conversion, 0.0 methane, 0.1 paraffin, 0.4 light oleffins. Option B: regime of 0.6 CO conversion, 0.1 methane, 0.1 paraffins, 0.4 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "tensor([[0.4316, 0.1969, 0.4051, 0.8216],\n", + " [0.5707, 0.5107, 0.7076, 0.7988]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 23ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "7\n", + "tensor([[0.0000, 1.0000, 1.0000, 0.8446],\n", + " [1.0000, 0.6609, 1.0000, 0.5850]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 19ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step\n", + "tensor([[0.0000, 0.7624, 0.4672, 1.0000],\n", + " [1.0000, 0.3509, 0.0000, 0.3374]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 22ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.5 CO conversion, 0.0 methane, 0.1 paraffin, 0.3 light oleffins. Option B: regime of 0.1 CO conversion, 0.0 methane, 0.0 paraffins, 0.0 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 18ms/step\n", + "tensor([[0.7346, 0.6469, 0.8496, 0.0559],\n", + " [0.7337, 0.2927, 0.0937, 0.2998]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "8\n", + "tensor([[1.0000, 0.4944, 1.0000, 0.5482],\n", + " [1.0000, 1.0000, 1.0000, 0.6739]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "tensor([[0.0000, 0.5592, 0.3663, 1.0000],\n", + " [0.0000, 0.4825, 0.7902, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.4 CO conversion, 0.0 methane, 0.1 paraffin, 0.2 light oleffins. Option B: regime of 0.9 CO conversion, 0.2 methane, 0.3 paraffins, 0.6 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "tensor([[0.5093, 0.9102, 0.5105, 0.9909],\n", + " [0.1171, 0.2166, 0.7476, 0.4343]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "9\n", + "tensor([[1.0000, 1.0000, 1.0000, 0.7764],\n", + " [1.0000, 1.0000, 1.0000, 0.5455]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "tensor([[0.0000, 0.7752, 0.3962, 1.0000],\n", + " [0.0000, 0.0910, 0.4058, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.4 CO conversion, 0.0 methane, 0.1 paraffin, 0.3 light oleffins. Option B: regime of 0.4 CO conversion, 0.0 methane, 0.1 paraffins, 0.2 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 18ms/step\n", + "tensor([[0.5406, 0.0339, 0.9453, 0.4274],\n", + " [0.6097, 0.2809, 0.3141, 0.3975]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 20ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "10\n", + "tensor([[1.0000, 1.0000, 1.0000, 0.7396],\n", + " [0.0000, 1.0000, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "tensor([[0.0000, 0.0000, 0.4441, 0.6787],\n", + " [0.0000, 0.0976, 0.4311, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.4 CO conversion, 0.0 methane, 0.1 paraffin, 0.3 light oleffins. Option B: regime of 0.4 CO conversion, 0.0 methane, 0.1 paraffins, 0.3 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "tensor([[0.3779, 0.8208, 0.9029, 0.7225],\n", + " [0.0860, 0.8856, 0.5599, 0.3403]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 18ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 25ms/step\n", + "11\n", + "tensor([[1.0000, 1.0000, 1.0000, 0.7512],\n", + " [0.0000, 0.0000, 0.0000, 0.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "tensor([[0.0000, 0.3522, 0.4203, 1.0000],\n", + " [0.0000, 0.0000, 0.4334, 0.6646]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.4 CO conversion, 0.0 methane, 0.1 paraffin, 0.3 light oleffins. Option B: regime of 0.4 CO conversion, 0.0 methane, 0.1 paraffins, 0.3 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "tensor([[0.9922, 0.7745, 0.7816, 0.6305],\n", + " [0.8718, 0.9861, 0.2279, 0.5788]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "12\n", + "tensor([[0.0000, 0.0000, 1.0000, 0.0000],\n", + " [1.0000, 1.0000, 1.0000, 0.7565]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "tensor([[0.0000, 0.8422, 0.3830, 1.0000],\n", + " [0.0000, 0.0937, 0.4292, 0.9290]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.4 CO conversion, 0.0 methane, 0.1 paraffin, 0.3 light oleffins. Option B: regime of 0.4 CO conversion, 0.0 methane, 0.1 paraffins, 0.3 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "tensor([[0.8434, 0.8640, 0.9557, 0.3423],\n", + " [0.8195, 0.0046, 0.9713, 0.3393]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 28ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 19ms/step\n", + "13\n", + "tensor([[1.0000, 0.9605, 1.0000, 0.6761],\n", + " [1.0000, 1.0000, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "tensor([[1.0000, 1.0000, 0.0000, 0.0000],\n", + " [0.0000, 0.7336, 0.3614, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 18ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.0 CO conversion, 0.0 methane, 0.0 paraffin, 0.1 light oleffins. Option B: regime of 0.4 CO conversion, 0.0 methane, 0.1 paraffins, 0.2 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "tensor([[0.1841, 0.5638, 0.8196, 0.2851],\n", + " [0.5036, 0.7470, 0.3680, 0.8596]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "14\n", + "tensor([[1.0000, 1.0000, 1.0000, 0.9782],\n", + " [1.0000, 0.4533, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 20ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "tensor([[0.0000, 1.0000, 0.3419, 1.0000],\n", + " [0.0000, 0.3831, 0.4260, 0.9827]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.4 CO conversion, 0.0 methane, 0.1 paraffin, 0.2 light oleffins. Option B: regime of 0.4 CO conversion, 0.0 methane, 0.1 paraffins, 0.3 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "tensor([[0.6614, 0.5113, 0.0564, 0.8854],\n", + " [0.0797, 0.3407, 0.7806, 0.5182]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "15\n", + "tensor([[0.0000, 0.0000, 1.0000, 1.0000],\n", + " [1.0000, 1.0000, 1.0000, 0.9738]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[0.0000, 0.4998, 0.4293, 1.0000],\n", + " [0.0000, 1.0000, 0.3224, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.5 CO conversion, 0.0 methane, 0.1 paraffin, 0.3 light oleffins. Option B: regime of 0.3 CO conversion, 0.0 methane, 0.1 paraffins, 0.2 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[0.2359, 0.1579, 0.8917, 0.8797],\n", + " [0.3666, 0.4159, 0.0079, 0.1797]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "16\n", + "tensor([[1.0000, 1.0000, 1.0000, 1.0000],\n", + " [1.0000, 1.0000, 1.0000, 0.7440]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[0.0000, 0.7121, 0.3842, 1.0000],\n", + " [0.5074, 0.3489, 0.4852, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.4 CO conversion, 0.0 methane, 0.1 paraffin, 0.3 light oleffins. Option B: regime of 0.6 CO conversion, 0.0 methane, 0.2 paraffins, 0.4 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[0.5890, 0.4277, 0.1120, 0.4373],\n", + " [0.8072, 0.4039, 0.5447, 0.2787]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 20ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "17\n", + "tensor([[0.6922, 1.0000, 1.0000, 1.0000],\n", + " [1.0000, 1.0000, 1.0000, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 23ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[0.0000, 0.5016, 0.3363, 1.0000],\n", + " [0.0000, 1.0000, 0.4521, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.3 CO conversion, 0.0 methane, 0.1 paraffin, 0.2 light oleffins. Option B: regime of 0.5 CO conversion, 0.0 methane, 0.1 paraffins, 0.3 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[0.5522, 0.4377, 0.9668, 0.6844],\n", + " [0.8039, 0.1263, 0.6794, 0.4442]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "18\n", + "tensor([[1., 1., 1., 1.],\n", + " [0., 1., 0., 0.]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 26ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[0.0000, 0.6656, 0.3425, 0.6943],\n", + " [0.0000, 0.5615, 0.3668, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.3 CO conversion, 0.0 methane, 0.1 paraffin, 0.2 light oleffins. Option B: regime of 0.4 CO conversion, 0.0 methane, 0.1 paraffins, 0.2 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option B.\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "tensor([[0.1184, 0.0370, 0.7243, 0.8308],\n", + " [0.6964, 0.7035, 0.2314, 0.2337]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 29ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 3ms/step \n", + "19\n", + "tensor([[1., 1., 1., 1.],\n", + " [0., 0., 1., 0.]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 25ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "tensor([[0.0000, 0.4573, 0.2613, 1.0000],\n", + " [0.0000, 0.6333, 0.4409, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.2 CO conversion, 0.0 methane, 0.1 paraffin, 0.1 light oleffins. Option B: regime of 0.5 CO conversion, 0.0 methane, 0.1 paraffins, 0.3 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "tensor([[0.4208, 0.8449, 0.5509, 0.1151],\n", + " [0.2767, 0.3080, 0.5045, 0.8988]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 16ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "20\n", + "tensor([[0., 0., 1., 1.],\n", + " [1., 1., 1., 1.]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 24ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", + "tensor([[0.0000, 0.6302, 0.3704, 1.0000],\n", + " [0.0000, 0.2622, 0.1968, 1.0000]])\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step\n", + "Suppose you're managing a Fischer-Tropsch synthesis process. The light oleffins are considered as a negative output and we want to minimize them, while maximizing the other three outputs. Option A: regime of 0.4 CO conversion, 0.0 methane, 0.1 paraffin, 0.2 light oleffins. Option B: regime of 0.1 CO conversion, 0.0 methane, 0.0 paraffins, 0.1 light oleffins. Choose only one option, only answer with 'Option A' or 'Option B'\n", + "Option A.\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step \n", + "tensor([[0.1490, 0.3782, 0.1752, 0.4555],\n", + " [0.9655, 0.2335, 0.0275, 0.4770]], dtype=torch.float64)\n", + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step\n", + "\u001b[1m2/2\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n" + ] + } + ], + "source": [ + "#two algorithms to compare\n", + "algos = [\"EUBO\",\"EUBO-LLM\", \"rand\"]\n", + "#number of repetitions of the BO cycle\n", + "NUM_TRIALS = 3 if not SMOKE_TEST else 2\n", + "#number of cycles\n", + "NUM_BATCHES = 20 if not SMOKE_TEST else 2\n", + "\n", + "#dimension number= 4 inputs\n", + "dim = 4\n", + "#sampler options\n", + "NUM_RESTARTS = 3\n", + "RAW_SAMPLES = 512 if not SMOKE_TEST else 8\n", + "#\n", + "q_eubo = 2 # number of points per query\n", + "q_data=5\n", + "q_comp = 10 # number of comparisons per query\n", + "q_comp_2=1\n", + "\n", + "# initial evals\n", + "best_vals = {} # best observed values\n", + "for algo in algos:\n", + " best_vals[algo] = []\n", + "\n", + "# average over multiple trials\n", + "for i in range(NUM_TRIALS):\n", + " torch.manual_seed(i)\n", + " np.random.seed(i)\n", + " data = {}\n", + " models = {}\n", + "\n", + " # X are within the unit cube\n", + " bounds = torch.stack([torch.zeros(dim), torch.ones(dim)])\n", + "\n", + " # Create initial data\n", + " init_X=ini(q_data,dim)\n", + " for algo in algos:\n", + " if algo == \"EUBO-LLM\":\n", + " init_y = generate_data(init_X, dim=dim)\n", + " comparisons = generate_comparisons_llm(init_y, q_comp)\n", + " if algo == \"EUBO\":\n", + " init_y = generate_data_u1(init_X, dim=dim)\n", + " comparisons = generate_comparisons(init_y, q_comp)\n", + " if algo == \"rand\":\n", + " init_y = generate_data_u1(init_X, dim=dim)\n", + " comparisons = generate_comparisons(init_y, q_comp)\n", + " \n", + " best_vals[algo].append([])\n", + " data[algo] = (init_X, comparisons)\n", + " _, models[algo] = init_and_fit_model(init_X, comparisons)\n", + "\n", + " best_next_y = utility2(init_X).max().item()\n", + " best_vals[algo][-1].append(best_next_y)\n", + "\n", + " # we make additional NUM_BATCHES comparison queries after the initial observation\n", + " for j in range(1, NUM_BATCHES + 1):\n", + " print(j)\n", + " for algo in algos:\n", + " model = models[algo]\n", + " if algo == \"EUBO-LLM\":\n", + " # create the acquisition function object\n", + " acq_func = AnalyticExpectedUtilityOfBestOption(pref_model=model)\n", + " # optimize and get new observation\n", + " next_X, acq_val = optimize_acqf(\n", + " acq_function=acq_func,\n", + " bounds=bounds,\n", + " q=q_eubo,\n", + " num_restarts=NUM_RESTARTS,\n", + " raw_samples=RAW_SAMPLES,\n", + " )\n", + " print(next_X)\n", + " # update data\n", + " X, comps = data[algo]\n", + " X, comps = make_new_data(X, next_X, comps, q_comp_2)\n", + " data[algo] = (X, comps)\n", + " \n", + " # refit models\n", + " _, models[algo] = init_and_fit_model(X, comps)\n", + " \n", + " # record the best observed values so far\n", + " max_val = utility2(X).max().item()\n", + " best_vals[algo][-1].append(max_val)\n", + " elif algo == \"EUBO\":\n", + " #create the acquisition function object\n", + " acq_func = AnalyticExpectedUtilityOfBestOption(pref_model=model)\n", + " # optimize and get new observation\n", + " next_X, acq_val = optimize_acqf(\n", + " acq_function=acq_func,\n", + " bounds=bounds,\n", + " q=q_eubo,\n", + " num_restarts=NUM_RESTARTS,\n", + " raw_samples=RAW_SAMPLES,\n", + " )\n", + " print(next_X)\n", + " # update data\n", + " X, comps = data[algo]\n", + " X, comps = make_new_data_u1(X, next_X, comps, q_comp_2)\n", + " data[algo] = (X, comps)\n", + " \n", + " # refit models\n", + " _, models[algo] = init_and_fit_model(X, comps)\n", + " \n", + " # record the best observed values so far\n", + " max_val = utility2(X).max().item()\n", + " best_vals[algo][-1].append(max_val)\n", + " else:\n", + " # randomly sample data\n", + " next_X= ini(q_eubo, dim=dim)\n", + " print(next_X)\n", + " # update data\n", + " X, comps = data[algo]\n", + " X, comps = make_new_data_u1(X, next_X, comps, q_comp_2)\n", + " data[algo] = (X, comps)\n", + " \n", + " # refit models\n", + " _, models[algo] = init_and_fit_model(X, comps)\n", + " \n", + " # record the best observed values so far\n", + " max_val = utility2(X).max().item()\n", + " best_vals[algo][-1].append(max_val)" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": {}, + "outputs": [], + "source": [ + "with open('best_vals_case_2.pkl', 'wb') as handle:\n", + " pickle.dump(best_vals, handle, protocol=pickle.HIGHEST_PROTOCOL)" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [], + "source": [ + "with open('best_vals_case_2.pkl', 'rb') as handle:\n", + " loaded_data = pickle.load(handle)" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'EUBO': [[0.6009751558303833,\n", + " 0.6886475086212158,\n", + " 1.112328052520752,\n", + " 1.1123279333114624,\n", + " 1.6158719062805176,\n", + " 1.6158720254898071,\n", + " 1.6489521265029907,\n", + " 1.7358803749084473,\n", + " 1.735879898071289,\n", + " 1.8323463201522827,\n", + " 1.8447742462158203,\n", + " 1.8793693780899048,\n", + " 1.9259097576141357,\n", + " 1.9872502088546753,\n", + " 2.002692699432373,\n", + " 2.0026936531066895,\n", + " 2.0026931762695312,\n", + " 2.0026936531066895,\n", + " 2.0026936531066895,\n", + " 2.0026931762695312,\n", + " 2.002692937850952],\n", + " [0.40567806363105774,\n", + " 0.4696243405342102,\n", + " 0.505540132522583,\n", + " 0.5055403709411621,\n", + " 0.6344783306121826,\n", + " 0.6344783306121826,\n", + " 1.077622413635254,\n", + " 1.6529359817504883,\n", + " 1.8301997184753418,\n", + " 1.8302001953125,\n", + " 1.8302001953125,\n", + " 1.8302001953125,\n", + " 1.8707122802734375,\n", + " 1.8707122802734375,\n", + " 1.8707122802734375,\n", + " 1.9014772176742554,\n", + " 1.9014772176742554,\n", + " 1.9309437274932861,\n", + " 1.9702214002609253,\n", + " 2.0026931762695312,\n", + " 2.002692937850952],\n", + " [0.6386717557907104,\n", + " 0.8689830303192139,\n", + " 1.0270394086837769,\n", + " 1.4135736227035522,\n", + " 1.4418411254882812,\n", + " 1.4687854051589966,\n", + " 1.6507188081741333,\n", + " 1.6507188081741333,\n", + " 1.7549494504928589,\n", + " 1.8390334844589233,\n", + " 1.8390334844589233,\n", + " 1.8390334844589233,\n", + " 1.8390334844589233,\n", + " 2.0026936531066895,\n", + " 2.0026936531066895,\n", + " 2.0026936531066895,\n", + " 2.0026936531066895,\n", + " 2.0026936531066895,\n", + " 2.0026936531066895,\n", + " 2.0026936531066895,\n", + " 2.0026936531066895]],\n", + " 'EUBO-LLM': [[0.6009751558303833,\n", + " 0.8451216220855713,\n", + " 0.8451216220855713,\n", + " 0.9048173427581787,\n", + " 1.622948408126831,\n", + " 1.622948408126831,\n", + " 2.0026931762695312,\n", + " 2.002692937850952,\n", + " 2.0026936531066895,\n", + " 2.0026931762695312,\n", + " 2.002692937850952,\n", + " 2.0026936531066895,\n", + " 2.0026931762695312,\n", + " 2.0026936531066895,\n", + " 2.0026936531066895,\n", + " 2.0026936531066895,\n", + " 2.0026936531066895,\n", + " 2.0026936531066895,\n", + " 2.0026936531066895,\n", + " 2.0026936531066895,\n", + " 2.0026936531066895],\n", + " [0.40567806363105774,\n", + " 0.40567806363105774,\n", + " 0.40567806363105774,\n", + " 0.40567806363105774,\n", + " 0.40567806363105774,\n", + " 0.40567806363105774,\n", + " 0.40567806363105774,\n", + " 0.40567806363105774,\n", + " 1.4555033445358276,\n", + " 1.455503225326538,\n", + " 1.455503225326538,\n", + " 1.455503225326538,\n", + " 1.455503225326538,\n", + " 1.4555033445358276,\n", + " 1.4555033445358276,\n", + " 1.4555033445358276,\n", + " 1.4555033445358276,\n", + " 1.4555033445358276,\n", + " 1.4555033445358276,\n", + " 1.4555033445358276,\n", + " 1.4555033445358276],\n", + " [0.6386717557907104,\n", + " 1.0306180715560913,\n", + " 1.0306179523468018,\n", + " 1.0306179523468018,\n", + " 1.0306179523468018,\n", + " 1.0306179523468018,\n", + " 1.0306179523468018,\n", + " 1.0306179523468018,\n", + " 1.0306179523468018,\n", + " 1.0306179523468018,\n", + " 1.0306179523468018,\n", + " 1.0306179523468018,\n", + " 1.0306179523468018,\n", + " 1.0306179523468018,\n", + " 1.0306179523468018,\n", + " 1.0306179523468018,\n", + " 1.0306179523468018,\n", + " 1.0306179523468018,\n", + " 1.0306179523468018,\n", + " 1.0306179523468018,\n", + " 1.0306179523468018]],\n", + " 'rand': [[0.6009751558303833,\n", + " 0.8344993591308594,\n", + " 0.8344993591308594,\n", + " 0.8344993591308594,\n", + " 0.8344993591308594,\n", + " 0.8344993591308594,\n", + " 0.8344993591308594,\n", + " 0.8344993591308594,\n", + " 0.8344993591308594,\n", + " 0.982996940612793,\n", + " 0.982996940612793,\n", + " 0.982996940612793,\n", + " 0.982996940612793,\n", + " 0.982996940612793,\n", + " 0.982996940612793,\n", + " 0.982996940612793,\n", + " 0.982996940612793,\n", + " 1.0077543258666992,\n", + " 1.0077545642852783,\n", + " 1.0077546834945679,\n", + " 1.2190179824829102],\n", + " [0.40567806363105774,\n", + " 0.40567806363105774,\n", + " 0.40567806363105774,\n", + " 0.5648194551467896,\n", + " 0.7507764101028442,\n", + " 0.7507762908935547,\n", + " 1.088616967201233,\n", + " 1.088616967201233,\n", + " 1.088616967201233,\n", + " 1.196665644645691,\n", + " 1.196665644645691,\n", + " 1.196665644645691,\n", + " 1.196665644645691,\n", + " 1.196665644645691,\n", + " 1.594987154006958,\n", + " 1.594987154006958,\n", + " 1.594987154006958,\n", + " 1.594987154006958,\n", + " 1.594987154006958,\n", + " 1.594987154006958,\n", + " 1.594987154006958],\n", + " [0.6386717557907104,\n", + " 0.6386717557907104,\n", + " 0.6386717557907104,\n", + " 0.6386717557907104,\n", + " 0.6386717557907104,\n", + " 0.6386717557907104,\n", + " 0.8080291152000427,\n", + " 0.8080291152000427,\n", + " 0.8080291152000427,\n", + " 0.9008201360702515,\n", + " 1.2043654918670654,\n", + " 1.2043654918670654,\n", + " 1.2645727396011353,\n", + " 1.2645727396011353,\n", + " 1.2645727396011353,\n", + " 1.2645727396011353,\n", + " 1.2645727396011353,\n", + " 1.368188500404358,\n", + " 1.368188500404358,\n", + " 1.368188500404358,\n", + " 1.368188500404358]]}" + ] + }, + "execution_count": 58, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "loaded_data" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 596 + }, + "id": "eRLF3-dFNzyW", + "outputId": "9c83df50-e355-42b9-860e-b4b51d63f2c5" + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAtkAAAIsCAYAAAAnErU0AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd1zU9R/A8dexN6iAoCjgwD1wb8WVmaZm6S/LUe5yNjTLWTnS0hxppSY5shyllZUbB44UNS33AFyIiOx99/39gVwQQzgO7oD38/Hgwd33+/l+Pm/uju+973Of7+ejUhRFQQghhBBCCKE3JoYOQAghhBBCiNJGkmwhhBBCCCH0TJJsIYQQQggh9EySbCGEEEIIIfRMkmwhhBBCCCH0TJJsIYQQQggh9EySbCGEEEIIIfRMkmwhhBBCCCH0TJJsIYQQQggh9EyS7FJk2LBhqFQqZs+eXazHljZeXl6oVCoCAgL0Vufs2bNRqVQMGzZMb3U+TUBAACqVCi8vr0LXZYj4C0OlUqFSqQgODs6yvSj+Dn9/f1QqFZ06ddJbncWhqP7n7969y9ChQ6lcuTJmZmZZHu+S9joyFsHBwdrXdFkl59DSo1OnTqhUKvz9/Q0dSpEzM3QAIqtTp06xbt06Dh48yL1790hJScHV1ZWWLVsyYMAA+vfvb1Qn2l27dvH7778TFBTE7du3iYiIwNTUlCpVquDn58fEiROpXbu2ocMUwigFBAQQEBBA48aN6du3r6HDKbSUlBT8/Py4du0aDg4ONGnSBAsLC3x8fAwdmhCiGHz++edERUUxbNgwvXw4KekkyTYSKSkpjB07lm+++QYAS0tLatSogaWlJbdu3WLr1q1s3bqVFi1a8OOPP1K5cmW9tu/u7k6tWrVwdnYu0HFLlixh//79mJmZ4e7uToMGDXj8+DE3btzgypUrrF27Fn9/fwYNGqTXeItS9erVsbKywsbGRm91Ojs7U6tWLdzd3fVW59PY2NhQq1YtvbxWDBF/UTC2vyMgIIA5c+YwdOjQUpFk79mzh2vXrlGpUiX++ecfnJycsuw3tsdflBxyDi0ZPv/8c0JCQujUqZMk2QCKMDi1Wq0888wzCqDY2NgoixcvVmJjY7X709LSlF9++UXx9vZWAKVKlSpKWFhYtnqGDh2qAMqsWbOKLfb169cre/bsURISErJsv3PnjtKvXz8FUKysrJTQ0NBii0kIQAGUW7duFXlb69atUwClY8eOBT521qxZCqAMHTpU73E9TVGcLz755BMFUF566SW91SkU5datW9rXtBDGzNPTUwGUgwcP5lqmY8eOCqCsW7eu2OIyFBmTbQQWLlzI7t27MTc35/fff2fy5MnY2dlp95uamtKrVy8CAwPx8vLi9u3bRjOua/DgwXTr1g1ra+ss2ytXrszmzZtxcnIiKSmJXbt2GShCIURxSUxMBNDrt0BCCFFSSZJtYHFxcSxcuBCAd955hw4dOuRa1t3dnS+//BKAP/74g+PHj+da9vHjx0ycOBFvb28sLS2pXLkyo0aN4t69ezmWL4qLoCwtLalWrRoA8fHxeqsXsl44cf/+fUaNGoWHhwfW1tbUrl2bzz77DEVRgPShOJ988gn16tXDxsaGihUrMnLkSB49epRj3bld+Jj5whW1Ws2SJUto2LAh1tbWlCtXjl69ehEUFJRjnbld9PLfC5p2795Nly5dKFeuHI6OjnTt2pVjx45py1+7dk17UZmVlRX16tXjq6++yrHNvC7aiY2N5cMPP8TX1xd7e3vta6Rly5a8++67XL9+Xaf4jx49ynPPPUeFChWwtramYcOGrFixQvtc5GTfvn1069YNR0dH7O3tadmyJd9++y2g/4tQn3bxUVBQEH369KFChQrY2NjQsGFDlixZgkajyffFOv7+/rRs2RI7OzscHBzw8/Nj79692cqpVCrmzJkDwLfffqt9HHW5wO3Ro0e8//771K9fH1tbW+zs7GjYsCGzZ88mOjq6QHVliI2NZd68eTRv3hxHR0esrKzw8fFh8uTJhIWFZSmb8bhmnD/++/dkXIBaVK+jv/76i8GDB+Pl5YWlpSX29vZUr16d5557jsWLF+f5+vuviIgIVq9eTd++ffHx8cHW1hZbW1vq16/P1KlTefjwYY7H/fcC2Py+DjIoisLq1atp2rQpNjY2VKhQgWeffZbDhw/nO/a8YlIUhRUrVuDr64utrS1ubm4MHjyY27dva8vv37+fZ555hgoVKmBra0v79u05dOiQ3h6n27dvU6FCBVQqFcuXL8+x3ilTpqBSqfD29s7y2pVzaPGfQ2/fvs348ePx8fHB2toaR0dHWrRoweLFi0lKSspSNuO1FhISAoCfn1+Wc0Bu59zIyEgmTZqk/d+tXLkyI0eOzHaO+a9ff/2V559/Hjc3NywsLHB1deX555/n4MGDOZbP/PgnJSXx4Ycfas+XmYe1FfR5fSoD9qILRVG2bNmiAIqJiYly7969fB1Tu3ZtBVDeeOONLNszvv6dMGGCUr16dUWlUil169ZVGjVqpJiamiqA4urqqly6dClbnUXx1fGDBw8Ua2trBVAOHTqUbX/G1+y6vAwzvm6aPXu24ubmplhaWipNmjRRPDw8tHVOmDBBSUpKUjp06KCoVCqlTp06Su3atRUTExMFUBo3bqykpKRkqzu3r7syvtp/5ZVXlO7duyuAUqNGDaVRo0aKpaWlAijW1tbKn3/+ma3O3IYFZP4a+Msvv1RUKpVSsWJFpUmTJoqdnZ12uE1gYKBy7NgxxdHRUbGzs1OaNm2quLq6ao9duHBhtjYPHjyoAIqnp2eW7bGxsUr9+vUVQFGpVEqNGjWU5s2bK56enoq5ubkCKKtXry5w/OvWrVNMTEyU8uXLK82aNVOcnZ21+95+++0cn8cvvvhCW6ZcuXJK8+bNlUqVKmmPyc9XjznJqPO/w0XyGp6xY8cO7d9vZ2enNGvWTDtEq3///rl+xZl5uMjrr7+uHdLl6+ur2Nraav+/d+zYkeW4tm3bKlWqVNH+X7Zt2zbLT379888/SuXKlRVAMTU1VRo2bKjUr19f+zr39vZWbty4ke24vP7nL126pHh5eWnr9Pb2Vho0aKB9nVesWFH566+/tOXXrl2b599z//79PB//wryOdu/erVhYWGiftwYNGiiNGzfOclxqamq+H8/ly5crgGJhYaFUrVpVadasmVKzZk3ta8PDwyPHYUi6vg4yDBkyRBuvh4eH0qxZM8Xe3l4xNTVVPvvsM53OlZljGjRokPac1aBBA+3f4+XlpTx69EhZsWJFjucfCwsL5ejRo3p7nH766ScFUCwtLZWzZ89m2bdnzx5FpVIpZmZmyvHjx7Psk3No8Z5DDx06pDg6OmqfY19fX6VWrVratpo2bapERERoy//2229K27ZtteeI+vXrZzkHzJ07V1s241z60UcfKVWqVFHMzMyUBg0aKD4+PtrzVrVq1ZSoqKhscaWmpiqvvvqqNo4KFSoovr6+SoUKFbTb5s+fn+24jMd/4MCBSosWLbT/C02bNlU8PDwURdHteX0aSbINbMKECdoXZH698cYbCqA0atQoy/aMN01zc3OlRo0ayt9//63dFxoaqn1hNWrUSElLS8vxWH0k2Q8fPlR27dqlNGrUSAGUQYMG5VhOH0m2ubm50rdvX+XRo0fafWvXrtW+ofXr10+pVauWcvHiRe3+U6dOaU8ea9asyVb305Jsc3NzxcvLSzl9+rR2X3h4uNKqVSsFUDp06JCtzvycYK2trZXVq1crGo1GURRFiYuLU3r06KEASvPmzZWqVasqY8aMUeLj47XHT58+XYH0sfwxMTFZ6s7tDeLzzz9XAKVBgwbZ3gQTExOVLVu2KMeOHStw/JaWlsqSJUuyvLY+/vhj7Qnr+vXrWY49f/68YmZmpgDKtGnTsnzg2bhxo2JhYaE9sRV1kn3//n3ta2LYsGFKXFycdt+ePXsUBwcHbSy5Jdnm5uZKhQoVlD179mj3xcXFKX369NEmMxnP7dPiya+kpCTtG1/Lli2VkJAQ7b5r164pDRs2VAClSZMmilqtznJsbv/zsbGxSvXq1bVvSHfv3tXui46O1h5Xs2bNbB9Sn/b3FMXrqHHjxgqgTJkyRUlMTMyyLyQkRPnkk0+y/e15OXnypPLbb78pSUlJWbY/fPhQGTlypAIoPXv2zHZcYV4Ha9as0R67adMm7faEhARlxIgR2teerkm2ubm54ubmluX/+saNG9oPUn369Mnx/JPRmdCuXTu9PU6KoihvvvmmAig+Pj7a/7UHDx4oFStWVABl3rx52Y6Rc2jxnUMfPnyouLi4KIDSq1evLMl0UFCQ9sN0nz59sh1bkDHZ5ubmSvfu3bN0MAYFBWk//MycOTPbsVOmTNEm4Xv37s2yb9OmTYqtra2iUqmUAwcOZNmX8fibmpoqXl5eypkzZ7T7Mq4p0+V5fRpJsg0s4+LAvn375vuYJUuWaD/BZZbx5gcogYGB2Y4LDg7W/kP+tzelsEl2Ru9E5h9vb2/lq6++yvaGkmHr1q2Kp6dnthNYfmT8k1asWDHLRaIZmjdvrj0xnTx5Mtv+d955J9fH/WlJNqAcPnw423GnTp3StvnfT+D5OcH+95sJRUnvpczY36BBg2zJQkpKiuLu7p7jc5rbG8To0aMVQPn888+ztZeb/MQ/fPjwbMdpNBptz8DSpUuz7Mt4zT377LM5tvnBBx9o6y7qJDtje/369bN9AFUURVm9erW2ztySbEDZsGFDtmPv3bunfaPL3PubVzz5tX79eu2b8+3bt7Ptv3LlivZbrPz+z2dcvNi2bdscH4u0tDTF19dXAZTNmzcX6O8pitdRRs9ZTr1eRaFy5cqKSqXKdvG5rq8DjUaj/VDzzjvvZDtOrVZn6UEsiMwxbdmyJdv+zL2gOZ1//v77b+3+gj6+uT1OipKesGR8ABw6dKii0Wi0F/937tw5xw9Fcg4tvnPohx9+qACKi4tLlg8kGfbt26et99y5c1n2FSTJdnZ2ViIjI7PtX7RokQIovr6+WbbfuXNHMTc3V8zNzZXz58/nWHfGtz7PPPNMlu2Z379PnDiR47G6PK9PI2OyDSw2NhYgy4WOT5NRNrexls2bN6dNmzbZtnt6etKvXz8Afvvtt4KGmqcKFSrQtm1bWrdujaenJ6ampgQHB/Pdd99x5cqVHI958cUXCQ4OzrZgSEG8/PLLOT52TZs2BaBRo0a0aNEi2/5mzZoBcOPGjQK32bBhQ9q3b59jm5aWliiKolO9o0aNyratbt262otKhw8fjolJ1n9Zc3NzGjVqBOT/b6latSoAO3bsICYmpsBx5ubNN9/Mtk2lUmlfi/8dy/bHH38A6X9XTkaMGKG32J7m999/B9KvTTA1Nc22/5VXXsHKyirPOhwdHXnllVeybXd3d8fb2xvI/hgUVsYFxf/73//w8PDItt/Hx4fnn38+S9mn2bp1K5D++Of0WJiamtKnTx8ADhw4oFPceSno6yjj9bxhwwa9xZCUlMR3333H6NGj6dGjB+3bt6ddu3a0a9eO2NhYFEXh7NmzOR5b0NfB1atXtf+7EydOzHaciYkJEyZMKNTfU65cOV566aVs2zPOk5Dz+adevXra809O5xddHycrKyu+//57bGxs+Pbbb+nZsye7d+/GxcWFjRs3ZjvP5ZecQ7PS9Ryaca544403cryIuUuXLvj6+mYpq4tBgwZRrly5bNvbtm0LZP97d+zYQWpqKm3atKFBgwY51tm/f38ADh8+jFqtzra/bt26tGzZMsdji+J5lXmyDcze3h5IvwAyvzLKOjo65ri/fv36uR5br149tm7dyqVLlwoQ5dO1b9+eo0ePau/fv3+f6dOn880339CyZUvOnz+Pp6enXtsEqFGjRo7bXV1d87W/II97htwW1lCpVLi6unL79m2d6s0tVhcXF0JDQ/X2t7z++ussXryYgIAAKlWqRNeuXbUfkFq1aoWZmW6nhdwel4oVK2aLLyoqigcPHgBo3+D+y8vLCwcHB72+ieUm44NgbrFYW1vj4+PD+fPnc62jZs2auV6wWLFiRa5evarT6yIvGXHn9oaTse+nn37i8uXL+arzr7/+AtLnwF+zZk2OZTKeuzt37hQk3HwpyOsI0i+UGzlyJOPHj2fx4sV0796dli1b0rFjR+2F1wVx6dIlnnvuOW7dupVnudwunC7o6yDjebG3t8/xgxKkn7cLo3r16jluzzh3wNPPP/993Av7ONWpU4dly5YxYsQIbbK4bt26Qs0jLefQrHQ9h+b3vHL27Nl8n1dyUtD/9Yxz05UrV2jXrl2OxypPLhBNTEzk0aNHWV7jkJ5k56YonlfpyTawjJNqQXq4rl27luXY/8p4gea1L6MHvai4u7uzdu1aunfvTkxMDHPnzi2SdmxtbXPcnvEm97T9Go1Gb20C2l4Sfdar77/Fzc2NkydPMnjwYExMTNi5cydTpkyhffv2VKpUifnz5+fYA6Br/Dk9JplPnhkfNHOS1z59yoinMLEU1esiLxn/x25ubrmWyUha8vM/Hx8fT2pqKgDnz58nMDAwx5+M81VCQkJh/4RsCvI6gvTeuq1bt9K6dWtCQkL46quveP3116levTotW7bMdXaMnGg0Gvr378+tW7do0qQJP//8M3fv3iU5ORklfXil9lusjMcpv/Hn9jdkPC/5OW/r6mnnjvyUyRyzPh4ngI4dO2Jubg6At7c33bt3L9gf9h9yDs1Ol3Oovs8ruXna35uRMGd4/PgxAGFhYbmemzLPJJPT+Smv/8+ieF4lyTawjE9jFy9e5P79+/k6JmOKmoyvVP4r49NtXvuKK3np3bs3AKdPny6W9kT+VK9enfXr1/P48WNOnz7NkiVL6NKlCw8fPuT9999nxowZRdp+5iE+eZ2ki/rDYIaMeIwhloLI+D/Oa7qrjPNKfv7nbWxstENEzp07p02YcvvR19SKhfXiiy9y7NgxIiMj+e2335gyZQpeXl78+eefPPPMM3l+A5HZn3/+yaVLl7C2tmb37t307t2bSpUqYWFhoS2TW8+srjKel/yct42FPh6nlJQUXn75ZVJTUzExMeHWrVt88MEHRR263pTmc6i+zyv6kvE3T5o06annJkVRdFpxUt/PqyTZBtazZ0+cnJzQaDSsWLHiqeX37NmjHeqR21Ll//zzT67HZ+yrU6eODtEWXFpaGoBOn+pF0TM1NaVp06ZMmjSJffv2sXTpUgBWrVpVpO06OTlpv8bL+Arwv4KDg4tlqAhArVq18owlKSmJq1ev6r3dgs6H/V+1a9cG4O+//861TMa+/PzPq1Qq7depgYGBhYrNEBwdHXn22Wf55JNPuHr1Ki1btiQ5OZlvvvkmX8dnDH2oU6cOzs7O2fY/evQo12tMdJXxHMbGxuY6/Cavc7oh6ONxmjZtGqdPn6Z69er88ccfmJmZ8emnn7Jnz54iibmolMZzaGHOK4U9p+UlY/hKcZyb9PW8SpJtYHZ2drz77rsALFq0KM+FB8LCwhg9ejQA3bp1y7Un+88//8xxoZrQ0FB27NgBwLPPPlvIyJ9OURS2b98OoL1IQhi3jMWQoqKiimQoQGY9evQAYO3atTnuz217Ucbi7++f4wfCTZs2ZVt8QR8yLirKWCmxoJ577jkAvv/++xy/Cbt+/To7d+7MUvZpBgwYAKSPydb3IlLFydzcnFatWgHkugjXf2U8H2FhYTku/rFkyRK9dxj4+Phox47ntECLoii5LtxiKIV9nP744w+WLFmCubk5mzdvplu3bnz00UcoisKQIUMIDw8vstiLWmk4h2acK1atWpXjuengwYOcOXMGSO8ozKyw57S8vPDCC5iZmXHq1Cl2796t9/rzouvzKkm2EZg6dSpdu3YlNTWVZ599ls8//zzLeCu1Ws2vv/5KmzZtCA4OpnLlytrVnHJibm7OsGHDslzceOfOHQYOHEhqaioNGjTQDuMojNOnTzN9+vQceyxCQ0N55ZVXOHr0KKampjleNb9t2za8vLx0+kpH6G7atGmsWrUq21fQUVFRzJ8/H0i/OKSol8Z+++23MTMz4/fff+eDDz7IMnZz06ZNLFy4UDtes6iNGTMGR0dH/v77b0aOHJkludy3bx9vvfVWkcSScSHWn3/+qVNCO2DAAGrVqkVSUhIvvvhiltX7bt68yUsvvYRaraZJkyb06tUrX3VOmDCB6tWrc/36dbp165ZtqIWiKAQFBTF58mROnTpV4Jj1KSYmhpdeeondu3eTkpKSZV9QUBA//PADkD7jUn60bt0ac3Nz7t27xwcffKBNFDUaDcuXL2f+/PlPnWWmoFQqFe+99x4An3/+uTZmSE9Uxo4dq9NsRUWpMI9TWFgYQ4cORVEU5s6dq31upkyZQpcuXXjw4IF2v7Eq7efQMWPG4OLiwoMHDxg0aBCRkZHafWfPnuW1114DoG/fvtkuusw4pxXFzENeXl5MnjwZSD/3rV+/XvtteYawsDBWrVrFggULClx/UTyvkmQbAVNTU3799VeGDh1KQkICkydPxtnZmQYNGtCsWTNcXFzo3bs3t27dolmzZhw/fjzPK7DHjh2LWq2mXr161K9fH19fX7y9vTlx4gTOzs5s3rw5x6m5CiouLo65c+dSu3ZtnJ2dadKkCa1ataJatWp4eXmxefNmbG1t2bRpU4492XFxcYSEhGiXYRXF49KlS7zxxhu4ubnh6elJy5YtqV+/Pm5ubmzZsgU7Ozu+/PLLIo+jYcOGfP755wDMmzcPNzc3WrZsiYeHB6+++irjxo2jUqVKAHp5vebF3d2db7/9FjMzM9atW4ebmxstWrSgevXqdOvWja5du9K6dWu9x9K9e3cqVqxIcHAwHh4etGrVik6dOmmX5n4aCwsLtm/fTqVKlTh27Bje3t40btyYhg0bUrNmTc6dO4e3tzdbt27N97RoDg4O/PHHH9SuXZvjx4/TqFEjqlatSqtWrWjcuDGOjo40a9aMzz//3OA93RqNhm3bttGjRw/s7e2pV68eLVu2xNvbm2bNmhEWFkarVq0YN25cvupzdXXVJrzz58/Hzc2N5s2bU7FiRSZMmMDrr7+e6/RfhTFixAgGDRpESkoK//vf/6hatSotWrTAzc2NNWvW6JQwFCVdH6fMPdXdu3fnnXfe0e4zMTFhw4YNuLi48Mcff/DZZ58V299TUKX9HOrs7MzWrVtxcHBgx44dVKpUiaZNm1KnTh2aNGlCSEgITZo0yXH2oSFDhgDw6aefUr16dTp06ECnTp309hqeP38+o0ePJiYmhqFDh1K+fHmaNm1KixYtqFKlCu7u7rzxxhs6zXpSFM+rJNlGwtLSEn9/f06ePMno0aPx8vIiODiYv//+Gzs7O/r378+WLVv4888/qVKlSp51lStXjlOnTjF+/Hji4uK4ePEiLi4uDB8+nLNnzxZ6OqgMjRo1Yvny5fTv358KFSpw8+ZNgoKCiI6OpmXLlkyfPp3Lly8zcOBAvbQn9GPGjBlMnz6ddu3aodFoOHfuHDdv3sTLy4tx48Zx4cKFHOcBLwpvvvkme/bsoUuXLqSmpvLPP/9oZ6b57LPPtN/oODg4FHksffr04fjx4/Tu3Rtzc3MuXLiAtbU1ixYtYsuWLdqEUp+x2Nrasn//fvr374+VlRVBQUEcOnSoQDNi1KtXj/PnzzNt2jRq1aqlnXe5bt26zJw5kzNnzhR4KrsaNWpw9uxZvvjiC/z8/EhISODMmTM8ePAAHx8f3nzzTfbu3ZvrNFrFxd7enk2bNjF8+HB8fHx48OCB9hzUvn17li9fzqFDh7TzJOfHhx9+yJo1a2jcuDGxsbFcvXqVGjVqsGbNGlavXl0kf4dKpWLDhg18+eWX+Pr68vDhQ65fv07r1q05cOAAL7zwQpG0Wxi6PE4LFy5k7969uLq6sn79+mzjd93d3fH390elUvH+++8b7QXzZeEc2rFjRy5cuMC4cePw8PDgn3/+4c6dOzRr1oxPP/2UwMBAKlSokO24/v37a6fuffjwIUePHuXQoUOFmuovM1NTU7788ksOHTrEoEGDKF++PP/88w9XrlzB3t6efv36sXbtWj799NMC110Uz6tKMebvZESxGTJkCBs2bOCjjz5i+vTphg5HCB4+fIirqysqlYrHjx/nOi98cVCr1ZQvX56YmBj++usvGjZsaLBYhBAiP4zpHFpWSU+2AP6df7J8+fIGjkSIdBlfRTZs2NDgbw5btmwhJiaGChUq5LmYgRBCGAtjOoeWVZJkC+7du6edEqdJkyYGjkaUJRs3buT333/PMhNBWloaX3/9NXPmzAFg/PjxxRLLrl272LJlC8nJydptiqLw008/8cYbbwDp1zvoupqbEELomzGdQ0V28m5Rhp09e5aRI0dy+fJl4uPjadasWZFc1CNEbk6fPs3SpUuxtLTE29sbOzs7rl69qp3bddCgQbz++uvFEsu1a9eYPHkyZmZmeHl5Ua5cOW7dukVERAQAfn5+MpRKCGFUjOkcKrKTJLsMi46O5syZM7i4uPDiiy+ycOHCIp1IXoj/+t///kdsbCyBgYGEhYURFxeHk5MT3bt357XXXmPgwIHF9prs3r07b775JocOHeL+/fsEBwdjb29Phw4dePnllxk+fHixTSkohBD5YUznUJGdXPgohBBCCCGEnsmYbCGEEEIIIfRMhosYmEaj4d69e9jb28tXOkIIIYQQRkhRFGJjY6lUqVK+F/eSJNvA7t2799TFZYQQQgghhOHdvn0bDw+PfJWVJNvA7O3tgfQnrThWtRNCCCGEEAUTExNDlSpVtHlbfkiSbWAZQ0QcHBwkyRZCCCGEMGIFGdorFz4KIYQQQgihZ5JkCyGEEEIIoWeSZAshhBBCCKFnkmQLIYQQQgihZ5JkCyGEEEIIoWeSZAshhBBCCKFnkmQLIYQQQgihZ5JkCyGEEEIIoWeSZAshhBBCCKFnkmQLIYQQQgihZ5JkCyGEEEIIoWeSZAshhBBCCKFnkmQLIYQQQgihZ5JkCyGEEEIIoWeSZAshhBBCCKFnZoYOICdhYWEEBQURFRWFWq3OscyQIUOKOSohhBBCCCHyx6iS7KSkJEaOHMnmzZtRFCXHMoqioFKpJMkWQgghhBBGy6iS7KlTp7Jp0yZ8fHx4+eWX8fDwwMzMqEIUQgghhBDiqYwqg926dSt169YlKCgIS0tLQ4cjhBBClDkJKWnUnbkbgIsfPoONhVGlCkKUGEZ14WNUVBQ9evQokgT77t27fP7553Tv3p2qVatiYWGBm5sb/fv35+TJkwWqS6PRsGLFCho2bIi1tTUuLi4MGDCAa9eu6T1uIYQQojRLSEnD671deL23i4SUtFLXnii7jCrJrlOnDg8ePCiSupcvX87kyZO5efMm3bp14+2336Zdu3bs3LmTNm3asGXLlnzXNWbMGMaPH49arWb8+PH07NmTn3/+mebNm3Px4sUiiV8IIUTZJEmhECWTUX0HNHXqVEaMGMH169epUaOGXutu0aIFhw8fpn379lm2HzlyhC5dujB27Fj69Onz1F70gwcPsnr1atq3b8/evXu15YcMGUK3bt0YO3Yshw4d0mvsQgghhCi5ZAhO2WRUz7Kbmxs9evSgRYsWTJo0CV9fXxwdHXMs26FDhwLV/cILL+S4vX379vj5+bFnzx4uXLhAs2bN8qxn9erVAHz88cdZEvIuXbrwzDPP8Mcff3D16lV8fHwKFJ8QQgghhCg9jCrJ7tSpEyqVCkVRmD17NiqVKteyuc2frQtzc3OAfM1kEhAQgK2tLW3bts22LyPJPnTokCTZQgghhDCIouw5T1VriIhL5kFMMuExSYTH/vs7KVV/uVl+ffBcXVzsjXOyDKNKsmfOnJlnYl0UQkND2bdvH25ubjRo0CDPsvHx8dy/f5/69etjamqabX/NmjUB8rwAMjk5meTkZO39mJgYHSMXQgghhNCP5DQ1D2OTnyTNyYTHJml/P4hJ3/4wNolH8SnkspSJQUzu5gNIkv1Us2fPLtb2UlNTGTx4MMnJySxcuDDHxDmz6OhogFyHsDg4OGQpl5P58+czZ84cHSMWQgghhMi/5FQ1j+JS/k2Wn/Q6P3iSQD+MTeZBTBKPE1LzXaeZiQoXe0tc7S1xdbBK/21vha1l3nlUUXCysSj2NvPLqJLs4qTRaHj99dc5fPgwI0eOZPDgwcXS7rRp03jrrbe092NiYqhSpUqxtC2EEEKI0kOtUQiPTeLu40TuRj35eZxIaGSCtozvR/vyXZ+5qQpXeytc7C2p6JCeOGf8dnGwpKK9Fa4OlpS3scDEpHhHHpRERplkx8fHs3PnTs6dO0d0dDQODg40btyYvn37YmtrW+j6FUVh5MiRbNy4kVdffZUvv/wyX8dl9GDn1lOdMfQjt55uAEtLS1loRwghhBBPlZSq5l6m5PleVCJ3Mm5HJ3I/Kok0zdPHbliYmTzpbbakYkbPc6bfGYm0k7W5JM96ZHRJ9o4dOxgxYgSPHz9GyTToR6VS4eTkxOrVq3OdKSQ/NBoNI0aMYN26dbz88sv4+/tjYpK/6cJtbW1xd3fn1q1bqNXqbMNLMsZiZ4zNFkIIIYTIiaIoxCSmcScqQdsTnTmhvhuVSERcylPrMTVR4eZgReVy1lR2Sv9xsbdg1s/p63Yce88Pd0frYr/mTRhZkn38+HEGDBiAqakpo0aNolOnTri5ufHgwQMCAgLw9/fnf//7H4cOHaJ169YFrj9zgj1w4EA2bNjw1HHY/9WxY0e+//57AgMDs00juHv3bm0ZIYQQQpRNqWoNj+JSiIhL5mFcMveiErX7xmwIIiwmfYhHfMrTZ+OwsTClspM1lZyssyTSGbdd7S0xM83aWZiQkqZNsp1sLCTBNhCjSrLnzp2LpaUlx48fp379+ln2DRgwgDfeeIPWrVszb948fvnllwLVrdFoGD58OP7+/rz00kts3LgxzwQ7IiKCiIgInJ2dcXZ21m4fNWoU33//PdOnT2ffvn1YWKQPuN+/fz+7d++mQ4cOMn2fEEIIUcokp6mJiEshIjaZiLiMnxQe/ud+RFwyUXlcRHj4WkSW+xVsLbQJc6X/JNCVnaxxsjGXJLmEMqok+/jx4wwcODBbgp2hfv36DBgwgB07dhS47g8//BB/f3/s7Ozw8fHh448/zlamb9++NG7cGIAVK1YwZ84cZs2alWXWEz8/P0aMGMGaNWvw9fXlueee48GDB/zwww84ODiwatWqAscmhBBCiOKX9GTmjcwJ8r9J9L8J9MO4ZGKTCrakvamJigq2FjjbWVLe1pyj1x8B8GGfenhVsNUm0lbmxT8jhygeRpVkJyQk4OrqmmcZV1dXEhIS8iyTk+DgYADi4uKYO3dujmW8vLy0SXZevvrqKxo2bMhXX33FsmXLsLOzo3fv3sydO1d6sYUQQohMMnqAH8YmZ/2Jy5g+7t+1I1rPP0BRd9pmnuO5SQFm3oD02Tec7Syf/KQn0M72/953yXQ/80WEmReHebGpR5Evq25jYUbwgueKtA3xdCpFMZ4pxevUqYOdnR2nTp3KtUyLFi2IjY3l0qVLxRhZ0YmJicHR0VE7i4oQQgiRWVGu3qdrexqNQmTCfxLnuP8m0em/oxPzP/+yIViYmaQnxxlJs50lzvaZbttZ4mJviYudJQ7WZjoN3Sju51Dony75mlE9ywMHDuTDDz9k6NChzJ8/n0qVKmn33b9/n2nTphEUFMSMGTMMGKUQQghReqSkaUhISSM+RU1CchqP4v/tWd54IoToxNRsiXNEXArqfEwdl8HcVIVLRrKq/Umfj9nRyowJ358D4NfxbbEyL9rUJCk1jV7LAwE4+X5nXO2tZMyzKBJGlWRPnTqV3bt3s2HDBn744Qdq1KhBxYoVefDgAdevXyclJYUWLVowdepUQ4cqhBBCFLvkVDVJqRrik9OIT0kjPlmdniBn/H6SKGf5/WR/fHJa9jIpaaSqc0+W5/12Oc94ytumD5FwdbDMnkRnuu9onfvFewkp/451ruZiVyw99RnsreSiQlF0jCrJtra25tChQ3zyySf4+/tz8eJFLl5Mn4KmWrVqDB06lClTpshiLkIIIcqMY9f/nY2iIKv3FZSFqQk2lqZYm5tyPzoJgO71KuLuYPWf5Dn9fgU7C8xN87fOhBBlkVEl2QAWFhbMmDGDGTNmEBsbS0xMDA4ODtjb2xs6NCGEEKLYJKSkseD3y6w/HpJtn5W5CbYWZthYmqb/tjDF1vLJ7yzbzbC1zHmfraVp+n4LM6wtTLEwM9G2mzF++POBjWX8sBA6Mur/HHt7e0muhRBClDlnQh/z9pa/uBURn2X7n+93oYKdJaay9LUQRs+ok2whhCh1UuJh3pOLut+/Bxa20l5Jaq+I20xJ07Bs/zVWBlxHo4CbgxUfPVedbj81AiDBJBRTEyu9tZdzEPEEWw1Kby8lFCwcpb2S1mZp/z80xP+9DgyaZFerVg2VSsW+ffvw9vamWrVq+TpOpVJx48aNIo5OCCGEKD5XwmKZ/MM5Lt6PAaBv40rMeb4+5pqCrw0hjEvmITcy/KbsMOgzrdFoslzV+9/7uTGiqb2FEEKIQlFrFNYevcmnu6+SotZQzsacuf0a0LOBOwAJcQYOUAihE4Mm2RmrMOZ2XwghhCjNQh8l8M7Wv/gzOBKALrVdmd+/Aa72RTwkRAhR5OQ7CyGEEKKYKYrCD6du89GvF4lPUWNrYcrM3nUZ0KyKzNssRClhVBNcdu7cmfXr1+dZZvPmzXTu3LmYIhJCCCH0KzwmieHfnua9Hy8Qn6KmhVd5/pjUgYHNq0qCLUQpYlQ92QEBAXTq1CnPMqGhoRw6dKh4AhJCCCH0aNf5+3yw4wJRCalYmJrw7jO1eL2dt0zJJ0QpZFRJdn7Ex8djbm5u6DCEEEKUUQkpadhkvm3x9GOiE1KZ+fPf7Dx3D4B6lRxYPKAxtdxkLQghSiuDJ9mhoaFZ7kdFRWXbBqBWq7lz5w5bt27Fy8urmKITQgghCufw1YdM2XaesJgkTE1UvNGpOuM719SusFjWFff0djKdniguBn91eXl5acegqVQqli5dytKlS3MtrygKixYtKq7whBBCCJ0kpKQx/7fLbDiRviy6t7Mtiwc0wrdqOQNHJoQoDgZPsocMGYJKpUJRFNavX0+jRo1o3LhxtnKmpqaUL1+ezp0706NHj+IPVAghhMinoJDHvL3lHMGP0heSGdrak/eerYO1hamBIxNCFBeDJ9n+/v7a24cOHeK1115jwoQJhgtICCGE0FFKmoal+6+yKuAGGgXcHa1Y9GIj2tV0NnRoQohiZvAkO7Nbt24ZOgQhhBBCJ5fDYpj8w19cerIs+gu+lZn1fD0creVifSHKIqO66uLixYssW7aMhw8f5rg/PDycZcuWcenSpWKOTAghhMiZWqPw5aEbPL88kEv3YyhnY86qV5qweGBjSbCFKMOMqid7wYIF7N+/n3HjxuW4v0KFCixatIizZ8+ybt26Yo5OCCGEyCo0MpEZG//hVPBjALrWcWXeC7IsuhDCyJLsI0eO0KVLF0xMcu5gNzU1pUuXLhw+fLiYIxNCFJuUeJhXKf32+/fAwrZ0tSdKBUWBzerOfLT6LImpGmwtTJnVux4vNfPQ+6qNMsWdECWTUf33hIWFUaVKlTzLVK5cmfv37xdTREIIIcS/ohNSOXQ5gu2pUzikaQxoaOFdns9eakSV8jZPO1wIUYYYVZJta2tLeHh4nmXCw8OxspKv4YQQQhS95DQ1QSGPCbwewdHrj7hwJwqNAtAYC1KY1LUWYzrXwUSWRRdC/IdRJdlNmzZlx44dLFq0CCcnp2z7Hz9+zE8//USTJk2KPzghhBClnkajcPF+zJOkOoJTwZEkpWqylKlWwZp2UTsZbLqXyq2OS4IthMiRUSXZb775Jn379sXPz4+lS5fSoUMH7b5Dhw4xceJEHj9+nOuFkUIIIcqWhJQ0bDLftih4HbcjEwi8HsGR6xEcv/GIyPiULPud7SxpV6MC7Wq60LZGBRxNU7D5tF96m4WMXwhRehlVkv3888/zzjvv8Omnn+Ln54elpSVubm6EhYWRnJyMoii8++679O3b19ChCiGEKKEex6dw/OYjjl6PIPB6BCGPsqbKNhamtKpWgbY1nGlXwxmfinZZLmZMiEv5b5VCCJGNUSXZAAsXLqRTp0588cUXnDp1ijt37uDk5ETnzp158803efbZZw0dohBCiBIkKVXN6eDH2qT673vRKMq/+01NVPhWcUpPqms608jDCQszo1pGQghRAhldkg3Qs2dPevbsaegwhBBClEBqjcI/96K1SfWp4MekpGUdV+1T0U7bU93Cuzz2VrJojBBCv4wyyRZCCCHyS62oCFUqEhB0n1N3rnPsxiOiElKzlKnoYEm7Gi60q1mBNtWdqeggs1QJIYqWUSbZaWlpXLlyhaioKNRqdY5lMl8UKYQQonSKT04jLCaJB9FJhMUk/ed2MmFRCUQkr0eNKfx+Q3ucnaUZrapV0F6wWN3FVu+LxAghRF6MKslWFIWZM2eyfPlyYmNj8yybW/IthBDC+Gk0ChHxyTyITs6WPD+ISSLsye3YpLR81GaKOWk0qlqeDrXcaFvDmUYejpiZyrhqIYThGFWS/dFHHzF37lycnJwYMmQIHh4emJkZVYhCCCFyodEoRMYlo1LsiVVsCLn2iKjUKG3C/CAmifvR6cl0eGwyaRrl6ZUCthamVHS0ws0h/SfjdkUHK5zM0/D6rh3ORJMyJBgbO8ci/iuFECJ/jCqD/eabb/D09OT06dNUqFDB0OEIIUSpoCgQizVJsckkoSIxVU1iqpqkjN8pGfc12u1JqWoSM23PKJuYoiYp7cnvTMckpqozXVz4VfqvDRfyjEulSp+D2t0xPWF2c7DCLcttSyo6WOV5UWJCXDQ2qscAyMR6QghjYlRJ9oMHDxgzZowk2EIIoQeKovDLhQcsTVnEDaUyLDpebG3bkIRLeSfcnWyy9D5nvu1ib4l5CRzSYWNhluNtIYTIzKjODt7e3sTExBg6DCGEKPHOhj5m/m+X+TM4EqgMgAqwtjDF2twUK3NTrMxN/nM//bb1k31WmfZpt1uYYmWWw3FP7muS4yi/tBomKoWEN0Jl+IYQoswyqiR73LhxzJkzh/DwcFxdXQ0djhBClDihjxJYuPsyv56/D4ClmQnDlZ8YZfYrju9fRWVpV7QBmFuCKn2stfTyCiHKMqM6A/bq1YuAgADatGnDzJkz8fX1xdEx516QqlWrFnN0QghhvKISUlh+4DrrjweTqlZQqeAFXw/e9vOg0hf/Sy9UCqewk6EbQghjZVRnJC8vL1QqFYqi8Nprr+VaTqVSkZaWn2mdstq4cSNHjhwhKCiICxcukJKSwrp16xg2bFiB6omKimLx4sXs2LGDW7duYWlpibe3N0OHDmXEiBFYWckiB0KI4pGUqmb98WBWHLhOzJPp7trXdGbas3WoW8kBUuINHKEQQpRNRpVkDxkypEgXC5g+fTohISE4Ozvj7u5OSEhIgeuIioqiadOm3Lx5k3bt2jF69GiSk5P5/fffGT9+PD/99BN79+7FxKTkXcwjhCh6CSlp2GS+baFbPRqNwi/n77Fo9xXuPE4EoLabPdN61qGjj4t+ghVCCKEzo0qy/f39i7T+NWvWULNmTTw9PVmwYAHTpk0rcB1ff/01N2/eZPLkySxevFi7PSUlhXbt2nHgwAGOHj0qK1IKIYrMiZuPmPfbJc7fiQbSlwx/u1st+jf1wNSk9A0JEUKIksiokuyi1rVr10LXcfPmTQB69uyZZbuFhQXdunXj1KlThIeHF7odIYT4r+vhcSz4/TL7Lj0A0hdpGdOxOsPbe8t4ZCGEMDJyVi6gevXqAfDHH39kSdpTU1PZt28f1tbWtG7d2lDhCSFKoYexyXy+7yrfn7qNWqNgaqLif82rMKmrDy72loYOTwghRA6MKsmuVq1avsqpVCpu3LhRxNHkbMSIEWzYsIHPPvuM06dP07x5c5KTk/njjz94/Pgx3333HZUrV871+OTkZJKTk7X3ZV5wIURuElLSWHPkFl8dukF8ihqArnUq8t6ztanhWsRT8QkhhCgUo0qyNRpNjhc+RkdHExUVBYC7uzsWFjpeKaQH1tbWBAQEMHr0aDZu3MihQ4cAMDExYdy4cbRr1y7P4+fPn8+cOXOKI1QhRAml1ihsC7rN4r1XeRCT/qG8kYcj7/esQ8tqsiKuEEKUBEaVZAcHB+e576233uLBgwfs3bu3+IL6j4iICPr06UN4eDi7du2ibdu2JCUl8fPPP/P222/z66+/cvr0acqVK5fj8dOmTeOtt97S3o+JiaFKlSrFFb4QwogpisKhqw9Z8PtlLofFAuBRzpopPWrTq4E7JnJRoxBClBhGlWTnxcvLix9++IFGjRrxwQcfsGTJEoPE8dZbb3Hs2DH++usvGjZsCICjoyMjR45ErVYzduxYPv/881x7qy0tLbG0lDGUQois/rkXzfzfLnP0egQADlZmjO9ckyFtPLE0MzVwdEIIIQqqxCTZAObm5nTr1o0tW7YYLMnetWsX5cuX1ybYmXXu3BmAoKCg4g5LCFFC3YtK5NM9V/jp7F0UBSxMTRjS2pNxnWvgpOsk2kIIIQyuRCXZAAkJCURGRhqs/ZSUFJKSkkhJSck2Nvzhw4cA0lMthHiqGMWa5QeCWf/nPZLTNAD0blSJKc/Uokp5m6ccLYQQwtiVqGUJDx8+zObNm6lVq1aRtxUREcHly5eJiIjIsr1t27akpaXx0UcfZdmenJys3ebn51fk8QkhSiZFUdiU1plOyUtYfewOyWkaWniVZ8ebbVn+sq8k2EIIUUoYVU92xnCL/0pLS+Pu3bsEBwejKArTp0/Xqf41a9Zw9OhRAC5cuKDdFhAQAEDfvn3p27cvACtWrGDOnDnMmjWL2bNna+tYsGABx44d4+OPP2bPnj3aCx93797NzZs3adq0KSNGjNApPiFE6ZaSpmH6r9f4KS39HOFdwZppPevSrW7FHGdWEkIIUXIZVZKdkez+l0qloly5cnTr1o3JkyfzzDPP6FT/0aNH+fbbb7NsCwwMJDAwEEi/uDIjyc5N48aNCQoKYv78+ezfv58VK1ZgZmZGjRo1mDNnDu+88w5WVlY6xSeEKL2iE1MZuzGIYzceYYKG98w2M3DUFzg65jwTkRBCiJLNqJJsjUZTpPX7+/vj7++fr7KzZ8/O0oOdWc2aNfnmm2/0F5gQolS7HZnAa/6nuB4eh42FKV8oC/EzPUeC6SpDhyaEEKKIGHRMdufOnVm/fr32/uHDhwkNDTVgREIIQ0tIScvxdkl1NvQxfb8I5Hp4HG4OVmwY0gA/03OGDksIIUQRM2iSHRAQkGUBGj8/v3z3NAshhLH7/cJ9/vf1CR7Fp1DX3YEdb7aljpsshy6EEGWBQYeLlC9fnkePHmnvK4piwGiEEEI/FEXh68M3mf/7ZQA613Zl+cu+2FqakRCXbODohBBCFAeDJtkNGzZkw4YNeHh4ULFiRQDOnTuXZQhJboYMGVLU4QkhRIGlqjXM3PkPm/9MH/o2tLUnM3rVxcy0RM2YKoQQopAMmmTPnz+f3r17M3XqVO30VTt37mTnzp25HqMoCiqVSpJsIYTRiUlK5c1NZzhyLQKVCmb2qstrbb0NHZYQQggDMGiS3bJlS65fv86pU6e4e/cuw4YNo0+fPvTp08eQYQkhRIHdjUrk9XWnuPIgFmtzU5a97Eu3uhUNHZYQQggDMfgUfg4ODnTp0gWAYcOG0bhxY4YOHWrgqIQQIv/O34li+LeneRibjIu9Jd8MbU4DD0dDhyWEEMKADJ5kZ1bU82QLIYS+7fknjAnfnyUpVUNtN3vWDmtOZSdrQ4clhBDCwIwqyRZCiJJCURS+CQzm410XURTo4OPCF4N8sbcyN3RoQgghjIAk2UKIXCWkpFF35m4ALn74DDYWcsoASFNr+PDXi6w/HgLAoJZV+fD5evmaQSTzYyiPpxBClF5yhhdClGkJKWnYZL5tkXf5uOQ0xn93hoNXHqJSwfvP1mFEe2/tDElCCCEESJIthBD5dj86kdf9T3PpfgxW5iZ8PrAxPeq7GzosIYQQRkiSbCGEyIe/70Yz/NtTPIhJxtnOgjVDm9O4ipOhwxJCCGGkJMkWogSRMdKGceDyA8Z9d5aEFDU1Xe34ZlhzqpS3efqBQgghyiyjWud38uTJXLx40dBhCCGE1vrjwYz49jQJKWra1XBm29g2kmALIYR4KqNKspcuXUqDBg1o27Yt/v7+JCQkGDokIUQZpdYofPjLRWbu/AeNAgObVWHda81xtJYp+oQQQjydUSXZv/76K3369OH06dMMHz4cd3d3xo4dS1BQkKFDE0KUIQkpaYzeEMQ3gbcAmNKjFgv6N8A8H1P0CSGEEGBkSXbPnj358ccfuXPnDgsWLKBSpUp89dVXtGjRAl9fX1atWkVMTIyhwxRClGLhMUkM/OoE+y49wMLMhBWDfHmjUw2Zok8IIUSBGFWSncHFxYV3332XS5cucfjwYQYPHsy1a9cYN24c7u7uDBs2jMDAQEOHKYQoZa6Gx9P3i0Au3I2mvK0Fm0e2olfDSoYOSwghRAlklEl2Zu3atcPf35/ffvsNd3d3EhMTWb9+PR06dKBBgwZs27bN0CEKIUqBQ+qGvOJ/nnvRSVRzseWnN9rQ1LOcocMSQghRQhl1kh0bG8uXX35Js2bN8PPz4969e7Rp04avvvqK0aNHExwczMCBA1m4cKGhQxVClGDfpXXm9dR3iU9R06paeX4a2xbPCraGDksIIUQJZpRJ9tGjRxk2bBju7u688cYb3Lx5kzfffJMLFy5w9OhRRo4cycqVK7l58yb169dn+fLlhg5ZCFFCHb4eyftpI1BjSt+Grqx/vSWONjKDiBBCiMIxqiT7s88+o06dOnTs2JH169fTqFEj1q1bx71791i2bBn16tXLUt7FxYUXX3yRe/fuGShiIURJpigKKw6FAjDIdB9ze9fEwsyoTotCCCFKKKNaLu7dd9/F0dGRN954g9GjR1O/fv2nHtO0aVOGDBlSDNEJIUqbgKsP+ft+HNYk8ZbZNlSq2YYOSQghRClhVEn2N998w8CBA7G2ts73MT179qRnz55FGJUQojRSFIWl+64B8KrpPpxVMcjyV0IIIfTFqL4XNTEx4dq1a3mW+fvvv1m/fn0xRSSEKK2OXIvg3O0oLM1MGGX2q6HDEUIIUcoYVZL92muvsWPHjjzL7Nq1i9dee614AhJClEqKorB0f/oH+oFN3HBRySJXQggh9MuokmxFUZ5aRq1WY2JiVGELIUqYYzceERTyGAszE4a39jB0OEIIIUqhEpetnj17lvLlyxs6DCFECZV5LPagFlVxsbcwcERCCCFKI4Nf+Ni5c+cs9/39/QkICMhWTq1Wc+fOHYKDgxkwYEAxRSeEKG1O3Izkz+BILExNGNOxOpBs6JCEEEKUQgZPsjMn1CqViuDgYIKDg7OVMzExoXz58rz00kt8/vnnxRafEKJ0Wbr/KgD/a1EFN0crEuIkyRZCCKF/Bk+yNRqN9raJiQmzZ89m5syZBoxICFFanbz5iBM3IzE3VT3pxRZCCCGKhsGT7MwOHjyIl5eXocMQQpRSyw6kj8Ue0KwKlZzyPx+/EEIIUVBGlWR37NjR0CEIIUqp08GRBF5/hLmpirGd/u3FtrEwy/G2EEIIURgGfUfJWFSmX79+2NvbF2iRGVlKXQhREBnzYr/Y1AOPcjYGjkYIIURpZ9Ake9iwYahUKlq1aoW9vb32fl4URUGlUkmSLYTItzOhjzlyLQIzExVvdKph6HCEEEKUAQZNsr/55htUKhXu7u4ArFu3zpDhCCFKqWVPerFfaFKZKuWlF1sIIUTRM3hPdmZDhw4t0vY2btzIkSNHCAoK4sKFC6SkpLBu3bpsceRHbGwsn376Kdu3b+fmzZtYWFhQrVo1+vTpw6xZs/QfvBBCJ+duRxFw5SGmJire9JNebCGEEMWjTF3lM336dEJCQnB2dsbd3Z2QkBCd6gkNDaVz587cvHmTrl278txzz5GcnMz169fZvn27JNlCGJHlT3qx+zaujGcFWwNHI4QQoqwoU0n2mjVrqFmzJp6enixYsIBp06YVuA61Ws2LL77IvXv32L9/P35+fln2p6Wl6StcIUQhXbgTzf7L4ZioYFxn6cUWQghRfAyaZFerVk2n41QqFTdu3CjwcV27dtWpvcy2bdvGqVOnmDFjRrYEG8DMrEx9bhHCqGXMKNKncWW8naUXWwghRPExaEao0WieOptIThRFKYJo8ueHH34A4KWXXuL27dvs2rWLqKgoqlevzrPPPoudnV2exycnJ5Oc/O8yzjExMUUarxBl1d93o9l36QEq6cUWQghhAAZNsoODgw3ZvE5Onz4NwNGjR5k8eXKWhNnFxYUtW7bQqVOnXI+fP38+c+bMKeowhSjzlj9Z3bF3w0pUd8n7w68QQgihbyaGDqCkCQ8PB2D8+PFMmjSJ27dv8/DhQ5YtW0Z0dDR9+/bl/v37uR4/bdo0oqOjtT+3b98urtCFKDMu3Y9h9z/pvdjjpRdbCGFgCWmJNPCuSgPvqiSkJUp7ZYQk2QWk0WgA6NWrFwsWLMDDwwNnZ2fGjx/P5MmTiY6OZu3atbkeb2lpiYODQ5YfIYR+ZfRi92zgTs2K9gaORgghRFlUqOEiP/30E5s3b+by5cskJCRw/fp1AC5fvszPP//MK6+8QuXKlXM9viQuq+7o6EhERATPP/98tn29e/fmk08+0Q4pEUIUvythsfx2IQyACZ1rGjgaIYQQZZVOSbZGo+Hll19m27ZtAFhbW5OY+O/XA+XKleODDz5ArVbnOU1eSVxWvVatWkRERODk5JRtX8a2zI+FEKJ4ZfRiP1vfjVpu0osthBDCMHRKspcsWcLWrVsZM2YMCxYsYPHixXz00Ufa/RUrVqR9+/bs2rUrzyS7JC6r3rlzZwIDA7l48SIvvPBCln0XL14EwMvLywCRiTIhJZ5gq0EAJKSEgoVj6WqvkK6Hx7LrQvo1EeOlF1sIIYQB6ZRk+/v706xZM1auXAmQY+9zjRo12LVrV571FPey6gURERFBREQEzs7OODs7a7e/9tprLFy4kOXLl/Paa69ph8PExsYyb948AAYMGGCQmIUo65YfuI6iQPe6FalbSa53EEIIYTg6Xfh4/fp1OnTokGeZChUq8OjRowLVe/jwYUJDQ/Msc+fOHQ4fPlygejOsWbOGYcOGMWzYMLZu3Zpt244dO7RlV6xYQZ06dVixYkWWOry9vVm0aBHh4eE0atSIkSNHMm7cOBo2bMi5c+cYNWoUXbp00Sk+IYTubjyM45e/7gEwoYv0YgshhDAsnXqyra2tn7qISkhISI7jlvPi5+fHrFmzmDlzZq5lNm3axPvvv49arS5Q3ZA+t/W3336bZVtgYCCBgYFA+jCPvn37PrWe8ePH4+XlxaJFi/j+++9JS0ujXr16vP/++4wcObLAcQkhCu+LA9fRKNC1jiv1Kxv3sBYhhBC6S0hLpKV3VQBOpiViY2GcK/rqlGT7+vqye/dukpOTsbS0zLY/MjKSP/7446m93f+Vn5UcdV0lEtKHufj7++er7OzZs5k9e3au+3v37k3v3r11ikMIoV+3IuLZce4uABO7+Bg4GiGEEELH4SITJkzg9u3bvPjii9y9ezfLvhs3btCvXz+io6OZMGGCXoLM7Nq1azg6Si+VEOJfXxxM78XuXNuVBh5yfhCiMEr7QiaycIooLjr1ZPfp04f33nuPBQsWULVqVWxt07vpXV1defToEYqiMGPGDDp37vzUul5//fUs93fs2JHjcutqtVo7HrtHjx66hC2EKIVCHsXz09n0D/syFlsIIYSx0Hkxmnnz5uHn58eKFSs4efIkSUlJaDQaevTowYQJE3jmmWfyVU/m4RsqlYpz585x7ty5HMuqVCqaN2/OkiVLdA1bCFHKrDx4A7VGoaOPC42rOBk6HCGEEAIo5IqP3bp1o1u3boUK4NatW0D6eOxq1aoxadIkJk6cmK2cqakp5cqV0/aaCyHE7cgEtp+5A0gvthBCCONSqCRbHzw9PbW3161bR+PGjbNsE0KI3KwMuEGaRqF9TWeaepYzdDhCCCGElk5J9tPmss6satWq+S5rTIvRCCGM292oRLYF3QakF1sIIYTx0SnJ9vLyytc0eiqVirS0tHzXu379+nyXHTJkSL7LCiFKn1UB10lVK7SpXoHmXuUNHY4QQgiRhU5J9pAhQ3JMsqOjo/nrr7+4desWHTt2xMvLq0D1Dhs27KnJu6IoqFQqSbKFKMPuRyey5ZSMxRZCCGG8dEqy81rQRVEUPvvsMxYuXMjatWsLVO+6dety3B4dHc2ZM2f47rvveP7552URGCHKuFUBN0hRa2jpXZ5W1SoYOhwhhBAiG71f+KhSqXjnnXfYtWsX7777Ltu3b8/3sU8bkz169Gi6dOnC2LFjCxumEKKECotO4vs/08diT5RebCGEEEZKpxUf86NZs2YcOHBAr3W2bt2a3r17M3PmTL3WK4QoOb48lN6L3dyrHK2rSy+2EEII41RkSfaNGzcKdNFjfnl6evLXX3/pvV4hhPELj0li85/psxtN7OKTrwuwhRBCCEPQ63ARjUbD3bt38ff3Z+fOnXTp0kWf1aMoCocPH8ba2lqv9QohSoavDt8kOU1Dk6pOtK0hvdhCCCGMl05JtomJSZ49SIqi4OTkxKJFiwpU7+HDh3PcnpaWxt27d1m/fj2nTp1i8ODBBapXCFHyPYxNZtPJEAAmdpVebCGEEMZNpyS7Q4cOOb7BmZiYUK5cOZo1a8Zrr71GxYoVC1Rvp06dnpq8t27dmsWLFxc4ZiFEybb6yE2SUjU0quJEh5rOhg5HCCGEyJNOSXZAQICew0g3c+bMpybvrVq1KpK2hRDG61FcMhuOp/diT+pSU3qxhRBCGD29T+FXGLNnzzZ0CEIII7T6yC0SU9U09HCkUy0XQ4dTOOrUf2+vagtF/YFBUaS9kt5mMbdnpVHza9y99NtfdwYTU2mvhLVZltpTxdwDG+P8dtOokmwhhPivyPgU1h8PBmBC51LQix0S+O/tx7eKt21pr+S3WQztmQCeGXeiQqS9EthmWWovMXPHhZHJV5LduXNnnSpXqVTs379fp2OFEAJg7dGbJKSoqVfJgS51XA0dTuFd+ePf20N2glkRz5aUlgjr+0h7JbnNYm4vKTmKEQfGA7Cm83KsLJ2kvRLWZllq72t7tyJtqzDylWTrOga7xPc4CSEMKioxlW+PpfeKTCgNY7E1Gri2+9/7Hs3BwrZo20yJl/ZKepvF3J4mIYK/rCzTb1duWuRfxZf29gzRZllqDzPLIm2rMPKVZGs0mqKOQwghstlw8h5xyWnUcXege92CzVZklO6dgbgHho5CCCFEMSiyFR+FEKIwohVbNpxKv7BlQucaJb8XG+Dyr4aOQAghRDGRCx+FEEZpnfoZ4tLU1KpozzP1jHfMXYFc3mXoCIQQQhSTQiXZSUlJnDp1inv37pGcnJxjmSFDhhSmCSFEGRSjWPNN2rMAjO9SAxOTUtCLHXENIq6CiTlojPdqeCGEEPqhc5L9xRdfMGPGDKKjo3PcrygKKpWqQEl2YGAg27dvZ8qUKbi5Ze+5CgsLY+HChQwYMEAWpRGiFPtW/Qwx2FLd2Yae9d0NHY5+ZPRie7aBW4cMG4sQQogip9OY7B9//JHx48dTpUoVPv30UxRFoU+fPsybN48ePXqgKAr9+/fnm2++KVC9ixcv5pdffskxwQZwc3Pj119/ZcmSJbqELYQoAeKS01iT1hOAMe2qlI5ebPg3yfbpYdg4hBBCFAudkuzPP/8cV1dXjh8/zuTJkwFo3LgxU6dOZdeuXWzcuJEdO3bg6en5lJqyOnXqFO3atcuzTIcOHThx4oQuYQshSoBNp+4TjR3VVPfoUdc4V/EqsNgwuHMq/bZPd8PGIoQQoljolGSfP3+e559/HhsbG+02tVqtvT1o0CC6dOnChx9+WKB6w8PDqVy5cp5l3NzcCA8PL1jAQogSIS45Df+TdwEYb/YTpqWlF/vK74AClZuCfSkZ/iKEECJPOiXZqampuLi4aO9bW1sTFRWVpUzDhg05c+ZMgep1cnIiNDQ0zzIhISHY2dkVqF4hRMmw/ngw0YlpVFPd43mTY4YOR38yhorUfs6wcQghhCg2OiXZlSpV4v79+9r7np6enD17NkuZkJAQzMwKdl1l69at+emnn7h9+3aO+0NDQ9mxYwdt2rQpeNBCCKMWn5zG6sM3ARhntgNTlWLgiPQkOfbfCx1rSZIthBBlhU5JdvPmzbP0Uvfo0YPAwEAWLFjAP//8w1dffcWPP/5I8+bNC1TvW2+9RUJCAm3btmX9+vXaRP7+/ft8++23tG3blsTERN5++21dwhZCGLH1x0N4nJCKZ3mr0tWLfX0fqFOgfHVwqWXoaIQQQhQTnZLsl156ieTkZIKDgwGYNm0aHh4efPDBBzRs2JCxY8diZ2fHwoULC1Rv+/btWbZsGffv3+e1117Dw8MDMzMzPDw8eP311wkLC2Pp0qV06NBBl7CFEEYqPjmN1UfSe7HHtKuCmUpj4Ij0KPNQkdKwaqUQQoh80Wme7H79+tGvXz/tfRcXF86dO8eaNWu4efMmnp6eDB48+KkXMebkzTffpGPHjqxatYpTp04RFRWFk5MTLVq0YMyYMdSvX1+XkIUoEgkpadSduRuAix8+g42FLKKqiw0nQoiMT8Grgg3P1XeFPYaOSE/SUuDqkz+mdi/DxiKEEKJY6S0jKFeuHO+++65e6qpfvz5ffPGFXuoSQhi3hJRMY7E718SstMwoAhByFJKjwdYVPJoZOhohhBDFSKfhInPnziUkJETfsQghyqCNJ0J4FJ+CZwUb+jauZOhw9CtjqEitZ8HE1LCxCCGEKFY69WTPmDGDWbNm0a5dO1599VVeeuklHB0dC1xPxnR9lStXxtTU9KnT92VWtWrVArcnhDAuCSlpfHUovRf7Tb8amJmakGLgmPRGUeDyb+m3Zeo+IYQoc3Tqyd6wYQPdunXj2LFjjB49Gjc3NwYMGMAvv/xCWlpavuvx8vLC29ubGzduZLn/tJ9q1arpEjYbN25k9OjRNGvWDEtLS1QqFf7+/jrVlSE1NZXGjRujUqmoXbt2oeoSoqzZdCKUR/EpVC1vQz/fgl/DYdTunYXYe2BuC94dDR2NEEKIYqZTT/Yrr7zCK6+8wsOHD/nuu+/YsGED27ZtY/v27ZQvX56BAwfy6quv0qpVqzzrGTJkCCqVStsLnnG/qEyfPp2QkBCcnZ1xd3fXy5CXjz76iOvXr+shOiHKlsQUNV8dTv+APc6vBuamOn3mN14ZQ0VqdgVzK8PGIoQQotgV6sJHFxcXJk6cyMSJE7l69Srr16/nu+++Y+XKlaxatYrq1atz9erVXI//by9yYXuVn2bNmjXUrFkTT09PFixYwLRp0wpV35kzZ5g/fz6LFy9mwoQJeopSiLJh08kQIuJSqFLemn5NSlkvNmSauk9mFRFCiLJIb11HPj4+fPzxx9y4cYN58+ZhZmamHQZiLLp27Yqnp6de6kpJSWHYsGG0atWKcePG6aVOIcqKxBQ1Xz4Zi10qe7Ef3YCHl8DEDGp2M3Q0QgghDEBv72xXr15l5syZ1KhRgw8++IDU1NQCj502NTXlo48+yrPMJ598gqmp4a/Snz17NteuXWPt2rVFOsRFiNLouz9DiYhLxqOcNS808TB0OPqX0Yvt1Q6syxk2FiGEEAZRqOEi4eHhbN68mY0bN3LmzBkURaFcuXKMGjWKwYMH06ZNmwLVpygKiqIUJqRicerUKRYuXMi8efPw8fEp0LHJyckkJydr78fExOg7PCGMWlKqmi8PpX/L9WZp7MUGuPJkVpFaMquIEEKUVTol2Zs2bWLjxo3s37+ftLQ0LCws6Nu3L4MHD+a5557D3Nxc33FqPXz4EGtr6yKr/2mSk5MZNmwYvr6+vP322wU+fv78+cyZM6cIIhOiZPjuZCgPY5Op7GRN/9LYix33EEJPpN+u3dOwsQghhDAYnZLswYMHA9C2bVteffVVBg4ciJOTk04BrF+/Psv9c+fOZdsGoFaruXPnDuvWrTPo0uozZszg2rVrBAUF6TRsZdq0abz11lva+zExMVSpUkWfIQphtP7bi21hVgp7sa/+Dijg3hgcS+GHCCGEMKCopCjm/TlPe/9E2Ck6V3vWgBHlTqcke86cObz66qt4e3sXOoBhw4ZpxzSrVCp27tzJzp07s5XLGEZibW3N7NmzC92uLs6cOcPixYuZMWMGDRo00KkOS0tLLC0t9RyZECXD5j9DCX/Si/1i01KagMqsIkIIoXeKovBH8B8s+HMBkUmR2u2NnA3X8fo0Oq/4qC/r1q0D0h+8119/nb59+9KnT59s5UxNTSlfvjytW7emXDnDXEh0/vx51Go1s2fPzjHRv3Llinbe76ioqGKPTwhjlrkX+w2/6qWzFzs5Dm4cTL8tqzwKIYRehMWH8fGJjzl05xAA1Ry8uBkTDIC1meGGED9NoS581IehQ4dqbx86dIh+/frx/PPPGzCi3Pn4+DB8+PAc961duxZHR0defPFFbGxsijkyIYzfD6du8yAmmUqOVrzUtJQOkbqxH9TJUM4LXOsYOhohhCjRNIqGrVe2suTMEuJT4zEzMWNUw1EMqt6Xdtu7Gzq8pzJ4kp1ZRq+2MYiIiCAiIgJnZ2ecnZ0BaNOmTa4zpqxduxY3NzfWrFlTnGEKUSIkpapZGZC+MurY0joWG+Dyk1lFavcCmdpTCCF0FhwdzKxjszgTfgaAhi4NmdN6DjXK1SAhIcLA0eWPUSXZGX766Sc2b97M5cuXSUhI0C5bfvnyZX7++WdeeeUVKlcu+Apxa9as4ejRowBcuHBBuy0gIACAvn370rdvXwBWrFjBnDlzmDVrlsHGgAtRWmw5nd6L7e5oxYBmpXQstjoVrv6RfluGigghhE5SNal8+8+3rDq3ihRNCtZm1kxsMpH/1fofpiaGXyelIIwqydZoNLz88sts27YNSL/IMTExUbu/XLlyfPDBB6jVap2WRD969Cjffvttlm2BgYEEBgYC4OXlpU2yhRD6kZymZuXBJ2OxO1XH0qxknSTzLeQYJEWBTQWo0tLQ0QghRInzz6N/mH1sNpcjLwPQtlJbZrSeQWW7gnesGgOj+s52yZIlbN26ldGjR/P48WPeeeedLPsrVqxI+/bt2bVrl071+/v7axe8yeknc4/17Nmzs23Li6IoXL58Wae4hCjNtpy6TVhMEm4OVgxoXkrHYsO/s4rUehZKWG+LEEIYUmJaIotPL+aVXa9wOfIyjpaOzGs3j1VdV5XYBBuMrCfb39+fZs2asXLlSoAclyuvUaOGzkm2EKJ4JaepWRnw74wipbYXW1Fk6j4hhNDBn/f/ZPbx2dyOvQ1AD68evNfiPSpYVzBwZIVnVEn29evXefPNN/MsU6FCBR49elRMEQkhCmPr6Tvcj06iooMlA5qV4l7s+39BzB0wt4FqnQwdjRBCGL2YlBgWn17M9mvbAXC1cWV6y+n4VfUzcGT6k68ku1q1ajpVrlKpuHHjRr7LW1tbExMTk2eZkJAQnVeXFEIUn/Sx2E9mFOlYHSvzUtqLDXDlyawi1TuDufHO2SqEEMZgf+h+5p6Yy8PEhwAM8BnApKaTsLewN3Bk+pWvJFuj0WQbupGSksL9+/fTKzEz0/Ywp6WlAeDu7o6FhUWBgvH19WX37t0kJyfnuCpiZGQkf/zxBx06dChQvUKI4rct6A73opNwtbfkfy2qGjqcoiVDRYQQ4qkiEiOYd3Iee0P2AuDp4Mms1rNo7tbcwJEVjXxd+BgcHMytW7e0P2fPnsXd3Z0OHTpw5MgRkpKSuH//PklJSRw+fJgOHTpQqVIlzp07V6BgJkyYwO3bt3nxxRe5e/duln03btygX79+REdHM2HChALVK4QoXilpGu2MImM7lfJe7Mhb8OBvUJmCzzOGjkYIIYyOoijsuL6DPjv6sDdkL6YqU4bXH8623ttKbYINOo7Jnjp1KklJSZw8eRJT03/fPE1MTGjXrh379u2jUaNGTJ06lS+//DLf9fbp04f33nuPBQsWULVqVWxtbQFwdXXl0aNHKIrCjBkz6Ny5sy5hCyGKybagO9yNSsTF3pKXS3svdsZQEc82YFPesLEIIYSRuRN7hw+Pf8jx+8cBqFO+DnPazKFOhdK/Kq5OU/jt3LmTXr16ZUmwMzMzM6NXr17s3LmzwHXPmzeP3bt306tXL2xsbDA1NUWj0dCjRw9+//135syZo0vIQohikpKm4YuyMhYbZKiIEELkQK1Rs/6f9bzw8wscv38cS1NLJjWZxHfPfVcmEmzQsSc7JiaG6OjoPMtER0c/tUxuunXrRrdu3XQ6VghhWD+e+bcXe1DLUt6LHf8IQtN7Z6jd07CxCCGEkbj2+Bqzj83mfMR5AJpVbMbsNrPxdPA0cGTFS6ee7Hr16vH999/nOnPItWvX+P7776lfv36hghNClCypag0rnvRij+5QrfT3Yl/9AxQNuDUAp1L+gUIIIfLh63/WMeDXAZyPOI+duR0zW89k7TNry1yCDTr2ZE+fPp1+/frh6+vL8OHDadeuHa6uroSHh3PkyBG++eYb4uPjmT59uk5BpaWlceXKFaKiolCr1TmWkRlGhDA+P565w53HiTjbWfJKyzJwQpWhIkKIfEhRp2hvnwj7E0tLxyJtLzn535EExd3e2ovrAehUpRPTW06nom3FIm3bmOmUZPfp0wd/f3/Gjx/P0qVLWbZsmXafoig4ODiwbt06nn/++QLVqygKM2fOZPny5cTGxuZZNrfkWwhhGJl7scd0rIa1RSnvxU5JgBsH0m/Xfs6wsQghjNLNqJtsv7adn6//e43axCNTizWG4m6vnGU53m/1Ps94PpPjyt1lic4rPg4ZMoR+/fqxY8cO/vrrL6Kjo3F0dKRRo0b06dMHBweHAtf50UcfMXfuXJycnBgyZAgeHh6YmRnVopRCiFz8dOYutyMTcbazKBu92DcOQFpi+jCRijI0TgiRLiE1gT0he/jx2o+cDT+bbb+PUw1MTIo2t9Fo0rgadd0g7f3wzDrcy1Uv0vZKikI96vb29gwePJjBgwfrJZhvvvkGT09PTp8+TYUKJX/NeiHKiqxjsauX/l5syDpUpIz31ggh4J9H//Dj1R/57dZvxKXGAWCqMqWDRwd6Ve3G24HvA7Ch22psbJyLNJaEhAhabvUzSHuORTw0pSQp9EebuLg4rl69Snx8PO3bty9UXQ8ePGDMmDGSYAtRwuw4e5fQyAQq2FrwSqsycAGgOi39okeAWjKriBBlVUxKDL/d/I0fr/3IpchL2u0edh709+lPn+p9cLFxISEhwoBRCkPROckODg5m4sSJ/Pbbb9pl1zOWVA8MDGTkyJGsXLmSTp065btOb29vYmJidA1JCGEAaZl6sUd1qIaNRRkY4nX7BCRGgnU5qNra0NEIIYqRoiicCT/Dj9d+ZE/wHpLUSQCYm5jT1bMr/Wv2p7lbc0xUOk3gJkoRnd4NQ0NDadWqFY8ePaJPnz6EhYVx/Phx7f6WLVsSERHB5s2bC5Rkjxs3jjlz5hAeHo6rq6suoQkhitmOc/cIeZRAeVsLBrcuA2Ox4d+hIj7PgmkZ+FAhhOBR4iN+ufEL269tJzgmWLu9hlMN+tfsT69qvXCycjJYfML46PTuMGvWLB4/fsyhQ4do06YNc+bMyZJkm5mZ0b59ewIDA/OsJzQ0NMv9Xr16ERAQQJs2bZg5cya+vr44OuY8tqdq1TLwlbQQRi5NrWHFgWtAGerFVhS4/Gv6bZlVRIhSTa1Rc+L+CbZf287B0IOkKenf2FubWfOs97P0r9mfBs4NyvwsGiJnOr0j7t69m379+tGmTZtcy1StWpUDBw7kWY+Xl1eOL0xFUXjttddyPS7z0BQhhOHsPHeP4Ixe7FZlpBf7wd8QFQpm1lC9s6GjEUIUgbD4MH669hM/Xf+J+/H3tdsbODegf83+9PDuga25rQEjFCWBTkl2ZGQkXl5eTy2XnJyc5/4hQ4bIpz8hSqjMY7FHtq+GrWUZ6MWGf4eKVO8MFjaGjUUIoTepmlQO3z7MtmvbCLwbiIICgL2FPb2r9eaFmi9Qq3wtA0cpShKd3hUrVqzI9evX8yzz999/P3VIh7+/vy7NCyGMwC/n73ErIp5yNuYMKStjsSHT1H0yq4gQpUFITAjbr21n5/WdRCZFarc3d2tO/5r96VK1C1ZmVgaMUJRUOiXZ3bp1Y8OGDfz999/Ur599EYYjR46wf/9+Jk2aVKB6Q0NDcXJyynMhm9jYWB4/fixjsoUwILVGYfn+9A/aI8pSL3ZUKISdB5UJ+PQwdDRCFLnzEX9jVcQX8yUlRRmsvbEBkzjz8C/t/QpWFehboy/9avbD06EMdR6IIqHTO+P06dPZtm0b7dq1Y8qUKdpe7d9//51jx46xePFinJ2deffddwtUr7e3N7NmzWLmzJm5llm5ciXvv/++LKsuhAH98tc9bkbE42RjztA2XoYOp/hc/i39d9XWYFu0izsI45WQlkhL7/SOnpNpidhYFO3Y3OJuLyT230kJRh4cX6Rt/Vdxt3fm4V+YqExoV7kdL9R8gQ4eHTA3MS/WGETppVOS7eXlxe7du/nf//7H9OnTUalUKIpCr169UBSFqlWrsm3bNtzd3QtUr6IoeikjhCg6ao3CsiczioxsXw27stKLDTKriCj1YlJieOfodO19D9tKqEyKdgVXRaPmTvw9g7Q3qt5rvFRnEG62bkXapiibdH53bNmyJdeuXeOXX37h5MmTREZG4uDgQMuWLenTpw8WFhb6jFPrzp072NvbF0ndQoin+/X8PW4+jMfRuoyNxU6IhJBj6bdllUdRCqVp0phyaAqhcbe127b33FSsS3IXd3vD6w4p8vZE2VWoLigzMzP69etHv379dK7jww8/zHI/ICAgx3JqtZo7d+7w/fff07JlS53bE0LoTq1RWLY/oxfbG3urMvS16tXdoKihYn0o723oaITQuyVBSwi8F4iVqZV2FUMhhO50SrLnzp3Lq6++iqdn4XuxZs+erb2tUqkICAjINdEGqFSpEp988kmh2xVCFNyuC/e58aQXu0yNxQa48mRWEenFFqXQjus7WH9xPQAzm0/l/RNzDByRECWfTkn2jBkzmDVrFu3atePVV1/lpZdeynVlxqc5ePAgkD7WunPnzgwbNoyhQ4dmK2dqakr58uWpXbs2JiYmOrUlhNBd5l7s4e3KWC92aiJc359+W8Zji1LmXPg5Pjye/q3ymEZj6FKlE0iSLUSh6ZRkb9iwgY0bN7J//36OHDnC+PHj6d27N4MHD+bZZ5/FzCz/1Xbs2FF7e9asWfj5+dGhQwddwhJCFKE9lyK4Hh6Hg5UZw9p6GTqc4nUzAFITwMED3BsZOhoh9CYsPoxJByeRqkmla9WujG00lqTEyKcfKIR4Kp26hF955RV+//137t69y+LFi6lXrx7btm2jb9++uLu7M27cOE6cOFHgemfNmiUJthBGSKOoWHkk/WKo4e2q4VCWerEh66wiskqtKCUS0xKZcGACj5Ie4VPOh7nt5mKikm+KhdCXQl346OLiwsSJE5k4cSJXr15l/fr1fPfdd6xcuZJVq1ZRvXp1rl69WuB6w8LCCAoKIioqKtf5sIcMGVKY0IUQBfCbpgU3IhKwL4u92Bo1XPk9/bYMFRGlhKIozAicwaXIS5S3Ks/yzsuxMbcxdFhClCp6m+DWx8eHjz/+mI8++ohPPvmEWbNmcePGjQLVkZSUxMiRI9m8eXOu82ErioJKpZIkW4hiolFULEt7AUgfi+1oXcZ6sW+fhIRHYOUEnm0MHY0QevH1+a/ZHbwbM5UZizstppJdJUOHJESpo7ck++rVq2zcuJFNmzYRHByMoihUr169QHVMnTqVTZs24ePjw8svv4yHh0eBxncLIXSXkJLGo7gUIuNTeBSfzKO4FMIexxCaNpKrShXsLU15rW0ZnLru8pNZRXyeAdMy9gFDB6V9NcTSYH/IflacWwHAB60+oGnFpgaOSIjSqVAZbHh4OJs3b2bjxo2cOXMGRVEoV64co0aNYvDgwbRpU7Ben61bt1K3bl2CgoKwtLQsTGhClGmKohCXnPYkYU4hMu5J4vzktnZ7/L9JdVKqJpfaOgHwaotKZa8XW1H+TbJlqIgoBa4+vsq0o9MAGFR7EC/6vGjgiIQovXRKsjdt2qSdXSQtLQ0LCwv69u3L4MGDee655zA31+2NOCoqikGDBkmCLUQeHit2/KmpTdiZMGLTwrMmy3H/3k5R55Y0587CzIQKthaUf/LjaKnC9dK3VFZF0L/tl0Xw1xi58Evw+BaYWkL1LoaORohCiUyKZMKBCSSmJdLSvSXvNn/X0CEJUarplGQPHjwYgLZt2/Lqq68ycOBAnJycCh1MnTp1ePDgQaHrEaK0UmsU/pcynStKVfjt+lPLW5ubUt7Wggp2/ybO6Um0JRUyba9ga0l5OwtsLUxRZZo9IyEuGpvrG9Nvm5XBWQcyerGr+4GlnWFjEaIQUtWpvBXwFnfj7lLFvgqfdfwMMxMZjilEUdLpP2zOnDm8+uqreHvrd3zm1KlTGTFiBNevX6dGjRp6rVuI0uCPixFcUapiSyItalbGxdFGmzCXt7WgvJ2F9nYFW0usLUwNHXLJlnnqPiFKKEVRmP/nfIIeBGFrbsvyzstxtNRtATkhRP7plGTfunWLnTt3MmnSJL0G4+bmRo8ePWjRogWTJk3C19c315UkZT5tUdZoNAqrjoYCMNrsV0YMXIqNnbxRFpnoO3D/HKACn2cNHY0QOvvhyg9svboVFSoWdlhIdaeCTUoghNCNTkn2d999R8WKFfUdC506dUKlUqEoCrNnz87ytfV/5TZ/dl42btzIkSNHCAoK4sKFC6SkpLBu3TqGDRuW7zqOHj3KTz/9REBAAMHBwcTHx+Pl5UWfPn2YNm2aXobNCJGT3/6+z82IRByIZ5jpH4YOp/TLmBu7SkuwczFsLELo6OT9kyz4cwEAk5pOooOHdFAJUVx0SrJr1KjB/fv39R0LM2fOzDOxLqzp06cTEhKCs7Mz7u7uhISEFLiOF198kYiICNq1a8eQIUNQqVQEBASwcOFCtm/fzrFjx3B1dS2C6EVZptEoLNt/DYDXzX7HQZVIgoFjKvVkqIgo4W7H3ObtQ2+jVtT0qtaL1+q9ZuiQhNALGzNrLtxK/2YXM2vDBpMHnZLs4cOHM2/ePO7evUvlypX1Fszs2bP1VldO1qxZQ82aNfH09GTBggVMmzatwHVMnjyZIUOG4O7urt2mKApvvvkmq1atYs6cOXzxxRf6DFsI/vgnjKsP4tLnqkZ6sYtc4mMIPpp+W5JsUQLFpcQx/sB4opOjaeDcgNlt8v52WAihfzol2f369WP//v20adOGKVOm0Lx5cypWrJjjP3DVqlXzXW9aWlqRLj7TtWvXQtcxderUbNtUKhUzZsxg1apVHDp0qNBtCJFZ5l7sV1tUwvGU9GEXuWt7QZMGLnWggoxfFSWLWqNm2pFp3Ii+gYu1C5/7fY6lqUyNK0Rx0ymjrVatmnbs9IQJE3Itp1KpSEtLy3e9lStXZtiwYQwfPhwfHx9dQjOYjLnBZYVKoW97LoZxOSwWO0szBreoBKcMHVEZIENFRAm24twKAu4EYGFiwVK/pbjayBBGIQxBp4wwYyyyvpmamrJo0SI+/fRT2rdvz4gRI3jxxRexsrLSe1v69s033wDQvXv3PMslJyeTnJysvR8TE1OkcYmSTVEUlu5Pnw97WBsvnMraiouGkJoE1/al367d07CxCFFAu27uYs2FNQDMaTuHBi4NDByREGWXTkm2v7+/nsNId+fOHX799VfWrl3L77//zpEjR5gwYQKvvvoqw4cPp1GjRkXSbmGdO3eOOXPm4OrqypQpU/IsO3/+fObMmVNMkYmSbu/FB1y6H4OthSnD23mDkmjokEq/W4chNR7sK4G7r6GjESLf/o74m1nHZgHwev3X6VWtl4EjEqJsM6ol3ExMTHj++efZuXMnt2/fZu7cubi4uLBixQqaNGlCixYtWL16NXFxcYYOVevWrVv06tULtVrN999/j7Ozc57lp02bRnR0tPbn9u3bxRSpKGnSe7HTx2IPbeNFOVsLA0dURmiHivQEE6M6RQqRq4cJD5l4YCLJ6mQ6enRkgm/uQzmFEMWjUO8gYWFhrFy5kgkTJjB8+HDt9ocPH/Lnn3+SmKh7r1vFihV57733uHLlCgcOHOCVV17hn3/+YcyYMbi7uzNy5EhOnz5dmPALLSQkBD8/Px4+fMi2bdvw8/N76jGWlpY4ODhk+REiJ/svhfPPvRhsLEwZ0b6aocMpGzRquPJb+m0Zjy1KiGR1MhMPTiQ8MZxqjtVY0H4Bpiay2qsQhqZzkr1y5Uq8vb0ZN24cK1asyDKEJDw8nNatW7Nx40Z9xIizszPlypXDysoKRVFISUlh7dq1tGzZkl69ehEeHq6XdgoiODiYTp06ce/ePbZs2UKvXvK1nNCfzL3YQ1p7UV56sYvHvTMQ/xAsHcGznaGjEeKpFEVhzrE5XIi4gIOFA8s7L8fOws7QYQkh0DHJ/uWXXxg3bhwNGjTg559/ZuzYsVn216tXj4YNG7Jjxw6dA4uPj2fNmjW0atWKRo0asXz5cqpVq8bXX39NZGQkJ06coH///vz222+MGTNG53Z0kZFg3717lx9++IE+ffoUa/sidwkpaXi9twuv93aRkJL/mW2MzcEr4Vy4G421uSkj23sbOpyy4+qTOch9uoOZfLARxs//H39+ufkLpipTPuv0GVUd8j9trhCiaOl04eOiRYuoWrUqBw8exNbWlqCgoGxlGjRowJEjRwpc94kTJ1izZg1btmwhLi4OOzs7Ro4cyejRo/H1/fcipBYtWrBlyxYGDx7Mzz//rMufkaeIiAgiIiJwdnbOMs76vwl2v3799N62KNsyzygyuLUnFexkfttic3V3+u9aMquIMH6H7xxmSdASAKY0n0Ir91YGjkgIkZlOSfa5c+cYPHgwtra2uZapXLkyDx48KFC9DRo04OLFiyiKQpMmTRg9ejSDBg3Ks5169eqxadOmfNW/Zs0ajh5NX8XtwoUL2m0BAQEA9O3bl759+wKwYsUK5syZw6xZs7KsRNmpUydCQkJo1aoV58+f5/z589naKeqVK0XpdujqQ/66HYWVuQkjZSx28Yq8CaYWUKPwC1cJUZRuRt1k6uGpKCi86PMiL9d+2dAhCSH+Q6ckW6PRaBdfyc3Dhw+xtCxYD1xwcDAjRoxg1KhRNG3aNF/HvPLKK7Ru3TpfZY8ePcq3336bZVtgYCCBgYEAeHl5aZPs3ISEhADpPe4nTpzIsYwk2UJXmcdiv9rSExd76cUudt4dwUouSBbGKzo5mvEHxhOXGkcT1ya83+J9WTJdCCOkU5Jdq1YtbY9wTtLS0jh06BANGhRsEvz79+9jZ1ewCzaqVKlClSpV8lXW398/33N8z549O8dkWVGUAkQnRMEcuRbB2dAoLM1MGNVRerENopTNKpKQlkhL7/RxuifTErGxyP2bQWH80jRq3jk6jdDYUCrZVmKJ3xLMTWWRKiGMkU4XPr7yyiucOXOGjz/+ONs+tVrNO++8w82bNxkyZEiB6s0twY6JiWHv3r0cPXpUklxRamXuxX6lpSeu9sa/0mnpo5Lx2MKoLf1rJSfun8DazJplnZdR3qq8oUMSQuRCpyR7/PjxdOzYkVmzZlGrVi22b98OwIABA6hZsybLli2jW7duWebOzo+1a9fSpUsXHj9+rN32119/UatWLXr06EHHjh3p2LFjoebfFsJYBV5/RFDIYyzMTBgjvdiGUbkJ2Fc0dBRC5GrL9R8BmN9uPrXK1zJwNEKIvOiUZJubm7N7927ee+89IiIi+Pvvv1EUhW3bthEZGcnUqVP5+eefCzxGbOPGjcTFxVGuXDnttrfeeouHDx/y2muv0bNnTwIDA1m1apUuYQthtNJ7sa8CMKhFVVwdpBfbIHyeMXQEQjzVm43fpItnF0OHIYR4Cp3GZANYWFgwd+5cPv74Y65cuUJkZCQODg7UqVMHU1PdVpq6evVqlkVdHj58SEBAACNHjuTLL78EoFWrVmzatIm33npL19CFMDrHbz7iVPBjLExNGNOxuqHDMSgbJenf23+uSJ/toyipk/+97dOjaNsSJVKyOpnrUde5GnmVK4+vcCnib+2+Ljt6oSrc4slPpaD5tz2PjoxuOLpI2xNC6IfOSXYGlUpF7dq19RELjx49wsXFRXs/Y57tF154QbutXbt2fPPNN3ppTwhjsXRf+ljs/7WogptjGe7FTkuGLYP/vX94YfG2X6FG8bYnjE5EYgRXIq9w5fEVLkde5mrkVYJjglEr6hzLx6XGF2t8M5pPlZlEhCghdEqy4+LiiIyMpFKlSpiZ/VvFDz/8wM8//4y1tTXjxo2jcePGBaq3QoUK3L9/X3v/wIEDmJqa0qZNG+02RVFITU3VJWwhjNKJm484eSsSC1MTxnYqw73YigI7x8Htk/9ua/wqmBa6LyBv6jQ4t7Fo2xBGJ1WTyq3oW1yJvMLVx1e1iXVkUmSO5Z0snahVrhY+5X3wtq3Eh6c+AWBrjw1YW5fL8Rh9SUx8zEt/pH/4tDazLtK2hBD6o9O719SpU/n222958OCBNsletWoV48aN087+8cMPP3D69Glq1cr/hRkNGzZk586dvPXWW1hZWbF582batGmTZdaR4OBg3N3ddQlbCKOU0Ys9oLkH7o5l+A00YD5c2AImZqBJS9/WcyEU9ZRzKfGSZJdy0cnR2iQ64/eNqBukarJ32KhQ4engSa3ytahVrha1ytfCp5wPFW0qanuQExIitEl2VXsPbGycs9WjTwlmMu2iECWRTkn2kSNH6Nq1a5aVGOfPn0/lypX57rvvCAsLY8iQISxatIg1a9bku94pU6bQtWtXGjZsqN02adIk7e3k5GQCAgLo3r27LmELYXT+vBXJ8ZuPMDdVMbZTGR6qcO47OJSetNBjAfz2jmHjESWSWlGn904/vqIdP30l8goPEnJefdjW3Da9d7qcjzaprlGuhvQWCyH0Qqck++7du3Tt+u+ywxcuXODOnTssXLiQdu3aAbBt2zYOHTpUoHr9/Pz4+eefWbduHZA+JWDmFRgDAwOpWrVqljHaQpRky57Mi/1SsypUdiqjb+y3DsPPE9Jvt3sLGg+SJLuUGHNwIiZFvFCKRv1vb3Tnn3qRpE7KsVxlu8ranumMYR+V7SpjoiraixaFEGWXTkl2YmIiFhb/XvF/9OhRVCpVlh7matWq8fPPPxe47ueee47nnst5xbXOnTtz9uzZggcshBEKConk6PUIzExUjC2rM4o8vAI/vAqaVKj3AnSeAWkyD35JpSgKay+u194/G3G+WNtPUidhZWpFDaca6cn0k4S6Zrma2FvYF2ssQgihU5Lt4eHB+fP/njx37dpFuXLlsiyj/ujRowIvkS5EWfL5k7HYLzb1oEp5GwNHYwBxD2HTS5AUDVVaQt9VYCK9iiWVRtGw6NQiNl76d3z7vNazsSzi5DY5JZb3j88G4IdnvqWWayNMTXSbRlYIIfRJpyT72Wef5YsvvuDdd9/FysqKP/74g8GDB2eZVujy5ctUrVpVb4EKUZqcCX3MkWvpvdhv+pXBsdipibD5fxAVAuW84X+bwbwMT11YwqVp0ph1bBY/38j67WUXj45Ff1FgQoT2tpdDVUmwhRBGQ6duo2nTplG1alU+++wz5s6di6urK3PmzNHuDw0NJTAwkA4dOugtUCFKk4wZRV5oUrns9WJrNPDjKLh7Gqyc4JVtYFvB0FEJHSWlJTE5YDI/3/gZU5Ups1pMM3RIQghhFHTqyXZzc+Off/5h//79AHTo0AEHBwft/tjYWD777DOeeUaWKBbiv87djuLQ1YeYmqgY51fT0OEUv32z4NLP6Ss5/u87cC6DPfmlRFxKHOMPjOf0g9NYmFjwWafPaFGhPnP+nG/o0IQQwuB0XuXB2to6yxLomdWrV4969erpHJQQpVnGjCL9fCtTtUIZ68U+/Q0cW5Z+u88X4NXWsPEInUUmRTJm7xguRV7C1tyW5Z2X09yteZbhG0IIUZYVeim1u3fv8tdffxEdHY2joyONGjWicuXK+ohNiFLn/J0oDlwOx0RF2RuLfW0f7HoyNZ/fB9BwgGHjETq7H3efUXtHERwTTHmr8qzquoq6FeoaOiwhhDAqOifZV65cYdy4cRw4cCDbvi5durB8+fICrfYoRFmQ0Yvdt3FlvJ3L0CpuYRdg61BQ1NBoEHR419ARCR3djL7JqD2jeJDwAHdbd77q9hXejt6GDksIIYyOTkn2pUuXaNeuHY8fP6Z+/fq0a9eOihUr8uDBAwIDA9m3bx9t2rTh6NGj1KlTp0B1p6WlsXz5cjZv3szly5dJSEggLS19ieVz587x9ddfM2nSJHx8fHQJXQiD+ftuNPsupfdij+tchnqxY+7DdwMhJQ682kPvpZBpJiJRcvzz6B/G7h3L4+THeDt683W3r3GzdTN0WEIIYZR0SrKnTp1KdHQ03377LYMHD862f/369bz++uu899577Ny5M9/1JiYm0r17d44dO4azszMODg7Ex8dr93t7e7Nu3TrKly/Pxx9/rEvoQhjM0ie92M83qkQ1lzIyh3xyHHw3AGLugrMPDNwAZhZPP04YnVNhpxh/YDzxqfHUq1CPVV1XUc6qnKHDEkIIo6XTFH6HDh3ihRdeyDHBBhgyZAh9+/YlICCgQPXOmzePwMBA5s+fT1hYGCNGjMiy39HRkY4dO7J7925dwhbCYP65F83eiw9QqWBc5zIyo4hGDdteh7DzYOMMg7aAtSRlJdHB0IOM2TuG+NR4Wri1YO0zayXBFkKIp9ApyVapVNSsmXeiUKtWrSyL0+THDz/8QKdOnZgyZQoqlSrH46tVq0ZoaGiB6hWiyKTEE2w1iGCrQZASn2uxjLHYvRtWooZrGejFVhT44z24thvMrGDQD1Bexu2WRD/f+JnJAZNJ0aTgV8WPlV1XYmtehq4nEEIIHemUZLdu3ZrTp0/nWebUqVO0bVuw6blCQ0Np3rx5nmUcHByIjo4uUL1CGNKl+zHs/ie9F3t8WRmLfWIV/Pk1oIIXvgaPZoaOSOhgw8UNfHD0A9SKmj7V+7C402IsTS0NHZYQQpQIOiXZn376KSdPnmT27NkkJiZm2ZeYmMjMmTM5deoUCxcuLFC99vb2PHz4MM8yN27cwMXFpcAxC2Eoyw+k92L3bOBOzYr2Bo6mGFzeBbvfT7/d7UOo28ew8YgCUxSF5WeXs/BU+jl8cN3BfNj2Q8xMCj3rqxBClBn5OmO+/vrr2bY1atSIjz76iBUrVuDr64urqyvh4eGcPXuWx48f0759exYvXszatWvzHUyrVq345ZdftHNu/9edO3f47bff6Nu3b77rFMKQroTF8tuFMAAmlIWx2HfPwPYRgAJNX4M24w0dkSggjaJh3sl5/HDlBwDG+45nZIORBR7+J4QQZV2+kmx/f/9c90VGRmqXV8/s8OHDHDlypEBJ9rvvvoufnx9du3Zl6dKl2qn7EhISOH78OOPHjyc1NZW33nor33UKYUjLtL3YbtRyK+W92FGh6VP1pSZAja7Q81OZqq+ESdWk8sHRD/j91u+oUPFByw8YWHugocMSQogSKV9J9q1bt4o6DgA6dOjAF198wYQJE2jfvr12u719enJiamrKypUradq0abHEI0RhXHsQy28X7gMwoUsp78VOioZNAyA+HCrWhxfXgakMLShJEtMSeTvgbY7cPYKZyoy57ebSs1pPQ4clhBAlVr7eBT09PYs6Dq0xY8bQsWNHvvzyS06ePElkZCQODg60bNmSN954g3r16hVbLEIUxrID11EU6FHPjdpuDoYOp+ioU2HLEHh4Cezd02cSsSrFf28pFJMSw/j94zkTfgYrUysWd1pMe4/2Tz9QCCFEroyyq6lOnTosXbrU0GEIobPr4XH8ev4eAOO7lOIZRRQFfp0MNwPA3DY9wXb0MHRUogAiEiMYs3cMVx5fwd7cni+6foGvq6+hwxJCiBJPp9lFMnz33Xd0794dV1dXLC0tcXFxoXv37nz33Xf6ik+UdCnxMNsx/SePeaT12V5+5q0uaisOXENRoFvditSrlP0i3lLj6GI4uwFUJvDSOnBvZOiIRAHcjbvL0N+HcuXxFSpYVWBdj3WSYAshhJ7o1JOt0WgYOHAgP/74I4qiYG1tTaVKlQgPD2ffvn3s37+f7du3s3XrVkxMCp7Hh4WFERQURFRUFGq1OscyQ4YM0SV0IYrczYdx/PxXei/2xNI8Fvvv7bD/w/Tbzy4En2f0Um1CWiItvasCcDItERuLol34pLS3l5sbUTcYtWcU4YnhVLarzNfdvqaqQ1WDxCJEaWdjZs2FW08W0jOzlvbKCJ2S7OXLl7N9+3Y6duzIggULaNmypXbfn3/+yXvvvceOHTtYvnw5EydOzHe9SUlJjBw5ks2bN6MoSo5lFEVBpVJJki2M1ooD19Eo0LWOK/Url9Je7NAT8NPY9Nut3oAWIw0bT0libpPz7WJs7/zD87yx/w2ik6Op4VSDL7t+SUXbikXWXpEq7vYM0aa0V7LbA7CwhdnFuJCetGcUdEqy/f39qVWrFnv37sXMLGsVLVq0YM+ePTRs2JB169YVKMmeOnUqmzZtwsfHh5dffhkPD49s9QthzG5FxLPj3F0AJnbxMXA0ReTRDdj8MqiTodZz0P1jQ0ckCuD4veNMPDiRxLREGjo3ZGXXlThaltIPg0IIYUA6ZbBXrlxh3LhxuSbAZmZm9OrVixUrVhSo3q1bt1K3bl2CgoKwtJSle0XJk9GL3bm2Kw08SmHikhAJm16CxEio5Av9V4OJqaGjEvl0IPQAM4/NJFWTSiv3Viz1W4pNcfXkCSFEGaPThY8WFhbEx+d9UVl8fDwWFhYFqjcqKooePXpIgi1KpNDIxEy92KVwLHZaMnz/CkTeAMcq8PIP6V/ZiRLjg8APSNWk0s2zG190+UISbCGEKEI6Jdm+vr5s2bKFe/fu5bj//v37bNmyhSZNmhSo3jp16vDgwQNdQhLC4L4OvINao9CplguNqjgZOhy9s9j9LoQeA0sHeGUr2OtpDK8oNhpFwws1X2BRh0VYmBasE0QIIUTB6JRkv/322zx69IhmzZrx2Wefcfr0aW7fvs3p06f59NNPadq0KZGRkQVe/nzq1Kns3LmT69ev6xKWEAZzW+PCzxfCgdK7uqPZpR1gYgYD1oNrHUOHI/Jp29Vt2tuD6wxmduvZmMoQHyGEKHI6jcnu1asXS5Ys4d1332XKlClZ9imKgpmZGZ9++im9evXKs57Dhw9nue/m5kaPHj1o0aIFkyZNwtfXF0fHnMe1dujQQZfQhSgSX6j7kKZRaF/TmSZVyxVLm5Ybnivy8dCWmv9ModlrCVT3K9I2hf78cuMXFp1epL0/znccKpXKgBEJIUTZofPUHRMnTuT5559n48aNnDt3jpiYGBwcHPD19WXQoEFUq1btqXV06tQpxxO+oijMnj07zzeD3ObPzsvGjRs5cuQIQUFBXLhwgZSUFNatW8ewYcMKVI9Go2HlypV8/fXXXLt2DTs7O/z8/Jg7dy41a5bOXkyRu9saZ7ap0z/0TepatM+/KjZMe9v0wYUibQsgcwqf2nIc5k1k6syS4mDoQWYEzjB0GEIIUWYVan48b29vZszQ/SQ+c+bMYu1VmT59OiEhITg7O+Pu7k5ISIhO9YwZM4bVq1dTt25dxo8fz4MHD/jhhx/Ys2cPx44do27dunqOXBizleo+pGFGa28nmnqWL9K2zM58o72d9II/VlZFe+FhUlI8Vj8OAyC1/RTMi7Q1oS8n75/knUPvoFbU9PTuyW+3fjN0SEIIUeYYdBLq2bNnF2t7a9asoWbNmnh6erJgwQKmTZtW4DoOHjzI6tWrad++PXv37tXOhDJkyBC6devG2LFjOXTokL5DF0bq2M0otqg7AfBG+ypF21hSDGZ/bdLe1VTrDHZFO02gJs74J/sXWZ1/eJ7xB8aTokmhc5XOfNDyg2JNsm3MbbgwtOi/ZTFUe4Zo0xB/oxCi8HS68LGoHD58mNDQ0DzL3LlzJ9tY7vzq2rUrnp6eOh2bYfXq1QB8/PHHWaYa7NKlC8888wyHDx/m6tWrhWpDlAzXw2OZvP0Sakx5weQITasW8bzYZ9ajSokt2jZEiXbt8TXG7htLYloiLd1bsrDjQsxMZEEvIYQwBKNKsv38/PD398+zzKZNm/DzM9yFVwEBAdja2tK2bdts+5555hmAPHuyk5OTiYmJyfIjSp7I+BRe9z9NbLKaZqorzDdfXbQNqlPhxKqibUOUaLdjbjNq7yhiUmJo6NyQZX7LsDSVNQeEEMJQjCrJVhTlqWU0Go3Bro6Pj4/n/v37eHt7Y2qafVaHjIser127lmsd8+fPx9HRUftTpUoRDzEQepecpmb0htOERibg4WTJVxaLsVSlFW2jf/8IMXdQbFyKth1RIj2If8DIvSOJSIygZrmarOy6UhaaEUIIAytx3yNeu3Yt12n9ilp0dPr41Nzad3BwyFIuJ9OmTcsyf3hMTIwk2iWIoihM236BU8GPsbc0Y+XAelT4toiHcCgKHFsOQGqTYVgcXfSUA0RZ8jjpMaP2juJu3F2q2Ffh625f42hpmHOkKB1K+5hzGeMuiovBk+zXX389y/0dO3YQHBycrZxardaOx+7Ro0cxRad/lpaWsmx8CfbFwev8ePYupiYqVr7ahBouxbBq3s2D8OACmNuS1miwJNlCKy4ljjH7xnAz+iauNq6s7r4aZ2tnQ4clhBACHZPsDz/8kE6dOuW5IExgYCD79+9n5syZedaVeQy2SqXi3LlznDt3LseyKpWK5s2bs2TJEl3CLrSMHuzceqozxlcbqqddFK1fz9/j0z3pF7XOeb4e7Wu6kFAcs28ELkv/3WQwWDsVfXuiREhKS2L8gfFcfHSRcpblWN1tNZXtKhs6LCGEEE/oNCZ79uzZBAQE5Fnm6NGjzJkz56l13bp1i1u3bnHz5k0URWHSpEnabZl/QkNDiYmJ4cSJE9SoUUOXsAvN1tYWd3d3bt26leNiOBljsWVBmtLnbOhj3t7yFwCvt/Xm1VaFm6Um38IupPdkq0yg1djiaVMYvVRNKm8fepvTD05jZ27Hl92+pJrT0xcAE0IIUXyKbLhISkoKJiZPz+EzT6m3bt06fH19Cz3NXlHq2LEj33//PYGBgdl68nfv3q0tI0qPO48TGLk+iOQ0DZ1ru/LBc3WKr/EnY7Gp2xfKeYHMW13mqTVqPjjyAYfvHMbS1JIVXVZQt4IsgCWEEMZG59lF8prhIyUlhSNHjlCxYsUC1Tl06FAaNmyoa0h6FRERweXLl4mIiMiyfdSoUUD66pEpKSna7fv372f37t106NABHx+fYo1VFJ245DRGfHuaiLhkarvZs+xlX0xNiml2m+g78Pf29NttxhdPm8KoKYrC3JNz+T34d8xUZizptISmFZsaOiwhhBA5yHdPdrVqWb+KXLJkCevWrctWTq1WExERQVJSEiNHjix8hHq0Zs0ajh49CsCFCxe02zKGvvTt25e+ffsCsGLFCubMmcOsWbOyrEzp5+fHiBEjWLNmDb6+vjz33HPaZdUdHBxYtUrmMi4t1BqFCZvPcjksFmc7S9YOa46dZTFeK3xiFWjSwKs9VG5SfO0Ko/X5mc/ZenUrKlTM7zCf9h7tDR2SEEKIXOQ7Y8g8P7VKpUJRlBzntTY3N6devXp07tyZGTNm6C9SPTh69Cjffvttlm2BgYEEBgYC4OXlpU2y8/LVV1/RsGFDvvrqK5YtW4adnR29e/dm7ty50otdiny86yIHLodjaWbCmqHNqOxkXXyNJ0ZBkH/67TYTiq9dYbTWXFjDN39/A8DM1jPp4VVyZ1kSQoiyIN9JduZp9UxMTJg8efJTZw4xNv7+/k9dUTLD7Nmzs/RgZ2ZiYsL48eMZP16+wi+tNpwIYV1gMABLBjamcRWn4g0gyB9S4sClDtTsVrxtC6Pzw+UfWHpmKQBvN32bF31eNHBEQgghnkan775v3bqFk5OTnkMRwjgcuvqQ2T//A8C7z9SiZwP34g0gLQVOfpl+u814MNAKp8I4/HrzV+aenAvAyAYjGVZ/mGEDEkIIkS86Jdm5zf5x69Yt9u3bh7W1Nf369cPW1rZQwQlR3K4+iGXcpjOoNQovNKnMG52qF38Qf2+D2Ptg5wYNpMeyLAu4HcD0o9NRUPhfrf8x3le+PRNCiJJCp9lFPvnkE2rWrMnjx4+12wICAmjQoAFjxoxh6NChNG3aNMt+IYzdo7hkXvc/RWxyGi28yjP/hQZ5zqJTJDItoU6rMWAmq4OWVX/e/5O3A95GrajpVa0X01pOK/7XoxBCCJ3p1JO9c+dOKleuTLly5bTb3n33XTQaDXPmzCEsLIyVK1eydOnSXMc15yUsLIygoCCioqJyXPQFYMiQIbqELkSOklLVjNoQxJ3HiXhWsOHLwU2xNDMt/kCu74Pwi2BhB01fK/72hVG48PAC4w+MJ0WTgl8VPz5q+xEmKp1nXBVCCGEAOiXZN2/epH///tr7t2/fJigoiLfffpvp06cDcOXKFbZv316gJDtj2r/NmzfnOHMJpM8Tq1KpJMkWeqMoClO3nyco5DEOVmasHdqc8rYWhgkmMP3iNpoMlSXUy6jrj68zdv9YEtISaOnWkkUdF2FmUoxTRwohhNALnc7cUVFRWS58PHr0KCqVit69e2u3NWnShC+//LJA9U6dOpVNmzbh4+PDyy+/jIeHB2Zm8uYiitay/dfZee4eZiYqVr3alBqudoYJ5N5ZCD4CKlNZQr2Muh17m1F7RxGdHE1D54Ys7bwUS1MZMiSEECWRThlsxYoVCQkJ0d7fu3cvlpaWtGzZUrstKSmpwOMHt27dSt26dQkKCsLSUt5YRNH7+a97LNl3FYCP+tanbQ1nwwWTMRa7fn9wqmK4OIRBhCeEM3LPSB7+v727jm/qeh84/kndS6ngtLi7u1Nkw53husGQDbYv2iLDBhsztuEMBozhG27FHYq7S5FSKrTUz++P/poRmpa2pE2A5/165UVy78l5noTbm5OTc895+ZSCWQoyp+Ec7C3l4nEhhHhXpauRXalSJTZs2MCmTZuwsbFh1apV1K1bV6dhfPPmTXLmzJmmeoODg+nSpYs0sEWmOHnnOSP+PgNA35r56Fw5r/GSeX4HLqxPuC9LqH9wgiOD6b+9Pw9ePCCPYx7mNpqLs7WzsdMSQgjxFtJ1Jc3o0aOJjY2lRYsWNG7cmMjISEaNGqXdHxYWxp49e3R6tlOjWLFiPH78OD0pCZEm94Ii6P/HCaJj42lYLBujmhUzbkJHfgUVB/nrQo7Sxs1FZKoX0S8YuHMgN0Ju4GHrwdxGc3G3czd2WkIIId5Sunqyy5cvz5EjR1i6dCkA7dq1o2rVqtr9Z86coVGjRnTp0iVN9X799df07duX69evU7BgwfSkJsQbhUXG0GfJcZ6FR1M8hxM/dCqLuZkRp0Z7+RxO/ZFwX5ZQ/6BExkby5d4vufDsAlmsszC38VxyO+Y2dlpCCCEMIN1XFZYpU4YyZcro3VezZk1q1qyZ5jqzZ89OkyZNqFy5MsOGDaNcuXI4O+v/ybR27dpprl+I2Lh4Bi8/zdXHL/BwtGZBz4rYWxv54trjCyAmHLKVhAL1jZuLyFRjDozhxOMT2Fva81vD3yiQxQiLHwkhhMgQb926ePHiBVevXiU8PJxatWq9VV1169ZFo9GglMLX1zfFCyeTmz9biJRM+vcie68+xcbSjAU9KpHD2da4CcVGwdHfE+7LEuofnAMPD2Btbs1P9X+ihFsJY6cjhBDCgNLdyL59+zZDhw5l8+bNxMfHo9FoiI2NBeDgwYP069ePOXPmULdu3VTXOX78eFnRTGSYJYdus+Rwwqw4szuWpVRuE7iw7OxfEP4EnHIlzCoiCI4K0d7/4cwcLCwy9otQbOzLzI0XH6u9b64x57u631Epe6UMjSmEECLzpauRfffuXapWrcqzZ89o2bIljx494vDhw9r9VapUITAwkBUrVqSpkZ2e1SGFSI09V54w4Z8LAHzVpAhNSuYwckZAfPwrS6h/CuaWxs3HBCilmHR8uvbx8qt/Z2r8zI7nW82X2rll6JsQQryP0tXI9vHx4fnz5+zdu5fq1aszYcIEnUa2hYUFtWrV4uDBgwZLVIj0uvIojM+XnyZeQfsKufm0jomMe722DQKvgrVTwgqPgq23t3Ig4L9zSfcinbGwzOCe5ZiX/HFlRebFi4/lj4sJF7o29mqcobGEEEIYT7oa2du2baN169ZUr1492TJ58+Zl9+7d6U5MCEN4GhZF78XHeREVS5V8WfmmdSnTGZKU2ItdoSfYOBk1FVPwPPI5045N09k2qHR/7OwydoGgiIhAbSM7U+LFRGgb2UIIId5f6WpkBwUF4eXl9cZyUVFRKe7Pnz8/Go2GnTt3ki9fPvLnz5+q+BqNhhs3bqSqrPhwRcbE0X/FCR4EvySfmz2/fVIBK4t0TQ1vePdPwp2DYGYpS6j/vxnHZxAUGUQBp3zcCL1l7HSEEEKIt5KuFke2bNm4fv16imXOnz9P3rwpr6AXHx9PfHy8zmOl1Btvrz5HCH2UgrH/XOP03WCcbS1Z0KMiLvZWxk7rP4d+SPi3VHtwStvKqO+jAw8O8O/NfzHTmDGm0khjpyOEEEK8tXT1ZDdq1IilS5dy/vx5SpYsmWT//v372bVrF8OGDUuxntu3b6f4WIj0+j62LZsvBmJhpuHXT8qT393B2Cn9J+gmXPon4X71wcbNxQSEx4Qz8fBEALoW60qJrEZefVMIIYQwgHT1ZI8dOxZbW1tq1qzJlClTtL3aW7ZsYdy4cTRp0gQ3NzdGjpQeKZH51sfV4Me4hOnwvmldkuoFMnaMbZodngMqHgo2hGwyN/KPp34kIDyAXA65GFxWvnQIIYR4P6SrJ9vLy4tt27bRqVMnxo4dq11A5qOPPkIpRd68eVm9ejU5cpjANGnig3LrWQRfxfQHoHe1XHSslPKQpUwX/gxOL0u4L0uo4//EnxWXEy469Knmg52lHRExEUbO6v1iZ2nHuR7njJ2GEEJ8cNK9GE2VKlW4du0a//zzD0ePHiUoKAgnJyeqVKlCy5YtsbIyofGv4oPxg98dorGkltlZvqhfw9jpJHV8PsS+hOylId+HPT9ydFw0Pod8UChaFWxFtZzVjJ2SEEIIYTBvtay6hYUFrVu3pnXr1obKR4h0O3MvmO2XnqEhnrEWyzDTfGbslHTFvIRjcxPu1xj6wS+hPvfsXG6G3MTVxpURFUcYOx0hhBDCoExkPjMh3t63264A0NrsAEXM7hs5Gz3OrICIQHDOA8VbGTsbo7r6/CoLzi0AYHSV0Thbm8AS90IIIYQBpamRrZRi7969rF69WmcKv+vXr9O3b1/Kly9P2bJlGTJkCI8fPzZ4skIk5+D1QA5cT5hNZLjFamOnk1R8HBz6OeF+1c/A/K1+RHqnxcXH4XPQh1gVS/089Wnk2cjYKQkhhBAGl+pP+vDwcLy9vbXLp2s0Gr799luaNWtGtWrVCA4O1pY9e/Ys//zzDydPniRr1qwGT1qIVymlmLH1MgAdK2Qnz7lAI2ekx5UtEHQDbJyhfHdjZ2NUyy4t4/yz8zhaOjKm6hjTWYFTCCGEMKBU92TPmjWLQ4cOUbZsWYYPH06ZMmUYO3Ys//vf/7CwsGDBggWcO3eOvXv30rZtW+7cucO0adPeXLF4r0VEx+q9b0jbLjzizP0Q7KzMGVAjT4bEeGuHfkz4t2IfsDahObsz2b2we/x8OqFH/8uKX+Jh52HkjIQQQoiMkeqe7DVr1pAvXz6OHDmCpaUlMTExFC9enI0bN7J8+XI6duyoLVuzZk1KlizJv//+y4wZM5Kt848//kh34t27f9i9gSJBbFy8dix2n5r5cHMwwVlt7h6Fe0fB3AqqDDB2NkajlGLi4YlExkVSOXtl2hRqY+yUhBBCiAyT6kb2jRs36NmzJ5aWlgBYWlri7e3Nr7/+SoMGDXTKajQa6tWrx8KFC1Oss2fPnjo/FSul3vjTcWIZaWQLgLWnH3DjaThZ7CzpVzs/xJrgHMuJvdilO4BjduPmYkTrr6/nSMARrM2t8anmI8NEhBBCvNdS3ciOiIjA3d1dZ5ubm5vOv69yd3cnKioqxToXLVqUZNvq1avZtGkTDRo0oFatWmTLlo3Hjx+zb98+du/ezUcffUTbtm1Tm7Z4j0XGxDF7x1UABtUtiJONJREvjJzU6wKvw+VNCfc/4MVnnkY85dsT3wIwuOxg8jqZ2CJBQgghhIGlaYqD13ue3rYnqkePHjqP169fz44dO9i+fTsNGzZMUn779u20aNGCvn37vlVc8X5YduQOD0MiyeFsQ7dqnsZOR7/DPwMKCjcB9yLGzsZoph6bSlh0GMVdi/NJ8U+MnY4QQgiR4UxqnuwpU6bQoUMHvQ1sgMaNG9O+fXsmT56cyZkJUxMWGcMcvxsADG1QCBtLcyNnpMeLp+C/POF+9c+Nm4sR7bqzix13dmChsWBi9YlYmH240xcKIYT4cKTp027ZsmUcOXJE+zhxruxmzZolKfvqPNqpdeHCBRo1SnnO3Dx58rB27do01y3eL/P33yIoPJr8bva0q5Db2Onod3wexEVBzvLgaYJLvGeCkKgQJh9N+FLcq2QvimT9cHvzhRBCfFjS1Mi+fv263sbz1q1b9ZZP63ASR0dH9u3bl2KZffv24ejomKZ6xfvl2Yso5u+/CcAI7yJYmJvUDzIJoiPg2LyE+zWGfLBLqH938jsCXwbi5eTFgDIf7swqQgghPjypbmTfunUrI/MAoFWrVsybN49PP/2UCRMm4OHx3xy6T548Yfz48Rw+fJj+/ftneC7CdP2y5wbh0XGUyuVM05ImOluH/5/wMgiyeELRjw1W7cvYl1TJl3DRoF/sS+zI2OXI3ybe0YCjrL2W8KvThOoTsDa3zpAchRBCCFOU6ka2p2fGX1g2depUDh06xO+//87ixYspWLAgHh4ePHnyhOvXrxMVFUXJkiWZOnVqhuciTNP95xEsO3IHgK+aFDHNaeDi4/7/gkeg2uAPcgn1l7Ev8T3kC0DHIh0pn628cRMSQgghMplJ/c7u4uLC0aNHGT9+PDlz5uTChQvs2bOHCxcukDNnTsaPH8+RI0fIkiVLumMcP36cZs2a4eLigr29PZUrV2b58uVpqiM4OJjx48dTunRpHB0dcXNzo1KlSvz8889ERkamO7f30cvYl5TKl5dS+fLyMvblW9c3e+c1ouPiqV7AlZoFk04daeh46XLpH3h+G2xdoFxX4+RgZHP853D/xX2y2WVjWPlhxk5HCCGEyHQm18Vma2uLr68vvr6+vHjxgpCQEJycnAwyDtvPzw9vb2+srKzo1KkTzs7OrF27lq5du3L79m1Gjx79xjqCg4OpUKECN2/epGbNmgwYMICoqCi2bNnC559/zrp169ixYwdmZib1/eW9cO1xGGtP3QdgpLeJ9mIr9d/iM5X6gZW9cfMxgvOB5/njYsJqruOrjcfB6sNdRl4IIcSHy+Qa2a9ycHDAwcEwH9CxsbH07dsXjUbDvn37KFeuHAA+Pj5Uq1YNHx8f2rdvT6FChVKsZ+7cudy8eZPhw4fz3XffabdHR0dTs2ZNdu/ezYEDB6hdu7ZB8hb/mbn9CvEKvEtko1xeF2Ono9+dQ/DgJJhbQ+V+xs4m08XEx+BzyId4FU+zfM2onVv+DoQQQnyYTLK79fTp03z11Ve0aNFCZ87sO3fusGrVKoKCgtJc5+7du7lx4wZdunTRNrAhYUaTcePGERsbq3cFytfdvJkwq8Xr0xZaWVlppx988uRJmvMTKTt99znbLjzGTAMjGpvwNHCHfkr4t2xncPBIuex7aNH5RVx9fpUs1ln4uvLXxk5HCCGEMBqT68n+6quvmDVrFkopQHcaQKUUXbp0YdasWQwdOjRN9fr5+QEJC9q8LnHb3r1731hPiRIlgIRpC1/9AhATE8POnTuxtbWlWrVqacpNpEwpxYytVwBoUz43hbKZzhSOr86+sf/JeeyubgE0CRc8fmBuhtzktzO/AfB15a/JapPVyBkJIYQQxmNSPdmLFi1i5syZfPTRR5w9e5ZRo0bp7Pfy8qJy5cps3LgxzXVfu3YNQO9wEBcXF9zc3LRlUtK3b18qVarErFmzqFu3LiNHjmTIkCGUKFGCmzdvsnz5cnLlypXs86OioggNDdW5iZQduB7I4ZvPsDI3Y1jDlIfzGJPNyYUJd4o0AzfTzTMjxKt4fA/5EhMfQ61ctWier7mxUxJCCCGMyqR6sufMmUOxYsVYs2YNFhYWWFlZJSlTtGhRdu7cmea6Q0JCAHB21j/Pr5OTE/fv339jPba2tvj5+TFgwACWLVum7f02MzNj8ODB1KxZM8XnT506lQkTJqQx+w9XfPx/vdifVPUkt4udkTPSzzU2DuvLGxIe1Bhi3GSM4K8rf3H6yWnsLOwYV3WcaV6UKoQQQmQik+rJvnjxIo0aNcLCIvm2f7Zs2Yw65jkwMJBGjRpx5MgRNm3aRHBwMI8ePeK3335j0aJFVKlShefPnyf7/FGjRhESEqK93bt3LxOzf/dsOf+Icw9CsLcyZ1C9AsZOJ1ldQsPQxMVA7sqQt6qx08lUAS8CmH1yNgDDKgwjh0MO4yYkhBBCmACT6sm2sLAgOjo6xTIPHz5M14wjiT3YiT3arwsNDU22l/tVX3zxBYcOHeLMmTOULl1aW3e/fv2Ii4vj008/Zfbs2cn2VltbW2NtLSvfpUZsXDyztif0YvetlR9XB9N832zj4+kY9iLhQfXPjZtMJlNKMfHIRCJiIyjnUY6ORToaOyUhhBDCJJhUT3apUqXYs2cP8fHxevdHRESwc+dOKlSokOa6E8di6xt3/fz5cwIDA984fR/Apk2byJo1q7aB/ar69esDcPLkyTTnJ5JaffI+NwPDyWpvRd9a+YydTrLahL3AOT6euCyeUPTDGou86dYmDjw4gKWZJb7VfTHTmNQpRQghhDAak/pE7N27N1euXOHTTz9N0qMdGhpKz549efToEf36pX3+4Tp16gCwffv2JPsStyWWSUl0dDShoaF6e9yfPn0KID3VBhAZE8fsnQlfiAbVK4ijjaWRM/p/sdHw+AKc+Qu2j8VxbR+GPE/4deRl+V5gZm7kBDNPUGQQ049NB2BgmYHkd85v5IyEEEII02FSw0V69+7Nrl27mDdvHitWrNAun165cmUuXbpEeHg4PXv2pF27dmmuu0GDBuTPn5/ly5czZMgQypYtC0BYWBiTJk3CwsKCnj17assHBgYSGBiIm5sbbm7/Ld9do0YNtm3bxqRJk5g0aZJ2e1RUlPZxvXr10v7ihY4/Dt/mUWgkOZ1t6Folr3GSCA+ER+fg8fmEhvWj8/D0MsTHaItY/f/tvoU5tsVb8yGtbTj92HSCo4Ip7FKYXiV7GTsdIYQQwqSYVCMb4M8//6Ru3br8/PPPnD9/HqUUJ06coFixYgwZMoQBAwakq14LCwvmz5+Pt7c3tWrVonPnzjg5ObF27Vpu3brF5MmTKVy4sLb8zz//zIQJE/Dx8cHX11e7fdq0aRw6dIjJkyezfft2atSoQWRkJNu2bePmzZtUqFCBvn37vu3b8EELjYxhjt8NAIY1KoyNZQb3DsfFQOC1/29Mn09oTD8+Dy8e6y9v7QTZSkC2krxwykP/i79wxcqK7RY2GZunCdl3fx+bb23GTGPGxOoTsTQzkV8ahBBCCBNhco1sgH79+tGvXz9evnzJ8+fPcXJyMsjy6vXq1ePAgQP4+PiwatUqoqOjKVGiBJMmTaJr166pqqNs2bKcPHmSqVOnsmvXLn7++WcsLCwoWLAgEyZMYMSIEdjYfDiNrYwwb99NgiNiKOjhQJtyyc85ni7hz+Dxuf96ph+fg6dXIE7fBbcayJoPspVMuGX//3+z5IX/n6IuKvgR527ON2yOJu5F9AsmHp4IQPfi3SnhVsLIGQkhhBCmx6Qa2fv27cPLy4u8eROGB9ja2mJra6tT5v79+9y8eZPatWunK0blypXZsmXLG8v5+vrq9GC/qlChQixcuDBd8UXKnoZFseDALQBGNC6MhXn6LhswVwrzZ9fg3gHdIR9hAfqfYOX4/73TJf6/MV0KPIqB9Yc0ACR1Zp+azeOIx+RxzMNnZT8zeP12Fracu3U34YGFbcqF38V4lnac63Euw+MIIYQwLpNqZNerVw8fHx/Gjx+fbJk///yT0aNHExcXl4mZifQye36bZQ8f4Rgfj/OSpmD+hkMuLIqNxGBtb0ZuPzvwS1s857hYNr54SM7YWKxvf6S/kEu+/29Ml/r/XuoSkMUTzEzqOmCTdOrxKf668hcAPtV8sM2ERqkQQgjxLjKpRrZS6o1l4uPjZTW5d4j9/hmUifr/oRjPb76xvDvgbgbEAYFpj2cBJE72pyzt0Lw6zCNbSchWHKwd016xICouGp9DPgC0KdSGKjmqGDkjIYQQwnSZVCM7Na5du5aqRWOECXhwCqubu4gDvvRwY0Lt73F2yJps8V92X2fftUBK5XZmbPNi6QoZ8iKIYQe+5JGFOcva7sbVJWc6kxevW3plGbdDb+Nu686XFb80djpCCCGESTN6I7t37946j9evX8/t27eTlIuLi+P+/fvs27ePJk2aZFJ24q3s+QaAfx3s2WVvx7jclSFLdr1FrzwKY+a1EJRyZ3SLGpAnS7pCxgY/4oTt/194KgujGNSK66sAGFNlDE5WTkbORgghhDBtRm9kL168WHtfo9Hg7++Pv7+/3rIajYZKlSrx/fffZ05yIv3uHIbrO1Eac37L8uYG2bfbrqAUNCuVnTLpbGALw7O1+u8UEafiaOTZiAaeDYyYkRBCCPFuMHoj+9athJkklFLkz5+fYcOGMXTo0CTlzM3NcXFxwd7ePrNTFOnx/73YUSXacj/8SIpFT94JYuelx5hp4ItGRTIju3fW85j/Bqq3394ZTQb31isVr73vaOnA6CqjMzSeEEII8b4weiPb09NTe3/RokWUK1dOZ5t4B93cC7f3g7kVLyt/CnuSb2QrpZi+9QoA7SvkoaCHTJmnT3hMOPPPzeePC0u0256+TMeVoW/hi7KDcbN1e3NBIYQQQhi/kf2qHj16GDsF8baUgt2TE+5X6EW8U8oXHu69+pRjt4KwsjBjaMNCmZDguyUuPo7119fz0+mfeBb5TGffHw3nYmOTJUPjR0YG031nfwCaeXlnaCwhhBDifWJSjexEkZGRHD9+nIcPHxIVFaW3TPfu3TM5K5Eq13bA/WNgYQO1vkiYii8Z8fGKGf/fi929qic5s8icy686FnCMGcdncOV5wnvk6eTJ4FL9GHlwLABFXAphZ5exPcsREZnbWy6EEEK8L0yukf3LL78wbtw4QkJC9O5XSqHRaKSRbYqUgj3/34tduR84ZofgR8kW//dcABcDQnGwtuCzegUzKUnTdzf0LrNOzGL3vd0AOFo58mmZT+lUpBMxUfr/LoQQQghhWkyqkb127Vo+//xzSpUqxbhx4/jyyy9p1aoVVapUYd++fWzZsoW2bdvy0UfJrOQnjOvyvxBwBqwcoMawFIvGxMXz3faEHtr+tfOT1d4qExI0baHRocw9M5c/L/9JbHws5hpzOhTpwKdlPsXFxgWAGCPnKIQQQojUMamJhGfPno2HhweHDx9m+PDhAJQtW5avv/6aTZs2sWzZMtavXy8XRpqi+DjYnTCjCFU/BfuUhzGsOnGP288icLW3ok/NfCmWfd/Fxsey8vJKPlr7EUsuLiE2PpaauWqypsUaRlcZrW1gCyGEEOLdYVI92WfPnqVDhw7Y2dlpt8XF/Teot0uXLvzxxx9MnDiRunXrGiFDkawL6+DpJbB2hmqDUiz6MjqOH3ZeA2Bw/YLYW5vUYZipDj44yLfHv+VGyA0A8jvnZ2SlkdTMVdPImQnxfomJidH5PBFCCHNzcywtLTOsfpNq3cTExODu7q59bGtrS3BwsE6Z0qVLM3fu3EzOTKQoLhb8pibcr/452Kbc87rk8G2ehEWRK4stXarkzYQETc/N4Jt8e+JbDjw4AEAW6yx8VvYz2hduj4WZSf1ZCvFOCw0NJTAwMNmL6IUQHzZra2vc3NxwcjL8SsYm9WmeM2dOAgICtI89PT05ffq0Tpk7d+5gYWFSaYuzf8Gz62CbFaoOTLFoSEQMc/ZcB+CLRoWxtjDPjAxNRnBkMHPOzGHVlVXEqTgszCzoUrQL/Uv3x9na2djpCfFeCQ0N5cGDBzg4OODm5oalpSUajcbYaQkhTIBSipiYGEJCQnjw4AGAwRvaJtVarVSpEqdOndI+btKkCT/88APTpk3j448/5sCBA6xdu5aGDRsaMUuhIzYa9k5LuF9zOFg7plj89303CI2MpXA2B1qVy5UJCZqGmLgYVl5Zya9nfiUsOgyAennq8WXFL/F0kmsMhMgIgYGBODg4kDt3bmlcCyGSsLW1xdHRkfv37xMYGGjwRrZJXfjYvn17oqKiuH37NgCjRo0id+7cjBkzhtKlS/Ppp5/i4ODAjBkzjJuo+M/ppRB8FxyyQaW+KRZ9+iKGhQdvATCicRHMzd7/Dz2lFH73/Gi9sTUzjs8gLDqMwi6Fmd94Pj/W/1Ea2EJkkJiYGKKionB2dpYGthAiWRqNBmdnZ6KiooiJMewcXibVk926dWtat26tfezu7o6/vz/z58/n5s2beHp60q1bN3Ll+nB6QE1aTCTsm5lwv9aXYGWXYvEFhwKIjImnXN4sNCqeLRMSNK4rQVf49sS3HA04CkBWm6wMKTeEVgVbYW72YQ2TESKzJV7kmJEXNQkh3g+J54m4uDiDnjNMqpGtj4uLCyNHjjR2GkKfk4sg7CE45YYKPVMsGh+dlbVXngLwlXfR97pn6dnLZ/zs/zNrr60lXsVjZWZFt+Ld6FuqLw5WDsZOT4gPyvt8rhFCGEZGnSdMvpEtTFR0OOyflXC/zkiwsE6xeNTTRsTFQ+3C7lQr4JoJCWa+6LhoFp5fyNyzcwmPCQegsWdjhlcYTm7H3EbOTgiRESKiYyk+fhsAFyd6Y2clH6tCiAQmdTaYOHFiqsppNBrGjRuXwdmIFB2bC+FPwcULynZNsWhcZA5iQ8sA8JV3kUxIzjh67O5DQETCMvLFXYvzVaWvqJCtgpGzEkIIIYQxmFQj29fXN8X9Go0GpZQ0so0tMhQO/pBwv87/wDzl8UtRTxsDZjQq6kLJXO/PNHVKKY4/OaF9HBDxCA9bD4ZWGMpH+T/CTGNS1xULIYQQIhOZVCN7z549ereHhIRw6tQpfvzxRxo2bMigQSmvKCgy2JFf4eVzcCsMpTukWPTQzRDiXhQD4vi0ds7MyS+DKaXYe38vc8/O5VzgOe32HkU+4bMKn2NnmfIFoEIIkRlu375Nvnz5UixTpkwZ/P39gYSOLE9PT+0MX/roK+Pr68uECRN0ypmZmeHi4kL58uUZNGgQLVu21FtfSEgIP/74Ixs3buTatWtERkaSI0cOateuzdChQylfvnyqXqsQpsikGtl16tRJdl+LFi3o2rUr5cuXp23btpmYldAREQSHf064X3cUpDBLxvUnYYzakDBln6XLMTyzVs6MDDNMvIpn552dzD07lyvPrwBgbW5NVFzCSnK9ivaQBrYQwuQUKFCATz75RO++7NmzGyxO27ZtKVmyJADR0dHcuHGDjRs3smPHDn755Rc+++wznfLHjx+nRYsWPHr0iJIlS9K9e3fs7Oy4dOkSK1euZOnSpfj4+ODj42OwHIXITCbVyH6TQoUK0bp1a6ZNm0bHjh2Nnc6H6dBPEBUK2UpC8VbJFgt8EUWvxcd5ERWHme1trD02AYMzLU1Dio2PZevtrcw7O4+bITcBsLOwo1PRTnycuwmtt6bcmy+EEMZUsGDBNw7HNIR27drRqVMnnW3Hjh2jSpUqTJ8+XaeRfe/ePZo0aUJwcDC//vorAwfqrhZ85coVmjdvjq+vL+7u7kka6EK8C96pRjaAh4cHV65cMXYaH6YXT+Ho7wn3640GM/1jjiNj4uj3xwnuBb0kVxYrgt2XojGLzcREDSMmLoZ/b/7L/HPzuRt2FwBHS0e6Fu/KJ8U+wdnamWfBj4ycpRBCmK7KlSuTNWtWnj59qrN99OjRBAUFMWbMmCQNbIAiRYqwYcMGypUrx6hRo+jatSvOzu/PNT3iw/BOXZkVFRXF1q1byZIli7FTeSc9C35EqSWlKLWkVPoahwdnQ0w45CwHRZrpLRIfr/jy7zOcvhuMk40FP7QvhJlF+Nslnsmi4qJYeXklzdc1Z/yh8dwNu0sW6ywMKTeEbe22MajsIJyt5WQvhBBvcvLkSYKCgnTGVoeHh/PXX39hY2PDiBEjkn1uiRIlaNOmDaGhofz999+Zka4QBmVSPdl//PGH3u2xsbE8ePCAlStXcvnyZT7//PNMzkwQ+hCOz0+4X38sJDNx+8ztV9h0NgBLcw2/d6tIPlfDLlGakV7GvuTvK3+z+MJinr5M6HVxs3WjZ4metC/cXsZbC/GeUErxMibOIHVFRMfqvW8ItpbmBlkk4/r168kOF6latSpNmjR56xgAq1ev5vLly0DCmOxbt26xceNG8ufPzy+//KItd+LECWJiYqhcufIbO80aNGjAX3/9xeHDh+nbt69B8hQis5hUI7tnz556TyhKKSDhquaOHTsybdq0zE5N7J8FsZGQpyoUaKC3yKoT95jjdwOAqW1KU62A6zsxnOJF9AtWXlnJ0otLCYoMAiC7fXZ6l+xN64KtsbGwMXKGQghDehkTp11AxpAqTt5l0PoMtbjNjRs3ksz+kWjo0KEGa2SvWbOGNWvW6Gyzt7ene/fuFC1aVLvt0aOEz4U8efK8sc7EMgEBAQbJUYjMZFKN7EWLFund/upUQDlzvh/TwL1Tgu/CySUJ95PpxT50PZDRaxOmsxtcryDtKpj+CochUSEsv7ScZZeWERodCkBuh9z0LdWXFgVaYPmG+b+FEOJd4O3tzdatWzM8zooVK7QXPsbExHD37l1++OEHfH19OXbsGJs2bUpzna92sgnxrjGpRnaPHj2MnYLQZ+8MiI+BfHUgX60ku68/CWPAspPExis+LpOTLxoVNkKSqRcUGcTSi0tZcXmFdvlzLycv+pfuT9N8TbEwM6k/Cx12Fracu5VwESYWtu9dPCEyg62lORcnehukrojoWG0P9omxDQy6rLqtZfJTpGYEjUZDfHx8svsT95klc9H7qywtLSlQoAA//vgj/v7+bN68mX379lG7dm3ttIH37t17Yz33798HDDvVoBCZxXRbE8I0PLsB/ssT7tcfm2R34lR9YZGxVPB04dt2pTEzM80eh6cRT1l8YTF/X/2bl7EvASjkUoj+pfvTKG8jzFOY81sI8f7QaDQGbQwnsrOyyJB6M4uzszNBQUHalZVfFxgYqC2XFpUrV2b//v2cOnWK2rVrU7FiRSwtLTl58iQhISEp1rdrV8IXmGrVqqUpphCmwKhng7t376b7uXnz5jVgJiJZftNAxUEhb8iju5jMq1P15c1qx9xuFbDJ5J6X1Ah4EcDC8wtZe20t0fHRAJRwLUH/0v2pm6euLH8uhBBAqVKl2L9/P+fOnaN06dJJ9h8+fBhA776UBAUlXOuS2BNub29P+/btWb58ObNmzWLixIl6n3fp0iXWrVuHo6Mj7dq1S1NMIUyBURvZXl5e6RpnpdFoiI199+Zdfuc8uQzn/n/apHqjdXa9PlXfwp6VcHWwNkKSyXsQ/pCfLv7GhhsbiI1POF7KupdlQJkB1MhZQ8b4CSHEK3r06MH+/fv56quv2LBhA9bW/53Tg4ODtSsvdu/ePdV13r17l3Xr1gFQq9Z/ww2nTJnCli1bmDJlCnnz5k0yc8i1a9do2bIl0dHRfP/99zJ1r3gnGbWR3b17d2nomDK/KYCCYh9DzrI6u2bt0J2qr6CHwxurux5yg8D4kIzJ9f8FhwVq73fb1Yt4ldBzUiV7FfqX7k+l7JXkmBNCfFBSmsIP0O7r1asXmzZtYt26dRQuXJhmzZrh6urKo0eP2LBhA4GBgQwdOpQGDfTPMPXqFH6xsbHcuXOH9evX8+LFC/r06UOlSpW0ZT09Pdm8eTMtW7akX79+/PTTT9StW1e7rPqWLVuIiYnB19dXVnsU7yyjNrIXL15szPAiJQFn4OIGQAN1dXuxV524xy97dKfq0yciJoIZp2dpH/f1S7qqV0aKV/HUzFWTAaUHUNajbKbGFkIIU5HSFH7wXyPbzMyM1atXs2jRIv744w9WrlzJixcvyJIlCxUqVKB///60adMm2XpencJPo9Hg5OREuXLl6N27t96JDapWrcrly5f58ccf2bhxI4sXLyYyMpLs2bPTqVMnhgwZQoUKFd7uxQthRO/uFRoiY+2ZkvBvqXaQrbh2c2qn6jsfeJ6v932tXY4cwNU6K2YZfHFhfHwcz6ISxv/9XucXqnvVztB4Qghhqry8vLRT4KWWmZkZffr0oU+fPql+jq+vb4o95SlxcXHBx8dHOxRFiPfJB9fIPn78OD4+Phw+fJjo6GhKlCjBsGHD6NKlS5rqCQsLY+bMmaxZs4abN29iZWVF/vz5admy5bt/srh/Aq5uBY0Z1PmfdnNqpuqLi49j0YVF/HL6F2JVLO427jyNTFg9cU2Tv3DNkrHTMD0LfkTdDY0AKJLFtKcSFEIIIcT7y+Qa2XFxcaxatYqdO3fy8OFDoqKikpTRaDTaaX3Sws/PD29vb6ysrOjUqRPOzs6sXbuWrl27cvv2bUaPHv3mSki4kKN+/frcvHmThg0b0rx5c6Kiorh+/Tpr1qx59xvZuycn/FumC7gVBFI3Vd+j8EeM2j+KE49PANDYszGfFx/Ix1uS/3lRCCGEEOJ9ZFKN7PDwcBo3bsyRI0e083S++lNX4uP0XLgWGxtL37590Wg07Nu3j3LlygHg4+NDtWrV8PHxoX379hQqVCjFeuLi4mjXrh0PHz5k165d1KtXL0mcd9rtA3BzD5hZQp2vgISp+vq/Yaq+rbe3MvHwRMKiw7C1sGV0ldG0LNCSoJDHxngVQgiRKeysLLg9rbmx0xBCmCCTmiB48uTJHD58mAkTJhAYGIhSCl9fXwICAvjrr7/Ily8f7dq109u7/Sa7d+/mxo0bdOnSRdvABnB0dGTcuHHExsYmu6z7q1avXs3x48cZMWJEkgY2gIWFSX1vSRulYPc3CffLdwcXT+1UfaeSmaovPCacsQfGMnLvSMKiwyjlVorVH6+mVcFWMouHEEIIIT5YJtUiXLt2LVWrVmXsWN2VBbNly0b79u2pVq0aZcqU4dtvv2XUqFFpqtvPzw+Axo0bJ9mXuG3v3r1vrOevv/4CoH379ty7d49NmzYRHBxMgQIFaNq0KQ4Ob57KzmTd3AN3D4G5NdQeAaQ8Vd/Zp2f53/7/cS/sHho09C3Vl0/LfoqlmaWxXoEQQgghhEkwqUb23bt3ad78v5/dzMzMdHqtc+fOTfPmzVmyZEmaG9nXrl0D0DscxMXFBTc3N22ZlJw4kTDe+MCBAwwfPlwnP3d3d1atWkXdunWTfX5UVJTOc0JDQ1P7EjKWUv+Nxa7UB5xyJjtVX1x8HAvOL2CO/xziVBzZ7bMzteZUKmavaKzshRBCCCFMikkNF7G3t8fM7L+UnJ2dCQgI0CmTPXv2dC3HHhISoq1THycnJ22ZlDx58gSAzz//nGHDhnHv3j2ePn3Kjz/+SEhICK1atUqS86umTp2Ks7Oz9pYnT540v5YMcXUrPDgJlnZQc7jOVH2f1/9vqr6AFwH03tabn07/RJyKw9vLm9Ufr5YGthBCCCHEK0yqke3p6anTgC5ZsiS7d+/W9vwqpdi1axc5cuQwVorExyesIPjRRx8xbdo0cufOjZubG59//jnDhw8nJCSEBQsWJPv8UaNGERISor3du3cvs1JPXnz8f2OxqwzgeoQtA/VM1bf11lbabmzLqSensLOwY3KNyXxb+1ucrfV/cRFCCCGE+FCZVCO7QYMG7NmzRztDR48ePbh79y7VqlVj5MiR1KxZE39/f9q2bZvmuhN7sJPrrQ4NDU22l1tfPS1atEiy7+OPPwb+G1Kij7W1NU5OTjo3o7u0ER6fAytHnpUZQK/Fxwl9Zaq+iNgIxhwYw8h9IwmLCaO0W2lWf7yalgVbysWNQgghhBB6mNSY7H79+uHq6srTp0/JkSMHvXv35vTp08yZMwd/f38A2rZtm66VpRLHYl+7di3JMq3Pnz8nMDCQ6tWrv7GeIkWKEBgYSJYsWZLsS9z28uXLNOdnNPFx2tUdY6t8Sr+/b+pM1Xcl+Dz/2/c/7r+4j5nGjH6l+jGgzAC5uFEIIYQQIgUm1ZNdqFAhvv76a53hID/99BOPHj3i8OHDPHz4kL///hs7O7s0112nTh0Atm/fnmRf4rbEMimpX78+ABcvXkyyL3Gbl5dXmvMzmnOrIfAKyiYLXz+spZ2qb16P8vx9YxE9tvTg/ov75LDPwULvhQwuN1ga2K+wtbLQe18IIYQQHzaTamQnx93dnSpVqpA9e/qX5G7QoAH58+dn+fLl2l5xSFgefdKkSVhYWNCzZ0/t9sDAQC5fvkxgYKBOPb169cLa2pqffvqJBw8e6NQzZUpCj3CHDh3SnWemiosBv6kA7PPowpoLYViaa/imfS6mnBrCL/6/EKfiaJqvKatbrKZCtgpvqND4pNErhMhU0eHg65xwiw43djZCCBNiUo3swoULM2nSJG7evGnwui0sLJg/fz7x8fHUqlWL/v37M2LECMqUKcOFCxfw9fWlcOHC2vI///wzxYoV4+eff9apJ1++fHz77bc8efKEMmXK0K9fPwYPHkzp0qXx9/enf//+NGjQwOD5Z4gzK+D5LSKtsvLp1YTZQbrUD2LKmX6cenIKe0t7ptScwvRa03GyMoGx40IIIYQQ7wiTamQ/fvwYHx8fChUqRM2aNfn99995/vy5weqvV68eBw4coGbNmqxatYo5c+bg6urKsmXLGDNmTKrr+fzzz9m4cSPFixdn5cqVLFiwAFdXV+bOncvvv/9usHwzVGw07J0BwKyI5kSYQZnym1l7fzovYl5Qxr0Mf3/8Nx8X+FgubhRCCCGESCOTamQ/efKEFStW0KxZM44fP85nn31Gjhw5aNu2LevWrSMmJuatY1SuXJktW7YQHBxMREQEx48fp2vXrknK+fr6apd11+fjjz9m3759hIWF8fLlS06cOEG/fv3eOr/MYn3hbwi5x2NcWGpZCPciv3Dz5T7MNGYMLDOQxU0Wk8fRRObwFkIIkWa3b99Go9GkeCtbtqy2vEajeeM1RfrK+Pr6JqnX3NwcNzc3GjduzIYNG5KtLyQkhEmTJlGpUiWyZMmCjY0N+fLlo0ePHpw6dSpdr7tnz55oNBqOHDnyxrJeXl7Y2Ni8sdyr72WuXLmIi4vTW+7cuXPackWLFk1z7uL9YlKDVq2trenYsSMdO3bk2bNnrFixgmXLlrFu3TrWr19PlixZ6NChA127dqVmzZrGTvedZR0fj83RX4kFBjuWxtJ1IZHEk9M+J9NqT6OcRzljpyiEEMJAChQowCeffKJ339tc6/S6tm3bUrJkSQCio6O5ceMGGzduZMeOHfzyyy989tlnOuWPHz9OixYtePToESVLlqR79+7Y2dlx6dIlVq5cydKlS/Hx8cHHx8dgOb4tCwsLHj58yLZt22jWrFmS/QsWLMDCwkI7FbH4sJlUI/tVrq6uDB48mMGDB3P9+nWWLVvG8uXL+f3335k3b54cwG+hQ2gEj6ND+CJHLi7b3AKgWb5mjK06FkcrRyNnJ4QQwpAKFiyYrqlv06pdu3Z06tRJZ9uxY8eoUqUK06dP12lk37t3jyZNmhAcHMyvv/7KwIEDdZ535coVmjdvjq+vL+7u7kka6MZSvXp1zpw5w8KFC5M0sqOjo/nzzz9p1qwZGzduNFKGwpSY1HCR5BQsWJD69etTp04dLC0tUUoZO6V3lk2cwjM6nna5cnDRxhxbczum1prK9NrTpYEthBDCoCpXrkzWrFl5+vSpzvbRo0cTFBTEqFGjkjSwIWFNig0bNmBpaaldKdkU2Nra0rFjR/75558ks49t3LiRwMBAevXqZaTshKkx6Ub2hQsXGD16NF5eXtSrV48FCxbg5eWVKd/I31d5Im2Z7OHECzMzCjiWYG3LNXyU/yNjp/XOsrOw5dytu5y7dRc7C1tjpyOEECbl5MmTBAUFUb58ee228PBw/vrrL2xsbBgxYkSyzy1RogRt2rQhNDSUv//+OzPSTZXevXtre61ftXDhQjw8PPjoI/lMFQlMbrhIQEAAy5cvZ9myZZw9exalFG5ubnz66ad069aNKlWqGDvFd5ZSijwx8dxQiiZW5fmm1UIszEzuEBBCiIylFMREGKau6Aj99w3B0g4MMLvT9evXk+2cqlq1Kk2aNHnrGACrV6/m8uXLQMLQiVu3brFx40by58/PL7/8oi134sQJYmJiqFy5st7Vk1/VoEED/vrrLw4fPkzfvn0NkufbqlKlCiVKlGDhwoUMHToUgAcPHrB9+3aGDRuGhYV8rooEJnUkNGrUCD8/P+Li4rC2tqZt27Z069aNpk2bykFrABqNht1Zoske4cRXLaZKA1sI8WGKiYApOQ1f78yChq1v9EOwsn/ram7cuMGECRP07hs6dKjBGtlr1qxhzZo1Otvs7e3p3r27zkwbjx49AiBPnjfPYJVYJiAgwCA5GkqvXr0YMWIEJ0+epEKFCixevJi4uDh69+5t7NSECTGpVtbu3bupVasW3bp1o3379jg5yQIoGeGRXRiYmRs7DSGEEJnA29ubrVu3ZnicFStWaC98jImJ4e7du/zwww/4+vpy7NgxNm3alOY6E6/BenW9hvXr1+us3AxQt25d6tatm+7c06pbt26MGjWKhQsXahvZVapUoXjx4pmWgzB9JtXIvnXrFnnz5jV2GkIIId5nlnYJvcSGEB3xXw/2iOtgZWeYeiEhz0yk0WiIj49Pdn/iPjOzN1/OZWlpSYECBfjxxx/x9/dn8+bN7Nu3j9q1a2unDbx3794b67l//z6gO9Xg+vXrWbJkSZKymdnI9vDwoFmzZqxYsYIWLVpw/fr1FMeXiw+TSTWyX29gBwUFER4enqqflIQQQohU0WgMMgwjCSu7jKk3kzg7OxMUFIRSSu9Kv4mzaTg7O6ep3sqVK7N//35OnTpF7dq1qVixIpaWlpw8eZKQkJAU69u1axcA1apV025bvHgxixcvTlMOGaF3795s2LCBPn36YGtrS+fOnY2dkjAxJje7SEhICEOHDiVbtmy4u7uTL18+7b6jR4/SrFkzTp48acQMhRBCiPdPqVKlCA8P59y5c3r3Hz58GIDSpUunqd6goCDgv55we3t72rdvT2RkJLNmzUr2eZcuXWLdunU4OjrSrl27NMXMDM2aNSN79uw8ePCAtm3byhBXkYRJNbKDgoKoUqUKP/30E3ny5KFYsWI6c2KXLl2agwcPJpk2RwghhBBvp0ePHgB89dVXREVF6ewLDg7WrrzYvXv3VNd59+5d1q1bB0CtWrW026dMmYKLiwtTpkxh/vz5SZ537do1WrZsSXR0NNOmTXvjLCTGYGFhwcaNG1m3bh3ffPONsdMRJsikhov4+vpy9epVVqxYQceOHZkwYQITJ07U7re1taVOnTrs3r3biFkKIYQQ746UpvADtPt69erFpk2bWLduHYULF6ZZs2a4urry6NEjNmzYQGBgIEOHDqVBgwZ663l1Cr/Y2Fju3LnD+vXrefHiBX369KFSpUrasp6enmzevJmWLVvSr18/fvrpJ+rWratdVn3Lli3ExMTg6+ub7tUeJ02ahLu7u959EydO1A5RjYmJoWfPnnrL2dnZMWfOnGRjVKpUSed1CfEqk2pkb9y4kY8++oiOHTsmW8bT05NDhw5lYlZCCCHEuyulKfzgv0a2mZkZq1evZtGiRfzxxx+sXLmSFy9ekCVLFipUqED//v1p06ZNsvW8OoWfRqPBycmJcuXK0bt3b20v+auqVq3K5cuX+fHHH9m4cSOLFy8mMjKS7Nmz06lTJ4YMGUKFChXS/bo3b96c7L5hw4ZpG9nx8fF6L6SEhPHnKTWyhUiJSTWyAwICtNP/JMfGxobw8PBMykgIIYR4N3l5eekMuUwNMzMz+vTpQ58+fVL9HF9f33SvxOzi4oKPj492KIohpOXCyNu3b6eqXFrfy7S+7+L9ZFJjsl1dXd84pc/ly5fJkSNHJmUkhBBCCCFE2plUI7t27dps3LiRBw8e6N1/8eJFtm7dSsOGDTM5MyGEEEIPK3vwDUm4vcPT9wkhDM+kGtljxowhNjaWGjVqsHz5cu2cnJcuXWLBggXUr18fa2trRo4caeRMhRBCCCGESJ5JjckuVaoUf/31F927d6dbt25AwrimkiVLopTC0dGRVatWUahQISNnKoQQQgghRPJMqpEN0KJFC27evMmSJUs4evQoQUFBODk5UaVKFXr16oWbm5uxUxRCCCGEECJFJtfIBsiaNSvDhw83dhrCAGytLPTeF0IIIYR4n5nUmGwhhBBCCCHeB9LIFkIIIYQQwsCkkS2EEEIIIYSBySBZId5G4hy5QgghhBCvkJ5sIYQQQgghDEwa2UIIIUQ6RcREUGpJKUotKUVETISx0xFCmJB3ppEdFRVFbGyssdMQaWVpp//++xJPCCGEEEIPk2pkHzhwgIkTJxIcHKzd9uzZM5o2bYqDgwNOTk6MGTPGeAkKYWyJY8B9QxLuv2/xhBAfLC8vL7y8vIydxjtn8eLFaDQaFi9ebOxUUs3Pzw+NRoOvr6+xU8lQJtXInjVrFkuWLCFLlizabV9++SXbtm0jf/78ZMmShWnTprF69WrjJSmEEEKYuNu3b6PRaHRulpaW5MqViw4dOnDixAljp/jO8vX1TfLevn6bPXu2sdM0Oo1GQ926dY2dhlGZ1Owi/v7+1KlTR/s4IiKCVatW0bhxY7Zu3UpYWBilS5dmzpw5tGvXzoiZCiGEEKavQIECfPLJJwCEh4dz8uRJ/v77b9avX8/OnTupXbu2kTN8d7Vt25aSJUvq3Ve1atVMzubdUrlyZS5duoSbm5uxU8lQJtXIfvLkCbly5dI+Pnz4MJGRkfTq1QsAR0dHPvroI9asWWOsFIUQQoh3RsGCBZP8JD9t2jRGjRrFuHHj2Lt3r3ESew+0a9eOTp06GTuNd5KdnR1FixY1dhoZzqSGi9jY2BAWFqZ9vHfvXjQajU7vtoODA8+fPzdGekIIIcQ7r0+fPgCcPHkyyb6FCxfSsmVLvLy8sLGxIWvWrHh7e7Nnz54kZV8dV3vq1Cm8vb1xdHTE2dmZ1q1bc/v2bb3xN2zYQKVKlbC1tSVbtmz069cvxc/1Z8+eMXz4cPLly4e1tTUeHh507NiRixcvJinbs2dPNBoNN2/eZObMmRQuXBhbW1uKFy/OypUrAYiJiWH8+PHky5cPGxsbSpcuzbZt21Lz1qVZZGQkpUqVwtLSkiNHjujse/nyJcWLF8fKyorjx49rtyeOTX/+/Dn9+vUjW7Zs2NraUrlyZTZu3Jim+IcOHaJ58+ZkzZoVGxsbihYtiq+vLxERSWfCSRze8eDBA3r27En27NkxMzPDz88PgD179tC7d2+KFCmCg4MDDg4OVKxYkblz5+rUk3hcwH/tuMRb4rjxlMZkX7hwgY4dO+Lh4YG1tTX58uVj+PDhBAUFJSmb+F6Fh4fzxRdfkCtXLqytrSldurRJDC02qZ7sggULsnXrVqKiojAzM+Ovv/6iePHiZM+eXVvm7t27eHh4GDFLIYQQ7zKlFC9jXxqkrlfrMVSdiWwtbLWNlYxgYZG0CTBo0CDKlClDw4YNcXd358GDB6xfv56GDRuydu1aWrZsmeQ5J06c4Ntvv6Vu3boMGDCA06dPs379es6dO8f58+exsbHRlv3jjz/o0aMHTk5OdOvWjSxZsvDvv//SsGFDoqOjsbKy0qn72bNnVK1alevXr1O3bl06derE7du3Wb16NZs2bWLHjh1Uq1YtSU5ffPEFR48e5eOPP8bc3JyVK1fSpUsXXFxc+OWXXzh//jzNmjUjMjKS5cuX06JFCy5fvky+fPkM8M7+x8bGhhUrVlCpUiW6dOmCv78/Tk5OAAwfPpxLly4xdepUKlWqpPO86OhoGjZsyMuXL+nRowfBwcGsXLmSVq1asXTpUrp27frG2GvWrKFTp05YWVlpG607d+5kwoQJbN++nT179mBtba3znGfPnlGtWjWyZs1Kx44diY6O1uY7ffp0rl+/TtWqVWndujXBwcFs3bqVAQMGcOXKFWbNmgUkNHx9fHyYMGECnp6e9OzZU1t/2bJlU8z50KFDNG7cmKioKNq1a4eXlxdHjhxh9uzZbNq0icOHD+Pq6qrznJiYGBo3bkxQUBBt2rQhIiKClStX0qFDB7Zu3Urjxo3f+F5lFJNqZPfr14/+/ftTqFAhrKysuHXrFjNmzNApc/ToUYoXL26kDIUQQrzrXsa+pMryKgavt+6qugat72iXo9hlwFSkv//+OwA1a9ZMsu/ixYtJGpoBAQFUrFiRkSNH6m1kb9q0iZUrV9KxY0fttu7du7N06VLWr1+vHVIRGhrK559/jr29PcePH6dw4cIAfPPNNzRs2JCAgAA8PT116v7qq6+4fv06o0aNYsqUKdrtPXv2pEmTJvTo0YPLly9jZqb7w/zFixc5e/Ys7u7u2vJVq1alU6dOlCxZknPnzmFvnzBjkre3Nx07dmT27Nn88MMPqXsTgdWrV3P58mW9+wYOHKjtICxZsiQzZ85k8ODBfPrpp/z5559s2LCB33//nXr16vHVV18leX5AQADFihXjyJEjWFpaAglfHMqXL8/gwYNp0aIFjo6OyeYWFhZG3759MTc35/Dhw5QuXRpI+IL5ySefsHz5cr799lvGjh2r87zz58/Tq1cv5s2bh7m5uc6+X3/9NcmxERsbS7Nmzfjhhx8YOnQoefPmxcvLC19fXyZMmKC9nxrx8fH07NmT8PBwtm7dire3t3bf6NGjmTp1Kl9//TXz58/Xed7Dhw+pVKkSe/bs0X5J69KlCw0bNuS7774zaiPbpIaL9OnTh5EjRxIREUFwcDADBgxg2LBh2v179uzh5s2bNGjQwHhJvsNcs2TnXI9znOtxDtcs2d/8BCGEEO+069ev4+vri6+vLyNHjqRu3bqMGzcODw8Pvv322yTl9fXk5siRg7Zt23Lt2jXu3LmTZH/t2rV1GtgAvXv3BtAZBrF+/XpCQ0Pp3bu3toENYGlpyTfffJOk3ujoaFasWIGrq2uSxqC3tzfe3t5cu3aNQ4cOJXnumDFjtA1sgCpVqpA/f36Cg4P55ptvtA1sSLiA0dLSkjNnziSpJyVr1qxhwoQJem+PHj3SKTto0CA+/vhjli9fzowZM+jTpw9Zs2bljz/+SPIFIdGkSZO0DWyAokWL0rt3b4KDg9mwYUOKua1fv57g4GB69+6tbWBDwpCQadOmYWFhoXfKPysrK2bMmJGkgQ36jw0LCwsGDhxIXFyc3iFFaXHw4EGuXbtG06ZNdRrYkPD/6erqyvLly4mOjk7y3O+//17nV5AGDRrg6empc/wZg0n1ZGs0GqZPn8706dP17q9RowbPnz/X+eMQps3O0o5zPc69t/GEEO8eWwtbjnY5apC6Xsa+1PZg+3Xww9bC1iD1Agap68aNG0yYMEFnm4eHB/v379dp6Ca6efMmU6dOZffu3Tx48ICoqCid/Q8fPkzS21y+fPkk9eTOnRtAZ92LxEZsrVq1kpSvVq1akuErly9f5uXLl9StWxc7u6Q9+nXr1mXbtm34+/sn6ZUvV65ckvI5cuTg5s2bSYYsmJub4+HhwYMHD5I8JyUrVqxI04WPCxcupHTp0nz99ddAQiM98X16naWlpd4ZSmrVqsUvv/yCv7+/dtYYfU6fPg2gdwq9PHnyUKBAAa5cuUJYWJhOj3i+fPmSnfEjLCyMmTNnsn79em7cuEF4eLjO/ocPHyabT2qklLO9vT0VK1Zk27ZtXL16VWdWlyxZsuj9ApA7d24OHz78Vjm9LZNqZL+JlZVVkvFaQgghRFpoNJoMGYZha2GbIfW+DW9vb7Zu3QrA06dPWbJkCV9//TWtWrXi2LFjODg4aMtev36dypUrExoaSr169fj4449xcnLSXvy2d+/eJI1uAGdn5yTbEhvMcXFx2m0hISEAeq+rMjc3TzLWNjQ0FIBs2bLpfW2JwzES631V4jhifTklty8mJkZvHENxc3OjVq1arFq1Ck9PT1q0aJFsWVdXV7093Invhb7X/KrUvHdXrlwhNDRUp5GdXPno6Gjq1q3LqVOnKFeuHN26dcPV1RULCwtu377NkiVL9B4baZHe/299xx8k/J/Gx8e/VU5vy2Qb2XFxcQQGBib7n5Y3b9501Xv8+HF8fHw4fPgw0dHRlChRgmHDhtGlS5d01RcTE0OlSpU4c+YMRYoUSXZ8lhBCCGFM7u7ujBgxgpCQECZPnszYsWN1Fk35/vvvef78OcuWLUtyYd3AgQPferq/xMbQkydPkuyLi4vj2bNnOtP4JjaGHz9+rLe+xO36Gs2m6O+//2bVqlW4urpy584dfHx89A6TgYQLEOPj45M0tBNfc3INy0Tpfe+Su9B2w4YNnDp1ir59+zJv3jydfStXrmTJkiUp5pMa79v/N5jYmGxImFLI29sbBwcHcubMSb58+ZLc8ufPn666/fz8qFmzJvv376ddu3Z8+umnBAYG0rVrV50LKtJi0qRJXL9+PV3PFUIIITLb6NGjyZkzJ3PmzNGZZu/GjRsASXpY4+PjOXjw4FvHLVOmDAD79+9Psu/w4cPExsbqbCtatCg2NjYcP35c75RziY3+N81YYQru3r1L//798fDwwN/fn4oVKzJt2rRkv7jExMQkmfIP/nvv3vSaE4fLJE6/96oHDx5w48YN8ufPn+LFk69K7th4NafXmZmZ6fyS8SYp5RwREcGJEyewtbWlSJEiqa7T2Eyqke3v70+tWrU4fPgwjRs3RilF6dKlady4MW5ubiilqFOnDt26dUtz3bGxsfTt2xeNRsO+ffuYN28eM2fO5MyZM5QoUQIfHx+uXbuWpjpPnTrF1KlTmTp1aprzEUIIIYzB1taWr7/+mpiYGCZNmqTdnjjW+sCBAzrlp0+fzvnz5986bsuWLXFycmLhwoVcvXpVuz0mJibJhY2QMES0c+fOBAYGJvmc3blzJ1u2bKFgwYLUqFHjrXPLSPHx8XzyyScEBwezePFicufOzfLly7G1taVbt27JzhE+btw4nSEsly9fZuHChTg7O+ud5eVVLVu2xNnZmUWLFnHhwgXtdqUUo0aNIiYmRmdqvTdJ7tjYu3dvkp7tRFmzZuX+/fupjlGjRg0KFCjAli1b2Llzp86+qVOnEhgYSOfOnd+pYcMmNVwk8Y/96NGjFCtWDDMzM1q3bs348eN5+fIlX375JatXr2bhwoVprnv37t3cuHGDXr166VwQ4ejoyLhx4+jUqROLFi1KdY92dHS0dkqgwYMHM2TIkDTnJIQQQhhD//79mT59On/88QejR4+mQIECDBw4kEWLFtGmTRs6duyIq6srR44c4dSpUzRv3pxNmza9VUxnZ2d+/PFHevbsSaVKlejUqRPOzs78+++/2NrakiNHjiTPmT59Onv37mXy5MkcOnSIKlWqaOfJtrOzY9GiRcnOzpHRUprCr2zZsrRq1QpImKJw//79DBkyhKZNmwJQqFAhfvzxR/r06UP//v35+++/dZ6fI0cOgoODKVu2LM2bNyckJIQVK1YQGRnJvHnz3tgD7eTkxLx58+jcuTNVqlShY8eOuLu7s2vXLk6cOEHlypUZOXJkql/rxx9/jJeXFzNmzOD8+fOULFmSK1eu8O+//9KqVSu9K3HXr1+fVatW0a5dO8qVK4e5uTnNmzenVKlSemOYmZmxePFivL29adasGe3bt8fT05OjR4+ye/duChQowLRp01Kds0lQJsTDw0N17NhR+1ij0ShfX1/t47i4OFWmTBnVuXPnNNc9atQoBagVK1Yk2RcUFKQAVb169TTVZ2Njo65cuaKUUgpQRYoUeePzIiMjVUhIiPZ27949BaiQkJDUvxgh3mdRL5TycUq4Rb14/+KJTPHy5Ut18eJF9fLlywyNEx4drkouLqlKLi6pwqPDMzRWWty6dUsBytvbO9kyP/30kwJUt27dtNv27NmjatSooRwdHVWWLFlUs2bN1MmTJ5WPj48C1J49e3TKAsrHxyfZ+D169Eiyb926dapChQrK2tpaeXh4qL59+6qgoCDl6empPD09k5R/+vSpGjJkiPL09FSWlpbKzc1NtWvXTp07dy5J2R49eihA3bp1K8m+OnXqqOSaPcnF1ifxvUjplvi6Dx8+rCwsLFTJkiX1Hovt2rVTgJo3b16SXJ49e6b69u2rPDw8lLW1tapYsaLasGFDkjoWLVqkALVo0aIk+/bt26eaNm2qsmTJoqysrFThwoXVuHHj1IsXSc91gKpTp06yr/vmzZuqbdu2yt3dXdnZ2alKlSqplStXJnscBAQEqA4dOig3NzdlZmamk2NKx87Zs2dVu3btlJubm7K0tFSenp5qyJAh6unTp0nKpvT/ltL/9+tSc74ICQlJc3tNo5RSmdSefyMbGxu++OILbW+ytbU1Q4YM0ZnLc9iwYaxYsSLZgfHJad++PatXr+bEiRNUqFAhyX53d3c0Go3eCzJed/z4capVq8aUKVO0k8hrNJpUXfiYOEH760JCQt6pwfxCCGHKIiMjuXXrlnbp7IwSEROhXdgmoxaPER8WLy8vgGSXpReGl5rzRWhoKM7Ozmlqr5nUmGwPDw+dsUnZs2dPMk46MjJS7wUQb5I45UtyV+Q6OTm9cUocgKioKHr27Em5cuX48ssv05zHqFGjCAkJ0d7u3buX5jqEEEIIIYRpM6kx2cWLF+fKlSvaxzVq1GD9+vUcOXKEqlWrcunSJVatWkXRokWNluO4ceO4du0aJ0+e1Lsi0ptYW1tjbW2dAZkJIYTIbLIAlhAiOSbVk928eXP27dtHQEAAAF9//TVKKWrUqIG7uzulSpUiODiY0aNHp7nuxB7s5HqrE38GSMmpU6f47rvvGDNmTLID94UQQgghhDCpRvbAgQN58OCBdtWnMmXKsGvXLpo0aYKbmxsNGzbkn3/+oXXr1mmuu1ChQgB6p+l7/vw5gYGB2jLJOXv2LHFxcfj6+qLRaHRuAFeuXEGj0ZAlS5Y05yeEEEIIcfv2bRmP/Z4wqeEilpaWSZbTrF69+ltPGwRQp04dpk6dyvbt2+nUqZPOvu3bt2vLpKRw4cL06dNH774FCxbg7OxMu3btsLOTC1+EEEIIIT5kJjW7SEaKjY2lSJEiPHjwgCNHjmhXSwoLC6NatWpcuXKFCxcuULhwYQACAwMJDAzEzc0NNze3N9af2tlFXpeeq1WFEEKkLLNmFxFCvPs+iNlFMpKFhQXz588nPj6eWrVq0b9/f0aMGEGZMmW4cOECvr6+2gY2wM8//0yxYsX4+eefjZi1EEKIt/GB9CMJId5CRp0nPphGNkC9evU4cOAANWvWZNWqVcyZMwdXV1eWLVvGmDFjjJ2eEEIIA0mc/enVZamFEEKfxPNEemaNS8kHM1zEVMlwESGEyBg3b97E0tKS3Llzay9QF0KIVymluH//PjExMeTPnz/Zculpr5nUhY9CCCGEobi5ufHgwQPu37+Ps7MzlpaW0tgWQgAJjeuYmBhCQkJ48eIFuXLlMngMaWQLIYR4LyX2NgUGBvLgwQMjZyOEMEXW1tbkypUrQ0YTSCNbCCHEe8vJyQknJydiYmKIi4szdjpCCBNibm6OpaVlhtUvjWwhhBDvPUtLywz9MBVCiNd9ULOLCCGEEEIIkRmkkS2EEEIIIYSBSSNbCCGEEEIIA5NGthBCCCGEEAYmjWwhhBBCCCEMTBrZQgghhBBCGJhM4Wdkiavah4aGGjkTIYQQQgihT2I7LbHdlhrSyDaysLAwAPLkyWPkTIQQQgghRErCwsJwdnZOVVmNSkuTXBhcfHw8Dx8+xNHREY1Gk+HxQkNDyZMnD/fu3cuQJURNIabEe7fjGSOmxJN4ph5T4r3b8YwRU+IZllKKsLAwcubMiZlZ6kZbS0+2kZmZmZE7d+5Mj5u41PD7HFPivdvxjBFT4kk8U48p8d7teMaIKfEMJ7U92InkwkchhBBCCCEMTBrZQgghhBBCGJg0sj8w1tbW+Pj4YG1t/d7GlHjvdjxjxJR4Es/UY0q8dzueMWJKPOOTCx+FEEIIIYQwMOnJFkIIIYQQwsCkkS2EEEIIIYSBSSNbCCGEEEIIA5NGthBCCCGEEAYmjewPyPHjx2nWrBkuLi7Y29tTuXJlli9fniGxli1bxoABA6hYsSLW1tZoNBoWL16cIbEePHjA7Nmzady4MXnz5sXKyors2bPTtm1bjh49avB4wcHBDBkyhGrVqpE9e3asra3JlSsX9evXZ82aNWTGtcQzZsxAo9Gg0Wg4cuRIhsTw8vLSxnj9NnDgwAyJCbBu3ToaNWqEq6srtra25MuXj86dO3Pv3j2DxVi8eHGyry3x1qBBA4PFg4TVwtauXUu9evXIkSMHdnZ2FClShAEDBnDz5k2DxoKE1WR//vlnypcvj52dHU5OTtSpU4eNGze+Vb1p/dsODQ3liy++wNPTE2trazw9Pfniiy8IDQ01eDx/f39Gjx6Nt7c37u7uaDQa6tatmyGvLyYmhjVr1tCzZ0+KFSuGvb09jo6OVKlShTlz5hAXF2fwmADz5s3j448/Jl++fNjb2+Ps7EyZMmUYP348QUFBBo/3ulu3buHg4JCm80Ba4vn6+ib7N2ljY5Nhr+/WrVv069dPe5xmy5aNevXq8ffffxs03pvOOxqN5o3nurS+vmvXrtGrVy8KFSqEra0tuXLlolGjRmk6F6Q15tGjR2nZsiVubm5YW1tTuHBhxo8fz8uXL98YKz2f6W97nskosuLjB8LPzw9vb2+srKzo1KkTzs7OrF27lq5du3L79m1Gjx5t0Hhjx47lzp07uLm5kSNHDu7cuWPQ+l/1008/MX36dAoUKECjRo3w8PDg2rVrrF+/nvXr17NixQo6dOhgsHiBgYEsXLiQqlWr0qpVK7JmzcqTJ0/4559/aNeuHf369WPu3LkGi/e6S5cuMX78eOzt7QkPD8+wOJCwutWwYcOSbK9YsaLBYymlGDhwIHPnzqVAgQJ06tQJR0dHHj58yN69e7lz5w558uQxSKyyZcvi4+Ojd9/q1au5cOEC3t7eBomVaMSIEXz33XfkyJGDVq1a4eTkxJkzZ5g3bx4rVqzg0KFDlCxZ0iCxlFJ06NCBNWvWUKBAAfr06UNUVBQbNmygZcuW/PTTTwwePDhddaflbzs8PJw6derg7+9Po0aN6Ny5M2fOnOH7779nz549HDhwAHt7e4PFW79+PVOnTsXKyorChQsTGBiYYa/vxo0btGvXDkdHR+rXr0+LFi0ICQnhn3/+YdCgQWzdupUNGzag0WgMFhNg6dKlPH/+nFq1apEjRw6ioqI4cuQIkyZNYsmSJRw9epTs2bMbLN6rlFL06tUrVWXfNl6PHj3w8vLS2WZhkbomS1rj7dixg1atWgHw8ccfkz9/fp4/f87Zs2fZuXMn7du3N1i85M47169f588//6RYsWJvPM+lJd7Ro0epV68eMTExtGjRgrZt2/LkyRPWrl1Ly5Yt8fX1TTan9MZcu3YtHTt2xNzcnLZt25I9e3YOHjzIpEmT2L17N7t27Upx2r20fqYb4jyTYZR478XExKgCBQooa2trderUKe320NBQVaJECWVhYaGuXr1q0Jg7duxQt2/fVkopNXXqVAWoRYsWGTRGojVr1qh9+/Yl2b5v3z5laWmpsmbNqiIjIw0WLzY2VsXExCTZHhoaqooXL64Adf78eYPFez12pUqVVOXKldUnn3yiAHX48OEMieXp6ak8PT0zpG59fvjhBwWoQYMGqdjY2CT79b3nhhYVFaVcXV2VhYWFevTokcHqDQgIUGZmZsrLy0uFhITo7Pv+++8VoHr16mWweH///bcCVI0aNVRERIR2+9OnT5Wnp6eytrZWt27dSlfdafnbHj9+vALUV199pXf7+PHjDRrv/Pnz6uTJkyo6OloFBAQoQNWpUyfVry0t8e7fv6/mzJmjwsPDdba/ePFCVaxYUQFq1apVBo2plFIvX77Uu33s2LEKUCNGjDBovFf98MMPysLCQn333XcKUAMGDHjjc9Iaz8fHRwFqz549qar7bePdvXtXOTk5qUKFCqk7d+4k2Z+a844hPu8GDx6sADVr1iyDxmvatKkC1IYNG3S237lzRzk5OSlbW9tUfT6mNmZERIRyc3NTlpaW6sSJE9rt8fHxatCgQQpQU6dOTTFWWj/TDXGeySgyXOQDsHv3bm7cuEGXLl0oV66cdrujoyPjxo0jNjaWRYsWGTRmw4YN8fT0NGidyWnTpg21atVKsr1WrVrUq1ePoKAgzp07Z7B45ubmentUHB0dtb2f169fN1i8V02fPp0zZ86wcOFCzM3NMySGMbx8+ZIJEyaQP39+Zs+erfe1pbYX622sW7eOZ8+e8dFHH5EtWzaD1Xv79m3i4+OpUaMGTk5OOvuaN28OwJMnTwwWb/369QCMHj0aW1tb7XY3NzeGDx9OVFRUuv/mU/u3rZRi/vz5ODg4MH78eJ19o0aNwsXFhQULFrxxeFVaziUlSpSgfPnyWFpapqr828TLlSsXn376KXZ2djrb7e3t+eKLLwDYu3evQWMCyQ6ZSOxtTc25Jz3n5+vXrzNq1Ci++uornc+R1MjMz4O0xpsyZQqhoaH89ttv5M2bN8n+1Jx33vb1RUZG8ueff2JlZUW3bt0MGu/mzZtoNBqaNGmisz1v3ryULFmSly9fEhYWZrCYBw8eJDAwkFatWlGhQgXtdo1Gw+TJkwH47bffUvy7T8tnuqHOMxlFGtkfAD8/PwAaN26cZF/ittR+GLxrEj9sM6OBFhkZye7du9FoNBQvXtzg9Z8/f54JEyYwduxYSpQoYfD69YmKimLJkiVMmTKFX3/9lTNnzmRInB07dhAUFESrVq2Ii4tj7dq1TJs2jd9++y3DvrDos2DBAgD69u1r0HoLFSqElZUVBw8eTPKBtnnzZgDq169vsHiPHz8GIF++fEn2JW7bvXu3weLpc+3aNR4+fEiNGjWS/FRrY2ND7dq1efDgQab+/2aWzDzvJNq0aROAwYYcvSo+Pp5evXrh6emZpCGTUfbv38+MGTOYNWsWmzZtIioqyuAxlFKsWrUKV1dX6tevz8mTJ/nuu++YOXMmO3fuJD4+3uAx9Vm7di3Pnz+nRYsWuLu7G7TuEiVKoJRi+/btOtvv3bvH+fPnKVWqFG5ubgaLl9K5J0uWLLi4uHDnzp10X4fy+t+WqZ9nZEz2B+DatWtAwgf961xcXHBzc9OWeZ/cvXuXnTt3kj17dkqVKmXw+oODg5k9ezbx8fE8efKEzZs3c+/ePXx8fPS+128jNjZWe4HV//73P4PWnZJHjx7Rs2dPnW1NmjRh6dKlBj0xnzhxAkg4cZYpU4YrV65o95mZmTF8+HBmzpxpsHj63Llzh127dpErV64kvT5vy9XVlW+++YaRI0dSrFgxWrRogaOjI+fOnWPnzp3079+fzz//3GDxEj+ob926RbFixXT23bp1C4CrV68aLJ4+KZ13Xt1+7do1g/+9GNvChQsB/R0bhrJ48WJu375NWFgYp06dws/Pj3Llyml70Q1p9uzZHDp0iAMHDmTaEtavN+Zz5MjBkiVLaNSokcFi3Lp1i6CgICpVqsSnn37Kb7/9prO/XLlybNy4kdy5cxsspj4Z9eUeYNKkSRw4cIA2bdrQsmVLChYsyNOnT1m7di2enp6sWrXKoPFePfe8LiQkhOfPnwMJ558CBQqkqW59n+mmfp6RRvYHICQkBEi4iE0fJycn7t+/n5kpZbiYmBi6detGVFQUM2bMyJChFcHBwUyYMEH72NLSkm+//ZYvv/zS4LGmTJnCmTNnOHr06Fv9FJ4WvXv3pk6dOpQoUQJra2suXrzIhAkT2LJlCy1atODgwYOpuqgrNRKHSsyaNYvy5ctz7NgxihUrxunTp+nfvz+zZs2iQIECfPrppwaJp8+iRYu0PXYZcbyMGDGCnDlzMmDAAH799Vft9urVq/PJJ58Y9P+1adOmrFixgmnTplG/fn3tEINnz54xe/ZsIOH4zUipOe+8Wu59MXfuXLZs2UL9+vVp1qxZhsVZvHixzi+QjRs3ZunSpbi4uBg0ztWrVxk7dixDhw6lWrVqBq1bn7Jly7JkyRLq1KlDtmzZuH//PitXrmTKlCm0aNGCI0eOUKZMGYPESjzvnDp1ikuXLrFo0SJatmxJSEgIU6ZMYd68ebRr1y7DZnCChMbonj17yJs3r0G/QCQqXrw4R44coX379qxevVq73cXFRTvjiCFVr14dJycn1q9fz+nTp3WGFo0bN057P63nn+Q+0039PCPDRcR7Jz4+nt69e7Nv3z769euXqjFu6eHl5YVSitjYWG7dusXEiRMZM2YMbdu2JTY21mBxzpw5w+TJkxkxYgTly5c3WL1vMn78eOrUqYObm5t2arJ///2XmjVrcvjwYe0wB0NI/FnWysqK9evXU6lSJRwcHKhVqxarV6/GzMyMWbNmGSyevviLFi1Co9HQu3fvDIkxefJkevbsyahRo7h37x4vXrzgwIEDxMbGUq9ePdauXWuwWJ07d6ZevXrs37+fUqVK8fnnnzNw4EBKlCih/dB5n8b0m4pNmzYxePBgPD09WbZsWYbG8vPzQynF06dP+ffff7l//z7ly5fn7NmzBosRHx9Pz549yZkzp3Y8bUZr1aoV3bt3x9PTExsbGwoWLMjYsWP54YcfiIyMNGgeieeduLg4Jk2aRM+ePXFxccHLy4u5c+dSpUoVjh49yoEDBwwW83ULFy7UztpiZmb4JtmJEyeoWbMmWbNm5eTJk4SHh3Pz5k369OnDF1988caZU9LKwcGB7777jpiYGKpVq8Ynn3zCiBEjqF69Or///jtFixYF0nb+yazP9IwgjewPQOI3vOS+yYWGhib7LfBdo5SiX79+LFu2jE8++STJz38ZwdzcHC8vL/73v/8xefJk1q1bx7x58wxWf48ePShQoAC+vr4GqzO9zMzMtFN4HTx40GD1Jh5/FStWJGfOnDr7SpQoQf78+blx40aG9b7u2LGDu3fvUr9+fb1jCd/W7t27GTduHIMHD2b06NHkzp0be3t7atSowb///outrS3Dhw83WDwLCwu2bNmCr68vZmZmzJ07VztlV2JvlqHHfr4uNeedV8u967Zt20bbtm3Jli0bu3fvJkeOHJkS183NjebNm7N161YCAwPp16+fwer+8ccfOXLkCPPnz09ygWdm69GjBxYWFhly3gFo0aJFkv0ff/wx8N9wNkOLj49n8eLFmJmZZciX+5iYGDp27IhGo2H9+vXaOfPz5cvHt99+S8eOHVm3bh179uwxaNw+ffqwefNmqlWrxoYNG5gzZw4WFhbs2rWLggULAqk//7zpM93UzzPSyP4AvDom6XXPnz8nMDDwvRgTGR8fT58+fVi4cCGdO3fWnrwyU+IYzMSLTQ3hzJkzXL58GRsbG50FC5YsWQJAtWrVtCfRzJA4FjsiIsJgdRYpUgRIuDBGn8TtqVnIID0yckwk/HdRWr169ZLsc3d3p1SpUty9ezdd8zonx9raGh8fH65cuUJUVBRPnjzh999/58GDB0DGzHX+qpTOO69ufx/OPVu3bqVVq1a4ubmxZ88e8ufPn+k55MmTh2LFinH8+HGD/W36+/ujlKJevXo6557E4/j3339Ho9Fo55jOSFZWVjg6Ohr0vFOwYEFtj6q+c09Gn3e2bt3K/fv3adSokd6ZTd7W5cuXuXnzJlWqVNH7JSnxYuuTJ08aPHbTpk3Zs2cPYWFhREREsG/fPmrWrMn58+cxMzNL1a+yqflMN/XzjIzJ/gDUqVOHqVOnsn37djp16qSzL/GK4zp16hgjNYOJj4+nb9++LFq0iI4dO7J06VKj/Bz+8OFDwLCzCvTp00fv9n379nHt2jXtFemvL9yQURJX3DJkvMQP7UuXLiXZFxMTw/Xr17G3t8+Q3tdnz56xYcMGsmbNSuvWrQ1eP0B0dDQAT58+1bs/cXtmXFT2559/AiQ5FxhaoUKFyJkzJwcPHiQ8PFznyv/IyEj27dtHzpw5tT1b76rEBnbWrFnZs2ePUV9PQEAAGo3GYOe+OnXq6D2XBQQEsHnzZooWLUqNGjXSPKVfely7do3nz58bbDw2JPy9Va9enf3793Px4kVq1qyps//ixYuAYc91r8roL/emdN6BhF8/b9++TbNmzd7Ys5zaz3STP88YZXZukaliYmJU/vz5lbW1tTp9+rR2+6uL0Vy5ciXD4mf0YjRxcXGqZ8+eClDt27fP8EVLTp8+rYKDg5Nsf/bsmSpbtqwC1NKlSzM0B6WU6tGjR4YtRnPhwgX1/PnzJNv379+vbGxslLW1td6FG95G48aNFaDmzZuns33ixIkKUJ988olB4yVKXAxmyJAhGVK/UkqtWLFCAapEiRJJjp3FixcrQFWoUMGgMV9f9EaphEVqzMzMVKVKlfQu+JNWmbEYTVrivSq9i9GkJd6WLVuUtbW1yp49u7p8+XK646Q2ZmBgoN6FruLj47WLuDRo0MBg8ZKzZ8+eNC1Gk9p4oaGh6syZM0m2BwUFqVq1ailATZs2zWDxlFJq+fLl2vft1QVOLl26pOzs7JSjo6MKCgoyWLxET548UZaWlsrNzU1FRUWluv60xIuMjFTOzs7KzMxMbdu2TWffgwcPVM6cORWgzp49a7CYSuk/9zx48EAVLVpUWVhYqJMnT6ZYf1o/0015MRqNUkaaoVtkqj179uDt7Y21tTWdO3fGycmJtWvXcuvWLSZPnsyYMWMMGm/+/Pnai0XOnTvHqVOnqFGjhvbbZKtWrQz2E6Ovry8TJkzAwcGBoUOH6u15adWqFWXLljVIvGHDhjF//nzq1auHp6cn9vb23Llzh02bNvHixQvatm3LqlWrMnyoSs+ePVmyZAmHDx+matWqBq3b19eXGTNm0KBBA7y8vLC2tub8+fNs374dMzMzfvvtN4P3vty4cYPq1avz5MkTmjdvTtGiRTl9+jS7d+/G09OTI0eOvHG56PQoVaoU58+f5+zZsxky1SMkXFjVsGFD/Pz8cHd3p0WLFri4uHDmzBl27NiBtbU1O3fuTNKT9jYSl2cuVqwYNjY2HDt2DD8/P/Lnz699T9MjLX/b4eHh1KxZU7vccYUKFThz5gxbtmyhbNmyqVruOC3xLl++zLRp04CEn/hXrVpFtmzZtFMyurm5vXEqyNTGu3z5MmXLliUqKopOnTpphzy9ysvLK8kUmG8T09/fn3LlylG5cmWKFy9O9uzZCQwMZP/+/Vy5coXs2bPj5+enN5f0xEuOn58f9erVY8CAAam67iW18W7fvk2+fPmoWLEipUqVwsPDgwcPHrBlyxaePXtGo0aN+Pfff7GysjLY61NK0aFDB1avXk2RIkXw9vYmJCSENWvWEBERwR9//EHXrl0NFi/RrFmzGDFiBF988UWaL+pOS7wFCxbQt29fzMzMaN68OcWKFePx48esW7eO0NBQBg0axM8//2zQmJMnT2bZsmXUrFkTDw8P7t27x4YNG4iIiGDBggX06NEjxVhp/Uw3xHkmwxiteS8y3dGjR1WTJk2Us7OzsrW1VRUrVlTLli3LkFiJvazJ3Xx8fDItFgbuRd+/f7/q2bOnKlq0qHJyclIWFhbKw8NDNWnSRC1fvlzFx8cbLFZKMrIn28/PT3Xo0EEVLFhQOTo6KktLS5U7d27VqVMndfToUYPHS3T37l3Vs2dPlT17dmVpaany5MmjBg0apB4/fpwh8Y4ePaoAVbly5Qyp/1WRkZFq+vTpqnz58srOzk5ZWFioXLlyqS5duqhz584ZPJ6Pj48qVaqUcnR0VDY2NqpYsWJq7NixenuZ0iKtf9vBwcFq+PDhKk+ePNr/0+HDh+v9Neht4yX2sCZ38/T0NFi8N8UiDb3oqY0ZFBSkRo0apapVq6Y8PDyUhYWFcnBwUOXKlVNjx45VgYGBBn9P9UlrT3Zq44WEhKhBgwapChUqKDc3N2VhYaGcnZ1VzZo11W+//ZbqX1/S+vpiYmLUd999p0qUKKGsra2Vk5OTaty4sfLz88uQeEopVaxYMQWoixcvpirG28TbuXOn+uijj5S7u7syNzdXTk5OqlatWmrJkiUZEnPXrl2qYcOGysPDQ1laWqrs2bOrjh07qlOnThkklr7P9Lc9z2QU6ckWQgghhBDCwGR2ESGEEEIIIQxMGtlCCCGEEEIYmDSyhRBCCCGEMDBpZAshhBBCCGFg0sgWQgghhBDCwKSRLYQQQgghhIFJI1sIIYQQQggDk0a2EEIIIYQQBiaNbCGEEEIIIQxMGtnig3H79m00Gg3+/v7GTkXr8uXLVK1aFRsbG8qWLWvsdPTy8vJi9uzZxk5DpIFGo2H9+vWpLr948WKyZMli8Hp9fX1N9rgWxpOec3FqjqX01NuzZ09atWqV6vIiwblz58idOzfh4eHGTsWkSSNbZJqePXui0WiYNm2azvb169ej0WiMlJVx+fj4YG9vz5UrV9i1a5ex09Hr+PHj9O/f39hpGNS8efOoVasWLi4uuLi40LBhQ44dO2bstAwmICCApk2bprp8x44duXr1qvZxcg2atNYr9Ltw4QJt27bFy8sLjUaT7JfYOXPmkC9fPmxsbKhQoQL79+/P3EQzSJ48eQgICKBkyZKpfs6IESN0zpH6GsfpqVfol3hsvnr73//+p91fqlQpKleuzPfff2/ELE2fNLJFprKxsWH69Ok8f/7c2KkYTHR0dLqfe+PGDWrWrImnpyeurq4GzOrtJb4ud3d37OzsjJyNYfn5+dG5c2f27NnD4cOHyZs3L40bN+bBgwfGTs0gsmfPjrW1darL29ra4uHhYfB6hX4RERHkz5+fadOmkT17dr1l/vrrL4YNG8aYMWM4ffo0tWrVomnTpty9ezeTszU8c3NzsmfPjoWFRaqf4+Dg8MZzZHrqFcmbOHEiAQEB2tvYsWN19vfq1Ytff/2VuLg4I2X4DlBCZJIePXqojz76SBUtWlSNHDlSu33dunXq1UPRx8dHlSlTRue533//vfL09NSpq2XLluqbb75RHh4eytnZWfn6+qqYmBg1YsQI5eLionLlyqUWLFigfc6tW7cUoFasWKGqVaumrK2tVfHixdWePXt0Yl24cEE1bdpU2dvbKw8PD/XJJ5+op0+favfXqVNHDRo0SA0fPly5urqq2rVr6329cXFxasKECSpXrlzKyspKlSlTRm3ZskW7H9C5+fj46K3nxYsXqlu3bsre3l5lz55dzZw5U9WpU0cNHTpUp65169bpPM/Z2VktWrRI+/j+/fuqQ4cOKkuWLCpr1qyqRYsW6tatW0ne0ylTpqgcOXJo329PT0/1/fffa8sFBwerfv36KXd3d+Xo6Kjq1aun/P39tfv9/f1V3bp1lYODg3J0dFTly5dXx48f1/valFLq6tWrqlatWsra2loVK1ZMbd++Xe/ryUixsbHK0dFRLVmyJE3PA9S8efNUq1atlK2trSpYsKDasGGDdv+iRYuUs7OzznOSO94XLFig8uTJo+zt7dXAgQNVbGysmj59usqWLZtyd3dXkydPTlNeie9f4nG/Zs0aVbduXWVra6tKly6tDh06pDfPRYsWJTk2E4+j1/9fvvrqK1WoUCFla2ur8uXLp8aOHauio6OTvLbUWrBggSpevLiysrJS2bNnV4MGDdLuu3PnjmrRooWyt7dXjo6Oqn379urRo0dv/T4Cas6cOapJkybKxsZGeXl5qVWrVqU657f1+t9XosqVK6uBAwfqbCtatKj63//+l+q6U/N/n1Hn29Tkdfr0aaWUUnv27FGA2rlzp6pQoYKytbVV1apVU5cvX9abp4+PT5JjdM+ePUnqjY2NVb1791ZeXl7KxsZGFS5cWM2ePVsnl8TXlhp///23KlmypLKxsVFZs2ZVDRo0UC9evFBKKXXs2DHVsGFD5erqqpycnFTt2rXVyZMndZ4PqN9++001b95c2draqqJFi6pDhw6pa9euqTp16ig7OztVtWpVdf369SSv+7ffflO5c+dWtra2ql27dur58+epyjm9kjsuXxUVFaWsra3Vrl27MjSXd5n0ZItMZW5uzpQpU/jpp5+4f//+W9W1e/duHj58yL59+/juu+/w9fXlo48+wsXFhaNHjzJw4EAGDhzIvXv3dJ43cuRIvvzyS06fPk316tVp0aIFz549AxJ+Dq9Tpw5ly5blxIkTbN26lcePH9OhQwedOpYsWYKFhQUHDx7k999/15vfDz/8wKxZs5g5cyZnz57F29ubFi1acO3aNW2sEiVK8OWXXxIQEMCIESP01jNy5Ej27NnDunXr2L59O35+fpw8eTJN71VERAT16tXDwcGBffv2ceDAARwcHGjSpIlOT/yuXbu4dOkSO3bs4N9//01Sj1KK5s2b8+jRIzZv3szJkycpX748DRo0ICgoCICuXbuSO3dujh8/zsmTJ/nf//6HpaWl3rzi4+Np06YN5ubmHDlyhN9++42vv/76ja9n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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from matplotlib import pyplot as plt\n", + "\n", + "\n", + "%matplotlib inline\n", + "\n", + "plt.rcParams.update({\"font.size\": 14})\n", + "\n", + "algo_labels = {\n", + " \"rand\": \"Random Exploration\",\n", + " \"EUBO-LLM\": \"EUBO-LLM\",\n", + " \"EUBO\": \"EUBO\", \n", + "}\n", + "\n", + "\n", + "def ci(y):\n", + " return 1.96 * y.std(axis=0) / np.sqrt(y.shape[0])\n", + "\n", + "\n", + "# the utility function is maximized at the full vector of 1\n", + "#optimal_val = utility(torch.tensor([[1] * dim])).item()\n", + "iters = list(range(NUM_BATCHES + 1))\n", + "\n", + "fig, ax = plt.subplots(1, 1, figsize=(8, 6))\n", + "# plot the optimal value\n", + "#ax.plot(\n", + "# iters,\n", + "# [optimal_val] * len(iters),\n", + "# label=\"Optimal Function Value\",\n", + "# color=\"black\",\n", + "## linewidth=1.5,\n", + "#)\n", + "\n", + "# plot the the best observed value from each algorithm\n", + "for algo in algos:\n", + " ys = np.vstack(best_vals[algo])\n", + " ax.errorbar(\n", + " iters, ys.mean(axis=0), yerr=ci(ys), label=algo_labels[algo], linewidth=1.5\n", + " )\n", + "\n", + "ax.set(\n", + " #xlabel=f\"Number of queries q = {q_eubo}, num_initial_comp = {q_comp}, num_initial_samp = {q_data})\",\n", + " ylabel=\"Best observed value\\nas evaluated in the synthetic utility function\",\n", + " title=f\"Obj 2: only maximising CO conversion\",\n", + ")\n", + "\n", + "ax.set_xticks(np.arange(0, NUM_BATCHES + 1, 1))\n", + "\n", + "ax.set_xlabel(f\"Number of queries q = {q_eubo}, num_initial_comp = {q_comp}, num_initial_samp = {q_data})\", fontsize=10) # Reducing the font size\n", + "ax.legend(loc=\"best\")\n", + "plt.savefig(\"comparison_first_case_2_corrected.png\",bbox_inches=\"tight\", dpi=400)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "47P-W6iDOiHp" + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python [conda env:botorch_mar2024]", + "language": "python", + "name": "conda-env-botorch_mar2024-py" + }, + "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.11.0" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/data/preferentialBO_llm_multiplot_correction_case_3.ipynb b/data/preferentialBO_llm_multiplot_correction_case_3.ipynb index 227a01a..54da3a5 100644 --- a/data/preferentialBO_llm_multiplot_correction_case_3.ipynb +++ b/data/preferentialBO_llm_multiplot_correction_case_3.ipynb @@ -9,7 +9,8 @@ "#change utility3 by the corresponding number, get back utility 3\n", "#change prompt\n", "#change pickle filename\n", - "#change plot name" + "#change plot name\n", + "#change objective name" ] }, {