From c9ac8abd912fc8090ff8a16d10914841f7ae6435 Mon Sep 17 00:00:00 2001 From: lwang94 Date: Fri, 29 Mar 2024 00:34:32 -0400 Subject: [PATCH] added more data and updated notebooks --- .DS_Store | Bin 6148 -> 6148 bytes README.md | 20 +- src/.DS_Store | Bin 6148 -> 6148 bytes src/.ipynb_checkpoints/BOv4-checkpoint.ipynb | 1 + src/01 - eda.ipynb | 624 +++ src/BOv4.ipynb | 3656 +++++++++++++++++- src/data/Crossed barrel_dataset.csv | 1801 +++++++++ src/{ => data}/concrete_mod.csv | 0 src/data/double_perovskites_gap.csv | 1307 +++++++ 9 files changed, 7394 insertions(+), 15 deletions(-) create mode 100644 src/.ipynb_checkpoints/BOv4-checkpoint.ipynb create mode 100644 src/01 - eda.ipynb create mode 100644 src/data/Crossed barrel_dataset.csv rename src/{ => data}/concrete_mod.csv (100%) create mode 100644 src/data/double_perovskites_gap.csv diff --git a/.DS_Store b/.DS_Store index ec5750ebafed76a57a97b6b90abc745d4ce3cb54..104adcb0102afc696f83f5ae8f8b1886d620d831 100644 GIT binary patch delta 33 ocmZoMXffC@jZwtd&_YMS$iTQ(N1@u%$UsNI!qRB-D#j==0Gx;j-2eap delta 33 ocmZoMXffC@jZwtJz*I-U)ZD06N1@u%$UsNI#Mo@}D#j==0Gz=H-2eap 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 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..689bcc4a177294ddf250306719422d05446763e5 100644 GIT binary patch delta 209 zcmZoMXfc=|&e%RNQEZ}~q96+c0|O%ig8)NLx?yl~es00UMD2QzAPYkZLn1>7Ln2H9 zCw&zlfqB6Hr 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"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
nthetarttoughness
0601.50.701.144667
1601.51.051.607561
2601.51.401.144338
3601.70.703.642738
4601.71.053.748405
..................
1795122002.31.051.358975
1796122002.31.403.196306
1797122002.50.7036.104187
1798122002.51.051.313487
1799122002.51.401.069728
\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"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
trthetantoughness
00.71.5061.135453
10.71.5081.970165
20.71.50102.514642
30.71.50122.581751
40.71.55060.665487
..................
5951.42.5150121.493588
5961.42.5200620.968543
5971.42.5200814.529138
5981.42.5200102.154458
5991.42.5200121.337742
\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"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
trthetantoughness
00.71.506-1.135453
10.71.508-1.970165
20.71.5010-2.514642
30.71.5012-2.581751
40.71.5506-0.665487
..................
5951.42.515012-1.493588
5961.42.52006-20.968543
5971.42.52008-14.529138
5981.42.520010-2.154458
5991.42.520012-1.337742
\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"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
indextrthetantoughnesst**-4t**-3t**-2t**-1...n**-0.5n**-0.333n**-0.25n**0.25n**0.33n**0.5n**2n**3n**4n**ln
000.71.506-1.1354534.1649312.9154522.0408161.428571...0.4082480.5506500.6389431.5650851.8063002.44949036.0216.01296.01.791759
130.71.5012-2.5817514.1649312.9154522.0408161.428571...0.2886750.4371520.5372851.8612102.2705433.464102144.01728.020736.02.484907
290.71.51008-1.1768394.1649312.9154522.0408161.428571...0.3535530.5003470.5946041.6817931.9861852.82842764.0512.04096.02.079442
3130.71.51508-15.0972054.1649312.9154522.0408161.428571...0.3535530.5003470.5946041.6817931.9861852.82842764.0512.04096.02.079442
4170.71.52008-19.1573944.1649312.9154522.0408161.428571...0.3535530.5003470.5946041.6817931.9861852.82842764.0512.04096.02.079442
..................................................................
955821.42.5010-1.2699990.2603080.3644310.5102040.714286...0.3162280.4645150.5623411.7782792.1379623.162278100.01000.010000.02.302585
965851.42.5508-1.8928050.2603080.3644310.5102040.714286...0.3535530.5003470.5946041.6817931.9861852.82842764.0512.04096.02.079442
975881.42.51006-21.5956430.2603080.3644310.5102040.714286...0.4082480.5506500.6389431.5650851.8063002.44949036.0216.01296.01.791759
985911.42.510012-1.5509370.2603080.3644310.5102040.714286...0.2886750.4371520.5372851.8612102.2705433.464102144.01728.020736.02.484907
995921.42.51506-18.2177280.2603080.3644310.5102040.714286...0.4082480.5506500.6389431.5650851.8063002.44949036.0216.01296.01.791759
\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"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
Seed 1Seed 2Seed 3Seed 4Seed 5MeanStd DevLearning Cycle
0000000.00.0000000
1000000.00.0000001
2000000.00.0000002
3000000.00.0000003
4000000.00.0000004
5000000.00.0000005
6010000.20.4472146
7010000.20.4472147
8010010.40.5477238
9010010.40.5477239
10121121.40.54772310
11121231.80.83666011
12232332.60.54772312
13332443.20.83666013
14343443.60.54772314
15444444.00.00000015
16444444.00.00000016
17444444.00.00000017
18444444.00.00000018
19444444.00.00000019
20444444.00.00000020
21444444.00.00000021
22444444.00.00000022
23444444.00.00000023
24444444.00.00000024
25444444.00.00000025
26444444.00.00000026
27444444.00.00000027
28444444.00.00000028
29444444.00.00000029
30444444.00.00000030
31444444.00.00000031
32444444.00.00000032
33444444.00.00000033
34444444.00.00000034
35444444.00.00000035
36444444.00.00000036
37444444.00.00000037
38444444.00.00000038
39444444.00.00000039
40444444.00.00000040
41444444.00.00000041
42444444.00.00000042
43444444.00.00000043
44444444.00.00000044
45444444.00.00000045
46444444.00.00000046
47444444.00.00000047
48444444.00.00000048
49444444.00.00000049
50444444.00.00000050
51444444.00.00000051
52444454.20.44721452
53444454.20.44721453
54444454.20.44721454
55444454.20.44721455
56454454.40.54772356
57454454.40.54772357
58555454.80.44721458
59555555.00.00000059
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Unnamed: 0Seed 1Seed 2Seed 3Seed 4Seed 5MeanStd DevLearning Cycle
00000000.00.0000000
11000000.00.0000001
22000100.20.4472142
33000100.20.4472143
44000110.40.5477234
..............................
291291131313131313.00.000000291
292292131313131313.00.000000292
293293131313131313.00.000000293
294294141414141414.00.000000294
295295151515151515.00.000000295
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
index01234MeanStd Dev
0Unnamed: 0012342.01.581139
10100000.20.447214
21100000.20.447214
32100000.20.447214
43101000.40.547723
...........................
296295151515151515.00.000000
297296151515151515.00.000000
298297151515151515.00.000000
299298151515151515.00.000000
300299151515151515.00.000000
\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"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
nthetarttoughness
0601.50.701.144667
1601.51.051.607561
2601.51.401.144338
3601.70.703.642738
4601.71.053.748405
..................
1795122002.31.051.358975
1796122002.31.403.196306
1797122002.50.7036.104187
1798122002.51.051.313487
1799122002.51.401.069728
\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"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
trthetantoughness
00.71.5061.135453
10.71.5081.970165
20.71.50102.514642
30.71.50122.581751
40.71.55060.665487
..................
5951.42.5150121.493588
5961.42.5200620.968543
5971.42.5200814.529138
5981.42.5200102.154458
5991.42.5200121.337742
\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"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
trthetantoughness
00.71.506-1.135453
10.71.508-1.970165
20.71.5010-2.514642
30.71.5012-2.581751
40.71.5506-0.665487
..................
5951.42.515012-1.493588
5961.42.52006-20.968543
5971.42.52008-14.529138
5981.42.520010-2.154458
5991.42.520012-1.337742
\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"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
indextrthetantoughnesst**-4t**-3t**-2t**-1...n**-0.5n**-0.333n**-0.25n**0.25n**0.33n**0.5n**2n**3n**4n**ln
000.71.506-1.1354534.1649312.9154522.0408161.428571...0.4082480.5506500.6389431.5650851.8063002.44949036.0216.01296.01.791759
130.71.5012-2.5817514.1649312.9154522.0408161.428571...0.2886750.4371520.5372851.8612102.2705433.464102144.01728.020736.02.484907
290.71.51008-1.1768394.1649312.9154522.0408161.428571...0.3535530.5003470.5946041.6817931.9861852.82842764.0512.04096.02.079442
3130.71.51508-15.0972054.1649312.9154522.0408161.428571...0.3535530.5003470.5946041.6817931.9861852.82842764.0512.04096.02.079442
4170.71.52008-19.1573944.1649312.9154522.0408161.428571...0.3535530.5003470.5946041.6817931.9861852.82842764.0512.04096.02.079442
..................................................................
955821.42.5010-1.2699990.2603080.3644310.5102040.714286...0.3162280.4645150.5623411.7782792.1379623.162278100.01000.010000.02.302585
965851.42.5508-1.8928050.2603080.3644310.5102040.714286...0.3535530.5003470.5946041.6817931.9861852.82842764.0512.04096.02.079442
975881.42.51006-21.5956430.2603080.3644310.5102040.714286...0.4082480.5506500.6389431.5650851.8063002.44949036.0216.01296.01.791759
985911.42.510012-1.5509370.2603080.3644310.5102040.714286...0.2886750.4371520.5372851.8612102.2705433.464102144.01728.020736.02.484907
995921.42.51506-18.2177280.2603080.3644310.5102040.714286...0.4082480.5506500.6389431.5650851.8063002.44949036.0216.01296.01.791759
\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"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
Seed 1Seed 2Seed 3Seed 4Seed 5MeanStd DevLearning Cycle
0000000.00.0000000
1000000.00.0000001
2000000.00.0000002
3000000.00.0000003
4000000.00.0000004
5000000.00.0000005
6010000.20.4472146
7010000.20.4472147
8010010.40.5477238
9010010.40.5477239
10121121.40.54772310
11121231.80.83666011
12232332.60.54772312
13332443.20.83666013
14343443.60.54772314
15444444.00.00000015
16444444.00.00000016
17444444.00.00000017
18444444.00.00000018
19444444.00.00000019
20444444.00.00000020
21444444.00.00000021
22444444.00.00000022
23444444.00.00000023
24444444.00.00000024
25444444.00.00000025
26444444.00.00000026
27444444.00.00000027
28444444.00.00000028
29444444.00.00000029
30444444.00.00000030
31444444.00.00000031
32444444.00.00000032
33444444.00.00000033
34444444.00.00000034
35444444.00.00000035
36444444.00.00000036
37444444.00.00000037
38444444.00.00000038
39444444.00.00000039
40444444.00.00000040
41444444.00.00000041
42444444.00.00000042
43444444.00.00000043
44444444.00.00000044
45444444.00.00000045
46444444.00.00000046
47444444.00.00000047
48444444.00.00000048
49444444.00.00000049
50444444.00.00000050
51444444.00.00000051
52444454.20.44721452
53444454.20.44721453
54444454.20.44721454
55444454.20.44721455
56454454.40.54772356
57454454.40.54772357
58555454.80.44721458
59555555.00.00000059
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nthetarttoughness
0601.50.701.144667
1601.51.051.607561
2601.51.401.144338
3601.70.703.642738
4601.71.053.748405
..................
1795122002.31.051.358975
1796122002.31.403.196306
1797122002.50.7036.104187
1798122002.51.051.313487
1799122002.51.401.069728
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
trthetantoughness
00.71.5061.135453
10.71.5081.970165
20.71.50102.514642
30.71.50122.581751
40.71.55060.665487
..................
5951.42.5150121.493588
5961.42.5200620.968543
5971.42.5200814.529138
5981.42.5200102.154458
5991.42.5200121.337742
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
trthetantoughness
00.71.506-1.135453
10.71.508-1.970165
20.71.5010-2.514642
30.71.5012-2.581751
40.71.5506-0.665487
..................
5951.42.515012-1.493588
5961.42.52006-20.968543
5971.42.52008-14.529138
5981.42.520010-2.154458
5991.42.520012-1.337742
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
indextrthetantoughnesst**-4t**-3t**-2t**-1...n**-0.5n**-0.333n**-0.25n**0.25n**0.33n**0.5n**2n**3n**4n**ln
000.71.506-1.1354534.1649312.9154522.0408161.428571...0.4082480.5506500.6389431.5650851.8063002.44949036.0216.01296.01.791759
130.71.5012-2.5817514.1649312.9154522.0408161.428571...0.2886750.4371520.5372851.8612102.2705433.464102144.01728.020736.02.484907
290.71.51008-1.1768394.1649312.9154522.0408161.428571...0.3535530.5003470.5946041.6817931.9861852.82842764.0512.04096.02.079442
3130.71.51508-15.0972054.1649312.9154522.0408161.428571...0.3535530.5003470.5946041.6817931.9861852.82842764.0512.04096.02.079442
4170.71.52008-19.1573944.1649312.9154522.0408161.428571...0.3535530.5003470.5946041.6817931.9861852.82842764.0512.04096.02.079442
..................................................................
955821.42.5010-1.2699990.2603080.3644310.5102040.714286...0.3162280.4645150.5623411.7782792.1379623.162278100.01000.010000.02.302585
965851.42.5508-1.8928050.2603080.3644310.5102040.714286...0.3535530.5003470.5946041.6817931.9861852.82842764.0512.04096.02.079442
975881.42.51006-21.5956430.2603080.3644310.5102040.714286...0.4082480.5506500.6389431.5650851.8063002.44949036.0216.01296.01.791759
985911.42.510012-1.5509370.2603080.3644310.5102040.714286...0.2886750.4371520.5372851.8612102.2705433.464102144.01728.020736.02.484907
995921.42.51506-18.2177280.2603080.3644310.5102040.714286...0.4082480.5506500.6389431.5650851.8063002.44949036.0216.01296.01.791759
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Seed 1Seed 2Seed 3Seed 4Seed 5MeanStd DevLearning Cycle
0000000.00.0000000
1000000.00.0000001
2000000.00.0000002
3000000.00.0000003
4000000.00.0000004
5000000.00.0000005
6010000.20.4472146
7010000.20.4472147
8010010.40.5477238
9010010.40.5477239
10121121.40.54772310
11121231.80.83666011
12232332.60.54772312
13332443.20.83666013
14343443.60.54772314
15444444.00.00000015
16444444.00.00000016
17444444.00.00000017
18444444.00.00000018
19444444.00.00000019
20444444.00.00000020
21444444.00.00000021
22444444.00.00000022
23444444.00.00000023
24444444.00.00000024
25444444.00.00000025
26444444.00.00000026
27444444.00.00000027
28444444.00.00000028
29444444.00.00000029
30444444.00.00000030
31444444.00.00000031
32444444.00.00000032
33444444.00.00000033
34444444.00.00000034
35444444.00.00000035
36444444.00.00000036
37444444.00.00000037
38444444.00.00000038
39444444.00.00000039
40444444.00.00000040
41444444.00.00000041
42444444.00.00000042
43444444.00.00000043
44444444.00.00000044
45444444.00.00000045
46444444.00.00000046
47444444.00.00000047
48444444.00.00000048
49444444.00.00000049
50444444.00.00000050
51444444.00.00000051
52444454.20.44721452
53444454.20.44721453
54444454.20.44721454
55444454.20.44721455
56454454.40.54772356
57454454.40.54772357
58555454.80.44721458
59555555.00.00000059
\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