Skip to content

Instantly share code, notes, and snippets.

@sgbaird
Created May 28, 2025 21:00
Show Gist options
  • Select an option

  • Save sgbaird/aa140b187e72491a278d98039253f94e to your computer and use it in GitHub Desktop.

Select an option

Save sgbaird/aa140b187e72491a278d98039253f94e to your computer and use it in GitHub Desktop.
ax-mwe-for-sergio-saving.ipynb
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/sgbaird/aa140b187e72491a278d98039253f94e/ax-mwe-for-sergio-saving.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "57xih43KFdOY",
"outputId": "d3538b65-581d-4abd-c15f-1dbe0aad8ba4"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting ax-platform==0.4.3\n",
" Downloading ax_platform-0.4.3-py3-none-any.whl.metadata (11 kB)\n",
"Collecting botorch==0.12.0 (from ax-platform==0.4.3)\n",
" Downloading botorch-0.12.0-py3-none-any.whl.metadata (11 kB)\n",
"Requirement already satisfied: jinja2 in /usr/local/lib/python3.11/dist-packages (from ax-platform==0.4.3) (3.1.6)\n",
"Requirement already satisfied: pandas in /usr/local/lib/python3.11/dist-packages (from ax-platform==0.4.3) (2.2.2)\n",
"Requirement already satisfied: scipy in /usr/local/lib/python3.11/dist-packages (from ax-platform==0.4.3) (1.15.3)\n",
"Requirement already satisfied: scikit-learn in /usr/local/lib/python3.11/dist-packages (from ax-platform==0.4.3) (1.6.1)\n",
"Requirement already satisfied: ipywidgets in /usr/local/lib/python3.11/dist-packages (from ax-platform==0.4.3) (7.7.1)\n",
"Requirement already satisfied: plotly>=5.12.0 in /usr/local/lib/python3.11/dist-packages (from ax-platform==0.4.3) (5.24.1)\n",
"Collecting pyre-extensions (from ax-platform==0.4.3)\n",
" Downloading pyre_extensions-0.0.32-py3-none-any.whl.metadata (4.0 kB)\n",
"Requirement already satisfied: multipledispatch in /usr/local/lib/python3.11/dist-packages (from botorch==0.12.0->ax-platform==0.4.3) (1.0.0)\n",
"Requirement already satisfied: mpmath<=1.3,>=0.19 in /usr/local/lib/python3.11/dist-packages (from botorch==0.12.0->ax-platform==0.4.3) (1.3.0)\n",
"Requirement already satisfied: torch>=2.0.1 in /usr/local/lib/python3.11/dist-packages (from botorch==0.12.0->ax-platform==0.4.3) (2.6.0+cu124)\n",
"Collecting pyro-ppl>=1.8.4 (from botorch==0.12.0->ax-platform==0.4.3)\n",
" Downloading pyro_ppl-1.9.1-py3-none-any.whl.metadata (7.8 kB)\n",
"Requirement already satisfied: typing-extensions in /usr/local/lib/python3.11/dist-packages (from botorch==0.12.0->ax-platform==0.4.3) (4.13.2)\n",
"Collecting gpytorch==1.13 (from botorch==0.12.0->ax-platform==0.4.3)\n",
" Downloading gpytorch-1.13-py3-none-any.whl.metadata (8.0 kB)\n",
"Collecting linear-operator==0.5.3 (from botorch==0.12.0->ax-platform==0.4.3)\n",
" Downloading linear_operator-0.5.3-py3-none-any.whl.metadata (15 kB)\n",
"Collecting jaxtyping==0.2.19 (from gpytorch==1.13->botorch==0.12.0->ax-platform==0.4.3)\n",
" Downloading jaxtyping-0.2.19-py3-none-any.whl.metadata (5.7 kB)\n",
"Requirement already satisfied: numpy>=1.20.0 in /usr/local/lib/python3.11/dist-packages (from jaxtyping==0.2.19->gpytorch==1.13->botorch==0.12.0->ax-platform==0.4.3) (2.0.2)\n",
"Requirement already satisfied: typeguard>=2.13.3 in /usr/local/lib/python3.11/dist-packages (from jaxtyping==0.2.19->gpytorch==1.13->botorch==0.12.0->ax-platform==0.4.3) (4.4.2)\n",
"Requirement already satisfied: tenacity>=6.2.0 in /usr/local/lib/python3.11/dist-packages (from plotly>=5.12.0->ax-platform==0.4.3) (9.1.2)\n",
"Requirement already satisfied: packaging in /usr/local/lib/python3.11/dist-packages (from plotly>=5.12.0->ax-platform==0.4.3) (24.2)\n",
"Requirement already satisfied: ipykernel>=4.5.1 in /usr/local/lib/python3.11/dist-packages (from ipywidgets->ax-platform==0.4.3) (6.17.1)\n",
"Requirement already satisfied: ipython-genutils~=0.2.0 in /usr/local/lib/python3.11/dist-packages (from ipywidgets->ax-platform==0.4.3) (0.2.0)\n",
"Requirement already satisfied: traitlets>=4.3.1 in /usr/local/lib/python3.11/dist-packages (from ipywidgets->ax-platform==0.4.3) (5.7.1)\n",
"Requirement already satisfied: widgetsnbextension~=3.6.0 in /usr/local/lib/python3.11/dist-packages (from ipywidgets->ax-platform==0.4.3) (3.6.10)\n",
"Requirement already satisfied: ipython>=4.0.0 in /usr/local/lib/python3.11/dist-packages (from ipywidgets->ax-platform==0.4.3) (7.34.0)\n",
"Requirement already satisfied: jupyterlab-widgets>=1.0.0 in /usr/local/lib/python3.11/dist-packages (from ipywidgets->ax-platform==0.4.3) (3.0.15)\n",
"Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.11/dist-packages (from jinja2->ax-platform==0.4.3) (3.0.2)\n",
"Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.11/dist-packages (from pandas->ax-platform==0.4.3) (2.9.0.post0)\n",
"Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.11/dist-packages (from pandas->ax-platform==0.4.3) (2025.2)\n",
"Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.11/dist-packages (from pandas->ax-platform==0.4.3) (2025.2)\n",
"Collecting typing-inspect (from pyre-extensions->ax-platform==0.4.3)\n",
" Downloading typing_inspect-0.9.0-py3-none-any.whl.metadata (1.5 kB)\n",
"Requirement already satisfied: joblib>=1.2.0 in /usr/local/lib/python3.11/dist-packages (from scikit-learn->ax-platform==0.4.3) (1.5.0)\n",
"Requirement already satisfied: threadpoolctl>=3.1.0 in /usr/local/lib/python3.11/dist-packages (from scikit-learn->ax-platform==0.4.3) (3.6.0)\n",
"Requirement already satisfied: debugpy>=1.0 in /usr/local/lib/python3.11/dist-packages (from ipykernel>=4.5.1->ipywidgets->ax-platform==0.4.3) (1.8.0)\n",
"Requirement already satisfied: jupyter-client>=6.1.12 in /usr/local/lib/python3.11/dist-packages (from ipykernel>=4.5.1->ipywidgets->ax-platform==0.4.3) (6.1.12)\n",
"Requirement already satisfied: matplotlib-inline>=0.1 in /usr/local/lib/python3.11/dist-packages (from ipykernel>=4.5.1->ipywidgets->ax-platform==0.4.3) (0.1.7)\n",
"Requirement already satisfied: nest-asyncio in /usr/local/lib/python3.11/dist-packages (from ipykernel>=4.5.1->ipywidgets->ax-platform==0.4.3) (1.6.0)\n",
"Requirement already satisfied: psutil in /usr/local/lib/python3.11/dist-packages (from ipykernel>=4.5.1->ipywidgets->ax-platform==0.4.3) (5.9.5)\n",
"Requirement already satisfied: pyzmq>=17 in /usr/local/lib/python3.11/dist-packages (from ipykernel>=4.5.1->ipywidgets->ax-platform==0.4.3) (24.0.1)\n",
"Requirement already satisfied: tornado>=6.1 in /usr/local/lib/python3.11/dist-packages (from ipykernel>=4.5.1->ipywidgets->ax-platform==0.4.3) (6.4.2)\n",
"Requirement already satisfied: setuptools>=18.5 in /usr/local/lib/python3.11/dist-packages (from ipython>=4.0.0->ipywidgets->ax-platform==0.4.3) (75.2.0)\n",
"Collecting jedi>=0.16 (from ipython>=4.0.0->ipywidgets->ax-platform==0.4.3)\n",
" Downloading jedi-0.19.2-py2.py3-none-any.whl.metadata (22 kB)\n",
"Requirement already satisfied: decorator in /usr/local/lib/python3.11/dist-packages (from ipython>=4.0.0->ipywidgets->ax-platform==0.4.3) (4.4.2)\n",
"Requirement already satisfied: pickleshare in /usr/local/lib/python3.11/dist-packages (from ipython>=4.0.0->ipywidgets->ax-platform==0.4.3) (0.7.5)\n",
"Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /usr/local/lib/python3.11/dist-packages (from ipython>=4.0.0->ipywidgets->ax-platform==0.4.3) (3.0.51)\n",
"Requirement already satisfied: pygments in /usr/local/lib/python3.11/dist-packages (from ipython>=4.0.0->ipywidgets->ax-platform==0.4.3) (2.19.1)\n",
"Requirement already satisfied: backcall in /usr/local/lib/python3.11/dist-packages (from ipython>=4.0.0->ipywidgets->ax-platform==0.4.3) (0.2.0)\n",
"Requirement already satisfied: pexpect>4.3 in /usr/local/lib/python3.11/dist-packages (from ipython>=4.0.0->ipywidgets->ax-platform==0.4.3) (4.9.0)\n",
"Requirement already satisfied: opt-einsum>=2.3.2 in /usr/local/lib/python3.11/dist-packages (from pyro-ppl>=1.8.4->botorch==0.12.0->ax-platform==0.4.3) (3.4.0)\n",
"Collecting pyro-api>=0.1.1 (from pyro-ppl>=1.8.4->botorch==0.12.0->ax-platform==0.4.3)\n",
" Downloading pyro_api-0.1.2-py3-none-any.whl.metadata (2.5 kB)\n",
"Requirement already satisfied: tqdm>=4.36 in /usr/local/lib/python3.11/dist-packages (from pyro-ppl>=1.8.4->botorch==0.12.0->ax-platform==0.4.3) (4.67.1)\n",
"Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.11/dist-packages (from python-dateutil>=2.8.2->pandas->ax-platform==0.4.3) (1.17.0)\n",
"Requirement already satisfied: filelock in /usr/local/lib/python3.11/dist-packages (from torch>=2.0.1->botorch==0.12.0->ax-platform==0.4.3) (3.18.0)\n",
"Requirement already satisfied: networkx in /usr/local/lib/python3.11/dist-packages (from torch>=2.0.1->botorch==0.12.0->ax-platform==0.4.3) (3.4.2)\n",
"Requirement already satisfied: fsspec in /usr/local/lib/python3.11/dist-packages (from torch>=2.0.1->botorch==0.12.0->ax-platform==0.4.3) (2025.3.2)\n",
"Collecting nvidia-cuda-nvrtc-cu12==12.4.127 (from torch>=2.0.1->botorch==0.12.0->ax-platform==0.4.3)\n",
" Downloading nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\n",
"Collecting nvidia-cuda-runtime-cu12==12.4.127 (from torch>=2.0.1->botorch==0.12.0->ax-platform==0.4.3)\n",
" Downloading nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\n",
"Collecting nvidia-cuda-cupti-cu12==12.4.127 (from torch>=2.0.1->botorch==0.12.0->ax-platform==0.4.3)\n",
" Downloading nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl.metadata (1.6 kB)\n",
"Collecting nvidia-cudnn-cu12==9.1.0.70 (from torch>=2.0.1->botorch==0.12.0->ax-platform==0.4.3)\n",
" Downloading nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl.metadata (1.6 kB)\n",
"Collecting nvidia-cublas-cu12==12.4.5.8 (from torch>=2.0.1->botorch==0.12.0->ax-platform==0.4.3)\n",
" Downloading nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\n",
"Collecting nvidia-cufft-cu12==11.2.1.3 (from torch>=2.0.1->botorch==0.12.0->ax-platform==0.4.3)\n",
" Downloading nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\n",
"Collecting nvidia-curand-cu12==10.3.5.147 (from torch>=2.0.1->botorch==0.12.0->ax-platform==0.4.3)\n",
" Downloading nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\n",
"Collecting nvidia-cusolver-cu12==11.6.1.9 (from torch>=2.0.1->botorch==0.12.0->ax-platform==0.4.3)\n",
" Downloading nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_x86_64.whl.metadata (1.6 kB)\n",
"Collecting nvidia-cusparse-cu12==12.3.1.170 (from torch>=2.0.1->botorch==0.12.0->ax-platform==0.4.3)\n",
" Downloading nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_x86_64.whl.metadata (1.6 kB)\n",
"Requirement already satisfied: nvidia-cusparselt-cu12==0.6.2 in /usr/local/lib/python3.11/dist-packages (from torch>=2.0.1->botorch==0.12.0->ax-platform==0.4.3) (0.6.2)\n",
"Requirement already satisfied: nvidia-nccl-cu12==2.21.5 in /usr/local/lib/python3.11/dist-packages (from torch>=2.0.1->botorch==0.12.0->ax-platform==0.4.3) (2.21.5)\n",
"Requirement already satisfied: nvidia-nvtx-cu12==12.4.127 in /usr/local/lib/python3.11/dist-packages (from torch>=2.0.1->botorch==0.12.0->ax-platform==0.4.3) (12.4.127)\n",
"Collecting nvidia-nvjitlink-cu12==12.4.127 (from torch>=2.0.1->botorch==0.12.0->ax-platform==0.4.3)\n",
" Downloading nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\n",
"Requirement already satisfied: triton==3.2.0 in /usr/local/lib/python3.11/dist-packages (from torch>=2.0.1->botorch==0.12.0->ax-platform==0.4.3) (3.2.0)\n",
"Requirement already satisfied: sympy==1.13.1 in /usr/local/lib/python3.11/dist-packages (from torch>=2.0.1->botorch==0.12.0->ax-platform==0.4.3) (1.13.1)\n",
"Requirement already satisfied: notebook>=4.4.1 in /usr/local/lib/python3.11/dist-packages (from widgetsnbextension~=3.6.0->ipywidgets->ax-platform==0.4.3) (6.5.7)\n",
"Collecting mypy-extensions>=0.3.0 (from typing-inspect->pyre-extensions->ax-platform==0.4.3)\n",
" Downloading mypy_extensions-1.1.0-py3-none-any.whl.metadata (1.1 kB)\n",
"Requirement already satisfied: parso<0.9.0,>=0.8.4 in /usr/local/lib/python3.11/dist-packages (from jedi>=0.16->ipython>=4.0.0->ipywidgets->ax-platform==0.4.3) (0.8.4)\n",
"Requirement already satisfied: jupyter-core>=4.6.0 in /usr/local/lib/python3.11/dist-packages (from jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets->ax-platform==0.4.3) (5.7.2)\n",
"Requirement already satisfied: argon2-cffi in /usr/local/lib/python3.11/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->ax-platform==0.4.3) (23.1.0)\n",
"Requirement already satisfied: nbformat in /usr/local/lib/python3.11/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->ax-platform==0.4.3) (5.10.4)\n",
"Requirement already satisfied: nbconvert>=5 in /usr/local/lib/python3.11/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->ax-platform==0.4.3) (7.16.6)\n",
"Requirement already satisfied: Send2Trash>=1.8.0 in /usr/local/lib/python3.11/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->ax-platform==0.4.3) (1.8.3)\n",
"Requirement already satisfied: terminado>=0.8.3 in /usr/local/lib/python3.11/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->ax-platform==0.4.3) (0.18.1)\n",
"Requirement already satisfied: prometheus-client in /usr/local/lib/python3.11/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->ax-platform==0.4.3) (0.22.0)\n",
"Requirement already satisfied: nbclassic>=0.4.7 in /usr/local/lib/python3.11/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->ax-platform==0.4.3) (1.3.1)\n",
"Requirement already satisfied: ptyprocess>=0.5 in /usr/local/lib/python3.11/dist-packages (from pexpect>4.3->ipython>=4.0.0->ipywidgets->ax-platform==0.4.3) (0.7.0)\n",
"Requirement already satisfied: wcwidth in /usr/local/lib/python3.11/dist-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=4.0.0->ipywidgets->ax-platform==0.4.3) (0.2.13)\n",
"Requirement already satisfied: platformdirs>=2.5 in /usr/local/lib/python3.11/dist-packages (from jupyter-core>=4.6.0->jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets->ax-platform==0.4.3) (4.3.8)\n",
"Requirement already satisfied: notebook-shim>=0.2.3 in /usr/local/lib/python3.11/dist-packages (from nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->ax-platform==0.4.3) (0.2.4)\n",
"Requirement already satisfied: beautifulsoup4 in /usr/local/lib/python3.11/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->ax-platform==0.4.3) (4.13.4)\n",
"Requirement already satisfied: bleach!=5.0.0 in /usr/local/lib/python3.11/dist-packages (from bleach[css]!=5.0.0->nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->ax-platform==0.4.3) (6.2.0)\n",
"Requirement already satisfied: defusedxml in /usr/local/lib/python3.11/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->ax-platform==0.4.3) (0.7.1)\n",
"Requirement already satisfied: jupyterlab-pygments in /usr/local/lib/python3.11/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->ax-platform==0.4.3) (0.3.0)\n",
"Requirement already satisfied: mistune<4,>=2.0.3 in /usr/local/lib/python3.11/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->ax-platform==0.4.3) (3.1.3)\n",
"Requirement already satisfied: nbclient>=0.5.0 in /usr/local/lib/python3.11/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->ax-platform==0.4.3) (0.10.2)\n",
"Requirement already satisfied: pandocfilters>=1.4.1 in /usr/local/lib/python3.11/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->ax-platform==0.4.3) (1.5.1)\n",
"Requirement already satisfied: fastjsonschema>=2.15 in /usr/local/lib/python3.11/dist-packages (from nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->ax-platform==0.4.3) (2.21.1)\n",
"Requirement already satisfied: jsonschema>=2.6 in /usr/local/lib/python3.11/dist-packages (from nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->ax-platform==0.4.3) (4.23.0)\n",
"Requirement already satisfied: argon2-cffi-bindings in /usr/local/lib/python3.11/dist-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->ax-platform==0.4.3) (21.2.0)\n",
"Requirement already satisfied: webencodings in /usr/local/lib/python3.11/dist-packages (from bleach!=5.0.0->bleach[css]!=5.0.0->nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->ax-platform==0.4.3) (0.5.1)\n",
"Requirement already satisfied: tinycss2<1.5,>=1.1.0 in /usr/local/lib/python3.11/dist-packages (from bleach[css]!=5.0.0->nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->ax-platform==0.4.3) (1.4.0)\n",
"Requirement already satisfied: attrs>=22.2.0 in /usr/local/lib/python3.11/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->ax-platform==0.4.3) (25.3.0)\n",
"Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /usr/local/lib/python3.11/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->ax-platform==0.4.3) (2025.4.1)\n",
"Requirement already satisfied: referencing>=0.28.4 in /usr/local/lib/python3.11/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->ax-platform==0.4.3) (0.36.2)\n",
"Requirement already satisfied: rpds-py>=0.7.1 in /usr/local/lib/python3.11/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->ax-platform==0.4.3) (0.25.1)\n",
"Requirement already satisfied: jupyter-server<3,>=1.8 in /usr/local/lib/python3.11/dist-packages (from notebook-shim>=0.2.3->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->ax-platform==0.4.3) (1.16.0)\n",
"Requirement already satisfied: cffi>=1.0.1 in /usr/local/lib/python3.11/dist-packages (from argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->ax-platform==0.4.3) (1.17.1)\n",
"Requirement already satisfied: soupsieve>1.2 in /usr/local/lib/python3.11/dist-packages (from beautifulsoup4->nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->ax-platform==0.4.3) (2.7)\n",
"Requirement already satisfied: pycparser in /usr/local/lib/python3.11/dist-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->ax-platform==0.4.3) (2.22)\n",
"Requirement already satisfied: anyio>=3.1.0 in /usr/local/lib/python3.11/dist-packages (from jupyter-server<3,>=1.8->notebook-shim>=0.2.3->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->ax-platform==0.4.3) (4.9.0)\n",
"Requirement already satisfied: websocket-client in /usr/local/lib/python3.11/dist-packages (from jupyter-server<3,>=1.8->notebook-shim>=0.2.3->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->ax-platform==0.4.3) (1.8.0)\n",
"Requirement already satisfied: idna>=2.8 in /usr/local/lib/python3.11/dist-packages (from anyio>=3.1.0->jupyter-server<3,>=1.8->notebook-shim>=0.2.3->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->ax-platform==0.4.3) (3.10)\n",
"Requirement already satisfied: sniffio>=1.1 in /usr/local/lib/python3.11/dist-packages (from anyio>=3.1.0->jupyter-server<3,>=1.8->notebook-shim>=0.2.3->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets->ax-platform==0.4.3) (1.3.1)\n",
"Downloading ax_platform-0.4.3-py3-none-any.whl (1.3 MB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.3/1.3 MB\u001b[0m \u001b[31m17.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25hDownloading botorch-0.12.0-py3-none-any.whl (644 kB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m644.8/644.8 kB\u001b[0m \u001b[31m35.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25hDownloading gpytorch-1.13-py3-none-any.whl (277 kB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m277.8/277.8 kB\u001b[0m \u001b[31m17.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25hDownloading linear_operator-0.5.3-py3-none-any.whl (176 kB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m176.4/176.4 kB\u001b[0m \u001b[31m10.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25hDownloading jaxtyping-0.2.19-py3-none-any.whl (24 kB)\n",
"Downloading pyre_extensions-0.0.32-py3-none-any.whl (12 kB)\n",
"Downloading pyro_ppl-1.9.1-py3-none-any.whl (755 kB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m756.0/756.0 kB\u001b[0m \u001b[31m26.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25hDownloading nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_x86_64.whl (363.4 MB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m363.4/363.4 MB\u001b[0m \u001b[31m1.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25hDownloading nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl (13.8 MB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m13.8/13.8 MB\u001b[0m \u001b[31m43.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25hDownloading nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl (24.6 MB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m24.6/24.6 MB\u001b[0m \u001b[31m20.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25hDownloading nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl (883 kB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m883.7/883.7 kB\u001b[0m \u001b[31m17.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25hDownloading nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl (664.8 MB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m664.8/664.8 MB\u001b[0m \u001b[31m891.4 kB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25hDownloading nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_x86_64.whl (211.5 MB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m211.5/211.5 MB\u001b[0m \u001b[31m5.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25hDownloading nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_x86_64.whl (56.3 MB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m56.3/56.3 MB\u001b[0m \u001b[31m10.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25hDownloading nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_x86_64.whl (127.9 MB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m127.9/127.9 MB\u001b[0m \u001b[31m7.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25hDownloading nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_x86_64.whl (207.5 MB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m207.5/207.5 MB\u001b[0m \u001b[31m4.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25hDownloading nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl (21.1 MB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m21.1/21.1 MB\u001b[0m \u001b[31m56.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25hDownloading typing_inspect-0.9.0-py3-none-any.whl (8.8 kB)\n",
"Downloading jedi-0.19.2-py2.py3-none-any.whl (1.6 MB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.6/1.6 MB\u001b[0m \u001b[31m48.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25hDownloading mypy_extensions-1.1.0-py3-none-any.whl (5.0 kB)\n",
"Downloading pyro_api-0.1.2-py3-none-any.whl (11 kB)\n",
"Installing collected packages: pyro-api, nvidia-nvjitlink-cu12, nvidia-curand-cu12, nvidia-cufft-cu12, nvidia-cuda-runtime-cu12, nvidia-cuda-nvrtc-cu12, nvidia-cuda-cupti-cu12, nvidia-cublas-cu12, mypy-extensions, jedi, typing-inspect, nvidia-cusparse-cu12, nvidia-cudnn-cu12, jaxtyping, pyre-extensions, nvidia-cusolver-cu12, pyro-ppl, linear-operator, gpytorch, botorch, ax-platform\n",
" Attempting uninstall: nvidia-nvjitlink-cu12\n",
" Found existing installation: nvidia-nvjitlink-cu12 12.5.82\n",
" Uninstalling nvidia-nvjitlink-cu12-12.5.82:\n",
" Successfully uninstalled nvidia-nvjitlink-cu12-12.5.82\n",
" Attempting uninstall: nvidia-curand-cu12\n",
" Found existing installation: nvidia-curand-cu12 10.3.6.82\n",
" Uninstalling nvidia-curand-cu12-10.3.6.82:\n",
" Successfully uninstalled nvidia-curand-cu12-10.3.6.82\n",
" Attempting uninstall: nvidia-cufft-cu12\n",
" Found existing installation: nvidia-cufft-cu12 11.2.3.61\n",
" Uninstalling nvidia-cufft-cu12-11.2.3.61:\n",
" Successfully uninstalled nvidia-cufft-cu12-11.2.3.61\n",
" Attempting uninstall: nvidia-cuda-runtime-cu12\n",
" Found existing installation: nvidia-cuda-runtime-cu12 12.5.82\n",
" Uninstalling nvidia-cuda-runtime-cu12-12.5.82:\n",
" Successfully uninstalled nvidia-cuda-runtime-cu12-12.5.82\n",
" Attempting uninstall: nvidia-cuda-nvrtc-cu12\n",
" Found existing installation: nvidia-cuda-nvrtc-cu12 12.5.82\n",
" Uninstalling nvidia-cuda-nvrtc-cu12-12.5.82:\n",
" Successfully uninstalled nvidia-cuda-nvrtc-cu12-12.5.82\n",
" Attempting uninstall: nvidia-cuda-cupti-cu12\n",
" Found existing installation: nvidia-cuda-cupti-cu12 12.5.82\n",
" Uninstalling nvidia-cuda-cupti-cu12-12.5.82:\n",
" Successfully uninstalled nvidia-cuda-cupti-cu12-12.5.82\n",
" Attempting uninstall: nvidia-cublas-cu12\n",
" Found existing installation: nvidia-cublas-cu12 12.5.3.2\n",
" Uninstalling nvidia-cublas-cu12-12.5.3.2:\n",
" Successfully uninstalled nvidia-cublas-cu12-12.5.3.2\n",
" Attempting uninstall: nvidia-cusparse-cu12\n",
" Found existing installation: nvidia-cusparse-cu12 12.5.1.3\n",
" Uninstalling nvidia-cusparse-cu12-12.5.1.3:\n",
" Successfully uninstalled nvidia-cusparse-cu12-12.5.1.3\n",
" Attempting uninstall: nvidia-cudnn-cu12\n",
" Found existing installation: nvidia-cudnn-cu12 9.3.0.75\n",
" Uninstalling nvidia-cudnn-cu12-9.3.0.75:\n",
" Successfully uninstalled nvidia-cudnn-cu12-9.3.0.75\n"
]
}
],
"source": [
"%pip install ax-platform==0.4.3"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "zA74rOiWoDro"
},
"outputs": [],
"source": [
"def branin3(x1, x2, x3, c1):\n",
" y = float(\n",
" (x2 - 5.1 / (4 * np.pi**2) * x1**2 + 5.0 / np.pi * x1 - 6.0) ** 2\n",
" + 10 * (1 - 1.0 / (8 * np.pi)) * np.cos(x1)\n",
" + 10\n",
" )\n",
"\n",
" # Contrived way to incorporate x3 into the objective\n",
" y = y * (1 + 0.1 * x1 * x2 * x3)\n",
"\n",
" # add a made-up penalty based on category\n",
" penalty_lookup = {\"A\": 1.0, \"B\": 0.0, \"C\": 2.0}\n",
" y += penalty_lookup[c1]\n",
"\n",
" return y"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"background_save": true
},
"id": "FJtWMajrhG32",
"outputId": "40d861a7-8be2-4746-e533-942811e23cc7"
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"[WARNING 05-27 21:37:57] ax.service.utils.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]`.\n",
"[INFO 05-27 21:37:57] ax.service.ax_client: Starting optimization with verbose logging. To disable logging, set the `verbose_logging` argument to `False`. Note that float values in the logs are rounded to 6 decimal points.\n",
"[INFO 05-27 21:37:57] ax.service.utils.instantiation: Inferred value type of ParameterType.FLOAT for parameter x1. If that is not the expected value type, you can explicitly specify 'value_type' ('int', 'float', 'bool' or 'str') in parameter dict.\n",
"[INFO 05-27 21:37:57] ax.service.utils.instantiation: Inferred value type of ParameterType.FLOAT for parameter x2. If that is not the expected value type, you can explicitly specify 'value_type' ('int', 'float', 'bool' or 'str') in parameter dict.\n",
"[INFO 05-27 21:37:57] ax.service.utils.instantiation: Inferred value type of ParameterType.STRING for parameter c1. If that is not the expected value type, you can explicitly specify 'value_type' ('int', 'float', 'bool' or 'str') in parameter dict.\n",
"/usr/local/lib/python3.11/dist-packages/ax/service/utils/instantiation.py:248: AxParameterWarning: `sort_values` is not specified for `ChoiceParameter` \"c1\". Defaulting to `False` for parameters of `ParameterType` STRING. To override this behavior (or avoid this warning), specify `sort_values` during `ChoiceParameter` construction.\n",
" return ChoiceParameter(\n",
"[INFO 05-27 21:37:57] ax.service.utils.instantiation: Created search space: SearchSpace(parameters=[RangeParameter(name='x1', parameter_type=FLOAT, range=[0.0, 10.0]), RangeParameter(name='x2', parameter_type=FLOAT, range=[0.0, 10.0]), ChoiceParameter(name='c1', parameter_type=STRING, values=['A', 'B', 'C'], is_ordered=False, sort_values=False)], parameter_constraints=[ParameterConstraint(1.0*x1 + 1.0*x2 <= 10.0)]).\n",
"/usr/local/lib/python3.11/dist-packages/ax/modelbridge/cross_validation.py:463: UserWarning: Encountered exception in computing model fit quality: RandomModelBridge does not support prediction.\n",
" warn(\"Encountered exception in computing model fit quality: \" + str(e))\n",
"[INFO 05-27 21:37:57] ax.service.ax_client: Generated new trial 0 with parameters {'x1': 3.670143, 'x2': 2.112298, 'c1': 'C'} using model Sobol.\n",
"[INFO 05-27 21:37:57] ax.service.ax_client: Saved JSON-serialized state of optimization to `ax_client_snapshot.json`.\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Suggested next experiment (trial #0) -- x1: 3.6701425071805716, x2: 2.1122976299375296, x3: 4.217559862881899, c1: C\n"
]
}
],
"source": [
"# Generated by Honegumi (https://arxiv.org/abs/2502.06815)\n",
"# %pip install ax-platform==0.4.3 matplotlib\n",
"import numpy as np\n",
"import pandas as pd\n",
"from ax.service.ax_client import AxClient, ObjectiveProperties\n",
"import matplotlib.pyplot as plt\n",
"\n",
"\n",
"from ax.modelbridge.factory import Models\n",
"from ax.modelbridge.generation_strategy import GenerationStep, GenerationStrategy\n",
"\n",
"\n",
"obj1_name = \"branin\"\n",
"\n",
"\n",
"# Define total for compositional constraint, where x1 + x2 + x3 == total\n",
"total = 10.0\n",
"\n",
"gs = GenerationStrategy(\n",
" steps=[\n",
" GenerationStep(\n",
" model=Models.SOBOL,\n",
" num_trials=5, # how many sobol trials to perform (rule of thumb: 2 * number of params)\n",
" min_trials_observed=3,\n",
" max_parallelism=5,\n",
" model_kwargs={\"seed\": 999},\n",
" ),\n",
" GenerationStep(\n",
" model=Models.SAASBO,\n",
" num_trials=-1,\n",
" max_parallelism=3,\n",
" model_kwargs={},\n",
" ),\n",
" ]\n",
")\n",
"\n",
"ax_client = AxClient(generation_strategy=gs)\n",
"# if using SAASBO is too slow, remove `gs` entirely and just use `ax_client = AxClient()`, which will give you reasonable defaults\n",
"\n",
"ax_client.create_experiment(\n",
" parameters=[\n",
" {\"name\": \"x1\", \"type\": \"range\", \"bounds\": [0.0, total]},\n",
" {\"name\": \"x2\", \"type\": \"range\", \"bounds\": [0.0, total]},\n",
" {\n",
" \"name\": \"c1\",\n",
" \"type\": \"choice\",\n",
" \"is_ordered\": False,\n",
" \"values\": [\"A\", \"B\", \"C\"],\n",
" },\n",
" ],\n",
" objectives={\n",
" obj1_name: ObjectiveProperties(minimize=True),\n",
" },\n",
" parameter_constraints=[\n",
" f\"x1 + x2 <= {total}\", # reparameterized compositional constraint, which is a type of sum constraint\n",
" ],\n",
")\n",
"\n",
"\n",
"parameterization, trial_index = ax_client.get_next_trial()\n",
"\n",
"# extract parameters\n",
"x1 = parameterization[\"x1\"]\n",
"x2 = parameterization[\"x2\"]\n",
"x3 = total - (x1 + x2) # composition constraint: x1 + x2 + x3 == total\n",
"\n",
"c1 = parameterization[\"c1\"]\n",
"\n",
"print(f\"Suggested next experiment (trial #{trial_index}) -- x1: {x1}, x2: {x2}, x3: {x3}, c1: {c1}\")\n",
"\n",
"snapshot_fpath = \"ax_client_snapshot.json\"\n",
"ax_client.save_to_json_file(snapshot_fpath)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"background_save": true
},
"id": "ZKnLwJmdii6R",
"outputId": "6fdfa44f-d368-4ae4-e28f-95c8459472df"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"9.487827279043518\n"
]
}
],
"source": [
"del ax_client # just to emphasize that it's being loaded in a later cell (i.e., for illustration purposes)\n",
"results = branin3(x1, x2, x3, c1) # this is you \"running the experiment\"\n",
"print(results)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"background_save": true
},
"id": "vzd_8070inpr",
"outputId": "8f16bfe9-17e6-4da8-efe3-337720567a8f"
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/usr/local/lib/python3.11/dist-packages/ax/storage/json_store/decoder.py:303: AxParameterWarning: `sort_values` is not specified for `ChoiceParameter` \"c1\". Defaulting to `False` for parameters of `ParameterType` STRING. To override this behavior (or avoid this warning), specify `sort_values` during `ChoiceParameter` construction.\n",
" return _class(\n",
"[INFO 05-27 21:37:57] ax.service.ax_client: Starting optimization with verbose logging. To disable logging, set the `verbose_logging` argument to `False`. Note that float values in the logs are rounded to 6 decimal points.\n"
]
}
],
"source": [
"ax_client = AxClient.load_from_json_file(snapshot_fpath)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"background_save": true
},
"id": "gytHOHxAiqCv",
"outputId": "dc96b827-7e7a-4898-d18e-d415998e9442"
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"[INFO 05-27 21:37:57] ax.service.ax_client: Completed trial 0 with data: {'branin': (9.487827, None)}.\n"
]
}
],
"source": [
"# NOTE: we need to pass trial_index to tell AxClient which parameterization these results correspond to)\n",
"ax_client.complete_trial(trial_index=trial_index, raw_data={\"branin\": results})"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"background_save": true
},
"id": "iOh-9ZedjhfJ",
"outputId": "a88cac84-c31c-4565-a0ed-6ef70f58aeb6"
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/usr/local/lib/python3.11/dist-packages/ax/modelbridge/cross_validation.py:463: UserWarning: Encountered exception in computing model fit quality: RandomModelBridge does not support prediction.\n",
" warn(\"Encountered exception in computing model fit quality: \" + str(e))\n",
"[INFO 05-27 21:37:57] ax.service.ax_client: Generated new trial 1 with parameters {'x1': 1.085235, 'x2': 4.961436, 'c1': 'C'} using model Sobol.\n",
"[INFO 05-27 21:37:57] ax.service.ax_client: Saved JSON-serialized state of optimization to `ax_client_snapshot.json`.\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'x1': 1.0852348804473877, 'x2': 4.961435543373227, 'c1': 'C'} 1\n",
"Suggested next experiment -- x1: 1.0852348804473877, x2: 4.961435543373227, x3: 3.953329576179385, c1: C\n"
]
}
],
"source": [
"parameterization, trial_index = ax_client.get_next_trial() # run this cell only once (because doing sequential optimization)\n",
"\n",
"print(parameterization, trial_index)\n",
"\n",
"# extract parameters\n",
"x1 = parameterization[\"x1\"]\n",
"x2 = parameterization[\"x2\"]\n",
"x3 = total - (x1 + x2) # composition constraint: x1 + x2 + x3 == total\n",
"\n",
"c1 = parameterization[\"c1\"]\n",
"\n",
"print(f\"Suggested next experiment -- x1: {x1}, x2: {x2}, x3: {x3}, c1: {c1}\")\n",
"\n",
"ax_client.save_to_json_file(snapshot_fpath)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"background_save": true
},
"id": "c0y-Grs3kHV4",
"outputId": "946ab777-7950-4583-ab96-5175c9244a3f"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"48.206864586996545\n"
]
}
],
"source": [
"del ax_client\n",
"results = branin3(x1, x2, x3, c1) # this is you \"running the experiment\"\n",
"print(results)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"background_save": true
},
"id": "ITNW1oyNkbUi",
"outputId": "d3b8bc3a-eca8-4b1a-c2fa-9e410c67cdf8"
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/usr/local/lib/python3.11/dist-packages/ax/storage/json_store/decoder.py:303: AxParameterWarning: `sort_values` is not specified for `ChoiceParameter` \"c1\". Defaulting to `False` for parameters of `ParameterType` STRING. To override this behavior (or avoid this warning), specify `sort_values` during `ChoiceParameter` construction.\n",
" return _class(\n",
"[INFO 05-27 21:37:57] ax.service.ax_client: Starting optimization with verbose logging. To disable logging, set the `verbose_logging` argument to `False`. Note that float values in the logs are rounded to 6 decimal points.\n"
]
}
],
"source": [
"ax_client = AxClient.load_from_json_file(snapshot_fpath)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"background_save": true
},
"id": "MkkjhzOMk7AF",
"outputId": "af6a4d94-c80c-4342-a1f1-0280a1c88bec"
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"[INFO 05-27 21:37:57] ax.service.ax_client: Completed trial 1 with data: {'branin': (48.206865, None)}.\n"
]
}
],
"source": [
"ax_client.complete_trial(trial_index=trial_index, raw_data={\"branin\": results})"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"background_save": true,
"base_uri": "https://localhost:8080/"
},
"id": "BpQxf7-yl0W7",
"outputId": "f8db80ab-aa8c-4f36-82b3-96c6a498eaf7"
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/usr/local/lib/python3.11/dist-packages/ax/modelbridge/cross_validation.py:463: UserWarning: Encountered exception in computing model fit quality: RandomModelBridge does not support prediction.\n",
" warn(\"Encountered exception in computing model fit quality: \" + str(e))\n",
"[INFO 05-27 21:37:57] ax.service.ax_client: Generated new trial 2 with parameters {'x1': 5.255021, 'x2': 1.09099, 'c1': 'A'} using model Sobol.\n",
"[INFO 05-27 21:37:57] ax.service.ax_client: Completed trial 2 with data: {'branin': (47.334254, None)}.\n",
"/usr/local/lib/python3.11/dist-packages/ax/modelbridge/cross_validation.py:463: UserWarning: Encountered exception in computing model fit quality: RandomModelBridge does not support prediction.\n",
" warn(\"Encountered exception in computing model fit quality: \" + str(e))\n",
"[INFO 05-27 21:37:57] ax.service.ax_client: Generated new trial 3 with parameters {'x1': 4.206534, 'x2': 2.918926, 'c1': 'A'} using model Sobol.\n",
"[INFO 05-27 21:37:57] ax.service.ax_client: Completed trial 3 with data: {'branin': (33.207714, None)}.\n",
"/usr/local/lib/python3.11/dist-packages/ax/modelbridge/cross_validation.py:463: UserWarning: Encountered exception in computing model fit quality: RandomModelBridge does not support prediction.\n",
" warn(\"Encountered exception in computing model fit quality: \" + str(e))\n",
"[INFO 05-27 21:37:57] ax.service.ax_client: Generated new trial 4 with parameters {'x1': 0.46391, 'x2': 6.076421, 'c1': 'B'} using model Sobol.\n",
"[INFO 05-27 21:37:57] ax.service.ax_client: Completed trial 4 with data: {'branin': (37.937763, None)}.\n",
"[INFO 05-27 21:39:48] ax.service.ax_client: Generated new trial 5 with parameters {'x1': 8.525951, 'x2': 0.0, 'c1': 'C'} using model SAASBO.\n",
"[INFO 05-27 21:39:48] ax.service.ax_client: Completed trial 5 with data: {'branin': (9.339133, None)}.\n",
"[INFO 05-27 21:41:16] ax.service.ax_client: Generated new trial 6 with parameters {'x1': 10.0, 'x2': 0.0, 'c1': 'B'} using model SAASBO.\n",
"[INFO 05-27 21:41:16] ax.service.ax_client: Completed trial 6 with data: {'branin': (10.960889, None)}.\n",
"/usr/local/lib/python3.11/dist-packages/linear_operator/utils/cholesky.py:40: NumericalWarning: A not p.d., added jitter of 1.0e-08 to the diagonal\n",
" warnings.warn(\n",
"[INFO 05-27 21:42:53] ax.service.ax_client: Generated new trial 7 with parameters {'x1': 6.282715, 'x2': 0.0, 'c1': 'B'} using model SAASBO.\n",
"[INFO 05-27 21:42:53] ax.service.ax_client: Completed trial 7 with data: {'branin': (20.812079, None)}.\n",
"/usr/local/lib/python3.11/dist-packages/linear_operator/utils/cholesky.py:40: NumericalWarning: A not p.d., added jitter of 1.0e-08 to the diagonal\n",
" warnings.warn(\n",
"[INFO 05-27 21:44:38] ax.service.ax_client: Generated new trial 8 with parameters {'x1': 0.0, 'x2': 10.0, 'c1': 'A'} using model SAASBO.\n",
"[INFO 05-27 21:44:38] ax.service.ax_client: Completed trial 8 with data: {'branin': (36.602113, None)}.\n",
"/usr/local/lib/python3.11/dist-packages/linear_operator/utils/cholesky.py:40: NumericalWarning: A not p.d., added jitter of 1.0e-08 to the diagonal\n",
" warnings.warn(\n",
"[INFO 05-27 21:46:07] ax.service.ax_client: Generated new trial 9 with parameters {'x1': 10.0, 'x2': 0.0, 'c1': 'C'} using model SAASBO.\n",
"[INFO 05-27 21:46:07] ax.service.ax_client: Completed trial 9 with data: {'branin': (12.960889, None)}.\n",
"/usr/local/lib/python3.11/dist-packages/linear_operator/utils/cholesky.py:40: NumericalWarning: A not p.d., added jitter of 1.0e-08 to the diagonal\n",
" warnings.warn(\n",
"[INFO 05-27 21:47:48] ax.service.ax_client: Generated new trial 10 with parameters {'x1': 10.0, 'x2': 0.0, 'c1': 'A'} using model SAASBO.\n",
"[INFO 05-27 21:47:48] ax.service.ax_client: Completed trial 10 with data: {'branin': (11.960889, None)}.\n",
"/usr/local/lib/python3.11/dist-packages/linear_operator/utils/cholesky.py:40: NumericalWarning: A not p.d., added jitter of 1.0e-08 to the diagonal\n",
" warnings.warn(\n",
"[INFO 05-27 21:49:39] ax.service.ax_client: Generated new trial 11 with parameters {'x1': 3.232036, 'x2': 0.0, 'c1': 'C'} using model SAASBO.\n",
"[INFO 05-27 21:49:39] ax.service.ax_client: Completed trial 11 with data: {'branin': (7.301467, None)}.\n",
"/usr/local/lib/python3.11/dist-packages/linear_operator/utils/cholesky.py:40: NumericalWarning: A not p.d., added jitter of 1.0e-08 to the diagonal\n",
" warnings.warn(\n",
"[INFO 05-27 21:51:30] ax.service.ax_client: Generated new trial 12 with parameters {'x1': 7.784494, 'x2': 0.0, 'c1': 'C'} using model SAASBO.\n",
"[INFO 05-27 21:51:30] ax.service.ax_client: Completed trial 12 with data: {'branin': (14.737298, None)}.\n",
"/usr/local/lib/python3.11/dist-packages/linear_operator/utils/cholesky.py:40: NumericalWarning: A not p.d., added jitter of 1.0e-08 to the diagonal\n",
" warnings.warn(\n",
"[INFO 05-27 21:53:28] ax.service.ax_client: Generated new trial 13 with parameters {'x1': 4.273055, 'x2': 0.0, 'c1': 'C'} using model SAASBO.\n",
"[INFO 05-27 21:53:28] ax.service.ax_client: Completed trial 13 with data: {'branin': (10.343237, None)}.\n",
"/usr/local/lib/python3.11/dist-packages/linear_operator/utils/cholesky.py:40: NumericalWarning: A not p.d., added jitter of 1.0e-08 to the diagonal\n",
" warnings.warn(\n",
"[INFO 05-27 21:55:23] ax.service.ax_client: Generated new trial 14 with parameters {'x1': 0.0, 'x2': 0.0, 'c1': 'C'} using model SAASBO.\n",
"[INFO 05-27 21:55:23] ax.service.ax_client: Completed trial 14 with data: {'branin': (57.602113, None)}.\n",
"[INFO 05-27 21:57:07] ax.service.ax_client: Generated new trial 15 with parameters {'x1': 3.387063, 'x2': 0.0, 'c1': 'B'} using model SAASBO.\n",
"[INFO 05-27 21:57:07] ax.service.ax_client: Completed trial 15 with data: {'branin': (5.059481, None)}.\n",
"/usr/local/lib/python3.11/dist-packages/linear_operator/utils/cholesky.py:40: NumericalWarning: A not p.d., added jitter of 1.0e-08 to the diagonal\n",
" warnings.warn(\n",
"[INFO 05-27 21:58:36] ax.service.ax_client: Generated new trial 16 with parameters {'x1': 9.123101, 'x2': 0.0, 'c1': 'B'} using model SAASBO.\n",
"[INFO 05-27 21:58:36] ax.service.ax_client: Completed trial 16 with data: {'branin': (5.814624, None)}.\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 20min 12s, sys: 5.97 s, total: 20min 18s\n",
"Wall time: 20min 38s\n"
]
}
],
"source": [
"%%time\n",
"# run a bunch of experiments in a loop without saving/loading to give it some data so the end of campaign analysis is meaningful\n",
"\n",
"for i in range(15): # i.e., 10 more trials\n",
" parameterization, trial_index = ax_client.get_next_trial()\n",
"\n",
" # extract parameters\n",
" x1 = parameterization[\"x1\"]\n",
" x2 = parameterization[\"x2\"]\n",
" x3 = total - (x1 + x2) # composition constraint: x1 + x2 + x3 == total\n",
"\n",
" c1 = parameterization[\"c1\"]\n",
"\n",
" results = branin3(x1, x2, x3, c1)\n",
" ax_client.complete_trial(trial_index=trial_index, raw_data={\"branin\": results})"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "QBafjdSsjafe"
},
"source": [
"## End of Campaign / Analysis"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"background_save": true
},
"id": "OfhEK-ARhfMy",
"outputId": "fd56de59-a94b-4367-96c4-1a1ae96e4ad3"
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"[WARNING 05-27 21:59:52] ax.service.utils.report_utils: Column reason missing for all trials. Not appending column.\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Best parameters: {'x1': 3.387062556889936, 'x2': 0.0, 'c1': 'B'}\n",
"Best metrics: ({'branin': np.float64(5.78071107054917)}, {'branin': {'branin': np.float64(11.477393275837601)}})\n"
]
},
{
"data": {
"image/png": "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+npN2eOOZ6Xf95VuHCIN7S2FMcwWgAdln5QaDzS7iurLWiI1Ovd3zxo5deqUNm7cqD//+c+SpDvuuEPR0dF2zxk/frw2b96sSZMm6bnnnlN4eLgk6ddff9U111yjl156SVdffXXFl////Oc/OnbsmO6++267UCFJ+/btU1FRkSRpxIgR6tKli95///1qzx2YMmWKYmNjtXLlSo0YMcLphOm1a9fq0UcfVVRUlL7++mtdcsklkqSCggLddNNNeu+993TXXXdp0aJFLt/XVWvWrNFll12mPXv2VHo/q9K7d2/9/PPPSk5Otmv/8ssvNWzYMN15553atWuXbD4+kZClWgFUS9uW0uO3Sdvfl9b+n3TfDVJsTNXPzy+Q3vtaGjFZih0s3f6U9N2GsoABAHC/s5cUrVOnjvr27asdO3boX//6l1588UW7527cuFH/+9//1KNHD73wwgsVwUGSmjRpotdee02S9Morr1S0HzlyRJI0YMCASveOi4tTQkKCB36qyl566SWVlpbqnnvuqQgOkhQeHq6XXnpJERER+vDDD7V//36P3P+f//yny8FBkjp16lQpOEjS4MGDNXr0aKWnp+vnn8/Rve8j6HkAUCM2W9lmct07StMnScvWSfM/lz5YVvWeEMd/k177sOwRFyvdMLhsaFOnts6fDwCovrOXai0oKFBmZqZWr16tJ554QgkJCRo6dGjF+a+++kpSWS9BkJNxU127dlVUVJTWrFlT0datWzdJ0sMPP6zg4GANGDBAtWrV8tSPU6UVK1ZIkm688cZK5xo3bqxBgwZp8eLFWrlypa6//nq33rtp06bq3r17tV9XUFCgL774QmvWrNGRI0dUWFgoSdqyZYskadeuXerUqZNba3U3wgOACxYSIg28tOzxyl+lT74rG9b0+aqyTeec2XdYem5e2aNTW+mPQ8vCRMtY79YOAP7G2fCgn376Sf369dOwYcP0888/KykpSZIqNh975JFH9Mgjj1R5zfz8M8vvpaam6quvvtK7776r3//+96pVq5Z69OihIUOG6JZbblFsrHf+IT948KAkVdqjoVx5+4EDB9x+77i4uGq/ZsuWLRo2bNg5N3zLycm5gKq8g/AAwK1q15KuG1T2yD5RNmTprS+k7zdW/Zotu6WH/iVNeUm6vGtZb8QffifVr+utqgH4i5h6ZfMHrCbGwyt7du3a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ACtvc7Z3S6Ar78Vat26d0/Nr166V5Py3cagsIiJCV155pSTpvffeq3SezxDXPProo3r55ZcVFxenJUuWqHHjxmaX5POWL19e5WdJ+W/W9+/fL8MwCA9ODBs2TFLZ++joxx9/VGFhoSIiIpSUlOTlys7B27vSoWqPPPKIIcno1auXcerUqYr2GTNmGJKMfv36mVecDysuLjZGjhxpSDL69u1r5Obmml2S5WVkZLDDtIveeustQ5LRqVMn4+DBgxXtP/30k9GgQQNDkvHuu++aWKFvWr9+vSHJkGS8/PLLdud++OEHIzIy0pBkLFmyxKQKfc/5dqpdsmSJIcmIiYkxdu7cWdG+atUqIzw83IiOjjaOHz/uhUp90/nevxdeeMGQZMTGxtq9f6j57tzsMH3+9y4jI8MICwsz6tSpY/zwww8V7UeOHDF69OhhSDLuvPNOb5TqMpthGIbXEwucys/PV//+/bV69Wo1bdpUffv2VWZmplavXq1GjRrpxx9/ZOlCJ2bNmlWxlN7IkSNVt25dp897/vnnmczlor1796pNmzZKSEjwqUlavio1NVXz5s1TdHS0evXqpby8PK1atUoFBQW67bbb9Nprr5ldok964IEHKuYlJScnq2PHjjp48KB++OEHlZaWasKECfr3v/9tcpXm+eyzz+yWmV6zZo0Mw9All1xS0fbYY4/p6quvrji+7777NGvWLNWuXVsDBw5UYWGhlixZIsMwtGjRIo0YMcKbP4KpqvP+bdy4USkpKTIMQ5dddlnFjtKO/vSnP6lPnz4er91sNfmz50zr1q2VmZmp/fv3V7kHib+pyXv33//+V3/6058UEhKiyy67TPXq1dOqVauUnZ2tlJQUffvttz41bImeBx9z+vRp47HHHjMSEhKMsLAwIzY21khNTQ3o1H4+U6dOrfgN5rkeGRkZZpdqGfQ8VE9paanx2muvGd26dTNq165tREZGGpdddpkxd+5cs0vzeR988IExaNAgIyYmxggJCTHq169vXHHFFcaCBQvMLs10c+bMOe+/a3PmzHH6uvI/i9HR0caQIUOMlStXev8HMFl13r9ly5a59Dni7P32RzX9s+coEHseavreLVu2zBg8eLARHR1thIeHGx06dDCmTZtmNxLFV9DzAAAAAMAlTJgGAAAA4BLCAwAAAACXEB4AAAAAuITwAAAAAMAlhAcA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\n",
"text/plain": [
"<Figure size 900x600 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"best_parameters, metrics = ax_client.get_best_parameters()\n",
"\n",
"print(f\"Best parameters: {best_parameters}\")\n",
"print(f\"Best metrics: {metrics}\")\n",
"\n",
"\n",
"# Plot results\n",
"objectives = ax_client.objective_names\n",
"df = ax_client.get_trials_data_frame()\n",
"\n",
"fig, ax = plt.subplots(figsize=(6, 4), dpi=150)\n",
"# ax.scatter(df.index, df[objectives], ec=\"k\", fc=\"none\", label=\"Observed\")\n",
"ax.plot(\n",
" df.index,\n",
" np.minimum.accumulate(df[objectives]),\n",
" color=\"#0033FF\",\n",
" lw=2,\n",
" label=\"Best to Trial\",\n",
")\n",
"ax.set_xlabel(\"Trial Number\")\n",
"ax.set_ylabel(objectives[0])\n",
"\n",
"ax.legend()\n",
"plt.show()"
]
}
],
"metadata": {
"colab": {
"provenance": [],
"authorship_tag": "ABX9TyOTZohWpK3IF+V/aV5qVukH",
"include_colab_link": true
},
"kernelspec": {
"display_name": "Python 3",
"name": "python3"
},
"language_info": {
"name": "python"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment