ennbo 0.1.0__py3-none-any.whl → 0.1.7__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- enn/__init__.py +25 -13
- enn/benchmarks/__init__.py +3 -0
- enn/benchmarks/ackley.py +5 -0
- enn/benchmarks/ackley_class.py +17 -0
- enn/benchmarks/ackley_core.py +12 -0
- enn/benchmarks/double_ackley.py +24 -0
- enn/enn/candidates.py +14 -0
- enn/enn/conditional_posterior_draw_internals.py +15 -0
- enn/enn/draw_internals.py +15 -0
- enn/enn/enn.py +16 -229
- enn/enn/enn_class.py +423 -0
- enn/enn/enn_conditional.py +325 -0
- enn/enn/enn_fit.py +77 -76
- enn/enn/enn_hash.py +79 -0
- enn/enn/enn_index.py +92 -0
- enn/enn/enn_like_protocol.py +35 -0
- enn/enn/enn_normal.py +3 -3
- enn/enn/enn_params.py +3 -9
- enn/enn/enn_params_class.py +24 -0
- enn/enn/enn_util.py +79 -37
- enn/enn/neighbor_data.py +14 -0
- enn/enn/neighbors.py +14 -0
- enn/enn/posterior_flags.py +8 -0
- enn/enn/weighted_stats.py +14 -0
- enn/turbo/components/__init__.py +41 -0
- enn/turbo/components/acquisition.py +13 -0
- enn/turbo/components/acquisition_optimizer_protocol.py +19 -0
- enn/turbo/components/builder.py +22 -0
- enn/turbo/components/chebyshev_incumbent_selector.py +76 -0
- enn/turbo/components/enn_surrogate.py +115 -0
- enn/turbo/components/gp_surrogate.py +144 -0
- enn/turbo/components/hnr_acq_optimizer.py +83 -0
- enn/turbo/components/incumbent_selector.py +11 -0
- enn/turbo/components/incumbent_selector_protocol.py +16 -0
- enn/turbo/components/no_incumbent_selector.py +21 -0
- enn/turbo/components/no_surrogate.py +49 -0
- enn/turbo/components/pareto_acq_optimizer.py +49 -0
- enn/turbo/components/posterior_result.py +12 -0
- enn/turbo/components/protocols.py +13 -0
- enn/turbo/components/random_acq_optimizer.py +21 -0
- enn/turbo/components/scalar_incumbent_selector.py +39 -0
- enn/turbo/components/surrogate_protocol.py +32 -0
- enn/turbo/components/surrogate_result.py +12 -0
- enn/turbo/components/surrogates.py +5 -0
- enn/turbo/components/thompson_acq_optimizer.py +49 -0
- enn/turbo/components/trust_region_protocol.py +24 -0
- enn/turbo/components/ucb_acq_optimizer.py +49 -0
- enn/turbo/config/__init__.py +87 -0
- enn/turbo/config/acq_type.py +8 -0
- enn/turbo/config/acquisition.py +26 -0
- enn/turbo/config/base.py +4 -0
- enn/turbo/config/candidate_gen_config.py +49 -0
- enn/turbo/config/candidate_rv.py +7 -0
- enn/turbo/config/draw_acquisition_config.py +14 -0
- enn/turbo/config/enn_index_driver.py +6 -0
- enn/turbo/config/enn_surrogate_config.py +42 -0
- enn/turbo/config/enums.py +7 -0
- enn/turbo/config/factory.py +118 -0
- enn/turbo/config/gp_surrogate_config.py +14 -0
- enn/turbo/config/hnr_optimizer_config.py +7 -0
- enn/turbo/config/init_config.py +17 -0
- enn/turbo/config/init_strategies/__init__.py +9 -0
- enn/turbo/config/init_strategies/hybrid_init.py +23 -0
- enn/turbo/config/init_strategies/init_strategy.py +19 -0
- enn/turbo/config/init_strategies/lhd_only_init.py +24 -0
- enn/turbo/config/morbo_tr_config.py +82 -0
- enn/turbo/config/nds_optimizer_config.py +7 -0
- enn/turbo/config/no_surrogate_config.py +14 -0
- enn/turbo/config/no_tr_config.py +31 -0
- enn/turbo/config/optimizer_config.py +72 -0
- enn/turbo/config/pareto_acquisition_config.py +14 -0
- enn/turbo/config/raasp_driver.py +6 -0
- enn/turbo/config/raasp_optimizer_config.py +7 -0
- enn/turbo/config/random_acquisition_config.py +14 -0
- enn/turbo/config/rescalarize.py +7 -0
- enn/turbo/config/surrogate.py +12 -0
- enn/turbo/config/trust_region.py +34 -0
- enn/turbo/config/turbo_tr_config.py +71 -0
- enn/turbo/config/ucb_acquisition_config.py +14 -0
- enn/turbo/config/validation.py +45 -0
- enn/turbo/hypervolume.py +30 -0
- enn/turbo/impl_helpers.py +68 -0
- enn/turbo/morbo_trust_region.py +250 -0
- enn/turbo/no_trust_region.py +58 -0
- enn/turbo/optimizer.py +300 -0
- enn/turbo/optimizer_config.py +8 -0
- enn/turbo/proposal.py +46 -39
- enn/turbo/sampling.py +21 -0
- enn/turbo/strategies/__init__.py +9 -0
- enn/turbo/strategies/lhd_only_strategy.py +36 -0
- enn/turbo/strategies/optimization_strategy.py +19 -0
- enn/turbo/strategies/turbo_hybrid_strategy.py +124 -0
- enn/turbo/tr_helpers.py +202 -0
- enn/turbo/turbo_gp.py +9 -2
- enn/turbo/turbo_gp_base.py +0 -1
- enn/turbo/turbo_gp_fit.py +187 -0
- enn/turbo/turbo_gp_noisy.py +0 -1
- enn/turbo/turbo_optimizer_utils.py +98 -0
- enn/turbo/turbo_trust_region.py +129 -63
- enn/turbo/turbo_utils.py +144 -117
- enn/turbo/types/__init__.py +7 -0
- enn/turbo/types/appendable_array.py +85 -0
- enn/turbo/types/gp_data_prep.py +13 -0
- enn/turbo/types/gp_fit_result.py +11 -0
- enn/turbo/types/obs_lists.py +10 -0
- enn/turbo/types/prepare_ask_result.py +14 -0
- enn/turbo/types/tell_inputs.py +14 -0
- {ennbo-0.1.0.dist-info → ennbo-0.1.7.dist-info}/METADATA +22 -14
- ennbo-0.1.7.dist-info/RECORD +111 -0
- enn/enn/__init__.py +0 -4
- enn/turbo/__init__.py +0 -11
- enn/turbo/base_turbo_impl.py +0 -98
- enn/turbo/lhd_only_impl.py +0 -42
- enn/turbo/turbo_config.py +0 -28
- enn/turbo/turbo_enn_impl.py +0 -176
- enn/turbo/turbo_mode.py +0 -10
- enn/turbo/turbo_mode_impl.py +0 -67
- enn/turbo/turbo_one_impl.py +0 -163
- enn/turbo/turbo_optimizer.py +0 -337
- enn/turbo/turbo_zero_impl.py +0 -24
- ennbo-0.1.0.dist-info/RECORD +0 -27
- {ennbo-0.1.0.dist-info → ennbo-0.1.7.dist-info}/WHEEL +0 -0
- {ennbo-0.1.0.dist-info → ennbo-0.1.7.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import numpy as np
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class AppendableArray:
|
|
7
|
+
def __init__(self, initial_capacity: int = 100) -> None:
|
|
8
|
+
self._initial_capacity = initial_capacity
|
|
9
|
+
self._buffer: np.ndarray | None = None
|
|
10
|
+
self._size = 0
|
|
11
|
+
self._num_cols: int | None = None
|
|
12
|
+
|
|
13
|
+
@property
|
|
14
|
+
def shape(self) -> tuple[int, int]:
|
|
15
|
+
if self._num_cols is None:
|
|
16
|
+
return (0, 0)
|
|
17
|
+
return (self._size, self._num_cols)
|
|
18
|
+
|
|
19
|
+
def _initialize_buffer(self, row: np.ndarray) -> None:
|
|
20
|
+
if row.ndim == 0:
|
|
21
|
+
self._num_cols = 1
|
|
22
|
+
row = row.reshape(1, 1)
|
|
23
|
+
elif row.ndim == 1:
|
|
24
|
+
self._num_cols = row.shape[0]
|
|
25
|
+
row = row[np.newaxis, :]
|
|
26
|
+
elif row.ndim == 2:
|
|
27
|
+
if row.shape[0] != 1:
|
|
28
|
+
raise ValueError(f"Expected row shape (1, D), got {row.shape}")
|
|
29
|
+
self._num_cols = row.shape[1]
|
|
30
|
+
else:
|
|
31
|
+
raise ValueError(f"Expected 0D, 1D or 2D array, got {row.ndim}D")
|
|
32
|
+
|
|
33
|
+
self._buffer = np.empty(
|
|
34
|
+
(self._initial_capacity, self._num_cols), dtype=row.dtype
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
def _validate_row(self, row: np.ndarray) -> np.ndarray:
|
|
38
|
+
if row.ndim == 0:
|
|
39
|
+
if self._num_cols != 1:
|
|
40
|
+
raise ValueError(f"Expected {self._num_cols} columns, got 1 (scalar)")
|
|
41
|
+
return row.reshape(1, 1)
|
|
42
|
+
if row.ndim == 1:
|
|
43
|
+
if row.shape[0] != self._num_cols:
|
|
44
|
+
raise ValueError(
|
|
45
|
+
f"Expected {self._num_cols} columns, got {row.shape[0]}"
|
|
46
|
+
)
|
|
47
|
+
return row[np.newaxis, :]
|
|
48
|
+
if row.ndim == 2:
|
|
49
|
+
if row.shape != (1, self._num_cols):
|
|
50
|
+
raise ValueError(
|
|
51
|
+
f"Expected shape (1, {self._num_cols}), got {row.shape}"
|
|
52
|
+
)
|
|
53
|
+
return row
|
|
54
|
+
raise ValueError(f"Expected 0D, 1D or 2D array, got {row.ndim}D")
|
|
55
|
+
|
|
56
|
+
def append(self, row: np.ndarray) -> None:
|
|
57
|
+
row = np.asarray(row)
|
|
58
|
+
|
|
59
|
+
if self._num_cols is None:
|
|
60
|
+
self._initialize_buffer(row)
|
|
61
|
+
|
|
62
|
+
row = self._validate_row(row)
|
|
63
|
+
|
|
64
|
+
assert self._buffer is not None
|
|
65
|
+
if self._size + 1 > self._buffer.shape[0]:
|
|
66
|
+
new_capacity = self._buffer.shape[0] * 2
|
|
67
|
+
new_buffer = np.empty(
|
|
68
|
+
(new_capacity, self._num_cols), dtype=self._buffer.dtype
|
|
69
|
+
)
|
|
70
|
+
new_buffer[: self._size] = self._buffer[: self._size]
|
|
71
|
+
self._buffer = new_buffer
|
|
72
|
+
|
|
73
|
+
self._buffer[self._size] = row
|
|
74
|
+
self._size += 1
|
|
75
|
+
|
|
76
|
+
def view(self) -> np.ndarray:
|
|
77
|
+
if self._buffer is None:
|
|
78
|
+
return np.empty((0, 0))
|
|
79
|
+
return self._buffer[: self._size]
|
|
80
|
+
|
|
81
|
+
def __len__(self) -> int:
|
|
82
|
+
return self._size
|
|
83
|
+
|
|
84
|
+
def __getitem__(self, key) -> np.ndarray:
|
|
85
|
+
return self.view()[key]
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from dataclasses import dataclass
|
|
3
|
+
from typing import TYPE_CHECKING, Any
|
|
4
|
+
|
|
5
|
+
if TYPE_CHECKING:
|
|
6
|
+
import numpy as np
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@dataclass
|
|
10
|
+
class PrepareAskResult:
|
|
11
|
+
model: Any
|
|
12
|
+
y_mean: float | None
|
|
13
|
+
y_std: float | None
|
|
14
|
+
lengthscales: np.ndarray | None
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from dataclasses import dataclass
|
|
3
|
+
from typing import TYPE_CHECKING
|
|
4
|
+
|
|
5
|
+
if TYPE_CHECKING:
|
|
6
|
+
import numpy as np
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@dataclass
|
|
10
|
+
class TellInputs:
|
|
11
|
+
x: np.ndarray
|
|
12
|
+
y: np.ndarray
|
|
13
|
+
y_var: np.ndarray | None
|
|
14
|
+
num_metrics: int
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ennbo
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.7
|
|
4
4
|
Summary: Epistemic Nearest Neighbors
|
|
5
5
|
Project-URL: Homepage, https://github.com/yubo-research/enn
|
|
6
6
|
Project-URL: Source, https://github.com/yubo-research/enn
|
|
@@ -36,12 +36,15 @@ Classifier: Topic :: Scientific/Engineering
|
|
|
36
36
|
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
37
37
|
Classifier: Topic :: Scientific/Engineering :: Mathematics
|
|
38
38
|
Requires-Python: >=3.11
|
|
39
|
-
Requires-Dist: faiss-cpu
|
|
40
|
-
Requires-Dist: gpytorch
|
|
41
|
-
Requires-Dist:
|
|
42
|
-
Requires-Dist:
|
|
43
|
-
Requires-Dist:
|
|
44
|
-
|
|
39
|
+
Requires-Dist: faiss-cpu>=1.9.0
|
|
40
|
+
Requires-Dist: gpytorch>=1.13
|
|
41
|
+
Requires-Dist: numpy<2.0.0,>=1.26.4
|
|
42
|
+
Requires-Dist: scipy>=1.15.3
|
|
43
|
+
Requires-Dist: torch>=2.5.1
|
|
44
|
+
Provides-Extra: dev
|
|
45
|
+
Requires-Dist: nbmake>=1.5; extra == 'dev'
|
|
46
|
+
Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
47
|
+
Requires-Dist: ruff>=0.4; extra == 'dev'
|
|
45
48
|
Description-Content-Type: text/markdown
|
|
46
49
|
|
|
47
50
|
# Epistemic Nearest Neighbors
|
|
@@ -50,12 +53,16 @@ A fast, alternative surrogate for Bayesian optimization
|
|
|
50
53
|
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]
|
|
51
54
|
|
|
52
55
|
## Contents
|
|
53
|
-
- ENN
|
|
54
|
-
- TuRBO-ENN optimizer
|
|
55
|
-
- `
|
|
56
|
-
- `
|
|
57
|
-
- `
|
|
58
|
-
- `
|
|
56
|
+
- ENN surrogate, [`EpistemicNearestNeighbors`](https://github.com/yubo-research/enn/blob/main/src/enn/enn/enn.py) [1]
|
|
57
|
+
- TuRBO-ENN optimizer via [`create_optimizer`](https://github.com/yubo-research/enn/blob/main/src/enn/turbo/optimizer.py) with config factories
|
|
58
|
+
- `turbo_one_config()` - TuRBO [2], matching the reference implementation.
|
|
59
|
+
- `turbo_enn_config()` - Uses ENN instead of GP.
|
|
60
|
+
- `turbo_zero_config()` - No surrogate
|
|
61
|
+
- `lhd_only_config()` - LHD design on every `ask()`. Good for a baseline and for testing.
|
|
62
|
+
The optimizer has an `ask()/tell()` interface. All `turbo_*()` methods follow TuRBO:
|
|
63
|
+
- Generate candidates with RAASP [3] sampling.
|
|
64
|
+
- Select a candidate with Thompson sampling (TuRBO-one), UCB (TuRBO-ENN), or randomly (TURBO-zero).
|
|
65
|
+
|
|
59
66
|
|
|
60
67
|
[1] **Sweet, D., & Jadhav, S. A. (2025).** Taking the GP Out of the Loop. *arXiv preprint arXiv:2506.12818*.
|
|
61
68
|
https://arxiv.org/abs/2506.12818
|
|
@@ -80,9 +87,10 @@ On my MacBook I can run into problems with dependencies and compatibilities.
|
|
|
80
87
|
|
|
81
88
|
On MacOS try:
|
|
82
89
|
```
|
|
83
|
-
micromamba env create -n ennbo -f conda-macos.yml
|
|
90
|
+
micromamba env create -n ennbo -f admin/conda-macos.yml
|
|
84
91
|
micromamba activate ennbo
|
|
85
92
|
pip install --no-deps ennbo
|
|
93
|
+
pytest -sv tests
|
|
86
94
|
```
|
|
87
95
|
|
|
88
96
|
You may replace `micromamba` with `conda` and this will probably still work.
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
enn/__init__.py,sha256=Iv1cXM6xUCjGDN2x7qj-A9DFy92-6iXQOJke-7_DBbQ,1465
|
|
2
|
+
enn/benchmarks/__init__.py,sha256=50yqq29luUZQmH618jLq006MwimJBYCvlR9PMSs97MM,79
|
|
3
|
+
enn/benchmarks/ackley.py,sha256=LMx_8C4swL3oKbzm70S8wHe_fp7Z0JCbyoi4kx2E9YY,163
|
|
4
|
+
enn/benchmarks/ackley_class.py,sha256=AwLwopw7bUQ0QaN1yFmVdNPZdL4948lqGfKIvyXk7Os,519
|
|
5
|
+
enn/benchmarks/ackley_core.py,sha256=zIGlZuIkzfv2OLLU_R7hSSYnm0TCm7G7Nt7KlDXuu5k,328
|
|
6
|
+
enn/benchmarks/double_ackley.py,sha256=IXZntZ1byJxIlFh3aj3Rzw_2cnjih8c9nyKTt_iM0P8,766
|
|
7
|
+
enn/enn/candidates.py,sha256=axVT0bs0dt4ZEXmy_d540U1h0JJ-YIAqYFaUPaiXwa0,276
|
|
8
|
+
enn/enn/conditional_posterior_draw_internals.py,sha256=Rr9sntjci85ke-LEoZPbxq4le7yKK1qKsOnrSfwA7Jw,317
|
|
9
|
+
enn/enn/draw_internals.py,sha256=o0MEpVV03x8WNdKmOq4yDTerDmxaDc7jeo17b1XxvAo,297
|
|
10
|
+
enn/enn/enn.py,sha256=JNrvi6wDLvYDEVaQ5d94M9uGgBdZWgT49rausgIABOA,358
|
|
11
|
+
enn/enn/enn_class.py,sha256=BAzPZMpaink-ddfRD0N_vZTM1IyVJL7Y6cNe_0Xs_ps,15131
|
|
12
|
+
enn/enn/enn_conditional.py,sha256=rDR3NJq0JHnKUqRu7sma7XR8g1PPeUAJUlbt-iI63YI,10535
|
|
13
|
+
enn/enn/enn_fit.py,sha256=hNAG1FHMbZNBeq0T4CIXp-1aiGKRbupL2nnnlQ4fb0A,4573
|
|
14
|
+
enn/enn/enn_hash.py,sha256=yk8N8EAf-IXsXS_NkoyTtlW0SyxJqzdl6Y8dinB2JYo,3151
|
|
15
|
+
enn/enn/enn_index.py,sha256=nWuWhuA-MqyPZmTAAwJLB4sdv1n7jMmRBuRTS5LzZjI,3060
|
|
16
|
+
enn/enn/enn_like_protocol.py,sha256=bzRvvE-ggqB0CqpdshZb2JJPzyV-BKNYZOjalX54ufQ,925
|
|
17
|
+
enn/enn/enn_normal.py,sha256=MOPsoC3KUCNQ_UMd_Ynkpyg9KSWNdRibaqIyAXdj4yo,661
|
|
18
|
+
enn/enn/enn_params.py,sha256=9NfT2mX3xbXBfPrdKNgVwsu6zWLBNXO0h1IF9NDpfQI,127
|
|
19
|
+
enn/enn/enn_params_class.py,sha256=hfzU2ftyRXMTDTW3euK-v-2ir--fjRXdoh6OYN1c1bo,854
|
|
20
|
+
enn/enn/enn_util.py,sha256=YWJjtbIPpEBN4wJ5EaTrvJB686BKkDxTykewhslzJe8,4543
|
|
21
|
+
enn/enn/neighbor_data.py,sha256=K8Djik2kCfsHSlG8RSvpcudRVmm6l78QXUj1V2_pwMc,272
|
|
22
|
+
enn/enn/neighbors.py,sha256=PUEqtgwUYk7mPD8Gm6RtW3yfDp9J6DNlnuMzYz-XHHI,275
|
|
23
|
+
enn/enn/posterior_flags.py,sha256=La3ZdSy9ZoXtaR4P2D2MOQdaZJ1Vfaz5xK_Jy_-2wWE,187
|
|
24
|
+
enn/enn/weighted_stats.py,sha256=mrghm8hrfrxrQ-jTSrakUjJ5iIdeD7Ilx2H31KaTU50,277
|
|
25
|
+
enn/turbo/hypervolume.py,sha256=lMTA9LlBXNo9kt83POfI4DfcAuvzYD3MgcN8AjIFVQM,910
|
|
26
|
+
enn/turbo/impl_helpers.py,sha256=hlfNBqWMzCJi6PtP8hJ8jlZNv68HIIBSVfsJXQQYgJM,1695
|
|
27
|
+
enn/turbo/morbo_trust_region.py,sha256=AUDeGsnljIYhCflPtPlQTe3TuEIHvWeNp_i07M4mCzQ,8690
|
|
28
|
+
enn/turbo/no_trust_region.py,sha256=3OKAzYrn_F8jXrZyE9LiYHIzJqEl6byjXeuzszwzm5s,1679
|
|
29
|
+
enn/turbo/optimizer.py,sha256=wCTV7a2nwejSgQTw4D2eKWcqTqgZMz_UnxmwshZ2HoU,11146
|
|
30
|
+
enn/turbo/optimizer_config.py,sha256=nIEu-e2rRk0XbEbiC8WkOsTk36go0ocdKsAOjAWD3mI,174
|
|
31
|
+
enn/turbo/proposal.py,sha256=00SHsdgFXi8_d734kpXadOBC6Hz0HO9Pqo4tWuqoKlw,4430
|
|
32
|
+
enn/turbo/sampling.py,sha256=y1ivaEwOYPTo8LVIyMUJ4J5mb6XGXn1EuhSwTYsqvGU,662
|
|
33
|
+
enn/turbo/tr_helpers.py,sha256=KsQBFq9uykeBPuPVpBAhEyZcO1HotbWFkKmKca2zCk0,5417
|
|
34
|
+
enn/turbo/turbo_gp.py,sha256=PY_R4YNPtH7-d2MR2M2eoRnlTgSAkT3Bv1hLGzs7IcQ,1068
|
|
35
|
+
enn/turbo/turbo_gp_base.py,sha256=EtFp6yUber1EIOsKjdNPBjjG6gg3jy-EZHgN4GAseDA,637
|
|
36
|
+
enn/turbo/turbo_gp_fit.py,sha256=JGcDP36DL1-lj93INHjyWCc0EqnhJh1psLPNLiMMy_w,5916
|
|
37
|
+
enn/turbo/turbo_gp_noisy.py,sha256=SCcZPRM5G8kZHdUjHE6whoobOVXOwSZRB6YwlwWFBCg,1079
|
|
38
|
+
enn/turbo/turbo_optimizer_utils.py,sha256=Pl_i5aN3pAT9l4u_0HabJyHo1wBIWvcE3qaSqeAz4QU,3349
|
|
39
|
+
enn/turbo/turbo_trust_region.py,sha256=sNMXYsPbFRfmYxHRUWz8604G3T_mKtJN0WYFTiw_DPg,6608
|
|
40
|
+
enn/turbo/turbo_utils.py,sha256=DPUoaCSAHU2WYSLGh29rREIgYpj2rEir95UBx0w-yVI,7788
|
|
41
|
+
enn/turbo/components/__init__.py,sha256=xDYcJhyIbnaTC2nw84Zt0Y_kKNU7Z1k1DFdQXhrgC68,906
|
|
42
|
+
enn/turbo/components/acquisition.py,sha256=IyBWLG2QyLPduW1wW4LA37iW3XSCp0Z_m259yeMjMnk,398
|
|
43
|
+
enn/turbo/components/acquisition_optimizer_protocol.py,sha256=_PC4ngQbacB8otvPZroCsx5wWZK1PfRjo_bl6aqWPLI,454
|
|
44
|
+
enn/turbo/components/builder.py,sha256=BrhhhkP1k_XjVJt7pnlhHVsnA1En77RBu-vqvffJNvY,822
|
|
45
|
+
enn/turbo/components/chebyshev_incumbent_selector.py,sha256=nJNPAMBIafkL09BzeFPecA5LrUvi13xjJnzGmd71qdo,2453
|
|
46
|
+
enn/turbo/components/enn_surrogate.py,sha256=9_UgTJ3Lk3hsbcdsbUXegRTDQtQa41cFca_ttRFEy7k,4598
|
|
47
|
+
enn/turbo/components/gp_surrogate.py,sha256=yvLknU_NE7S4qrPcDBniB9UYtebvS9_ak5VlUqfzU9A,6012
|
|
48
|
+
enn/turbo/components/hnr_acq_optimizer.py,sha256=wfmJjA9D98HjOyybvlvERru_pVvWTD1QV1REyI2CeBU,2836
|
|
49
|
+
enn/turbo/components/incumbent_selector.py,sha256=mPwtqGdG22b_ZiNinpV4dxKm3Vkvcl4MeYwo9vAVRlg,378
|
|
50
|
+
enn/turbo/components/incumbent_selector_protocol.py,sha256=5LVVsLvCmOeJ9vTIxQ3g59m-15fEZvkL22yzg8abfHM,379
|
|
51
|
+
enn/turbo/components/no_incumbent_selector.py,sha256=toLi-DxPRIlEqCtCOFkq5na626NZRkFnH3tb81e6FXo,429
|
|
52
|
+
enn/turbo/components/no_surrogate.py,sha256=7I6A4ceMhOU5y50blPTM3KgUtzFZyJsxKUVOr9bifmk,1777
|
|
53
|
+
enn/turbo/components/pareto_acq_optimizer.py,sha256=cPXjAtYf3P_xOCYF9ga8FIcLSEoTJ6_VUQjAOJ9TSIs,1853
|
|
54
|
+
enn/turbo/components/posterior_result.py,sha256=LM3ZeE1eT-8gyOhkpa3PF0THXRKH0URTQO0ija1eMbc,235
|
|
55
|
+
enn/turbo/components/protocols.py,sha256=Rwpln-22_9TS1PB5XFYG-B_wqUOOgfaW54tdZbW6nv4,371
|
|
56
|
+
enn/turbo/components/random_acq_optimizer.py,sha256=TEMclz-zQ0ncccmxj58dfxW1kwEwUFfEJG2DzV1gkII,514
|
|
57
|
+
enn/turbo/components/scalar_incumbent_selector.py,sha256=YXdpH9eLwZlYBOyroAyiuQPvJfj9G4jn_wKGEk0PkVk,1092
|
|
58
|
+
enn/turbo/components/surrogate_protocol.py,sha256=kXoeyrdX005yUS-ObaVzx_PeyCV6gLHsnOC36_tHMBY,985
|
|
59
|
+
enn/turbo/components/surrogate_result.py,sha256=ax_y4qZ2a99XdwAbLqHjYAY0ck607oDUFonOtGwgLGU,243
|
|
60
|
+
enn/turbo/components/surrogates.py,sha256=RxEl4VeIaFlLEwas3S3XZ3scxIjuS70Fa0Q8cGrm6LU,174
|
|
61
|
+
enn/turbo/components/thompson_acq_optimizer.py,sha256=Eb_3KPrZRyMBTfgO9OmUQnkXNxcsBZdcb6ecmbpNm4Q,1847
|
|
62
|
+
enn/turbo/components/trust_region_protocol.py,sha256=X8RCN8FtrWpua9VRGHZtSz_wNMxqBdqopULZyopLdPk,879
|
|
63
|
+
enn/turbo/components/ucb_acq_optimizer.py,sha256=RO_9HGCVb6xAGDL8iFJqF4ZkapPbG7tWCvGhLh2C7es,1797
|
|
64
|
+
enn/turbo/config/__init__.py,sha256=dH8GVPL0MJuCdyA_Mo1v__tlLtjd1G2Se3yM8UGIP1Q,1924
|
|
65
|
+
enn/turbo/config/acq_type.py,sha256=P89H41Xt26pCfCt1ODByRDv-TU-Zb5XKlgLcFHb-cpo,144
|
|
66
|
+
enn/turbo/config/acquisition.py,sha256=cPb6PrF6cgcr4c57ylPAspGb-ScDZflyKamnohc_R2c,891
|
|
67
|
+
enn/turbo/config/base.py,sha256=LhX0siqu7YbJ9BxDqC0MujupYwM-B6RLPg2NjdF7Owc,137
|
|
68
|
+
enn/turbo/config/candidate_gen_config.py,sha256=g5OzuMLfDoU-htcjdI4N5V5fnhXdQa_drNF5Ee7ws3o,1507
|
|
69
|
+
enn/turbo/config/candidate_rv.py,sha256=dQumGSHF3uE4HTC0Ix3yzmmsAaLsSs_m8NB93Kpji6g,128
|
|
70
|
+
enn/turbo/config/draw_acquisition_config.py,sha256=nIg6jlWjgjoNyHMKBI5i3zMxu4-WQSitEQGy3h6cUQQ,386
|
|
71
|
+
enn/turbo/config/enn_index_driver.py,sha256=qDrNXatK4nMvUi8h_rkg9Uv_M9WfLdlsTHTP4X3COjE,94
|
|
72
|
+
enn/turbo/config/enn_surrogate_config.py,sha256=dsvDkgPVm5qv8zhE3AvUN9yX37cyGrno0E0GNwodXoY,1269
|
|
73
|
+
enn/turbo/config/enums.py,sha256=nlxqrB3sivvs2_1fMTLGCg0MfoSQ0ZUG8kREM3raSfY,274
|
|
74
|
+
enn/turbo/config/factory.py,sha256=eZNw6Zao7zrKeQHaeLRVDP2tdqsVguSZFoBiW31UkUI,4458
|
|
75
|
+
enn/turbo/config/gp_surrogate_config.py,sha256=tXSF4XPrvNfmZvEHJavGK5AaJ7ZyWWjV105qe4y_DZM,341
|
|
76
|
+
enn/turbo/config/hnr_optimizer_config.py,sha256=oo1Cn0jcaTZXz8L0730KvGVD6m6xiQxmINMVWg6Fj68,130
|
|
77
|
+
enn/turbo/config/init_config.py,sha256=AZhu75v_O-8I3Li6ptgb-uaNv2aP6xX4BF0v58qVS24,610
|
|
78
|
+
enn/turbo/config/morbo_tr_config.py,sha256=RPUEm5wooZja38QwTvMLkA1jRf9cvyBOkMQ-WOVsX8k,2021
|
|
79
|
+
enn/turbo/config/nds_optimizer_config.py,sha256=wuNFqlVVlDLU0tU2XdogLOTMni90-ngLB19nt7XKJ6A,130
|
|
80
|
+
enn/turbo/config/no_surrogate_config.py,sha256=Tf0CXESMbwXlX7l2Tk1HGzH1lNY3c0qk995bHGpZaPk,341
|
|
81
|
+
enn/turbo/config/no_tr_config.py,sha256=5QXJQtjKwNMXs7QqhgLgA3HngCh73g0a-gWzt_OzWNU,789
|
|
82
|
+
enn/turbo/config/optimizer_config.py,sha256=WDYVyAWeX5GTBihlgArJ4XrcZAONw_0QdR2ylHyJUpE,2243
|
|
83
|
+
enn/turbo/config/pareto_acquisition_config.py,sha256=UsH4r4RPWAXgPDgcxlUJ9N0x4u1ZB5Wn3OBDu4Fxg6k,384
|
|
84
|
+
enn/turbo/config/raasp_driver.py,sha256=NY4YZdqhPrusbpPjSLRY2MiDv5_f7CpUXlyVsGx3an8,91
|
|
85
|
+
enn/turbo/config/raasp_optimizer_config.py,sha256=LQUe6nYx8gw3b2OXUGodkK_EK3jvIKSBc9DLhKGOzkM,132
|
|
86
|
+
enn/turbo/config/random_acquisition_config.py,sha256=ktNKCqnAOt69Cbsx9r5pVcgcb1gUYLnRrbureSq4BGA,384
|
|
87
|
+
enn/turbo/config/rescalarize.py,sha256=dB80E62uAGmNRnWrV8aLoTjehFB3pWN1XMkgMh03RAc,144
|
|
88
|
+
enn/turbo/config/surrogate.py,sha256=S1BqKv9Fd-ZmfAXNUKdLFrYhSNY_zdBNL45kvD8jhUo,380
|
|
89
|
+
enn/turbo/config/trust_region.py,sha256=yjDnCq74R81jLu_6e7fCHy5s_m8CZGVABxAPEVUXyTM,769
|
|
90
|
+
enn/turbo/config/turbo_tr_config.py,sha256=5yGVk0_es5yYjYH94GV29q1nWNoY32hed9mmzF0tKkw,2188
|
|
91
|
+
enn/turbo/config/ucb_acquisition_config.py,sha256=00SICPVJZaADCu1Mv0DTDgFfBVeilc5IBzlnjjyb5ko,375
|
|
92
|
+
enn/turbo/config/validation.py,sha256=OCnULdJY6I7QCHqSJWEgURVwcq6CLgu214LTWNWHYiY,1974
|
|
93
|
+
enn/turbo/config/init_strategies/__init__.py,sha256=XgowibgAkggbioBgARZ7LR4y1bUHopZs6luoFMRdgsw,187
|
|
94
|
+
enn/turbo/config/init_strategies/hybrid_init.py,sha256=GDzBMvYXJMfWkaNpnDFNfe8yl7XAhIPaNVS4jkK9nD8,643
|
|
95
|
+
enn/turbo/config/init_strategies/init_strategy.py,sha256=yRKGd9EjMh09rLKejZOkcj7pAL7vnqbpNjr9ax_oLrs,458
|
|
96
|
+
enn/turbo/config/init_strategies/lhd_only_init.py,sha256=84xUlaifq98Vonr0ltEoq8xArS1knRuI0y8qhhNe1QE,638
|
|
97
|
+
enn/turbo/strategies/__init__.py,sha256=PA-p1M-4w8Miv1wLqZF0FODyhyVr3_0vED-qcwiaD8E,251
|
|
98
|
+
enn/turbo/strategies/lhd_only_strategy.py,sha256=nThr0BBHOb0fBialCU7ToYz-BEodS72ZMyHInkiybnc,1154
|
|
99
|
+
enn/turbo/strategies/optimization_strategy.py,sha256=xwiU_P9_1YBt1UaPthNsMo__QvEo9dREc4mJwr05dBA,548
|
|
100
|
+
enn/turbo/strategies/turbo_hybrid_strategy.py,sha256=H-JtlAl3NR0MziiPETCFAY89AusWpObLy-j-xhgWaaU,4567
|
|
101
|
+
enn/turbo/types/__init__.py,sha256=mIP7fNkcgQ1WLPeCSMTzcwbZuNiMlrCt8JLphfml8KU,280
|
|
102
|
+
enn/turbo/types/appendable_array.py,sha256=YAxXuC6QD_52tzYBssJgjP6Dm3rQSYS1NxE3FwKWT4w,2812
|
|
103
|
+
enn/turbo/types/gp_data_prep.py,sha256=KZACZCyqpoDGCMQ4WhRTGAnZhKO-FHtIBB3_dGfAVcc,222
|
|
104
|
+
enn/turbo/types/gp_fit_result.py,sha256=7jvGQxT0XZx8rbOFdmm_nLwV_L3KwybjwEV-uZTLLXM,190
|
|
105
|
+
enn/turbo/types/obs_lists.py,sha256=LytRAkOgRvORMLS-lpP97AvSj2DfrFu2kyHM7JLi7GE,164
|
|
106
|
+
enn/turbo/types/prepare_ask_result.py,sha256=uTFdFZ-e7s1ZmJuyf6l1H4qDTxAmwq5UznP5pVc3r4Y,286
|
|
107
|
+
enn/turbo/types/tell_inputs.py,sha256=OqkkL55MpVVCzhFJuLajYuxrQ6WsJRZ4R521Zn7SBr4,261
|
|
108
|
+
ennbo-0.1.7.dist-info/METADATA,sha256=niGm5jUopcIGOZYrrYyffQk_m3bFaHfGS50YVSy8nRU,6085
|
|
109
|
+
ennbo-0.1.7.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
110
|
+
ennbo-0.1.7.dist-info/licenses/LICENSE,sha256=KTA0NjGalsl_JGrjT_x6SSq9ZYVO3gQ-hLVMEaekc5w,1070
|
|
111
|
+
ennbo-0.1.7.dist-info/RECORD,,
|
enn/enn/__init__.py
DELETED
enn/turbo/__init__.py
DELETED
enn/turbo/base_turbo_impl.py
DELETED
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
from typing import TYPE_CHECKING, Any, Callable
|
|
4
|
-
|
|
5
|
-
if TYPE_CHECKING:
|
|
6
|
-
import numpy as np
|
|
7
|
-
from numpy.random import Generator
|
|
8
|
-
|
|
9
|
-
from .turbo_config import TurboConfig
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class BaseTurboImpl:
|
|
13
|
-
def __init__(self, config: TurboConfig) -> None:
|
|
14
|
-
self._config = config
|
|
15
|
-
|
|
16
|
-
def get_x_center(
|
|
17
|
-
self,
|
|
18
|
-
x_obs_list: list,
|
|
19
|
-
y_obs_list: list,
|
|
20
|
-
rng: Generator,
|
|
21
|
-
) -> np.ndarray | None:
|
|
22
|
-
import numpy as np
|
|
23
|
-
|
|
24
|
-
from .turbo_utils import argmax_random_tie
|
|
25
|
-
|
|
26
|
-
y_array = np.asarray(y_obs_list, dtype=float)
|
|
27
|
-
if y_array.size == 0:
|
|
28
|
-
return None
|
|
29
|
-
idx = argmax_random_tie(y_array, rng=rng)
|
|
30
|
-
x_array = np.asarray(x_obs_list, dtype=float)
|
|
31
|
-
return x_array[idx]
|
|
32
|
-
|
|
33
|
-
def needs_tr_list(self) -> bool:
|
|
34
|
-
return False
|
|
35
|
-
|
|
36
|
-
def create_trust_region(self, num_dim: int, num_arms: int) -> Any:
|
|
37
|
-
from .turbo_trust_region import TurboTrustRegion
|
|
38
|
-
|
|
39
|
-
return TurboTrustRegion(num_dim=num_dim, num_arms=num_arms)
|
|
40
|
-
|
|
41
|
-
def try_early_ask(
|
|
42
|
-
self,
|
|
43
|
-
num_arms: int,
|
|
44
|
-
x_obs_list: list,
|
|
45
|
-
draw_initial_fn: Callable[[int], np.ndarray],
|
|
46
|
-
get_init_lhd_points_fn: Callable[[int], np.ndarray | None],
|
|
47
|
-
) -> np.ndarray | None:
|
|
48
|
-
return None
|
|
49
|
-
|
|
50
|
-
def handle_restart(
|
|
51
|
-
self,
|
|
52
|
-
x_obs_list: list,
|
|
53
|
-
y_obs_list: list,
|
|
54
|
-
yvar_obs_list: list,
|
|
55
|
-
init_idx: int,
|
|
56
|
-
num_init: int,
|
|
57
|
-
) -> tuple[bool, int]:
|
|
58
|
-
return False, init_idx
|
|
59
|
-
|
|
60
|
-
def prepare_ask(
|
|
61
|
-
self,
|
|
62
|
-
x_obs_list: list,
|
|
63
|
-
y_obs_list: list,
|
|
64
|
-
yvar_obs_list: list,
|
|
65
|
-
num_dim: int,
|
|
66
|
-
gp_num_steps: int,
|
|
67
|
-
rng: Any | None = None,
|
|
68
|
-
) -> tuple[Any, float | None, float | None, np.ndarray | None]:
|
|
69
|
-
return None, None, None, None
|
|
70
|
-
|
|
71
|
-
def select_candidates(
|
|
72
|
-
self,
|
|
73
|
-
x_cand: np.ndarray,
|
|
74
|
-
num_arms: int,
|
|
75
|
-
num_dim: int,
|
|
76
|
-
rng: Generator,
|
|
77
|
-
fallback_fn: Callable[[np.ndarray, int], np.ndarray],
|
|
78
|
-
from_unit_fn: Callable[[np.ndarray], np.ndarray],
|
|
79
|
-
) -> np.ndarray:
|
|
80
|
-
raise NotImplementedError("Subclasses must implement select_candidates")
|
|
81
|
-
|
|
82
|
-
def update_trust_region(
|
|
83
|
-
self,
|
|
84
|
-
tr_state: Any,
|
|
85
|
-
y_obs_list: list,
|
|
86
|
-
x_center: np.ndarray | None = None,
|
|
87
|
-
k: int | None = None,
|
|
88
|
-
) -> None:
|
|
89
|
-
import numpy as np
|
|
90
|
-
|
|
91
|
-
y_obs_array = np.asarray(y_obs_list, dtype=float)
|
|
92
|
-
tr_state.update(y_obs_array)
|
|
93
|
-
|
|
94
|
-
def estimate_y(self, x_unit: np.ndarray, y_observed: np.ndarray) -> np.ndarray:
|
|
95
|
-
return y_observed
|
|
96
|
-
|
|
97
|
-
def get_mu_sigma(self, x_unit: np.ndarray) -> tuple[np.ndarray, np.ndarray] | None:
|
|
98
|
-
return None
|
enn/turbo/lhd_only_impl.py
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
from typing import TYPE_CHECKING, Any, Callable
|
|
4
|
-
|
|
5
|
-
if TYPE_CHECKING:
|
|
6
|
-
import numpy as np
|
|
7
|
-
from numpy.random import Generator
|
|
8
|
-
|
|
9
|
-
from .base_turbo_impl import BaseTurboImpl
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class LHDOnlyImpl(BaseTurboImpl):
|
|
13
|
-
def get_x_center(
|
|
14
|
-
self,
|
|
15
|
-
x_obs_list: list,
|
|
16
|
-
y_obs_list: list,
|
|
17
|
-
rng: Generator,
|
|
18
|
-
) -> np.ndarray | None:
|
|
19
|
-
return None
|
|
20
|
-
|
|
21
|
-
def select_candidates(
|
|
22
|
-
self,
|
|
23
|
-
x_cand: np.ndarray,
|
|
24
|
-
num_arms: int,
|
|
25
|
-
num_dim: int,
|
|
26
|
-
rng: Generator,
|
|
27
|
-
fallback_fn: Callable[[np.ndarray, int], np.ndarray],
|
|
28
|
-
from_unit_fn: Callable[[np.ndarray], np.ndarray],
|
|
29
|
-
) -> np.ndarray:
|
|
30
|
-
from .turbo_utils import latin_hypercube
|
|
31
|
-
|
|
32
|
-
unit = latin_hypercube(num_arms, num_dim, rng=rng)
|
|
33
|
-
return from_unit_fn(unit)
|
|
34
|
-
|
|
35
|
-
def update_trust_region(
|
|
36
|
-
self,
|
|
37
|
-
tr_state: Any,
|
|
38
|
-
y_obs_list: list,
|
|
39
|
-
x_center: np.ndarray | None = None,
|
|
40
|
-
k: int | None = None,
|
|
41
|
-
) -> None:
|
|
42
|
-
pass
|
enn/turbo/turbo_config.py
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
from dataclasses import dataclass
|
|
4
|
-
from typing import Literal
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
@dataclass(frozen=True)
|
|
8
|
-
class TurboConfig:
|
|
9
|
-
k: int | None = None
|
|
10
|
-
num_candidates: int | None = None
|
|
11
|
-
num_init: int | None = None
|
|
12
|
-
var_scale: float = 1.0
|
|
13
|
-
|
|
14
|
-
# Experimental
|
|
15
|
-
trailing_obs: int | None = None
|
|
16
|
-
num_fit_samples: int | None = None
|
|
17
|
-
num_fit_candidates: int | None = None
|
|
18
|
-
acq_type: Literal["thompson", "pareto", "ucb"] = "pareto"
|
|
19
|
-
local_only: bool = False
|
|
20
|
-
|
|
21
|
-
def __post_init__(self) -> None:
|
|
22
|
-
if self.acq_type not in ["thompson", "pareto", "ucb"]:
|
|
23
|
-
raise ValueError(
|
|
24
|
-
f"acq_type must be 'thompson', 'pareto', or 'ucb', got {self.acq_type!r}"
|
|
25
|
-
)
|
|
26
|
-
# Pareto acquisition is the only type that works well without hyperparameter fitting
|
|
27
|
-
if self.num_fit_samples is None and self.acq_type != "pareto":
|
|
28
|
-
raise ValueError(f"num_fit_samples required for acq_type={self.acq_type!r}")
|