Your first Bayesian optimization with Blop#

In this tutorial, you will learn the three core concepts of Blop: DOFs (the parameters you can adjust), objectives (what you want to optimize), and the Agent (which coordinates the optimization). We’ll optimize a simple mathematical function using simulated devices—the same patterns apply to real hardware.

Setup#

First, let’s import what we need and start the data infrastructure:

import logging
import time
from typing import Any

from blop.ax import Agent, RangeDOF, Objective

from bluesky.protocols import NamedMovable, Readable, Status, Hints, HasHints, HasParent
from bluesky.run_engine import RunEngine
from bluesky_tiled_plugins import TiledWriter
from tiled.client import from_uri
from tiled.client.container import Container
from tiled.server import SimpleTiledServer

# Suppress noisy logs from httpx 
logging.getLogger("httpx").setLevel(logging.WARNING)
[WARNING 04-19 07:10:30] ax.storage.sqa_store.with_db_settings_base: Ax currently requires a sqlalchemy version below 2.0. This will be addressed in a future release. Disabling SQL storage in Ax for now, if you would like to use SQL storage please install Ax with mysql extras via `pip install ax-platform[mysql]`.
# Start a local Tiled server for data storage
tiled_server = SimpleTiledServer()

# Set up the Bluesky RunEngine and connect it to Tiled
RE = RunEngine({})
tiled_client = from_uri(tiled_server.uri)
tiled_writer = TiledWriter(tiled_client)
RE.subscribe(tiled_writer)
Tiled version 0.2.9
0

Creating simulated devices#

Bluesky controls devices through protocols. For this tutorial, we create simple simulated “movable” devices. In real experiments, you would use Ophyd devices or similar—the code below is just boilerplate to simulate hardware:

class AlwaysSuccessfulStatus(Status):
    def add_callback(self, callback) -> None:
        callback(self)
    def exception(self, timeout = 0.0):
        return None
    @property
    def done(self) -> bool:
        return True
    @property
    def success(self) -> bool:
        return True

class ReadableSignal(Readable, HasHints, HasParent):
    def __init__(self, name: str) -> None:
        self._name = name
        self._value = 0.0
    @property
    def name(self) -> str:
        return self._name
    @property
    def hints(self) -> Hints:
        return {"fields": [self._name], "dimensions": [], "gridding": "rectilinear"}
    @property
    def parent(self) -> Any | None:
        return None
    def read(self):
        return {self._name: {"value": self._value, "timestamp": time.time()}}
    def describe(self):
        return {self._name: {"source": self._name, "dtype": "number", "shape": []}}

class MovableSignal(ReadableSignal, NamedMovable):
    def __init__(self, name: str, initial_value: float = 0.0) -> None:
        super().__init__(name)
        self._value: float = initial_value
    def set(self, value: float) -> Status:
        self._value = value
        return AlwaysSuccessfulStatus()

Defining DOFs and objectives#

DOFs (degrees of freedom) are the parameters the optimizer can adjust. Objectives are what you want to optimize. Here we define two DOFs (x1 and x2) that can range from -5 to 5, and one objective (the Himmelblau function) that we want to minimize:

x1 = MovableSignal("x1", initial_value=0.1)
x2 = MovableSignal("x2", initial_value=0.23)

dofs = [
    RangeDOF(actuator=x1, bounds=(-5, 5), parameter_type="float"),
    RangeDOF(actuator=x2, bounds=(-5, 5), parameter_type="float"),
]
objectives = [
    Objective(name="himmelblau_2d", minimize=True),
]
sensors = []

Writing the evaluation function#

The evaluation function computes objective values from experimental data. After each run, Blop calls this function with the run’s unique ID and the suggestions that were tried. It returns the computed objective values:

class Himmelblau2DEvaluation():
    def __init__(self, tiled_client: Container):
        self.tiled_client = tiled_client

    def __call__(self, uid: str, suggestions: list[dict]) -> list[dict]:
        run = self.tiled_client[uid]
        outcomes = []
        x1_data = run["primary/x1"].read()
        x2_data = run["primary/x2"].read()

        for suggestion in suggestions:
            suggestion_id = suggestion["_id"]
            x1 = x1_data[suggestion_id % len(x1_data)]
            x2 = x2_data[suggestion_id % len(x2_data)]
            # Himmelblau function: has four global minima where value = 0
            outcomes.append({
                "himmelblau_2d": (x1 ** 2 + x2 - 11) ** 2 + (x1 + x2 ** 2 - 7) ** 2,
                "_id": suggestion_id
            })
        
        return outcomes

Running the optimization#

The Agent brings everything together. Create one with your DOFs, objectives, and evaluation function, then run the optimization:

agent = Agent(
    sensors=sensors,
    dofs=dofs,
    objectives=objectives,
    evaluation_function=Himmelblau2DEvaluation(tiled_client=tiled_client),
    name="simple-experiment",
    description="A simple experiment optimizing the Himmelblau function",
)

RE(agent.optimize(30))

╭───────────────────────────────────────────────── Optimization ──────────────────────────────────────────────────╮
 Optimizer  AxOptimizer                                                                                          
 Actuators  x1, x2                                                                                               
 Sensors    N/A                                                                                                  
 Iterations 30                                                                                                   
 Run UID    549dbbdc-4df7-4dc8-a98a-3c488870dc74                                                                 
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
[INFO 04-19 07:10:35] ax.api.client: GenerationStrategy(name='Center+Sobol+MBM:fast', nodes=[CenterGenerationNode(next_node_name='Sobol'), GenerationNode(name='Sobol', generator_specs=[GeneratorSpec(generator_enum=Sobol, generator_key_override=None)], transition_criteria=[MinTrials(transition_to='MBM'), MinTrials(transition_to='MBM')], suggested_experiment_status=ExperimentStatus.INITIALIZATION, pausing_criteria=[MaxTrialsAwaitingData(threshold=5)]), GenerationNode(name='MBM', generator_specs=[GeneratorSpec(generator_enum=BoTorch, generator_key_override=None)], transition_criteria=None, suggested_experiment_status=ExperimentStatus.OPTIMIZATION, pausing_criteria=None)]) chosen based on user input and problem structure.
[INFO 04-19 07:10:35] ax.api.client: Generated new trial 0 with parameters {'x1': 0.0, 'x2': 0.0} using GenerationNode CenterOfSearchSpace.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:35] ax.api.client: Trial 0 marked COMPLETED.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:35] ax.api.client: Generated new trial 1 with parameters {'x1': -1.46277, 'x2': -0.305821} using GenerationNode Sobol.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:36] ax.api.client: Trial 1 marked COMPLETED.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:36] ax.api.client: Generated new trial 2 with parameters {'x1': 0.172018, 'x2': 1.804107} using GenerationNode Sobol.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:36] ax.api.client: Trial 2 marked COMPLETED.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:36] ax.api.client: Generated new trial 3 with parameters {'x1': 3.342968, 'x2': -4.777821} using GenerationNode Sobol.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:36] ax.api.client: Trial 3 marked COMPLETED.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:36] ax.api.client: Generated new trial 4 with parameters {'x1': -4.550976, 'x2': 3.26976} using GenerationNode Sobol.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:37] ax.api.client: Trial 4 marked COMPLETED.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:37] ax.api.client: Generated new trial 5 with parameters {'x1': 1.994311, 'x2': 2.040236} using GenerationNode MBM.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:37] ax.api.client: Trial 5 marked COMPLETED.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:38] ax.api.client: Generated new trial 6 with parameters {'x1': 3.258101, 'x2': 2.56765} using GenerationNode MBM.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:38] ax.api.client: Trial 6 marked COMPLETED.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:38] ax.api.client: Generated new trial 7 with parameters {'x1': 2.283576, 'x2': 4.090999} using GenerationNode MBM.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:39] ax.api.client: Trial 7 marked COMPLETED.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:39] ax.api.client: Generated new trial 8 with parameters {'x1': 5.0, 'x2': 1.936674} using GenerationNode MBM.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:39] ax.api.client: Trial 8 marked COMPLETED.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:40] ax.api.client: Generated new trial 9 with parameters {'x1': 2.579135, 'x2': 2.61432} using GenerationNode MBM.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:40] ax.api.client: Trial 9 marked COMPLETED.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:40] ax.api.client: Generated new trial 10 with parameters {'x1': 2.808129, 'x2': 1.997349} using GenerationNode MBM.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:40] ax.api.client: Trial 10 marked COMPLETED.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:41] ax.api.client: Generated new trial 11 with parameters {'x1': -2.021407, 'x2': 2.78554} using GenerationNode MBM.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:41] ax.api.client: Trial 11 marked COMPLETED.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:41] ax.api.client: Generated new trial 12 with parameters {'x1': -1.805891, 'x2': 4.277156} using GenerationNode MBM.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:42] ax.api.client: Trial 12 marked COMPLETED.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:42] ax.api.client: Generated new trial 13 with parameters {'x1': -2.699169, 'x2': 1.725894} using GenerationNode MBM.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:42] ax.api.client: Trial 13 marked COMPLETED.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:43] ax.api.client: Generated new trial 14 with parameters {'x1': 2.751742, 'x2': 2.279163} using GenerationNode MBM.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:43] ax.api.client: Trial 14 marked COMPLETED.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:43] ax.api.client: Generated new trial 15 with parameters {'x1': -5.0, 'x2': -3.302609} using GenerationNode MBM.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:44] ax.api.client: Trial 15 marked COMPLETED.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:44] ax.api.client: Generated new trial 16 with parameters {'x1': -3.105834, 'x2': -5.0} using GenerationNode MBM.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:44] ax.api.client: Trial 16 marked COMPLETED.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:45] ax.api.client: Generated new trial 17 with parameters {'x1': -5.0, 'x2': -0.832645} using GenerationNode MBM.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:45] ax.api.client: Trial 17 marked COMPLETED.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:45] ax.api.client: Generated new trial 18 with parameters {'x1': -1.693701, 'x2': 1.961709} using GenerationNode MBM.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:45] ax.api.client: Trial 18 marked COMPLETED.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:46] ax.api.client: Generated new trial 19 with parameters {'x1': -2.77376, 'x2': 3.036547} using GenerationNode MBM.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:46] ax.api.client: Trial 19 marked COMPLETED.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:46] ax.api.client: Generated new trial 20 with parameters {'x1': -2.671723, 'x2': 2.808608} using GenerationNode MBM.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:47] ax.api.client: Trial 20 marked COMPLETED.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:47] ax.api.client: Generated new trial 21 with parameters {'x1': 4.738383, 'x2': 5.0} using GenerationNode MBM.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:47] ax.api.client: Trial 21 marked COMPLETED.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:48] ax.api.client: Generated new trial 22 with parameters {'x1': -5.0, 'x2': -5.0} using GenerationNode MBM.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:48] ax.api.client: Trial 22 marked COMPLETED.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:48] ax.api.client: Generated new trial 23 with parameters {'x1': -2.996459, 'x2': -2.575693} using GenerationNode MBM.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:49] ax.api.client: Trial 23 marked COMPLETED.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:49] ax.api.client: Generated new trial 24 with parameters {'x1': -1.442255, 'x2': -2.893144} using GenerationNode MBM.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:49] ax.api.client: Trial 24 marked COMPLETED.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:49] ax.api.client: Generated new trial 25 with parameters {'x1': -3.554112, 'x2': 5.0} using GenerationNode MBM.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:50] ax.api.client: Trial 25 marked COMPLETED.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:50] ax.api.client: Generated new trial 26 with parameters {'x1': 3.195389, 'x2': -0.808776} using GenerationNode MBM.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:50] ax.api.client: Trial 26 marked COMPLETED.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:51] ax.api.client: Generated new trial 27 with parameters {'x1': 2.839812, 'x2': 0.090217} using GenerationNode MBM.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:51] ax.api.client: Trial 27 marked COMPLETED.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:51] ax.api.client: Generated new trial 28 with parameters {'x1': 2.418339, 'x2': -1.371797} using GenerationNode MBM.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:52] ax.api.client: Trial 28 marked COMPLETED.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:52] ax.api.client: Generated new trial 29 with parameters {'x1': 5.0, 'x2': -1.812762} using GenerationNode MBM.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
[INFO 04-19 07:10:52] ax.api.client: Trial 29 marked COMPLETED.
──────────────────────────────────────────────── Iteration 1 / 30 ─────────────────────────────────────────────────
  Acquire UID  4d5f6ec1-431a-4a6a-909c-515e8cc5fb6d
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━┳━━━━┳━━━━━━━━━━━━━━━┓
 Event  Suggestion ID  x1  x2  himmelblau_2d 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━╇━━━━╇━━━━━━━━━━━━━━━┩
│     0 │             0 │  0   0            170 
└───────┴───────────────┴────┴────┴───────────────┘
  himmelblau_2d  min: 170  max: 170  mean: 170
  (1 pts sampled)
──────────────────────────────────────────────── Iteration 2 / 30 ─────────────────────────────────────────────────
  Acquire UID  8d4dc7bf-6e9e-4df7-93e5-d03a3ab6eeef
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
 Event  Suggestion ID        x1         x2  himmelblau_2d 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│     0 │             1 │ -1.46277  -0.305821        154.062 
└───────┴───────────────┴──────────┴───────────┴───────────────┘
  himmelblau_2d  min: 154.062  max: 170  mean: 162.031
  (2 pts sampled)
──────────────────────────────────────────────── Iteration 3 / 30 ─────────────────────────────────────────────────
  Acquire UID  948035ec-9085-490f-a401-c0336d109100
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━━┓
 Event  Suggestion ID        x1       x2  himmelblau_2d 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│     0 │             2 │ 0.172018  1.80411        96.7887 
└───────┴───────────────┴──────────┴─────────┴───────────────┘
  himmelblau_2d  min: 96.7887  max: 170  mean: 140.284
  (3 pts sampled)
──────────────────────────────────────────────── Iteration 4 / 30 ─────────────────────────────────────────────────
  Acquire UID  94f280cd-3af6-43c1-988b-a426474feaf6
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
 Event  Suggestion ID       x1        x2  himmelblau_2d 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│     0 │             3 │ 3.34297  -4.77782        388.691 
└───────┴───────────────┴─────────┴──────────┴───────────────┘
  himmelblau_2d  min: 96.7887  max: 388.691  mean: 202.386
  (4 pts sampled)
──────────────────────────────────────────────── Iteration 5 / 30 ─────────────────────────────────────────────────
  Acquire UID  178e3df8-1552-43be-b185-2e5d155e19c8
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━━┓
 Event  Suggestion ID        x1       x2  himmelblau_2d 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│     0 │             4 │ -4.55098  3.26976        169.249 
└───────┴───────────────┴──────────┴─────────┴───────────────┘
  himmelblau_2d  min: 96.7887  max: 388.691  mean: 195.758
  (5 pts sampled)
──────────────────────────────────────────────── Iteration 6 / 30 ─────────────────────────────────────────────────
  Acquire UID  4db695e5-246b-4cb0-bc60-4845126a3811
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━━┓
 Event  Suggestion ID       x1       x2  himmelblau_2d 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│     0 │             5 │ 1.99431  2.04024        25.5361 
└───────┴───────────────┴─────────┴─────────┴───────────────┘
  himmelblau_2d  min: 25.5361  max: 388.691  mean: 167.388
  (6 pts sampled)
──────────────────────────────────────────────── Iteration 7 / 30 ─────────────────────────────────────────────────
  Acquire UID  9f65bdca-60c4-4240-81f9-3983ab9a1f63
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━━┓
 Event  Suggestion ID      x1       x2  himmelblau_2d 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│     0 │             6 │ 3.2581  2.56765        12.8927 
└───────┴───────────────┴────────┴─────────┴───────────────┘
  himmelblau_2d  min: 12.8927  max: 388.691  mean: 145.317
  (7 pts sampled)
──────────────────────────────────────────────── Iteration 8 / 30 ─────────────────────────────────────────────────
  Acquire UID  77310974-372a-4c5e-8a28-081515ce37ff
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━┳━━━━━━━━━━━━━━━┓
 Event  Suggestion ID       x1     x2  himmelblau_2d 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━╇━━━━━━━━━━━━━━━┩
│     0 │             7 │ 2.28358  4.091        147.347 
└───────┴───────────────┴─────────┴───────┴───────────────┘
  himmelblau_2d  min: 12.8927  max: 388.691  mean: 145.571
  (8 pts sampled)
──────────────────────────────────────────────── Iteration 9 / 30 ─────────────────────────────────────────────────
  Acquire UID  d6a82182-adaf-4deb-a3f6-df161e742cbc
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━━┓
 Event  Suggestion ID  x1       x2  himmelblau_2d 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│     0 │             8 │  5  1.93667        257.043 
└───────┴───────────────┴────┴─────────┴───────────────┘
  himmelblau_2d  min: 12.8927  max: 388.691  mean: 157.957
  (9 pts sampled)
──────────────────────────────────────────────── Iteration 10 / 30 ────────────────────────────────────────────────
  Acquire UID  c71f8c1e-7039-48a0-a2ed-b082ece3482b
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━━┓
 Event  Suggestion ID       x1       x2  himmelblau_2d 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│     0 │             9 │ 2.57913  2.61432        8.83232 
└───────┴───────────────┴─────────┴─────────┴───────────────┘
  himmelblau_2d  min: 8.83232  max: 388.691  mean: 143.044
  (10 pts sampled)
──────────────────────────────────────────────── Iteration 11 / 30 ────────────────────────────────────────────────
  Acquire UID  47953dd6-40a8-4a55-b36e-56b874a40961
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━━┓
 Event  Suggestion ID       x1       x2  himmelblau_2d 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│     0 │            10 │ 2.80813  1.99735        1.28883 
└───────┴───────────────┴─────────┴─────────┴───────────────┘
  himmelblau_2d  min: 1.28883  max: 388.691  mean: 130.157
  (11 pts sampled)
──────────────────────────────────────────────── Iteration 12 / 30 ────────────────────────────────────────────────
  Acquire UID  8f5c44e7-fa61-4bb8-97f9-2445953f47b4
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━━┓
 Event  Suggestion ID        x1       x2  himmelblau_2d 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│     0 │            11 │ -2.02141  2.78554        18.6365 
└───────┴───────────────┴──────────┴─────────┴───────────────┘
  himmelblau_2d  min: 1.28883  max: 388.691  mean: 120.864
  (12 pts sampled)
──────────────────────────────────────────────── Iteration 13 / 30 ────────────────────────────────────────────────
  Acquire UID  b9494a86-02f9-4c4a-aa07-e385ba58fea3
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━━┓
 Event  Suggestion ID        x1       x2  himmelblau_2d 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│     0 │            12 │ -1.80589  4.27716        102.008 
└───────┴───────────────┴──────────┴─────────┴───────────────┘
  himmelblau_2d  min: 1.28883  max: 388.691  mean: 119.414
  (13 pts sampled)
──────────────────────────────────────────────── Iteration 14 / 30 ────────────────────────────────────────────────
  Acquire UID  f2b60c3d-169e-4b12-a3a3-3edbf705d532
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━━┓
 Event  Suggestion ID        x1       x2  himmelblau_2d 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│     0 │            13 │ -2.69917  1.72589        49.1191 
└───────┴───────────────┴──────────┴─────────┴───────────────┘
  himmelblau_2d  min: 1.28883  max: 388.691  mean: 114.392
  (14 pts sampled)
──────────────────────────────────────────────── Iteration 15 / 30 ────────────────────────────────────────────────
  Acquire UID  b83fc1f0-4c1f-4498-bf6b-60b8afd3e72f
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━━┓
 Event  Suggestion ID       x1       x2  himmelblau_2d 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│     0 │            14 │ 2.75174  2.27916        2.21516 
└───────┴───────────────┴─────────┴─────────┴───────────────┘
  himmelblau_2d  min: 1.28883  max: 388.691  mean: 106.914
  (15 pts sampled)
──────────────────────────────────────────────── Iteration 16 / 30 ────────────────────────────────────────────────
  Acquire UID  3cf12ba6-02c7-4c60-bec4-11609c23e110
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
 Event  Suggestion ID  x1        x2  himmelblau_2d 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│     0 │            15 │ -5  -3.30261        115.628 
└───────┴───────────────┴────┴──────────┴───────────────┘
  himmelblau_2d  min: 1.28883  max: 388.691  mean: 107.459
  (16 pts sampled)
──────────────────────────────────────────────── Iteration 17 / 30 ────────────────────────────────────────────────
  Acquire UID  7c54c9cd-72a0-498b-a451-6dc762dc3f17
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━┳━━━━━━━━━━━━━━━┓
 Event  Suggestion ID        x1  x2  himmelblau_2d 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━╇━━━━━━━━━━━━━━━┩
│     0 │            16 │ -3.10583  -5        262.207 
└───────┴───────────────┴──────────┴────┴───────────────┘
  himmelblau_2d  min: 1.28883  max: 388.691  mean: 116.561
  (17 pts sampled)
──────────────────────────────────────────────── Iteration 18 / 30 ────────────────────────────────────────────────
  Acquire UID  0031dc25-8cc0-4180-ba09-626827fe5483
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
 Event  Suggestion ID  x1         x2  himmelblau_2d 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│     0 │            17 │ -5  -0.832645        301.221 
└───────┴───────────────┴────┴───────────┴───────────────┘
  himmelblau_2d  min: 1.28883  max: 388.691  mean: 126.82
  (18 pts sampled)
──────────────────────────────────────────────── Iteration 19 / 30 ────────────────────────────────────────────────
  Acquire UID  a575e59b-254b-467d-b1d8-619e49de90f9
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━━┓
 Event  Suggestion ID       x1       x2  himmelblau_2d 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│     0 │            18 │ -1.6937  1.96171        61.5427 
└───────┴───────────────┴─────────┴─────────┴───────────────┘
  himmelblau_2d  min: 1.28883  max: 388.691  mean: 123.385
  (19 pts sampled)
──────────────────────────────────────────────── Iteration 20 / 30 ────────────────────────────────────────────────
  Acquire UID  b44413de-ea52-4478-bccc-368f99792a16
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━━┓
 Event  Suggestion ID        x1       x2  himmelblau_2d 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│     0 │            19 │ -2.77376  3.03655       0.378709 
└───────┴───────────────┴──────────┴─────────┴───────────────┘
  himmelblau_2d  min: 0.378709  max: 388.691  mean: 117.234
  (20 pts sampled)
──────────────────────────────────────────────── Iteration 21 / 30 ────────────────────────────────────────────────
  Acquire UID  c6f4a365-6fd8-4144-84b6-306ea96edf52
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━━┓
 Event  Suggestion ID        x1       x2  himmelblau_2d 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│     0 │            20 │ -2.67172  2.80861         4.2901 
└───────┴───────────────┴──────────┴─────────┴───────────────┘
  himmelblau_2d  min: 0.378709  max: 388.691  mean: 111.856
  (21 pts sampled)
──────────────────────────────────────────────── Iteration 22 / 30 ────────────────────────────────────────────────
  Acquire UID  59bfe362-c5bd-4e44-8508-a0c8d7dfe9c6
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━┳━━━━━━━━━━━━━━━┓
 Event  Suggestion ID       x1  x2  himmelblau_2d 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━╇━━━━━━━━━━━━━━━┩
│     0 │            21 │ 4.73838   5        787.711 
└───────┴───────────────┴─────────┴────┴───────────────┘
  himmelblau_2d  min: 0.378709  max: 787.711  mean: 142.577
  (22 pts sampled)
──────────────────────────────────────────────── Iteration 23 / 30 ────────────────────────────────────────────────
  Acquire UID  92f43469-3061-40dc-bca2-0e120a028b90
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━┳━━━━┳━━━━━━━━━━━━━━━┓
 Event  Suggestion ID  x1  x2  himmelblau_2d 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━╇━━━━╇━━━━━━━━━━━━━━━┩
│     0 │            22 │ -5  -5            250 
└───────┴───────────────┴────┴────┴───────────────┘
  himmelblau_2d  min: 0.378709  max: 787.711  mean: 147.247
  (23 pts sampled)
──────────────────────────────────────────────── Iteration 24 / 30 ────────────────────────────────────────────────
  Acquire UID  d921ab5f-bad7-46ed-9cc0-31457cd87960
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
 Event  Suggestion ID        x1        x2  himmelblau_2d 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│     0 │            23 │ -2.99646  -2.57569        32.4366 
└───────┴───────────────┴──────────┴──────────┴───────────────┘
  himmelblau_2d  min: 0.378709  max: 787.711  mean: 142.464
  (24 pts sampled)
──────────────────────────────────────────────── Iteration 25 / 30 ────────────────────────────────────────────────
  Acquire UID  eb0e7423-0d85-48a5-8242-a74eec280b49
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
 Event  Suggestion ID        x1        x2  himmelblau_2d 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│     0 │            24 │ -1.44226  -2.89314        139.553 
└───────┴───────────────┴──────────┴──────────┴───────────────┘
  himmelblau_2d  min: 0.378709  max: 787.711  mean: 142.347
  (25 pts sampled)
──────────────────────────────────────────────── Iteration 26 / 30 ────────────────────────────────────────────────
  Acquire UID  a295ba01-c52f-4fca-806d-951f086e6ba2
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━┳━━━━━━━━━━━━━━━┓
 Event  Suggestion ID        x1  x2  himmelblau_2d 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━╇━━━━━━━━━━━━━━━┩
│     0 │            25 │ -3.55411   5        252.663 
└───────┴───────────────┴──────────┴────┴───────────────┘
  himmelblau_2d  min: 0.378709  max: 787.711  mean: 146.59
  (26 pts sampled)
──────────────────────────────────────────────── Iteration 27 / 30 ────────────────────────────────────────────────
  Acquire UID  d23ad581-8e0a-4a4c-bcba-b501bc5ff949
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
 Event  Suggestion ID       x1         x2  himmelblau_2d 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│     0 │            26 │ 3.19539  -0.808776        12.4801 
└───────┴───────────────┴─────────┴───────────┴───────────────┘
  himmelblau_2d  min: 0.378709  max: 787.711  mean: 141.623
  (27 pts sampled)
──────────────────────────────────────────────── Iteration 28 / 30 ────────────────────────────────────────────────
  Acquire UID  532ee23f-0847-4edb-86ee-7fb82498a725
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
 Event  Suggestion ID       x1         x2  himmelblau_2d 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│     0 │            27 │ 2.83981  0.0902171         25.335 
└───────┴───────────────┴─────────┴───────────┴───────────────┘
  himmelblau_2d  min: 0.378709  max: 787.711  mean: 137.47
  (28 pts sampled)
──────────────────────────────────────────────── Iteration 29 / 30 ────────────────────────────────────────────────
  Acquire UID  333d47b3-cada-4254-b37d-613edab033bf
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━━┓
 Event  Suggestion ID       x1       x2  himmelblau_2d 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│     0 │            28 │ 2.41834  -1.3718        49.8443 
└───────┴───────────────┴─────────┴─────────┴───────────────┘
  himmelblau_2d  min: 0.378709  max: 787.711  mean: 134.448
  (29 pts sampled)
──────────────────────────────────────────────── Iteration 30 / 30 ────────────────────────────────────────────────
  Acquire UID  5761f488-30ca-4bd3-8237-27ed7c0467aa
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
 Event  Suggestion ID  x1        x2  himmelblau_2d 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│     0 │            29 │  5  -1.81276        150.183 
└───────┴───────────────┴────┴──────────┴───────────────┘
  himmelblau_2d  min: 0.378709  max: 787.711  mean: 134.973
  (30 pts sampled)

                              Summary Statistics                              
┏━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━┓
 Name           Type          Min      Max       Mean      Std  Count 
┡━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━┩
 x1            │ param   │       -5        5  -0.113205  3.28442 │    30 │
 x2            │ param   │       -5        5   0.686829  2.95016 │    30 │
 himmelblau_2d │ outcome │ 0.378709  787.711    134.973  162.619 │    30 │
└───────────────┴─────────┴──────────┴─────────┴───────────┴─────────┴───────┘
────────────────────────────────────────────── Optimization Complete ──────────────────────────────────────────────

('549dbbdc-4df7-4dc8-a98a-3c488870dc74',
 '4d5f6ec1-431a-4a6a-909c-515e8cc5fb6d',
 '8d4dc7bf-6e9e-4df7-93e5-d03a3ab6eeef',
 '948035ec-9085-490f-a401-c0336d109100',
 '94f280cd-3af6-43c1-988b-a426474feaf6',
 '178e3df8-1552-43be-b185-2e5d155e19c8',
 '4db695e5-246b-4cb0-bc60-4845126a3811',
 '9f65bdca-60c4-4240-81f9-3983ab9a1f63',
 '77310974-372a-4c5e-8a28-081515ce37ff',
 'd6a82182-adaf-4deb-a3f6-df161e742cbc',
 'c71f8c1e-7039-48a0-a2ed-b082ece3482b',
 '47953dd6-40a8-4a55-b36e-56b874a40961',
 '8f5c44e7-fa61-4bb8-97f9-2445953f47b4',
 'b9494a86-02f9-4c4a-aa07-e385ba58fea3',
 'f2b60c3d-169e-4b12-a3a3-3edbf705d532',
 'b83fc1f0-4c1f-4498-bf6b-60b8afd3e72f',
 '3cf12ba6-02c7-4c60-bec4-11609c23e110',
 '7c54c9cd-72a0-498b-a451-6dc762dc3f17',
 '0031dc25-8cc0-4180-ba09-626827fe5483',
 'a575e59b-254b-467d-b1d8-619e49de90f9',
 'b44413de-ea52-4478-bccc-368f99792a16',
 'c6f4a365-6fd8-4144-84b6-306ea96edf52',
 '59bfe362-c5bd-4e44-8508-a0c8d7dfe9c6',
 '92f43469-3061-40dc-bca2-0e120a028b90',
 'd921ab5f-bad7-46ed-9cc0-31457cd87960',
 'eb0e7423-0d85-48a5-8242-a74eec280b49',
 'a295ba01-c52f-4fca-806d-951f086e6ba2',
 'd23ad581-8e0a-4a4c-bcba-b501bc5ff949',
 '532ee23f-0847-4edb-86ee-7fb82498a725',
 '333d47b3-cada-4254-b37d-613edab033bf',
 '5761f488-30ca-4bd3-8237-27ed7c0467aa')

Viewing the results#

After optimization, visualize what the Agent learned and see the best parameters found:

agent.plot_objective("x1", "x2", "himmelblau_2d")
agent.ax_client.summarize()
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/core/data.py:365: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
  self.full_df.groupby(self.DEDUPLICATE_BY_COLUMNS).apply(
himmelblau_2d (Mean) vs. x1, x2

The contour plot visualizes the predicted outcomes for himmelblau_2d across a two-dimensional parameter space, with other parameters held fixed at their best trial value (Arm 14_0). This plot helps in identifying regions of optimal performance and understanding how changes in the selected parameters influence the predicted outcomes. Contour lines represent levels of constant predicted values, providing insights into the gradient and potential optima within the parameter space.

trial_index arm_name trial_status generation_node himmelblau_2d x1 x2
0 0 0_0 COMPLETED CenterOfSearchSpace 170.000000 0.000000 0.000000
1 1 1_0 COMPLETED Sobol 154.062088 -1.462770 -0.305821
2 2 2_0 COMPLETED Sobol 96.788716 0.172018 1.804107
3 3 3_0 COMPLETED Sobol 388.691442 3.342968 -4.777821
4 4 4_0 COMPLETED Sobol 169.249038 -4.550976 3.269760
5 5 5_0 COMPLETED MBM 25.536063 1.994311 2.040236
6 6 6_0 COMPLETED MBM 12.892739 3.258101 2.567650
7 7 7_0 COMPLETED MBM 147.347397 2.283576 4.090999
8 8 8_0 COMPLETED MBM 257.042528 5.000000 1.936674
9 9 9_0 COMPLETED MBM 8.832324 2.579135 2.614320
10 10 10_0 COMPLETED MBM 1.288826 2.808129 1.997349
11 11 11_0 COMPLETED MBM 18.636539 -2.021407 2.785540
12 12 12_0 COMPLETED MBM 102.008128 -1.805891 4.277156
13 13 13_0 COMPLETED MBM 49.119060 -2.699169 1.725894
14 14 14_0 COMPLETED MBM 2.215163 2.751742 2.279163
15 15 15_0 COMPLETED MBM 115.628344 -5.000000 -3.302609
16 16 16_0 COMPLETED MBM 262.206889 -3.105834 -5.000000
17 17 17_0 COMPLETED MBM 301.220768 -5.000000 -0.832645
18 18 18_0 COMPLETED MBM 61.542683 -1.693701 1.961709
19 19 19_0 COMPLETED MBM 0.378709 -2.773760 3.036547
20 20 20_0 COMPLETED MBM 4.290097 -2.671723 2.808608
21 21 21_0 COMPLETED MBM 787.711381 4.738383 5.000000
22 22 22_0 COMPLETED MBM 250.000000 -5.000000 -5.000000
23 23 23_0 COMPLETED MBM 32.436579 -2.996459 -2.575693
24 24 24_0 COMPLETED MBM 139.553188 -1.442255 -2.893144
25 25 25_0 COMPLETED MBM 252.663313 -3.554112 5.000000
26 26 26_0 COMPLETED MBM 12.480051 3.195389 -0.808776
27 27 27_0 COMPLETED MBM 25.334977 2.839812 0.090217
28 28 28_0 COMPLETED MBM 49.844282 2.418339 -1.371797
29 29 29_0 COMPLETED MBM 150.182841 5.000000 -1.812762

The Himmelblau function has four global minima (all with value 0). The summarize output shows which one(s) the optimizer found.

What you learned#

You now understand the three core concepts of Blop:

  • DOFs: The parameters the optimizer adjusts (here, x1 and x2 with bounds)

  • Objectives: What you’re optimizing (here, minimizing the Himmelblau function)

  • Agent: Coordinates the optimization loop between Bluesky and the evaluation function

Next steps#

For a more comprehensive tutorial with multiple objectives and diagnostic tools, see Optimizing KB Mirrors.