Optimizing KB Mirrors with Bayesian Optimization#

In this tutorial, you will learn how to use Blop to optimize a Kirkpatrick-Baez (KB) mirror system. By the end, you will understand:

  • How degrees of freedom (DOFs) represent the parameters you can adjust in an experiment

  • How objectives define what you’re trying to optimize

  • How to write an evaluation function that extracts results from experimental data

  • How the Agent coordinates the optimization loop

  • How to check optimization health mid-run and continue

We’ll work with a simulated KB mirror beamline, but the concepts apply directly to real experimental setups.

What are KB Mirrors?#

KB mirror systems use two curved mirrors to focus X-ray beams. Each mirror has adjustable curvature—getting both just right produces a tight, intense focal spot. This is a multi-objective optimization problem: we want to maximize beam intensity while minimizing the spot size in both X and Y directions.

The image below shows our simulated setup: a beam from a geometric source propagates through a pair of toroidal mirrors that focus it onto a screen.

xrt_blop_layout_w.jpg

Setting Up the Environment#

Before we can optimize, we need to set up the data infrastructure. Blop uses Bluesky to run experiments and Tiled to store and retrieve data.

import logging
from pathlib import PurePath

import cv2
import numpy as np
import matplotlib.pyplot as plt
from tiled.client.container import Container
from bluesky_tiled_plugins import TiledWriter
from bluesky.run_engine import RunEngine
from tiled.client import from_uri  # type: ignore[import-untyped]
from tiled.server import SimpleTiledServer
from ophyd_async.core import StaticPathProvider, UUIDFilenameProvider

from blop.ax import Agent, RangeDOF, Objective
from blop.protocols import EvaluationFunction

# Import simulation devices (requires: pip install -e sim/)
from blop_sim.backends.xrt import XRTBackend
from blop_sim.devices.xrt import KBMirror
from blop_sim.devices import DetectorDevice

# Suppress noisy logs from httpx 
logging.getLogger("httpx").setLevel(logging.WARNING)

# Enable interactive plotting
plt.ion()

DETECTOR_STORAGE = "/tmp/blop/sim"
[WARNING 05-19 23:16:13] 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]`.

Next, we create a local Tiled server. The TiledWriter callback will save experimental data to this server, and our evaluation function will read from it.

tiled_server = SimpleTiledServer(readable_storage=[DETECTOR_STORAGE])
tiled_client = from_uri(tiled_server.uri)
tiled_writer = TiledWriter(tiled_client)

RE = RunEngine({})
RE.subscribe(tiled_writer)
Tiled version 0.2.9
0

Defining Degrees of Freedom#

Degrees of freedom (DOFs) are the parameters the optimizer can adjust. In our KB system, we control the curvature radius of each mirror. Let’s define the search space:

# Define search ranges for each mirror's curvature radius
# The optimal values (~38000 and ~21000) are intentionally placed
# away from the center to make the optimization more realistic
VERTICAL_BOUNDS = (25000, 45000)    # Optimal ~38000 is in upper portion
HORIZONTAL_BOUNDS = (15000, 35000)  # Optimal ~21000 is in lower portion

Now we create the simulation backend and individual devices. Each RangeDOF wraps an actuator (something we can move) with bounds that constrain the search space:

# Create XRT simulation backend
backend = XRTBackend()

# Create individual KB mirror devices
kbv = KBMirror(backend, mirror_index=0, initial_radius=38000, name="kbv")
kbh = KBMirror(backend, mirror_index=1, initial_radius=21000, name="kbh")

# Create detector device
det = DetectorDevice(backend, StaticPathProvider(UUIDFilenameProvider(), PurePath(DETECTOR_STORAGE)), name="det")

# Define DOFs using mirror radius signals
dofs = [
    RangeDOF(actuator=kbv.radius, bounds=VERTICAL_BOUNDS, parameter_type="float"),
    RangeDOF(actuator=kbh.radius, bounds=HORIZONTAL_BOUNDS, parameter_type="float"),
]

The actuator is the device that physically changes the parameter. The bounds tell the optimizer what range of values to explore. Think of DOFs as the “knobs” the optimizer can turn.

Defining Objectives#

Objectives specify what you want to optimize. Each objective has a name (matching a value your evaluation function will return) and a direction: minimize=True for things you want smaller, minimize=False for things you want larger.

For our KB mirrors, we have three objectives:

  • Intensity (intensity): We want more signal → minimize=False

  • Spot width (width): We want a tighter spot → minimize=True

  • Spot height (height): We want a tighter spot → minimize=True

objectives = [
    Objective(name="intensity", minimize=False),
    Objective(name="width", minimize=True),
    Objective(name="height", minimize=True),
]

With multiple objectives that can conflict (maximizing intensity might increase spot size), the optimizer finds the Pareto frontier—the set of solutions where you can’t improve one objective without sacrificing another.

Writing an Evaluation Function#

The evaluation function is the bridge between raw experimental data and the optimizer. After each measurement, the optimizer needs to know how well that configuration performed. Your evaluation function:

  1. Receives a run UID and the suggestions that were tested

  2. Reads the beam images from Tiled

  3. Computes statistics (intensity, width, centroid, etc.) from the images

  4. Returns outcome values for each suggestion

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

    def _compute_stats(self, image: np.array) -> tuple[str, str, str]:
        """Compute integrated intensity and beam width/height from a beam image."""
        # Convert to grayscale
        gray = image.squeeze()
        if gray.ndim == 3:
            gray = cv2.cvtColor(gray, cv2.COLOR_BGR2GRAY)
        
        # Convert data type for numerical stability
        gray = gray.astype(np.float32)

        # Smooth w/ (5, 5) kernel and threshold
        blurred = cv2.GaussianBlur(gray, (5, 5), 0)
        max_val = np.max(blurred)
        if max_val == 0:
            return 0.0, 0.0, 0.0

        thresh_value = 0.2 * max_val
        _, thresh = cv2.threshold(blurred, thresh_value, 255, cv2.THRESH_TOZERO)

        # Total integrated intensity
        total_intensity = np.sum(thresh)

        # Beam width/height from intensity-weighted second moment (σ)
        total_weight = np.sum(thresh)
        if total_weight <= 0:
            return total_intensity, 0.0, 0.0

        h, w = thresh.shape
        y_coords = np.arange(h, dtype=np.float32)
        x_coords = np.arange(w, dtype=np.float32)

        x_bar = np.sum(x_coords * np.sum(thresh, axis=0)) / total_weight
        y_bar = np.sum(y_coords * np.sum(thresh, axis=1)) / total_weight

        x_var = np.sum((x_coords - x_bar) ** 2 * np.sum(thresh, axis=0)) / total_weight
        y_var = np.sum((y_coords - y_bar) ** 2 * np.sum(thresh, axis=1)) / total_weight

        width = 2 * np.sqrt(x_var)   # ~2σ width
        height = 2 * np.sqrt(y_var)   # ~2σ height

        return total_intensity, width, height

    def __call__(self, uid: str, suggestions: list[dict]) -> list[dict]:
        outcomes = []
        run = self.tiled_client[uid]
        
        # Read beam images from detector
        images = run["primary/det_image"].read()

        # Suggestions are stored in the start document's metadata when
        # using the `blop.plans.default_acquire` plan.
        # You may want to store them differently in your experiment when writing
        # a custom acquisition plan.
        suggestion_ids = [suggestion["_id"] for suggestion in run.metadata["start"]["blop_suggestions"]]

        # Compute statistics from each image
        for idx, sid in enumerate(suggestion_ids):
            image = images[idx]
            intensity, width, height = self._compute_stats(image)
            
            outcome = {
                "_id": sid,
                "intensity": intensity,
                "width": width,
                "height": height,
            }
            outcomes.append(outcome)
        return outcomes

Note how we:

  1. Read the image data from the stored detector data

  2. Use image processing techniques to compute beam metrics from the raw detector images

  3. Link each outcome back to its suggestion via the _id field

Creating and Running the Agent#

The Agent brings everything together. It:

  • Uses DOFs to know what parameters to adjust

  • Uses objectives to know what to optimize

  • Calls the evaluation function to assess each configuration

  • Builds a surrogate model to predict outcomes across the parameter space

  • Suggests the next configurations to try

agent = Agent(
    sensors=[det],
    dofs=dofs,
    objectives=objectives,
    evaluation_function=DetectorEvaluation(tiled_client),
    name="xrt-blop-demo",
    description="A demo of the Blop agent with XRT simulated beamline",
    experiment_type="demo",
)

The sensors list contains any devices that produce data during acquisition. Here, det is our detector device.

Running the Optimization#

Let’s start the optimization. Rather than running all iterations at once, we’ll pause partway through to check the optimization’s health—a practical workflow you’ll use in real experiments.

# Run first 10 iterations
RE(agent.optimize(10))

╭───────────────────────────────────────────────── Optimization ──────────────────────────────────────────────────╮
 Optimizer  AxOptimizer                                                                                          
 Actuators  kbv-radius, kbh-radius                                                                               
 Sensors    det                                                                                                  
 Iterations 10                                                                                                   
 Run UID    606f7f39-767c-4129-975e-afaa8b488021                                                                 
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
ToroidMirror2
center:
[0, 11000, np.float64(176.32576420275802)]
[INFO 05-19 23:16:17] 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 05-19 23:16:17] ax.api.client: Generated new trial 0 with parameters {'kbv-radius': 35000.0, 'kbh-radius': 25000.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 05-19 23:16:18] 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 05-19 23:16:18] ax.api.client: Generated new trial 1 with parameters {'kbv-radius': 40107.185841, 'kbh-radius': 27243.521214} 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 05-19 23:16:18] 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 05-19 23:16:18] ax.api.client: Generated new trial 2 with parameters {'kbv-radius': 25536.393207, 'kbh-radius': 15635.150261} 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 05-19 23:16:18] 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 05-19 23:16:19] ax.api.client: Generated new trial 3 with parameters {'kbv-radius': 33238.535039, 'kbh-radius': 34549.125936} 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 05-19 23:16:19] 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 05-19 23:16:19] ax.api.client: Generated new trial 4 with parameters {'kbv-radius': 38669.002708, 'kbh-radius': 23646.320775} 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 05-19 23:16:19] 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(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/adapter/transforms/winsorize.py:126: AxOptimizationWarning: Encountered a `MultiObjective` without objective thresholds. We will winsorize each objective separately. We strongly recommend specifying the objective thresholds when using multi-objective optimization.
  metric_signature: _get_cutoffs(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/generators/torch/botorch_moo_utils.py:268: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.detach().clone() or sourceTensor.detach().clone().requires_grad_(True), rather than torch.tensor(sourceTensor).
  obj_mask = torch.tensor(obj_indices, device=objective_weights.device)
[INFO 05-19 23:16:21] ax.api.client: Generated new trial 5 with parameters {'kbv-radius': 38966.895985, 'kbh-radius': 22380.850116} 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 05-19 23:16:21] 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(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/adapter/transforms/winsorize.py:126: AxOptimizationWarning: Encountered a `MultiObjective` without objective thresholds. We will winsorize each objective separately. We strongly recommend specifying the objective thresholds when using multi-objective optimization.
  metric_signature: _get_cutoffs(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/generators/torch/botorch_moo_utils.py:268: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.detach().clone() or sourceTensor.detach().clone().requires_grad_(True), rather than torch.tensor(sourceTensor).
  obj_mask = torch.tensor(obj_indices, device=objective_weights.device)
[INFO 05-19 23:16:23] ax.api.client: Generated new trial 6 with parameters {'kbv-radius': 38386.946684, 'kbh-radius': 20571.465701} 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 05-19 23:16:23] 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(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/adapter/transforms/winsorize.py:126: AxOptimizationWarning: Encountered a `MultiObjective` without objective thresholds. We will winsorize each objective separately. We strongly recommend specifying the objective thresholds when using multi-objective optimization.
  metric_signature: _get_cutoffs(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/generators/torch/botorch_moo_utils.py:268: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.detach().clone() or sourceTensor.detach().clone().requires_grad_(True), rather than torch.tensor(sourceTensor).
  obj_mask = torch.tensor(obj_indices, device=objective_weights.device)
[INFO 05-19 23:16:25] ax.api.client: Generated new trial 7 with parameters {'kbv-radius': 38432.989625, 'kbh-radius': 21381.01684} 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 05-19 23:16:26] 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(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/adapter/transforms/winsorize.py:126: AxOptimizationWarning: Encountered a `MultiObjective` without objective thresholds. We will winsorize each objective separately. We strongly recommend specifying the objective thresholds when using multi-objective optimization.
  metric_signature: _get_cutoffs(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/generators/torch/botorch_moo_utils.py:268: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.detach().clone() or sourceTensor.detach().clone().requires_grad_(True), rather than torch.tensor(sourceTensor).
  obj_mask = torch.tensor(obj_indices, device=objective_weights.device)
[INFO 05-19 23:16:28] ax.api.client: Generated new trial 8 with parameters {'kbv-radius': 38172.786516, 'kbh-radius': 22180.098203} 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 05-19 23:16:29] 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(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/adapter/transforms/winsorize.py:126: AxOptimizationWarning: Encountered a `MultiObjective` without objective thresholds. We will winsorize each objective separately. We strongly recommend specifying the objective thresholds when using multi-objective optimization.
  metric_signature: _get_cutoffs(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/generators/torch/botorch_moo_utils.py:268: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.detach().clone() or sourceTensor.detach().clone().requires_grad_(True), rather than torch.tensor(sourceTensor).
  obj_mask = torch.tensor(obj_indices, device=objective_weights.device)
[INFO 05-19 23:16:32] ax.api.client: Generated new trial 9 with parameters {'kbv-radius': 37945.060334, 'kbh-radius': 21160.173955} 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 05-19 23:16:32] ax.api.client: Trial 9 marked COMPLETED.
──────────────────────────────────────────────── Iteration 1 / 10 ─────────────────────────────────────────────────
  Acquire UID  18f12a15-623d-44af-887a-d08737a7fab0
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━┓
 Event  Suggestion ID  kbh-radius  kbv-radius   height  intensity    width 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━┩
│     0 │             0 │      25000       35000  51.5722    16514.6  148.884 
└───────┴───────────────┴────────────┴────────────┴─────────┴───────────┴─────────┘
  height  min: 51.5722  max: 51.5722  mean: 51.5722
  intensity  min: 16514.6  max: 16514.6  mean: 16514.6
  width  min: 148.884  max: 148.884  mean: 148.884
  (1 pts sampled)
──────────────────────────────────────────────── Iteration 2 / 10 ─────────────────────────────────────────────────
  Acquire UID  f822318b-9b39-46a7-a84e-543abeee9c73
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━┓
 Event  Suggestion ID  kbh-radius  kbv-radius   height  intensity    width 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━┩
│     0 │             1 │    27243.5     40107.2  34.0163    15013.8  185.069 
└───────┴───────────────┴────────────┴────────────┴─────────┴───────────┴─────────┘
  height  min: 34.0163  max: 51.5722  mean: 42.7942
  intensity  min: 15013.8  max: 16514.6  mean: 15764.2
  width  min: 148.884  max: 185.069  mean: 166.977
  (2 pts sampled)
──────────────────────────────────────────────── Iteration 3 / 10 ─────────────────────────────────────────────────
  Acquire UID  cddbd0ce-76d6-4725-a9c1-a02c75a5b19d
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━┓
 Event  Suggestion ID  kbh-radius  kbv-radius   height  intensity    width 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━┩
│     0 │             2 │    15635.2     25536.4  163.306    4537.94  204.823 
└───────┴───────────────┴────────────┴────────────┴─────────┴───────────┴─────────┘
  height  min: 34.0163  max: 163.306  mean: 82.9649
  intensity  min: 4537.94  max: 16514.6  mean: 12022.1
  width  min: 148.884  max: 204.823  mean: 179.592
  (3 pts sampled)
──────────────────────────────────────────────── Iteration 4 / 10 ─────────────────────────────────────────────────
  Acquire UID  51c56936-5928-4c05-95ad-50ecf13a90df
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━┓
 Event  Suggestion ID  kbh-radius  kbv-radius   height  intensity    width 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━┩
│     0 │             3 │    34549.1     33238.5  85.1415    9043.42  214.762 
└───────┴───────────────┴────────────┴────────────┴─────────┴───────────┴─────────┘
  height  min: 34.0163  max: 163.306  mean: 83.509
  intensity  min: 4537.94  max: 16514.6  mean: 11277.4
  width  min: 148.884  max: 214.762  mean: 188.385
  (4 pts sampled)
──────────────────────────────────────────────── Iteration 5 / 10 ─────────────────────────────────────────────────
  Acquire UID  d16cf53f-c68b-4dee-95e7-0821aba7b8e8
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━┓
 Event  Suggestion ID  kbh-radius  kbv-radius   height  intensity    width 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━┩
│     0 │             4 │    23646.3       38669  21.0754      18691  113.004 
└───────┴───────────────┴────────────┴────────────┴─────────┴───────────┴─────────┘
  height  min: 21.0754  max: 163.306  mean: 71.0223
  intensity  min: 4537.94  max: 18691  mean: 12760.1
  width  min: 113.004  max: 214.762  mean: 173.308
  (5 pts sampled)
──────────────────────────────────────────────── Iteration 6 / 10 ─────────────────────────────────────────────────
  Acquire UID  f10f7d35-1f34-429d-8cba-99991615b7c1
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━┓
 Event  Suggestion ID  kbh-radius  kbv-radius   height  intensity    width 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━┩
│     0 │             5 │    22380.9     38966.9  23.7744    19027.9  67.5644 
└───────┴───────────────┴────────────┴────────────┴─────────┴───────────┴─────────┘
  height  min: 21.0754  max: 163.306  mean: 63.1477
  intensity  min: 4537.94  max: 19027.9  mean: 13804.8
  width  min: 67.5644  max: 214.762  mean: 155.684
  (6 pts sampled)
──────────────────────────────────────────────── Iteration 7 / 10 ─────────────────────────────────────────────────
  Acquire UID  adc3ab01-1c04-4203-8523-256d3bad0947
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━┓
 Event  Suggestion ID  kbh-radius  kbv-radius   height  intensity    width 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━┩
│     0 │             6 │    20571.5     38386.9  16.7423    17221.7  12.4633 
└───────┴───────────────┴────────────┴────────────┴─────────┴───────────┴─────────┘
  height  min: 16.7423  max: 163.306  mean: 56.5183
  intensity  min: 4537.94  max: 19027.9  mean: 14292.9
  width  min: 12.4633  max: 214.762  mean: 135.224
  (7 pts sampled)
──────────────────────────────────────────────── Iteration 8 / 10 ─────────────────────────────────────────────────
  Acquire UID  5d7c1fbd-3b11-4b6e-ae2f-a684deb6218d
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━┓
 Event  Suggestion ID  kbh-radius  kbv-radius   height  intensity    width 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━┩
│     0 │             7 │      21381       38433  17.8716    17261.1  24.0277 
└───────┴───────────────┴────────────┴────────────┴─────────┴───────────┴─────────┘
  height  min: 16.7423  max: 163.306  mean: 51.6875
  intensity  min: 4537.94  max: 19027.9  mean: 14663.9
  width  min: 12.4633  max: 214.762  mean: 121.325
  (8 pts sampled)
──────────────────────────────────────────────── Iteration 9 / 10 ─────────────────────────────────────────────────
  Acquire UID  8ab9836e-fccd-4f8c-85df-816c781c5274
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━┓
 Event  Suggestion ID  kbh-radius  kbv-radius   height  intensity    width 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━┩
│     0 │             8 │    22180.1     38172.8  18.8113    19184.7  59.8615 
└───────┴───────────────┴────────────┴────────────┴─────────┴───────────┴─────────┘
  height  min: 16.7423  max: 163.306  mean: 48.0346
  intensity  min: 4537.94  max: 19184.7  mean: 15166.2
  width  min: 12.4633  max: 214.762  mean: 114.495
  (9 pts sampled)
──────────────────────────────────────────────── Iteration 10 / 10 ────────────────────────────────────────────────
  Acquire UID  49f40048-d191-45e0-b876-1b82ffe147d9
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━┓
 Event  Suggestion ID  kbh-radius  kbv-radius   height  intensity    width 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━┩
│     0 │             9 │    21160.2     37945.1  16.1004    17418.7  18.4373 
└───────┴───────────────┴────────────┴────────────┴─────────┴───────────┴─────────┘
  height  min: 16.1004  max: 163.306  mean: 44.8412
  intensity  min: 4537.94  max: 19184.7  mean: 15391.5
  width  min: 12.4633  max: 214.762  mean: 104.89
  (10 pts sampled)

                           Summary Statistics                           
┏━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━┳━━━━━━━┓
 Name        Type         Min      Max     Mean      Std  Count 
┡━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━╇━━━━━━━┩
 kbh-radius │ param   │ 15635.2  34549.1  23374.8  4962.12 │    10 │
 kbv-radius │ param   │ 25536.4  40107.2  36445.6  4333.89 │    10 │
 height     │ outcome │ 16.1004  163.306  44.8412  46.9629 │    10 │
 intensity  │ outcome │ 4537.94  19184.7  15391.5  4818.42 │    10 │
 width      │ outcome │ 12.4633  214.762   104.89  79.2077 │    10 │
└────────────┴─────────┴─────────┴─────────┴─────────┴─────────┴───────┘
────────────────────────────────────────────── Optimization Complete ──────────────────────────────────────────────

('606f7f39-767c-4129-975e-afaa8b488021',
 '18f12a15-623d-44af-887a-d08737a7fab0',
 'f822318b-9b39-46a7-a84e-543abeee9c73',
 'cddbd0ce-76d6-4725-a9c1-a02c75a5b19d',
 '51c56936-5928-4c05-95ad-50ecf13a90df',
 'd16cf53f-c68b-4dee-95e7-0821aba7b8e8',
 'f10f7d35-1f34-429d-8cba-99991615b7c1',
 'adc3ab01-1c04-4203-8523-256d3bad0947',
 '5d7c1fbd-3b11-4b6e-ae2f-a684deb6218d',
 '8ab9836e-fccd-4f8c-85df-816c781c5274',
 '49f40048-d191-45e0-b876-1b82ffe147d9')

Checking Optimization Health#

After running some iterations, it’s good practice to check how the optimization is progressing. Ax provides built-in health checks and diagnostics through compute_analyses():

_ = agent.ax_client.compute_analyses()
/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(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/adapter/transforms/winsorize.py:126: AxOptimizationWarning: Encountered a `MultiObjective` without objective thresholds. We will winsorize each objective separately. We strongly recommend specifying the objective thresholds when using multi-objective optimization.
  metric_signature: _get_cutoffs(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/generators/torch/botorch_moo_utils.py:268: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.detach().clone() or sourceTensor.detach().clone().requires_grad_(True), rather than torch.tensor(sourceTensor).
  obj_mask = torch.tensor(obj_indices, device=objective_weights.device)
[INFO 05-19 23:16:34] ax.service.utils.best_point: Using inferred objective thresholds: [ObjectiveThreshold(intensity >= 16805.078777253355), ObjectiveThreshold(width <= 124.96827958592291), ObjectiveThreshold(height <= 22.655418869020963)], as objective thresholds were not specified as part of the optimization configuration on the experiment.
/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(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/adapter/transforms/winsorize.py:126: AxOptimizationWarning: Encountered a `MultiObjective` without objective thresholds. We will winsorize each objective separately. We strongly recommend specifying the objective thresholds when using multi-objective optimization.
  metric_signature: _get_cutoffs(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/generators/torch/botorch_moo_utils.py:268: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.detach().clone() or sourceTensor.detach().clone().requires_grad_(True), rather than torch.tensor(sourceTensor).
  obj_mask = torch.tensor(obj_indices, device=objective_weights.device)
[INFO 05-19 23:16:39] ax.service.utils.best_point: Using inferred objective thresholds: [ObjectiveThreshold(intensity >= 16805.078777253355), ObjectiveThreshold(width <= 124.96827958592291), ObjectiveThreshold(height <= 22.655418869020963)], as objective thresholds were not specified as part of the optimization configuration on the experiment.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/adapter/transforms/winsorize.py:126: AxOptimizationWarning: Encountered a `MultiObjective` without objective thresholds. We will winsorize each objective separately. We strongly recommend specifying the objective thresholds when using multi-objective optimization.
  metric_signature: _get_cutoffs(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/generators/torch/botorch_moo_utils.py:268: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.detach().clone() or sourceTensor.detach().clone().requires_grad_(True), rather than torch.tensor(sourceTensor).
  obj_mask = torch.tensor(obj_indices, device=objective_weights.device)
[INFO 05-19 23:16:39] ax.service.utils.best_point: Using inferred objective thresholds: [ObjectiveThreshold(intensity >= 16805.078777253355), ObjectiveThreshold(width <= 124.96827958592291), ObjectiveThreshold(height <= 22.655418869020963)], as objective thresholds were not specified as part of the optimization configuration on the experiment.
Overview of the Entire Optimization Process

This analysis provides an overview of the entire optimization process. It includes visualizations of the results obtained so far, insights into the parameter and metric relationships learned by the Ax model, diagnostics such as model fit, and health checks to assess the overall health of the experiment.

Results Analysis

Result Analyses provide a high-level overview of the results of the optimization process so far with respect to the metrics specified in experiment design.

Metric Effects: Predicted and observed effects for all arms in the experiment

These pair of plots visualize the metric effects for each arm, with the Ax model predictions on the left and the raw observed data on the right. The predicted effects apply shrinkage for noise and adjust for non-stationarity in the data, so they are more representative of the reproducible effects that will manifest in a long-term validation experiment.

Metric Effects Pair for intensity

Modeled Arm Effects on intensity

Modeled effects on intensity. This plot visualizes predictions of the true metric changes for each arm based on Ax's model. This is the expected delta you would expect if you (re-)ran that arm. This plot helps in anticipating the outcomes and performance of arms based on the model's predictions. Note, flat predictions across arms indicate that the model predicts that there is no effect, meaning if you were to re-run the experiment, the delta you would see would be small and fall within the confidence interval indicated in the plot.

Observed Arm Effects on intensity

Observed effects on intensity. This plot visualizes the effects from previously-run arms on a specific metric, providing insights into their performance. This plot allows one to compare and contrast the effectiveness of different arms, highlighting which configurations have yielded the most favorable outcomes.

Metric Effects Pair for width

Modeled Arm Effects on width

Modeled effects on width. This plot visualizes predictions of the true metric changes for each arm based on Ax's model. This is the expected delta you would expect if you (re-)ran that arm. This plot helps in anticipating the outcomes and performance of arms based on the model's predictions. Note, flat predictions across arms indicate that the model predicts that there is no effect, meaning if you were to re-run the experiment, the delta you would see would be small and fall within the confidence interval indicated in the plot.

Observed Arm Effects on width

Observed effects on width. This plot visualizes the effects from previously-run arms on a specific metric, providing insights into their performance. This plot allows one to compare and contrast the effectiveness of different arms, highlighting which configurations have yielded the most favorable outcomes.

Metric Effects Pair for height

Modeled Arm Effects on height

Modeled effects on height. This plot visualizes predictions of the true metric changes for each arm based on Ax's model. This is the expected delta you would expect if you (re-)ran that arm. This plot helps in anticipating the outcomes and performance of arms based on the model's predictions. Note, flat predictions across arms indicate that the model predicts that there is no effect, meaning if you were to re-run the experiment, the delta you would see would be small and fall within the confidence interval indicated in the plot.

Observed Arm Effects on height

Observed effects on height. This plot visualizes the effects from previously-run arms on a specific metric, providing insights into their performance. This plot allows one to compare and contrast the effectiveness of different arms, highlighting which configurations have yielded the most favorable outcomes.

Scatter Plot (Objectives)

These plots display the effects of each arm on two metrics displayed on the x- and y-axes. They are useful for understanding the trade-off between the two metrics and for visualizing the Pareto frontier.

Modeled Effects: intensity vs. width

This plot displays the effects of each arm on the two selected metrics. It is useful for understanding the trade-off between the two metrics and for visualizing the Pareto frontier.

Modeled Effects: intensity vs. height

This plot displays the effects of each arm on the two selected metrics. It is useful for understanding the trade-off between the two metrics and for visualizing the Pareto frontier.

Modeled Effects: width vs. height

This plot displays the effects of each arm on the two selected metrics. It is useful for understanding the trade-off between the two metrics and for visualizing the Pareto frontier.

Utility Progression

Shows the hypervolume of the Pareto frontier achieved so far across completed trials. The x-axis shows trace index, which counts completed or early-stopped trials sequentially (1, 2, 3, ...). This differs from trial index, which may have gaps if some trials failed or were abandoned. For example, if trials 0, 2, and 5 completed while trials 1, 3, and 4 failed, the trace indices would be 1, 2, 3 corresponding to trial indices 0, 2, 5. The y-axis shows cumulative best hypervolume—only improvements, so flat segments indicate trials that didn't improve the frontier. Hypervolume measures the volume of objective space dominated by the Pareto frontier. Infeasible trials (violating outcome constraints) don't contribute to the improvements.

Pareto Frontier Trials for Experiment

Displays trials on the Pareto frontier based on raw observations. This reflects actual measured performance during execution. No trial is strictly better across all objectives. These trials represent optimal trade-offs between competing objectives. Use this to understand the available trade-offs and select a trial that best balances your optimization goals. Only considering COMPLETED trials.

trial_index arm_name trial_status generation_node intensity width height kbv-radius kbh-radius
0 8 8_0 COMPLETED MBM 19184.667969 59.861458 18.811335 38172.786516 22180.098203
1 9 9_0 COMPLETED MBM 17418.738281 18.437265 16.100424 37945.060334 21160.173955
2 6 6_0 COMPLETED MBM 17221.683594 12.463347 16.742319 38386.946684 20571.465701
Summary for xrt-blop-demo

High-level summary of the `Trial`-s in this `Experiment`

trial_index arm_name trial_status generation_node intensity width height kbv-radius kbh-radius
0 0 0_0 COMPLETED CenterOfSearchSpace 16514.632812 148.884308 51.572174 35000.000000 25000.000000
1 1 1_0 COMPLETED Sobol 15013.800781 185.068909 34.016315 40107.185841 27243.521214
2 2 2_0 COMPLETED Sobol 4537.941406 204.823288 163.306183 25536.393207 15635.150261
3 3 3_0 COMPLETED Sobol 9043.417969 214.761841 85.141525 33238.535039 34549.125936
4 4 4_0 COMPLETED Sobol 18690.957031 113.003830 21.075401 38669.002708 23646.320775
5 5 5_0 COMPLETED MBM 19027.859375 67.564415 23.774429 38966.895985 22380.850116
6 6 6_0 COMPLETED MBM 17221.683594 12.463347 16.742319 38386.946684 20571.465701
7 7 7_0 COMPLETED MBM 17261.140625 24.027714 17.871607 38432.989625 21381.016840
8 8 8_0 COMPLETED MBM 19184.667969 59.861458 18.811335 38172.786516 22180.098203
9 9 9_0 COMPLETED MBM 17418.738281 18.437265 16.100424 37945.060334 21160.173955
Insights Analysis

Insight Analyses display information to help understand the underlying experiment i.e parameter and metric relationships learned by the Ax model.Use this information to better understand your experiment space and users.

Top Surfaces Analysis: Parameter sensitivity, slice, and contour plots

The top surfaces analysis displays three analyses in one. First, it shows parameter sensitivities, which shows the sensitivity of the metrics in the experiment to the most important parameters. Subsetting to only the most important parameters, it then shows slice plots and contour plots for each metric in the experiment, displaying the relationship between the metric and the most important parameters.

Sensitivity Analysis for intensity

Understand how each parameter affects intensity according to a second-order sensitivity analysis.

Slice Plots: Metric effects by parameter value

These plots show the relationship between a metric and a parameter. They show the predicted values of the metric on the y-axis as a function of the parameter on the x-axis while keeping all other parameters fixed at their status_quo value (if available), best trial value, or the center of the search space.

intensity vs. kbh-radius

The slice plot provides a one-dimensional view of predicted outcomes for intensity as a function of a single parameter, while keeping all other parameters fixed at the center of the search space. This visualization helps in understanding the sensitivity and impact of changes in the selected parameter on the predicted metric outcomes.

intensity vs. kbv-radius

The slice plot provides a one-dimensional view of predicted outcomes for intensity as a function of a single parameter, while keeping all other parameters fixed at the center of the search space. This visualization helps in understanding the sensitivity and impact of changes in the selected parameter on the predicted metric outcomes.

Contour Plots: Metric effects by parameter values

These plots show the relationship between a metric and two parameters. They show the predicted values of the metric (indicated by color) as a function of the two parameters on the x- and y-axes while keeping all other parameters fixed at their status_quo value (if available), best trial value, or the center of the search space.

intensity (Mean) vs. kbv-radius, kbh-radius

The contour plot visualizes the predicted outcomes for intensity across a two-dimensional parameter space, with other parameters held fixed at the center of the search space. 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.

Top Surfaces Analysis: Parameter sensitivity, slice, and contour plots

The top surfaces analysis displays three analyses in one. First, it shows parameter sensitivities, which shows the sensitivity of the metrics in the experiment to the most important parameters. Subsetting to only the most important parameters, it then shows slice plots and contour plots for each metric in the experiment, displaying the relationship between the metric and the most important parameters.

Sensitivity Analysis for width

Understand how each parameter affects width according to a second-order sensitivity analysis.

Slice Plots: Metric effects by parameter value

These plots show the relationship between a metric and a parameter. They show the predicted values of the metric on the y-axis as a function of the parameter on the x-axis while keeping all other parameters fixed at their status_quo value (if available), best trial value, or the center of the search space.

width vs. kbh-radius

The slice plot provides a one-dimensional view of predicted outcomes for width as a function of a single parameter, while keeping all other parameters fixed at the center of the search space. This visualization helps in understanding the sensitivity and impact of changes in the selected parameter on the predicted metric outcomes.

width vs. kbv-radius

The slice plot provides a one-dimensional view of predicted outcomes for width as a function of a single parameter, while keeping all other parameters fixed at the center of the search space. This visualization helps in understanding the sensitivity and impact of changes in the selected parameter on the predicted metric outcomes.

Contour Plots: Metric effects by parameter values

These plots show the relationship between a metric and two parameters. They show the predicted values of the metric (indicated by color) as a function of the two parameters on the x- and y-axes while keeping all other parameters fixed at their status_quo value (if available), best trial value, or the center of the search space.

width (Mean) vs. kbv-radius, kbh-radius

The contour plot visualizes the predicted outcomes for width across a two-dimensional parameter space, with other parameters held fixed at the center of the search space. 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.

Top Surfaces Analysis: Parameter sensitivity, slice, and contour plots

The top surfaces analysis displays three analyses in one. First, it shows parameter sensitivities, which shows the sensitivity of the metrics in the experiment to the most important parameters. Subsetting to only the most important parameters, it then shows slice plots and contour plots for each metric in the experiment, displaying the relationship between the metric and the most important parameters.

Sensitivity Analysis for height

Understand how each parameter affects height according to a second-order sensitivity analysis.

Slice Plots: Metric effects by parameter value

These plots show the relationship between a metric and a parameter. They show the predicted values of the metric on the y-axis as a function of the parameter on the x-axis while keeping all other parameters fixed at their status_quo value (if available), best trial value, or the center of the search space.

height vs. kbv-radius

The slice plot provides a one-dimensional view of predicted outcomes for height as a function of a single parameter, while keeping all other parameters fixed at the center of the search space. This visualization helps in understanding the sensitivity and impact of changes in the selected parameter on the predicted metric outcomes.

height vs. kbh-radius

The slice plot provides a one-dimensional view of predicted outcomes for height as a function of a single parameter, while keeping all other parameters fixed at the center of the search space. This visualization helps in understanding the sensitivity and impact of changes in the selected parameter on the predicted metric outcomes.

Contour Plots: Metric effects by parameter values

These plots show the relationship between a metric and two parameters. They show the predicted values of the metric (indicated by color) as a function of the two parameters on the x- and y-axes while keeping all other parameters fixed at their status_quo value (if available), best trial value, or the center of the search space.

height (Mean) vs. kbv-radius, kbh-radius

The contour plot visualizes the predicted outcomes for height across a two-dimensional parameter space, with other parameters held fixed at the center of the search space. 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.

Diagnostic Analysis

Diagnostic Analyses provide information about the optimization process and the quality of the model fit. You can use this information to understand if the experimental design should be adjusted to improve optimization quality.

Cross Validation: Assessing model fit

Cross-validation plots display the model fit for each metric in the experiment. The model is trained on a subset of the data and then predicts the outcome for the remaining subset. The plots show the predicted outcome for the validation set on the y-axis against its actual value on the x-axis. Points that align closely with the dotted diagonal line indicate a strong model fit, signifying accurate predictions. Additionally, the plots include confidence intervals that provide insight into the noise in observations and the uncertainty in model predictions.

NOTE: A horizontal, flat line of predictions indicates that the model has not picked up on sufficient signal in the data, and instead is just predicting the mean.

Cross Validation for intensity (R² = 0.88)

The cross-validation plot displays the model fit for each metric in the experiment. It employs a leave-one-out approach, where the model is trained on all data except one sample, which is used for validation. The plot shows the predicted outcome for the validation set on the y-axis against its actual value on the x-axis. Points that align closely with the dotted diagonal line indicate a strong model fit, signifying accurate predictions. Additionally, the plot includes 95% confidence intervals that provide insight into the noise in observations and the uncertainty in model predictions. A horizontal, flat line of predictions indicates that the model has not picked up on sufficient signal in the data, and instead is just predicting the mean.

Cross Validation for width (R² = 0.88)

The cross-validation plot displays the model fit for each metric in the experiment. It employs a leave-one-out approach, where the model is trained on all data except one sample, which is used for validation. The plot shows the predicted outcome for the validation set on the y-axis against its actual value on the x-axis. Points that align closely with the dotted diagonal line indicate a strong model fit, signifying accurate predictions. Additionally, the plot includes 95% confidence intervals that provide insight into the noise in observations and the uncertainty in model predictions. A horizontal, flat line of predictions indicates that the model has not picked up on sufficient signal in the data, and instead is just predicting the mean.

Cross Validation for height (R² = 0.88)

The cross-validation plot displays the model fit for each metric in the experiment. It employs a leave-one-out approach, where the model is trained on all data except one sample, which is used for validation. The plot shows the predicted outcome for the validation set on the y-axis against its actual value on the x-axis. Points that align closely with the dotted diagonal line indicate a strong model fit, signifying accurate predictions. Additionally, the plot includes 95% confidence intervals that provide insight into the noise in observations and the uncertainty in model predictions. A horizontal, flat line of predictions indicates that the model has not picked up on sufficient signal in the data, and instead is just predicting the mean.

Generation Strategy Graph

GenerationStrategy: Center+Sobol+MBM:fast Visualize the structure of a GenerationStrategy as a directed graph. Each node represents a GenerationNode in the strategy, and edges represent transitions between nodes based on TransitionCriterion. Edge labels show the criterion class names that trigger the transition.

b'\n\n\n\n\n\nGenerationStrategy\n\n\n\nCenterOfSearchSpace\n\nCenterOfSearchSpace\n()\n\n\n\nSobol\n\nSobol\n\n\n\nCenterOfSearchSpace->Sobol\n\n\nAutoTransitionAfterGen\n\n\n\nMBM\n\nMBM\n(BoTorch)\n\n\n\nSobol->MBM\n\n\nMinTrials(5)\nMinTrials(2)\n\n\n\n'

This runs all applicable analyses for the current experiment state, including health checks that flag potential issues like model fit problems or exploration gaps. Review these before continuing.

Continuing the Optimization#

The optimization state is preserved, so we can simply run more iterations:

# Run remaining 20 iterations
RE(agent.optimize(20))

╭───────────────────────────────────────────────── Optimization ──────────────────────────────────────────────────╮
 Optimizer  AxOptimizer                                                                                          
 Actuators  kbv-radius, kbh-radius                                                                               
 Sensors    det                                                                                                  
 Iterations 20 more (10 completed, 30 total)                                                                     
 Run UID    74df2b0b-ec49-47b7-838d-2383b2924ba3                                                                 
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/adapter/transforms/winsorize.py:126: AxOptimizationWarning: Encountered a `MultiObjective` without objective thresholds. We will winsorize each objective separately. We strongly recommend specifying the objective thresholds when using multi-objective optimization.
  metric_signature: _get_cutoffs(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/generators/torch/botorch_moo_utils.py:268: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.detach().clone() or sourceTensor.detach().clone().requires_grad_(True), rather than torch.tensor(sourceTensor).
  obj_mask = torch.tensor(obj_indices, device=objective_weights.device)
[INFO 05-19 23:16:41] ax.api.client: Generated new trial 10 with parameters {'kbv-radius': 45000.0, 'kbh-radius': 21297.931526} 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 05-19 23:16:42] 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(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/adapter/transforms/winsorize.py:126: AxOptimizationWarning: Encountered a `MultiObjective` without objective thresholds. We will winsorize each objective separately. We strongly recommend specifying the objective thresholds when using multi-objective optimization.
  metric_signature: _get_cutoffs(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/generators/torch/botorch_moo_utils.py:268: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.detach().clone() or sourceTensor.detach().clone().requires_grad_(True), rather than torch.tensor(sourceTensor).
  obj_mask = torch.tensor(obj_indices, device=objective_weights.device)
[INFO 05-19 23:16:46] ax.api.client: Generated new trial 11 with parameters {'kbv-radius': 38104.169617, 'kbh-radius': 19400.096171} 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 05-19 23:16:46] 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(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/adapter/transforms/winsorize.py:126: AxOptimizationWarning: Encountered a `MultiObjective` without objective thresholds. We will winsorize each objective separately. We strongly recommend specifying the objective thresholds when using multi-objective optimization.
  metric_signature: _get_cutoffs(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/generators/torch/botorch_moo_utils.py:268: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.detach().clone() or sourceTensor.detach().clone().requires_grad_(True), rather than torch.tensor(sourceTensor).
  obj_mask = torch.tensor(obj_indices, device=objective_weights.device)
[INFO 05-19 23:16:50] ax.api.client: Generated new trial 12 with parameters {'kbv-radius': 38132.798794, 'kbh-radius': 20084.276437} 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 05-19 23:16:51] 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(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/adapter/transforms/winsorize.py:126: AxOptimizationWarning: Encountered a `MultiObjective` without objective thresholds. We will winsorize each objective separately. We strongly recommend specifying the objective thresholds when using multi-objective optimization.
  metric_signature: _get_cutoffs(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/generators/torch/botorch_moo_utils.py:268: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.detach().clone() or sourceTensor.detach().clone().requires_grad_(True), rather than torch.tensor(sourceTensor).
  obj_mask = torch.tensor(obj_indices, device=objective_weights.device)
[INFO 05-19 23:16:57] ax.api.client: Generated new trial 13 with parameters {'kbv-radius': 37843.38616, 'kbh-radius': 20604.102296} 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 05-19 23:16:58] 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(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/adapter/transforms/winsorize.py:126: AxOptimizationWarning: Encountered a `MultiObjective` without objective thresholds. We will winsorize each objective separately. We strongly recommend specifying the objective thresholds when using multi-objective optimization.
  metric_signature: _get_cutoffs(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/generators/torch/botorch_moo_utils.py:268: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.detach().clone() or sourceTensor.detach().clone().requires_grad_(True), rather than torch.tensor(sourceTensor).
  obj_mask = torch.tensor(obj_indices, device=objective_weights.device)
[INFO 05-19 23:17:03] ax.api.client: Generated new trial 14 with parameters {'kbv-radius': 37730.255672, 'kbh-radius': 21567.978728} 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 05-19 23:17:04] 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(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/adapter/transforms/winsorize.py:126: AxOptimizationWarning: Encountered a `MultiObjective` without objective thresholds. We will winsorize each objective separately. We strongly recommend specifying the objective thresholds when using multi-objective optimization.
  metric_signature: _get_cutoffs(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/generators/torch/botorch_moo_utils.py:268: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.detach().clone() or sourceTensor.detach().clone().requires_grad_(True), rather than torch.tensor(sourceTensor).
  obj_mask = torch.tensor(obj_indices, device=objective_weights.device)
[INFO 05-19 23:17:11] ax.api.client: Generated new trial 15 with parameters {'kbv-radius': 37757.938877, 'kbh-radius': 19752.539451} 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 05-19 23:17:11] 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(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/adapter/transforms/winsorize.py:126: AxOptimizationWarning: Encountered a `MultiObjective` without objective thresholds. We will winsorize each objective separately. We strongly recommend specifying the objective thresholds when using multi-objective optimization.
  metric_signature: _get_cutoffs(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/generators/torch/botorch_moo_utils.py:268: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.detach().clone() or sourceTensor.detach().clone().requires_grad_(True), rather than torch.tensor(sourceTensor).
  obj_mask = torch.tensor(obj_indices, device=objective_weights.device)
[INFO 05-19 23:17:19] ax.api.client: Generated new trial 16 with parameters {'kbv-radius': 38131.425354, 'kbh-radius': 21436.729972} 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 05-19 23:17:19] 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(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/adapter/transforms/winsorize.py:126: AxOptimizationWarning: Encountered a `MultiObjective` without objective thresholds. We will winsorize each objective separately. We strongly recommend specifying the objective thresholds when using multi-objective optimization.
  metric_signature: _get_cutoffs(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/generators/torch/botorch_moo_utils.py:268: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.detach().clone() or sourceTensor.detach().clone().requires_grad_(True), rather than torch.tensor(sourceTensor).
  obj_mask = torch.tensor(obj_indices, device=objective_weights.device)
[INFO 05-19 23:17:27] ax.api.client: Generated new trial 17 with parameters {'kbv-radius': 37911.504184, 'kbh-radius': 19571.214697} 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 05-19 23:17:27] 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(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/adapter/transforms/winsorize.py:126: AxOptimizationWarning: Encountered a `MultiObjective` without objective thresholds. We will winsorize each objective separately. We strongly recommend specifying the objective thresholds when using multi-objective optimization.
  metric_signature: _get_cutoffs(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/generators/torch/botorch_moo_utils.py:268: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.detach().clone() or sourceTensor.detach().clone().requires_grad_(True), rather than torch.tensor(sourceTensor).
  obj_mask = torch.tensor(obj_indices, device=objective_weights.device)
[INFO 05-19 23:17:35] ax.api.client: Generated new trial 18 with parameters {'kbv-radius': 37614.351653, 'kbh-radius': 22257.770318} 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 05-19 23:17:35] 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(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/adapter/transforms/winsorize.py:126: AxOptimizationWarning: Encountered a `MultiObjective` without objective thresholds. We will winsorize each objective separately. We strongly recommend specifying the objective thresholds when using multi-objective optimization.
  metric_signature: _get_cutoffs(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/generators/torch/botorch_moo_utils.py:268: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.detach().clone() or sourceTensor.detach().clone().requires_grad_(True), rather than torch.tensor(sourceTensor).
  obj_mask = torch.tensor(obj_indices, device=objective_weights.device)
[INFO 05-19 23:17:44] ax.api.client: Generated new trial 19 with parameters {'kbv-radius': 37955.608868, 'kbh-radius': 19914.222231} 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 05-19 23:17:44] 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(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/adapter/transforms/winsorize.py:126: AxOptimizationWarning: Encountered a `MultiObjective` without objective thresholds. We will winsorize each objective separately. We strongly recommend specifying the objective thresholds when using multi-objective optimization.
  metric_signature: _get_cutoffs(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/generators/torch/botorch_moo_utils.py:268: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.detach().clone() or sourceTensor.detach().clone().requires_grad_(True), rather than torch.tensor(sourceTensor).
  obj_mask = torch.tensor(obj_indices, device=objective_weights.device)
[INFO 05-19 23:17:48] ax.api.client: Generated new trial 20 with parameters {'kbv-radius': 37438.314498, 'kbh-radius': 20590.477946} 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 05-19 23:17:48] 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(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/adapter/transforms/winsorize.py:126: AxOptimizationWarning: Encountered a `MultiObjective` without objective thresholds. We will winsorize each objective separately. We strongly recommend specifying the objective thresholds when using multi-objective optimization.
  metric_signature: _get_cutoffs(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/generators/torch/botorch_moo_utils.py:268: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.detach().clone() or sourceTensor.detach().clone().requires_grad_(True), rather than torch.tensor(sourceTensor).
  obj_mask = torch.tensor(obj_indices, device=objective_weights.device)
[INFO 05-19 23:17:56] ax.api.client: Generated new trial 21 with parameters {'kbv-radius': 37969.278962, 'kbh-radius': 20252.639384} 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 05-19 23:17:57] 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(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/adapter/transforms/winsorize.py:126: AxOptimizationWarning: Encountered a `MultiObjective` without objective thresholds. We will winsorize each objective separately. We strongly recommend specifying the objective thresholds when using multi-objective optimization.
  metric_signature: _get_cutoffs(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/generators/torch/botorch_moo_utils.py:268: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.detach().clone() or sourceTensor.detach().clone().requires_grad_(True), rather than torch.tensor(sourceTensor).
  obj_mask = torch.tensor(obj_indices, device=objective_weights.device)
[INFO 05-19 23:18:04] ax.api.client: Generated new trial 22 with parameters {'kbv-radius': 38039.962221, 'kbh-radius': 19688.178462} 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 05-19 23:18:05] 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(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/adapter/transforms/winsorize.py:126: AxOptimizationWarning: Encountered a `MultiObjective` without objective thresholds. We will winsorize each objective separately. We strongly recommend specifying the objective thresholds when using multi-objective optimization.
  metric_signature: _get_cutoffs(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/generators/torch/botorch_moo_utils.py:268: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.detach().clone() or sourceTensor.detach().clone().requires_grad_(True), rather than torch.tensor(sourceTensor).
  obj_mask = torch.tensor(obj_indices, device=objective_weights.device)
[INFO 05-19 23:18:13] ax.api.client: Generated new trial 23 with parameters {'kbv-radius': 28222.041704, 'kbh-radius': 20651.869965} 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 05-19 23:18:14] 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(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/adapter/transforms/winsorize.py:126: AxOptimizationWarning: Encountered a `MultiObjective` without objective thresholds. We will winsorize each objective separately. We strongly recommend specifying the objective thresholds when using multi-objective optimization.
  metric_signature: _get_cutoffs(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/generators/torch/botorch_moo_utils.py:268: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.detach().clone() or sourceTensor.detach().clone().requires_grad_(True), rather than torch.tensor(sourceTensor).
  obj_mask = torch.tensor(obj_indices, device=objective_weights.device)
[INFO 05-19 23:18:23] ax.api.client: Generated new trial 24 with parameters {'kbv-radius': 38135.295949, 'kbh-radius': 19510.65259} 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 05-19 23:18:24] 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(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/adapter/transforms/winsorize.py:126: AxOptimizationWarning: Encountered a `MultiObjective` without objective thresholds. We will winsorize each objective separately. We strongly recommend specifying the objective thresholds when using multi-objective optimization.
  metric_signature: _get_cutoffs(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/generators/torch/botorch_moo_utils.py:268: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.detach().clone() or sourceTensor.detach().clone().requires_grad_(True), rather than torch.tensor(sourceTensor).
  obj_mask = torch.tensor(obj_indices, device=objective_weights.device)
[INFO 05-19 23:18:30] ax.api.client: Generated new trial 25 with parameters {'kbv-radius': 38170.779928, 'kbh-radius': 20673.19283} 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 05-19 23:18:31] 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(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/adapter/transforms/winsorize.py:126: AxOptimizationWarning: Encountered a `MultiObjective` without objective thresholds. We will winsorize each objective separately. We strongly recommend specifying the objective thresholds when using multi-objective optimization.
  metric_signature: _get_cutoffs(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/generators/torch/botorch_moo_utils.py:268: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.detach().clone() or sourceTensor.detach().clone().requires_grad_(True), rather than torch.tensor(sourceTensor).
  obj_mask = torch.tensor(obj_indices, device=objective_weights.device)
[INFO 05-19 23:18:43] ax.api.client: Generated new trial 26 with parameters {'kbv-radius': 38425.638906, 'kbh-radius': 19783.89969} 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 05-19 23:18:43] 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(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/adapter/transforms/winsorize.py:126: AxOptimizationWarning: Encountered a `MultiObjective` without objective thresholds. We will winsorize each objective separately. We strongly recommend specifying the objective thresholds when using multi-objective optimization.
  metric_signature: _get_cutoffs(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/generators/torch/botorch_moo_utils.py:268: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.detach().clone() or sourceTensor.detach().clone().requires_grad_(True), rather than torch.tensor(sourceTensor).
  obj_mask = torch.tensor(obj_indices, device=objective_weights.device)
[INFO 05-19 23:18:52] ax.api.client: Generated new trial 27 with parameters {'kbv-radius': 37936.6938, 'kbh-radius': 20132.645172} 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 05-19 23:18:53] 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(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/adapter/transforms/winsorize.py:126: AxOptimizationWarning: Encountered a `MultiObjective` without objective thresholds. We will winsorize each objective separately. We strongly recommend specifying the objective thresholds when using multi-objective optimization.
  metric_signature: _get_cutoffs(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/generators/torch/botorch_moo_utils.py:268: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.detach().clone() or sourceTensor.detach().clone().requires_grad_(True), rather than torch.tensor(sourceTensor).
  obj_mask = torch.tensor(obj_indices, device=objective_weights.device)
[INFO 05-19 23:19:07] ax.api.client: Generated new trial 28 with parameters {'kbv-radius': 37961.232824, 'kbh-radius': 20404.252868} 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 05-19 23:19:07] 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(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/adapter/transforms/winsorize.py:126: AxOptimizationWarning: Encountered a `MultiObjective` without objective thresholds. We will winsorize each objective separately. We strongly recommend specifying the objective thresholds when using multi-objective optimization.
  metric_signature: _get_cutoffs(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/generators/torch/botorch_moo_utils.py:268: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.detach().clone() or sourceTensor.detach().clone().requires_grad_(True), rather than torch.tensor(sourceTensor).
  obj_mask = torch.tensor(obj_indices, device=objective_weights.device)
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/linear_operator/utils/cholesky.py:41: NumericalWarning: A not p.d., added jitter of 1.0e-08 to the diagonal
  warnings.warn(
[INFO 05-19 23:19:10] ax.api.client: Generated new trial 29 with parameters {'kbv-radius': 38517.554024, 'kbh-radius': 20717.10702} 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 05-19 23:19:11] ax.api.client: Trial 29 marked COMPLETED.
──────────────────────────────────────────────── Iteration 11 / 30 ────────────────────────────────────────────────
  Acquire UID  f994fead-aaaa-4755-a490-7f22d7b100eb
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━┓
 Event  Suggestion ID  kbh-radius  kbv-radius   height  intensity    width 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━┩
│     0 │            10 │    21297.9       45000  90.4341    15185.6  18.8155 
└───────┴───────────────┴────────────┴────────────┴─────────┴───────────┴─────────┘
  height  min: 16.1004  max: 163.306  mean: 48.986
  intensity  min: 4537.94  max: 19184.7  mean: 15372.8
  width  min: 12.4633  max: 214.762  mean: 97.0647
  (11 pts sampled)
──────────────────────────────────────────────── Iteration 12 / 30 ────────────────────────────────────────────────
  Acquire UID  19a0803e-e070-472d-858c-b9c067ea49a0
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━┓
 Event  Suggestion ID  kbh-radius  kbv-radius   height  intensity    width 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━┩
│     0 │            11 │    19400.1     38104.2  17.4942    19119.2  56.7792 
└───────┴───────────────┴────────────┴────────────┴─────────┴───────────┴─────────┘
  height  min: 16.1004  max: 163.306  mean: 46.3617
  intensity  min: 4537.94  max: 19184.7  mean: 15685
  width  min: 12.4633  max: 214.762  mean: 93.7076
  (12 pts sampled)
──────────────────────────────────────────────── Iteration 13 / 30 ────────────────────────────────────────────────
  Acquire UID  b7776bb8-6953-4cb4-a72c-9cafb7df1bd6
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━┓
 Event  Suggestion ID  kbh-radius  kbv-radius   height  intensity   width 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━┩
│     0 │            12 │    20084.3     38132.8  16.7706    17957.2  22.831 
└───────┴───────────────┴────────────┴────────────┴─────────┴───────────┴────────┘
  height  min: 16.1004  max: 163.306  mean: 44.0854
  intensity  min: 4537.94  max: 19184.7  mean: 15859.7
  width  min: 12.4633  max: 214.762  mean: 88.2555
  (13 pts sampled)
──────────────────────────────────────────────── Iteration 14 / 30 ────────────────────────────────────────────────
  Acquire UID  017ea975-a348-4167-b63a-cbf5d723ffdc
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━┓
 Event  Suggestion ID  kbh-radius  kbv-radius   height  intensity    width 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━┩
│     0 │            13 │    20604.1     37843.4  15.7236    17670.3  12.6789 
└───────┴───────────────┴────────────┴────────────┴─────────┴───────────┴─────────┘
  height  min: 15.7236  max: 163.306  mean: 42.0596
  intensity  min: 4537.94  max: 19184.7  mean: 15989.1
  width  min: 12.4633  max: 214.762  mean: 82.8572
  (14 pts sampled)
──────────────────────────────────────────────── Iteration 15 / 30 ────────────────────────────────────────────────
  Acquire UID  e41bac07-1d93-4c8e-b28d-9aca82b743f3
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━┓
 Event  Suggestion ID  kbh-radius  kbv-radius  height  intensity    width 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━┩
│     0 │            14 │      21568     37730.3  17.678    18230.4  33.5166 
└───────┴───────────────┴────────────┴────────────┴────────┴───────────┴─────────┘
  height  min: 15.7236  max: 163.306  mean: 40.4341
  intensity  min: 4537.94  max: 19184.7  mean: 16138.5
  width  min: 12.4633  max: 214.762  mean: 79.5678
  (15 pts sampled)
──────────────────────────────────────────────── Iteration 16 / 30 ────────────────────────────────────────────────
  Acquire UID  d44d3390-11da-4d9a-a94c-a7ed47f01e46
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━┓
 Event  Suggestion ID  kbh-radius  kbv-radius   height  intensity    width 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━┩
│     0 │            15 │    19752.5     37757.9  17.0217    17995.8  36.1757 
└───────┴───────────────┴────────────┴────────────┴─────────┴───────────┴─────────┘
  height  min: 15.7236  max: 163.306  mean: 38.9709
  intensity  min: 4537.94  max: 19184.7  mean: 16254.6
  width  min: 12.4633  max: 214.762  mean: 76.8558
  (16 pts sampled)
──────────────────────────────────────────────── Iteration 17 / 30 ────────────────────────────────────────────────
  Acquire UID  bf2d177f-aefa-4967-bc4d-ad217a78cc0e
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━┓
 Event  Suggestion ID  kbh-radius  kbv-radius   height  intensity    width 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━┩
│     0 │            16 │    21436.7     38131.4  16.9393    17690.9  27.7754 
└───────┴───────────────┴────────────┴────────────┴─────────┴───────────┴─────────┘
  height  min: 15.7236  max: 163.306  mean: 37.6749
  intensity  min: 4537.94  max: 19184.7  mean: 16339.1
  width  min: 12.4633  max: 214.762  mean: 73.9687
  (17 pts sampled)
──────────────────────────────────────────────── Iteration 18 / 30 ────────────────────────────────────────────────
  Acquire UID  8fa3f491-0aaa-4bb1-92e8-b5be41bce304
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━┓
 Event  Suggestion ID  kbh-radius  kbv-radius   height  intensity    width 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━┩
│     0 │            17 │    19571.2     37911.5  17.0275    18439.1  46.4699 
└───────┴───────────────┴────────────┴────────────┴─────────┴───────────┴─────────┘
  height  min: 15.7236  max: 163.306  mean: 36.5278
  intensity  min: 4537.94  max: 19184.7  mean: 16455.7
  width  min: 12.4633  max: 214.762  mean: 72.441
  (18 pts sampled)
──────────────────────────────────────────────── Iteration 19 / 30 ────────────────────────────────────────────────
  Acquire UID  cca36125-09f2-443b-8e20-c53f487d4af0
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━┓
 Event  Suggestion ID  kbh-radius  kbv-radius   height  intensity    width 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━┩
│     0 │            18 │    22257.8     37614.4  19.2355    19193.9  63.5127 
└───────┴───────────────┴────────────┴────────────┴─────────┴───────────┴─────────┘
  height  min: 15.7236  max: 163.306  mean: 35.6177
  intensity  min: 4537.94  max: 19193.9  mean: 16599.8
  width  min: 12.4633  max: 214.762  mean: 71.9711
  (19 pts sampled)
──────────────────────────────────────────────── Iteration 20 / 30 ────────────────────────────────────────────────
  Acquire UID  b5ea3537-1d95-42ff-8228-5ff782598794
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━┓
 Event  Suggestion ID  kbh-radius  kbv-radius   height  intensity    width 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━┩
│     0 │            19 │    19914.2     37955.6  16.2878    17754.3  29.4305 
└───────┴───────────────┴────────────┴────────────┴─────────┴───────────┴─────────┘
  height  min: 15.7236  max: 163.306  mean: 34.6512
  intensity  min: 4537.94  max: 19193.9  mean: 16657.6
  width  min: 12.4633  max: 214.762  mean: 69.8441
  (20 pts sampled)
──────────────────────────────────────────────── Iteration 21 / 30 ────────────────────────────────────────────────
  Acquire UID  a2b920e8-2f44-4ca6-877c-bedb17b39be2
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━┓
 Event  Suggestion ID  kbh-radius  kbv-radius   height  intensity    width 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━┩
│     0 │            20 │    20590.5     37438.3  17.2387    17138.8  12.7727 
└───────┴───────────────┴────────────┴────────────┴─────────┴───────────┴─────────┘
  height  min: 15.7236  max: 163.306  mean: 33.822
  intensity  min: 4537.94  max: 19193.9  mean: 16680.5
  width  min: 12.4633  max: 214.762  mean: 67.1264
  (21 pts sampled)
──────────────────────────────────────────────── Iteration 22 / 30 ────────────────────────────────────────────────
  Acquire UID  c6289f6e-85c3-45a1-a49c-a618db4cfbd6
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━┓
 Event  Suggestion ID  kbh-radius  kbv-radius   height  intensity    width 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━┩
│     0 │            21 │    20252.6     37969.3  15.8739    17464.1  17.4201 
└───────┴───────────────┴────────────┴────────────┴─────────┴───────────┴─────────┘
  height  min: 15.7236  max: 163.306  mean: 33.0062
  intensity  min: 4537.94  max: 19193.9  mean: 16716.1
  width  min: 12.4633  max: 214.762  mean: 64.867
  (22 pts sampled)
──────────────────────────────────────────────── Iteration 23 / 30 ────────────────────────────────────────────────
  Acquire UID  c1438436-a671-426d-b857-f2f69c570590
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━┓
 Event  Suggestion ID  kbh-radius  kbv-radius   height  intensity    width 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━┩
│     0 │            22 │    19688.2       38040  17.0437    18691.1  40.5696 
└───────┴───────────────┴────────────┴────────────┴─────────┴───────────┴─────────┘
  height  min: 15.7236  max: 163.306  mean: 32.3122
  intensity  min: 4537.94  max: 19193.9  mean: 16802
  width  min: 12.4633  max: 214.762  mean: 63.8106
  (23 pts sampled)
──────────────────────────────────────────────── Iteration 24 / 30 ────────────────────────────────────────────────
  Acquire UID  ec02c238-7164-40f0-b4aa-c2424538d176
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━┓
 Event  Suggestion ID  kbh-radius  kbv-radius   height  intensity    width 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━┩
│     0 │            23 │    20651.9       28222  154.674    13634.6  12.3651 
└───────┴───────────────┴────────────┴────────────┴─────────┴───────────┴─────────┘
  height  min: 15.7236  max: 163.306  mean: 37.4106
  intensity  min: 4537.94  max: 19193.9  mean: 16670
  width  min: 12.3651  max: 214.762  mean: 61.667
  (24 pts sampled)
──────────────────────────────────────────────── Iteration 25 / 30 ────────────────────────────────────────────────
  Acquire UID  6519fc83-a8c7-4f24-8df7-240f60f07b34
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━┓
 Event  Suggestion ID  kbh-radius  kbv-radius   height  intensity    width 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━┩
│     0 │            24 │    19510.7     38135.3  17.1273    18975.7  50.6082 
└───────┴───────────────┴────────────┴────────────┴─────────┴───────────┴─────────┘
  height  min: 15.7236  max: 163.306  mean: 36.5993
  intensity  min: 4537.94  max: 19193.9  mean: 16762.2
  width  min: 12.3651  max: 214.762  mean: 61.2247
  (25 pts sampled)
──────────────────────────────────────────────── Iteration 26 / 30 ────────────────────────────────────────────────
  Acquire UID  3120fe04-b17b-4ab2-a748-71f9c59d3a34
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━┓
 Event  Suggestion ID  kbh-radius  kbv-radius  height  intensity    width 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━┩
│     0 │            25 │    20673.2     38170.8  15.739    17357.8  12.4443 
└───────┴───────────────┴────────────┴────────────┴────────┴───────────┴─────────┘
  height  min: 15.7236  max: 163.306  mean: 35.797
  intensity  min: 4537.94  max: 19193.9  mean: 16785.1
  width  min: 12.3651  max: 214.762  mean: 59.3485
  (26 pts sampled)
──────────────────────────────────────────────── Iteration 27 / 30 ────────────────────────────────────────────────
  Acquire UID  eb5ccc88-32d5-4052-b62e-6d068bc6e64c
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━┓
 Event  Suggestion ID  kbh-radius  kbv-radius   height  intensity    width 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━┩
│     0 │            26 │    19783.9     38425.6  17.9878    17786.6  34.5984 
└───────┴───────────────┴────────────┴────────────┴─────────┴───────────┴─────────┘
  height  min: 15.7236  max: 163.306  mean: 35.1374
  intensity  min: 4537.94  max: 19193.9  mean: 16822.2
  width  min: 12.3651  max: 214.762  mean: 58.4319
  (27 pts sampled)
──────────────────────────────────────────────── Iteration 28 / 30 ────────────────────────────────────────────────
  Acquire UID  57d1d506-a717-4e79-830d-cf21c0293aea
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━┓
 Event  Suggestion ID  kbh-radius  kbv-radius   height  intensity    width 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━┩
│     0 │            27 │    20132.6     37936.7  16.0424    17591.6  21.0855 
└───────┴───────────────┴────────────┴────────────┴─────────┴───────────┴─────────┘
  height  min: 15.7236  max: 163.306  mean: 34.4554
  intensity  min: 4537.94  max: 19193.9  mean: 16849.7
  width  min: 12.3651  max: 214.762  mean: 57.0981
  (28 pts sampled)
──────────────────────────────────────────────── Iteration 29 / 30 ────────────────────────────────────────────────
  Acquire UID  df9d3020-1efc-4aa3-bb9f-d4ebeeef1420
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━┓
 Event  Suggestion ID  kbh-radius  kbv-radius   height  intensity    width 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━┩
│     0 │            28 │    20404.3     37961.2  15.6054    17265.2  14.0636 
└───────┴───────────────┴────────────┴────────────┴─────────┴───────────┴─────────┘
  height  min: 15.6054  max: 163.306  mean: 33.8054
  intensity  min: 4537.94  max: 19193.9  mean: 16864
  width  min: 12.3651  max: 214.762  mean: 55.6141
  (29 pts sampled)
──────────────────────────────────────────────── Iteration 30 / 30 ────────────────────────────────────────────────
  Acquire UID  2e7e65a5-e2d7-4fae-a555-4ae679d700bf
┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━┓
 Event  Suggestion ID  kbh-radius  kbv-radius   height  intensity    width 
┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━┩
│     0 │            29 │    20717.1     38517.6  17.2635    17206.9  12.7825 
└───────┴───────────────┴────────────┴────────────┴─────────┴───────────┴─────────┘
  height  min: 15.6054  max: 163.306  mean: 33.254
  intensity  min: 4537.94  max: 19193.9  mean: 16875.5
  width  min: 12.3651  max: 214.762  mean: 54.1864
  (30 pts sampled)

                           Summary Statistics                           
┏━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━┳━━━━━━━┓
 Name        Type         Min      Max     Mean      Std  Count 
┡━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━╇━━━━━━━┩
 kbh-radius │ param   │ 15635.2  34549.1  21401.3  3169.04 │    30 │
 kbv-radius │ param   │ 25536.4    45000  37381.8  3360.67 │    30 │
 height     │ outcome │ 15.6054  163.306   33.254  38.9681 │    30 │
 intensity  │ outcome │ 4537.94  19193.9  16875.5  3070.89 │    30 │
 width      │ outcome │ 12.3651  214.762  54.1864  58.6942 │    30 │
└────────────┴─────────┴─────────┴─────────┴─────────┴─────────┴───────┘
────────────────────────────────────────────── Optimization Complete ──────────────────────────────────────────────

('74df2b0b-ec49-47b7-838d-2383b2924ba3',
 'f994fead-aaaa-4755-a490-7f22d7b100eb',
 '19a0803e-e070-472d-858c-b9c067ea49a0',
 'b7776bb8-6953-4cb4-a72c-9cafb7df1bd6',
 '017ea975-a348-4167-b63a-cbf5d723ffdc',
 'e41bac07-1d93-4c8e-b28d-9aca82b743f3',
 'd44d3390-11da-4d9a-a94c-a7ed47f01e46',
 'bf2d177f-aefa-4967-bc4d-ad217a78cc0e',
 '8fa3f491-0aaa-4bb1-92e8-b5be41bce304',
 'cca36125-09f2-443b-8e20-c53f487d4af0',
 'b5ea3537-1d95-42ff-8228-5ff782598794',
 'a2b920e8-2f44-4ca6-877c-bedb17b39be2',
 'c6289f6e-85c3-45a1-a49c-a618db4cfbd6',
 'c1438436-a671-426d-b857-f2f69c570590',
 'ec02c238-7164-40f0-b4aa-c2424538d176',
 '6519fc83-a8c7-4f24-8df7-240f60f07b34',
 '3120fe04-b17b-4ab2-a748-71f9c59d3a34',
 'eb5ccc88-32d5-4052-b62e-6d068bc6e64c',
 '57d1d506-a717-4e79-830d-cf21c0293aea',
 'df9d3020-1efc-4aa3-bb9f-d4ebeeef1420',
 '2e7e65a5-e2d7-4fae-a555-4ae679d700bf')

Understanding the Results#

After optimization, we can examine what the agent learned. Let’s run the full suite of analyses again to see how things have improved:

_ = agent.ax_client.compute_analyses()
/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(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/adapter/transforms/winsorize.py:126: AxOptimizationWarning: Encountered a `MultiObjective` without objective thresholds. We will winsorize each objective separately. We strongly recommend specifying the objective thresholds when using multi-objective optimization.
  metric_signature: _get_cutoffs(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/generators/torch/botorch_moo_utils.py:268: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.detach().clone() or sourceTensor.detach().clone().requires_grad_(True), rather than torch.tensor(sourceTensor).
  obj_mask = torch.tensor(obj_indices, device=objective_weights.device)
[INFO 05-19 23:19:12] ax.service.utils.best_point: Using inferred objective thresholds: [ObjectiveThreshold(intensity >= 17951.211424097368), ObjectiveThreshold(width <= 64.24674825327826), ObjectiveThreshold(height <= 19.155096827531835)], as objective thresholds were not specified as part of the optimization configuration on the experiment.
/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(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/adapter/transforms/winsorize.py:126: AxOptimizationWarning: Encountered a `MultiObjective` without objective thresholds. We will winsorize each objective separately. We strongly recommend specifying the objective thresholds when using multi-objective optimization.
  metric_signature: _get_cutoffs(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/generators/torch/botorch_moo_utils.py:268: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.detach().clone() or sourceTensor.detach().clone().requires_grad_(True), rather than torch.tensor(sourceTensor).
  obj_mask = torch.tensor(obj_indices, device=objective_weights.device)
[INFO 05-19 23:19:17] ax.service.utils.best_point: Using inferred objective thresholds: [ObjectiveThreshold(intensity >= 17951.211424097368), ObjectiveThreshold(width <= 64.24674825327826), ObjectiveThreshold(height <= 19.155096827531835)], as objective thresholds were not specified as part of the optimization configuration on the experiment.
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/adapter/transforms/winsorize.py:126: AxOptimizationWarning: Encountered a `MultiObjective` without objective thresholds. We will winsorize each objective separately. We strongly recommend specifying the objective thresholds when using multi-objective optimization.
  metric_signature: _get_cutoffs(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/generators/torch/botorch_moo_utils.py:268: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.detach().clone() or sourceTensor.detach().clone().requires_grad_(True), rather than torch.tensor(sourceTensor).
  obj_mask = torch.tensor(obj_indices, device=objective_weights.device)
[INFO 05-19 23:19:17] ax.service.utils.best_point: Using inferred objective thresholds: [ObjectiveThreshold(intensity >= 17951.211424097368), ObjectiveThreshold(width <= 64.24674825327826), ObjectiveThreshold(height <= 19.155096827531835)], as objective thresholds were not specified as part of the optimization configuration on the experiment.
Overview of the Entire Optimization Process

This analysis provides an overview of the entire optimization process. It includes visualizations of the results obtained so far, insights into the parameter and metric relationships learned by the Ax model, diagnostics such as model fit, and health checks to assess the overall health of the experiment.

Results Analysis

Result Analyses provide a high-level overview of the results of the optimization process so far with respect to the metrics specified in experiment design.

Metric Effects: Predicted and observed effects for all arms in the experiment

These pair of plots visualize the metric effects for each arm, with the Ax model predictions on the left and the raw observed data on the right. The predicted effects apply shrinkage for noise and adjust for non-stationarity in the data, so they are more representative of the reproducible effects that will manifest in a long-term validation experiment.

Metric Effects Pair for intensity

Modeled Arm Effects on intensity

Modeled effects on intensity. This plot visualizes predictions of the true metric changes for each arm based on Ax's model. This is the expected delta you would expect if you (re-)ran that arm. This plot helps in anticipating the outcomes and performance of arms based on the model's predictions. Note, flat predictions across arms indicate that the model predicts that there is no effect, meaning if you were to re-run the experiment, the delta you would see would be small and fall within the confidence interval indicated in the plot.

Observed Arm Effects on intensity

Observed effects on intensity. This plot visualizes the effects from previously-run arms on a specific metric, providing insights into their performance. This plot allows one to compare and contrast the effectiveness of different arms, highlighting which configurations have yielded the most favorable outcomes.

Metric Effects Pair for width

Modeled Arm Effects on width

Modeled effects on width. This plot visualizes predictions of the true metric changes for each arm based on Ax's model. This is the expected delta you would expect if you (re-)ran that arm. This plot helps in anticipating the outcomes and performance of arms based on the model's predictions. Note, flat predictions across arms indicate that the model predicts that there is no effect, meaning if you were to re-run the experiment, the delta you would see would be small and fall within the confidence interval indicated in the plot.

Observed Arm Effects on width

Observed effects on width. This plot visualizes the effects from previously-run arms on a specific metric, providing insights into their performance. This plot allows one to compare and contrast the effectiveness of different arms, highlighting which configurations have yielded the most favorable outcomes.

Metric Effects Pair for height

Modeled Arm Effects on height

Modeled effects on height. This plot visualizes predictions of the true metric changes for each arm based on Ax's model. This is the expected delta you would expect if you (re-)ran that arm. This plot helps in anticipating the outcomes and performance of arms based on the model's predictions. Note, flat predictions across arms indicate that the model predicts that there is no effect, meaning if you were to re-run the experiment, the delta you would see would be small and fall within the confidence interval indicated in the plot.

Observed Arm Effects on height

Observed effects on height. This plot visualizes the effects from previously-run arms on a specific metric, providing insights into their performance. This plot allows one to compare and contrast the effectiveness of different arms, highlighting which configurations have yielded the most favorable outcomes.

Scatter Plot (Objectives)

These plots display the effects of each arm on two metrics displayed on the x- and y-axes. They are useful for understanding the trade-off between the two metrics and for visualizing the Pareto frontier.

Modeled Effects: intensity vs. width

This plot displays the effects of each arm on the two selected metrics. It is useful for understanding the trade-off between the two metrics and for visualizing the Pareto frontier.

Modeled Effects: intensity vs. height

This plot displays the effects of each arm on the two selected metrics. It is useful for understanding the trade-off between the two metrics and for visualizing the Pareto frontier.

Modeled Effects: width vs. height

This plot displays the effects of each arm on the two selected metrics. It is useful for understanding the trade-off between the two metrics and for visualizing the Pareto frontier.

Utility Progression

Shows the hypervolume of the Pareto frontier achieved so far across completed trials. The x-axis shows trace index, which counts completed or early-stopped trials sequentially (1, 2, 3, ...). This differs from trial index, which may have gaps if some trials failed or were abandoned. For example, if trials 0, 2, and 5 completed while trials 1, 3, and 4 failed, the trace indices would be 1, 2, 3 corresponding to trial indices 0, 2, 5. The y-axis shows cumulative best hypervolume—only improvements, so flat segments indicate trials that didn't improve the frontier. Hypervolume measures the volume of objective space dominated by the Pareto frontier. Infeasible trials (violating outcome constraints) don't contribute to the improvements.

Pareto Frontier Trials for Experiment

Displays trials on the Pareto frontier based on raw observations. This reflects actual measured performance during execution. No trial is strictly better across all objectives. These trials represent optimal trade-offs between competing objectives. Use this to understand the available trade-offs and select a trial that best balances your optimization goals. Only considering COMPLETED trials.

trial_index arm_name trial_status generation_node intensity width height kbv-radius kbh-radius
0 22 22_0 COMPLETED MBM 18691.136719 40.569580 17.043682 38039.962221 19688.178462
1 24 24_0 COMPLETED MBM 18975.738281 50.608227 17.127310 38135.295949 19510.652590
2 17 17_0 COMPLETED MBM 18439.074219 46.469910 17.027487 37911.504184 19571.214697
3 11 11_0 COMPLETED MBM 19119.156250 56.779202 17.494156 38104.169617 19400.096171
4 14 14_0 COMPLETED MBM 18230.425781 33.516594 17.677996 37730.255672 21567.978728
5 15 15_0 COMPLETED MBM 17995.777344 36.175663 17.021694 37757.938877 19752.539451
6 8 8_0 COMPLETED MBM 19184.667969 59.861458 18.811335 38172.786516 22180.098203
7 12 12_0 COMPLETED MBM 17957.171875 22.831009 16.770588 38132.798794 20084.276437
Summary for xrt-blop-demo

High-level summary of the `Trial`-s in this `Experiment`

trial_index arm_name trial_status generation_node intensity width height kbv-radius kbh-radius
0 0 0_0 COMPLETED CenterOfSearchSpace 16514.632812 148.884308 51.572174 35000.000000 25000.000000
1 1 1_0 COMPLETED Sobol 15013.800781 185.068909 34.016315 40107.185841 27243.521214
2 2 2_0 COMPLETED Sobol 4537.941406 204.823288 163.306183 25536.393207 15635.150261
3 3 3_0 COMPLETED Sobol 9043.417969 214.761841 85.141525 33238.535039 34549.125936
4 4 4_0 COMPLETED Sobol 18690.957031 113.003830 21.075401 38669.002708 23646.320775
5 5 5_0 COMPLETED MBM 19027.859375 67.564415 23.774429 38966.895985 22380.850116
6 6 6_0 COMPLETED MBM 17221.683594 12.463347 16.742319 38386.946684 20571.465701
7 7 7_0 COMPLETED MBM 17261.140625 24.027714 17.871607 38432.989625 21381.016840
8 8 8_0 COMPLETED MBM 19184.667969 59.861458 18.811335 38172.786516 22180.098203
9 9 9_0 COMPLETED MBM 17418.738281 18.437265 16.100424 37945.060334 21160.173955
10 10 10_0 COMPLETED MBM 15185.558594 18.815474 90.434082 45000.000000 21297.931526
11 11 11_0 COMPLETED MBM 19119.156250 56.779202 17.494156 38104.169617 19400.096171
12 12 12_0 COMPLETED MBM 17957.171875 22.831009 16.770588 38132.798794 20084.276437
13 13 13_0 COMPLETED MBM 17670.261719 12.678870 15.723617 37843.386160 20604.102296
14 14 14_0 COMPLETED MBM 18230.425781 33.516594 17.677996 37730.255672 21567.978728
15 15 15_0 COMPLETED MBM 17995.777344 36.175663 17.021694 37757.938877 19752.539451
16 16 16_0 COMPLETED MBM 17690.945312 27.775412 16.939339 38131.425354 21436.729972
17 17 17_0 COMPLETED MBM 18439.074219 46.469910 17.027487 37911.504184 19571.214697
18 18 18_0 COMPLETED MBM 19193.875000 63.512718 19.235533 37614.351653 22257.770318
19 19 19_0 COMPLETED MBM 17754.332031 29.430490 16.287758 37955.608868 19914.222231
20 20 20_0 COMPLETED MBM 17138.769531 12.772702 17.238726 37438.314498 20590.477946
21 21 21_0 COMPLETED MBM 17464.113281 17.420095 15.873864 37969.278962 20252.639384
22 22 22_0 COMPLETED MBM 18691.136719 40.569580 17.043682 38039.962221 19688.178462
23 23 23_0 COMPLETED MBM 13634.648438 12.365093 154.674469 28222.041704 20651.869965
24 24 24_0 COMPLETED MBM 18975.738281 50.608227 17.127310 38135.295949 19510.652590
25 25 25_0 COMPLETED MBM 17357.804688 12.444318 15.738993 38170.779928 20673.192830
26 26 26_0 COMPLETED MBM 17786.605469 34.598392 17.987768 38425.638906 19783.899690
27 27 27_0 COMPLETED MBM 17591.617188 21.085464 16.042383 37936.693800 20132.645172
28 28 28_0 COMPLETED MBM 17265.238281 14.063565 15.605353 37961.232824 20404.252868
29 29 29_0 COMPLETED MBM 17206.882812 12.782537 17.263485 38517.554024 20717.107020
Insights Analysis

Insight Analyses display information to help understand the underlying experiment i.e parameter and metric relationships learned by the Ax model.Use this information to better understand your experiment space and users.

Top Surfaces Analysis: Parameter sensitivity, slice, and contour plots

The top surfaces analysis displays three analyses in one. First, it shows parameter sensitivities, which shows the sensitivity of the metrics in the experiment to the most important parameters. Subsetting to only the most important parameters, it then shows slice plots and contour plots for each metric in the experiment, displaying the relationship between the metric and the most important parameters.

Sensitivity Analysis for intensity

Understand how each parameter affects intensity according to a second-order sensitivity analysis.

Slice Plots: Metric effects by parameter value

These plots show the relationship between a metric and a parameter. They show the predicted values of the metric on the y-axis as a function of the parameter on the x-axis while keeping all other parameters fixed at their status_quo value (if available), best trial value, or the center of the search space.

intensity vs. kbv-radius

The slice plot provides a one-dimensional view of predicted outcomes for intensity as a function of a single parameter, while keeping all other parameters fixed at the center of the search space. This visualization helps in understanding the sensitivity and impact of changes in the selected parameter on the predicted metric outcomes.

intensity vs. kbh-radius

The slice plot provides a one-dimensional view of predicted outcomes for intensity as a function of a single parameter, while keeping all other parameters fixed at the center of the search space. This visualization helps in understanding the sensitivity and impact of changes in the selected parameter on the predicted metric outcomes.

Contour Plots: Metric effects by parameter values

These plots show the relationship between a metric and two parameters. They show the predicted values of the metric (indicated by color) as a function of the two parameters on the x- and y-axes while keeping all other parameters fixed at their status_quo value (if available), best trial value, or the center of the search space.

intensity (Mean) vs. kbv-radius, kbh-radius

The contour plot visualizes the predicted outcomes for intensity across a two-dimensional parameter space, with other parameters held fixed at the center of the search space. 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.

Top Surfaces Analysis: Parameter sensitivity, slice, and contour plots

The top surfaces analysis displays three analyses in one. First, it shows parameter sensitivities, which shows the sensitivity of the metrics in the experiment to the most important parameters. Subsetting to only the most important parameters, it then shows slice plots and contour plots for each metric in the experiment, displaying the relationship between the metric and the most important parameters.

Sensitivity Analysis for width

Understand how each parameter affects width according to a second-order sensitivity analysis.

Slice Plots: Metric effects by parameter value

These plots show the relationship between a metric and a parameter. They show the predicted values of the metric on the y-axis as a function of the parameter on the x-axis while keeping all other parameters fixed at their status_quo value (if available), best trial value, or the center of the search space.

width vs. kbh-radius

The slice plot provides a one-dimensional view of predicted outcomes for width as a function of a single parameter, while keeping all other parameters fixed at the center of the search space. This visualization helps in understanding the sensitivity and impact of changes in the selected parameter on the predicted metric outcomes.

width vs. kbv-radius

The slice plot provides a one-dimensional view of predicted outcomes for width as a function of a single parameter, while keeping all other parameters fixed at the center of the search space. This visualization helps in understanding the sensitivity and impact of changes in the selected parameter on the predicted metric outcomes.

Contour Plots: Metric effects by parameter values

These plots show the relationship between a metric and two parameters. They show the predicted values of the metric (indicated by color) as a function of the two parameters on the x- and y-axes while keeping all other parameters fixed at their status_quo value (if available), best trial value, or the center of the search space.

width (Mean) vs. kbv-radius, kbh-radius

The contour plot visualizes the predicted outcomes for width across a two-dimensional parameter space, with other parameters held fixed at the center of the search space. 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.

Top Surfaces Analysis: Parameter sensitivity, slice, and contour plots

The top surfaces analysis displays three analyses in one. First, it shows parameter sensitivities, which shows the sensitivity of the metrics in the experiment to the most important parameters. Subsetting to only the most important parameters, it then shows slice plots and contour plots for each metric in the experiment, displaying the relationship between the metric and the most important parameters.

Sensitivity Analysis for height

Understand how each parameter affects height according to a second-order sensitivity analysis.

Slice Plots: Metric effects by parameter value

These plots show the relationship between a metric and a parameter. They show the predicted values of the metric on the y-axis as a function of the parameter on the x-axis while keeping all other parameters fixed at their status_quo value (if available), best trial value, or the center of the search space.

height vs. kbv-radius

The slice plot provides a one-dimensional view of predicted outcomes for height as a function of a single parameter, while keeping all other parameters fixed at the center of the search space. This visualization helps in understanding the sensitivity and impact of changes in the selected parameter on the predicted metric outcomes.

height vs. kbh-radius

The slice plot provides a one-dimensional view of predicted outcomes for height as a function of a single parameter, while keeping all other parameters fixed at the center of the search space. This visualization helps in understanding the sensitivity and impact of changes in the selected parameter on the predicted metric outcomes.

Contour Plots: Metric effects by parameter values

These plots show the relationship between a metric and two parameters. They show the predicted values of the metric (indicated by color) as a function of the two parameters on the x- and y-axes while keeping all other parameters fixed at their status_quo value (if available), best trial value, or the center of the search space.

height (Mean) vs. kbv-radius, kbh-radius

The contour plot visualizes the predicted outcomes for height across a two-dimensional parameter space, with other parameters held fixed at the center of the search space. 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.

Diagnostic Analysis

Diagnostic Analyses provide information about the optimization process and the quality of the model fit. You can use this information to understand if the experimental design should be adjusted to improve optimization quality.

Cross Validation: Assessing model fit

Cross-validation plots display the model fit for each metric in the experiment. The model is trained on a subset of the data and then predicts the outcome for the remaining subset. The plots show the predicted outcome for the validation set on the y-axis against its actual value on the x-axis. Points that align closely with the dotted diagonal line indicate a strong model fit, signifying accurate predictions. Additionally, the plots include confidence intervals that provide insight into the noise in observations and the uncertainty in model predictions.

NOTE: A horizontal, flat line of predictions indicates that the model has not picked up on sufficient signal in the data, and instead is just predicting the mean.

Cross Validation for intensity (R² = 0.22)

The cross-validation plot displays the model fit for each metric in the experiment. It employs a leave-one-out approach, where the model is trained on all data except one sample, which is used for validation. The plot shows the predicted outcome for the validation set on the y-axis against its actual value on the x-axis. Points that align closely with the dotted diagonal line indicate a strong model fit, signifying accurate predictions. Additionally, the plot includes 95% confidence intervals that provide insight into the noise in observations and the uncertainty in model predictions. A horizontal, flat line of predictions indicates that the model has not picked up on sufficient signal in the data, and instead is just predicting the mean.

Cross Validation for width (R² = 0.79)

The cross-validation plot displays the model fit for each metric in the experiment. It employs a leave-one-out approach, where the model is trained on all data except one sample, which is used for validation. The plot shows the predicted outcome for the validation set on the y-axis against its actual value on the x-axis. Points that align closely with the dotted diagonal line indicate a strong model fit, signifying accurate predictions. Additionally, the plot includes 95% confidence intervals that provide insight into the noise in observations and the uncertainty in model predictions. A horizontal, flat line of predictions indicates that the model has not picked up on sufficient signal in the data, and instead is just predicting the mean.

Cross Validation for height (R² = 0.66)

The cross-validation plot displays the model fit for each metric in the experiment. It employs a leave-one-out approach, where the model is trained on all data except one sample, which is used for validation. The plot shows the predicted outcome for the validation set on the y-axis against its actual value on the x-axis. Points that align closely with the dotted diagonal line indicate a strong model fit, signifying accurate predictions. Additionally, the plot includes 95% confidence intervals that provide insight into the noise in observations and the uncertainty in model predictions. A horizontal, flat line of predictions indicates that the model has not picked up on sufficient signal in the data, and instead is just predicting the mean.

Generation Strategy Graph

GenerationStrategy: Center+Sobol+MBM:fast Visualize the structure of a GenerationStrategy as a directed graph. Each node represents a GenerationNode in the strategy, and edges represent transitions between nodes based on TransitionCriterion. Edge labels show the criterion class names that trigger the transition.

b'\n\n\n\n\n\nGenerationStrategy\n\n\n\nCenterOfSearchSpace\n\nCenterOfSearchSpace\n()\n\n\n\nSobol\n\nSobol\n\n\n\nCenterOfSearchSpace->Sobol\n\n\nAutoTransitionAfterGen\n\n\n\nMBM\n\nMBM\n(BoTorch)\n\n\n\nSobol->MBM\n\n\nMinTrials(5)\nMinTrials(2)\n\n\n\n'

We can also get a tabular summary of the trials:

agent.ax_client.summarize()
trial_index arm_name trial_status generation_node intensity width height kbv-radius kbh-radius
0 0 0_0 COMPLETED CenterOfSearchSpace 16514.632812 148.884308 51.572174 35000.000000 25000.000000
1 1 1_0 COMPLETED Sobol 15013.800781 185.068909 34.016315 40107.185841 27243.521214
2 2 2_0 COMPLETED Sobol 4537.941406 204.823288 163.306183 25536.393207 15635.150261
3 3 3_0 COMPLETED Sobol 9043.417969 214.761841 85.141525 33238.535039 34549.125936
4 4 4_0 COMPLETED Sobol 18690.957031 113.003830 21.075401 38669.002708 23646.320775
5 5 5_0 COMPLETED MBM 19027.859375 67.564415 23.774429 38966.895985 22380.850116
6 6 6_0 COMPLETED MBM 17221.683594 12.463347 16.742319 38386.946684 20571.465701
7 7 7_0 COMPLETED MBM 17261.140625 24.027714 17.871607 38432.989625 21381.016840
8 8 8_0 COMPLETED MBM 19184.667969 59.861458 18.811335 38172.786516 22180.098203
9 9 9_0 COMPLETED MBM 17418.738281 18.437265 16.100424 37945.060334 21160.173955
10 10 10_0 COMPLETED MBM 15185.558594 18.815474 90.434082 45000.000000 21297.931526
11 11 11_0 COMPLETED MBM 19119.156250 56.779202 17.494156 38104.169617 19400.096171
12 12 12_0 COMPLETED MBM 17957.171875 22.831009 16.770588 38132.798794 20084.276437
13 13 13_0 COMPLETED MBM 17670.261719 12.678870 15.723617 37843.386160 20604.102296
14 14 14_0 COMPLETED MBM 18230.425781 33.516594 17.677996 37730.255672 21567.978728
15 15 15_0 COMPLETED MBM 17995.777344 36.175663 17.021694 37757.938877 19752.539451
16 16 16_0 COMPLETED MBM 17690.945312 27.775412 16.939339 38131.425354 21436.729972
17 17 17_0 COMPLETED MBM 18439.074219 46.469910 17.027487 37911.504184 19571.214697
18 18 18_0 COMPLETED MBM 19193.875000 63.512718 19.235533 37614.351653 22257.770318
19 19 19_0 COMPLETED MBM 17754.332031 29.430490 16.287758 37955.608868 19914.222231
20 20 20_0 COMPLETED MBM 17138.769531 12.772702 17.238726 37438.314498 20590.477946
21 21 21_0 COMPLETED MBM 17464.113281 17.420095 15.873864 37969.278962 20252.639384
22 22 22_0 COMPLETED MBM 18691.136719 40.569580 17.043682 38039.962221 19688.178462
23 23 23_0 COMPLETED MBM 13634.648438 12.365093 154.674469 28222.041704 20651.869965
24 24 24_0 COMPLETED MBM 18975.738281 50.608227 17.127310 38135.295949 19510.652590
25 25 25_0 COMPLETED MBM 17357.804688 12.444318 15.738993 38170.779928 20673.192830
26 26 26_0 COMPLETED MBM 17786.605469 34.598392 17.987768 38425.638906 19783.899690
27 27 27_0 COMPLETED MBM 17591.617188 21.085464 16.042383 37936.693800 20132.645172
28 28 28_0 COMPLETED MBM 17265.238281 14.063565 15.605353 37961.232824 20404.252868
29 29 29_0 COMPLETED MBM 17206.882812 12.782537 17.263485 38517.554024 20717.107020

Visualizing the Surrogate Model#

The plot_objective method shows how an objective varies across the DOF space, based on the surrogate model the agent built:

_ = agent.plot_objective(x_dof_name="kbh-radius", y_dof_name="kbv-radius", objective_name="intensity")
intensity (Mean) vs. kbh-radius, kbv-radius

The contour plot visualizes the predicted outcomes for intensity across a two-dimensional parameter space, with other parameters held fixed at the center of the search space. 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.

This plot reveals the landscape the optimizer explored. Peaks (for maximization) or valleys (for minimization) show where good configurations lie.

Applying the Optimal Configuration#

The Pareto frontier contains all optimal trade-off solutions. Let’s retrieve one and apply it to see the resulting beam:

optimal_parameters = next(iter(agent.ax_client.get_pareto_frontier()))[0]
optimal_parameters
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/adapter/transforms/winsorize.py:126: AxOptimizationWarning: Encountered a `MultiObjective` without objective thresholds. We will winsorize each objective separately. We strongly recommend specifying the objective thresholds when using multi-objective optimization.
  metric_signature: _get_cutoffs(
/home/runner/work/blop/blop/.pixi/envs/docs/lib/python3.13/site-packages/ax/generators/torch/botorch_moo_utils.py:268: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.detach().clone() or sourceTensor.detach().clone().requires_grad_(True), rather than torch.tensor(sourceTensor).
  obj_mask = torch.tensor(obj_indices, device=objective_weights.device)
[INFO 05-19 23:19:18] ax.service.utils.best_point: Using inferred objective thresholds: [ObjectiveThreshold(intensity >= 17951.211424097368), ObjectiveThreshold(width <= 64.24674825327826), ObjectiveThreshold(height <= 19.155096827531835)], as objective thresholds were not specified as part of the optimization configuration on the experiment.
{'kbv-radius': 38170.77992755252, 'kbh-radius': 20673.19282986607}

Now move the mirrors to these optimal positions and acquire an image:

from bluesky.plans import list_scan

uid = RE(list_scan(
    [det],
    kbv.radius, [optimal_parameters[kbv.radius.name]],
    kbh.radius, [optimal_parameters[kbh.radius.name]],
))
image = tiled_client[uid[0]]["primary/det_image"].read().squeeze()
plt.imshow(image)
plt.colorbar()
plt.show()

What You’ve Learned#

In this tutorial, you worked through a complete Bayesian optimization workflow:

  1. DOFs define the search space—the parameters you can control and their allowed ranges

  2. Objectives specify your goals and whether to minimize or maximize each one

  3. Evaluation functions extract meaningful metrics from experimental data

  4. The Agent coordinates everything, building a model of your system and intelligently exploring the parameter space

  5. Health checks let you diagnose optimization progress and catch issues early

These same components apply to any optimization problem: swap the simulated devices for real hardware, adjust the DOFs and objectives for your system, and write an evaluation function that extracts your metrics.

Next Steps#

See Also#