Epistemic Nearest Neighbors
A fast, alternative surrogate for Bayesian optimization
ENN estimates a function's value and associated epistemic uncertainty using a K-Nearest Neighbors model. Queries take $O(N lnK)$ time, where $N$ is the number of observations available for KNN lookups. Compare to an exact GP, which takes $O(N^2)$ time. Additionally, measured running times are very small compared to GPs and other alternative surrogates. [1]
We also extend ENN with an alternative, disk-based approximate nearest neighbors backend based on B+ANN [4]. This reduces ENN and TuRBO-ENN to effectively O(lnN) per iteration.
Contents
-
ENN surrogate,
EpistemicNearestNeighbors[1] -
TuRBO optimizer via
create_optimizerwith config factoriesturbo_enn_config()- TuRBO-ENN (Rust-backed by default)turbo_zero_config()- TuRBO-zero (Rust-backed)lhd_only_config()- LHD design on everyask()(Rust-backed)turbo_one_config()- TuRBO with GP surrogate (Python fallback until GP is ported) The optimizer has anask()/tell()interface. Allturbo_*()methods follow TuRBO:- Generate candidates with RAASP [3] sampling.
- Select a candidate with Thompson sampling (TuRBO-one), UCB (TuRBO-ENN), or randomly (TURBO-zero).
-
Overview of algorithms: algos.pdf
[1] M. Bafna, Jadhav, S. a., & Sweet, D., (2025). Taking the GP Out of the Loop. arXiv preprint arXiv:2506.12818. https://arxiv.org/abs/2506.12818 [2] Eriksson, D., Pearce, M., Gardner, J. R., Turner, R., & Poloczek, M. (2020). Scalable Global Optimization via Local Bayesian Optimization. Advances in Neural Information Processing Systems, 32. https://arxiv.org/abs/1910.01739 [3] Rashidi, B., Johnstonbaugh, K., & Gao, C. (2024). Cylindrical Thompson Sampling for High-Dimensional Bayesian Optimization. Proceedings of The 27th International Conference on Artificial Intelligence and Statistics (pp. 3502–3510). PMLR. [4] [4] Tekin, S. F., & Bordawekar, R. (2025). B+ANN: A Fast Billion-Scale Disk-based Nearest-Neighbor Index. arXiv preprint arXiv:2511.15557. https://arxiv.org/abs/2511.15557 https://proceedings.mlr.press/v238/rashidi24a.html
Installation
pip install ennbo[with-deps]
or
cargo add ennbo
PyPI wheels are platform-specific (they include the enn.enn_rust native extension). If pip install ennbo gives an import error about enn.enn_rust, install a matching wheel (same OS/arch/Python) or build from source (Rust + linkable Faiss C API; see below).
Demonstration
demo_enn.ipynb - Shows how to use EpistemicNearestNeighbors to build and query an ENN model.
demo_turbo_enn.ipynb - Shows how to use TurboOptimizer to optimize the Ackley function.
Installation, MacOS
On my MacBook I can run into problems with dependencies and compatibilities.
On MacOS try:
micromamba env create -n ennbo -f admin/conda-macos.yml
micromamba activate ennbo
pip install --no-deps ennbo
pytest -sv tests
You may replace micromamba with conda and this will probably still work.
The commands above make sure
- You use the MacOS-specific PyTorch (with
mps). - You avoid having multiple, competing OpenMPs installed PyTorch issue faiss issue.
- You use old enough versions of NumPy and PyTorch to be compatible with faiss faiss issue.
- Prevent matplotlib's installation from upgrading your NumPy to an incompatible version.
ennbo's listed dependencies do not undo any of the above (which is fine b/c the above commands set the up correctly).
Run tests with
pytest -x -sv tests
and they should all pass fairly quickly (~10s-30s).
If your code still crashes or hangs, try this hack:
export KMP_DUPLICATE_LIB_OK=TRUE
export OMP_NUM_THREADS=1
I don't recommend this, however, as it will slow things down.
Metadata
Release files for ennbo 0.3.17
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| ennbo-0.3.17-cp312-cp312-manylinux_2_31_x86_64.whl | CPython 3.12 | CPython 3.12 | Linux glibc 2.31+ x86-64 | Details for ennbo-0.3.17-cp312-cp312-manylinux_2_31_x86_64.whl |
| ennbo-0.3.17-cp312-cp312-manylinux_2_25_x86_64.whl | CPython 3.12 | CPython 3.12 | Linux glibc 2.25+ x86-64 | Details for ennbo-0.3.17-cp312-cp312-manylinux_2_25_x86_64.whl |
| ennbo-0.3.17-cp311-cp311-macosx_26_0_arm64.whl | CPython 3.11 | CPython 3.11 | macOS 26.0+ ARM64 | Details for ennbo-0.3.17-cp311-cp311-macosx_26_0_arm64.whl |
Total release size: 26.1 MB
Release files / ennbo-0.3.17-cp312-cp312-manylinux_2_31_x86_64.whl
| Download URL | ennbo-0.3.17-cp312-cp312-manylinux_2_31_x86_64.whl |
|---|---|
| Size | 6.9 MB |
| Tags | CPython 3.12 Linux glibc 2.31+ x86-64 |
|
SHA-256 checksum How to use checksums |
7e9f7e2d67290bd05203de443bbc7678a6f054bb6092d4b4bfd10508abb29db0
|
|
BLAKE2b-256 checksum How to use checksums |
e8b69592e463eee2d02a6a1511eb013bb64e199f20254c0c143caa5a0ffaa404
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.21 {"installer":{"name":"uv","version":"0.9.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / ennbo-0.3.17-cp312-cp312-manylinux_2_25_x86_64.whl
| Download URL | ennbo-0.3.17-cp312-cp312-manylinux_2_25_x86_64.whl |
|---|---|
| Size | 6.8 MB |
| Tags | CPython 3.12 Linux glibc 2.25+ x86-64 |
|
SHA-256 checksum How to use checksums |
709714ff9e77f819bd169d08c15a6d60b01ed60c961dbd24063af152e5ff2155
|
|
BLAKE2b-256 checksum How to use checksums |
fbb9d508048e8aefe3daaba9a509fad8074126d1a79359201e1beb53ba532710
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.21 {"installer":{"name":"uv","version":"0.9.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / ennbo-0.3.17-cp311-cp311-macosx_26_0_arm64.whl
| Download URL | ennbo-0.3.17-cp311-cp311-macosx_26_0_arm64.whl |
|---|---|
| Size | 12.4 MB |
| Tags | CPython 3.11 macOS 26.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
302ff26582c5eda9cf111e8b5312e3b6f5398aef1421e93a262f320620d74877
|
|
BLAKE2b-256 checksum How to use checksums |
b44cab91edef825fd647fa86dd655280d494f9e570f01a5a959473a5dd3784a8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.21 {"installer":{"name":"uv","version":"0.9.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Security for ennbo 0.3.17
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.