Skip to main content
Version: Next

Getting Started with Ax

Complex optimization problems where we wish to tune multiple parameters to improve metric performance, but the inter-parameter interactions are not fully understood, are common across various fields including machine learning, robotics, materials science, and chemistry. This category of problem is known as "black-box" optimization. The complexity of black-box optimization problems further increases if evaluations are expensive to conduct, time-consuming, or noisy.

We can use Ax to efficiently conduct an experiment in which we "ask" for candidate points to evaluate, "tell" Ax the results, and repeat. We'll uses Ax's Client, a tool for managing the state of our experiment, and we'll learn how to define an optimization problem, configure an experiment, run trials, analyze results, and persist the experiment for later use using the Client.

Because Ax is a black box optimizer, we can use it to optimize any arbitrary function. In this example we will minimize the Hartmann6 function, a complicated 6-dimensional function with multiple local minima. Hartmann6 is a challenging benchmark for optimization algorithms commonly used in the global optimization literature -- it tests the algorithm's ability to identify the true global minimum, rather than mistakenly converging on a local minimum. Looking at its analytic form we can see that it would be incredibly challenging to efficiently find the global minimum either by manual trial-and-error or traditional design of experiments like grid-search or random-search.

f(x)=i=14αiexp(j=16Aij(xjPij)2) f(\mathbf{x})=-\sum_{i=1}^4 \alpha_i \exp \left(-\sum_{j=1}^6 A_{i j}\left(x_j-P_{i j}\right)^2\right)

Learning Objectives

  • Understand the basic concepts of black box optimization
  • Learn how to define an optimization problem using Ax
  • Configure and run an experiment using Ax's Client
  • Analyze the results of the optimization

Prerequisites

Step 1: Import Necessary Modules

First, ensure you have all the necessary imports:

import numpy as np
from ax.api.client import Client
from ax.api.configs import RangeParameterConfig

Step 2: Initialize the Client

Create an instance of the Client to manage the state of your experiment.

client = Client()

Step 3: Configure the Experiment

The Client instance can be configured with a series of Configs that define how the experiment will be run.

The Hartmann6 problem is usually evaluated on the hypercube xi(0,1)x_i \in (0, 1), so we will define six identical RangeParameterConfigs with these bounds.

You may specify additional features like parameter constraints to further refine the search space and parameter scaling to help navigate parameters with nonuniform effects.

# Define six float parameters x1, x2, x3, ... for the Hartmann6 function, which is typically evaluated on the unit hypercube
parameters = [
RangeParameterConfig(
name="x1", parameter_type="float", bounds=(0, 1)
),
RangeParameterConfig(
name="x2", parameter_type="float", bounds=(0, 1)
),
RangeParameterConfig(
name="x3", parameter_type="float", bounds=(0, 1)
),
RangeParameterConfig(
name="x4", parameter_type="float", bounds=(0, 1)
),
RangeParameterConfig(
name="x5", parameter_type="float", bounds=(0, 1)
),
RangeParameterConfig(
name="x6", parameter_type="float", bounds=(0, 1)
),
]

client.configure_experiment(parameters=parameters)

Step 4: Configure Optimization

Now, we must configure the objective for this optimization, which we do using Client.configure_optimization. This method expects a string objective, an expression containing either a single metric to maximize, a linear combination of metrics to maximize, or a tuple of multiple metrics to jointly maximize. These expressions are parsed using SymPy. For example:

  • "score" would direct Ax to maximize a metric named score
  • "-loss" would direct Ax to Ax to minimize a metric named loss
  • "task_0 + 0.5 * task_1" would direct Ax to maximize the sum of two task scores, downweighting task_1 by a factor of 0.5
  • "score, -flops" would direct Ax to simultaneously maximize score while minimizing flops

See these recipes for more information on configuring objectives and outcome constraints.

metric_name = "hartmann6" # this name is used during the optimization loop in Step 5
objective = f"-{metric_name}" # minimization is specified by the negative sign

client.configure_optimization(objective=objective)

Step 5: Run Trials

Here, we will configure the ask-tell loop.

We begin by defining the Hartmann6 function as written above. Remember, this is just an example problem and any Python function can be substituted here.

# Hartmann6 function
def hartmann6(x1, x2, x3, x4, x5, x6):
alpha = np.array([1.0, 1.2, 3.0, 3.2])
A = np.array([
[10, 3, 17, 3.5, 1.7, 8],
[0.05, 10, 17, 0.1, 8, 14],
[3, 3.5, 1.7, 10, 17, 8],
[17, 8, 0.05, 10, 0.1, 14]
])
P = 10**-4 * np.array([
[1312, 1696, 5569, 124, 8283, 5886],
[2329, 4135, 8307, 3736, 1004, 9991],
[2348, 1451, 3522, 2883, 3047, 6650],
[4047, 8828, 8732, 5743, 1091, 381]
])

outer = 0.0
for i in range(4):
inner = 0.0
for j, x in enumerate([x1, x2, x3, x4, x5, x6]):
inner += A[i, j] * (x - P[i, j])**2
outer += alpha[i] * np.exp(-inner)
return -outer

hartmann6(0.1, 0.45, 0.8, 0.25, 0.552, 1.0)
Output:
np.float64(-0.4878737485613134)

Optimization Loop

We will iteratively call client.get_next_trials to "ask" Ax for a parameterization to evaluate, then call hartmann6 using those parameters, and finally "tell" Ax the result using client.complete_trial.

This loop will run multiple trials to optimize the function.

for _ in range(10): # Run 10 rounds of trials
# We will request three trials at a time in this example
trials = client.get_next_trials(max_trials=3)

for trial_index, parameters in trials.items():
x1 = parameters["x1"]
x2 = parameters["x2"]
x3 = parameters["x3"]
x4 = parameters["x4"]
x5 = parameters["x5"]
x6 = parameters["x6"]

result = hartmann6(x1, x2, x3, x4, x5, x6)

# Set raw_data as a dictionary with metric names as keys and results as values
raw_data = {metric_name: result}

# Complete the trial with the result
client.complete_trial(trial_index=trial_index, raw_data=raw_data)
Output:
[INFO 01-22 17:45:37] 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')]), GenerationNode(name='MBM', generator_specs=[GeneratorSpec(generator_enum=BoTorch, generator_key_override=None)], transition_criteria=[])]) chosen based on user input and problem structure.
[INFO 01-22 17:45:37] ax.api.client: Generated new trial 0 with parameters {'x1': 0.5, 'x2': 0.5, 'x3': 0.5, 'x4': 0.5, 'x5': 0.5, 'x6': 0.5} using GenerationNode CenterOfSearchSpace.
[INFO 01-22 17:45:37] ax.api.client: Generated new trial 1 with parameters {'x1': 0.211065, 'x2': 0.133983, 'x3': 0.62023, 'x4': 0.676692, 'x5': 0.190483, 'x6': 0.608919} using GenerationNode Sobol.
[INFO 01-22 17:45:37] ax.api.client: Generated new trial 2 with parameters {'x1': 0.843272, 'x2': 0.750328, 'x3': 0.085601, 'x4': 0.164539, 'x5': 0.559745, 'x6': 0.244282} using GenerationNode Sobol.
[INFO 01-22 17:45:37] ax.api.client: Trial 0 marked COMPLETED.
[INFO 01-22 17:45:37] ax.api.client: Trial 1 marked COMPLETED.
[INFO 01-22 17:45:37] ax.api.client: Trial 2 marked COMPLETED.
[INFO 01-22 17:45:37] ax.api.client: Generated new trial 3 with parameters {'x1': 0.674615, 'x2': 0.305334, 'x3': 0.870684, 'x4': 0.771723, 'x5': 0.927959, 'x6': 0.3014} using GenerationNode Sobol.
[INFO 01-22 17:45:37] ax.api.client: Generated new trial 4 with parameters {'x1': 0.302177, 'x2': 0.673639, 'x3': 0.335138, 'x4': 0.260424, 'x5': 0.320409, 'x6': 0.907284} using GenerationNode Sobol.
[WARNING 01-22 17:45:37] ax.api.client: 3 trials requested but only 2 could be generated.
[INFO 01-22 17:45:37] ax.api.client: Trial 3 marked COMPLETED.
[INFO 01-22 17:45:37] ax.api.client: Trial 4 marked COMPLETED.
[INFO 01-22 17:45:38] ax.api.client: Generated new trial 5 with parameters {'x1': 0.251251, 'x2': 1.0, 'x3': 0.0, 'x4': 0.441541, 'x5': 0.33645, 'x6': 0.432357} using GenerationNode MBM.
[WARNING 01-22 17:45:38] ax.api.client: 3 trials requested but only 1 could be generated.
[INFO 01-22 17:45:38] ax.api.client: Trial 5 marked COMPLETED.
[INFO 01-22 17:45:39] ax.api.client: Generated new trial 6 with parameters {'x1': 0.180675, 'x2': 0.876809, 'x3': 0.524389, 'x4': 0.499087, 'x5': 0.298888, 'x6': 0.876629} using GenerationNode MBM.
[INFO 01-22 17:45:39] ax.api.client: Generated new trial 7 with parameters {'x1': 0.277941, 'x2': 0.027346, 'x3': 0.374418, 'x4': 0.298339, 'x5': 0.383708, 'x6': 0.894806} using GenerationNode MBM.
[INFO 01-22 17:45:39] ax.api.client: Generated new trial 8 with parameters {'x1': 0.572188, 'x2': 0.619185, 'x3': 0.487287, 'x4': 0.151153, 'x5': 0.040862, 'x6': 0.823378} using GenerationNode MBM.
[INFO 01-22 17:45:39] ax.api.client: Trial 6 marked COMPLETED.
[INFO 01-22 17:45:39] ax.api.client: Trial 7 marked COMPLETED.
[INFO 01-22 17:45:39] ax.api.client: Trial 8 marked COMPLETED.
[INFO 01-22 17:45:40] ax.api.client: Generated new trial 9 with parameters {'x1': 0.306636, 'x2': 0.0, 'x3': 0.230496, 'x4': 0.151097, 'x5': 0.468441, 'x6': 0.958831} using GenerationNode MBM.
[INFO 01-22 17:45:40] ax.api.client: Generated new trial 10 with parameters {'x1': 0.44339, 'x2': 0.0, 'x3': 0.635748, 'x4': 0.279727, 'x5': 0.430566, 'x6': 0.993071} using GenerationNode MBM.
[INFO 01-22 17:45:40] ax.api.client: Generated new trial 11 with parameters {'x1': 0.180727, 'x2': 0.0, 'x3': 0.013423, 'x4': 0.444114, 'x5': 0.404281, 'x6': 0.945489} using GenerationNode MBM.
[INFO 01-22 17:45:40] ax.api.client: Trial 9 marked COMPLETED.
[INFO 01-22 17:45:40] ax.api.client: Trial 10 marked COMPLETED.
[INFO 01-22 17:45:40] ax.api.client: Trial 11 marked COMPLETED.
[INFO 01-22 17:45:42] ax.api.client: Generated new trial 12 with parameters {'x1': 0.122907, 'x2': 0.0, 'x3': 0.39212, 'x4': 0.463574, 'x5': 0.742217, 'x6': 0.917925} using GenerationNode MBM.
[INFO 01-22 17:45:42] ax.api.client: Generated new trial 13 with parameters {'x1': 0.368818, 'x2': 0.0, 'x3': 0.379953, 'x4': 0.389094, 'x5': 0.05817, 'x6': 0.596108} using GenerationNode MBM.
[INFO 01-22 17:45:42] ax.api.client: Generated new trial 14 with parameters {'x1': 0.599084, 'x2': 0.0, 'x3': 0.385231, 'x4': 0.0, 'x5': 0.546715, 'x6': 1.0} using GenerationNode MBM.
[INFO 01-22 17:45:42] ax.api.client: Trial 12 marked COMPLETED.
[INFO 01-22 17:45:42] ax.api.client: Trial 13 marked COMPLETED.
[INFO 01-22 17:45:42] ax.api.client: Trial 14 marked COMPLETED.
[INFO 01-22 17:45:43] ax.api.client: Generated new trial 15 with parameters {'x1': 0.254555, 'x2': 0.0, 'x3': 0.356778, 'x4': 0.278358, 'x5': 0.355935, 'x6': 0.835014} using GenerationNode MBM.
[INFO 01-22 17:45:43] ax.api.client: Generated new trial 16 with parameters {'x1': 0.195712, 'x2': 0.066453, 'x3': 0.365796, 'x4': 0.498839, 'x5': 0.37255, 'x6': 0.990409} using GenerationNode MBM.
[INFO 01-22 17:45:43] ax.api.client: Generated new trial 17 with parameters {'x1': 0.458077, 'x2': 0.059394, 'x3': 0.348201, 'x4': 0.294871, 'x5': 0.370801, 'x6': 0.745311} using GenerationNode MBM.
[INFO 01-22 17:45:43] ax.api.client: Trial 15 marked COMPLETED.
[INFO 01-22 17:45:43] ax.api.client: Trial 16 marked COMPLETED.
[INFO 01-22 17:45:43] ax.api.client: Trial 17 marked COMPLETED.
[INFO 01-22 17:45:44] ax.api.client: Generated new trial 18 with parameters {'x1': 0.48819, 'x2': 0.0, 'x3': 0.413463, 'x4': 0.020143, 'x5': 0.345742, 'x6': 0.783727} using GenerationNode MBM.
[INFO 01-22 17:45:44] ax.api.client: Generated new trial 19 with parameters {'x1': 0.0, 'x2': 0.0, 'x3': 0.405907, 'x4': 0.214089, 'x5': 0.38997, 'x6': 0.777733} using GenerationNode MBM.
[INFO 01-22 17:45:44] ax.api.client: Generated new trial 20 with parameters {'x1': 0.996264, 'x2': 0.0, 'x3': 0.384983, 'x4': 0.313987, 'x5': 0.340069, 'x6': 0.790633} using GenerationNode MBM.
[INFO 01-22 17:45:45] ax.api.client: Trial 18 marked COMPLETED.
[INFO 01-22 17:45:45] ax.api.client: Trial 19 marked COMPLETED.
[INFO 01-22 17:45:45] ax.api.client: Trial 20 marked COMPLETED.
[INFO 01-22 17:45:46] ax.api.client: Generated new trial 21 with parameters {'x1': 0.260063, 'x2': 0.011237, 'x3': 0.433458, 'x4': 0.31239, 'x5': 0.350061, 'x6': 0.750436} using GenerationNode MBM.
[INFO 01-22 17:45:46] ax.api.client: Generated new trial 22 with parameters {'x1': 0.252353, 'x2': 0.073537, 'x3': 0.21776, 'x4': 0.296842, 'x5': 0.340686, 'x6': 0.741119} using GenerationNode MBM.
[INFO 01-22 17:45:46] ax.api.client: Generated new trial 23 with parameters {'x1': 0.265757, 'x2': 0.0, 'x3': 0.655828, 'x4': 0.31672, 'x5': 0.35529, 'x6': 0.751778} using GenerationNode MBM.
[INFO 01-22 17:45:46] ax.api.client: Trial 21 marked COMPLETED.
[INFO 01-22 17:45:46] ax.api.client: Trial 22 marked COMPLETED.
[INFO 01-22 17:45:46] ax.api.client: Trial 23 marked COMPLETED.
[INFO 01-22 17:45:47] ax.api.client: Generated new trial 24 with parameters {'x1': 0.208529, 'x2': 0.0, 'x3': 0.304627, 'x4': 0.335764, 'x5': 0.352763, 'x6': 0.693279} using GenerationNode MBM.
[INFO 01-22 17:45:47] ax.api.client: Generated new trial 25 with parameters {'x1': 0.20455, 'x2': 0.0, 'x3': 0.333383, 'x4': 0.310917, 'x5': 0.299331, 'x6': 0.711601} using GenerationNode MBM.
[INFO 01-22 17:45:47] ax.api.client: Generated new trial 26 with parameters {'x1': 0.201035, 'x2': 0.0, 'x3': 0.277901, 'x4': 0.339649, 'x5': 0.413676, 'x6': 0.67437} using GenerationNode MBM.
[INFO 01-22 17:45:47] ax.api.client: Trial 24 marked COMPLETED.
[INFO 01-22 17:45:47] ax.api.client: Trial 25 marked COMPLETED.
[INFO 01-22 17:45:47] ax.api.client: Trial 26 marked COMPLETED.

Step 6: Analyze Results

After running trials, you can analyze the results. Most commonly this means extracting the parameterization from the best performing trial you conducted.

Hartmann6 has a known global minimum of f(x)=3.322f(x*) = -3.322 at x=(0.201,0.150,0.477,0.273,0.312,0.657)x* = (0.201, 0.150, 0.477, 0.273, 0.312, 0.657). Ax is able to identify a point very near to this true optimum using just 30 evaluations. This is possible due to the sample-efficiency of Bayesian optimization, the optimization method we use under the hood in Ax.

best_parameters, prediction, index, name = client.get_best_parameterization()
print("Best Parameters:", best_parameters)
print("Prediction (mean, variance):", prediction)
Output:
Best Parameters: {'x1': 0.26006255135052014, 'x2': 0.011236616811085565, 'x3': 0.43345799576210653, 'x4': 0.3123902822574325, 'x5': 0.35006120531321966, 'x6': 0.7504358870871413}
Prediction (mean, variance): {'hartmann6': (np.float64(-2.715557080497571), np.float64(0.002004408093017144))}

Step 7: Compute Analyses

Ax can also produce a number of analyses to help interpret the results of the experiment via client.compute_analyses. Users can manually select which analyses to run, or can allow Ax to select which would be most relevant. In this case Ax selects the following:

  • Arm Effects Plots show the metric value for each arm on the experiment. Ax produces one plot using values from its internal surrogate model (this can be helpful for seeing the true effect of an arm when evaluations are noisy) and another using the raw metric values as observed.
  • Summary lists all trials generated along with their parameterizations, observations, and miscellaneous metadata
  • Sensitivity Analysis Plot shows which parameters have the largest affect on the objective using Sobol Indicies
  • Slice Plot shows how the model predicts a single parameter effects the objective along with a confidence interval
  • Contour Plot shows how the model predicts a pair of parameters effects the objective as a 2D surface
  • Cross Validation helps to visualize how well the surrogate model is able to predict out of sample points
# display=True instructs Ax to sort then render the resulting analyses
cards = client.compute_analyses(display=True)
Output:
[ERROR 01-22 17:45:48] ax.analysis.analysis: Failed to compute CrossValidationPlot
[ERROR 01-22 17:45:48] ax.analysis.analysis: Traceback (most recent call last):
File "/home/runner/work/Ax/Ax/ax/analysis/analysis.py", line 107, in compute_result
card = self.compute(
^^^^^^^^^^^^^
File "/home/runner/work/Ax/Ax/ax/analysis/plotly/cross_validation.py", line 134, in compute
cv_results = cross_validate(
^^^^^^^^^^^^^^^
File "/home/runner/work/Ax/Ax/ax/adapter/cross_validation.py", line 155, in cross_validate
return _fold_cross_validate(
^^^^^^^^^^^^^^^^^^^^^
File "/home/runner/work/Ax/Ax/ax/adapter/cross_validation.py", line 440, in _fold_cross_validate
cv_test_observations = t.transform_observations(
^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/runner/work/Ax/Ax/ax/adapter/transforms/base.py", line 147, in transform_observations
obs_data = self._transform_observation_data(observation_data=obs_data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/runner/work/Ax/Ax/ax/adapter/transforms/winsorize.py", line 147, in _transform_observation_data
obsd.means[idx] = max(
~~~~~~~~~~^^^^^
ValueError: assignment destination is read-only
[ERROR 01-22 17:45:48] ax.analysis.analysis: Failed to compute PredictableMetricsAnalysis
[ERROR 01-22 17:45:48] ax.analysis.analysis: Traceback (most recent call last):
File "/home/runner/work/Ax/Ax/ax/analysis/analysis.py", line 107, in compute_result
card = self.compute(
^^^^^^^^^^^^^
File "/home/runner/work/Ax/Ax/ax/analysis/healthcheck/predictable_metrics.py", line 151, in compute
warning_message = warn_if_unpredictable_metrics(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/runner/work/Ax/Ax/ax/service/utils/report_utils.py", line 1467, in warn_if_unpredictable_metrics
model_fit_dict = compute_model_fit_metrics_from_adapter(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/runner/work/Ax/Ax/ax/adapter/cross_validation.py", line 780, in compute_model_fit_metrics_from_adapter
y_obs, y_pred, se_pred = predict_func(adapter=adapter, untransform=untransform)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/runner/work/Ax/Ax/ax/adapter/cross_validation.py", line 903, in _predict_on_cross_validation_data
cv = cross_validate(adapter=adapter, untransform=untransform)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/runner/work/Ax/Ax/ax/adapter/cross_validation.py", line 155, in cross_validate
return _fold_cross_validate(
^^^^^^^^^^^^^^^^^^^^^
File "/home/runner/work/Ax/Ax/ax/adapter/cross_validation.py", line 440, in _fold_cross_validate
cv_test_observations = t.transform_observations(
^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/runner/work/Ax/Ax/ax/adapter/transforms/base.py", line 147, in transform_observations
obs_data = self._transform_observation_data(observation_data=obs_data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/runner/work/Ax/Ax/ax/adapter/transforms/winsorize.py", line 147, in _transform_observation_data
obsd.means[idx] = max(
~~~~~~~~~~^^^^^
ValueError: assignment destination is read-only

Modeled Arm Effects on hartmann6

Modeled effects on hartmann6. 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.

loading...

Observed Arm Effects on hartmann6

Observed effects on hartmann6. 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.

loading...

Utility Progression

Shows the best hartmann6 value achieved so far across completed trials (objective is to minimize). 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 utility. Only improvements are plotted, so flat segments indicate trials that didn't surpass the previous best. Infeasible trials (violating outcome constraints) don't contribute to the improvements.

loading...

Best Trial for Experiment

Displays the trial with the best objective value based on raw observations. This reflects actual measured performance during execution. This trial achieved the optimal objective value and represents the recommended configuration for your optimization goal. Only considering COMPLETED trials.

trial_indexarm_nametrial_statusgeneration_nodehartmann6x1x2x3x4x5x6
02525_0COMPLETEDMBM-2.865080.2045500.3333830.3109170.2993310.711601

Summary for Experiment

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

trial_indexarm_nametrial_statusgeneration_nodehartmann6x1x2x3x4x5x6
000_0COMPLETEDCenterOfSearchSpace-0.5053150.50.50.50.50.50.5
111_0COMPLETEDSobol-0.5796110.2110650.1339830.620230.6766920.1904830.608919
222_0COMPLETEDSobol-0.0270870.8432720.7503280.0856010.1645390.5597450.244282
333_0COMPLETEDSobol-0.0161190.6746150.3053340.8706840.7717230.9279590.3014
444_0COMPLETEDSobol-0.7279270.3021770.6736390.3351380.2604240.3204090.907284
555_0COMPLETEDMBM-0.2700030.251251100.4415410.336450.432357
666_0COMPLETEDMBM-0.2411420.1806750.8768090.5243890.4990870.2988880.876629
777_0COMPLETEDMBM-1.78480.2779410.0273460.3744180.2983390.3837080.894806
888_0COMPLETEDMBM-0.276570.5721880.6191850.4872870.1511530.0408620.823378
999_0COMPLETEDMBM-0.7321350.30663600.2304960.1510970.4684410.958831
101010_0COMPLETEDMBM-0.7858590.4433900.6357480.2797270.4305660.993071
111111_0COMPLETEDMBM-0.8035710.18072700.0134230.4441140.4042810.945489
121212_0COMPLETEDMBM-0.1633560.12290700.392120.4635740.7422170.917925
131313_0COMPLETEDMBM-0.8849710.36881800.3799530.3890940.058170.596108
141414_0COMPLETEDMBM-0.1380120.59908400.38523100.5467151
151515_0COMPLETEDMBM-2.24340.25455500.3567780.2783580.3559350.835014
161616_0COMPLETEDMBM-0.7905010.1957120.0664530.3657960.4988390.372550.990409
171717_0COMPLETEDMBM-2.289140.4580770.0593940.3482010.2948710.3708010.745311
181818_0COMPLETEDMBM-1.059320.4881900.4134630.0201430.3457420.783727
191919_0COMPLETEDMBM-2.02474000.4059070.2140890.389970.777733
202020_0COMPLETEDMBM-0.4213170.99626400.3849830.3139870.3400690.790633
212121_0COMPLETEDMBM-2.765690.2600630.0112370.4334580.312390.3500610.750436
222222_0COMPLETEDMBM-2.714090.2523530.0735370.217760.2968420.3406860.741119
232323_0COMPLETEDMBM-2.415920.26575700.6558280.316720.355290.751778
242424_0COMPLETEDMBM-2.714810.20852900.3046270.3357640.3527630.693279
252525_0COMPLETEDMBM-2.865080.2045500.3333830.3109170.2993310.711601
262626_0COMPLETEDMBM-2.301070.20103500.2779010.3396490.4136760.67437

Sensitivity Analysis for hartmann6

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

loading...

hartmann6 vs. x6

The slice plot provides a one-dimensional view of predicted outcomes for hartmann6 as a function of a single parameter, while keeping all other parameters fixed at their status_quo value (or mean value if status_quo is unavailable). This visualization helps in understanding the sensitivity and impact of changes in the selected parameter on the predicted metric outcomes.

loading...

hartmann6 vs. x2

The slice plot provides a one-dimensional view of predicted outcomes for hartmann6 as a function of a single parameter, while keeping all other parameters fixed at their status_quo value (or mean value if status_quo is unavailable). This visualization helps in understanding the sensitivity and impact of changes in the selected parameter on the predicted metric outcomes.

loading...

hartmann6 vs. x4

The slice plot provides a one-dimensional view of predicted outcomes for hartmann6 as a function of a single parameter, while keeping all other parameters fixed at their status_quo value (or mean value if status_quo is unavailable). This visualization helps in understanding the sensitivity and impact of changes in the selected parameter on the predicted metric outcomes.

loading...

CrossValidationPlot Error

ValueError encountered while computing CrossValidationPlot.

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.

node_namegeneratorstransitionsis_current
0CenterOfSearchSpacenan-> Sobol: AutoTransitionAfterGenFalse
1SobolSobol-> MBM: MinTrials(5), MinTrials(2)False
2MBMBoTorchnanTrue

PredictableMetricsAnalysis Error

ValueError encountered while computing PredictableMetricsAnalysis.

Conclusion

This tutorial demonstrates how to use Ax's Client for ask-tell optimization of Python functions using the Hartmann6 function as an example. You can adjust the function and parameters to suit your specific optimization problem.