Quadratic Function - SMAC3 (original) (raw)
Expand to copy examples/1_basics/1_quadratic_function.py
(top right)
[](#%5F%5Fcodelineno-0-1)import numpy as np [](#%5F%5Fcodelineno-0-2)from ConfigSpace import Configuration, ConfigurationSpace, Float [](#%5F%5Fcodelineno-0-3)from matplotlib import pyplot as plt [](#%5F%5Fcodelineno-0-4) [](#%5F%5Fcodelineno-0-5)from smac.facade.hyperparameter_optimization_facade import HyperparameterOptimizationFacade as HPOFacade [](#%5F%5Fcodelineno-0-6)from smac import RunHistory, Scenario [](#%5F%5Fcodelineno-0-7) [](#%5F%5Fcodelineno-0-8)__copyright__ = "Copyright 2025, Leibniz University Hanover, Institute of AI" [](#%5F%5Fcodelineno-0-9)__license__ = "3-clause BSD" [](#%5F%5Fcodelineno-0-10) [](#%5F%5Fcodelineno-0-11) [](#%5F%5Fcodelineno-0-12)class QuadraticFunction: [](#%5F%5Fcodelineno-0-13) @property [](#%5F%5Fcodelineno-0-14) def configspace(self) -> ConfigurationSpace: [](#%5F%5Fcodelineno-0-15) cs = ConfigurationSpace(seed=0) [](#%5F%5Fcodelineno-0-16) x = Float("x", (-5, 5), default=-5) [](#%5F%5Fcodelineno-0-17) cs.add([x]) [](#%5F%5Fcodelineno-0-18) [](#%5F%5Fcodelineno-0-19) return cs [](#%5F%5Fcodelineno-0-20) [](#%5F%5Fcodelineno-0-21) def train(self, config: Configuration, seed: int = 0) -> float: [](#%5F%5Fcodelineno-0-22) """Returns the y value of a quadratic function with a minimum we know to be at x=0.""" [](#%5F%5Fcodelineno-0-23) x = config["x"] [](#%5F%5Fcodelineno-0-24) return x**2 [](#%5F%5Fcodelineno-0-25) [](#%5F%5Fcodelineno-0-26) [](#%5F%5Fcodelineno-0-27)def plot(runhistory: RunHistory, incumbent: Configuration) -> None: [](#%5F%5Fcodelineno-0-28) plt.figure() [](#%5F%5Fcodelineno-0-29) [](#%5F%5Fcodelineno-0-30) # Plot ground truth [](#%5F%5Fcodelineno-0-31) x = list(np.linspace(-5, 5, 100)) [](#%5F%5Fcodelineno-0-32) y = [xi * xi for xi in x] [](#%5F%5Fcodelineno-0-33) plt.plot(x, y) [](#%5F%5Fcodelineno-0-34) [](#%5F%5Fcodelineno-0-35) # Plot all trials [](#%5F%5Fcodelineno-0-36) for k, v in runhistory.items(): [](#%5F%5Fcodelineno-0-37) config = runhistory.get_config(k.config_id) [](#%5F%5Fcodelineno-0-38) x = config["x"] [](#%5F%5Fcodelineno-0-39) y = v.cost # type: ignore [](#%5F%5Fcodelineno-0-40) plt.scatter(x, y, c="blue", alpha=0.1, zorder=9999, marker="o") [](#%5F%5Fcodelineno-0-41) [](#%5F%5Fcodelineno-0-42) # Plot incumbent [](#%5F%5Fcodelineno-0-43) plt.scatter(incumbent["x"], incumbent["x"] * incumbent["x"], c="red", zorder=10000, marker="x") [](#%5F%5Fcodelineno-0-44) [](#%5F%5Fcodelineno-0-45) plt.show() [](#%5F%5Fcodelineno-0-46) [](#%5F%5Fcodelineno-0-47) [](#%5F%5Fcodelineno-0-48)if __name__ == "__main__": [](#%5F%5Fcodelineno-0-49) model = QuadraticFunction() [](#%5F%5Fcodelineno-0-50) [](#%5F%5Fcodelineno-0-51) # Scenario object specifying the optimization "environment" [](#%5F%5Fcodelineno-0-52) scenario = Scenario(model.configspace, deterministic=True, n_trials=100) [](#%5F%5Fcodelineno-0-53) [](#%5F%5Fcodelineno-0-54) # Now we use SMAC to find the best hyperparameters [](#%5F%5Fcodelineno-0-55) smac = HPOFacade( [](#%5F%5Fcodelineno-0-56) scenario, [](#%5F%5Fcodelineno-0-57) model.train, # We pass the target function here [](#%5F%5Fcodelineno-0-58) overwrite=True, # Overrides any previous results that are found that are inconsistent with the meta-data [](#%5F%5Fcodelineno-0-59) ) [](#%5F%5Fcodelineno-0-60) [](#%5F%5Fcodelineno-0-61) incumbent = smac.optimize() [](#%5F%5Fcodelineno-0-62) [](#%5F%5Fcodelineno-0-63) # Get cost of default configuration [](#%5F%5Fcodelineno-0-64) default_cost = smac.validate(model.configspace.get_default_configuration()) [](#%5F%5Fcodelineno-0-65) print(f"Default cost: {default_cost}") [](#%5F%5Fcodelineno-0-66) [](#%5F%5Fcodelineno-0-67) # Let's calculate the cost of the incumbent [](#%5F%5Fcodelineno-0-68) incumbent_cost = smac.validate(incumbent) [](#%5F%5Fcodelineno-0-69) print(f"Incumbent cost: {incumbent_cost}") [](#%5F%5Fcodelineno-0-70) [](#%5F%5Fcodelineno-0-71) # Let's plot it too [](#%5F%5Fcodelineno-0-72) plot(smac.runhistory, incumbent)
Description#
An example of applying SMAC to optimize a quadratic function.
We use the black-box facade because it is designed for black-box function optimization. The black-box facade uses a Gaussian Process as its surrogate model. The facade works best on a numerical hyperparameter configuration space and should not be applied to problems with large evaluation budgets (up to 1000 evaluations).
CodeRun
[](#%5F%5Fcodelineno-1-1)import numpy as np [](#%5F%5Fcodelineno-1-2)from ConfigSpace import Configuration, ConfigurationSpace, Float [](#%5F%5Fcodelineno-1-3)from matplotlib import pyplot as plt [](#%5F%5Fcodelineno-1-4) [](#%5F%5Fcodelineno-1-5)from smac.facade.hyperparameter_optimization_facade import HyperparameterOptimizationFacade as HPOFacade [](#%5F%5Fcodelineno-1-6)from smac import RunHistory, Scenario [](#%5F%5Fcodelineno-1-7) [](#%5F%5Fcodelineno-1-8)__copyright__ = "Copyright 2025, Leibniz University Hanover, Institute of AI" [](#%5F%5Fcodelineno-1-9)__license__ = "3-clause BSD" [](#%5F%5Fcodelineno-1-10) [](#%5F%5Fcodelineno-1-11) [](#%5F%5Fcodelineno-1-12)class QuadraticFunction: [](#%5F%5Fcodelineno-1-13) @property [](#%5F%5Fcodelineno-1-14) def configspace(self) -> ConfigurationSpace: [](#%5F%5Fcodelineno-1-15) cs = ConfigurationSpace(seed=0) [](#%5F%5Fcodelineno-1-16) x = Float("x", (-5, 5), default=-5) [](#%5F%5Fcodelineno-1-17) cs.add([x]) [](#%5F%5Fcodelineno-1-18) [](#%5F%5Fcodelineno-1-19) return cs [](#%5F%5Fcodelineno-1-20) [](#%5F%5Fcodelineno-1-21) def train(self, config: Configuration, seed: int = 0) -> float: [](#%5F%5Fcodelineno-1-22) """Returns the y value of a quadratic function with a minimum we know to be at x=0.""" [](#%5F%5Fcodelineno-1-23) x = config["x"] [](#%5F%5Fcodelineno-1-24) return x**2 [](#%5F%5Fcodelineno-1-25) [](#%5F%5Fcodelineno-1-26) [](#%5F%5Fcodelineno-1-27)def plot(runhistory: RunHistory, incumbent: Configuration) -> None: [](#%5F%5Fcodelineno-1-28) plt.figure() [](#%5F%5Fcodelineno-1-29) [](#%5F%5Fcodelineno-1-30) # Plot ground truth [](#%5F%5Fcodelineno-1-31) x = list(np.linspace(-5, 5, 100)) [](#%5F%5Fcodelineno-1-32) y = [xi * xi for xi in x] [](#%5F%5Fcodelineno-1-33) plt.plot(x, y) [](#%5F%5Fcodelineno-1-34) [](#%5F%5Fcodelineno-1-35) # Plot all trials [](#%5F%5Fcodelineno-1-36) for k, v in runhistory.items(): [](#%5F%5Fcodelineno-1-37) config = runhistory.get_config(k.config_id) [](#%5F%5Fcodelineno-1-38) x = config["x"] [](#%5F%5Fcodelineno-1-39) y = v.cost # type: ignore [](#%5F%5Fcodelineno-1-40) plt.scatter(x, y, c="blue", alpha=0.1, zorder=9999, marker="o") [](#%5F%5Fcodelineno-1-41) [](#%5F%5Fcodelineno-1-42) # Plot incumbent [](#%5F%5Fcodelineno-1-43) plt.scatter(incumbent["x"], incumbent["x"] * incumbent["x"], c="red", zorder=10000, marker="x") [](#%5F%5Fcodelineno-1-44) [](#%5F%5Fcodelineno-1-45) plt.show() [](#%5F%5Fcodelineno-1-46) [](#%5F%5Fcodelineno-1-47) [](#%5F%5Fcodelineno-1-48)if __name__ == "__main__": [](#%5F%5Fcodelineno-1-49) model = QuadraticFunction() [](#%5F%5Fcodelineno-1-50) [](#%5F%5Fcodelineno-1-51) # Scenario object specifying the optimization "environment" [](#%5F%5Fcodelineno-1-52) scenario = Scenario(model.configspace, deterministic=True, n_trials=100) [](#%5F%5Fcodelineno-1-53) [](#%5F%5Fcodelineno-1-54) # Now we use SMAC to find the best hyperparameters [](#%5F%5Fcodelineno-1-55) smac = HPOFacade( [](#%5F%5Fcodelineno-1-56) scenario, [](#%5F%5Fcodelineno-1-57) model.train, # We pass the target function here [](#%5F%5Fcodelineno-1-58) overwrite=True, # Overrides any previous results that are found that are inconsistent with the meta-data [](#%5F%5Fcodelineno-1-59) ) [](#%5F%5Fcodelineno-1-60) [](#%5F%5Fcodelineno-1-61) incumbent = smac.optimize() [](#%5F%5Fcodelineno-1-62) [](#%5F%5Fcodelineno-1-63) # Get cost of default configuration [](#%5F%5Fcodelineno-1-64) default_cost = smac.validate(model.configspace.get_default_configuration()) [](#%5F%5Fcodelineno-1-65) print(f"Default cost: {default_cost}") [](#%5F%5Fcodelineno-1-66) [](#%5F%5Fcodelineno-1-67) # Let's calculate the cost of the incumbent [](#%5F%5Fcodelineno-1-68) incumbent_cost = smac.validate(incumbent) [](#%5F%5Fcodelineno-1-69) print(f"Incumbent cost: {incumbent_cost}") [](#%5F%5Fcodelineno-1-70) [](#%5F%5Fcodelineno-1-71) # Let's plot it too [](#%5F%5Fcodelineno-1-72) plot(smac.runhistory, incumbent)