-
-
Notifications
You must be signed in to change notification settings - Fork 240
Feature/batch bo issue 1229 (QEI) #1236
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
daphne12345
wants to merge
29
commits into
development
Choose a base branch
from
feature/batch_bo_issue_1229
base: development
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from 23 commits
Commits
Show all changes
29 commits
Select commit
Hold shift + click to select a range
9676189
allow encoder to return running configs
dengdifan 6b86808
add options for batch sampling
dengdifan 06719d2
maint constant liar with nan values
dengdifan 8b748db
Merge branch 'development' into batch_sampling_improvement
dengdifan 2487bc3
add docs
dengdifan d3f4f11
tests for config selectors
dengdifan 3c2196a
solve conflict
dengdifan 5f3ae8e
maint doc
dengdifan a1f7c32
style(config_selector)
benjamc f68fee5
style(abstract_encoder)
benjamc 691b1a9
Update CHANGELOG.md
benjamc eafef88
Merge branch 'development' into batch_sampling_improvement
benjamc 3cf1748
refactor(config_selector): pass all args in the facades
benjamc 62a9588
refactor(abstract_facade): fix default, add warning in docstring
benjamc 522c671
fix(fantasize): check whether model has been trained
benjamc 99443b4
feat(fantasize_example): add
benjamc 6658b88
fix(config_selector): properly check whether model is trained
benjamc 5416a8d
Merge branch 'development' into batch_sampling_improvement
benjamc 3ff68c3
Merge remote-tracking branch 'origin/batch_sampling_improvement' into…
daphne12345 198d978
batch expected improvement
daphne12345 dce1f54
created an example
daphne12345 e2c81f1
adjusted the config selector to work with q_ei
daphne12345 b01a1f8
Merge branch 'development' into feature/batch_bo_issue_1229
daphne12345 07487d0
added kwargs to the maximize function
daphne12345 f284798
removed qei from batch_sampling again
daphne12345 6d4a808
Sampling from surrogate model
daphne12345 4b8e801
Merge branch 'feature/batch_bo_issue_1229' of https://github.com/auto…
daphne12345 e1c13eb
bug fix
daphne12345 14eb30b
Added tests for qei
daphne12345 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,112 @@ | ||
| """Example of using SMAC with parallelization and fantasization vs. no estimation for pending evaluations. | ||
|
|
||
| This example will take some time because the target function is artificially slowed down to demonstrate the effect of | ||
| fantasization. The example will plot the incumbent found by SMAC with and without fantasization. | ||
| """ | ||
| from __future__ import annotations | ||
|
|
||
| import numpy as np | ||
| from ConfigSpace import Configuration, ConfigurationSpace, Float | ||
|
|
||
| from matplotlib import pyplot as plt | ||
|
|
||
| from smac import BlackBoxFacade, Scenario | ||
| from smac.facade import AbstractFacade | ||
|
|
||
| from rich import inspect | ||
| import time | ||
|
|
||
| def plot_trajectory(facades: list[AbstractFacade], names: list[str]) -> None: | ||
| # Plot incumbent | ||
| cmap = plt.get_cmap("tab10") | ||
|
|
||
| fig = plt.figure() | ||
| axes = fig.subplots(1, 2) | ||
|
|
||
| for ax_i, x_axis in zip(axes, ["walltime", "trial"]): | ||
| for i, facade in enumerate(facades): | ||
| X, Y = [], [] | ||
| inspect(facade.intensifier.trajectory) | ||
| for item in facade.intensifier.trajectory: | ||
| # Single-objective optimization | ||
| assert len(item.config_ids) == 1 | ||
| assert len(item.costs) == 1 | ||
|
|
||
| y = item.costs[0] | ||
| x = getattr(item, x_axis) | ||
|
|
||
| X.append(x) | ||
| Y.append(y) | ||
|
|
||
| ax_i.plot(X, Y, label=names[i], color=cmap(i)) | ||
| ax_i.scatter(X, Y, marker="x", color=cmap(i)) | ||
| ax_i.set_xlabel(x_axis) | ||
| ax_i.set_ylabel(facades[0].scenario.objectives) | ||
| ax_i.set_yscale("log") | ||
| ax_i.legend() | ||
|
|
||
| plt.show() | ||
|
|
||
| class Branin(): | ||
| @property | ||
| def configspace(self) -> ConfigurationSpace: | ||
| # Build Configuration Space which defines all parameters and their ranges | ||
| cs = ConfigurationSpace(seed=0) | ||
|
|
||
| # First we create our hyperparameters | ||
| x1 = Float("x1", (-5, 10), default=0) | ||
| x2 = Float("x2", (0, 15), default=0) | ||
|
|
||
| # Add hyperparameters and conditions to our configspace | ||
| cs.add([x1, x2]) | ||
|
|
||
| time.sleep(10) | ||
|
|
||
| return cs | ||
|
|
||
| def train(self, config: Configuration, seed: int) -> float: | ||
| x1 = config["x1"] | ||
| x2 = config["x2"] | ||
| a = 1.0 | ||
| b = 5.1 / (4.0 * np.pi**2) | ||
| c = 5.0 / np.pi | ||
| r = 6.0 | ||
| s = 10.0 | ||
| t = 1.0 / (8.0 * np.pi) | ||
|
|
||
| cost = a * (x2 - b * x1**2 + c * x1 - r) ** 2 + s * (1 - t) * np.cos(x1) + s | ||
| regret = cost - 0.397887 | ||
|
|
||
| return regret | ||
|
|
||
| if __name__ == "__main__": | ||
| seed = 345455 | ||
| scenario = Scenario(n_trials=100, configspace=Branin().configspace, n_workers=4, seed=seed) | ||
| facade = BlackBoxFacade | ||
|
|
||
| smac_noestimation = facade( | ||
| scenario=scenario, | ||
| target_function=Branin().train, | ||
| overwrite=True, | ||
| ) | ||
| smac_fantasize = facade( | ||
| scenario=scenario, | ||
| target_function=Branin().train, | ||
| config_selector=facade.get_config_selector( | ||
| scenario=scenario, | ||
| batch_sampling_estimation_strategy="kriging_believer" | ||
| ), | ||
| overwrite=True, | ||
| logging_level=0 | ||
| ) | ||
|
|
||
| incumbent_noestimation = smac_noestimation.optimize() | ||
| incumbent_fantasize = smac_fantasize.optimize() | ||
|
|
||
| plot_trajectory(facades=[ | ||
| smac_noestimation, | ||
| smac_fantasize, | ||
| ], names=["No Estimation", "Fantasize"]) | ||
|
|
||
| del smac_noestimation | ||
| del smac_fantasize |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,126 @@ | ||
| """Example of using SMAC with parallelization and fantasization vs. no estimation for pending evaluations. | ||
|
|
||
| This example will take some time because the target function is artificially slowed down to demonstrate the effect of | ||
| fantasization. The example will plot the incumbent found by SMAC with and without fantasization. | ||
| """ | ||
| from __future__ import annotations | ||
|
|
||
| import numpy as np | ||
| from ConfigSpace import Configuration, ConfigurationSpace, Float | ||
|
|
||
| from matplotlib import pyplot as plt | ||
|
|
||
| from smac import BlackBoxFacade, Scenario | ||
| from smac.facade import AbstractFacade | ||
| from smac.acquisition.function.expected_improvement import QExpectedImprovement, EI | ||
| from smac.acquisition.maximizer.random_search import RandomSearch | ||
|
|
||
| from rich import inspect | ||
| import time | ||
|
|
||
| def plot_trajectory(facades: list[AbstractFacade], names: list[str]) -> None: | ||
| # Plot incumbent | ||
| cmap = plt.get_cmap("tab10") | ||
|
|
||
| fig = plt.figure() | ||
| axes = fig.subplots(1, 2) | ||
|
|
||
| for ax_i, x_axis in zip(axes, ["walltime", "trial"]): | ||
| for i, facade in enumerate(facades): | ||
| X, Y = [], [] | ||
| inspect(facade.intensifier.trajectory) | ||
| for item in facade.intensifier.trajectory: | ||
| # Single-objective optimization | ||
| assert len(item.config_ids) == 1 | ||
| assert len(item.costs) == 1 | ||
|
|
||
| y = item.costs[0] | ||
| x = getattr(item, x_axis) | ||
|
|
||
| X.append(x) | ||
| Y.append(y) | ||
|
|
||
| ax_i.plot(X, Y, label=names[i], color=cmap(i)) | ||
| ax_i.scatter(X, Y, marker="x", color=cmap(i)) | ||
| ax_i.set_xlabel(x_axis) | ||
| ax_i.set_ylabel(facades[0].scenario.objectives) | ||
| ax_i.set_yscale("log") | ||
| ax_i.legend() | ||
|
|
||
| plt.show() | ||
|
|
||
| class Branin(): | ||
| @property | ||
| def configspace(self) -> ConfigurationSpace: | ||
| # Build Configuration Space which defines all parameters and their ranges | ||
| cs = ConfigurationSpace(seed=0) | ||
|
|
||
| # First we create our hyperparameters | ||
| x1 = Float("x1", (-5, 10), default=0) | ||
| x2 = Float("x2", (0, 15), default=0) | ||
|
|
||
| # Add hyperparameters and conditions to our configspace | ||
| cs.add([x1, x2]) | ||
|
|
||
| time.sleep(10) | ||
|
|
||
| return cs | ||
|
|
||
| def train(self, config: Configuration, seed: int) -> float: | ||
| x1 = config["x1"] | ||
| x2 = config["x2"] | ||
| a = 1.0 | ||
| b = 5.1 / (4.0 * np.pi**2) | ||
| c = 5.0 / np.pi | ||
| r = 6.0 | ||
| s = 10.0 | ||
| t = 1.0 / (8.0 * np.pi) | ||
|
|
||
| cost = a * (x2 - b * x1**2 + c * x1 - r) ** 2 + s * (1 - t) * np.cos(x1) + s | ||
| regret = cost - 0.397887 | ||
|
|
||
| return regret | ||
|
|
||
| if __name__ == "__main__": | ||
| seed = 345455 | ||
| scenario = Scenario(n_trials=100, configspace=Branin().configspace, n_workers=4, seed=seed) | ||
| facade = BlackBoxFacade | ||
|
|
||
| acq_function = EI() | ||
| acq_maximizer = RandomSearch(scenario.configspace, acq_function) | ||
|
|
||
| smac_noestimation = facade( | ||
| scenario=scenario, | ||
| target_function=Branin().train, | ||
| overwrite=True, | ||
| acquisition_function=acq_function, | ||
| acquisition_maximizer=acq_maximizer | ||
| ) | ||
|
|
||
| acq_function_qei = QExpectedImprovement() | ||
| acq_maximizer_qei = RandomSearch(scenario.configspace, acquisition_function=acq_function_qei) | ||
|
|
||
|
|
||
| smac_q_ei = facade( | ||
| scenario=scenario, | ||
| target_function=Branin().train, | ||
| config_selector=facade.get_config_selector( | ||
| scenario=scenario, | ||
| batch_sampling_estimation_strategy="q_ei" | ||
| ), | ||
| acquisition_function = acq_function_qei, | ||
| acquisition_maximizer=acq_maximizer_qei, | ||
| overwrite=True, | ||
| logging_level=0 | ||
| ) | ||
|
|
||
| incumbent_noestimation = smac_noestimation.optimize() | ||
| incumbent_q_ei= smac_q_ei.optimize() | ||
|
|
||
| plot_trajectory(facades=[ | ||
| smac_noestimation, | ||
| smac_q_ei, | ||
| ], names=["No Estimation", "QEI"]) | ||
|
|
||
| # del smac_noestimation | ||
| del smac_q_ei |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not quite sure here, but if the surrogate model is a GP, we can directly sample from the joint posterior distribution. As shown in botorch: https://botorch.readthedocs.io/en/stable/acquisition.html#botorch.acquisition.monte_carlo.qExpectedImprovement
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I replaced it with the surrogate model, if it is a GP.