Created
May 28, 2025 21:00
-
-
Save sgbaird/aa140b187e72491a278d98039253f94e to your computer and use it in GitHub Desktop.
ax-mwe-for-sergio-saving.ipynb
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "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