Constrained Black-Box Optimization with Rejection Sampling#

Author(s): Romain Egele.

In this tutorial, we illustrate how to solve constrained black-box optimization (Wikipedia) (also known as derivative-free optimization) using DeepHyper.

Black-box optimization refers to a class of methods where an objective function \(f(x) = y \in \mathbb{R}\) can only be queried through input–output evaluations \(\{ (x_1, y_1), \ldots, (x_n, y_n) \}\). No closed-form expression, derivatives, or structural information about \(f\) are required.

In constrained optimization, we further introduce one or more rules that restrict the set of admissible solutions. These constraints carve out the feasible region of the search space and can substantially influence both the behavior and performance of the optimizer.

In the following example, we define a simple two-dimensional problem, impose a linear constraint, and solve it using DeepHyper’s Centralized Bayesian Optimization (CBO) engine.

There exists multiple ways of handling constraints in DeepHyper:

  1. Rejection sampling (shown in this tutorial) where we sample from the unconstrained search space then reject unfeasible solutions. While this approach is simple it can become computationnaly intractable.

  2. Learning to avoid failures (see Learn to Avoid Failures with Bayesian Optimization).

  3. Define the constraint as an other objective in a multi-objective optimization setup (tutorial coming soon).

  4. Custom chained sampler (tutorial coming soon).

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

from deephyper.analysis.hpo import plot_search_trajectory_single_objective_hpo, parameters_at_max
from deephyper.hpo import HpProblem, CBO

Optimization Problem#

We define a 2D search space over variables x and y.

pb = HpProblem()
pb.add((-10.0, 10.0), "x")
pb.add((-10.0, 10.0), "y")


def f(job):
    """Objective function: maximize x^2 + y^2."""
    return job.parameters["x"] ** 2 + job.parameters["y"] ** 2


def constraint_fn_test(s: pd.DataFrame):
    """Feasibility condition: |x| + |y| <= 10."""
    return np.abs(s["x"]) + np.abs(s["y"]) <= 10


pb.set_constraint_fn(constraint_fn_test)

We now set up a constrained Bayesian optimization search using a genetic algorithm to optimize the acquisition function periodically.

search = CBO(
    pb,
    acq_optimizer="ga",
    acq_optimizer_kwargs={"acq_optimizer_freq": 2},
    acq_func_kwargs={
        # Exploration/Exploitation mechanism
        "kappa": 200.0,
        "scheduler": {"type": "periodic-exp-decay", "period": 20, "kappa_final": 1.96},
    },
    verbose=1,
)
results = search.search(f, max_evals=300)
Results file already exists, it will be renamed to /Users/rp5/Documents/DeepHyper/deephyper/examples/examples_bbo/results_20251202-183859.csv

  0%|          | 0/300 [00:00<?, ?it/s]
  0%|          | 1/300 [00:00<00:00, 6168.09it/s, failures=0, objective=0.926]
  1%|          | 2/300 [00:00<00:09, 32.77it/s, failures=0, objective=49.8]
  1%|          | 3/300 [00:00<00:08, 36.15it/s, failures=0, objective=49.8]
  1%|▏         | 4/300 [00:00<00:07, 38.09it/s, failures=0, objective=49.8]
  1%|▏         | 4/300 [00:00<00:07, 38.09it/s, failures=0, objective=49.8]
  2%|▏         | 5/300 [00:00<00:07, 38.09it/s, failures=0, objective=49.8]
  2%|▏         | 6/300 [00:00<00:07, 38.09it/s, failures=0, objective=91.8]
  2%|▏         | 7/300 [00:00<00:07, 38.09it/s, failures=0, objective=91.8]
  3%|▎         | 8/300 [00:00<00:21, 13.63it/s, failures=0, objective=91.8]
  3%|▎         | 8/300 [00:00<00:21, 13.63it/s, failures=0, objective=92.4]
  3%|▎         | 9/300 [00:00<00:21, 13.63it/s, failures=0, objective=92.4]
  3%|▎         | 10/300 [00:00<00:21, 13.63it/s, failures=0, objective=92.4]
  4%|▎         | 11/300 [00:00<00:22, 13.01it/s, failures=0, objective=92.4]
  4%|▎         | 11/300 [00:00<00:22, 13.01it/s, failures=0, objective=92.4]
  4%|▍         | 12/300 [00:00<00:22, 13.01it/s, failures=0, objective=92.4]
  4%|▍         | 13/300 [00:00<00:23, 11.99it/s, failures=0, objective=92.4]
  4%|▍         | 13/300 [00:00<00:23, 11.99it/s, failures=0, objective=92.4]
  5%|▍         | 14/300 [00:01<00:23, 11.99it/s, failures=0, objective=92.4]
  5%|▌         | 15/300 [00:01<00:23, 12.07it/s, failures=0, objective=92.4]
  5%|▌         | 15/300 [00:01<00:23, 12.07it/s, failures=0, objective=92.4]
  5%|▌         | 16/300 [00:01<00:23, 12.07it/s, failures=0, objective=92.4]
  6%|▌         | 17/300 [00:01<00:24, 11.55it/s, failures=0, objective=92.4]
  6%|▌         | 17/300 [00:01<00:24, 11.55it/s, failures=0, objective=95.9]
  6%|▌         | 18/300 [00:01<00:24, 11.55it/s, failures=0, objective=97.4]
  6%|▋         | 19/300 [00:01<00:25, 11.02it/s, failures=0, objective=97.4]
  6%|▋         | 19/300 [00:01<00:25, 11.02it/s, failures=0, objective=98.3]
  7%|▋         | 20/300 [00:01<00:25, 11.02it/s, failures=0, objective=98.3]
  7%|▋         | 21/300 [00:01<00:25, 10.79it/s, failures=0, objective=98.3]
  7%|▋         | 21/300 [00:01<00:25, 10.79it/s, failures=0, objective=98.3]
  7%|▋         | 22/300 [00:01<00:25, 10.79it/s, failures=0, objective=98.3]
  8%|▊         | 23/300 [00:01<00:24, 11.25it/s, failures=0, objective=98.3]
  8%|▊         | 23/300 [00:01<00:24, 11.25it/s, failures=0, objective=99.4]
  8%|▊         | 24/300 [00:02<00:24, 11.25it/s, failures=0, objective=99.4]
  8%|▊         | 25/300 [00:02<00:25, 10.98it/s, failures=0, objective=99.4]
  8%|▊         | 25/300 [00:02<00:25, 10.98it/s, failures=0, objective=99.4]
  9%|▊         | 26/300 [00:02<00:24, 10.98it/s, failures=0, objective=99.4]
  9%|▉         | 27/300 [00:02<00:25, 10.84it/s, failures=0, objective=99.4]
  9%|▉         | 27/300 [00:02<00:25, 10.84it/s, failures=0, objective=99.4]
  9%|▉         | 28/300 [00:02<00:25, 10.84it/s, failures=0, objective=99.4]
 10%|▉         | 29/300 [00:02<00:23, 11.40it/s, failures=0, objective=99.4]
 10%|▉         | 29/300 [00:02<00:23, 11.40it/s, failures=0, objective=99.4]
 10%|█         | 30/300 [00:02<00:23, 11.40it/s, failures=0, objective=99.4]
 10%|█         | 31/300 [00:02<00:23, 11.47it/s, failures=0, objective=99.4]
 10%|█         | 31/300 [00:02<00:23, 11.47it/s, failures=0, objective=99.4]
 11%|█         | 32/300 [00:02<00:23, 11.47it/s, failures=0, objective=99.4]
 11%|█         | 33/300 [00:02<00:24, 10.92it/s, failures=0, objective=99.4]
 11%|█         | 33/300 [00:02<00:24, 10.92it/s, failures=0, objective=99.4]
 11%|█▏        | 34/300 [00:02<00:24, 10.92it/s, failures=0, objective=99.4]
 12%|█▏        | 35/300 [00:02<00:24, 10.71it/s, failures=0, objective=99.4]
 12%|█▏        | 35/300 [00:02<00:24, 10.71it/s, failures=0, objective=99.4]
 12%|█▏        | 36/300 [00:03<00:24, 10.71it/s, failures=0, objective=99.4]
 12%|█▏        | 37/300 [00:03<00:23, 11.06it/s, failures=0, objective=99.4]
 12%|█▏        | 37/300 [00:03<00:23, 11.06it/s, failures=0, objective=99.4]
 13%|█▎        | 38/300 [00:03<00:23, 11.06it/s, failures=0, objective=99.4]
 13%|█▎        | 39/300 [00:03<00:24, 10.59it/s, failures=0, objective=99.4]
 13%|█▎        | 39/300 [00:03<00:24, 10.59it/s, failures=0, objective=99.4]
 13%|█▎        | 40/300 [00:03<00:24, 10.59it/s, failures=0, objective=99.4]
 14%|█▎        | 41/300 [00:03<00:24, 10.45it/s, failures=0, objective=99.4]
 14%|█▎        | 41/300 [00:03<00:24, 10.45it/s, failures=0, objective=99.4]
 14%|█▍        | 42/300 [00:03<00:24, 10.45it/s, failures=0, objective=99.4]
 14%|█▍        | 43/300 [00:03<00:25, 10.10it/s, failures=0, objective=99.4]
 14%|█▍        | 43/300 [00:03<00:25, 10.10it/s, failures=0, objective=99.4]
 15%|█▍        | 44/300 [00:03<00:25, 10.10it/s, failures=0, objective=99.4]
 15%|█▌        | 45/300 [00:04<00:26,  9.50it/s, failures=0, objective=99.4]
 15%|█▌        | 45/300 [00:04<00:26,  9.50it/s, failures=0, objective=99.4]
 15%|█▌        | 46/300 [00:04<00:27,  9.15it/s, failures=0, objective=99.4]
 15%|█▌        | 46/300 [00:04<00:27,  9.15it/s, failures=0, objective=99.4]
 16%|█▌        | 47/300 [00:04<00:27,  9.15it/s, failures=0, objective=99.4]
 16%|█▌        | 48/300 [00:04<00:26,  9.67it/s, failures=0, objective=99.4]
 16%|█▌        | 48/300 [00:04<00:26,  9.67it/s, failures=0, objective=99.4]
 16%|█▋        | 49/300 [00:04<00:25,  9.67it/s, failures=0, objective=99.4]
 17%|█▋        | 50/300 [00:04<00:25,  9.81it/s, failures=0, objective=99.4]
 17%|█▋        | 50/300 [00:04<00:25,  9.81it/s, failures=0, objective=99.4]
 17%|█▋        | 51/300 [00:04<00:25,  9.81it/s, failures=0, objective=99.4]
 17%|█▋        | 52/300 [00:04<00:24, 10.17it/s, failures=0, objective=99.4]
 17%|█▋        | 52/300 [00:04<00:24, 10.17it/s, failures=0, objective=99.4]
 18%|█▊        | 53/300 [00:04<00:24, 10.17it/s, failures=0, objective=99.4]
 18%|█▊        | 54/300 [00:04<00:24, 10.05it/s, failures=0, objective=99.4]
 18%|█▊        | 54/300 [00:04<00:24, 10.05it/s, failures=0, objective=99.4]
 18%|█▊        | 55/300 [00:04<00:24, 10.05it/s, failures=0, objective=99.4]
 19%|█▊        | 56/300 [00:05<00:27,  8.74it/s, failures=0, objective=99.4]
 19%|█▊        | 56/300 [00:05<00:27,  8.74it/s, failures=0, objective=99.4]
 19%|█▉        | 57/300 [00:05<00:27,  8.74it/s, failures=0, objective=99.4]
 19%|█▉        | 58/300 [00:05<00:25,  9.45it/s, failures=0, objective=99.4]
 19%|█▉        | 58/300 [00:05<00:25,  9.45it/s, failures=0, objective=99.4]
 20%|█▉        | 59/300 [00:05<00:25,  9.45it/s, failures=0, objective=99.4]
 20%|██        | 60/300 [00:05<00:25,  9.47it/s, failures=0, objective=99.4]
 20%|██        | 60/300 [00:05<00:25,  9.47it/s, failures=0, objective=99.4]
 20%|██        | 61/300 [00:05<00:25,  9.47it/s, failures=0, objective=99.4]
 21%|██        | 62/300 [00:05<00:24,  9.60it/s, failures=0, objective=99.4]
 21%|██        | 62/300 [00:05<00:24,  9.60it/s, failures=0, objective=99.4]
 21%|██        | 63/300 [00:05<00:24,  9.60it/s, failures=0, objective=99.4]
 21%|██▏       | 64/300 [00:06<00:25,  9.44it/s, failures=0, objective=99.4]
 21%|██▏       | 64/300 [00:06<00:25,  9.44it/s, failures=0, objective=99.4]
 22%|██▏       | 65/300 [00:06<00:24,  9.44it/s, failures=0, objective=99.4]
 22%|██▏       | 66/300 [00:06<00:23,  9.84it/s, failures=0, objective=99.4]
 22%|██▏       | 66/300 [00:06<00:23,  9.84it/s, failures=0, objective=99.4]
 22%|██▏       | 67/300 [00:06<00:23,  9.84it/s, failures=0, objective=99.4]
 23%|██▎       | 68/300 [00:06<00:22, 10.36it/s, failures=0, objective=99.4]
 23%|██▎       | 68/300 [00:06<00:22, 10.36it/s, failures=0, objective=99.4]
 23%|██▎       | 69/300 [00:06<00:22, 10.36it/s, failures=0, objective=99.4]
 23%|██▎       | 70/300 [00:06<00:22, 10.24it/s, failures=0, objective=99.4]
 23%|██▎       | 70/300 [00:06<00:22, 10.24it/s, failures=0, objective=99.4]
 24%|██▎       | 71/300 [00:06<00:22, 10.24it/s, failures=0, objective=99.4]
 24%|██▍       | 72/300 [00:06<00:22, 10.36it/s, failures=0, objective=99.4]
 24%|██▍       | 72/300 [00:06<00:22, 10.36it/s, failures=0, objective=99.4]
 24%|██▍       | 73/300 [00:06<00:21, 10.36it/s, failures=0, objective=99.4]
 25%|██▍       | 74/300 [00:06<00:20, 10.97it/s, failures=0, objective=99.4]
 25%|██▍       | 74/300 [00:06<00:20, 10.97it/s, failures=0, objective=99.4]
 25%|██▌       | 75/300 [00:06<00:20, 10.97it/s, failures=0, objective=99.4]
 25%|██▌       | 76/300 [00:07<00:21, 10.60it/s, failures=0, objective=99.4]
 25%|██▌       | 76/300 [00:07<00:21, 10.60it/s, failures=0, objective=99.4]
 26%|██▌       | 77/300 [00:07<00:21, 10.60it/s, failures=0, objective=99.4]
 26%|██▌       | 78/300 [00:07<00:21, 10.41it/s, failures=0, objective=99.4]
 26%|██▌       | 78/300 [00:07<00:21, 10.41it/s, failures=0, objective=99.4]
 26%|██▋       | 79/300 [00:07<00:21, 10.41it/s, failures=0, objective=99.4]
 27%|██▋       | 80/300 [00:07<00:21, 10.20it/s, failures=0, objective=99.4]
 27%|██▋       | 80/300 [00:07<00:21, 10.20it/s, failures=0, objective=99.4]
 27%|██▋       | 81/300 [00:07<00:21, 10.20it/s, failures=0, objective=99.4]
 27%|██▋       | 82/300 [00:07<00:20, 10.58it/s, failures=0, objective=99.4]
 27%|██▋       | 82/300 [00:07<00:20, 10.58it/s, failures=0, objective=99.4]
 28%|██▊       | 83/300 [00:07<00:20, 10.58it/s, failures=0, objective=99.4]
 28%|██▊       | 84/300 [00:07<00:21, 10.00it/s, failures=0, objective=99.4]
 28%|██▊       | 84/300 [00:07<00:21, 10.00it/s, failures=0, objective=99.4]
 28%|██▊       | 85/300 [00:07<00:21, 10.00it/s, failures=0, objective=99.4]
 29%|██▊       | 86/300 [00:08<00:21,  9.75it/s, failures=0, objective=99.4]
 29%|██▊       | 86/300 [00:08<00:21,  9.75it/s, failures=0, objective=99.4]
 29%|██▉       | 87/300 [00:08<00:21,  9.75it/s, failures=0, objective=99.4]
 29%|██▉       | 88/300 [00:08<00:23,  9.10it/s, failures=0, objective=99.4]
 29%|██▉       | 88/300 [00:08<00:23,  9.10it/s, failures=0, objective=99.4]
 30%|██▉       | 89/300 [00:08<00:23,  9.10it/s, failures=0, objective=99.4]
 30%|███       | 90/300 [00:08<00:21,  9.72it/s, failures=0, objective=99.4]
 30%|███       | 90/300 [00:08<00:21,  9.72it/s, failures=0, objective=99.4]
 30%|███       | 91/300 [00:08<00:21,  9.74it/s, failures=0, objective=99.4]
 30%|███       | 91/300 [00:08<00:21,  9.74it/s, failures=0, objective=99.4]
 31%|███       | 92/300 [00:08<00:22,  9.24it/s, failures=0, objective=99.4]
 31%|███       | 92/300 [00:08<00:22,  9.24it/s, failures=0, objective=99.4]
 31%|███       | 93/300 [00:08<00:22,  9.24it/s, failures=0, objective=99.4]
 31%|███▏      | 94/300 [00:09<00:21,  9.44it/s, failures=0, objective=99.4]
 31%|███▏      | 94/300 [00:09<00:21,  9.44it/s, failures=0, objective=99.4]
 32%|███▏      | 95/300 [00:09<00:21,  9.44it/s, failures=0, objective=99.4]
 32%|███▏      | 96/300 [00:09<00:21,  9.54it/s, failures=0, objective=99.4]
 32%|███▏      | 96/300 [00:09<00:21,  9.54it/s, failures=0, objective=99.4]
 32%|███▏      | 97/300 [00:09<00:21,  9.54it/s, failures=0, objective=99.4]
 33%|███▎      | 98/300 [00:09<00:20,  9.88it/s, failures=0, objective=99.4]
 33%|███▎      | 98/300 [00:09<00:20,  9.88it/s, failures=0, objective=99.4]
 33%|███▎      | 99/300 [00:09<00:20,  9.88it/s, failures=0, objective=99.4]
 33%|███▎      | 100/300 [00:09<00:21,  9.37it/s, failures=0, objective=99.4]
 33%|███▎      | 100/300 [00:09<00:21,  9.37it/s, failures=0, objective=99.4]
 34%|███▎      | 101/300 [00:09<00:21,  9.37it/s, failures=0, objective=99.4]
 34%|███▍      | 102/300 [00:09<00:23,  8.33it/s, failures=0, objective=99.4]
 34%|███▍      | 102/300 [00:09<00:23,  8.33it/s, failures=0, objective=99.4]
 34%|███▍      | 103/300 [00:09<00:23,  8.33it/s, failures=0, objective=99.4]
 35%|███▍      | 104/300 [00:10<00:24,  8.00it/s, failures=0, objective=99.4]
 35%|███▍      | 104/300 [00:10<00:24,  8.00it/s, failures=0, objective=99.4]
 35%|███▌      | 105/300 [00:10<00:24,  8.00it/s, failures=0, objective=99.4]
 35%|███▌      | 106/300 [00:10<00:22,  8.79it/s, failures=0, objective=99.4]
 35%|███▌      | 106/300 [00:10<00:22,  8.79it/s, failures=0, objective=99.4]
 36%|███▌      | 107/300 [00:10<00:21,  8.79it/s, failures=0, objective=99.4]
 36%|███▌      | 108/300 [00:10<00:21,  9.06it/s, failures=0, objective=99.4]
 36%|███▌      | 108/300 [00:10<00:21,  9.06it/s, failures=0, objective=99.4]
 36%|███▋      | 109/300 [00:10<00:21,  9.06it/s, failures=0, objective=99.4]
 37%|███▋      | 110/300 [00:10<00:21,  8.64it/s, failures=0, objective=99.4]
 37%|███▋      | 110/300 [00:10<00:21,  8.64it/s, failures=0, objective=99.4]
 37%|███▋      | 111/300 [00:10<00:21,  8.64it/s, failures=0, objective=99.4]
 37%|███▋      | 112/300 [00:11<00:21,  8.77it/s, failures=0, objective=99.4]
 37%|███▋      | 112/300 [00:11<00:21,  8.77it/s, failures=0, objective=99.4]
 38%|███▊      | 113/300 [00:11<00:21,  8.77it/s, failures=0, objective=99.4]
 38%|███▊      | 114/300 [00:11<00:19,  9.64it/s, failures=0, objective=99.4]
 38%|███▊      | 114/300 [00:11<00:19,  9.64it/s, failures=0, objective=99.4]
 38%|███▊      | 115/300 [00:11<00:19,  9.64it/s, failures=0, objective=99.4]
 39%|███▊      | 116/300 [00:11<00:20,  8.87it/s, failures=0, objective=99.4]
 39%|███▊      | 116/300 [00:11<00:20,  8.87it/s, failures=0, objective=99.4]
 39%|███▉      | 117/300 [00:11<00:20,  8.87it/s, failures=0, objective=99.4]
 39%|███▉      | 118/300 [00:11<00:19,  9.12it/s, failures=0, objective=99.4]
 39%|███▉      | 118/300 [00:11<00:19,  9.12it/s, failures=0, objective=99.4]
 40%|███▉      | 119/300 [00:11<00:19,  9.12it/s, failures=0, objective=99.4]
 40%|████      | 120/300 [00:11<00:19,  9.30it/s, failures=0, objective=99.4]
 40%|████      | 120/300 [00:11<00:19,  9.30it/s, failures=0, objective=99.4]
 40%|████      | 121/300 [00:11<00:19,  9.30it/s, failures=0, objective=99.4]
 41%|████      | 122/300 [00:12<00:20,  8.82it/s, failures=0, objective=99.4]
 41%|████      | 122/300 [00:12<00:20,  8.82it/s, failures=0, objective=99.4]
 41%|████      | 123/300 [00:12<00:20,  8.82it/s, failures=0, objective=99.4]
 41%|████▏     | 124/300 [00:12<00:20,  8.56it/s, failures=0, objective=99.4]
 41%|████▏     | 124/300 [00:12<00:20,  8.56it/s, failures=0, objective=99.4]
 42%|████▏     | 125/300 [00:12<00:20,  8.56it/s, failures=0, objective=99.4]
 42%|████▏     | 126/300 [00:12<00:21,  8.23it/s, failures=0, objective=99.4]
 42%|████▏     | 126/300 [00:12<00:21,  8.23it/s, failures=0, objective=99.4]
 42%|████▏     | 127/300 [00:12<00:21,  8.23it/s, failures=0, objective=99.4]
 43%|████▎     | 128/300 [00:12<00:19,  8.61it/s, failures=0, objective=99.4]
 43%|████▎     | 128/300 [00:12<00:19,  8.61it/s, failures=0, objective=99.4]
 43%|████▎     | 129/300 [00:12<00:19,  8.61it/s, failures=0, objective=99.4]
 43%|████▎     | 130/300 [00:13<00:19,  8.91it/s, failures=0, objective=99.4]
 43%|████▎     | 130/300 [00:13<00:19,  8.91it/s, failures=0, objective=99.4]
 44%|████▎     | 131/300 [00:13<00:18,  8.91it/s, failures=0, objective=99.4]
 44%|████▍     | 132/300 [00:13<00:17,  9.52it/s, failures=0, objective=99.4]
 44%|████▍     | 132/300 [00:13<00:17,  9.52it/s, failures=0, objective=99.4]
 44%|████▍     | 133/300 [00:13<00:17,  9.52it/s, failures=0, objective=99.4]
 45%|████▍     | 134/300 [00:13<00:17,  9.73it/s, failures=0, objective=99.4]
 45%|████▍     | 134/300 [00:13<00:17,  9.73it/s, failures=0, objective=99.4]
 45%|████▌     | 135/300 [00:13<00:16,  9.73it/s, failures=0, objective=99.4]
 45%|████▌     | 136/300 [00:13<00:16,  9.93it/s, failures=0, objective=99.4]
 45%|████▌     | 136/300 [00:13<00:16,  9.93it/s, failures=0, objective=99.4]
 46%|████▌     | 137/300 [00:13<00:16,  9.93it/s, failures=0, objective=99.4]
 46%|████▌     | 138/300 [00:13<00:17,  9.29it/s, failures=0, objective=99.4]
 46%|████▌     | 138/300 [00:13<00:17,  9.29it/s, failures=0, objective=99.4]
 46%|████▋     | 139/300 [00:13<00:17,  9.29it/s, failures=0, objective=99.4]
 47%|████▋     | 140/300 [00:14<00:17,  9.34it/s, failures=0, objective=99.4]
 47%|████▋     | 140/300 [00:14<00:17,  9.34it/s, failures=0, objective=99.4]
 47%|████▋     | 141/300 [00:14<00:17,  9.34it/s, failures=0, objective=99.4]
 47%|████▋     | 142/300 [00:14<00:16,  9.40it/s, failures=0, objective=99.4]
 47%|████▋     | 142/300 [00:14<00:16,  9.40it/s, failures=0, objective=99.4]
 48%|████▊     | 143/300 [00:14<00:16,  9.40it/s, failures=0, objective=99.4]
 48%|████▊     | 144/300 [00:14<00:15,  9.88it/s, failures=0, objective=99.4]
 48%|████▊     | 144/300 [00:14<00:15,  9.88it/s, failures=0, objective=99.4]
 48%|████▊     | 145/300 [00:14<00:15,  9.88it/s, failures=0, objective=99.4]
 49%|████▊     | 146/300 [00:14<00:16,  9.56it/s, failures=0, objective=99.4]
 49%|████▊     | 146/300 [00:14<00:16,  9.56it/s, failures=0, objective=99.4]
 49%|████▉     | 147/300 [00:14<00:16,  9.56it/s, failures=0, objective=99.4]
 49%|████▉     | 148/300 [00:14<00:16,  9.39it/s, failures=0, objective=99.4]
 49%|████▉     | 148/300 [00:14<00:16,  9.39it/s, failures=0, objective=99.4]
 50%|████▉     | 149/300 [00:14<00:16,  9.39it/s, failures=0, objective=99.4]
 50%|█████     | 150/300 [00:15<00:16,  9.27it/s, failures=0, objective=99.4]
 50%|█████     | 150/300 [00:15<00:16,  9.27it/s, failures=0, objective=99.4]
 50%|█████     | 151/300 [00:15<00:16,  9.27it/s, failures=0, objective=99.4]
 51%|█████     | 152/300 [00:15<00:16,  9.13it/s, failures=0, objective=99.4]
 51%|█████     | 152/300 [00:15<00:16,  9.13it/s, failures=0, objective=99.4]
 51%|█████     | 153/300 [00:15<00:16,  9.13it/s, failures=0, objective=99.4]
 51%|█████▏    | 154/300 [00:15<00:15,  9.65it/s, failures=0, objective=99.4]
 51%|█████▏    | 154/300 [00:15<00:15,  9.65it/s, failures=0, objective=99.4]
 52%|█████▏    | 155/300 [00:15<00:15,  9.65it/s, failures=0, objective=99.4]
 52%|█████▏    | 156/300 [00:15<00:16,  8.63it/s, failures=0, objective=99.4]
 52%|█████▏    | 156/300 [00:15<00:16,  8.63it/s, failures=0, objective=99.4]
 52%|█████▏    | 157/300 [00:15<00:16,  8.63it/s, failures=0, objective=99.4]
 53%|█████▎    | 158/300 [00:16<00:16,  8.80it/s, failures=0, objective=99.4]
 53%|█████▎    | 158/300 [00:16<00:16,  8.80it/s, failures=0, objective=99.4]
 53%|█████▎    | 159/300 [00:16<00:16,  8.80it/s, failures=0, objective=99.4]
 53%|█████▎    | 160/300 [00:16<00:15,  9.17it/s, failures=0, objective=99.4]
 53%|█████▎    | 160/300 [00:16<00:15,  9.17it/s, failures=0, objective=99.4]
 54%|█████▎    | 161/300 [00:16<00:15,  9.17it/s, failures=0, objective=99.4]
 54%|█████▍    | 162/300 [00:16<00:14,  9.29it/s, failures=0, objective=99.4]
 54%|█████▍    | 162/300 [00:16<00:14,  9.29it/s, failures=0, objective=99.4]
 54%|█████▍    | 163/300 [00:16<00:14,  9.29it/s, failures=0, objective=99.4]
 55%|█████▍    | 164/300 [00:16<00:15,  9.01it/s, failures=0, objective=99.4]
 55%|█████▍    | 164/300 [00:16<00:15,  9.01it/s, failures=0, objective=99.4]
 55%|█████▌    | 165/300 [00:16<00:14,  9.01it/s, failures=0, objective=99.4]
 55%|█████▌    | 166/300 [00:16<00:15,  8.79it/s, failures=0, objective=99.4]
 55%|█████▌    | 166/300 [00:16<00:15,  8.79it/s, failures=0, objective=99.4]
 56%|█████▌    | 167/300 [00:16<00:15,  8.79it/s, failures=0, objective=99.4]
 56%|█████▌    | 168/300 [00:17<00:14,  9.16it/s, failures=0, objective=99.4]
 56%|█████▌    | 168/300 [00:17<00:14,  9.16it/s, failures=0, objective=99.4]
 56%|█████▋    | 169/300 [00:17<00:14,  9.16it/s, failures=0, objective=99.4]
 57%|█████▋    | 170/300 [00:17<00:14,  9.10it/s, failures=0, objective=99.4]
 57%|█████▋    | 170/300 [00:17<00:14,  9.10it/s, failures=0, objective=99.4]
 57%|█████▋    | 171/300 [00:17<00:14,  9.10it/s, failures=0, objective=99.4]
 57%|█████▋    | 172/300 [00:17<00:14,  9.06it/s, failures=0, objective=99.4]
 57%|█████▋    | 172/300 [00:17<00:14,  9.06it/s, failures=0, objective=99.4]
 58%|█████▊    | 173/300 [00:17<00:14,  9.06it/s, failures=0, objective=99.4]
 58%|█████▊    | 174/300 [00:17<00:14,  8.91it/s, failures=0, objective=99.4]
 58%|█████▊    | 174/300 [00:17<00:14,  8.91it/s, failures=0, objective=99.4]
 58%|█████▊    | 175/300 [00:17<00:14,  8.91it/s, failures=0, objective=99.4]
 59%|█████▊    | 176/300 [00:18<00:14,  8.68it/s, failures=0, objective=99.4]
 59%|█████▊    | 176/300 [00:18<00:14,  8.68it/s, failures=0, objective=99.4]
 59%|█████▉    | 177/300 [00:18<00:14,  8.68it/s, failures=0, objective=99.4]
 59%|█████▉    | 178/300 [00:18<00:13,  9.18it/s, failures=0, objective=99.4]
 59%|█████▉    | 178/300 [00:18<00:13,  9.18it/s, failures=0, objective=99.4]
 60%|█████▉    | 179/300 [00:18<00:13,  9.18it/s, failures=0, objective=99.4]
 60%|██████    | 180/300 [00:18<00:12,  9.49it/s, failures=0, objective=99.4]
 60%|██████    | 180/300 [00:18<00:12,  9.49it/s, failures=0, objective=99.4]
 60%|██████    | 181/300 [00:18<00:12,  9.49it/s, failures=0, objective=99.4]
 61%|██████    | 182/300 [00:18<00:13,  8.77it/s, failures=0, objective=99.4]
 61%|██████    | 182/300 [00:18<00:13,  8.77it/s, failures=0, objective=99.4]
 61%|██████    | 183/300 [00:18<00:13,  8.77it/s, failures=0, objective=99.4]
 61%|██████▏   | 184/300 [00:18<00:12,  9.50it/s, failures=0, objective=99.4]
 61%|██████▏   | 184/300 [00:18<00:12,  9.50it/s, failures=0, objective=99.4]
 62%|██████▏   | 185/300 [00:18<00:12,  9.50it/s, failures=0, objective=99.4]
 62%|██████▏   | 186/300 [00:19<00:12,  9.14it/s, failures=0, objective=99.4]
 62%|██████▏   | 186/300 [00:19<00:12,  9.14it/s, failures=0, objective=99.4]
 62%|██████▏   | 187/300 [00:19<00:12,  9.14it/s, failures=0, objective=99.4]
 63%|██████▎   | 188/300 [00:19<00:12,  9.08it/s, failures=0, objective=99.4]
 63%|██████▎   | 188/300 [00:19<00:12,  9.08it/s, failures=0, objective=99.4]
 63%|██████▎   | 189/300 [00:19<00:12,  9.08it/s, failures=0, objective=99.4]
 63%|██████▎   | 190/300 [00:19<00:12,  9.09it/s, failures=0, objective=99.4]
 63%|██████▎   | 190/300 [00:19<00:12,  9.09it/s, failures=0, objective=99.4]
 64%|██████▎   | 191/300 [00:19<00:11,  9.09it/s, failures=0, objective=99.4]
 64%|██████▍   | 192/300 [00:19<00:11,  9.62it/s, failures=0, objective=99.4]
 64%|██████▍   | 192/300 [00:19<00:11,  9.62it/s, failures=0, objective=99.4]
 64%|██████▍   | 193/300 [00:19<00:11,  9.62it/s, failures=0, objective=99.4]
 65%|██████▍   | 194/300 [00:19<00:11,  9.36it/s, failures=0, objective=99.4]
 65%|██████▍   | 194/300 [00:19<00:11,  9.36it/s, failures=0, objective=99.4]
 65%|██████▌   | 195/300 [00:20<00:11,  9.36it/s, failures=0, objective=99.4]
 65%|██████▌   | 196/300 [00:20<00:11,  9.18it/s, failures=0, objective=99.4]
 65%|██████▌   | 196/300 [00:20<00:11,  9.18it/s, failures=0, objective=99.4]
 66%|██████▌   | 197/300 [00:20<00:11,  9.18it/s, failures=0, objective=99.4]
 66%|██████▌   | 198/300 [00:20<00:11,  8.69it/s, failures=0, objective=99.4]
 66%|██████▌   | 198/300 [00:20<00:11,  8.69it/s, failures=0, objective=99.4]
 66%|██████▋   | 199/300 [00:20<00:11,  8.69it/s, failures=0, objective=99.4]
 67%|██████▋   | 200/300 [00:20<00:11,  8.91it/s, failures=0, objective=99.4]
 67%|██████▋   | 200/300 [00:20<00:11,  8.91it/s, failures=0, objective=99.4]
 67%|██████▋   | 201/300 [00:20<00:11,  8.91it/s, failures=0, objective=99.4]
 67%|██████▋   | 202/300 [00:20<00:10,  9.00it/s, failures=0, objective=99.4]
 67%|██████▋   | 202/300 [00:20<00:10,  9.00it/s, failures=0, objective=99.4]
 68%|██████▊   | 203/300 [00:20<00:10,  9.00it/s, failures=0, objective=99.4]
 68%|██████▊   | 204/300 [00:21<00:11,  8.56it/s, failures=0, objective=99.4]
 68%|██████▊   | 204/300 [00:21<00:11,  8.56it/s, failures=0, objective=99.4]
 68%|██████▊   | 205/300 [00:21<00:11,  8.56it/s, failures=0, objective=99.4]
 69%|██████▊   | 206/300 [00:21<00:10,  8.81it/s, failures=0, objective=99.4]
 69%|██████▊   | 206/300 [00:21<00:10,  8.81it/s, failures=0, objective=99.4]
 69%|██████▉   | 207/300 [00:21<00:10,  8.81it/s, failures=0, objective=99.4]
 69%|██████▉   | 208/300 [00:21<00:10,  9.19it/s, failures=0, objective=99.4]
 69%|██████▉   | 208/300 [00:21<00:10,  9.19it/s, failures=0, objective=99.4]
 70%|██████▉   | 209/300 [00:21<00:09,  9.19it/s, failures=0, objective=99.4]
 70%|███████   | 210/300 [00:21<00:09,  9.29it/s, failures=0, objective=99.4]
 70%|███████   | 210/300 [00:21<00:09,  9.29it/s, failures=0, objective=99.4]
 70%|███████   | 211/300 [00:21<00:09,  9.29it/s, failures=0, objective=99.4]
 71%|███████   | 212/300 [00:22<00:09,  9.16it/s, failures=0, objective=99.4]
 71%|███████   | 212/300 [00:22<00:09,  9.16it/s, failures=0, objective=99.4]
 71%|███████   | 213/300 [00:22<00:09,  9.16it/s, failures=0, objective=99.4]
 71%|███████▏  | 214/300 [00:22<00:09,  9.08it/s, failures=0, objective=99.4]
 71%|███████▏  | 214/300 [00:22<00:09,  9.08it/s, failures=0, objective=99.4]
 72%|███████▏  | 215/300 [00:22<00:09,  9.08it/s, failures=0, objective=99.4]
 72%|███████▏  | 216/300 [00:22<00:08,  9.40it/s, failures=0, objective=99.4]
 72%|███████▏  | 216/300 [00:22<00:08,  9.40it/s, failures=0, objective=99.4]
 72%|███████▏  | 217/300 [00:22<00:08,  9.40it/s, failures=0, objective=99.4]
 73%|███████▎  | 218/300 [00:22<00:09,  9.08it/s, failures=0, objective=99.4]
 73%|███████▎  | 218/300 [00:22<00:09,  9.08it/s, failures=0, objective=99.4]
 73%|███████▎  | 219/300 [00:22<00:08,  9.08it/s, failures=0, objective=99.4]
 73%|███████▎  | 220/300 [00:22<00:08,  9.42it/s, failures=0, objective=99.4]
 73%|███████▎  | 220/300 [00:22<00:08,  9.42it/s, failures=0, objective=99.4]
 74%|███████▎  | 221/300 [00:22<00:08,  9.42it/s, failures=0, objective=99.4]
 74%|███████▍  | 222/300 [00:23<00:09,  8.61it/s, failures=0, objective=99.4]
 74%|███████▍  | 222/300 [00:23<00:09,  8.61it/s, failures=0, objective=99.4]
 74%|███████▍  | 223/300 [00:23<00:08,  8.61it/s, failures=0, objective=99.4]
 75%|███████▍  | 224/300 [00:23<00:10,  6.92it/s, failures=0, objective=99.4]
 75%|███████▍  | 224/300 [00:23<00:10,  6.92it/s, failures=0, objective=99.4]
 75%|███████▌  | 225/300 [00:23<00:11,  6.27it/s, failures=0, objective=99.4]
 75%|███████▌  | 225/300 [00:23<00:11,  6.27it/s, failures=0, objective=99.4]
 75%|███████▌  | 226/300 [00:23<00:11,  6.51it/s, failures=0, objective=99.4]
 75%|███████▌  | 226/300 [00:23<00:11,  6.51it/s, failures=0, objective=99.4]
 76%|███████▌  | 227/300 [00:23<00:11,  6.51it/s, failures=0, objective=99.4]
 76%|███████▌  | 228/300 [00:24<00:09,  7.49it/s, failures=0, objective=99.4]
 76%|███████▌  | 228/300 [00:24<00:09,  7.49it/s, failures=0, objective=99.4]
 76%|███████▋  | 229/300 [00:24<00:09,  7.49it/s, failures=0, objective=99.4]
 77%|███████▋  | 230/300 [00:24<00:08,  7.81it/s, failures=0, objective=99.4]
 77%|███████▋  | 230/300 [00:24<00:08,  7.81it/s, failures=0, objective=99.4]
 77%|███████▋  | 231/300 [00:24<00:08,  7.81it/s, failures=0, objective=99.4]
 77%|███████▋  | 232/300 [00:24<00:08,  7.77it/s, failures=0, objective=99.4]
 77%|███████▋  | 232/300 [00:24<00:08,  7.77it/s, failures=0, objective=99.4]
 78%|███████▊  | 233/300 [00:24<00:08,  7.77it/s, failures=0, objective=99.4]
 78%|███████▊  | 234/300 [00:24<00:08,  8.06it/s, failures=0, objective=99.4]
 78%|███████▊  | 234/300 [00:24<00:08,  8.06it/s, failures=0, objective=99.4]
 78%|███████▊  | 235/300 [00:24<00:08,  8.06it/s, failures=0, objective=99.4]
 79%|███████▊  | 236/300 [00:25<00:08,  7.69it/s, failures=0, objective=99.4]
 79%|███████▊  | 236/300 [00:25<00:08,  7.69it/s, failures=0, objective=99.4]
 79%|███████▉  | 237/300 [00:25<00:08,  7.69it/s, failures=0, objective=99.4]
 79%|███████▉  | 238/300 [00:25<00:07,  8.09it/s, failures=0, objective=99.4]
 79%|███████▉  | 238/300 [00:25<00:07,  8.09it/s, failures=0, objective=99.4]
 80%|███████▉  | 239/300 [00:25<00:07,  8.09it/s, failures=0, objective=99.4]
 80%|████████  | 240/300 [00:25<00:07,  8.47it/s, failures=0, objective=99.4]
 80%|████████  | 240/300 [00:25<00:07,  8.47it/s, failures=0, objective=99.4]
 80%|████████  | 241/300 [00:25<00:06,  8.47it/s, failures=0, objective=99.4]
 81%|████████  | 242/300 [00:25<00:06,  8.56it/s, failures=0, objective=99.4]
 81%|████████  | 242/300 [00:25<00:06,  8.56it/s, failures=0, objective=99.4]
 81%|████████  | 243/300 [00:25<00:06,  8.56it/s, failures=0, objective=99.4]
 81%|████████▏ | 244/300 [00:26<00:06,  8.46it/s, failures=0, objective=99.4]
 81%|████████▏ | 244/300 [00:26<00:06,  8.46it/s, failures=0, objective=99.4]
 82%|████████▏ | 245/300 [00:26<00:06,  8.46it/s, failures=0, objective=99.4]
 82%|████████▏ | 246/300 [00:26<00:06,  8.35it/s, failures=0, objective=99.4]
 82%|████████▏ | 246/300 [00:26<00:06,  8.35it/s, failures=0, objective=99.4]
 82%|████████▏ | 247/300 [00:26<00:06,  8.35it/s, failures=0, objective=99.4]
 83%|████████▎ | 248/300 [00:26<00:05,  9.05it/s, failures=0, objective=99.4]
 83%|████████▎ | 248/300 [00:26<00:05,  9.05it/s, failures=0, objective=99.4]
 83%|████████▎ | 249/300 [00:26<00:05,  9.05it/s, failures=0, objective=99.4]
 83%|████████▎ | 250/300 [00:26<00:05,  9.15it/s, failures=0, objective=99.4]
 83%|████████▎ | 250/300 [00:26<00:05,  9.15it/s, failures=0, objective=99.4]
 84%|████████▎ | 251/300 [00:26<00:05,  9.15it/s, failures=0, objective=99.4]
 84%|████████▍ | 252/300 [00:26<00:04,  9.73it/s, failures=0, objective=99.4]
 84%|████████▍ | 252/300 [00:26<00:04,  9.73it/s, failures=0, objective=99.4]
 84%|████████▍ | 253/300 [00:26<00:04,  9.73it/s, failures=0, objective=99.4]
 85%|████████▍ | 254/300 [00:27<00:04,  9.83it/s, failures=0, objective=99.4]
 85%|████████▍ | 254/300 [00:27<00:04,  9.83it/s, failures=0, objective=99.4]
 85%|████████▌ | 255/300 [00:27<00:04,  9.83it/s, failures=0, objective=99.4]
 85%|████████▌ | 256/300 [00:27<00:04,  9.66it/s, failures=0, objective=99.4]
 85%|████████▌ | 256/300 [00:27<00:04,  9.66it/s, failures=0, objective=99.4]
 86%|████████▌ | 257/300 [00:27<00:04,  9.66it/s, failures=0, objective=99.4]
 86%|████████▌ | 258/300 [00:27<00:04,  9.16it/s, failures=0, objective=99.4]
 86%|████████▌ | 258/300 [00:27<00:04,  9.16it/s, failures=0, objective=99.4]
 86%|████████▋ | 259/300 [00:27<00:04,  9.16it/s, failures=0, objective=99.4]
 87%|████████▋ | 260/300 [00:27<00:04,  9.10it/s, failures=0, objective=99.4]
 87%|████████▋ | 260/300 [00:27<00:04,  9.10it/s, failures=0, objective=99.4]
 87%|████████▋ | 261/300 [00:27<00:04,  9.10it/s, failures=0, objective=99.4]
 87%|████████▋ | 262/300 [00:27<00:04,  9.38it/s, failures=0, objective=99.4]
 87%|████████▋ | 262/300 [00:27<00:04,  9.38it/s, failures=0, objective=99.4]
 88%|████████▊ | 263/300 [00:27<00:03,  9.38it/s, failures=0, objective=99.4]
 88%|████████▊ | 264/300 [00:28<00:03,  9.37it/s, failures=0, objective=99.4]
 88%|████████▊ | 264/300 [00:28<00:03,  9.37it/s, failures=0, objective=99.4]
 88%|████████▊ | 265/300 [00:28<00:03,  9.37it/s, failures=0, objective=99.4]
 89%|████████▊ | 266/300 [00:28<00:03,  8.95it/s, failures=0, objective=99.4]
 89%|████████▊ | 266/300 [00:28<00:03,  8.95it/s, failures=0, objective=99.4]
 89%|████████▉ | 267/300 [00:28<00:03,  8.95it/s, failures=0, objective=99.4]
 89%|████████▉ | 268/300 [00:28<00:03,  9.68it/s, failures=0, objective=99.4]
 89%|████████▉ | 268/300 [00:28<00:03,  9.68it/s, failures=0, objective=99.4]
 90%|████████▉ | 269/300 [00:28<00:03,  9.68it/s, failures=0, objective=99.4]
 90%|█████████ | 270/300 [00:28<00:03,  9.10it/s, failures=0, objective=99.4]
 90%|█████████ | 270/300 [00:28<00:03,  9.10it/s, failures=0, objective=99.4]
 90%|█████████ | 271/300 [00:28<00:03,  9.10it/s, failures=0, objective=99.4]
 91%|█████████ | 272/300 [00:29<00:03,  7.46it/s, failures=0, objective=99.4]
 91%|█████████ | 272/300 [00:29<00:03,  7.46it/s, failures=0, objective=99.4]
 91%|█████████ | 273/300 [00:29<00:03,  7.46it/s, failures=0, objective=99.4]
 91%|█████████▏| 274/300 [00:29<00:03,  7.53it/s, failures=0, objective=99.4]
 91%|█████████▏| 274/300 [00:29<00:03,  7.53it/s, failures=0, objective=99.4]
 92%|█████████▏| 275/300 [00:29<00:03,  7.53it/s, failures=0, objective=99.4]
 92%|█████████▏| 276/300 [00:29<00:02,  8.14it/s, failures=0, objective=99.4]
 92%|█████████▏| 276/300 [00:29<00:02,  8.14it/s, failures=0, objective=99.4]
 92%|█████████▏| 277/300 [00:29<00:02,  8.14it/s, failures=0, objective=99.4]
 93%|█████████▎| 278/300 [00:29<00:02,  7.64it/s, failures=0, objective=99.4]
 93%|█████████▎| 278/300 [00:29<00:02,  7.64it/s, failures=0, objective=99.4]
 93%|█████████▎| 279/300 [00:29<00:02,  7.64it/s, failures=0, objective=99.4]
 93%|█████████▎| 280/300 [00:30<00:02,  7.92it/s, failures=0, objective=99.4]
 93%|█████████▎| 280/300 [00:30<00:02,  7.92it/s, failures=0, objective=99.4]
 94%|█████████▎| 281/300 [00:30<00:02,  7.92it/s, failures=0, objective=99.4]
 94%|█████████▍| 282/300 [00:30<00:02,  7.90it/s, failures=0, objective=99.4]
 94%|█████████▍| 282/300 [00:30<00:02,  7.90it/s, failures=0, objective=99.4]
 94%|█████████▍| 283/300 [00:30<00:02,  7.90it/s, failures=0, objective=99.4]
 95%|█████████▍| 284/300 [00:30<00:01,  8.25it/s, failures=0, objective=99.4]
 95%|█████████▍| 284/300 [00:30<00:01,  8.25it/s, failures=0, objective=99.4]
 95%|█████████▌| 285/300 [00:30<00:01,  8.25it/s, failures=0, objective=99.4]
 95%|█████████▌| 286/300 [00:30<00:01,  7.47it/s, failures=0, objective=99.4]
 95%|█████████▌| 286/300 [00:30<00:01,  7.47it/s, failures=0, objective=99.4]
 96%|█████████▌| 287/300 [00:31<00:01,  7.47it/s, failures=0, objective=99.4]
 96%|█████████▌| 288/300 [00:31<00:01,  8.27it/s, failures=0, objective=99.4]
 96%|█████████▌| 288/300 [00:31<00:01,  8.27it/s, failures=0, objective=99.4]
 96%|█████████▋| 289/300 [00:31<00:01,  8.27it/s, failures=0, objective=99.4]
 97%|█████████▋| 290/300 [00:31<00:01,  8.38it/s, failures=0, objective=99.4]
 97%|█████████▋| 290/300 [00:31<00:01,  8.38it/s, failures=0, objective=99.4]
 97%|█████████▋| 291/300 [00:31<00:01,  8.38it/s, failures=0, objective=99.4]
 97%|█████████▋| 292/300 [00:31<00:00,  8.63it/s, failures=0, objective=99.4]
 97%|█████████▋| 292/300 [00:31<00:00,  8.63it/s, failures=0, objective=99.4]
 98%|█████████▊| 293/300 [00:31<00:00,  8.63it/s, failures=0, objective=99.4]
 98%|█████████▊| 294/300 [00:31<00:00,  8.87it/s, failures=0, objective=99.4]
 98%|█████████▊| 294/300 [00:31<00:00,  8.87it/s, failures=0, objective=99.4]
 98%|█████████▊| 295/300 [00:31<00:00,  8.87it/s, failures=0, objective=99.4]
 99%|█████████▊| 296/300 [00:32<00:00,  8.61it/s, failures=0, objective=99.4]
 99%|█████████▊| 296/300 [00:32<00:00,  8.61it/s, failures=0, objective=99.4]
 99%|█████████▉| 297/300 [00:32<00:00,  8.61it/s, failures=0, objective=99.4]
 99%|█████████▉| 298/300 [00:32<00:00,  7.96it/s, failures=0, objective=99.4]
 99%|█████████▉| 298/300 [00:32<00:00,  7.96it/s, failures=0, objective=99.4]
100%|█████████▉| 299/300 [00:32<00:00,  7.96it/s, failures=0, objective=99.4]
100%|██████████| 300/300 [00:32<00:00,  8.33it/s, failures=0, objective=99.4]
100%|██████████| 300/300 [00:32<00:00,  8.33it/s, failures=0, objective=99.4]
100%|██████████| 300/300 [00:32<00:00,  9.21it/s, failures=0, objective=99.4]
p:x p:y objective job_id job_status m:timestamp_submit m:timestamp_gather
0 -0.305958 0.912106 0.925547 0 DONE 0.035106 0.035407
1 -6.820836 1.816490 49.823445 1 DONE 0.101091 0.101396
2 -4.840870 3.503860 35.711064 2 DONE 0.123162 0.123370
3 0.088796 -2.283004 5.219990 3 DONE 0.145206 0.145405
4 2.684667 -5.163577 33.869963 4 DONE 0.208886 0.209121
... ... ... ... ... ... ... ...
295 -1.039183 -8.137491 67.298654 295 DONE 32.092250 32.092437
296 1.625939 2.803522 10.503414 296 DONE 32.177547 32.177734
297 8.500303 1.130088 73.532245 297 DONE 32.387930 32.388125
298 -6.364424 -1.098310 41.712184 298 DONE 32.424693 32.424850
299 -3.280660 6.682292 55.415752 299 DONE 32.602325 32.602513

300 rows × 7 columns



Extracting the Best Parameters#

To recover the parameters corresponding to the best observed objective value, we can use deephyper.analysis.hpo.parameters_at_max().

parameters, objective = parameters_at_max(results)
print("\nOptimum values")
print(f"x: {parameters['x']:.3f}, y: {parameters['y']:.2f}")
print("objective:", objective)
Optimum values
x: -9.970, y: 0.02
objective: 99.40231418419825

Visualizing the Search Trajectory#

We plot the evolution of the best objective value to verify that optimization progresses correctly toward the maximum \(100\).

We clearly see the periodic exploration/exploitation effect of the scheduler.

Search Trajectory

Visualizing the Feasible Region and Evaluations#

We now plot all evaluated points in the (x, y) plane, color-coded by objective value, along with the constraint boundary x + y = 10.

fig, ax = plt.subplots(figsize=(WIDTH_PLOTS, HEIGHT_PLOTS))
item = ax.scatter(results["p:x"], results["p:y"], c=results["objective"], label="Evaluations")
ax.plot([0, 10], [10, 0], "r:")
ax.plot([0, 10], [-10, 0], "r:")
ax.plot([-10, 0], [0, -10], "r:")
ax.plot([0, -10], [10, 0], "r:", label="Constraint")
ax.set_xlabel(r"$x$")
ax.set_ylabel(r"$y$")
ax.set_xlim(-10, 10)
ax.set_ylim(-10, 10)
ax.legend()
ax.grid()
ax.grid(which="minor", linestyle=":")
cb = plt.colorbar(item)
cb.set_label(r"Objective")
plot constrained black box optimization

Total running time of the script: (0 minutes 33.894 seconds)

Gallery generated by Sphinx-Gallery