diff --git a/README.md b/README.md
index d774be5..e52998d 100644
--- a/README.md
+++ b/README.md
@@ -6,12 +6,12 @@

[](https://codecov.io/gh/TheodoreWolf/hyperoptax)
->[!NOTE]
+>[!WARNING]
> Hyperoptax is still a WIP and the API is subject to change. There are _many_ rough edges to smooth out. It is recommended to download specific versions or to download from source if you want to use it in a large scale project.
## β°οΈ Introduction
-Hyperoptax is a lightweight toolbox for parallel hyperparameter optimization of pure JAX functions. It provides a concise API that lets you wrap any JAX-compatible loss or evaluation function and search across spaces __in parallel__ β all while staying in pure JAX.
+Hyperoptax is a lightweight toolbox for parallel hyperparameter optimization of pure JAX functions. It provides a concise API that lets you wrap any JAX-compatible loss or evaluation function and search across spaces __in parallel__ β all while staying in pure JAX.
## ποΈ Installation
@@ -32,26 +32,76 @@ pip install --upgrade "jax[cpu]"
# or GPU/TPU β see the official JAX installation guide
```
## π₯ In a nutshell
-Hyperoptax offers a simple API to wrap pure JAX functions for hyperparameter search and making use of parallelization (vmap only currently). See the [notebooks](https://github.com/TheodoreWolf/hyperoptax/tree/main/notebooks) for more examples.
+
+All optimizers follow the same stateless pattern: `Optimizer.init` returns a `(state, optimizer)` pair, and `optimizer.optimize` runs the search loop. Your objective function must have the signature `fn(key, params) -> scalar`.
+
```python
-from hyperoptax.bayesian import BayesianOptimizer
-from hyperoptax.spaces import LogSpace, LinearSpace
+import jax
+from hyperoptax import BayesianSearch, LogSpace, LinearSpace
-@jax.jit
-def train_nn(learning_rate, final_lr_pct):
+def train_nn(key, params):
+ learning_rate = params["learning_rate"]
+ final_lr_pct = params["final_lr_pct"]
...
- return val_loss
+ return val_loss # scalar, lower is better
+
+search_space = {
+ "learning_rate": LogSpace(1e-5, 1e-1),
+ "final_lr_pct": LinearSpace(0.01, 0.5),
+}
+
+state, optimizer = BayesianSearch.init(
+ search_space,
+ n_max=100, # observation buffer size (= number of iterations)
+ n_parallel=4, # Parallel workers per step
+ maximize=False,
+)
+
+state, (params_hist, results_hist) = optimizer.optimize(
+ state, jax.random.PRNGKey(0), train_nn
+)
+# params_hist: list of pytrees, one per iteration (each leaf has shape (n_parallel,))
+# results_hist: list of arrays, one per iteration (each has shape (n_parallel,))
+
+# Retrieve best result
+print(optimizer.best_result(state))
+print(optimizer.best_params(state))
+```
+
+Other available optimizers:
+
+```python
+from hyperoptax import RandomSearch, GridSearch, DiscreteSpace
+
+# Random search
+state, optimizer = RandomSearch.init(search_space, n_parallel=8)
+state, history = optimizer.optimize(state, jax.random.PRNGKey(0), train_nn, n_iterations=50)
+
+# Grid search (DiscreteSpace only)
+# Note: shuffle=True
+grid_space = {"lr": DiscreteSpace([1e-4, 1e-3, 1e-2]), "dropout": DiscreteSpace([0.1, 0.3, 0.5])}
+state, optimizer = GridSearch.init(grid_space)
+state, history = optimizer.optimize(state, jax.random.PRNGKey(0), train_nn, n_iterations=9)
+```
-search_space = {"learning_rate": LogSpace(1e-5,1e-1, 100),
- "final_lr_pct": LinearSpace(0.01, 0.5, 100)}
+### `optimize_scan()` β JAX-native loop
-search = BayesianOptimizer(search_space, train_nn)
-best_params = search.optimize(n_iterations=100,
- n_parallel=10,
- maximize=False,
- )
+`optimize_scan()` has the same signature as `optimize()` but uses `jax.lax.scan` internally.
+This requires your objective function to be JAX-traceable (jit-compilable), and returns
+**stacked arrays** rather than Python lists:
+
+```python
+state, (params_hist, results_hist) = optimizer.optimize_scan(
+ state, jax.random.PRNGKey(0), train_nn, n_iterations=25
+)
+# params_hist: pytree where each leaf has shape (n_iterations, n_parallel, ...)
+# results_hist: array of shape (n_iterations, n_parallel)
```
+> **Return type difference:** `optimize()` returns Python lists (easy to index by iteration),
+> while `optimize_scan()` returns stacked JAX arrays (compatible with `jax.jit`, faster for
+> JAX-traceable objectives). Choose based on your objective function and use case.
+
## πͺ Hyperoptax in action
@@ -68,31 +118,28 @@ We welcome pull requests! To get started:
1. Open an issue describing the bug or feature.
2. Fork the repository and create a feature branch (`git checkout -b my-feature`).
-3. Install dependencies:
+3. Clone and install dependencies. We recommend [uv](https://docs.astral.sh/uv/) for environment management:
```bash
-pip install -e ".[all]"
+git clone https://github.com/TheodoreWolf/hyperoptax
+cd hyperoptax
+uv pip install -e ".[all]"
```
4. Run the test suite:
```bash
-XLA_FLAGS=--xla_force_host_platform_device_count=4 pytest # Fake GPUs for pmap tests
+uv run pytest
```
5. Ensure the notebooks still work.
6. Format your code with `ruff`.
7. Submit a pull request.
## Roadmap
-I'm developing this both as a passion project and for my work in my PhD. I have a few ideas on where to go with this libary:
-- Sample hyperparameter configurations on the fly rather than generate a huge grid at initialisation.
-- Switch domain type from a list of arrays to a PyTree.
+I'm developing this both as a passion project and for my work in my PhD. I have a few ideas on where to go with this library:
- Callbacks!
-- Inspired by wandb's sweeps, use a linear grid for all parameters and apply transformations at sample time.
-- We are currently redoing the kernel calculation at each iteration when only the last row/column is actually needed. JAX requires sizes to be constant, so we need to do something clever...
-- Need to find a way to share the GP across workers on pmap for Bayesian.
-- Length scale tuning of kernel tuned during optimization (as done in other implementations).
-- Some clumpiness in the acquisisiton, there is literature that can help us.
+- Reduce redundant kernel recomputation β currently the full K matrix is rebuilt each iteration when only the new row/column is needed.
+- Length scale tuning currently uses a fixed Adam step count; smarter convergence criteria could help.
## π Citation
@@ -105,4 +152,4 @@ If you use Hyperoptax in academic work, please cite:
year = {2025},
url = {https://github.com/TheodoreWolf/hyperoptax}
}
-```
\ No newline at end of file
+```
diff --git a/docs/source/api/optimizers.rst b/docs/source/api/optimizers.rst
index f900979..dc4e0fb 100644
--- a/docs/source/api/optimizers.rst
+++ b/docs/source/api/optimizers.rst
@@ -25,4 +25,12 @@ Grid Search
.. automodule:: hyperoptax.grid
:members:
:undoc-members:
- :show-inheritance:
\ No newline at end of file
+ :show-inheritance:
+
+Random Search
+-------------
+
+.. automodule:: hyperoptax.random
+ :members:
+ :undoc-members:
+ :show-inheritance:
\ No newline at end of file
diff --git a/docs/source/api/spaces.rst b/docs/source/api/spaces.rst
index fdcce18..32c76a2 100644
--- a/docs/source/api/spaces.rst
+++ b/docs/source/api/spaces.rst
@@ -11,22 +11,30 @@ Parameter spaces define the search domains for hyperparameter optimization.
Examples
--------
-Creating Linear Space
-~~~~~~~~~~~~~~~~~~~~~~
+Creating a Linear Space
+~~~~~~~~~~~~~~~~~~~~~~~
.. code-block:: python
- from hyperoptax.spaces import LinearSpace
-
- # Create a linear space from 0.01 to 1.0 with 100 points
- lr_space = LinearSpace(0.01, 1.0, 100)
+ from hyperoptax import LinearSpace
-Creating Logarithmic Space
+ dropout_space = LinearSpace(0.0, 0.5)
+
+Creating a Logarithmic Space
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. code-block:: python
+
+ from hyperoptax import LogSpace
+
+ lr_space = LogSpace(1e-5, 1e-1)
+
+Creating a Discrete Space
~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code-block:: python
- from hyperoptax.spaces import LogSpace
-
- # Create a log space from 1e-5 to 1e-1 with 50 points
- lr_space = LogSpace(1e-5, 1e-1, 50)
\ No newline at end of file
+ from hyperoptax import DiscreteSpace
+
+ optimizer_space = DiscreteSpace(["adam", "sgd", "rmsprop"])
+ lr_space = DiscreteSpace([1e-4, 1e-3, 1e-2])
\ No newline at end of file
diff --git a/docs/source/index.rst b/docs/source/index.rst
index 52f6946..81bfd46 100644
--- a/docs/source/index.rst
+++ b/docs/source/index.rst
@@ -21,21 +21,29 @@ Quick Start
.. code-block:: python
- from hyperoptax.bayesian import BayesianOptimizer
- from hyperoptax.spaces import LogSpace, LinearSpace
+ import jax
+ from hyperoptax import BayesianSearch, LogSpace, LinearSpace
- @jax.jit
- def train_nn(learning_rate, final_lr_pct):
+ def train_nn(key, params):
+ learning_rate = params["learning_rate"]
+ final_lr_pct = params["final_lr_pct"]
...
- return val_loss
-
- search_space = {"learning_rate": LogSpace(1e-5,1e-1, 100),
- "final_lr_pct": LinearSpace(0.01, 0.5, 100)}
-
- search = BayesianOptimizer(search_space, train_nn)
- best_params = search.optimize(n_iterations=100,
- n_parallel=10,
- maximize=False)
+ return val_loss # scalar, lower is better
+
+ search_space = {
+ "learning_rate": LogSpace(1e-5, 1e-1),
+ "final_lr_pct": LinearSpace(0.01, 0.5),
+ }
+
+ state, optimizer = BayesianSearch.init(
+ search_space,
+ n_max=100,
+ maximize=False,
+ )
+ state, (params_hist, results_hist) = optimizer.optimize(
+ state, jax.random.PRNGKey(0), train_nn
+ )
+ print(optimizer.best_params(state))
.. toctree::
:maxdepth: 2
diff --git a/notebooks/gp_animation.gif b/notebooks/gp_animation.gif
index e18ae52..db3d1ae 100644
Binary files a/notebooks/gp_animation.gif and b/notebooks/gp_animation.gif differ
diff --git a/notebooks/performance.ipynb b/notebooks/performance.ipynb
index 8c451ec..dd20001 100644
--- a/notebooks/performance.ipynb
+++ b/notebooks/performance.ipynb
@@ -10,7 +10,14 @@
{
"cell_type": "code",
"execution_count": 1,
- "metadata": {},
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-03-18T18:25:23.650177Z",
+ "iopub.status.busy": "2026-03-18T18:25:23.649744Z",
+ "iopub.status.idle": "2026-03-18T18:25:26.960156Z",
+ "shell.execute_reply": "2026-03-18T18:25:26.959842Z"
+ }
+ },
"outputs": [],
"source": [
"import time\n",
@@ -19,10 +26,11 @@
"import jax\n",
"import jax.numpy as jnp\n",
"import matplotlib.pyplot as plt\n",
+ "import numpy as np\n",
"import pandas as pd\n",
"from bayes_opt import BayesianOptimization\n",
"\n",
- "from hyperoptax.bayesian import BayesianOptimizer\n",
+ "from hyperoptax.bayesian import BayesianSearch\n",
"from hyperoptax.spaces import LinearSpace"
]
},
@@ -36,256 +44,367 @@
{
"cell_type": "code",
"execution_count": 2,
- "metadata": {},
- "outputs": [],
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-03-18T18:25:26.962071Z",
+ "iopub.status.busy": "2026-03-18T18:25:26.961875Z",
+ "iopub.status.idle": "2026-03-18T18:25:26.969309Z",
+ "shell.execute_reply": "2026-03-18T18:25:26.969023Z"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "True maximum: 10.5999\n"
+ ]
+ }
+ ],
"source": [
- "# Bounded region of parameter space\n",
- "bo_bounds = {\"x\": (2, 4), \"y\": (0, 2)}\n",
- "bayex_bounds = {\"x\": bayex.domain.Real(2.0, 4.0), \"y\": bayex.domain.Real(0.0, 2.0)}\n",
- "hoptax_bounds = {\"x\": LinearSpace(2.0, 4.0, 100), \"y\": LinearSpace(0.0, 2.0, 100)}\n",
+ "# ββ Shared experiment config ββββββββββββββββββββββββββββββββββββββββββββββββ\n",
+ "N_TOTAL = 50\n",
+ "N_INIT = 3\n",
+ "N_BO = N_TOTAL - N_INIT # 47\n",
+ "N_SEEDS = 5\n",
"\n",
"\n",
"def f(x, y):\n",
- " return -(1.4 - 3 * x) * jnp.sin(18 * y)\n",
+ " return -(1.4 - 3.0 * x) * jnp.sin(18.0 * y)\n",
"\n",
"\n",
- "# Bayesian-Optimization\n",
- "bo_optimizer = BayesianOptimization(\n",
- " f=f,\n",
- " pbounds=bo_bounds,\n",
- " random_state=1,\n",
- ")\n",
+ "# True maximum via dense grid\n",
+ "xs_grid = np.linspace(2, 4, 500)\n",
+ "ys_grid = np.linspace(0, 2, 500)\n",
+ "XX, YY = np.meshgrid(xs_grid, ys_grid)\n",
+ "true_max = float((-(1.4 - 3.0 * XX) * np.sin(18.0 * YY)).max())\n",
+ "print(f\"True maximum: {true_max:.4f}\")\n",
"\n",
- "# bayex\n",
- "bayex_optimizer = bayex.Optimizer(domain=bayex_bounds, maximize=True, acq=\"PI\")\n",
+ "# Bounds in each library's format\n",
+ "bo_bounds = {\"x\": (2.0, 4.0), \"y\": (0.0, 2.0)}\n",
+ "bayex_bounds = {\"x\": bayex.domain.Real(2.0, 4.0), \"y\": bayex.domain.Real(0.0, 2.0)}\n",
+ "hoptax_bounds = {\"x\": LinearSpace(2.0, 4.0), \"y\": LinearSpace(0.0, 2.0)}\n",
"\n",
- "# hyperoptax\n",
- "hoptax_optimizer = BayesianOptimizer(hoptax_bounds, f=f)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Bayesian-optimization"
+ "# Wrapper for hyperoptax (key required by API but unused for deterministic f)\n",
+ "wrapper = lambda key, config: f(config[\"x\"], config[\"y\"])"
]
},
{
"cell_type": "code",
"execution_count": 3,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "| iter | target | x | y |\n",
- "-------------------------------------------------\n",
- "| \u001b[39m1 \u001b[39m | \u001b[39m5.0895161\u001b[39m | \u001b[39m2.8340440\u001b[39m | \u001b[39m1.4406489\u001b[39m |\n",
- "| \u001b[39m2 \u001b[39m | \u001b[39m-4.572064\u001b[39m | \u001b[39m2.0002287\u001b[39m | \u001b[39m0.6046651\u001b[39m |\n",
- "| \u001b[39m3 \u001b[39m | \u001b[39m-0.995176\u001b[39m | \u001b[39m2.2935117\u001b[39m | \u001b[39m0.1846771\u001b[39m |\n",
- "| \u001b[39m4 \u001b[39m | \u001b[39m-5.414693\u001b[39m | \u001b[39m3.1038088\u001b[39m | \u001b[39m1.7034514\u001b[39m |\n",
- "| \u001b[35m5 \u001b[39m | \u001b[35m6.2081246\u001b[39m | \u001b[35m3.1140982\u001b[39m | \u001b[35m1.4461141\u001b[39m |\n",
- "| \u001b[39m6 \u001b[39m | \u001b[39m4.2967567\u001b[39m | \u001b[39m2.6356989\u001b[39m | \u001b[39m0.4835297\u001b[39m |\n",
- "| \u001b[39m7 \u001b[39m | \u001b[39m2.4481501\u001b[39m | \u001b[39m2.2680780\u001b[39m | \u001b[39m1.7714478\u001b[39m |\n",
- "| \u001b[39m8 \u001b[39m | \u001b[39m-4.903664\u001b[39m | \u001b[39m2.1455481\u001b[39m | \u001b[39m0.6236598\u001b[39m |\n",
- "| \u001b[39m9 \u001b[39m | \u001b[39m-4.865993\u001b[39m | \u001b[39m2.6553993\u001b[39m | \u001b[39m1.6989593\u001b[39m |\n",
- "| \u001b[39m10 \u001b[39m | \u001b[39m-5.888856\u001b[39m | \u001b[39m2.9050529\u001b[39m | \u001b[39m0.9952135\u001b[39m |\n",
- "| \u001b[39m11 \u001b[39m | \u001b[39m2.1080741\u001b[39m | \u001b[39m2.9865215\u001b[39m | \u001b[39m1.4119638\u001b[39m |\n",
- "| \u001b[39m12 \u001b[39m | \u001b[39m5.5928030\u001b[39m | \u001b[39m3.0482069\u001b[39m | \u001b[39m1.1769021\u001b[39m |\n",
- "| \u001b[39m13 \u001b[39m | \u001b[39m-4.827859\u001b[39m | \u001b[39m3.9719134\u001b[39m | \u001b[39m0.5500982\u001b[39m |\n",
- "| \u001b[39m14 \u001b[39m | \u001b[39m3.4555957\u001b[39m | \u001b[39m2.0855980\u001b[39m | \u001b[39m1.4402426\u001b[39m |\n",
- "| \u001b[39m15 \u001b[39m | \u001b[39m-7.947717\u001b[39m | \u001b[39m3.1186634\u001b[39m | \u001b[39m1.3115306\u001b[39m |\n",
- "| \u001b[39m16 \u001b[39m | \u001b[39m-1.756889\u001b[39m | \u001b[39m2.1420128\u001b[39m | \u001b[39m1.3764246\u001b[39m |\n",
- "| \u001b[39m17 \u001b[39m | \u001b[39m1.9615039\u001b[39m | \u001b[39m2.2338609\u001b[39m | \u001b[39m0.7191868\u001b[39m |\n",
- "| \u001b[35m18 \u001b[39m | \u001b[35m7.3689827\u001b[39m | \u001b[35m2.9458789\u001b[39m | \u001b[35m0.7929524\u001b[39m |\n",
- "| \u001b[35m19 \u001b[39m | \u001b[35m9.8067951\u001b[39m | \u001b[35m3.7356811\u001b[39m | \u001b[35m0.0868715\u001b[39m |\n",
- "| \u001b[39m20 \u001b[39m | \u001b[39m-2.914014\u001b[39m | \u001b[39m2.1617872\u001b[39m | \u001b[39m0.6642324\u001b[39m |\n",
- "| \u001b[39m21 \u001b[39m | \u001b[39m7.0518093\u001b[39m | \u001b[39m3.7254099\u001b[39m | \u001b[39m0.0447616\u001b[39m |\n",
- "| \u001b[39m22 \u001b[39m | \u001b[39m8.9512090\u001b[39m | \u001b[39m3.6821794\u001b[39m | \u001b[39m0.1084889\u001b[39m |\n",
- "| \u001b[39m23 \u001b[39m | \u001b[39m1.1771789\u001b[39m | \u001b[39m3.7427064\u001b[39m | \u001b[39m0.1678626\u001b[39m |\n",
- "| \u001b[39m24 \u001b[39m | \u001b[39m8.1252956\u001b[39m | \u001b[39m3.6346069\u001b[39m | \u001b[39m0.0569697\u001b[39m |\n",
- "| \u001b[39m25 \u001b[39m | \u001b[39m7.3031883\u001b[39m | \u001b[39m3.5878675\u001b[39m | \u001b[39m0.1248332\u001b[39m |\n",
- "| \u001b[39m26 \u001b[39m | \u001b[39m7.0405941\u001b[39m | \u001b[39m2.9122357\u001b[39m | \u001b[39m1.4676921\u001b[39m |\n",
- "| \u001b[39m27 \u001b[39m | \u001b[39m-0.117184\u001b[39m | \u001b[39m2.9596129\u001b[39m | \u001b[39m0.6972611\u001b[39m |\n",
- "| \u001b[39m28 \u001b[39m | \u001b[39m2.1586396\u001b[39m | \u001b[39m2.7093793\u001b[39m | \u001b[39m0.0181452\u001b[39m |\n",
- "| \u001b[39m29 \u001b[39m | \u001b[39m5.2426638\u001b[39m | \u001b[39m3.3128402\u001b[39m | \u001b[39m1.4329922\u001b[39m |\n",
- "| \u001b[39m30 \u001b[39m | \u001b[39m8.0527381\u001b[39m | \u001b[39m3.2014061\u001b[39m | \u001b[39m1.4942222\u001b[39m |\n",
- "| \u001b[39m31 \u001b[39m | \u001b[39m5.3750295\u001b[39m | \u001b[39m3.1200451\u001b[39m | \u001b[39m1.5296132\u001b[39m |\n",
- "| \u001b[39m32 \u001b[39m | \u001b[39m2.9168560\u001b[39m | \u001b[39m3.5997493\u001b[39m | \u001b[39m0.7156616\u001b[39m |\n",
- "| \u001b[39m33 \u001b[39m | \u001b[39m3.3140840\u001b[39m | \u001b[39m3.2871851\u001b[39m | \u001b[39m1.5484385\u001b[39m |\n",
- "| \u001b[39m34 \u001b[39m | \u001b[39m9.2965688\u001b[39m | \u001b[39m3.8268411\u001b[39m | \u001b[39m0.0652117\u001b[39m |\n",
- "| \u001b[39m35 \u001b[39m | \u001b[39m3.4361906\u001b[39m | \u001b[39m3.9119521\u001b[39m | \u001b[39m0.0188279\u001b[39m |\n",
- "| \u001b[39m36 \u001b[39m | \u001b[39m5.1517338\u001b[39m | \u001b[39m3.5195786\u001b[39m | \u001b[39m0.0331888\u001b[39m |\n",
- "| \u001b[39m37 \u001b[39m | \u001b[39m9.7940874\u001b[39m | \u001b[39m3.7326769\u001b[39m | \u001b[39m0.0888427\u001b[39m |\n",
- "| \u001b[39m38 \u001b[39m | \u001b[39m4.9432034\u001b[39m | \u001b[39m3.0541849\u001b[39m | \u001b[39m0.8343122\u001b[39m |\n",
- "| \u001b[39m39 \u001b[39m | \u001b[39m-0.080319\u001b[39m | \u001b[39m2.8830891\u001b[39m | \u001b[39m1.5714118\u001b[39m |\n",
- "| \u001b[39m40 \u001b[39m | \u001b[39m6.9999542\u001b[39m | \u001b[39m2.8260871\u001b[39m | \u001b[39m0.7936696\u001b[39m |\n",
- "| \u001b[39m41 \u001b[39m | \u001b[39m4.0754933\u001b[39m | \u001b[39m2.7063884\u001b[39m | \u001b[39m0.7343378\u001b[39m |\n",
- "| \u001b[39m42 \u001b[39m | \u001b[39m-1.991685\u001b[39m | \u001b[39m3.4526305\u001b[39m | \u001b[39m0.1869891\u001b[39m |\n",
- "| \u001b[39m43 \u001b[39m | \u001b[39m5.8648509\u001b[39m | \u001b[39m3.8949508\u001b[39m | \u001b[39m0.1408218\u001b[39m |\n",
- "| \u001b[39m44 \u001b[39m | \u001b[39m0.2875752\u001b[39m | \u001b[39m2.0 \u001b[39m | \u001b[39m1.5673209\u001b[39m |\n",
- "| \u001b[39m45 \u001b[39m | \u001b[39m3.5315537\u001b[39m | \u001b[39m3.1337719\u001b[39m | \u001b[39m1.0725934\u001b[39m |\n",
- "| \u001b[39m46 \u001b[39m | \u001b[39m-2.651976\u001b[39m | \u001b[39m3.4684301\u001b[39m | \u001b[39m1.3796565\u001b[39m |\n",
- "| \u001b[39m47 \u001b[39m | \u001b[39m0.3094548\u001b[39m | \u001b[39m2.7128717\u001b[39m | \u001b[39m0.8701124\u001b[39m |\n",
- "| \u001b[39m48 \u001b[39m | \u001b[39m-6.095872\u001b[39m | \u001b[39m2.5540154\u001b[39m | \u001b[39m0.6236924\u001b[39m |\n",
- "| \u001b[39m49 \u001b[39m | \u001b[39m1.6047917\u001b[39m | \u001b[39m3.3809741\u001b[39m | \u001b[39m0.0102555\u001b[39m |\n",
- "| \u001b[39m50 \u001b[39m | \u001b[39m1.9245251\u001b[39m | \u001b[39m2.7107472\u001b[39m | \u001b[39m0.3651720\u001b[39m |\n",
- "| \u001b[39m51 \u001b[39m | \u001b[39m5.9460301\u001b[39m | \u001b[39m2.7734505\u001b[39m | \u001b[39m0.8152356\u001b[39m |\n",
- "| \u001b[39m52 \u001b[39m | \u001b[39m2.0218794\u001b[39m | \u001b[39m3.2261459\u001b[39m | \u001b[39m0.8589573\u001b[39m |\n",
- "| \u001b[39m53 \u001b[39m | \u001b[39m-6.570925\u001b[39m | \u001b[39m2.8292923\u001b[39m | \u001b[39m1.2876475\u001b[39m |\n",
- "| \u001b[39m54 \u001b[39m | \u001b[39m-9.379160\u001b[39m | \u001b[39m4.0 \u001b[39m | \u001b[39m0.2348730\u001b[39m |\n",
- "| \u001b[39m55 \u001b[39m | \u001b[39m-1.919538\u001b[39m | \u001b[39m2.7774236\u001b[39m | \u001b[39m0.5391857\u001b[39m |\n",
- "| \u001b[39m56 \u001b[39m | \u001b[39m1.7608100\u001b[39m | \u001b[39m2.0724378\u001b[39m | \u001b[39m1.4170516\u001b[39m |\n",
- "| \u001b[39m57 \u001b[39m | \u001b[39m2.7261464\u001b[39m | \u001b[39m2.5382238\u001b[39m | \u001b[39m0.3742942\u001b[39m |\n",
- "| \u001b[39m58 \u001b[39m | \u001b[39m1.0709887\u001b[39m | \u001b[39m2.2180291\u001b[39m | \u001b[39m1.7567336\u001b[39m |\n",
- "| \u001b[39m59 \u001b[39m | \u001b[39m-2.762958\u001b[39m | \u001b[39m2.3604687\u001b[39m | \u001b[39m1.9480771\u001b[39m |\n",
- "| \u001b[35m60 \u001b[39m | \u001b[35m9.8078794\u001b[39m | \u001b[35m3.7359656\u001b[39m | \u001b[35m0.0871606\u001b[39m |\n",
- "| \u001b[39m61 \u001b[39m | \u001b[39m-4.491847\u001b[39m | \u001b[39m2.2697046\u001b[39m | \u001b[39m0.9271015\u001b[39m |\n",
- "| \u001b[39m62 \u001b[39m | \u001b[39m-7.820461\u001b[39m | \u001b[39m3.6302940\u001b[39m | \u001b[39m0.9264663\u001b[39m |\n",
- "| \u001b[39m63 \u001b[39m | \u001b[39m-7.729811\u001b[39m | \u001b[39m3.4716344\u001b[39m | \u001b[39m0.5808371\u001b[39m |\n",
- "| \u001b[39m64 \u001b[39m | \u001b[39m0.0 \u001b[39m | \u001b[39m2.9627339\u001b[39m | \u001b[39m0.0 \u001b[39m |\n",
- "| \u001b[39m65 \u001b[39m | \u001b[39m1.5792896\u001b[39m | \u001b[39m2.2103402\u001b[39m | \u001b[39m1.5537577\u001b[39m |\n",
- "| \u001b[39m66 \u001b[39m | \u001b[39m-10.51285\u001b[39m | \u001b[39m4.0 \u001b[39m | \u001b[39m2.0 \u001b[39m |\n",
- "| \u001b[39m67 \u001b[39m | \u001b[39m-1.713329\u001b[39m | \u001b[39m4.0 \u001b[39m | \u001b[39m1.3872441\u001b[39m |\n",
- "| \u001b[39m68 \u001b[39m | \u001b[39m-8.970683\u001b[39m | \u001b[39m3.4816814\u001b[39m | \u001b[39m2.0 \u001b[39m |\n",
- "| \u001b[39m69 \u001b[39m | \u001b[39m-6.907929\u001b[39m | \u001b[39m3.1449358\u001b[39m | \u001b[39m0.6406438\u001b[39m |\n",
- "| \u001b[39m70 \u001b[39m | \u001b[39m0.0 \u001b[39m | \u001b[39m2.0 \u001b[39m | \u001b[39m0.0 \u001b[39m |\n",
- "| \u001b[39m71 \u001b[39m | \u001b[39m0.7392374\u001b[39m | \u001b[39m2.5807033\u001b[39m | \u001b[39m0.1680426\u001b[39m |\n",
- "| \u001b[39m72 \u001b[39m | \u001b[39m-4.562182\u001b[39m | \u001b[39m2.0 \u001b[39m | \u001b[39m2.0 \u001b[39m |\n",
- "| \u001b[39m73 \u001b[39m | \u001b[39m-6.126883\u001b[39m | \u001b[39m4.0 \u001b[39m | \u001b[39m1.0129594\u001b[39m |\n",
- "| \u001b[39m74 \u001b[39m | \u001b[39m5.3100595\u001b[39m | \u001b[39m2.6696277\u001b[39m | \u001b[39m0.4009050\u001b[39m |\n",
- "| \u001b[39m75 \u001b[39m | \u001b[39m-9.284814\u001b[39m | \u001b[39m3.7432245\u001b[39m | \u001b[39m1.6394786\u001b[39m |\n",
- "| \u001b[39m76 \u001b[39m | \u001b[39m-7.137330\u001b[39m | \u001b[39m2.8654979\u001b[39m | \u001b[39m2.0 \u001b[39m |\n",
- "| \u001b[39m77 \u001b[39m | \u001b[39m-1.348705\u001b[39m | \u001b[39m2.4723187\u001b[39m | \u001b[39m1.3837038\u001b[39m |\n",
- "| \u001b[39m78 \u001b[39m | \u001b[39m-7.058910\u001b[39m | \u001b[39m3.0925218\u001b[39m | \u001b[39m0.2362469\u001b[39m |\n",
- "| \u001b[39m79 \u001b[39m | \u001b[39m-0.996604\u001b[39m | \u001b[39m3.3209947\u001b[39m | \u001b[39m1.0407170\u001b[39m |\n",
- "| \u001b[39m80 \u001b[39m | \u001b[39m0.0 \u001b[39m | \u001b[39m2.4714298\u001b[39m | \u001b[39m0.0 \u001b[39m |\n",
- "| \u001b[39m81 \u001b[39m | \u001b[39m-4.596786\u001b[39m | \u001b[39m2.0 \u001b[39m | \u001b[39m0.2597227\u001b[39m |\n",
- "| \u001b[39m82 \u001b[39m | \u001b[39m-5.779589\u001b[39m | \u001b[39m3.7398992\u001b[39m | \u001b[39m0.6631711\u001b[39m |\n",
- "| \u001b[39m83 \u001b[39m | \u001b[39m-5.729219\u001b[39m | \u001b[39m2.3868015\u001b[39m | \u001b[39m1.6522794\u001b[39m |\n",
- "| \u001b[39m84 \u001b[39m | \u001b[39m0.5184371\u001b[39m | \u001b[39m2.0 \u001b[39m | \u001b[39m1.0534721\u001b[39m |\n",
- "| \u001b[39m85 \u001b[39m | \u001b[39m6.0309662\u001b[39m | \u001b[39m2.4997710\u001b[39m | \u001b[39m1.1261392\u001b[39m |\n",
- "| \u001b[39m86 \u001b[39m | \u001b[39m4.5123472\u001b[39m | \u001b[39m2.3858689\u001b[39m | \u001b[39m1.1716953\u001b[39m |\n",
- "| \u001b[39m87 \u001b[39m | \u001b[39m-3.866982\u001b[39m | \u001b[39m2.4881181\u001b[39m | \u001b[39m1.0087834\u001b[39m |\n",
- "| \u001b[39m88 \u001b[39m | \u001b[39m0.1760935\u001b[39m | \u001b[39m2.5357808\u001b[39m | \u001b[39m1.2201542\u001b[39m |\n",
- "| \u001b[39m89 \u001b[39m | \u001b[39m-6.026251\u001b[39m | \u001b[39m3.7481022\u001b[39m | \u001b[39m1.2583295\u001b[39m |\n",
- "| \u001b[39m90 \u001b[39m | \u001b[39m-7.552453\u001b[39m | \u001b[39m3.1057135\u001b[39m | \u001b[39m0.9430033\u001b[39m |\n",
- "| \u001b[39m91 \u001b[39m | \u001b[39m4.3792924\u001b[39m | \u001b[39m3.2227405\u001b[39m | \u001b[39m1.4272740\u001b[39m |\n",
- "| \u001b[39m92 \u001b[39m | \u001b[39m8.8872652\u001b[39m | \u001b[39m3.8242650\u001b[39m | \u001b[39m0.1144921\u001b[39m |\n",
- "| \u001b[39m93 \u001b[39m | \u001b[39m6.7754683\u001b[39m | \u001b[39m3.3808190\u001b[39m | \u001b[39m0.8234020\u001b[39m |\n",
- "| \u001b[39m94 \u001b[39m | \u001b[39m9.0203809\u001b[39m | \u001b[39m3.4762411\u001b[39m | \u001b[39m0.7877866\u001b[39m |\n",
- "| \u001b[39m95 \u001b[39m | \u001b[39m0.2915253\u001b[39m | \u001b[39m3.4576724\u001b[39m | \u001b[39m0.8708593\u001b[39m |\n",
- "| \u001b[39m96 \u001b[39m | \u001b[39m6.0583691\u001b[39m | \u001b[39m3.4089252\u001b[39m | \u001b[39m0.7401581\u001b[39m |\n",
- "| \u001b[39m97 \u001b[39m | \u001b[39m5.8388338\u001b[39m | \u001b[39m3.5043809\u001b[39m | \u001b[39m0.7367659\u001b[39m |\n",
- "| \u001b[39m98 \u001b[39m | \u001b[39m5.2576899\u001b[39m | \u001b[39m2.3389192\u001b[39m | \u001b[39m0.4163599\u001b[39m |\n",
- "| \u001b[39m99 \u001b[39m | \u001b[39m2.8638093\u001b[39m | \u001b[39m2.2236012\u001b[39m | \u001b[39m0.3809771\u001b[39m |\n",
- "| \u001b[39m100 \u001b[39m | \u001b[39m-1.517114\u001b[39m | \u001b[39m2.3344667\u001b[39m | \u001b[39m0.5388304\u001b[39m |\n",
- "| \u001b[39m101 \u001b[39m | \u001b[39m-3.053882\u001b[39m | \u001b[39m2.3925645\u001b[39m | \u001b[39m0.3181264\u001b[39m |\n",
- "| \u001b[39m102 \u001b[39m | \u001b[39m0.0 \u001b[39m | \u001b[39m2.2179819\u001b[39m | \u001b[39m0.0 \u001b[39m |\n",
- "| \u001b[39m103 \u001b[39m | \u001b[39m8.1786108\u001b[39m | \u001b[39m3.3043655\u001b[39m | \u001b[39m0.7697731\u001b[39m |\n",
- "=================================================\n",
- "Time taken: 3.05 seconds\n",
- "Best value: 9.807879447937012\n"
- ]
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-03-18T18:25:26.986636Z",
+ "iopub.status.busy": "2026-03-18T18:25:26.986477Z",
+ "iopub.status.idle": "2026-03-18T18:25:27.089489Z",
+ "shell.execute_reply": "2026-03-18T18:25:27.089084Z"
}
- ],
+ },
+ "outputs": [],
"source": [
- "start = time.time()\n",
- "bo_optimizer.maximize(\n",
- " init_points=3,\n",
- " n_iter=100,\n",
+ "def run_bayes_opt(seed):\n",
+ " \"\"\"bayes_opt β UCB ΞΊ=2.576 (library default), Matern Ξ½=2.5.\"\"\"\n",
+ " bo = BayesianOptimization(\n",
+ " f=lambda x, y: float(f(x, y)),\n",
+ " pbounds=bo_bounds,\n",
+ " random_state=seed,\n",
+ " verbose=0,\n",
+ " allow_duplicate_points=True,\n",
+ " )\n",
+ " t0 = time.perf_counter()\n",
+ " bo.maximize(init_points=N_INIT, n_iter=N_BO)\n",
+ " elapsed = time.perf_counter() - t0\n",
+ "\n",
+ " scores = np.array([r[\"target\"] for r in bo.res])\n",
+ " regret = true_max - np.maximum.accumulate(scores)\n",
+ " return regret, elapsed / N_TOTAL\n",
+ "\n",
+ "\n",
+ "def run_bayex(seed):\n",
+ " \"\"\"bayex β EI ΞΎ=0.01 (library default), RBF kernel.\"\"\"\n",
+ " key = jax.random.PRNGKey(seed)\n",
+ " key_x, key_y, key_run = jax.random.split(key, 3)\n",
+ "\n",
+ " # In-domain random initialisation\n",
+ " xs_init = jax.random.uniform(key_x, (N_INIT,), minval=2.0, maxval=4.0)\n",
+ " ys_init = jax.random.uniform(key_y, (N_INIT,), minval=0.0, maxval=2.0)\n",
+ " params_init = {\"x\": xs_init.tolist(), \"y\": ys_init.tolist()}\n",
+ " f_init = [float(f(x, y)) for x, y in zip(params_init[\"x\"], params_init[\"y\"])]\n",
+ "\n",
+ " bx_opt = bayex.Optimizer(domain=bayex_bounds, maximize=True, acq=\"EI\")\n",
+ " t0 = time.perf_counter()\n",
+ " opt_state = bx_opt.init(f_init, params_init)\n",
+ " scores = list(f_init)\n",
+ " for step in range(N_BO):\n",
+ " key_run, k = jax.random.split(key_run)\n",
+ " new_params = bx_opt.sample(k, opt_state)\n",
+ " y_new = float(f(**new_params))\n",
+ " opt_state = bx_opt.fit(opt_state, y_new, new_params)\n",
+ " scores.append(y_new)\n",
+ " elapsed = time.perf_counter() - t0\n",
+ "\n",
+ " scores = np.array(scores)\n",
+ " regret = true_max - np.maximum.accumulate(scores)\n",
+ " return regret, elapsed / N_TOTAL\n",
+ "\n",
+ "\n",
+ "# Create the hyperoptax optimizer once so JIT compilation is amortised\n",
+ "_hoptax_state0, _hoptax_opt = BayesianSearch.init(\n",
+ " hoptax_bounds, n_max=N_TOTAL, n_warmup=N_INIT\n",
")\n",
"\n",
- "bo_time = time.time() - start\n",
- "bo_max = bo_optimizer.max[\"target\"]\n",
- "print(f\"Time taken: {bo_time:.2f} seconds\")\n",
- "print(\"Best value: \", bo_max)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Bayex"
+ "\n",
+ "@jax.jit\n",
+ "def _run_hyperoptax_all_seeds(keys):\n",
+ " \"\"\"Compile once, run all seeds in parallel via vmap.\"\"\"\n",
+ " def one_seed(key):\n",
+ " _, (_, results) = _hoptax_opt.optimize_scan(\n",
+ " _hoptax_state0, key, wrapper, N_TOTAL\n",
+ " )\n",
+ " return results # (N_TOTAL, 1)\n",
+ " return jax.vmap(one_seed)(keys) # (N_SEEDS, N_TOTAL, 1)\n",
+ "\n",
+ "\n",
+ "def run_hyperoptax_vectorized():\n",
+ " \"\"\"hyperoptax β EI ΞΎ=0.01, Matern Ξ½=2.5; all seeds in one vmapped JIT call.\"\"\"\n",
+ " keys = jax.random.split(jax.random.PRNGKey(0), N_SEEDS)\n",
+ " t0 = time.perf_counter()\n",
+ " all_results = _run_hyperoptax_all_seeds(keys).block_until_ready()\n",
+ " elapsed = time.perf_counter() - t0\n",
+ "\n",
+ " scores = np.array(all_results[:, :, 0]) # (N_SEEDS, N_TOTAL)\n",
+ " regrets = true_max - np.maximum.accumulate(scores, axis=1)\n",
+ " return regrets, elapsed / (N_SEEDS * N_TOTAL)"
]
},
{
"cell_type": "code",
"execution_count": 4,
- "metadata": {},
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-03-18T18:25:27.090903Z",
+ "iopub.status.busy": "2026-03-18T18:25:27.090813Z",
+ "iopub.status.idle": "2026-03-18T18:25:42.571893Z",
+ "shell.execute_reply": "2026-03-18T18:25:42.571560Z"
+ }
+ },
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Time taken: 6.00 seconds\n",
- "Best value: 10.569071\n"
+ "Running comparison (this may take a minute)...\n",
+ " running hyperoptax (vmapped)...\n",
+ "Done. True max = 10.5999\n"
]
}
],
"source": [
- "start = time.time()\n",
- "# Define some prior evaluations to initialise the GP.\n",
- "params = {\"x\": [0.0, 0.5, 1.0], \"y\": [0.0, 0.0, 0.0]}\n",
- "ys = [f(x, y) for x, y in zip(params[\"x\"], params[\"y\"])]\n",
- "opt_state = bayex_optimizer.init(ys, params)\n",
- "\n",
- "# Sample new points using Jax PRNG approach.\n",
- "ori_key = jax.random.key(42)\n",
- "for step in range(97):\n",
- " key = jax.random.fold_in(ori_key, step)\n",
- " new_params = bayex_optimizer.sample(key, opt_state)\n",
- " y_new = f(**new_params)\n",
- " opt_state = bayex_optimizer.fit(opt_state, y_new, new_params)\n",
- "\n",
- "bayex_time = time.time() - start\n",
- "bayex_max = opt_state.best_score\n",
- "print(f\"Time taken: {bayex_time:.2f} seconds\")\n",
- "print(\"Best value: \", bayex_max)"
+ "print(\"Running comparison (this may take a minute)...\")\n",
+ "lib_results = {\"bayes_opt\": [], \"bayex\": [], \"hyperoptax\": []}\n",
+ "lib_timings = {\"bayes_opt\": [], \"bayex\": [], \"hyperoptax\": []}\n",
+ "\n",
+ "for seed in range(N_SEEDS):\n",
+ " print(f\" seed {seed + 1}/{N_SEEDS}\", end=\"\\r\")\n",
+ "\n",
+ " r, t = run_bayes_opt(seed)\n",
+ " lib_results[\"bayes_opt\"].append(r)\n",
+ " lib_timings[\"bayes_opt\"].append(t)\n",
+ "\n",
+ " r, t = run_bayex(seed)\n",
+ " lib_results[\"bayex\"].append(r)\n",
+ " lib_timings[\"bayex\"].append(t)\n",
+ "\n",
+ "# hyperoptax: all N_SEEDS seeds in one vmapped JIT call\n",
+ "print(\" running hyperoptax (vmapped)...\", end=\"\\r\")\n",
+ "hoptax_regrets, hoptax_time_per_eval = run_hyperoptax_vectorized()\n",
+ "lib_results[\"hyperoptax\"] = hoptax_regrets # already (N_SEEDS, N_TOTAL)\n",
+ "lib_timings[\"hyperoptax\"] = [hoptax_time_per_eval] * N_SEEDS\n",
+ "\n",
+ "# Stack sequential runners into (N_SEEDS, N_TOTAL) arrays\n",
+ "for k in [\"bayes_opt\", \"bayex\"]:\n",
+ " lib_results[k] = np.stack(lib_results[k])\n",
+ "\n",
+ "print(f\"\\nDone. True max = {true_max:.4f}\")"
]
},
{
- "cell_type": "markdown",
- "metadata": {},
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-03-18T18:25:42.573375Z",
+ "iopub.status.busy": "2026-03-18T18:25:42.573288Z",
+ "iopub.status.idle": "2026-03-18T18:25:42.794576Z",
+ "shell.execute_reply": "2026-03-18T18:25:42.794280Z"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxYAAAGGCAYAAADmRxfNAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAwjFJREFUeJzsnQV4XGXahp9xiXuaurtABYp7kcUXd+kiRX7cYXFYnF1scVgW18WhaEtLvdTd466T0f96vtMJkzRJZ5JMRvLevU4zcuac75w5M/M+32s6n8/ngyAIgiAIgiAIQifQd+bFgiAIgiAIgiAIRISFIAiCIAiCIAidRoSFIAiCIAiCIAidRoSFIAiCIAiCIAidRoSFIAiCIAiCIAidRoSFIAiCIAiCIAidRoSFIAiCIAiCIAidRoSFIAiCIAiCIAidRoSFIAiCIAiCIAidRoSFIAiC0GM46KCD1OJn8+bN0Ol0eO211yI6LkHoDH//+9/VdSwIkUaEhSCEmQ0bNuCSSy7BoEGDYLVakZycjH333RdPPfUUGhoaIj08QRDiyLAsLS3d5bnPP/8cRx55JDIyMtR30LBhw3DDDTegvLx8l3XPP/98tR3/YrFY1Pp33nknHA4H4omffvqp2bEGLnPnzo308AQhJjFGegCCEM988cUXOOWUU9SP87nnnosxY8bA6XRi1qxZ6od9xYoV+Pe//x3pYQpCj6V///5K4JtMJsQj119/PR577DGMHz8eN910E9LT07Fo0SL885//xLvvvouZM2di6NChzV7D76uXXnpJ3a6qqsKnn36Ke++9V02SvPXWW4g3rrrqKkyePLnZY0OGDInYeAQhlhFhIQhhYtOmTTj99NOV4fLDDz+gV69eTc/NmDED69evV8IjluEMptlshl4vzs/O4Ha74fV61bkUuhfOTnMWP5rG8+qrryrPQWd5++23lag47bTTlCAwGAxNz3H7Bx98sJr4WLBgAYzGP80B3j777LOb7l9++eXYZ5991PYef/xx5OTkIFaoq6tDQkJCu+vsv//++Otf/9ptYxKEeEasAUEIE//4xz9QW1uLl19+uZmoCJwRu/rqq5sZl5wVHDx4sJoxHDBgAG699VY0NjY2ex0f/8tf/qK8HlOmTFFGEcOs3njjjaZ1aCjQQHn99dd32e8333yjnmN4hJ8dO3bgwgsvVAYD9z169Gi88sorrYYNvPPOO7j99tvRu3dv2O12VFdXq+fff/99jBo1So2HnpmPP/5YGS8cbyA0oJ988km1D67LfTJUrKKiIuTj9FNZWYlrrrlGvYbj79Onj/IQBYaF8Dzedddd6rxznb59++LGG2/c5fy2xe+//46jjz4aaWlpylAZN26cCmdrK3bfT8tz4I/pf/TRR9V58L/fixcvVgbd3Xffvcs21qxZo17zr3/9q9kx/9///Z86Dr6ex/Xwww+r8xsI36+JEyciKSlJheGNHTu22bi7E/819N5776nj5DXEcdGo48w43wseU3Z2NhITE3HBBRe0+v785z//Ucdks9nUDDwF/LZt23ZZj95Anl+ux2vo119/3WWd1nIs/vjjD/W++cMXc3Nz1eejrKys1fAjThJw/dTUVKSkpKhx19fXI9LwHPN65XkIFBWE54MejKVLl+Kjjz5qdzs8xv322w8+nw8bN24Mat/PPvus+ozz2szLy1OTKbxm/VxxxRXqPW7tPJ1xxhnqnHs8nqbHvvrqKyUA+NnjNXPMMccoj28gfA+4TXpW+FnlemeddVZQ462pqVHfwaGwbt06nHzyyWqsvE74vcNrkddyR65XfscwZI3XEL9bDzzwQMyePXuX9fidSA8L98nr+4UXXmh1fN99951633hd8rwMHz5c/aYIQljxCYIQFnr37u0bNGhQ0Oufd955Pn4k//rXv/qeeeYZ37nnnqvun3DCCc3W69+/v2/48OG+nJwc36233ur717/+5dtzzz19Op3Ot3z58qb1uO+jjz56l/1ccMEFvrS0NJ/T6VT3CwsLfX369PH17dvXd8899/iee+4533HHHaf2/cQTTzS97scff1SPjRo1yjdhwgTf448/7nvwwQd9dXV1vs8//1ztf9y4cerxO+64Q+1jzJgxaryBXHzxxT6j0eibPn267/nnn/fddNNNvoSEBN/kyZObxhTKcdbU1Kj9GAwGtU2O/95771XbW7x4sVrH4/H4jjjiCJ/dbvf93//9n++FF17wXXHFFWocxx9//G7fm2+//dZnNpvVmO666y61j6uuusp32GGHNa1z4IEHqqW19zXwHGzatKnpPPI9euihh9R53rJli++QQw5Rj7fk7rvvVsfH94rwnPNcZ2RkqHPD88jrhefm6quvbjZu7uvQQw9V1xQXHvcpp5ziiwT+a4jXz9SpU31PP/20Oo8c9+mnn+4788wzfUcddZQa5znnnKPW5bEHct9996n1TzvtNN+zzz6rns/MzPQNGDDAV1FR0bTeSy+9pF6/zz77qP3wfU9NTVXnPPB98r8fr776atNjjz76qG///fdXn4d///vf6pzabDbflClTfF6vt2k9Xgt87R577OE76aST1Hh4ffOxG2+8cbfng+9jSUlJs4Wv/ec//9nssfLy8t1uyz8Wrk/Wrl2r7p9//vltvsZ/7GeffXaz65Wfx5bwe4nrrlq1Kuix8PPBY+E1x+s38DP+yy+/qHXee++9Xc4J9z9jxoymx9544w31nh955JFqew8//LB6v/l+8hgCx26xWHyDBw9Wt/m54Gt3dz0mJiaqvxzjQQcd5Js/f/5uj7GxsdE3cOBAX15enromeb3xWuQxbt68OeTrdebMmeo7hp+Lxx57TH0n8DPOx37//fem9f744w91Lfbr1099//K7jt+RXDfQpON3JF87adIk31NPPaXOxfXXX+874IADdntsgtAZRFgIQhioqqpSX/LBGK1kyZIlan0aJYHwh4CP//DDD02P0UjlY/xh9lNcXKx+UK+77rqmx2655RafyWRqZpTwx5A/xhdeeGHTYxdddJGvV69evtLS0mb7pqGXkpLiq6+vb/YjTMPM/5ifsWPHKnFCI9/PTz/9pNYPNKp//fVX9dhbb73V7PVff/31Lo8He5x33nmnWu+jjz7a5bz6jcA333zTp9fr1f4D4Y8tXzt79mxfW7jdbmVAcDyBhkDg9jsiLJKTk9XxBELBw+eWLVvW7HGKDYoOPzQmaHzReAzk5ptvVsbR1q1b1X0axNwPjyEa8F9DFIKBIvKMM85QxhdFRSA0sgLPHQ02Ht/999/fbD2eL4pE/+PcdnZ2thIwvOb9UCRw/7sTFi2vb/L222/vcj36DejAzxM58cQTlejbHf7X725pKc6DERaffPLJLpMDrcHrg4K9pbDwi5r169crocX3h+9b4DXfGrymadBSyFPQ++HEAMfzyiuvqPvcDidfTj755Gavp9AIPM/8TuF3FicNAqHI5vdT4OP+yRl+DoKBn3vu/+WXX/Z9+umnylDn+2a1Wn2LFi1q97WctOC+3n///TbXCfZ65bkYOnSob9q0ac3OL69DfvccfvjhTY9xoonj40SEn5UrV6r9BAoLvu+B14Mg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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
"source": [
- "### Hyperoptax"
+ "labels = {\n",
+ " \"bayes_opt\": \"bayes_opt (UCB ΞΊ=2.576)\",\n",
+ " \"bayex\": \"bayex (EI ΞΎ=0.01)\",\n",
+ " \"hyperoptax\": \"hyperoptax (EI ΞΎ=0.01)\",\n",
+ "}\n",
+ "colors = {\"bayes_opt\": \"C0\", \"bayex\": \"C1\", \"hyperoptax\": \"C2\"}\n",
+ "\n",
+ "fig, ax = plt.subplots(figsize=(8, 4))\n",
+ "evals = np.arange(1, N_TOTAL + 1)\n",
+ "\n",
+ "for lib, label in labels.items():\n",
+ " r = lib_results[lib]\n",
+ " median = np.median(r, axis=0)\n",
+ " q25 = np.percentile(r, 25, axis=0)\n",
+ " q75 = np.percentile(r, 75, axis=0)\n",
+ " ax.semilogy(evals, np.clip(median, 1e-6, None), label=label, color=colors[lib])\n",
+ " ax.fill_between(evals, np.clip(q25, 1e-6, None), np.clip(q75, 1e-6, None),\n",
+ " alpha=0.2, color=colors[lib])\n",
+ "\n",
+ "ax.set_xlabel(\"Function evaluations\")\n",
+ "ax.set_ylabel(\"Regret (true_max β running best)\")\n",
+ "ax.set_title(f\"Convergence curves β median Β± IQR over {N_SEEDS} seeds\")\n",
+ "ax.legend()\n",
+ "plt.tight_layout()\n",
+ "plt.show()"
]
},
{
"cell_type": "code",
- "execution_count": 5,
- "metadata": {},
+ "execution_count": 6,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-03-18T18:25:42.795885Z",
+ "iopub.status.busy": "2026-03-18T18:25:42.795804Z",
+ "iopub.status.idle": "2026-03-18T18:25:42.847243Z",
+ "shell.execute_reply": "2026-03-18T18:25:42.846966Z"
+ }
+ },
"outputs": [
{
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Time taken: 0.58 seconds\n",
- "Best value: 10.589436\n"
- ]
+ "data": {
+ "image/png": "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AZM/f/5oN0cIIWKKKhOqRLsJIo1Y0W5F1ObYuDTJwf79+82PP/5odu3aZU6fPh3YnilTJnPvvfdGtW1CCCGEiC3iUmD69NNPTZs2bczhw4etNImQ5JDAJIQQQohQ4tKHqVevXua+++6zAhOapn379gVee/fujXbzhBBCCBFjxKXA9Mcff5iuXbua3Llzp+h1hwwZYjVU3bt3D2w7duyYeeSRR6xjOekMyPm0c+fOFL2vEEIIIVKXuBSYGjRoYH7++ecUveZPP/1kXn/9dVO1atWg7WQOxwT44Ycfmvnz55s///zTNG/ePEXvLYQQQojUJS59mG677Tbz2GOPmdWrV5sqVaqYbNmyBe1v3Lhxsq6HaQ+fqDfeeMM8++yzge143I8bN85MmjTJ1KtXz24bP368qVChglm8eLG55pprUugTCSGEECI1iUuB6f7777f/Dxw48Ix9mNROnTqVrOthckMIq1+/fpDARF6nf//91253lC9f3lx44YW2hl1CAtPx48ftyx/yKIQQQojoEZcCkz+NwLnywQcfmKVLl1qTXCg7duww2bNnNwULFgzaXqJECbsvIQYPHmwGDBiQYm0UQgghxLkRlz5MKVnEt1u3bua9996zdehSij59+lhznntxHyGEEEJEj7gVmHDAvv322025cuXsC7+l7777LlnXwORG4ssrr7zSZM2a1b647siRI+3faJJOnDhhUxf4IUquZMmSCV43R44cNj+U/yWEEEKI6BGXAtPEiROtXxFpBUgvwCtXrlzmpptusg7aSYXjV6xYYX755ZfAq0aNGtYB3P2NQ/mcOXMC56xdu9Zs3brV1rITQgghRPogLn2YnnvuOTN06FAb8u9AaBo+fLh55plnTOvWrZN0nXz58pnKlSsHbcuTJ4/NueS2d+zY0fTs2dMULlzYaoq6dOlihaVYiJAr8+SsaDdBpBGbh9wW7SYIIUS6Ji41TBs3brTmuFAwy23atClF7/XSSy+ZRo0a2YSV119/vTXFTZs2LUXvIYQQQojUJS41TKVLl7ZmMnyX/Hz99dd237kwb968oPc4g48aNcq+hBBCCJE+yRqvteQwweFnVLt2bbtt4cKF5u233zYvv/xytJsnhBBCiBgjLgWmhx56yJrGhg0bZqZMmWK3kX178uTJpkmTJtFunhBCCCFijLgUmKBZs2b2JYQQQggRibh0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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " Final regret (median) | \n",
+ " Evals / sec (mean) | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | bayes_opt (UCB ΞΊ=2.576) | \n",
+ " 0.7932 | \n",
+ " 38.056 | \n",
+ "
\n",
+ " \n",
+ " | bayex (EI ΞΎ=0.01) | \n",
+ " 0.0205 | \n",
+ " 32.697 | \n",
+ "
\n",
+ " \n",
+ " | hyperoptax (EI ΞΎ=0.01) | \n",
+ " 0.0014 | \n",
+ " 92.826 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Final regret (median) Evals / sec (mean)\n",
+ "bayes_opt (UCB ΞΊ=2.576) 0.7932 38.056\n",
+ "bayex (EI ΞΎ=0.01) 0.0205 32.697\n",
+ "hyperoptax (EI ΞΎ=0.01) 0.0014 92.826"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
}
],
"source": [
- "start = time.time()\n",
- "result = hoptax_optimizer.optimize(n_iterations=100, n_vmap=2, jit=True)\n",
+ "# Per-eval throughput bar chart\n",
+ "fig, ax = plt.subplots(figsize=(6, 3))\n",
+ "ax.bar(\n",
+ " [labels[k] for k in lib_timings],\n",
+ " [1.0 / np.mean(lib_timings[k]) for k in lib_timings],\n",
+ " color=[colors[k] for k in lib_timings],\n",
+ ")\n",
+ "ax.set_ylabel(\"Evaluations per second\")\n",
+ "ax.set_title(\"Throughput (averaged over seeds)\")\n",
+ "plt.xticks(rotation=12, ha=\"right\")\n",
+ "plt.tight_layout()\n",
+ "plt.show()\n",
"\n",
- "hoptax_time = time.time() - start\n",
- "hoptax_max = hoptax_optimizer.max[\"target\"]\n",
- "print(f\"Time taken: {hoptax_time:.2f} seconds\")\n",
- "print(\"Best value: \", hoptax_max)"
+ "# Summary table\n",
+ "summary = pd.DataFrame(\n",
+ " {\n",
+ " \"Final regret (median)\": {\n",
+ " labels[lib]: f\"{np.median(lib_results[lib][:, -1]):.4f}\"\n",
+ " for lib in lib_results\n",
+ " },\n",
+ " \"Evals / sec (mean)\": {\n",
+ " labels[lib]: f\"{1.0 / np.mean(lib_timings[lib]):.3f}\"\n",
+ " for lib in lib_timings\n",
+ " },\n",
+ " }\n",
+ ")\n",
+ "summary"
]
},
{
"cell_type": "code",
- "execution_count": 6,
- "metadata": {},
+ "execution_count": 7,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-03-18T18:25:42.848487Z",
+ "iopub.status.busy": "2026-03-18T18:25:42.848392Z",
+ "iopub.status.idle": "2026-03-18T18:25:42.907058Z",
+ "shell.execute_reply": "2026-03-18T18:25:42.906780Z"
+ }
+ },
"outputs": [
{
"data": {
- "image/png": "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u7vC79q1y/IC3Yl+3LhxsT4MZJLCzJVTl9sf+w/aHbPWpBmCXlz2g3td62l9QhCArCAAxSj8BIeg2xbedkT4iVYIile6sSr8yws/h5KT/9dGamFDkMLPnbO+cn/XelqfEAQgKwhAUaL6hFsX3GqHkg+lGX48725+N93Xtb32o/1Fs+5h//797uZxr776asjy2bNnW7FixWzv3r32/fffu9aiGTNm2FlnneVuaFm3bl1bsGBByDa6X1jHjh2tePHiVr58ebv88stt587/v0jpVhq6rYbuFH/cccdZhw4d3HLt54wzzrDChQu7O8XffvvtdujQoSO200M3vNO2umO9d170uu42r7va6zj1kN9++8169eplJ5xwgh1zzDHuLvUvvfRSYL+//vqrVahQwe67777AssWLF1uhQoVs3rx5ET/XCB9+klP9eAeHoODw49H6hCAAWUEAihJdeAc0GhCo+cku7Uf78y7o0aCQ07NnT5s6NfSmq3p+ySWX2LHHHhtYduutt9rgwYPt888/t+bNm1vnzp1dyBB1pbVp08YaNmxoK1assDlz5tj27dutR4/QW348++yzLmAsWrTIJk+ebD///LOdf/751rRpU/viiy9s0qRJ9t///tdGjx59xHYFChSwzz77zB577DF75JFH7Omnn3avvf7663biiSfayJEjbevWre7h3YVc9zB75513XDjr16+fC2Xahxx//PH2zDPP2N133+2OWWFPrytotW3bNkpnHOmFn+AQdPOMz48IPx5CEICsSEhhKMUR9uzZ41oXdu/e7VpEgulCunnzZqtWrZpr/TiacLU9WTGi+Qjrfkr3bNcAvfDCC0cc9+HDh93n+uOPP+y7775zLTtbtmxxLTA7duxwrSYffvihtWrVyrUA6bPff//9dtttt7nt1UKjZbo7/NChQ11g+eSTT2zu3LmB9/jpp5+scuXKtm7dOjvllFNcS43O86pVqwLr3Hnnnfbaa6/ZN998Ewh6TzzxhHsffRf58uVz2+mYvv7668A6aiV68803be3atYEaILUs6ZGeCy64wGrXrm0PPfRQYNmNN97oPmuTJk1szZo1tnz5ctcahcgI/v9H51WFzKrlicQ/QvppKF2skK0c1i6qvygAyJ3X79RoAYqyHrV62PAzh8c8/Hhat25tq1evDnl4rSei7qfTTjvNtbKIAlPVqlXt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2yx//vwxO7a8Uly+ceNGu/zyy2N9KLlOixYtjpgq5LvvvnMtarFAAPLh/7zBv7ls3rzZdTuocLdKlSoxPbbc2O01ffp0e+ONN1wtwLZt29zykiVLuvktkHGJiYmuq0E/g3v37nXnVaFy7ty5sT60XEc/i6nr0IoVK+bmXaE+LfOGDBniRinqIv3LL7+4u5grRPbq1SvWh5br3HLLLXbWWWe5LrAePXrYZ599Zk899ZR7xITuBg//mD9/foq+9tSPPn36xPrQcp1w51GPqVOnxvrQcp2rrroqpWrVqimFChVKOf7441Patm2b8v7778f6sPKMVq1apdx8882xPoxc6dJLL02pWLGi+9k84YQT3PMNGzbE+rByrbfeeiulbt26KYULF06pXbt2ylNPPRWzY0nQf2ITvQAAAGKDImgAAOA7BCAAAOA7BCAAAOA7BCAAAOA7BCAAAOA7BCAAAOA7BCAAAOA7BCAAAOA7BCAAucKVV15pXbt2jdn7695P3l2sj6Znz5728MMPR/2YAGQdM0EDiLmEhIR0X9f9l3QfIf1zpbtx57QvvvjC2rRpYz/88IMVL178qOt/9dVXds4557h77enecADiDwEIQMx5N5KVl19+2UaMGBFy12iFjowEj2i55pprrECBAjZ58uQMb9O0aVPXaqWb5gKIP3SBAYi5ChUqBB5qMVGLUPAyhZ/UXWDnnnuuDRgwwAYOHGilS5e28uXL25QpU2z//v3Wt29fd1f0GjVq2HvvvXdE64zuPK99aht1be3cuTPNYzt8+LC9+uqr7o7gwZ544gmrWbOmFSlSxO3nkksuCXld68+YMSNi5whAZBGAAORazz77rB133HH22WefuTB0ww03WPfu3e2ss86yVatWWfv27V3A+fPPP936u3btcl1ZDRs2tBUrVticOXNs+/bt1qNHjzTf48svv7Tdu3dbkyZNAsu07U033WQjR450LVXaj7q8gp1xxhnuuJKSkqJ4BgBkFQEIQK5Vv359GzZsmGuJSUxMdK0xCkTXXnutW6autN9++82FGJkwYYILPypmrl27tvv7M888Y/Pnz7fvvvsu7Huo7id//vxWrly5wLIff/zRihUrZhdccIFVrVrV7UeBKFilSpXs4MGDId17AOIHAQhArnX66acH/q6QUrZsWatXr15gmbqmZMeOHYFiZoUdr6ZIDwUh2bhxY9j3+Ouvv6xw4cIhhdrnnXeeCz7Vq1d3LUwvvvhioJXJU7RoUfdn6uUA4gMBCECuVbBgwZDnCinBy7zQkpyc7P7ct2+fq81ZvXp1yGP9+vVHdGF51KKkEKPWHI/qi9TF9tJLL1nFihVdS5Nao9TF5vn999/dn8cff3yEPzWASCAAAfCNRo0a2ddff20nnXSSK5AOfqhLK5wGDRq4P9euXRuyXKPC2rVrZ2PHjnVdbN9//7199NFHIcXWJ554ogtQAOIPAQiAb2hIulpmevXqZcuXL3fdXnPnznWjxjTaKxy14Cg4ffrpp4Flb7/9to0fP961HqlG6LnnnnOtTLVq1Qqs88knn7gibADxiQAEwDdUmLxo0SIXdhROVC+kYfSaXDFfvnzpzgOkOh+P1n/99dfdiLI6deq4+YHUHXbaaae51w8cOGCzZ892xdgA4hMTIQLAUagQWq07mqSxefPmR11/0qRJNmvWLHv//fdz5PgAZB4tQABwFBrRpW6u9CZMDKZC7McffzzqxwUg62gBAgAAvkMLEAAA8B0CEAAA8B0CEAAA8B0CEAAA8B0CEAAA8B0CEAAA8B0CEAAA8B0CEAAA8B0CEAAA8J3/A1bkLXWA5HEoAAAAAElFTkSuQmCC",
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxUAAAGGCAYAAAANcKzOAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAssJJREFUeJzsnQWYG9Xext/Yunfr7t4CpS0tUry4Xtzd9QMuXuyiF7cCl+LORXpxtxqUtlBKqVF3WbfYfM97skmz2/XNSrLvj2doMjmZnDkzyZ73/M1mWZYFIYQQQgghhGgg9oa+UQghhBBCCCGIRIUQQgghhBCiUUhUCCGEEEIIIRqFRIUQQgghhBCiUUhUCCGEEEIIIRqFRIUQQgghhBCiUUhUCCGEEEIIIRqFRIUQQgghhBCiUUhUCCGEEEIIIRqFRIUQQpRjs9lw2223tXQ3Yp4XX3zRjPWKFStC+/bee2+zCRGt8H7mfc37W4i2iESFEFHG/Pnz8Y9//AM9e/ZEQkICunbtigMOOACPP/54S3ctKvjkk08kHESTTir//e9/7/DaqlWrcOGFF6JXr16Ij49Hhw4dcPTRR2P69Ok7tP3uu+/McYKbw+Ew7fm9X7hwIWINjkn4+QY3jpcQInpwtnQHhBB1hxOQffbZBz169MB5552HTp06YfXq1Zg5cyYeffRRXHbZZS3dxagQFU8++WSVwqKkpAROp34WW4IvvvgCscq0adNwyCGHmMfnnnsuhgwZgg0bNpgV7T322MPcjxdddNEO77v88ssxevRoeDwe/P7775g8ebIRHH/88Yf57scSO+20E/7v//6vwr4BAwa0WH+EEPVHfz2FiCL+9a9/IT09Hb/88gsyMjIqvLZp06Zm7UtxcTGSkpIQS9DyI1qGuLg4tBbOPPNMY3XgBL6x5OTkGAtDYmKiERd9+/YNvXb11Vdj4sSJZjFg5513xm677VbhvXvuuad5b5CBAwca8fHyyy/juuuuQ7RQWlpqrq/dXr1zBC2up556arP2SwgRWeT+JEQUsWzZMgwdOnQHQUHoHlGZV199FWPGjDGT/8zMTOy11147rAg/9dRT5ph0yejSpQsuueQS5ObmVmhDX/dhw4bh119/Ncfg8W688UbzWllZGSZNmoR+/fqZY3Tv3t1MeLi/Ji699FKkpKQYcVKZk046yazE+nw+83z27Nlm8pWdnW0mZ71798bZZ5+NhkwWuSpMwt0sqoup4GPuW7x4sZnwUNC1b98et9xyCyzLMlaiI488Emlpaaa/Dz744A6f2dDxaWp3k8MOO8xMmnfddVczpsOHDw9Not977z3znCJr1KhRmDt37g7H+Ouvv8yENysry7TjcaZOnbpDuwULFmDfffc1n9GtWzfcdddd8Pv9O7SrHFPhdrtx6623ms/nuCcnJ5tJ9rfffluty9Gzzz5rJu0cZ67wU3y3NM8884yxSjzwwAMVBAXhmLz00kvm8R133FHrsXj+wd+BusDrdvDBB5v7k9+1/fbbz1g1g/B7xbEL9iGczz//3Lz20UcfhfatXbvWfO86duxoxpi/G1OmTKnSdevNN9/EzTffbMQCfy/y8/Nr7S+veVFREeoDrTi33347+vfvb+7Ddu3aGevPl19+2aD7lb99V155pfme8hz5vb3vvvt2uGfZjr8nvDf5e3zGGWfs8LtJeO3POussc+/zeJ07dza/GeHxRELECrJUCBFFMI5ixowZxv2Bk/ya4B9aTorHjx9vJixcKZw1axa++eYbHHjggaYNX2e7/fff36yALlq0CE8//bSZjHFV1eVyhY63detWM0E58cQTzQSbEwv+oT3iiCPw008/4fzzz8fgwYNNzMfDDz9sJuIffPBBtf074YQTzAT/448/xnHHHRfaT5Hxv//9z/zBpi85LTDsLyfz119/vfkDzj/InPjWlwsuuADr1q0zE45XXnmlzu9jX3lu9957r+kvJ8acnHDCyAkzJx2vvfYarrnmGjOZpfAijRmfpmbp0qU4+eSTzZjwenJSfvjhhxsXGwrGiy++2LS75557cPzxx5t7I7jSTKGw++67mwkjrwkn/G+//TaOOuoo/Pe//zWxAsEJFd31vF5vqB0n/pxM1wYnof/5z3+MwKSrX0FBAZ5//nkjLn/++WfjLhPO66+/btrwfDipvf/++3HMMcfg77//rnAfV4bXaNu2bRX2UfBxsrply5YK+zmBrOlYVcF7mZNYjmFVUCBzEvzVV1+ZFf2arGXBiSgXCGqD14gihIKCIpb95v1K4fb9999j7NixZmLdp08fc+04KQ7nrbfeMp/D8SYbN240lhSOLRcE+H389NNPcc4555hrxYl4OHfeeaf5zeF3guNZmyWKv0sUH1xI4O/cVVddhSuuuKLW8+Rv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hf183qlTpyrfw/31aU/oXsVA9OC2evVqtCTpCelol9Cuke5PiqkQQgghhBCtSFScfPLJ+Pbbb81juhExpoHC4qabbsIdd9yBpoIuVqNGjcLXX38d2uf3+83zcePGVfke7g9vT7788stq2xNaYNLS0ipsLUlaXBrS49MbZ6lwqJq2EEIIIYRoRaKC6VjHjBljHr/99tum9gNTt7722mt48cUX0ZQw6Pq5557DSy+9hIULF+Kiiy5CUVFRKJXt6aefXiGQ+4orrsBnn32GBx980MRd3HbbbZg9ezYuvfRStBloqXDGpquaEEIIIYRoHdTb0d7j8YTiKb766iscccQR5jELzK1fvx5NyQknnGBcr2699VZjJdlpp52MaAgGY69atcpkhAoyfvx4vP7667j55ptx4403on///ibz07Bhw9CmRIVDokIIIYQQQjQdNouFJ+oBq1jvs88+OPTQQ3HggQdi5syZpggd//3HP/5h6lXEEsz+xPobjK9oaVeoKinaAqyaCaR3rfr1vLVAxyFAVp/m7pkQQgghhGgj89x6uz/dd999eOaZZ7D33nubatUUFGTq1KkhtyjRylDmJyGEEEII0YTUe7ZJMcGaEVQ2mZmZof3nn3++qW4tWiESFUIIIYQQogmpt6WC0GOK1a1psSgoKAhlZ5KoaKVIVAghhBBCiCak3rPNlStX4qCDDjJB0aw8fcABByA1NdW4RfH55MmTm6anov4wXMYmUSGEEEIIIVqZpYJpWnfddVfk5OQgMTExtP/oo4/eoSaEaGFYo8KmwndCCCGEEKJpqfcS9o8//mjqUtDdKZxevXph7dq1keybaCymmrZTlgohhBBCCNG6LBWsYu3z+XbYz1SydIMSrUxUGEuFRIUQQgghhGhFooK1KR555JHQc5vNhsLCQkyaNAmHHHJIpPsnGuv+RNcniQohhBBCCNGE1Hu2+eCDD2LixIkYMmQISktLcfLJJ2PJkiXIzs7GG2+80TS9FI2opu1STIUQQgghhGhdoqJbt2747bff8NZbb5l/aaU455xzcMopp1QI3BatxFLhSG7pXgghhBBCiBinQX4xTqfTiAhuopVbKpzxLd0LIYQQQggR49RbVGzduhXt2rUzj1evXo3nnnsOJSUlOPzww7HXXns1RR9Fo9yfJCqEEEIIIUQrCdSeP3++SRvboUMHDBo0CPPm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tB08eHCF/X6/39pjjz2skSNHWp9//rm1fPlya9q0aab9L7/8YhUXF1uXXHKJ9e2331orVqywfvrpJ6tv377WddddV2v/f/31V8tut1t33HGHtWjRIuvFF1+0EhMTrRdeeCHUpmfPnlZaWpp13333mTZPPPGE5XA4rM8++yzUpn///tZFF11krV+/3tq2bVu1n3f11Vdbxx57bIV9OTk5VocOHazjjz/emj17trVkyRLr+eeft1JTU62nn3461K60tNTac889rczMTNOHefPmmTF96623rF122SU0nmeccYZ10EEHmb5w47118cUXWzabzYxRXed/EydOtHbffXfL6/Va9YXzv7Fjx1rDhw+3li5dGuoLt/DjDRw40HrvvffM44KCAuuaa66xZsyYYa7xV199Zc6LY8tzD4ev8R5auHDhDp/t8/nM+/baay9rzpw5ZkzZlwMOOKBCO17jPn36NOh7Gcl5btSKiptuuskaNWpUjW14U2VnZ1vt2rWzhg4dal1//fVWUVFRje/hxebABrfVq1dHn6j4+3vLWvadZfnq/+URQggh2qqo4IT1wgsvNBNvTng52acQCEKh0atXLys+Pt4aN26cNXXq1CpFBSfI3M8F0Mrk5+dbl112mdWlSxfL5XJZ3bt3t0455RRr1apVVllZmXXiiSeafRQlbHPppZfWeTzfffdda8iQIea4PXr0sB544IEKr1NU3H777dZxxx1nJSUlWZ06dbIeffTRCm14Tv369bOcTqdpXx0LFiwwoiU3N7fCfoqVo48+2vSdoowC6rnnnqswjsH51j333GMm6wkJCVZWVpaZ+FMMeTyekKjgOAY3ipPRo0eb86yJyqJizZo1VkZGhvWvf/3Lqi8UL+F9CN8oGIIACAk4isMDDzzQat++vbkWHMfzzjvP2rBhww7HP+mkk6zx48dX+/lr1661jjnmGCN4O3bsaJ155pnW1q1bK7ThZ3EsW1pU2Pg/RBn0R2OQCl2fghkZquLZZ5815iHGYLD64j//+U8TOPXee+9V+x76Mt5+++3Vpg9rdRRtAVbNBNLDshSU5AIOF9Brj5bsmRBCiDYGXTCWL19uXF0aGsQbCzAdKf3mWU+hY8eOaC3Q5Yr1G4I1HBoLg8jpYnTDDTdE5Hii/ixYsMC4dtEtirEm9f1e0rWL74vEPLdF61QwpVl1JcqDW+VA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WLNUOONbuhdCCCGEEKKNIVERa5YKh0SFEEIIIYRoXiQqYk1UyFIhhBBCCCGaGYmKWEsp6wiUoxdCCCGEEKK5kKiINZT5SQghhKg3e++9N6688sqW7kZMsXXrVnTo0MEUn4sU3333HWw22w5bJD+jOXC73aa2CKt8xwoSFbGGMj8JIYQQogpY6XunnXZqts/717/+hSOPPNJMngkn/lUJAm4zZ840bV588UVkZGRUe8zx48eb8+jcuTPuuecezJgxw9TP6N69e4P7+eSTT5o+JiQkYOzYsfj5559rfc8777yDQYMGmfcMHz4cn3zySYXX33vvPRx44IFo166dOb958+ZVeD0uLg7XXHMN/vnPfyJWkKiINWSpEEIIIWIGn88Hv9+PaKO4uBjPP/88zjnnnB1e++qrr7B+/foK26hRo+p03M2bNxuxwmNcf/312G233dCjRw84HA1bVH3rrbdw9dVXY9KkSZgzZw5GjhyJiRMnYtOmTdW+Z/r06TjppJPMuc2dOxdHHXWU2f74449Qm6KiIuyxxx647777qj3OKaecgp9++gkLFixALCBREUvxFDabRIUQQgjRQDh5v+6665CVlYVOnTqZFfEgZ599Ng477LAK7T0ej3Hv4eQ56EJ16aWXmi09PR3Z2dm45ZZbYFlW6D1lZWVmhbpr165ITk42K+N06QkSXKmfOnUqhgwZgvj4eKxatQo5OTk4/fTTkZmZiaSkJBx88MFYsmTJDu/74IMP0L9/f7OCzsnx6tWrQ6/ffvvt+O2330LWAe4jDz30kFltZ3+44n/xxRejsLCwwrmPGDHC9D3ourPzzjub/lQHV+7Zd076K8PVe45v+OZyuep0jdasWYPU1FQzNpGA537eeefhrLPOMsecPHmyGd8pU6ZU+55HH30UBx10EK699loMHjwYd955J3bZZRc88cQToTannXYabr31Vuy///7VHofXcvfdd8ebb76JWECiIpYyP9lU+E4IIUTrghPqYk9xi2zhk/m68NJLL5mJ9axZs3D//ffjjjvuwJdffmleO/fcc/HZZ5+ZVfUgH330kVmRP+GEEyocw+l0GhcaTj45af3Pf/4Tep2Cgy47nEj+/vvvOO6448wENVwg8Jhc4eb7uIpN4XLmmWca/3uKDb6f53bIIYcYYRP+Pq7iv/zyy5g2bRpyc3Nx4oknmtfYx//7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K1asQDSz995748orr0Rr4rbbbsNOO+20w76OHTu26DUXkadXr1545JFHWuSzI/HbWJk///wT3bp1Q1FRUUSPK0RLI1EhRCtm8uTJSE1NhdfrDe0rLCyEy+UyE72qhMKyZcvQFqlqkknWr1+Pgw8+uEX69K9//QtHHnmkmRSJyHLNNdfg66+/Dj1fuHAhbr/9djzzzDMtes2bk7Yinn755Recf/75LSJeTjjhBCxevDiinzNkyBDstttueOihhyJ6XCFaGokKIVox++yzjxERs2fPDu378ccf0alTJ8yaNQulpaWh/d9++y169OiBvn37tlBvWyccq/j4+Gb/3OLiYjz//PM455xzmv2z2wIpKSlo165d6HlQTFPENeaaezyeiPWxreN2uyNynPbt2yMpKQktQWJiorE2RpqzzjoLTz/9dIUFIyGiHYkKIVoxAwcOROfOnY0VIggfc+LUu3dvzJw5s8J+ihDyyiuvYNdddzVWDk6wTj75ZGzatKnR/ZkyZQqGDh1qJmzs16WXXlpt2/nz52Pfffc1f5Q5+eNKIwVSQ483adIk0+b333+v0kWBq9S//fabWb3lxn2VV3PphsTnb7/9Nvbcc0/Tt9GjR5uVSK6Gcsw4WeUq9+bNmyt8xn/+8x8MHjwYCQkJGDRoEJ566qkax+qTTz4x58UVySA5OTk45ZRTzCSJn92/f3+88MILoddXr16N448/3rhbZGVlmetc2XWqpjFbtWqVeQ/PIS0tzRxr48aNO1hzeH9wVTY9PR0nnngiCgoKQm3oknH66aebY/D4Dz744A7nxnNn3zkWdDf6xz/+gboSvAbz5s0L7aMbHvcF7/Og1Y2WCF4TTijHjx+PRYsW7XAuwceHH364eWy32817id/vxx133GFcTThebP/ZZ5/t0Je33noLEyZMMOfz2muv4cwzz8RRRx2Fu+++25wfrwePwwngtddea64Njxl+7apjwYIFOOyww8z14PeR911QANXWP07KeX15Hdi3nj174p577jGvBa1fRx99tDmHmqxh//znPzFgwAAzjn369MEtt9xSQTwFx5JWnu7du5t2vHfy8vJCbYJjwu8Z71+ez4UXXlhBONB6yv7SVS47OxsTJ040+7///nuMGTMmdM9ef/31ocn0yy+/bO61JUuWhI5z8cUXm+8YhXlVFgSeL/vKcWVf+b2cMWMGli5davqQnJxs7pdwqy0f87vB68nP4/f+q6++qtD3lStX4qqrrgr9hlTn/kQxwMWbuLg48xvN71M4fC9/L3ht2D9+V6ZOnVqhzQEHHIBt27aZsREiZrCEEK2ak08+2TrwwANDz0ePHm2988471oUXXmjdeuutZl9xcbEVHx9vvfjii+b5888/b33yySfWsmXLrBkzZljjxo2zDj744NAxvv32W4tf/5ycHPP8hRdesNLT02vsx1NPPWUlJCRYjzzyiLVo0SLr559/th5++OHQ6zze+++/bx4XFhZanTt3to455hhr/vz51tdff2317t3bOuOMM+p9PL/fb1166aVWr169rCVLllTZN57///3f/1lDhw611q9fbzbuq9yv5cuXm+eDBg2yPvvsM+vPP/+0dtttN2vUqFHW3nvvbf3000/WnDlzrH79+pnxDfLqq6+a8/nvf/9r/f333+bfrKys0HhXxeWXX24ddNBBFfZdcskl1k477WT98ssvpi9ffvmlNXXqVPOa2+22Bg8ebJ199tnW77//bvrGaz9w4ECrrKys1jHz+Xzm2HvssYc1e/Zsa+bMmea8JkyYEPr8SZMmWSkpKaHr8sMPP1idOnWybrzxxlCbiy66yOrRo4f11VdfmX4cdthhVmpqqnXFFVeY19l3h8Nhvf7669aKFSvMeD366KNWXQleg7lz54b28T7kPt6X4ffn2LFjre+++85asGCBteeee1rjx4+vcC4jR440jwsKCsw9zPcErz956KGHrLS0NOuNN96w/vrrL+u6666zXC6XtXjx4gp94b0VvLbr1q0z9ynPmdeL7+P3ie0mTpxo/etf/zLvv/POO82xVq9eXe25rlmzxtwnHG+OG6/ZlClTzDHr0r8HHnjA6t69u7lOHOsff/zRjDvZtGmT6RPPm+fL59XBvk6bNs2cL++3jh07Wvfdd1+FsUxOTrb23Xdfc12+//578x3g/ReEY8J754QTTrD++OMP66OPPrLat29f4d7hvcY21157rTkfbhyDpKQk6+KLL7YWLlxovovZ2dnmM4Mcd9xx5nfN4/GY43IMeA8H6dmz5w6/DV27drXeeustM6ZHHXWUuYbsf/j3Ovz7N2/ePGvy5Mnmvuf43nzzzea7tHLlSvP61q1brW7dull33HFHhXuo8m/je++9Z/r35JNPms9+8MEHzffhm2++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",
"text/plain": [
- ""
+ ""
]
},
"metadata": {},
@@ -293,22 +412,29 @@
}
],
"source": [
- "# plot the results\n",
- "times = (bo_time, bayex_time, hoptax_time)\n",
- "scores = (bo_max, bayex_max, hoptax_max)\n",
- "\n",
- "for _time, _score in zip(times, scores):\n",
- " plt.scatter(\n",
- " _time,\n",
- " _score,\n",
- " 200,\n",
- " marker=\"X\",\n",
- " )\n",
+ "# Score vs wall-clock time\n",
+ "# Cumulative time axis: eval_i * mean_sec_per_eval (uniform-cost approximation)\n",
+ "fig, ax = plt.subplots(figsize=(8, 4))\n",
+ "evals = np.arange(1, N_TOTAL + 1)\n",
+ "\n",
+ "for lib, label in labels.items():\n",
+ " best_so_far = true_max - lib_results[lib] # (N_SEEDS, N_TOTAL) β undo regret\n",
+ " mean_sec = np.mean(lib_timings[lib]) # scalar\n",
+ " cum_time = evals * mean_sec # (N_TOTAL,)\n",
"\n",
- "plt.xlabel(\"Time (s)\")\n",
- "plt.ylabel(\"Score\")\n",
- "plt.title(\"Performance Comparison\")\n",
- "plt.legend([\"Bayesian-Optimization\", \"Bayex\", \"Hyperoptax\"])\n",
+ " median = np.median(best_so_far, axis=0)\n",
+ " q25 = np.percentile(best_so_far, 25, axis=0)\n",
+ " q75 = np.percentile(best_so_far, 75, axis=0)\n",
+ "\n",
+ " ax.plot(cum_time, median, label=label, color=colors[lib])\n",
+ " ax.fill_between(cum_time, q25, q75, alpha=0.2, color=colors[lib])\n",
+ "\n",
+ "ax.axhline(true_max, color=\"k\", linestyle=\":\", alpha=0.4, label=\"true max\")\n",
+ "ax.set_xlabel(\"Wall-clock time (seconds, uniform-cost approximation)\")\n",
+ "ax.set_ylabel(\"Best score found\")\n",
+ "ax.set_title(f\"Score vs. time β median Β± IQR over {N_SEEDS} seeds\")\n",
+ "ax.legend()\n",
+ "plt.tight_layout()\n",
"plt.show()"
]
},
@@ -321,51 +447,67 @@
},
{
"cell_type": "code",
- "execution_count": 7,
- "metadata": {},
+ "execution_count": 8,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-03-18T18:25:42.908373Z",
+ "iopub.status.busy": "2026-03-18T18:25:42.908271Z",
+ "iopub.status.idle": "2026-03-18T18:29:42.517898Z",
+ "shell.execute_reply": "2026-03-18T18:29:42.517493Z"
+ }
+ },
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Running 1000 iterations with 1 vmap\n",
- "Running 1000 iterations with 2 vmap\n",
- "Running 1000 iterations with 10 vmap\n",
- "Running 1000 iterations with 20 vmap\n",
- "Running 1000 iterations with 50 vmap\n",
- "Running 1000 iterations with 100 vmap\n",
- "Running 1000 iterations with 250 vmap\n",
- "Running 1000 iterations with 500 vmap\n",
- "Running 1000 iterations with 1000 vmap\n"
+ "n_parallel= 1: 100 GP steps, best=10.5997\n",
+ "n_parallel= 2: 50 GP steps, best=10.5992\n",
+ "n_parallel= 4: 25 GP steps, best=10.5999\n",
+ "n_parallel= 8: 13 GP steps, best=10.5997\n"
]
}
],
"source": [
- "# fix budget of 1000 iterations\n",
- "n_vmaps = [1, 2, 10, 20, 50, 100, 250, 500, 1000]\n",
- "n_iterations = 1000\n",
- "results = pd.DataFrame(columns=[\"time\", \"max\"], index=n_vmaps)\n",
- "\n",
- "for n_vmap in n_vmaps:\n",
- " hoptax_optimizer = BayesianOptimizer(hoptax_bounds, f=f)\n",
- " print(f\"Running {n_iterations} iterations with {n_vmap} vmap\")\n",
- " start = time.time()\n",
- " result = hoptax_optimizer.optimize(\n",
- " n_iterations=n_iterations, n_vmap=n_vmap, jit=True\n",
+ "from hyperoptax.random import RandomSearch\n",
+ "\n",
+ "N_BUDGET = 100\n",
+ "n_par_list = [1, 2, 4, 8]\n",
+ "\n",
+ "# BayesianSearch β collect per-batch scores for each parallelism level\n",
+ "par_histories = {}\n",
+ "for n_par in n_par_list:\n",
+ " state, opt = BayesianSearch.init(\n",
+ " hoptax_bounds, n_max=N_BUDGET, n_parallel=n_par\n",
" )\n",
- " results.loc[n_vmap] = [time.time() - start, hoptax_optimizer.max[\"target\"]]\n"
+ " _, (_, results_hist) = opt.optimize(state, jax.random.key(0), wrapper)\n",
+ " par_histories[n_par] = [np.array(r) for r in results_hist]\n",
+ " best = max(np.max(b) for b in par_histories[n_par])\n",
+ " print(f\"n_parallel={n_par:2d}: {len(results_hist):3d} GP steps, best={best:.4f}\")\n",
+ "\n",
+ "# RandomSearch baseline\n",
+ "rs_state, rs_opt = RandomSearch.init(hoptax_bounds)\n",
+ "_, (_, rs_results) = rs_opt.optimize(rs_state, jax.random.key(0), wrapper, N_BUDGET)\n",
+ "rs_history = [np.atleast_1d(np.array(r)) for r in rs_results]"
]
},
{
"cell_type": "code",
"execution_count": 9,
- "metadata": {},
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-03-18T18:29:42.521254Z",
+ "iopub.status.busy": "2026-03-18T18:29:42.520955Z",
+ "iopub.status.idle": "2026-03-18T18:29:42.582301Z",
+ "shell.execute_reply": "2026-03-18T18:29:42.581989Z"
+ }
+ },
"outputs": [
{
"data": {
- "image/png": "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",
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAA3kAAAHqCAYAAAC5nYcRAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAjOdJREFUeJzt3Qd0VNXaxvE3nd57R0SRjhQFFFAQRFRA5V4VP7HiFQt2xYbYULGXi+2KDVFEUUQBASlKR6mCIkiTIj0hJKTOt54NM05CEpKQZJLJ/7fWyJQz5+w554DzzLv3PiEej8djAAAAAICgEBroBgAAAAAA8g4hDwAAAACCCCEPAAAAAIIIIQ8AAAAAggghDwAAAACCCCEPAAAAAIIIIQ8AAAAAggghDwAAAACCCCEPAAAAAIIIIQ8AkKnZs2dbSEiI+xNF6zhdc8011qBBg1ytr1u3bu7mtWnTJrf+999/3wpSoLYLAEUdIQ8ACoi+qOoL69KlS33Pfffdd/bYY49ZoP33v//lizQC5pNPPrGXX3450M0AgKARHugGAEBxppD3xhtvBDzoKeRVqVLFVX/8denSxeLj4y0yMjJgbUPg1a9f350HERER+RbyVq9ebXfccUeBbhcAghWVPAAIMh6Px30xzguhoaFWokQJ9ycKzqFDh6wwUQVa50FYWFix2C4AFHX8XxsAAkRVM1XxvF9mvTev1NRU14WtWbNm7otu9erV7aabbrL9+/enWY/GXV144YU2bdo0a9eunZUsWdLeeust99qYMWPs3HPPtWrVqllUVJQ1bdrURo8efcz7f/31V5szZ46vDd7xWJmNyfv888+tbdu2bluqAF511VW2bdu2Yz5fmTJl3PP9+vVz96tWrWr33HOPpaSkpFn2008/desrW7aslStXzlq0aGGvvPJKpvsuKSnJKlWqZNdee+0xr8XExLj9pe14vfbaa24/lipVyipWrOj2k6pHuaH9ceutt9rYsWPt1FNPddtS2+fOnZtmuc2bN9uQIUPcMtpPlStXtgEDBrhxZhl149X+1/I6VnXq1MnROrIru+dUdsbG7dy50+1/tVXnVs2aNa1v375p2vb1119bnz59rFatWm6ZRo0a2RNPPJHm+Otc+/bbb91n9Z5/3rGEmY3J++GHH+zss8+20qVLW4UKFdx2165dm2YZVcf13vXr17tzUcuVL1/etTkuLi5X+w8Aigq6awJAgOjL9fbt22369On20UcfZfi6vtzqS+ntt99uGzdutNdff92WLVtm8+bNS9OF7ffff7crrrjCvefGG290oUAU6PSF/uKLL7bw8HD75ptvXGjQl/1bbrnFLaMv/bfddpsLYQ899JB7Tl/+M+NtU/v27W3kyJH2999/u0CmNqlt+jLtpS/zvXr1sjPOOMOef/55mzFjhr3wwgvuy/7NN9/sltHnV9u7d+9uzz77rHtOX9i1vqFDh2bYBn32/v3725dffukCrX930q+++soSEhLs8ssvd4/feecdt/8uu+wyt77Dhw/bypUrbdGiRXbllVdabiiQffbZZ269Ci/q7nr++efb4sWLrXnz5m6ZJUuW2Pz58107FIQUWHQ8FGrWrFnjAqc/HReF4EcffdRXycvpOo4nJ+fU8Vx66aXuxwGdOwplu3btcsdyy5YtvpCmbem8uuuuu9yfCmf6fArio0aNcsvonIuOjra//vrLXnrpJfecls2MzqHevXvbSSed5IKcqtYK8Z07d7ZffvnlmMlm/vWvf1nDhg3duarX3333XRekvecaAAQlDwCgQIwZM8ajf3aXLFnie+6WW25xz6X3448/uufHjh2b5vmpU6ce83z9+vXdc3otvbi4uGOe69Wrl+ekk05K81yzZs08Xbt2PWbZWbNmuXXrT0lMTPRUq1bN07x5c098fLxvucmTJ7vlHn30Ud9zgwYNcs89/vjjadbZpk0bT9u2bX2Phw4d6ilXrpwnOTnZkxPTpk1z6//mm2/SPH/BBRek+Xx9+/Z1ny+vaJu6LV261Pfc5s2bPSVKlPD0798/y32/YMEC994PP/zwmPPirLPOOmYfZHcd6Y+Td//r3MjNOaVzwf982Lhxo1tGbZX9+/e7x6NGjcpyX2XU/ptuuslTqlQpz+HDh33P9enTJ01bM9uutG7d2p2De/fu9T23YsUKT2hoqOfqq6/2PTd8+HD33uuuuy7NOnWMKleunGW7AaCoo7smABRC6g6prmXnnXee7dmzx3dTt0BVOWbNmpVmeVUqVDFLT138vFQt0Tq6du1qf/75p3ucU5oZVBUbVZ3U3c9LXfKaNGniut2l95///CfNY3Wz0/a9VPlT5UpVoJxQN1R1FVVFzUvdDrWef//732nWryqRqmJ5pWPHju5YeNWrV891GVSXWW9XRP99r+6le/futZNPPtm1RxWl9FSBTT/2LKfryMtzKitql6qn6sabVVdP//YfPHjQbU/HX90lf/vtN8upHTt22PLly133S3XX9WrZsqX7XJrIKDvnn/ajqokAEKwIeQBQCP3xxx8uhKlbmbrw+d9iY2Nd0Eof8jKiLng9evTwjV3S+x988EH3Wm5CnsZNibc7qD+FPO/rXgqC2qY/jYnzDwYKjKeccorrgqcuidddd51NnTr1uG1R91N1GdS4L3XPFHXfVBjyD3n333+/CzEdOnSwxo0bu26q2i8nQutJT59B4WX37t3usboRqmti3bp1XZdOBVLtiwMHDmS47zM6hjldR16eU1lRW9TdccqUKa5rr2Zhfe6559w4PX/qzqlutQqXGmupbWn8Zn6cf6eddpoLkeknrVEAT3/+yfHGIQJAUcaYPAAohDRmTl/GNblHRtIHJ/+KideGDRvcODeFrxdffNEFBVVfVO3Q2CdtI79lZ1ZEfU5VZ1QFU2jQTRPGXH311fbBBx9k+V6NVdOYPL1Hk7uMHz/efd5WrVql+fKvMYuTJ0924fGLL75wY+gUnkaMGGH5RWPV9Dl0WQBV/hR0NBGI2pzRvs/oGOZ0HXl5Th2P2nTRRRe5MZA6do888ogb96Zxd23atHFBVFVjhbvHH3/cjcNU6FcFUsG7IM6/rM7BIz1vASA4EfIAIID8Z9P0py/EmmBCk0lk9OU/OzTJiipckyZNSlPNyKhbXmbtSE/XLROFJnWX9KfnvK/nlMKnAoNu+vKv6p7Cm4KDuidmRhUkzeqoLptnnXWWCxjeyWP8qZKp6p5uiYmJdskll9hTTz1lw4YNS9PtNCdVsfTWrVvnJkLxhqUJEybYoEGD3EQzXpr0ReEnu/JiHXl5TmW0zrvvvtvdtE9at27t2vrxxx+7rpzqFqnqqo6TlyZ7yYvzLz11/1SlU8caAIo7umsCQAB5v5Cm/9KuGQE1tkvTzaeXnJycrS/53gqGf8VCXeRUGcqoHdlZpy49oGrQm2++6esiKaqkaUZMjc3LKQUBf7omn8ZYif82MqJlNWumAq1mKNW+8e+qmdH6FSh1KQntF3XtFO8YMXX3y44FCxakGRO3detW1220Z8+evv2uP9NXizQLZPrLR2QlL9aRl+eUl/aXwmb6wKdLYHiPWUbnnwK2qqgZnX/Z6b6pQK8gqQqvf3t1IfXvv//eLrjggmx/BgAIZlTyACCAvJN3aDp7TZyiL8bqiqdubpruXt3f1JVR4UHT26taogk0dMkChZus6D3eCpnWpXFXupyAQpomsEjfDk3N/+STT7rKmZZJX6kTtUFjsTQFv9qoSx94L6GgqevvvPPOHO+DG264wfbt2+e2pzF5GnelIKMv8+pqeTwKdVp++PDh7vp66d+j/VCjRg1XwdL4MYVRXTZAgVShRHTpg3POOcetQ9PyH48uk6Dj5X8JBfHv/qlrFyp4qoulQqWCoSpputZdduXFOrzy4pzyr1qqK7CCo9ql8ZETJ05054L30hWdOnVy499UidR+UrVOnyWjbpI6/1SN1aUWdGkOjaHUeZsRXXpB4zfVffX666/3XUJB+yg7xw4AioVAT+8JAMX5EgqaMv+2227zVK1a1RMSEnLM5RTefvttd7mBkiVLesqWLetp0aKF57777vNs377dt4ymntcU9BmZNGmSp2XLlm56/wYNGnieffZZz3vvvee2o+npvXbu3OnWoW3oNe/0+RlNzS+fffaZuxRCVFSUp1KlSp6BAwd6/vrrrzTLaAr/0qVLH9Mm79T2XhMmTPD07NnTTYsfGRnpqVevnptmf8eOHdnar6mpqZ66deu6dT755JPHvP7WW295unTp4qbNV3sbNWrkuffeez3R0dG+ZbyfU207Hi2nS198/PHHnsaNG7t1al+k30e6zMC1117rqVKliqdMmTLu0hW//fabO17aN1mdFzldR3YuoZCTc+p4l1DYs2eP2wdNmjRxx7h8+fKeM844wzN+/Pg025o3b57nzDPPdNuqVauW24730hf+bY2NjfVceeWVngoVKrjXvO3O6BIKMmPGDE/nzp3denX5jYsuusizZs2aDM+z3bt3p3neu7/9z38ACDYh+k+ggyYAAEWFKlKaoVPVQAAACiPG5AEAAABAECHkAQAAAEAQIeQBAAAAQBBhdk0AAHKAoewAgMKOSh4AAAAABBFCHgAAAAAEkaDvrpmammrbt293F7zVtNcAAAAAUBi6/x88eNBq1aploaF5W3sL+pCngFe3bt1ANwMAAAAAjrF161arU6eO5aWgD3mq4Hl3Xrly5QLdHAAAAACwmJgYV4zy5pW8FPQhz9tFUwGPkAcAAACgMMmPIWVMvAIAAAAAQYSQBwAAAABBhJAHAAAA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4403uv2WWwpGqtapy6C/V1991QUm7bOMjB071gXi9957z5o1a2aXX365+3wvvviib5lXXnnFhbB7773XTjvtNHviiSdcde7111/PtD0vvfSS228//PCDr5pYr14969q1qwuTTz/9dJrl1XZ9/vr169vNN9/sQuekSZMyveacjrfWp/fpkiPahvdc3Lx5s915552+6mB2j6MqgPpsCrQ6LrVr17Y33ngjW9sVXRLhggsusE8//dQKG0IeAAAAcuyDDz5wX4xVMVJ3P3W3mz59erbfr9B26aWX2ooVK2zgwIEubKxdu9b3etmyZe3999+3NWvWuNDxzjvvuCDhb/369a4a9uWXX/rG2OlL/F133WVLly61mTNnugvM9+/fP9td6hQIFXDUNlWlPvvsMxcWbr311kzfo7BapkyZTG8KU3ntxx9/dEEqpxYsWGBdunRJU/Xs1auX/f7777Z//37fMgpd/rSMns+MqnXnnXeetWnTJlezTCqIKXxmRMdYx/6tt96yP/74w7766ivXhVR07OvUqePOvx07drhbTo6jupeqS+myZctc18uhQ4f6zuOstuvVoUMHdywKG7prAgAAFCIDB31uewMw83XlyqVs7AcDsr18y5Ytbfjw4e5+48aNXZVHoUpf9LNjwIABrqubqJqiL9bq0vff//7XN97Jv+Jyzz33uIqJqodeCgUffvih6xbopS/1/lSx0usKi5l1NfSnLoUKnXfccYfvs6k6poqUKnDeiqE/VRPj4+MzXae6IeY1Va9UWcqpnTt3usqnv+rVq/teq1ixovvT+5z/Mno+M+vWrXNVNX8K197ApPNF3UDTU7VM5426nd52220ZrnvLli2u6qfgqX2pyprClaiSrIqafhTwr4yOzOZxVLdShTtR5XjevHku2Ok8zmq7XjoGW7dudT8i6AeFwoKQBwAAUIgo4Gn268JOX9r91axZ03bt2pXt93fs2PGYx95qnKjyoi/lqsjExsa6STnKlSuX5j3q6ucf8EQVl0cffdRVGPfs2eOr4OkLe3ZCniqLqvyoW6N/ENF6NL5M3RfTUze/gqZQmVHgLEwU2FVZ1XGcO3dumtcmT57sqpzqgqt9e+WVV2ba5Vc/CGhiFXVBVXVOXSQvuugiN3HNiR7Hjhmch95JXLKzXVUgtU6NLdT9woKQBwAAUIioolYUtpu+OqXueHk1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AMDs8OHDbqII/+u8FQcav6fvd6qwIPd03TddIkGzVyKtBg0auBDq3y01JxRoNeYxqwrnif4dz8+cEl7Yu2jqlwb9CqGpU73lbO2MojgAEgAAAMgrmnzkwIEDdvDgQfddGXmnWrVqaYaAFTWFurumZuVRstV1OfzL2So7AwAAoPDR+LrcXhQcOaPumpqchoCX9+6+++5jridYlBTqSl4h7kkKAACADGg8ncaDZTXLJN/xkN82bdpkxVmhDnkAAAAoWlRVorIEBBYhr5CbPnO9jX57scUdSsp0mT174wq0TQAAAAAKL0JeIaeAt2nTgWwtW6p02gttAgAAACh+CHmFnLeCFxoaYlUql8oy4A0ZnHH/dwAAAADFByGviFDAK4zXwAMAAABQuBTqSygAAAAAAHKGkAcAAIBiNbV+SEiILV++3D2ePXu2e6yLimdXgwYN7OWXX7ZA+/33361GjRruYujIW2eeeaZ98cUXVlQR8gAAAIAAWL9+vbvcRIUKFXL1/mHDhtltt93mu2SFAmvfvn2tZs2aVrp0aWvdurW7OL2/999/34Va/1uJEiWOu63ExEQbNWqUnX766W7d5cuXt1atWtnDDz9s27dv9y13zTXX+NYbGRlpJ598sj3++OOWnJycq88YqED98MMP2wMPPGCpqalWFBHyAAAAUOQphBQlSUlJdsUVV9jZZ5+dq/dv2bLFJk+e7EKV1/z5861ly5auArVy5Uq79tpr7eqrr3bL+StXrpzt2LHDd9u8eXOW20pISLDzzjvPnn76abe9uXPn2qpVq+zVV1+1PXv22GuvvZZm+fPPP9+t948//rC7777bHnvsMRcQi5LevXu7CumUKVOsKCLkAQAAIEe6detmt99+u913331WqVIl12VQX+SzS1We0aNHuy/SJUuWtJNOOskmTJiQZpn777/fTjnlFCtVqpR7/ZFHHnHByEvbU6Xq3XfftYYNG/qqUVOnTrWzzjrLVccqV65sF154oW3YsCFHn++nn35y4Uttq1u3rvushw4dsryuFDVp0sT+9a9/5er948ePd5W02rVr+5578MEH7YknnrBOnTpZo0aNbOjQoS5wffnll8fsfx0z76169epZbuull15y++SHH35w+6Jt27ZWr14969q1q7355psu/PmLiopy661fv77dfPPN1qNHD5s0aVKG6/Z4PO5Yan16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4OW9u+++26pXr25FFZU8AAAA5BmNp9NkFlnNMhnko4VQCGzatMmKM0IeAAAA8oyqSlSWgMCiuyYAAAAABBFCHgAAAAAEEbpr5rPDh5MtJCLM9uyJs/MHf53j9+/ZG5cv7QIAAAAQnAh5+ezQoSQrUyHMUlI97np3uVWq9JGBygAAAACQFUJePvOfPUoXNM9twBsyOONZqgAAAADAHyGvgISFhtjUyYMC3QwAAAAr7lPrN2zY0JYtW2atW7e22bNn2znnnGP79++3ChUqZGsdDRo0sDvuuMPdAmnv3r122mmn2eLFi12bkHceeOABO3TokL322mtWFDHxCgAAAFCApk2bZmeeeaa71ETVqlXt0ksvzdV13Z566inr27dvmoB3++23W9u2bS0qKsqF2PR+//13F2p1oe8SJUrYSSedZA8//LAlJSUdd3tffPGFnXvuuVaxYkUrWbKknXrqqXbddde5wOz1/vvvW0hIiLuFhoZanTp17Nprr7Vdu3ZZblxzzTXWr18/K2j33HOPffDBB/bnn39aUUTIAwAAQJGXmJhoRcHGjRtdMFNYWr58uQt8e/bssUsuuSRH64mLi7P//e9/dv311x/zmoLXv//970wvSH/11Vfb999/7wLfyy+/bO+8844NHz48y+3df//9bp0KjpMmTXLv/eSTT1xIHDZsWJply5UrZzt27LC//vrLrXvKlCn2f//3f1aUVKlSxXr16mWjR4+2ooiQBwAAgBzp1q2bqxjdd999VqlSJatRo4Y99thj2X6/qjz68ty7d29XEVJQmDBhwjGh4pRTTrFSpUq51x955JE01SZtT4Hj3Xffdd0vVZWSqVOn2llnneW6XlauXNkuvPBC27BhQ44+308//WRnn322a1vdunXdZ1XXvbzw888/W0pKij355JPWqFEjO/30013VSIEvO9U0r++++85V61QR9Pfqq6/aLbfc4vZZRvS8KmutWrWy+vXr28UXX2wDBw60H3/8MdNtLVy40J577jl78cUX3U37pl69eq5iqCqgQlz646tzolatWu4Ya//NmDHD4uPjM1y/jn2LFi3c/tYx69Gjh9vfOsaqpn399de+6qC618rWrVvtX//6lzvOOgcVnP2rodccrQCOGDHCVUsVPP/zn/+k+TEgs+16XXTRRfbpp59aUUTIAwAAQI7py3fp0qVt0aJFLgA8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fMtMmTLFExIS4tm2bVu2tx2UlbzExET7+eefXfnTKzQ01D1esGBBQNuG4iM6Otr9WalSJfenzklV9/zPyyZNmli9evU4L5HnVFXu06dPmvNNOA9RECZNmmTt2rWzAQMGuO7rbdq0sXfeecf3+saNG23nzp1pzsPy5cu7oRWch8grnTp1spkzZ9q6devc4xUrVthPP/1kvXv3do85D1HQsnPO6U910dS/oV5aXllGlb/sCrcgtGfPHtcPu3r16mme1+PffvstYO1C8ZGamurGQKm7UvPmzd1z+ksdGRnp/uKmPy/1GpBXPv30U9dNXd010+M8REH4888/XTc5DZt48MEH3bl4++23u3Nv0KBBvnMto/9Pcx4irzzwwAMWExPjfsgKCwtz3w2feuop1xVOOA9R0LJzzulP/TjmLzw83BUNcnJeBmXIAwpDFWX16tXuF0OgIG3dutWGDh3q+vFr0ikgUD906Vfop59+2j1WJU//JmoMikIeUBDGjx9vY8eOtU8++cSaNWtmy5cvdz/AakIMzkMEu6DsrlmlShX3i0362eL0uEaNGgFrF4qHW2+91Q2SnTVrltWpU8f3vM49dSU+cOBAmuU5L5GX1B1TE0ydfvrp7pc/3TS5igZ5675+LeQ8RH7TrHFNmzZN89xpp51mW7Zscfe95xr/n0Z+uvfee1017/LLL3ezu/7f//2fm3hKs2EL5yEKWnbOOf2ZfqLI5ORkN+NmTs7LoAx56g7Stm1b1w/b/1dFPe7YsWNA24bgpfG1CngTJ060H374wU3Z7E/npGaa8z8vdYkFfenhvERe6d69u61atcr9Yu29qaKi7kne+5yHyG/qqp7+EjIaF1W/fn13X/8+6suK/3mobnUab8J5iLwSFxfnxjH5UxFA3wmF8xAFLTvnnP7UD7H60dZL3yt13mrsXrZ5gtSnn37qZqp5//333Sw1gwcP9lSoUMGzc+fOQDcNQermm2/2lC9f3jN79mzPjh07fLe4uDjfMv/5z3889erV8/zwww+epUuXejp27OhuQH7yn11TOA+R3xYvXuwJDw/3PPXUU54//vjDM3bsWE+pUqU8H3/8sW+ZZ555xv1/+euvv/asXLnS07dvX0/Dhg098fHxAW07gsegQYM8tWvX9kyePNmzceNGz5dffumpUqWK57777vMtw3mI/JjdetmyZe6mqPXiiy+6+5s3b872OXf++ed72rRp41m0aJHnp59+crNlX3HFFTlqR9CGPHnttdfcF5nIyEh3SYWFCxcGukkIYvqLnNFtzJgxvmX0F3jIkCGeihUrui88/fv3d0EQKMiQx3mIgvDNN994mjdv7n5wbdKkieftt99O87qmEn/kkUc81atXd8t0797d8/vvvwesvQg+MTEx7t8+fRcsUaKE56STTvI89NBDnoSEBN8ynIfIa7Nmzcrw+6B+dMjuObd3714X6sqUKeMpV66c59prr3XhMSdC9J+8LUQCAAAAAAIlKMfkAQAAAEBxRcgDAAAAgCBCyAMAAACAIELIAwAAAIAgQsgDAAAAgCBCyAMAAACAIELIAwAAAIAgQsgDAAAAgCBCyAMAHCMkJMS++uqrQrOerOzcudPOO+88K126tFWoUMEC6f333w94G/LKY489Zq1bty6QbXXr1s3uuOOOAtkWABQHhDwACAAFk9tuu81OOukki4qKsrp169pFF11kM2fOtGAKBDt27LDevXvn67Zfeuklt53ly5fbunXrrKA0aNDAXn755TTP/fvf/y7QNhQ1s2fPdsH/wIEDaZ7/8ssv7YknnghYuwAg2IQHugEAUNxs2rTJOnfu7Co+o0aNshYtWlhSUpJNmzbNbrnlFvvtt98sWNSoUSPft7FhwwZr27atNW7c2AKtZMmS7oacqVSpUqCbAABBhUoeABSwIUOGuGrG4sWL7dJLL7VTTjnFmjVrZnfddZctXLjQFwS1jKpTXqp+6DlVQ/yrIgqHbdq0ceHi3HPPtV27dtmUKVPstNNOs3LlytmVV15pcXFxWVagVIVTNS4z999/v2tnqVKlXPXxkUceccHU20VxxIgRtmLFCtce3fRc+u6anTp1cuvxt3v3bouIiLC5c+e6xwkJCXbPPfdY7dq1XffLM844w/d5M6LP8sUXX9iHH37otnXNNdfkaN+pctquXTv3udS+33//Pc36v/nmG2vfvr2VKFHCqlSpYv379/d1L9y8ebPdeeedvs+cWXfN0aNHW6NGjSwyMtJOPfVU++ijj9K8rve+++67bt1qh8LqpEmTMv3Mx9tPMTEx7lzQOeBv4sSJVrZsWd+5kNUxzW6Xyn79+rl97qXPpv2p7Sjg69zT+Sg6Luecc467X7FiRd/xymjd+/fvt6uvvtotp/apGvzHH3/4XvfuZ537Os/LlClj559/vqvoeml/dOjQwdeNVz+s6JgBQHFAyAOAArRv3z6bOnWqq9jpy2d6uRnPpXD2+uuv2/z5823r1q32r3/9y4W4Tz75xL799lv7/vvv7bXXXjuhdutLu75Yr1mzxl555RV75513XDdJbxfFu+++2wVVfcnWTc+lN3DgQPv000/N4/H4nvvss8+sVq1advbZZ7vHt956qy1YsMAtt3LlShswYID78u7/Bd/fkiVL3Ov6zNqu2pYTDz30kL3wwgu2dOlSCw8Pt+uuu873mvadgtcFF1xgy5Ytc4FQocHbvbBOnTr2+OOP+z5zRhSshg4d6vbP6tWr7aabbrJrr73WZs2alWY5hWR9Bn1mbU/7SudKZrLaTwr2F154oTv+/saOHetCmULT8Y5pbikkqtulAr/CvYKdN8ipS7ICuShMZ3W89B4dE4VdfU6dM9ov/iFUYfX55593wVI/EmzZssUFX0lOTnaftWvXrm7/aB2DBw/2hXEACHoeAECBWbRokRKO58svv8xyuY0bN7rlli1b5ntu//797rlZs2a5x/pTj2fMmOFbZuTIke65DRs2+J676aabPL169fI9rl+/vuell15Ks71WrVp5hg8f7nusdUycODHT9o0aNcrTtm1b32O9V+tIz389u3bt8oSHh3vmzp3re71jx46e+++/393fvHmzJywszLNt27Y06+jevbtn2LBhmbalb9++nkGDBp3wvvv222/dc/Hx8b62DRw4MNPtZrQfx4wZ4ylfvrzvcadOnTw33nhjmmUGDBjgueCCC9Lso4cfftj3ODY21j03ZcqUDLebnf2kfV6mTBnPoUOH3OPo6GhPiRIlMl1ndo5p165dPUOHDs1y36e3ZMkS91kOHjyYZr/rePjzX/e6devcMvPmzfO9vmfPHk/JkiU948eP9+1nLbN+/XrfMm+88YanevXq7v7evXvd67Nnz860bQAQzKjkAUAB8q9i5ZWWLVv67levXt3X/c7/OW+XudxSxU3d3dQFT13jHn74YVc5yYmqVataz549XUVJNm7c6CosqlrJqlWrLCUlxXUh1Da8tzlz5rhxd/nBf9/VrFnT/endV+ru2b179xNa/9q1a91+86fHej6zdqjCq2pcZscsO/tJVS91g/V2+1QFTevs0aNHnh7T9H7++Wc3gVC9evVcpVCVNMnJerVvVFVVF1SvypUru66u/vtN57m6wfofP+8+0xg/VQN79erl2qOKYWbVVgAIRoQ8AChAGm+lLmPHm1wlNDT0mFCY2XgpfZn30rr9H3ufS01NTbPu9GEzq7FY3iCm4DB58mTXdVHdHBMTEy2ntJ4JEya47ak7oSad0U1iY2MtLCzMBQUFLO9NX+xz0g3zRPadePdVQU6gcrxj5i87+0nj/y677DJfl039qS60Ck+5PabHO28OHTrkQpXCpIK8utKqu6rk5lzJzT7zb9+YMWPc59RYSwVahWLvmFcACHaEPAAoQKow6IvwG2+84b4Up+edWl5VL/GvPvhPJHIitG7/9WqiDlXVMqOxfvXr13chQJNqKKimn8BCoULVpePp27evHT582I1LVPDwVvFEk8doHarGnHzyyWluOZmlM6/2naprWV3SIjufWZOCzJs3L81zety0aVPLrezuJ+1b7edff/3VfvjhhzT7OjvH9HjnjdqgcYZe+uFi79699swzz7gxlk2aNDmmGql95n1vVvtMY+oWLVrke07r1Ti+nO437athw4a5z9u8efNjxikCQLAi5AFAAVPA05dcTeKhbnSaLENVmFdffdU6duzoqyKdeeaZ7guzXlNXPHWnywuagVOTVfz444+u69+gQYNcZSgzCgDqbqdJPtQdUO30Vmj8Z7lUUFSY2rNnj5v9MSPqiqgJMTSToz7XFVdc4XtNlRYFEc2qqIlNtD7NQDpy5Eg3CUp25dW+Gz58uI0bN879qfVoXz377LNpPrMm/Ni2bZv7zBm599573eQmmmFTx/nFF190n807QUhuZHc/denSxYU+LduwYcM03R+zc0wzOm+0ft0U6G6++eY017tTF02FOE3y8+eff7quoumvfadgqYqbqoeaWVVVyfTUNv0YcOONN9pPP/3kJnG56qqr3Eyiej47tE8U7lTJU3jV5EPa/wqQAFAcEPIAoIBpvNwvv/zippPXrIuqMJx33nmuaqQw4PXee++5ioauAafp5Z988sk82b6+/GqslGZg7NOnjwtd/mOb0rv44ovdpQI0o6MutaCqiEKaP10KQrM76jOp4qNwlBmFDn1xV7VHwcCfutgpvGi/aAyW2qZuf+mXO5682Hea1v/zzz93YUWfWyFHYcpLM2tq9kjtO2/1MD21X10oNQukZh9966233GfUuk9EdvaTwpRCtPa1fxUvu8c0Pc08qh8EtF2dPzqPvZdEEO0DBVrtM1XcFLL1uf0pqGkm0QceeMCNFdX2M/t8OnY6R/XDh7phfvfdd8d00cyMxuspiHovUaKZNTWjrWY3BYDiIESzrwS6EQAAAACAvEElDwAAAACCCCEPAAAAAIIIIQ8AAAAAggghDwAAAACCCCEPAAAAAIIIIQ8AAAAAggghDwAAAACCCCEPAAAAAIIIIQ8AAAAAggghDwAAAACCCCEPAAAAAIIIIQ8AAAAALHj8P22l8y4o/4oTAAAAAElFTkSuQmCC",
"text/plain": [
- ""
+ ""
]
},
"metadata": {},
@@ -373,21 +515,53 @@
}
],
"source": [
- "fig, ax = plt.subplots()\n",
- "ax.plot(results[\"max\"], label=\"Maximum value\")\n",
- "ax2 = ax.twinx()\n",
- "ax2.plot(results[\"time\"], color=\"red\", label=\"Time\")\n",
- "ax2.set_ylabel(\"Time (s)\")\n",
- "ax.set_xlabel(\"Number of vmaps (log)\")\n",
- "ax.set_xscale(\"log\")\n",
- "ax.set_ylabel(\"Maximum value\")\n",
- "ax.set_title(\"Performance of BayesianOptimizer with 1000 iterations\")\n",
- "# Get handles and labels from both axes\n",
- "handles1, labels1 = ax.get_legend_handles_labels()\n",
- "handles2, labels2 = ax2.get_legend_handles_labels()\n",
- "\n",
- "# Combine them and create a single legend\n",
- "ax.legend(handles1 + handles2, labels1 + labels2, loc=\"lower left\")\n",
+ "fig, ax = plt.subplots(figsize=(9, 5))\n",
+ "\n",
+ "# Warm (red) = sequential, cool (blue) = batch\n",
+ "cmap = plt.cm.RdYlBu_r\n",
+ "n_cols = len(n_par_list)\n",
+ "\n",
+ "for i, n_par in enumerate(n_par_list):\n",
+ " color = cmap(i / (n_cols - 1))\n",
+ " batches = par_histories[n_par]\n",
+ "\n",
+ " # running best at each batch boundary\n",
+ " best_so_far = -np.inf\n",
+ " xs, ys = [], []\n",
+ " for b_i, batch in enumerate(batches):\n",
+ " best_so_far = max(best_so_far, float(np.max(batch)))\n",
+ " xs.append((b_i + 1) * n_par) # cumulative evals after this batch\n",
+ " ys.append(best_so_far)\n",
+ "\n",
+ " ax.plot(\n",
+ " xs, ys,\n",
+ " drawstyle=\"steps-post\",\n",
+ " color=color,\n",
+ " linewidth=2,\n",
+ " label=f\"n_parallel={n_par} ({len(batches)} GP steps)\",\n",
+ " )\n",
+ "\n",
+ "# RandomSearch: every eval is its own \"batch\" of 1\n",
+ "best_rs = -np.inf\n",
+ "rs_xs, rs_ys = [], []\n",
+ "for i, r in enumerate(rs_history):\n",
+ " best_rs = max(best_rs, float(np.max(r)))\n",
+ " rs_xs.append(i + 1)\n",
+ " rs_ys.append(best_rs)\n",
+ "ax.plot(\n",
+ " rs_xs, rs_ys,\n",
+ " drawstyle=\"steps-post\",\n",
+ " color=\"gray\", linestyle=\"--\", linewidth=1.5,\n",
+ " label=\"RandomSearch (no GP)\",\n",
+ ")\n",
+ "\n",
+ "ax.axhline(true_max, color=\"k\", linestyle=\":\", alpha=0.4, label=\"true max\")\n",
+ "ax.set_xlim(0, N_BUDGET)\n",
+ "ax.set_xlabel(\"Cumulative function evaluations\")\n",
+ "ax.set_ylabel(\"Best score found\")\n",
+ "ax.set_title(\"Iterations vs. parallelisation\")\n",
+ "ax.legend(loc=\"lower right\")\n",
+ "plt.tight_layout()\n",
"plt.show()"
]
}
diff --git a/notebooks/rl_hparams.ipynb b/notebooks/rl_hparams.ipynb
index 28740c7..f523a10 100644
--- a/notebooks/rl_hparams.ipynb
+++ b/notebooks/rl_hparams.ipynb
@@ -10,44 +10,78 @@
{
"cell_type": "code",
"execution_count": 1,
- "metadata": {},
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-03-18T18:29:51.413888Z",
+ "iopub.status.busy": "2026-03-18T18:29:51.413223Z",
+ "iopub.status.idle": "2026-03-18T18:29:55.857730Z",
+ "shell.execute_reply": "2026-03-18T18:29:55.857394Z"
+ }
+ },
"outputs": [],
"source": [
"import time\n",
"\n",
"import jax\n",
+ "import jax.numpy as jnp\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import rejax\n",
"\n",
+ "from hyperoptax.bayesian import BayesianSearch\n",
"from hyperoptax.grid import GridSearch\n",
- "from hyperoptax.spaces import LinearSpace, LogSpace\n",
+ "from hyperoptax.spaces import DiscreteSpace, LinearSpace, LogSpace\n",
"\n",
- "rng = jax.random.PRNGKey(42)"
+ "key = jax.random.PRNGKey(42)"
]
},
{
"cell_type": "code",
"execution_count": 2,
- "metadata": {},
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-03-18T18:29:55.859536Z",
+ "iopub.status.busy": "2026-03-18T18:29:55.859371Z",
+ "iopub.status.idle": "2026-03-18T18:29:59.220166Z",
+ "shell.execute_reply": "2026-03-18T18:29:59.219781Z"
+ }
+ },
"outputs": [],
"source": [
"# make an RL agent\n",
- "ppo = rejax.algos.PPO\n",
- "jit_train = jax.jit(ppo.train)\n",
+ "PPO = rejax.algos.PPO\n",
+ "\n",
+ "\n",
+ "def vmap_train(config, key):\n",
+ " agent = PPO.create(env=\"CartPole-v1\", total_timesteps=timesteps, **config)\n",
+ " keys = jax.random.split(key, 3)\n",
+ " vmap = jax.vmap(agent.train)\n",
+ " return vmap(keys)\n",
+ "\n",
+ "\n",
"timesteps = 100_000\n",
- "agent = ppo.create(env=\"CartPole-v1\", total_timesteps=timesteps)\n",
- "ts, evaluation = jit_train(agent, rng)"
+ "config = {\n",
+ " \"ent_coef\": 0.01,\n",
+ "}\n",
+ "# shape: 2-tuple (n_seeds, n_evals, n_policy_rollouts) for lengths and returns\n",
+ "ts, evaluation = vmap_train(config, key)"
]
},
{
"cell_type": "code",
"execution_count": 3,
- "metadata": {},
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-03-18T18:29:59.221612Z",
+ "iopub.status.busy": "2026-03-18T18:29:59.221512Z",
+ "iopub.status.idle": "2026-03-18T18:30:04.196605Z",
+ "shell.execute_reply": "2026-03-18T18:30:04.196321Z"
+ }
+ },
"outputs": [
{
"data": {
- "image/png": "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eXmuDRs2uLZv3+46++yzXatWrfJ8vaenxzVv3jzXRRdd5Nq1a5dr/fr1rtTUVNcDDzzguc/x48dd0dHRrrvvvtt14MAB129+8xtXSEiI6/XXX3fU7+rjjz92TZo0ybVgwQLXt771Lc/neY61UVdX5yooKHB9+ctfdm3dulWdkzfeeMN17Ngxz31+8pOfuBISElwvvfSSa8+ePa7PfvazrsmTJ7va29s997nkkktcCxcudG3ZssX1wQcfuKZNm+a6/vrrPV9vbGx0ZWRkuG644Qb1b+evf/2rKyoqyvX//t//89znww8/VOf/pz/9qfp9fO9733OFhYW59u3b57K6//iP/3ClpKS41q1b5zpx4oTr+eefd8XGxrp+9atfee7D8zxx69evd333u991vfDCC4giXS+++OKQr5vpnHpzLN5g8KOTs846y3X77bd7Pu7t7XVlZ2e7Hn300YAel1lVV1erf3Tvvfee+rihoUH90ePJze3gwYPqPps3b/b8gw0ODnZVVlZ67vPEE0+44uPjXZ2dnerj73znO665c+cO+V5f+MIXVPDllN9Vc3Oza/r06a633nrLdd5553mCH55j7dx3332uNWvWjPr1vr4+V2ZmputnP/uZ53M4/xEREeoiAHiyx7nftm2b5z6vvfaaKygoyFVWVqY+/u1vf+tKSkrynHv39545c6bn489//vOuyy+/fMj3X7Fihetf//VfXVaHn+urX/3qkM9dc8016oIKPM/+k2HBj5nOqTfH4i1ue+mgq6tLduzYoZbjBs8Pw8ebN28O6LGZVWNjo3qbnJys3uL8dXd3DzmHWArNz8/3nEO8xbJoRkaG5z5r165VQ/QKCws99xn8GO77uB/DCb8rbGth22r4eeA51s7LL78sy5Ytk8997nNqa3Dx4sXyhz/8wfP1EydOSGVl5ZBzgHlE2P4bfK6xXYDHccP9ca62bt3quc+5554r4eHhQ841tozr6+u9+n1Y2apVq2TDhg1y5MgR9fGePXtk06ZNcumll6qPeZ61d8JE59SbY/EWgx8d1NTUqL3pwRcMwMf4xdFQfX19Kg9l9erVMm/ePPU5nCf8I8E/qNHOId6OdI7dXxvrPrh4t7e32/539eyzz8rOnTtVjtVwPMfaOX78uDzxxBMyffp0eeONN+Qb3/iG/Pu//7v86U9/Ul93/5xjnQO8ReA0WGhoqHpBoMXvww7n+v7775frrrtOBelhYWEqyMRzB3JNgOdZe5UmOqfeHIu3ONWdTLEysX//fvUKjrRTUlIi3/rWt+Stt95SyYOkbwCPV70//vGP1ce4KONv+ne/+53cfPPNgT482/jb3/4mTz/9tDzzzDMyd+5c2b17twp+kKjL80wTwZUfHaSmpkpISMgZVTP4ODMzM2DHZUZ33HGHrFu3TjZu3Ci5ubmez+M8YbukoaFh1HOItyOdY/fXxroPKhJQKWDn3xW2mqqrq1UVFl6F4fbee+/Jr3/9a/U+Xi3xHGsDlSdz5swZ8rnZs2erSjlw/5xjnQO8xe9rMFTVoYpGi9+HHc41Kg3dqz/Yjr3pppvkrrvu8qxs8jxrL9NE59SbY/EWgx8dYCth6dKlam968CtDfLxy5cqAHptZIK8Ogc+LL74o77zzjipdHQznD8vag88h9oZxMXGfQ7zdt2/fkH90WOXARdd9IcJ9Bj+G+z7ux7Dz7+rCCy9U5wevjt03rE5gi8D9Ps+xNrBlO7xVA/JSCgoK1Pv4+8aT8+BzgG1B5EMMPtcIRBG0uuHfBs4Vchrc90FZMnK1Bp/rmTNnSlJSkle/Dytra2tTeSSDIbDGOQKeZ+1NNtE59eZYvDah9GjyGkp7kYH+1FNPqUz42267TZX2Dq6acbJvfOMbqlzx3XffdVVUVHhubW1tQ8qwUf7+zjvvqDLslStXqtvwMuyLL75YlcujtDotLW3EMux7771XVTI9/vjjI5ZhO+V3NbjaC3iOtWslEBoaqkqxjx496nr66afVOfnLX/4ypEQXP/M///lP1969e11XXnnliOXCixcvVuXymzZtUlV6g8uFUdmCcuGbbrpJlQvjvOL7DC8XxrH8/Oc/V7+P73//+5YtwR7u5ptvduXk5HhK3VGajdYLqDh043n2rSJ0165d6oaw4Je//KV6/+TJk6Y7p94cizcY/OgI/U5wYUF/E5T6ov8B9cM/sJFu6P3jhj/mf/u3f1PlkfhHcvXVV6sAabDi4mLXpZdeqvpF4EnwnnvucXV3dw+5z8aNG12LFi1Sv4cpU6YM+R5O+10ND354jrXzyiuvqEARQd6sWbNcv//974d8HWW6Dz74oLoA4D4XXnih6/Dhw0PuU1tbqy4Y6F2DdgJf+cpX1IVpMPQ2QVk9HgOBAC4Gw/3tb39zzZgxQ51rtCF49dVXXXbQ1NSk/n7xdxQZGan+1tCfZnD5NM/zxG3cuHHE52MEm2Y7p94cizeC8J+JrRURERERWRdzfoiIiMhRGPwQERGRozD4ISIiIkdh8ENERESOwuCHiIiIHIXBDxERETkKgx8iIiJyFAY/RERE5CgMfogoICZNmiT/9V//5fX93333XQkKCjpjECsR0UQx+CGiMSHgGOv28MMP+/S427Ztk9tuu83r+69atUoqKiokISFBAoUBGJE9hAb6AIjI3BBwuD333HPy0EMPDZlgHhsb63kf03J6e3slNHT8p5a0tLQJHQemw2OiMxGRv7jyQ0RjQsDhvmHVBSsf7o8PHTokcXFx8tprr8nSpUslIiJCNm3aJEVFRXLllVdKRkaGCo6WL18ub7/99pjbXnjc//mf/5Grr75aoqOjZfr06fLyyy+Puury1FNPSWJiorzxxhsye/Zs9X0uueSSIcFaT0+P/Pu//7u6X0pKitx3331y8803y1VXXTXqz3vy5Em54oorJCkpSWJiYmTu3Lmyfv16KS4ulk996lPqPvgajuXLX/6y+rivr08effRRmTx5skRFRcnChQvl73//+xnH/uqrr8qCBQskMjJSzj77bNm/f/+435eItMfgh4j8dv/998tPfvITOXjwoLq4t7S0yGWXXSYbNmyQXbt2qaAEF/ZTp06N+Tg/+MEP5POf/7zs3btX/f833HCD1NXVjXr/trY2+fnPfy7/93//J++//756/G9/+9uer//nf/6nPP300/Lkk0/Khx9+KE1NTfLSSy+NeQy33367dHZ2qsfbt2+fegwEVnl5efKPf/xD3QcrXwiyfvWrX6mPEfj8+c9/lt/97ndSWFgod911l9x4443y3nvvDXnse++9V37xi1+oLT+sfOGcdHd3j/l9iUgHE54DT0SO9eSTT7oSEhI8H2/cuNGFp5GXXnpp3P937ty5rt/85jeejwsKClyPPfaY52M8zve+9z3Pxy0tLepzr7322pDvVV9f7zkWfHzs2DHP//P444+7MjIyPB/j/Z/97Geej3t6elz5+fmuK6+8ctTjnD9/vuvhhx8e8WvDjwE6Ojpc0dHRro8++mjIfW+55RbX9ddfP+T/e/bZZz1fr62tdUVFRbmee+65cb8vEWmLOT9E5Ldly5YN+RgrP0iExjYPVkiw/dTe3j7uyg9Wjdyw9RMfHy/V1dWj3h/bY1OnTvV8nJWV5bl/Y2OjVFVVyVlnneX5ekhIiNqewzbVaLBN9o1vfEPefPNNueiii+Taa68dclzDHTt2TK1AffrTnx7y+a6uLlm8ePGQz61cudLzfnJyssycOVOtlvnyfYnId9z2IiK/IVAZDFtPL774ovz4xz+WDz74QHbv3i3z589XAcFYwsLChnyMPJmxApWR7t+/iOS7r33ta3L8+HG56aab1PYTArvf/OY3o94fgR4g0MPP6b4dOHBgSN6P1t+XiHzH4IeINIf8GiQDI3kZQQ+So5EwbCQkZyPhGvk1bqhE27lz57j/L/J7vv71r8sLL7wg99xzj/zhD3/wVJy5H8dtzpw5KtEbq1rTpk0bcsPjDLZlyxbP+/X19XLkyBGVrD3e9yUibXHbi4g0h0otXMCR0IvVmAcffHDMFRy9fPOb31TJyAhEZs2apVZSEHTgmEZz5513yqWXXiozZsxQ9924caMnQCkoKFD/77p161RCNiq7UO2GlS4kOeNnXLNmjdpyQwCIbTtUl7n98Ic/VFVnCMq++93vSmpqqqfybKzvS0Ta4soPEWnul7/8pSrZRmNCBEBr166VJUuWGH4cKG2//vrr5Utf+pLKt0H1FI4FpeajwaoOKq8QeKBKDcHIb3/7W/W1nJwcVZGG6jYEMHfccYf6/COPPKICPARa7v8P22AofR8MFXHf+ta3VN5RZWWlvPLKK0NWk0b7vkSkrSBkPWv8mEREpoSVGQQXKKdHwGIU9PlBjyCs6KDnEBEFFre9iMi20DgQ1VPnnXee6qHz3//933LixAn54he/GOhDI6IA4rYXEdlWcHCw6gSNDtOrV69WVVToNM1cGiJn47YXEREROQpXfoiIiMhRGPwQERGRozD4ISIiIkdh8ENERESOwuCHiIiIHIXBDxERETkKgx8iIiJyFAY/REREJE7y/wHvbe4LG0Nv6QAAAABJRU5ErkJggg==",
+ "image/png": "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",
"text/plain": [
""
]
@@ -60,12 +94,12 @@
"def plot_eval(evaluation, label=\"\", fig=None, ax=None):\n",
" if fig is None:\n",
" fig, ax = plt.subplots()\n",
- " xaxis = np.linspace(0, timesteps, len(evaluation.mean(axis=1)))\n",
- " ax.plot(xaxis, evaluation.mean(axis=1), label=label)\n",
+ " xaxis = np.linspace(0, timesteps, len(evaluation.mean(axis=(0, 2))))\n",
+ " ax.plot(xaxis, evaluation.mean(axis=(0, 2)), label=label)\n",
" ax.fill_between(\n",
" xaxis,\n",
- " evaluation.mean(axis=1) - evaluation.std(axis=1),\n",
- " evaluation.mean(axis=1) + evaluation.std(axis=1),\n",
+ " evaluation.mean(axis=(0, 2)) - evaluation.std(axis=(0, 2)),\n",
+ " evaluation.mean(axis=(0, 2)) + evaluation.std(axis=(0, 2)),\n",
" alpha=0.5,\n",
" )\n",
" ax.set_xlabel(\"Training steps\")\n",
@@ -80,83 +114,248 @@
{
"cell_type": "code",
"execution_count": 4,
- "metadata": {},
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-03-18T18:30:04.213312Z",
+ "iopub.status.busy": "2026-03-18T18:30:04.213096Z",
+ "iopub.status.idle": "2026-03-18T18:32:04.049228Z",
+ "shell.execute_reply": "2026-03-18T18:32:04.048850Z"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# Optimize RL hyperparameters\n",
+ "hparams = {\n",
+ " \"learning_rate\": DiscreteSpace([1e-5, 1e-4, 1e-3, 1e-2, 1e-1]),\n",
+ " \"max_grad_norm\": DiscreteSpace([0.01, 0.1, 1.0, 10.0]),\n",
+ " \"ent_coef\": DiscreteSpace([1e-4, 1e-3, 1e-2, 1e-1, 1.0, 10.0]),\n",
+ "}\n",
+ "\n",
+ "\n",
+ "def wrapper(key, config):\n",
+ " ts, evaluation = vmap_train(config, key)\n",
+ " return evaluation[1].mean(axis=(0, 2))[-1]\n",
+ "\n",
+ "\n",
+ "state, optimizer = GridSearch.init(hparams, shuffle=True)\n",
+ "\n",
+ "start = time.time()\n",
+ "state, (params_hist, results_hist) = optimizer.optimize(state, key, wrapper, 20)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-03-18T18:32:04.051107Z",
+ "iopub.status.busy": "2026-03-18T18:32:04.050995Z",
+ "iopub.status.idle": "2026-03-18T18:32:08.741334Z",
+ "shell.execute_reply": "2026-03-18T18:32:08.740949Z"
+ }
+ },
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Time taken: 43.32 seconds\n",
"Best hyperparameters:\n",
- "Learning rate: 0.012915\n",
- "Max grad norm: 8.890000\n",
- "Ent coef: 0.001292\n"
+ "Learning rate: 0.010000\n",
+ "Max grad norm: 1.000000\n",
+ "Ent coef: 0.001000\n",
+ "Return: 418.932312\n",
+ "Time taken: 124.40 seconds\n"
]
}
],
"source": [
+ "results_array = jnp.array([float(r.squeeze()) for r in results_hist])\n",
+ "ordering = np.argsort(results_array)\n",
+ "\n",
+ "stacked_params = {\n",
+ " k: jnp.array([float(p[k].squeeze()) for p in params_hist])\n",
+ " for k in params_hist[0].keys()\n",
+ "}\n",
+ "best_hparams = {k: v[ordering] for k, v in stacked_params.items()}\n",
+ "\n",
+ "print(\n",
+ " \"Best hyperparameters:\\n\"\n",
+ " f\"Learning rate: {best_hparams['learning_rate'][-1]:4f}\\n\"\n",
+ " f\"Max grad norm: {best_hparams['max_grad_norm'][-1]:4f}\\n\"\n",
+ " f\"Ent coef: {best_hparams['ent_coef'][-1]:4f}\\n\"\n",
+ " f\"Return: {results_array[ordering][-1]:4f}\"\n",
+ ")\n",
+ "print(f\"Time taken: {time.time() - start:.2f} seconds\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-03-18T18:32:08.742892Z",
+ "iopub.status.busy": "2026-03-18T18:32:08.742753Z",
+ "iopub.status.idle": "2026-03-18T18:32:15.938790Z",
+ "shell.execute_reply": "2026-03-18T18:32:15.938469Z"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Train and evaluate the tuned RL agent\n",
+ "best_config = jax.tree.map(lambda x: x[-1], best_hparams)\n",
+ "agent = PPO.create(env=\"CartPole-v1\", **best_config)\n",
+ "ts, evaluation = vmap_train(best_config, key)\n",
+ "\n",
+ "fig, ax = plot_eval(evaluation[1], label=\"GridSearch Optimized\", fig=fig, ax=ax)\n",
+ "ax.legend()\n",
+ "fig"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Bayesian Search"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-03-18T18:32:15.940195Z",
+ "iopub.status.busy": "2026-03-18T18:32:15.940082Z",
+ "iopub.status.idle": "2026-03-18T18:34:20.869831Z",
+ "shell.execute_reply": "2026-03-18T18:34:20.869168Z"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "from hyperoptax.kernels import Matern\n",
+ "from hyperoptax.acquisition import EI, UCB, PI\n",
+ "\n",
"# Optimize RL hyperparameters\n",
- "n_samples_per_hparam = 10\n",
"hparams = {\n",
- " \"learning_rate\": LogSpace(1e-5, 1e-1, n_samples_per_hparam),\n",
- " \"max_grad_norm\": LinearSpace(0.01, 10, n_samples_per_hparam),\n",
- " \"ent_coef\": LogSpace(1e-4, 1e1, n_samples_per_hparam),\n",
+ " \"learning_rate\": LogSpace(1e-7, 1e-1),\n",
+ " \"max_grad_norm\": LogSpace(1e-1, 1e2),\n",
+ " \"ent_coef\": LogSpace(1e-4, 1e-1),\n",
+ " \"clip_eps\": LinearSpace(1e-2, 0.9),\n",
+ " \"gae_lambda\": LinearSpace(0.01, 0.99),\n",
+ " \"gamma\": LinearSpace(0.8, 0.9999),\n",
+ " \"vf_coef\": LinearSpace(0.1, 0.9),\n",
"}\n",
"\n",
+ "bayesopt_params = {\n",
+ " \"kernel\": Matern(length_scale=1, nu=2.5),\n",
+ " \"acquisition\": EI(xi=0.01),\n",
+ " \"n_candidates\": 1000,\n",
+ " \"n_restarts\": 2,\n",
+ " \"n_lbfgs_steps\": 10,\n",
+ " \"n_hparam_steps\": 20,\n",
+ " \"n_warmup\": 1,\n",
+ "}\n",
"\n",
- "def wrapper(learning_rate, max_grad_norm, ent_coef):\n",
- " agent = ppo.create(\n",
- " env=\"CartPole-v1\",\n",
- " learning_rate=learning_rate,\n",
- " max_grad_norm=max_grad_norm,\n",
- " ent_coef=ent_coef,\n",
- " )\n",
- " ts, evaluation = jit_train(agent, rng)\n",
- " return evaluation[1].mean(axis=1)[-1]\n",
"\n",
+ "def wrapper(key, config):\n",
+ " config = jax.tree.map(lambda x: x.squeeze(), config)\n",
+ " ts, evaluation = vmap_train(config, key)\n",
+ " return evaluation[1].mean(axis=(0, 2))[-1]\n",
"\n",
- "search = GridSearch(hparams, wrapper, random_search=True)\n",
+ "\n",
+ "state, optimizer = BayesianSearch.init(hparams, n_max=20, **bayesopt_params)\n",
"\n",
"start = time.time()\n",
- "result = search.optimize(20, n_vmap=2, jit=True).flatten()\n",
- "print(f\"Time taken: {time.time() - start:.2f} seconds\")\n",
+ "state, (params_hist, results_hist) = optimizer.optimize(state, key, wrapper)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-03-18T18:34:20.872795Z",
+ "iopub.status.busy": "2026-03-18T18:34:20.872654Z",
+ "iopub.status.idle": "2026-03-18T18:34:20.893919Z",
+ "shell.execute_reply": "2026-03-18T18:34:20.893627Z"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Best hyperparameters:\n",
+ "clip_eps: 0.069597\n",
+ "ent_coef: 0.050597\n",
+ "gae_lambda: 0.801231\n",
+ "gamma: 0.916678\n",
+ "learning_rate: 0.000547\n",
+ "max_grad_norm: 0.127839\n",
+ "vf_coef: 0.349298\n",
+ "Return: 272.987000\n",
+ "Time taken: 124.90 seconds\n"
+ ]
+ }
+ ],
+ "source": [
+ "results_array = jnp.array([float(r.squeeze()) for r in results_hist])\n",
+ "ordering = np.argsort(results_array)\n",
"\n",
- "print(\n",
- " \"Best hyperparameters:\\n\"\n",
- " f\"Learning rate: {result.tolist()[0]:4f}\\n\"\n",
- " f\"Max grad norm: {result.tolist()[1]:4f}\\n\"\n",
- " f\"Ent coef: {result.tolist()[2]:4f}\"\n",
- ")"
+ "stacked_params = {\n",
+ " k: jnp.array([float(p[k].squeeze()) for p in params_hist])\n",
+ " for k in params_hist[0].keys()\n",
+ "}\n",
+ "best_hparams = {k: v[ordering] for k, v in stacked_params.items()}\n",
+ "hparams_str = \"\\n\".join(\n",
+ " [f\"{key}: {best_hparams[key][-1]:2f}\" for key in best_hparams.keys()]\n",
+ ")\n",
+ "print(f\"Best hyperparameters:\\n{hparams_str}\\nReturn: {results_array[ordering][-1]:4f}\")\n",
+ "print(f\"Time taken: {time.time() - start:.2f} seconds\")"
]
},
{
"cell_type": "code",
- "execution_count": 5,
- "metadata": {},
+ "execution_count": 9,
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-03-18T18:34:20.896215Z",
+ "iopub.status.busy": "2026-03-18T18:34:20.896111Z",
+ "iopub.status.idle": "2026-03-18T18:34:27.449311Z",
+ "shell.execute_reply": "2026-03-18T18:34:27.449039Z"
+ }
+ },
"outputs": [
{
"data": {
- "image/png": "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",
+ "image/png": "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sHvhhRda7C9CTxChJ79noG3fvj3M76e9X5cQcvJQ/BBC2h3xrxFnYHFeFtEjztHiMNyZiHO2OFyLf00AiUTbuHHjCX9W/HtuuOEGvPnmm7jrrrvw6quvBiPOAucJMHz4cOXoLVatgQMHhjU5TyhffPFFcL2iogK7du1Sztonel1CSPvCaS9CSLsjkVryABeHXrHGPPTQQ61acDqKW265RTkjixAZOnSosqSI6JBraonbb78dM2bMwODBg1XflStXBgVKXl6e+tl33nlHOWRLZJdEu4mlS5yc5XecOnWqmnITASjTdhJdFuA3v/mNijoTUfbAAw8gMzMzGHnW2usSQtoXWn4IIe3OM888o0K2JTGhCKDp06dj/PjxnX4dEto+a9Ys/PSnP1X+NhI9JdcioeYtIVYdibwS4SFRaiJGXnrpJXWsd+/eKiJNottEwNx8881q/2OPPaYEngitwM/JNJiEvociEXG33Xab8jsqLCzE22+/HWZNaul1CSHti068ntv5nIQQEpWIZUbEhYTTi2DpLCTPj+QIEouO5BwihHQtnPYihHRbJHGgRE+dc845KofOiy++iP379+MnP/lJV18aIaQL4bQXIaTbotfrVSZoyTB95plnqigqyTRNXxpC4htOexFCCCEkrqDlhxBCCCFxBcUPIYQQQuIKih9CCCGExBUUP4QQQgiJKyh+CCGEEBJXUPwQQgghJK6g+CGEEEJIXEHxQwghhBDEE/8fgPFbXTzYuhUAAAAASUVORK5CYII=",
"text/plain": [
""
]
},
- "execution_count": 5,
+ "execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Train and evaluate the tuned RL agent\n",
- "agent = ppo.create(\n",
- " env=\"CartPole-v1\",\n",
- " learning_rate=result[0],\n",
- " max_grad_norm=result[1],\n",
- " ent_coef=result[2],\n",
- ")\n",
- "ts, evaluation = jit_train(agent, rng)\n",
+ "best_config = jax.tree.map(lambda x: x[-1], best_hparams)\n",
+ "agent = PPO.create(env=\"CartPole-v1\", **best_config)\n",
+ "ts, evaluation = vmap_train(best_config, key)\n",
"\n",
- "fig, ax = plot_eval(evaluation[1], label=\"Optimized\", fig=fig, ax=ax)\n",
+ "fig, ax = plot_eval(evaluation[1], label=\"BayesOpt Optimized\", fig=fig, ax=ax)\n",
"ax.legend()\n",
"fig"
]
diff --git a/notebooks/search.ipynb b/notebooks/search.ipynb
index dfd45ae..ba07738 100644
--- a/notebooks/search.ipynb
+++ b/notebooks/search.ipynb
@@ -10,7 +10,14 @@
{
"cell_type": "code",
"execution_count": 1,
- "metadata": {},
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-03-18T18:22:19.369010Z",
+ "iopub.status.busy": "2026-03-18T18:22:19.368495Z",
+ "iopub.status.idle": "2026-03-18T18:22:21.269608Z",
+ "shell.execute_reply": "2026-03-18T18:22:21.269245Z"
+ }
+ },
"outputs": [],
"source": [
"import time\n",
@@ -22,8 +29,8 @@
"import optax\n",
"from flax.training import train_state\n",
"\n",
- "from hyperoptax.bayesian import BayesianOptimizer\n",
- "from hyperoptax.grid import GridSearch\n",
+ "from hyperoptax.bayesian import BayesianSearch\n",
+ "from hyperoptax.random import RandomSearch\n",
"from hyperoptax.spaces import LinearSpace, LogSpace\n",
"\n",
"key = jax.random.PRNGKey(0)\n"
@@ -32,7 +39,14 @@
{
"cell_type": "code",
"execution_count": 2,
- "metadata": {},
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-03-18T18:22:21.271216Z",
+ "iopub.status.busy": "2026-03-18T18:22:21.271052Z",
+ "iopub.status.idle": "2026-03-18T18:22:21.696102Z",
+ "shell.execute_reply": "2026-03-18T18:22:21.695819Z"
+ }
+ },
"outputs": [],
"source": [
"# make a basic model\n",
@@ -41,6 +55,8 @@
" def __call__(self, x):\n",
" x = nn.Dense(10)(x)\n",
" x = nn.relu(x)\n",
+ " x = nn.Dense(10)(x)\n",
+ " x = nn.relu(x)\n",
" return nn.Dense(1)(x)\n",
"\n",
"\n",
@@ -57,11 +73,18 @@
{
"cell_type": "code",
"execution_count": 3,
- "metadata": {},
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-03-18T18:22:21.697511Z",
+ "iopub.status.busy": "2026-03-18T18:22:21.697423Z",
+ "iopub.status.idle": "2026-03-18T18:22:22.219465Z",
+ "shell.execute_reply": "2026-03-18T18:22:22.219190Z"
+ }
+ },
"outputs": [
{
"data": {
- "image/png": "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Tl+VOGOhiouLcf78ebi7u8POzq7O054IQPHx8fDw8KjT703l8Vqrh9daPbzW6uG1tr5rLaKHCCnBwcHQaDS2O6MifriQkJB6/TPEXwT/w1cHr7V6eK3Vw2utHl5r67rWlc2kGHAxLREREVksBhUiIiKyWAwqJjg6OuJ///uffKb6xWutHl5r9fBaq4fX2ravtVUvpiUiIiLbxhkVIiIislgMKkRERGSxGFSIiIjIYjGoEBERkcViUDHi888/R3h4OJycnNCzZ09s377d3EOyejNnzkT37t1lFeGAgACMHj0asbGx5frk5uZiypQp8PX1hZubG2699VZcuHDBbGO2FW+//bas3Dxt2rTSz/Fa151z587hrrvuktfS2dkZ7du3x86dO0u/LvYrvPLKK2jUqJH8+uDBg3Hs2DGzjtkaFRUV4eWXX0ZERIS8js2aNcMbb7xR7qwYXuua27BhA0aNGiUrxYrfF4sWLSr39apc25SUFEyYMEEWgvPy8sL999+PzMzMWozqyh9OZSxYsEDv4OCg//bbb/UHDx7UT548We/l5aW/cOGCuYdm1YYNG6b/7rvv9DExMfq9e/fqR4wYoW/SpIk+MzOztM/DDz+sDw0N1a9evVq/c+dOfa9evfS9e/c267it3fbt2/Xh4eH6Dh066J944onSz/Na142UlBR9WFiYftKkSfro6Gj9yZMn9cuXL9cfP368tM/bb7+t9/T01C9atEi/b98+/U033aSPiIjQ5+TkmHXs1uatt97S+/r66pcsWaI/deqU/vfff9e7ubnpP/nkk9I+vNY1999//+mnT5+u/+uvv0Ty0y9cuLDc16tybYcPH67v2LGjftu2bfqNGzfqIyMj9ePGjdPXFoPKVXr06KGfMmVK6cdFRUX64OBg/cyZM806LluTlJQk/8+wfv16+XFqaqre3t5e/vIxOHz4sOyzdetWM47UemVkZOibN2+uX7lypf66664rDSq81nXnueee0/ft29fk14uLi/VBQUH69957r/Rz4vo7Ojrqf/nlF5VGaRtGjhypv++++8p97pZbbtFPmDBBtnmt687VQaUq1/bQoUPydTt27Cjts3TpUr2dnZ3+3LlztRoPb/2UkZ+fj127dskprbLnCYmPt27datax2Zq0tDT57OPjI5/FdS8oKCh37Vu1aoUmTZrw2teQuLUzcuTIctdU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",
+ "image/png": "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",
"text/plain": [
""
]
@@ -72,7 +95,9 @@
],
"source": [
"# end to end loop\n",
- "def make_and_train_model(learning_rate, final_lr_pct, n_epochs=100):\n",
+ "def make_and_train_model(\n",
+ " learning_rate, final_lr_pct, weight_decay=0.0001, n_epochs=100\n",
+ "):\n",
" key = jax.random.PRNGKey(0)\n",
" key, key_init = jax.random.split(key, 2)\n",
" model = Model()\n",
@@ -85,7 +110,8 @@
" init_value=learning_rate,\n",
" end_value=final_lr_pct,\n",
" transition_steps=n_epochs,\n",
- " )\n",
+ " ),\n",
+ " weight_decay=weight_decay,\n",
" ),\n",
" )\n",
"\n",
@@ -116,7 +142,7 @@
"\n",
"\n",
"# Plot the losses\n",
- "ts, losses = make_and_train_model(1e-3, 0.01, 100)\n",
+ "ts, losses = make_and_train_model(1e-3, 0.01, 0.0001, 100)\n",
"plt.plot(losses[0], label=\"train\")\n",
"plt.plot(losses[1], label=\"test\")\n",
"plt.xlabel(\"Epoch\")\n",
@@ -128,49 +154,72 @@
{
"cell_type": "code",
"execution_count": 4,
- "metadata": {},
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-03-18T18:22:22.244040Z",
+ "iopub.status.busy": "2026-03-18T18:22:22.243872Z",
+ "iopub.status.idle": "2026-03-18T18:22:31.812684Z",
+ "shell.execute_reply": "2026-03-18T18:22:31.812406Z"
+ }
+ },
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Optimal result: [0.00572237 0.6237374 ]\n",
- "Time taken: 24.26 seconds to sweep 1000 configs\n",
- "Optimal loss: 0.17404668\n"
+ "Optimal params: {'final_lr_pct': Array([0.87481517], dtype=float32), 'learning_rate': Array([0.00035055], dtype=float32)}\n",
+ "Time taken: 13.58 seconds for 50 configs\n",
+ "Optimal loss: 0.17405471205711365\n"
]
}
],
"source": [
- "def wrapper(learning_rate, final_lr_pct):\n",
- " # get the last validation loss and add a minus as we maximize by default\n",
- " return make_and_train_model(learning_rate, final_lr_pct)[1][1][-1]\n",
+ "def wrapper(key, config):\n",
+ " learning_rate = config.get(\"learning_rate\", 1e-3)\n",
+ " final_lr_pct = config.get(\"final_lr_pct\", 0.01)\n",
+ " weight_decay = config.get(\"weight_decay\", 0.0001)\n",
+ " # negate: we maximize by convention, so return negative loss\n",
+ " return -make_and_train_model(learning_rate, final_lr_pct, weight_decay)[1][1][-1]\n",
"\n",
"\n",
"search_space = {\n",
- " \"learning_rate\": LogSpace(1e-4, 1e-2, 100),\n",
- " \"final_lr_pct\": LinearSpace(0.01, 0.99, 100),\n",
+ " \"learning_rate\": LogSpace(1e-4, 1e-2),\n",
+ " \"final_lr_pct\": LinearSpace(0.01, 0.99),\n",
"}\n",
- "n_iterations = 1000\n",
+ "n_iterations = 50\n",
"\n",
- "search = GridSearch(search_space, wrapper, random_search=True)\n",
+ "key, subkey = jax.random.split(key)\n",
+ "state, optimizer = RandomSearch.init(search_space)\n",
"\n",
"start = time.time()\n",
- "result = search.optimize(n_iterations, n_vmap=10, jit=True, maximize=False)\n",
+ "state, (params_hist, results_hist) = optimizer.optimize(\n",
+ " state, subkey, wrapper, n_iterations\n",
+ ")\n",
"end = time.time()\n",
"\n",
- "print(\"Optimal result:\", result)\n",
- "print(f\"Time taken: {end - start:.2f} seconds to sweep {n_iterations} configs\")\n",
- "print(\"Optimal loss:\", wrapper(result[0], result[1]))"
+ "best_idx = int(jnp.argmax(jnp.array([float(r.squeeze()) for r in results_hist])))\n",
+ "best_params = params_hist[best_idx]\n",
+ "\n",
+ "print(\"Optimal params:\", best_params)\n",
+ "print(f\"Time taken: {end - start:.2f} seconds for {n_iterations} configs\")\n",
+ "print(\"Optimal loss:\", -float(results_hist[best_idx].squeeze()))"
]
},
{
"cell_type": "code",
"execution_count": 5,
- "metadata": {},
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-03-18T18:22:31.814012Z",
+ "iopub.status.busy": "2026-03-18T18:22:31.813916Z",
+ "iopub.status.idle": "2026-03-18T18:22:31.989946Z",
+ "shell.execute_reply": "2026-03-18T18:22:31.989672Z"
+ }
+ },
"outputs": [
{
"data": {
- "image/png": "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EhERRQqDSqTG6LOZloiIKOIYVCJ9MCF7VIiIiCKGQSVCQaX1YEIGFSIiokhhUIlwRYW7foiIiCKHQSVSFRVvULHD5eLBhERERJHAoBJWM21rUMnP1JppnS436pod8XpnREREKYVBJayKSuuunzSzCVlW7SBFLv8QERFFBoNKRM/74c4fIiKiSGJQiWBQ8fapcOcPERFRRDCohLv043IFTKc9yqBCREQUEQwq4TTTup1AS01AQ21tE8foExERRQKDSleY0wBrTkBDbW66J6hw1w8REVFEMKhEcItyboZZXbOiQkREFBkMKhFsqPVWVBhUiIiIIoJBJZJBJUNf+mFQISIiigQGlahUVNijQkREFAkMKhGtqHh6VFhRISIiiggGlQg20+bpSz/sUSEiIooIBpWuyuqmXTcEWfrh9mQiIqKIYFCJQjNtfYsDDmfrxFoiIiLqGgaVrsoIXPrJSdd6VPSwQkREROFhUOmqjHzturl1hL7FZESm1aRuc+cPERFR+BhUuio9rzWouN1B+lTYUEtERBQuBpWuSvdUVFx2wN4UsEW5hjt/iIiIwsag0lXWLMCgLfOgudp7N8foExERRQ6DSlcZDP7LPx4co09ERBQ5DCrhCBZUPDt/2ExLREQUPgaVCO/88U6nZUWFiIgobAwqkaioNPn0qHCMPhERUcQwqER86Ydj9ImIiCKFQSUSW5T9mmn1HhVWVIiIiMLFoBKRikqQ7cnsUSEiIgobg0qkg4q3R4VLP0REROFiUIlSjwon0xIREYWPQSUcGQXt96hw6YeIiChsDCpRqqg02pywO13xemdEREQpgUElwnNUcjyTaUUdtygTERGFhUElwhUVs8mI7DRuUSYiIooEBpVIzFFpqQVcrsDzftinQkREFBYGlUhUVNwuwFbnvZtblImIiCKDQSUclnTAlNbBGH1WVIiIiMLBoBKNnT8co09ERBQRDCrhyghy3g8rKkRERBHBoBKFLcp6jwqn0xIREYWHQSUqQ9/0pR820xIREYWDQSVSW5T9elS49ENERBQJDCpRaabVtyczqBAREYWDQSViQaU6SDMtl36IiIhiHlT279+PAwcOeL9esWIFbrvtNjz77LOdep6nn34ao0ePRm5urrpMnjwZ8+fPR1Lh9mQiIqLECio//OEP8emnn6rb5eXl+OY3v6nCyl133YX7778/5Ofp06cPHnroIaxevRqrVq3Cueeei0svvRQbN25E0uD2ZCIiosQKKhs2bMDEiRPV7ddffx2jRo3CF198gVdeeQVz5swJ+XkuvvhiXHjhhRg8eDCGDBmCBx54ANnZ2Vi2bBmSuaKSxxH6REREEaGtUXSS3W5HWpo2On7hwoW45JJL1O1hw4bh0KFDXXojTqcTb7zxBhoaGtQSUDAtLS3qoqutrUVCzlHxVFSa7E7YHC5YzWwFIiIi6oou/QYdOXIknnnmGXz22WdYsGABzj//fHV/WVkZioqKOvVcX3/9taqiSPC54YYbMG/ePIwYMSLo986ePRt5eXneS9++fZGIFZVszxwVUcflHyIiotgGlYcffhh///vfcc455+CKK67AmDFj1P3vvvuud0koVEOHDsXatWuxfPly3Hjjjbj66quxadOmoN87a9Ys1NTUeC/S1JuIc1RMRgNy0rSwwum0REREMV76kYBSWVmpll4KCgq8919//fXIzMzs1HNZrVYMGjRI3T711FOxcuVKPPbYYyoItSVVF33JKWHoQcVWBzgdgMnsnaVS1+LgFmUiIqJYV1SamppUr4geUvbu3YtHH30UW7duRY8ePcJ5P3C5XH59KAkvPbf1dktrz0yOd4w+KypEREQxrajIFuJvf/vbqqekuroakyZNgsViUVWWRx55RC3hhEKWci644AL069cPdXV1ePXVV7Fo0SJ89NFHSBomC2DNBmz12tC3zEL/nT/sUSEiIoptRWXNmjU488wz1e0333wTxcXFqqryr3/9C48//njIz1NRUYEf//jHqk9l6tSpatlHQorMZUmdMfpc+iEiIoppRaWxsRE5OTnq9v/+9z9VXTEajTjttNNUYAnVP//5T6QECSq1B4NuUWZFhYiIKMYVFWl+ffvtt9WuG6mAnHfeed4KiYzCP+FwjD4REVHiBJV77rkHd9xxB0pLS9V2ZH1Am1RXxo4dixNOkC3KrKgQERHFaenn8ssvx5QpU9QUWn2GipA+kxkzZuCEwx4VIiKixAkqomfPnuqin6IsBwx2dthb6gUV3x4Vz9IPKypERESxXfqRWSdySrKMse/fv7+65Ofn4w9/+IN67ITTQUWFk2mJiIhiXFG566671I6dhx56CGeccYa6b+nSpbj33nvR3NysTkE+oWR00KPCoEJERBTboPLiiy/iueee856aLEaP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fPfhw4fj/daS2vTp090vvPCCe8OGDe61a9e6L7zwQne/fv3c9fX13u+54YYb3H379nV//PHH7lWrVrlPO+009+mnnx7X953sVqxY4S4tLXWPHj3afeutt3rv52cdGVVVVe7+/fu7r7nmGvfy5cvdu3btcn/00UfuHTt2eL/noYcecufl5bnffvtt97p169yXXHKJe8CAAe6mpqa4vvdk88ADD7iLiorc77//vnv37t3uN954w52dne1+7LHHvN/Dz7rr/vvf/7rvuusu91tvvSXJzz1v3jy/x0P5bM8//3z3mDFj3MuWLXN/9tln7kGDBrmvuOIKd7gYVNqYOHGie+bMmd6vnU6nu6SkxD179uy4vq9UU1FRof7HsHjxYvV1dXW122KxqL98dJs3b1bf8+WXX8bxnSavuro69+DBg90LFixwn3322d6gws86cu688073lClT2n3c5XK5e/bs6f7zn//svU8+/7S0NPdrr70Wo3eZGi666CL3T37yE7/7vv3tb7uvvPJKdZufdeS0DSqhfLabNm1SP7dy5Urv98yfP99tMBjcBw8eDOv9cOnHh81mw+rVq1VJy/c8Ifn6yy+/jOt7SzU1NTXqurCwUF3L52632/0++2HDhqFfv3787LtIlnYuuugiv89U8LOOnHfffRfjx4/Hd7/7XbWkOXbsWPzjH//wPr57926Ul5f7fdZyvoksKfOz7pzTTz8dH3/8MbZt26a+XrduHZYuXYoLLrhAfc3POnpC+WzlWpZ75H8POvl++R26fPnysF4/qQ8ljLTKykq1DlpcXOx3v3y9ZcuWuL2vVCOnXku/xBlnnIFRo0ap++R/BFarVf0Xve1nL49R58ydOxdr1qzBypUrAx7jZx05u3btwtNPP43bb78dv/3tb9Xnfcstt6jP9+qrr/Z+nsH+TuFn3Tm/+c1v1Mm9EqpNJpP6u/qBBx5QPRGCn3X0hPLZyrWEdV9ms1n9YzTcz59BheLyL/0NGzaofw1R5Mnx67feeisWLFigGsIpuqFb/gX54IMPqq+loiL/3X7mmWdUUKHIef311/HKK6/g1VdfxciRI7F27Vr1Dx5p/uRnndq49OOjW7duKqm33f0gX/fs2TNu7yuV3HzzzXj//ffx6aefok+fPt775fOVpbfq6mq/7+dn33mytFNRUYFx48apf9HIZfHixXj88cfV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",
+ "image/png": "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x0ClGYFK9dIPMypERESRwEAlVEm1a1Sq25OZUSEiIooEBiqNzai4q2tU2J5MREQUWQxUwlCjIhsT+nytoHOJiIiolWGg0oz2ZLPrR2KU0krWqRAREYUbA5VmtCe7EuxwOvRLyIJaIiKi8GOg0thAxVMKePWaFJvNxhZlIiKiCGKg0tilnxpZleqCWmZUiIiIwo2BSqgcCYAzTT+uKLAeZosyERFR5DBQCVeLMgMVIiKisGOgEq4dlLn0Q0REFHYMVMLUosylHyIiovBjoNLMFuV0o0aF7clEREThx0CluUs/zKgQERFFDAOVZm5MaGVUWKNCREQUdgxUml1My64fIiKiSGGgErb2ZGZUiIiIwo2BSrNrVIyBb+XMqBAREYUbA5XmtidbSz/MqBAREYUbA5WwtSczo0JERBRuDFQaIymrzoxKZZUPFR5vtM6MiIioTWKg0sz25DRnAmw2/biYyz9ERERhxUClqV0/Pp86tNttSHNx+YeIiCgSGKg0pZgWGlBZHGQ6LTMqRERE4cRApTESkwCHq57ptMyoEBERhRMDlTBOp2VGhYiIKLwYqIShRdkc+sYaFSIiovBioBLGHZS59ENERBReDFTCuIMyl36IiIjCi4FKY3EHZSIiovgJVPbu3Yuf//znyMnJQXJyMo4//nisWrUKrWkHZbYnExERRYa+ZhElx44dw7hx43DmmWdi/vz56NChA7Zs2YLs7Gy0po0J2Z5MRETUBgOVxx9/HN27d8crr7xiPda7d2+0jqWfAushLv0QERG1waWf999/H6NGjcLll1+Ojh07YuTIkXjxxRfrfL3b7UZRUVHALZZ2UObSDxERURsKVLZv345Zs2ahf//+WLhwIW655Rb85je/wWuvvRb09TNnzkRmZqZ1k2xMi2N7MhERUXwEKj6fDyeccAIeffRRlU256aabcOONN+K5554L+voZM2agsLDQuuXl5cVEoMKMChERURsMVLp06YLBgwcHPDZo0CDs3r076OtdLhcyMjICbjE1Qt9dBa9Pa/lzIiIiaqOiGqhIx8+mTZsCHtu8eTN69uyJ1tSebGZURAmzKkRERG0jUPntb3+L5cuXq6WfrVu34o033sALL7yAadOmRfO06uffnqzp2RNXggOuBP1SsvOHiIiojQQqo0ePxty5c/Hmm29i6NChePjhh/Hkk09iypQpiPmM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FOGOHTti0qRJ2LRpU8BrKioqMG3aNOTk5CAtLQ2XXnopDh48GLVzbisee+wxNbn5jjvusB7jtQ6fvXv34uc//7m6lsnJyTj++OOxatUq63npV7jvvvvQpUsX9fzZZ5+NLVu2RPWcWyOv14t7770XvXv3Vtexb9++ePjhhwP2iuG1brqlS5fiwgsvVJNi5e+LefPmBTwfyrU9evQopkyZogbBZWVl4YYbbkBJSUkzzqr6w8nPnDlzNKfTqb388svaxo0btRtvvFHLysrSDh48GO1Ta9XOPfdc7ZVXXtE2bNigrVmzRjv//PO1Hj16aCUlJdZrbr75Zq179+7aJ598oq1atUo7+eSTtVNOOSWq593arVixQuvVq5c2bNgw7fbbb7ce57UOj6NHj2o9e/bUrr32Wu2bb77Rtm/fri1cuFDbunWr9ZrHHntMy8zM1ObNm6etXbtWu+iii7TevXtr5eXlUT331uaRRx7RcnJytA8//FDbsWOH9p///EdLS0vTnnrqKes1vNZN9/HHH2v33HOP9u6770rkp82dOzfg+VCu7XnnnacNHz5cW758ufbFF19o/fr106666iqtuRio1HDSSSdp06ZNs772er1abm6uNnPmzKieV1uTn5+v/sewZMkS9XVBQYGWmJio/vIx/fDDD+o1y5Yti+KZtl7FxcVa//79tUWLFmmnn366FajwWofPXXfdpY0fP77O530+n9a5c2ftT3/6k/WYXH+Xy6W9+eabLXSWbcMFF1ygXX/99QGPXXLJJdqUKVPUMa91+NQMVEK5tt9//736vpUrV1qvmT9/vmaz2bS9e/c263y49OOnsrISq1evVikt//2E5Otly5ZF9dzamsLCQnXfrl07dS/X3ePxBFz7gQMHokePHrz2TSRLOxdccEHANRW81uHz/vvvY9SoUbj88svVkubIkSPx4osvWs/v2LEDBw4cCLjWsr+JLCnzWjfOKaecgk8++QSbN29WX69duxZffvklJk6cqL7mtY6cUK6t3Mtyj/zvwSSvl9+h33zzTbM+v1VvShhuhw8fVuugnTp1Cnhcvv7xxx+jdl5tjex6LfUS48aNw9ChQ9Vj8j8Cp9Op/kOvee3lOWqcOXPm4Ntvv8XKlStrPcdrHT7bt2/HrFmzMH36dPzf//2fut6/+c1v1PWdOnWqdT2D/Z3Ca904d999t9q5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",
"text/plain": [
""
]
@@ -180,8 +229,13 @@
}
],
"source": [
- "# Plot the losses\n",
- "ts, losses = make_and_train_model(result[0], result[1], 100)\n",
+ "# Plot the losses for the best found hyperparameters\n",
+ "ts, losses = make_and_train_model(\n",
+ " float(best_params[\"learning_rate\"].squeeze()),\n",
+ " float(best_params[\"final_lr_pct\"].squeeze()),\n",
+ " 0.0001,\n",
+ " 100,\n",
+ ")\n",
"plt.plot(losses[0], label=\"train\")\n",
"plt.plot(losses[1], label=\"test\")\n",
"plt.xlabel(\"Epoch\")\n",
@@ -207,45 +261,66 @@
{
"cell_type": "code",
"execution_count": 6,
- "metadata": {},
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-03-18T18:22:31.991276Z",
+ "iopub.status.busy": "2026-03-18T18:22:31.991194Z",
+ "iopub.status.idle": "2026-03-18T18:23:56.051016Z",
+ "shell.execute_reply": "2026-03-18T18:23:56.050703Z"
+ }
+ },
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Optimal result: [2.169385e-05 7.437738e-01]\n",
- "Time taken: 6.57 seconds to sweep 100 configs\n",
- "Optimal loss: 0.17412743\n"
+ "Optimal params: {'final_lr_pct': Array([0.87776613], dtype=float32), 'learning_rate': Array([0.08486073], dtype=float32), 'weight_decay': Array([0.00016588], dtype=float32)}\n",
+ "Time taken: 109.48 seconds for 100 configs\n",
+ "Optimal loss: 0.1738288849592209\n"
]
}
],
"source": [
- "# Huge search space\n",
+ "# Huge search space β Bayesian search finds good regions faster than random\n",
"search_space = {\n",
- " \"learning_rate\": LogSpace(1e-6, 1e-1, 1000),\n",
- " \"final_lr_pct\": LinearSpace(0.01, 0.99, 1000),\n",
+ " \"learning_rate\": LogSpace(1e-6, 1e-1),\n",
+ " \"final_lr_pct\": LinearSpace(0.01, 0.99),\n",
+ " \"weight_decay\": LogSpace(1e-6, 1e-1),\n",
"}\n",
"n_iterations = 100\n",
"\n",
- "search = BayesianOptimizer(search_space, wrapper)\n",
+ "key, subkey = jax.random.split(key)\n",
+ "state, optimizer = BayesianSearch.init(search_space, n_max=n_iterations)\n",
"\n",
"start = time.time()\n",
- "result = search.optimize(n_iterations, n_vmap=10, jit=True, maximize=False)\n",
+ "state, (params_hist, results_hist) = optimizer.optimize(\n",
+ " state, subkey, wrapper\n",
+ ")\n",
"end = time.time()\n",
"\n",
- "print(\"Optimal result:\", result)\n",
- "print(f\"Time taken: {end - start:.2f} seconds to sweep {n_iterations} configs\")\n",
- "print(\"Optimal loss:\", wrapper(result[0], result[1]))"
+ "best_idx = int(jnp.argmax(jnp.array([float(r.squeeze()) for r in results_hist])))\n",
+ "best_params = params_hist[best_idx]\n",
+ "\n",
+ "print(\"Optimal params:\", best_params)\n",
+ "print(f\"Time taken: {end - start:.2f} seconds for {n_iterations} configs\")\n",
+ "print(\"Optimal loss:\", -float(results_hist[best_idx].squeeze()))\n"
]
},
{
"cell_type": "code",
"execution_count": 7,
- "metadata": {},
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-03-18T18:23:56.053475Z",
+ "iopub.status.busy": "2026-03-18T18:23:56.053317Z",
+ "iopub.status.idle": "2026-03-18T18:23:56.235225Z",
+ "shell.execute_reply": "2026-03-18T18:23:56.234930Z"
+ }
+ },
"outputs": [
{
"data": {
- "image/png": "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",
+ "image/png": "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i8Ojjz6qzim4eKxDh8c6dHisQ4fHunYfazZBExERUZ3DChARERHVOQxAREREVOcwABEREVGdwwBEREREdQ4DUAhNmTIFLVu2RHx8PPr164dly5aF+yNFvUmTJqFv375q1e709HRcfPHF2LRpk9djTpw4gfHjx6Nx48aoV68eLr30Uhw8eDBsn7m2ePrpp9VK6Xfffbd1G4914Pz222+49tpr1bFMSEhAt27dsGLFCut+mb/yyCOPIDMzU90/fPhwbNmyJayfORq5XC48/PDDaNWqlTqObdq0wRNPPOG1lxSP9alZsGABRo8erVZllr8rZs2a5XV/dY7r0aNHcc0116jFERs0aICbb74Z+fn5CAQGoBD58MMPcc8996hpfqtWrUKPHj0wcuRIHDp0KNwfLarNnz9f/cJdsmQJ5syZg9LSUowYMQIFBQXWY/7617/if//7H2bOnKkeL9ucXHLJJWH93NFu+fLleP3119G9e3ev23msA+PYsWMYOHAgYmJi8PXXX+OXX37B888/j4YNG1qPefbZZ/HKK6/gtddew9KlS5GUlKT+TpEQStX3zDPPYOrUqZg8eTI2btyorsuxffXVV63H8FifGvl7WH7XyT/+/anOcZXws2HDBvX3+xdffKFC1W233YaAkGnwFHxnnXWWNn78eOu6y+XSsrKytEmTJoX1c9U2hw4dkn+2afPnz1fXjx8/rsXExGgzZ860HrNx40b1mMWLF4fxk0avvLw8rV27dtqcOXO0wYMHa3fddZe6ncc6cO677z5t0KBBld7vdru1jIwM7bnnnrNuk+MfFxenffDBByH6lLXDhRdeqN10001et11yySXaNddcoy7zWAeG/D3w6aefWterc1x/+eUX9bzly5dbj/n66681m82m/fbbb6f9mVgBCoGSkhKsXLlSlfc89xuT64sXLw7rZ6ttcnJy1HmjRo3UuRx3qQp5HvuOHTuiefPmPPanSCpuF154odcxFTzWgfP555+jT58+uPzyy9XQbq9evfDmm29a9+/YsQMHDhzwOtay/5EMrfNY18yAAQPw3XffYfPmzer6mjVrsHDhQowaNUpd57EOjuocVzmXYS/5b8Ekj5ffn1IxOl3cDDUEDh8+rMaZmzRp4nW7XP/111/D9rlqG7fbrfpRZOiga9eu6jb5Dyw2Nlb9R+R77OU+qpkZM2aoIVwZAvPFYx0427dvV8MyMmz+wAMPqOP9l7/8RR3fcePGWcfT398pPNY1c//996udyCWsOxwO9Xf1k08+qYZeBI91cFTnuMq5/APAk9PpVP/ADcSxZwCiWlWZWL9+vfrXGwXenj17cNddd6mxeGnkp+CGeflX71NPPaWuSwVI/mxLr4QEIAqcjz76CO+99x7ef/99dOnSBatXr1b/kJLGXR7r2o1DYCGQmpqq/mXhOxtGrmdkZITtc9Umd955p2qQ++GHH9C0aVPrdjm+MgR5/Phxr8fz2NecDHFJ0/6ZZ56p/hUmJ2l0liZGuSz/cuOxDgyZFdO5c2ev2zp16oTdu3ery+bx5N8pp+/ee+9VVaCrrrpKzbS77rrrVDO/zDAVPNbBUZ3jKue+E4XKysrUzLBAHHsGoBCQsnXv3r3VOLPnv/Dkev/+/cP62aKd9NZJ+Pn000/x/fffq6msnuS4y0waz2Mv0+TlFwmPfc0MGzYM69atU/9CNk9SpZChAvMyj3VgyDCu73IO0qPSokULdVn+nMsvAM9jLcM40hfBY10zhYWFqqfEk/yDVf6OFjzWwVGd4yrn8g8q+ceXSf6el5+N9AqdttNuo6ZqmTFjhupunz59uupsv+2227QGDRpoBw4cCPdHi2p/+tOftJSUFG3evHna/v37rVNhYaH1mNtvv11r3ry59v3332srVqzQ+vfvr050+jxngQke68BYtmyZ5nQ6tSeffFLbsmWL9t5772mJiYnaf/7zH+sxTz/9tPo75LPPPtPWrl2rjRkzRmvVqpVWVFQU1s8ebcaNG6edccYZ2hdffKHt2LFD++STT7TU1FTtb3/7m/UYHutTnzH6888/q5PEjRdeeEFd3rVrV7WP6/nnn6/16tVLW7p0qbZw4UI1A/Xqq6/WAoEBKIReffVV9cshNjZWTYtfsmRJuD9S1JP/qPyd3n77besx8h/THXfcoTVs2FD9Ehk7dqwKSRT4AMRjHTj/+9//tK5du6p/OHXs2FF74403vO6XacQPP/yw1qRJE/WYYcOGaZs2bQrb541Wubm56s+w/N0cHx+vtW7dWnvwwQe14uJi6zE81qfmhx9+8Pv3s4TO6h7XI0eOqMBTr149LTk5WbvxxhtVsAoEm/y/068jEREREUUP9gARERFRncMARERERHUOAxARERHVOQxAREREVOcwABEREVGdwwBEREREdQ4DEBEREdU5DEBERERU5zAAERFVg81mw6xZs8L9MYgoQBiAiCji3XDDDSqA+J7OP//8cH80IopSznB/ACKi6pCw8/bbb3vdFhcXF7bPQ0TRjRUgIooKEnYyMjK8Tg0bNlT3STVo6tSpGDVqFBISEtC6dWt8/PHHXs9ft24dfve736n7GzdujNtuuw35+flej5k2bRq6dOmi3iszMxN33nmn1/2HDx/G2LFjkZiYiHbt2uHzzz8PwTcnomBgACKiWuHhhx/GpZdeijVr1uCaa67BVVddhY0bN6r7CgoKMHLkSBWYli9fjpkzZ2Lu3LleAUcC1Pjx41UwkrAk4aZt27Ze7/H3v/8dV1xxBdauXYsLLrhAvc/Ro0dD/l2JKAACsqc8EVEQjRs3TnM4HFpSUpLX6cknn1T3y19lt99+u9dz+vXrp/3pT39Sl9944w2tYcOGWn5+vnX/l19+qdntdu3AgQPqelZWlvbggw9W+hnkPR566CHruryW3Pb1118H/PsSUfCxB4iIosLQoUNVlcZTo0aNrMv9+/f3uk+ur169Wl2WSlCPHj2QlJRk3T9w4EC43W5s2rRJDaHt27cPw4YNq/IzdO/e3bosr5WcnIxDhw6d9ncjotBjACKiqCCBw3dIKlCkL6g6YmJivK5LcJIQRUTRhz1ARFQrLFmypML1Tp06qctyLr1B0gtk+umnn2C329GhQwfUr18fLVu2xHfffRfyz01E4cEKEBFFheLiYhw4cMDrNqfTidTUVHVZGpv79OmDQYMG4b333sOyZcvw1ltvqfukWfnRRx/FuHHj8NhjjyE7Oxt//vOfcd1116FJkybqMXL77bffjvT0dDWbLC8vT4UkeRwR1T4MQEQUFWbPnq2mpnuS6s2vv/5qzdCaMWMG7rjjDvW4Dz74AJ07d1b3ybT1b775BnfddRf69u2rrsuMsRdeeMF6LQlHJ06cwIsvvogJEyaoYHXZZZeF+FsSUajYpBM6ZO9GRBQE0ovz6aef4uKLLw73RyGiKMEeICIiIqpzGICIiIiozmEPEBFFPY7kE1FNsQJEREREdQ4DEBEREdU5DEBERERU5zAAERERUZ3DAERERER1DgMQERER1TkMQERERFTnMAARERER6pr/D5XjYNXqsiU6AAAAAElFTkSuQmCC",
"text/plain": [
""
]
@@ -255,8 +330,13 @@
}
],
"source": [
- "# Plot the losses\n",
- "ts, losses = make_and_train_model(result[0], result[1], 100)\n",
+ "# Plot the losses for the best found hyperparameters\n",
+ "ts, losses = make_and_train_model(\n",
+ " float(best_params[\"learning_rate\"].squeeze()),\n",
+ " float(best_params[\"final_lr_pct\"].squeeze()),\n",
+ " float(best_params[\"weight_decay\"].squeeze()),\n",
+ " 100,\n",
+ ")\n",
"plt.plot(losses[0], label=\"train\")\n",
"plt.plot(losses[1], label=\"test\")\n",
"plt.xlabel(\"Epoch\")\n",
@@ -264,6 +344,13 @@
"plt.legend()\n",
"plt.show()"
]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
}
],
"metadata": {
diff --git a/notebooks/visualization.ipynb b/notebooks/visualization.ipynb
index b972ff1..5632254 100644
--- a/notebooks/visualization.ipynb
+++ b/notebooks/visualization.ipynb
@@ -10,34 +10,59 @@
{
"cell_type": "code",
"execution_count": 1,
- "metadata": {},
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-03-18T18:24:08.038708Z",
+ "iopub.status.busy": "2026-03-18T18:24:08.038200Z",
+ "iopub.status.idle": "2026-03-18T18:24:10.240626Z",
+ "shell.execute_reply": "2026-03-18T18:24:10.240235Z"
+ }
+ },
"outputs": [],
"source": [
+ "import jax\n",
"import jax.numpy as jnp\n",
"import matplotlib.animation as animation\n",
"import matplotlib.pyplot as plt\n",
+ "import numpy as np\n",
"from tqdm import tqdm\n",
"\n",
- "from hyperoptax.acquisition import EI, UCB\n",
- "from hyperoptax.bayesian import BayesianOptimizer\n",
+ "from hyperoptax.acquisition import EI\n",
+ "from hyperoptax.bayesian import BayesianSearch\n",
"from hyperoptax.kernels import Matern\n",
- "from hyperoptax.spaces import LinearSpace"
+ "from hyperoptax.spaces import LinearSpace\n",
+ "\n",
+ "key = jax.random.PRNGKey(0)"
]
},
{
"cell_type": "code",
"execution_count": 2,
- "metadata": {},
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-03-18T18:24:10.242632Z",
+ "iopub.status.busy": "2026-03-18T18:24:10.242436Z",
+ "iopub.status.idle": "2026-03-18T18:24:10.244633Z",
+ "shell.execute_reply": "2026-03-18T18:24:10.244360Z"
+ }
+ },
"outputs": [],
"source": [
"def f(x, y):\n",
- " return jnp.cos(2 * jnp.pi * x) + jnp.cos(2 * jnp.pi * y) - 0.3 * x**2 - 0.3 * y**2\n"
+ " return jnp.cos(2 * jnp.pi * x) + jnp.cos(2 * jnp.pi * y) - 0.3 * x**2 - 0.3 * y**2"
]
},
{
"cell_type": "code",
"execution_count": 3,
- "metadata": {},
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-03-18T18:24:10.245954Z",
+ "iopub.status.busy": "2026-03-18T18:24:10.245844Z",
+ "iopub.status.idle": "2026-03-18T18:24:10.437820Z",
+ "shell.execute_reply": "2026-03-18T18:24:10.437534Z"
+ }
+ },
"outputs": [
{
"data": {
@@ -67,7 +92,14 @@
{
"cell_type": "code",
"execution_count": 4,
- "metadata": {},
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-03-18T18:24:10.454463Z",
+ "iopub.status.busy": "2026-03-18T18:24:10.454320Z",
+ "iopub.status.idle": "2026-03-18T18:24:10.787877Z",
+ "shell.execute_reply": "2026-03-18T18:24:10.787504Z"
+ }
+ },
"outputs": [
{
"data": {
@@ -92,33 +124,43 @@
{
"cell_type": "code",
"execution_count": 5,
- "metadata": {},
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-03-18T18:24:10.789257Z",
+ "iopub.status.busy": "2026-03-18T18:24:10.789158Z",
+ "iopub.status.idle": "2026-03-18T18:25:04.264055Z",
+ "shell.execute_reply": "2026-03-18T18:25:04.263614Z"
+ }
+ },
"outputs": [],
"source": [
- "# set up stuff\n",
- "hoptax_bounds = {\"x\": LinearSpace(-3, 3, 100), \"y\": LinearSpace(-3, 3, 100)}\n",
- "acqui = EI(xi=0.01, stochastic_multiplier=30)\n",
- "acqui = UCB(kappa=3.0, stochastic_multiplier=30)\n",
+ "N_MAX = 100 # 1000 β 100: Cholesky is O(nΒ³), this alone is ~1000Γ faster on late iters\n",
+ "N_PARALLEL = 5 # batch size: showcases parallelism, keeps Kriging Believer cost low\n",
"\n",
- "optim = BayesianOptimizer(\n",
+ "hoptax_bounds = {\"x\": LinearSpace(-3, 3), \"y\": LinearSpace(-3, 3)}\n",
+ "state, optimizer = BayesianSearch.init(\n",
" hoptax_bounds,\n",
- " f=f,\n",
- " jitter=1e-5,\n",
- " acquisition=acqui,\n",
- " kernel=Matern(nu=1.5, length_scale=0.5),\n",
+ " n_max=N_MAX,\n",
+ " n_parallel=N_PARALLEL,\n",
+ " kernel=Matern(length_scale=0.1, nu=2.5),\n",
+ " acquisition=EI(xi=0.01),\n",
")\n",
- "n_iterations = 200\n",
- "n_vmap = 10\n",
- "# run\n",
- "results = optim.optimize(n_iterations=n_iterations, n_vmap=n_vmap, jit=True)\n",
+ "wrapper = lambda key, config: f(config[\"x\"], config[\"y\"])\n",
"\n",
- "x_seen, y_seen = optim.results"
+ "state, (params_hist, results_hist) = optimizer.optimize(state, key, wrapper)"
]
},
{
"cell_type": "code",
"execution_count": 6,
- "metadata": {},
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-03-18T18:25:04.267039Z",
+ "iopub.status.busy": "2026-03-18T18:25:04.266768Z",
+ "iopub.status.idle": "2026-03-18T18:25:08.360425Z",
+ "shell.execute_reply": "2026-03-18T18:25:08.360084Z"
+ }
+ },
"outputs": [],
"source": [
"X = jnp.linspace(-3, 3, 100)\n",
@@ -127,150 +169,123 @@
"# Create regular grid\n",
"xi, yi = jnp.meshgrid(X, Y)\n",
"fxy = f(xi, yi)\n",
+ "X_grid = jnp.stack([xi.ravel(), yi.ravel()], axis=-1) # (10000, 2)\n",
"\n",
"means = []\n",
"stds = []\n",
"acquisitions = []\n",
"candidates = []\n",
"\n",
- "for i in range(n_vmap, n_iterations, n_vmap):\n",
- " x, y = x_seen[:i], y_seen[:i]\n",
- " mean, std = optim.fit_gp(x, y)\n",
- " acquisition = acqui(mean, std)\n",
- " candidate = x_seen[i : i + n_vmap]\n",
+ "# Replay the optimization history to collect GP predictions at each step.\n",
+ "# optimizer.optimize() doesn't expose intermediate states, so we rebuild them\n",
+ "# incrementally from params_hist / results_hist.\n",
+ "tmp_state, _ = BayesianSearch.init(hoptax_bounds, n_max=N_MAX)\n",
+ "\n",
+ "for p, r in zip(params_hist, results_hist):\n",
+ " # Reconstruct the raw (n_parallel, n_params) array from the param dict\n",
+ " x_new = jnp.stack([p[\"x\"], p[\"y\"]], axis=-1) # (N_PARALLEL, 2)\n",
+ " tmp_state = optimizer.update_state(tmp_state, key, r, x_new)\n",
"\n",
- " means.append(mean)\n",
- " stds.append(std)\n",
- " acquisitions.append(acquisition)\n",
- " candidates.append(candidate)\n"
+ " if int(tmp_state.mask.sum()) >= 2:\n",
+ " length_scale = jnp.exp(tmp_state.log_length_scale)\n",
+ " eff_y = optimizer._effective_y(tmp_state)\n",
+ " mean, std = optimizer._gp_posterior(\n",
+ " tmp_state.X, eff_y, tmp_state.mask, X_grid, length_scale\n",
+ " )\n",
+ " y_max = jnp.max(eff_y, where=tmp_state.mask, initial=-jnp.inf)\n",
+ " acq = optimizer.acquisition(mean, std, y_max=y_max)\n",
+ " means.append(mean)\n",
+ " stds.append(std)\n",
+ " acquisitions.append(acq)\n",
+ " candidates.append(x_new) # (N_PARALLEL, 2)"
]
},
{
"cell_type": "code",
"execution_count": 7,
- "metadata": {},
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2026-03-18T18:25:08.361949Z",
+ "iopub.status.busy": "2026-03-18T18:25:08.361859Z",
+ "iopub.status.idle": "2026-03-18T18:25:12.353173Z",
+ "shell.execute_reply": "2026-03-18T18:25:12.352874Z"
+ }
+ },
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Creating 19 frames...\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "100%|ββββββββββ| 19/19 [00:05<00:00, 3.58it/s]\n"
+ "Rendering 20 frames (100 evaluations)...\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Animation saved as 'gp_animation.gif'\n"
+ "Saved gp_animation.gif\n"
]
}
],
"source": [
- "fig, axs = plt.subplots(2, 2, figsize=(12, 10), sharex=True, sharey=True)\n",
- "min_means = jnp.min(jnp.array(means))\n",
- "max_means = jnp.max(jnp.array(means))\n",
- "min_stds = jnp.min(jnp.array(stds))\n",
- "max_stds = jnp.max(jnp.array(stds))\n",
- "min_acq = jnp.min(jnp.array(acquisitions))\n",
- "max_acq = jnp.max(jnp.array(acquisitions))\n",
+ "from matplotlib.colors import LogNorm\n",
"\n",
- "# Set up titles\n",
- "axs[0, 0].set_title(\"f(x, y)\")\n",
- "axs[0, 1].set_title(\"Mean\")\n",
- "axs[1, 0].set_title(\"Acquisition\")\n",
- "axs[1, 1].set_title(\"Standard Deviation\")\n",
+ "# Convert all JAX arrays to numpy once β contourf fails silently with JAX arrays\n",
+ "means_np = np.array(means) # (n_frames, 10000)\n",
+ "stds_np = np.array(stds) # (n_frames, 10000)\n",
+ "acqs_np = np.array(acquisitions) # (n_frames, 10000)\n",
+ "cands_np = np.array(candidates) # (n_frames, N_PARALLEL, 2)\n",
+ "xi_np = np.array(xi) # (100, 100)\n",
+ "yi_np = np.array(yi) # (100, 100)\n",
+ "fxy_np = np.array(fxy) # (100, 100)\n",
"\n",
- "# Turn off grid for all subplots\n",
- "for i in range(2):\n",
- " for j in range(2):\n",
- " axs[i, j].grid(False)\n",
+ "# Compute global norms once β same scale applied to every frame\n",
+ "min_means, max_means = means_np.min(), means_np.max()\n",
+ "min_stds, max_stds = stds_np.min(), stds_np.max()\n",
+ "acq_norm = LogNorm(vmin=np.clip(acqs_np, 1e-10, None).min(),\n",
+ " vmax=acqs_np.max())\n",
"\n",
- "writer = animation.PillowWriter(fps=1)\n",
- "writer.setup(fig, \"gp_animation.gif\", dpi=300)\n",
+ "fig, axs = plt.subplots(2, 2, figsize=(12, 10))\n",
+ "XLIM, YLIM = (-3, 3), (-3, 3)\n",
"\n",
"\n",
- "def update_plot(frame):\n",
- " # Clear all axes except the true function\n",
- " for i in range(2):\n",
- " for j in range(2):\n",
- " if not (i == 0 and j == 0): # Don't clear the true function plot\n",
- " axs[i, j].clear()\n",
+ "def update(frame):\n",
+ " for ax in axs.flat:\n",
+ " ax.clear()\n",
+ " ax.grid(False)\n",
+ " ax.set_xlim(*XLIM)\n",
+ " ax.set_ylim(*YLIM)\n",
"\n",
- " # Plot true function (stays constant)\n",
- " axs[0, 0].contourf(xi, yi, fxy, levels=20)\n",
+ " axs[0, 0].contourf(xi_np, yi_np, fxy_np, levels=20)\n",
" axs[0, 0].set_title(\"f(x, y)\")\n",
"\n",
- " # Plot mean\n",
- " axs[0, 1].contourf(\n",
- " xi,\n",
- " yi,\n",
- " means[frame].reshape(100, 100),\n",
- " levels=20,\n",
- " vmin=min_means,\n",
- " vmax=max_means,\n",
- " )\n",
- " axs[0, 1].set_title(\"Mean\")\n",
+ " axs[0, 1].contourf(xi_np, yi_np, means_np[frame].reshape(100, 100),\n",
+ " levels=20, vmin=min_means, vmax=max_means)\n",
+ " axs[0, 1].set_title(\"GP Mean\")\n",
"\n",
- " # Plot acquisition function with sampled points\n",
- " axs[1, 0].contourf(\n",
- " xi,\n",
- " yi,\n",
- " acquisitions[frame].reshape(100, 100),\n",
- " levels=20,\n",
- " vmin=min_acq,\n",
- " vmax=max_acq,\n",
- " )\n",
- " axs[1, 0].plot(candidates[frame][:, 0], candidates[frame][:, 1], \"r.\", alpha=0.5)\n",
+ " axs[1, 0].contourf(xi_np, yi_np, np.clip(acqs_np[frame], 1e-10, None).reshape(100, 100),\n",
+ " levels=20, norm=acq_norm)\n",
+ " axs[1, 0].plot(cands_np[frame, :, 0], cands_np[frame, :, 1], \"r.\", alpha=0.7, ms=4)\n",
+ " axs[1, 0].set_title(\"Acquisition (EI)\")\n",
"\n",
- " axs[1, 0].set_title(\"Acquisition Function\")\n",
- " axs[1, 0].set_xlim(-3, 3)\n",
- " axs[1, 0].set_ylim(-3, 3)\n",
+ " axs[1, 1].contourf(xi_np, yi_np, stds_np[frame].reshape(100, 100),\n",
+ " levels=20, vmin=min_stds, vmax=max_stds)\n",
+ " axs[1, 1].set_title(\"GP Std Dev\")\n",
"\n",
- " # Plot standard deviation with sampled points\n",
- " axs[1, 1].contourf(\n",
- " xi, yi, stds[frame].reshape(100, 100), levels=20, vmin=min_stds, vmax=max_stds\n",
+ " fig.suptitle(\n",
+ " f\"Bayesian Optimization β {(frame + 1) * N_PARALLEL} evaluations \"\n",
+ " f\"(batch={N_PARALLEL}, step {frame + 1})\"\n",
" )\n",
- " axs[1, 1].set_title(\"Standard Deviation\")\n",
- " axs[1, 1].set_xlim(-3, 3)\n",
- " axs[1, 1].set_ylim(-3, 3)\n",
- "\n",
- " # Turn off grid for all subplots\n",
- " for i in range(2):\n",
- " for j in range(2):\n",
- " axs[i, j].grid(False)\n",
- "\n",
- " # Add overall title\n",
- " fig.suptitle(f\"Bayesian Optimization - Iteration {frame * n_vmap + n_vmap}\")\n",
" plt.tight_layout()\n",
"\n",
"\n",
- "# Create animation frames\n",
- "n_frames = len(means)\n",
- "print(f\"Creating {n_frames} frames...\")\n",
- "\n",
- "for frame in tqdm(range(n_frames)):\n",
- " update_plot(frame)\n",
- " writer.grab_frame()\n",
- "\n",
- "# Finish and clean up\n",
- "writer.finish()\n",
+ "n_frames = len(means_np)\n",
+ "print(f\"Rendering {n_frames} frames ({n_frames * N_PARALLEL} evaluations)...\")\n",
+ "anim = animation.FuncAnimation(fig, update, frames=n_frames, blit=False)\n",
+ "anim.save(\"gp_animation.gif\", writer=animation.PillowWriter(fps=2), dpi=80)\n",
"plt.close(fig)\n",
- "print(\"Animation saved as 'gp_animation.gif'\")"
+ "print(\"Saved gp_animation.gif\")"
]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
}
],
"metadata": {
diff --git a/pyproject.toml b/pyproject.toml
index b9c4829..2818b9a 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -4,7 +4,7 @@ version = "0.1.6"
description = "Tuning hyperparameters with JAX"
readme = "README.md"
requires-python = ">=3.10"
-dependencies = ["jax>=0.4.38"]
+dependencies = ["jax>=0.4.38", "flax", "optax"]
license = "Apache-2.0"
authors = [{name = "Theo Wolf"}]
diff --git a/src/hyperoptax/__init__.py b/src/hyperoptax/__init__.py
index e69de29..1fefd23 100644
--- a/src/hyperoptax/__init__.py
+++ b/src/hyperoptax/__init__.py
@@ -0,0 +1,52 @@
+# Optimizers
+# Acquisition functions
+from hyperoptax.acquisition import (
+ EI,
+ PI,
+ UCB,
+ BaseHallucination,
+ ConstantHallucination,
+ MeanHallucination,
+ SampleHallucination,
+ UCBHallucination,
+)
+from hyperoptax.bayesian import BayesianSearch
+from hyperoptax.grid import GridSearch
+
+# Kernels
+from hyperoptax.kernels import RBF, Matern
+from hyperoptax.random import RandomSearch
+
+# Search spaces
+from hyperoptax.spaces import (
+ DiscreteSpace,
+ LinearSpace,
+ LogSpace,
+ QLinearSpace,
+ QLogSpace,
+)
+
+__all__ = [
+ # Optimizers
+ "BayesianSearch",
+ "GridSearch",
+ "RandomSearch",
+ # Spaces
+ "DiscreteSpace",
+ "LinearSpace",
+ "LogSpace",
+ "QLinearSpace",
+ "QLogSpace",
+ # Acquisition functions
+ "EI",
+ "PI",
+ "UCB",
+ "BaseHallucination",
+ "MeanHallucination",
+ "SampleHallucination",
+ "UCBHallucination",
+ "ConstantHallucination",
+ # Kernels
+ "Matern",
+ "RBF",
+]
diff --git a/src/hyperoptax/acquisition.py b/src/hyperoptax/acquisition.py
index de88185..f1834d2 100644
--- a/src/hyperoptax/acquisition.py
+++ b/src/hyperoptax/acquisition.py
@@ -4,151 +4,124 @@
class BaseAcquisition:
- """
- Base class for acquisition functions.
-
- Args:
- stochastic_multiplier: The number of points to sample
- randomly to avoid selecting points that are very close to each other.
- """
+ """Base class for acquisition functions."""
- def __init__(self, stochastic_multiplier: int = 1):
- self.stochastic_multiplier = stochastic_multiplier
-
- def __call__(self, mean: jax.Array, std: jax.Array):
+ def __call__(self, mean: jax.Array, std: jax.Array, y_max=None):
"""
Compute the acquisition value for a given mean and standard deviation.
Args:
mean (N,): The mean of the Gaussian process.
std (N,): The standard deviation of the Gaussian process.
+ y_max: Optional pre-computed reference value (e.g. best observed mean).
+ Used by EI/PI to ensure consistency when evaluating a single point.
Returns:
(N,): The acquisition value for the given mean and standard deviation.
"""
raise NotImplementedError
- def sort_acq_vals(self, mean: jax.Array, std: jax.Array, seen_idx: jax.Array):
- """
- Sort the acquisition values for a given mean and standard deviation.
-
- Args:
- mean (N,): The mean of the Gaussian process.
- std (N,): The standard deviation of the Gaussian process.
- seen_idx (M,): The indices of the points that have already been evaluated.
+ @staticmethod
+ def _resolve_y_max(mean: jax.Array, y_max) -> jax.Array:
+ """Return y_max if provided, else fall back to max(mean).
- Returns:
- (N,): The indices of the points sorted by acquisition value.
+ Note: the fallback is only appropriate for standalone/exploratory use.
+ Always pass y_max explicitly when observed data is available.
"""
- # Acquisition values for all points
- acq_vals = self(mean, std) # shape (N,)
+ return jnp.max(mean) if y_max is None else y_max
- # Boolean mask of points that have already been evaluated.
- idxs = jnp.arange(acq_vals.shape[0])
- seen_mask = jnp.isin(idxs, seen_idx)
-
- # Replace acquisition values of seen points with -inf so they are never selected
+ def _sort_acq_vals(self, mean: jax.Array, std: jax.Array, seen_mask: jax.Array):
+ acq_vals = self(mean, std) # shape (N,)
masked_acq = jnp.where(seen_mask, -jnp.inf, acq_vals)
-
return jnp.argsort(masked_acq)
def get_argmax(
- self, mean: jax.Array, std: jax.Array, seen_idx: jax.Array, n_points: int = 1
+ self, mean: jax.Array, std: jax.Array, seen_mask: jax.Array, n_points: int = 1
):
- """
- Get the indices of the points with the highest acquisition values.
+ return self._sort_acq_vals(mean, std, seen_mask)[-n_points:]
- Args:
- mean (N,): The mean of the Gaussian process.
- std (N,): The standard deviation of the Gaussian process.
- seen_idx (M,): The indices of the points that have already been evaluated.
- n_points (int): The number of points to select.
- Returns:
- (n_points,): The indices of the points with the highest acquisition values.
- """
- return self.sort_acq_vals(mean, std, seen_idx)[-n_points:]
-
- def get_stochastic_argmax(
- self,
- mean: jax.Array,
- std: jax.Array,
- seen_idx: jax.Array,
- n_points: int,
- key: jax.random.PRNGKey,
- ):
- """
- Get a random sample of indices of points with high acquisition values.
- This is to avoid picking points that are very close to each other.
- When stochastic_multiplier is 1, this method is equivalent to get_argmax.
+class UCB(BaseAcquisition):
+ """Upper Confidence Bound acquisition function."""
- Args:
- mean (N,): The mean of the Gaussian process.
- std (N,): The standard deviation of the Gaussian process.
- seen_idx (M,): The indices of the points that have already been evaluated.
- n_points (int): The number of points to select.
- key (jax.random.PRNGKey): The random key to use for sampling.
+ def __init__(self, kappa: float = 2.0):
+ self.kappa = kappa
- Returns:
- (n_points,): A random sample of indices of points with high
- acquisition values.
+ def __call__(self, mean: jax.Array, std: jax.Array, y_max=None):
+ return mean + self.kappa * std
- """
- # We sample points randomly the top n_points * stochastic_multiplier
- # to avoid selecting points that are very close to each other.
- sample_idx = jax.random.choice(
- key,
- jnp.arange(n_points * self.stochastic_multiplier),
- (n_points,),
- replace=False,
- )
- return self.sort_acq_vals(mean, std, seen_idx)[::-1][sample_idx]
-
- def get_max(
- self, mean: jax.Array, std: jax.Array, X: jax.Array, seen_idx: jax.Array
- ):
- """
- Get the points with the highest acquisition values.
- Args:
- mean (N,): The mean of the Gaussian process.
- std (N,): The standard deviation of the Gaussian process.
- X (N, D): The points to evaluate.
- seen_idx (M,): The indices of the points that have already been evaluated.
+class EI(BaseAcquisition):
+ """Expected Improvement acquisition function."""
- Returns:
- (n_points, D): The points with the highest acquisition values.
- """
- return X[self.get_argmax(mean, std, seen_idx)]
+ def __init__(self, xi: float = 0.01):
+ self.xi = xi
+ def __call__(self, mean: jax.Array, std: jax.Array, y_max=None):
+ _y_max = self._resolve_y_max(mean, y_max)
+ a = mean - self.xi - _y_max
+ z = a / std
+ return a * norm.cdf(z) + std * norm.pdf(z)
-class UCB(BaseAcquisition):
- """
- Upper Confidence Bound acquisition function.
- """
- def __init__(self, kappa: float = 2.0, stochastic_multiplier: int = 2):
- super().__init__(stochastic_multiplier)
- self.kappa = kappa
+class PI(BaseAcquisition):
+ """Probability of Improvement acquisition function."""
- def __call__(self, mean: jax.Array, std: jax.Array):
- return mean + self.kappa * std
+ def __init__(self, xi: float = 0.01):
+ self.xi = xi
+ def __call__(self, mean: jax.Array, std: jax.Array, y_max=None):
+ _y_max = self._resolve_y_max(mean, y_max)
+ z = (mean - self.xi - _y_max) / std
+ return norm.cdf(z)
-class EI(BaseAcquisition):
+
+class BaseHallucination:
+ """Base class for Kriging Believer hallucination strategies.
+
+ Any callable with signature ``(mean, std, key, y_max) -> scalar`` can be
+ used as a hallucination strategy β subclassing is optional.
"""
- Expected Improvement acquisition function.
+
+
+class MeanHallucination(BaseHallucination):
+ """Classical Kriging Believer: hallucinate with GP posterior mean."""
+
+ def __call__(self, mean, std, key, y_max):
+ return mean[0]
+
+
+class SampleHallucination(BaseHallucination):
+ """Randomized Kriging Believer (RKB): hallucinate with a posterior sample.
+
+ arXiv 2603.01470.
"""
- def __init__(self, xi: float = 0.01, stochastic_multiplier: int = 2):
- super().__init__(stochastic_multiplier)
- self.xi = xi
+ def __call__(self, mean, std, key, y_max):
+ return mean[0] + std[0] * jax.random.normal(key)
- def __call__(self, mean: jax.Array, std: jax.Array):
- y_max = jnp.max(mean)
- a = mean - self.xi - y_max
- z = a / std
- return a * norm.cdf(z) + std * norm.pdf(z)
+class UCBHallucination(BaseHallucination):
+ """Optimistic hallucination: mean + kappa * std."""
+
+ def __init__(self, kappa: float = 2.0):
+ self.kappa = kappa
+
+ def __call__(self, mean, std, key, y_max):
+ return mean[0] + self.kappa * std[0]
+
+
+class ConstantHallucination(BaseHallucination):
+ """Ginsbourger et al. 2010: hallucinate with y_max or a fixed constant.
+
+ If value is None, uses the current best observed value (y_max).
+ Otherwise uses the fixed value regardless of observations.
+ """
+
+ def __init__(self, value: float | None = None):
+ self.value = value
-# TODO: ConstantLiar as detailed in https://hal.science/hal-00260579v1/document
+ def __call__(self, mean, std, key, y_max):
+ if self.value is None:
+ return y_max
+ return jnp.asarray(self.value, dtype=mean.dtype)
diff --git a/src/hyperoptax/base.py b/src/hyperoptax/base.py
index 2619d2c..91d3300 100644
--- a/src/hyperoptax/base.py
+++ b/src/hyperoptax/base.py
@@ -1,147 +1,162 @@
import inspect
-import logging
-from functools import partial
+import warnings
from typing import Callable
import jax
import jax.numpy as jnp
-import numpy as np
+from flax import struct
+
+
+def _validate_func(func):
+ try:
+ sig = inspect.signature(func)
+ positional = [
+ p
+ for p in sig.parameters.values()
+ if p.kind
+ in (
+ inspect.Parameter.POSITIONAL_ONLY,
+ inspect.Parameter.POSITIONAL_OR_KEYWORD,
+ )
+ ]
+ if len(positional) < 2:
+ raise TypeError(
+ f"func must have signature fn(key, config) β "
+ f"received a function with {len(positional)} positional parameter(s). "
+ "Did you forget the key argument?"
+ )
+ except (ValueError, TypeError) as e:
+ if "func must have" in str(e):
+ raise
+ warnings.warn(
+ "Can't introspect function signature - ensure that the "
+ "function has a signature fn(key, config)."
+ )
+ return
-logger = logging.getLogger(__name__)
+@struct.dataclass
+class OptimizerState:
+ """Base optimizer state β a Flax PyTree holding the search space definition."""
-# TODO: use existing results if they exist
-# TODO: add support for keys
-# TODO: implement callback/wandb logging
-class BaseOptimizer:
- """
- Base class for optimizers/grid search.
+ space: struct.PyTreeNode
- Args:
- domain (dict[str, jax.Array]): The domain of the optimizer.
- f (Callable): The function to optimize.
- callback (Callable): A callback function to call after each iteration.
- """
- def __init__(
- self,
- domain: dict[str, jax.Array],
- f: Callable,
- callback: Callable = lambda x: None,
- ):
- self.f = f
- self.callback = callback
- self.results = None
-
- n_args = len(inspect.signature(f).parameters)
- n_points = np.prod([len(domain[k]) for k in domain])
- if n_points > 1e6:
- # TODO: what do if the matrix is too large?
- logger.warning(
- f"Creating a {n_points}x{n_args} grid, this may be too large!"
- )
+class Optimizer:
+ n_parallel: int = 1
- assert n_args == len(domain), (
- f"Function must have the same number of arguments as the domain, "
- f"got {n_args} arguments and {len(domain)} domains."
- )
- # we make a grid of all the points in the domain
- # in future versions we want to sample points from the domain
- grid = jnp.array(jnp.meshgrid(*[space.array for space in domain.values()]))
- self.domain = grid.reshape(n_args, n_points).T
+ @classmethod
+ def init(cls, space, **kwargs) -> OptimizerState:
+ return OptimizerState(space=space), cls()
def optimize(
self,
- n_iterations: int = -1,
- n_vmap: int = 1,
- n_pmap: int = 1,
- maximize: bool = True,
- jit: bool = False,
- key: jax.random.PRNGKey = jax.random.PRNGKey(0),
- ):
+ state: OptimizerState,
+ key: jax.Array, # () PRNG key
+ func: Callable, # (key, config) -> () scalar result
+ n_iterations: int,
+ ) -> tuple[OptimizerState, tuple[struct.PyTreeNode, jax.Array]]:
"""
- Optimize the function.
- Note: pmap doesn't work as expected for the Bayesian optimizer... yet.
-
- Args:
- n_iterations (int): The number of iterations to run.
- n_vmap (int): The number of points to evaluate in parallel on the
- same device.
- n_pmap (int): The number of points to evaluate in parallel on different
- devices.
- maximize (bool): Whether to maximize or minimize the function.
- jit (bool): Whether to jit the function.
- key (jax.random.PRNGKey): The random key to use for sampling.
+ High Level API for optimizing a function over a space.
+ Not recommended if you want to do fancy things
+ with parallel computation.
+ ``func`` must return a scalar (``()`` shape). If your function returns
+ shape ``(1,)``, call ``.squeeze()`` inside ``func`` before returning.
"""
- if n_iterations == -1:
- n_iterations = self.domain.shape[0]
-
- if maximize:
- self.map_f = jax.vmap(self.f, in_axes=(0,) * self.domain.shape[1])
- else:
- self.map_f = jax.vmap(
- lambda *args: -self.f(*args), in_axes=(0,) * self.domain.shape[1]
- )
-
- if n_pmap > 1:
- assert n_iterations % n_pmap == 0, (
- "n_iterations must be divisible by n_pmap"
- )
- assert n_pmap == jax.local_device_count(), (
- "n_pmap must be equal to the number of devices"
- )
- # TODO: fix this for the bayesian optimizer
- domains = jnp.array(jnp.array_split(self.domain[:n_iterations], n_pmap))
- n_iterations = n_iterations // n_pmap
- X_seen, y_seen = jax.pmap(
- partial(self.search, n_iterations=n_iterations, n_vmap=n_vmap, key=key),
- )(domain=domains)
-
- # mostly for debugging purposes
- elif jit:
- X_seen, y_seen = jax.jit(self.search, static_argnums=(0, 1))(
- n_iterations, n_vmap, key
- )
- else:
- X_seen, y_seen = self.search(n_iterations, n_vmap, key)
-
- max_idxs = jnp.where(y_seen == y_seen.max())
-
- if not maximize:
- y_seen = -y_seen
-
- self.results = (X_seen, y_seen)
+ _validate_func(func)
+ params_hist, results_hist = [], []
+ params, results = None, None
+ for _ in range(n_iterations):
+ key, key_get, key_funcs, key_update = jax.random.split(key, 4)
+ params = self.get_next_params(state, key_get, params, results)
+ # params: pytree, each leaf shape (n_parallel, ...)
+ # func_keys: (n_parallel, 2)
+ # batch_results: (n_parallel,)
+ func_keys = jax.random.split(key_funcs, self.n_parallel)
+ batch_results = jax.vmap(func)(func_keys, params) # (n_parallel,)
+ state = self.update_state(state, key_update, batch_results, params)
+ params_hist.append(params)
+ results_hist.append(batch_results)
+ return state, (params_hist, results_hist)
+
+ def optimize_scan(
+ self,
+ state: OptimizerState,
+ key: jax.Array, # () PRNG key
+ func: Callable, # (key, config) -> () scalar result
+ n_iterations: int,
+ ) -> tuple[OptimizerState, tuple[struct.PyTreeNode, jax.Array]]:
+ """
+ Like optimize, but uses jax.lax.scan for the inner loop.
- return X_seen[max_idxs].squeeze()
+ Requires func to be JAX-traceable (jit-compilable). Returns stacked
+ arrays instead of lists: params_hist is a pytree where each leaf has
+ shape (n_iterations, n_parallel, ...), and results_hist has shape
+ (n_iterations, n_parallel).
- def search(self, n_iterations: int, n_parallel: int, key: jax.random.PRNGKey):
- raise NotImplementedError
-
- @property
- def max(self) -> dict[str, jax.Array]:
+ ``func`` must return a scalar (``()`` shape). If your function returns
+ shape ``(1,)``, call ``.squeeze()`` inside ``func`` before returning.
"""
- Get the maximum value and parameters of the function.
+ _validate_func(func)
+ # Run one step outside scan to determine pytree structure and result shape.
+ key, key_get, key_funcs, key_update = jax.random.split(key, 4)
+ params0 = self.get_next_params(state, key_get, None, None)
+ # params0: pytree, each leaf shape (n_parallel, ...)
+ # results0: (n_parallel,)
+ func_keys0 = jax.random.split(key_funcs, self.n_parallel)
+ results0 = jax.vmap(func)(func_keys0, params0) # (n_parallel,)
+ state = self.update_state(state, key_update, results0, params0)
+ # Save step-0 outputs before scan overwrites these names via carry.
+ first_params, first_results = params0, results0
+
+ def step(carry, _):
+ state, key, params, results = carry
+ key, key_get, key_funcs, key_update = jax.random.split(key, 4)
+ params = self.get_next_params(state, key_get, params, results)
+ func_keys = jax.random.split(key_funcs, self.n_parallel)
+ batch_results = jax.vmap(func)(func_keys, params) # (n_parallel,)
+ state = self.update_state(state, key_update, batch_results, params)
+ return (state, key, params, batch_results), (params, batch_results)
+
+ (final_state, _, _, _), (params_hist, results_hist) = jax.lax.scan(
+ step,
+ (state, key, params0, results0),
+ None,
+ length=n_iterations - 1,
+ )
- Returns:
- dict[str, jax.Array]: A dictionary with the maximum value and parameters.
+ # Prepend step 0 so the output has n_iterations total entries.
+ params_hist = jax.tree.map(
+ lambda first, rest: jnp.concatenate([first[None], rest]),
+ first_params,
+ params_hist,
+ )
+ results_hist = jnp.concatenate([first_results[None], results_hist])
+ return final_state, (params_hist, results_hist)
+
+ def update_state(
+ self,
+ state: OptimizerState,
+ key: jax.random.PRNGKey,
+ results: jax.Array,
+ params: struct.PyTreeNode = None,
+ ) -> OptimizerState:
"""
- assert self.results is not None, "No results found, run optimize first."
- return {
- "target": self.results[1].max(),
- "params": self.results[0][self.results[1].argmax()].flatten(),
- }
-
- @property
- def min(self) -> dict[str, jax.Array]:
+ Updates the optimizer state based on the results of the function.
"""
- Get the minimum value and parameters of the function.
+ raise NotImplementedError
- Returns:
- dict[str, jax.Array]: A dictionary with the minimum value and parameters.
+ def get_next_params(
+ self,
+ state: OptimizerState,
+ key: jax.random.PRNGKey,
+ params: struct.PyTreeNode = None,
+ results: jax.Array = None,
+ ) -> struct.PyTreeNode:
+ """
+ Gets the next parameters to sample from the space.
+ Returns a batched pytree where every leaf has shape (n_parallel, ...).
+ params and results are the previous iteration's values (None on first call).
"""
- assert self.results is not None, "No results found, run optimize first."
- return {
- "target": self.results[1].min(),
- "params": self.results[0][self.results[1].argmin()].flatten(),
- }
+ raise NotImplementedError
diff --git a/src/hyperoptax/bayesian.py b/src/hyperoptax/bayesian.py
index 9497b2c..b192f7b 100644
--- a/src/hyperoptax/bayesian.py
+++ b/src/hyperoptax/bayesian.py
@@ -1,148 +1,453 @@
-import logging
-from typing import Callable, Optional
+import dataclasses
+import functools
import jax
import jax.numpy as jnp
-import jax.scipy as jsp
-
-from hyperoptax.acquisition import UCB, BaseAcquisition
-from hyperoptax.base import BaseOptimizer
-from hyperoptax.kernels import BaseKernel, Matern
-from hyperoptax.spaces import BaseSpace
-
-logger = logging.getLogger(__name__)
-
-
-class BayesianOptimizer(BaseOptimizer):
- def __init__(
- self,
- domain: dict[str, BaseSpace],
- f: Callable,
- kernel: Optional[BaseKernel] = None,
- acquisition: Optional[BaseAcquisition] = None,
- jitter: float = 1e-6,
- ):
- super().__init__(domain, f)
-
- self.kernel = kernel or Matern(length_scale=1.0, nu=2.5)
- self.acquisition = acquisition or UCB(kappa=2.0)
- self.jitter = jitter # has to be quite high to avoid numerical issues
-
- # TODO:for pmap, we should have a shared y_seen and X_seen array across GPUs.
- def search(
- self,
- n_iterations: int,
- n_vmap: int,
- key: jax.random.PRNGKey,
- domain: Optional[jax.Array] = None,
- ) -> tuple[jax.Array, jax.Array]:
- del domain # unused
- if n_iterations >= self.domain.shape[0]:
- logger.warning(
- f"n_iterations={n_iterations} is greater or equal to the number of "
- f"points in the domain={self.domain.shape[0]},"
- "this will result in a full grid search."
+import optax
+from flax import struct
+
+from hyperoptax import acquisition as acq
+from hyperoptax import base, kernels
+from hyperoptax import spaces as sp
+
+MASK_VARIANCE = 1e12 # large diagonal added to masked rows to isolate them from GP fit
+
+
+@struct.dataclass
+class BayesianSearchState(base.OptimizerState):
+ """State for :class:`BayesianSearch`.
+
+ All arrays are fixed-size (shape determined by ``n_max`` at init time) to
+ satisfy JAX's static-shape requirement. The ``mask`` field tracks which
+ entries have been written.
+
+ Attributes:
+ X: Observation inputs, shape ``(n_max, n_params)``, zero-padded.
+ y: Observed results, shape ``(n_max,)``, zero-padded, stored as raw
+ (un-negated) values regardless of ``maximize``.
+ mask: Boolean validity mask, shape ``(n_max,)``; ``True`` for slots
+ that contain real observations.
+ log_length_scale: Per-dimension ARD length scales in log space,
+ shape ``(n_params,)``. Tuned by Adam each iteration.
+ """
+
+ X: jax.Array # (n_max, n_params) padded with zeros
+ y: jax.Array # (n_max,) padded with zeros β raw (un-negated) results
+ mask: jax.Array # (n_max,) bool, True for valid entries
+ log_length_scale: jax.Array # (n_params,) per-dimension ARD length scales
+
+
+@dataclasses.dataclass
+class BayesianSearch(base.Optimizer):
+ """Bayesian optimisation with a Gaussian Process surrogate.
+
+ Uses a GP (MatΓ©rn 2.5 kernel by default) to model the objective and
+ selects the next batch of candidates by maximising an acquisition function
+ (EI by default). ARD length scales are tuned with Adam each iteration.
+ Parallel batches are generated via the Kriging Believer hallucination
+ strategy.
+
+ Attributes:
+ jitter: Small diagonal added to the kernel matrix for numerical
+ stability (default ``1e-6``).
+ kernel: Kernel function (default :class:`~hyperoptax.kernels.Matern`
+ with ``nu=2.5``).
+ acquisition: Acquisition function (default
+ :class:`~hyperoptax.acquisition.EI` with ``xi=0.01``).
+ n_candidates: Number of random candidates sampled per iteration for
+ the discrete pre-selection step (default ``1000``).
+ n_restarts: Number of L-BFGS restarts seeded from the top candidates
+ (default ``2``).
+ n_lbfgs_steps: Gradient steps per L-BFGS restart (default ``10``).
+ n_hparam_steps: Adam steps used to tune ``log_length_scale`` each
+ iteration (default ``20``). Set to ``0`` to disable.
+ n_warmup: Number of pure-random iterations before the GP is used
+ (default ``1``).
+ maximize: Set ``False`` to minimise the objective (default ``True``).
+ n_parallel: Number of parallel candidates per iteration (default ``1``).
+ hallucination: Hallucination strategy for Kriging Believer parallel
+ selection (default :class:`~hyperoptax.acquisition.MeanHallucination`).
+ """
+
+ jitter: float = 1e-6
+ kernel: kernels.BaseKernel = dataclasses.field(
+ default_factory=lambda: kernels.Matern(length_scale=1.0, nu=2.5)
+ )
+ acquisition: acq.BaseAcquisition = dataclasses.field(
+ default_factory=lambda: acq.EI(xi=0.01)
+ )
+ n_candidates: int = 1000 # random candidates sampled for continuous spaces
+ n_restarts: int = 2 # number of L-BFGS restarts (seeded from top candidates)
+ n_lbfgs_steps: int = 10 # gradient steps per restart
+ n_hparam_steps: int = 20 # Adam steps to tune log_length_scale each iteration
+ n_warmup: int = 1 # pure-random evaluations before GP kicks in
+ maximize: bool = True # set False to minimize the objective
+ n_parallel: int = 1
+ hallucination: acq.BaseHallucination = dataclasses.field(
+ default_factory=acq.MeanHallucination
+ )
+
+ @classmethod
+ def init(cls, space, n_max=200, **kwargs):
+ # Create the optimizer first so we can read kernel.length_scale for init.
+ optimizer = cls(**kwargs)
+ leaves = jax.tree.leaves(space, is_leaf=lambda x: isinstance(x, sp.Space))
+ state = BayesianSearchState(
+ space=space,
+ X=jnp.zeros((n_max, len(leaves))),
+ y=jnp.zeros(n_max),
+ mask=jnp.zeros(n_max, dtype=bool),
+ log_length_scale=jnp.log(
+ jnp.ones(len(leaves)) * float(optimizer.kernel.length_scale)
+ ),
+ )
+ return state, optimizer
+
+ # ------------------------------------------------------------------
+ # Convenience accessors
+ # ------------------------------------------------------------------
+
+ def best_result(self, state: BayesianSearchState) -> jax.Array:
+ """Return the best observed raw result (max if maximize, min if minimize)."""
+ if self.maximize:
+ return jnp.max(state.y, where=state.mask, initial=-jnp.inf)
+ else:
+ return jnp.min(state.y, where=state.mask, initial=jnp.inf)
+
+ def best_params(self, state: BayesianSearchState):
+ """Return the parameter pytree that achieved the best observed result."""
+ if self.maximize:
+ best_n = int(jnp.argmax(jnp.where(state.mask, state.y, -jnp.inf)))
+ else:
+ best_n = int(jnp.argmin(jnp.where(state.mask, state.y, jnp.inf)))
+ x_best = state.X[best_n]
+ _, treedef = jax.tree.flatten(
+ state.space, is_leaf=lambda x: isinstance(x, sp.Space)
+ )
+ # Return scalar leaves (shape ()) β one value per parameter.
+ return treedef.unflatten([x_best[i] for i in range(treedef.num_leaves)])
+
+ # ------------------------------------------------------------------
+ # Space helpers
+ # ------------------------------------------------------------------
+
+ def _sample_candidates(self, space, key, n):
+ """Sample n random candidates from a continuous space."""
+ leaves = jax.tree.leaves(space, is_leaf=lambda x: isinstance(x, sp.Space))
+ keys_per_leaf = jax.random.split(key, len(leaves))
+ cols = [
+ jax.vmap(lambda k: leaf.sample(k).squeeze())(
+ jax.random.split(keys_per_leaf[j], n)
)
+ for j, leaf in enumerate(leaves)
+ ]
+ return jnp.stack(cols, axis=-1) # (n, n_params)
+
+ def _space_bounds(self, space):
+ """Returns (lowers, uppers) arrays of shape (n_params,)."""
+ leaves = jax.tree.leaves(space, is_leaf=lambda x: isinstance(x, sp.Space))
+ lowers = jnp.array([leaf.lower_bound for leaf in leaves])
+ uppers = jnp.array([leaf.upper_bound for leaf in leaves])
+ return lowers, uppers
+
+ # ------------------------------------------------------------------
+ # GP helpers
+ # ------------------------------------------------------------------
+
+ def _effective_y(self, state: BayesianSearchState) -> jax.Array:
+ """y in 'higher is better' orientation for GP fitting."""
+ return state.y if self.maximize else -state.y
+
+ def _gp_fit(self, X, y, mask, length_scale):
+ """Fit the GP: return (L, alpha, ymean) for use in predictions."""
+ ymean = jnp.mean(y, where=mask)
+ y_centered = (y - ymean) * mask
+ K = self.kernel(X, X, length_scale=length_scale)
+ M = jnp.outer(mask.astype(float), mask.astype(float))
+ K = K * M + self.jitter * jnp.eye(X.shape[0])
+ K += jnp.diag((1.0 - mask.astype(float)) * MASK_VARIANCE)
+ L = jnp.linalg.cholesky(K)
+ alpha = jax.scipy.linalg.cho_solve((L, True), y_centered)
+ return L, alpha, ymean
+
+ def _gp_predict(self, X_test, L, alpha, ymean, X_train, length_scale):
+ """GP posterior mean and std at X_test given a fitted GP."""
+ K_star = self.kernel(X_test, X_train, length_scale=length_scale) # (m, n)
+ mean = K_star @ alpha + ymean
+ v = jax.scipy.linalg.cho_solve((L, True), K_star.T) # (n, m)
+ var = jnp.clip(1.0 - jnp.sum(K_star * v.T, axis=1), 0.0)
+ return mean, jnp.sqrt(var)
- # Number of batches we need to cover all requested iterations
- n_batches = (n_iterations + n_vmap - 1) // n_vmap
- n_batches -= 1 # because we do the first batch separately
- idx = jax.random.choice(
- key,
- jnp.arange(len(self.domain)),
- (n_vmap,),
+ def _gp_posterior(self, X, y, mask, X_test, length_scale):
+ """Convenience: fit + predict in one call."""
+ L, alpha, ymean = self._gp_fit(X, y, mask, length_scale)
+ return self._gp_predict(X_test, L, alpha, ymean, X, length_scale)
+
+ @functools.cached_property
+ def _tune_hparams_fn(self):
+ """JIT-compiled hparam tuner, built lazily on first use.
+
+ Accepts all varying data as explicit JAX arguments so the compiled
+ XLA program is reused across iterations regardless of how many
+ observations have accumulated (no recompilation per new n_seen).
+ """
+ n_steps = self.n_hparam_steps
+
+ @jax.jit
+ def tune(X, y, mask, log_length_scale):
+ def neg_log_ml(log_ls):
+ ls = jnp.exp(log_ls)
+ L, alpha, ymean = self._gp_fit(X, y, mask, ls)
+ y_c = (y - ymean) * mask
+ return 0.5 * y_c @ alpha + jnp.sum(jnp.log(jnp.diag(L)))
+
+ adam = optax.adam(0.1)
+ opt_state = adam.init(log_length_scale)
+
+ def step(carry, _):
+ log_ls, opt_state = carry
+ grad = jax.grad(neg_log_ml)(log_ls)
+ updates, new_opt_state = adam.update(grad, opt_state)
+ return (optax.apply_updates(log_ls, updates), new_opt_state), None
+
+ (log_ls, _), _ = jax.lax.scan(
+ step, (log_length_scale, opt_state), None, length=n_steps
+ )
+ return log_ls
+
+ return tune
+
+ def _tune_hparams(self, state: BayesianSearchState) -> jax.Array:
+ return self._tune_hparams_fn(
+ state.X, self._effective_y(state), state.mask, state.log_length_scale
+ )
+
+ # ------------------------------------------------------------------
+ # Parameter selection
+ # ------------------------------------------------------------------
+
+ def _random_select(self, state, key, X_cands):
+ """Randomly pick n_parallel candidates (used during warmup)."""
+ idxs = jax.random.choice(
+ key, self.n_candidates, (self.n_parallel,), replace=False
+ )
+ return X_cands[idxs] # (n_parallel, n_params)
+
+ def _gp_select(self, state, key, X_cands, lowers, uppers, length_scale):
+ """Kriging Believer: sequential L-BFGS with GP hallucination."""
+ eff_y = self._effective_y(state)
+ n_params = state.X.shape[1]
+ n_max = state.X.shape[0]
+
+ X_ext = jnp.concatenate(
+ [state.X, jnp.zeros((self.n_parallel, n_params))], axis=0
)
- # Because jax.lax.fori_loop doesn't support dynamic slicing and sizes,
- # we abuse the fact that GPs can handle duplicate points,
- # we can therefore create the array and dynamically replace
- # the values during the loop.
- X_seen = jnp.zeros((n_iterations, self.domain.shape[1]))
- X_seen = X_seen.at[:n_vmap].set(self.domain[idx])
- X_seen = X_seen.at[n_vmap:].set(self.domain[idx[0]])
- results = self.map_f(*X_seen[:n_vmap].T)
-
- y_seen = jnp.zeros(n_iterations)
- y_seen = y_seen.at[:n_vmap].set(results)
- y_seen = y_seen.at[n_vmap:].set(results[0])
-
- seen_idx = jnp.zeros(n_iterations)
- seen_idx = seen_idx.at[:n_vmap].set(idx)
- seen_idx = seen_idx.at[n_vmap:].set(idx[0])
-
- # @loop_tqdm(n_batches)
- def _inner_loop(i, carry):
- X_seen, y_seen, seen_idx, key = carry
- key, subkey = jax.random.split(key)
-
- mean, std = self.fit_gp(X_seen, y_seen)
- # can potentially sample points that are very close to each other
- candidate_idxs = self.acquisition.get_stochastic_argmax(
- mean, std, seen_idx, n_points=n_vmap, key=subkey
+ y_ext = jnp.concatenate([eff_y, jnp.zeros(self.n_parallel)], axis=0)
+ mask_ext = jnp.concatenate(
+ [state.mask, jnp.zeros(self.n_parallel, dtype=bool)], axis=0
+ )
+
+ xs_raw_list = []
+ for i in range(self.n_parallel):
+ key, key_liar = jax.random.split(key)
+ L, alpha, ymean = self._gp_fit(X_ext, y_ext, mask_ext, length_scale)
+ mean_cands, std_cands = self._gp_predict(
+ X_cands, L, alpha, ymean, X_ext, length_scale
)
+ acq_vals = self.acquisition(mean_cands, std_cands)
+ y_max = jnp.max(y_ext, where=mask_ext, initial=-jnp.inf)
+
+ n_seeds = min(self.n_restarts, self.n_candidates)
+ seed_idxs = jnp.argsort(acq_vals)[-n_seeds:]
+ seeds = X_cands[seed_idxs] # (n_seeds, n_params)
+
+ # L-BFGS restarts: pick best via jnp.where so this is JAX-traceable
+ solver = optax.lbfgs()
- candidate_points = self.domain[candidate_idxs]
- results = self.map_f(*candidate_points.T)
- X_seen = jax.lax.dynamic_update_slice(
- X_seen, candidate_points, (n_vmap + i * n_vmap, 0)
+ def neg_acq(x):
+ K_star = self.kernel(x[None], X_ext, length_scale=length_scale)
+ mean = K_star @ alpha + ymean
+ v = jax.scipy.linalg.cho_solve((L, True), K_star.T)
+ std = jnp.sqrt(jnp.clip(1.0 - jnp.sum(K_star * v.T, axis=1), 0.0))
+ return -self.acquisition(mean, std, y_max=y_max)[0]
+
+ def lbfgs_step(carry, _):
+ x, s = carry
+ val, grad = jax.value_and_grad(neg_acq)(x)
+ updates, new_s = solver.update(
+ grad, s, x, value=val, grad=grad, value_fn=neg_acq
+ )
+ return (
+ jnp.clip(optax.apply_updates(x, updates), lowers, uppers),
+ new_s,
+ ), None
+
+ def _lbfgs_restart(carry, x0):
+ best_x, best_val = carry
+ (x_refined, _), _ = jax.lax.scan(
+ lbfgs_step,
+ (x0, solver.init(x0)),
+ None,
+ length=self.n_lbfgs_steps,
+ )
+ mean_r, std_r = self._gp_predict(
+ x_refined[None], L, alpha, ymean, X_ext, length_scale
+ )
+ val = self.acquisition(mean_r, std_r, y_max=y_max)[0]
+ best_x = jnp.where(val > best_val, x_refined, best_x)
+ best_val = jnp.where(val > best_val, val, best_val)
+ return (best_x, best_val), None
+
+ (best_x, _), _ = jax.lax.scan(
+ _lbfgs_restart,
+ (seeds[-1], acq_vals[seed_idxs[-1]]),
+ seeds,
)
- y_seen = jax.lax.dynamic_update_slice(
- y_seen, results, (n_vmap + i * n_vmap,)
+ # Hallucinate: use liar strategy to generate pseudo-observation
+ mean_i, std_i = self._gp_predict(
+ best_x[None], L, alpha, ymean, X_ext, length_scale
)
- seen_idx = jax.lax.dynamic_update_slice(
- seen_idx,
- candidate_idxs.astype(jnp.float32),
- (n_vmap + i * n_vmap,),
+ X_ext = X_ext.at[n_max + i].set(best_x)
+ y_ext = y_ext.at[n_max + i].set(
+ self.hallucination(mean_i, std_i, key_liar, y_max)
)
+ mask_ext = mask_ext.at[n_max + i].set(True)
+ xs_raw_list.append(best_x)
+
+ return jnp.stack(xs_raw_list) # (n_parallel, n_params)
- return X_seen, y_seen, seen_idx, key
+ def _select_next_x(self, state, key):
+ key_sample, key_rest = jax.random.split(key)
+ leaves = jax.tree.leaves(state.space, is_leaf=lambda x: isinstance(x, sp.Space))
+ _, treedef = jax.tree.flatten(
+ state.space, is_leaf=lambda x: isinstance(x, sp.Space)
+ )
+ lowers, uppers = self._space_bounds(state.space)
+ length_scale = jnp.exp(state.log_length_scale)
+
+ X_cands = self._sample_candidates(
+ state.space, key_sample, self.n_candidates
+ ).astype(jnp.float32)
+
+ # Use lax.cond so this is JAX-traceable (required for lax.scan / vmap)
+ xs_raw = jax.lax.cond(
+ state.mask.sum() < self.n_warmup,
+ lambda k: self._random_select(state, k, X_cands),
+ lambda k: self._gp_select(state, k, X_cands, lowers, uppers, length_scale),
+ key_rest,
+ )
- (X_seen, y_seen, seen_idx, _) = jax.lax.fori_loop(
- 0, n_batches, _inner_loop, (X_seen, y_seen, seen_idx, key)
+ # Apply per-leaf transforms (rounds QLinearSpace/QLogSpace to integers, etc.)
+ xs_out = jnp.stack(
+ [
+ jnp.stack(
+ [
+ leaf.transform(xs_raw[j, i : i + 1]).squeeze()
+ for i, leaf in enumerate(leaves)
+ ]
+ )
+ for j in range(self.n_parallel)
+ ]
+ ) # (n_parallel, n_params)
+
+ batch_params = treedef.unflatten(
+ [xs_out[:, i] for i in range(treedef.num_leaves)]
)
- return X_seen, y_seen
+ return batch_params
+
+ def get_next_params(self, state, key, params=None, results=None):
+ """Select the next batch of ``n_parallel`` candidates.
- def fit_gp(self, X: jax.Array, y: jax.Array) -> tuple[jax.Array, jax.Array]:
+ During the first ``n_warmup`` iterations, candidates are chosen
+ uniformly at random. Afterwards, the GP posterior is used to maximise
+ the acquisition function via L-BFGS with Kriging Believer hallucination
+ for the parallel slots.
"""
- Fit a Gaussian process to the data.
+ return self._select_next_x(state, key)
- Args:
- X (N, D): The points that have been evaluated.
- y (N,): The values of the points that have been evaluated.
+ def _write_observation_batch(self, state, x_new, results, n):
+ """Write n_parallel observations to the padded state buffers starting at slot n.
- Returns:
- (N,): The mean of the Gaussian process.
- (N,): The standard deviation of the Gaussian process.
+ Uses fori_loop to avoid unrolling into n_parallel separate cond nodes in the
+ XLA graph (prevents linear compile-time growth with n_parallel).
"""
- X_test = self.domain
+ n_max = state.X.shape[0]
+ n_params = state.X.shape[1]
+ n_parallel = results.shape[0]
+
+ def body(i, s):
+ slot = n + i
+ x_row = jax.lax.dynamic_slice(x_new, (i, 0), (1, n_params))
+ y_scalar = jax.lax.dynamic_slice(results, (i,), (1,))
+ return jax.lax.cond(
+ slot < n_max,
+ lambda s: s.replace(
+ X=jax.lax.dynamic_update_slice(s.X, x_row, (slot, 0)),
+ y=jax.lax.dynamic_update_slice(s.y, y_scalar, (slot,)),
+ mask=jax.lax.dynamic_update_slice(
+ s.mask, jnp.ones(1, dtype=bool), (slot,)
+ ),
+ ),
+ lambda s: s,
+ s,
+ )
- # we calculated our posterior distribution conditioned on data
- K = self.kernel(X, X)
- K = K + jnp.eye(K.shape[0]) * self.jitter
- L = jsp.linalg.cholesky(K, lower=True)
- w = jsp.linalg.cho_solve((L, True), self.sanitize_and_normalize(y))
+ return jax.lax.fori_loop(0, n_parallel, body, state)
- K_trans = self.kernel(X_test, X)
- y_mean = K_trans @ w
- V = jsp.linalg.solve_triangular(L, K_trans.T, lower=True)
- y_var = self.kernel.diag(X_test)
- # hack to avoid doing the whole matrix multiplication
- # https://github.com/scikit-learn/scikit-learn/blob/main/sklearn/gaussian_process/_gpr.py#L475
- y_var -= jnp.einsum("ij,ji->i", V.T, V)
+ def update_state(self, state, key, results, params):
+ """Record new observations and update ARD length scales.
- return y_mean, jnp.sqrt(jnp.clip(y_var, 0))
+ Writes the batch of results into the fixed-size state buffers and,
+ if ``n_hparam_steps > 0``, runs a short Adam loop to tune
+ ``log_length_scale`` via marginal-likelihood maximisation.
- def sanitize_and_normalize(self, y_seen: jax.Array):
+ Args:
+ state: Current :class:`BayesianSearchState`.
+ key: PRNG key (unused but kept for API consistency).
+ results: Array of shape ``(n_parallel,)`` with observed objective
+ values.
+ params: Either the batched params pytree returned by
+ :meth:`get_next_params` (each leaf shape ``(n_parallel,)``), or
+ a raw ``(n_parallel, n_params)`` flat array.
"""
- Sanitize the values of the points that have been evaluated.
- This is to avoid numerical issues.
+ results = jnp.atleast_1d(jnp.squeeze(results))
+ n_parallel = results.shape[0] # static Python int
+ if isinstance(params, jax.Array):
+ x_new = jnp.atleast_2d(params)
+ else:
+ x_new = jnp.stack(jax.tree.leaves(params), axis=-1)
+ n = state.mask.sum() # dynamic JAX scalar
- Args:
- y_seen (N,): The values of the points that have been evaluated.
+ state = self._write_observation_batch(state, x_new, results, n)
+
+ if self.n_hparam_steps > 0:
+ log_ls = jax.lax.cond(
+ n + n_parallel >= 2,
+ self._tune_hparams,
+ lambda s: s.log_length_scale,
+ state,
+ )
+ state = state.replace(log_length_scale=log_ls)
+ return state
+
+ def _n_iterations(self, state):
+ """Number of optimize iterations derived from buffer capacity and n_parallel.
- Returns:
- (N,): The sanitized values of the points that have been evaluated.
+ Note: int(state.mask.sum()) forces a device sync β acceptable here since
+ optimize() is a Python loop.
"""
- y_seen = jnp.where(jnp.isnan(y_seen), jnp.min(y_seen), y_seen)
- y_seen = (y_seen - y_seen.mean()) / (y_seen.std() + 1e-10)
- return y_seen
+ remaining = state.X.shape[0] - int(state.mask.sum())
+ n_full = remaining // self.n_parallel
+ has_overflow = (remaining % self.n_parallel) > 0
+ return n_full + (1 if has_overflow else 0)
+
+ def optimize(self, state, key, func, n_iterations=None):
+ if n_iterations is None:
+ n_iterations = self._n_iterations(state)
+ return super().optimize(state, key, func, n_iterations)
+
+ def optimize_scan(self, state, key, func, n_iterations=None):
+ if n_iterations is None:
+ n_iterations = self._n_iterations(state)
+ return super().optimize_scan(state, key, func, n_iterations)
diff --git a/src/hyperoptax/grid.py b/src/hyperoptax/grid.py
index bbd1779..17e62f2 100644
--- a/src/hyperoptax/grid.py
+++ b/src/hyperoptax/grid.py
@@ -1,84 +1,113 @@
-import logging
-from typing import Callable, Optional
+import dataclasses
import jax
import jax.numpy as jnp
+from flax import struct
-from hyperoptax.base import BaseOptimizer
-from hyperoptax.spaces import BaseSpace
-
-logger = logging.getLogger(__name__)
-
-
-class GridSearch(BaseOptimizer):
- def __init__(
- self,
- domain: dict[str, BaseSpace],
- f: Callable,
- random_search: bool = False,
- key: Optional[jax.random.PRNGKey] = None,
- ):
- super().__init__(domain, f)
- key = key or jax.random.PRNGKey(0)
- if random_search:
- idxs = jax.random.choice(
- key, self.domain.shape[0], (self.domain.shape[0],), replace=False
- )
- self.domain = self.domain[idxs]
-
- def search(
- self,
- n_iterations: int,
- n_vmap: int,
- key: jax.random.PRNGKey,
- domain: Optional[jax.Array] = None,
- ):
- if domain is None:
- domain = self.domain[:n_iterations]
-
- # Number of batches we need to cover all requested iterations
- n_batches = (n_iterations + n_vmap - 1) // n_vmap
- n_dims = domain.shape[1]
-
- def _inner_loop(start_idx, _):
- """Evaluate a single batch starting at ``start_idx``."""
- # Ensure we stay within bounds. The clamp keeps the slice valid even
- # when the last batch is not full (extra rows are discarded later).
- start_idx = jnp.minimum(start_idx, n_iterations - n_vmap)
-
- batch = jax.lax.dynamic_slice(
- domain,
- (start_idx, 0),
- (n_vmap, n_dims),
- )
- # TODO: add way to put key as optional argument
- batch_results = self.map_f(*batch.T)
- return start_idx + n_vmap, batch_results
-
- # Scan over all batches of parameters
- _, batch_results = jax.lax.scan(
- _inner_loop, 0, jnp.arange(n_batches), length=n_batches
+from hyperoptax import base
+from hyperoptax import spaces as sp
+
+
+@struct.dataclass
+class GridSearchState(base.OptimizerState):
+ """State for :class:`GridSearch`.
+
+ Attributes:
+ grid: Array of shape ``(n_total, n_params)`` containing all parameter
+ combinations, pre-truncated to a multiple of ``n_parallel``.
+ grid_idx: Current position in ``grid``; incremented by ``n_parallel``
+ after each call to ``update_state``.
+ """
+
+ grid: jax.Array
+ grid_idx: int
+
+
+@dataclasses.dataclass
+class GridSearch(base.Optimizer):
+ """Exhaustive grid search over a discrete search space.
+
+ Iterates through every combination of the provided ``DiscreteSpace`` values
+ in order (or randomly if ``shuffle=True``). All spaces in the search space
+ must be :class:`~hyperoptax.spaces.DiscreteSpace`.
+
+ Attributes:
+ shuffle: If ``True``, randomise the traversal order during ``init``.
+ Pass an explicit ``key`` to ``init`` for reproducibility.
+ n_parallel: Number of grid points evaluated per iteration.
+ """
+
+ shuffle: bool = False
+ n_parallel: int = 1
+
+ @classmethod
+ def init(cls, space, key=None, **kwargs):
+ """Initialise the grid search.
+
+ Args:
+ space: A pytree of :class:`~hyperoptax.spaces.DiscreteSpace` objects.
+ All leaves must be ``DiscreteSpace``; mixed spaces are not supported.
+ key: Optional PRNG key used when ``shuffle=True``. Falls back to
+ ``PRNGKey(0)`` when ``None``.
+ **kwargs: Forwarded to :class:`GridSearch` constructor (e.g. ``n_parallel``,
+ ``shuffle``).
+
+ Returns:
+ ``(state, optimizer)`` tuple.
+ """
+ is_discrete = jax.tree.map(
+ lambda x: isinstance(x, sp.DiscreteSpace),
+ space,
+ is_leaf=lambda x: isinstance(x, sp.Space),
+ )
+ if not all(jax.tree.leaves(is_discrete)):
+ raise ValueError("GridSearch requires all spaces to be DiscreteSpace.")
+
+ optimizer = cls(**kwargs)
+
+ leaves = jax.tree.leaves(space, is_leaf=lambda x: isinstance(x, sp.Space))
+ values_list = [jnp.array(leaf.values) for leaf in leaves]
+ # TODO: use indexes so that we don't generate the full grid.
+ grids = jnp.meshgrid(*values_list, indexing="ij")
+ # Flatten into (n_total, n_leaves) so grid[i] is the i-th param combination
+ grid = jnp.stack([g.ravel() for g in grids], axis=-1)
+ if optimizer.shuffle:
+ # key=None falls back to PRNGKey(0); pass key explicitly for reproducibility
+ key = key if key is not None else jax.random.PRNGKey(0)
+ grid = jax.random.permutation(key, grid)
+ n_usable = (len(grid) // optimizer.n_parallel) * optimizer.n_parallel
+ grid = grid[:n_usable]
+ state = GridSearchState(
+ space=space,
+ grid=grid,
+ grid_idx=0,
+ )
+ return state, optimizer
+
+ def get_next_params(
+ self, state: GridSearchState, key, params=None, results=None
+ ) -> struct.PyTreeNode:
+ """Return the next ``n_parallel`` parameter combinations from the grid."""
+ # Only check eagerly; inside lax.scan grid_idx is an abstract tracer.
+ if not isinstance(state.grid_idx, jax.core.Tracer):
+ if int(state.grid_idx) + self.n_parallel > state.grid.shape[0]:
+ raise ValueError(
+ f"Not enough grid points remaining "
+ f"(grid_idx={int(state.grid_idx)}, n_parallel={self.n_parallel}, "
+ f"grid_size={state.grid.shape[0]})."
+ )
+ # Extract n_parallel rows; use dynamic slice for scan compatibility
+ rows = jax.lax.dynamic_slice_in_dim(
+ state.grid, state.grid_idx, self.n_parallel, axis=0
+ ) # (n_parallel, n_leaves)
+ _, treedef = jax.tree.flatten(
+ state.space, is_leaf=lambda x: isinstance(x, sp.Space)
)
+ # Each leaf gets shape (n_parallel,)
+ return treedef.unflatten([rows[:, i] for i in range(treedef.num_leaves)])
- # Flatten and truncate the padded tail (if any)
- results = jnp.concatenate(batch_results, axis=0)[:n_iterations]
-
- return domain, results
-
- # def shard_domain(self, n_iterations: int, n_parallel: int):
- # n_devices = jax.local_device_count()
- # if n_devices < n_parallel:
- # raise ValueError(
- # f"Number of devices ({n_devices}) is less than the number of "
- # f"parallel evaluations ({n_parallel})."
- # )
- # if n_devices > n_parallel:
- # logger.info(
- # f"I found {n_devices} devices, but you only requested "
- # f"{n_parallel} parallel evaluations."
- # )
- # devices = jax.devices()
- # mesh = Mesh(devices, ("devices",))
- # parallel_sharding = NamedSharding(mesh, PartitionSpec("devices"))
-
- # self.domain = jax.device_put(self.domain[:n_iterations], parallel_sharding)
+ def update_state(
+ self, state: GridSearchState, key, results, params=None
+ ) -> GridSearchState:
+ """Advance the grid index by ``n_parallel``."""
+ return state.replace(grid_idx=state.grid_idx + self.n_parallel)
diff --git a/src/hyperoptax/kernels.py b/src/hyperoptax/kernels.py
index 84123ff..3e897e3 100644
--- a/src/hyperoptax/kernels.py
+++ b/src/hyperoptax/kernels.py
@@ -18,14 +18,17 @@ def cdist(x: jax.Array, y: jax.Array) -> jax.Array:
A distance matrix of shape ``(N, M)``.
"""
# jax compatible cdist https://github.com/jax-ml/jax/discussions/15862
- return jnp.sqrt(jnp.sum((x[:, None] - y[None, :]) ** 2, -1))
+ # Use double-where trick to avoid inf gradients at zero distance (sqrt'(0) = inf).
+ d2 = jnp.sum((x[:, None] - y[None, :]) ** 2, -1)
+ safe_d2 = jnp.where(d2 == 0, jnp.ones_like(d2), d2)
+ return jnp.where(d2 == 0, jnp.zeros_like(d2), jnp.sqrt(safe_d2))
class BaseKernel(ABC):
"""Abstract base class for positive-definite kernels."""
@abstractmethod
- def __call__(self, x: jax.Array, y: jax.Array) -> jax.Array:
+ def __call__(self, x: jax.Array, y: jax.Array, length_scale=None) -> jax.Array:
raise NotImplementedError
@@ -36,14 +39,12 @@ class RBF(BaseKernel):
def __init__(self, length_scale: float = 1.0):
self.length_scale = length_scale
- def __call__(self, x: jax.Array, y: jax.Array) -> jax.Array:
- return jnp.exp(-(cdist(x, y) ** 2) / (2 * self.length_scale**2))
+ def __call__(self, x: jax.Array, y: jax.Array, length_scale=None) -> jax.Array:
+ ls = self.length_scale if length_scale is None else length_scale
+ return jnp.exp(-(cdist(x, y) ** 2) / (2 * ls**2))
- def diag(self, x: jax.Array) -> jax.Array:
- return jnp.ones(x.shape[0])
-
-class Matern(RBF):
+class Matern(BaseKernel):
"""Matern kernel family.
Parameters
@@ -54,12 +55,21 @@ class Matern(RBF):
Controls smoothness (``nu`` β {0.5, 1.5, 2.5, β}).
"""
+ _VALID_NU = {0.5, 1.5, 2.5, float("inf")}
+
def __init__(self, length_scale: float = 1.0, nu: float = 2.5):
+ if nu not in self._VALID_NU:
+ valid = sorted(v for v in self._VALID_NU if v != float("inf"))
+ raise ValueError(
+ f"Matern kernel with nu={nu} is not supported. "
+ f"Choose from {valid} or inf."
+ )
self.length_scale = length_scale
self.nu = nu # controls smoothness of the kernel, lower is less smooth
- def __call__(self, x: jax.Array, y: jax.Array) -> jax.Array:
- dists = cdist(x / self.length_scale, y / self.length_scale)
+ def __call__(self, x: jax.Array, y: jax.Array, length_scale=None) -> jax.Array:
+ ls = self.length_scale if length_scale is None else length_scale
+ dists = cdist(x / ls, y / ls)
if self.nu == 0.5:
return jnp.exp(-dists)
elif self.nu == 1.5:
@@ -68,7 +78,5 @@ def __call__(self, x: jax.Array, y: jax.Array) -> jax.Array:
elif self.nu == 2.5:
K = jnp.sqrt(5) * dists
return (1 + K + K**2 / 3) * jnp.exp(-K)
- elif self.nu == jnp.inf: # RBF kernel
+ else: # nu == inf: RBF kernel
return jnp.exp(-(dists**2) / 2)
- else:
- raise ValueError(f"Matern kernel with nu={self.nu} is not supported.")
diff --git a/src/hyperoptax/random.py b/src/hyperoptax/random.py
new file mode 100644
index 0000000..9345bc2
--- /dev/null
+++ b/src/hyperoptax/random.py
@@ -0,0 +1,61 @@
+import dataclasses
+
+import jax
+import jax.numpy as jnp
+from flax import struct
+
+from hyperoptax import base, utils
+from hyperoptax import spaces as sp
+
+
+@dataclasses.dataclass
+class RandomSearch(base.Optimizer):
+ """Stateless random search β samples each space independently each iteration.
+
+ No model is fitted and no history is maintained, so this is the cheapest
+ optimizer and useful as a strong baseline.
+
+ Attributes:
+ n_parallel: Number of random configurations evaluated per iteration.
+ """
+
+ n_parallel: int = 1
+
+ @classmethod
+ def init(cls, space, **kwargs):
+ return base.OptimizerState(space=space), cls(**kwargs)
+
+ def get_next_params(
+ self,
+ state: base.OptimizerState,
+ key: jax.random.PRNGKey,
+ params=None,
+ results=None,
+ ) -> struct.PyTreeNode:
+ """Sample ``n_parallel`` independent configurations from the search space."""
+ def sample_once(k):
+ subkeys = utils.make_key_tree(state.space, k)
+ sample = jax.tree.map(
+ lambda x, sk: x.sample(sk),
+ state.space,
+ subkeys,
+ is_leaf=lambda x: isinstance(x, sp.Space),
+ )
+ # Squeeze (1,) per-leaf values to scalars for stacking
+ return jax.tree.map(lambda leaf: leaf.squeeze(), sample)
+
+ keys = jax.random.split(key, self.n_parallel)
+ samples = [sample_once(k) for k in keys]
+ return jax.tree.map(lambda *leaves: jnp.stack(leaves), *samples)
+
+ def update_state(
+ self,
+ state: base.OptimizerState,
+ key: jax.random.PRNGKey,
+ results: jax.Array,
+ params=None,
+ ) -> base.OptimizerState:
+ """
+ RandomSearch is memoryless, no state to update.
+ """
+ return state
diff --git a/src/hyperoptax/spaces.py b/src/hyperoptax/spaces.py
index 18eea3d..df49eac 100644
--- a/src/hyperoptax/spaces.py
+++ b/src/hyperoptax/spaces.py
@@ -1,176 +1,141 @@
-from dataclasses import dataclass
-
import jax
import jax.numpy as jnp
+from flax import struct
-@dataclass
-class BaseSpace:
- """Base class for one-dimensional search spaces.
-
- A *search space* is a discrete 1-D grid of numeric values that a
- hyper-parameter can take. Sub-classes must implement the
- :pyattr:`array` property that returns a 1-D :class:`jax.Array` with
- length ``n_points``.
-
- Attributes
- ----------
- start : float | int
- Inclusive lower bound of the space.
- end : float | int
- Inclusive upper bound of the space.
- n_points : int
- Number of discrete values between ``start`` and ``end``.
- """
+# transformation between logs
+def log_transform(x: float, base: float) -> float:
+ return jnp.log(x) / jnp.log(base)
- start: float | int
- end: float | int
- n_points: float | int
- def __len__(self) -> int:
- return self.n_points
+class Space(struct.PyTreeNode):
+ """Abstract base class for hyperparameter search spaces."""
- @property
- def array(self) -> jax.Array:
+ def sample(self, key: jax.random.PRNGKey) -> jax.Array:
raise NotImplementedError
- def __getitem__(self, idx: int) -> jax.Array:
- return self.array[idx]
-
- def __iter__(self):
- return iter(self.array)
+ def transform(self, value):
+ return value
-@dataclass
-class ArbitrarySpace:
- """Search space defined by an *explicit* list of values.
+class LinearSpace(Space):
+ """Uniform continuous space over ``[lower_bound, upper_bound]``.
- Parameters
- ----------
- values : list[float | int]
- A sequence of numeric values.
- name : str, default = "arbitrary_space"
- Human-readable identifier.
+ Attributes:
+ lower_bound: Inclusive lower bound of the interval.
+ upper_bound: Exclusive upper bound of the interval.
"""
- values: list[int | float]
- name: str = "arbitrary_space"
+ lower_bound: float = struct.field(pytree_node=False)
+ upper_bound: float = struct.field(pytree_node=False)
def __post_init__(self):
- assert self.array.ndim == 1, (
- "I don't support arrays that aren't one dimensional (yet), "
- "try entering each dimension as a separate space."
+ assert self.lower_bound < self.upper_bound, (
+ "lower_bound is greater or equal to upper_bound."
)
- self.start = jnp.min(self.array)
- self.end = jnp.max(self.array)
- self.n_points = len(self.array)
- @property
- def array(self) -> jax.Array:
- return jnp.array(self.values)
+ def sample(self, key: jax.random.PRNGKey) -> float:
+ return self.transform(
+ jax.random.uniform(
+ key, shape=(1,), minval=self.lower_bound, maxval=self.upper_bound
+ )
+ )
-@dataclass
-class LinearSpace(BaseSpace):
- """Linearly spaced grid between ``start`` and ``end``.
+class DiscreteSpace(Space):
+ """Discrete space over a fixed set of values.
- All constructor arguments are inherited from :class:`BaseSpace`.
+ Samples uniformly from ``values``. ``transform`` snaps any continuous
+ value to the nearest element, which is useful when discrete candidates
+ are generated via continuous optimization (e.g. in ``BayesianSearch``).
+
+ Attributes:
+ values: Tuple of candidate values to sample from.
"""
- name: str = "linear_space"
+ values: tuple = struct.field(pytree_node=False)
@property
- def array(self) -> jax.Array:
- return jnp.linspace(self.start, self.end, self.n_points)
-
-
-@dataclass
-class LogSpace(BaseSpace):
- """Logarithmically spaced grid.
-
- Values are spaced evenly in log-space with a configurable ``base``.
+ def lower_bound(self) -> float:
+ return float(min(self.values))
- Additional Parameters
- ---------------------
- base : float | int, default = 10
- Logarithm base.
- """
-
- base: float | int = 10
- name: str = "log_space"
+ @property
+ def upper_bound(self) -> float:
+ return float(max(self.values))
- def __post_init__(self):
- # JAX silently converts negative numbers to nan
- assert self.start > 0 and self.end > 0 and self.base > 0, (
- "Log space must be positive and have a positive log base."
+ def sample(self, key: jax.random.PRNGKey) -> float:
+ return self.transform(
+ jax.random.choice(key, jnp.array(self.values), shape=(1,))
)
- @property
- def array(self) -> jax.Array:
- log_space = jnp.linspace(
- self.log(self.start), self.log(self.end), self.n_points
- )
- return self.base**log_space
+ def transform(self, value) -> jax.Array:
+ vals = jnp.array(self.values)
+ value = jnp.asarray(value)
+ flat = jnp.ravel(value)
+ snapped = vals[jnp.argmin(jnp.abs(vals[:, None] - flat[None, :]), axis=0)]
+ return snapped.reshape(value.shape)
- def log(self, x: float) -> float:
- # conersion of log base
- return jnp.log(x) / jnp.log(self.base)
+class LogSpace(LinearSpace):
+ """Log-uniform continuous space over ``[lower_bound, upper_bound]``.
-@dataclass
-class ExpSpace(LogSpace):
- """Inverse of :class:`LogSpace`.
+ Samples uniformly in log space so that each order of magnitude receives
+ equal probability mass. Useful for learning rates and other scale
+ parameters that span several orders of magnitude.
- Returns ``base ** linspace(start, end, n_points)``.
+ Attributes:
+ lower_bound: Inclusive lower bound (in original scale, e.g. ``1e-5``).
+ upper_bound: Exclusive upper bound (in original scale, e.g. ``1e-1``).
+ base: Logarithm base (default ``10``). Must be greater than 1.
"""
- base: float | int = 10
- name: str = "exp_space"
-
- def __post_init__(self):
- # JAX silently converts negative numbers to nan
- assert self.base > 0, "Base must be positive."
-
- @property
- def array(self) -> jax.Array:
- return self.log(
- jnp.linspace(self.base**self.start, self.base**self.end, self.n_points)
+ base: float = struct.field(pytree_node=False, default=10)
+
+ def __post_init__(
+ self,
+ ):
+ super().__post_init__()
+ assert self.base > 1, "Log base must be greater than 1"
+
+ def sample(self, key: jax.random.PRNGKey) -> float:
+ return self.transform(
+ self.base
+ ** jax.random.uniform(
+ key,
+ shape=(1,),
+ minval=log_transform(self.lower_bound, self.base),
+ maxval=log_transform(self.upper_bound, self.base),
+ )
)
-@dataclass
-class QuantizedLinearSpace:
- """Linearly spaced grid with a fixed *step size*.
+# TODO: maybe use something more robust than astype?
+# TODO: can we do something with mixins? Currently hitting some ordering problems
+class QLinearSpace(LinearSpace):
+ """Quantized (integer) variant of :class:`LinearSpace`.
- Instead of specifying ``n_points`` directly, the resolution is derived
- from a ``quantization_factor`` (i.e. the distance between two
- consecutive values).
- """
-
- start: int | float
- end: int | float
- quantization_factor: int | float
- name: str = "quantized_space"
+ Samples uniformly from ``[lower_bound, upper_bound]`` and rounds to the
+ nearest integer. Use this for discrete integer hyperparameters with a
+ uniform prior (e.g. number of layers, batch size).
- def __post_init__(self):
- self.n_points = jnp.int32(
- (self.end - self.start) / self.quantization_factor + 1
- )
+ Attributes:
+ lower_bound: Inclusive lower bound.
+ upper_bound: Exclusive upper bound.
+ datatype: Integer dtype used after rounding (default ``jnp.int32``).
+ """
- @property
- def array(self) -> jax.Array:
- return jnp.linspace(self.start, self.end, self.n_points)
+ datatype: type = struct.field(pytree_node=False, default=jnp.int32)
+ def transform(self, value) -> jax.Array:
+ return jnp.round(value).astype(self.datatype)
-# class QuantizedLogSpace(QuantizedLinearSpace):
-# base: float | int = 10
-# name: str = "quantized_log_space"
-# @property
-# def array(self) -> jax.Array:
-# arr = jnp.log(super().array) / jnp.log(self.base)
-# return self.base**arr
+class QLogSpace(LogSpace, QLinearSpace):
+ """Quantized (integer) variant of :class:`LogSpace`.
+ Samples in log space and rounds to the nearest integer. Use this for
+ integer hyperparameters whose scale spans orders of magnitude
+ (e.g. number of hidden units, number of warmup steps).
+ """
-# TODO: add distribution versions
-# TODO: add support for nested spaces with pytrees
+ pass
diff --git a/src/hyperoptax/utils.py b/src/hyperoptax/utils.py
new file mode 100644
index 0000000..30b551c
--- /dev/null
+++ b/src/hyperoptax/utils.py
@@ -0,0 +1,28 @@
+import jax
+from flax import struct
+
+from hyperoptax import spaces as sp
+
+
+def make_key_tree(
+ pytree: struct.PyTreeNode,
+ subkey: jax.random.PRNGKey,
+) -> struct.PyTreeNode:
+ """Split ``subkey`` into a pytree of PRNGKeys matching the structure of ``pytree``.
+
+ :class:`~hyperoptax.spaces.Space` objects are treated as leaves, so the
+ returned tree has one key per space in the search-space pytree.
+
+ Args:
+ pytree: A pytree whose structure determines how many keys are produced.
+ subkey: PRNGKey to split.
+
+ Returns:
+ A pytree with the same structure as ``pytree`` where each leaf is a
+ fresh PRNGKey.
+ """
+ tree = jax.tree_util.tree_structure(
+ pytree, is_leaf=lambda x: isinstance(x, sp.Space)
+ )
+ keys = jax.random.split(subkey, tree.num_leaves)
+ return jax.tree_util.tree_unflatten(tree, keys)
diff --git a/tests/test_acquisition.py b/tests/test_acquisition.py
index d2095bf..2747498 100644
--- a/tests/test_acquisition.py
+++ b/tests/test_acquisition.py
@@ -1,70 +1,217 @@
import jax
import jax.numpy as jnp
+import pytest
-from hyperoptax.acquisition import EI, UCB
+from hyperoptax import acquisition as acq
+
+
+class TestGetArgmax:
+ def test_ucb_get_argmax_selects_correct_unseen_index(self):
+ ucb = acq.UCB(kappa=2.0)
+ # UCB = mean + 2*std β [1.2(seen), 0.2, 0.4]; best unseen is index 2
+ mean = jnp.array([1.0, 0.0, 0.0])
+ std = jnp.array([0.1, 0.1, 0.2])
+ seen_mask = jnp.array([True, False, False])
+ idx = ucb.get_argmax(mean, std, seen_mask, n_points=1)
+ assert int(idx[0]) == 2
+
+ def test_ucb_values_match_formula(self):
+ ucb = acq.UCB(kappa=2.0)
+ mean = jnp.array([1.0, 0.5])
+ std = jnp.array([0.2, 0.3])
+ vals = ucb(mean, std)
+ assert jnp.allclose(vals, mean + 2.0 * std)
+
+ def test_ei_values_match_formula(self):
+ from jax.scipy.stats import norm
+
+ ei = acq.EI(xi=0.0)
+ mean = jnp.array([1.5, 0.5])
+ std = jnp.array([0.5, 0.5])
+ y_max = jnp.array(1.0)
+ vals = ei(mean, std, y_max=y_max)
+ a = mean - y_max
+ z = a / std
+ expected = a * norm.cdf(z) + std * norm.pdf(z)
+ assert jnp.allclose(vals, expected)
class TestUCB:
- def test_get_max_when_no_seen_idx(self):
- ucb = UCB(kappa=2.0)
+ def test_get_argmax_when_none_seen(self):
+ ucb = acq.UCB(kappa=2.0)
mean = jnp.array([1.0, 0.0])
std = jnp.array([0.1, 0.1])
X = jnp.array([[2.0, 2.0], [1.0, 1.0]])
- seen_idx = jnp.array([])
+ seen_mask = jnp.array([False, False])
- max_val = ucb.get_max(mean, std, X, seen_idx)
- assert jnp.allclose(max_val, jnp.array([2.0, 2.0]))
+ max_val = X[ucb.get_argmax(mean, std, seen_mask)]
+ assert jnp.allclose(max_val, jnp.array([[2.0, 2.0]]))
- def test_get_max_when_seen_idx(self):
- ucb = UCB(kappa=2.0)
+ def test_get_argmax_excludes_seen(self):
+ ucb = acq.UCB(kappa=2.0)
mean = jnp.array([1.0, 0.0, 0.0])
std = jnp.array([0.1, 0.1, 0.2])
X = jnp.array([[2.0, 2.0], [1.0, 1.0], [0.0, 0.0]])
- seen_idx = jnp.array([0])
+ seen_mask = jnp.array([True, False, False])
- max_val = ucb.get_max(mean, std, X, seen_idx)
- assert jnp.allclose(max_val, jnp.array([0.0, 0.0]))
+ max_val = X[ucb.get_argmax(mean, std, seen_mask)]
+ assert jnp.allclose(max_val, jnp.array([[0.0, 0.0]]))
- def test_get_max_when_jitted(self):
- ucb = UCB(kappa=2.0)
+ def test_get_argmax_when_jitted(self):
+ ucb = acq.UCB(kappa=2.0)
mean = jnp.array([1.0, 0.0, 0.0])
std = jnp.array([0.1, 0.1, 0.2])
X = jnp.array([[2.0, 2.0], [1.0, 1.0], [0.0, 0.0]])
- seen_idx = jnp.array([0])
+ seen_mask = jnp.array([True, False, False])
- max_val = jax.jit(ucb.get_max)(mean, std, X, seen_idx)
- assert jnp.allclose(max_val, jnp.array([0.0, 0.0]))
-
- def test_get_stochastic_argmax_when_stochastic_multiplier_is_1(self):
- ucb = UCB(kappa=2.0, stochastic_multiplier=1)
- mean = jnp.array([1.0, 0.0, 0.0])
- std = jnp.array([0.1, 0.1, 0.2])
- seen_idx = jnp.array([0])
- key = jax.random.PRNGKey(0)
-
- # when stochastic_multiplier is 1, the two methods are equivalent
- argmax_val = ucb.get_argmax(mean, std, seen_idx, 1)
- stochastic_argmax_val = ucb.get_stochastic_argmax(mean, std, seen_idx, 1, key)
- assert jnp.allclose(argmax_val, stochastic_argmax_val)
+ argmax = jax.jit(ucb.get_argmax)(mean, std, seen_mask)
+ assert jnp.allclose(X[argmax], jnp.array([[0.0, 0.0]]))
class TestEI:
- def test_get_max_when_no_seen_idx(self):
- ei = EI(xi=0.01)
+ def test_get_argmax_when_none_seen(self):
+ ei = acq.EI(xi=0.01)
mean = jnp.array([1.0, 0.0])
std = jnp.array([0.1, 0.1])
X = jnp.array([[2.0, 2.0], [1.0, 1.0]])
- seen_idx = jnp.array([])
+ seen_mask = jnp.array([False, False])
+
+ max_val = X[ei.get_argmax(mean, std, seen_mask)]
+ assert jnp.allclose(max_val, jnp.array([[2.0, 2.0]]))
+
+ def test_get_argmax_when_jitted(self):
+ ei = acq.EI(xi=0.01)
+ mean = jnp.array([1.0, 0.0, 0.0])
+ std = jnp.array([0.1, 0.1, 0.2])
+ X = jnp.array([[2.0, 2.0], [1.0, 1.0], [0.0, 0.0]])
+ seen_mask = jnp.array([True, False, False])
+
+ argmax = jax.jit(ei.get_argmax)(mean, std, seen_mask)
+ assert jnp.allclose(X[argmax], jnp.array([[0.0, 0.0]]))
- max_val = ei.get_max(mean, std, X, seen_idx)
- assert jnp.allclose(max_val, jnp.array([2.0, 2.0]))
- def test_get_max_when_jitted(self):
- ei = EI(xi=0.01)
+class TestPI:
+ def test_pi_output_is_probability(self):
+ pi = acq.PI(xi=0.01)
+ mean = jnp.array([1.0, 0.5, 0.0])
+ std = jnp.array([0.5, 0.5, 0.5])
+ vals = pi(mean, std)
+ assert jnp.all(vals >= 0.0) and jnp.all(vals <= 1.0)
+
+ def test_pi_higher_for_larger_improvement(self):
+ pi = acq.PI(xi=0.01)
+ # y_max = max(mean) = 2.0; higher mean -> higher PI
+ mean = jnp.array([2.0, 1.0, 0.0])
+ std = jnp.array([0.5, 0.5, 0.5])
+ vals = pi(mean, std)
+ assert vals[0] > vals[1] > vals[2]
+
+ def test_pi_with_explicit_y_max(self):
+ pi = acq.PI(xi=0.01)
+ mean = jnp.array([1.5, 0.5])
+ std = jnp.array([0.5, 0.5])
+ # With y_max=2.0, both z < 0, so PI < 0.5
+ vals = pi(mean, std, y_max=jnp.array(2.0))
+ assert vals[0] > vals[1]
+ assert float(vals[0]) < 0.5
+
+ def test_pi_excludes_seen(self):
+ pi = acq.PI(xi=0.01)
mean = jnp.array([1.0, 0.0, 0.0])
std = jnp.array([0.1, 0.1, 0.2])
X = jnp.array([[2.0, 2.0], [1.0, 1.0], [0.0, 0.0]])
- seen_idx = jnp.array([0])
+ seen_mask = jnp.array([True, False, False])
+ result = X[pi.get_argmax(mean, std, seen_mask)]
+ # Index 0 is seen (best PI), so should return index 2 (highest unseen PI)
+ assert not jnp.allclose(result, jnp.array([[2.0, 2.0]]))
+
+ def test_pi_jitted(self):
+ pi = acq.PI(xi=0.01)
+ mean = jnp.array([1.0, 0.5])
+ std = jnp.array([0.3, 0.3])
+ vals = jax.jit(pi)(mean, std)
+ assert vals.shape == (2,)
+
+
+class TestBaseAcquisition:
+ def test_call_raises_not_implemented(self):
+ a = acq.BaseAcquisition()
+ with pytest.raises(NotImplementedError):
+ a(jnp.array([1.0]), jnp.array([0.1]))
+
+ def test_ei_uses_y_max_from_mean_when_none(self):
+ # EI with y_max=None uses max(mean) as reference
+ ei = acq.EI(xi=0.0)
+ mean = jnp.array([2.0, 1.0])
+ std = jnp.array([0.5, 0.5])
+ vals_auto = ei(mean, std, y_max=None)
+ vals_explicit = ei(mean, std, y_max=jnp.max(mean))
+ assert jnp.allclose(vals_auto, vals_explicit)
+
+ def test_pi_uses_y_max_from_mean_when_none(self):
+ pi = acq.PI(xi=0.0)
+ mean = jnp.array([2.0, 1.0])
+ std = jnp.array([0.5, 0.5])
+ vals_auto = pi(mean, std, y_max=None)
+ vals_explicit = pi(mean, std, y_max=jnp.max(mean))
+ assert jnp.allclose(vals_auto, vals_explicit)
+
+
+class TestHallucinationStrategies:
+ def setup_method(self):
+ self.mean = jnp.array([1.5])
+ self.std = jnp.array([0.3])
+ self.key = jax.random.PRNGKey(0)
+ self.y_max = jnp.array(1.0)
+
+ def test_mean_hallucination_returns_mean(self):
+ h = acq.MeanHallucination()
+ out = h(self.mean, self.std, self.key, self.y_max)
+ assert jnp.allclose(out, self.mean[0])
+
+ def test_sample_hallucination_is_stochastic(self):
+ h = acq.SampleHallucination()
+ key1, key2 = jax.random.split(self.key)
+ out1 = h(self.mean, self.std, key1, self.y_max)
+ out2 = h(self.mean, self.std, key2, self.y_max)
+ assert not jnp.allclose(out1, out2)
+
+ def test_sample_hallucination_mean_is_posterior_mean(self):
+ h = acq.SampleHallucination()
+ keys = jax.random.split(self.key, 5000)
+ samples = jnp.array([h(self.mean, self.std, k, self.y_max) for k in keys])
+ assert jnp.abs(jnp.mean(samples) - self.mean[0]) < 0.05
+
+ def test_ucb_hallucination_formula(self):
+ kappa = 3.0
+ h = acq.UCBHallucination(kappa=kappa)
+ out = h(self.mean, self.std, self.key, self.y_max)
+ assert jnp.allclose(out, self.mean[0] + kappa * self.std[0])
+
+ def test_constant_hallucination_uses_y_max(self):
+ h = acq.ConstantHallucination()
+ out = h(self.mean, self.std, self.key, self.y_max)
+ assert jnp.allclose(out, self.y_max)
+
+ def test_constant_hallucination_fixed_value(self):
+ h = acq.ConstantHallucination(value=42.0)
+ out = h(self.mean, self.std, self.key, self.y_max)
+ assert jnp.allclose(out, jnp.array(42.0))
+
+ def test_constant_hallucination_fixed_value_ignores_y_max(self):
+ h = acq.ConstantHallucination(value=42.0)
+ out1 = h(self.mean, self.std, self.key, jnp.array(0.0))
+ out2 = h(self.mean, self.std, self.key, jnp.array(999.0))
+ assert jnp.allclose(out1, out2)
- max_val = jax.jit(ei.get_max)(mean, std, X, seen_idx)
- assert jnp.allclose(max_val, jnp.array([0.0, 0.0]))
+ def test_all_hallucinations_return_scalar(self):
+ strategies = [
+ acq.MeanHallucination(),
+ acq.SampleHallucination(),
+ acq.UCBHallucination(),
+ acq.ConstantHallucination(),
+ acq.ConstantHallucination(value=1.0),
+ ]
+ for h in strategies:
+ out = h(self.mean, self.std, self.key, self.y_max)
+ assert out.ndim == 0, f"{type(h).__name__} did not return scalar"
diff --git a/tests/test_base.py b/tests/test_base.py
index bd47fbd..1b46a0a 100644
--- a/tests/test_base.py
+++ b/tests/test_base.py
@@ -1,52 +1,58 @@
+import warnings
+from unittest.mock import patch
+
+import jax
import jax.numpy as jnp
import pytest
-from hyperoptax.base import BaseOptimizer
-from hyperoptax.spaces import LinearSpace
-
-
-class TestBaseOptimizer:
- def setup_method(self):
- self.optimizer = BaseOptimizer(
- domain={"x": LinearSpace(0, 1, 10)}, f=lambda x: x
- )
-
- def test_when_no_results_are_found(self):
- with pytest.raises(AssertionError):
- self.optimizer.max
- with pytest.raises(AssertionError):
- self.optimizer.min
-
- def test_max(self):
- # manually set the results
- self.optimizer.results = (
- self.optimizer.domain,
- jnp.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]),
- )
- assert self.optimizer.max["target"] == 10
-
- def test_min(self):
- # manually set the results
- self.optimizer.results = (
- self.optimizer.domain,
- jnp.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]),
- )
- assert self.optimizer.min["target"] == 1
-
-
-# class TestDomain:
-# def test_domain(self):
-# domain = {
-# "x": LinearSpace(0, 1, 10),
-# "y": LinearSpace(0, 1, 10),
-# "z": LinearSpace(0, 1, 10),
-# "agent_kwargs": {
-# "lr": LinearSpace(0, 1, 10),
-# "batch_size": LinearSpace(0, 1, 10),
-# },
-# }
-
-# def f(x, y, z, agent_kwargs):
-# return x + y + z + agent_kwargs["lr"] + agent_kwargs["batch_size"]
-
-# f(**domain)
+from hyperoptax import base
+
+
+class TestValidateFunc:
+ def test_valid_two_arg_function_passes(self):
+ base._validate_func(lambda key, config: config)
+
+ def test_one_arg_raises(self):
+ with pytest.raises(TypeError, match="fn\\(key, config\\)"):
+ base._validate_func(lambda x: x)
+
+ def test_zero_arg_raises(self):
+ with pytest.raises(TypeError):
+ base._validate_func(lambda: 1)
+
+ def test_uninspectable_function_warns(self):
+ # Simulate inspect.signature raising a non-TypeError ValueError
+ with patch("inspect.signature", side_effect=ValueError("no signature")):
+ with warnings.catch_warnings(record=True) as w:
+ warnings.simplefilter("always")
+ base._validate_func(lambda key, config: config)
+ assert len(w) == 1
+ assert "introspect" in str(w[0].message).lower()
+
+ def test_uninspectable_function_returns_none(self):
+ with patch("inspect.signature", side_effect=ValueError("no signature")):
+ result = base._validate_func(lambda key, config: config)
+ assert result is None
+
+
+class TestOptimizerBase:
+ def test_init_returns_state_and_optimizer(self):
+ space = {"x": jnp.array(0.0)}
+ state, optimizer = base.Optimizer.init(space)
+ assert isinstance(state, base.OptimizerState)
+ assert isinstance(optimizer, base.Optimizer)
+
+ def test_init_state_stores_space(self):
+ space = {"x": jnp.array(1.0), "y": jnp.array(2.0)}
+ state, _ = base.Optimizer.init(space)
+ assert state.space == space
+
+ def test_update_state_raises_not_implemented(self):
+ state, optimizer = base.Optimizer.init({})
+ with pytest.raises(NotImplementedError):
+ optimizer.update_state(state, jax.random.PRNGKey(0), jnp.array(1.0))
+
+ def test_get_next_params_raises_not_implemented(self):
+ state, optimizer = base.Optimizer.init({})
+ with pytest.raises(NotImplementedError):
+ optimizer.get_next_params(state, jax.random.PRNGKey(0))
diff --git a/tests/test_bayes.py b/tests/test_bayes.py
index 2309a0c..92797d5 100644
--- a/tests/test_bayes.py
+++ b/tests/test_bayes.py
@@ -1,58 +1,829 @@
+import jax
import jax.numpy as jnp
+import pytest
-from hyperoptax.bayesian import BayesianOptimizer
-from hyperoptax.spaces import LinearSpace
+from hyperoptax import acquisition as acq
+from hyperoptax import bayesian, kernels
+from hyperoptax import spaces as sp
-class TestBayes:
+class TestBayesianSearchInit:
+ def test_state_shapes(self):
+ space = {"x": sp.DiscreteSpace([0.0, 0.5, 1.0])}
+ state, _ = bayesian.BayesianSearch.init(space, n_max=20)
+ assert state.X.shape == (20, 1)
+ assert state.y.shape == (20,)
+ assert state.mask.shape == (20,)
+ assert state.log_length_scale.shape == (1,)
+
+ def test_state_initial_values(self):
+ space = {"x": sp.DiscreteSpace([0.0, 0.5, 1.0])}
+ state, _ = bayesian.BayesianSearch.init(space, n_max=10)
+ assert not state.mask.any()
+ assert jnp.all(state.X == 0.0)
+ assert jnp.all(state.y == 0.0)
+
+ def test_log_length_scale_initialized_from_kernel(self):
+ space = {"x": sp.DiscreteSpace([0.0, 0.5, 1.0])}
+ state, _ = bayesian.BayesianSearch.init(
+ space, kernel=kernels.RBF(length_scale=2.0)
+ )
+ assert jnp.allclose(state.log_length_scale, jnp.log(2.0))
+
+ def test_2d_space_n_params(self):
+ space = {"x": sp.DiscreteSpace([0, 1]), "y": sp.DiscreteSpace([0, 1, 2])}
+ state, _ = bayesian.BayesianSearch.init(space, n_max=10)
+ assert state.X.shape == (10, 2)
+ assert state.log_length_scale.shape == (2,)
+
+ def test_returns_optimizer_instance(self):
+ space = {"x": sp.DiscreteSpace([0.0, 0.5, 1.0])}
+ _, optimizer = bayesian.BayesianSearch.init(space)
+ assert isinstance(optimizer, bayesian.BayesianSearch)
+
+ def test_custom_kernel_and_acquisition(self):
+ space = {"x": sp.DiscreteSpace([0.0, 0.5, 1.0])}
+ _, optimizer = bayesian.BayesianSearch.init(
+ space, kernel=kernels.RBF(), acquisition=acq.EI()
+ )
+ assert isinstance(optimizer.kernel, kernels.RBF)
+ assert isinstance(optimizer.acquisition, acq.EI)
+
+ def test_default_n_max(self):
+ space = {"x": sp.LinearSpace(0.0, 1.0)}
+ state, _ = bayesian.BayesianSearch.init(space)
+ assert state.X.shape[0] == 200
+
+
+class TestBayesianSearchUpdateState:
def setup_method(self):
- self.high_dim_domain = {
- "x": LinearSpace(-1, 1, 11),
- "y": LinearSpace(-1, 1, 11),
- "z": LinearSpace(-1, 1, 11),
- "w": LinearSpace(-1, 1, 11),
- }
- self.low_dim_domain = {
- "x": LinearSpace(-1, 1, 11),
+ self.space = {"x": sp.DiscreteSpace([0.0, 0.5, 1.0])}
+ self.state, self.optimizer = bayesian.BayesianSearch.init(
+ self.space, n_max=10, n_hparam_steps=0
+ )
+ self.key = jax.random.PRNGKey(0)
+
+ def test_mask_updated(self):
+ x_new = jnp.array([[0.5]])
+ new_state = self.optimizer.update_state(
+ self.state, self.key, jnp.array([0.5]), x_new
+ )
+ assert new_state.mask[0]
+ assert not new_state.mask[1:].any()
+
+ def test_X_updated(self):
+ x_new = jnp.array([[0.5]])
+ new_state = self.optimizer.update_state(
+ self.state, self.key, jnp.array([0.5]), x_new
+ )
+ assert jnp.allclose(new_state.X[0], x_new[0])
+
+ def test_y_updated(self):
+ x_new = jnp.array([[0.5]])
+ new_state = self.optimizer.update_state(
+ self.state, self.key, jnp.array([0.75]), x_new
+ )
+ assert jnp.allclose(new_state.y[0], 0.75)
+
+ def test_y_stores_raw_value_when_minimizing(self):
+ _, optimizer = bayesian.BayesianSearch.init(
+ self.space, n_max=10, maximize=False, n_hparam_steps=0
+ )
+ x_new = jnp.array([[0.5]])
+ new_state = optimizer.update_state(
+ self.state, self.key, jnp.array([0.75]), x_new
+ )
+ assert jnp.allclose(new_state.y[0], 0.75)
+
+ def test_fixed_size_maintained(self):
+ x_new = jnp.array([[0.5]])
+ new_state = self.optimizer.update_state(
+ self.state, self.key, jnp.array([0.5]), x_new
+ )
+ assert new_state.X.shape == self.state.X.shape
+ assert new_state.y.shape == self.state.y.shape
+
+ def test_sequential_updates(self):
+ state = self.state
+ for x_val, y_val in [(0.0, 0.1), (0.5, 0.9), (1.0, 0.4)]:
+ x_new = jnp.array([[x_val]])
+ state = self.optimizer.update_state(
+ state, self.key, jnp.array([y_val]), x_new
+ )
+ assert int(state.mask.sum()) == 3
+ assert jnp.allclose(state.y[:3], jnp.array([0.1, 0.9, 0.4]))
+
+ def test_overflow_truncates_to_remaining_slots(self):
+ """When buffer has k < n_parallel slots left, only k observations are stored."""
+ state, optimizer = bayesian.BayesianSearch.init(
+ self.space, n_max=3, n_hparam_steps=0
+ )
+ # fill 2 of 3 slots
+ state = optimizer.update_state(
+ state, self.key, jnp.array([0.1]), jnp.array([[0.0]])
+ )
+ state = optimizer.update_state(
+ state, self.key, jnp.array([0.2]), jnp.array([[0.5]])
+ )
+ assert int(state.mask.sum()) == 2
+
+ # try to store 5 at once β only 1 slot remains
+ x_batch = jnp.array([[0.0], [0.25], [0.5], [0.75], [1.0]])
+ r_batch = jnp.array([0.3, 0.4, 0.5, 0.6, 0.7])
+ state = optimizer.update_state(state, self.key, r_batch, x_batch)
+ assert int(state.mask.sum()) == 3 # only 1 extra stored
+ assert jnp.allclose(state.y[2], 0.3) # first result from batch
+
+ def test_overflow_at_zero_remaining_is_noop(self):
+ """Calling update_state on a full buffer returns state unchanged."""
+ state, optimizer = bayesian.BayesianSearch.init(
+ self.space, n_max=2, n_hparam_steps=0
+ )
+ state = optimizer.update_state(
+ state, self.key, jnp.array([0.5]), jnp.array([[0.5]])
+ )
+ state = optimizer.update_state(
+ state, self.key, jnp.array([0.9]), jnp.array([[1.0]])
+ )
+ assert int(state.mask.sum()) == 2
+
+ state_after = optimizer.update_state(
+ state, self.key, jnp.array([0.1]), jnp.array([[0.0]])
+ )
+ assert int(state_after.mask.sum()) == 2 # unchanged
+ assert jnp.array_equal(state_after.y, state.y)
+
+ def test_n_parallel_overflow_stores_only_remainder(self):
+ """With n_max=7 and n_parallel=4: 1 full iter (4 stored) + overflow stores 3."""
+ state, optimizer = bayesian.BayesianSearch.init(
+ self.space, n_max=7, n_parallel=4, n_hparam_steps=0
+ )
+ x4 = jnp.zeros((4, 1))
+ r4 = jnp.ones(4) * 0.5
+ state = optimizer.update_state(state, self.key, r4, x4)
+ assert int(state.mask.sum()) == 4
+
+ # 3 slots remain; try to store 4
+ state = optimizer.update_state(state, self.key, r4, x4)
+ assert int(state.mask.sum()) == 7 # capped at n_max
+
+
+class TestNIterations:
+ """Tests for the _n_iterations helper and the resulting loop count."""
+
+ def setup_method(self):
+ self.space = {"x": sp.LinearSpace(0.0, 1.0)}
+ self.func = lambda key, config: -(config["x"] ** 2)
+
+ def _run(self, n_max, n_parallel):
+ state, opt = bayesian.BayesianSearch.init(
+ self.space, n_max=n_max, n_parallel=n_parallel, n_hparam_steps=0
+ )
+ state, (params_hist, results_hist) = opt.optimize(
+ state, jax.random.PRNGKey(0), self.func
+ )
+ return state, params_hist, results_hist
+
+ def test_exact_fit_iterations(self):
+ """n_max divisible by n_parallel: exactly n_max//n_parallel iterations."""
+ state, params_hist, _ = self._run(n_max=10, n_parallel=2)
+ assert len(params_hist) == 5
+ assert int(state.mask.sum()) == 10
+
+ def test_exact_fit_parallel_1(self):
+ state, params_hist, _ = self._run(n_max=7, n_parallel=1)
+ assert len(params_hist) == 7
+ assert int(state.mask.sum()) == 7
+
+ def test_overflow_one_extra_iteration(self):
+ """n_max=9, n_parallel=4: 2 full iters + 1 overflow = 3 iters, 9 stored."""
+ state, params_hist, _ = self._run(n_max=9, n_parallel=4)
+ assert len(params_hist) == 3 # ceil(9/4)
+ assert int(state.mask.sum()) == 9
+
+ def test_overflow_remainder_1(self):
+ """n_max=11, n_parallel=5: 2 full + 1 overflow (stores 1) = 3 iters."""
+ state, params_hist, _ = self._run(n_max=11, n_parallel=5)
+ assert len(params_hist) == 3
+ assert int(state.mask.sum()) == 11
+
+ def test_overflow_n_max_less_than_n_parallel(self):
+ """n_max < n_parallel: single overflow iteration, stores n_max."""
+ state, params_hist, _ = self._run(n_max=3, n_parallel=10)
+ assert len(params_hist) == 1
+ assert int(state.mask.sum()) == 3
+
+ def test_overflow_n_max_equals_n_parallel(self):
+ """n_max == n_parallel: exactly 1 iteration, all slots filled."""
+ state, params_hist, _ = self._run(n_max=5, n_parallel=5)
+ assert len(params_hist) == 1
+ assert int(state.mask.sum()) == 5
+
+ def test_n_iterations_from_partial_state(self):
+ """Starting from a pre-populated state uses remaining slots only."""
+ state, opt = bayesian.BayesianSearch.init(
+ self.space, n_max=10, n_parallel=3, n_hparam_steps=0
+ )
+ # pre-load 4 observations
+ for v in [0.1, 0.2, 0.3, 0.4]:
+ state = opt.update_state(
+ state, jax.random.PRNGKey(0), jnp.array([v]), jnp.array([[v]])
+ )
+ assert int(state.mask.sum()) == 4 # 6 slots remaining
+
+ state, (params_hist, _) = opt.optimize(state, jax.random.PRNGKey(1), self.func)
+ # 6 remaining // 3 = 2 full + 0 overflow = 2 iters, ends at 10
+ assert len(params_hist) == 2
+ assert int(state.mask.sum()) == 10
+
+ def test_n_iterations_from_partial_state_with_overflow(self):
+ """Remaining slots not divisible by n_parallel β overflow iteration."""
+ state, opt = bayesian.BayesianSearch.init(
+ self.space, n_max=10, n_parallel=3, n_hparam_steps=0
+ )
+ # pre-load 5 observations β 5 remaining
+ for v in [0.1, 0.2, 0.3, 0.4, 0.5]:
+ state = opt.update_state(
+ state, jax.random.PRNGKey(0), jnp.array([v]), jnp.array([[v]])
+ )
+ state, (params_hist, _) = opt.optimize(state, jax.random.PRNGKey(1), self.func)
+ # 5 remaining // 3 = 1 full + 1 overflow = 2 iters, ends at 10
+ assert len(params_hist) == 2
+ assert int(state.mask.sum()) == 10
+
+ def test_full_buffer_runs_zero_iterations(self):
+ """Calling optimize on a full buffer runs 0 iterations."""
+ state, opt = bayesian.BayesianSearch.init(
+ self.space, n_max=2, n_parallel=1, n_hparam_steps=0
+ )
+ state = opt.update_state(
+ state, jax.random.PRNGKey(0), jnp.array([0.5]), jnp.array([[0.5]])
+ )
+ state = opt.update_state(
+ state, jax.random.PRNGKey(0), jnp.array([0.9]), jnp.array([[0.9]])
+ )
+ state2, (params_hist, results_hist) = opt.optimize(
+ state, jax.random.PRNGKey(0), self.func
+ )
+ assert len(params_hist) == 0
+ assert int(state2.mask.sum()) == 2 # unchanged
+
+ def test_results_hist_length_matches_params_hist(self):
+ state, params_hist, results_hist = self._run(n_max=9, n_parallel=4)
+ assert len(params_hist) == len(results_hist)
+
+ def test_each_results_item_has_n_parallel_shape(self):
+ """Every results item has shape (n_parallel,) including overflow iteration."""
+ state, opt = bayesian.BayesianSearch.init(
+ self.space, n_max=9, n_parallel=4, n_hparam_steps=0
+ )
+ state, (_, results_hist) = opt.optimize(state, jax.random.PRNGKey(0), self.func)
+ for r in results_hist:
+ assert r.shape == (4,)
+
+
+class TestBayesianSearchGetNextParams:
+ def setup_method(self):
+ self.space = {"x": sp.DiscreteSpace([0.0, 0.25, 0.5, 0.75, 1.0])}
+ self.state, self.optimizer = bayesian.BayesianSearch.init(self.space, n_max=20)
+ self.key = jax.random.PRNGKey(0)
+
+ def test_random_pick_when_no_observations(self):
+ params = self.optimizer.get_next_params(self.state, self.key)
+ assert "x" in params
+ valid_values = [0.0, 0.25, 0.5, 0.75, 1.0]
+ assert float(params["x"][0]) in valid_values
+
+ def test_returns_valid_candidate_value(self):
+ params = self.optimizer.get_next_params(self.state, self.key)
+ valid_values = [0.0, 0.25, 0.5, 0.75, 1.0]
+ assert float(params["x"][0]) in valid_values
+
+ def test_gp_pick_after_observations(self):
+ state = self.state
+ for x_val, y_val in [(0.0, 0.1), (1.0, 0.9)]:
+ state = self.optimizer.update_state(
+ state, self.key, jnp.array([y_val]), jnp.array([[x_val]])
+ )
+ params = self.optimizer.get_next_params(state, self.key)
+ assert "x" in params
+ assert float(params["x"][0]) not in [0.0, 1.0]
+
+ def test_2d_space(self):
+ space = {"x": sp.DiscreteSpace([0, 1]), "y": sp.DiscreteSpace([0, 1, 2])}
+ state, optimizer = bayesian.BayesianSearch.init(space, n_max=10)
+ params = optimizer.get_next_params(state, self.key)
+ assert "x" in params
+ assert "y" in params
+ assert params["x"].shape == (1,)
+ assert params["y"].shape == (1,)
+
+ def test_n_parallel_discrete(self):
+ space = {"x": sp.DiscreteSpace([0.0, 0.25, 0.5, 0.75, 1.0])}
+ state, optimizer = bayesian.BayesianSearch.init(space, n_max=20, n_parallel=3)
+ params = optimizer.get_next_params(state, self.key)
+ assert params["x"].shape == (3,)
+
+
+class TestBayesianSearchOptimize:
+ def test_optimize_returns_correct_shapes(self):
+ space = {"x": sp.DiscreteSpace([0.0, 0.25, 0.5, 0.75, 1.0])}
+ state, optimizer = bayesian.BayesianSearch.init(space, n_max=5)
+ func = lambda key, config: -(config["x"] ** 2)
+ state, (params_hist, results_hist) = optimizer.optimize(
+ state, jax.random.PRNGKey(0), func
+ )
+ assert len(params_hist) == 5
+ assert len(results_hist) == 5
+
+ def test_optimize_fills_state(self):
+ space = {"x": sp.DiscreteSpace([0.0, 0.25, 0.5, 0.75, 1.0])}
+ state, optimizer = bayesian.BayesianSearch.init(space, n_max=5)
+ func = lambda key, config: -(config["x"] ** 2)
+ state, _ = optimizer.optimize(state, jax.random.PRNGKey(0), func)
+ assert int(state.mask.sum()) == 5
+
+ def test_optimize_finds_optimum(self):
+ space = {"x": sp.DiscreteSpace([0.0, 0.25, 0.5, 0.75, 1.0])}
+ state, optimizer = bayesian.BayesianSearch.init(space, n_max=20)
+ func = lambda key, config: -(config["x"] ** 2)
+ state, (params_hist, results_hist) = optimizer.optimize(
+ state, jax.random.PRNGKey(0), func
+ )
+ best_idx = results_hist.index(max(results_hist, key=lambda r: float(r[0])))
+ assert float(params_hist[best_idx]["x"][0]) == pytest.approx(0.0)
+
+ def test_optimize_with_array_result(self):
+ space = {"x": sp.DiscreteSpace([0.0, 0.25, 0.5, 0.75, 1.0])}
+ state, optimizer = bayesian.BayesianSearch.init(space, n_max=3)
+ func = lambda key, config: jnp.array([-(config["x"] ** 2)])
+ state, (_, results_hist) = optimizer.optimize(
+ state, jax.random.PRNGKey(0), func
+ )
+ assert int(state.mask.sum()) == 3
+
+ def test_optimize_converges_toward_optimum(self):
+ space = {"x": sp.DiscreteSpace([0.0, 0.25, 0.5, 0.75, 1.0])}
+ state, optimizer = bayesian.BayesianSearch.init(
+ space, n_max=20, acquisition=acq.UCB()
+ )
+ func = lambda key, config: -(config["x"] ** 2)
+ state, _ = optimizer.optimize(state, jax.random.PRNGKey(0), func)
+ assert float(jnp.min(state.X[:20, 0])) == pytest.approx(0.0)
+
+ def test_optimize_continuous_space(self):
+ space = {"x": sp.LinearSpace(0.0, 1.0)}
+ state, optimizer = bayesian.BayesianSearch.init(space, n_max=5)
+ func = lambda key, config: -(config["x"] ** 2)
+ state, (params_hist, results_hist) = optimizer.optimize(
+ state, jax.random.PRNGKey(0), func
+ )
+ assert len(params_hist) == 5
+ assert int(state.mask.sum()) == 5
+
+ def test_optimize_continuous_with_ei_uses_observed_y_max(self):
+ space = {"x": sp.LinearSpace(0.0, 1.0), "y": sp.LinearSpace(0.0, 1.0)}
+ state, optimizer = bayesian.BayesianSearch.init(
+ space, n_max=20, acquisition=acq.EI()
+ )
+ state = optimizer.update_state(
+ state, jax.random.PRNGKey(0), jnp.array([100.0]), jnp.array([[0.5, 0.5]])
+ )
+ params = optimizer.get_next_params(state, jax.random.PRNGKey(1))
+ assert "x" in params and "y" in params
+
+ def test_optimize_minimize(self):
+ space = {"x": sp.DiscreteSpace([0.0, 0.25, 0.5, 0.75, 1.0])}
+ state, optimizer = bayesian.BayesianSearch.init(space, n_max=10, maximize=False)
+ func = lambda key, config: config["x"] ** 2
+ state, _ = optimizer.optimize(state, jax.random.PRNGKey(0), func)
+ assert int(state.mask.sum()) == 10
+ assert float(optimizer.best_result(state)) == pytest.approx(0.0)
+
+ def test_optimize_n_parallel_fills_buffer(self):
+ space = {"x": sp.DiscreteSpace([0.0, 0.25, 0.5, 0.75, 1.0])}
+ state, optimizer = bayesian.BayesianSearch.init(space, n_max=10, n_parallel=2)
+ func = lambda key, config: -(config["x"] ** 2)
+ state, (params_hist, results_hist) = optimizer.optimize(
+ state, jax.random.PRNGKey(0), func
+ )
+ assert len(params_hist) == 5 # 10 // 2
+ assert int(state.mask.sum()) == 10
+ assert results_hist[0].shape == (2,)
+
+
+class TestBestParamsResult:
+ def setup_method(self):
+ self.space = {"x": sp.DiscreteSpace([0.0, 0.25, 0.5, 0.75, 1.0])}
+ self.key = jax.random.PRNGKey(0)
+
+ def _state_with_obs(self, optimizer, observations):
+ state, _ = bayesian.BayesianSearch.init(
+ self.space, n_max=10, n_hparam_steps=0, maximize=optimizer.maximize
+ )
+ for x_val, y_val in observations:
+ state = optimizer.update_state(
+ state, self.key, jnp.array([y_val]), jnp.array([[x_val]])
+ )
+ return state
+
+ def test_best_result_maximize(self):
+ _, optimizer = bayesian.BayesianSearch.init(
+ self.space, n_max=10, n_hparam_steps=0
+ )
+ state = self._state_with_obs(optimizer, [(0.25, 0.5), (0.75, 0.9), (0.5, 0.3)])
+ assert float(optimizer.best_result(state)) == pytest.approx(0.9)
+
+ def test_best_result_minimize(self):
+ _, optimizer = bayesian.BayesianSearch.init(
+ self.space, n_max=10, n_hparam_steps=0, maximize=False
+ )
+ state = self._state_with_obs(optimizer, [(0.25, 0.5), (0.75, 0.9), (0.5, 0.2)])
+ assert float(optimizer.best_result(state)) == pytest.approx(0.2)
+
+ def test_best_params_maximize(self):
+ _, optimizer = bayesian.BayesianSearch.init(
+ self.space, n_max=10, n_hparam_steps=0
+ )
+ state = self._state_with_obs(optimizer, [(0.25, 0.5), (0.75, 0.9), (0.5, 0.3)])
+ params = optimizer.best_params(state)
+ assert float(params["x"]) == pytest.approx(0.75)
+
+ def test_best_params_minimize(self):
+ _, optimizer = bayesian.BayesianSearch.init(
+ self.space, n_max=10, n_hparam_steps=0, maximize=False
+ )
+ state = self._state_with_obs(optimizer, [(0.25, 0.5), (0.75, 0.9), (0.5, 0.2)])
+ params = optimizer.best_params(state)
+ assert float(params["x"]) == pytest.approx(0.5)
+
+ def test_best_result_after_full_optimize(self):
+ state, optimizer = bayesian.BayesianSearch.init(self.space, n_max=10)
+ func = lambda key, config: -(config["x"] ** 2)
+ state, _ = optimizer.optimize(state, jax.random.PRNGKey(0), func)
+ assert float(optimizer.best_result(state)) == pytest.approx(
+ float(jnp.max(state.y, where=state.mask, initial=-jnp.inf))
+ )
+
+
+class TestHparamTuning:
+ def setup_method(self):
+ self.space = {"x": sp.LinearSpace(0.0, 1.0)}
+ self.key = jax.random.PRNGKey(0)
+
+ def test_log_length_scale_changes_after_observations(self):
+ state, optimizer = bayesian.BayesianSearch.init(
+ self.space, n_max=10, n_hparam_steps=20
+ )
+ initial_log_ls = state.log_length_scale
+ state = optimizer.update_state(
+ state, self.key, jnp.array([0.5]), jnp.array([[0.3]])
+ )
+ state = optimizer.update_state(
+ state, self.key, jnp.array([0.8]), jnp.array([[0.7]])
+ )
+ assert not jnp.allclose(state.log_length_scale, initial_log_ls)
+
+ def test_log_length_scale_unchanged_when_n_hparam_steps_0(self):
+ state, optimizer = bayesian.BayesianSearch.init(
+ self.space, n_max=10, n_hparam_steps=0
+ )
+ initial_log_ls = state.log_length_scale
+ state = optimizer.update_state(
+ state, self.key, jnp.array([0.5]), jnp.array([[0.3]])
+ )
+ state = optimizer.update_state(
+ state, self.key, jnp.array([0.8]), jnp.array([[0.7]])
+ )
+ assert jnp.allclose(state.log_length_scale, initial_log_ls)
+
+ def test_log_length_scale_unchanged_with_single_observation(self):
+ state, optimizer = bayesian.BayesianSearch.init(
+ self.space, n_max=10, n_hparam_steps=20
+ )
+ initial_log_ls = state.log_length_scale
+ state = optimizer.update_state(
+ state, self.key, jnp.array([0.5]), jnp.array([[0.3]])
+ )
+ assert jnp.allclose(state.log_length_scale, initial_log_ls)
+
+ def test_tuned_length_scale_used_in_gp(self):
+ state, optimizer = bayesian.BayesianSearch.init(
+ self.space, n_max=10, n_hparam_steps=20
+ )
+ func = lambda key, config: -(config["x"] ** 2)
+ state, _ = optimizer.optimize(state, jax.random.PRNGKey(0), func)
+ assert int(state.mask.sum()) == 10
+
+ def test_length_scale_initialized_from_kernel(self):
+ state, _ = bayesian.BayesianSearch.init(
+ self.space, n_max=10, kernel=kernels.RBF(length_scale=3.0)
+ )
+ assert jnp.allclose(jnp.exp(state.log_length_scale), 3.0)
+
+
+class TestNWarmup:
+ def test_n_warmup_default(self):
+ space = {"x": sp.DiscreteSpace([0.0, 0.25, 0.5, 0.75, 1.0])}
+ _, optimizer = bayesian.BayesianSearch.init(space)
+ assert optimizer.n_warmup == 1
+
+ def test_n_warmup_runs_correctly(self):
+ space = {"x": sp.LinearSpace(0.0, 1.0)}
+ state, optimizer = bayesian.BayesianSearch.init(space, n_max=8, n_warmup=4)
+ func = lambda key, config: -(config["x"] ** 2)
+ state, _ = optimizer.optimize(state, jax.random.PRNGKey(0), func)
+ assert int(state.mask.sum()) == 8
+
+ def test_n_warmup_3_discrete(self):
+ space = {"x": sp.DiscreteSpace([0.0, 0.25, 0.5, 0.75, 1.0])}
+ state, optimizer = bayesian.BayesianSearch.init(
+ space, n_max=5, n_warmup=3, n_hparam_steps=0
+ )
+ func = lambda key, config: -(config["x"] ** 2)
+ state, _ = optimizer.optimize(state, jax.random.PRNGKey(0), func)
+ assert int(state.mask.sum()) == 5
+
+
+class TestMixedSpace:
+ def test_get_next_params_mixed(self):
+ space = {
+ "lr": sp.LogSpace(1e-4, 1e-1),
+ "layers": sp.DiscreteSpace([1, 2, 3, 4]),
}
- self.high_dim_function = lambda x, y, z, w: -(x**2) - (y**2) - (z**2) - (w**2)
- self.low_dim_function = lambda x: -(x**2)
-
- def test_bayes_optimizer_improve_in_high_dim(self):
- # make function where optimum is in the center of high dimensional domain
- bayes = BayesianOptimizer(self.high_dim_domain, self.high_dim_function)
- result = bayes.optimize(n_iterations=100, n_vmap=10)
- assert jnp.allclose(result, jnp.array([0.0, 0.0, 0.0, 0.0]))
-
- def test_bayes_optimizer_jit(self):
- bayes = BayesianOptimizer(self.high_dim_domain, self.high_dim_function)
- result = bayes.optimize(n_iterations=100, n_vmap=10, jit=True)
- assert jnp.allclose(result, jnp.array([0.0, 0.0, 0.0, 0.0]))
-
- def test_bayes_optimizer_when_n_parallel_is_1(self):
- bayes = BayesianOptimizer(self.high_dim_domain, self.high_dim_function)
- result = bayes.optimize(n_iterations=100, n_vmap=1)
- assert jnp.allclose(result, jnp.array([0.0, 0.0, 0.0, 0.0]))
-
- def test_bayes_optimizer_when_n_parallel_not_multiple_of_n_iterations(self):
- bayes = BayesianOptimizer(self.high_dim_domain, self.high_dim_function)
- result = bayes.optimize(n_iterations=100, n_vmap=13)
- assert jnp.allclose(result, jnp.array([0.0, 0.0, 0.0, 0.0]))
-
- def test_bayes_optimizer_when_n_iterations_is_minus_1(self):
- bayes = BayesianOptimizer(self.low_dim_domain, self.low_dim_function)
- result = bayes.optimize(n_iterations=-1, n_vmap=2)
- assert jnp.allclose(result, jnp.array([0.0]))
-
- def test_optimizer_when_maximize_is_false(self):
- def minus_f(x, y, z, w):
- return -self.high_dim_function(x, y, z, w)
-
- bayes = BayesianOptimizer(self.high_dim_domain, minus_f)
- result = bayes.optimize(n_iterations=100, n_vmap=1, maximize=False)
- assert jnp.allclose(result, jnp.array([0.0, 0.0, 0.0, 0.0]))
-
- def test_bayes_optimizer_with_pmap(self):
- bayes = BayesianOptimizer(self.high_dim_domain, self.high_dim_function)
- result = bayes.optimize(n_iterations=400, n_vmap=4, n_pmap=4)
- assert jnp.allclose(result, jnp.array([0.0, 0.0, 0.0, 0.0]))
+ state, optimizer = bayesian.BayesianSearch.init(space, n_max=20)
+ params = optimizer.get_next_params(state, jax.random.PRNGKey(0))
+ assert "lr" in params and "layers" in params
+ assert params["lr"].shape == (1,)
+ assert float(params["layers"][0]) in [1, 2, 3, 4]
+
+ def test_optimize_mixed_space(self):
+ space = {"x": sp.LinearSpace(0.0, 1.0), "n": sp.DiscreteSpace([1, 2, 4, 8])}
+ state, optimizer = bayesian.BayesianSearch.init(space, n_max=6)
+ func = lambda key, config: -(config["x"] ** 2) + config["n"] * 0.1
+ state, (params_hist, results_hist) = optimizer.optimize(
+ state, jax.random.PRNGKey(0), func
+ )
+ assert int(state.mask.sum()) == 6
+ for p in params_hist:
+ assert float(p["n"][0]) in [1, 2, 4, 8]
+
+
+class TestValidateFunc:
+ def test_single_arg_raises(self):
+ space = {"x": sp.LinearSpace(0.0, 1.0)}
+ state, optimizer = bayesian.BayesianSearch.init(space, n_max=5)
+ with pytest.raises(TypeError, match="fn\\(key, config\\)"):
+ optimizer.optimize(state, jax.random.PRNGKey(0), lambda x: x)
+
+ def test_zero_arg_raises(self):
+ space = {"x": sp.LinearSpace(0.0, 1.0)}
+ state, optimizer = bayesian.BayesianSearch.init(space, n_max=5)
+ with pytest.raises(TypeError):
+ optimizer.optimize(state, jax.random.PRNGKey(0), lambda: 1.0)
+
+ def test_two_arg_passes(self):
+ space = {"x": sp.LinearSpace(0.0, 1.0)}
+ state, optimizer = bayesian.BayesianSearch.init(space, n_max=5)
+ optimizer.optimize(
+ state, jax.random.PRNGKey(0), lambda key, config: config["x"]
+ )
+
+
+class TestBayesianSearchOptimizeScan:
+ def test_optimize_scan_runs(self):
+ space = {"x": sp.LinearSpace(0.0, 1.0)}
+ state, optimizer = bayesian.BayesianSearch.init(space, n_max=5)
+ func = lambda key, config: -(config["x"] ** 2)
+ state, (params_hist, results_hist) = optimizer.optimize_scan(
+ state, jax.random.PRNGKey(0), func
+ )
+ assert params_hist["x"].shape[0] == 5
+ assert results_hist.shape[0] == 5
+ assert int(state.mask.sum()) == 5
+
+ def test_optimize_scan_overflow(self):
+ """optimize_scan also handles overflow correctly."""
+ space = {"x": sp.LinearSpace(0.0, 1.0)}
+ state, optimizer = bayesian.BayesianSearch.init(space, n_max=7, n_parallel=3)
+ func = lambda key, config: -(config["x"] ** 2)
+ state, (params_hist, results_hist) = optimizer.optimize_scan(
+ state, jax.random.PRNGKey(0), func
+ )
+ # 7 // 3 = 2 full + 1 overflow = 3 iters
+ assert params_hist["x"].shape[0] == 3
+ assert int(state.mask.sum()) == 7
+
+
+class TestMaximizeMinimize:
+ def test_maximize_default_is_true(self):
+ space = {"x": sp.LinearSpace(0.0, 1.0)}
+ _, optimizer = bayesian.BayesianSearch.init(space)
+ assert optimizer.maximize is True
+
+ def test_minimize_stores_raw_y(self):
+ space = {"x": sp.DiscreteSpace([0.0, 0.5, 1.0])}
+ state, optimizer = bayesian.BayesianSearch.init(
+ space, n_max=10, maximize=False, n_hparam_steps=0
+ )
+ x_new = jnp.array([[0.5]])
+ state = optimizer.update_state(
+ state, jax.random.PRNGKey(0), jnp.array([3.14]), x_new
+ )
+ assert float(state.y[0]) == pytest.approx(3.14)
+
+ def test_best_result_minimize_returns_minimum(self):
+ space = {"x": sp.DiscreteSpace([0.0, 0.25, 0.5, 0.75, 1.0])}
+ state, optimizer = bayesian.BayesianSearch.init(
+ space, n_max=10, maximize=False, n_hparam_steps=0
+ )
+ key = jax.random.PRNGKey(0)
+ for x_val, y_val in [(0.0, 5.0), (0.5, 2.0), (1.0, 8.0)]:
+ state = optimizer.update_state(
+ state, key, jnp.array([y_val]), jnp.array([[x_val]])
+ )
+ assert float(optimizer.best_result(state)) == pytest.approx(2.0)
+
+ def test_effective_y_negated_for_minimize(self):
+ space = {"x": sp.DiscreteSpace([0.0, 0.5, 1.0])}
+ state, optimizer = bayesian.BayesianSearch.init(
+ space, n_max=10, maximize=False, n_hparam_steps=0
+ )
+ key = jax.random.PRNGKey(0)
+ state = optimizer.update_state(state, key, jnp.array([3.0]), jnp.array([[0.5]]))
+ eff = optimizer._effective_y(state)
+ assert float(eff[0]) == pytest.approx(-3.0)
+
+
+class TestGPInternals:
+ def setup_method(self):
+ self.space = {"x": sp.LinearSpace(0.0, 1.0)}
+ self.state, self.optimizer = bayesian.BayesianSearch.init(
+ self.space, n_max=10, n_hparam_steps=0
+ )
+ key = jax.random.PRNGKey(0)
+ for x_val, y_val in [(0.1, 0.2), (0.5, 0.8), (0.9, 0.3)]:
+ self.state = self.optimizer.update_state(
+ self.state, key, jnp.array([y_val]), jnp.array([[x_val]])
+ )
+
+ def test_gp_posterior_matches_fit_predict(self):
+ ls = jnp.exp(self.state.log_length_scale)
+ eff_y = self.optimizer._effective_y(self.state)
+ X_test = jnp.array([[0.3], [0.7]])
+ mean_post, std_post = self.optimizer._gp_posterior(
+ self.state.X, eff_y, self.state.mask, X_test, ls
+ )
+ L, alpha, ymean = self.optimizer._gp_fit(
+ self.state.X, eff_y, self.state.mask, ls
+ )
+ mean_fp, std_fp = self.optimizer._gp_predict(
+ X_test, L, alpha, ymean, self.state.X, ls
+ )
+ assert jnp.allclose(mean_post, mean_fp)
+ assert jnp.allclose(std_post, std_fp)
+
+ def test_gp_posterior_returns_correct_shapes(self):
+ ls = jnp.exp(self.state.log_length_scale)
+ eff_y = self.optimizer._effective_y(self.state)
+ X_test = jnp.array([[0.2], [0.4], [0.6], [0.8]])
+ mean, std = self.optimizer._gp_posterior(
+ self.state.X, eff_y, self.state.mask, X_test, ls
+ )
+ assert mean.shape == (4,)
+ assert std.shape == (4,)
+ assert jnp.all(std >= 0.0)
+
+
+class TestLBFGSImprovement:
+ def test_lbfgs_improves_over_seed(self):
+ space = {"x": sp.LinearSpace(0.0, 1.0), "y": sp.LinearSpace(0.0, 1.0)}
+ state, optimizer = bayesian.BayesianSearch.init(
+ space,
+ n_max=30,
+ n_candidates=200,
+ n_restarts=4,
+ n_lbfgs_steps=50,
+ n_hparam_steps=0,
+ )
+ key = jax.random.PRNGKey(42)
+ obs = [
+ ([0.3, 0.7], 1.0),
+ ([0.0, 0.0], 0.0),
+ ([1.0, 1.0], 0.1),
+ ([0.5, 0.5], 0.3),
+ ([0.3, 0.5], 0.6),
+ ]
+ for (x, y_), r in obs:
+ state = optimizer.update_state(
+ state, key, jnp.array([r]), jnp.array([[x, y_]])
+ )
+ params = optimizer.get_next_params(state, key)
+ assert params["x"].shape == (1,)
+ assert 0.0 <= float(params["x"][0]) <= 1.0
+ assert 0.0 <= float(params["y"][0]) <= 1.0
+
+
+class TestKrigingBelieverHallucination:
+ """Tests for pluggable KB hallucination strategies."""
+
+ def _make_state_with_obs(
+ self, space, n_max, n_parallel, hallucination=None, n_obs=3
+ ):
+ kwargs = dict(
+ n_max=n_max,
+ n_parallel=n_parallel,
+ n_hparam_steps=0,
+ n_restarts=1,
+ n_lbfgs_steps=5,
+ n_candidates=50,
+ )
+ if hallucination is not None:
+ kwargs["hallucination"] = hallucination
+ state, optimizer = bayesian.BayesianSearch.init(space, **kwargs)
+ key = jax.random.PRNGKey(0)
+ leaves = jax.tree.leaves(space, is_leaf=lambda x: isinstance(x, sp.Space))
+ n_params = len(leaves)
+ for i in range(n_obs):
+ x = jnp.zeros((1, n_params)) + i * 0.1
+ state = optimizer.update_state(state, key, jnp.array([float(i)]), x)
+ return state, optimizer
+
+ def test_default_hallucination_is_mean(self):
+ space = {"x": sp.LinearSpace(0.0, 1.0)}
+ _, optimizer = bayesian.BayesianSearch.init(space)
+ assert isinstance(optimizer.hallucination, acq.MeanHallucination)
+
+ def test_mean_hallucination_optimize_runs(self):
+ space = {"x": sp.LinearSpace(0.0, 1.0)}
+ state, optimizer = self._make_state_with_obs(
+ space, n_max=9, n_parallel=3, hallucination=acq.MeanHallucination()
+ )
+ key = jax.random.PRNGKey(1)
+ func = lambda k, p: p["x"] ** 2
+ state, _ = optimizer.optimize(state, key, func)
+ assert int(state.mask.sum()) == 9
+
+ def test_sample_hallucination_optimize_runs(self):
+ space = {"x": sp.LinearSpace(0.0, 1.0)}
+ state, optimizer = self._make_state_with_obs(
+ space, n_max=9, n_parallel=3, hallucination=acq.SampleHallucination()
+ )
+ key = jax.random.PRNGKey(2)
+ func = lambda k, p: p["x"] ** 2
+ state, _ = optimizer.optimize(state, key, func)
+ assert int(state.mask.sum()) == 9
+
+ def test_ucb_hallucination_optimize_runs(self):
+ space = {"x": sp.LinearSpace(0.0, 1.0)}
+ state, optimizer = self._make_state_with_obs(
+ space, n_max=9, n_parallel=3, hallucination=acq.UCBHallucination(kappa=1.5)
+ )
+ key = jax.random.PRNGKey(3)
+ func = lambda k, p: p["x"] ** 2
+ state, _ = optimizer.optimize(state, key, func)
+ assert int(state.mask.sum()) == 9
+
+ def test_constant_hallucination_optimize_runs(self):
+ space = {"x": sp.LinearSpace(0.0, 1.0)}
+ state, optimizer = self._make_state_with_obs(
+ space, n_max=9, n_parallel=3, hallucination=acq.ConstantHallucination()
+ )
+ key = jax.random.PRNGKey(4)
+ func = lambda k, p: p["x"] ** 2
+ state, _ = optimizer.optimize(state, key, func)
+ assert int(state.mask.sum()) == 9
+
+ def test_different_hallucinations_produce_different_batches(self):
+ space = {"x": sp.LinearSpace(0.0, 1.0)}
+ state_mean, opt_mean = self._make_state_with_obs(
+ space, n_max=20, n_parallel=3, hallucination=acq.MeanHallucination()
+ )
+ state_sample, opt_sample = self._make_state_with_obs(
+ space, n_max=20, n_parallel=3, hallucination=acq.SampleHallucination()
+ )
+ key = jax.random.PRNGKey(99)
+ p_mean = opt_mean.get_next_params(state_mean, key)
+ p_sample = opt_sample.get_next_params(state_sample, key)
+ # At least one of the parallel points should differ between strategies
+ assert not jnp.allclose(p_mean["x"], p_sample["x"])
+
+ def test_liar_used_only_after_n_warmup(self):
+ # With n_warmup > n_seen, random init path is taken regardless of liar
+ space = {"x": sp.LinearSpace(0.0, 1.0)}
+ state, optimizer = bayesian.BayesianSearch.init(
+ space,
+ n_max=20,
+ n_parallel=2,
+ n_warmup=5,
+ n_hparam_steps=0,
+ hallucination=acq.SampleHallucination(),
+ )
+ key = jax.random.PRNGKey(7)
+ # Only 2 observations β below n_warmup=5, so random path taken
+ state = optimizer.update_state(
+ state, key, jnp.array([1.0, 0.5]), jnp.array([[0.1], [0.9]])
+ )
+ params = optimizer.get_next_params(state, key)
+ assert params["x"].shape == (2,)
+ assert jnp.all((params["x"] >= 0.0) & (params["x"] <= 1.0))
diff --git a/tests/test_grid.py b/tests/test_grid.py
index ec0cd37..a949df5 100644
--- a/tests/test_grid.py
+++ b/tests/test_grid.py
@@ -1,57 +1,212 @@
+import jax
import jax.numpy as jnp
import pytest
-from hyperoptax.grid import GridSearch
-from hyperoptax.spaces import LinearSpace
-
-
-class TestGridSearch:
- def setup_method(self):
- self.domain_1d = {"x": LinearSpace(-1, 1, 101)}
- self.f_1d = lambda x: -(x**2) + 10
- self.domain_2d = self.domain_1d | {"y": LinearSpace(-2, 2, 101)}
- self.f_2d = lambda x, y: -(x**2 + y**2) + 10
-
- def test_1d_grid_search(self):
- grid_search = GridSearch(self.domain_1d, self.f_1d)
- result = grid_search.optimize(n_iterations=-1, n_vmap=1)
- assert jnp.allclose(result, jnp.array([0]))
-
- def test_2d_grid_search(self):
- grid_search = GridSearch(self.domain_2d, self.f_2d)
- result = grid_search.optimize(n_iterations=-1, n_vmap=1)
- assert jnp.allclose(result, jnp.array([0, 0]))
-
- def test_mismatched_domain_and_function(self):
- with pytest.raises(AssertionError):
- GridSearch(self.domain_1d, self.f_2d)
-
- def test_n_parallel_10(self):
- grid_search = GridSearch(self.domain_1d, self.f_1d)
- result = grid_search.optimize(n_vmap=10)
- assert jnp.allclose(result, jnp.array([0]))
-
- def test_jit(self):
- grid_search = GridSearch(self.domain_1d, self.f_1d)
- result = grid_search.optimize(n_iterations=1000, n_vmap=10, jit=True)
- assert jnp.allclose(result, jnp.array([0]))
-
- def test_n_iterations_not_multiple_of_parallel(self):
- grid_search = GridSearch(self.domain_1d, self.f_1d)
- result = grid_search.optimize(n_iterations=100, n_vmap=7)
- assert jnp.allclose(result, jnp.array([0]))
-
- def test_domain_is_shuffled_when_random_search(self):
- random_search = GridSearch(self.domain_1d, self.f_1d, random_search=True)
- assert random_search.domain.shape[0] == len(self.domain_1d["x"])
- assert not jnp.allclose(random_search.domain, self.domain_1d["x"].array)
-
- def test_pmap_grid_search(self):
- grid_search = GridSearch(self.domain_2d, self.f_2d)
- result = grid_search.optimize(n_iterations=10000, n_vmap=4, n_pmap=4)
- assert jnp.allclose(result, jnp.array([0, 0]))
-
- def test_sharded_grid_search_with_too_many_shards(self):
- grid_search = GridSearch(self.domain_2d, self.f_2d)
- with pytest.raises(AssertionError):
- grid_search.optimize(n_iterations=100, n_vmap=4, n_pmap=5)
+from hyperoptax import grid
+from hyperoptax import spaces as sp
+
+_KEY = jax.random.PRNGKey(0)
+_DUMMY_RESULTS = jnp.array([0.0])
+
+
+class TestGridSearchInit:
+ def test_init_discrete_1d(self):
+ space = {"x": sp.DiscreteSpace([0.0, 0.5, 1.0])}
+ state, optimizer = grid.GridSearch.init(space)
+ assert isinstance(state, grid.GridSearchState)
+ assert state.grid_idx == 0
+ assert not optimizer.shuffle
+
+ def test_init_discrete_2d(self):
+ space = {"x": sp.DiscreteSpace([0, 1, 2]), "y": sp.DiscreteSpace([0.0, 0.5])}
+ state, optimizer = grid.GridSearch.init(space)
+ assert isinstance(state, grid.GridSearchState)
+ assert state.grid_idx == 0
+
+ def test_init_shuffle(self):
+ space = {"x": sp.DiscreteSpace([0.0, 0.5, 1.0])}
+ state, optimizer = grid.GridSearch.init(space, shuffle=True)
+ assert optimizer.shuffle
+
+ def test_init_raises_for_continuous_space(self):
+ space = {"x": sp.LinearSpace(0.0, 1.0)}
+ with pytest.raises(ValueError):
+ grid.GridSearch.init(space)
+
+ def test_init_raises_for_mixed_space(self):
+ space = {"x": sp.DiscreteSpace([0, 1]), "y": sp.LinearSpace(0.0, 1.0)}
+ with pytest.raises(ValueError):
+ grid.GridSearch.init(space)
+
+
+class TestGridSearchUpdateState:
+ def test_update_state_increments_idx(self):
+ space = {"x": sp.DiscreteSpace([0.0, 0.5, 1.0])}
+ state, optimizer = grid.GridSearch.init(space)
+ assert state.grid_idx == 0
+ state = optimizer.update_state(state, _KEY, _DUMMY_RESULTS)
+ assert state.grid_idx == 1
+
+ def test_update_state_does_not_mutate(self):
+ space = {"x": sp.DiscreteSpace([0.0, 0.5, 1.0])}
+ state, optimizer = grid.GridSearch.init(space)
+ new_state = optimizer.update_state(state, _KEY, _DUMMY_RESULTS)
+ assert state.grid_idx == 0
+ assert new_state.grid_idx == 1
+
+ def test_update_state_increments_repeatedly(self):
+ space = {"x": sp.DiscreteSpace([0.0, 0.5, 1.0])}
+ state, optimizer = grid.GridSearch.init(space)
+ for i in range(5):
+ assert state.grid_idx == i
+ state = optimizer.update_state(state, _KEY, _DUMMY_RESULTS)
+
+ def test_update_state_increments_by_n_parallel(self):
+ space = {"x": sp.DiscreteSpace(list(range(10)))}
+ state, optimizer = grid.GridSearch.init(space, n_parallel=3)
+ state = optimizer.update_state(state, _KEY, _DUMMY_RESULTS)
+ assert state.grid_idx == 3
+
+
+class TestGridSearchShuffle:
+ def test_shuffle_reorders_grid(self):
+ space = {"x": sp.DiscreteSpace(list(range(20)))}
+ state_unshuffled, _ = grid.GridSearch.init(space)
+ state_shuffled, _ = grid.GridSearch.init(
+ space, shuffle=True, key=jax.random.PRNGKey(0)
+ )
+ assert not jnp.allclose(state_unshuffled.grid, state_shuffled.grid)
+
+ def test_shuffle_preserves_size(self):
+ space = {"x": sp.DiscreteSpace([0, 1]), "y": sp.DiscreteSpace([0, 1, 2])}
+ state, _ = grid.GridSearch.init(space, shuffle=True, key=jax.random.PRNGKey(0))
+ assert state.grid.shape == (6, 2)
+
+ def test_shuffle_preserves_values(self):
+ space = {"x": sp.DiscreteSpace([0, 1]), "y": sp.DiscreteSpace([0, 1, 2])}
+ state_unshuffled, _ = grid.GridSearch.init(space)
+ state_shuffled, _ = grid.GridSearch.init(
+ space, shuffle=True, key=jax.random.PRNGKey(0)
+ )
+ assert jnp.allclose(
+ jnp.sort(state_unshuffled.grid, axis=0),
+ jnp.sort(state_shuffled.grid, axis=0),
+ )
+
+ def test_different_keys_give_different_orderings(self):
+ space = {"x": sp.DiscreteSpace(list(range(20)))}
+ state_a, _ = grid.GridSearch.init(
+ space, shuffle=True, key=jax.random.PRNGKey(0)
+ )
+ state_b, _ = grid.GridSearch.init(
+ space, shuffle=True, key=jax.random.PRNGKey(1)
+ )
+ assert not jnp.allclose(state_a.grid, state_b.grid)
+
+ def test_no_shuffle_by_default(self):
+ space = {"x": sp.DiscreteSpace([0, 1, 2])}
+ state, _ = grid.GridSearch.init(space)
+ assert jnp.allclose(
+ state.grid[:, 0], jnp.array([0, 1, 2], dtype=state.grid.dtype)
+ )
+
+
+class TestGridSearchGrid:
+ def test_flat_space_size_is_product_of_dim_sizes(self):
+ space = {"x": sp.DiscreteSpace([0, 1]), "y": sp.DiscreteSpace([0, 1, 2])}
+ state, _ = grid.GridSearch.init(space)
+ assert state.grid.shape[0] == 6 # 2 * 3 = 6
+ assert state.grid.shape[1] == 2 # 2 params
+
+
+class TestGridSearchGetNextParams:
+ def test_get_next_params_first_index(self):
+ space = {"x": sp.DiscreteSpace([0.0, 0.5, 1.0])}
+ state, optimizer = grid.GridSearch.init(space)
+ params = optimizer.get_next_params(state, _KEY)
+ assert params is not None
+
+ def test_get_next_params_leaf_shape_n_parallel(self):
+ space = {"x": sp.DiscreteSpace([0.0, 0.5, 1.0])}
+ state, optimizer = grid.GridSearch.init(space)
+ params = optimizer.get_next_params(state, _KEY)
+ # n_parallel=1: each leaf has shape (1,)
+ assert params["x"].shape == (1,)
+
+ def test_get_next_params_changes_after_update(self):
+ space = {"x": sp.DiscreteSpace([0.0, 0.5, 1.0])}
+ state, optimizer = grid.GridSearch.init(space)
+ params_0 = optimizer.get_next_params(state, _KEY)
+ state = optimizer.update_state(state, _KEY, _DUMMY_RESULTS)
+ params_1 = optimizer.get_next_params(state, _KEY)
+ assert not jnp.allclose(params_0["x"], params_1["x"])
+
+ def test_get_next_params_2d_grid(self):
+ space = {"x": sp.DiscreteSpace([0, 1]), "y": sp.DiscreteSpace([0, 1, 2])}
+ state, optimizer = grid.GridSearch.init(space)
+ params = optimizer.get_next_params(state, _KEY)
+ assert params is not None
+
+ def test_get_next_params_n_parallel_batch(self):
+ space = {"x": sp.DiscreteSpace([0.0, 0.5, 1.0])}
+ state, optimizer = grid.GridSearch.init(space, n_parallel=2)
+ params = optimizer.get_next_params(state, _KEY)
+ assert params["x"].shape == (2,)
+
+ def test_get_next_params_raises_on_overflow(self):
+ space = {"x": sp.DiscreteSpace([0.0, 0.5, 1.0])}
+ state, optimizer = grid.GridSearch.init(space, n_parallel=2)
+ # Move to last valid position
+ state = state.replace(grid_idx=2)
+ with pytest.raises(ValueError, match="Not enough grid points"):
+ optimizer.get_next_params(state, _KEY)
+
+
+class TestGridSearchOptimizeScan:
+ def test_optimize_scan_runs(self):
+ space = {"x": sp.DiscreteSpace([0.0, 0.5, 1.0])}
+ state, optimizer = grid.GridSearch.init(space)
+ func = lambda key, config: -(config["x"] ** 2)
+ state, (params_hist, results_hist) = optimizer.optimize_scan(
+ state, jax.random.PRNGKey(0), func, n_iterations=3
+ )
+ assert params_hist["x"].shape[0] == 3
+ assert results_hist.shape[0] == 3
+
+
+class TestGridSearchOptimize:
+ def test_optimize_runs_n_iterations(self):
+ space = {"x": sp.DiscreteSpace([0.0, 0.5, 1.0])}
+ state, optimizer = grid.GridSearch.init(space)
+ state, (params_hist, results_hist) = optimizer.optimize(
+ state, jax.random.PRNGKey(0), lambda key, config: -(config["x"] ** 2), 3
+ )
+ assert len(params_hist) == 3
+ assert len(results_hist) == 3
+
+ def test_optimize_increments_grid_idx(self):
+ space = {"x": sp.DiscreteSpace([0.0, 0.5, 1.0])}
+ state, optimizer = grid.GridSearch.init(space)
+ state, _ = optimizer.optimize(
+ state, jax.random.PRNGKey(0), lambda key, config: -(config["x"] ** 2), 2
+ )
+ assert state.grid_idx == 2
+
+ def test_state_space_accessible_via_inheritance(self):
+ # Regression: GridSearchState used to duplicate the `space` field from
+ # OptimizerState, which could shadow the parent field. Verify space is
+ # still accessible after removing the redundant definition.
+ space = {"x": sp.DiscreteSpace([0.0, 0.5, 1.0])}
+ state, _ = grid.GridSearch.init(space)
+ leaves = jax.tree.leaves(state.space, is_leaf=lambda x: isinstance(x, sp.Space))
+ assert len(leaves) == 1
+
+ def test_optimize_n_parallel(self):
+ space = {"x": sp.DiscreteSpace(list(range(6)))}
+ state, optimizer = grid.GridSearch.init(space, n_parallel=2)
+ func = lambda key, config: -(config["x"] ** 2)
+ state, (params_hist, results_hist) = optimizer.optimize(
+ state, jax.random.PRNGKey(0), func, n_iterations=3
+ )
+ assert len(params_hist) == 3
+ assert state.grid_idx == 6 # 3 * 2 = 6
diff --git a/tests/test_kernels.py b/tests/test_kernels.py
index dcad599..7ca6d55 100644
--- a/tests/test_kernels.py
+++ b/tests/test_kernels.py
@@ -1,58 +1,85 @@
import jax
import jax.numpy as jnp
+import pytest
-from hyperoptax.kernels import RBF, Matern
+from hyperoptax import kernels
+x = jnp.array([[1.0, 1.0], [1.0, 1.0], [1.0, 1.0]])
+y = jnp.array([[2.0, 2.0], [2.0, 2.0], [2.0, 2.0]])
+x_long = jnp.array([[1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0]])
-class TestRBF:
- def setup_method(self):
- self.x = jnp.array([[1.0, 1.0], [1.0, 1.0], [1.0, 1.0]])
- self.y = jnp.array([[2.0, 2.0], [2.0, 2.0], [2.0, 2.0]])
+class TestRBF:
def test_rbf_with_same_points(self):
- kernel = RBF(length_scale=1.0)
+ kernel = kernels.RBF(length_scale=1.0)
# correlation matrix should be all ones
- assert jnp.allclose(kernel(self.x, self.x), kernel.diag(self.x))
- assert jnp.allclose(kernel(self.x, self.x), jnp.full((3, 3), 1.0))
+ assert jnp.allclose(kernel(x, x), jnp.full((3, 3), 1.0))
def test_rbf_with_different_points(self):
- kernel = RBF(length_scale=1.0)
+ kernel = kernels.RBF(length_scale=1.0)
# correlation matrix should be all exp(-1)
- assert jnp.allclose(kernel(self.x, self.y), jnp.full((3, 3), jnp.exp(-1)))
+ assert jnp.allclose(kernel(x, y), jnp.full((3, 3), jnp.exp(-1)))
def test_rbf_with_different_data_sizes(self):
- kernel = RBF(length_scale=1.0)
- x = jnp.array([[1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0]])
+ kernel = kernels.RBF(length_scale=1.0)
# correlation matrix should be all exp(-1) with shape (4, 3)
- assert jnp.allclose(kernel(x, self.y), jnp.full((4, 3), jnp.exp(-1)))
+ assert jnp.allclose(kernel(x_long, y), jnp.full((4, 3), jnp.exp(-1)))
def test_rbf_with_different_length_scales(self):
- kernel = RBF(length_scale=2.0)
+ kernel = kernels.RBF(length_scale=2.0)
# correlation matrix should be all exp(-1/4) with shape (3, 3)
- assert jnp.allclose(kernel(self.x, self.y), jnp.full((3, 3), jnp.exp(-1 / 4)))
+ assert jnp.allclose(kernel(x, y), jnp.full((3, 3), jnp.exp(-1 / 4)))
class TestMatern:
- def setup_method(self):
- self.x = jnp.array([[1.0, 1.0], [1.0, 1.0], [1.0, 1.0]])
- self.y = jnp.array([[2.0, 2.0], [2.0, 2.0], [2.0, 2.0]])
-
def test_matern_with_same_points(self):
- kernel = Matern(length_scale=1.0)
+ kernel = kernels.Matern(length_scale=1.0)
# correlation matrix should be all ones
- assert jnp.allclose(kernel(self.x, self.x), jnp.full((3, 3), 1.0))
+ assert jnp.allclose(kernel(x, x), jnp.full((3, 3), 1.0))
def test_matern_with_different_points(self):
- kernel = Matern(length_scale=1.0, nu=0.5)
+ kernel = kernels.Matern(length_scale=1.0, nu=0.5)
# correlation matrix should be all exp(-sqrt(2))
- assert jnp.allclose(
- kernel(self.x, self.y), jnp.full((3, 3), jnp.exp(-jnp.sqrt(2)))
- )
+ assert jnp.allclose(kernel(x, y), jnp.full((3, 3), jnp.exp(-jnp.sqrt(2))))
def test_matern_with_jit(self):
- kernel = Matern(length_scale=1.0, nu=0.5)
+ kernel = kernels.Matern(length_scale=1.0, nu=0.5)
# correlation matrix should be all exp(-sqrt(2))
jitted_kernel = jax.jit(kernel)
assert jnp.allclose(
- jitted_kernel(self.x, self.y), jnp.full((3, 3), jnp.exp(-jnp.sqrt(2)))
+ jitted_kernel(x, y), jnp.full((3, 3), jnp.exp(-jnp.sqrt(2)))
)
+
+ def test_matern_nu_1_5(self):
+ kernel = kernels.Matern(length_scale=1.0, nu=1.5)
+ d = jnp.sqrt(2.0) # distance between x[0] and y[0]
+ K = jnp.sqrt(3) * d
+ expected = (1 + K) * jnp.exp(-K)
+ assert jnp.allclose(kernel(x, y), jnp.full((3, 3), expected), atol=1e-6)
+
+ def test_matern_nu_2_5(self):
+ kernel = kernels.Matern(length_scale=1.0, nu=2.5)
+ d = jnp.sqrt(2.0)
+ K = jnp.sqrt(5) * d
+ expected = (1 + K + K**2 / 3) * jnp.exp(-K)
+ assert jnp.allclose(kernel(x, y), jnp.full((3, 3), expected), atol=1e-6)
+
+ def test_matern_nu_inf(self):
+ # nu=inf should be equivalent to the RBF (squared-exponential) kernel
+ matern_inf = kernels.Matern(length_scale=1.0, nu=jnp.inf)
+ rbf = kernels.RBF(length_scale=1.0)
+ assert jnp.allclose(matern_inf(x, y), rbf(x, y), atol=1e-6)
+
+ def test_matern_invalid_nu_raises(self):
+ with pytest.raises(ValueError, match="not supported"):
+ kernels.Matern(length_scale=1.0, nu=3.0)
+
+
+class TestBaseKernel:
+ def test_base_kernel_call_raises(self):
+ class MinimalKernel(kernels.BaseKernel):
+ def __call__(self, x, y, length_scale=None):
+ return super().__call__(x, y, length_scale)
+
+ with pytest.raises(NotImplementedError):
+ MinimalKernel()(x, y)
diff --git a/tests/test_random.py b/tests/test_random.py
new file mode 100644
index 0000000..ed59970
--- /dev/null
+++ b/tests/test_random.py
@@ -0,0 +1,192 @@
+import jax
+import jax.numpy as jnp
+import pytest
+
+from hyperoptax import random as rand
+from hyperoptax import spaces as sp
+
+
+class TestValidateFunc:
+ def test_single_arg_raises(self):
+ space = {"x": sp.LinearSpace(0.0, 1.0)}
+ state, optimizer = rand.RandomSearch.init(space)
+ with pytest.raises(TypeError, match="fn\\(key, config\\)"):
+ optimizer.optimize(
+ state, jax.random.PRNGKey(0), lambda x: x, n_iterations=1
+ )
+
+ def test_single_arg_raises_scan(self):
+ space = {"x": sp.LinearSpace(0.0, 1.0)}
+ state, optimizer = rand.RandomSearch.init(space)
+ with pytest.raises(TypeError, match="fn\\(key, config\\)"):
+ optimizer.optimize_scan(
+ state, jax.random.PRNGKey(0), lambda x: x, n_iterations=1
+ )
+
+
+class TestRandomSearchGetNextParams:
+ def test_samples_within_bounds(self):
+ space = {"x": sp.LinearSpace(0.0, 1.0)}
+ state, optimizer = rand.RandomSearch.init(space)
+ params = optimizer.get_next_params(state, jax.random.PRNGKey(0))
+ # n_parallel=1: params["x"] has shape (1,)
+ assert 0.0 <= float(params["x"][0]) <= 1.0
+
+ def test_different_keys_give_different_params(self):
+ space = {"x": sp.LinearSpace(0.0, 1.0)}
+ state, optimizer = rand.RandomSearch.init(space)
+ params1 = optimizer.get_next_params(state, jax.random.PRNGKey(0))
+ params2 = optimizer.get_next_params(state, jax.random.PRNGKey(1))
+ assert not jnp.allclose(params1["x"], params2["x"])
+
+ def test_same_key_gives_same_params(self):
+ space = {"x": sp.LinearSpace(0.0, 1.0)}
+ state, optimizer = rand.RandomSearch.init(space)
+ key = jax.random.PRNGKey(42)
+ params1 = optimizer.get_next_params(state, key)
+ params2 = optimizer.get_next_params(state, key)
+ assert jnp.allclose(params1["x"], params2["x"])
+
+ def test_nested_pytree_space(self):
+ space = {
+ "lr": sp.LinearSpace(1e-4, 1e-1),
+ "reg": {"l1": sp.LinearSpace(0.0, 1.0)},
+ }
+ state, optimizer = rand.RandomSearch.init(space)
+ params = optimizer.get_next_params(state, jax.random.PRNGKey(0))
+ assert "lr" in params
+ assert "l1" in params["reg"]
+
+ def test_discrete_space_samples_from_values(self):
+ values = [0, 1, 2, 3]
+ space = {"x": sp.DiscreteSpace(values)}
+ state, optimizer = rand.RandomSearch.init(space)
+ params = optimizer.get_next_params(state, jax.random.PRNGKey(0))
+ assert int(params["x"][0]) in values
+
+ def test_log_space_samples_within_bounds(self):
+ space = {"lr": sp.LogSpace(1e-4, 1e-1)}
+ state, optimizer = rand.RandomSearch.init(space)
+ params = optimizer.get_next_params(state, jax.random.PRNGKey(0))
+ assert 1e-4 <= float(params["lr"][0]) <= 1e-1
+
+ def test_n_parallel_batch_shape(self):
+ space = {"lr": sp.LinearSpace(1e-4, 1e-1)}
+ state, optimizer = rand.RandomSearch.init(space, n_parallel=3)
+ params = optimizer.get_next_params(state, jax.random.PRNGKey(0))
+ assert params["lr"].shape == (3,)
+
+ def test_n_parallel_values_within_bounds(self):
+ space = {"x": sp.LinearSpace(0.0, 1.0)}
+ state, optimizer = rand.RandomSearch.init(space, n_parallel=5)
+ params = optimizer.get_next_params(state, jax.random.PRNGKey(0))
+ assert jnp.all(params["x"] >= 0.0) and jnp.all(params["x"] <= 1.0)
+
+
+class TestRandomSearchUpdateState:
+ def test_update_state_is_memoryless(self):
+ space = {"x": sp.LinearSpace(0.0, 1.0)}
+ state, optimizer = rand.RandomSearch.init(space)
+ key = jax.random.PRNGKey(0)
+ new_state = optimizer.update_state(state, key, jnp.array([0.5]))
+ assert new_state.space is state.space
+
+ def test_update_state_repeated_calls_unchanged(self):
+ space = {"x": sp.LinearSpace(0.0, 1.0)}
+ state, optimizer = rand.RandomSearch.init(space)
+ key = jax.random.PRNGKey(0)
+ for _ in range(5):
+ state = optimizer.update_state(state, key, jnp.array([1.0]))
+ assert state.space == rand.RandomSearch.init(space)[0].space
+
+
+class TestOptimizeScan:
+ def _setup(self):
+ space = {"x": sp.LinearSpace(0.0, 1.0)}
+ state, optimizer = rand.RandomSearch.init(space)
+ # func receives a scalar config["x"] (from _index_batch)
+ func = lambda key, config: config["x"] ** 2
+ return state, optimizer, func
+
+ def test_history_length_matches_n_iterations(self):
+ state, optimizer, func = self._setup()
+ _, (params_hist, results_hist) = optimizer.optimize_scan(
+ state, jax.random.PRNGKey(0), func, n_iterations=5
+ )
+ assert params_hist["x"].shape[0] == 5
+ assert results_hist.shape[0] == 5
+
+ def test_single_iteration(self):
+ state, optimizer, func = self._setup()
+ _, (params_hist, results_hist) = optimizer.optimize_scan(
+ state, jax.random.PRNGKey(0), func, n_iterations=1
+ )
+ assert params_hist["x"].shape[0] == 1
+ assert results_hist.shape[0] == 1
+
+ def test_params_within_bounds(self):
+ state, optimizer, func = self._setup()
+ _, (params_hist, _) = optimizer.optimize_scan(
+ state, jax.random.PRNGKey(0), func, n_iterations=10
+ )
+ assert jnp.all(params_hist["x"] >= 0.0)
+ assert jnp.all(params_hist["x"] <= 1.0)
+
+ def test_results_match_func(self):
+ state, optimizer, func = self._setup()
+ _, (params_hist, results_hist) = optimizer.optimize_scan(
+ state, jax.random.PRNGKey(0), func, n_iterations=5
+ )
+ # params_hist["x"] shape: (5, 1); results_hist shape: (5, 1)
+ expected = params_hist["x"].squeeze() ** 2
+ assert jnp.allclose(results_hist.squeeze(), expected)
+
+ def test_matches_optimize_output(self):
+ """optimize_scan and optimize should produce the same sequence of params."""
+ space = {"x": sp.LinearSpace(0.0, 1.0)}
+ key = jax.random.PRNGKey(7)
+ func = lambda key, config: config["x"]
+
+ state1, opt1 = rand.RandomSearch.init(space)
+ state2, opt2 = rand.RandomSearch.init(space)
+
+ _, (params_list, _) = opt1.optimize(state1, key, func, n_iterations=4)
+ _, (params_stacked, _) = opt2.optimize_scan(state2, key, func, n_iterations=4)
+
+ # params_list items have shape (1,); params_stacked["x"] has shape (4, 1)
+ expected = jnp.array([p["x"][0] for p in params_list])
+ assert jnp.allclose(params_stacked["x"].squeeze(), expected)
+
+ def test_nested_space(self):
+ space = {
+ "lr": sp.LinearSpace(1e-4, 1e-1),
+ "reg": {"l1": sp.LinearSpace(0.0, 1.0)},
+ }
+ state, optimizer = rand.RandomSearch.init(space)
+ func = lambda key, config: config["lr"] + config["reg"]["l1"]
+ _, (params_hist, results_hist) = optimizer.optimize_scan(
+ state, jax.random.PRNGKey(0), func, n_iterations=6
+ )
+ assert params_hist["lr"].shape[0] == 6
+ assert params_hist["reg"]["l1"].shape[0] == 6
+ assert results_hist.shape[0] == 6
+
+ @pytest.mark.parametrize("n", [1, 2, 3, 10])
+ def test_various_n_iterations(self, n):
+ state, optimizer, func = self._setup()
+ _, (params_hist, results_hist) = optimizer.optimize_scan(
+ state, jax.random.PRNGKey(0), func, n_iterations=n
+ )
+ assert params_hist["x"].shape[0] == n
+ assert results_hist.shape[0] == n
+
+ def test_n_parallel_optimize_scan(self):
+ space = {"x": sp.LinearSpace(0.0, 1.0)}
+ state, optimizer = rand.RandomSearch.init(space, n_parallel=3)
+ func = lambda key, config: config["x"] ** 2
+ _, (params_hist, results_hist) = optimizer.optimize_scan(
+ state, jax.random.PRNGKey(0), func, n_iterations=4
+ )
+ # params_hist["x"]: (4, 3); results_hist: (4, 3)
+ assert params_hist["x"].shape == (4, 3)
+ assert results_hist.shape == (4, 3)
diff --git a/tests/test_spaces.py b/tests/test_spaces.py
index 8f05b8b..e144851 100644
--- a/tests/test_spaces.py
+++ b/tests/test_spaces.py
@@ -1,52 +1,127 @@
+import jax
import jax.numpy as jnp
+import pytest
from hyperoptax import spaces as sp
-class TestArbitrarySpace:
- def test_setup(self):
- space = sp.ArbitrarySpace(values=[0, 2, 5, 10])
- assert space.start == 0
- assert space.end == 10
- assert space.n_points == 4
+def test_space():
+ space = sp.LinearSpace(0, 1)
+ assert space.sample(jax.random.PRNGKey(0)).shape == (1,)
-class TestLinearSpace:
- def test_array(self):
- space = sp.LinearSpace(0, 1, 11)
- expected = jnp.array([0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0])
- assert jnp.allclose(space.array, expected)
+def test_space_sample_in_pytree():
+ space = {"a": sp.LinearSpace(0, 1), "b": sp.LinearSpace(2, 3)}
+ key = jax.random.PRNGKey(0)
+ sample = jax.tree.map(
+ lambda x: x.sample(key), space, is_leaf=lambda x: isinstance(x, sp.Space)
+ )
+ assert sample["a"].shape == (1,)
+ assert sample["b"].shape == (1,)
-class TestLogSpace:
- def test_array_log_base_10(self):
- space = sp.LogSpace(1e-4, 1e-1, 4)
- expected = jnp.array([1e-4, 1e-3, 1e-2, 1e-1])
- assert jnp.allclose(space.array, expected)
+def test_discrete_space():
+ space = sp.DiscreteSpace([0, 1, 2, 3])
+ assert space.sample(jax.random.PRNGKey(0)).shape == (1,)
+ assert space.sample(jax.random.PRNGKey(0)) in [0, 1, 2, 3]
- def test_array_log_base_2(self):
- space = sp.LogSpace(32, 256, 4, 2)
- expected = jnp.array([32, 64, 128, 256])
- assert jnp.allclose(space.array, expected)
+def test_discrete_space_sample_in_pytree():
+ space = {"a": sp.DiscreteSpace([0, 1, 2, 3]), "b": sp.DiscreteSpace([4, 5, 6, 7])}
+ key = jax.random.PRNGKey(0)
+ sample = jax.tree.map(
+ lambda x: x.sample(key),
+ space,
+ is_leaf=lambda x: isinstance(x, sp.DiscreteSpace),
+ )
+ assert sample["a"].shape == (1,)
+ assert sample["b"].shape == (1,)
+ assert sample["a"] in [0, 1, 2, 3]
+ assert sample["b"] in [4, 5, 6, 7]
-class TestExpSpace:
- def test_array_exp_base_10(self):
- space = sp.ExpSpace(0.5, 1, 2, base=10)
- expected = jnp.array([0.5, 1])
- assert jnp.allclose(space.array, expected)
+def test_log_space():
+ space = sp.LogSpace(1e-4, 1e-1)
+ assert space.sample(jax.random.PRNGKey(0)).shape == (1,)
+ assert space.sample(jax.random.PRNGKey(0)) > 1e-4
+ assert space.sample(jax.random.PRNGKey(0)) < 1e-1
-class TestQuantizedLinearSpace:
- def test_array(self):
- space = sp.QuantizedLinearSpace(0, 1, 0.1)
- expected = jnp.array([0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0])
- assert jnp.allclose(space.array, expected)
+def test_log_space_sample_in_pytree():
+ space = {"a": sp.LogSpace(1e-4, 1e-1), "b": sp.LogSpace(1e-3, 1e-2)}
+ key = jax.random.PRNGKey(0)
+ sample = jax.tree.map(
+ lambda x: x.sample(key), space, is_leaf=lambda x: isinstance(x, sp.LogSpace)
+ )
+ assert sample["a"].shape == (1,)
+ assert sample["b"].shape == (1,)
+ assert sample["a"] > 1e-4
+ assert sample["a"] < 1e-1
+ assert sample["b"] < 1e-2
+ assert sample["b"] > 1e-3
-# need to figure out what the best test is
-# class TestQuantizedLogSpace:
-# def test_array(self):
-# space = sp.QuantizedLogSpace(32, 256, 2)
-# expected = jnp.array([32, 64, 128, 256])
-# assert jnp.allclose(space.array, expected)
+
+def test_logspace_with_different_bases():
+ space = sp.LogSpace(2, 64, base=2)
+ sample = space.sample(jax.random.PRNGKey(0))
+ assert sample.shape == (1,)
+ assert sample > 2
+ assert sample < 64
+
+
+def test_qspace():
+ space = sp.QLinearSpace(0, 100)
+ sample = space.sample(jax.random.PRNGKey(0))
+ assert sample.shape == (1,)
+ assert sample.dtype == jnp.int32
+ assert sample >= 0
+ assert sample <= 100
+
+
+def test_qlogspace():
+ space = sp.QLogSpace(2, 128, base=2)
+ sample = space.sample(jax.random.PRNGKey(0))
+ assert sample.shape == (1,)
+ assert sample.dtype == jnp.int32
+ assert sample >= 2
+ assert sample <= 128
+
+
+def test_space_post_init():
+ sp.LogSpace(0, 10, base=2)
+ with pytest.raises(AssertionError):
+ sp.LogSpace(10, 0)
+ with pytest.raises(AssertionError):
+ sp.LogSpace(0, 10, base=1)
+
+
+def test_space_base_sample_raises():
+ # Space.sample is abstract β subclasses must override it
+ space = sp.Space()
+ with pytest.raises(NotImplementedError):
+ space.sample(jax.random.PRNGKey(0))
+
+
+def test_discrete_space_lower_upper_bound():
+ space = sp.DiscreteSpace([3, 1, 4, 1, 5, 9])
+ assert space.lower_bound == 1.0
+ assert space.upper_bound == 9.0
+
+
+def test_discrete_space_transform_snaps_to_nearest():
+ space = sp.DiscreteSpace([0.0, 0.25, 0.5, 0.75, 1.0])
+ assert float(space.transform(jnp.array([0.1]))[0]) == pytest.approx(0.0)
+ assert float(space.transform(jnp.array([0.4]))[0]) == pytest.approx(0.5)
+ assert float(space.transform(jnp.array([0.9]))[0]) == pytest.approx(1.0)
+
+
+def test_discrete_space_transform_preserves_shape():
+ space = sp.DiscreteSpace([0, 1, 2])
+ assert space.transform(jnp.array([1.4])).shape == (1,)
+ assert space.transform(jnp.array(1.4)).shape == ()
+
+
+def test_linear_space_lower_upper_bound():
+ space = sp.LinearSpace(2.0, 8.0)
+ assert space.lower_bound == 2.0
+ assert space.upper_bound == 8.0
diff --git a/tests/test_timing.py b/tests/test_timing.py
new file mode 100644
index 0000000..1e60565
--- /dev/null
+++ b/tests/test_timing.py
@@ -0,0 +1,73 @@
+import time
+
+import jax
+import jax.numpy as jnp
+import pytest
+
+from hyperoptax import bayesian
+from hyperoptax import spaces as sp
+
+
+@pytest.mark.timing
+class TestBayesianTiming:
+ SPACE = {"x": sp.LinearSpace(0.0, 1.0), "y": sp.LinearSpace(0.0, 1.0)}
+
+ def _make_state_with_obs(self, optimizer, n_obs=5):
+ key = jax.random.PRNGKey(0)
+ state, _ = bayesian.BayesianSearch.init(
+ self.SPACE,
+ n_max=50,
+ n_candidates=500,
+ n_restarts=3,
+ n_lbfgs_steps=20,
+ n_hparam_steps=0,
+ )
+ for i in range(n_obs):
+ x = jnp.array([[i * 0.2, i * 0.15]])
+ state = optimizer.update_state(state, key, jnp.array([float(i)]), x)
+ return state
+
+ def test_get_next_params_throughput(self, capsys):
+ _, optimizer = bayesian.BayesianSearch.init(
+ self.SPACE,
+ n_max=50,
+ n_candidates=500,
+ n_restarts=3,
+ n_lbfgs_steps=20,
+ n_hparam_steps=0,
+ )
+ state = self._make_state_with_obs(optimizer)
+ key = jax.random.PRNGKey(1)
+ # warm-up (triggers compilation)
+ params = optimizer.get_next_params(state, key)
+ jax.block_until_ready(jax.tree.leaves(params)[0])
+
+ n_calls = 10
+ t0 = time.perf_counter()
+ for _ in range(n_calls):
+ key, k = jax.random.split(key)
+ params = optimizer.get_next_params(state, k)
+ jax.block_until_ready(jax.tree.leaves(params)[0])
+ elapsed = time.perf_counter() - t0
+ ms = elapsed / n_calls * 1000
+ print(f"\nget_next_params: {ms:.1f} ms/call ({n_calls} calls)")
+ assert ms < 5000 # sanity bound
+
+ def test_optimize_throughput(self, capsys):
+ n_max = 20
+ _, optimizer = bayesian.BayesianSearch.init(
+ self.SPACE,
+ n_max=n_max,
+ n_candidates=500,
+ n_restarts=3,
+ n_lbfgs_steps=20,
+ n_hparam_steps=0,
+ )
+ state, _ = bayesian.BayesianSearch.init(self.SPACE, n_max=n_max)
+ func = lambda key, cfg: -(cfg["x"] ** 2 + cfg["y"] ** 2)
+ t0 = time.perf_counter()
+ state, _ = optimizer.optimize(state, jax.random.PRNGKey(0), func)
+ elapsed = time.perf_counter() - t0
+ ms_per_iter = elapsed / n_max * 1000
+ print(f"\noptimize: {ms_per_iter:.1f} ms/iter over {n_max} iters")
+ assert ms_per_iter < 10000 # sanity bound