diff --git a/.DS_Store b/.DS_Store
index ec5750e..104adcb 100644
Binary files a/.DS_Store and b/.DS_Store differ
diff --git a/README.md b/README.md
index 284f030..eea3262 100644
--- a/README.md
+++ b/README.md
@@ -1,17 +1,9 @@
-[![Open in Codespaces](https://classroom.github.com/assets/launch-codespace-7f7980b617ed060a017424585567c406b6ee15c891e84e1186181d67ecf80aa0.svg)](https://classroom.github.com/open-in-codespaces?assignment_repo_id=14516443)
-# Intro to GitHub Classroom
-This example project is written in Python, and tested with [pytest](https://www.python.org/).
+# Introduction
+This project will focus on trying to simulate the decision-making of a human researcher using a Bayesian Optimization framework, then comparing the performance across different, improved hyperparameters. By exploring these differences, this project aims to understand the strengths and weaknesses of Bayesian Optimization relative to the decision-making of a researcher with access to the same data.
-## The assignment
+We will look at three hyperparameters that can be used to define the differences between a researcher and regular Bayesian Optimization: the number of features that can be processed, the degree of exploration vs exploitation, and the interpretability/complexity of the surrogate model.
-The test in [`hello_test.py`](hello_test.py) is failing right now because the function in [`hello.py`](hello.py) isn't outputting the correct string. Fix this function and run the `pytest` command in the terminal to make the tests green.
+# Usage
+Please run `BOv4.ipynb` to run the Bayesian Optimization over one set of hyperparameters. Once all hyperparameters have been run, please use `01-eda.ipynb` to plot the results.
-Next, open the "Source Control" button on the left sidebar, write a commit message, and commit and push your changes to GitHub.
-
-![](commit-and-push.gif)
-
-After committing and pushing your changes, the autograder will run your tests and give you a grade. To check your autograded scores, click on the GitHub Actions extension on the left sidebar, click the refresh button at the top-right corner of the sidebar, hover over the latest workflow run, and click the globe icon 🌐. Next, click the "Autograding" job button, click the dropdown for the "Run education/autograding" step, and scroll down to see your grade.
-
-![](github-actions-extension.gif)
-
-▶️ If you get stuck, refer to [the walkthrough video](https://github.com/AC-Classroom/intro-github-classroom/assets/45469701/93760bf7-0d27-49dc-8f66-7d50d428677f).
\ No newline at end of file
+Muckley, E. S., Saal, J. E., Meredig, B., Roper, C. S., Martin, J. H. (2023) Interpretable models for extrapolation in scientific in machine learning. Digital Discovery, 2023, 2, 1425
\ No newline at end of file
diff --git a/src/.DS_Store b/src/.DS_Store
index 5008ddf..689bcc4 100644
Binary files a/src/.DS_Store and b/src/.DS_Store differ
diff --git a/src/.ipynb_checkpoints/BOv4-checkpoint.ipynb b/src/.ipynb_checkpoints/BOv4-checkpoint.ipynb
new file mode 100644
index 0000000..c1da71a
--- /dev/null
+++ b/src/.ipynb_checkpoints/BOv4-checkpoint.ipynb
@@ -0,0 +1 @@
+{"cells":[{"cell_type":"code","execution_count":544,"id":"e8bb4295","metadata":{},"outputs":[],"source":["import numpy as np\n","import math\n","import pandas as pd\n","import os\n","import pickle\n","from sklearn import preprocessing\n","import random\n","from scipy.stats import norm\n","import time\n","from sklearn.ensemble import RandomForestRegressor, BaggingRegressor\n","from sklearn.linear_model import LinearRegression\n","import copy\n","from itertools import product\n","import seaborn as sns\n","import matplotlib.pyplot as plt\n","\n","\n","# TO DO: Instructions\n","# from matminer.featurizers.conversions import StrToComposition\n","# from matminer.featurizers.composition import ElementProperty, AtomicOrbitals, BandCenter"]},{"cell_type":"markdown","id":"160e55f5-b540-4717-912a-a1731658149f","metadata":{"id":"160e55f5-b540-4717-912a-a1731658149f"},"source":["# Process Data Functions"]},{"cell_type":"code","execution_count":545,"id":"2726d963-5e53-4841-a1a6-5fbe63e7c1a4","metadata":{"id":"2726d963-5e53-4841-a1a6-5fbe63e7c1a4"},"outputs":[],"source":["# def featurize(df, formula_col='formula', pbar=False, n_jobs=None, n_chunksize=None):\n","# \"\"\"\n","# Extract magpie feature set from formula\n","# \"\"\"\n","# starttime = time.time()\n","# if formula_col not in list(df):\n","# raise KeyError(f\"Data does not contain {formula_col} column\")\n","# print(\"Featurizing dataset...\")\n","\n","# if n_jobs:\n","# stc.set_n_jobs(n_jobs)\n","\n","# stc = StrToComposition()\n","\n","# feat = stc.featurize_dataframe(df, formula_col, ignore_errors=True, pbar=pbar)\n","# element_property = ElementProperty.from_preset(preset_name='magpie')\n","# for f in [element_property, BandCenter(), AtomicOrbitals()]:\n","# if n_jobs:\n","# f.set_n_jobs(n_jobs)\n","# if n_chunksize:\n","# f.set_chunksize(n_chunksize)\n","# feat = f.featurize_dataframe(feat, \"composition\", pbar=pbar, ignore_errors=True)\n","\n","# feat = feat.set_index(feat[formula_col])\n","# print(f\"Featurization time: {round((time.time() - starttime) / 60, 2)} min\")\n","# return feat\n","\n","\n","def get_identical_cols(df):\n"," \"\"\"\n"," Get the columns of a dataframe which have identical values.\n"," \"\"\"\n"," xx = {}\n"," for c in df:\n"," vals1 = list(df[c])\n"," for c2 in df:\n"," vals2 = list(df[c2])\n"," # if the columns contain identical values\n"," if c != c2 and vals1 == vals2:\n"," # if these values have not been seen before\n"," if vals1 not in [list(df[y]) for y in xx]:\n"," xx[c] = [c2]\n"," # if these values have been seen before\n"," else:\n"," y = [yy for yy in xx if list(df[yy]) == vals1][0]\n"," if c2 != y and c2 not in xx[y]:\n"," xx[y].append(c2)\n"," return xx\n","\n","\n","def process_dataset(df, target):\n"," \"\"\"\n"," Clean dataset and extract magpie features if formula is provided\n"," \"\"\"\n"," # drop extreme outlier rows?\n","\n"," # featurize magpie datasets\n"," # if 'formula' in df.columns:\n"," # df = featurize(df)\n","\n"," # remove non-numeric columns\n"," df = df[[c for c in df if pd.api.types.is_numeric_dtype(df[c])]]\n"," # remove columns with not many unique values?\n","\n"," # remove constant columns\n"," df = df.loc[:, (df != df.iloc[0]).any()]\n","\n"," # change all infinite values to nan\n"," df = df.replace([np.inf, -np.inf], np.nan)\n","\n"," # remove rows containing a nan\n"," df = df.dropna()\n","\n"," # remove columns with identical values\n"," remove_cols = [v0 for _, v in get_identical_cols(df).items() for v0 in v]\n"," df = df[[c for c in df if c not in remove_cols]]\n","\n"," # for some datasets, each input feature x could have been evaluated more than once.\n"," # take average\n"," features = set(df.columns)\n"," features.remove(target)\n"," df = df.groupby(list(features))[target].agg(lambda x: x.unique().mean())\n"," df = (df.to_frame()).reset_index()\n"," return df"]},{"cell_type":"markdown","id":"373aadf9-1e35-4193-82ad-11696c70c623","metadata":{"id":"373aadf9-1e35-4193-82ad-11696c70c623"},"source":["# Feature Engineering Functions"]},{"cell_type":"code","execution_count":546,"id":"c8f90cdf-bc5a-4a4e-b3d1-6045bea83fb7","metadata":{"id":"c8f90cdf-bc5a-4a4e-b3d1-6045bea83fb7"},"outputs":[],"source":["def array_is_constant(arr: list) -> np.array:\n"," \"\"\"Check if a 1D array is constant\"\"\"\n"," return np.allclose(arr, np.repeat(arr[0], len(arr)))\n","\n","\n","def add_additional_cols(\n"," df: pd.DataFrame,\n"," ignore: list = [],\n"," nat_log: bool = True,\n"," powers: list = [-4, -3, -2, -1, -0.5, -0.333, -0.25, 0.25, 0.33, 0.5, 2, 3, 4],\n",") -> pd.DataFrame:\n"," \"\"\"\n"," Add additional columns to a dataframe by executing\n"," mathematical operations on existing columns.\n"," \"\"\"\n"," # now raise existing columns to varying powers\n"," new_col_names = []\n"," new_vals_all = np.empty((len(df), 0))\n","\n"," # loop over each column to use for creating additional columns\n"," for c in [cc for cc in df if cc not in ignore]:\n","\n"," # get original column values\n"," vv = df[c].values\n","\n"," # raise existing columns to various powers\n"," for p in powers:\n"," # first assess mathematical viability of different conditions.\n"," # for example, we can't perform (-2)^(1/2).\n"," # if conditions are met, save new column\n"," if any(\n"," [\n"," p > 0 and isinstance(p, int), # pos integer powers\n"," p < 0 and isinstance(p, int) and 0 not in vv, # neg integer powers\n"," p > 0\n"," and not isinstance(p, int)\n"," and np.all(vv >= 0), # pos non-int powers\n"," p < 0\n"," and not isinstance(p, int)\n"," and np.all(vv > 0), # neg non-int powers\n"," ]\n"," ):\n","\n"," new_col_vals = np.float_power(vv, p).reshape((-1, 1))\n"," if (\n"," not array_is_constant(new_col_vals)\n"," and np.isfinite(new_col_vals).all()\n"," ):\n"," new_vals_all = np.hstack((new_vals_all, new_col_vals))\n"," new_col_names.append(f\"{c}**{str(p)}\")\n","\n"," # take natural logs of existing columns\n"," if nat_log:\n"," if not c.startswith(\"ln \") and np.all(vv > 0):\n"," new_col_vals = np.log(vv).reshape((-1, 1))\n"," if (\n"," not array_is_constant(new_col_vals)\n"," and np.isfinite(new_col_vals).all()\n"," ):\n"," new_vals_all = np.hstack((new_vals_all, new_col_vals))\n"," new_col_names.append(f\"{c}**ln\")\n","\n"," # combine new columns with original columns in a single dataframe\n"," new_df = pd.DataFrame(data=new_vals_all, columns=new_col_names, index=df.index)\n"," df = pd.concat([df, new_df], axis=1)\n"," return df\n","\n","\n","def find_top_n_features(df, original_features, target, n):\n"," \"\"\"\n"," Finds the top n features of the dataset according to how well they fit\n"," to a quadratic polynomial.\n","\n"," Note: A diversity criteria has been enforced to prevent the top features\n"," being powers of the same feature when adding additional columns (ie. we are\n"," trying to prevent the case where the top features are: [temp, temp**2, temp**3...])\n"," \"\"\"\n"," # obtain a list of all features\n"," features = set(df.columns)\n"," features.remove(target)\n"," features = list(features)\n","\n"," # create dictionary where the keys are the original features and the values\n"," # are a list of tuples of the form: (r2, features based on original feature)\n"," # eg. {'temp': [(0.9, temp), (0.87, temp**2), (0.95, temp**3)...]}\n"," unsorted_features = {f: [] for f in original_features}\n"," for col in features:\n"," # find how well the feature fits to the target using a quadratic polynomial\n"," fit = np.polyfit(df[col], df[target], 2, full=True)\n"," ssr = fit[1] # sum of squared residuals\n"," sst = np.sum((df[target] - df[target].mean())**2) # total sum of squares\n","\n"," # if ssr is 0, numpy will return a blank list\n"," if len(ssr) == 0:\n"," # if the number of unique values is less than 4, the fit will always\n"," # be perfect. Therefore, set ssr to sst and force r2 to be 0\n"," if len(df[col].unique()) < 4:\n"," ssr = sst\n"," else:\n"," ssr = 0\n"," else:\n"," ssr = ssr[0]\n"," r2 = 1 - ssr / sst\n","\n"," original_col = col.split('**')[0]\n"," unsorted_features[original_col].append((r2, col))\n","\n"," # sort features based on r2 value\n"," # eg. {'temp': [(0.95, temp**3), (0.9, temp), (0.87, temp**2)...]}\n"," sorted_features = {\n"," f: sorted(unsorted_features[f])[::-1] for f in original_features\n"," }\n","\n"," # find top features while enforcing diversity criteria\n"," top_n = []\n"," for i in range(n):\n"," # create mini list of top \"diverse\" features\n"," # eg. [(0.98, temp**3), (0.95, theta**0.5), (0.99, t**3)...]\n"," top_i = []\n"," for original_col in sorted_features:\n"," if i < len(sorted_features[original_col]):\n"," top_i.append(sorted_features[original_col][i])\n","\n"," # sort mini list of top \"diverse\" features\n"," # eg. [(0.99, t**3), (0.98, temp**3), (0.95, theta**0.5)...]\n"," top_i = sorted(top_i)[::-1]\n"," for j in top_i:\n"," top_n.append(j[1])\n"," if len(top_n) >= n:\n"," break\n"," # once n features have been found, break out of loop\n"," if len(top_n) >= n:\n"," break\n","\n"," return top_n"]},{"cell_type":"markdown","id":"2f5ec23b-d139-4228-a317-f1164acb760a","metadata":{"id":"2f5ec23b-d139-4228-a317-f1164acb760a"},"source":["# Predicting Functions"]},{"cell_type":"code","execution_count":547,"id":"c2f4ae6b-d46d-4844-8b14-11ac735fce26","metadata":{"id":"c2f4ae6b-d46d-4844-8b14-11ac735fce26"},"outputs":[],"source":["def RF_pred(X, RF_model):\n"," tree_predictions = []\n"," for j in np.arange(n_est):\n"," tree_predictions.append((RF_model.estimators_[j].predict(np.array([X]))).tolist())\n"," mean = np.mean(np.array(tree_predictions), axis=0)[0]\n","\n","\n"," std = np.std(np.array(tree_predictions), axis=0)[0]\n"," return mean, std"]},{"cell_type":"markdown","id":"95f37ac9-922a-42f0-8ea1-e586b74dd00f","metadata":{"id":"95f37ac9-922a-42f0-8ea1-e586b74dd00f"},"source":["# Acquisition Functions"]},{"cell_type":"code","execution_count":548,"id":"ad7cf7a1-edd0-4a93-b237-97468585f09d","metadata":{"id":"ad7cf7a1-edd0-4a93-b237-97468585f09d"},"outputs":[],"source":["def EI(mean, std, y_best, ratio):\n"," std = ratio * std\n","\n"," z = (y_best - mean)/std\n"," return (y_best - mean) * norm.cdf(z) + std * norm.pdf(z)"]},{"cell_type":"markdown","id":"b764198e-213d-4240-9093-bf042c6b7745","metadata":{"id":"b764198e-213d-4240-9093-bf042c6b7745"},"source":["# Set up Combinations"]},{"cell_type":"code","execution_count":549,"id":"09db2514-2f0c-4341-b4b6-87f10610b77c","metadata":{"id":"09db2514-2f0c-4341-b4b6-87f10610b77c"},"outputs":[],"source":["datasets = ['double_perovskites_gap.csv', 'concrete.csv', 'concrete_mod.csv'] # delete datasets you won't use\n","n_features = [3, 8, 20]\n","acq_func = [0.01, 1, 1.5]\n","model = ['Linear', 'RF']"]},{"cell_type":"code","execution_count":550,"id":"c6aacbd9-716d-4877-a750-afbd72c0406c","metadata":{"id":"c6aacbd9-716d-4877-a750-afbd72c0406c"},"outputs":[],"source":["hyperparameter_combinations = list(product(datasets, n_features, acq_func, model)) # find all combination of hyperparameters\n","\n","# put combos into dictionary for easier searching\n","all_combos = []\n","for combo in hyperparameter_combinations:\n"," all_combos.append({\n"," 'dataset': combo[0],\n"," 'n_features': combo[1],\n"," 'acq_func': combo[2],\n"," 'model': combo[3]\n"," })"]},{"cell_type":"markdown","id":"5677fefb-1895-4afc-84e5-c724742064b7","metadata":{"id":"5677fefb-1895-4afc-84e5-c724742064b7"},"source":["# Pick Combo to Look At"]},{"cell_type":"code","execution_count":551,"id":"30888f77-d8fc-4052-a540-37c4b60d0f58","metadata":{"id":"30888f77-d8fc-4052-a540-37c4b60d0f58","outputId":"830343a5-fb11-4085-b2d8-a0167b11907c"},"outputs":[{"data":{"text/plain":["{'dataset': 'Crossed barrel_dataset.csv',\n"," 'n_features': 3,\n"," 'acq_func': 0.01,\n"," 'model': 'Linear'}"]},"execution_count":551,"metadata":{},"output_type":"execute_result"}],"source":["n = 0\n","combo = all_combos[n]\n","combo"]},{"cell_type":"markdown","id":"21fed3c0-922a-44cd-a003-bb3a666baa12","metadata":{"id":"21fed3c0-922a-44cd-a003-bb3a666baa12"},"source":["# Read and Process Dataset"]},{"cell_type":"code","execution_count":552,"id":"780a907f-7ca1-486f-84f5-7429f428eba0","metadata":{"id":"780a907f-7ca1-486f-84f5-7429f428eba0","outputId":"cc3e63ae-9f95-48e7-b039-469705b8fe51"},"outputs":[{"data":{"text/html":["
\n","\n","
\n"," \n"," \n"," \n"," n \n"," theta \n"," r \n"," t \n"," toughness \n"," \n"," \n"," \n"," \n"," 0 \n"," 6 \n"," 0 \n"," 1.5 \n"," 0.70 \n"," 1.144667 \n"," \n"," \n"," 1 \n"," 6 \n"," 0 \n"," 1.5 \n"," 1.05 \n"," 1.607561 \n"," \n"," \n"," 2 \n"," 6 \n"," 0 \n"," 1.5 \n"," 1.40 \n"," 1.144338 \n"," \n"," \n"," 3 \n"," 6 \n"," 0 \n"," 1.7 \n"," 0.70 \n"," 3.642738 \n"," \n"," \n"," 4 \n"," 6 \n"," 0 \n"," 1.7 \n"," 1.05 \n"," 3.748405 \n"," \n"," \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," \n"," \n"," 1795 \n"," 12 \n"," 200 \n"," 2.3 \n"," 1.05 \n"," 1.358975 \n"," \n"," \n"," 1796 \n"," 12 \n"," 200 \n"," 2.3 \n"," 1.40 \n"," 3.196306 \n"," \n"," \n"," 1797 \n"," 12 \n"," 200 \n"," 2.5 \n"," 0.70 \n"," 36.104187 \n"," \n"," \n"," 1798 \n"," 12 \n"," 200 \n"," 2.5 \n"," 1.05 \n"," 1.313487 \n"," \n"," \n"," 1799 \n"," 12 \n"," 200 \n"," 2.5 \n"," 1.40 \n"," 1.069728 \n"," \n"," \n","
\n","
1800 rows × 5 columns
\n","
"],"text/plain":[" n theta r t toughness\n","0 6 0 1.5 0.70 1.144667\n","1 6 0 1.5 1.05 1.607561\n","2 6 0 1.5 1.40 1.144338\n","3 6 0 1.7 0.70 3.642738\n","4 6 0 1.7 1.05 3.748405\n","... .. ... ... ... ...\n","1795 12 200 2.3 1.05 1.358975\n","1796 12 200 2.3 1.40 3.196306\n","1797 12 200 2.5 0.70 36.104187\n","1798 12 200 2.5 1.05 1.313487\n","1799 12 200 2.5 1.40 1.069728\n","\n","[1800 rows x 5 columns]"]},"execution_count":552,"metadata":{},"output_type":"execute_result"}],"source":["# load a dataset\n","raw = pd.read_csv(f'../{combo['dataset']}')\n","raw"]},{"cell_type":"code","execution_count":553,"id":"d1f5960d-2e3f-411c-8e49-c94eddbfb522","metadata":{"id":"d1f5960d-2e3f-411c-8e49-c94eddbfb522","outputId":"0b48f59b-7678-4b19-e2e9-3e89d5faaad4"},"outputs":[{"data":{"text/plain":["'toughness'"]},"execution_count":553,"metadata":{},"output_type":"execute_result"}],"source":["# define target\n","objective_name = list(raw.columns)[-1]\n","objective_name"]},{"cell_type":"code","execution_count":554,"id":"90fe8f74-3752-4c00-8666-af491fedae6a","metadata":{"id":"90fe8f74-3752-4c00-8666-af491fedae6a","outputId":"01bd090c-6e92-4cb8-e05b-82e5923f7f94"},"outputs":[{"data":{"text/html":["\n","\n","
\n"," \n"," \n"," \n"," t \n"," r \n"," theta \n"," n \n"," toughness \n"," \n"," \n"," \n"," \n"," 0 \n"," 0.7 \n"," 1.5 \n"," 0 \n"," 6 \n"," 1.135453 \n"," \n"," \n"," 1 \n"," 0.7 \n"," 1.5 \n"," 0 \n"," 8 \n"," 1.970165 \n"," \n"," \n"," 2 \n"," 0.7 \n"," 1.5 \n"," 0 \n"," 10 \n"," 2.514642 \n"," \n"," \n"," 3 \n"," 0.7 \n"," 1.5 \n"," 0 \n"," 12 \n"," 2.581751 \n"," \n"," \n"," 4 \n"," 0.7 \n"," 1.5 \n"," 50 \n"," 6 \n"," 0.665487 \n"," \n"," \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," \n"," \n"," 595 \n"," 1.4 \n"," 2.5 \n"," 150 \n"," 12 \n"," 1.493588 \n"," \n"," \n"," 596 \n"," 1.4 \n"," 2.5 \n"," 200 \n"," 6 \n"," 20.968543 \n"," \n"," \n"," 597 \n"," 1.4 \n"," 2.5 \n"," 200 \n"," 8 \n"," 14.529138 \n"," \n"," \n"," 598 \n"," 1.4 \n"," 2.5 \n"," 200 \n"," 10 \n"," 2.154458 \n"," \n"," \n"," 599 \n"," 1.4 \n"," 2.5 \n"," 200 \n"," 12 \n"," 1.337742 \n"," \n"," \n","
\n","
600 rows × 5 columns
\n","
"],"text/plain":[" t r theta n toughness\n","0 0.7 1.5 0 6 1.135453\n","1 0.7 1.5 0 8 1.970165\n","2 0.7 1.5 0 10 2.514642\n","3 0.7 1.5 0 12 2.581751\n","4 0.7 1.5 50 6 0.665487\n",".. ... ... ... .. ...\n","595 1.4 2.5 150 12 1.493588\n","596 1.4 2.5 200 6 20.968543\n","597 1.4 2.5 200 8 14.529138\n","598 1.4 2.5 200 10 2.154458\n","599 1.4 2.5 200 12 1.337742\n","\n","[600 rows x 5 columns]"]},"execution_count":554,"metadata":{},"output_type":"execute_result"}],"source":["# process dataset\n","processed = process_dataset(raw, objective_name)\n","processed"]},{"cell_type":"code","execution_count":555,"id":"53bd0354-1c53-4b8f-ba01-cab5a4f07de6","metadata":{"id":"53bd0354-1c53-4b8f-ba01-cab5a4f07de6","outputId":"15a6b5a1-a3be-44c5-d350-190764a75b2a"},"outputs":[{"data":{"text/plain":["['t', 'r', 'theta', 'n']"]},"execution_count":555,"metadata":{},"output_type":"execute_result"}],"source":["features = set(processed.columns)\n","features.remove(objective_name)\n","feature_name = list(features)\n","feature_name"]},{"cell_type":"code","execution_count":556,"id":"0937fe11-6d1c-4e04-9d8a-b9995099a74c","metadata":{"id":"0937fe11-6d1c-4e04-9d8a-b9995099a74c","outputId":"11b411fc-5d28-4312-9e87-57276d9d1204"},"outputs":[{"data":{"text/html":["\n","\n","
\n"," \n"," \n"," \n"," t \n"," r \n"," theta \n"," n \n"," toughness \n"," \n"," \n"," \n"," \n"," 0 \n"," 0.7 \n"," 1.5 \n"," 0 \n"," 6 \n"," -1.135453 \n"," \n"," \n"," 1 \n"," 0.7 \n"," 1.5 \n"," 0 \n"," 8 \n"," -1.970165 \n"," \n"," \n"," 2 \n"," 0.7 \n"," 1.5 \n"," 0 \n"," 10 \n"," -2.514642 \n"," \n"," \n"," 3 \n"," 0.7 \n"," 1.5 \n"," 0 \n"," 12 \n"," -2.581751 \n"," \n"," \n"," 4 \n"," 0.7 \n"," 1.5 \n"," 50 \n"," 6 \n"," -0.665487 \n"," \n"," \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," \n"," \n"," 595 \n"," 1.4 \n"," 2.5 \n"," 150 \n"," 12 \n"," -1.493588 \n"," \n"," \n"," 596 \n"," 1.4 \n"," 2.5 \n"," 200 \n"," 6 \n"," -20.968543 \n"," \n"," \n"," 597 \n"," 1.4 \n"," 2.5 \n"," 200 \n"," 8 \n"," -14.529138 \n"," \n"," \n"," 598 \n"," 1.4 \n"," 2.5 \n"," 200 \n"," 10 \n"," -2.154458 \n"," \n"," \n"," 599 \n"," 1.4 \n"," 2.5 \n"," 200 \n"," 12 \n"," -1.337742 \n"," \n"," \n","
\n","
600 rows × 5 columns
\n","
"],"text/plain":[" t r theta n toughness\n","0 0.7 1.5 0 6 -1.135453\n","1 0.7 1.5 0 8 -1.970165\n","2 0.7 1.5 0 10 -2.514642\n","3 0.7 1.5 0 12 -2.581751\n","4 0.7 1.5 50 6 -0.665487\n",".. ... ... ... .. ...\n","595 1.4 2.5 150 12 -1.493588\n","596 1.4 2.5 200 6 -20.968543\n","597 1.4 2.5 200 8 -14.529138\n","598 1.4 2.5 200 10 -2.154458\n","599 1.4 2.5 200 12 -1.337742\n","\n","[600 rows x 5 columns]"]},"execution_count":556,"metadata":{},"output_type":"execute_result"}],"source":["# we add negative sign to all of its objective values here\n","# because default BO in the framework below aims for global minimization\n","df = copy.deepcopy(processed)\n","df[objective_name] = -processed[objective_name].values\n","df"]},{"cell_type":"markdown","id":"b430f3f6-6531-462b-a2a9-cf95a28a91c1","metadata":{"id":"b430f3f6-6531-462b-a2a9-cf95a28a91c1"},"source":["# Engineer New Features, Then Select Top n Features"]},{"cell_type":"code","execution_count":557,"id":"3029abb7-1a43-4426-8012-deedeaf7d349","metadata":{"id":"3029abb7-1a43-4426-8012-deedeaf7d349","outputId":"99853349-b65a-4a58-ad38-967277edbf05"},"outputs":[{"data":{"text/plain":["['theta**2', 'r**4', 'n**2']"]},"execution_count":557,"metadata":{},"output_type":"execute_result"}],"source":["df = add_additional_cols(df, ignore=[objective_name])\n","top_n_features = find_top_n_features(df, feature_name, objective_name, combo['n_features'])\n","top_n_features"]},{"cell_type":"markdown","id":"b93ec941-d0bf-4835-a867-0dc9074ca152","metadata":{"id":"b93ec941-d0bf-4835-a867-0dc9074ca152"},"source":["# Limit Number of Rows for Speed"]},{"cell_type":"code","execution_count":558,"id":"72af6006-e990-4456-8882-0311b8d5e0eb","metadata":{"id":"72af6006-e990-4456-8882-0311b8d5e0eb","outputId":"79bb8cc5-2a9f-4118-ab6f-0f0c1da71868"},"outputs":[{"data":{"text/html":["\n","\n","
\n"," \n"," \n"," \n"," index \n"," t \n"," r \n"," theta \n"," n \n"," toughness \n"," t**-4 \n"," t**-3 \n"," t**-2 \n"," t**-1 \n"," ... \n"," n**-0.5 \n"," n**-0.333 \n"," n**-0.25 \n"," n**0.25 \n"," n**0.33 \n"," n**0.5 \n"," n**2 \n"," n**3 \n"," n**4 \n"," n**ln \n"," \n"," \n"," \n"," \n"," 0 \n"," 0 \n"," 0.7 \n"," 1.5 \n"," 0 \n"," 6 \n"," -1.135453 \n"," 4.164931 \n"," 2.915452 \n"," 2.040816 \n"," 1.428571 \n"," ... \n"," 0.408248 \n"," 0.550650 \n"," 0.638943 \n"," 1.565085 \n"," 1.806300 \n"," 2.449490 \n"," 36.0 \n"," 216.0 \n"," 1296.0 \n"," 1.791759 \n"," \n"," \n"," 1 \n"," 3 \n"," 0.7 \n"," 1.5 \n"," 0 \n"," 12 \n"," -2.581751 \n"," 4.164931 \n"," 2.915452 \n"," 2.040816 \n"," 1.428571 \n"," ... \n"," 0.288675 \n"," 0.437152 \n"," 0.537285 \n"," 1.861210 \n"," 2.270543 \n"," 3.464102 \n"," 144.0 \n"," 1728.0 \n"," 20736.0 \n"," 2.484907 \n"," \n"," \n"," 2 \n"," 9 \n"," 0.7 \n"," 1.5 \n"," 100 \n"," 8 \n"," -1.176839 \n"," 4.164931 \n"," 2.915452 \n"," 2.040816 \n"," 1.428571 \n"," ... \n"," 0.353553 \n"," 0.500347 \n"," 0.594604 \n"," 1.681793 \n"," 1.986185 \n"," 2.828427 \n"," 64.0 \n"," 512.0 \n"," 4096.0 \n"," 2.079442 \n"," \n"," \n"," 3 \n"," 13 \n"," 0.7 \n"," 1.5 \n"," 150 \n"," 8 \n"," -15.097205 \n"," 4.164931 \n"," 2.915452 \n"," 2.040816 \n"," 1.428571 \n"," ... \n"," 0.353553 \n"," 0.500347 \n"," 0.594604 \n"," 1.681793 \n"," 1.986185 \n"," 2.828427 \n"," 64.0 \n"," 512.0 \n"," 4096.0 \n"," 2.079442 \n"," \n"," \n"," 4 \n"," 17 \n"," 0.7 \n"," 1.5 \n"," 200 \n"," 8 \n"," -19.157394 \n"," 4.164931 \n"," 2.915452 \n"," 2.040816 \n"," 1.428571 \n"," ... \n"," 0.353553 \n"," 0.500347 \n"," 0.594604 \n"," 1.681793 \n"," 1.986185 \n"," 2.828427 \n"," 64.0 \n"," 512.0 \n"," 4096.0 \n"," 2.079442 \n"," \n"," \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," \n"," \n"," 95 \n"," 582 \n"," 1.4 \n"," 2.5 \n"," 0 \n"," 10 \n"," -1.269999 \n"," 0.260308 \n"," 0.364431 \n"," 0.510204 \n"," 0.714286 \n"," ... \n"," 0.316228 \n"," 0.464515 \n"," 0.562341 \n"," 1.778279 \n"," 2.137962 \n"," 3.162278 \n"," 100.0 \n"," 1000.0 \n"," 10000.0 \n"," 2.302585 \n"," \n"," \n"," 96 \n"," 585 \n"," 1.4 \n"," 2.5 \n"," 50 \n"," 8 \n"," -1.892805 \n"," 0.260308 \n"," 0.364431 \n"," 0.510204 \n"," 0.714286 \n"," ... \n"," 0.353553 \n"," 0.500347 \n"," 0.594604 \n"," 1.681793 \n"," 1.986185 \n"," 2.828427 \n"," 64.0 \n"," 512.0 \n"," 4096.0 \n"," 2.079442 \n"," \n"," \n"," 97 \n"," 588 \n"," 1.4 \n"," 2.5 \n"," 100 \n"," 6 \n"," -21.595643 \n"," 0.260308 \n"," 0.364431 \n"," 0.510204 \n"," 0.714286 \n"," ... \n"," 0.408248 \n"," 0.550650 \n"," 0.638943 \n"," 1.565085 \n"," 1.806300 \n"," 2.449490 \n"," 36.0 \n"," 216.0 \n"," 1296.0 \n"," 1.791759 \n"," \n"," \n"," 98 \n"," 591 \n"," 1.4 \n"," 2.5 \n"," 100 \n"," 12 \n"," -1.550937 \n"," 0.260308 \n"," 0.364431 \n"," 0.510204 \n"," 0.714286 \n"," ... \n"," 0.288675 \n"," 0.437152 \n"," 0.537285 \n"," 1.861210 \n"," 2.270543 \n"," 3.464102 \n"," 144.0 \n"," 1728.0 \n"," 20736.0 \n"," 2.484907 \n"," \n"," \n"," 99 \n"," 592 \n"," 1.4 \n"," 2.5 \n"," 150 \n"," 6 \n"," -18.217728 \n"," 0.260308 \n"," 0.364431 \n"," 0.510204 \n"," 0.714286 \n"," ... \n"," 0.408248 \n"," 0.550650 \n"," 0.638943 \n"," 1.565085 \n"," 1.806300 \n"," 2.449490 \n"," 36.0 \n"," 216.0 \n"," 1296.0 \n"," 1.791759 \n"," \n"," \n","
\n","
100 rows × 54 columns
\n","
"],"text/plain":[" index t r theta n toughness t**-4 t**-3 t**-2 \\\n","0 0 0.7 1.5 0 6 -1.135453 4.164931 2.915452 2.040816 \n","1 3 0.7 1.5 0 12 -2.581751 4.164931 2.915452 2.040816 \n","2 9 0.7 1.5 100 8 -1.176839 4.164931 2.915452 2.040816 \n","3 13 0.7 1.5 150 8 -15.097205 4.164931 2.915452 2.040816 \n","4 17 0.7 1.5 200 8 -19.157394 4.164931 2.915452 2.040816 \n",".. ... ... ... ... .. ... ... ... ... \n","95 582 1.4 2.5 0 10 -1.269999 0.260308 0.364431 0.510204 \n","96 585 1.4 2.5 50 8 -1.892805 0.260308 0.364431 0.510204 \n","97 588 1.4 2.5 100 6 -21.595643 0.260308 0.364431 0.510204 \n","98 591 1.4 2.5 100 12 -1.550937 0.260308 0.364431 0.510204 \n","99 592 1.4 2.5 150 6 -18.217728 0.260308 0.364431 0.510204 \n","\n"," t**-1 ... n**-0.5 n**-0.333 n**-0.25 n**0.25 n**0.33 \\\n","0 1.428571 ... 0.408248 0.550650 0.638943 1.565085 1.806300 \n","1 1.428571 ... 0.288675 0.437152 0.537285 1.861210 2.270543 \n","2 1.428571 ... 0.353553 0.500347 0.594604 1.681793 1.986185 \n","3 1.428571 ... 0.353553 0.500347 0.594604 1.681793 1.986185 \n","4 1.428571 ... 0.353553 0.500347 0.594604 1.681793 1.986185 \n",".. ... ... ... ... ... ... ... \n","95 0.714286 ... 0.316228 0.464515 0.562341 1.778279 2.137962 \n","96 0.714286 ... 0.353553 0.500347 0.594604 1.681793 1.986185 \n","97 0.714286 ... 0.408248 0.550650 0.638943 1.565085 1.806300 \n","98 0.714286 ... 0.288675 0.437152 0.537285 1.861210 2.270543 \n","99 0.714286 ... 0.408248 0.550650 0.638943 1.565085 1.806300 \n","\n"," n**0.5 n**2 n**3 n**4 n**ln \n","0 2.449490 36.0 216.0 1296.0 1.791759 \n","1 3.464102 144.0 1728.0 20736.0 2.484907 \n","2 2.828427 64.0 512.0 4096.0 2.079442 \n","3 2.828427 64.0 512.0 4096.0 2.079442 \n","4 2.828427 64.0 512.0 4096.0 2.079442 \n",".. ... ... ... ... ... \n","95 3.162278 100.0 1000.0 10000.0 2.302585 \n","96 2.828427 64.0 512.0 4096.0 2.079442 \n","97 2.449490 36.0 216.0 1296.0 1.791759 \n","98 3.464102 144.0 1728.0 20736.0 2.484907 \n","99 2.449490 36.0 216.0 1296.0 1.791759 \n","\n","[100 rows x 54 columns]"]},"execution_count":558,"metadata":{},"output_type":"execute_result"}],"source":["dataset_limit = 991\n","df = df.sample(dataset_limit, random_state=1).sort_index().reset_index()\n","df"]},{"cell_type":"markdown","id":"f19eed3f-002e-4540-9e30-98b75d439f98","metadata":{"id":"f19eed3f-002e-4540-9e30-98b75d439f98"},"source":["# Split into X and y datasets"]},{"cell_type":"code","execution_count":559,"id":"9172285c-5f8b-4487-9430-dcc44cdd8cce","metadata":{"id":"9172285c-5f8b-4487-9430-dcc44cdd8cce","outputId":"00f6fa69-48eb-42c8-f89c-e557a1bb352e"},"outputs":[{"name":"stdout","output_type":"stream","text":["100\n"]}],"source":["# these are the input feature x and objective value y used in framework\n","X_feature = df[top_n_features].values\n","\n","y = np.array(df[objective_name].values)\n","\n","assert len(df) == len(X_feature) == len(y)\n","\n","# total number of data in set\n","N = len(df)\n","print(N)"]},{"cell_type":"markdown","id":"ac428810-2c4d-48ea-950e-dbeca4a4c843","metadata":{"id":"ac428810-2c4d-48ea-950e-dbeca4a4c843"},"source":["# Specify Parameters of Framework"]},{"cell_type":"code","execution_count":560,"id":"8f8ea549-c2be-49fa-9f9f-afa774424ee6","metadata":{"id":"8f8ea549-c2be-49fa-9f9f-afa774424ee6"},"outputs":[],"source":["# here are some parameters of the framework, feel free to modify for your own purposes\n","\n","# number of ensembles. in the paper n_ensemble = 50.\n","n_ensemble = 5\n","# number of top candidates, currently using top 5% of total dataset size\n","n_top = int(math.ceil(len(y) * 0.05))\n","# the top candidates and their indicies\n","top_indices = list(df.sort_values(objective_name).head(n_top).index)\n","# number of initial experiments\n","n_initial = 10\n","\n","# random seeds used to distinguish between different ensembles\n","# there are 300 of them, but only first n_ensemble are used\n","seed_list = [4295, 8508, 326, 3135, 1549, 2528, 1274, 6545, 5971, 6269, 2422, 4287, 9320, 4932, 951, 4304, 1745, 5956, 7620, 4545, 6003, 9885, 5548, 9477, 30, 8992, 7559, 5034, 9071, 6437, 3389, 9816, 8617, 3712, 3626, 1660, 3309, 2427, 9872, 938, 5156, 7409, 7672, 3411, 3559, 9966, 7331, 8273, 8484, 5127, 2260, 6054, 5205, 311, 6056, 9456, 928, 6424, 7438, 8701, 8634, 4002, 6634, 8102, 8503, 1540, 9254, 7972, 7737, 3410, 4052, 8640, 9659, 8093, 7076, 7268, 2046, 7492, 3103, 3034, 7874, 5438, 4297, 291, 5436, 9021, 3711, 7837, 9188, 2036, 8013, 6188, 3734, 187, 1438, 1061, 674, 777, 7231, 7096, 3360, 4278, 5817, 5514, 3442, 6805, 6750, 8548, 9751, 3526, 9969, 8979, 1526, 1551, 2058, 6325, 1237, 5917, 5821, 9946, 5049, 654, 7750, 5149, 3545, 9165, 2837, 5621, 6501, 595, 3181, 1747, 4405, 4480, 4282, 9262, 6219, 3960, 4999, 1495, 6007, 9642, 3902, 3133, 1085, 3278, 1104, 5939, 7153, 971, 8733, 3785, 9056, 2020, 7249, 5021, 3384, 8740, 4593, 7869, 9941, 8813, 3688, 8139, 6436, 3742, 5503, 1587, 4766, 9846, 9117, 7001, 4853, 9346, 4927, 8480, 5298, 4753, 1151, 9768, 5405, 6196, 5721, 3419, 8090, 8166, 7834, 1480, 1150, 9002, 1134, 2237, 3995, 2029, 5336, 7050, 6857, 8794, 1754, 1184, 3558, 658, 6804, 8750, 5088, 1136, 626, 8462, 5203, 3196, 979, 7419, 1162, 5451, 6492, 1562, 8145, 8937, 8764, 4174, 7639, 8902, 7003, 765, 1554, 6135, 1689, 9530, 1398, 2273, 7925, 5948, 1036, 868, 4617, 1203, 7680, 7, 93, 3128, 5694, 6979, 7136, 8084, 5770, 9301, 1599, 737, 7018, 3774, 9843, 2296, 2287, 9875, 2349, 2469, 8941, 4973, 3798, 54, 2938, 4665, 3942, 3951, 9400, 3094, 2248, 3376, 1926, 5180, 1773, 3681, 1808, 350, 6669, 826, 539, 5313, 6193, 5752, 9370, 2782, 8399, 4881, 3166, 4906, 5829, 4827, 29, 6899, 9012, 6986, 4175, 1035, 8320, 7802, 3777, 6340, 7798, 7705]"]},{"cell_type":"markdown","id":"5ebeddf6-0a9a-4236-9af1-8c2acd91e781","metadata":{"id":"5ebeddf6-0a9a-4236-9af1-8c2acd91e781"},"source":["# Run Framework"]},{"cell_type":"code","execution_count":561,"id":"daaa81f5-36d1-47ba-ab28-9c67ad0c30bd","metadata":{"id":"daaa81f5-36d1-47ba-ab28-9c67ad0c30bd","outputId":"8826439c-7adc-4ca1-c7ae-361b1107079d"},"outputs":[{"name":"stdout","output_type":"stream","text":["initializing seed = 0\n","0\n","num top: 1\n","1\n","num top: 1\n","2\n"]},{"name":"stdout","output_type":"stream","text":["num top: 2\n","3\n","num top: 3\n","4\n","num top: 3\n","5\n","num top: 4\n","6\n","num top: 4\n","7\n","num top: 4\n","8\n","num top: 4\n","9\n","num top: 4\n","10\n","num top: 4\n","11\n","num top: 4\n","12\n","num top: 4\n","13\n","num top: 4\n","14\n","num top: 4\n","15\n","num top: 4\n","16\n","num top: 4\n","17\n","num top: 4\n","18\n","num top: 4\n","19\n","num top: 4\n","20\n","num top: 4\n","21\n","num top: 4\n","22\n","num top: 4\n","23\n","num top: 4\n","24\n","num top: 4\n","25\n","num top: 4\n","26\n","num top: 4\n","27\n","num top: 4\n","28\n","num top: 4\n","29\n","num top: 4\n","30\n","num top: 4\n","31\n","num top: 4\n","32\n","num top: 4\n","33\n","num top: 4\n","34\n","num top: 4\n","35\n","num top: 4\n","36\n","num top: 4\n","37\n","num top: 4\n","38\n","num top: 4\n","39\n","num top: 4\n","40\n","num top: 4\n","41\n","num top: 4\n","42\n","num top: 4\n","43\n","num top: 4\n","44\n","num top: 4\n","45\n","num top: 4\n","46\n","num top: 4\n","47\n","num top: 4\n","48\n","num top: 5\n","Finished seed\n","initializing seed = 1\n","0\n","num top: 2\n","1\n","num top: 2\n","2\n","num top: 3\n","3\n","num top: 3\n","4\n","num top: 4\n","5\n","num top: 4\n","6\n","num top: 4\n","7\n","num top: 4\n","8\n","num top: 4\n","9\n","num top: 4\n","10\n","num top: 4\n","11\n","num top: 4\n","12\n","num top: 4\n","13\n","num top: 4\n","14\n","num top: 4\n","15\n","num top: 4\n","16\n","num top: 4\n","17\n","num top: 4\n","18\n","num top: 4\n","19\n","num top: 4\n","20\n","num top: 4\n","21\n","num top: 4\n","22\n","num top: 4\n","23\n","num top: 4\n","24\n","num top: 4\n","25\n","num top: 4\n","26\n","num top: 4\n","27\n","num top: 4\n","28\n","num top: 4\n","29\n","num top: 4\n","30\n","num top: 4\n","31\n","num top: 4\n","32\n","num top: 4\n","33\n","num top: 4\n","34\n","num top: 4\n","35\n","num top: 4\n","36\n","num top: 4\n","37\n","num top: 4\n","38\n","num top: 4\n","39\n","num top: 4\n","40\n","num top: 4\n","41\n","num top: 4\n","42\n","num top: 4\n","43\n","num top: 4\n","44\n","num top: 4\n","45\n","num top: 4\n","46\n","num top: 5\n","Finished seed\n","initializing seed = 2\n","0\n","num top: 1\n","1\n","num top: 1\n","2\n","num top: 2\n","3\n","num top: 2\n","4\n","num top: 3\n","5\n","num top: 4\n","6\n","num top: 4\n","7\n","num top: 4\n","8\n","num top: 4\n","9\n","num top: 4\n","10\n","num top: 4\n","11\n","num top: 4\n","12\n","num top: 4\n","13\n","num top: 4\n","14\n","num top: 4\n","15\n","num top: 4\n","16\n","num top: 4\n","17\n","num top: 4\n","18\n","num top: 4\n","19\n","num top: 4\n","20\n","num top: 4\n","21\n","num top: 4\n","22\n","num top: 4\n","23\n","num top: 4\n","24\n","num top: 4\n","25\n","num top: 4\n","26\n","num top: 4\n","27\n","num top: 4\n","28\n","num top: 4\n","29\n","num top: 4\n","30\n","num top: 4\n","31\n","num top: 4\n","32\n","num top: 4\n","33\n","num top: 4\n","34\n","num top: 4\n","35\n","num top: 4\n","36\n","num top: 4\n","37\n","num top: 4\n","38\n","num top: 4\n","39\n","num top: 4\n","40\n","num top: 4\n","41\n","num top: 4\n","42\n","num top: 4\n","43\n","num top: 4\n","44\n","num top: 4\n","45\n","num top: 4\n","46\n","num top: 4\n","47\n","num top: 4\n","48\n","num top: 5\n","Finished seed\n","initializing seed = 3\n","0\n","num top: 1\n","1\n","num top: 2\n","2\n","num top: 3\n","3\n","num top: 4\n","4\n","num top: 4\n","5\n","num top: 4\n","6\n","num top: 4\n","7\n","num top: 4\n","8\n","num top: 4\n","9\n","num top: 4\n","10\n","num top: 4\n","11\n","num top: 4\n","12\n","num top: 4\n","13\n","num top: 4\n","14\n","num top: 4\n","15\n","num top: 4\n","16\n","num top: 4\n","17\n","num top: 4\n","18\n","num top: 4\n","19\n","num top: 4\n","20\n","num top: 4\n","21\n","num top: 4\n","22\n","num top: 4\n","23\n","num top: 4\n","24\n","num top: 4\n","25\n","num top: 4\n","26\n","num top: 4\n","27\n","num top: 4\n","28\n","num top: 4\n","29\n","num top: 4\n","30\n","num top: 4\n","31\n","num top: 4\n","32\n","num top: 4\n","33\n","num top: 4\n","34\n","num top: 4\n","35\n","num top: 4\n","36\n","num top: 4\n","37\n","num top: 4\n","38\n","num top: 4\n","39\n","num top: 4\n","40\n","num top: 4\n","41\n","num top: 4\n","42\n","num top: 4\n","43\n","num top: 4\n","44\n","num top: 4\n","45\n","num top: 4\n","46\n","num top: 4\n","47\n","num top: 4\n","48\n","num top: 4\n","49\n","num top: 5\n","Finished seed\n","initializing seed = 4\n","0\n","num top: 2\n","1\n","num top: 3\n","2\n","num top: 3\n","3\n","num top: 4\n","4\n","num top: 4\n","5\n","num top: 4\n","6\n","num top: 4\n","7\n","num top: 4\n","8\n","num top: 4\n","9\n","num top: 4\n","10\n","num top: 4\n","11\n","num top: 4\n","12\n","num top: 4\n","13\n","num top: 4\n","14\n","num top: 4\n","15\n","num top: 4\n","16\n","num top: 4\n","17\n","num top: 4\n","18\n","num top: 4\n","19\n","num top: 4\n","20\n","num top: 4\n","21\n","num top: 4\n","22\n","num top: 4\n","23\n","num top: 4\n","24\n","num top: 4\n","25\n","num top: 4\n","26\n","num top: 4\n","27\n","num top: 4\n","28\n","num top: 4\n","29\n","num top: 4\n","30\n","num top: 4\n","31\n","num top: 4\n","32\n","num top: 4\n","33\n","num top: 4\n","34\n","num top: 4\n","35\n","num top: 4\n","36\n","num top: 4\n","37\n","num top: 4\n","38\n","num top: 4\n","39\n","num top: 4\n","40\n","num top: 4\n","41\n","num top: 4\n","42\n","num top: 5\n","Finished seed\n","16.344209909439087\n"]},{"data":{"text/plain":["[[0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 1,\n"," 1,\n"," 2,\n"," 3,\n"," 3,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 5],\n"," [0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 1,\n"," 1,\n"," 1,\n"," 1,\n"," 2,\n"," 2,\n"," 3,\n"," 3,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 5],\n"," [0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 1,\n"," 1,\n"," 2,\n"," 2,\n"," 3,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 5],\n"," [0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 1,\n"," 2,\n"," 3,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 5],\n"," [0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 1,\n"," 1,\n"," 2,\n"," 3,\n"," 3,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 5]]"]},"execution_count":561,"metadata":{},"output_type":"execute_result"}],"source":["# framework\n","\n","\n","# good practice to keep check of time used\n","start_time = time.time()\n","\n","# these will carry results along optimization sequence from all n_ensemble runs\n","index_collection = []\n","X_collection = []\n","y_collection = []\n","TopCount_collection = []\n","\n","#keep track of longest learning cycle\n","longest_learning_cycle = 0\n","\n","\n","for s in seed_list:\n","\n"," if len(index_collection) == n_ensemble:\n"," break\n","\n"," print('initializing seed = ' +str(seed_list.index(s)))\n"," random.seed(s)\n","\n"," indices = list(np.arange(N))\n","# index_learn is the pool of candidates to be examined\n"," index_learn = indices.copy()\n","# index_ is the list of candidates we have already observed\n","# adding in the initial experiments\n"," index_ = random.sample(index_learn, n_initial)\n","\n","# list to store all observed good candidates' input feature X\n"," X_ = []\n","# list to store all observed good candidates' objective value y\n"," y_ = []\n","# number of top candidates found so far\n"," c = 0\n","# list of cumulative number of top candidates found at each learning cycle\n"," TopCount_ = []\n","# add the first n_initial experiments to collection\n"," for i in index_:\n"," X_.append(X_feature[i])\n"," y_.append(y[i])\n"," if i in top_indices:\n"," c += 1\n"," TopCount_.append(c)\n"," index_learn.remove(i)\n","\n","\n","# for each of the the rest of (N - n_initial) learning cycles\n","# this for loop ends when all candidates in pool are observed\n","\n"," lawrence = 0\n"," for i in np.arange(len(index_learn)):\n"," print(lawrence)\n"," lawrence += 1\n"," y_best = np.min(y_)\n","\n"," s_scaler = preprocessing.StandardScaler()\n"," X_train = s_scaler.fit_transform(X_)\n"," y_train = s_scaler.fit_transform([[i] for i in y_])\n"," y_train = np.ravel(y_train)\n","\n"," if combo['model'] == 'RF':\n"," n_est = 50\n"," model = RandomForestRegressor(n_estimators= n_est, n_jobs= -1)\n"," model.fit(X_train, y_train)\n"," else:\n"," n_est = 5\n"," model = BaggingRegressor(LinearRegression(),n_estimators = n_est, n_jobs = -1)\n"," model.fit(X_train, y_train)\n","\n","\n","# by evaluating acquisition function values at candidates remaining in pool\n","# we choose candidate with larger acquisition function value to be observed next\n"," next_index = None\n"," max_ac = -10**10\n"," for j in index_learn:\n"," X_j = X_feature[j]\n"," y_j = y[j]\n","\n"," # TODO: CREATE PREDICTION FUNCTION WITH UNCERTAINTY\n"," ensemble_predictions = []\n"," for k in np.arange(n_est):\n"," ensemble_predictions.append((model.estimators_[k].predict(np.array([X_j]))).tolist())\n"," mean = np.mean(np.array(ensemble_predictions), axis=0)[0]\n"," std = np.std(np.array(ensemble_predictions), axis=0)[0]\n","\n"," # select acquisition function\n"," ac_value = EI(mean, std, y_best, combo['acq_func'])\n","\n"," if max_ac <= ac_value:\n"," max_ac = ac_value\n"," next_index = j\n","\n","\n","\n"," X_.append(X_feature[next_index])\n"," y_.append(y[next_index])\n","\n","\n"," if next_index in top_indices:\n"," c += 1\n"," print('num top: ', c)\n","\n"," TopCount_.append(c)\n","\n"," index_learn.remove(next_index)\n"," index_.append(next_index)\n"," if c == len(top_indices):\n"," break\n","\n"," if len(TopCount_)>longest_learning_cycle:\n"," longest_learning_cycle = len(TopCount_) \n"," \n","\n"," # assert len(index_) == N\n","\n"," index_collection.append(index_)\n"," X_collection.append(X_)\n"," y_collection.append(y_)\n"," TopCount_collection.append(TopCount_)\n","\n","\n","\n","\n","\n","\n","\n","\n"," print('Finished seed')\n","\n","total_time = time.time() - start_time\n","print(total_time)\n","TopCount_collection # PUT INTO DATASET\n","\n","\n","# master = np.array([index_collection, X_collection, y_collection, TopCount_collection, total_time])\n","# # #TODO: name output file\n","# np.save(f'{combo[\"dataset\"]} ({combo[\"n_features\"]}, {combo[\"acq_func\"]}, {combo[\"model\"]})', TopCount_collection)"]},{"cell_type":"markdown","id":"c6cefbca","metadata":{},"source":["# Graphing Results of Run"]},{"cell_type":"code","execution_count":562,"id":"9fc5145b-b6cc-4ba3-a86e-c4851026c6f5","metadata":{"id":"9fc5145b-b6cc-4ba3-a86e-c4851026c6f5"},"outputs":[{"data":{"text/plain":["[[0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 1,\n"," 1,\n"," 2,\n"," 3,\n"," 3,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 5],\n"," [0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 1,\n"," 1,\n"," 1,\n"," 1,\n"," 2,\n"," 2,\n"," 3,\n"," 3,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 5],\n"," [0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 1,\n"," 1,\n"," 2,\n"," 2,\n"," 3,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 5],\n"," [0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 1,\n"," 2,\n"," 3,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 5],\n"," [0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 1,\n"," 1,\n"," 2,\n"," 3,\n"," 3,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 5]]"]},"execution_count":562,"metadata":{},"output_type":"execute_result"}],"source":["#TODO use seaborn to output line function with error bars, save the figures and the csv (New CSV for each combo)\n","\n","TopCount_collection\n"]},{"cell_type":"code","execution_count":563,"id":"887bd7b0","metadata":{},"outputs":[],"source":["output_array=[]\n","#Double for-loop magic to add extra values to compensate as TopCount is likely jagged array\n","#This adds the MAXIMUM Number IS EVERYONE OK WITH THIS SOS\n","\n","for i in range(len(TopCount_collection)): \n"," for j in range(longest_learning_cycle):\n"," if j >= len(TopCount_collection[i]):\n"," TopCount_collection[i].append(TopCount_collection[i][j-1])\n","\n","for i in range(len(TopCount_collection)):\n"," output_array.append(np.array(TopCount_collection[i]))\n","\n","#make an output dataframe summarizing the output of each run SOS Relies on n_ensemble == 5\n","\n","output_df = pd.DataFrame(output_array, index=[\"Seed 1\", \"Seed 2\", \"Seed 3\", \"Seed 4\", \"Seed 5\"])\n","output_df = output_df.T\n"]},{"cell_type":"code","execution_count":564,"id":"fcd06afa-8aef-4779-9547-6ef2fbb9bbd8","metadata":{"id":"fcd06afa-8aef-4779-9547-6ef2fbb9bbd8"},"outputs":[{"data":{"text/html":["\n","\n","
\n"," \n"," \n"," \n"," Seed 1 \n"," Seed 2 \n"," Seed 3 \n"," Seed 4 \n"," Seed 5 \n"," Mean \n"," Std Dev \n"," Learning Cycle \n"," \n"," \n"," \n"," \n"," 0 \n"," 0 \n"," 0 \n"," 0 \n"," 0 \n"," 0 \n"," 0.0 \n"," 0.000000 \n"," 0 \n"," \n"," \n"," 1 \n"," 0 \n"," 0 \n"," 0 \n"," 0 \n"," 0 \n"," 0.0 \n"," 0.000000 \n"," 1 \n"," \n"," \n"," 2 \n"," 0 \n"," 0 \n"," 0 \n"," 0 \n"," 0 \n"," 0.0 \n"," 0.000000 \n"," 2 \n"," \n"," \n"," 3 \n"," 0 \n"," 0 \n"," 0 \n"," 0 \n"," 0 \n"," 0.0 \n"," 0.000000 \n"," 3 \n"," \n"," \n"," 4 \n"," 0 \n"," 0 \n"," 0 \n"," 0 \n"," 0 \n"," 0.0 \n"," 0.000000 \n"," 4 \n"," \n"," \n"," 5 \n"," 0 \n"," 0 \n"," 0 \n"," 0 \n"," 0 \n"," 0.0 \n"," 0.000000 \n"," 5 \n"," \n"," \n"," 6 \n"," 0 \n"," 1 \n"," 0 \n"," 0 \n"," 0 \n"," 0.2 \n"," 0.447214 \n"," 6 \n"," \n"," \n"," 7 \n"," 0 \n"," 1 \n"," 0 \n"," 0 \n"," 0 \n"," 0.2 \n"," 0.447214 \n"," 7 \n"," \n"," \n"," 8 \n"," 0 \n"," 1 \n"," 0 \n"," 0 \n"," 1 \n"," 0.4 \n"," 0.547723 \n"," 8 \n"," \n"," \n"," 9 \n"," 0 \n"," 1 \n"," 0 \n"," 0 \n"," 1 \n"," 0.4 \n"," 0.547723 \n"," 9 \n"," \n"," \n"," 10 \n"," 1 \n"," 2 \n"," 1 \n"," 1 \n"," 2 \n"," 1.4 \n"," 0.547723 \n"," 10 \n"," \n"," \n"," 11 \n"," 1 \n"," 2 \n"," 1 \n"," 2 \n"," 3 \n"," 1.8 \n"," 0.836660 \n"," 11 \n"," \n"," \n"," 12 \n"," 2 \n"," 3 \n"," 2 \n"," 3 \n"," 3 \n"," 2.6 \n"," 0.547723 \n"," 12 \n"," \n"," \n"," 13 \n"," 3 \n"," 3 \n"," 2 \n"," 4 \n"," 4 \n"," 3.2 \n"," 0.836660 \n"," 13 \n"," \n"," \n"," 14 \n"," 3 \n"," 4 \n"," 3 \n"," 4 \n"," 4 \n"," 3.6 \n"," 0.547723 \n"," 14 \n"," \n"," \n"," 15 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 15 \n"," \n"," \n"," 16 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 16 \n"," \n"," \n"," 17 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 17 \n"," \n"," \n"," 18 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 18 \n"," \n"," \n"," 19 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 19 \n"," \n"," \n"," 20 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 20 \n"," \n"," \n"," 21 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 21 \n"," \n"," \n"," 22 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 22 \n"," \n"," \n"," 23 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 23 \n"," \n"," \n"," 24 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 24 \n"," \n"," \n"," 25 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 25 \n"," \n"," \n"," 26 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 26 \n"," \n"," \n"," 27 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 27 \n"," \n"," \n"," 28 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 28 \n"," \n"," \n"," 29 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 29 \n"," \n"," \n"," 30 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 30 \n"," \n"," \n"," 31 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 31 \n"," \n"," \n"," 32 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 32 \n"," \n"," \n"," 33 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 33 \n"," \n"," \n"," 34 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 34 \n"," \n"," \n"," 35 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 35 \n"," \n"," \n"," 36 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 36 \n"," \n"," \n"," 37 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 37 \n"," \n"," \n"," 38 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 38 \n"," \n"," \n"," 39 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 39 \n"," \n"," \n"," 40 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 40 \n"," \n"," \n"," 41 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 41 \n"," \n"," \n"," 42 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 42 \n"," \n"," \n"," 43 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 43 \n"," \n"," \n"," 44 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 44 \n"," \n"," \n"," 45 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 45 \n"," \n"," \n"," 46 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 46 \n"," \n"," \n"," 47 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 47 \n"," \n"," \n"," 48 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 48 \n"," \n"," \n"," 49 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 49 \n"," \n"," \n"," 50 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 50 \n"," \n"," \n"," 51 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 51 \n"," \n"," \n"," 52 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 5 \n"," 4.2 \n"," 0.447214 \n"," 52 \n"," \n"," \n"," 53 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 5 \n"," 4.2 \n"," 0.447214 \n"," 53 \n"," \n"," \n"," 54 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 5 \n"," 4.2 \n"," 0.447214 \n"," 54 \n"," \n"," \n"," 55 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 5 \n"," 4.2 \n"," 0.447214 \n"," 55 \n"," \n"," \n"," 56 \n"," 4 \n"," 5 \n"," 4 \n"," 4 \n"," 5 \n"," 4.4 \n"," 0.547723 \n"," 56 \n"," \n"," \n"," 57 \n"," 4 \n"," 5 \n"," 4 \n"," 4 \n"," 5 \n"," 4.4 \n"," 0.547723 \n"," 57 \n"," \n"," \n"," 58 \n"," 5 \n"," 5 \n"," 5 \n"," 4 \n"," 5 \n"," 4.8 \n"," 0.447214 \n"," 58 \n"," \n"," \n"," 59 \n"," 5 \n"," 5 \n"," 5 \n"," 5 \n"," 5 \n"," 5.0 \n"," 0.000000 \n"," 59 \n"," \n"," \n","
\n","
"],"text/plain":[" Seed 1 Seed 2 Seed 3 Seed 4 Seed 5 Mean Std Dev Learning Cycle\n","0 0 0 0 0 0 0.0 0.000000 0\n","1 0 0 0 0 0 0.0 0.000000 1\n","2 0 0 0 0 0 0.0 0.000000 2\n","3 0 0 0 0 0 0.0 0.000000 3\n","4 0 0 0 0 0 0.0 0.000000 4\n","5 0 0 0 0 0 0.0 0.000000 5\n","6 0 1 0 0 0 0.2 0.447214 6\n","7 0 1 0 0 0 0.2 0.447214 7\n","8 0 1 0 0 1 0.4 0.547723 8\n","9 0 1 0 0 1 0.4 0.547723 9\n","10 1 2 1 1 2 1.4 0.547723 10\n","11 1 2 1 2 3 1.8 0.836660 11\n","12 2 3 2 3 3 2.6 0.547723 12\n","13 3 3 2 4 4 3.2 0.836660 13\n","14 3 4 3 4 4 3.6 0.547723 14\n","15 4 4 4 4 4 4.0 0.000000 15\n","16 4 4 4 4 4 4.0 0.000000 16\n","17 4 4 4 4 4 4.0 0.000000 17\n","18 4 4 4 4 4 4.0 0.000000 18\n","19 4 4 4 4 4 4.0 0.000000 19\n","20 4 4 4 4 4 4.0 0.000000 20\n","21 4 4 4 4 4 4.0 0.000000 21\n","22 4 4 4 4 4 4.0 0.000000 22\n","23 4 4 4 4 4 4.0 0.000000 23\n","24 4 4 4 4 4 4.0 0.000000 24\n","25 4 4 4 4 4 4.0 0.000000 25\n","26 4 4 4 4 4 4.0 0.000000 26\n","27 4 4 4 4 4 4.0 0.000000 27\n","28 4 4 4 4 4 4.0 0.000000 28\n","29 4 4 4 4 4 4.0 0.000000 29\n","30 4 4 4 4 4 4.0 0.000000 30\n","31 4 4 4 4 4 4.0 0.000000 31\n","32 4 4 4 4 4 4.0 0.000000 32\n","33 4 4 4 4 4 4.0 0.000000 33\n","34 4 4 4 4 4 4.0 0.000000 34\n","35 4 4 4 4 4 4.0 0.000000 35\n","36 4 4 4 4 4 4.0 0.000000 36\n","37 4 4 4 4 4 4.0 0.000000 37\n","38 4 4 4 4 4 4.0 0.000000 38\n","39 4 4 4 4 4 4.0 0.000000 39\n","40 4 4 4 4 4 4.0 0.000000 40\n","41 4 4 4 4 4 4.0 0.000000 41\n","42 4 4 4 4 4 4.0 0.000000 42\n","43 4 4 4 4 4 4.0 0.000000 43\n","44 4 4 4 4 4 4.0 0.000000 44\n","45 4 4 4 4 4 4.0 0.000000 45\n","46 4 4 4 4 4 4.0 0.000000 46\n","47 4 4 4 4 4 4.0 0.000000 47\n","48 4 4 4 4 4 4.0 0.000000 48\n","49 4 4 4 4 4 4.0 0.000000 49\n","50 4 4 4 4 4 4.0 0.000000 50\n","51 4 4 4 4 4 4.0 0.000000 51\n","52 4 4 4 4 5 4.2 0.447214 52\n","53 4 4 4 4 5 4.2 0.447214 53\n","54 4 4 4 4 5 4.2 0.447214 54\n","55 4 4 4 4 5 4.2 0.447214 55\n","56 4 5 4 4 5 4.4 0.547723 56\n","57 4 5 4 4 5 4.4 0.547723 57\n","58 5 5 5 4 5 4.8 0.447214 58\n","59 5 5 5 5 5 5.0 0.000000 59"]},"execution_count":564,"metadata":{},"output_type":"execute_result"}],"source":["#Get Average and Std Deviation of the run\n","\n","TopCount_mean = output_df.mean(axis= 'columns', skipna=True)\n","TopCount_std_dev = output_df.std(axis= 'columns', skipna=True)\n","\n","output_df['Mean'] = TopCount_mean\n","output_df['Std Dev'] = TopCount_std_dev\n","output_df['Learning Cycle'] = np.arange(0, longest_learning_cycle)\n","\n","output_df"]},{"cell_type":"code","execution_count":569,"id":"29b0cc1b","metadata":{},"outputs":[{"data":{"text/plain":["'Crossed barrel_dataset_3_0.01_Linear'"]},"execution_count":569,"metadata":{},"output_type":"execute_result"}],"source":["# #Output to CSV \n","output_name = f\"{combo['dataset'].split('.')[0]}_{combo['n_features']}_{combo['acq_func']}_{combo['model']}\"\n","output_name\n","\n","output_df.to_csv(f\"{output_name}.csv\")"]},{"cell_type":"code","execution_count":574,"id":"352671e2","metadata":{},"outputs":[{"data":{"image/png":"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PYVGoxFdu3YVb731ltv+xv69LwkhRHDGZoiIiIiCizUqREREFLaYqBAREVHYYqJCREREYYuJChEREYUtJipEREQUtpioEBERUdhiokJERERhi4kKETWpdu3a4aWXXgp1GEGxYsUKjzvtElFwMVEhaoamTp2K6667LtRheLV9+3b85S9/aZLX2r17NyZNmoT09HRotVp06tQJd999Nw4fPtwkr09EDcdEhYiCwm63+3VcamoqYmJiGjka4KuvvsJll10Gq9WKlStX4uDBg3j//fcRHx+PJ598stFfn4iCg4kKUQv066+/YuzYsdDpdEhPT8ef//xnFBcXu/avXr0aQ4cORUJCApKTk3HttdciLy/Ptf/YsWOQJAkffPABhg8fDq1Wi5UrV7pGcp5//nlkZmYiOTkZ06dPd0tiLp76kSQJb7/9Nq6//nrExMSgU6dO+PLLL93i/fLLL9GpUydotVpceeWVePfddyFJEsrLy72+P5PJhGnTpmHcuHH48ssvMWrUKLRv3x6DBg3C888/jzfffBNCCHTs2BHPP/+823P37NkDSZJw5MgRAEB5eTnuuece16hMz5498dVXX/m8tl988QUuueQSaLVadOjQAQsWLIDD4ajzvwkRecdEhaiFKS8vx1VXXYV+/fphx44dWL16Nc6dO4ebb77ZdUxVVRVmzpyJHTt24LvvvoNCocD1118PWZbdzvXYY4/hwQcfxMGDBzFmzBgAwPr165GXl4f169fj3XffxYoVK7BixYpaY1qwYAFuvvlm7N27F+PGjcNtt92G0tJSAEB+fj5uuukmXHfddfjll19wzz334P/+7/9qPd+aNWtQXFyMWbNmed2fkJAASZJwxx13YPny5W77li9fjiuuuAIdO3aELMsYO3YsNm/ejPfffx8HDhzA4sWLoVQqvZ73hx9+wO23344HH3wQBw4cwJtvvokVK1bgmWeeqTVeIqpF0G5vSERhY8qUKWLixIle9z311FNi9OjRbtsKCgoEAJ93PC0qKhIAxL59+4QQQuTn5wsA4qWXXvJ43ezsbOFwOFzbJk2aJCZPnux6nJ2dLV588UXXYwDiiSeecD2urKwUAMQ333wjhBBi9uzZomfPnm6v83//938CgCgrK/Ma79/+9jcBQJSWlnrdX+PUqVNCqVSKn3/+WQghhM1mEykpKWLFihVCCCHWrFkjFAqFz+uyfPlyER8f73o8cuRI8eyzz7od895774nMzMxa4yAi3ziiQtTC/PLLL1i/fj10Op3rp2vXrgDgmt7Jzc3Frbfeig4dOkCv16Ndu3YAgBMnTrida8CAAR7n79Gjh9uIQ2ZmJgoLC2uNqXfv3q5/x8bGQq/Xu55z6NAhDBw40O34Sy+9tNbzCT9vCp+VlYXx48fjnXfeAQD897//hdVqxaRJkwBUTwO1bt0anTt39ut8v/zyCxYuXOh2be+++26cOXMGJpPJr3MQkTtVqAMgoqZVWVmJCRMm4G9/+5vHvszMTADAhAkTkJ2djWXLliErKwuyLKNnz56w2Wxux8fGxnqcIyoqyu2xJEkeU0bBeE5tahKL3377DYMHD6712Lvuugt//vOf8eKLL2L58uWYPHmyq9g3Ojo6oNetrKzEggULcMMNN3js02q1AZ2LiKoxUSFqYS655BJ88sknaNeuHVQqz18BJSUlOHToEJYtW4Zhw4YBAH788cemDtOlS5cu+N///ue2bfv27bU+Z/To0UhJScFzzz2Hzz77zGN/eXm5q//JuHHjEBsbi6VLl2L16tXYtGmT67jevXvj5MmTOHz4sF+jKpdccgkOHTqEjh07+vHOiMgfTFSImqmKigrs2bPHbVvNKpxly5bh1ltvxaxZs5CUlIQjR45g1apVePvtt5GYmIjk5GS89dZbyMzMxIkTJ/DYY4+F5k0AuOeee7BkyRLMnj0bd955J/bs2eMqzpUkyetzYmNj8fbbb2PSpEn4wx/+gBkzZqBjx44oLi7Ghx9+iBMnTmDVqlUAAKVSialTp2LOnDno1KmT2wjM8OHDccUVV+DGG2/EkiVL0LFjR/z222+QJAnXXHONx+vOnTsX1157Ldq2bYubbroJCoUCv/zyC3799Vc8/fTTwb84RC0Aa1SImqkNGzagX79+bj8LFixAVlYWNm/eDKfTidGjR6NXr1546KGHkJCQAIVCAYVCgVWrVmHnzp3o2bMnHn74Yfz9738P2fto3749Pv74Y3z66afo3bs3li5d6lr1o9FofD5v4sSJ+OmnnxAVFYU//vGP6Nq1K2699VZUVFR4JA133nknbDYbpk2b5nGeTz75BAMHDsStt96K7t27Y9asWXA6nV5fc8yYMfjqq6+wdu1aDBw4EJdddhlefPFFZGdnN+AKELVskvC36oyIKEw888wzeOONN1BQUBCU8/3www8YOXIkCgoKkJ6eHpRzElFwcOqHiMLeP/7xDwwcOBDJycnYvHkz/v73v+P+++9v8HmtViuKioowf/58V6t9IgovTFSIKOzl5ubi6aefRmlpKdq2bYtHHnkEc+bMafB5//Of/+DOO+9E37598a9//SsIkRJRsHHqh4iIiMIWi2mJiIgobDFRISIiorDFRIWIiIjCFhMVIiIiCltMVIiIiChsMVEhIiKisMVEhYiIiMIWExUiIiIKW0xUiIiIKGz9fxQloxQIoVpuAAAAAElFTkSuQmCC","text/plain":[""]},"metadata":{},"output_type":"display_data"}],"source":["#Make a Nice Graph\n","fig, ax = plt.subplots()\n","\n","x = output_df['Learning Cycle']\n","y = output_df ['Mean']\n","\n","yerr0 = y - output_df['Std Dev']\n","yerr1 = y + output_df['Std Dev']\n","\n","#Plot and fill Std Dev\n","ax.plot(x,y)\n","plt.fill_between(x, yerr0, yerr1, color='C0', alpha=0.5)\n","\n","#Format the figure with axes labels\n","plt.xlabel(\"Learning Cycle\")\n","plt.ylabel(\"Top Samples Identified\")\n","plt.title(f\"{output_name}\")\n","\n","plt.savefig(f\"{output_name}.png\")\n","\n"]}],"metadata":{"colab":{"provenance":[]},"kernelspec":{"display_name":"Python 3 (ipykernel)","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.12.1"}},"nbformat":4,"nbformat_minor":5}
diff --git a/src/01 - eda.ipynb b/src/01 - eda.ipynb
new file mode 100644
index 0000000..eb7b16f
--- /dev/null
+++ b/src/01 - eda.ipynb
@@ -0,0 +1,624 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "import numpy as np\n",
+ "import seaborn as sns \n",
+ "import plotly.express as px\n",
+ "from itertools import product\n",
+ "import matplotlib.pyplot as plt\n",
+ "import plotly.graph_objects as go"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "datasets = ['Crossed barrel_dataset.csv', 'double_perovskites_gap.csv', 'concrete_mod.csv'] # delete datasets you won't use\n",
+ "n_features = [3, 8, 20]\n",
+ "acq_func = [0.01, 1, 1.5]\n",
+ "model = ['Linear', 'RF']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "hyperparameter_combinations = list(product(datasets, n_features, acq_func, model)) # find all combination of hyperparameters\n",
+ "\n",
+ "# put combos into dictionary for easier searching\n",
+ "all_combos = []\n",
+ "for combo in hyperparameter_combinations:\n",
+ " all_combos.append({\n",
+ " 'dataset': combo[0],\n",
+ " 'n_features': combo[1],\n",
+ " 'acq_func': combo[2],\n",
+ " 'model': combo[3]\n",
+ " })"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'concrete_mod_3_1.5_RF'"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "n = 5\n",
+ "combo = all_combos[n]\n",
+ "\n",
+ "# #Output to CSV \n",
+ "output_name = f\"{combo['dataset'].split('.')[0]}_{combo['n_features']}_{combo['acq_func']}_{combo['model']}\"\n",
+ "output_name"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Unnamed: 0 \n",
+ " Seed 1 \n",
+ " Seed 2 \n",
+ " Seed 3 \n",
+ " Seed 4 \n",
+ " Seed 5 \n",
+ " Mean \n",
+ " Std Dev \n",
+ " Learning Cycle \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0.0 \n",
+ " 0.000000 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 1 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0.0 \n",
+ " 0.000000 \n",
+ " 1 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 2 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 1 \n",
+ " 0 \n",
+ " 0.2 \n",
+ " 0.447214 \n",
+ " 2 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 3 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 1 \n",
+ " 0 \n",
+ " 0.2 \n",
+ " 0.447214 \n",
+ " 3 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 4 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 1 \n",
+ " 1 \n",
+ " 0.4 \n",
+ " 0.547723 \n",
+ " 4 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " 291 \n",
+ " 291 \n",
+ " 13 \n",
+ " 13 \n",
+ " 13 \n",
+ " 13 \n",
+ " 13 \n",
+ " 13.0 \n",
+ " 0.000000 \n",
+ " 291 \n",
+ " \n",
+ " \n",
+ " 292 \n",
+ " 292 \n",
+ " 13 \n",
+ " 13 \n",
+ " 13 \n",
+ " 13 \n",
+ " 13 \n",
+ " 13.0 \n",
+ " 0.000000 \n",
+ " 292 \n",
+ " \n",
+ " \n",
+ " 293 \n",
+ " 293 \n",
+ " 13 \n",
+ " 13 \n",
+ " 13 \n",
+ " 13 \n",
+ " 13 \n",
+ " 13.0 \n",
+ " 0.000000 \n",
+ " 293 \n",
+ " \n",
+ " \n",
+ " 294 \n",
+ " 294 \n",
+ " 14 \n",
+ " 14 \n",
+ " 14 \n",
+ " 14 \n",
+ " 14 \n",
+ " 14.0 \n",
+ " 0.000000 \n",
+ " 294 \n",
+ " \n",
+ " \n",
+ " 295 \n",
+ " 295 \n",
+ " 15 \n",
+ " 15 \n",
+ " 15 \n",
+ " 15 \n",
+ " 15 \n",
+ " 15.0 \n",
+ " 0.000000 \n",
+ " 295 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
296 rows × 9 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Unnamed: 0 Seed 1 Seed 2 Seed 3 Seed 4 Seed 5 Mean Std Dev \\\n",
+ "0 0 0 0 0 0 0 0.0 0.000000 \n",
+ "1 1 0 0 0 0 0 0.0 0.000000 \n",
+ "2 2 0 0 0 1 0 0.2 0.447214 \n",
+ "3 3 0 0 0 1 0 0.2 0.447214 \n",
+ "4 4 0 0 0 1 1 0.4 0.547723 \n",
+ ".. ... ... ... ... ... ... ... ... \n",
+ "291 291 13 13 13 13 13 13.0 0.000000 \n",
+ "292 292 13 13 13 13 13 13.0 0.000000 \n",
+ "293 293 13 13 13 13 13 13.0 0.000000 \n",
+ "294 294 14 14 14 14 14 14.0 0.000000 \n",
+ "295 295 15 15 15 15 15 15.0 0.000000 \n",
+ "\n",
+ " Learning Cycle \n",
+ "0 0 \n",
+ "1 1 \n",
+ "2 2 \n",
+ "3 3 \n",
+ "4 4 \n",
+ ".. ... \n",
+ "291 291 \n",
+ "292 292 \n",
+ "293 293 \n",
+ "294 294 \n",
+ "295 295 \n",
+ "\n",
+ "[296 rows x 9 columns]"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df = pd.read_csv(output_name+\".csv\")\n",
+ "df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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T0tLk9f36ty5szCbzS6/P3Kf8vJyMXLkSPlnNnfu3HqVw/rT9HzwwQeitLS0xnPefPNN+ed5yy23CIvFYnc8NzdXtGjRQgAQHTt2FDk5OXbHLRaLGDdunFzG7t27Hd7n22+/lc8ZP358tftkZ2eLiIgIAUAEBQWJvLw819+wC5hcNVLHjh0T/v7+8mKZy5YtEykpKWLXrl3isccekythVFRUtUUwyffs3btXfPDBB/LXihUr5J/xoEGD7I598MEHTst55pln5OtiYmLEhg0bxJEjR8SGDRtETEyMfOzZZ591WobFYhGDBg2Sz508ebLYsWOHOHTokEhISBChoaECgFCpVGL79u0N8N0gV0yaNEn+Wd1zzz3iv//9rzh16pTTr59//tlpWaw/TUvHjh1FSEiIePTRR8U//vEPsW/fPnHixAmxd+9esWrVKrufo1arFTt37nRYzurVq+XzOnXqJNatWyeOHDkitm7dKoYNG1bnRbqnTp0qnzts2DCxdetWceTIEbFu3TrRqVMn+diaNWsa4tthh8lVI/b555/Lf+E5+oqKihKpqalKh0luMH36dKc/Z0dfzlitVvHwww/XeO0jjzwirFZrjfFkZ2eLvn37Oi1Dp9OJ999/393fBqoHV+pNZeuCM6w/TUvHjh3rVGfCw8PF119/XWNZL774opAkyWkZY8aMqbWVzGg0ijFjxjgtQ6VSeaynhslVI5eeni6eeuopERUVJQwGgwgKChJ9+vQRr732migpKVE6PHITdyVXlb788ksRFxcnwsLChFarFWFhYSIuLs6llgKz2SxWrVolYmNjRcuWLYVerxe33nqrePTRR8X//ve/m3m75EbuTK4qsf40DadPnxZvvPGGmDRpkujZs6do06aN0Gg0olmzZqJTp05i8uTJ4oMPPqjzZ83+/fvFAw88IDp06CC0Wq0IDQ0VI0aMEB9//LFLcX300UdixIgRIjQ0VGi1WtGhQwfxwAMPOBwi01AkIYQAEREREbkFnxYkIiIiciMmV0RERERuxOSKiIiIyI2YXBERERG5EZMrIiIiIjdickVERETkRkyuiIiIiNyIyRURERGRGzG5IiIiInIjJldEREREbsTkioiIiMiNmFwRERERuRGTKyIiIiI3YnJFRERE5EZMroiIiIjciMkVERERkRsxuSIiIiJyIyZXRERERG7E5IqIiIjIjZhcEREREbkRkysiIiIiN2JyRURERORGTK6IiIiI3IjJFREREZEbMbkiIiIicqP/B2UcOT2vgkfxAAAAAElFTkSuQmCC",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plt.figure(figsize=(3,3),dpi=200)\n",
+ "\n",
+ "for n in range(len(all_combos)):\n",
+ " output_name = f\"{combo['dataset'].split('.')[0]}_{combo['n_features']}_{combo['acq_func']}_{combo['model']}\"\n",
+ " df = pd.read_csv(output_name+\".csv\")\n",
+ "\n",
+ " plt.plot(df.index, df[\"Mean\"], label=output_name)\n",
+ " plt.fill_between(df.index, df[\"Mean\"] - df[\"Std Dev\"], df[\"Mean\"] + df[\"Std Dev\"], alpha=0.2)\n",
+ "\n",
+ "plt.legend(fontsize=4)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " index \n",
+ " 0 \n",
+ " 1 \n",
+ " 2 \n",
+ " 3 \n",
+ " 4 \n",
+ " Mean \n",
+ " Std Dev \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " Unnamed: 0 \n",
+ " 0 \n",
+ " 1 \n",
+ " 2 \n",
+ " 3 \n",
+ " 4 \n",
+ " 2.0 \n",
+ " 1.581139 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 0 \n",
+ " 1 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0.2 \n",
+ " 0.447214 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 1 \n",
+ " 1 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0.2 \n",
+ " 0.447214 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 2 \n",
+ " 1 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0.2 \n",
+ " 0.447214 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 3 \n",
+ " 1 \n",
+ " 0 \n",
+ " 1 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0.4 \n",
+ " 0.547723 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " 296 \n",
+ " 295 \n",
+ " 15 \n",
+ " 15 \n",
+ " 15 \n",
+ " 15 \n",
+ " 15 \n",
+ " 15.0 \n",
+ " 0.000000 \n",
+ " \n",
+ " \n",
+ " 297 \n",
+ " 296 \n",
+ " 15 \n",
+ " 15 \n",
+ " 15 \n",
+ " 15 \n",
+ " 15 \n",
+ " 15.0 \n",
+ " 0.000000 \n",
+ " \n",
+ " \n",
+ " 298 \n",
+ " 297 \n",
+ " 15 \n",
+ " 15 \n",
+ " 15 \n",
+ " 15 \n",
+ " 15 \n",
+ " 15.0 \n",
+ " 0.000000 \n",
+ " \n",
+ " \n",
+ " 299 \n",
+ " 298 \n",
+ " 15 \n",
+ " 15 \n",
+ " 15 \n",
+ " 15 \n",
+ " 15 \n",
+ " 15.0 \n",
+ " 0.000000 \n",
+ " \n",
+ " \n",
+ " 300 \n",
+ " 299 \n",
+ " 15 \n",
+ " 15 \n",
+ " 15 \n",
+ " 15 \n",
+ " 15 \n",
+ " 15.0 \n",
+ " 0.000000 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
301 rows × 8 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " index 0 1 2 3 4 Mean Std Dev\n",
+ "0 Unnamed: 0 0 1 2 3 4 2.0 1.581139\n",
+ "1 0 1 0 0 0 0 0.2 0.447214\n",
+ "2 1 1 0 0 0 0 0.2 0.447214\n",
+ "3 2 1 0 0 0 0 0.2 0.447214\n",
+ "4 3 1 0 1 0 0 0.4 0.547723\n",
+ ".. ... .. .. .. .. .. ... ...\n",
+ "296 295 15 15 15 15 15 15.0 0.000000\n",
+ "297 296 15 15 15 15 15 15.0 0.000000\n",
+ "298 297 15 15 15 15 15 15.0 0.000000\n",
+ "299 298 15 15 15 15 15 15.0 0.000000\n",
+ "300 299 15 15 15 15 15 15.0 0.000000\n",
+ "\n",
+ "[301 rows x 8 columns]"
+ ]
+ },
+ "execution_count": 22,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df_rand = pd.read_csv(\"random_search_out.csv\").T\n",
+ "df_rand[\"Mean\"] = df_rand.iloc[:,:5].mean(axis=1)\n",
+ "df_rand[\"Std Dev\"] = df_rand.iloc[:,:5].std(axis=1)\n",
+ "df_rand.reset_index(inplace=True)\n",
+ "#df_rand.index = np.arange(0, len(df_rand)) - 10\n",
+ "df_rand"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import plotly.io as pio\n",
+ "pio.renderers.default = 'notebook'"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# loop through indices, and plot traces using plotly\n",
+ "fig = go.Figure()\n",
+ "fig.add_trace(go.Scatter(x=df_rand.index[10:], y=df_rand.iloc[10:,:][\"Mean\"], mode = \"lines\", name=\"Random Search\",\n",
+ " line=dict(color='black', width=4)))\n",
+ "\n",
+ "for n in range(len(all_combos)):\n",
+ " combo = all_combos[n]\n",
+ " output_name = f\"{combo['dataset'].split('.')[0]}_{combo['n_features']}_{combo['acq_func']}_{combo['model']}\"\n",
+ " shortname = f\"{n}: {combo['n_features']}_{combo['acq_func']}_{combo['model']}\"\n",
+ " df = pd.read_csv(output_name+\".csv\")\n",
+ "\n",
+ " # plt.plot(df.index, df[\"Mean\"], label=output_name)\n",
+ " # plt.fill_between(df.index, df[\"Mean\"] - df[\"Std Dev\"], df[\"Mean\"] + df[\"Std Dev\"], alpha=0.2)\n",
+ " # plt.legend(fontsize=4)\n",
+ "\n",
+ " fig.add_trace(go.Scatter(x=df.index, y=df[\"Mean\"], \n",
+ " name=shortname))\n",
+ "\n",
+ "# add plotly express legend\n",
+ "# show plotly plot\n",
+ "fig.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "maple2",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.11.2"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/src/BOv4.ipynb b/src/BOv4.ipynb
index 5a8a959..aeac0c7 100644
--- a/src/BOv4.ipynb
+++ b/src/BOv4.ipynb
@@ -1 +1,3655 @@
-{"cells":[{"cell_type":"code","execution_count":544,"id":"e8bb4295","metadata":{},"outputs":[],"source":["import numpy as np\n","import math\n","import pandas as pd\n","import os\n","import pickle\n","from sklearn import preprocessing\n","import random\n","from scipy.stats import norm\n","import time\n","from sklearn.ensemble import RandomForestRegressor, BaggingRegressor\n","from sklearn.linear_model import LinearRegression\n","import copy\n","from itertools import product\n","import seaborn as sns\n","import matplotlib.pyplot as plt\n","\n","\n","# TO DO: Instructions\n","# from matminer.featurizers.conversions import StrToComposition\n","# from matminer.featurizers.composition import ElementProperty, AtomicOrbitals, BandCenter"]},{"cell_type":"markdown","id":"160e55f5-b540-4717-912a-a1731658149f","metadata":{"id":"160e55f5-b540-4717-912a-a1731658149f"},"source":["# Process Data Functions"]},{"cell_type":"code","execution_count":545,"id":"2726d963-5e53-4841-a1a6-5fbe63e7c1a4","metadata":{"id":"2726d963-5e53-4841-a1a6-5fbe63e7c1a4"},"outputs":[],"source":["# def featurize(df, formula_col='formula', pbar=False, n_jobs=None, n_chunksize=None):\n","# \"\"\"\n","# Extract magpie feature set from formula\n","# \"\"\"\n","# starttime = time.time()\n","# if formula_col not in list(df):\n","# raise KeyError(f\"Data does not contain {formula_col} column\")\n","# print(\"Featurizing dataset...\")\n","\n","# if n_jobs:\n","# stc.set_n_jobs(n_jobs)\n","\n","# stc = StrToComposition()\n","\n","# feat = stc.featurize_dataframe(df, formula_col, ignore_errors=True, pbar=pbar)\n","# element_property = ElementProperty.from_preset(preset_name='magpie')\n","# for f in [element_property, BandCenter(), AtomicOrbitals()]:\n","# if n_jobs:\n","# f.set_n_jobs(n_jobs)\n","# if n_chunksize:\n","# f.set_chunksize(n_chunksize)\n","# feat = f.featurize_dataframe(feat, \"composition\", pbar=pbar, ignore_errors=True)\n","\n","# feat = feat.set_index(feat[formula_col])\n","# print(f\"Featurization time: {round((time.time() - starttime) / 60, 2)} min\")\n","# return feat\n","\n","\n","def get_identical_cols(df):\n"," \"\"\"\n"," Get the columns of a dataframe which have identical values.\n"," \"\"\"\n"," xx = {}\n"," for c in df:\n"," vals1 = list(df[c])\n"," for c2 in df:\n"," vals2 = list(df[c2])\n"," # if the columns contain identical values\n"," if c != c2 and vals1 == vals2:\n"," # if these values have not been seen before\n"," if vals1 not in [list(df[y]) for y in xx]:\n"," xx[c] = [c2]\n"," # if these values have been seen before\n"," else:\n"," y = [yy for yy in xx if list(df[yy]) == vals1][0]\n"," if c2 != y and c2 not in xx[y]:\n"," xx[y].append(c2)\n"," return xx\n","\n","\n","def process_dataset(df, target):\n"," \"\"\"\n"," Clean dataset and extract magpie features if formula is provided\n"," \"\"\"\n"," # drop extreme outlier rows?\n","\n"," # featurize magpie datasets\n"," # if 'formula' in df.columns:\n"," # df = featurize(df)\n","\n"," # remove non-numeric columns\n"," df = df[[c for c in df if pd.api.types.is_numeric_dtype(df[c])]]\n"," # remove columns with not many unique values?\n","\n"," # remove constant columns\n"," df = df.loc[:, (df != df.iloc[0]).any()]\n","\n"," # change all infinite values to nan\n"," df = df.replace([np.inf, -np.inf], np.nan)\n","\n"," # remove rows containing a nan\n"," df = df.dropna()\n","\n"," # remove columns with identical values\n"," remove_cols = [v0 for _, v in get_identical_cols(df).items() for v0 in v]\n"," df = df[[c for c in df if c not in remove_cols]]\n","\n"," # for some datasets, each input feature x could have been evaluated more than once.\n"," # take average\n"," features = set(df.columns)\n"," features.remove(target)\n"," df = df.groupby(list(features))[target].agg(lambda x: x.unique().mean())\n"," df = (df.to_frame()).reset_index()\n"," return df"]},{"cell_type":"markdown","id":"373aadf9-1e35-4193-82ad-11696c70c623","metadata":{"id":"373aadf9-1e35-4193-82ad-11696c70c623"},"source":["# Feature Engineering Functions"]},{"cell_type":"code","execution_count":546,"id":"c8f90cdf-bc5a-4a4e-b3d1-6045bea83fb7","metadata":{"id":"c8f90cdf-bc5a-4a4e-b3d1-6045bea83fb7"},"outputs":[],"source":["def array_is_constant(arr: list) -> np.array:\n"," \"\"\"Check if a 1D array is constant\"\"\"\n"," return np.allclose(arr, np.repeat(arr[0], len(arr)))\n","\n","\n","def add_additional_cols(\n"," df: pd.DataFrame,\n"," ignore: list = [],\n"," nat_log: bool = True,\n"," powers: list = [-4, -3, -2, -1, -0.5, -0.333, -0.25, 0.25, 0.33, 0.5, 2, 3, 4],\n",") -> pd.DataFrame:\n"," \"\"\"\n"," Add additional columns to a dataframe by executing\n"," mathematical operations on existing columns.\n"," \"\"\"\n"," # now raise existing columns to varying powers\n"," new_col_names = []\n"," new_vals_all = np.empty((len(df), 0))\n","\n"," # loop over each column to use for creating additional columns\n"," for c in [cc for cc in df if cc not in ignore]:\n","\n"," # get original column values\n"," vv = df[c].values\n","\n"," # raise existing columns to various powers\n"," for p in powers:\n"," # first assess mathematical viability of different conditions.\n"," # for example, we can't perform (-2)^(1/2).\n"," # if conditions are met, save new column\n"," if any(\n"," [\n"," p > 0 and isinstance(p, int), # pos integer powers\n"," p < 0 and isinstance(p, int) and 0 not in vv, # neg integer powers\n"," p > 0\n"," and not isinstance(p, int)\n"," and np.all(vv >= 0), # pos non-int powers\n"," p < 0\n"," and not isinstance(p, int)\n"," and np.all(vv > 0), # neg non-int powers\n"," ]\n"," ):\n","\n"," new_col_vals = np.float_power(vv, p).reshape((-1, 1))\n"," if (\n"," not array_is_constant(new_col_vals)\n"," and np.isfinite(new_col_vals).all()\n"," ):\n"," new_vals_all = np.hstack((new_vals_all, new_col_vals))\n"," new_col_names.append(f\"{c}**{str(p)}\")\n","\n"," # take natural logs of existing columns\n"," if nat_log:\n"," if not c.startswith(\"ln \") and np.all(vv > 0):\n"," new_col_vals = np.log(vv).reshape((-1, 1))\n"," if (\n"," not array_is_constant(new_col_vals)\n"," and np.isfinite(new_col_vals).all()\n"," ):\n"," new_vals_all = np.hstack((new_vals_all, new_col_vals))\n"," new_col_names.append(f\"{c}**ln\")\n","\n"," # combine new columns with original columns in a single dataframe\n"," new_df = pd.DataFrame(data=new_vals_all, columns=new_col_names, index=df.index)\n"," df = pd.concat([df, new_df], axis=1)\n"," return df\n","\n","\n","def find_top_n_features(df, original_features, target, n):\n"," \"\"\"\n"," Finds the top n features of the dataset according to how well they fit\n"," to a quadratic polynomial.\n","\n"," Note: A diversity criteria has been enforced to prevent the top features\n"," being powers of the same feature when adding additional columns (ie. we are\n"," trying to prevent the case where the top features are: [temp, temp**2, temp**3...])\n"," \"\"\"\n"," # obtain a list of all features\n"," features = set(df.columns)\n"," features.remove(target)\n"," features = list(features)\n","\n"," # create dictionary where the keys are the original features and the values\n"," # are a list of tuples of the form: (r2, features based on original feature)\n"," # eg. {'temp': [(0.9, temp), (0.87, temp**2), (0.95, temp**3)...]}\n"," unsorted_features = {f: [] for f in original_features}\n"," for col in features:\n"," # find how well the feature fits to the target using a quadratic polynomial\n"," fit = np.polyfit(df[col], df[target], 2, full=True)\n"," ssr = fit[1] # sum of squared residuals\n"," sst = np.sum((df[target] - df[target].mean())**2) # total sum of squares\n","\n"," # if ssr is 0, numpy will return a blank list\n"," if len(ssr) == 0:\n"," # if the number of unique values is less than 4, the fit will always\n"," # be perfect. Therefore, set ssr to sst and force r2 to be 0\n"," if len(df[col].unique()) < 4:\n"," ssr = sst\n"," else:\n"," ssr = 0\n"," else:\n"," ssr = ssr[0]\n"," r2 = 1 - ssr / sst\n","\n"," original_col = col.split('**')[0]\n"," unsorted_features[original_col].append((r2, col))\n","\n"," # sort features based on r2 value\n"," # eg. {'temp': [(0.95, temp**3), (0.9, temp), (0.87, temp**2)...]}\n"," sorted_features = {\n"," f: sorted(unsorted_features[f])[::-1] for f in original_features\n"," }\n","\n"," # find top features while enforcing diversity criteria\n"," top_n = []\n"," for i in range(n):\n"," # create mini list of top \"diverse\" features\n"," # eg. [(0.98, temp**3), (0.95, theta**0.5), (0.99, t**3)...]\n"," top_i = []\n"," for original_col in sorted_features:\n"," if i < len(sorted_features[original_col]):\n"," top_i.append(sorted_features[original_col][i])\n","\n"," # sort mini list of top \"diverse\" features\n"," # eg. [(0.99, t**3), (0.98, temp**3), (0.95, theta**0.5)...]\n"," top_i = sorted(top_i)[::-1]\n"," for j in top_i:\n"," top_n.append(j[1])\n"," if len(top_n) >= n:\n"," break\n"," # once n features have been found, break out of loop\n"," if len(top_n) >= n:\n"," break\n","\n"," return top_n"]},{"cell_type":"markdown","id":"2f5ec23b-d139-4228-a317-f1164acb760a","metadata":{"id":"2f5ec23b-d139-4228-a317-f1164acb760a"},"source":["# Predicting Functions"]},{"cell_type":"code","execution_count":547,"id":"c2f4ae6b-d46d-4844-8b14-11ac735fce26","metadata":{"id":"c2f4ae6b-d46d-4844-8b14-11ac735fce26"},"outputs":[],"source":["def RF_pred(X, RF_model):\n"," tree_predictions = []\n"," for j in np.arange(n_est):\n"," tree_predictions.append((RF_model.estimators_[j].predict(np.array([X]))).tolist())\n"," mean = np.mean(np.array(tree_predictions), axis=0)[0]\n","\n","\n"," std = np.std(np.array(tree_predictions), axis=0)[0]\n"," return mean, std"]},{"cell_type":"markdown","id":"95f37ac9-922a-42f0-8ea1-e586b74dd00f","metadata":{"id":"95f37ac9-922a-42f0-8ea1-e586b74dd00f"},"source":["# Acquisition Functions"]},{"cell_type":"code","execution_count":548,"id":"ad7cf7a1-edd0-4a93-b237-97468585f09d","metadata":{"id":"ad7cf7a1-edd0-4a93-b237-97468585f09d"},"outputs":[],"source":["def EI(mean, std, y_best, ratio):\n"," std = ratio * std\n","\n"," z = (y_best - mean)/std\n"," return (y_best - mean) * norm.cdf(z) + std * norm.pdf(z)"]},{"cell_type":"markdown","id":"b764198e-213d-4240-9093-bf042c6b7745","metadata":{"id":"b764198e-213d-4240-9093-bf042c6b7745"},"source":["# Set up Combinations"]},{"cell_type":"code","execution_count":549,"id":"09db2514-2f0c-4341-b4b6-87f10610b77c","metadata":{"id":"09db2514-2f0c-4341-b4b6-87f10610b77c"},"outputs":[],"source":["datasets = ['Crossed barrel_dataset.csv', 'double_perovskites_gap.csv', 'concrete.csv', 'concrete_mod.csv'] # delete datasets you won't use\n","n_features = [3, 8, 20]\n","acq_func = [0.01, 1, 1.5]\n","model = ['Linear', 'RF']"]},{"cell_type":"code","execution_count":550,"id":"c6aacbd9-716d-4877-a750-afbd72c0406c","metadata":{"id":"c6aacbd9-716d-4877-a750-afbd72c0406c"},"outputs":[],"source":["hyperparameter_combinations = list(product(datasets, n_features, acq_func, model)) # find all combination of hyperparameters\n","\n","# put combos into dictionary for easier searching\n","all_combos = []\n","for combo in hyperparameter_combinations:\n"," all_combos.append({\n"," 'dataset': combo[0],\n"," 'n_features': combo[1],\n"," 'acq_func': combo[2],\n"," 'model': combo[3]\n"," })"]},{"cell_type":"markdown","id":"5677fefb-1895-4afc-84e5-c724742064b7","metadata":{"id":"5677fefb-1895-4afc-84e5-c724742064b7"},"source":["# Pick Combo to Look At"]},{"cell_type":"code","execution_count":551,"id":"30888f77-d8fc-4052-a540-37c4b60d0f58","metadata":{"id":"30888f77-d8fc-4052-a540-37c4b60d0f58","outputId":"830343a5-fb11-4085-b2d8-a0167b11907c"},"outputs":[{"data":{"text/plain":["{'dataset': 'Crossed barrel_dataset.csv',\n"," 'n_features': 3,\n"," 'acq_func': 0.01,\n"," 'model': 'Linear'}"]},"execution_count":551,"metadata":{},"output_type":"execute_result"}],"source":["n = 0\n","combo = all_combos[n]\n","combo"]},{"cell_type":"markdown","id":"21fed3c0-922a-44cd-a003-bb3a666baa12","metadata":{"id":"21fed3c0-922a-44cd-a003-bb3a666baa12"},"source":["# Read and Process Dataset"]},{"cell_type":"code","execution_count":552,"id":"780a907f-7ca1-486f-84f5-7429f428eba0","metadata":{"id":"780a907f-7ca1-486f-84f5-7429f428eba0","outputId":"cc3e63ae-9f95-48e7-b039-469705b8fe51"},"outputs":[{"data":{"text/html":["\n","\n","
\n"," \n"," \n"," \n"," n \n"," theta \n"," r \n"," t \n"," toughness \n"," \n"," \n"," \n"," \n"," 0 \n"," 6 \n"," 0 \n"," 1.5 \n"," 0.70 \n"," 1.144667 \n"," \n"," \n"," 1 \n"," 6 \n"," 0 \n"," 1.5 \n"," 1.05 \n"," 1.607561 \n"," \n"," \n"," 2 \n"," 6 \n"," 0 \n"," 1.5 \n"," 1.40 \n"," 1.144338 \n"," \n"," \n"," 3 \n"," 6 \n"," 0 \n"," 1.7 \n"," 0.70 \n"," 3.642738 \n"," \n"," \n"," 4 \n"," 6 \n"," 0 \n"," 1.7 \n"," 1.05 \n"," 3.748405 \n"," \n"," \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," \n"," \n"," 1795 \n"," 12 \n"," 200 \n"," 2.3 \n"," 1.05 \n"," 1.358975 \n"," \n"," \n"," 1796 \n"," 12 \n"," 200 \n"," 2.3 \n"," 1.40 \n"," 3.196306 \n"," \n"," \n"," 1797 \n"," 12 \n"," 200 \n"," 2.5 \n"," 0.70 \n"," 36.104187 \n"," \n"," \n"," 1798 \n"," 12 \n"," 200 \n"," 2.5 \n"," 1.05 \n"," 1.313487 \n"," \n"," \n"," 1799 \n"," 12 \n"," 200 \n"," 2.5 \n"," 1.40 \n"," 1.069728 \n"," \n"," \n","
\n","
1800 rows × 5 columns
\n","
"],"text/plain":[" n theta r t toughness\n","0 6 0 1.5 0.70 1.144667\n","1 6 0 1.5 1.05 1.607561\n","2 6 0 1.5 1.40 1.144338\n","3 6 0 1.7 0.70 3.642738\n","4 6 0 1.7 1.05 3.748405\n","... .. ... ... ... ...\n","1795 12 200 2.3 1.05 1.358975\n","1796 12 200 2.3 1.40 3.196306\n","1797 12 200 2.5 0.70 36.104187\n","1798 12 200 2.5 1.05 1.313487\n","1799 12 200 2.5 1.40 1.069728\n","\n","[1800 rows x 5 columns]"]},"execution_count":552,"metadata":{},"output_type":"execute_result"}],"source":["# load a dataset\n","raw = pd.read_csv(combo['dataset'])\n","raw"]},{"cell_type":"code","execution_count":553,"id":"d1f5960d-2e3f-411c-8e49-c94eddbfb522","metadata":{"id":"d1f5960d-2e3f-411c-8e49-c94eddbfb522","outputId":"0b48f59b-7678-4b19-e2e9-3e89d5faaad4"},"outputs":[{"data":{"text/plain":["'toughness'"]},"execution_count":553,"metadata":{},"output_type":"execute_result"}],"source":["# define target\n","objective_name = list(raw.columns)[-1]\n","objective_name"]},{"cell_type":"code","execution_count":554,"id":"90fe8f74-3752-4c00-8666-af491fedae6a","metadata":{"id":"90fe8f74-3752-4c00-8666-af491fedae6a","outputId":"01bd090c-6e92-4cb8-e05b-82e5923f7f94"},"outputs":[{"data":{"text/html":["\n","\n","
\n"," \n"," \n"," \n"," t \n"," r \n"," theta \n"," n \n"," toughness \n"," \n"," \n"," \n"," \n"," 0 \n"," 0.7 \n"," 1.5 \n"," 0 \n"," 6 \n"," 1.135453 \n"," \n"," \n"," 1 \n"," 0.7 \n"," 1.5 \n"," 0 \n"," 8 \n"," 1.970165 \n"," \n"," \n"," 2 \n"," 0.7 \n"," 1.5 \n"," 0 \n"," 10 \n"," 2.514642 \n"," \n"," \n"," 3 \n"," 0.7 \n"," 1.5 \n"," 0 \n"," 12 \n"," 2.581751 \n"," \n"," \n"," 4 \n"," 0.7 \n"," 1.5 \n"," 50 \n"," 6 \n"," 0.665487 \n"," \n"," \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," \n"," \n"," 595 \n"," 1.4 \n"," 2.5 \n"," 150 \n"," 12 \n"," 1.493588 \n"," \n"," \n"," 596 \n"," 1.4 \n"," 2.5 \n"," 200 \n"," 6 \n"," 20.968543 \n"," \n"," \n"," 597 \n"," 1.4 \n"," 2.5 \n"," 200 \n"," 8 \n"," 14.529138 \n"," \n"," \n"," 598 \n"," 1.4 \n"," 2.5 \n"," 200 \n"," 10 \n"," 2.154458 \n"," \n"," \n"," 599 \n"," 1.4 \n"," 2.5 \n"," 200 \n"," 12 \n"," 1.337742 \n"," \n"," \n","
\n","
600 rows × 5 columns
\n","
"],"text/plain":[" t r theta n toughness\n","0 0.7 1.5 0 6 1.135453\n","1 0.7 1.5 0 8 1.970165\n","2 0.7 1.5 0 10 2.514642\n","3 0.7 1.5 0 12 2.581751\n","4 0.7 1.5 50 6 0.665487\n",".. ... ... ... .. ...\n","595 1.4 2.5 150 12 1.493588\n","596 1.4 2.5 200 6 20.968543\n","597 1.4 2.5 200 8 14.529138\n","598 1.4 2.5 200 10 2.154458\n","599 1.4 2.5 200 12 1.337742\n","\n","[600 rows x 5 columns]"]},"execution_count":554,"metadata":{},"output_type":"execute_result"}],"source":["# process dataset\n","processed = process_dataset(raw, objective_name)\n","processed"]},{"cell_type":"code","execution_count":555,"id":"53bd0354-1c53-4b8f-ba01-cab5a4f07de6","metadata":{"id":"53bd0354-1c53-4b8f-ba01-cab5a4f07de6","outputId":"15a6b5a1-a3be-44c5-d350-190764a75b2a"},"outputs":[{"data":{"text/plain":["['t', 'r', 'theta', 'n']"]},"execution_count":555,"metadata":{},"output_type":"execute_result"}],"source":["features = set(processed.columns)\n","features.remove(objective_name)\n","feature_name = list(features)\n","feature_name"]},{"cell_type":"code","execution_count":556,"id":"0937fe11-6d1c-4e04-9d8a-b9995099a74c","metadata":{"id":"0937fe11-6d1c-4e04-9d8a-b9995099a74c","outputId":"11b411fc-5d28-4312-9e87-57276d9d1204"},"outputs":[{"data":{"text/html":["\n","\n","
\n"," \n"," \n"," \n"," t \n"," r \n"," theta \n"," n \n"," toughness \n"," \n"," \n"," \n"," \n"," 0 \n"," 0.7 \n"," 1.5 \n"," 0 \n"," 6 \n"," -1.135453 \n"," \n"," \n"," 1 \n"," 0.7 \n"," 1.5 \n"," 0 \n"," 8 \n"," -1.970165 \n"," \n"," \n"," 2 \n"," 0.7 \n"," 1.5 \n"," 0 \n"," 10 \n"," -2.514642 \n"," \n"," \n"," 3 \n"," 0.7 \n"," 1.5 \n"," 0 \n"," 12 \n"," -2.581751 \n"," \n"," \n"," 4 \n"," 0.7 \n"," 1.5 \n"," 50 \n"," 6 \n"," -0.665487 \n"," \n"," \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," \n"," \n"," 595 \n"," 1.4 \n"," 2.5 \n"," 150 \n"," 12 \n"," -1.493588 \n"," \n"," \n"," 596 \n"," 1.4 \n"," 2.5 \n"," 200 \n"," 6 \n"," -20.968543 \n"," \n"," \n"," 597 \n"," 1.4 \n"," 2.5 \n"," 200 \n"," 8 \n"," -14.529138 \n"," \n"," \n"," 598 \n"," 1.4 \n"," 2.5 \n"," 200 \n"," 10 \n"," -2.154458 \n"," \n"," \n"," 599 \n"," 1.4 \n"," 2.5 \n"," 200 \n"," 12 \n"," -1.337742 \n"," \n"," \n","
\n","
600 rows × 5 columns
\n","
"],"text/plain":[" t r theta n toughness\n","0 0.7 1.5 0 6 -1.135453\n","1 0.7 1.5 0 8 -1.970165\n","2 0.7 1.5 0 10 -2.514642\n","3 0.7 1.5 0 12 -2.581751\n","4 0.7 1.5 50 6 -0.665487\n",".. ... ... ... .. ...\n","595 1.4 2.5 150 12 -1.493588\n","596 1.4 2.5 200 6 -20.968543\n","597 1.4 2.5 200 8 -14.529138\n","598 1.4 2.5 200 10 -2.154458\n","599 1.4 2.5 200 12 -1.337742\n","\n","[600 rows x 5 columns]"]},"execution_count":556,"metadata":{},"output_type":"execute_result"}],"source":["# we add negative sign to all of its objective values here\n","# because default BO in the framework below aims for global minimization\n","df = copy.deepcopy(processed)\n","df[objective_name] = -processed[objective_name].values\n","df"]},{"cell_type":"markdown","id":"b430f3f6-6531-462b-a2a9-cf95a28a91c1","metadata":{"id":"b430f3f6-6531-462b-a2a9-cf95a28a91c1"},"source":["# Engineer New Features, Then Select Top n Features"]},{"cell_type":"code","execution_count":557,"id":"3029abb7-1a43-4426-8012-deedeaf7d349","metadata":{"id":"3029abb7-1a43-4426-8012-deedeaf7d349","outputId":"99853349-b65a-4a58-ad38-967277edbf05"},"outputs":[{"data":{"text/plain":["['theta**2', 'r**4', 'n**2']"]},"execution_count":557,"metadata":{},"output_type":"execute_result"}],"source":["df = add_additional_cols(df, ignore=[objective_name])\n","top_n_features = find_top_n_features(df, feature_name, objective_name, combo['n_features'])\n","top_n_features"]},{"cell_type":"markdown","id":"b93ec941-d0bf-4835-a867-0dc9074ca152","metadata":{"id":"b93ec941-d0bf-4835-a867-0dc9074ca152"},"source":["# Limit Number of Rows for Speed"]},{"cell_type":"code","execution_count":558,"id":"72af6006-e990-4456-8882-0311b8d5e0eb","metadata":{"id":"72af6006-e990-4456-8882-0311b8d5e0eb","outputId":"79bb8cc5-2a9f-4118-ab6f-0f0c1da71868"},"outputs":[{"data":{"text/html":["\n","\n","
\n"," \n"," \n"," \n"," index \n"," t \n"," r \n"," theta \n"," n \n"," toughness \n"," t**-4 \n"," t**-3 \n"," t**-2 \n"," t**-1 \n"," ... \n"," n**-0.5 \n"," n**-0.333 \n"," n**-0.25 \n"," n**0.25 \n"," n**0.33 \n"," n**0.5 \n"," n**2 \n"," n**3 \n"," n**4 \n"," n**ln \n"," \n"," \n"," \n"," \n"," 0 \n"," 0 \n"," 0.7 \n"," 1.5 \n"," 0 \n"," 6 \n"," -1.135453 \n"," 4.164931 \n"," 2.915452 \n"," 2.040816 \n"," 1.428571 \n"," ... \n"," 0.408248 \n"," 0.550650 \n"," 0.638943 \n"," 1.565085 \n"," 1.806300 \n"," 2.449490 \n"," 36.0 \n"," 216.0 \n"," 1296.0 \n"," 1.791759 \n"," \n"," \n"," 1 \n"," 3 \n"," 0.7 \n"," 1.5 \n"," 0 \n"," 12 \n"," -2.581751 \n"," 4.164931 \n"," 2.915452 \n"," 2.040816 \n"," 1.428571 \n"," ... \n"," 0.288675 \n"," 0.437152 \n"," 0.537285 \n"," 1.861210 \n"," 2.270543 \n"," 3.464102 \n"," 144.0 \n"," 1728.0 \n"," 20736.0 \n"," 2.484907 \n"," \n"," \n"," 2 \n"," 9 \n"," 0.7 \n"," 1.5 \n"," 100 \n"," 8 \n"," -1.176839 \n"," 4.164931 \n"," 2.915452 \n"," 2.040816 \n"," 1.428571 \n"," ... \n"," 0.353553 \n"," 0.500347 \n"," 0.594604 \n"," 1.681793 \n"," 1.986185 \n"," 2.828427 \n"," 64.0 \n"," 512.0 \n"," 4096.0 \n"," 2.079442 \n"," \n"," \n"," 3 \n"," 13 \n"," 0.7 \n"," 1.5 \n"," 150 \n"," 8 \n"," -15.097205 \n"," 4.164931 \n"," 2.915452 \n"," 2.040816 \n"," 1.428571 \n"," ... \n"," 0.353553 \n"," 0.500347 \n"," 0.594604 \n"," 1.681793 \n"," 1.986185 \n"," 2.828427 \n"," 64.0 \n"," 512.0 \n"," 4096.0 \n"," 2.079442 \n"," \n"," \n"," 4 \n"," 17 \n"," 0.7 \n"," 1.5 \n"," 200 \n"," 8 \n"," -19.157394 \n"," 4.164931 \n"," 2.915452 \n"," 2.040816 \n"," 1.428571 \n"," ... \n"," 0.353553 \n"," 0.500347 \n"," 0.594604 \n"," 1.681793 \n"," 1.986185 \n"," 2.828427 \n"," 64.0 \n"," 512.0 \n"," 4096.0 \n"," 2.079442 \n"," \n"," \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," ... \n"," \n"," \n"," 95 \n"," 582 \n"," 1.4 \n"," 2.5 \n"," 0 \n"," 10 \n"," -1.269999 \n"," 0.260308 \n"," 0.364431 \n"," 0.510204 \n"," 0.714286 \n"," ... \n"," 0.316228 \n"," 0.464515 \n"," 0.562341 \n"," 1.778279 \n"," 2.137962 \n"," 3.162278 \n"," 100.0 \n"," 1000.0 \n"," 10000.0 \n"," 2.302585 \n"," \n"," \n"," 96 \n"," 585 \n"," 1.4 \n"," 2.5 \n"," 50 \n"," 8 \n"," -1.892805 \n"," 0.260308 \n"," 0.364431 \n"," 0.510204 \n"," 0.714286 \n"," ... \n"," 0.353553 \n"," 0.500347 \n"," 0.594604 \n"," 1.681793 \n"," 1.986185 \n"," 2.828427 \n"," 64.0 \n"," 512.0 \n"," 4096.0 \n"," 2.079442 \n"," \n"," \n"," 97 \n"," 588 \n"," 1.4 \n"," 2.5 \n"," 100 \n"," 6 \n"," -21.595643 \n"," 0.260308 \n"," 0.364431 \n"," 0.510204 \n"," 0.714286 \n"," ... \n"," 0.408248 \n"," 0.550650 \n"," 0.638943 \n"," 1.565085 \n"," 1.806300 \n"," 2.449490 \n"," 36.0 \n"," 216.0 \n"," 1296.0 \n"," 1.791759 \n"," \n"," \n"," 98 \n"," 591 \n"," 1.4 \n"," 2.5 \n"," 100 \n"," 12 \n"," -1.550937 \n"," 0.260308 \n"," 0.364431 \n"," 0.510204 \n"," 0.714286 \n"," ... \n"," 0.288675 \n"," 0.437152 \n"," 0.537285 \n"," 1.861210 \n"," 2.270543 \n"," 3.464102 \n"," 144.0 \n"," 1728.0 \n"," 20736.0 \n"," 2.484907 \n"," \n"," \n"," 99 \n"," 592 \n"," 1.4 \n"," 2.5 \n"," 150 \n"," 6 \n"," -18.217728 \n"," 0.260308 \n"," 0.364431 \n"," 0.510204 \n"," 0.714286 \n"," ... \n"," 0.408248 \n"," 0.550650 \n"," 0.638943 \n"," 1.565085 \n"," 1.806300 \n"," 2.449490 \n"," 36.0 \n"," 216.0 \n"," 1296.0 \n"," 1.791759 \n"," \n"," \n","
\n","
100 rows × 54 columns
\n","
"],"text/plain":[" index t r theta n toughness t**-4 t**-3 t**-2 \\\n","0 0 0.7 1.5 0 6 -1.135453 4.164931 2.915452 2.040816 \n","1 3 0.7 1.5 0 12 -2.581751 4.164931 2.915452 2.040816 \n","2 9 0.7 1.5 100 8 -1.176839 4.164931 2.915452 2.040816 \n","3 13 0.7 1.5 150 8 -15.097205 4.164931 2.915452 2.040816 \n","4 17 0.7 1.5 200 8 -19.157394 4.164931 2.915452 2.040816 \n",".. ... ... ... ... .. ... ... ... ... \n","95 582 1.4 2.5 0 10 -1.269999 0.260308 0.364431 0.510204 \n","96 585 1.4 2.5 50 8 -1.892805 0.260308 0.364431 0.510204 \n","97 588 1.4 2.5 100 6 -21.595643 0.260308 0.364431 0.510204 \n","98 591 1.4 2.5 100 12 -1.550937 0.260308 0.364431 0.510204 \n","99 592 1.4 2.5 150 6 -18.217728 0.260308 0.364431 0.510204 \n","\n"," t**-1 ... n**-0.5 n**-0.333 n**-0.25 n**0.25 n**0.33 \\\n","0 1.428571 ... 0.408248 0.550650 0.638943 1.565085 1.806300 \n","1 1.428571 ... 0.288675 0.437152 0.537285 1.861210 2.270543 \n","2 1.428571 ... 0.353553 0.500347 0.594604 1.681793 1.986185 \n","3 1.428571 ... 0.353553 0.500347 0.594604 1.681793 1.986185 \n","4 1.428571 ... 0.353553 0.500347 0.594604 1.681793 1.986185 \n",".. ... ... ... ... ... ... ... \n","95 0.714286 ... 0.316228 0.464515 0.562341 1.778279 2.137962 \n","96 0.714286 ... 0.353553 0.500347 0.594604 1.681793 1.986185 \n","97 0.714286 ... 0.408248 0.550650 0.638943 1.565085 1.806300 \n","98 0.714286 ... 0.288675 0.437152 0.537285 1.861210 2.270543 \n","99 0.714286 ... 0.408248 0.550650 0.638943 1.565085 1.806300 \n","\n"," n**0.5 n**2 n**3 n**4 n**ln \n","0 2.449490 36.0 216.0 1296.0 1.791759 \n","1 3.464102 144.0 1728.0 20736.0 2.484907 \n","2 2.828427 64.0 512.0 4096.0 2.079442 \n","3 2.828427 64.0 512.0 4096.0 2.079442 \n","4 2.828427 64.0 512.0 4096.0 2.079442 \n",".. ... ... ... ... ... \n","95 3.162278 100.0 1000.0 10000.0 2.302585 \n","96 2.828427 64.0 512.0 4096.0 2.079442 \n","97 2.449490 36.0 216.0 1296.0 1.791759 \n","98 3.464102 144.0 1728.0 20736.0 2.484907 \n","99 2.449490 36.0 216.0 1296.0 1.791759 \n","\n","[100 rows x 54 columns]"]},"execution_count":558,"metadata":{},"output_type":"execute_result"}],"source":["dataset_limit = 991\n","df = df.sample(dataset_limit, random_state=1).sort_index().reset_index()\n","df"]},{"cell_type":"markdown","id":"f19eed3f-002e-4540-9e30-98b75d439f98","metadata":{"id":"f19eed3f-002e-4540-9e30-98b75d439f98"},"source":["# Split into X and y datasets"]},{"cell_type":"code","execution_count":559,"id":"9172285c-5f8b-4487-9430-dcc44cdd8cce","metadata":{"id":"9172285c-5f8b-4487-9430-dcc44cdd8cce","outputId":"00f6fa69-48eb-42c8-f89c-e557a1bb352e"},"outputs":[{"name":"stdout","output_type":"stream","text":["100\n"]}],"source":["# these are the input feature x and objective value y used in framework\n","X_feature = df[top_n_features].values\n","\n","y = np.array(df[objective_name].values)\n","\n","assert len(df) == len(X_feature) == len(y)\n","\n","# total number of data in set\n","N = len(df)\n","print(N)"]},{"cell_type":"markdown","id":"ac428810-2c4d-48ea-950e-dbeca4a4c843","metadata":{"id":"ac428810-2c4d-48ea-950e-dbeca4a4c843"},"source":["# Specify Parameters of Framework"]},{"cell_type":"code","execution_count":560,"id":"8f8ea549-c2be-49fa-9f9f-afa774424ee6","metadata":{"id":"8f8ea549-c2be-49fa-9f9f-afa774424ee6"},"outputs":[],"source":["# here are some parameters of the framework, feel free to modify for your own purposes\n","\n","# number of ensembles. in the paper n_ensemble = 50.\n","n_ensemble = 5\n","# number of top candidates, currently using top 5% of total dataset size\n","n_top = int(math.ceil(len(y) * 0.05))\n","# the top candidates and their indicies\n","top_indices = list(df.sort_values(objective_name).head(n_top).index)\n","# number of initial experiments\n","n_initial = 10\n","\n","# random seeds used to distinguish between different ensembles\n","# there are 300 of them, but only first n_ensemble are used\n","seed_list = [4295, 8508, 326, 3135, 1549, 2528, 1274, 6545, 5971, 6269, 2422, 4287, 9320, 4932, 951, 4304, 1745, 5956, 7620, 4545, 6003, 9885, 5548, 9477, 30, 8992, 7559, 5034, 9071, 6437, 3389, 9816, 8617, 3712, 3626, 1660, 3309, 2427, 9872, 938, 5156, 7409, 7672, 3411, 3559, 9966, 7331, 8273, 8484, 5127, 2260, 6054, 5205, 311, 6056, 9456, 928, 6424, 7438, 8701, 8634, 4002, 6634, 8102, 8503, 1540, 9254, 7972, 7737, 3410, 4052, 8640, 9659, 8093, 7076, 7268, 2046, 7492, 3103, 3034, 7874, 5438, 4297, 291, 5436, 9021, 3711, 7837, 9188, 2036, 8013, 6188, 3734, 187, 1438, 1061, 674, 777, 7231, 7096, 3360, 4278, 5817, 5514, 3442, 6805, 6750, 8548, 9751, 3526, 9969, 8979, 1526, 1551, 2058, 6325, 1237, 5917, 5821, 9946, 5049, 654, 7750, 5149, 3545, 9165, 2837, 5621, 6501, 595, 3181, 1747, 4405, 4480, 4282, 9262, 6219, 3960, 4999, 1495, 6007, 9642, 3902, 3133, 1085, 3278, 1104, 5939, 7153, 971, 8733, 3785, 9056, 2020, 7249, 5021, 3384, 8740, 4593, 7869, 9941, 8813, 3688, 8139, 6436, 3742, 5503, 1587, 4766, 9846, 9117, 7001, 4853, 9346, 4927, 8480, 5298, 4753, 1151, 9768, 5405, 6196, 5721, 3419, 8090, 8166, 7834, 1480, 1150, 9002, 1134, 2237, 3995, 2029, 5336, 7050, 6857, 8794, 1754, 1184, 3558, 658, 6804, 8750, 5088, 1136, 626, 8462, 5203, 3196, 979, 7419, 1162, 5451, 6492, 1562, 8145, 8937, 8764, 4174, 7639, 8902, 7003, 765, 1554, 6135, 1689, 9530, 1398, 2273, 7925, 5948, 1036, 868, 4617, 1203, 7680, 7, 93, 3128, 5694, 6979, 7136, 8084, 5770, 9301, 1599, 737, 7018, 3774, 9843, 2296, 2287, 9875, 2349, 2469, 8941, 4973, 3798, 54, 2938, 4665, 3942, 3951, 9400, 3094, 2248, 3376, 1926, 5180, 1773, 3681, 1808, 350, 6669, 826, 539, 5313, 6193, 5752, 9370, 2782, 8399, 4881, 3166, 4906, 5829, 4827, 29, 6899, 9012, 6986, 4175, 1035, 8320, 7802, 3777, 6340, 7798, 7705]"]},{"cell_type":"markdown","id":"5ebeddf6-0a9a-4236-9af1-8c2acd91e781","metadata":{"id":"5ebeddf6-0a9a-4236-9af1-8c2acd91e781"},"source":["# Run Framework"]},{"cell_type":"code","execution_count":561,"id":"daaa81f5-36d1-47ba-ab28-9c67ad0c30bd","metadata":{"id":"daaa81f5-36d1-47ba-ab28-9c67ad0c30bd","outputId":"8826439c-7adc-4ca1-c7ae-361b1107079d"},"outputs":[{"name":"stdout","output_type":"stream","text":["initializing seed = 0\n","0\n","num top: 1\n","1\n","num top: 1\n","2\n"]},{"name":"stdout","output_type":"stream","text":["num top: 2\n","3\n","num top: 3\n","4\n","num top: 3\n","5\n","num top: 4\n","6\n","num top: 4\n","7\n","num top: 4\n","8\n","num top: 4\n","9\n","num top: 4\n","10\n","num top: 4\n","11\n","num top: 4\n","12\n","num top: 4\n","13\n","num top: 4\n","14\n","num top: 4\n","15\n","num top: 4\n","16\n","num top: 4\n","17\n","num top: 4\n","18\n","num top: 4\n","19\n","num top: 4\n","20\n","num top: 4\n","21\n","num top: 4\n","22\n","num top: 4\n","23\n","num top: 4\n","24\n","num top: 4\n","25\n","num top: 4\n","26\n","num top: 4\n","27\n","num top: 4\n","28\n","num top: 4\n","29\n","num top: 4\n","30\n","num top: 4\n","31\n","num top: 4\n","32\n","num top: 4\n","33\n","num top: 4\n","34\n","num top: 4\n","35\n","num top: 4\n","36\n","num top: 4\n","37\n","num top: 4\n","38\n","num top: 4\n","39\n","num top: 4\n","40\n","num top: 4\n","41\n","num top: 4\n","42\n","num top: 4\n","43\n","num top: 4\n","44\n","num top: 4\n","45\n","num top: 4\n","46\n","num top: 4\n","47\n","num top: 4\n","48\n","num top: 5\n","Finished seed\n","initializing seed = 1\n","0\n","num top: 2\n","1\n","num top: 2\n","2\n","num top: 3\n","3\n","num top: 3\n","4\n","num top: 4\n","5\n","num top: 4\n","6\n","num top: 4\n","7\n","num top: 4\n","8\n","num top: 4\n","9\n","num top: 4\n","10\n","num top: 4\n","11\n","num top: 4\n","12\n","num top: 4\n","13\n","num top: 4\n","14\n","num top: 4\n","15\n","num top: 4\n","16\n","num top: 4\n","17\n","num top: 4\n","18\n","num top: 4\n","19\n","num top: 4\n","20\n","num top: 4\n","21\n","num top: 4\n","22\n","num top: 4\n","23\n","num top: 4\n","24\n","num top: 4\n","25\n","num top: 4\n","26\n","num top: 4\n","27\n","num top: 4\n","28\n","num top: 4\n","29\n","num top: 4\n","30\n","num top: 4\n","31\n","num top: 4\n","32\n","num top: 4\n","33\n","num top: 4\n","34\n","num top: 4\n","35\n","num top: 4\n","36\n","num top: 4\n","37\n","num top: 4\n","38\n","num top: 4\n","39\n","num top: 4\n","40\n","num top: 4\n","41\n","num top: 4\n","42\n","num top: 4\n","43\n","num top: 4\n","44\n","num top: 4\n","45\n","num top: 4\n","46\n","num top: 5\n","Finished seed\n","initializing seed = 2\n","0\n","num top: 1\n","1\n","num top: 1\n","2\n","num top: 2\n","3\n","num top: 2\n","4\n","num top: 3\n","5\n","num top: 4\n","6\n","num top: 4\n","7\n","num top: 4\n","8\n","num top: 4\n","9\n","num top: 4\n","10\n","num top: 4\n","11\n","num top: 4\n","12\n","num top: 4\n","13\n","num top: 4\n","14\n","num top: 4\n","15\n","num top: 4\n","16\n","num top: 4\n","17\n","num top: 4\n","18\n","num top: 4\n","19\n","num top: 4\n","20\n","num top: 4\n","21\n","num top: 4\n","22\n","num top: 4\n","23\n","num top: 4\n","24\n","num top: 4\n","25\n","num top: 4\n","26\n","num top: 4\n","27\n","num top: 4\n","28\n","num top: 4\n","29\n","num top: 4\n","30\n","num top: 4\n","31\n","num top: 4\n","32\n","num top: 4\n","33\n","num top: 4\n","34\n","num top: 4\n","35\n","num top: 4\n","36\n","num top: 4\n","37\n","num top: 4\n","38\n","num top: 4\n","39\n","num top: 4\n","40\n","num top: 4\n","41\n","num top: 4\n","42\n","num top: 4\n","43\n","num top: 4\n","44\n","num top: 4\n","45\n","num top: 4\n","46\n","num top: 4\n","47\n","num top: 4\n","48\n","num top: 5\n","Finished seed\n","initializing seed = 3\n","0\n","num top: 1\n","1\n","num top: 2\n","2\n","num top: 3\n","3\n","num top: 4\n","4\n","num top: 4\n","5\n","num top: 4\n","6\n","num top: 4\n","7\n","num top: 4\n","8\n","num top: 4\n","9\n","num top: 4\n","10\n","num top: 4\n","11\n","num top: 4\n","12\n","num top: 4\n","13\n","num top: 4\n","14\n","num top: 4\n","15\n","num top: 4\n","16\n","num top: 4\n","17\n","num top: 4\n","18\n","num top: 4\n","19\n","num top: 4\n","20\n","num top: 4\n","21\n","num top: 4\n","22\n","num top: 4\n","23\n","num top: 4\n","24\n","num top: 4\n","25\n","num top: 4\n","26\n","num top: 4\n","27\n","num top: 4\n","28\n","num top: 4\n","29\n","num top: 4\n","30\n","num top: 4\n","31\n","num top: 4\n","32\n","num top: 4\n","33\n","num top: 4\n","34\n","num top: 4\n","35\n","num top: 4\n","36\n","num top: 4\n","37\n","num top: 4\n","38\n","num top: 4\n","39\n","num top: 4\n","40\n","num top: 4\n","41\n","num top: 4\n","42\n","num top: 4\n","43\n","num top: 4\n","44\n","num top: 4\n","45\n","num top: 4\n","46\n","num top: 4\n","47\n","num top: 4\n","48\n","num top: 4\n","49\n","num top: 5\n","Finished seed\n","initializing seed = 4\n","0\n","num top: 2\n","1\n","num top: 3\n","2\n","num top: 3\n","3\n","num top: 4\n","4\n","num top: 4\n","5\n","num top: 4\n","6\n","num top: 4\n","7\n","num top: 4\n","8\n","num top: 4\n","9\n","num top: 4\n","10\n","num top: 4\n","11\n","num top: 4\n","12\n","num top: 4\n","13\n","num top: 4\n","14\n","num top: 4\n","15\n","num top: 4\n","16\n","num top: 4\n","17\n","num top: 4\n","18\n","num top: 4\n","19\n","num top: 4\n","20\n","num top: 4\n","21\n","num top: 4\n","22\n","num top: 4\n","23\n","num top: 4\n","24\n","num top: 4\n","25\n","num top: 4\n","26\n","num top: 4\n","27\n","num top: 4\n","28\n","num top: 4\n","29\n","num top: 4\n","30\n","num top: 4\n","31\n","num top: 4\n","32\n","num top: 4\n","33\n","num top: 4\n","34\n","num top: 4\n","35\n","num top: 4\n","36\n","num top: 4\n","37\n","num top: 4\n","38\n","num top: 4\n","39\n","num top: 4\n","40\n","num top: 4\n","41\n","num top: 4\n","42\n","num top: 5\n","Finished seed\n","16.344209909439087\n"]},{"data":{"text/plain":["[[0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 1,\n"," 1,\n"," 2,\n"," 3,\n"," 3,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 5],\n"," [0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 1,\n"," 1,\n"," 1,\n"," 1,\n"," 2,\n"," 2,\n"," 3,\n"," 3,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 5],\n"," [0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 1,\n"," 1,\n"," 2,\n"," 2,\n"," 3,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 5],\n"," [0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 1,\n"," 2,\n"," 3,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 5],\n"," [0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 1,\n"," 1,\n"," 2,\n"," 3,\n"," 3,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 5]]"]},"execution_count":561,"metadata":{},"output_type":"execute_result"}],"source":["# framework\n","\n","\n","# good practice to keep check of time used\n","start_time = time.time()\n","\n","# these will carry results along optimization sequence from all n_ensemble runs\n","index_collection = []\n","X_collection = []\n","y_collection = []\n","TopCount_collection = []\n","\n","#keep track of longest learning cycle\n","longest_learning_cycle = 0\n","\n","\n","for s in seed_list:\n","\n"," if len(index_collection) == n_ensemble:\n"," break\n","\n"," print('initializing seed = ' +str(seed_list.index(s)))\n"," random.seed(s)\n","\n"," indices = list(np.arange(N))\n","# index_learn is the pool of candidates to be examined\n"," index_learn = indices.copy()\n","# index_ is the list of candidates we have already observed\n","# adding in the initial experiments\n"," index_ = random.sample(index_learn, n_initial)\n","\n","# list to store all observed good candidates' input feature X\n"," X_ = []\n","# list to store all observed good candidates' objective value y\n"," y_ = []\n","# number of top candidates found so far\n"," c = 0\n","# list of cumulative number of top candidates found at each learning cycle\n"," TopCount_ = []\n","# add the first n_initial experiments to collection\n"," for i in index_:\n"," X_.append(X_feature[i])\n"," y_.append(y[i])\n"," if i in top_indices:\n"," c += 1\n"," TopCount_.append(c)\n"," index_learn.remove(i)\n","\n","\n","# for each of the the rest of (N - n_initial) learning cycles\n","# this for loop ends when all candidates in pool are observed\n","\n"," lawrence = 0\n"," for i in np.arange(len(index_learn)):\n"," print(lawrence)\n"," lawrence += 1\n"," y_best = np.min(y_)\n","\n"," s_scaler = preprocessing.StandardScaler()\n"," X_train = s_scaler.fit_transform(X_)\n"," y_train = s_scaler.fit_transform([[i] for i in y_])\n"," y_train = np.ravel(y_train)\n","\n"," if combo['model'] == 'RF':\n"," n_est = 50\n"," model = RandomForestRegressor(n_estimators= n_est, n_jobs= -1)\n"," model.fit(X_train, y_train)\n"," else:\n"," n_est = 5\n"," model = BaggingRegressor(LinearRegression(),n_estimators = n_est, n_jobs = -1)\n"," model.fit(X_train, y_train)\n","\n","\n","# by evaluating acquisition function values at candidates remaining in pool\n","# we choose candidate with larger acquisition function value to be observed next\n"," next_index = None\n"," max_ac = -10**10\n"," for j in index_learn:\n"," X_j = X_feature[j]\n"," y_j = y[j]\n","\n"," # TODO: CREATE PREDICTION FUNCTION WITH UNCERTAINTY\n"," ensemble_predictions = []\n"," for k in np.arange(n_est):\n"," ensemble_predictions.append((model.estimators_[k].predict(np.array([X_j]))).tolist())\n"," mean = np.mean(np.array(ensemble_predictions), axis=0)[0]\n"," std = np.std(np.array(ensemble_predictions), axis=0)[0]\n","\n"," # select acquisition function\n"," ac_value = EI(mean, std, y_best, combo['acq_func'])\n","\n"," if max_ac <= ac_value:\n"," max_ac = ac_value\n"," next_index = j\n","\n","\n","\n"," X_.append(X_feature[next_index])\n"," y_.append(y[next_index])\n","\n","\n"," if next_index in top_indices:\n"," c += 1\n"," print('num top: ', c)\n","\n"," TopCount_.append(c)\n","\n"," index_learn.remove(next_index)\n"," index_.append(next_index)\n"," if c == len(top_indices):\n"," break\n","\n"," if len(TopCount_)>longest_learning_cycle:\n"," longest_learning_cycle = len(TopCount_) \n"," \n","\n"," # assert len(index_) == N\n","\n"," index_collection.append(index_)\n"," X_collection.append(X_)\n"," y_collection.append(y_)\n"," TopCount_collection.append(TopCount_)\n","\n","\n","\n","\n","\n","\n","\n","\n"," print('Finished seed')\n","\n","total_time = time.time() - start_time\n","print(total_time)\n","TopCount_collection # PUT INTO DATASET\n","\n","\n","# master = np.array([index_collection, X_collection, y_collection, TopCount_collection, total_time])\n","# # #TODO: name output file\n","# np.save(f'{combo[\"dataset\"]} ({combo[\"n_features\"]}, {combo[\"acq_func\"]}, {combo[\"model\"]})', TopCount_collection)"]},{"cell_type":"markdown","id":"c6cefbca","metadata":{},"source":["# Graphing Results of Run"]},{"cell_type":"code","execution_count":562,"id":"9fc5145b-b6cc-4ba3-a86e-c4851026c6f5","metadata":{"id":"9fc5145b-b6cc-4ba3-a86e-c4851026c6f5"},"outputs":[{"data":{"text/plain":["[[0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 1,\n"," 1,\n"," 2,\n"," 3,\n"," 3,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 5],\n"," [0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 1,\n"," 1,\n"," 1,\n"," 1,\n"," 2,\n"," 2,\n"," 3,\n"," 3,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 5],\n"," [0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 1,\n"," 1,\n"," 2,\n"," 2,\n"," 3,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 5],\n"," [0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 1,\n"," 2,\n"," 3,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 5],\n"," [0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 0,\n"," 1,\n"," 1,\n"," 2,\n"," 3,\n"," 3,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 4,\n"," 5]]"]},"execution_count":562,"metadata":{},"output_type":"execute_result"}],"source":["#TODO use seaborn to output line function with error bars, save the figures and the csv (New CSV for each combo)\n","\n","TopCount_collection\n"]},{"cell_type":"code","execution_count":563,"id":"887bd7b0","metadata":{},"outputs":[],"source":["output_array=[]\n","#Double for-loop magic to add extra values to compensate as TopCount is likely jagged array\n","#This adds the MAXIMUM Number IS EVERYONE OK WITH THIS SOS\n","\n","for i in range(len(TopCount_collection)): \n"," for j in range(longest_learning_cycle):\n"," if j >= len(TopCount_collection[i]):\n"," TopCount_collection[i].append(TopCount_collection[i][j-1])\n","\n","for i in range(len(TopCount_collection)):\n"," output_array.append(np.array(TopCount_collection[i]))\n","\n","#make an output dataframe summarizing the output of each run SOS Relies on n_ensemble == 5\n","\n","output_df = pd.DataFrame(output_array, index=[\"Seed 1\", \"Seed 2\", \"Seed 3\", \"Seed 4\", \"Seed 5\"])\n","output_df = output_df.T\n"]},{"cell_type":"code","execution_count":564,"id":"fcd06afa-8aef-4779-9547-6ef2fbb9bbd8","metadata":{"id":"fcd06afa-8aef-4779-9547-6ef2fbb9bbd8"},"outputs":[{"data":{"text/html":["\n","\n","
\n"," \n"," \n"," \n"," Seed 1 \n"," Seed 2 \n"," Seed 3 \n"," Seed 4 \n"," Seed 5 \n"," Mean \n"," Std Dev \n"," Learning Cycle \n"," \n"," \n"," \n"," \n"," 0 \n"," 0 \n"," 0 \n"," 0 \n"," 0 \n"," 0 \n"," 0.0 \n"," 0.000000 \n"," 0 \n"," \n"," \n"," 1 \n"," 0 \n"," 0 \n"," 0 \n"," 0 \n"," 0 \n"," 0.0 \n"," 0.000000 \n"," 1 \n"," \n"," \n"," 2 \n"," 0 \n"," 0 \n"," 0 \n"," 0 \n"," 0 \n"," 0.0 \n"," 0.000000 \n"," 2 \n"," \n"," \n"," 3 \n"," 0 \n"," 0 \n"," 0 \n"," 0 \n"," 0 \n"," 0.0 \n"," 0.000000 \n"," 3 \n"," \n"," \n"," 4 \n"," 0 \n"," 0 \n"," 0 \n"," 0 \n"," 0 \n"," 0.0 \n"," 0.000000 \n"," 4 \n"," \n"," \n"," 5 \n"," 0 \n"," 0 \n"," 0 \n"," 0 \n"," 0 \n"," 0.0 \n"," 0.000000 \n"," 5 \n"," \n"," \n"," 6 \n"," 0 \n"," 1 \n"," 0 \n"," 0 \n"," 0 \n"," 0.2 \n"," 0.447214 \n"," 6 \n"," \n"," \n"," 7 \n"," 0 \n"," 1 \n"," 0 \n"," 0 \n"," 0 \n"," 0.2 \n"," 0.447214 \n"," 7 \n"," \n"," \n"," 8 \n"," 0 \n"," 1 \n"," 0 \n"," 0 \n"," 1 \n"," 0.4 \n"," 0.547723 \n"," 8 \n"," \n"," \n"," 9 \n"," 0 \n"," 1 \n"," 0 \n"," 0 \n"," 1 \n"," 0.4 \n"," 0.547723 \n"," 9 \n"," \n"," \n"," 10 \n"," 1 \n"," 2 \n"," 1 \n"," 1 \n"," 2 \n"," 1.4 \n"," 0.547723 \n"," 10 \n"," \n"," \n"," 11 \n"," 1 \n"," 2 \n"," 1 \n"," 2 \n"," 3 \n"," 1.8 \n"," 0.836660 \n"," 11 \n"," \n"," \n"," 12 \n"," 2 \n"," 3 \n"," 2 \n"," 3 \n"," 3 \n"," 2.6 \n"," 0.547723 \n"," 12 \n"," \n"," \n"," 13 \n"," 3 \n"," 3 \n"," 2 \n"," 4 \n"," 4 \n"," 3.2 \n"," 0.836660 \n"," 13 \n"," \n"," \n"," 14 \n"," 3 \n"," 4 \n"," 3 \n"," 4 \n"," 4 \n"," 3.6 \n"," 0.547723 \n"," 14 \n"," \n"," \n"," 15 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 15 \n"," \n"," \n"," 16 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 16 \n"," \n"," \n"," 17 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 17 \n"," \n"," \n"," 18 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 18 \n"," \n"," \n"," 19 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 19 \n"," \n"," \n"," 20 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 20 \n"," \n"," \n"," 21 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 21 \n"," \n"," \n"," 22 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 22 \n"," \n"," \n"," 23 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 23 \n"," \n"," \n"," 24 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 24 \n"," \n"," \n"," 25 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 25 \n"," \n"," \n"," 26 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 26 \n"," \n"," \n"," 27 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 27 \n"," \n"," \n"," 28 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 28 \n"," \n"," \n"," 29 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 29 \n"," \n"," \n"," 30 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 30 \n"," \n"," \n"," 31 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 31 \n"," \n"," \n"," 32 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 32 \n"," \n"," \n"," 33 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 33 \n"," \n"," \n"," 34 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 34 \n"," \n"," \n"," 35 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 35 \n"," \n"," \n"," 36 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 36 \n"," \n"," \n"," 37 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 37 \n"," \n"," \n"," 38 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 38 \n"," \n"," \n"," 39 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 39 \n"," \n"," \n"," 40 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 40 \n"," \n"," \n"," 41 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 41 \n"," \n"," \n"," 42 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 42 \n"," \n"," \n"," 43 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 43 \n"," \n"," \n"," 44 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 44 \n"," \n"," \n"," 45 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 45 \n"," \n"," \n"," 46 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 46 \n"," \n"," \n"," 47 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 47 \n"," \n"," \n"," 48 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 48 \n"," \n"," \n"," 49 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 49 \n"," \n"," \n"," 50 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 50 \n"," \n"," \n"," 51 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 4.0 \n"," 0.000000 \n"," 51 \n"," \n"," \n"," 52 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 5 \n"," 4.2 \n"," 0.447214 \n"," 52 \n"," \n"," \n"," 53 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 5 \n"," 4.2 \n"," 0.447214 \n"," 53 \n"," \n"," \n"," 54 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 5 \n"," 4.2 \n"," 0.447214 \n"," 54 \n"," \n"," \n"," 55 \n"," 4 \n"," 4 \n"," 4 \n"," 4 \n"," 5 \n"," 4.2 \n"," 0.447214 \n"," 55 \n"," \n"," \n"," 56 \n"," 4 \n"," 5 \n"," 4 \n"," 4 \n"," 5 \n"," 4.4 \n"," 0.547723 \n"," 56 \n"," \n"," \n"," 57 \n"," 4 \n"," 5 \n"," 4 \n"," 4 \n"," 5 \n"," 4.4 \n"," 0.547723 \n"," 57 \n"," \n"," \n"," 58 \n"," 5 \n"," 5 \n"," 5 \n"," 4 \n"," 5 \n"," 4.8 \n"," 0.447214 \n"," 58 \n"," \n"," \n"," 59 \n"," 5 \n"," 5 \n"," 5 \n"," 5 \n"," 5 \n"," 5.0 \n"," 0.000000 \n"," 59 \n"," \n"," \n","
\n","
"],"text/plain":[" Seed 1 Seed 2 Seed 3 Seed 4 Seed 5 Mean Std Dev Learning Cycle\n","0 0 0 0 0 0 0.0 0.000000 0\n","1 0 0 0 0 0 0.0 0.000000 1\n","2 0 0 0 0 0 0.0 0.000000 2\n","3 0 0 0 0 0 0.0 0.000000 3\n","4 0 0 0 0 0 0.0 0.000000 4\n","5 0 0 0 0 0 0.0 0.000000 5\n","6 0 1 0 0 0 0.2 0.447214 6\n","7 0 1 0 0 0 0.2 0.447214 7\n","8 0 1 0 0 1 0.4 0.547723 8\n","9 0 1 0 0 1 0.4 0.547723 9\n","10 1 2 1 1 2 1.4 0.547723 10\n","11 1 2 1 2 3 1.8 0.836660 11\n","12 2 3 2 3 3 2.6 0.547723 12\n","13 3 3 2 4 4 3.2 0.836660 13\n","14 3 4 3 4 4 3.6 0.547723 14\n","15 4 4 4 4 4 4.0 0.000000 15\n","16 4 4 4 4 4 4.0 0.000000 16\n","17 4 4 4 4 4 4.0 0.000000 17\n","18 4 4 4 4 4 4.0 0.000000 18\n","19 4 4 4 4 4 4.0 0.000000 19\n","20 4 4 4 4 4 4.0 0.000000 20\n","21 4 4 4 4 4 4.0 0.000000 21\n","22 4 4 4 4 4 4.0 0.000000 22\n","23 4 4 4 4 4 4.0 0.000000 23\n","24 4 4 4 4 4 4.0 0.000000 24\n","25 4 4 4 4 4 4.0 0.000000 25\n","26 4 4 4 4 4 4.0 0.000000 26\n","27 4 4 4 4 4 4.0 0.000000 27\n","28 4 4 4 4 4 4.0 0.000000 28\n","29 4 4 4 4 4 4.0 0.000000 29\n","30 4 4 4 4 4 4.0 0.000000 30\n","31 4 4 4 4 4 4.0 0.000000 31\n","32 4 4 4 4 4 4.0 0.000000 32\n","33 4 4 4 4 4 4.0 0.000000 33\n","34 4 4 4 4 4 4.0 0.000000 34\n","35 4 4 4 4 4 4.0 0.000000 35\n","36 4 4 4 4 4 4.0 0.000000 36\n","37 4 4 4 4 4 4.0 0.000000 37\n","38 4 4 4 4 4 4.0 0.000000 38\n","39 4 4 4 4 4 4.0 0.000000 39\n","40 4 4 4 4 4 4.0 0.000000 40\n","41 4 4 4 4 4 4.0 0.000000 41\n","42 4 4 4 4 4 4.0 0.000000 42\n","43 4 4 4 4 4 4.0 0.000000 43\n","44 4 4 4 4 4 4.0 0.000000 44\n","45 4 4 4 4 4 4.0 0.000000 45\n","46 4 4 4 4 4 4.0 0.000000 46\n","47 4 4 4 4 4 4.0 0.000000 47\n","48 4 4 4 4 4 4.0 0.000000 48\n","49 4 4 4 4 4 4.0 0.000000 49\n","50 4 4 4 4 4 4.0 0.000000 50\n","51 4 4 4 4 4 4.0 0.000000 51\n","52 4 4 4 4 5 4.2 0.447214 52\n","53 4 4 4 4 5 4.2 0.447214 53\n","54 4 4 4 4 5 4.2 0.447214 54\n","55 4 4 4 4 5 4.2 0.447214 55\n","56 4 5 4 4 5 4.4 0.547723 56\n","57 4 5 4 4 5 4.4 0.547723 57\n","58 5 5 5 4 5 4.8 0.447214 58\n","59 5 5 5 5 5 5.0 0.000000 59"]},"execution_count":564,"metadata":{},"output_type":"execute_result"}],"source":["#Get Average and Std Deviation of the run\n","\n","TopCount_mean = output_df.mean(axis= 'columns', skipna=True)\n","TopCount_std_dev = output_df.std(axis= 'columns', skipna=True)\n","\n","output_df['Mean'] = TopCount_mean\n","output_df['Std Dev'] = TopCount_std_dev\n","output_df['Learning Cycle'] = np.arange(0, longest_learning_cycle)\n","\n","output_df"]},{"cell_type":"code","execution_count":569,"id":"29b0cc1b","metadata":{},"outputs":[{"data":{"text/plain":["'Crossed barrel_dataset_3_0.01_Linear'"]},"execution_count":569,"metadata":{},"output_type":"execute_result"}],"source":["# #Output to CSV \n","output_name = f\"{combo['dataset'].split('.')[0]}_{combo['n_features']}_{combo['acq_func']}_{combo['model']}\"\n","output_name\n","\n","output_df.to_csv(f\"{output_name}.csv\")"]},{"cell_type":"code","execution_count":574,"id":"352671e2","metadata":{},"outputs":[{"data":{"image/png":"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PYVGoxFdu3YVb731ltv+xv69LwkhRHDGZoiIiIiCizUqREREFLaYqBAREVHYYqJCREREYYuJChEREYUtJipEREQUtpioEBERUdhiokJERERhi4kKETWpdu3a4aWXXgp1GEGxYsUKjzvtElFwMVEhaoamTp2K6667LtRheLV9+3b85S9/aZLX2r17NyZNmoT09HRotVp06tQJd999Nw4fPtwkr09EDcdEhYiCwm63+3VcamoqYmJiGjka4KuvvsJll10Gq9WKlStX4uDBg3j//fcRHx+PJ598stFfn4iCg4kKUQv066+/YuzYsdDpdEhPT8ef//xnFBcXu/avXr0aQ4cORUJCApKTk3HttdciLy/Ptf/YsWOQJAkffPABhg8fDq1Wi5UrV7pGcp5//nlkZmYiOTkZ06dPd0tiLp76kSQJb7/9Nq6//nrExMSgU6dO+PLLL93i/fLLL9GpUydotVpceeWVePfddyFJEsrLy72+P5PJhGnTpmHcuHH48ssvMWrUKLRv3x6DBg3C888/jzfffBNCCHTs2BHPP/+823P37NkDSZJw5MgRAEB5eTnuuece16hMz5498dVXX/m8tl988QUuueQSaLVadOjQAQsWLIDD4ajzvwkRecdEhaiFKS8vx1VXXYV+/fphx44dWL16Nc6dO4ebb77ZdUxVVRVmzpyJHTt24LvvvoNCocD1118PWZbdzvXYY4/hwQcfxMGDBzFmzBgAwPr165GXl4f169fj3XffxYoVK7BixYpaY1qwYAFuvvlm7N27F+PGjcNtt92G0tJSAEB+fj5uuukmXHfddfjll19wzz334P/+7/9qPd+aNWtQXFyMWbNmed2fkJAASZJwxx13YPny5W77li9fjiuuuAIdO3aELMsYO3YsNm/ejPfffx8HDhzA4sWLoVQqvZ73hx9+wO23344HH3wQBw4cwJtvvokVK1bgmWeeqTVeIqpF0G5vSERhY8qUKWLixIle9z311FNi9OjRbtsKCgoEAJ93PC0qKhIAxL59+4QQQuTn5wsA4qWXXvJ43ezsbOFwOFzbJk2aJCZPnux6nJ2dLV588UXXYwDiiSeecD2urKwUAMQ333wjhBBi9uzZomfPnm6v83//938CgCgrK/Ma79/+9jcBQJSWlnrdX+PUqVNCqVSKn3/+WQghhM1mEykpKWLFihVCCCHWrFkjFAqFz+uyfPlyER8f73o8cuRI8eyzz7od895774nMzMxa4yAi3ziiQtTC/PLLL1i/fj10Op3rp2vXrgDgmt7Jzc3Frbfeig4dOkCv16Ndu3YAgBMnTrida8CAAR7n79Gjh9uIQ2ZmJgoLC2uNqXfv3q5/x8bGQq/Xu55z6NAhDBw40O34Sy+9tNbzCT9vCp+VlYXx48fjnXfeAQD897//hdVqxaRJkwBUTwO1bt0anTt39ut8v/zyCxYuXOh2be+++26cOXMGJpPJr3MQkTtVqAMgoqZVWVmJCRMm4G9/+5vHvszMTADAhAkTkJ2djWXLliErKwuyLKNnz56w2Wxux8fGxnqcIyoqyu2xJEkeU0bBeE5tahKL3377DYMHD6712Lvuugt//vOf8eKLL2L58uWYPHmyq9g3Ojo6oNetrKzEggULcMMNN3js02q1AZ2LiKoxUSFqYS655BJ88sknaNeuHVQqz18BJSUlOHToEJYtW4Zhw4YBAH788cemDtOlS5cu+N///ue2bfv27bU+Z/To0UhJScFzzz2Hzz77zGN/eXm5q//JuHHjEBsbi6VLl2L16tXYtGmT67jevXvj5MmTOHz4sF+jKpdccgkOHTqEjh07+vHOiMgfTFSImqmKigrs2bPHbVvNKpxly5bh1ltvxaxZs5CUlIQjR45g1apVePvtt5GYmIjk5GS89dZbyMzMxIkTJ/DYY4+F5k0AuOeee7BkyRLMnj0bd955J/bs2eMqzpUkyetzYmNj8fbbb2PSpEn4wx/+gBkzZqBjx44oLi7Ghx9+iBMnTmDVqlUAAKVSialTp2LOnDno1KmT2wjM8OHDccUVV+DGG2/EkiVL0LFjR/z222+QJAnXXHONx+vOnTsX1157Ldq2bYubbroJCoUCv/zyC3799Vc8/fTTwb84RC0Aa1SImqkNGzagX79+bj8LFixAVlYWNm/eDKfTidGjR6NXr1546KGHkJCQAIVCAYVCgVWrVmHnzp3o2bMnHn74Yfz9738P2fto3749Pv74Y3z66afo3bs3li5d6lr1o9FofD5v4sSJ+OmnnxAVFYU//vGP6Nq1K2699VZUVFR4JA133nknbDYbpk2b5nGeTz75BAMHDsStt96K7t27Y9asWXA6nV5fc8yYMfjqq6+wdu1aDBw4EJdddhlefPFFZGdnN+AKELVskvC36oyIKEw888wzeOONN1BQUBCU8/3www8YOXIkCgoKkJ6eHpRzElFwcOqHiMLeP/7xDwwcOBDJycnYvHkz/v73v+P+++9v8HmtViuKioowf/58V6t9IgovTFSIKOzl5ubi6aefRmlpKdq2bYtHHnkEc+bMafB5//Of/+DOO+9E37598a9//SsIkRJRsHHqh4iIiMIWi2mJiIgobDFRISIiorDFRIWIiIjCFhMVIiIiCltMVIiIiChsMVEhIiKisMVEhYiIiMIWExUiIiIKW0xUiIiIKGz9fxQloxQIoVpuAAAAAElFTkSuQmCC","text/plain":[""]},"metadata":{},"output_type":"display_data"}],"source":["#Make a Nice Graph\n","fig, ax = plt.subplots()\n","\n","x = output_df['Learning Cycle']\n","y = output_df ['Mean']\n","\n","yerr0 = y - output_df['Std Dev']\n","yerr1 = y + output_df['Std Dev']\n","\n","#Plot and fill Std Dev\n","ax.plot(x,y)\n","plt.fill_between(x, yerr0, yerr1, color='C0', alpha=0.5)\n","\n","#Format the figure with axes labels\n","plt.xlabel(\"Learning Cycle\")\n","plt.ylabel(\"Top Samples Identified\")\n","plt.title(f\"{output_name}\")\n","\n","plt.savefig(f\"{output_name}.png\")\n","\n"]}],"metadata":{"colab":{"provenance":[]},"kernelspec":{"display_name":"Python 3 (ipykernel)","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.12.1"}},"nbformat":4,"nbformat_minor":5}
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "e8bb4295",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import numpy as np\n",
+ "import math\n",
+ "import pandas as pd\n",
+ "import os\n",
+ "import pickle\n",
+ "from sklearn import preprocessing\n",
+ "import random\n",
+ "from scipy.stats import norm\n",
+ "import time\n",
+ "from sklearn.ensemble import RandomForestRegressor, BaggingRegressor\n",
+ "from sklearn.linear_model import LinearRegression\n",
+ "import copy\n",
+ "from itertools import product\n",
+ "import seaborn as sns\n",
+ "import matplotlib.pyplot as plt\n",
+ "\n",
+ "\n",
+ "# TO DO: Instructions\n",
+ "# from matminer.featurizers.conversions import StrToComposition\n",
+ "# from matminer.featurizers.composition import ElementProperty, AtomicOrbitals, BandCenter"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "160e55f5-b540-4717-912a-a1731658149f",
+ "metadata": {
+ "id": "160e55f5-b540-4717-912a-a1731658149f"
+ },
+ "source": [
+ "# Process Data Functions"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "2726d963-5e53-4841-a1a6-5fbe63e7c1a4",
+ "metadata": {
+ "id": "2726d963-5e53-4841-a1a6-5fbe63e7c1a4"
+ },
+ "outputs": [],
+ "source": [
+ "# def featurize(df, formula_col='formula', pbar=False, n_jobs=None, n_chunksize=None):\n",
+ "# \"\"\"\n",
+ "# Extract magpie feature set from formula\n",
+ "# \"\"\"\n",
+ "# starttime = time.time()\n",
+ "# if formula_col not in list(df):\n",
+ "# raise KeyError(f\"Data does not contain {formula_col} column\")\n",
+ "# print(\"Featurizing dataset...\")\n",
+ "\n",
+ "# if n_jobs:\n",
+ "# stc.set_n_jobs(n_jobs)\n",
+ "\n",
+ "# stc = StrToComposition()\n",
+ "\n",
+ "# feat = stc.featurize_dataframe(df, formula_col, ignore_errors=True, pbar=pbar)\n",
+ "# element_property = ElementProperty.from_preset(preset_name='magpie')\n",
+ "# for f in [element_property, BandCenter(), AtomicOrbitals()]:\n",
+ "# if n_jobs:\n",
+ "# f.set_n_jobs(n_jobs)\n",
+ "# if n_chunksize:\n",
+ "# f.set_chunksize(n_chunksize)\n",
+ "# feat = f.featurize_dataframe(feat, \"composition\", pbar=pbar, ignore_errors=True)\n",
+ "\n",
+ "# feat = feat.set_index(feat[formula_col])\n",
+ "# print(f\"Featurization time: {round((time.time() - starttime) / 60, 2)} min\")\n",
+ "# return feat\n",
+ "\n",
+ "\n",
+ "def get_identical_cols(df):\n",
+ " \"\"\"\n",
+ " Get the columns of a dataframe which have identical values.\n",
+ " \"\"\"\n",
+ " xx = {}\n",
+ " for c in df:\n",
+ " vals1 = list(df[c])\n",
+ " for c2 in df:\n",
+ " vals2 = list(df[c2])\n",
+ " # if the columns contain identical values\n",
+ " if c != c2 and vals1 == vals2:\n",
+ " # if these values have not been seen before\n",
+ " if vals1 not in [list(df[y]) for y in xx]:\n",
+ " xx[c] = [c2]\n",
+ " # if these values have been seen before\n",
+ " else:\n",
+ " y = [yy for yy in xx if list(df[yy]) == vals1][0]\n",
+ " if c2 != y and c2 not in xx[y]:\n",
+ " xx[y].append(c2)\n",
+ " return xx\n",
+ "\n",
+ "\n",
+ "def process_dataset(df, target):\n",
+ " \"\"\"\n",
+ " Clean dataset and extract magpie features if formula is provided\n",
+ " \"\"\"\n",
+ " # drop extreme outlier rows?\n",
+ "\n",
+ " # featurize magpie datasets\n",
+ " # if 'formula' in df.columns:\n",
+ " # df = featurize(df)\n",
+ "\n",
+ " # remove non-numeric columns\n",
+ " df = df[[c for c in df if pd.api.types.is_numeric_dtype(df[c])]]\n",
+ " # remove columns with not many unique values?\n",
+ "\n",
+ " # remove constant columns\n",
+ " df = df.loc[:, (df != df.iloc[0]).any()]\n",
+ "\n",
+ " # change all infinite values to nan\n",
+ " df = df.replace([np.inf, -np.inf], np.nan)\n",
+ "\n",
+ " # remove rows containing a nan\n",
+ " df = df.dropna()\n",
+ "\n",
+ " # remove columns with identical values\n",
+ " remove_cols = [v0 for _, v in get_identical_cols(df).items() for v0 in v]\n",
+ " df = df[[c for c in df if c not in remove_cols]]\n",
+ "\n",
+ " # for some datasets, each input feature x could have been evaluated more than once.\n",
+ " # take average\n",
+ " features = set(df.columns)\n",
+ " features.remove(target)\n",
+ " df = df.groupby(list(features))[target].agg(lambda x: x.unique().mean())\n",
+ " df = (df.to_frame()).reset_index()\n",
+ " return df"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "373aadf9-1e35-4193-82ad-11696c70c623",
+ "metadata": {
+ "id": "373aadf9-1e35-4193-82ad-11696c70c623"
+ },
+ "source": [
+ "# Feature Engineering Functions"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "c8f90cdf-bc5a-4a4e-b3d1-6045bea83fb7",
+ "metadata": {
+ "id": "c8f90cdf-bc5a-4a4e-b3d1-6045bea83fb7"
+ },
+ "outputs": [],
+ "source": [
+ "def array_is_constant(arr: list) -> np.array:\n",
+ " \"\"\"Check if a 1D array is constant\"\"\"\n",
+ " return np.allclose(arr, np.repeat(arr[0], len(arr)))\n",
+ "\n",
+ "\n",
+ "def add_additional_cols(\n",
+ " df: pd.DataFrame,\n",
+ " ignore: list = [],\n",
+ " nat_log: bool = True,\n",
+ " powers: list = [-4, -3, -2, -1, -0.5, -0.333, -0.25, 0.25, 0.33, 0.5, 2, 3, 4],\n",
+ ") -> pd.DataFrame:\n",
+ " \"\"\"\n",
+ " Add additional columns to a dataframe by executing\n",
+ " mathematical operations on existing columns.\n",
+ " \"\"\"\n",
+ " # now raise existing columns to varying powers\n",
+ " new_col_names = []\n",
+ " new_vals_all = np.empty((len(df), 0))\n",
+ "\n",
+ " # loop over each column to use for creating additional columns\n",
+ " for c in [cc for cc in df if cc not in ignore]:\n",
+ "\n",
+ " # get original column values\n",
+ " vv = df[c].values\n",
+ "\n",
+ " # raise existing columns to various powers\n",
+ " for p in powers:\n",
+ " # first assess mathematical viability of different conditions.\n",
+ " # for example, we can't perform (-2)^(1/2).\n",
+ " # if conditions are met, save new column\n",
+ " if any(\n",
+ " [\n",
+ " p > 0 and isinstance(p, int), # pos integer powers\n",
+ " p < 0 and isinstance(p, int) and 0 not in vv, # neg integer powers\n",
+ " p > 0\n",
+ " and not isinstance(p, int)\n",
+ " and np.all(vv >= 0), # pos non-int powers\n",
+ " p < 0\n",
+ " and not isinstance(p, int)\n",
+ " and np.all(vv > 0), # neg non-int powers\n",
+ " ]\n",
+ " ):\n",
+ "\n",
+ " new_col_vals = np.float_power(vv, p).reshape((-1, 1))\n",
+ " if (\n",
+ " not array_is_constant(new_col_vals)\n",
+ " and np.isfinite(new_col_vals).all()\n",
+ " ):\n",
+ " new_vals_all = np.hstack((new_vals_all, new_col_vals))\n",
+ " new_col_names.append(f\"{c}**{str(p)}\")\n",
+ "\n",
+ " # take natural logs of existing columns\n",
+ " if nat_log:\n",
+ " if not c.startswith(\"ln \") and np.all(vv > 0):\n",
+ " new_col_vals = np.log(vv).reshape((-1, 1))\n",
+ " if (\n",
+ " not array_is_constant(new_col_vals)\n",
+ " and np.isfinite(new_col_vals).all()\n",
+ " ):\n",
+ " new_vals_all = np.hstack((new_vals_all, new_col_vals))\n",
+ " new_col_names.append(f\"{c}**ln\")\n",
+ "\n",
+ " # combine new columns with original columns in a single dataframe\n",
+ " new_df = pd.DataFrame(data=new_vals_all, columns=new_col_names, index=df.index)\n",
+ " df = pd.concat([df, new_df], axis=1)\n",
+ " return df\n",
+ "\n",
+ "\n",
+ "def find_top_n_features(df, original_features, target, n):\n",
+ " \"\"\"\n",
+ " Finds the top n features of the dataset according to how well they fit\n",
+ " to a quadratic polynomial.\n",
+ "\n",
+ " Note: A diversity criteria has been enforced to prevent the top features\n",
+ " being powers of the same feature when adding additional columns (ie. we are\n",
+ " trying to prevent the case where the top features are: [temp, temp**2, temp**3...])\n",
+ " \"\"\"\n",
+ " # obtain a list of all features\n",
+ " features = set(df.columns)\n",
+ " features.remove(target)\n",
+ " features = list(features)\n",
+ "\n",
+ " # create dictionary where the keys are the original features and the values\n",
+ " # are a list of tuples of the form: (r2, features based on original feature)\n",
+ " # eg. {'temp': [(0.9, temp), (0.87, temp**2), (0.95, temp**3)...]}\n",
+ " unsorted_features = {f: [] for f in original_features}\n",
+ " for col in features:\n",
+ " # find how well the feature fits to the target using a quadratic polynomial\n",
+ " fit = np.polyfit(df[col], df[target], 2, full=True)\n",
+ " ssr = fit[1] # sum of squared residuals\n",
+ " sst = np.sum((df[target] - df[target].mean())**2) # total sum of squares\n",
+ "\n",
+ " # if ssr is 0, numpy will return a blank list\n",
+ " if len(ssr) == 0:\n",
+ " # if the number of unique values is less than 4, the fit will always\n",
+ " # be perfect. Therefore, set ssr to sst and force r2 to be 0\n",
+ " if len(df[col].unique()) < 4:\n",
+ " ssr = sst\n",
+ " else:\n",
+ " ssr = 0\n",
+ " else:\n",
+ " ssr = ssr[0]\n",
+ " r2 = 1 - ssr / sst\n",
+ "\n",
+ " original_col = col.split('**')[0]\n",
+ " unsorted_features[original_col].append((r2, col))\n",
+ "\n",
+ " # sort features based on r2 value\n",
+ " # eg. {'temp': [(0.95, temp**3), (0.9, temp), (0.87, temp**2)...]}\n",
+ " sorted_features = {\n",
+ " f: sorted(unsorted_features[f])[::-1] for f in original_features\n",
+ " }\n",
+ "\n",
+ " # find top features while enforcing diversity criteria\n",
+ " top_n = []\n",
+ " for i in range(n):\n",
+ " # create mini list of top \"diverse\" features\n",
+ " # eg. [(0.98, temp**3), (0.95, theta**0.5), (0.99, t**3)...]\n",
+ " top_i = []\n",
+ " for original_col in sorted_features:\n",
+ " if i < len(sorted_features[original_col]):\n",
+ " top_i.append(sorted_features[original_col][i])\n",
+ "\n",
+ " # sort mini list of top \"diverse\" features\n",
+ " # eg. [(0.99, t**3), (0.98, temp**3), (0.95, theta**0.5)...]\n",
+ " top_i = sorted(top_i)[::-1]\n",
+ " for j in top_i:\n",
+ " top_n.append(j[1])\n",
+ " if len(top_n) >= n:\n",
+ " break\n",
+ " # once n features have been found, break out of loop\n",
+ " if len(top_n) >= n:\n",
+ " break\n",
+ "\n",
+ " return top_n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2f5ec23b-d139-4228-a317-f1164acb760a",
+ "metadata": {
+ "id": "2f5ec23b-d139-4228-a317-f1164acb760a"
+ },
+ "source": [
+ "# Predicting Functions"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "c2f4ae6b-d46d-4844-8b14-11ac735fce26",
+ "metadata": {
+ "id": "c2f4ae6b-d46d-4844-8b14-11ac735fce26"
+ },
+ "outputs": [],
+ "source": [
+ "def RF_pred(X, RF_model):\n",
+ " tree_predictions = []\n",
+ " for j in np.arange(n_est):\n",
+ " tree_predictions.append((RF_model.estimators_[j].predict(np.array([X]))).tolist())\n",
+ " mean = np.mean(np.array(tree_predictions), axis=0)[0]\n",
+ "\n",
+ "\n",
+ " std = np.std(np.array(tree_predictions), axis=0)[0]\n",
+ " return mean, std"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "95f37ac9-922a-42f0-8ea1-e586b74dd00f",
+ "metadata": {
+ "id": "95f37ac9-922a-42f0-8ea1-e586b74dd00f"
+ },
+ "source": [
+ "# Acquisition Functions"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "ad7cf7a1-edd0-4a93-b237-97468585f09d",
+ "metadata": {
+ "id": "ad7cf7a1-edd0-4a93-b237-97468585f09d"
+ },
+ "outputs": [],
+ "source": [
+ "def EI(mean, std, y_best, ratio):\n",
+ " std = ratio * std\n",
+ "\n",
+ " z = (y_best - mean)/std\n",
+ " return (y_best - mean) * norm.cdf(z) + std * norm.pdf(z)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b764198e-213d-4240-9093-bf042c6b7745",
+ "metadata": {
+ "id": "b764198e-213d-4240-9093-bf042c6b7745"
+ },
+ "source": [
+ "# Set up Combinations"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "09db2514-2f0c-4341-b4b6-87f10610b77c",
+ "metadata": {
+ "id": "09db2514-2f0c-4341-b4b6-87f10610b77c"
+ },
+ "outputs": [],
+ "source": [
+ "datasets = ['Crossed barrel_dataset.csv', 'double_perovskites_gap.csv', 'concrete_mod.csv'] # delete datasets you won't use\n",
+ "n_features = [3, 8, 20]\n",
+ "acq_func = [0.01, 1, 1.5]\n",
+ "model = ['Linear', 'RF']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "c6aacbd9-716d-4877-a750-afbd72c0406c",
+ "metadata": {
+ "id": "c6aacbd9-716d-4877-a750-afbd72c0406c"
+ },
+ "outputs": [],
+ "source": [
+ "hyperparameter_combinations = list(product(datasets, n_features, acq_func, model)) # find all combination of hyperparameters\n",
+ "\n",
+ "# put combos into dictionary for easier searching\n",
+ "all_combos = []\n",
+ "for combo in hyperparameter_combinations:\n",
+ " all_combos.append({\n",
+ " 'dataset': combo[0],\n",
+ " 'n_features': combo[1],\n",
+ " 'acq_func': combo[2],\n",
+ " 'model': combo[3]\n",
+ " })"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5677fefb-1895-4afc-84e5-c724742064b7",
+ "metadata": {
+ "id": "5677fefb-1895-4afc-84e5-c724742064b7"
+ },
+ "source": [
+ "# Pick Combo to Look At"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "30888f77-d8fc-4052-a540-37c4b60d0f58",
+ "metadata": {
+ "id": "30888f77-d8fc-4052-a540-37c4b60d0f58",
+ "outputId": "830343a5-fb11-4085-b2d8-a0167b11907c"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'dataset': 'Crossed barrel_dataset.csv',\n",
+ " 'n_features': 3,\n",
+ " 'acq_func': 0.01,\n",
+ " 'model': 'Linear'}"
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "n = 0\n",
+ "combo = all_combos[n]\n",
+ "combo"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "21fed3c0-922a-44cd-a003-bb3a666baa12",
+ "metadata": {
+ "id": "21fed3c0-922a-44cd-a003-bb3a666baa12"
+ },
+ "source": [
+ "# Read and Process Dataset"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "780a907f-7ca1-486f-84f5-7429f428eba0",
+ "metadata": {
+ "id": "780a907f-7ca1-486f-84f5-7429f428eba0",
+ "outputId": "cc3e63ae-9f95-48e7-b039-469705b8fe51"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " n \n",
+ " theta \n",
+ " r \n",
+ " t \n",
+ " toughness \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 6 \n",
+ " 0 \n",
+ " 1.5 \n",
+ " 0.70 \n",
+ " 1.144667 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 6 \n",
+ " 0 \n",
+ " 1.5 \n",
+ " 1.05 \n",
+ " 1.607561 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 6 \n",
+ " 0 \n",
+ " 1.5 \n",
+ " 1.40 \n",
+ " 1.144338 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 6 \n",
+ " 0 \n",
+ " 1.7 \n",
+ " 0.70 \n",
+ " 3.642738 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 6 \n",
+ " 0 \n",
+ " 1.7 \n",
+ " 1.05 \n",
+ " 3.748405 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " 1795 \n",
+ " 12 \n",
+ " 200 \n",
+ " 2.3 \n",
+ " 1.05 \n",
+ " 1.358975 \n",
+ " \n",
+ " \n",
+ " 1796 \n",
+ " 12 \n",
+ " 200 \n",
+ " 2.3 \n",
+ " 1.40 \n",
+ " 3.196306 \n",
+ " \n",
+ " \n",
+ " 1797 \n",
+ " 12 \n",
+ " 200 \n",
+ " 2.5 \n",
+ " 0.70 \n",
+ " 36.104187 \n",
+ " \n",
+ " \n",
+ " 1798 \n",
+ " 12 \n",
+ " 200 \n",
+ " 2.5 \n",
+ " 1.05 \n",
+ " 1.313487 \n",
+ " \n",
+ " \n",
+ " 1799 \n",
+ " 12 \n",
+ " 200 \n",
+ " 2.5 \n",
+ " 1.40 \n",
+ " 1.069728 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
1800 rows × 5 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " n theta r t toughness\n",
+ "0 6 0 1.5 0.70 1.144667\n",
+ "1 6 0 1.5 1.05 1.607561\n",
+ "2 6 0 1.5 1.40 1.144338\n",
+ "3 6 0 1.7 0.70 3.642738\n",
+ "4 6 0 1.7 1.05 3.748405\n",
+ "... .. ... ... ... ...\n",
+ "1795 12 200 2.3 1.05 1.358975\n",
+ "1796 12 200 2.3 1.40 3.196306\n",
+ "1797 12 200 2.5 0.70 36.104187\n",
+ "1798 12 200 2.5 1.05 1.313487\n",
+ "1799 12 200 2.5 1.40 1.069728\n",
+ "\n",
+ "[1800 rows x 5 columns]"
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# load a dataset\n",
+ "raw = pd.read_csv(f'./data/{combo['dataset']}')\n",
+ "raw"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 553,
+ "id": "d1f5960d-2e3f-411c-8e49-c94eddbfb522",
+ "metadata": {
+ "id": "d1f5960d-2e3f-411c-8e49-c94eddbfb522",
+ "outputId": "0b48f59b-7678-4b19-e2e9-3e89d5faaad4"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'toughness'"
+ ]
+ },
+ "execution_count": 553,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# define target\n",
+ "objective_name = list(raw.columns)[-1]\n",
+ "objective_name"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 554,
+ "id": "90fe8f74-3752-4c00-8666-af491fedae6a",
+ "metadata": {
+ "id": "90fe8f74-3752-4c00-8666-af491fedae6a",
+ "outputId": "01bd090c-6e92-4cb8-e05b-82e5923f7f94"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " t \n",
+ " r \n",
+ " theta \n",
+ " n \n",
+ " toughness \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 0.7 \n",
+ " 1.5 \n",
+ " 0 \n",
+ " 6 \n",
+ " 1.135453 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 0.7 \n",
+ " 1.5 \n",
+ " 0 \n",
+ " 8 \n",
+ " 1.970165 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 0.7 \n",
+ " 1.5 \n",
+ " 0 \n",
+ " 10 \n",
+ " 2.514642 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 0.7 \n",
+ " 1.5 \n",
+ " 0 \n",
+ " 12 \n",
+ " 2.581751 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 0.7 \n",
+ " 1.5 \n",
+ " 50 \n",
+ " 6 \n",
+ " 0.665487 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " 595 \n",
+ " 1.4 \n",
+ " 2.5 \n",
+ " 150 \n",
+ " 12 \n",
+ " 1.493588 \n",
+ " \n",
+ " \n",
+ " 596 \n",
+ " 1.4 \n",
+ " 2.5 \n",
+ " 200 \n",
+ " 6 \n",
+ " 20.968543 \n",
+ " \n",
+ " \n",
+ " 597 \n",
+ " 1.4 \n",
+ " 2.5 \n",
+ " 200 \n",
+ " 8 \n",
+ " 14.529138 \n",
+ " \n",
+ " \n",
+ " 598 \n",
+ " 1.4 \n",
+ " 2.5 \n",
+ " 200 \n",
+ " 10 \n",
+ " 2.154458 \n",
+ " \n",
+ " \n",
+ " 599 \n",
+ " 1.4 \n",
+ " 2.5 \n",
+ " 200 \n",
+ " 12 \n",
+ " 1.337742 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
600 rows × 5 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " t r theta n toughness\n",
+ "0 0.7 1.5 0 6 1.135453\n",
+ "1 0.7 1.5 0 8 1.970165\n",
+ "2 0.7 1.5 0 10 2.514642\n",
+ "3 0.7 1.5 0 12 2.581751\n",
+ "4 0.7 1.5 50 6 0.665487\n",
+ ".. ... ... ... .. ...\n",
+ "595 1.4 2.5 150 12 1.493588\n",
+ "596 1.4 2.5 200 6 20.968543\n",
+ "597 1.4 2.5 200 8 14.529138\n",
+ "598 1.4 2.5 200 10 2.154458\n",
+ "599 1.4 2.5 200 12 1.337742\n",
+ "\n",
+ "[600 rows x 5 columns]"
+ ]
+ },
+ "execution_count": 554,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# process dataset\n",
+ "processed = process_dataset(raw, objective_name)\n",
+ "processed"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 555,
+ "id": "53bd0354-1c53-4b8f-ba01-cab5a4f07de6",
+ "metadata": {
+ "id": "53bd0354-1c53-4b8f-ba01-cab5a4f07de6",
+ "outputId": "15a6b5a1-a3be-44c5-d350-190764a75b2a"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['t', 'r', 'theta', 'n']"
+ ]
+ },
+ "execution_count": 555,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "features = set(processed.columns)\n",
+ "features.remove(objective_name)\n",
+ "feature_name = list(features)\n",
+ "feature_name"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 556,
+ "id": "0937fe11-6d1c-4e04-9d8a-b9995099a74c",
+ "metadata": {
+ "id": "0937fe11-6d1c-4e04-9d8a-b9995099a74c",
+ "outputId": "11b411fc-5d28-4312-9e87-57276d9d1204"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " t \n",
+ " r \n",
+ " theta \n",
+ " n \n",
+ " toughness \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 0.7 \n",
+ " 1.5 \n",
+ " 0 \n",
+ " 6 \n",
+ " -1.135453 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 0.7 \n",
+ " 1.5 \n",
+ " 0 \n",
+ " 8 \n",
+ " -1.970165 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 0.7 \n",
+ " 1.5 \n",
+ " 0 \n",
+ " 10 \n",
+ " -2.514642 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 0.7 \n",
+ " 1.5 \n",
+ " 0 \n",
+ " 12 \n",
+ " -2.581751 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 0.7 \n",
+ " 1.5 \n",
+ " 50 \n",
+ " 6 \n",
+ " -0.665487 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " 595 \n",
+ " 1.4 \n",
+ " 2.5 \n",
+ " 150 \n",
+ " 12 \n",
+ " -1.493588 \n",
+ " \n",
+ " \n",
+ " 596 \n",
+ " 1.4 \n",
+ " 2.5 \n",
+ " 200 \n",
+ " 6 \n",
+ " -20.968543 \n",
+ " \n",
+ " \n",
+ " 597 \n",
+ " 1.4 \n",
+ " 2.5 \n",
+ " 200 \n",
+ " 8 \n",
+ " -14.529138 \n",
+ " \n",
+ " \n",
+ " 598 \n",
+ " 1.4 \n",
+ " 2.5 \n",
+ " 200 \n",
+ " 10 \n",
+ " -2.154458 \n",
+ " \n",
+ " \n",
+ " 599 \n",
+ " 1.4 \n",
+ " 2.5 \n",
+ " 200 \n",
+ " 12 \n",
+ " -1.337742 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
600 rows × 5 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " t r theta n toughness\n",
+ "0 0.7 1.5 0 6 -1.135453\n",
+ "1 0.7 1.5 0 8 -1.970165\n",
+ "2 0.7 1.5 0 10 -2.514642\n",
+ "3 0.7 1.5 0 12 -2.581751\n",
+ "4 0.7 1.5 50 6 -0.665487\n",
+ ".. ... ... ... .. ...\n",
+ "595 1.4 2.5 150 12 -1.493588\n",
+ "596 1.4 2.5 200 6 -20.968543\n",
+ "597 1.4 2.5 200 8 -14.529138\n",
+ "598 1.4 2.5 200 10 -2.154458\n",
+ "599 1.4 2.5 200 12 -1.337742\n",
+ "\n",
+ "[600 rows x 5 columns]"
+ ]
+ },
+ "execution_count": 556,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# we add negative sign to all of its objective values here\n",
+ "# because default BO in the framework below aims for global minimization\n",
+ "df = copy.deepcopy(processed)\n",
+ "df[objective_name] = -processed[objective_name].values\n",
+ "df"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b430f3f6-6531-462b-a2a9-cf95a28a91c1",
+ "metadata": {
+ "id": "b430f3f6-6531-462b-a2a9-cf95a28a91c1"
+ },
+ "source": [
+ "# Engineer New Features, Then Select Top n Features"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 557,
+ "id": "3029abb7-1a43-4426-8012-deedeaf7d349",
+ "metadata": {
+ "id": "3029abb7-1a43-4426-8012-deedeaf7d349",
+ "outputId": "99853349-b65a-4a58-ad38-967277edbf05"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['theta**2', 'r**4', 'n**2']"
+ ]
+ },
+ "execution_count": 557,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df = add_additional_cols(df, ignore=[objective_name])\n",
+ "top_n_features = find_top_n_features(df, feature_name, objective_name, combo['n_features'])\n",
+ "top_n_features"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b93ec941-d0bf-4835-a867-0dc9074ca152",
+ "metadata": {
+ "id": "b93ec941-d0bf-4835-a867-0dc9074ca152"
+ },
+ "source": [
+ "# Limit Number of Rows for Speed"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 558,
+ "id": "72af6006-e990-4456-8882-0311b8d5e0eb",
+ "metadata": {
+ "id": "72af6006-e990-4456-8882-0311b8d5e0eb",
+ "outputId": "79bb8cc5-2a9f-4118-ab6f-0f0c1da71868"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " index \n",
+ " t \n",
+ " r \n",
+ " theta \n",
+ " n \n",
+ " toughness \n",
+ " t**-4 \n",
+ " t**-3 \n",
+ " t**-2 \n",
+ " t**-1 \n",
+ " ... \n",
+ " n**-0.5 \n",
+ " n**-0.333 \n",
+ " n**-0.25 \n",
+ " n**0.25 \n",
+ " n**0.33 \n",
+ " n**0.5 \n",
+ " n**2 \n",
+ " n**3 \n",
+ " n**4 \n",
+ " n**ln \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 0 \n",
+ " 0.7 \n",
+ " 1.5 \n",
+ " 0 \n",
+ " 6 \n",
+ " -1.135453 \n",
+ " 4.164931 \n",
+ " 2.915452 \n",
+ " 2.040816 \n",
+ " 1.428571 \n",
+ " ... \n",
+ " 0.408248 \n",
+ " 0.550650 \n",
+ " 0.638943 \n",
+ " 1.565085 \n",
+ " 1.806300 \n",
+ " 2.449490 \n",
+ " 36.0 \n",
+ " 216.0 \n",
+ " 1296.0 \n",
+ " 1.791759 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 3 \n",
+ " 0.7 \n",
+ " 1.5 \n",
+ " 0 \n",
+ " 12 \n",
+ " -2.581751 \n",
+ " 4.164931 \n",
+ " 2.915452 \n",
+ " 2.040816 \n",
+ " 1.428571 \n",
+ " ... \n",
+ " 0.288675 \n",
+ " 0.437152 \n",
+ " 0.537285 \n",
+ " 1.861210 \n",
+ " 2.270543 \n",
+ " 3.464102 \n",
+ " 144.0 \n",
+ " 1728.0 \n",
+ " 20736.0 \n",
+ " 2.484907 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 9 \n",
+ " 0.7 \n",
+ " 1.5 \n",
+ " 100 \n",
+ " 8 \n",
+ " -1.176839 \n",
+ " 4.164931 \n",
+ " 2.915452 \n",
+ " 2.040816 \n",
+ " 1.428571 \n",
+ " ... \n",
+ " 0.353553 \n",
+ " 0.500347 \n",
+ " 0.594604 \n",
+ " 1.681793 \n",
+ " 1.986185 \n",
+ " 2.828427 \n",
+ " 64.0 \n",
+ " 512.0 \n",
+ " 4096.0 \n",
+ " 2.079442 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 13 \n",
+ " 0.7 \n",
+ " 1.5 \n",
+ " 150 \n",
+ " 8 \n",
+ " -15.097205 \n",
+ " 4.164931 \n",
+ " 2.915452 \n",
+ " 2.040816 \n",
+ " 1.428571 \n",
+ " ... \n",
+ " 0.353553 \n",
+ " 0.500347 \n",
+ " 0.594604 \n",
+ " 1.681793 \n",
+ " 1.986185 \n",
+ " 2.828427 \n",
+ " 64.0 \n",
+ " 512.0 \n",
+ " 4096.0 \n",
+ " 2.079442 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 17 \n",
+ " 0.7 \n",
+ " 1.5 \n",
+ " 200 \n",
+ " 8 \n",
+ " -19.157394 \n",
+ " 4.164931 \n",
+ " 2.915452 \n",
+ " 2.040816 \n",
+ " 1.428571 \n",
+ " ... \n",
+ " 0.353553 \n",
+ " 0.500347 \n",
+ " 0.594604 \n",
+ " 1.681793 \n",
+ " 1.986185 \n",
+ " 2.828427 \n",
+ " 64.0 \n",
+ " 512.0 \n",
+ " 4096.0 \n",
+ " 2.079442 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " 95 \n",
+ " 582 \n",
+ " 1.4 \n",
+ " 2.5 \n",
+ " 0 \n",
+ " 10 \n",
+ " -1.269999 \n",
+ " 0.260308 \n",
+ " 0.364431 \n",
+ " 0.510204 \n",
+ " 0.714286 \n",
+ " ... \n",
+ " 0.316228 \n",
+ " 0.464515 \n",
+ " 0.562341 \n",
+ " 1.778279 \n",
+ " 2.137962 \n",
+ " 3.162278 \n",
+ " 100.0 \n",
+ " 1000.0 \n",
+ " 10000.0 \n",
+ " 2.302585 \n",
+ " \n",
+ " \n",
+ " 96 \n",
+ " 585 \n",
+ " 1.4 \n",
+ " 2.5 \n",
+ " 50 \n",
+ " 8 \n",
+ " -1.892805 \n",
+ " 0.260308 \n",
+ " 0.364431 \n",
+ " 0.510204 \n",
+ " 0.714286 \n",
+ " ... \n",
+ " 0.353553 \n",
+ " 0.500347 \n",
+ " 0.594604 \n",
+ " 1.681793 \n",
+ " 1.986185 \n",
+ " 2.828427 \n",
+ " 64.0 \n",
+ " 512.0 \n",
+ " 4096.0 \n",
+ " 2.079442 \n",
+ " \n",
+ " \n",
+ " 97 \n",
+ " 588 \n",
+ " 1.4 \n",
+ " 2.5 \n",
+ " 100 \n",
+ " 6 \n",
+ " -21.595643 \n",
+ " 0.260308 \n",
+ " 0.364431 \n",
+ " 0.510204 \n",
+ " 0.714286 \n",
+ " ... \n",
+ " 0.408248 \n",
+ " 0.550650 \n",
+ " 0.638943 \n",
+ " 1.565085 \n",
+ " 1.806300 \n",
+ " 2.449490 \n",
+ " 36.0 \n",
+ " 216.0 \n",
+ " 1296.0 \n",
+ " 1.791759 \n",
+ " \n",
+ " \n",
+ " 98 \n",
+ " 591 \n",
+ " 1.4 \n",
+ " 2.5 \n",
+ " 100 \n",
+ " 12 \n",
+ " -1.550937 \n",
+ " 0.260308 \n",
+ " 0.364431 \n",
+ " 0.510204 \n",
+ " 0.714286 \n",
+ " ... \n",
+ " 0.288675 \n",
+ " 0.437152 \n",
+ " 0.537285 \n",
+ " 1.861210 \n",
+ " 2.270543 \n",
+ " 3.464102 \n",
+ " 144.0 \n",
+ " 1728.0 \n",
+ " 20736.0 \n",
+ " 2.484907 \n",
+ " \n",
+ " \n",
+ " 99 \n",
+ " 592 \n",
+ " 1.4 \n",
+ " 2.5 \n",
+ " 150 \n",
+ " 6 \n",
+ " -18.217728 \n",
+ " 0.260308 \n",
+ " 0.364431 \n",
+ " 0.510204 \n",
+ " 0.714286 \n",
+ " ... \n",
+ " 0.408248 \n",
+ " 0.550650 \n",
+ " 0.638943 \n",
+ " 1.565085 \n",
+ " 1.806300 \n",
+ " 2.449490 \n",
+ " 36.0 \n",
+ " 216.0 \n",
+ " 1296.0 \n",
+ " 1.791759 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
100 rows × 54 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " index t r theta n toughness t**-4 t**-3 t**-2 \\\n",
+ "0 0 0.7 1.5 0 6 -1.135453 4.164931 2.915452 2.040816 \n",
+ "1 3 0.7 1.5 0 12 -2.581751 4.164931 2.915452 2.040816 \n",
+ "2 9 0.7 1.5 100 8 -1.176839 4.164931 2.915452 2.040816 \n",
+ "3 13 0.7 1.5 150 8 -15.097205 4.164931 2.915452 2.040816 \n",
+ "4 17 0.7 1.5 200 8 -19.157394 4.164931 2.915452 2.040816 \n",
+ ".. ... ... ... ... .. ... ... ... ... \n",
+ "95 582 1.4 2.5 0 10 -1.269999 0.260308 0.364431 0.510204 \n",
+ "96 585 1.4 2.5 50 8 -1.892805 0.260308 0.364431 0.510204 \n",
+ "97 588 1.4 2.5 100 6 -21.595643 0.260308 0.364431 0.510204 \n",
+ "98 591 1.4 2.5 100 12 -1.550937 0.260308 0.364431 0.510204 \n",
+ "99 592 1.4 2.5 150 6 -18.217728 0.260308 0.364431 0.510204 \n",
+ "\n",
+ " t**-1 ... n**-0.5 n**-0.333 n**-0.25 n**0.25 n**0.33 \\\n",
+ "0 1.428571 ... 0.408248 0.550650 0.638943 1.565085 1.806300 \n",
+ "1 1.428571 ... 0.288675 0.437152 0.537285 1.861210 2.270543 \n",
+ "2 1.428571 ... 0.353553 0.500347 0.594604 1.681793 1.986185 \n",
+ "3 1.428571 ... 0.353553 0.500347 0.594604 1.681793 1.986185 \n",
+ "4 1.428571 ... 0.353553 0.500347 0.594604 1.681793 1.986185 \n",
+ ".. ... ... ... ... ... ... ... \n",
+ "95 0.714286 ... 0.316228 0.464515 0.562341 1.778279 2.137962 \n",
+ "96 0.714286 ... 0.353553 0.500347 0.594604 1.681793 1.986185 \n",
+ "97 0.714286 ... 0.408248 0.550650 0.638943 1.565085 1.806300 \n",
+ "98 0.714286 ... 0.288675 0.437152 0.537285 1.861210 2.270543 \n",
+ "99 0.714286 ... 0.408248 0.550650 0.638943 1.565085 1.806300 \n",
+ "\n",
+ " n**0.5 n**2 n**3 n**4 n**ln \n",
+ "0 2.449490 36.0 216.0 1296.0 1.791759 \n",
+ "1 3.464102 144.0 1728.0 20736.0 2.484907 \n",
+ "2 2.828427 64.0 512.0 4096.0 2.079442 \n",
+ "3 2.828427 64.0 512.0 4096.0 2.079442 \n",
+ "4 2.828427 64.0 512.0 4096.0 2.079442 \n",
+ ".. ... ... ... ... ... \n",
+ "95 3.162278 100.0 1000.0 10000.0 2.302585 \n",
+ "96 2.828427 64.0 512.0 4096.0 2.079442 \n",
+ "97 2.449490 36.0 216.0 1296.0 1.791759 \n",
+ "98 3.464102 144.0 1728.0 20736.0 2.484907 \n",
+ "99 2.449490 36.0 216.0 1296.0 1.791759 \n",
+ "\n",
+ "[100 rows x 54 columns]"
+ ]
+ },
+ "execution_count": 558,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "dataset_limit = 991\n",
+ "df = df.sample(dataset_limit, random_state=1).sort_index().reset_index()\n",
+ "df"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f19eed3f-002e-4540-9e30-98b75d439f98",
+ "metadata": {
+ "id": "f19eed3f-002e-4540-9e30-98b75d439f98"
+ },
+ "source": [
+ "# Split into X and y datasets"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 559,
+ "id": "9172285c-5f8b-4487-9430-dcc44cdd8cce",
+ "metadata": {
+ "id": "9172285c-5f8b-4487-9430-dcc44cdd8cce",
+ "outputId": "00f6fa69-48eb-42c8-f89c-e557a1bb352e"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "100\n"
+ ]
+ }
+ ],
+ "source": [
+ "# these are the input feature x and objective value y used in framework\n",
+ "X_feature = df[top_n_features].values\n",
+ "\n",
+ "y = np.array(df[objective_name].values)\n",
+ "\n",
+ "assert len(df) == len(X_feature) == len(y)\n",
+ "\n",
+ "# total number of data in set\n",
+ "N = len(df)\n",
+ "print(N)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ac428810-2c4d-48ea-950e-dbeca4a4c843",
+ "metadata": {
+ "id": "ac428810-2c4d-48ea-950e-dbeca4a4c843"
+ },
+ "source": [
+ "# Specify Parameters of Framework"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 560,
+ "id": "8f8ea549-c2be-49fa-9f9f-afa774424ee6",
+ "metadata": {
+ "id": "8f8ea549-c2be-49fa-9f9f-afa774424ee6"
+ },
+ "outputs": [],
+ "source": [
+ "# here are some parameters of the framework, feel free to modify for your own purposes\n",
+ "\n",
+ "# number of ensembles. in the paper n_ensemble = 50.\n",
+ "n_ensemble = 5\n",
+ "# number of top candidates, currently using top 5% of total dataset size\n",
+ "n_top = int(math.ceil(len(y) * 0.05))\n",
+ "# the top candidates and their indicies\n",
+ "top_indices = list(df.sort_values(objective_name).head(n_top).index)\n",
+ "# number of initial experiments\n",
+ "n_initial = 10\n",
+ "\n",
+ "# random seeds used to distinguish between different ensembles\n",
+ "# there are 300 of them, but only first n_ensemble are used\n",
+ "seed_list = [4295, 8508, 326, 3135, 1549, 2528, 1274, 6545, 5971, 6269, 2422, 4287, 9320, 4932, 951, 4304, 1745, 5956, 7620, 4545, 6003, 9885, 5548, 9477, 30, 8992, 7559, 5034, 9071, 6437, 3389, 9816, 8617, 3712, 3626, 1660, 3309, 2427, 9872, 938, 5156, 7409, 7672, 3411, 3559, 9966, 7331, 8273, 8484, 5127, 2260, 6054, 5205, 311, 6056, 9456, 928, 6424, 7438, 8701, 8634, 4002, 6634, 8102, 8503, 1540, 9254, 7972, 7737, 3410, 4052, 8640, 9659, 8093, 7076, 7268, 2046, 7492, 3103, 3034, 7874, 5438, 4297, 291, 5436, 9021, 3711, 7837, 9188, 2036, 8013, 6188, 3734, 187, 1438, 1061, 674, 777, 7231, 7096, 3360, 4278, 5817, 5514, 3442, 6805, 6750, 8548, 9751, 3526, 9969, 8979, 1526, 1551, 2058, 6325, 1237, 5917, 5821, 9946, 5049, 654, 7750, 5149, 3545, 9165, 2837, 5621, 6501, 595, 3181, 1747, 4405, 4480, 4282, 9262, 6219, 3960, 4999, 1495, 6007, 9642, 3902, 3133, 1085, 3278, 1104, 5939, 7153, 971, 8733, 3785, 9056, 2020, 7249, 5021, 3384, 8740, 4593, 7869, 9941, 8813, 3688, 8139, 6436, 3742, 5503, 1587, 4766, 9846, 9117, 7001, 4853, 9346, 4927, 8480, 5298, 4753, 1151, 9768, 5405, 6196, 5721, 3419, 8090, 8166, 7834, 1480, 1150, 9002, 1134, 2237, 3995, 2029, 5336, 7050, 6857, 8794, 1754, 1184, 3558, 658, 6804, 8750, 5088, 1136, 626, 8462, 5203, 3196, 979, 7419, 1162, 5451, 6492, 1562, 8145, 8937, 8764, 4174, 7639, 8902, 7003, 765, 1554, 6135, 1689, 9530, 1398, 2273, 7925, 5948, 1036, 868, 4617, 1203, 7680, 7, 93, 3128, 5694, 6979, 7136, 8084, 5770, 9301, 1599, 737, 7018, 3774, 9843, 2296, 2287, 9875, 2349, 2469, 8941, 4973, 3798, 54, 2938, 4665, 3942, 3951, 9400, 3094, 2248, 3376, 1926, 5180, 1773, 3681, 1808, 350, 6669, 826, 539, 5313, 6193, 5752, 9370, 2782, 8399, 4881, 3166, 4906, 5829, 4827, 29, 6899, 9012, 6986, 4175, 1035, 8320, 7802, 3777, 6340, 7798, 7705]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5ebeddf6-0a9a-4236-9af1-8c2acd91e781",
+ "metadata": {
+ "id": "5ebeddf6-0a9a-4236-9af1-8c2acd91e781"
+ },
+ "source": [
+ "# Run Framework"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 561,
+ "id": "daaa81f5-36d1-47ba-ab28-9c67ad0c30bd",
+ "metadata": {
+ "id": "daaa81f5-36d1-47ba-ab28-9c67ad0c30bd",
+ "outputId": "8826439c-7adc-4ca1-c7ae-361b1107079d"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "initializing seed = 0\n",
+ "0\n",
+ "num top: 1\n",
+ "1\n",
+ "num top: 1\n",
+ "2\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "num top: 2\n",
+ "3\n",
+ "num top: 3\n",
+ "4\n",
+ "num top: 3\n",
+ "5\n",
+ "num top: 4\n",
+ "6\n",
+ "num top: 4\n",
+ "7\n",
+ "num top: 4\n",
+ "8\n",
+ "num top: 4\n",
+ "9\n",
+ "num top: 4\n",
+ "10\n",
+ "num top: 4\n",
+ "11\n",
+ "num top: 4\n",
+ "12\n",
+ "num top: 4\n",
+ "13\n",
+ "num top: 4\n",
+ "14\n",
+ "num top: 4\n",
+ "15\n",
+ "num top: 4\n",
+ "16\n",
+ "num top: 4\n",
+ "17\n",
+ "num top: 4\n",
+ "18\n",
+ "num top: 4\n",
+ "19\n",
+ "num top: 4\n",
+ "20\n",
+ "num top: 4\n",
+ "21\n",
+ "num top: 4\n",
+ "22\n",
+ "num top: 4\n",
+ "23\n",
+ "num top: 4\n",
+ "24\n",
+ "num top: 4\n",
+ "25\n",
+ "num top: 4\n",
+ "26\n",
+ "num top: 4\n",
+ "27\n",
+ "num top: 4\n",
+ "28\n",
+ "num top: 4\n",
+ "29\n",
+ "num top: 4\n",
+ "30\n",
+ "num top: 4\n",
+ "31\n",
+ "num top: 4\n",
+ "32\n",
+ "num top: 4\n",
+ "33\n",
+ "num top: 4\n",
+ "34\n",
+ "num top: 4\n",
+ "35\n",
+ "num top: 4\n",
+ "36\n",
+ "num top: 4\n",
+ "37\n",
+ "num top: 4\n",
+ "38\n",
+ "num top: 4\n",
+ "39\n",
+ "num top: 4\n",
+ "40\n",
+ "num top: 4\n",
+ "41\n",
+ "num top: 4\n",
+ "42\n",
+ "num top: 4\n",
+ "43\n",
+ "num top: 4\n",
+ "44\n",
+ "num top: 4\n",
+ "45\n",
+ "num top: 4\n",
+ "46\n",
+ "num top: 4\n",
+ "47\n",
+ "num top: 4\n",
+ "48\n",
+ "num top: 5\n",
+ "Finished seed\n",
+ "initializing seed = 1\n",
+ "0\n",
+ "num top: 2\n",
+ "1\n",
+ "num top: 2\n",
+ "2\n",
+ "num top: 3\n",
+ "3\n",
+ "num top: 3\n",
+ "4\n",
+ "num top: 4\n",
+ "5\n",
+ "num top: 4\n",
+ "6\n",
+ "num top: 4\n",
+ "7\n",
+ "num top: 4\n",
+ "8\n",
+ "num top: 4\n",
+ "9\n",
+ "num top: 4\n",
+ "10\n",
+ "num top: 4\n",
+ "11\n",
+ "num top: 4\n",
+ "12\n",
+ "num top: 4\n",
+ "13\n",
+ "num top: 4\n",
+ "14\n",
+ "num top: 4\n",
+ "15\n",
+ "num top: 4\n",
+ "16\n",
+ "num top: 4\n",
+ "17\n",
+ "num top: 4\n",
+ "18\n",
+ "num top: 4\n",
+ "19\n",
+ "num top: 4\n",
+ "20\n",
+ "num top: 4\n",
+ "21\n",
+ "num top: 4\n",
+ "22\n",
+ "num top: 4\n",
+ "23\n",
+ "num top: 4\n",
+ "24\n",
+ "num top: 4\n",
+ "25\n",
+ "num top: 4\n",
+ "26\n",
+ "num top: 4\n",
+ "27\n",
+ "num top: 4\n",
+ "28\n",
+ "num top: 4\n",
+ "29\n",
+ "num top: 4\n",
+ "30\n",
+ "num top: 4\n",
+ "31\n",
+ "num top: 4\n",
+ "32\n",
+ "num top: 4\n",
+ "33\n",
+ "num top: 4\n",
+ "34\n",
+ "num top: 4\n",
+ "35\n",
+ "num top: 4\n",
+ "36\n",
+ "num top: 4\n",
+ "37\n",
+ "num top: 4\n",
+ "38\n",
+ "num top: 4\n",
+ "39\n",
+ "num top: 4\n",
+ "40\n",
+ "num top: 4\n",
+ "41\n",
+ "num top: 4\n",
+ "42\n",
+ "num top: 4\n",
+ "43\n",
+ "num top: 4\n",
+ "44\n",
+ "num top: 4\n",
+ "45\n",
+ "num top: 4\n",
+ "46\n",
+ "num top: 5\n",
+ "Finished seed\n",
+ "initializing seed = 2\n",
+ "0\n",
+ "num top: 1\n",
+ "1\n",
+ "num top: 1\n",
+ "2\n",
+ "num top: 2\n",
+ "3\n",
+ "num top: 2\n",
+ "4\n",
+ "num top: 3\n",
+ "5\n",
+ "num top: 4\n",
+ "6\n",
+ "num top: 4\n",
+ "7\n",
+ "num top: 4\n",
+ "8\n",
+ "num top: 4\n",
+ "9\n",
+ "num top: 4\n",
+ "10\n",
+ "num top: 4\n",
+ "11\n",
+ "num top: 4\n",
+ "12\n",
+ "num top: 4\n",
+ "13\n",
+ "num top: 4\n",
+ "14\n",
+ "num top: 4\n",
+ "15\n",
+ "num top: 4\n",
+ "16\n",
+ "num top: 4\n",
+ "17\n",
+ "num top: 4\n",
+ "18\n",
+ "num top: 4\n",
+ "19\n",
+ "num top: 4\n",
+ "20\n",
+ "num top: 4\n",
+ "21\n",
+ "num top: 4\n",
+ "22\n",
+ "num top: 4\n",
+ "23\n",
+ "num top: 4\n",
+ "24\n",
+ "num top: 4\n",
+ "25\n",
+ "num top: 4\n",
+ "26\n",
+ "num top: 4\n",
+ "27\n",
+ "num top: 4\n",
+ "28\n",
+ "num top: 4\n",
+ "29\n",
+ "num top: 4\n",
+ "30\n",
+ "num top: 4\n",
+ "31\n",
+ "num top: 4\n",
+ "32\n",
+ "num top: 4\n",
+ "33\n",
+ "num top: 4\n",
+ "34\n",
+ "num top: 4\n",
+ "35\n",
+ "num top: 4\n",
+ "36\n",
+ "num top: 4\n",
+ "37\n",
+ "num top: 4\n",
+ "38\n",
+ "num top: 4\n",
+ "39\n",
+ "num top: 4\n",
+ "40\n",
+ "num top: 4\n",
+ "41\n",
+ "num top: 4\n",
+ "42\n",
+ "num top: 4\n",
+ "43\n",
+ "num top: 4\n",
+ "44\n",
+ "num top: 4\n",
+ "45\n",
+ "num top: 4\n",
+ "46\n",
+ "num top: 4\n",
+ "47\n",
+ "num top: 4\n",
+ "48\n",
+ "num top: 5\n",
+ "Finished seed\n",
+ "initializing seed = 3\n",
+ "0\n",
+ "num top: 1\n",
+ "1\n",
+ "num top: 2\n",
+ "2\n",
+ "num top: 3\n",
+ "3\n",
+ "num top: 4\n",
+ "4\n",
+ "num top: 4\n",
+ "5\n",
+ "num top: 4\n",
+ "6\n",
+ "num top: 4\n",
+ "7\n",
+ "num top: 4\n",
+ "8\n",
+ "num top: 4\n",
+ "9\n",
+ "num top: 4\n",
+ "10\n",
+ "num top: 4\n",
+ "11\n",
+ "num top: 4\n",
+ "12\n",
+ "num top: 4\n",
+ "13\n",
+ "num top: 4\n",
+ "14\n",
+ "num top: 4\n",
+ "15\n",
+ "num top: 4\n",
+ "16\n",
+ "num top: 4\n",
+ "17\n",
+ "num top: 4\n",
+ "18\n",
+ "num top: 4\n",
+ "19\n",
+ "num top: 4\n",
+ "20\n",
+ "num top: 4\n",
+ "21\n",
+ "num top: 4\n",
+ "22\n",
+ "num top: 4\n",
+ "23\n",
+ "num top: 4\n",
+ "24\n",
+ "num top: 4\n",
+ "25\n",
+ "num top: 4\n",
+ "26\n",
+ "num top: 4\n",
+ "27\n",
+ "num top: 4\n",
+ "28\n",
+ "num top: 4\n",
+ "29\n",
+ "num top: 4\n",
+ "30\n",
+ "num top: 4\n",
+ "31\n",
+ "num top: 4\n",
+ "32\n",
+ "num top: 4\n",
+ "33\n",
+ "num top: 4\n",
+ "34\n",
+ "num top: 4\n",
+ "35\n",
+ "num top: 4\n",
+ "36\n",
+ "num top: 4\n",
+ "37\n",
+ "num top: 4\n",
+ "38\n",
+ "num top: 4\n",
+ "39\n",
+ "num top: 4\n",
+ "40\n",
+ "num top: 4\n",
+ "41\n",
+ "num top: 4\n",
+ "42\n",
+ "num top: 4\n",
+ "43\n",
+ "num top: 4\n",
+ "44\n",
+ "num top: 4\n",
+ "45\n",
+ "num top: 4\n",
+ "46\n",
+ "num top: 4\n",
+ "47\n",
+ "num top: 4\n",
+ "48\n",
+ "num top: 4\n",
+ "49\n",
+ "num top: 5\n",
+ "Finished seed\n",
+ "initializing seed = 4\n",
+ "0\n",
+ "num top: 2\n",
+ "1\n",
+ "num top: 3\n",
+ "2\n",
+ "num top: 3\n",
+ "3\n",
+ "num top: 4\n",
+ "4\n",
+ "num top: 4\n",
+ "5\n",
+ "num top: 4\n",
+ "6\n",
+ "num top: 4\n",
+ "7\n",
+ "num top: 4\n",
+ "8\n",
+ "num top: 4\n",
+ "9\n",
+ "num top: 4\n",
+ "10\n",
+ "num top: 4\n",
+ "11\n",
+ "num top: 4\n",
+ "12\n",
+ "num top: 4\n",
+ "13\n",
+ "num top: 4\n",
+ "14\n",
+ "num top: 4\n",
+ "15\n",
+ "num top: 4\n",
+ "16\n",
+ "num top: 4\n",
+ "17\n",
+ "num top: 4\n",
+ "18\n",
+ "num top: 4\n",
+ "19\n",
+ "num top: 4\n",
+ "20\n",
+ "num top: 4\n",
+ "21\n",
+ "num top: 4\n",
+ "22\n",
+ "num top: 4\n",
+ "23\n",
+ "num top: 4\n",
+ "24\n",
+ "num top: 4\n",
+ "25\n",
+ "num top: 4\n",
+ "26\n",
+ "num top: 4\n",
+ "27\n",
+ "num top: 4\n",
+ "28\n",
+ "num top: 4\n",
+ "29\n",
+ "num top: 4\n",
+ "30\n",
+ "num top: 4\n",
+ "31\n",
+ "num top: 4\n",
+ "32\n",
+ "num top: 4\n",
+ "33\n",
+ "num top: 4\n",
+ "34\n",
+ "num top: 4\n",
+ "35\n",
+ "num top: 4\n",
+ "36\n",
+ "num top: 4\n",
+ "37\n",
+ "num top: 4\n",
+ "38\n",
+ "num top: 4\n",
+ "39\n",
+ "num top: 4\n",
+ "40\n",
+ "num top: 4\n",
+ "41\n",
+ "num top: 4\n",
+ "42\n",
+ "num top: 5\n",
+ "Finished seed\n",
+ "16.344209909439087\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "[[0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 1,\n",
+ " 1,\n",
+ " 2,\n",
+ " 3,\n",
+ " 3,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 5],\n",
+ " [0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 1,\n",
+ " 1,\n",
+ " 1,\n",
+ " 1,\n",
+ " 2,\n",
+ " 2,\n",
+ " 3,\n",
+ " 3,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 5],\n",
+ " [0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 1,\n",
+ " 1,\n",
+ " 2,\n",
+ " 2,\n",
+ " 3,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 5],\n",
+ " [0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 1,\n",
+ " 2,\n",
+ " 3,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 5],\n",
+ " [0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 1,\n",
+ " 1,\n",
+ " 2,\n",
+ " 3,\n",
+ " 3,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 5]]"
+ ]
+ },
+ "execution_count": 561,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# framework\n",
+ "\n",
+ "\n",
+ "# good practice to keep check of time used\n",
+ "start_time = time.time()\n",
+ "\n",
+ "# these will carry results along optimization sequence from all n_ensemble runs\n",
+ "index_collection = []\n",
+ "X_collection = []\n",
+ "y_collection = []\n",
+ "TopCount_collection = []\n",
+ "\n",
+ "#keep track of longest learning cycle\n",
+ "longest_learning_cycle = 0\n",
+ "\n",
+ "\n",
+ "for s in seed_list:\n",
+ "\n",
+ " if len(index_collection) == n_ensemble:\n",
+ " break\n",
+ "\n",
+ " print('initializing seed = ' +str(seed_list.index(s)))\n",
+ " random.seed(s)\n",
+ "\n",
+ " indices = list(np.arange(N))\n",
+ "# index_learn is the pool of candidates to be examined\n",
+ " index_learn = indices.copy()\n",
+ "# index_ is the list of candidates we have already observed\n",
+ "# adding in the initial experiments\n",
+ " index_ = random.sample(index_learn, n_initial)\n",
+ "\n",
+ "# list to store all observed good candidates' input feature X\n",
+ " X_ = []\n",
+ "# list to store all observed good candidates' objective value y\n",
+ " y_ = []\n",
+ "# number of top candidates found so far\n",
+ " c = 0\n",
+ "# list of cumulative number of top candidates found at each learning cycle\n",
+ " TopCount_ = []\n",
+ "# add the first n_initial experiments to collection\n",
+ " for i in index_:\n",
+ " X_.append(X_feature[i])\n",
+ " y_.append(y[i])\n",
+ " if i in top_indices:\n",
+ " c += 1\n",
+ " TopCount_.append(c)\n",
+ " index_learn.remove(i)\n",
+ "\n",
+ "\n",
+ "# for each of the the rest of (N - n_initial) learning cycles\n",
+ "# this for loop ends when all candidates in pool are observed\n",
+ "\n",
+ " lawrence = 0\n",
+ " for i in np.arange(len(index_learn)):\n",
+ " print(lawrence)\n",
+ " lawrence += 1\n",
+ " y_best = np.min(y_)\n",
+ "\n",
+ " s_scaler = preprocessing.StandardScaler()\n",
+ " X_train = s_scaler.fit_transform(X_)\n",
+ " y_train = s_scaler.fit_transform([[i] for i in y_])\n",
+ " y_train = np.ravel(y_train)\n",
+ "\n",
+ " if combo['model'] == 'RF':\n",
+ " n_est = 50\n",
+ " model = RandomForestRegressor(n_estimators= n_est, n_jobs= -1)\n",
+ " model.fit(X_train, y_train)\n",
+ " else:\n",
+ " n_est = 5\n",
+ " model = BaggingRegressor(LinearRegression(),n_estimators = n_est, n_jobs = -1)\n",
+ " model.fit(X_train, y_train)\n",
+ "\n",
+ "\n",
+ "# by evaluating acquisition function values at candidates remaining in pool\n",
+ "# we choose candidate with larger acquisition function value to be observed next\n",
+ " next_index = None\n",
+ " max_ac = -10**10\n",
+ " for j in index_learn:\n",
+ " X_j = X_feature[j]\n",
+ " y_j = y[j]\n",
+ "\n",
+ " # TODO: CREATE PREDICTION FUNCTION WITH UNCERTAINTY\n",
+ " ensemble_predictions = []\n",
+ " for k in np.arange(n_est):\n",
+ " ensemble_predictions.append((model.estimators_[k].predict(np.array([X_j]))).tolist())\n",
+ " mean = np.mean(np.array(ensemble_predictions), axis=0)[0]\n",
+ " std = np.std(np.array(ensemble_predictions), axis=0)[0]\n",
+ "\n",
+ " # select acquisition function\n",
+ " ac_value = EI(mean, std, y_best, combo['acq_func'])\n",
+ "\n",
+ " if max_ac <= ac_value:\n",
+ " max_ac = ac_value\n",
+ " next_index = j\n",
+ "\n",
+ "\n",
+ "\n",
+ " X_.append(X_feature[next_index])\n",
+ " y_.append(y[next_index])\n",
+ "\n",
+ "\n",
+ " if next_index in top_indices:\n",
+ " c += 1\n",
+ " print('num top: ', c)\n",
+ "\n",
+ " TopCount_.append(c)\n",
+ "\n",
+ " index_learn.remove(next_index)\n",
+ " index_.append(next_index)\n",
+ " if c == len(top_indices):\n",
+ " break\n",
+ "\n",
+ " if len(TopCount_)>longest_learning_cycle:\n",
+ " longest_learning_cycle = len(TopCount_) \n",
+ " \n",
+ "\n",
+ " # assert len(index_) == N\n",
+ "\n",
+ " index_collection.append(index_)\n",
+ " X_collection.append(X_)\n",
+ " y_collection.append(y_)\n",
+ " TopCount_collection.append(TopCount_)\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ " print('Finished seed')\n",
+ "\n",
+ "total_time = time.time() - start_time\n",
+ "print(total_time)\n",
+ "TopCount_collection # PUT INTO DATASET\n",
+ "\n",
+ "\n",
+ "# master = np.array([index_collection, X_collection, y_collection, TopCount_collection, total_time])\n",
+ "# # #TODO: name output file\n",
+ "# np.save(f'{combo[\"dataset\"]} ({combo[\"n_features\"]}, {combo[\"acq_func\"]}, {combo[\"model\"]})', TopCount_collection)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c6cefbca",
+ "metadata": {},
+ "source": [
+ "# Graphing Results of Run"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 562,
+ "id": "9fc5145b-b6cc-4ba3-a86e-c4851026c6f5",
+ "metadata": {
+ "id": "9fc5145b-b6cc-4ba3-a86e-c4851026c6f5"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[[0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 1,\n",
+ " 1,\n",
+ " 2,\n",
+ " 3,\n",
+ " 3,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 5],\n",
+ " [0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 1,\n",
+ " 1,\n",
+ " 1,\n",
+ " 1,\n",
+ " 2,\n",
+ " 2,\n",
+ " 3,\n",
+ " 3,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 5],\n",
+ " [0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 1,\n",
+ " 1,\n",
+ " 2,\n",
+ " 2,\n",
+ " 3,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 5],\n",
+ " [0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 1,\n",
+ " 2,\n",
+ " 3,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 5],\n",
+ " [0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 0,\n",
+ " 1,\n",
+ " 1,\n",
+ " 2,\n",
+ " 3,\n",
+ " 3,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 4,\n",
+ " 5]]"
+ ]
+ },
+ "execution_count": 562,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "#TODO use seaborn to output line function with error bars, save the figures and the csv (New CSV for each combo)\n",
+ "\n",
+ "TopCount_collection\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 563,
+ "id": "887bd7b0",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "output_array=[]\n",
+ "#Double for-loop magic to add extra values to compensate as TopCount is likely jagged array\n",
+ "#This adds the MAXIMUM Number IS EVERYONE OK WITH THIS SOS\n",
+ "\n",
+ "for i in range(len(TopCount_collection)): \n",
+ " for j in range(longest_learning_cycle):\n",
+ " if j >= len(TopCount_collection[i]):\n",
+ " TopCount_collection[i].append(TopCount_collection[i][j-1])\n",
+ "\n",
+ "for i in range(len(TopCount_collection)):\n",
+ " output_array.append(np.array(TopCount_collection[i]))\n",
+ "\n",
+ "#make an output dataframe summarizing the output of each run SOS Relies on n_ensemble == 5\n",
+ "\n",
+ "output_df = pd.DataFrame(output_array, index=[\"Seed 1\", \"Seed 2\", \"Seed 3\", \"Seed 4\", \"Seed 5\"])\n",
+ "output_df = output_df.T\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 564,
+ "id": "fcd06afa-8aef-4779-9547-6ef2fbb9bbd8",
+ "metadata": {
+ "id": "fcd06afa-8aef-4779-9547-6ef2fbb9bbd8"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Seed 1 \n",
+ " Seed 2 \n",
+ " Seed 3 \n",
+ " Seed 4 \n",
+ " Seed 5 \n",
+ " Mean \n",
+ " Std Dev \n",
+ " Learning Cycle \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0.0 \n",
+ " 0.000000 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0.0 \n",
+ " 0.000000 \n",
+ " 1 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0.0 \n",
+ " 0.000000 \n",
+ " 2 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0.0 \n",
+ " 0.000000 \n",
+ " 3 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0.0 \n",
+ " 0.000000 \n",
+ " 4 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0.0 \n",
+ " 0.000000 \n",
+ " 5 \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " 0 \n",
+ " 1 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0.2 \n",
+ " 0.447214 \n",
+ " 6 \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " 0 \n",
+ " 1 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0.2 \n",
+ " 0.447214 \n",
+ " 7 \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " 0 \n",
+ " 1 \n",
+ " 0 \n",
+ " 0 \n",
+ " 1 \n",
+ " 0.4 \n",
+ " 0.547723 \n",
+ " 8 \n",
+ " \n",
+ " \n",
+ " 9 \n",
+ " 0 \n",
+ " 1 \n",
+ " 0 \n",
+ " 0 \n",
+ " 1 \n",
+ " 0.4 \n",
+ " 0.547723 \n",
+ " 9 \n",
+ " \n",
+ " \n",
+ " 10 \n",
+ " 1 \n",
+ " 2 \n",
+ " 1 \n",
+ " 1 \n",
+ " 2 \n",
+ " 1.4 \n",
+ " 0.547723 \n",
+ " 10 \n",
+ " \n",
+ " \n",
+ " 11 \n",
+ " 1 \n",
+ " 2 \n",
+ " 1 \n",
+ " 2 \n",
+ " 3 \n",
+ " 1.8 \n",
+ " 0.836660 \n",
+ " 11 \n",
+ " \n",
+ " \n",
+ " 12 \n",
+ " 2 \n",
+ " 3 \n",
+ " 2 \n",
+ " 3 \n",
+ " 3 \n",
+ " 2.6 \n",
+ " 0.547723 \n",
+ " 12 \n",
+ " \n",
+ " \n",
+ " 13 \n",
+ " 3 \n",
+ " 3 \n",
+ " 2 \n",
+ " 4 \n",
+ " 4 \n",
+ " 3.2 \n",
+ " 0.836660 \n",
+ " 13 \n",
+ " \n",
+ " \n",
+ " 14 \n",
+ " 3 \n",
+ " 4 \n",
+ " 3 \n",
+ " 4 \n",
+ " 4 \n",
+ " 3.6 \n",
+ " 0.547723 \n",
+ " 14 \n",
+ " \n",
+ " \n",
+ " 15 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4.0 \n",
+ " 0.000000 \n",
+ " 15 \n",
+ " \n",
+ " \n",
+ " 16 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4.0 \n",
+ " 0.000000 \n",
+ " 16 \n",
+ " \n",
+ " \n",
+ " 17 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4.0 \n",
+ " 0.000000 \n",
+ " 17 \n",
+ " \n",
+ " \n",
+ " 18 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4.0 \n",
+ " 0.000000 \n",
+ " 18 \n",
+ " \n",
+ " \n",
+ " 19 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4.0 \n",
+ " 0.000000 \n",
+ " 19 \n",
+ " \n",
+ " \n",
+ " 20 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4.0 \n",
+ " 0.000000 \n",
+ " 20 \n",
+ " \n",
+ " \n",
+ " 21 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4.0 \n",
+ " 0.000000 \n",
+ " 21 \n",
+ " \n",
+ " \n",
+ " 22 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4.0 \n",
+ " 0.000000 \n",
+ " 22 \n",
+ " \n",
+ " \n",
+ " 23 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4.0 \n",
+ " 0.000000 \n",
+ " 23 \n",
+ " \n",
+ " \n",
+ " 24 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4.0 \n",
+ " 0.000000 \n",
+ " 24 \n",
+ " \n",
+ " \n",
+ " 25 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4.0 \n",
+ " 0.000000 \n",
+ " 25 \n",
+ " \n",
+ " \n",
+ " 26 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4.0 \n",
+ " 0.000000 \n",
+ " 26 \n",
+ " \n",
+ " \n",
+ " 27 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4.0 \n",
+ " 0.000000 \n",
+ " 27 \n",
+ " \n",
+ " \n",
+ " 28 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4.0 \n",
+ " 0.000000 \n",
+ " 28 \n",
+ " \n",
+ " \n",
+ " 29 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4.0 \n",
+ " 0.000000 \n",
+ " 29 \n",
+ " \n",
+ " \n",
+ " 30 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4.0 \n",
+ " 0.000000 \n",
+ " 30 \n",
+ " \n",
+ " \n",
+ " 31 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4.0 \n",
+ " 0.000000 \n",
+ " 31 \n",
+ " \n",
+ " \n",
+ " 32 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4.0 \n",
+ " 0.000000 \n",
+ " 32 \n",
+ " \n",
+ " \n",
+ " 33 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4.0 \n",
+ " 0.000000 \n",
+ " 33 \n",
+ " \n",
+ " \n",
+ " 34 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4.0 \n",
+ " 0.000000 \n",
+ " 34 \n",
+ " \n",
+ " \n",
+ " 35 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4.0 \n",
+ " 0.000000 \n",
+ " 35 \n",
+ " \n",
+ " \n",
+ " 36 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4.0 \n",
+ " 0.000000 \n",
+ " 36 \n",
+ " \n",
+ " \n",
+ " 37 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4.0 \n",
+ " 0.000000 \n",
+ " 37 \n",
+ " \n",
+ " \n",
+ " 38 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4.0 \n",
+ " 0.000000 \n",
+ " 38 \n",
+ " \n",
+ " \n",
+ " 39 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4.0 \n",
+ " 0.000000 \n",
+ " 39 \n",
+ " \n",
+ " \n",
+ " 40 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4.0 \n",
+ " 0.000000 \n",
+ " 40 \n",
+ " \n",
+ " \n",
+ " 41 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4.0 \n",
+ " 0.000000 \n",
+ " 41 \n",
+ " \n",
+ " \n",
+ " 42 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4.0 \n",
+ " 0.000000 \n",
+ " 42 \n",
+ " \n",
+ " \n",
+ " 43 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4.0 \n",
+ " 0.000000 \n",
+ " 43 \n",
+ " \n",
+ " \n",
+ " 44 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4.0 \n",
+ " 0.000000 \n",
+ " 44 \n",
+ " \n",
+ " \n",
+ " 45 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4.0 \n",
+ " 0.000000 \n",
+ " 45 \n",
+ " \n",
+ " \n",
+ " 46 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4.0 \n",
+ " 0.000000 \n",
+ " 46 \n",
+ " \n",
+ " \n",
+ " 47 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4.0 \n",
+ " 0.000000 \n",
+ " 47 \n",
+ " \n",
+ " \n",
+ " 48 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4.0 \n",
+ " 0.000000 \n",
+ " 48 \n",
+ " \n",
+ " \n",
+ " 49 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4.0 \n",
+ " 0.000000 \n",
+ " 49 \n",
+ " \n",
+ " \n",
+ " 50 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4.0 \n",
+ " 0.000000 \n",
+ " 50 \n",
+ " \n",
+ " \n",
+ " 51 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4.0 \n",
+ " 0.000000 \n",
+ " 51 \n",
+ " \n",
+ " \n",
+ " 52 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 5 \n",
+ " 4.2 \n",
+ " 0.447214 \n",
+ " 52 \n",
+ " \n",
+ " \n",
+ " 53 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 5 \n",
+ " 4.2 \n",
+ " 0.447214 \n",
+ " 53 \n",
+ " \n",
+ " \n",
+ " 54 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 5 \n",
+ " 4.2 \n",
+ " 0.447214 \n",
+ " 54 \n",
+ " \n",
+ " \n",
+ " 55 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " 5 \n",
+ " 4.2 \n",
+ " 0.447214 \n",
+ " 55 \n",
+ " \n",
+ " \n",
+ " 56 \n",
+ " 4 \n",
+ " 5 \n",
+ " 4 \n",
+ " 4 \n",
+ " 5 \n",
+ " 4.4 \n",
+ " 0.547723 \n",
+ " 56 \n",
+ " \n",
+ " \n",
+ " 57 \n",
+ " 4 \n",
+ " 5 \n",
+ " 4 \n",
+ " 4 \n",
+ " 5 \n",
+ " 4.4 \n",
+ " 0.547723 \n",
+ " 57 \n",
+ " \n",
+ " \n",
+ " 58 \n",
+ " 5 \n",
+ " 5 \n",
+ " 5 \n",
+ " 4 \n",
+ " 5 \n",
+ " 4.8 \n",
+ " 0.447214 \n",
+ " 58 \n",
+ " \n",
+ " \n",
+ " 59 \n",
+ " 5 \n",
+ " 5 \n",
+ " 5 \n",
+ " 5 \n",
+ " 5 \n",
+ " 5.0 \n",
+ " 0.000000 \n",
+ " 59 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Seed 1 Seed 2 Seed 3 Seed 4 Seed 5 Mean Std Dev Learning Cycle\n",
+ "0 0 0 0 0 0 0.0 0.000000 0\n",
+ "1 0 0 0 0 0 0.0 0.000000 1\n",
+ "2 0 0 0 0 0 0.0 0.000000 2\n",
+ "3 0 0 0 0 0 0.0 0.000000 3\n",
+ "4 0 0 0 0 0 0.0 0.000000 4\n",
+ "5 0 0 0 0 0 0.0 0.000000 5\n",
+ "6 0 1 0 0 0 0.2 0.447214 6\n",
+ "7 0 1 0 0 0 0.2 0.447214 7\n",
+ "8 0 1 0 0 1 0.4 0.547723 8\n",
+ "9 0 1 0 0 1 0.4 0.547723 9\n",
+ "10 1 2 1 1 2 1.4 0.547723 10\n",
+ "11 1 2 1 2 3 1.8 0.836660 11\n",
+ "12 2 3 2 3 3 2.6 0.547723 12\n",
+ "13 3 3 2 4 4 3.2 0.836660 13\n",
+ "14 3 4 3 4 4 3.6 0.547723 14\n",
+ "15 4 4 4 4 4 4.0 0.000000 15\n",
+ "16 4 4 4 4 4 4.0 0.000000 16\n",
+ "17 4 4 4 4 4 4.0 0.000000 17\n",
+ "18 4 4 4 4 4 4.0 0.000000 18\n",
+ "19 4 4 4 4 4 4.0 0.000000 19\n",
+ "20 4 4 4 4 4 4.0 0.000000 20\n",
+ "21 4 4 4 4 4 4.0 0.000000 21\n",
+ "22 4 4 4 4 4 4.0 0.000000 22\n",
+ "23 4 4 4 4 4 4.0 0.000000 23\n",
+ "24 4 4 4 4 4 4.0 0.000000 24\n",
+ "25 4 4 4 4 4 4.0 0.000000 25\n",
+ "26 4 4 4 4 4 4.0 0.000000 26\n",
+ "27 4 4 4 4 4 4.0 0.000000 27\n",
+ "28 4 4 4 4 4 4.0 0.000000 28\n",
+ "29 4 4 4 4 4 4.0 0.000000 29\n",
+ "30 4 4 4 4 4 4.0 0.000000 30\n",
+ "31 4 4 4 4 4 4.0 0.000000 31\n",
+ "32 4 4 4 4 4 4.0 0.000000 32\n",
+ "33 4 4 4 4 4 4.0 0.000000 33\n",
+ "34 4 4 4 4 4 4.0 0.000000 34\n",
+ "35 4 4 4 4 4 4.0 0.000000 35\n",
+ "36 4 4 4 4 4 4.0 0.000000 36\n",
+ "37 4 4 4 4 4 4.0 0.000000 37\n",
+ "38 4 4 4 4 4 4.0 0.000000 38\n",
+ "39 4 4 4 4 4 4.0 0.000000 39\n",
+ "40 4 4 4 4 4 4.0 0.000000 40\n",
+ "41 4 4 4 4 4 4.0 0.000000 41\n",
+ "42 4 4 4 4 4 4.0 0.000000 42\n",
+ "43 4 4 4 4 4 4.0 0.000000 43\n",
+ "44 4 4 4 4 4 4.0 0.000000 44\n",
+ "45 4 4 4 4 4 4.0 0.000000 45\n",
+ "46 4 4 4 4 4 4.0 0.000000 46\n",
+ "47 4 4 4 4 4 4.0 0.000000 47\n",
+ "48 4 4 4 4 4 4.0 0.000000 48\n",
+ "49 4 4 4 4 4 4.0 0.000000 49\n",
+ "50 4 4 4 4 4 4.0 0.000000 50\n",
+ "51 4 4 4 4 4 4.0 0.000000 51\n",
+ "52 4 4 4 4 5 4.2 0.447214 52\n",
+ "53 4 4 4 4 5 4.2 0.447214 53\n",
+ "54 4 4 4 4 5 4.2 0.447214 54\n",
+ "55 4 4 4 4 5 4.2 0.447214 55\n",
+ "56 4 5 4 4 5 4.4 0.547723 56\n",
+ "57 4 5 4 4 5 4.4 0.547723 57\n",
+ "58 5 5 5 4 5 4.8 0.447214 58\n",
+ "59 5 5 5 5 5 5.0 0.000000 59"
+ ]
+ },
+ "execution_count": 564,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "#Get Average and Std Deviation of the run\n",
+ "\n",
+ "TopCount_mean = output_df.mean(axis= 'columns', skipna=True)\n",
+ "TopCount_std_dev = output_df.std(axis= 'columns', skipna=True)\n",
+ "\n",
+ "output_df['Mean'] = TopCount_mean\n",
+ "output_df['Std Dev'] = TopCount_std_dev\n",
+ "output_df['Learning Cycle'] = np.arange(0, longest_learning_cycle)\n",
+ "\n",
+ "output_df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 569,
+ "id": "29b0cc1b",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'Crossed barrel_dataset_3_0.01_Linear'"
+ ]
+ },
+ "execution_count": 569,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# #Output to CSV \n",
+ "output_name = f\"{combo['dataset'].split('.')[0]}_{combo['n_features']}_{combo['acq_func']}_{combo['model']}\"\n",
+ "output_name\n",
+ "\n",
+ "output_df.to_csv(f\"{output_name}.csv\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 574,
+ "id": "352671e2",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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PYVGoxFdu3YVb731ltv+xv69LwkhRHDGZoiIiIiCizUqREREFLaYqBAREVHYYqJCREREYYuJChEREYUtJipEREQUtpioEBERUdhiokJERERhi4kKETWpdu3a4aWXXgp1GEGxYsUKjzvtElFwMVEhaoamTp2K6667LtRheLV9+3b85S9/aZLX2r17NyZNmoT09HRotVp06tQJd999Nw4fPtwkr09EDcdEhYiCwm63+3VcamoqYmJiGjka4KuvvsJll10Gq9WKlStX4uDBg3j//fcRHx+PJ598stFfn4iCg4kKUQv066+/YuzYsdDpdEhPT8ef//xnFBcXu/avXr0aQ4cORUJCApKTk3HttdciLy/Ptf/YsWOQJAkffPABhg8fDq1Wi5UrV7pGcp5//nlkZmYiOTkZ06dPd0tiLp76kSQJb7/9Nq6//nrExMSgU6dO+PLLL93i/fLLL9GpUydotVpceeWVePfddyFJEsrLy72+P5PJhGnTpmHcuHH48ssvMWrUKLRv3x6DBg3C888/jzfffBNCCHTs2BHPP/+823P37NkDSZJw5MgRAEB5eTnuuece16hMz5498dVXX/m8tl988QUuueQSaLVadOjQAQsWLIDD4ajzvwkRecdEhaiFKS8vx1VXXYV+/fphx44dWL16Nc6dO4ebb77ZdUxVVRVmzpyJHTt24LvvvoNCocD1118PWZbdzvXYY4/hwQcfxMGDBzFmzBgAwPr165GXl4f169fj3XffxYoVK7BixYpaY1qwYAFuvvlm7N27F+PGjcNtt92G0tJSAEB+fj5uuukmXHfddfjll19wzz334P/+7/9qPd+aNWtQXFyMWbNmed2fkJAASZJwxx13YPny5W77li9fjiuuuAIdO3aELMsYO3YsNm/ejPfffx8HDhzA4sWLoVQqvZ73hx9+wO23344HH3wQBw4cwJtvvokVK1bgmWeeqTVeIqpF0G5vSERhY8qUKWLixIle9z311FNi9OjRbtsKCgoEAJ93PC0qKhIAxL59+4QQQuTn5wsA4qWXXvJ43ezsbOFwOFzbJk2aJCZPnux6nJ2dLV588UXXYwDiiSeecD2urKwUAMQ333wjhBBi9uzZomfPnm6v83//938CgCgrK/Ma79/+9jcBQJSWlnrdX+PUqVNCqVSKn3/+WQghhM1mEykpKWLFihVCCCHWrFkjFAqFz+uyfPlyER8f73o8cuRI8eyzz7od895774nMzMxa4yAi3ziiQtTC/PLLL1i/fj10Op3rp2vXrgDgmt7Jzc3Frbfeig4dOkCv16Ndu3YAgBMnTrida8CAAR7n79Gjh9uIQ2ZmJgoLC2uNqXfv3q5/x8bGQq/Xu55z6NAhDBw40O34Sy+9tNbzCT9vCp+VlYXx48fjnXfeAQD897//hdVqxaRJkwBUTwO1bt0anTt39ut8v/zyCxYuXOh2be+++26cOXMGJpPJr3MQkTtVqAMgoqZVWVmJCRMm4G9/+5vHvszMTADAhAkTkJ2djWXLliErKwuyLKNnz56w2Wxux8fGxnqcIyoqyu2xJEkeU0bBeE5tahKL3377DYMHD6712Lvuugt//vOf8eKLL2L58uWYPHmyq9g3Ojo6oNetrKzEggULcMMNN3js02q1AZ2LiKoxUSFqYS655BJ88sknaNeuHVQqz18BJSUlOHToEJYtW4Zhw4YBAH788cemDtOlS5cu+N///ue2bfv27bU+Z/To0UhJScFzzz2Hzz77zGN/eXm5q//JuHHjEBsbi6VLl2L16tXYtGmT67jevXvj5MmTOHz4sF+jKpdccgkOHTqEjh07+vHOiMgfTFSImqmKigrs2bPHbVvNKpxly5bh1ltvxaxZs5CUlIQjR45g1apVePvtt5GYmIjk5GS89dZbyMzMxIkTJ/DYY4+F5k0AuOeee7BkyRLMnj0bd955J/bs2eMqzpUkyetzYmNj8fbbb2PSpEn4wx/+gBkzZqBjx44oLi7Ghx9+iBMnTmDVqlUAAKVSialTp2LOnDno1KmT2wjM8OHDccUVV+DGG2/EkiVL0LFjR/z222+QJAnXXHONx+vOnTsX1157Ldq2bYubbroJCoUCv/zyC3799Vc8/fTTwb84RC0Aa1SImqkNGzagX79+bj8LFixAVlYWNm/eDKfTidGjR6NXr1546KGHkJCQAIVCAYVCgVWrVmHnzp3o2bMnHn74Yfz9738P2fto3749Pv74Y3z66afo3bs3li5d6lr1o9FofD5v4sSJ+OmnnxAVFYU//vGP6Nq1K2699VZUVFR4JA133nknbDYbpk2b5nGeTz75BAMHDsStt96K7t27Y9asWXA6nV5fc8yYMfjqq6+wdu1aDBw4EJdddhlefPFFZGdnN+AKELVskvC36oyIKEw888wzeOONN1BQUBCU8/3www8YOXIkCgoKkJ6eHpRzElFwcOqHiMLeP/7xDwwcOBDJycnYvHkz/v73v+P+++9v8HmtViuKioowf/58V6t9IgovTFSIKOzl5ubi6aefRmlpKdq2bYtHHnkEc+bMafB5//Of/+DOO+9E37598a9//SsIkRJRsHHqh4iIiMIWi2mJiIgobDFRISIiorDFRIWIiIjCFhMVIiIiCltMVIiIiChsMVEhIiKisMVEhYiIiMIWExUiIiIKW0xUiIiIKGz9fxQloxQIoVpuAAAAAElFTkSuQmCC",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "#Make a Nice Graph\n",
+ "fig, ax = plt.subplots()\n",
+ "\n",
+ "x = output_df['Learning Cycle']\n",
+ "y = output_df ['Mean']\n",
+ "\n",
+ "yerr0 = y - output_df['Std Dev']\n",
+ "yerr1 = y + output_df['Std Dev']\n",
+ "\n",
+ "#Plot and fill Std Dev\n",
+ "ax.plot(x,y)\n",
+ "plt.fill_between(x, yerr0, yerr1, color='C0', alpha=0.5)\n",
+ "\n",
+ "#Format the figure with axes labels\n",
+ "plt.xlabel(\"Learning Cycle\")\n",
+ "plt.ylabel(\"Top Samples Identified\")\n",
+ "plt.title(f\"{output_name}\")\n",
+ "\n",
+ "plt.savefig(f\"{output_name}.png\")\n",
+ "\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "colab": {
+ "provenance": []
+ },
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.12.2"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/src/data/Crossed barrel_dataset.csv b/src/data/Crossed barrel_dataset.csv
new file mode 100644
index 0000000..b007fe5
--- /dev/null
+++ b/src/data/Crossed barrel_dataset.csv
@@ -0,0 +1,1801 @@
+n,theta,r,t,toughness
+6,0,1.5,0.7,1.14466667
+6,0,1.5,1.05,1.60756105
+6,0,1.5,1.4,1.144337785
+6,0,1.7,0.7,3.64273758
+6,0,1.7,1.05,3.748405035
+6,0,1.7,1.4,2.661723075
+6,0,1.9,0.7,5.62889179
+6,0,1.9,1.05,6.545940435
+6,0,1.9,1.4,5.13711498
+6,0,2.1,0.7,6.113001335
+6,0,2.1,1.05,7.63448638
+6,0,2.1,1.4,2.06551135
+6,0,2.3,0.7,22.63629481
+6,0,2.3,1.05,11.98794863
+6,0,2.3,1.4,2.18745377
+6,0,2.5,0.7,27.27353061
+6,0,2.5,1.05,27.71493771
+6,0,2.5,1.4,1.724510655
+6,25,1.6,0.7,1.321202445
+6,25,1.6,1.05,1.901228995
+6,25,1.6,1.4,1.464165225
+6,25,1.8,0.7,2.77622403
+6,25,1.8,1.05,2.725128695
+6,25,1.8,1.4,3.181724645
+6,25,2,0.7,4.561826505
+6,25,2,1.05,4.80682388
+6,25,2,1.4,5.21743359
+6,25,2.2,0.7,5.9481448
+6,25,2.2,1.05,10.57081004
+6,25,2.2,1.4,7.91761853
+6,25,2.4,0.7,9.40534553
+6,25,2.4,1.05,25.05585347
+6,25,2.4,1.4,2.401968915
+6,50,1.5,0.7,0.911408525
+6,50,1.5,1.05,0.80713156
+6,50,1.5,1.4,0.600585055
+6,50,1.7,0.7,1.280064085
+6,50,1.7,1.05,1.856575375
+6,50,1.7,1.4,1.22887476
+6,50,1.9,0.7,1.670555225
+6,50,1.9,1.05,1.733336745
+6,50,1.9,1.4,3.17129197
+6,50,2.1,0.7,16.00978343
+6,50,2.1,1.05,4.159978755
+6,50,2.1,1.4,4.324624925
+6,50,2.3,0.7,3.208368345
+6,50,2.3,1.05,8.36155203
+6,50,2.3,1.4,10.26593447
+6,50,2.5,0.7,6.389414035
+6,50,2.5,1.05,23.65177359
+6,50,2.5,1.4,8.263866695
+6,75,1.6,0.7,0.56218211
+6,75,1.6,1.05,0.62222879
+6,75,1.6,1.4,1.129298705
+6,75,1.8,0.7,0.49796538
+6,75,1.8,1.05,0.955209465
+6,75,1.8,1.4,1.307267365
+6,75,2,0.7,0.70437207
+6,75,2,1.05,1.844288285
+6,75,2,1.4,14.5440842
+6,75,2.2,0.7,2.28417177
+6,75,2.2,1.05,13.167347
+6,75,2.2,1.4,1.245206375
+6,75,2.4,0.7,2.414646575
+6,75,2.4,1.05,4.68270893
+6,75,2.4,1.4,17.76211779
+6,100,1.5,0.7,1.761419435
+6,100,1.5,1.05,2.038989845
+6,100,1.5,1.4,1.74145084
+6,100,1.7,0.7,2.42913609
+6,100,1.7,1.05,2.639451635
+6,100,1.7,1.4,1.83067924
+6,100,1.9,0.7,2.248745235
+6,100,1.9,1.05,1.874484205
+6,100,1.9,1.4,13.84331533
+6,100,2.1,0.7,16.77800679
+6,100,2.1,1.05,14.0173637
+6,100,2.1,1.4,13.71482183
+6,100,2.3,0.7,19.72634797
+6,100,2.3,1.05,18.3145061
+6,100,2.3,1.4,17.49456493
+6,100,2.5,0.7,20.8723812
+6,100,2.5,1.05,19.19430635
+6,100,2.5,1.4,23.2304953
+6,125,1.6,0.7,1.4166949
+6,125,1.6,1.05,1.25473141
+6,125,1.6,1.4,1.077183595
+6,125,1.8,0.7,0.92180845
+6,125,1.8,1.05,19.82673045
+6,125,1.8,1.4,13.35430999
+6,125,2,0.7,0.93520637
+6,125,2,1.05,17.48321147
+6,125,2,1.4,18.91401758
+6,125,2.2,0.7,16.74357002
+6,125,2.2,1.05,14.11770208
+6,125,2.2,1.4,20.73650342
+6,125,2.4,0.7,24.20558826
+6,125,2.4,1.05,18.50428299
+6,125,2.4,1.4,11.64011261
+6,150,1.5,0.7,0.9721676
+6,150,1.5,1.05,0.73339565
+6,150,1.5,1.4,1.241250395
+6,150,1.7,0.7,13.11436394
+6,150,1.7,1.05,1.247425855
+6,150,1.7,1.4,16.19996728
+6,150,1.9,0.7,1.27661952
+6,150,1.9,1.05,15.55778051
+6,150,1.9,1.4,19.00199987
+6,150,2.1,0.7,16.41042719
+6,150,2.1,1.05,18.51288508
+6,150,2.1,1.4,17.18467533
+6,150,2.3,0.7,18.49939449
+6,150,2.3,1.05,19.91431001
+6,150,2.3,1.4,18.03172451
+6,150,2.5,0.7,20.95858163
+6,150,2.5,1.05,18.51341047
+6,150,2.5,1.4,20.43322464
+6,175,1.6,0.7,14.9117021
+6,175,1.6,1.05,20.1909625
+6,175,1.6,1.4,16.86847969
+6,175,1.8,0.7,16.25303968
+6,175,1.8,1.05,18.12488509
+6,175,1.8,1.4,20.35152813
+6,175,2,0.7,18.03436356
+6,175,2,1.05,17.5264161
+6,175,2,1.4,18.38228342
+6,175,2.2,0.7,21.11426736
+6,175,2.2,1.05,19.70686035
+6,175,2.2,1.4,13.48899982
+6,175,2.4,0.7,22.93310771
+6,175,2.4,1.05,16.38889589
+6,175,2.4,1.4,14.4047196
+6,200,1.5,0.7,14.96221898
+6,200,1.5,1.05,14.65657727
+6,200,1.5,1.4,20.22036666
+6,200,1.7,0.7,16.78959272
+6,200,1.7,1.05,25.21025957
+6,200,1.7,1.4,19.40045977
+6,200,1.9,0.7,17.83614353
+6,200,1.9,1.05,24.39245006
+6,200,1.9,1.4,23.56283371
+6,200,2.1,0.7,21.86809238
+6,200,2.1,1.05,20.21042247
+6,200,2.1,1.4,20.31956724
+6,200,2.3,0.7,24.84958171
+6,200,2.3,1.05,21.80051696
+6,200,2.3,1.4,19.66597793
+6,200,2.5,0.7,25.99898896
+6,200,2.5,1.05,22.06231878
+6,200,2.5,1.4,21.03835901
+8,0,1.5,0.7,2.166798125
+8,0,1.5,1.05,1.994880795
+8,0,1.5,1.4,1.991507755
+8,0,1.7,0.7,2.413471505
+8,0,1.7,1.05,4.139476235
+8,0,1.7,1.4,2.899414305
+8,0,1.9,0.7,5.52009985
+8,0,1.9,1.05,7.354356745
+8,0,1.9,1.4,5.33195838
+8,0,2.1,0.7,19.99789002
+8,0,2.1,1.05,8.488290225
+8,0,2.1,1.4,1.915515405
+8,0,2.3,0.7,25.3582639
+8,0,2.3,1.05,2.185516945
+8,0,2.3,1.4,1.437887965
+8,0,2.5,0.7,31.09783404
+8,0,2.5,1.05,1.890725635
+8,0,2.5,1.4,1.379164485
+8,25,1.6,0.7,6.022568495
+8,25,1.6,1.05,5.899901415
+8,25,1.6,1.4,5.25760901
+8,25,1.8,0.7,5.487119255
+8,25,1.8,1.05,9.138851555
+8,25,1.8,1.4,12.00985826
+8,25,2,0.7,9.76006525
+8,25,2,1.05,10.70192285
+8,25,2,1.4,14.18665702
+8,25,2.2,0.7,13.1504635
+8,25,2.2,1.05,16.83781416
+8,25,2.2,1.4,19.7309444
+8,25,2.4,0.7,22.05845141
+8,25,2.4,1.05,27.7911449
+8,25,2.4,1.4,1.651555005
+8,50,1.5,0.7,0.606925755
+8,50,1.5,1.05,0.967633045
+8,50,1.5,1.4,1.01771189
+8,50,1.7,0.7,1.83865145
+8,50,1.7,1.05,1.946333395
+8,50,1.7,1.4,1.256027065
+8,50,1.9,0.7,2.446088645
+8,50,1.9,1.05,1.75677089
+8,50,1.9,1.4,2.89525274
+8,50,2.1,0.7,4.16988717
+8,50,2.1,1.05,3.47753655
+8,50,2.1,1.4,4.749716225
+8,50,2.3,0.7,6.054145875
+8,50,2.3,1.05,5.279049785
+8,50,2.3,1.4,9.993393195
+8,50,2.5,0.7,7.144120635
+8,50,2.5,1.05,23.23553062
+8,50,2.5,1.4,1.789061775
+8,75,1.6,0.7,2.301961535
+8,75,1.6,1.05,2.517171365
+8,75,1.6,1.4,1.897846855
+8,75,1.8,0.7,3.146094015
+8,75,1.8,1.05,12.57974175
+8,75,1.8,1.4,4.87327289
+8,75,2,0.7,5.749459945
+8,75,2,1.05,3.877424105
+8,75,2,1.4,12.78541704
+8,75,2.2,0.7,20.21204998
+8,75,2.2,1.05,20.51460132
+8,75,2.2,1.4,17.76513275
+8,75,2.4,0.7,24.44423375
+8,75,2.4,1.05,26.61614424
+8,75,2.4,1.4,32.61966052
+8,100,1.5,0.7,0.758866325
+8,100,1.5,1.05,1.47033628
+8,100,1.5,1.4,1.371727985
+8,100,1.7,0.7,1.66019497
+8,100,1.7,1.05,1.94218581
+8,100,1.7,1.4,2.526298485
+8,100,1.9,0.7,18.46355991
+8,100,1.9,1.05,19.95083256
+8,100,1.9,1.4,15.28451124
+8,100,2.1,0.7,24.44324883
+8,100,2.1,1.05,26.5761516
+8,100,2.1,1.4,15.81249026
+8,100,2.3,0.7,26.55366339
+8,100,2.3,1.05,31.76165247
+8,100,2.3,1.4,24.51326645
+8,100,2.5,0.7,33.05713503
+8,100,2.5,1.05,39.22260624
+8,100,2.5,1.4,33.98515161
+8,125,1.6,0.7,1.46008469
+8,125,1.6,1.05,16.95513861
+8,125,1.6,1.4,16.54564365
+8,125,1.8,0.7,16.49016369
+8,125,1.8,1.05,17.97152167
+8,125,1.8,1.4,17.14974079
+8,125,2,0.7,20.02394696
+8,125,2,1.05,21.33621444
+8,125,2,1.4,16.41212001
+8,125,2.2,0.7,21.7261251
+8,125,2.2,1.05,24.28895599
+8,125,2.2,1.4,19.99643012
+8,125,2.4,0.7,26.74357163
+8,125,2.4,1.05,23.40047254
+8,125,2.4,1.4,22.66353705
+8,150,1.5,0.7,15.76503932
+8,150,1.5,1.05,14.71129282
+8,150,1.5,1.4,16.81053048
+8,150,1.7,0.7,18.38869488
+8,150,1.7,1.05,16.23362792
+8,150,1.7,1.4,25.59678803
+8,150,1.9,0.7,25.06795204
+8,150,1.9,1.05,26.46985809
+8,150,1.9,1.4,21.43531816
+8,150,2.1,0.7,23.84790793
+8,150,2.1,1.05,25.75089201
+8,150,2.1,1.4,29.20332858
+8,150,2.3,0.7,30.2897043
+8,150,2.3,1.05,27.00954622
+8,150,2.3,1.4,26.35897031
+8,150,2.5,0.7,33.28026619
+8,150,2.5,1.05,27.0706717
+8,150,2.5,1.4,22.86899577
+8,175,1.6,0.7,14.02868913
+8,175,1.6,1.05,20.02470101
+8,175,1.6,1.4,18.21306351
+8,175,1.8,0.7,17.80463232
+8,175,1.8,1.05,22.26115859
+8,175,1.8,1.4,17.92242904
+8,175,2,0.7,20.52712839
+8,175,2,1.05,26.43476973
+8,175,2,1.4,30.62884765
+8,175,2.2,0.7,23.87569613
+8,175,2.2,1.05,27.13847058
+8,175,2.2,1.4,21.95018747
+8,175,2.4,0.7,24.93067951
+8,175,2.4,1.05,26.48945395
+8,175,2.4,1.4,19.63858649
+8,200,1.5,0.7,18.25283987
+8,200,1.5,1.05,13.14853798
+8,200,1.5,1.4,16.80890649
+8,200,1.7,0.7,21.76204542
+8,200,1.7,1.05,19.95473314
+8,200,1.7,1.4,28.41190008
+8,200,1.9,0.7,23.99916942
+8,200,1.9,1.05,22.51447703
+8,200,1.9,1.4,22.81980479
+8,200,2.1,0.7,26.42427769
+8,200,2.1,1.05,23.00800265
+8,200,2.1,1.4,20.86879417
+8,200,2.3,0.7,29.49732455
+8,200,2.3,1.05,23.05055265
+8,200,2.3,1.4,19.78231941
+8,200,2.5,0.7,31.08251055
+8,200,2.5,1.05,21.36694488
+8,200,2.5,1.4,2.45140065
+10,0,1.5,0.7,2.37024162
+10,0,1.5,1.05,2.465344685
+10,0,1.5,1.4,1.902319725
+10,0,1.7,0.7,15.43857988
+10,0,1.7,1.05,5.526309155
+10,0,1.7,1.4,1.8278817
+10,0,1.9,0.7,20.12095256
+10,0,1.9,1.05,1.909063605
+10,0,1.9,1.4,1.835869325
+10,0,2.1,0.7,10.91442134
+10,0,2.1,1.05,1.472520425
+10,0,2.1,1.4,1.497575625
+10,0,2.3,0.7,37.2159395
+10,0,2.3,1.05,1.447227795
+10,0,2.3,1.4,1.27589006
+10,0,2.5,0.7,1.8790985
+10,0,2.5,1.05,1.43131911
+10,0,2.5,1.4,1.320330185
+10,25,1.6,0.7,3.697126945
+10,25,1.6,1.05,6.04913388
+10,25,1.6,1.4,4.04881531
+10,25,1.8,0.7,6.947829155
+10,25,1.8,1.05,7.81723548
+10,25,1.8,1.4,8.20748261
+10,25,2,0.7,11.28420063
+10,25,2,1.05,13.41803126
+10,25,2,1.4,1.814660625
+10,25,2.2,0.7,28.61980338
+10,25,2.2,1.05,16.47586264
+10,25,2.2,1.4,1.701154805
+10,25,2.4,0.7,40.1337563
+10,25,2.4,1.05,39.37679974
+10,25,2.4,1.4,1.47408317
+10,50,1.5,0.7,1.260503925
+10,50,1.5,1.05,2.05605895
+10,50,1.5,1.4,1.974935335
+10,50,1.7,0.7,2.454350585
+10,50,1.7,1.05,3.56727412
+10,50,1.7,1.4,2.616819025
+10,50,1.9,0.7,4.691029555
+10,50,1.9,1.05,4.199239655
+10,50,1.9,1.4,6.88366734
+10,50,2.1,0.7,18.14836186
+10,50,2.1,1.05,6.48318302
+10,50,2.1,1.4,1.938137185
+10,50,2.3,0.7,21.43247518
+10,50,2.3,1.05,28.25571177
+10,50,2.3,1.4,1.68978614
+10,50,2.5,0.7,35.44502725
+10,50,2.5,1.05,1.77016859
+10,50,2.5,1.4,1.362320765
+10,75,1.6,0.7,4.15126126
+10,75,1.6,1.05,3.87517276
+10,75,1.6,1.4,14.52642432
+10,75,1.8,0.7,14.98008309
+10,75,1.8,1.05,14.8352227
+10,75,1.8,1.4,16.80488933
+10,75,2,0.7,21.10158681
+10,75,2,1.05,21.2147152
+10,75,2,1.4,23.21411872
+10,75,2.2,0.7,22.43277946
+10,75,2.2,1.05,29.38565798
+10,75,2.2,1.4,30.7444312
+10,75,2.4,0.7,26.05758587
+10,75,2.4,1.05,36.75305072
+10,75,2.4,1.4,2.00176375
+10,100,1.5,0.7,17.06507599
+10,100,1.5,1.05,18.94962245
+10,100,1.5,1.4,2.53324977
+10,100,1.7,0.7,17.69646839
+10,100,1.7,1.05,21.07823388
+10,100,1.7,1.4,17.29897621
+10,100,1.9,0.7,21.8432857
+10,100,1.9,1.05,26.46207417
+10,100,1.9,1.4,22.38864355
+10,100,2.1,0.7,29.71010653
+10,100,2.1,1.05,36.53765208
+10,100,2.1,1.4,26.70796294
+10,100,2.3,0.7,29.27685436
+10,100,2.3,1.05,31.96874948
+10,100,2.3,1.4,35.05213832
+10,100,2.5,0.7,30.76561245
+10,100,2.5,1.05,25.82152161
+10,100,2.5,1.4,1.886956525
+10,125,1.6,0.7,11.89656028
+10,125,1.6,1.05,14.16437352
+10,125,1.6,1.4,12.73031194
+10,125,1.8,0.7,18.74037221
+10,125,1.8,1.05,20.30153969
+10,125,1.8,1.4,17.24241632
+10,125,2,0.7,27.547945
+10,125,2,1.05,30.90801587
+10,125,2,1.4,32.79220122
+10,125,2.2,0.7,28.65176546
+10,125,2.2,1.05,30.12516931
+10,125,2.2,1.4,40.38833175
+10,125,2.4,0.7,33.29229334
+10,125,2.4,1.05,28.87825012
+10,125,2.4,1.4,26.01214699
+10,150,1.5,0.7,5.07192638
+10,150,1.5,1.05,13.95909786
+10,150,1.5,1.4,13.76132647
+10,150,1.7,0.7,23.06744641
+10,150,1.7,1.05,28.86552639
+10,150,1.7,1.4,17.14295674
+10,150,1.9,0.7,29.77538936
+10,150,1.9,1.05,30.79088801
+10,150,1.9,1.4,37.60315188
+10,150,2.1,0.7,29.89276263
+10,150,2.1,1.05,28.74855898
+10,150,2.1,1.4,25.49029507
+10,150,2.3,0.7,33.5952381
+10,150,2.3,1.05,21.73779973
+10,150,2.3,1.4,18.34570169
+10,150,2.5,0.7,31.77714475
+10,150,2.5,1.05,2.180528875
+10,150,2.5,1.4,19.60171103
+10,175,1.6,0.7,22.24623455
+10,175,1.6,1.05,25.81931546
+10,175,1.6,1.4,23.0666609
+10,175,1.8,0.7,24.879369
+10,175,1.8,1.05,28.75976827
+10,175,1.8,1.4,39.76854173
+10,175,2,0.7,24.75957759
+10,175,2,1.05,23.18499775
+10,175,2,1.4,20.94242387
+10,175,2.2,0.7,26.75827735
+10,175,2.2,1.05,21.54047674
+10,175,2.2,1.4,14.86050651
+10,175,2.4,0.7,28.79159634
+10,175,2.4,1.05,16.63769652
+10,175,2.4,1.4,1.94975736
+10,200,1.5,0.7,26.57207203
+10,200,1.5,1.05,30.13790411
+10,200,1.5,1.4,32.46480467
+10,200,1.7,0.7,25.74684893
+10,200,1.7,1.05,23.47800227
+10,200,1.7,1.4,48.06433862
+10,200,1.9,0.7,26.99685194
+10,200,1.9,1.05,21.68353378
+10,200,1.9,1.4,20.33871995
+10,200,2.1,0.7,30.02929235
+10,200,2.1,1.05,20.59749653
+10,200,2.1,1.4,17.54910594
+10,200,2.3,0.7,33.18631766
+10,200,2.3,1.05,19.73466771
+10,200,2.3,1.4,1.543837075
+10,200,2.5,0.7,32.53028312
+10,200,2.5,1.05,14.83241934
+10,200,2.5,1.4,2.119129425
+12,0,1.5,0.7,2.710077215
+12,0,1.5,1.05,3.382610125
+12,0,1.5,1.4,1.879645105
+12,0,1.7,0.7,4.848634005
+12,0,1.7,1.05,2.042897735
+12,0,1.7,1.4,1.614795695
+12,0,1.9,0.7,5.787094095
+12,0,1.9,1.05,1.45487696
+12,0,1.9,1.4,1.37488409
+12,0,2.1,0.7,2.53720665
+12,0,2.1,1.05,1.54752002
+12,0,2.1,1.4,1.268136685
+12,0,2.3,0.7,1.596147205
+12,0,2.3,1.05,1.311584905
+12,0,2.3,1.4,1.538662875
+12,0,2.5,0.7,1.600953855
+12,0,2.5,1.05,1.140192515
+12,0,2.5,1.4,1.094330115
+12,25,1.6,0.7,3.283366465
+12,25,1.6,1.05,3.947534815
+12,25,1.6,1.4,4.05098771
+12,25,1.8,0.7,21.23499458
+12,25,1.8,1.05,6.942361015
+12,25,1.8,1.4,1.79896845
+12,25,2,0.7,29.74137126
+12,25,2,1.05,19.94002746
+12,25,2,1.4,1.476944155
+12,25,2.2,0.7,46.13158384
+12,25,2.2,1.05,1.484047405
+12,25,2.2,1.4,1.277472645
+12,25,2.4,0.7,50.29350783
+12,25,2.4,1.05,1.366536405
+12,25,2.4,1.4,1.221183055
+12,50,1.5,0.7,3.0627593
+12,50,1.5,1.05,2.44075017
+12,50,1.5,1.4,3.972113785
+12,50,1.7,0.7,3.64365483
+12,50,1.7,1.05,13.44766539
+12,50,1.7,1.4,4.728461135
+12,50,1.9,0.7,20.98779674
+12,50,1.9,1.05,22.76612895
+12,50,1.9,1.4,6.8981237
+12,50,2.1,0.7,30.82322728
+12,50,2.1,1.05,27.90628977
+12,50,2.1,1.4,1.4467511
+12,50,2.3,0.7,33.47814198
+12,50,2.3,1.05,2.69682508
+12,50,2.3,1.4,1.35477584
+12,50,2.5,0.7,35.85667806
+12,50,2.5,1.05,1.36576364
+12,50,2.5,1.4,1.24842055
+12,75,1.6,0.7,16.22990609
+12,75,1.6,1.05,17.18445948
+12,75,1.6,1.4,12.94250759
+12,75,1.8,0.7,18.88295428
+12,75,1.8,1.05,22.02190688
+12,75,1.8,1.4,16.51580642
+12,75,2,0.7,21.58189617
+12,75,2,1.05,32.22906249
+12,75,2,1.4,2.467981245
+12,75,2.2,0.7,35.79146501
+12,75,2.2,1.05,40.86827958
+12,75,2.2,1.4,1.49421229
+12,75,2.4,0.7,43.14528141
+12,75,2.4,1.05,46.92091161
+12,75,2.4,1.4,1.48225321
+12,100,1.5,0.7,14.69444426
+12,100,1.5,1.05,11.49054846
+12,100,1.5,1.4,10.61172675
+12,100,1.7,0.7,18.05369099
+12,100,1.7,1.05,19.5094086
+12,100,1.7,1.4,16.65803788
+12,100,1.9,0.7,30.06304252
+12,100,1.9,1.05,32.71835599
+12,100,1.9,1.4,20.96172303
+12,100,2.1,0.7,40.47378346
+12,100,2.1,1.05,42.67655245
+12,100,2.1,1.4,2.02024529
+12,100,2.3,0.7,40.29737022
+12,100,2.3,1.05,34.28081129
+12,100,2.3,1.4,2.70949508
+12,100,2.5,0.7,40.6362777
+12,100,2.5,1.05,1.86482408
+12,100,2.5,1.4,1.36719433
+12,125,1.6,0.7,15.60811198
+12,125,1.6,1.05,20.18824631
+12,125,1.6,1.4,16.34644991
+12,125,1.8,0.7,31.44584563
+12,125,1.8,1.05,32.27993772
+12,125,1.8,1.4,28.35393028
+12,125,2,0.7,32.82589566
+12,125,2,1.05,36.33068406
+12,125,2,1.4,41.07478159
+12,125,2.2,0.7,34.05089677
+12,125,2.2,1.05,25.4602824
+12,125,2.2,1.4,1.754954565
+12,125,2.4,0.7,35.46253183
+12,125,2.4,1.05,24.91308985
+12,125,2.4,1.4,1.78455199
+12,150,1.5,0.7,20.09582272
+12,150,1.5,1.05,24.73057766
+12,150,1.5,1.4,21.53784942
+12,150,1.7,0.7,29.63537291
+12,150,1.7,1.05,35.66341558
+12,150,1.7,1.4,34.86198284
+12,150,1.9,0.7,30.62289498
+12,150,1.9,1.05,29.48954875
+12,150,1.9,1.4,49.25078791
+12,150,2.1,0.7,30.30987612
+12,150,2.1,1.05,22.4073812
+12,150,2.1,1.4,1.83697897
+12,150,2.3,0.7,32.24994845
+12,150,2.3,1.05,1.85980549
+12,150,2.3,1.4,2.899684285
+12,150,2.5,0.7,32.54542221
+12,150,2.5,1.05,1.556686305
+12,150,2.5,1.4,1.67768615
+12,175,1.6,0.7,29.88577368
+12,175,1.6,1.05,34.00182953
+12,175,1.6,1.4,43.47975901
+12,175,1.8,0.7,28.4906872
+12,175,1.8,1.05,23.88152443
+12,175,1.8,1.4,17.40448202
+12,175,2,0.7,29.69113837
+12,175,2,1.05,20.3410298
+12,175,2,1.4,1.767964575
+12,175,2.2,0.7,32.58077756
+12,175,2.2,1.05,1.811359785
+12,175,2.2,1.4,1.856395865
+12,175,2.4,0.7,34.33571139
+12,175,2.4,1.05,2.732696605
+12,175,2.4,1.4,1.257684545
+12,200,1.5,0.7,41.03767786
+12,200,1.5,1.05,36.26267399
+12,200,1.5,1.4,41.56020183
+12,200,1.7,0.7,29.52654878
+12,200,1.7,1.05,22.87250266
+12,200,1.7,1.4,22.98706561
+12,200,1.9,0.7,29.24994097
+12,200,1.9,1.05,15.20724601
+12,200,1.9,1.4,1.7438969
+12,200,2.1,0.7,32.12768047
+12,200,2.1,1.05,1.857889805
+12,200,2.1,1.4,1.8860728
+12,200,2.3,0.7,41.87429944
+12,200,2.3,1.05,1.331659865
+12,200,2.3,1.4,1.578600555
+12,200,2.5,0.7,2.029597225
+12,200,2.5,1.05,1.240041765
+12,200,2.5,1.4,1.05594173
+6,0,1.5,0.7,1.276972545
+6,0,1.5,1.05,1.40763682
+6,0,1.5,1.4,1.22198518
+6,0,1.7,0.7,2.57058053
+6,0,1.7,1.05,2.907952235
+6,0,1.7,1.4,2.61173793
+6,0,1.9,0.7,3.623287735
+6,0,1.9,1.05,4.861726245
+6,0,1.9,1.4,4.685755775
+6,0,2.1,0.7,17.24322518
+6,0,2.1,1.05,9.14252845
+6,0,2.1,1.4,7.22210682
+6,0,2.3,0.7,21.77185393
+6,0,2.3,1.05,23.58202299
+6,0,2.3,1.4,1.90549201
+6,0,2.5,0.7,24.97148829
+6,0,2.5,1.05,30.27901031
+6,0,2.5,1.4,1.921319615
+6,25,1.6,0.7,1.45386602
+6,25,1.6,1.05,1.67985751
+6,25,1.6,1.4,2.359961675
+6,25,1.8,0.7,2.30229922
+6,25,1.8,1.05,3.318807365
+6,25,1.8,1.4,2.73639597
+6,25,2,0.7,4.76432071
+6,25,2,1.05,4.69724476
+6,25,2,1.4,5.22735781
+6,25,2.2,0.7,7.4399274
+6,25,2.2,1.05,11.05566429
+6,25,2.2,1.4,8.14951516
+6,25,2.4,0.7,14.67360446
+6,25,2.4,1.05,14.64715217
+6,25,2.4,1.4,24.38383386
+6,50,1.5,0.7,0.581434425
+6,50,1.5,1.05,0.780913535
+6,50,1.5,1.4,0.724918585
+6,50,1.7,0.7,1.019549845
+6,50,1.7,1.05,1.279980775
+6,50,1.7,1.4,0.890335145
+6,50,1.9,0.7,2.180233015
+6,50,1.9,1.05,2.433453355
+6,50,1.9,1.4,1.64671733
+6,50,2.1,0.7,4.20246107
+6,50,2.1,1.05,4.046561015
+6,50,2.1,1.4,4.59804905
+6,50,2.3,0.7,4.73968986
+6,50,2.3,1.05,4.08230125
+6,50,2.3,1.4,17.49258419
+6,50,2.5,0.7,8.01391438
+6,50,2.5,1.05,22.65485255
+6,50,2.5,1.4,10.29284302
+6,75,1.6,0.7,0.316275755
+6,75,1.6,1.05,1.00228558
+6,75,1.6,1.4,1.259409195
+6,75,1.8,0.7,0.85857833
+6,75,1.8,1.05,0.368262385
+6,75,1.8,1.4,2.12653032
+6,75,2,0.7,1.450135035
+6,75,2,1.05,1.93924519
+6,75,2,1.4,2.47596343
+6,75,2.2,0.7,2.43745487
+6,75,2.2,1.05,3.764273615
+6,75,2.2,1.4,17.23894601
+6,75,2.4,0.7,2.74980348
+6,75,2.4,1.05,6.161012775
+6,75,2.4,1.4,16.50240024
+6,100,1.5,0.7,1.043984375
+6,100,1.5,1.05,0.929859555
+6,100,1.5,1.4,1.667230665
+6,100,1.7,0.7,1.86839673
+6,100,1.7,1.05,1.58847147
+6,100,1.7,1.4,2.522915755
+6,100,1.9,0.7,1.657600975
+6,100,1.9,1.05,2.571962555
+6,100,1.9,1.4,13.56843395
+6,100,2.1,0.7,1.67980929
+6,100,2.1,1.05,13.92808819
+6,100,2.1,1.4,15.59499058
+6,100,2.3,0.7,16.99064027
+6,100,2.3,1.05,16.70905174
+6,100,2.3,1.4,14.64180982
+6,100,2.5,0.7,20.82913473
+6,100,2.5,1.05,19.53450837
+6,100,2.5,1.4,21.9617933
+6,125,1.6,0.7,1.58774253
+6,125,1.6,1.05,1.96536155
+6,125,1.6,1.4,1.07172349
+6,125,1.8,0.7,13.29645001
+6,125,1.8,1.05,14.75259793
+6,125,1.8,1.4,2.021798275
+6,125,2,0.7,1.64178562
+6,125,2,1.05,17.50446985
+6,125,2,1.4,15.76786807
+6,125,2.2,0.7,20.49097717
+6,125,2.2,1.05,18.51707968
+6,125,2.2,1.4,24.61952226
+6,125,2.4,0.7,22.96424488
+6,125,2.4,1.05,18.76875767
+6,125,2.4,1.4,21.97821605
+6,150,1.5,0.7,0.735884685
+6,150,1.5,1.05,0.937172305
+6,150,1.5,1.4,17.35790708
+6,150,1.7,0.7,1.01669435
+6,150,1.7,1.05,14.79832094
+6,150,1.7,1.4,19.47943298
+6,150,1.9,0.7,0.537630855
+6,150,1.9,1.05,16.20815219
+6,150,1.9,1.4,17.5141618
+6,150,2.1,0.7,14.95439099
+6,150,2.1,1.05,17.20666344
+6,150,2.1,1.4,14.66813147
+6,150,2.3,0.7,14.02922575
+6,150,2.3,1.05,18.46880396
+6,150,2.3,1.4,14.86324414
+6,150,2.5,0.7,20.19911768
+6,150,2.5,1.05,18.11758006
+6,150,2.5,1.4,17.82099566
+6,175,1.6,0.7,14.39788533
+6,175,1.6,1.05,23.82705059
+6,175,1.6,1.4,4.48566731
+6,175,1.8,0.7,16.17696459
+6,175,1.8,1.05,17.10172416
+6,175,1.8,1.4,22.86955112
+6,175,2,0.7,17.10096512
+6,175,2,1.05,17.30324628
+6,175,2,1.4,16.31177215
+6,175,2.2,0.7,19.72507122
+6,175,2.2,1.05,19.31625969
+6,175,2.2,1.4,12.40292786
+6,175,2.4,0.7,20.67206613
+6,175,2.4,1.05,18.6453617
+6,175,2.4,1.4,14.50308112
+6,200,1.5,0.7,13.58270496
+6,200,1.5,1.05,16.66536236
+6,200,1.5,1.4,17.34488347
+6,200,1.7,0.7,16.03773862
+6,200,1.7,1.05,21.38700344
+6,200,1.7,1.4,8.339999845
+6,200,1.9,0.7,17.48027602
+6,200,1.9,1.05,19.64039634
+6,200,1.9,1.4,24.93052827
+6,200,2.1,0.7,20.23693665
+6,200,2.1,1.05,19.22200277
+6,200,2.1,1.4,26.0766163
+6,200,2.3,0.7,20.90731185
+6,200,2.3,1.05,20.57744419
+6,200,2.3,1.4,18.54291755
+6,200,2.5,0.7,25.09903317
+6,200,2.5,1.05,23.11410977
+6,200,2.5,1.4,22.99321612
+8,0,1.5,0.7,1.9446332
+8,0,1.5,1.05,1.96282795
+8,0,1.5,1.4,2.143893625
+8,0,1.7,0.7,3.472810065
+8,0,1.7,1.05,3.065404435
+8,0,1.7,1.4,3.79572566
+8,0,1.9,0.7,13.95284194
+8,0,1.9,1.05,8.580193305
+8,0,1.9,1.4,8.15384786
+8,0,2.1,0.7,19.00737704
+8,0,2.1,1.05,20.68608874
+8,0,2.1,1.4,1.62434588
+8,0,2.3,0.7,21.89507745
+8,0,2.3,1.05,1.757085215
+8,0,2.3,1.4,1.424017165
+8,0,2.5,0.7,24.46751917
+8,0,2.5,1.05,1.540877455
+8,0,2.5,1.4,1.341181375
+8,25,1.6,0.7,5.38905503
+8,25,1.6,1.05,5.90264023
+8,25,1.6,1.4,6.89180886
+8,25,1.8,0.7,7.618696405
+8,25,1.8,1.05,9.41505298
+8,25,1.8,1.4,11.90886521
+8,25,2,0.7,11.78357118
+8,25,2,1.05,15.01512353
+8,25,2,1.4,14.75295729
+8,25,2.2,0.7,17.04183149
+8,25,2.2,1.05,28.66445513
+8,25,2.2,1.4,33.7412304
+8,25,2.4,0.7,21.58190069
+8,25,2.4,1.05,36.84660789
+8,25,2.4,1.4,1.95455938
+8,50,1.5,0.7,0.92954519
+8,50,1.5,1.05,0.89535553
+8,50,1.5,1.4,1.045444615
+8,50,1.7,0.7,1.215050635
+8,50,1.7,1.05,2.046947545
+8,50,1.7,1.4,2.29423402
+8,50,1.9,0.7,2.313059155
+8,50,1.9,1.05,3.07566036
+8,50,1.9,1.4,2.679152695
+8,50,2.1,0.7,4.166636315
+8,50,2.1,1.05,6.51946287
+8,50,2.1,1.4,4.755243245
+8,50,2.3,0.7,6.201702715
+8,50,2.3,1.05,6.793946615
+8,50,2.3,1.4,9.51737332
+8,50,2.5,0.7,10.71189652
+8,50,2.5,1.05,23.17921309
+8,50,2.5,1.4,1.798908325
+8,75,1.6,0.7,2.23340016
+8,75,1.6,1.05,2.47774116
+8,75,1.6,1.4,2.787914895
+8,75,1.8,0.7,2.421117005
+8,75,1.8,1.05,3.688520175
+8,75,1.8,1.4,4.7896747
+8,75,2,0.7,6.35860395
+8,75,2,1.05,12.73013662
+8,75,2,1.4,21.27402599
+8,75,2.2,0.7,22.07383703
+8,75,2.2,1.05,21.3394019
+8,75,2.2,1.4,27.6013942
+8,75,2.4,0.7,25.10776541
+8,75,2.4,1.05,25.70566987
+8,75,2.4,1.4,31.37445519
+8,100,1.5,0.7,1.019029305
+8,100,1.5,1.05,1.58020915
+8,100,1.5,1.4,14.01092007
+8,100,1.7,0.7,1.51086271
+8,100,1.7,1.05,15.57963557
+8,100,1.7,1.4,4.074202785
+8,100,1.9,0.7,17.47108114
+8,100,1.9,1.05,21.43939518
+8,100,1.9,1.4,13.46396952
+8,100,2.1,0.7,22.6591346
+8,100,2.1,1.05,25.09494934
+8,100,2.1,1.4,23.42045223
+8,100,2.3,0.7,22.02141722
+8,100,2.3,1.05,33.8393769
+8,100,2.3,1.4,27.58580287
+8,100,2.5,0.7,28.09455674
+8,100,2.5,1.05,25.92875706
+8,100,2.5,1.4,38.61747719
+8,125,1.6,0.7,1.608277095
+8,125,1.6,1.05,1.88662548
+8,125,1.6,1.4,1.96556581
+8,125,1.8,0.7,18.90941071
+8,125,1.8,1.05,18.66237893
+8,125,1.8,1.4,16.2365994
+8,125,2,0.7,19.83811912
+8,125,2,1.05,19.35939402
+8,125,2,1.4,16.98806743
+8,125,2.2,0.7,23.72583282
+8,125,2.2,1.05,23.69980874
+8,125,2.2,1.4,20.10351489
+8,125,2.4,0.7,27.62149392
+8,125,2.4,1.05,23.11138859
+8,125,2.4,1.4,22.00852282
+8,150,1.5,0.7,14.14813405
+8,150,1.5,1.05,15.97590274
+8,150,1.5,1.4,14.02973265
+8,150,1.7,0.7,17.66117801
+8,150,1.7,1.05,17.9145985
+8,150,1.7,1.4,24.64793279
+8,150,1.9,0.7,21.19465207
+8,150,1.9,1.05,25.43435805
+8,150,1.9,1.4,22.91095971
+8,150,2.1,0.7,24.56941835
+8,150,2.1,1.05,29.67098499
+8,150,2.1,1.4,31.45434378
+8,150,2.3,0.7,29.14769093
+8,150,2.3,1.05,24.9799802
+8,150,2.3,1.4,22.79001114
+8,150,2.5,0.7,30.2694805
+8,150,2.5,1.05,26.02590333
+8,150,2.5,1.4,22.09771915
+8,175,1.6,0.7,14.86447757
+8,175,1.6,1.05,15.34889878
+8,175,1.6,1.4,17.15394636
+8,175,1.8,0.7,19.22644436
+8,175,1.8,1.05,22.3220811
+8,175,1.8,1.4,21.84879449
+8,175,2,0.7,20.54196691
+8,175,2,1.05,26.72247017
+8,175,2,1.4,23.21122474
+8,175,2.2,0.7,23.2372288
+8,175,2.2,1.05,26.01821757
+8,175,2.2,1.4,19.7140267
+8,175,2.4,0.7,25.64329154
+8,175,2.4,1.05,26.50821912
+8,175,2.4,1.4,19.13097189
+8,200,1.5,0.7,19.46653587
+8,200,1.5,1.05,17.70714249
+8,200,1.5,1.4,20.48806195
+8,200,1.7,0.7,22.59783182
+8,200,1.7,1.05,17.83604297
+8,200,1.7,1.4,26.83157947
+8,200,1.9,0.7,21.81119228
+8,200,1.9,1.05,22.75433722
+8,200,1.9,1.4,37.84739581
+8,200,2.1,0.7,24.42026279
+8,200,2.1,1.05,22.7586222
+8,200,2.1,1.4,20.4701461
+8,200,2.3,0.7,28.6733806
+8,200,2.3,1.05,21.90408288
+8,200,2.3,1.4,19.88240753
+8,200,2.5,0.7,30.67888973
+8,200,2.5,1.05,20.91814908
+8,200,2.5,1.4,18.91718213
+10,0,1.5,0.7,2.68874185
+10,0,1.5,1.05,3.23580922
+10,0,1.5,1.4,2.32434983
+10,0,1.7,0.7,5.065268035
+10,0,1.7,1.05,2.000912255
+10,0,1.7,1.4,2.13757049
+10,0,1.9,0.7,18.42932606
+10,0,1.9,1.05,1.76896569
+10,0,1.9,1.4,2.00238821
+10,0,2.1,0.7,25.38932774
+10,0,2.1,1.05,2.0328948
+10,0,2.1,1.4,1.49585066
+10,0,2.3,0.7,2.030986995
+10,0,2.3,1.05,1.57286967
+10,0,2.3,1.4,1.239645215
+10,0,2.5,0.7,32.49767929
+10,0,2.5,1.05,1.264971665
+10,0,2.5,1.4,1.258602205
+10,25,1.6,0.7,3.56665632
+10,25,1.6,1.05,4.98293583
+10,25,1.6,1.4,5.78953103
+10,25,1.8,0.7,7.640590115
+10,25,1.8,1.05,8.75533431
+10,25,1.8,1.4,7.42388148
+10,25,2,0.7,9.690962805
+10,25,2,1.05,15.07411102
+10,25,2,1.4,14.00846764
+10,25,2.2,0.7,26.9895793
+10,25,2.2,1.05,29.47288901
+10,25,2.2,1.4,27.82813159
+10,25,2.4,0.7,40.29677286
+10,25,2.4,1.05,36.86394767
+10,25,2.4,1.4,1.48491208
+10,50,1.5,0.7,1.666033325
+10,50,1.5,1.05,1.660144715
+10,50,1.5,1.4,1.77223072
+10,50,1.7,0.7,2.326829455
+10,50,1.7,1.05,2.93331449
+10,50,1.7,1.4,2.91813294
+10,50,1.9,0.7,4.012846955
+10,50,1.9,1.05,6.327796025
+10,50,1.9,1.4,4.465437585
+10,50,2.1,0.7,7.8446652
+10,50,2.1,1.05,18.12854522
+10,50,2.1,1.4,9.52971548
+10,50,2.3,0.7,25.46623344
+10,50,2.3,1.05,21.92936174
+10,50,2.3,1.4,1.722331425
+10,50,2.5,0.7,29.85900814
+10,50,2.5,1.05,1.90834218
+10,50,2.5,1.4,1.37573093
+10,75,1.6,0.7,2.801982435
+10,75,1.6,1.05,3.65339209
+10,75,1.6,1.4,4.31146103
+10,75,1.8,0.7,14.47847228
+10,75,1.8,1.05,13.93280176
+10,75,1.8,1.4,17.12357983
+10,75,2,0.7,19.8059104
+10,75,2,1.05,20.7149298
+10,75,2,1.4,22.5752033
+10,75,2.2,0.7,19.28107221
+10,75,2.2,1.05,28.25179018
+10,75,2.2,1.4,29.73223526
+10,75,2.4,0.7,25.08406986
+10,75,2.4,1.05,35.97420333
+10,75,2.4,1.4,30.4392378
+10,100,1.5,0.7,2.171097245
+10,100,1.5,1.05,2.7742289
+10,100,1.5,1.4,15.19785445
+10,100,1.7,0.7,16.76034382
+10,100,1.7,1.05,20.03022914
+10,100,1.7,1.4,15.07295208
+10,100,1.9,0.7,21.81975966
+10,100,1.9,1.05,20.94379548
+10,100,1.9,1.4,23.9046485
+10,100,2.1,0.7,30.52418574
+10,100,2.1,1.05,33.63718715
+10,100,2.1,1.4,24.92273536
+10,100,2.3,0.7,33.96098349
+10,100,2.3,1.05,27.17386938
+10,100,2.3,1.4,2.3203321
+10,100,2.5,0.7,29.37255341
+10,100,2.5,1.05,29.32923957
+10,100,2.5,1.4,1.91606742
+10,125,1.6,0.7,11.40262133
+10,125,1.6,1.05,13.71296025
+10,125,1.6,1.4,12.35039804
+10,125,1.8,0.7,18.51946331
+10,125,1.8,1.05,18.00891086
+10,125,1.8,1.4,15.23491936
+10,125,2,0.7,28.77338471
+10,125,2,1.05,27.54808572
+10,125,2,1.4,30.95862624
+10,125,2.2,0.7,31.19857197
+10,125,2.2,1.05,29.24878965
+10,125,2.2,1.4,39.43245728
+10,125,2.4,0.7,32.36148769
+10,125,2.4,1.05,28.29307961
+10,125,2.4,1.4,25.60873108
+10,150,1.5,0.7,14.93511849
+10,150,1.5,1.05,12.49228115
+10,150,1.5,1.4,8.683937425
+10,150,1.7,0.7,19.55310702
+10,150,1.7,1.05,13.64818818
+10,150,1.7,1.4,13.60503087
+10,150,1.9,0.7,26.96239796
+10,150,1.9,1.05,30.80929899
+10,150,1.9,1.4,36.36662791
+10,150,2.1,0.7,26.78225577
+10,150,2.1,1.05,28.73448449
+10,150,2.1,1.4,22.4649818
+10,150,2.3,0.7,31.86511689
+10,150,2.3,1.05,28.47801169
+10,150,2.3,1.4,19.52456477
+10,150,2.5,0.7,29.73290818
+10,150,2.5,1.05,20.76501874
+10,150,2.5,1.4,17.71773594
+10,175,1.6,0.7,19.03429115
+10,175,1.6,1.05,18.94115364
+10,175,1.6,1.4,22.66918814
+10,175,1.8,0.7,24.55388137
+10,175,1.8,1.05,27.76586321
+10,175,1.8,1.4,24.01394741
+10,175,2,0.7,24.69360456
+10,175,2,1.05,25.18533206
+10,175,2,1.4,21.50663856
+10,175,2.2,0.7,26.37707803
+10,175,2.2,1.05,20.34512214
+10,175,2.2,1.4,17.46738938
+10,175,2.4,0.7,28.4968647
+10,175,2.4,1.05,23.20004315
+10,175,2.4,1.4,1.8880219
+10,200,1.5,0.7,25.09012174
+10,200,1.5,1.05,30.34804809
+10,200,1.5,1.4,29.60248144
+10,200,1.7,0.7,24.87442237
+10,200,1.7,1.05,24.17798621
+10,200,1.7,1.4,47.68481323
+10,200,1.9,0.7,26.53648934
+10,200,1.9,1.05,20.68534785
+10,200,1.9,1.4,20.81778208
+10,200,2.1,0.7,28.88119233
+10,200,2.1,1.05,19.93064439
+10,200,2.1,1.4,15.51392334
+10,200,2.3,0.7,31.56649514
+10,200,2.3,1.05,18.30526454
+10,200,2.3,1.4,11.63060955
+10,200,2.5,0.7,34.57712647
+10,200,2.5,1.05,23.0289247
+10,200,2.5,1.4,1.861004645
+12,0,1.5,0.7,2.217989635
+12,0,1.5,1.05,2.57400154
+12,0,1.5,1.4,2.22740741
+12,0,1.7,0.7,2.798259365
+12,0,1.7,1.05,1.95356353
+12,0,1.7,1.4,1.71814353
+12,0,1.9,0.7,6.996048425
+12,0,1.9,1.05,1.638178305
+12,0,1.9,1.4,1.502285125
+12,0,2.1,0.7,8.205917015
+12,0,2.1,1.05,1.403615165
+12,0,2.1,1.4,1.28903732
+12,0,2.3,0.7,1.80559346
+12,0,2.3,1.05,1.353783275
+12,0,2.3,1.4,1.158633795
+12,0,2.5,0.7,1.51381865
+12,0,2.5,1.05,1.28789654
+12,0,2.5,1.4,1.18235387
+12,25,1.6,0.7,2.81568514
+12,25,1.6,1.05,2.39229897
+12,25,1.6,1.4,2.66575283
+12,25,1.8,0.7,10.96776871
+12,25,1.8,1.05,4.806190225
+12,25,1.8,1.4,3.765164815
+12,25,2,0.7,8.574036075
+12,25,2,1.05,9.426500365
+12,25,2,1.4,1.81290671
+12,25,2.2,0.7,33.4553499
+12,25,2.2,1.05,1.462283295
+12,25,2.2,1.4,1.90966783
+12,25,2.4,0.7,32.15487672
+12,25,2.4,1.05,1.6005787
+12,25,2.4,1.4,1.22288414
+12,50,1.5,0.7,3.05250575
+12,50,1.5,1.05,1.391692875
+12,50,1.5,1.4,1.58716356
+12,50,1.7,0.7,3.26030678
+12,50,1.7,1.05,6.01849178
+12,50,1.7,1.4,3.17396336
+12,50,1.9,0.7,5.90276535
+12,50,1.9,1.05,5.72380911
+12,50,1.9,1.4,15.62069471
+12,50,2.1,0.7,9.29026404
+12,50,2.1,1.05,10.60761289
+12,50,2.1,1.4,22.63830231
+12,50,2.3,0.7,17.4591797
+12,50,2.3,1.05,18.90567656
+12,50,2.3,1.4,1.74107211
+12,50,2.5,0.7,33.0137716
+12,50,2.5,1.05,2.0703271
+12,50,2.5,1.4,1.302218465
+12,75,1.6,0.7,2.43280957
+12,75,1.6,1.05,15.31898925
+12,75,1.6,1.4,2.38991713
+12,75,1.8,0.7,16.34781985
+12,75,1.8,1.05,5.086568105
+12,75,1.8,1.4,17.76506143
+12,75,2,0.7,17.19897909
+12,75,2,1.05,32.17184556
+12,75,2,1.4,17.65870961
+12,75,2.2,0.7,19.73401949
+12,75,2.2,1.05,27.71886967
+12,75,2.2,1.4,2.75804036
+12,75,2.4,0.7,45.48213759
+12,75,2.4,1.05,40.6079649
+12,75,2.4,1.4,1.60176982
+12,100,1.5,0.7,8.892414655
+12,100,1.5,1.05,8.88408156
+12,100,1.5,1.4,9.853825685
+12,100,1.7,0.7,11.29506672
+12,100,1.7,1.05,13.35318585
+12,100,1.7,1.4,12.72629473
+12,100,1.9,0.7,18.6692565
+12,100,1.9,1.05,20.39089823
+12,100,1.9,1.4,21.70844968
+12,100,2.1,0.7,26.18295304
+12,100,2.1,1.05,29.36967361
+12,100,2.1,1.4,39.31829259
+12,100,2.3,0.7,34.90977982
+12,100,2.3,1.05,40.4790107
+12,100,2.3,1.4,1.843159445
+12,100,2.5,0.7,37.66667776
+12,100,2.5,1.05,37.06981261
+12,100,2.5,1.4,1.70377423
+12,125,1.6,0.7,13.71977862
+12,125,1.6,1.05,14.92099437
+12,125,1.6,1.4,12.07112258
+12,125,1.8,0.7,29.34213915
+12,125,1.8,1.05,22.95483198
+12,125,1.8,1.4,21.35987436
+12,125,2,0.7,33.82786567
+12,125,2,1.05,37.20733246
+12,125,2,1.4,38.36510421
+12,125,2.2,0.7,32.78833207
+12,125,2.2,1.05,33.16625308
+12,125,2.2,1.4,23.75170673
+12,125,2.4,0.7,35.76095873
+12,125,2.4,1.05,24.95509839
+12,125,2.4,1.4,2.37460567
+12,150,1.5,0.7,20.43303825
+12,150,1.5,1.05,18.19801116
+12,150,1.5,1.4,16.36990424
+12,150,1.7,0.7,27.56463097
+12,150,1.7,1.05,28.86626493
+12,150,1.7,1.4,21.9534511
+12,150,1.9,0.7,27.43718607
+12,150,1.9,1.05,43.81693055
+12,150,1.9,1.4,41.89631514
+12,150,2.1,0.7,30.01685387
+12,150,2.1,1.05,26.98313765
+12,150,2.1,1.4,15.82714667
+12,150,2.3,0.7,30.81267184
+12,150,2.3,1.05,20.01687814
+12,150,2.3,1.4,2.280350995
+12,150,2.5,0.7,33.55520108
+12,150,2.5,1.05,15.7435385
+12,150,2.5,1.4,1.573343915
+12,175,1.6,0.7,24.70855653
+12,175,1.6,1.05,28.30756993
+12,175,1.6,1.4,38.70371517
+12,175,1.8,0.7,30.44194607
+12,175,1.8,1.05,46.28138168
+12,175,1.8,1.4,46.04167205
+12,175,2,0.7,30.24429189
+12,175,2,1.05,20.9950382
+12,175,2,1.4,14.31680707
+12,175,2.2,0.7,31.34408471
+12,175,2.2,1.05,17.33874133
+12,175,2.2,1.4,1.629345795
+12,175,2.4,0.7,36.03900898
+12,175,2.4,1.05,10.59665846
+12,175,2.4,1.4,2.74636211
+12,200,1.5,0.7,32.69642057
+12,200,1.5,1.05,32.67447181
+12,200,1.5,1.4,39.71127057
+12,200,1.7,0.7,30.81942151
+12,200,1.7,1.05,20.98843555
+12,200,1.7,1.4,51.54260273
+12,200,1.9,0.7,29.9102573
+12,200,1.9,1.05,17.01436909
+12,200,1.9,1.4,8.28854607
+12,200,2.1,0.7,33.25790557
+12,200,2.1,1.05,11.36837164
+12,200,2.1,1.4,1.570382565
+12,200,2.3,0.7,34.8912318
+12,200,2.3,1.05,11.63569601
+12,200,2.3,1.4,1.216757475
+12,200,2.5,0.7,36.73641685
+12,200,2.5,1.05,1.52683429
+12,200,2.5,1.4,1.887555225
+6,0,1.5,0.7,0.984718805
+6,0,1.5,1.05,1.204278305
+6,0,1.5,1.4,1.66416987
+6,0,1.7,0.7,3.09425671
+6,0,1.7,1.05,2.933434265
+6,0,1.7,1.4,2.328659075
+6,0,1.9,0.7,3.576849065
+6,0,1.9,1.05,2.966058095
+6,0,1.9,1.4,6.652394795
+6,0,2.1,0.7,17.42102897
+6,0,2.1,1.05,6.771103375
+6,0,2.1,1.4,7.735849185
+6,0,2.3,0.7,5.017847775
+6,0,2.3,1.05,32.23955734
+6,0,2.3,1.4,2.02903116
+6,0,2.5,0.7,30.26843881
+6,0,2.5,1.05,11.31234055
+6,0,2.5,1.4,36.25217858
+6,25,1.6,0.7,2.09663152
+6,25,1.6,1.05,1.83385039
+6,25,1.6,1.4,1.696675845
+6,25,1.8,0.7,1.504651125
+6,25,1.8,1.05,4.24364418
+6,25,1.8,1.4,2.45040998
+6,25,2,0.7,3.88626849
+6,25,2,1.05,2.940354025
+6,25,2,1.4,6.44899864
+6,25,2.2,0.7,12.36841071
+6,25,2.2,1.05,7.9235667
+6,25,2.2,1.4,4.150184395
+6,25,2.4,0.7,18.73687729
+6,25,2.4,1.05,11.42302692
+6,25,2.4,1.4,2.25998876
+6,50,1.5,0.7,0.503617945
+6,50,1.5,1.05,0.77442139
+6,50,1.5,1.4,0.615132955
+6,50,1.7,0.7,0.857033345
+6,50,1.7,1.05,1.78397391
+6,50,1.7,1.4,1.47492584
+6,50,1.9,0.7,1.31915937
+6,50,1.9,1.05,1.898873585
+6,50,1.9,1.4,2.720035715
+6,50,2.1,0.7,3.17734853
+6,50,2.1,1.05,2.592669905
+6,50,2.1,1.4,3.74722125
+6,50,2.3,0.7,6.059289655
+6,50,2.3,1.05,8.212267235
+6,50,2.3,1.4,5.749600085
+6,50,2.5,0.7,6.19458219
+6,50,2.5,1.05,24.14959018
+6,50,2.5,1.4,21.12649344
+6,75,1.6,0.7,0.421248255
+6,75,1.6,1.05,0.74635778
+6,75,1.6,1.4,1.690187665
+6,75,1.8,0.7,0.874340925
+6,75,1.8,1.05,0.737498875
+6,75,1.8,1.4,0.764132035
+6,75,2,0.7,1.16090386
+6,75,2,1.05,2.33812806
+6,75,2,1.4,4.505327385
+6,75,2.2,0.7,3.738256045
+6,75,2.2,1.05,4.35728777
+6,75,2.2,1.4,11.99178691
+6,75,2.4,0.7,3.55753965
+6,75,2.4,1.05,19.44473814
+6,75,2.4,1.4,18.85629444
+6,100,1.5,0.7,1.297602915
+6,100,1.5,1.05,1.766962485
+6,100,1.5,1.4,1.55379982
+6,100,1.7,0.7,2.458336485
+6,100,1.7,1.05,2.608886545
+6,100,1.7,1.4,9.27425569
+6,100,1.9,0.7,1.230991015
+6,100,1.9,1.05,12.41231281
+6,100,1.9,1.4,13.77882286
+6,100,2.1,0.7,13.02767408
+6,100,2.1,1.05,14.89652844
+6,100,2.1,1.4,17.55796323
+6,100,2.3,0.7,17.90994853
+6,100,2.3,1.05,14.43700693
+6,100,2.3,1.4,16.11451264
+6,100,2.5,0.7,22.08445189
+6,100,2.5,1.05,20.04377174
+6,100,2.5,1.4,19.59464177
+6,125,1.6,0.7,1.085871695
+6,125,1.6,1.05,13.05591221
+6,125,1.6,1.4,13.9894676
+6,125,1.8,0.7,0.71230218
+6,125,1.8,1.05,13.82702867
+6,125,1.8,1.4,13.68365648
+6,125,2,0.7,1.39624755
+6,125,2,1.05,18.96923443
+6,125,2,1.4,16.97832826
+6,125,2.2,0.7,20.71585045
+6,125,2.2,1.05,18.72782356
+6,125,2.2,1.4,19.21279802
+6,125,2.4,0.7,21.46815411
+6,125,2.4,1.05,17.71837793
+6,125,2.4,1.4,20.38441493
+6,150,1.5,0.7,0.720294875
+6,150,1.5,1.05,0.91101892
+6,150,1.5,1.4,18.74742944
+6,150,1.7,0.7,0.88429715
+6,150,1.7,1.05,15.54963513
+6,150,1.7,1.4,19.01081895
+6,150,1.9,0.7,0.862449755
+6,150,1.9,1.05,15.59957872
+6,150,1.9,1.4,16.0481957
+6,150,2.1,0.7,14.10560919
+6,150,2.1,1.05,16.99550773
+6,150,2.1,1.4,16.09093879
+6,150,2.3,0.7,17.37752817
+6,150,2.3,1.05,17.35029167
+6,150,2.3,1.4,15.50390773
+6,150,2.5,0.7,17.94230795
+6,150,2.5,1.05,20.4220484
+6,150,2.5,1.4,16.39896448
+6,175,1.6,0.7,15.46033752
+6,175,1.6,1.05,19.34627319
+6,175,1.6,1.4,18.26674629
+6,175,1.8,0.7,15.6975907
+6,175,1.8,1.05,17.38876143
+6,175,1.8,1.4,28.19387442
+6,175,2,0.7,18.57465277
+6,175,2,1.05,17.13837747
+6,175,2,1.4,20.57800408
+6,175,2.2,0.7,19.21437316
+6,175,2.2,1.05,17.07134424
+6,175,2.2,1.4,16.37818041
+6,175,2.4,0.7,22.75940737
+6,175,2.4,1.05,17.88724908
+6,175,2.4,1.4,18.2698049
+6,200,1.5,0.7,15.7409393
+6,200,1.5,1.05,15.63951464
+6,200,1.5,1.4,20.37627403
+6,200,1.7,0.7,16.27981063
+6,200,1.7,1.05,26.36648259
+6,200,1.7,1.4,22.27744967
+6,200,1.9,0.7,13.79168408
+6,200,1.9,1.05,19.49920548
+6,200,1.9,1.4,22.75615377
+6,200,2.1,0.7,20.23517058
+6,200,2.1,1.05,20.51055968
+6,200,2.1,1.4,7.20144772
+6,200,2.3,0.7,23.40856053
+6,200,2.3,1.05,21.32481878
+6,200,2.3,1.4,24.85532039
+6,200,2.5,0.7,25.13038982
+6,200,2.5,1.05,22.80520974
+6,200,2.5,1.4,18.87405486
+8,0,1.5,0.7,1.79906466
+8,0,1.5,1.05,1.584290705
+8,0,1.5,1.4,1.660902335
+8,0,1.7,0.7,3.66459729
+8,0,1.7,1.05,2.09191768
+8,0,1.7,1.4,4.383226565
+8,0,1.9,0.7,5.202961875
+8,0,1.9,1.05,7.4669773
+8,0,1.9,1.4,4.02889168
+8,0,2.1,0.7,20.42346871
+8,0,2.1,1.05,19.61008402
+8,0,2.1,1.4,1.70359334
+8,0,2.3,0.7,4.988631565
+8,0,2.3,1.05,1.61534906
+8,0,2.3,1.4,1.9665795
+8,0,2.5,0.7,35.57965442
+8,0,2.5,1.05,2.239210555
+8,0,2.5,1.4,1.310974495
+8,25,1.6,0.7,3.92030164
+8,25,1.6,1.05,6.31753358
+8,25,1.6,1.4,2.70571583
+8,25,1.8,0.7,9.68552392
+8,25,1.8,1.05,6.70508105
+8,25,1.8,1.4,10.12589473
+8,25,2,0.7,6.35420248
+8,25,2,1.05,13.3530951
+8,25,2,1.4,10.95345267
+8,25,2.2,0.7,10.01264335
+8,25,2.2,1.05,29.72036515
+8,25,2.2,1.4,18.59106074
+8,25,2.4,0.7,13.43877417
+8,25,2.4,1.05,36.1300039
+8,25,2.4,1.4,34.9592874
+8,50,1.5,0.7,0.580645385
+8,50,1.5,1.05,0.2835024
+8,50,1.5,1.4,0.610162855
+8,50,1.7,0.7,1.068200195
+8,50,1.7,1.05,0.530468075
+8,50,1.7,1.4,2.57808866
+8,50,1.9,0.7,1.7688226
+8,50,1.9,1.05,0.99036637
+8,50,1.9,1.4,4.16800253
+8,50,2.1,0.7,2.552720965
+8,50,2.1,1.05,6.37566581
+8,50,2.1,1.4,4.02354012
+8,50,2.3,0.7,3.08157811
+8,50,2.3,1.05,19.8553271
+8,50,2.3,1.4,10.78723802
+8,50,2.5,0.7,4.478213675
+8,50,2.5,1.05,21.22377998
+8,50,2.5,1.4,2.090443795
+8,75,1.6,0.7,0.997970035
+8,75,1.6,1.05,0.5029841
+8,75,1.6,1.4,1.202600565
+8,75,1.8,0.7,1.923480915
+8,75,1.8,1.05,13.76810579
+8,75,1.8,1.4,0.98540034
+8,75,2,0.7,17.16436162
+8,75,2,1.05,1.427589615
+8,75,2,1.4,4.00071953
+8,75,2.2,0.7,17.61099159
+8,75,2.2,1.05,4.977815625
+8,75,2.2,1.4,28.39669297
+8,75,2.4,0.7,4.023762455
+8,75,2.4,1.05,21.54221829
+8,75,2.4,1.4,16.98524062
+8,100,1.5,0.7,1.752622255
+8,100,1.5,1.05,0.98552759
+8,100,1.5,1.4,0.381889405
+8,100,1.7,0.7,1.401898735
+8,100,1.7,1.05,16.41218992
+8,100,1.7,1.4,0.58207294
+8,100,1.9,0.7,15.761628
+8,100,1.9,1.05,21.01485876
+8,100,1.9,1.4,1.09751429
+8,100,2.1,0.7,18.09078329
+8,100,2.1,1.05,27.92352784
+8,100,2.1,1.4,2.174995185
+8,100,2.3,0.7,20.89136195
+8,100,2.3,1.05,30.80100966
+8,100,2.3,1.4,15.90063296
+8,100,2.5,0.7,3.691875515
+8,100,2.5,1.05,29.25635883
+8,100,2.5,1.4,37.2935421
+8,125,1.6,0.7,0.555669225
+8,125,1.6,1.05,1.54022802
+8,125,1.6,1.4,1.772851885
+8,125,1.8,0.7,17.40060132
+8,125,1.8,1.05,1.15879333
+8,125,1.8,1.4,1.74030975
+8,125,2,0.7,1.26034766
+8,125,2,1.05,16.96168832
+8,125,2,1.4,17.09009911
+8,125,2.2,0.7,21.53762106
+8,125,2.2,1.05,23.23672095
+8,125,2.2,1.4,17.31953869
+8,125,2.4,0.7,22.84953928
+8,125,2.4,1.05,24.81064122
+8,125,2.4,1.4,24.46094024
+8,150,1.5,0.7,15.37844109
+8,150,1.5,1.05,16.36829634
+8,150,1.5,1.4,1.90937273
+8,150,1.7,0.7,13.29449274
+8,150,1.7,1.05,18.11751563
+8,150,1.7,1.4,24.27369623
+8,150,1.9,0.7,21.12950211
+8,150,1.9,1.05,2.87239936
+8,150,1.9,1.4,18.21817377
+8,150,2.1,0.7,23.11471414
+8,150,2.1,1.05,25.97304787
+8,150,2.1,1.4,11.0882812
+8,150,2.3,0.7,25.69999832
+8,150,2.3,1.05,24.84117849
+8,150,2.3,1.4,21.82711212
+8,150,2.5,0.7,20.32642785
+8,150,2.5,1.05,28.80428434
+8,150,2.5,1.4,23.14973202
+8,175,1.6,0.7,9.44977179
+8,175,1.6,1.05,13.35499867
+8,175,1.6,1.4,12.54898462
+8,175,1.8,0.7,9.934021545
+8,175,1.8,1.05,22.54772138
+8,175,1.8,1.4,19.39221531
+8,175,2,0.7,19.87380413
+8,175,2,1.05,30.09047112
+8,175,2,1.4,35.5636307
+8,175,2.2,0.7,21.70413423
+8,175,2.2,1.05,26.32360299
+8,175,2.2,1.4,21.14495698
+8,175,2.4,0.7,25.05996553
+8,175,2.4,1.05,26.33490468
+8,175,2.4,1.4,26.17297952
+8,200,1.5,0.7,19.75280611
+8,200,1.5,1.05,13.41499684
+8,200,1.5,1.4,15.70872909
+8,200,1.7,0.7,21.33334446
+8,200,1.7,1.05,13.53689275
+8,200,1.7,1.4,12.99023395
+8,200,1.9,0.7,21.89667604
+8,200,1.9,1.05,22.53879111
+8,200,1.9,1.4,21.90320458
+8,200,2.1,0.7,25.87711604
+8,200,2.1,1.05,22.34457401
+8,200,2.1,1.4,20.82277737
+8,200,2.3,0.7,25.5377981
+8,200,2.3,1.05,23.16218558
+8,200,2.3,1.4,21.21698051
+8,200,2.5,0.7,31.19337179
+8,200,2.5,1.05,23.35022337
+8,200,2.5,1.4,22.21883225
+10,0,1.5,0.7,2.484941625
+10,0,1.5,1.05,1.995446115
+10,0,1.5,1.4,1.59246101
+10,0,1.7,0.7,3.93400999
+10,0,1.7,1.05,4.202121115
+10,0,1.7,1.4,2.09316675
+10,0,1.9,0.7,6.404926035
+10,0,1.9,1.05,2.301721065
+10,0,1.9,1.4,2.207163845
+10,0,2.1,0.7,19.13454141
+10,0,2.1,1.05,1.59126824
+10,0,2.1,1.4,1.47175539
+10,0,2.3,0.7,8.552942635
+10,0,2.3,1.05,1.48189301
+10,0,2.3,1.4,1.22052988
+10,0,2.5,0.7,2.17018344
+10,0,2.5,1.05,1.78869854
+10,0,2.5,1.4,1.23106499
+10,25,1.6,0.7,3.236290435
+10,25,1.6,1.05,4.48764365
+10,25,1.6,1.4,5.52352907
+10,25,1.8,0.7,4.301986835
+10,25,1.8,1.05,7.23375999
+10,25,1.8,1.4,6.765780615
+10,25,2,0.7,9.176301185
+10,25,2,1.05,11.53404773
+10,25,2,1.4,8.83892428
+10,25,2.2,0.7,23.76283092
+10,25,2.2,1.05,8.484391765
+10,25,2.2,1.4,1.75988664
+10,25,2.4,0.7,31.26961212
+10,25,2.4,1.05,32.82540015
+10,25,2.4,1.4,12.38719482
+10,50,1.5,0.7,0.39829036
+10,50,1.5,1.05,1.309078795
+10,50,1.5,1.4,1.787142455
+10,50,1.7,0.7,2.04446714
+10,50,1.7,1.05,0.80325155
+10,50,1.7,1.4,2.6504243
+10,50,1.9,0.7,4.3821171
+10,50,1.9,1.05,1.884693735
+10,50,1.9,1.4,5.6230742
+10,50,2.1,0.7,8.18131518
+10,50,2.1,1.05,18.25382211
+10,50,2.1,1.4,8.43650171
+10,50,2.3,0.7,18.80038505
+10,50,2.3,1.05,23.0185344
+10,50,2.3,1.4,18.32694408
+10,50,2.5,0.7,17.63498946
+10,50,2.5,1.05,8.159024855
+10,50,2.5,1.4,1.883642545
+10,75,1.6,0.7,2.55179376
+10,75,1.6,1.05,3.982026465
+10,75,1.6,1.4,0.91748268
+10,75,1.8,0.7,3.71797517
+10,75,1.8,1.05,13.02729787
+10,75,1.8,1.4,15.57363845
+10,75,2,0.7,7.923393555
+10,75,2,1.05,19.17797565
+10,75,2,1.4,21.90600339
+10,75,2.2,0.7,22.52605105
+10,75,2.2,1.05,25.9285469
+10,75,2.2,1.4,30.17208591
+10,75,2.4,0.7,18.19590629
+10,75,2.4,1.05,31.50348043
+10,75,2.4,1.4,33.23522319
+10,100,1.5,0.7,2.03703113
+10,100,1.5,1.05,16.70525583
+10,100,1.5,1.4,14.96158266
+10,100,1.7,0.7,16.76906101
+10,100,1.7,1.05,19.32535098
+10,100,1.7,1.4,18.86877373
+10,100,1.9,0.7,20.10515772
+10,100,1.9,1.05,22.11283985
+10,100,1.9,1.4,22.68859384
+10,100,2.1,0.7,23.38482757
+10,100,2.1,1.05,26.33086888
+10,100,2.1,1.4,23.24464829
+10,100,2.3,0.7,27.22173275
+10,100,2.3,1.05,31.89632291
+10,100,2.3,1.4,2.769482045
+10,100,2.5,0.7,32.82694581
+10,100,2.5,1.05,29.88330736
+10,100,2.5,1.4,2.558668295
+10,125,1.6,0.7,11.46484409
+10,125,1.6,1.05,14.31538651
+10,125,1.6,1.4,12.51399667
+10,125,1.8,0.7,18.52669987
+10,125,1.8,1.05,18.84357803
+10,125,1.8,1.4,16.15506253
+10,125,2,0.7,22.17191514
+10,125,2,1.05,25.99219371
+10,125,2,1.4,28.12012429
+10,125,2.2,0.7,31.32995625
+10,125,2.2,1.05,31.12102655
+10,125,2.2,1.4,36.94337918
+10,125,2.4,0.7,32.85563771
+10,125,2.4,1.05,27.64733324
+10,125,2.4,1.4,24.46426331
+10,150,1.5,0.7,17.50682348
+10,150,1.5,1.05,11.86753321
+10,150,1.5,1.4,9.39198196
+10,150,1.7,0.7,22.64905122
+10,150,1.7,1.05,27.76133619
+10,150,1.7,1.4,30.75323761
+10,150,1.9,0.7,25.18258923
+10,150,1.9,1.05,32.25932257
+10,150,1.9,1.4,36.26241233
+10,150,2.1,0.7,26.25669384
+10,150,2.1,1.05,27.06739447
+10,150,2.1,1.4,21.90865338
+10,150,2.3,0.7,31.35316374
+10,150,2.3,1.05,26.99388042
+10,150,2.3,1.4,18.95177967
+10,150,2.5,0.7,34.61506059
+10,150,2.5,1.05,25.0872446
+10,150,2.5,1.4,2.04505332
+10,175,1.6,0.7,23.03021044
+10,175,1.6,1.05,26.78930236
+10,175,1.6,1.4,24.08115478
+10,175,1.8,0.7,24.72800972
+10,175,1.8,1.05,32.54962845
+10,175,1.8,1.4,41.38951944
+10,175,2,0.7,24.41042384
+10,175,2,1.05,24.18133668
+10,175,2,1.4,34.30511905
+10,175,2.2,0.7,26.09665248
+10,175,2.2,1.05,22.71365938
+10,175,2.2,1.4,24.91481805
+10,175,2.4,0.7,28.60261435
+10,175,2.4,1.05,21.88111405
+10,175,2.4,1.4,16.87573066
+10,200,1.5,0.7,24.87143932
+10,200,1.5,1.05,23.6502444
+10,200,1.5,1.4,30.34241852
+10,200,1.7,0.7,22.84413083
+10,200,1.7,1.05,25.15946955
+10,200,1.7,1.4,23.55279285
+10,200,1.9,0.7,24.82666369
+10,200,1.9,1.05,20.82860256
+10,200,1.9,1.4,19.70498165
+10,200,2.1,0.7,27.94340729
+10,200,2.1,1.05,19.37243051
+10,200,2.1,1.4,16.46835299
+10,200,2.3,0.7,32.16715351
+10,200,2.3,1.05,18.66841468
+10,200,2.3,1.4,19.93479405
+10,200,2.5,0.7,36.31708483
+10,200,2.5,1.05,2.874153325
+10,200,2.5,1.4,2.48323922
+12,0,1.5,0.7,2.817184975
+12,0,1.5,1.05,2.8202735
+12,0,1.5,1.4,1.94721929
+12,0,1.7,0.7,2.837285865
+12,0,1.7,1.05,1.65020764
+12,0,1.7,1.4,1.79740427
+12,0,1.9,0.7,7.80562971
+12,0,1.9,1.05,1.83451679
+12,0,1.9,1.4,1.573231545
+12,0,2.1,0.7,2.102801175
+12,0,2.1,1.05,8.535636925
+12,0,2.1,1.4,1.41095575
+12,0,2.3,0.7,21.10118362
+12,0,2.3,1.05,1.371921215
+12,0,2.3,1.4,1.305498525
+12,0,2.5,0.7,32.83765951
+12,0,2.5,1.05,1.307638845
+12,0,2.5,1.4,1.138089705
+12,25,1.6,0.7,1.904929865
+12,25,1.6,1.05,3.52213153
+12,25,1.6,1.4,1.38790277
+12,25,1.8,0.7,5.997701515
+12,25,1.8,1.05,4.88818575
+12,25,1.8,1.4,7.573931395
+12,25,2,0.7,12.52197107
+12,25,2,1.05,11.66128167
+12,25,2,1.4,13.06205261
+12,25,2.2,0.7,37.68724288
+12,25,2.2,1.05,33.68153487
+12,25,2.2,1.4,1.891449785
+12,25,2.4,0.7,50.83130521
+12,25,2.4,1.05,10.10799107
+12,25,2.4,1.4,1.300664185
+12,50,1.5,0.7,1.16333293
+12,50,1.5,1.05,3.115892155
+12,50,1.5,1.4,2.65670081
+12,50,1.7,0.7,4.555843875
+12,50,1.7,1.05,2.579712
+12,50,1.7,1.4,4.76844995
+12,50,1.9,0.7,9.916262775
+12,50,1.9,1.05,16.58984522
+12,50,1.9,1.4,8.952703645
+12,50,2.1,0.7,8.43442134
+12,50,2.1,1.05,23.66746768
+12,50,2.1,1.4,1.57108567
+12,50,2.3,0.7,11.1407421
+12,50,2.3,1.05,37.08072058
+12,50,2.3,1.4,25.79438494
+12,50,2.5,0.7,35.87166052
+12,50,2.5,1.05,1.44766338
+12,50,2.5,1.4,1.492311205
+12,75,1.6,0.7,2.117595435
+12,75,1.6,1.05,3.363703575
+12,75,1.6,1.4,14.92657584
+12,75,1.8,0.7,4.903521785
+12,75,1.8,1.05,16.55792988
+12,75,1.8,1.4,14.25681865
+12,75,2,0.7,24.55175934
+12,75,2,1.05,25.44355022
+12,75,2,1.4,15.99058804
+12,75,2.2,0.7,33.17701842
+12,75,2.2,1.05,36.28859878
+12,75,2.2,1.4,1.790871605
+12,75,2.4,0.7,41.35446994
+12,75,2.4,1.05,47.30570731
+12,75,2.4,1.4,2.155238865
+12,100,1.5,0.7,9.29353788
+12,100,1.5,1.05,12.11958914
+12,100,1.5,1.4,11.8038592
+12,100,1.7,0.7,19.0194704
+12,100,1.7,1.05,17.53314818
+12,100,1.7,1.4,14.66705747
+12,100,1.9,0.7,18.74793491
+12,100,1.9,1.05,27.97689242
+12,100,1.9,1.4,26.2044042
+12,100,2.1,0.7,37.41047273
+12,100,2.1,1.05,37.35179195
+12,100,2.1,1.4,24.43435657
+12,100,2.3,0.7,38.84055602
+12,100,2.3,1.05,39.8601446
+12,100,2.3,1.4,34.17278767
+12,100,2.5,0.7,39.42386505
+12,100,2.5,1.05,30.72339312
+12,100,2.5,1.4,1.581840945
+12,125,1.6,0.7,11.04265774
+12,125,1.6,1.05,30.20966198
+12,125,1.6,1.4,12.90936504
+12,125,1.8,0.7,19.76653614
+12,125,1.8,1.05,32.28743284
+12,125,1.8,1.4,31.66129959
+12,125,2,0.7,31.47662584
+12,125,2,1.05,36.25284256
+12,125,2,1.4,44.04477933
+12,125,2.2,0.7,32.43359398
+12,125,2.2,1.05,29.59553908
+12,125,2.2,1.4,23.16476721
+12,125,2.4,0.7,37.54951294
+12,125,2.4,1.05,1.878474045
+12,125,2.4,1.4,22.13553289
+12,150,1.5,0.7,18.33169252
+12,150,1.5,1.05,21.98816719
+12,150,1.5,1.4,17.58409244
+12,150,1.7,0.7,28.19673461
+12,150,1.7,1.05,32.67804959
+12,150,1.7,1.4,25.15656951
+12,150,1.9,0.7,27.97876193
+12,150,1.9,1.05,27.66069837
+12,150,1.9,1.4,48.98711188
+12,150,2.1,0.7,28.81046509
+12,150,2.1,1.05,22.31453663
+12,150,2.1,1.4,2.12203775
+12,150,2.3,0.7,33.72884771
+12,150,2.3,1.05,20.08719368
+12,150,2.3,1.4,18.99845952
+12,150,2.5,0.7,32.94164965
+12,150,2.5,1.05,20.7900743
+12,150,2.5,1.4,1.22973419
+12,175,1.6,0.7,30.49768339
+12,175,1.6,1.05,39.07880007
+12,175,1.6,1.4,37.85625565
+12,175,1.8,0.7,30.55014033
+12,175,1.8,1.05,21.71498025
+12,175,1.8,1.4,48.00469508
+12,175,2,0.7,29.49511193
+12,175,2,1.05,23.87025342
+12,175,2,1.4,1.72323757
+12,175,2.2,0.7,31.41051358
+12,175,2.2,1.05,16.71189843
+12,175,2.2,1.4,14.47445507
+12,175,2.4,0.7,34.65747253
+12,175,2.4,1.05,14.92602464
+12,175,2.4,1.4,1.1411741
+12,200,1.5,0.7,25.91147249
+12,200,1.5,1.05,36.65199221
+12,200,1.5,1.4,43.44795774
+12,200,1.7,0.7,29.4756594
+12,200,1.7,1.05,19.96334537
+12,200,1.7,1.4,20.06653041
+12,200,1.9,0.7,30.4019694
+12,200,1.9,1.05,17.529669
+12,200,1.9,1.4,2.84463563
+12,200,2.1,0.7,32.08265752
+12,200,2.1,1.05,14.89627256
+12,200,2.1,1.4,1.731124215
+12,200,2.3,0.7,32.63826111
+12,200,2.3,1.05,1.35897464
+12,200,2.3,1.4,3.196306215
+12,200,2.5,0.7,36.1041867
+12,200,2.5,1.05,1.31348703
+12,200,2.5,1.4,1.069728395
\ No newline at end of file
diff --git a/src/concrete_mod.csv b/src/data/concrete_mod.csv
similarity index 100%
rename from src/concrete_mod.csv
rename to src/data/concrete_mod.csv
diff --git a/src/data/double_perovskites_gap.csv b/src/data/double_perovskites_gap.csv
new file mode 100644
index 0000000..f8b70b1
--- /dev/null
+++ b/src/data/double_perovskites_gap.csv
@@ -0,0 +1,1307 @@
+formula,band gap
+AgNbLaAlO6,4.1645432
+AgNbLaGaO6,4.454628775
+AgNbLaInO6,4.192522296
+AgNbMgTiO6,3.963856895
+AgNbSnTiO6,2.881239408
+AgNbYAlO6,3.958215489
+AgTaAgNbO6,3.367340076
+AgTaBaSnO6,4.115527804
+AgTaBaTiO6,3.65187538
+AgTaCaGeO6,4.596741977
+AgTaCaSiO6,4.787204683
+AgTaCaSnO6,4.567418298
+AgTaCaTiO6,3.856408782
+AgTaCsNbO6,3.257419299
+AgTaCsVO6,2.169553701
+AgTaGaNbO6,1.784718332
+AgTaGaTaO6,2.285462409
+AgTaKNbO6,3.43280078
+AgTaKSbO6,4.253437286
+AgTaLaAlO6,4.544527043
+AgTaLaGaO6,4.428479438
+AgTaLaInO6,4.598427211
+AgTaLiNbO6,3.554350261
+AgTaLiVO6,1.661856626
+AgTaMgTiO6,4.541470588
+AgTaNaNbO6,3.523501827
+AgTaNaSbO6,4.383274568
+AgTaNaVO6,1.67087028
+AgTaPbHfO6,4.468824182
+AgTaPbTiO6,3.806312329
+AgTaPbZrO6,4.43593134
+AgTaRbNbO6,3.372019754
+AgTaSnHfO6,3.676099376
+AgTaSnTiO6,3.280047217
+AgTaSnZrO6,3.671961049
+AgTaSrGeO6,4.544428383
+AgTaSrSiO6,4.692218139
+AgTaSrSnO6,4.170643623
+AgTaSrTiO6,3.79098509
+AgTaTlNbO6,1.792464465
+AgTaYAlO6,4.914572548
+BaHfAgNbO6,4.078047088
+BaHfAgTaO6,4.189891965
+BaHfBaSnO6,6.081554918
+BaHfBaTiO6,4.617955975
+BaHfBaZrO6,6.343123966
+BaHfCaGeO6,6.350080917
+BaHfCaHfO6,7.105780282
+BaHfCaSiO6,7.124555422
+BaHfCaSnO6,6.149864419
+BaHfCaTiO6,4.881718641
+BaHfCaZrO6,6.793831407
+BaHfCsNbO6,4.17192157
+BaHfCsTaO6,4.954141388
+BaHfCsVO6,2.024082776
+BaHfGaNbO6,2.740038109
+BaHfGaTaO6,3.468891843
+BaHfInNbO6,1.490876326
+BaHfInTaO6,2.148573734
+BaHfKNbO6,4.237405144
+BaHfKSbO6,5.319984256
+BaHfKTaO6,5.043565766
+BaHfLaAlO6,6.842296397
+BaHfLaGaO6,7.087096038
+BaHfLaInO6,6.388361955
+BaHfLaScO6,7.259237807
+BaHfLiNbO6,4.346862988
+BaHfLiTaO6,5.156989314
+BaHfLiVO6,1.950932284
+BaHfMgTiO6,5.157325978
+BaHfMgZrO6,7.180769915
+BaHfNaNbO6,4.323594526
+BaHfNaSbO6,5.605111851
+BaHfNaTaO6,5.133972612
+BaHfNaVO6,1.943310423
+BaHfPbHfO6,5.861282859
+BaHfPbTiO6,4.716210837
+BaHfPbZrO6,5.798471802
+BaHfRbNbO6,4.19891716
+BaHfRbTaO6,4.999203073
+BaHfSnHfO6,5.154654591
+BaHfSnTiO6,4.117831884
+BaHfSnZrO6,5.129260058
+BaHfSrGeO6,6.108099686
+BaHfSrHfO6,6.703417504
+BaHfSrSiO6,7.100622387
+BaHfSrSnO6,6.260326191
+BaHfSrTiO6,4.711382223
+BaHfSrZrO6,6.459329422
+BaHfTlNbO6,2.787349496
+BaHfTlTaO6,3.519530094
+BaHfYAlO6,7.467627553
+BaSnAgNbO6,4.196255316
+BaSnBaTiO6,4.610173391
+BaSnCaGeO6,2.613094084
+BaSnCaSiO6,3.328665599
+BaSnCaSnO6,3.237558695
+BaSnCaTiO6,4.634935362
+BaSnLaAlO6,5.229700982
+BaSnLaGaO6,3.753770355
+BaSnLaInO6,3.824912325
+BaSnLiNbO6,4.985344912
+BaSnLiVO6,2.187158914
+BaSnMgTiO6,4.682433617
+BaSnMgZrO6,5.534709008
+BaSnNaNbO6,4.950429901
+BaSnNaSbO6,1.584677745
+BaSnNaVO6,2.182041303
+BaSnSnTiO6,4.156500556
+BaSnSrGeO6,1.902720005
+BaSnSrSiO6,3.060194418
+BaSnSrSnO6,2.664761815
+BaSnSrTiO6,4.845106688
+BaTiAgNbO6,3.238934908
+BaTiCaGeO6,4.544465349
+BaTiCaSiO6,4.314413855
+BaTiCaSnO6,4.63511974
+BaTiCaTiO6,3.834829908
+BaTiCsNbO6,3.933396345
+BaTiCsVO6,2.387688728
+BaTiLaAlO6,4.924750863
+BaTiLaGaO6,5.227039321
+BaTiLaInO6,5.084089538
+BaTiLiNbO6,3.463015828
+BaTiLiVO6,2.517040515
+BaTiMgTiO6,4.287310033
+BaTiMgZrO6,5.285884852
+BaTiNaNbO6,3.438581234
+BaTiNaSbO6,3.997105561
+BaTiNaVO6,2.180167758
+BaTiSnTiO6,2.851249888
+BaTiSrGeO6,4.35844875
+BaTiSrSiO6,4.207262042
+BaTiSrSnO6,4.859086368
+BaTiSrTiO6,3.773082118
+BaTiTlTaO6,2.184473305
+BaTiYAlO6,4.942037308
+BaZrAgNbO6,4.048794437
+BaZrAgTaO6,4.158986001
+BaZrBaSnO6,6.142792824
+BaZrBaTiO6,4.586349916
+BaZrCaGeO6,5.912270768
+BaZrCaSiO6,6.640590237
+BaZrCaSnO6,6.572670735
+BaZrCaTiO6,4.883903763
+BaZrCaZrO6,6.311282226
+BaZrCsNbO6,4.133326334
+BaZrCsTaO6,4.861702868
+BaZrCsVO6,2.395969852
+BaZrGaNbO6,2.741399812
+BaZrGaTaO6,3.420362849
+BaZrInNbO6,1.504016995
+BaZrInTaO6,2.115610367
+BaZrKNbO6,4.192233183
+BaZrKSbO6,5.244987496
+BaZrKTaO6,4.946851271
+BaZrLaAlO6,6.675560233
+BaZrLaGaO6,6.801343992
+BaZrLaInO6,6.468202648
+BaZrLaScO6,6.949118842
+BaZrLiNbO6,4.294253113
+BaZrLiTaO6,5.060782046
+BaZrLiVO6,1.971169487
+BaZrMgTiO6,5.389081221
+BaZrMgZrO6,6.96083831
+BaZrNaNbO6,4.270644268
+BaZrNaSbO6,5.526897153
+BaZrNaTaO6,5.030675991
+BaZrNaVO6,1.958775816
+BaZrPbHfO6,5.798203095
+BaZrPbTiO6,4.688503642
+BaZrPbZrO6,5.739209581
+BaZrRbNbO6,4.158490708
+BaZrRbTaO6,4.904996208
+BaZrSnHfO6,5.129425153
+BaZrSnTiO6,4.11156648
+BaZrSnZrO6,5.112918696
+BaZrSrGeO6,6.035786095
+BaZrSrHfO6,6.459207069
+BaZrSrSiO6,6.576553008
+BaZrSrSnO6,6.428286699
+BaZrSrTiO6,4.67649105
+BaZrSrZrO6,6.259867326
+BaZrTlNbO6,2.79832233
+BaZrTlTaO6,3.480467428
+BaZrYAlO6,7.104402829
+CaGeAgNbO6,4.220841195
+CaGeCaSiO6,4.171278359
+CaGeCaSnO6,3.503853221
+CaGeCaTiO6,4.802428919
+CaGeLaAlO6,5.708900913
+CaGeLaGaO6,4.068071283
+CaGeLaInO6,4.288775178
+CaGeMgTiO6,5.224069822
+CaGeSnTiO6,3.350439602
+CaGeYAlO6,6.231533057
+CaHfAgNbO6,4.219675653
+CaHfAgTaO6,5.065212369
+CaHfBaSnO6,6.318267248
+CaHfBaTiO6,4.891229032
+CaHfBaZrO6,6.78352084
+CaHfCaGeO6,6.975336372
+CaHfCaSiO6,7.339484884
+CaHfCaSnO6,6.545899417
+CaHfCaTiO6,5.2391328
+CaHfCaZrO6,7.019655916
+CaHfCsNbO6,4.18714751
+CaHfCsVO6,2.234427829
+CaHfGaNbO6,2.259002479
+CaHfGaTaO6,3.12564489
+CaHfInNbO6,1.454858937
+CaHfInTaO6,2.03089957
+CaHfKNbO6,4.596569242
+CaHfKSbO6,5.501346172
+CaHfLaAlO6,7.680848563
+CaHfLaGaO6,7.195321372
+CaHfLaInO6,6.615394048
+CaHfLaScO6,7.286131811
+CaHfLiNbO6,4.85855487
+CaHfLiVO6,2.939415754
+CaHfMgTiO6,5.757074701
+CaHfMgZrO6,7.657304806
+CaHfNaNbO6,5.09102671
+CaHfNaSbO6,5.696946038
+CaHfNaTaO6,5.899206132
+CaHfNaVO6,2.576282825
+CaHfPbHfO6,5.946077772
+CaHfPbTiO6,4.343194061
+CaHfPbZrO6,5.663239448
+CaHfRbNbO6,4.347730015
+CaHfSnHfO6,5.099139427
+CaHfSnTiO6,3.395877585
+CaHfSnZrO6,4.960405248
+CaHfSrGeO6,6.296526494
+CaHfSrHfO6,7.245106988
+CaHfSrSiO6,7.311458271
+CaHfSrSnO6,6.441396629
+CaHfSrTiO6,5.063213848
+CaHfSrZrO6,7.258641193
+CaHfTlNbO6,2.785946526
+CaHfTlTaO6,3.488495574
+CaHfYAlO6,8.019541754
+CaSiAgNbO6,3.835308947
+CaSiCaSnO6,4.523794734
+CaSiCaTiO6,4.563855279
+CaSiLaAlO6,7.763296446
+CaSiLaGaO6,5.420695949
+CaSiLaInO6,5.447420818
+CaSiMgTiO6,4.905223459
+CaSiSnTiO6,2.549360828
+CaSiYAlO6,8.343255111
+CaSnAgNbO6,3.845223245
+CaSnCaTiO6,5.021395043
+CaSnLaAlO6,5.731598265
+CaSnLaGaO6,4.421397112
+CaSnLaInO6,4.332199336
+CaSnMgTiO6,5.246768531
+CaSnSnTiO6,2.72801287
+CaSnYAlO6,5.902973047
+CaTiAgNbO6,3.399832758
+CaTiLaAlO6,5.239331703
+CaTiLaGaO6,5.340395495
+CaTiLaInO6,5.218969424
+CaTiMgTiO6,4.786930752
+CaTiSnTiO6,2.795444748
+CaTiYAlO6,5.421790832
+CaZrAgNbO6,4.352637765
+CaZrAgTaO6,5.00355801
+CaZrBaSnO6,6.571947433
+CaZrBaTiO6,4.941329535
+CaZrCaGeO6,6.336280867
+CaZrCaSiO6,6.891564761
+CaZrCaSnO6,6.688083161
+CaZrCaTiO6,5.26054136
+CaZrCsNbO6,4.287619027
+CaZrCsVO6,2.604377392
+CaZrGaNbO6,2.228163324
+CaZrGaTaO6,3.014914456
+CaZrInNbO6,1.456944238
+CaZrInTaO6,2.057918429
+CaZrKNbO6,4.630967138
+CaZrKSbO6,5.399489278
+CaZrLaAlO6,6.792712674
+CaZrLaGaO6,6.915401065
+CaZrLaInO6,6.732697601
+CaZrLaScO6,7.106711864
+CaZrLiNbO6,5.120245746
+CaZrLiTaO6,5.605585615
+CaZrLiVO6,3.120799521
+CaZrMgTiO6,5.924793527
+CaZrMgZrO6,7.080509925
+CaZrNaNbO6,5.162790192
+CaZrNaSbO6,5.537664127
+CaZrNaTaO6,5.939519026
+CaZrNaVO6,2.457278723
+CaZrPbHfO6,5.966256093
+CaZrPbTiO6,4.496582604
+CaZrPbZrO6,5.921731313
+CaZrRbNbO6,4.296312174
+CaZrSnHfO6,4.966758775
+CaZrSnTiO6,3.500428614
+CaZrSrGeO6,6.114467667
+CaZrSrHfO6,7.245451656
+CaZrSrSiO6,6.832765223
+CaZrSrSnO6,6.724869435
+CaZrSrTiO6,5.078140778
+CaZrSrZrO6,6.802271822
+CaZrTlNbO6,2.711079064
+CaZrTlTaO6,3.399255554
+CaZrYAlO6,7.690766219
+CsNbAgNbO6,3.33017012
+CsNbBaSnO6,4.222506347
+CsNbCaGeO6,3.77620684
+CsNbCaSiO6,3.244987246
+CsNbCaSnO6,4.0016578
+CsNbCaTiO6,3.781984576
+CsNbCsTaO6,3.431655002
+CsNbGaNbO6,1.568671522
+CsNbGaTaO6,1.689092986
+CsNbInNbO6,0.772474049
+CsNbKNbO6,3.371381999
+CsNbKSbO6,3.252953266
+CsNbLaAlO6,3.970550913
+CsNbLaGaO6,4.445701186
+CsNbLaInO6,4.659075089
+CsNbLiNbO6,3.358618162
+CsNbMgTiO6,3.70530303
+CsNbMgZrO6,5.068744498
+CsNbNaNbO6,3.456134098
+CsNbNaSbO6,3.475302498
+CsNbPbHfO6,4.125761782
+CsNbPbTiO6,3.806622078
+CsNbPbZrO6,4.100090389
+CsNbRbNbO6,3.389681924
+CsNbSnHfO6,3.837245653
+CsNbSnTiO6,2.905831639
+CsNbSnZrO6,3.396033234
+CsNbSrGeO6,3.617636293
+CsNbSrSiO6,3.264936787
+CsNbSrSnO6,4.520872076
+CsNbSrTiO6,3.872904631
+CsNbTlNbO6,2.10377581
+CsNbYAlO6,3.724349822
+CsTaAgNbO6,3.258149897
+CsTaAgTaO6,3.808143901
+CsTaBaSnO6,4.584905096
+CsTaBaTiO6,3.902959037
+CsTaCaGeO6,4.184887473
+CsTaCaHfO6,4.97375148
+CsTaCaSiO6,4.136175518
+CsTaCaSnO6,4.523695478
+CsTaCaTiO6,3.849509114
+CsTaCaZrO6,4.972347834
+CsTaCsVO6,2.139696775
+CsTaGaNbO6,1.689655245
+CsTaGaTaO6,2.162289219
+CsTaKNbO6,3.29564536
+CsTaKSbO6,3.598247689
+CsTaKTaO6,3.829263824
+CsTaLaAlO6,4.790851813
+CsTaLaGaO6,5.274671803
+CsTaLaInO6,5.039008801
+CsTaLaScO6,5.224512176
+CsTaLiNbO6,3.3951785
+CsTaLiTaO6,3.91261728
+CsTaLiVO6,2.351802857
+CsTaMgTiO6,3.791325966
+CsTaMgZrO6,5.85854129
+CsTaNaNbO6,3.375315176
+CsTaNaSbO6,3.85601142
+CsTaNaTaO6,3.893347423
+CsTaNaVO6,2.0949465
+CsTaPbHfO6,4.840162189
+CsTaPbTiO6,3.441401642
+CsTaPbZrO6,4.867170086
+CsTaRbNbO6,3.239810056
+CsTaRbTaO6,3.759439299
+CsTaSnHfO6,3.975569031
+CsTaSnTiO6,3.066637476
+CsTaSnZrO6,4.550292742
+CsTaSrGeO6,3.981506845
+CsTaSrHfO6,5.048941056
+CsTaSrSiO6,4.170938456
+CsTaSrSnO6,4.909403889
+CsTaSrTiO6,3.506011227
+CsTaSrZrO6,4.95376077
+CsTaTlNbO6,2.277721909
+CsTaTlTaO6,2.209663313
+CsTaYAlO6,4.67918643
+CsVBaSnO6,2.072447249
+CsVCaGeO6,1.540581216
+CsVCaSiO6,1.083685684
+CsVCaSnO6,1.797516438
+CsVCaTiO6,2.424146688
+CsVGaNbO6,0.725860475
+CsVGaTaO6,0.427417209
+CsVKSbO6,1.53383603
+CsVLaAlO6,1.617153328
+CsVLaGaO6,1.929652967
+CsVLaInO6,2.385279742
+CsVLiVO6,1.676047872
+CsVMgZrO6,2.234714469
+CsVNaSbO6,1.663055524
+CsVNaVO6,1.695828684
+CsVPbTiO6,2.173707247
+CsVSnTiO6,1.531649409
+CsVSrGeO6,1.535642736
+CsVSrSiO6,1.081372328
+CsVSrSnO6,2.126154005
+CsVSrTiO6,2.402826221
+CsVTlTaO6,1.04242215
+CsVYAlO6,1.373149472
+GaNbAgNbO6,1.455146082
+GaNbBaSnO6,3.13985473
+GaNbBaTiO6,1.844905752
+GaNbCaGeO6,2.128865476
+GaNbCaSiO6,1.379197283
+GaNbCaSnO6,1.843996924
+GaNbCaTiO6,1.464554512
+GaNbLaAlO6,2.126529305
+GaNbLaGaO6,2.674483127
+GaNbLaInO6,2.493512245
+GaNbLiNbO6,1.401236812
+GaNbMgTiO6,1.202758352
+GaNbMgZrO6,2.970601472
+GaNbNaNbO6,1.403098217
+GaNbNaSbO6,2.154979683
+GaNbPbTiO6,1.511721496
+GaNbSnTiO6,1.460795557
+GaNbSrGeO6,2.167031343
+GaNbSrSiO6,1.440511905
+GaNbSrSnO6,3.271136372
+GaNbSrTiO6,1.487434643
+GaNbYAlO6,1.671893478
+GaTaAgNbO6,1.784907466
+GaTaBaSnO6,3.486954934
+GaTaBaTiO6,1.851214389
+GaTaCaGeO6,2.921206721
+GaTaCaSiO6,2.257882411
+GaTaCaSnO6,2.563279251
+GaTaCaTiO6,1.842666325
+GaTaGaNbO6,1.453259658
+GaTaKNbO6,1.723389689
+GaTaKSbO6,2.325015967
+GaTaLaAlO6,2.910652372
+GaTaLaGaO6,3.453258672
+GaTaLaInO6,3.425265999
+GaTaLaScO6,3.262926712
+GaTaLiNbO6,1.730675149
+GaTaMgTiO6,2.177120432
+GaTaMgZrO6,3.255670251
+GaTaNaNbO6,1.73072672
+GaTaNaSbO6,2.542490811
+GaTaPbTiO6,1.883185973
+GaTaPbZrO6,3.467447345
+GaTaRbNbO6,1.714869864
+GaTaSnTiO6,1.835986128
+GaTaSrGeO6,2.733559859
+GaTaSrSiO6,2.327024022
+GaTaSrSnO6,3.714192995
+GaTaSrTiO6,1.855608911
+GaTaTlNbO6,1.474651584
+GaTaTlTaO6,1.966914479
+GaTaYAlO6,2.555522585
+GeTiAgNbO6,2.840460427
+GeTiAgTaO6,3.419571663
+GeTiBaHfO6,4.160952852
+GeTiBaSnO6,3.552575952
+GeTiBaTiO6,3.190106777
+GeTiBaZrO6,4.148723815
+GeTiCaGeO6,3.248836082
+GeTiCaHfO6,3.885293853
+GeTiCaSiO6,3.563046045
+GeTiCaSnO6,3.331224808
+GeTiCaTiO6,3.007996942
+GeTiCaZrO6,3.893225008
+GeTiCsNbO6,3.02429532
+GeTiCsTaO6,3.254019469
+GeTiCsVO6,1.834517323
+GeTiGaNbO6,1.797455269
+GeTiGaTaO6,2.269047123
+GeTiInNbO6,0.989026589
+GeTiInTaO6,1.143574754
+GeTiKNbO6,2.948122057
+GeTiKSbO6,3.049450929
+GeTiKTaO6,3.408221117
+GeTiLaAlO6,4.01895421
+GeTiLaGaO6,3.822508306
+GeTiLaInO6,3.725860364
+GeTiLaScO6,4.188933802
+GeTiLiNbO6,2.90126163
+GeTiLiTaO6,3.43696678
+GeTiLiVO6,1.430327721
+GeTiMgTiO6,3.188325122
+GeTiMgZrO6,3.893705018
+GeTiNaNbO6,2.767900919
+GeTiNaSbO6,3.04215647
+GeTiNaTaO6,3.398923557
+GeTiNaVO6,1.463812125
+GeTiPbHfO6,4.156892394
+GeTiPbTiO6,3.584303518
+GeTiPbZrO6,4.235235964
+GeTiRbNbO6,2.910860625
+GeTiRbTaO6,3.33362419
+GeTiSnHfO6,3.861168711
+GeTiSnTiO6,2.741981864
+GeTiSnZrO6,3.576358601
+GeTiSrGeO6,3.339568708
+GeTiSrHfO6,4.184483885
+GeTiSrSiO6,3.520429543
+GeTiSrSnO6,3.597625931
+GeTiSrTiO6,3.093917255
+GeTiSrZrO6,4.125636681
+GeTiTlNbO6,2.289670031
+GeTiTlTaO6,2.508634061
+GeTiYAlO6,3.701089196
+InNbBaSnO6,1.66922478
+InNbCaGeO6,0.796683747
+InNbCaSnO6,1.90683703
+InNbGaNbO6,0.128888784
+InNbLaAlO6,0.82273265
+InNbLaGaO6,1.15967416
+InNbLaInO6,1.745350249
+InNbLiNbO6,0.292528091
+InNbMgTiO6,1.151989547
+InNbMgZrO6,1.268264192
+InNbNaNbO6,0.10662043
+InNbNaSbO6,0.574152511
+InNbSrGeO6,0.781410482
+InNbSrSnO6,1.823241323
+InNbYAlO6,0.63471935
+InTaBaSnO6,1.909782068
+InTaCaGeO6,1.127620733
+InTaCaSnO6,1.237723535
+InTaLaAlO6,1.498605746
+InTaLaInO6,2.261798705
+InTaLaScO6,2.234428288
+InTaNaSbO6,0.818105099
+InTaPbHfO6,2.199561857
+InTaPbZrO6,2.166244692
+InTaSnHfO6,2.150852251
+InTaSnZrO6,2.123350206
+InTaSrSiO6,0.823857766
+InTaSrSnO6,2.094100616
+InTaYAlO6,1.302498436
+KNbAgNbO6,3.062301209
+KNbBaSnO6,4.749720638
+KNbBaTiO6,3.817776997
+KNbCaGeO6,4.509665846
+KNbCaSiO6,4.091124096
+KNbCaSnO6,4.597100149
+KNbCaTiO6,3.518675705
+KNbGaNbO6,1.461851147
+KNbKSbO6,3.900486075
+KNbLaAlO6,4.47746793
+KNbLaGaO6,4.812455616
+KNbLaInO6,4.894367785
+KNbLiNbO6,3.190324442
+KNbMgTiO6,4.020037277
+KNbMgZrO6,4.95899481
+KNbNaNbO6,3.160753757
+KNbNaSbO6,4.204154377
+KNbPbTiO6,3.505501913
+KNbRbNbO6,3.346984265
+KNbSnTiO6,2.80800255
+KNbSrGeO6,4.449250085
+KNbSrSiO6,3.980946504
+KNbSrSnO6,4.96090882
+KNbSrTiO6,3.452977088
+KNbTlNbO6,1.839635631
+KNbYAlO6,4.7281547
+KSbAgNbO6,3.905838936
+KSbBaTiO6,3.721262439
+KSbCaGeO6,1.882994929
+KSbCaSiO6,2.732953318
+KSbCaSnO6,2.713900428
+KSbCaTiO6,4.271677539
+KSbGaNbO6,1.968260223
+KSbLaAlO6,4.319046481
+KSbLaGaO6,2.751327197
+KSbLaInO6,3.368820572
+KSbLiNbO6,4.305385483
+KSbLiVO6,1.895420667
+KSbMgTiO6,4.604765276
+KSbMgZrO6,5.774517555
+KSbNaNbO6,4.209344679
+KSbNaVO6,1.877171235
+KSbPbTiO6,3.967764744
+KSbRbNbO6,3.689934172
+KSbSnHfO6,4.021699995
+KSbSnTiO6,3.131082711
+KSbSrSiO6,2.212024856
+KSbSrSnO6,1.629370353
+KSbSrTiO6,4.049643271
+KSbTlNbO6,1.75729976
+KSbYAlO6,4.558409892
+KTaAgNbO6,3.433225646
+KTaAgTaO6,3.966798043
+KTaBaSnO6,5.196457856
+KTaBaTiO6,3.753540391
+KTaCaGeO6,5.429801846
+KTaCaHfO6,5.46520753
+KTaCaSiO6,5.106337532
+KTaCaSnO6,5.221454507
+KTaCaTiO6,4.251020823
+KTaCaZrO6,5.396139557
+KTaCsNbO6,3.294911002
+KTaCsVO6,2.274588477
+KTaGaNbO6,1.72329943
+KTaGaTaO6,2.210934079
+KTaKNbO6,3.448861519
+KTaKSbO6,4.372567795
+KTaLaAlO6,5.379821007
+KTaLaGaO6,5.70532802
+KTaLaInO6,5.816215972
+KTaLaScO6,5.649467495
+KTaLiNbO6,3.572560671
+KTaLiTaO6,4.13821904
+KTaLiVO6,2.301864217
+KTaMgTiO6,5.203062127
+KTaMgZrO6,5.499681919
+KTaNaNbO6,3.540818105
+KTaNaSbO6,4.710700726
+KTaNaTaO6,4.105232239
+KTaNaVO6,1.977986049
+KTaPbHfO6,5.212113424
+KTaPbTiO6,3.929727131
+KTaPbZrO6,5.116273478
+KTaRbNbO6,3.385510444
+KTaRbTaO6,3.939485875
+KTaSnHfO6,4.123323475
+KTaSnTiO6,3.196291471
+KTaSnZrO6,4.092547044
+KTaSrGeO6,5.134653758
+KTaSrHfO6,5.157179336
+KTaSrSiO6,5.004405535
+KTaSrSnO6,5.550200753
+KTaSrTiO6,3.877403015
+KTaSrZrO6,5.061804247
+KTaTlNbO6,1.760505571
+KTaTlTaO6,2.244292146
+KTaYAlO6,5.733834897
+LaAlLaGaO6,6.766541856
+LaAlLaInO6,6.523672765
+LaAlMgTiO6,5.189103214
+LaAlSnTiO6,3.452664382
+LaAlYAlO6,7.493232168
+LaGaLaInO6,5.0911409
+LaGaMgTiO6,5.244393485
+LaGaSnTiO6,4.003966794
+LaGaYAlO6,6.95217569
+LaInMgTiO6,5.177625765
+LaInSnTiO6,3.324618535
+LaInYAlO6,6.125274178
+LaScAgNbO6,4.33272259
+LaScAgTaO6,5.009320756
+LaScBaSnO6,6.787878886
+LaScBaTiO6,5.052614065
+LaScCaGeO6,7.230272945
+LaScCaSiO6,7.136365745
+LaScCaSnO6,6.652121121
+LaScCaTiO6,5.360804586
+LaScCsNbO6,4.414961176
+LaScCsVO6,2.104586049
+LaScGaNbO6,2.439044072
+LaScInNbO6,1.623070352
+LaScKNbO6,4.819276462
+LaScKSbO6,5.827808786
+LaScLaAlO6,6.066795195
+LaScLaGaO6,6.065509156
+LaScLaInO6,6.687201247
+LaScLiNbO6,4.815912181
+LaScLiTaO6,5.566786019
+LaScLiVO6,2.829679604
+LaScMgTiO6,5.328311049
+LaScMgZrO6,7.318121814
+LaScNaNbO6,4.961520789
+LaScNaSbO6,6.025996426
+LaScNaVO6,2.340322481
+LaScPbHfO6,5.582233225
+LaScPbTiO6,5.02202552
+LaScPbZrO6,5.69255743
+LaScRbNbO6,4.729214611
+LaScSnHfO6,5.144975193
+LaScSnTiO6,3.53219192
+LaScSnZrO6,5.033477645
+LaScSrGeO6,7.046287532
+LaScSrHfO6,7.331300549
+LaScSrSiO6,7.056130171
+LaScSrSnO6,6.589774789
+LaScSrTiO6,5.102706272
+LaScSrZrO6,7.093181861
+LaScTlNbO6,2.938221938
+LaScTlTaO6,3.672398617
+LaScYAlO6,7.503217509
+LiNbAgNbO6,3.196015637
+LiNbCaGeO6,4.659391641
+LiNbCaSiO6,4.303741955
+LiNbCaSnO6,4.816024988
+LiNbCaTiO6,3.647495276
+LiNbLaAlO6,4.578444546
+LiNbLaGaO6,4.680252029
+LiNbLaInO6,4.789109121
+LiNbMgTiO6,5.184540584
+LiNbSnTiO6,2.791704414
+LiNbSrGeO6,4.595673331
+LiNbSrSnO6,5.081040725
+LiNbYAlO6,5.004391786
+LiTaAgNbO6,3.554134478
+LiTaAgTaO6,4.076533852
+LiTaBaSnO6,5.588445276
+LiTaBaTiO6,3.879725309
+LiTaCaGeO6,5.709269761
+LiTaCaHfO6,5.736424391
+LiTaCaSiO6,5.329736032
+LiTaCaSnO6,5.380446883
+LiTaCaTiO6,4.095229431
+LiTaCsNbO6,3.395525567
+LiTaCsVO6,2.599914523
+LiTaGaNbO6,1.730549506
+LiTaGaTaO6,2.22363242
+LiTaKNbO6,3.572092108
+LiTaKSbO6,4.815169799
+LiTaLaAlO6,5.475204549
+LiTaLaGaO6,5.800399131
+LiTaLaInO6,5.462839196
+LiTaLiNbO6,3.784446853
+LiTaLiVO6,2.046245105
+LiTaMgTiO6,5.556495063
+LiTaMgZrO6,6.196617848
+LiTaNaNbO6,3.680948662
+LiTaNaSbO6,5.200533194
+LiTaNaTaO6,4.252210484
+LiTaNaVO6,2.545787213
+LiTaPbHfO6,5.216893252
+LiTaPbTiO6,4.072581019
+LiTaPbZrO6,5.087064944
+LiTaRbNbO6,3.510160202
+LiTaSnHfO6,4.033662859
+LiTaSnTiO6,3.193104076
+LiTaSnZrO6,4.001917779
+LiTaSrGeO6,5.630547119
+LiTaSrHfO6,5.270828814
+LiTaSrSiO6,5.238077372
+LiTaSrSnO6,5.96871878
+LiTaSrTiO6,4.014617303
+LiTaTlNbO6,1.757873497
+LiTaTlTaO6,2.248528162
+LiTaYAlO6,6.007036608
+LiVAgNbO6,2.152959222
+LiVCaGeO6,2.638234338
+LiVCaSiO6,1.748630683
+LiVCaSnO6,2.241717159
+LiVCaTiO6,3.037879554
+LiVCsNbO6,2.733391795
+LiVKNbO6,2.205816478
+LiVLaAlO6,2.385917639
+LiVLaGaO6,2.399066466
+LiVLaInO6,2.757312288
+LiVLiNbO6,2.293919511
+LiVMgTiO6,3.316236372
+LiVRbNbO6,2.267615615
+LiVSnTiO6,0.814423789
+LiVSrSnO6,2.206413884
+LiVTlNbO6,0.371308878
+LiVYAlO6,2.263499247
+MgTiSnTiO6,2.321158509
+MgTiYAlO6,5.332891749
+MgZrAgNbO6,4.547511185
+MgZrAgTaO6,4.931917058
+MgZrCaGeO6,6.476064938
+MgZrCaSiO6,7.780486817
+MgZrCaSnO6,6.514943947
+MgZrCaTiO6,5.92861799
+MgZrInTaO6,2.058860702
+MgZrLaAlO6,7.244306501
+MgZrLaGaO6,6.972198503
+MgZrLaInO6,6.202966753
+MgZrLiNbO6,5.014033707
+MgZrLiVO6,3.388074816
+MgZrMgTiO6,5.855148192
+MgZrNaNbO6,5.722109937
+MgZrNaSbO6,5.816665475
+MgZrNaVO6,3.175799158
+MgZrPbHfO6,5.131563185
+MgZrPbTiO6,4.57721179
+MgZrPbZrO6,5.703907938
+MgZrRbNbO6,5.208754396
+MgZrSnHfO6,4.845414529
+MgZrSnTiO6,3.285225476
+MgZrSnZrO6,4.79223757
+MgZrSrGeO6,5.950811102
+MgZrSrSiO6,7.353328806
+MgZrSrSnO6,6.360185946
+MgZrSrTiO6,5.734546456
+MgZrTlNbO6,3.544579097
+MgZrTlTaO6,4.248901231
+MgZrYAlO6,7.555574901
+NaNbAgNbO6,3.139328058
+NaNbCaGeO6,4.62174398
+NaNbCaSiO6,4.24087257
+NaNbCaSnO6,4.925651545
+NaNbCaTiO6,4.451940278
+NaNbLaAlO6,4.557970413
+NaNbLaGaO6,4.913052241
+NaNbLaInO6,5.013442147
+NaNbLiNbO6,3.659244615
+NaNbLiVO6,2.760541559
+NaNbMgTiO6,5.159811711
+NaNbNaSbO6,4.537857987
+NaNbNaVO6,2.744136121
+NaNbSnTiO6,2.796893306
+NaNbSrGeO6,4.563114357
+NaNbSrSiO6,4.111084921
+NaNbSrSnO6,5.055755556
+NaNbSrTiO6,3.546993655
+NaNbYAlO6,4.904866831
+NaSbAgNbO6,4.154201606
+NaSbCaGeO6,2.826551875
+NaSbCaSiO6,3.831576869
+NaSbCaSnO6,3.14998536
+NaSbCaTiO6,4.569549916
+NaSbLaAlO6,4.720018949
+NaSbLaGaO6,3.114709108
+NaSbLaInO6,3.909197233
+NaSbLiNbO6,4.652893468
+NaSbLiVO6,2.521096508
+NaSbMgTiO6,4.316566414
+NaSbNaVO6,1.933565235
+NaSbSnTiO6,3.277038807
+NaSbSrGeO6,2.10329495
+NaSbSrSiO6,2.87021297
+NaSbSrSnO6,2.010337533
+NaSbSrTiO6,4.337563243
+NaSbYAlO6,5.345071995
+NaTaAgNbO6,3.523243739
+NaTaAgTaO6,4.048614558
+NaTaBaSnO6,5.488531427
+NaTaBaTiO6,3.851203471
+NaTaCaGeO6,5.672504696
+NaTaCaSiO6,5.285961533
+NaTaCaSnO6,5.618239319
+NaTaCaTiO6,4.063019945
+NaTaCsNbO6,3.37538625
+NaTaCsVO6,2.363009793
+NaTaGaNbO6,1.730621385
+NaTaGaTaO6,2.222919423
+NaTaKNbO6,3.540237672
+NaTaKSbO6,4.704438422
+NaTaLaAlO6,5.463483714
+NaTaLaGaO6,5.783047389
+NaTaLaInO6,5.796447733
+NaTaLaScO6,5.81349461
+NaTaLiNbO6,3.680629719
+NaTaLiVO6,2.329410389
+NaTaMgTiO6,5.507143417
+NaTaMgZrO6,6.569568849
+NaTaNaNbO6,3.647117014
+NaTaNaSbO6,5.074337872
+NaTaNaVO6,2.169068677
+NaTaPbHfO6,5.305299178
+NaTaPbTiO6,4.039463554
+NaTaPbZrO6,5.216403865
+NaTaRbNbO6,3.480014569
+NaTaSnHfO6,3.914535872
+NaTaSnTiO6,3.195873205
+NaTaSnZrO6,3.898925658
+NaTaSrGeO6,5.506571885
+NaTaSrHfO6,5.245269065
+NaTaSrSiO6,5.199998746
+NaTaSrSnO6,5.861567096
+NaTaSrTiO6,3.984039403
+NaTaSrZrO6,5.150326621
+NaTaTlNbO6,1.759992136
+NaTaTlTaO6,2.248121897
+NaTaYAlO6,5.979767534
+NaVAgNbO6,2.024041846
+NaVCaGeO6,2.040410527
+NaVCaSiO6,1.556374115
+NaVCaSnO6,2.198835873
+NaVCaTiO6,2.748175665
+NaVKNbO6,2.30764797
+NaVLaAlO6,2.104043702
+NaVLaGaO6,2.327056312
+NaVLaInO6,2.544322997
+NaVLiNbO6,2.81010926
+NaVLiVO6,1.782964202
+NaVMgTiO6,2.975484912
+NaVRbNbO6,2.345476269
+NaVSnTiO6,0.833213251
+NaVSrGeO6,1.851035372
+NaVSrSiO6,1.548547901
+NaVSrSnO6,2.194622653
+NaVSrTiO6,2.053965934
+NaVTlNbO6,0.48533037
+NaVYAlO6,2.225434488
+PbHfAgNbO6,4.224152118
+PbHfBaSnO6,5.867489513
+PbHfBaTiO6,4.715173396
+PbHfCaGeO6,5.438871864
+PbHfCaSiO6,6.23205056
+PbHfCaSnO6,6.036393612
+PbHfCaTiO6,4.381883728
+PbHfCsVO6,1.830093634
+PbHfGaNbO6,2.729158284
+PbHfGaTaO6,3.513598295
+PbHfInNbO6,1.491118527
+PbHfKNbO6,4.347420461
+PbHfKSbO6,5.483723223
+PbHfLaAlO6,6.240145632
+PbHfLaGaO6,6.330118621
+PbHfLaInO6,5.39337693
+PbHfLiNbO6,4.317254424
+PbHfLiVO6,1.971901666
+PbHfMgTiO6,4.089321614
+PbHfNaNbO6,4.135896987
+PbHfNaSbO6,5.76696615
+PbHfNaVO6,1.9634335
+PbHfPbTiO6,4.510073988
+PbHfPbZrO6,5.083910042
+PbHfRbNbO6,4.294597438
+PbHfSnHfO6,4.399268884
+PbHfSnTiO6,3.97386115
+PbHfSnZrO6,4.38249106
+PbHfSrGeO6,6.239783015
+PbHfSrSiO6,6.223094959
+PbHfSrSnO6,5.969245121
+PbHfSrTiO6,4.511809568
+PbHfTlNbO6,2.759636618
+PbHfTlTaO6,3.520176139
+PbHfYAlO6,5.658814835
+PbTiAgNbO6,3.374084532
+PbTiBaSnO6,4.748196307
+PbTiBaTiO6,3.64716967
+PbTiCaGeO6,4.326039143
+PbTiCaSiO6,3.616892582
+PbTiCaSnO6,3.866511669
+PbTiCaTiO6,3.759636442
+PbTiLaAlO6,4.438175554
+PbTiLaGaO6,4.949207085
+PbTiLaInO6,4.37995343
+PbTiLiNbO6,3.632440439
+PbTiLiVO6,1.564150221
+PbTiMgTiO6,3.54079145
+PbTiNaNbO6,3.603454802
+PbTiNaSbO6,4.20100595
+PbTiNaVO6,2.078686619
+PbTiSnTiO6,2.740887039
+PbTiSrGeO6,4.214439804
+PbTiSrSiO6,3.639510723
+PbTiSrSnO6,4.982430469
+PbTiSrTiO6,3.754054864
+PbTiTlNbO6,2.253986807
+PbTiYAlO6,3.887638405
+PbZrAgNbO6,4.166115284
+PbZrBaSnO6,5.796148247
+PbZrBaTiO6,4.688502615
+PbZrCaGeO6,6.26137224
+PbZrCaSiO6,6.062284869
+PbZrCaSnO6,5.978942608
+PbZrCaTiO6,4.347411697
+PbZrCsVO6,2.327454613
+PbZrGaNbO6,2.728501752
+PbZrInNbO6,1.502295363
+PbZrKNbO6,4.301584994
+PbZrKSbO6,5.411015669
+PbZrLaAlO6,6.123085031
+PbZrLaGaO6,5.792527133
+PbZrLaInO6,5.413060914
+PbZrLiNbO6,4.322954385
+PbZrLiVO6,1.984307728
+PbZrMgTiO6,4.199383995
+PbZrNaNbO6,4.26853485
+PbZrNaSbO6,5.661587712
+PbZrNaVO6,1.975980895
+PbZrPbTiO6,4.486692552
+PbZrRbNbO6,4.42595383
+PbZrSnHfO6,4.382511212
+PbZrSnTiO6,3.967840494
+PbZrSnZrO6,4.372622984
+PbZrSrGeO6,6.143619812
+PbZrSrSiO6,6.047798161
+PbZrSrSnO6,5.909817046
+PbZrSrTiO6,4.782362473
+PbZrTlNbO6,2.769123763
+PbZrYAlO6,5.580683524
+RbNbAgNbO6,3.000554212
+RbNbBaSnO6,4.582478857
+RbNbBaTiO6,3.825994961
+RbNbCaGeO6,4.444933002
+RbNbCaSiO6,3.961833599
+RbNbCaSnO6,4.978006733
+RbNbCaTiO6,3.464606286
+RbNbGaNbO6,1.501461081
+RbNbLaAlO6,4.45268281
+RbNbLaGaO6,4.739790941
+RbNbLaInO6,4.788646563
+RbNbLiNbO6,3.132605798
+RbNbMgTiO6,3.912256022
+RbNbNaNbO6,3.104351528
+RbNbNaSbO6,4.001396256
+RbNbPbTiO6,3.927842162
+RbNbSnTiO6,2.827129685
+RbNbSnZrO6,3.402918374
+RbNbSrGeO6,4.380221184
+RbNbSrSiO6,3.912411102
+RbNbSrSnO6,4.866665774
+RbNbSrTiO6,3.404490411
+RbNbTlNbO6,1.926609234
+RbNbTlTaO6,1.755772218
+RbNbYAlO6,4.581560313
+RbTaAgNbO6,3.372259
+RbTaAgTaO6,3.912786912
+RbTaBaSnO6,5.005447926
+RbTaBaTiO6,3.725461181
+RbTaCaGeO6,5.172654926
+RbTaCaHfO6,5.344751259
+RbTaCaSiO6,5.009983702
+RbTaCaSnO6,5.542419882
+RbTaCaTiO6,4.15025041
+RbTaCaZrO6,5.289425231
+RbTaCsNbO6,3.244169484
+RbTaCsVO6,2.256230932
+RbTaGaNbO6,1.714926982
+RbTaGaTaO6,2.197091366
+RbTaKNbO6,3.385357147
+RbTaKSbO6,4.138193241
+RbTaLaAlO6,5.350370897
+RbTaLaGaO6,5.68309794
+RbTaLaInO6,5.659890797
+RbTaLaScO6,5.569235185
+RbTaLiNbO6,3.503887171
+RbTaLiTaO6,4.063775902
+RbTaLiVO6,2.256156773
+RbTaMgTiO6,5.087929236
+RbTaMgZrO6,6.155481471
+RbTaNaNbO6,3.480365291
+RbTaNaSbO6,4.486824192
+RbTaNaTaO6,4.032147769
+RbTaNaVO6,1.992431484
+RbTaPbHfO6,5.152195244
+RbTaPbTiO6,3.863966354
+RbTaPbZrO6,5.061727768
+RbTaRbNbO6,3.324907538
+RbTaSnHfO6,4.788507051
+RbTaSnTiO6,3.187687673
+RbTaSnZrO6,4.738259487
+RbTaSrGeO6,4.886605861
+RbTaSrHfO6,5.101717351
+RbTaSrSiO6,4.925639137
+RbTaSrSnO6,5.339337693
+RbTaSrTiO6,3.820417026
+RbTaSrZrO6,5.004836343
+RbTaTlNbO6,1.755690239
+RbTaTlTaO6,2.236308333
+RbTaYAlO6,5.611690741
+SnHfAgNbO6,3.209983605
+SnHfBaSnO6,5.174115888
+SnHfBaTiO6,4.117569876
+SnHfCaGeO6,4.190195999
+SnHfCaSiO6,4.879451562
+SnHfCaSnO6,3.946579171
+SnHfCaTiO6,3.352056245
+SnHfCsVO6,1.553908766
+SnHfGaNbO6,2.680932059
+SnHfGaTaO6,3.434604475
+SnHfInNbO6,1.463743255
+SnHfKNbO6,4.033855052
+SnHfLaAlO6,4.926783336
+SnHfLaGaO6,4.783226641
+SnHfLaInO6,4.45984096
+SnHfLiNbO6,3.257029919
+SnHfLiVO6,0.650198371
+SnHfMgTiO6,3.126042499
+SnHfNaNbO6,3.140093285
+SnHfNaSbO6,4.99990274
+SnHfNaVO6,1.483239949
+SnHfPbTiO6,3.974059783
+SnHfRbNbO6,4.012968027
+SnHfSnTiO6,3.527115883
+SnHfSnZrO6,3.970705007
+SnHfSrGeO6,5.080946049
+SnHfSrSiO6,4.896460123
+SnHfSrSnO6,5.171032937
+SnHfSrTiO6,4.144891869
+SnHfTlNbO6,2.709728065
+SnHfYAlO6,4.336146837
+SnTiYAlO6,2.700036899
+SnZrAgNbO6,3.229537258
+SnZrBaSnO6,5.135553587
+SnZrBaTiO6,4.111540315
+SnZrCaGeO6,4.991572731
+SnZrCaSiO6,4.77896532
+SnZrCaSnO6,5.126303777
+SnZrCaTiO6,3.430578699
+SnZrCaZrO6,4.884594323
+SnZrCsVO6,1.579963591
+SnZrGaNbO6,2.679548904
+SnZrGaTaO6,3.407617962
+SnZrInNbO6,1.473774385
+SnZrKNbO6,4.021001601
+SnZrKSbO6,4.839100803
+SnZrLaAlO6,4.858929864
+SnZrLaGaO6,4.692095969
+SnZrLaInO6,4.423128282
+SnZrLiNbO6,3.330009183
+SnZrLiVO6,1.496601007
+SnZrMgTiO6,3.24826497
+SnZrNaNbO6,3.218716099
+SnZrNaSbO6,4.940578625
+SnZrNaVO6,1.507160671
+SnZrPbTiO6,3.968205092
+SnZrSnTiO6,3.745150863
+SnZrSrGeO6,5.012190275
+SnZrSrSiO6,4.792990418
+SnZrSrSnO6,5.135155814
+SnZrSrTiO6,4.137110462
+SnZrTlNbO6,3.199119137
+SnZrTlTaO6,3.711956415
+SnZrYAlO6,4.252384233
+SrGeAgNbO6,4.17527143
+SrGeCaGeO6,2.594730579
+SrGeCaSiO6,3.610404089
+SrGeCaSnO6,3.176619834
+SrGeCaTiO6,4.854383494
+SrGeLaAlO6,5.326796507
+SrGeLaGaO6,3.461904133
+SrGeLaInO6,3.979319695
+SrGeLiVO6,2.036765745
+SrGeMgTiO6,5.057554717
+SrGeSnTiO6,3.278589306
+SrGeYAlO6,5.805413062
+SrHfAgNbO6,4.176895192
+SrHfAgTaO6,4.200189633
+SrHfBaSnO6,6.263415327
+SrHfBaTiO6,4.710168434
+SrHfCaGeO6,6.746283956
+SrHfCaSiO6,7.294961255
+SrHfCaSnO6,6.436087606
+SrHfCaTiO6,5.06131937
+SrHfCsNbO6,4.252232394
+SrHfCsVO6,1.925412534
+SrHfGaNbO6,2.752638628
+SrHfGaTaO6,3.492686975
+SrHfInNbO6,1.472787671
+SrHfInTaO6,2.142406138
+SrHfKNbO6,4.334239422
+SrHfKSbO6,5.652959022
+SrHfLaAlO6,7.008201642
+SrHfLaGaO6,7.241445283
+SrHfLaInO6,6.550766008
+SrHfLiNbO6,4.705854233
+SrHfLiVO6,1.971766171
+SrHfMgTiO6,5.499077752
+SrHfMgZrO6,7.474759963
+SrHfNaNbO6,4.417036691
+SrHfNaSbO6,5.945060913
+SrHfNaVO6,1.95911547
+SrHfPbHfO6,5.913216316
+SrHfPbTiO6,4.806805346
+SrHfPbZrO6,5.85190613
+SrHfRbNbO6,4.283633554
+SrHfSnHfO6,5.167009671
+SrHfSnTiO6,3.490516735
+SrHfSnZrO6,5.142678923
+SrHfSrGeO6,6.492423051
+SrHfSrSiO6,7.274729675
+SrHfSrSnO6,6.398151683
+SrHfSrTiO6,4.808535196
+SrHfSrZrO6,6.587499549
+SrHfTlNbO6,2.789967739
+SrHfTlTaO6,3.537462784
+SrHfYAlO6,7.85475225
+SrSiAgNbO6,3.735156221
+SrSiCaGeO6,3.591819082
+SrSiCaSiO6,5.791606342
+SrSiCaSnO6,3.879590944
+SrSiCaTiO6,4.490676552
+SrSiLaAlO6,7.781253229
+SrSiLaGaO6,5.025059286
+SrSiLaInO6,5.1817765
+SrSiLiNbO6,4.200926152
+SrSiLiVO6,1.55928847
+SrSiMgTiO6,5.003049204
+SrSiSnTiO6,2.61479547
+SrSiSrGeO6,3.06110138
+SrSiSrSnO6,3.529644563
+SrSiSrTiO6,4.387038008
+SrSiYAlO6,8.103995713
+SrSnAgNbO6,4.236154672
+SrSnCaGeO6,2.579727765
+SrSnCaSiO6,3.848751305
+SrSnCaSnO6,3.697927802
+SrSnCaTiO6,4.770072455
+SrSnLaAlO6,5.552495553
+SrSnLaGaO6,4.088655265
+SrSnLaInO6,4.176892582
+SrSnMgTiO6,5.151680803
+SrSnSnTiO6,4.288963447
+SrSnSrGeO6,2.299718075
+SrSnSrTiO6,5.121862654
+SrSnYAlO6,5.559431157
+SrTiAgNbO6,3.339764295
+SrTiCaGeO6,4.897520596
+SrTiCaSiO6,4.487936065
+SrTiCaSnO6,4.770601938
+SrTiCaTiO6,3.931832825
+SrTiLaAlO6,4.975239684
+SrTiLaGaO6,5.29666036
+SrTiLaInO6,5.292661823
+SrTiLiNbO6,3.574708867
+SrTiLiVO6,2.701019829
+SrTiMgTiO6,4.740281538
+SrTiSnTiO6,2.822797487
+SrTiSrGeO6,4.676873549
+SrTiYAlO6,5.292063377
+SrZrAgNbO6,4.138226816
+SrZrAgTaO6,4.170672569
+SrZrBaSnO6,6.427321329
+SrZrBaTiO6,4.674153802
+SrZrCaGeO6,6.200940699
+SrZrCaSiO6,6.823548556
+SrZrCaSnO6,6.727992178
+SrZrCaTiO6,5.064483253
+SrZrCsNbO6,4.204970633
+SrZrCsVO6,2.301070665
+SrZrGaNbO6,2.75034975
+SrZrGaTaO6,3.445174563
+SrZrInNbO6,1.480554007
+SrZrInTaO6,2.104380205
+SrZrKNbO6,4.283561279
+SrZrKSbO6,5.578868143
+SrZrLaAlO6,6.741766285
+SrZrLaGaO6,6.999519732
+SrZrLaInO6,6.771740807
+SrZrLiNbO6,4.959242475
+SrZrLiTaO6,5.176051827
+SrZrLiVO6,1.987131612
+SrZrMgTiO6,5.717352915
+SrZrMgZrO6,6.943180739
+SrZrNaNbO6,4.375144271
+SrZrNaSbO6,5.864816808
+SrZrNaVO6,1.97424218
+SrZrPbHfO6,5.851968532
+SrZrPbTiO6,4.786374901
+SrZrPbZrO6,5.795287748
+SrZrRbNbO6,4.240433077
+SrZrSnHfO6,5.142562912
+SrZrSnTiO6,4.132405402
+SrZrSnZrO6,5.126089659
+SrZrSrGeO6,6.415338434
+SrZrSrSiO6,6.767726491
+SrZrSrSnO6,6.667386491
+SrZrSrTiO6,4.765770048
+SrZrTlNbO6,2.796095934
+SrZrTlTaO6,3.494338204
+SrZrYAlO6,7.46492109
+TlNbAgNbO6,1.863303536
+TlNbBaSnO6,2.988799268
+TlNbBaTiO6,2.22130272
+TlNbCaGeO6,2.121469287
+TlNbCaSiO6,1.359093402
+TlNbCaSnO6,3.248956849
+TlNbCaTiO6,1.844661254
+TlNbGaNbO6,1.151941955
+TlNbLaAlO6,2.155799154
+TlNbLaGaO6,2.713028066
+TlNbLaInO6,3.075158113
+TlNbLiNbO6,1.438117049
+TlNbMgTiO6,1.737647718
+TlNbNaNbO6,1.442237178
+TlNbNaSbO6,1.927205191
+TlNbSnTiO6,2.310134428
+TlNbSrGeO6,2.080620924
+TlNbSrSiO6,1.42267454
+TlNbSrSnO6,3.155717175
+TlNbSrTiO6,1.525019204
+TlNbTlTaO6,1.496019087
+TlNbYAlO6,2.005687868
+TlTaAgNbO6,1.792626623
+TlTaAgTaO6,2.28245774
+TlTaBaSnO6,3.305403
+TlTaCaGeO6,2.612967569
+TlTaCaSiO6,2.222111758
+TlTaCaSnO6,3.614900816
+TlTaCaTiO6,1.862690557
+TlTaCsNbO6,2.310062164
+TlTaGaNbO6,1.474210517
+TlTaKNbO6,1.760951658
+TlTaKSbO6,2.0733894
+TlTaLaAlO6,2.937475473
+TlTaLaGaO6,3.420622789
+TlTaLaInO6,3.687048868
+TlTaLiNbO6,1.758171378
+TlTaMgTiO6,2.451618012
+TlTaNaNbO6,1.760295096
+TlTaNaSbO6,2.276086568
+TlTaPbTiO6,1.898800066
+TlTaPbZrO6,3.507812622
+TlTaSnHfO6,3.505613063
+TlTaSnTiO6,1.850789899
+TlTaSrGeO6,2.425121676
+TlTaSrSiO6,2.29747616
+TlTaSrSnO6,3.507231154
+TlTaSrTiO6,1.87716885
+TlTaYAlO6,2.819711084
\ No newline at end of file