diff --git a/demo/Constrained multi objective.ipynb b/demo/Constrained multi-output min-max.ipynb
similarity index 57%
rename from demo/Constrained multi objective.ipynb
rename to demo/Constrained multi-output min-max.ipynb
index c83070b..7347362 100644
--- a/demo/Constrained multi objective.ipynb
+++ b/demo/Constrained multi-output min-max.ipynb
@@ -7,34 +7,47 @@
"outputs": [],
"source": [
"import obsidian\n",
- "obsidian.__version__"
+ "print(f'obsidian version: ' + obsidian.__version__)\n",
+ "\n",
+ "import pandas as pd\n",
+ "import plotly.express as px\n",
+ "import plotly.io as pio\n",
+ "pio.renderers.default = \"plotly_mimetype+notebook\""
]
},
{
- "cell_type": "code",
- "execution_count": null,
+ "cell_type": "markdown",
"metadata": {},
- "outputs": [],
"source": [
- "import pandas as pd\n",
- "import plotly.express as px"
+ "## Introduction"
]
},
{
- "cell_type": "code",
- "execution_count": null,
+ "cell_type": "markdown",
"metadata": {},
- "outputs": [],
"source": [
- "from obsidian.parameters import ParamSpace, Param_Continuous\n",
- "from obsidian.experiment import ExpDesigner"
+ "In this tutorial, we will see how to use _obsidian_ for multi-output optimization. To demonstrate the versatility of the approach, we will seek to maximize one response while minimizing the other.\n",
+ "\n",
+ "$$\\underset{X}{argmax} HV\\left(+f\\left(y_1\\right) -f\\left(y_2\\right)\\right)$$\n",
+ "\n",
+ "Furthermore, we will apply a linear constraint on the input variables; requiring that the $X_1 + X_2 \\leq 6 $."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "### Set up parameter space and initialize a design"
+ "## Set up parameter space and initialize a design"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from obsidian import Campaign, Target, ParamSpace, BayesianOptimizer\n",
+ "from obsidian.parameters import Param_Continuous"
]
},
{
@@ -49,8 +62,12 @@
" ]\n",
"\n",
"X_space = ParamSpace(params)\n",
- "designer = ExpDesigner(X_space, seed=0)\n",
- "X0 = designer.initialize(4, 'LHS')\n",
+ "target = [\n",
+ " Target('Response 1', aim='max'),\n",
+ " Target('Response 2', aim='min')\n",
+ "]\n",
+ "campaign = Campaign(X_space, target, seed=0)\n",
+ "X0 = campaign.designer.initialize(4, 'LHS')\n",
"\n",
"X0"
]
@@ -59,7 +76,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "### Collect results (e.g. from a simulation)"
+ "## Collect results (e.g. from a simulation)"
]
},
{
@@ -75,23 +92,15 @@
"y0 = simulator.simulate(X0)\n",
"Z0 = pd.concat([X0, y0], axis=1)\n",
"\n",
- "Z0"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "Z0.plot(x='Response 1', y='Response 2', kind='scatter', figsize=(4,3))"
+ "campaign.add_data(Z0)\n",
+ "campaign.data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "### Create a campaign to track optimization"
+ "### Fit an optimizer and visualize results"
]
},
{
@@ -100,7 +109,7 @@
"metadata": {},
"outputs": [],
"source": [
- "from obsidian.campaign import Campaign"
+ "campaign.fit()"
]
},
{
@@ -109,25 +118,23 @@
"metadata": {},
"outputs": [],
"source": [
- "my_campaign = Campaign(X_space)\n",
- "my_campaign.add_data(Z0)\n",
- "my_campaign.data"
+ "from obsidian.plotting import surface_plot, optim_progress"
]
},
{
- "cell_type": "markdown",
+ "cell_type": "code",
+ "execution_count": null,
"metadata": {},
+ "outputs": [],
"source": [
- "### Fit an optimizer"
+ "surface_plot(campaign.optimizer)"
]
},
{
- "cell_type": "code",
- "execution_count": null,
+ "cell_type": "markdown",
"metadata": {},
- "outputs": [],
"source": [
- "from obsidian.parameters import Target"
+ "## Optimize new experiment suggestions"
]
},
{
@@ -136,29 +143,16 @@
"metadata": {},
"outputs": [],
"source": [
- "target = [\n",
- " Target('Response 1', aim='max'),\n",
- " Target('Response 2', aim='min')\n",
- "]\n",
- "\n",
- "my_campaign.set_target(target)\n",
- "my_campaign.fit()\n"
+ "from obsidian.constraints import InConstraint_Generic"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "### Make new experiment suggestions"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "from obsidian.constraints import InConstraint_Generic"
+ "_Note:_ It is a good idea to balance a set of acquisition functions with those that prefer design-space exploration. This helps to ensure that the optimizer is not severely misled by deficiencies in the dataset, particularly for small data. It also helps to ascertain a global optimum.\n",
+ "\n",
+ "A simple choice is __Space Filling (SF)__ although __Negative Integrated Posterior Variance (NIPV)__ is available for single-output optimizations; and there are various other acquisiiton functions whose hyperparameters can be tuned to manage the \"explore-exploit\" balance."
]
},
{
@@ -167,13 +161,9 @@
"metadata": {},
"outputs": [],
"source": [
- "# # X1 + X2 >= 2\n",
- "# optim_kwargs = {'m_batch':2, 'acquisition':[{'qNEHVI':{'ref_point':[-350,0]}}], 'ineq_constraints':[InConstraint_Generic(X_space, indices=[0,1], coeff=[1,1], rhs=2)]}\n",
- "\n",
- "# X1 + X2 <= 6 aka -X1 - X2 >= -6\n",
- "optim_kwargs = {'m_batch':2, 'acquisition':[{'qNEHVI':{'ref_point':[-350,0]}}], 'ineq_constraints':[InConstraint_Generic(X_space, indices=[0,1], coeff=[-1,-1], rhs=-6)]}\n",
- "\n",
- "X_suggest, eval_suggest = my_campaign.optimizer.suggest(**optim_kwargs)"
+ "X_suggest, eval_suggest = campaign.optimizer.suggest(acquisition = [{'NEHVI':{'ref_point':[-350, -20]}}, 'SF'],\n",
+ " # X1 + X2 <= 6, written as -X1 - X2 >= -6\n",
+ " ineq_constraints = [InConstraint_Generic(X_space, indices=[0,1], coeff=[-1,-1], rhs=-6)])"
]
},
{
@@ -189,7 +179,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "### Collect data at new suggestions"
+ "## Collect data at new suggestions"
]
},
{
@@ -200,15 +190,15 @@
"source": [
"y_iter1 = pd.DataFrame(simulator.simulate(X_suggest))\n",
"Z_iter1 = pd.concat([X_suggest, y_iter1, eval_suggest], axis=1)\n",
- "my_campaign.add_data(Z_iter1)\n",
- "my_campaign.data"
+ "campaign.add_data(Z_iter1)\n",
+ "campaign.data.tail()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "### Repeat as desired"
+ "## Repeat as desired"
]
},
{
@@ -218,11 +208,12 @@
"outputs": [],
"source": [
"for iter in range(5):\n",
- " my_campaign.fit()\n",
- " X_suggest, eval_suggest = my_campaign.optimizer.suggest(**optim_kwargs)\n",
+ " campaign.fit()\n",
+ " X_suggest, eval_suggest = campaign.optimizer.suggest(acquisition = [{'NEHVI':{'ref_point':[-350, -20]}}, 'SF'],\n",
+ " ineq_constraints = [InConstraint_Generic(X_space, indices=[0,1], coeff=[-1,-1], rhs=-6)])\n",
" y_iter = pd.DataFrame(simulator.simulate(X_suggest))\n",
" Z_iter = pd.concat([X_suggest, y_iter, eval_suggest], axis=1)\n",
- " my_campaign.add_data(Z_iter)"
+ " campaign.add_data(Z_iter)"
]
},
{
@@ -231,8 +222,7 @@
"metadata": {},
"outputs": [],
"source": [
- "fig = px.scatter(my_campaign.data, x='Response 1', y='Response 2', color='Iteration')\n",
- "fig.update_layout(height=300, width=400, template='ggplot2')"
+ "optim_progress(campaign)"
]
},
{
@@ -241,7 +231,7 @@
"metadata": {},
"outputs": [],
"source": [
- "my_campaign.data"
+ "surface_plot(campaign.optimizer, response_id = 0)"
]
},
{
@@ -249,7 +239,9 @@
"execution_count": null,
"metadata": {},
"outputs": [],
- "source": []
+ "source": [
+ "surface_plot(campaign.optimizer, response_id = 1)"
+ ]
}
],
"metadata": {
diff --git a/demo/Cost-penalized custom objective.ipynb b/demo/Cost-penalized custom objective.ipynb
new file mode 100644
index 0000000..12cc60a
--- /dev/null
+++ b/demo/Cost-penalized custom objective.ipynb
@@ -0,0 +1,317 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import obsidian\n",
+ "print(f'obsidian version: ' + obsidian.__version__)\n",
+ "\n",
+ "import pandas as pd\n",
+ "import plotly.express as px\n",
+ "import plotly.io as pio\n",
+ "pio.renderers.default = \"plotly_mimetype+notebook\""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Introduction"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In this tutorial, we will examine usage of _obsidian_ for performing a cost-penalized optimization using a tailored objective function.\n",
+ "\n",
+ "Often times, it is desireable to generate an objective function based on the input data `X`. Rather than build a model to a response calculated off-line, it is best to capture the analytical form where possible. The custom objective `Feature_Objective` simply allows the user to index the input variables and multiply them by coefficient(s) to generate a new objective function. In this example, we will create a `Feature_Objective` based off of \"Enzyme\" loading, to simulate an optimization where product yield might be weighed against an expensive input.\n",
+ "\n",
+ "The optimization problem then becomes multi-output: \"Product\" and \"Penalized Enzyme.\" However, we can combine these further to create a single objective function using a `Scalarization`. In the simplest case, we may want to add the two objectives with equal weights, which would be the default behavior of `Scalarize_WeightedSum`.\n",
+ "\n",
+ "In _obsidian_, we combine a sequence of objectives using `Objective_Sequence`. Thus, finally, the final objective function is `objective = Objective_Sequence([Feature_Objective, Scalarize_WeightedSum])` and single-output acquisition functions may be used to select optimal experiments."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Set up parameter space and initialize a design"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from obsidian import Campaign, Target, ParamSpace, BayesianOptimizer\n",
+ "from obsidian.parameters import Param_Continuous"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "params = [\n",
+ " Param_Continuous('Temperature', -10, 30),\n",
+ " Param_Continuous('Concentration', 10, 150),\n",
+ " Param_Continuous('Enzyme', 0.01, 0.30),\n",
+ " ]\n",
+ "\n",
+ "X_space = ParamSpace(params)\n",
+ "target = Target('Product', aim='max')\n",
+ "campaign = Campaign(X_space, target, seed=0)\n",
+ "X0 = campaign.initialize(m_initial = 10, method = 'LHS')\n",
+ "\n",
+ "X0"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Collect results (e.g. from a simulation)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from obsidian.experiment import Simulator\n",
+ "from obsidian.experiment.benchmark import cornered_parab\n",
+ "\n",
+ "simulator = Simulator(X_space, cornered_parab, name='Product', eps=0.05)\n",
+ "y0 = simulator.simulate(X0)\n",
+ "Z0 = pd.concat([X0, y0], axis=1)\n",
+ "\n",
+ "campaign.add_data(Z0)\n",
+ "campaign.data.sample(5)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Fit the optimizer and visualize results"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "campaign.fit()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from obsidian.plotting import factor_plot, optim_progress"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "factor_plot(campaign.optimizer, feature_id=1)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Optimize new experiment suggestions"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from obsidian.objectives import Objective_Sequence, Feature_Objective, Scalar_WeightedSum"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Note: Objectives can be passed directly to an `Optimizer`, or set using `campaign.set_objective()` after which the `Campaign` will automatically use the objective durign `campaign.suggest()`. At any time, the objective can be re-set to a new objective, or deleted using `campaign.clear_objective()`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "penalize_enz_loading = Feature_Objective(X_space, indices=[2], coeff=[-5])\n",
+ "add_objectives = Scalar_WeightedSum(1)\n",
+ "\n",
+ "campaign.set_objective(objective=Objective_Sequence([penalize_enz_loading, add_objectives]))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "X_suggest, eval_suggest = campaign.suggest(m_batch = 3, optim_sequential = False)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df_suggest = pd.concat([X_suggest, eval_suggest], axis=1)\n",
+ "df_suggest"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Note: We can examine the output of various objectives within the sequence by passing them directly to `optimizer.evaluate`. Here, we can explicitly see the balance of Objective 1 (product response) and Objective 2 (cost penalty) before they are combined in the weighted sum."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "campaign.optimizer.evaluate(X_suggest, objective=penalize_enz_loading)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Collect data at new suggestions"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "y_iter1 = pd.DataFrame(simulator.simulate(X_suggest), columns = ['Product'])\n",
+ "Z_iter1 = pd.concat([X_suggest, y_iter1, eval_suggest], axis=1)\n",
+ "campaign.add_data(Z_iter1)\n",
+ "campaign.data.tail()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Repeat as desired"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "for iter in range(3):\n",
+ " campaign.fit()\n",
+ " X_suggest, eval_suggest = campaign.suggest(m_batch=3)\n",
+ " y_iter = pd.DataFrame(simulator.simulate(X_suggest))\n",
+ " Z_iter = pd.concat([X_suggest, y_iter, eval_suggest], axis=1)\n",
+ " campaign.add_data(Z_iter)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Examine the optimization progress from the context of different elements of the compositve objective function\n",
+ "\n",
+ "First, the final objective - a weighted sum of product yield and a cost-penalized input."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "optim_progress(campaign, color_feature_id = 'aq Value')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Next, we can specifically examine the context of the multi-output optimization minimizing (maximizing negative) cost (Objective 2) and maximizing product (Objective 1)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "campaign.set_objective(penalize_enz_loading)\n",
+ "optim_progress(campaign)\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Finally, we can clear the objective entirely and just examine how this optimization performed from the lens of product alone."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "campaign.clear_objective()\n",
+ "optim_progress(campaign)"
+ ]
+ }
+ ],
+ "metadata": {
+ "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.10.14"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/demo/Joint optimization with constant param.ipynb b/demo/Joint optimization with constant param.ipynb
deleted file mode 100644
index b6b620e..0000000
--- a/demo/Joint optimization with constant param.ipynb
+++ /dev/null
@@ -1,274 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "import obsidian\n",
- "obsidian.__version__"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "import pandas as pd\n",
- "import plotly.express as px"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "from obsidian.parameters import ParamSpace, Param_Categorical, Param_Ordinal, Param_Continuous\n",
- "from obsidian.experiment import ExpDesigner"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Set up parameter space and initialize a design"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "params = [\n",
- " Param_Continuous('Temperature', -10, 30),\n",
- " Param_Continuous('Concentration', 10, 150),\n",
- " Param_Continuous('Enzyme', 0.01, 0.30),\n",
- " ]\n",
- "\n",
- "X_space = ParamSpace(params)\n",
- "designer = ExpDesigner(X_space, seed=0)\n",
- "X0 = designer.initialize(10, 'LHS')\n",
- "\n",
- "X0"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Collect results (e.g. from a simulation)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "from obsidian.experiment import Simulator\n",
- "from obsidian.experiment.benchmark import shifted_parab\n",
- "\n",
- "simulator = Simulator(X_space, shifted_parab, name='Yield', eps=0.05)\n",
- "y0 = simulator.simulate(X0)\n",
- "Z0 = pd.concat([X0, y0], axis=1)\n",
- "\n",
- "Z0"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "Z0.plot(x='Temperature', y='Yield', kind='scatter', figsize=(4,3))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Create a campaign to track optimization"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "from obsidian.campaign import Campaign"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "my_campaign = Campaign(X_space)\n",
- "my_campaign.add_data(Z0)\n",
- "my_campaign.data"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Fit an optimizer"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "from obsidian.parameters import Target"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "target = Target('Yield', aim='max')\n",
- "my_campaign.set_target(target)\n",
- "my_campaign.fit()\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Make new experiment suggestions"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "#### Jointly optimize a large number of experiments, but do so while holding one of the parameters constant.\n",
- "#### Note that the constant value is still optimized, the constraint simply keeps the experimental range low."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "from obsidian.constraints import InConstraint_ConstantDim"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "X_suggest, eval_suggest = my_campaign.optimizer.suggest(m_batch=12, nleq_constraints=[InConstraint_ConstantDim(X_space, dim=0)], optim_sequential=False)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "pd.concat([X_suggest, eval_suggest], axis=1)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Collect data at new suggestions"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "y_iter1 = pd.DataFrame(simulator.simulate(X_suggest), columns = ['Yield'])\n",
- "Z_iter1 = pd.concat([X_suggest, y_iter1, eval_suggest], axis=1)\n",
- "my_campaign.add_data(Z_iter1)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Repeat as desired"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "for iter in range(3):\n",
- " my_campaign.fit()\n",
- " X_suggest, eval_suggest = my_campaign.optimizer.suggest(m_batch=3)\n",
- " y_iter = pd.DataFrame(simulator.simulate(X_suggest))\n",
- " Z_iter = pd.concat([X_suggest, y_iter, eval_suggest], axis=1)\n",
- " my_campaign.add_data(Z_iter)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "fig = px.scatter(my_campaign.data, x=my_campaign.data.index, y='Yield', color='aq Value')\n",
- "fig.update_layout(height=300, width=400, template='ggplot2')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "my_campaign.data"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "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.10.14"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 4
-}
diff --git a/demo/Simple single objective.ipynb b/demo/Simple single objective.ipynb
index dd31bfd..cef399f 100644
--- a/demo/Simple single objective.ipynb
+++ b/demo/Simple single objective.ipynb
@@ -2,17 +2,9 @@
"cells": [
{
"cell_type": "code",
- "execution_count": 1,
+ "execution_count": null,
"metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "obsidian version: 0.7.10\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"import obsidian\n",
"print(f'obsidian version: ' + obsidian.__version__)\n",
@@ -32,7 +24,7 @@
},
{
"cell_type": "code",
- "execution_count": 2,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
@@ -42,141 +34,9 @@
},
{
"cell_type": "code",
- "execution_count": 3,
+ "execution_count": null,
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "
\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " Temperature \n",
- " Concentration \n",
- " Enzyme \n",
- " Variant \n",
- " Stir Rate \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " 0 \n",
- " 8.0 \n",
- " 17.0 \n",
- " 0.1405 \n",
- " MRK001 \n",
- " Medium \n",
- " \n",
- " \n",
- " 1 \n",
- " 12.0 \n",
- " 143.0 \n",
- " 0.1695 \n",
- " MRK003 \n",
- " Medium \n",
- " \n",
- " \n",
- " 2 \n",
- " 4.0 \n",
- " 101.0 \n",
- " 0.2855 \n",
- " MRK002 \n",
- " High \n",
- " \n",
- " \n",
- " 3 \n",
- " 28.0 \n",
- " 87.0 \n",
- " 0.1115 \n",
- " MRK002 \n",
- " Low \n",
- " \n",
- " \n",
- " 4 \n",
- " -4.0 \n",
- " 115.0 \n",
- " 0.2275 \n",
- " MRK001 \n",
- " Low \n",
- " \n",
- " \n",
- " 5 \n",
- " -8.0 \n",
- " 73.0 \n",
- " 0.0825 \n",
- " MRK002 \n",
- " Medium \n",
- " \n",
- " \n",
- " 6 \n",
- " 20.0 \n",
- " 129.0 \n",
- " 0.0535 \n",
- " MRK001 \n",
- " High \n",
- " \n",
- " \n",
- " 7 \n",
- " 24.0 \n",
- " 31.0 \n",
- " 0.2565 \n",
- " MRK002 \n",
- " Medium \n",
- " \n",
- " \n",
- " 8 \n",
- " 16.0 \n",
- " 59.0 \n",
- " 0.1985 \n",
- " MRK003 \n",
- " High \n",
- " \n",
- " \n",
- " 9 \n",
- " 0.0 \n",
- " 45.0 \n",
- " 0.0245 \n",
- " MRK003 \n",
- " Low \n",
- " \n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " Temperature Concentration Enzyme Variant Stir Rate\n",
- "0 8.0 17.0 0.1405 MRK001 Medium\n",
- "1 12.0 143.0 0.1695 MRK003 Medium\n",
- "2 4.0 101.0 0.2855 MRK002 High\n",
- "3 28.0 87.0 0.1115 MRK002 Low\n",
- "4 -4.0 115.0 0.2275 MRK001 Low\n",
- "5 -8.0 73.0 0.0825 MRK002 Medium\n",
- "6 20.0 129.0 0.0535 MRK001 High\n",
- "7 24.0 31.0 0.2565 MRK002 Medium\n",
- "8 16.0 59.0 0.1985 MRK003 High\n",
- "9 0.0 45.0 0.0245 MRK003 Low"
- ]
- },
- "execution_count": 3,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"params = [\n",
" Param_Continuous('Temperature', -10, 30),\n",
@@ -189,7 +49,7 @@
"X_space = ParamSpace(params)\n",
"target = Target('Yield', aim='max')\n",
"campaign = Campaign(X_space, target, seed=0)\n",
- "X0 = campaign.designer.initialize(10, 'LHS')\n",
+ "X0 = campaign.initialize(m_initial = 10, method = 'LHS')\n",
"\n",
"X0"
]
@@ -203,127 +63,9 @@
},
{
"cell_type": "code",
- "execution_count": 4,
+ "execution_count": null,
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " Temperature \n",
- " Concentration \n",
- " Enzyme \n",
- " Variant \n",
- " Stir Rate \n",
- " Yield \n",
- " Iteration \n",
- " \n",
- " \n",
- " Observation ID \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " 5 \n",
- " -8.0 \n",
- " 73.0 \n",
- " 0.0825 \n",
- " MRK002 \n",
- " Medium \n",
- " 86.196333 \n",
- " 0 \n",
- " \n",
- " \n",
- " 2 \n",
- " 4.0 \n",
- " 101.0 \n",
- " 0.2855 \n",
- " MRK002 \n",
- " High \n",
- " 46.270422 \n",
- " 0 \n",
- " \n",
- " \n",
- " 3 \n",
- " 28.0 \n",
- " 87.0 \n",
- " 0.1115 \n",
- " MRK002 \n",
- " Low \n",
- " 60.288919 \n",
- " 0 \n",
- " \n",
- " \n",
- " 4 \n",
- " -4.0 \n",
- " 115.0 \n",
- " 0.2275 \n",
- " MRK001 \n",
- " Low \n",
- " 63.082417 \n",
- " 0 \n",
- " \n",
- " \n",
- " 1 \n",
- " 12.0 \n",
- " 143.0 \n",
- " 0.1695 \n",
- " MRK003 \n",
- " Medium \n",
- " 44.280131 \n",
- " 0 \n",
- " \n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " Temperature Concentration Enzyme Variant Stir Rate \\\n",
- "Observation ID \n",
- "5 -8.0 73.0 0.0825 MRK002 Medium \n",
- "2 4.0 101.0 0.2855 MRK002 High \n",
- "3 28.0 87.0 0.1115 MRK002 Low \n",
- "4 -4.0 115.0 0.2275 MRK001 Low \n",
- "1 12.0 143.0 0.1695 MRK003 Medium \n",
- "\n",
- " Yield Iteration \n",
- "Observation ID \n",
- "5 86.196333 0 \n",
- "2 46.270422 0 \n",
- "3 60.288919 0 \n",
- "4 63.082417 0 \n",
- "1 44.280131 0 "
- ]
- },
- "execution_count": 4,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"from obsidian.experiment import Simulator\n",
"from obsidian.experiment.benchmark import shifted_parab\n",
@@ -338,20 +80,9 @@
},
{
"cell_type": "code",
- "execution_count": 5,
+ "execution_count": null,
"metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "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",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
+ "outputs": [],
"source": [
"from obsidian.plotting import visualize_inputs\n",
"\n",
@@ -367,2066 +98,36 @@
},
{
"cell_type": "code",
- "execution_count": 6,
+ "execution_count": null,
"metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "GP model has been fit to data with a train-score of: 1 for response: Yield\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"campaign.fit()"
]
},
{
"cell_type": "code",
- "execution_count": 7,
+ "execution_count": null,
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- " \n",
- " "
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "application/vnd.plotly.v1+json": {
- "config": {
- "plotlyServerURL": "https://plot.ly"
- },
- "data": [
- {
- "error_y": {
- "array": [
- 0.018810962788350594,
- 0.01881091456185402,
- 0.01881095275962963,
- 0.018810935337775447,
- 0.01881094664046401,
- 0.018810935584212984,
- 0.01881096416672534,
- 0.018810903284204983,
- 0.018810922088640325,
- 0.018810992548722538
- ],
- "arrayminus": [
- 0.01881095972854041,
- 0.018810911502050942,
- 0.01881094969981234,
- 0.018810932277965264,
- 0.018810943580660933,
- 0.0188109325244028,
- 0.01881096110691516,
- 0.01881090022440901,
- 0.018810919028830142,
- 0.018810989488898144
- ],
- "color": "gray",
- "thickness": 0.5
- },
- "marker": {
- "color": [
- 6.296058387458202e-13,
- 5.7407106676363984e-15,
- 1.3157485598457538e-13,
- 3.531533078572637e-14,
- 1.1309012440804044e-13,
- 6.467660058121535e-14,
- 1.283618563323006e-13,
- 2.8661340807074577e-13,
- 4.787149064302353e-13,
- 2.981768401867673e-14
- ],
- "colorscale": [
- [
- 0,
- "#440154"
- ],
- [
- 0.1111111111111111,
- "#482878"
- ],
- [
- 0.2222222222222222,
- "#3e4989"
- ],
- [
- 0.3333333333333333,
- "#31688e"
- ],
- [
- 0.4444444444444444,
- "#26828e"
- ],
- [
- 0.5555555555555556,
- "#1f9e89"
- ],
- [
- 0.6666666666666666,
- "#35b779"
- ],
- [
- 0.7777777777777778,
- "#6ece58"
- ],
- [
- 0.8888888888888888,
- "#b5de2b"
- ],
- [
- 1,
- "#fde725"
- ]
- ],
- "size": 15
- },
- "mode": "markers",
- "name": "Observations",
- "type": "scatter",
- "x": [
- 92.33980672490216,
- 44.28013139056551,
- 46.27042165792395,
- 60.288918896712964,
- 63.08241717950659,
- 86.19633278740932,
- 47.62503445818602,
- 48.96614297388498,
- 49.87657408385417,
- 81.22881027324594
- ],
- "y": [
- 92.33973345538415,
- 44.28013474555937,
- 46.270438441709,
- 60.28890756699405,
- 63.082395965599275,
- 86.19635470851127,
- 47.62505152110378,
- 48.966169188540064,
- 49.87660859306999,
- 81.22879624681924
- ]
- },
- {
- "line": {
- "color": "black",
- "dash": "dot"
- },
- "mode": "lines",
- "name": "Parity",
- "showlegend": false,
- "type": "scatter",
- "x": [
- 40.25466490051409,
- 101.57378739739238
- ],
- "y": [
- 40.25466490051409,
- 101.57378739739238
- ]
- }
- ],
- "layout": {
- "autosize": false,
- "height": 400,
- "template": {
- "data": {
- "bar": [
- {
- "error_x": {
- "color": "rgb(51,51,51)"
- },
- "error_y": {
- "color": "rgb(51,51,51)"
- },
- "marker": {
- "line": {
- "color": "rgb(237,237,237)",
- "width": 0.5
- },
- "pattern": {
- "fillmode": "overlay",
- "size": 10,
- "solidity": 0.2
- }
- },
- "type": "bar"
- }
- ],
- "barpolar": [
- {
- "marker": {
- "line": {
- "color": "rgb(237,237,237)",
- "width": 0.5
- },
- "pattern": {
- "fillmode": "overlay",
- "size": 10,
- "solidity": 0.2
- }
- },
- "type": "barpolar"
- }
- ],
- "carpet": [
- {
- "aaxis": {
- "endlinecolor": "rgb(51,51,51)",
- "gridcolor": "white",
- "linecolor": "white",
- "minorgridcolor": "white",
- "startlinecolor": "rgb(51,51,51)"
- },
- "baxis": {
- "endlinecolor": "rgb(51,51,51)",
- "gridcolor": "white",
- "linecolor": "white",
- "minorgridcolor": "white",
- "startlinecolor": "rgb(51,51,51)"
- },
- "type": "carpet"
- }
- ],
- "choropleth": [
- {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- },
- "type": "choropleth"
- }
- ],
- "contour": [
- {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- },
- "colorscale": [
- [
- 0,
- "rgb(20,44,66)"
- ],
- [
- 1,
- "rgb(90,179,244)"
- ]
- ],
- "type": "contour"
- }
- ],
- "contourcarpet": [
- {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- },
- "type": "contourcarpet"
- }
- ],
- "heatmap": [
- {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- },
- "colorscale": [
- [
- 0,
- "rgb(20,44,66)"
- ],
- [
- 1,
- "rgb(90,179,244)"
- ]
- ],
- "type": "heatmap"
- }
- ],
- "heatmapgl": [
- {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- },
- "colorscale": [
- [
- 0,
- "rgb(20,44,66)"
- ],
- [
- 1,
- "rgb(90,179,244)"
- ]
- ],
- "type": "heatmapgl"
- }
- ],
- "histogram": [
- {
- "marker": {
- "pattern": {
- "fillmode": "overlay",
- "size": 10,
- "solidity": 0.2
- }
- },
- "type": "histogram"
- }
- ],
- "histogram2d": [
- {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- },
- "colorscale": [
- [
- 0,
- "rgb(20,44,66)"
- ],
- [
- 1,
- "rgb(90,179,244)"
- ]
- ],
- "type": "histogram2d"
- }
- ],
- "histogram2dcontour": [
- {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- },
- "colorscale": [
- [
- 0,
- "rgb(20,44,66)"
- ],
- [
- 1,
- "rgb(90,179,244)"
- ]
- ],
- "type": "histogram2dcontour"
- }
- ],
- "mesh3d": [
- {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- },
- "type": "mesh3d"
- }
- ],
- "parcoords": [
- {
- "line": {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- }
- },
- "type": "parcoords"
- }
- ],
- "pie": [
- {
- "automargin": true,
- "type": "pie"
- }
- ],
- "scatter": [
- {
- "fillpattern": {
- "fillmode": "overlay",
- "size": 10,
- "solidity": 0.2
- },
- "type": "scatter"
- }
- ],
- "scatter3d": [
- {
- "line": {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- }
- },
- "marker": {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- }
- },
- "type": "scatter3d"
- }
- ],
- "scattercarpet": [
- {
- "marker": {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- }
- },
- "type": "scattercarpet"
- }
- ],
- "scattergeo": [
- {
- "marker": {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- }
- },
- "type": "scattergeo"
- }
- ],
- "scattergl": [
- {
- "marker": {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- }
- },
- "type": "scattergl"
- }
- ],
- "scattermapbox": [
- {
- "marker": {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- }
- },
- "type": "scattermapbox"
- }
- ],
- "scatterpolar": [
- {
- "marker": {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- }
- },
- "type": "scatterpolar"
- }
- ],
- "scatterpolargl": [
- {
- "marker": {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- }
- },
- "type": "scatterpolargl"
- }
- ],
- "scatterternary": [
- {
- "marker": {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- }
- },
- "type": "scatterternary"
- }
- ],
- "surface": [
- {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- },
- "colorscale": [
- [
- 0,
- "rgb(20,44,66)"
- ],
- [
- 1,
- "rgb(90,179,244)"
- ]
- ],
- "type": "surface"
- }
- ],
- "table": [
- {
- "cells": {
- "fill": {
- "color": "rgb(237,237,237)"
- },
- "line": {
- "color": "white"
- }
- },
- "header": {
- "fill": {
- "color": "rgb(217,217,217)"
- },
- "line": {
- "color": "white"
- }
- },
- "type": "table"
- }
- ]
- },
- "layout": {
- "annotationdefaults": {
- "arrowhead": 0,
- "arrowwidth": 1
- },
- "autotypenumbers": "strict",
- "coloraxis": {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- }
- },
- "colorscale": {
- "sequential": [
- [
- 0,
- "rgb(20,44,66)"
- ],
- [
- 1,
- "rgb(90,179,244)"
- ]
- ],
- "sequentialminus": [
- [
- 0,
- "rgb(20,44,66)"
- ],
- [
- 1,
- "rgb(90,179,244)"
- ]
- ]
- },
- "colorway": [
- "#F8766D",
- "#A3A500",
- "#00BF7D",
- "#00B0F6",
- "#E76BF3"
- ],
- "font": {
- "color": "rgb(51,51,51)"
- },
- "geo": {
- "bgcolor": "white",
- "lakecolor": "white",
- "landcolor": "rgb(237,237,237)",
- "showlakes": true,
- "showland": true,
- "subunitcolor": "white"
- },
- "hoverlabel": {
- "align": "left"
- },
- "hovermode": "closest",
- "paper_bgcolor": "white",
- "plot_bgcolor": "rgb(237,237,237)",
- "polar": {
- "angularaxis": {
- "gridcolor": "white",
- "linecolor": "white",
- "showgrid": true,
- "tickcolor": "rgb(51,51,51)",
- "ticks": "outside"
- },
- "bgcolor": "rgb(237,237,237)",
- "radialaxis": {
- "gridcolor": "white",
- "linecolor": "white",
- "showgrid": true,
- "tickcolor": "rgb(51,51,51)",
- "ticks": "outside"
- }
- },
- "scene": {
- "xaxis": {
- "backgroundcolor": "rgb(237,237,237)",
- "gridcolor": "white",
- "gridwidth": 2,
- "linecolor": "white",
- "showbackground": true,
- "showgrid": true,
- "tickcolor": "rgb(51,51,51)",
- "ticks": "outside",
- "zerolinecolor": "white"
- },
- "yaxis": {
- "backgroundcolor": "rgb(237,237,237)",
- "gridcolor": "white",
- "gridwidth": 2,
- "linecolor": "white",
- "showbackground": true,
- "showgrid": true,
- "tickcolor": "rgb(51,51,51)",
- "ticks": "outside",
- "zerolinecolor": "white"
- },
- "zaxis": {
- "backgroundcolor": "rgb(237,237,237)",
- "gridcolor": "white",
- "gridwidth": 2,
- "linecolor": "white",
- "showbackground": true,
- "showgrid": true,
- "tickcolor": "rgb(51,51,51)",
- "ticks": "outside",
- "zerolinecolor": "white"
- }
- },
- "shapedefaults": {
- "fillcolor": "black",
- "line": {
- "width": 0
- },
- "opacity": 0.3
- },
- "ternary": {
- "aaxis": {
- "gridcolor": "white",
- "linecolor": "white",
- "showgrid": true,
- "tickcolor": "rgb(51,51,51)",
- "ticks": "outside"
- },
- "baxis": {
- "gridcolor": "white",
- "linecolor": "white",
- "showgrid": true,
- "tickcolor": "rgb(51,51,51)",
- "ticks": "outside"
- },
- "bgcolor": "rgb(237,237,237)",
- "caxis": {
- "gridcolor": "white",
- "linecolor": "white",
- "showgrid": true,
- "tickcolor": "rgb(51,51,51)",
- "ticks": "outside"
- }
- },
- "xaxis": {
- "automargin": true,
- "gridcolor": "white",
- "linecolor": "white",
- "showgrid": true,
- "tickcolor": "rgb(51,51,51)",
- "ticks": "outside",
- "title": {
- "standoff": 15
- },
- "zerolinecolor": "white"
- },
- "yaxis": {
- "automargin": true,
- "gridcolor": "white",
- "linecolor": "white",
- "showgrid": true,
- "tickcolor": "rgb(51,51,51)",
- "ticks": "outside",
- "title": {
- "standoff": 15
- },
- "zerolinecolor": "white"
- }
- }
- },
- "title": {
- "text": "Parity Plot"
- },
- "width": 600,
- "xaxis": {
- "title": {
- "text": "Actual Response (Yield)"
- }
- },
- "yaxis": {
- "title": {
- "text": "Predicted Response (Yield)"
- }
- }
- }
- },
- "text/html": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
+ "outputs": [],
+ "source": [
+ "from obsidian.plotting import parity_plot, factor_plot, optim_progress"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
"source": [
- "from obsidian.plotting import parity_plot, factor_plot\n",
- "\n",
"parity_plot(campaign.optimizer)"
]
},
{
"cell_type": "code",
- "execution_count": 8,
+ "execution_count": null,
"metadata": {},
- "outputs": [
- {
- "data": {
- "application/vnd.plotly.v1+json": {
- "config": {
- "plotlyServerURL": "https://plot.ly"
- },
- "data": [
- {
- "fill": "toself",
- "line": {
- "color": "#00857C"
- },
- "name": "95% Pred Band",
- "opacity": 0.3,
- "showlegend": true,
- "type": "scatter",
- "x": [
- -10,
- -9.595959595959597,
- -9.191919191919192,
- -8.787878787878789,
- -8.383838383838386,
- -7.979797979797982,
- -7.575757575757578,
- -7.171717171717175,
- -6.767676767676771,
- -6.363636363636367,
- -5.959595959595964,
- -5.55555555555556,
- -5.151515151515156,
- -4.747474747474753,
- -4.34343434343435,
- -3.9393939393939448,
- -3.5353535353535417,
- -3.1313131313131386,
- -2.7272727272727337,
- -2.3232323232323306,
- -1.9191919191919276,
- -1.5151515151515227,
- -1.1111111111111196,
- -0.7070707070707165,
- -0.30303030303031164,
- 0.10101010101008967,
- 0.5050505050504945,
- 0.9090909090908994,
- 1.3131313131313007,
- 1.7171717171717056,
- 2.1212121212121104,
- 2.5252525252525118,
- 2.9292929292929166,
- 3.3333333333333215,
- 3.737373737373723,
- 4.141414141414128,
- 4.5454545454545325,
- 4.949494949494934,
- 5.353535353535339,
- 5.757575757575744,
- 6.161616161616145,
- 6.56565656565655,
- 6.969696969696955,
- 7.373737373737356,
- 7.777777777777761,
- 8.181818181818166,
- 8.585858585858567,
- 8.989898989898972,
- 9.393939393939377,
- 9.797979797979778,
- 10.20202020202018,
- 10.606060606060588,
- 11.010101010100989,
- 11.41414141414139,
- 11.818181818181799,
- 12.2222222222222,
- 12.626262626262601,
- 13.03030303030301,
- 13.434343434343411,
- 13.838383838383812,
- 14.242424242424221,
- 14.646464646464622,
- 15.050505050505024,
- 15.454545454545432,
- 15.858585858585833,
- 16.262626262626235,
- 16.666666666666643,
- 17.070707070707044,
- 17.474747474747446,
- 17.878787878787854,
- 18.282828282828255,
- 18.686868686868657,
- 19.090909090909065,
- 19.494949494949466,
- 19.898989898989868,
- 20.303030303030276,
- 20.707070707070677,
- 21.11111111111108,
- 21.515151515151487,
- 21.91919191919189,
- 22.32323232323229,
- 22.727272727272698,
- 23.1313131313131,
- 23.5353535353535,
- 23.93939393939391,
- 24.34343434343431,
- 24.747474747474712,
- 25.15151515151512,
- 25.55555555555552,
- 25.959595959595923,
- 26.36363636363633,
- 26.767676767676733,
- 27.171717171717134,
- 27.575757575757542,
- 27.979797979797944,
- 28.383838383838345,
- 28.787878787878753,
- 29.191919191919155,
- 29.595959595959556,
- 29.999999999999957,
- 29.999999999999957,
- 29.595959595959556,
- 29.191919191919155,
- 28.787878787878753,
- 28.383838383838345,
- 27.979797979797944,
- 27.575757575757542,
- 27.171717171717134,
- 26.767676767676733,
- 26.36363636363633,
- 25.959595959595923,
- 25.55555555555552,
- 25.15151515151512,
- 24.747474747474712,
- 24.34343434343431,
- 23.93939393939391,
- 23.5353535353535,
- 23.1313131313131,
- 22.727272727272698,
- 22.32323232323229,
- 21.91919191919189,
- 21.515151515151487,
- 21.11111111111108,
- 20.707070707070677,
- 20.303030303030276,
- 19.898989898989868,
- 19.494949494949466,
- 19.090909090909065,
- 18.686868686868657,
- 18.282828282828255,
- 17.878787878787854,
- 17.474747474747446,
- 17.070707070707044,
- 16.666666666666643,
- 16.262626262626235,
- 15.858585858585833,
- 15.454545454545432,
- 15.050505050505024,
- 14.646464646464622,
- 14.242424242424221,
- 13.838383838383812,
- 13.434343434343411,
- 13.03030303030301,
- 12.626262626262601,
- 12.2222222222222,
- 11.818181818181799,
- 11.41414141414139,
- 11.010101010100989,
- 10.606060606060588,
- 10.20202020202018,
- 9.797979797979778,
- 9.393939393939377,
- 8.989898989898972,
- 8.585858585858567,
- 8.181818181818166,
- 7.777777777777761,
- 7.373737373737356,
- 6.969696969696955,
- 6.56565656565655,
- 6.161616161616145,
- 5.757575757575744,
- 5.353535353535339,
- 4.949494949494934,
- 4.5454545454545325,
- 4.141414141414128,
- 3.737373737373723,
- 3.3333333333333215,
- 2.9292929292929166,
- 2.5252525252525118,
- 2.1212121212121104,
- 1.7171717171717056,
- 1.3131313131313007,
- 0.9090909090908994,
- 0.5050505050504945,
- 0.10101010101008967,
- -0.30303030303031164,
- -0.7070707070707165,
- -1.1111111111111196,
- -1.5151515151515227,
- -1.9191919191919276,
- -2.3232323232323306,
- -2.7272727272727337,
- -3.1313131313131386,
- -3.5353535353535417,
- -3.9393939393939448,
- -4.34343434343435,
- -4.747474747474753,
- -5.151515151515156,
- -5.55555555555556,
- -5.959595959595964,
- -6.363636363636367,
- -6.767676767676771,
- -7.171717171717175,
- -7.575757575757578,
- -7.979797979797982,
- -8.383838383838386,
- -8.787878787878789,
- -9.191919191919192,
- -9.595959595959597,
- -10
- ],
- "y": [
- 97.99033166985825,
- 97.60527273527329,
- 97.22590899996217,
- 96.85252088627426,
- 96.48536317696069,
- 96.12465889729555,
- 95.77059302467268,
- 95.42330623713447,
- 95.08288894321856,
- 94.74937585808158,
- 94.42274140447233,
- 94.10289621843111,
- 93.78968502248713,
- 93.48288608733418,
- 93.182212433715,
- 92.88731483232006,
- 92.5977865494512,
- 92.31316967263845,
- 92.03296274735447,
- 91.75662937616224,
- 91.48360738399349,
- 91.21331814158837,
- 90.94517566188213,
- 90.67859513520942,
- 90.41300063972427,
- 90.14783184344653,
- 89.8825495946724,
- 89.61664037076866,
- 89.34961961672147,
- 89.08103405179305,
- 88.81046305492193,
- 88.5375192582143,
- 88.26184848515032,
- 87.98312916840035,
- 87.70107137393781,
- 87.41541554567704,
- 87.12593107003427,
- 86.83241474410185,
- 86.53468921563406,
- 86.23260144850993,
- 85.92602125427969,
- 85.61483991906327,
- 85.2989689455365,
- 84.97833892202726,
- 84.65289852468771,
- 84.32261365418715,
- 83.98746670516817,
- 83.64745596464387,
- 83.30259513439604,
- 82.95291297208384,
- 82.5984530460644,
- 82.23927359971857,
- 81.8754475222744,
- 81.50706242464608,
- 81.13422082058841,
- 80.75704041544707,
- 80.37565450690822,
- 79.99021250436537,
- 79.60088057576684,
- 79.20784243300602,
- 78.81130026900257,
- 78.41147586147339,
- 78.00861185990922,
- 77.60297327330417,
- 77.19484917654903,
- 76.78455465291967,
- 76.37243298847166,
- 75.95885813109888,
- 75.54423742209553,
- 75.12901460074215,
- 74.71367307202631,
- 74.29873941326845,
- 73.88478707611229,
- 73.47244021490528,
- 73.06237753976559,
- 72.65533605148056,
- 72.25211446521328,
- 71.85357607092904,
- 71.46065071217848,
- 71.07433549518461,
- 70.69569377401999,
- 70.3258519057838,
- 69.96599324709793,
- 69.61734888866768,
- 69.28118471856143,
- 68.95878458547435,
- 68.65142961040503,
- 68.36037406291076,
- 68.08681864779318,
- 67.8318824854453,
- 67.59657543875689,
- 67.3817726591286,
- 67.18819322775443,
- 67.0163845335482,
- 66.86671359610031,
- 66.73936598938833,
- 66.634352364072,
- 66.55152174366822,
- 66.49057995995146,
- 66.45111120356633,
- 52.66702819667758,
- 53.08727517868487,
- 53.49685994566989,
- 53.895342663834995,
- 54.28239745477552,
- 54.65783372470225,
- 55.021614335542196,
- 55.37386855662996,
- 55.7148981465827,
- 56.04517576524461,
- 56.36533575621257,
- 56.67615798821764,
- 56.978545981180176,
- 57.27350096686345,
- 57.56209376501758,
- 57.845436350724995,
- 58.12465476831817,
- 58.40086467716356,
- 58.67515037693409,
- 58.94854773008008,
- 59.22203103127031,
- 59.49650359626567,
- 59.77279166198365,
- 60.05164109556811,
- 60.333716384885605,
- 60.6196014055512,
- 60.90980151161315,
- 61.20474656336711,
- 61.50479457564841,
- 61.81023573639286,
- 62.121296604403,
- 62.43814434541261,
- 62.760890906482835,
- 63.08959706111415,
- 63.42427628225521,
- 63.76489841884802,
- 64.11139316482898,
- 64.46365331867811,
- 64.8215378376273,
- 65.18487469423137,
- 65.55346354483217,
- 65.9270782200038,
- 66.30546904670443,
- 66.68836501092451,
- 67.07547576828728,
- 67.46649350850672,
- 67.86109467795595,
- 68.25894156292522,
- 68.65968373450968,
- 69.06295935453059,
- 69.46839634046624,
- 69.87561338611467,
- 70.28422083363908,
- 70.69382139181934,
- 71.10401069476237,
- 71.51437769509513,
- 71.92450488581835,
- 72.33396834562562,
- 72.74233760368914,
- 73.14917532180486,
- 73.55403679449198,
- 73.95646927134183,
- 74.3560111107434,
- 74.75219078026996,
- 75.1445257266141,
- 75.53252114715758,
- 75.91566870606539,
- 76.29344525015831,
- 76.66531159353318,
- 77.03071145453706,
- 77.38907064354765,
- 77.73979661407756,
- 78.08227850153202,
- 78.41588778168062,
- 78.73997968235416,
- 79.05389547449555,
- 79.35696575005713,
- 79.6485147621572,
- 79.92786585623314,
- 80.19434795993308,
- 80.44730302662208,
- 80.68609424748011,
- 80.91011476765254,
- 81.11879657195713,
- 81.31161915526503,
- 81.48811757078764,
- 81.64788946226128,
- 81.79060073501073,
- 81.91598960235567,
- 82.02386884892496,
- 82.11412626849514,
- 82.18672334694244,
- 82.24169235798048,
- 82.27913211145747,
- 82.2992026373816,
- 82.3021191050683,
- 82.2881452713049,
- 82.25758673058377,
- 82.21078420932112,
- 82.14810710755556
- ]
- },
- {
- "line": {
- "color": "#00857C"
- },
- "mode": "lines",
- "name": "Mean",
- "type": "scatter",
- "x": [
- -10,
- -9.595959595959597,
- -9.191919191919192,
- -8.787878787878789,
- -8.383838383838386,
- -7.979797979797982,
- -7.575757575757578,
- -7.171717171717175,
- -6.767676767676771,
- -6.363636363636367,
- -5.959595959595964,
- -5.55555555555556,
- -5.151515151515156,
- -4.747474747474753,
- -4.34343434343435,
- -3.9393939393939448,
- -3.5353535353535417,
- -3.1313131313131386,
- -2.7272727272727337,
- -2.3232323232323306,
- -1.9191919191919276,
- -1.5151515151515227,
- -1.1111111111111196,
- -0.7070707070707165,
- -0.30303030303031164,
- 0.10101010101008967,
- 0.5050505050504945,
- 0.9090909090908994,
- 1.3131313131313007,
- 1.7171717171717056,
- 2.1212121212121104,
- 2.5252525252525118,
- 2.9292929292929166,
- 3.3333333333333215,
- 3.737373737373723,
- 4.141414141414128,
- 4.5454545454545325,
- 4.949494949494934,
- 5.353535353535339,
- 5.757575757575744,
- 6.161616161616145,
- 6.56565656565655,
- 6.969696969696955,
- 7.373737373737356,
- 7.777777777777761,
- 8.181818181818166,
- 8.585858585858567,
- 8.989898989898972,
- 9.393939393939377,
- 9.797979797979778,
- 10.20202020202018,
- 10.606060606060588,
- 11.010101010100989,
- 11.41414141414139,
- 11.818181818181799,
- 12.2222222222222,
- 12.626262626262601,
- 13.03030303030301,
- 13.434343434343411,
- 13.838383838383812,
- 14.242424242424221,
- 14.646464646464622,
- 15.050505050505024,
- 15.454545454545432,
- 15.858585858585833,
- 16.262626262626235,
- 16.666666666666643,
- 17.070707070707044,
- 17.474747474747446,
- 17.878787878787854,
- 18.282828282828255,
- 18.686868686868657,
- 19.090909090909065,
- 19.494949494949466,
- 19.898989898989868,
- 20.303030303030276,
- 20.707070707070677,
- 21.11111111111108,
- 21.515151515151487,
- 21.91919191919189,
- 22.32323232323229,
- 22.727272727272698,
- 23.1313131313131,
- 23.5353535353535,
- 23.93939393939391,
- 24.34343434343431,
- 24.747474747474712,
- 25.15151515151512,
- 25.55555555555552,
- 25.959595959595923,
- 26.36363636363633,
- 26.767676767676733,
- 27.171717171717134,
- 27.575757575757542,
- 27.979797979797944,
- 28.383838383838345,
- 28.787878787878753,
- 29.191919191919155,
- 29.595959595959556,
- 29.999999999999957
- ],
- "y": [
- 90.06921836669864,
- 89.90802747917313,
- 89.74174689964158,
- 89.57033213921747,
- 89.3937402260298,
- 89.21192987543537,
- 89.02486169770847,
- 88.83249844718962,
- 88.6348053131274,
- 88.43175024816736,
- 88.22330432682674,
- 88.00944212419574,
- 87.79014210466802,
- 87.56538701130239,
- 87.3351642478458,
- 87.09946624702515,
- 86.85829082017541,
- 86.61164148451545,
- 86.35952776541193,
- 86.10196547180868,
- 85.83897694367437,
- 85.57059127086745,
- 85.29684448325327,
- 85.01777971225611,
- 84.73344732431514,
- 84.4439050269608,
- 84.14921794844307,
- 83.84945869204945,
- 83.5447073664305,
- 83.23505159340233,
- 82.9205864947981,
- 82.60141465997786,
- 82.27764609555271,
- 81.9493981587409,
- 81.61679547553427,
- 81.27996984453004,
- 80.93906012690154,
- 80.59421212254905,
- 80.24557843204605,
- 79.89331830358563,
- 79.53759746378668,
- 79.17858793094965,
- 78.81646780918729,
- 78.45142106179824,
- 78.08363726230358,
- 77.71331132172068,
- 77.34064319089858,
- 76.96583753705694,
- 76.58910339405841,
- 76.21065378636642,
- 75.83070532710028,
- 75.44947779107218,
- 75.06719366417634,
- 74.68407767097692,
- 74.30035628281972,
- 73.91625720924667,
- 73.53200887592654,
- 73.14783989270933,
- 72.76397851576556,
- 72.38065210805239,
- 71.99808660255357,
- 71.61650597284083,
- 71.23613171548584,
- 70.85718234870228,
- 70.47987293131004,
- 70.10441460569363,
- 69.73101416789504,
- 69.35987366736802,
- 68.9911900382582,
- 68.62515476342304,
- 68.26195357178736,
- 67.90176616909974,
- 67.54476600172919,
- 67.19112005282248,
- 66.8409886699542,
- 66.49452542329489,
- 66.15187699331784,
- 65.81318308710483,
- 65.47857638239503,
- 65.14818249861558,
- 64.82211999422208,
- 64.50050038975279,
- 64.18342821604504,
- 63.8710010870801,
- 63.56330979690406,
- 63.26043844002647,
- 62.96246455462513,
- 62.6694592877848,
- 62.3814875818847,
- 62.09860838110292,
- 61.82087485680072,
- 61.54833465020615,
- 61.281030130030445,
- 61.01899866074261,
- 60.76227287278611,
- 60.51088091846215,
- 60.264846692138775,
- 60.02419000249109,
- 59.78892670464867,
- 59.559068810887815
- ]
- }
- ],
- "layout": {
- "autosize": false,
- "height": 400,
- "template": {
- "data": {
- "bar": [
- {
- "error_x": {
- "color": "rgb(51,51,51)"
- },
- "error_y": {
- "color": "rgb(51,51,51)"
- },
- "marker": {
- "line": {
- "color": "rgb(237,237,237)",
- "width": 0.5
- },
- "pattern": {
- "fillmode": "overlay",
- "size": 10,
- "solidity": 0.2
- }
- },
- "type": "bar"
- }
- ],
- "barpolar": [
- {
- "marker": {
- "line": {
- "color": "rgb(237,237,237)",
- "width": 0.5
- },
- "pattern": {
- "fillmode": "overlay",
- "size": 10,
- "solidity": 0.2
- }
- },
- "type": "barpolar"
- }
- ],
- "carpet": [
- {
- "aaxis": {
- "endlinecolor": "rgb(51,51,51)",
- "gridcolor": "white",
- "linecolor": "white",
- "minorgridcolor": "white",
- "startlinecolor": "rgb(51,51,51)"
- },
- "baxis": {
- "endlinecolor": "rgb(51,51,51)",
- "gridcolor": "white",
- "linecolor": "white",
- "minorgridcolor": "white",
- "startlinecolor": "rgb(51,51,51)"
- },
- "type": "carpet"
- }
- ],
- "choropleth": [
- {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- },
- "type": "choropleth"
- }
- ],
- "contour": [
- {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- },
- "colorscale": [
- [
- 0,
- "rgb(20,44,66)"
- ],
- [
- 1,
- "rgb(90,179,244)"
- ]
- ],
- "type": "contour"
- }
- ],
- "contourcarpet": [
- {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- },
- "type": "contourcarpet"
- }
- ],
- "heatmap": [
- {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- },
- "colorscale": [
- [
- 0,
- "rgb(20,44,66)"
- ],
- [
- 1,
- "rgb(90,179,244)"
- ]
- ],
- "type": "heatmap"
- }
- ],
- "heatmapgl": [
- {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- },
- "colorscale": [
- [
- 0,
- "rgb(20,44,66)"
- ],
- [
- 1,
- "rgb(90,179,244)"
- ]
- ],
- "type": "heatmapgl"
- }
- ],
- "histogram": [
- {
- "marker": {
- "pattern": {
- "fillmode": "overlay",
- "size": 10,
- "solidity": 0.2
- }
- },
- "type": "histogram"
- }
- ],
- "histogram2d": [
- {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- },
- "colorscale": [
- [
- 0,
- "rgb(20,44,66)"
- ],
- [
- 1,
- "rgb(90,179,244)"
- ]
- ],
- "type": "histogram2d"
- }
- ],
- "histogram2dcontour": [
- {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- },
- "colorscale": [
- [
- 0,
- "rgb(20,44,66)"
- ],
- [
- 1,
- "rgb(90,179,244)"
- ]
- ],
- "type": "histogram2dcontour"
- }
- ],
- "mesh3d": [
- {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- },
- "type": "mesh3d"
- }
- ],
- "parcoords": [
- {
- "line": {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- }
- },
- "type": "parcoords"
- }
- ],
- "pie": [
- {
- "automargin": true,
- "type": "pie"
- }
- ],
- "scatter": [
- {
- "fillpattern": {
- "fillmode": "overlay",
- "size": 10,
- "solidity": 0.2
- },
- "type": "scatter"
- }
- ],
- "scatter3d": [
- {
- "line": {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- }
- },
- "marker": {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- }
- },
- "type": "scatter3d"
- }
- ],
- "scattercarpet": [
- {
- "marker": {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- }
- },
- "type": "scattercarpet"
- }
- ],
- "scattergeo": [
- {
- "marker": {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- }
- },
- "type": "scattergeo"
- }
- ],
- "scattergl": [
- {
- "marker": {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- }
- },
- "type": "scattergl"
- }
- ],
- "scattermapbox": [
- {
- "marker": {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- }
- },
- "type": "scattermapbox"
- }
- ],
- "scatterpolar": [
- {
- "marker": {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- }
- },
- "type": "scatterpolar"
- }
- ],
- "scatterpolargl": [
- {
- "marker": {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- }
- },
- "type": "scatterpolargl"
- }
- ],
- "scatterternary": [
- {
- "marker": {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- }
- },
- "type": "scatterternary"
- }
- ],
- "surface": [
- {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- },
- "colorscale": [
- [
- 0,
- "rgb(20,44,66)"
- ],
- [
- 1,
- "rgb(90,179,244)"
- ]
- ],
- "type": "surface"
- }
- ],
- "table": [
- {
- "cells": {
- "fill": {
- "color": "rgb(237,237,237)"
- },
- "line": {
- "color": "white"
- }
- },
- "header": {
- "fill": {
- "color": "rgb(217,217,217)"
- },
- "line": {
- "color": "white"
- }
- },
- "type": "table"
- }
- ]
- },
- "layout": {
- "annotationdefaults": {
- "arrowhead": 0,
- "arrowwidth": 1
- },
- "autotypenumbers": "strict",
- "coloraxis": {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- }
- },
- "colorscale": {
- "sequential": [
- [
- 0,
- "rgb(20,44,66)"
- ],
- [
- 1,
- "rgb(90,179,244)"
- ]
- ],
- "sequentialminus": [
- [
- 0,
- "rgb(20,44,66)"
- ],
- [
- 1,
- "rgb(90,179,244)"
- ]
- ]
- },
- "colorway": [
- "#F8766D",
- "#A3A500",
- "#00BF7D",
- "#00B0F6",
- "#E76BF3"
- ],
- "font": {
- "color": "rgb(51,51,51)"
- },
- "geo": {
- "bgcolor": "white",
- "lakecolor": "white",
- "landcolor": "rgb(237,237,237)",
- "showlakes": true,
- "showland": true,
- "subunitcolor": "white"
- },
- "hoverlabel": {
- "align": "left"
- },
- "hovermode": "closest",
- "paper_bgcolor": "white",
- "plot_bgcolor": "rgb(237,237,237)",
- "polar": {
- "angularaxis": {
- "gridcolor": "white",
- "linecolor": "white",
- "showgrid": true,
- "tickcolor": "rgb(51,51,51)",
- "ticks": "outside"
- },
- "bgcolor": "rgb(237,237,237)",
- "radialaxis": {
- "gridcolor": "white",
- "linecolor": "white",
- "showgrid": true,
- "tickcolor": "rgb(51,51,51)",
- "ticks": "outside"
- }
- },
- "scene": {
- "xaxis": {
- "backgroundcolor": "rgb(237,237,237)",
- "gridcolor": "white",
- "gridwidth": 2,
- "linecolor": "white",
- "showbackground": true,
- "showgrid": true,
- "tickcolor": "rgb(51,51,51)",
- "ticks": "outside",
- "zerolinecolor": "white"
- },
- "yaxis": {
- "backgroundcolor": "rgb(237,237,237)",
- "gridcolor": "white",
- "gridwidth": 2,
- "linecolor": "white",
- "showbackground": true,
- "showgrid": true,
- "tickcolor": "rgb(51,51,51)",
- "ticks": "outside",
- "zerolinecolor": "white"
- },
- "zaxis": {
- "backgroundcolor": "rgb(237,237,237)",
- "gridcolor": "white",
- "gridwidth": 2,
- "linecolor": "white",
- "showbackground": true,
- "showgrid": true,
- "tickcolor": "rgb(51,51,51)",
- "ticks": "outside",
- "zerolinecolor": "white"
- }
- },
- "shapedefaults": {
- "fillcolor": "black",
- "line": {
- "width": 0
- },
- "opacity": 0.3
- },
- "ternary": {
- "aaxis": {
- "gridcolor": "white",
- "linecolor": "white",
- "showgrid": true,
- "tickcolor": "rgb(51,51,51)",
- "ticks": "outside"
- },
- "baxis": {
- "gridcolor": "white",
- "linecolor": "white",
- "showgrid": true,
- "tickcolor": "rgb(51,51,51)",
- "ticks": "outside"
- },
- "bgcolor": "rgb(237,237,237)",
- "caxis": {
- "gridcolor": "white",
- "linecolor": "white",
- "showgrid": true,
- "tickcolor": "rgb(51,51,51)",
- "ticks": "outside"
- }
- },
- "xaxis": {
- "automargin": true,
- "gridcolor": "white",
- "linecolor": "white",
- "showgrid": true,
- "tickcolor": "rgb(51,51,51)",
- "ticks": "outside",
- "title": {
- "standoff": 15
- },
- "zerolinecolor": "white"
- },
- "yaxis": {
- "automargin": true,
- "gridcolor": "white",
- "linecolor": "white",
- "showgrid": true,
- "tickcolor": "rgb(51,51,51)",
- "ticks": "outside",
- "title": {
- "standoff": 15
- },
- "zerolinecolor": "white"
- }
- }
- },
- "title": {
- "text": "Factor Effect Plot for Temperature"
- },
- "width": 600,
- "xaxis": {
- "title": {
- "text": "Temperature"
- }
- },
- "yaxis": {
- "title": {
- "text": "Yield"
- }
- }
- }
- },
- "text/html": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
+ "outputs": [],
"source": [
"factor_plot(campaign.optimizer, feature_id=0)"
]
@@ -2440,120 +141,18 @@
},
{
"cell_type": "code",
- "execution_count": 9,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
- "X_suggest, eval_suggest = campaign.optimizer.suggest(m_batch=3)"
+ "X_suggest, eval_suggest = campaign.suggest(m_batch=3)"
]
},
{
"cell_type": "code",
- "execution_count": 10,
+ "execution_count": null,
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " Temperature \n",
- " Concentration \n",
- " Enzyme \n",
- " Variant \n",
- " Stir Rate \n",
- " Yield (pred) \n",
- " Yield lb \n",
- " Yield ub \n",
- " f(Yield) \n",
- " aq Value \n",
- " aq Value (joint) \n",
- " aq Method \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " 0 \n",
- " -10.000000 \n",
- " 10.0 \n",
- " 0.131014 \n",
- " MRK001 \n",
- " Low \n",
- " 104.655575 \n",
- " 97.694464 \n",
- " 111.616687 \n",
- " 2.349349 \n",
- " -0.380345 \n",
- " -0.292665 \n",
- " NEI \n",
- " \n",
- " \n",
- " 1 \n",
- " -10.000000 \n",
- " 10.0 \n",
- " 0.135985 \n",
- " MRK001 \n",
- " High \n",
- " 101.870533 \n",
- " 94.441592 \n",
- " 109.299474 \n",
- " 2.195901 \n",
- " -0.612096 \n",
- " -0.292665 \n",
- " NEI \n",
- " \n",
- " \n",
- " 2 \n",
- " -1.227879 \n",
- " 10.0 \n",
- " 0.114474 \n",
- " MRK002 \n",
- " Low \n",
- " 101.243266 \n",
- " 97.004850 \n",
- " 105.481684 \n",
- " 2.161341 \n",
- " -0.709565 \n",
- " -0.292665 \n",
- " NEI \n",
- " \n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " Temperature Concentration Enzyme Variant Stir Rate Yield (pred) \\\n",
- "0 -10.000000 10.0 0.131014 MRK001 Low 104.655575 \n",
- "1 -10.000000 10.0 0.135985 MRK001 High 101.870533 \n",
- "2 -1.227879 10.0 0.114474 MRK002 Low 101.243266 \n",
- "\n",
- " Yield lb Yield ub f(Yield) aq Value aq Value (joint) aq Method \n",
- "0 97.694464 111.616687 2.349349 -0.380345 -0.292665 NEI \n",
- "1 94.441592 109.299474 2.195901 -0.612096 -0.292665 NEI \n",
- "2 97.004850 105.481684 2.161341 -0.709565 -0.292665 NEI "
- ]
- },
- "execution_count": 10,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"df_suggest = pd.concat([X_suggest, eval_suggest], axis=1)\n",
"df_suggest"
@@ -2568,184 +167,9 @@
},
{
"cell_type": "code",
- "execution_count": 11,
+ "execution_count": null,
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " Temperature \n",
- " Concentration \n",
- " Enzyme \n",
- " Variant \n",
- " Stir Rate \n",
- " Yield \n",
- " Iteration \n",
- " Yield (pred) \n",
- " Yield lb \n",
- " Yield ub \n",
- " f(Yield) \n",
- " aq Value \n",
- " aq Value (joint) \n",
- " aq Method \n",
- " \n",
- " \n",
- " Observation ID \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " 8 \n",
- " 16.000000 \n",
- " 59.0 \n",
- " 0.198500 \n",
- " MRK003 \n",
- " High \n",
- " 49.876574 \n",
- " 0 \n",
- " NaN \n",
- " NaN \n",
- " NaN \n",
- " NaN \n",
- " NaN \n",
- " NaN \n",
- " NaN \n",
- " \n",
- " \n",
- " 9 \n",
- " 0.000000 \n",
- " 45.0 \n",
- " 0.024500 \n",
- " MRK003 \n",
- " Low \n",
- " 81.228810 \n",
- " 0 \n",
- " NaN \n",
- " NaN \n",
- " NaN \n",
- " NaN \n",
- " NaN \n",
- " NaN \n",
- " NaN \n",
- " \n",
- " \n",
- " 10 \n",
- " -10.000000 \n",
- " 10.0 \n",
- " 0.131014 \n",
- " MRK001 \n",
- " Low \n",
- " 92.196849 \n",
- " 1 \n",
- " 104.655575 \n",
- " 97.694464 \n",
- " 111.616687 \n",
- " 2.349349 \n",
- " -0.380345 \n",
- " -0.292665 \n",
- " NEI \n",
- " \n",
- " \n",
- " 11 \n",
- " -10.000000 \n",
- " 10.0 \n",
- " 0.135985 \n",
- " MRK001 \n",
- " High \n",
- " 74.499468 \n",
- " 1 \n",
- " 101.870533 \n",
- " 94.441592 \n",
- " 109.299474 \n",
- " 2.195901 \n",
- " -0.612096 \n",
- " -0.292665 \n",
- " NEI \n",
- " \n",
- " \n",
- " 12 \n",
- " -1.227879 \n",
- " 10.0 \n",
- " 0.114474 \n",
- " MRK002 \n",
- " Low \n",
- " 95.000467 \n",
- " 1 \n",
- " 101.243266 \n",
- " 97.004850 \n",
- " 105.481684 \n",
- " 2.161341 \n",
- " -0.709565 \n",
- " -0.292665 \n",
- " NEI \n",
- " \n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " Temperature Concentration Enzyme Variant Stir Rate \\\n",
- "Observation ID \n",
- "8 16.000000 59.0 0.198500 MRK003 High \n",
- "9 0.000000 45.0 0.024500 MRK003 Low \n",
- "10 -10.000000 10.0 0.131014 MRK001 Low \n",
- "11 -10.000000 10.0 0.135985 MRK001 High \n",
- "12 -1.227879 10.0 0.114474 MRK002 Low \n",
- "\n",
- " Yield Iteration Yield (pred) Yield lb Yield ub \\\n",
- "Observation ID \n",
- "8 49.876574 0 NaN NaN NaN \n",
- "9 81.228810 0 NaN NaN NaN \n",
- "10 92.196849 1 104.655575 97.694464 111.616687 \n",
- "11 74.499468 1 101.870533 94.441592 109.299474 \n",
- "12 95.000467 1 101.243266 97.004850 105.481684 \n",
- "\n",
- " f(Yield) aq Value aq Value (joint) aq Method \n",
- "Observation ID \n",
- "8 NaN NaN NaN NaN \n",
- "9 NaN NaN NaN NaN \n",
- "10 2.349349 -0.380345 -0.292665 NEI \n",
- "11 2.195901 -0.612096 -0.292665 NEI \n",
- "12 2.161341 -0.709565 -0.292665 NEI "
- ]
- },
- "execution_count": 11,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"y_iter1 = pd.DataFrame(simulator.simulate(X_suggest), columns = ['Yield'])\n",
"Z_iter1 = pd.concat([X_suggest, y_iter1, eval_suggest], axis=1)\n",
@@ -2762,23 +186,13 @@
},
{
"cell_type": "code",
- "execution_count": 12,
+ "execution_count": null,
"metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "GP model has been fit to data with a train-score of: 1 for response: Yield\n",
- "GP model has been fit to data with a train-score of: 1 for response: Yield\n",
- "GP model has been fit to data with a train-score of: 1 for response: Yield\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"for iter in range(3):\n",
" campaign.fit()\n",
- " X_suggest, eval_suggest = campaign.optimizer.suggest(m_batch=3)\n",
+ " X_suggest, eval_suggest = campaign.suggest(m_batch=3)\n",
" y_iter = pd.DataFrame(simulator.simulate(X_suggest))\n",
" Z_iter = pd.concat([X_suggest, y_iter, eval_suggest], axis=1)\n",
" campaign.add_data(Z_iter)"
@@ -2786,781 +200,55 @@
},
{
"cell_type": "code",
- "execution_count": 13,
+ "execution_count": null,
"metadata": {},
- "outputs": [
- {
- "data": {
- "application/vnd.plotly.v1+json": {
- "config": {
- "plotlyServerURL": "https://plot.ly"
- },
- "data": [
- {
- "hovertemplate": "Observation ID=%{x} Yield=%{y} aq Value=%{marker.color} ",
- "legendgroup": "",
- "marker": {
- "color": [
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- -0.38034538065202295,
- -0.6120958124027052,
- -0.7095649136708557,
- -2.05692078994696,
- -3.1516288285054745,
- -2.473037637673595,
- -2.798014989204011,
- -3.57020802379168,
- -3.088292727987067,
- -2.245755141023286,
- -3.426519149943271,
- -2.4302932293385533
- ],
- "coloraxis": "coloraxis",
- "symbol": "circle"
- },
- "mode": "markers",
- "name": "",
- "orientation": "v",
- "showlegend": false,
- "type": "scatter",
- "x": [
- 0,
- 1,
- 2,
- 3,
- 4,
- 5,
- 6,
- 7,
- 8,
- 9,
- 10,
- 11,
- 12,
- 13,
- 14,
- 15,
- 16,
- 17,
- 18,
- 19,
- 20,
- 21
- ],
- "xaxis": "x",
- "y": [
- 92.33980672490216,
- 44.28013139056551,
- 46.27042165792395,
- 60.288918896712964,
- 63.08241717950659,
- 86.19633278740932,
- 47.62503445818602,
- 48.96614297388498,
- 49.87657408385417,
- 81.22881027324594,
- 92.19684872892208,
- 74.49946768778311,
- 95.0004674747163,
- 99.35898338419939,
- 91.60949770163496,
- 91.31362421740042,
- 99.99794882558741,
- 92.89284062164445,
- 92.23896061375875,
- 100.95704001123406,
- 92.7739266193329,
- 99.65361433177773
- ],
- "yaxis": "y"
- }
- ],
- "layout": {
- "coloraxis": {
- "colorbar": {
- "title": {
- "text": "aq Value"
- }
- },
- "colorscale": [
- [
- 0,
- "#0d0887"
- ],
- [
- 0.1111111111111111,
- "#46039f"
- ],
- [
- 0.2222222222222222,
- "#7201a8"
- ],
- [
- 0.3333333333333333,
- "#9c179e"
- ],
- [
- 0.4444444444444444,
- "#bd3786"
- ],
- [
- 0.5555555555555556,
- "#d8576b"
- ],
- [
- 0.6666666666666666,
- "#ed7953"
- ],
- [
- 0.7777777777777778,
- "#fb9f3a"
- ],
- [
- 0.8888888888888888,
- "#fdca26"
- ],
- [
- 1,
- "#f0f921"
- ]
- ]
- },
- "height": 300,
- "legend": {
- "tracegroupgap": 0
- },
- "margin": {
- "t": 60
- },
- "template": {
- "data": {
- "bar": [
- {
- "error_x": {
- "color": "rgb(51,51,51)"
- },
- "error_y": {
- "color": "rgb(51,51,51)"
- },
- "marker": {
- "line": {
- "color": "rgb(237,237,237)",
- "width": 0.5
- },
- "pattern": {
- "fillmode": "overlay",
- "size": 10,
- "solidity": 0.2
- }
- },
- "type": "bar"
- }
- ],
- "barpolar": [
- {
- "marker": {
- "line": {
- "color": "rgb(237,237,237)",
- "width": 0.5
- },
- "pattern": {
- "fillmode": "overlay",
- "size": 10,
- "solidity": 0.2
- }
- },
- "type": "barpolar"
- }
- ],
- "carpet": [
- {
- "aaxis": {
- "endlinecolor": "rgb(51,51,51)",
- "gridcolor": "white",
- "linecolor": "white",
- "minorgridcolor": "white",
- "startlinecolor": "rgb(51,51,51)"
- },
- "baxis": {
- "endlinecolor": "rgb(51,51,51)",
- "gridcolor": "white",
- "linecolor": "white",
- "minorgridcolor": "white",
- "startlinecolor": "rgb(51,51,51)"
- },
- "type": "carpet"
- }
- ],
- "choropleth": [
- {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- },
- "type": "choropleth"
- }
- ],
- "contour": [
- {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- },
- "colorscale": [
- [
- 0,
- "rgb(20,44,66)"
- ],
- [
- 1,
- "rgb(90,179,244)"
- ]
- ],
- "type": "contour"
- }
- ],
- "contourcarpet": [
- {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- },
- "type": "contourcarpet"
- }
- ],
- "heatmap": [
- {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- },
- "colorscale": [
- [
- 0,
- "rgb(20,44,66)"
- ],
- [
- 1,
- "rgb(90,179,244)"
- ]
- ],
- "type": "heatmap"
- }
- ],
- "heatmapgl": [
- {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- },
- "colorscale": [
- [
- 0,
- "rgb(20,44,66)"
- ],
- [
- 1,
- "rgb(90,179,244)"
- ]
- ],
- "type": "heatmapgl"
- }
- ],
- "histogram": [
- {
- "marker": {
- "pattern": {
- "fillmode": "overlay",
- "size": 10,
- "solidity": 0.2
- }
- },
- "type": "histogram"
- }
- ],
- "histogram2d": [
- {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- },
- "colorscale": [
- [
- 0,
- "rgb(20,44,66)"
- ],
- [
- 1,
- "rgb(90,179,244)"
- ]
- ],
- "type": "histogram2d"
- }
- ],
- "histogram2dcontour": [
- {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- },
- "colorscale": [
- [
- 0,
- "rgb(20,44,66)"
- ],
- [
- 1,
- "rgb(90,179,244)"
- ]
- ],
- "type": "histogram2dcontour"
- }
- ],
- "mesh3d": [
- {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- },
- "type": "mesh3d"
- }
- ],
- "parcoords": [
- {
- "line": {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- }
- },
- "type": "parcoords"
- }
- ],
- "pie": [
- {
- "automargin": true,
- "type": "pie"
- }
- ],
- "scatter": [
- {
- "fillpattern": {
- "fillmode": "overlay",
- "size": 10,
- "solidity": 0.2
- },
- "type": "scatter"
- }
- ],
- "scatter3d": [
- {
- "line": {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- }
- },
- "marker": {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- }
- },
- "type": "scatter3d"
- }
- ],
- "scattercarpet": [
- {
- "marker": {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- }
- },
- "type": "scattercarpet"
- }
- ],
- "scattergeo": [
- {
- "marker": {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- }
- },
- "type": "scattergeo"
- }
- ],
- "scattergl": [
- {
- "marker": {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- }
- },
- "type": "scattergl"
- }
- ],
- "scattermapbox": [
- {
- "marker": {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- }
- },
- "type": "scattermapbox"
- }
- ],
- "scatterpolar": [
- {
- "marker": {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- }
- },
- "type": "scatterpolar"
- }
- ],
- "scatterpolargl": [
- {
- "marker": {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- }
- },
- "type": "scatterpolargl"
- }
- ],
- "scatterternary": [
- {
- "marker": {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- }
- },
- "type": "scatterternary"
- }
- ],
- "surface": [
- {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- },
- "colorscale": [
- [
- 0,
- "rgb(20,44,66)"
- ],
- [
- 1,
- "rgb(90,179,244)"
- ]
- ],
- "type": "surface"
- }
- ],
- "table": [
- {
- "cells": {
- "fill": {
- "color": "rgb(237,237,237)"
- },
- "line": {
- "color": "white"
- }
- },
- "header": {
- "fill": {
- "color": "rgb(217,217,217)"
- },
- "line": {
- "color": "white"
- }
- },
- "type": "table"
- }
- ]
- },
- "layout": {
- "annotationdefaults": {
- "arrowhead": 0,
- "arrowwidth": 1
- },
- "autotypenumbers": "strict",
- "coloraxis": {
- "colorbar": {
- "outlinewidth": 0,
- "tickcolor": "rgb(237,237,237)",
- "ticklen": 6,
- "ticks": "inside"
- }
- },
- "colorscale": {
- "sequential": [
- [
- 0,
- "rgb(20,44,66)"
- ],
- [
- 1,
- "rgb(90,179,244)"
- ]
- ],
- "sequentialminus": [
- [
- 0,
- "rgb(20,44,66)"
- ],
- [
- 1,
- "rgb(90,179,244)"
- ]
- ]
- },
- "colorway": [
- "#F8766D",
- "#A3A500",
- "#00BF7D",
- "#00B0F6",
- "#E76BF3"
- ],
- "font": {
- "color": "rgb(51,51,51)"
- },
- "geo": {
- "bgcolor": "white",
- "lakecolor": "white",
- "landcolor": "rgb(237,237,237)",
- "showlakes": true,
- "showland": true,
- "subunitcolor": "white"
- },
- "hoverlabel": {
- "align": "left"
- },
- "hovermode": "closest",
- "paper_bgcolor": "white",
- "plot_bgcolor": "rgb(237,237,237)",
- "polar": {
- "angularaxis": {
- "gridcolor": "white",
- "linecolor": "white",
- "showgrid": true,
- "tickcolor": "rgb(51,51,51)",
- "ticks": "outside"
- },
- "bgcolor": "rgb(237,237,237)",
- "radialaxis": {
- "gridcolor": "white",
- "linecolor": "white",
- "showgrid": true,
- "tickcolor": "rgb(51,51,51)",
- "ticks": "outside"
- }
- },
- "scene": {
- "xaxis": {
- "backgroundcolor": "rgb(237,237,237)",
- "gridcolor": "white",
- "gridwidth": 2,
- "linecolor": "white",
- "showbackground": true,
- "showgrid": true,
- "tickcolor": "rgb(51,51,51)",
- "ticks": "outside",
- "zerolinecolor": "white"
- },
- "yaxis": {
- "backgroundcolor": "rgb(237,237,237)",
- "gridcolor": "white",
- "gridwidth": 2,
- "linecolor": "white",
- "showbackground": true,
- "showgrid": true,
- "tickcolor": "rgb(51,51,51)",
- "ticks": "outside",
- "zerolinecolor": "white"
- },
- "zaxis": {
- "backgroundcolor": "rgb(237,237,237)",
- "gridcolor": "white",
- "gridwidth": 2,
- "linecolor": "white",
- "showbackground": true,
- "showgrid": true,
- "tickcolor": "rgb(51,51,51)",
- "ticks": "outside",
- "zerolinecolor": "white"
- }
- },
- "shapedefaults": {
- "fillcolor": "black",
- "line": {
- "width": 0
- },
- "opacity": 0.3
- },
- "ternary": {
- "aaxis": {
- "gridcolor": "white",
- "linecolor": "white",
- "showgrid": true,
- "tickcolor": "rgb(51,51,51)",
- "ticks": "outside"
- },
- "baxis": {
- "gridcolor": "white",
- "linecolor": "white",
- "showgrid": true,
- "tickcolor": "rgb(51,51,51)",
- "ticks": "outside"
- },
- "bgcolor": "rgb(237,237,237)",
- "caxis": {
- "gridcolor": "white",
- "linecolor": "white",
- "showgrid": true,
- "tickcolor": "rgb(51,51,51)",
- "ticks": "outside"
- }
- },
- "xaxis": {
- "automargin": true,
- "gridcolor": "white",
- "linecolor": "white",
- "showgrid": true,
- "tickcolor": "rgb(51,51,51)",
- "ticks": "outside",
- "title": {
- "standoff": 15
- },
- "zerolinecolor": "white"
- },
- "yaxis": {
- "automargin": true,
- "gridcolor": "white",
- "linecolor": "white",
- "showgrid": true,
- "tickcolor": "rgb(51,51,51)",
- "ticks": "outside",
- "title": {
- "standoff": 15
- },
- "zerolinecolor": "white"
- }
- }
- },
- "width": 400,
- "xaxis": {
- "anchor": "y",
- "domain": [
- 0,
- 1
- ],
- "title": {
- "text": "Observation ID"
- }
- },
- "yaxis": {
- "anchor": "x",
- "domain": [
- 0,
- 1
- ],
- "title": {
- "text": "Yield"
- }
- }
- }
- },
- "text/html": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
+ "outputs": [],
+ "source": [
+ "optim_progress(campaign, color_feature_id = 'aq Value')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Analyze using Explainer"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from obsidian.campaign import Explainer"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "exp = Explainer(campaign.optimizer)\n",
+ "exp.shap_explain(n=500)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "exp.shap_summary()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
"source": [
- "fig = px.scatter(campaign.data, x=campaign.data.index, y='Yield', color='aq Value')\n",
- "fig.update_layout(height=300, width=400, template='ggplot2')"
+ "exp.shap_pdp_ice(ind = 0, ice_color_var = 2)"
]
}
],
diff --git a/docs/_static/mycss.css b/docs/_static/mycss.css
index 182d881..cf6433b 100644
--- a/docs/_static/mycss.css
+++ b/docs/_static/mycss.css
@@ -7,4 +7,8 @@
.bd-page-width {
max-width: 100%; /* default is 88rem */
-}
\ No newline at end of file
+}
+
+.pst-scrollable-table-container table.table {
+ width: auto;
+}
diff --git a/docs/_static/tutorials/Constrained multi-output min-max.html b/docs/_static/tutorials/Constrained multi-output min-max.html
new file mode 100644
index 0000000..a0f63a0
--- /dev/null
+++ b/docs/_static/tutorials/Constrained multi-output min-max.html
@@ -0,0 +1,8508 @@
+
+
+
+
+
+Constrained multi-output min-max
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
obsidian version: 0.8.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Out[3]:
+
+
+
+
+
+
+
+X1
+X2
+
+
+
+
+0
+6.25
+8.75
+
+
+1
+1.25
+6.25
+
+
+2
+3.75
+1.25
+
+
+3
+8.75
+3.75
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Out[4]:
+
+
+
+
+
+
+
+X1
+X2
+Response 1
+Response 2
+Iteration
+
+
+Observation ID
+
+
+
+
+
+
+
+
+
+0
+6.25
+8.75
+-154.239634
+-5.248404
+0
+
+
+1
+1.25
+6.25
+-8.751383
+-6.534766
+0
+
+
+2
+3.75
+1.25
+-29.269633
+-13.059490
+0
+
+
+3
+8.75
+3.75
+-26.305781
+-7.544486
+0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
GP model has been fit to data with a train-score of: 1 for response: Response 1
+GP model has been fit to data with a train-score of: 1 for response: Response 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Out[10]:
+
+
+
+
+
+
+
+X1
+X2
+Response 1 (pred)
+Response 1 lb
+Response 1 ub
+Response 2 (pred)
+Response 2 lb
+Response 2 ub
+f(Response 1)
+f(Response 2)
+aq Value
+aq Value (joint)
+aq Method
+Expected Hypervolume (joint)
+Expected Pareto
+
+
+
+
+0
+1.855368e+00
+3.467079e-15
+-38.805388
+-101.625151
+24.014386
+-11.443693
+-8.463541
+-14.423845
+0.236315
+0.973132
+4.233924
+4.233924
+NEHVI
+3.389429
+False
+
+
+1
+5.782685e-15
+2.974608e+00
+-29.479032
+-100.736606
+41.778553
+-9.269232
+-5.810519
+-12.727946
+0.375486
+0.340895
+0.350581
+0.350581
+SF
+3.406860
+False
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Out[11]:
+
+
+
+
+
+
+
+X1
+X2
+Response 1
+Response 2
+Iteration
+Response 1 (pred)
+Response 1 lb
+Response 1 ub
+Response 2 (pred)
+Response 2 lb
+...
+f(Response 2)
+aq Value
+aq Value (joint)
+aq Method
+Expected Hypervolume (joint)
+Expected Pareto
+Response 1 (max) (iter)
+Response 2 (max) (iter)
+Hypervolume (iter)
+Pareto Front
+
+
+Observation ID
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+1
+1.250000e+00
+6.250000e+00
+-8.751383
+-6.534766
+0
+NaN
+NaN
+NaN
+NaN
+NaN
+...
+NaN
+NaN
+NaN
+NaN
+NaN
+NaN
+-8.751383
+-5.248404
+949.270665
+True
+
+
+2
+3.750000e+00
+1.250000e+00
+-29.269633
+-13.059490
+0
+NaN
+NaN
+NaN
+NaN
+NaN
+...
+NaN
+NaN
+NaN
+NaN
+NaN
+NaN
+-8.751383
+-5.248404
+949.270665
+False
+
+
+3
+8.750000e+00
+3.750000e+00
+-26.305781
+-7.544486
+0
+NaN
+NaN
+NaN
+NaN
+NaN
+...
+NaN
+NaN
+NaN
+NaN
+NaN
+NaN
+-8.751383
+-5.248404
+949.270665
+False
+
+
+4
+1.855368e+00
+3.467079e-15
+-116.993962
+-14.357309
+1
+-38.805388
+-101.625151
+24.014386
+-11.443693
+-8.463541
+...
+0.973132
+4.233924
+4.233924
+NEHVI
+3.389429
+False
+-8.751383
+-2.714921
+1355.934274
+False
+
+
+5
+5.782685e-15
+2.974608e+00
+-178.155376
+-2.714921
+1
+-29.479032
+-100.736606
+41.778553
+-9.269232
+-5.810519
+...
+0.340895
+0.350581
+0.350581
+SF
+3.406860
+False
+-8.751383
+-2.714921
+1355.934274
+True
+
+
+
+
5 rows × 22 columns
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
GP model has been fit to data with a train-score of: 0.998 for response: Response 1
+GP model has been fit to data with a train-score of: 0.999 for response: Response 2
+GP model has been fit to data with a train-score of: 1 for response: Response 1
+GP model has been fit to data with a train-score of: 1 for response: Response 2
+GP model has been fit to data with a train-score of: 1 for response: Response 1
+GP model has been fit to data with a train-score of: 1 for response: Response 2
+GP model has been fit to data with a train-score of: 0.999 for response: Response 1
+GP model has been fit to data with a train-score of: 1 for response: Response 2
+GP model has been fit to data with a train-score of: 1 for response: Response 1
+GP model has been fit to data with a train-score of: 1 for response: Response 2
+
+
+
+
+
+
+
+
+
diff --git a/docs/_static/tutorials/Cost-penalized custom objective.html b/docs/_static/tutorials/Cost-penalized custom objective.html
new file mode 100644
index 0000000..7fdce6b
--- /dev/null
+++ b/docs/_static/tutorials/Cost-penalized custom objective.html
@@ -0,0 +1,8673 @@
+
+
+
+
+
+Cost-penalized custom objective
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
obsidian version: 0.8.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Out[3]:
+
+
+
+
+
+
+
+Temperature
+Concentration
+Enzyme
+
+
+
+
+0
+16.0
+17.0
+0.1985
+
+
+1
+0.0
+129.0
+0.1695
+
+
+2
+8.0
+59.0
+0.2855
+
+
+3
+12.0
+143.0
+0.1115
+
+
+4
+-8.0
+87.0
+0.2275
+
+
+5
+20.0
+73.0
+0.0535
+
+
+6
+4.0
+101.0
+0.0245
+
+
+7
+28.0
+45.0
+0.1405
+
+
+8
+24.0
+115.0
+0.2565
+
+
+9
+-4.0
+31.0
+0.0825
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Out[4]:
+
+
+
+
+
+
+
+Temperature
+Concentration
+Enzyme
+Product
+Iteration
+
+
+Observation ID
+
+
+
+
+
+
+
+
+
+5
+20.0
+73.0
+0.0535
+-4.755681
+0
+
+
+2
+8.0
+59.0
+0.2855
+-66.782316
+0
+
+
+3
+12.0
+143.0
+0.1115
+-85.627439
+0
+
+
+4
+-8.0
+87.0
+0.2275
+-17.129587
+0
+
+
+1
+0.0
+129.0
+0.1695
+-45.900354
+0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
GP model has been fit to data with a train-score of: 1 for response: Product
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
c:\Users\kevin\miniconda3\envs\obsidian-dev\lib\site-packages\botorch\optim\optimize.py:564: RuntimeWarning:
+
+Optimization failed in `gen_candidates_scipy` with the following warning(s):
+[OptimizationWarning('Optimization failed within `scipy.optimize.minimize` with status 2 and message ABNORMAL_TERMINATION_IN_LNSRCH.')]
+Trying again with a new set of initial conditions.
+
+c:\Users\kevin\miniconda3\envs\obsidian-dev\lib\site-packages\botorch\optim\optimize.py:564: RuntimeWarning:
+
+Optimization failed on the second try, after generating a new set of initial conditions.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Out[11]:
+
+
+
+
+
+
+
+Temperature
+Concentration
+Enzyme
+Product (pred)
+Product lb
+Product ub
+f(Product)
+Objective 1
+aq Value
+aq Value (joint)
+aq Method
+
+
+
+
+0
+-1.366459
+23.701565
+0.027559
+82.545038
+52.602369
+112.487712
+1.704477
+1.566681
+-1.214936
+-0.977403
+NEI
+
+
+1
+0.748942
+100.907522
+0.276121
+-70.506235
+-99.886332
+-41.126134
+-0.532599
+-1.913204
+-46.057986
+-0.977403
+NEI
+
+
+2
+-10.000000
+53.696260
+0.060275
+76.435947
+46.268528
+106.603372
+1.615183
+1.313808
+-1.893481
+-0.977403
+NEI
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Out[12]:
+
+
+
+
+
+
+
+Product (pred)
+Product lb
+Product ub
+f(Product)
+Objective 1
+Objective 2
+Expected Hypervolume (joint)
+Expected Pareto
+
+
+
+
+0
+82.545038
+52.602369
+112.487712
+1.704477
+1.704477
+-0.137796
+4.775616
+False
+
+
+1
+-70.506235
+-99.886332
+-41.126134
+-0.532599
+-0.532599
+-1.380605
+4.775616
+False
+
+
+2
+76.435947
+46.268528
+106.603372
+1.615183
+1.615183
+-0.301376
+4.775616
+True
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Out[13]:
+
+
+
+
+
+
+
+Temperature
+Concentration
+Enzyme
+Product
+Iteration
+Objective 1
+Product (pred)
+Product lb
+Product ub
+f(Product)
+aq Value
+aq Value (joint)
+aq Method
+Objective 1 (max) (iter)
+
+
+Observation ID
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+8
+24.000000
+115.000000
+0.256500
+-166.801349
+0
+-3.222598
+NaN
+NaN
+NaN
+NaN
+NaN
+NaN
+NaN
+1.363311
+
+
+9
+-4.000000
+31.000000
+0.082500
+87.425397
+0
+1.363311
+NaN
+NaN
+NaN
+NaN
+NaN
+NaN
+NaN
+1.363311
+
+
+10
+-1.366459
+23.701565
+0.027559
+100.139209
+1
+1.823846
+82.545038
+52.602369
+112.487712
+1.704477
+-1.214936
+-0.977403
+NEI
+1.823846
+
+
+11
+0.748942
+100.907522
+0.276121
+-79.689998
+1
+-2.047438
+-70.506235
+-99.886332
+-41.126134
+-0.532599
+-46.057986
+-0.977403
+NEI
+1.823846
+
+
+12
+-10.000000
+53.696260
+0.060275
+87.065807
+1
+1.469179
+76.435947
+46.268528
+106.603372
+1.615183
+-1.893481
+-0.977403
+NEI
+1.823846
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
GP model has been fit to data with a train-score of: 1 for response: Product
+GP model has been fit to data with a train-score of: 1 for response: Product
+GP model has been fit to data with a train-score of: 1 for response: Product
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/_static/tutorials/Simple single objective.html b/docs/_static/tutorials/Simple single objective.html
index 4fdd762..f15cef3 100644
--- a/docs/_static/tutorials/Simple single objective.html
+++ b/docs/_static/tutorials/Simple single objective.html
@@ -7536,7 +7536,7 @@
-
obsidian version: 0.7.10
+obsidian version: 0.8.0
@@ -7587,7 +7587,7 @@ Set up parameter space a
X_space = ParamSpace ( params )
target = Target ( 'Yield' , aim = 'max' )
campaign = Campaign ( X_space , target , seed = 0 )
-X0 = campaign . designer . initialize ( 10 , 'LHS' )
+X0 = campaign . initialize ( m_initial = 10 , method = 'LHS' )
X0
@@ -7873,7 +7873,7 @@ Collect results (e.g. from a s
-
+
@@ -7916,7 +7916,7 @@ Fit the optimizer and visualize
-
+