
.. DO NOT EDIT.
.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY.
.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE:
.. "examples/examples_bbo/plot_constrained_black_box_optimization.py"
.. LINE NUMBERS ARE GIVEN BELOW.

.. only:: html

    .. note::
        :class: sphx-glr-download-link-note

        :ref:`Go to the end <sphx_glr_download_examples_examples_bbo_plot_constrained_black_box_optimization.py>`
        to download the full example code.

.. rst-class:: sphx-glr-example-title

.. _sphx_glr_examples_examples_bbo_plot_constrained_black_box_optimization.py:


Constrained Black-Box Optimization with Rejection Sampling
==========================================================

**Author(s)**: Romain Egele.

In this tutorial, we illustrate how to solve constrained `black-box optimization (Wikipedia) <https://en.wikipedia.org/wiki/Derivative-free_optimization>`_ (also known as derivative-free optimization) using DeepHyper.

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

#. 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.
#. Learning to avoid failures (see :ref:`Learn to Avoid Failures with Bayesian Optimization <sphx_glr_examples_examples_bbo_plot_notify_failures_hpo.py>`).
#. Define the constraint as an other objective in a multi-objective optimization setup (tutorial coming soon).
#. Custom chained sampler (tutorial coming soon).

.. GENERATED FROM PYTHON SOURCE LINES 24-32

.. code-block:: Python


    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








.. GENERATED FROM PYTHON SOURCE LINES 33-36

Optimization Problem
--------------------
We define a 2D search space over variables ``x`` and ``y``.

.. GENERATED FROM PYTHON SOURCE LINES 36-54

.. code-block:: Python


    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)








.. GENERATED FROM PYTHON SOURCE LINES 55-57

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

.. GENERATED FROM PYTHON SOURCE LINES 57-71

.. code-block:: Python


    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)





.. rst-class:: sphx-glr-script-out

 .. code-block:: none

    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]




.. GENERATED FROM PYTHON SOURCE LINES 72-74

.. code-block:: Python

    results






.. raw:: html

    <div class="output_subarea output_html rendered_html output_result">
    <div>
    <style scoped>
        .dataframe tbody tr th:only-of-type {
            vertical-align: middle;
        }

        .dataframe tbody tr th {
            vertical-align: top;
        }

        .dataframe thead th {
            text-align: right;
        }
    </style>
    <table border="1" class="dataframe">
      <thead>
        <tr style="text-align: right;">
          <th></th>
          <th>p:x</th>
          <th>p:y</th>
          <th>objective</th>
          <th>job_id</th>
          <th>job_status</th>
          <th>m:timestamp_submit</th>
          <th>m:timestamp_gather</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <th>0</th>
          <td>-0.305958</td>
          <td>0.912106</td>
          <td>0.925547</td>
          <td>0</td>
          <td>DONE</td>
          <td>0.035106</td>
          <td>0.035407</td>
        </tr>
        <tr>
          <th>1</th>
          <td>-6.820836</td>
          <td>1.816490</td>
          <td>49.823445</td>
          <td>1</td>
          <td>DONE</td>
          <td>0.101091</td>
          <td>0.101396</td>
        </tr>
        <tr>
          <th>2</th>
          <td>-4.840870</td>
          <td>3.503860</td>
          <td>35.711064</td>
          <td>2</td>
          <td>DONE</td>
          <td>0.123162</td>
          <td>0.123370</td>
        </tr>
        <tr>
          <th>3</th>
          <td>0.088796</td>
          <td>-2.283004</td>
          <td>5.219990</td>
          <td>3</td>
          <td>DONE</td>
          <td>0.145206</td>
          <td>0.145405</td>
        </tr>
        <tr>
          <th>4</th>
          <td>2.684667</td>
          <td>-5.163577</td>
          <td>33.869963</td>
          <td>4</td>
          <td>DONE</td>
          <td>0.208886</td>
          <td>0.209121</td>
        </tr>
        <tr>
          <th>...</th>
          <td>...</td>
          <td>...</td>
          <td>...</td>
          <td>...</td>
          <td>...</td>
          <td>...</td>
          <td>...</td>
        </tr>
        <tr>
          <th>295</th>
          <td>-1.039183</td>
          <td>-8.137491</td>
          <td>67.298654</td>
          <td>295</td>
          <td>DONE</td>
          <td>32.092250</td>
          <td>32.092437</td>
        </tr>
        <tr>
          <th>296</th>
          <td>1.625939</td>
          <td>2.803522</td>
          <td>10.503414</td>
          <td>296</td>
          <td>DONE</td>
          <td>32.177547</td>
          <td>32.177734</td>
        </tr>
        <tr>
          <th>297</th>
          <td>8.500303</td>
          <td>1.130088</td>
          <td>73.532245</td>
          <td>297</td>
          <td>DONE</td>
          <td>32.387930</td>
          <td>32.388125</td>
        </tr>
        <tr>
          <th>298</th>
          <td>-6.364424</td>
          <td>-1.098310</td>
          <td>41.712184</td>
          <td>298</td>
          <td>DONE</td>
          <td>32.424693</td>
          <td>32.424850</td>
        </tr>
        <tr>
          <th>299</th>
          <td>-3.280660</td>
          <td>6.682292</td>
          <td>55.415752</td>
          <td>299</td>
          <td>DONE</td>
          <td>32.602325</td>
          <td>32.602513</td>
        </tr>
      </tbody>
    </table>
    <p>300 rows × 7 columns</p>
    </div>
    </div>
    <br />
    <br />

.. GENERATED FROM PYTHON SOURCE LINES 75-79

Extracting the Best Parameters
------------------------------
To recover the parameters corresponding to the best observed objective value,
we can use :func:`deephyper.analysis.hpo.parameters_at_max`.

.. GENERATED FROM PYTHON SOURCE LINES 79-85

.. code-block:: Python


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





.. rst-class:: sphx-glr-script-out

 .. code-block:: none


    Optimum values
    x: -9.970, y: 0.02
    objective: 99.40231418419825




.. GENERATED FROM PYTHON SOURCE LINES 86-92

Visualizing the Search Trajectory
---------------------------------
We plot the evolution of the best objective value to verify that optimization
progresses correctly toward the maximum :math:`100`.

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

.. GENERATED FROM PYTHON SOURCE LINES 92-100

.. code-block:: Python


    WIDTH_PLOTS = 8
    HEIGHT_PLOTS = WIDTH_PLOTS / 1.618

    fig, ax = plt.subplots(figsize=(WIDTH_PLOTS, HEIGHT_PLOTS))
    plot_search_trajectory_single_objective_hpo(results, mode="max", ax=ax)
    _ = plt.title("Search Trajectory")




.. image-sg:: /examples/examples_bbo/images/sphx_glr_plot_constrained_black_box_optimization_001.png
   :alt: Search Trajectory
   :srcset: /examples/examples_bbo/images/sphx_glr_plot_constrained_black_box_optimization_001.png
   :class: sphx-glr-single-img





.. GENERATED FROM PYTHON SOURCE LINES 101-105

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``.

.. GENERATED FROM PYTHON SOURCE LINES 105-121

.. code-block:: Python



    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")


.. image-sg:: /examples/examples_bbo/images/sphx_glr_plot_constrained_black_box_optimization_002.png
   :alt: plot constrained black box optimization
   :srcset: /examples/examples_bbo/images/sphx_glr_plot_constrained_black_box_optimization_002.png
   :class: sphx-glr-single-img






.. rst-class:: sphx-glr-timing

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


.. _sphx_glr_download_examples_examples_bbo_plot_constrained_black_box_optimization.py:

.. only:: html

  .. container:: sphx-glr-footer sphx-glr-footer-example

    .. container:: sphx-glr-download sphx-glr-download-jupyter

      :download:`Download Jupyter notebook: plot_constrained_black_box_optimization.ipynb <plot_constrained_black_box_optimization.ipynb>`

    .. container:: sphx-glr-download sphx-glr-download-python

      :download:`Download Python source code: plot_constrained_black_box_optimization.py <plot_constrained_black_box_optimization.py>`

    .. container:: sphx-glr-download sphx-glr-download-zip

      :download:`Download zipped: plot_constrained_black_box_optimization.zip <plot_constrained_black_box_optimization.zip>`


.. only:: html

 .. rst-class:: sphx-glr-signature

    `Gallery generated by Sphinx-Gallery <https://sphinx-gallery.github.io>`_
