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.
Files changed (123) hide show
  1. enn/__init__.py +25 -13
  2. enn/benchmarks/__init__.py +3 -0
  3. enn/benchmarks/ackley.py +5 -0
  4. enn/benchmarks/ackley_class.py +17 -0
  5. enn/benchmarks/ackley_core.py +12 -0
  6. enn/benchmarks/double_ackley.py +24 -0
  7. enn/enn/candidates.py +14 -0
  8. enn/enn/conditional_posterior_draw_internals.py +15 -0
  9. enn/enn/draw_internals.py +15 -0
  10. enn/enn/enn.py +16 -229
  11. enn/enn/enn_class.py +423 -0
  12. enn/enn/enn_conditional.py +325 -0
  13. enn/enn/enn_fit.py +77 -76
  14. enn/enn/enn_hash.py +79 -0
  15. enn/enn/enn_index.py +92 -0
  16. enn/enn/enn_like_protocol.py +35 -0
  17. enn/enn/enn_normal.py +3 -3
  18. enn/enn/enn_params.py +3 -9
  19. enn/enn/enn_params_class.py +24 -0
  20. enn/enn/enn_util.py +79 -37
  21. enn/enn/neighbor_data.py +14 -0
  22. enn/enn/neighbors.py +14 -0
  23. enn/enn/posterior_flags.py +8 -0
  24. enn/enn/weighted_stats.py +14 -0
  25. enn/turbo/components/__init__.py +41 -0
  26. enn/turbo/components/acquisition.py +13 -0
  27. enn/turbo/components/acquisition_optimizer_protocol.py +19 -0
  28. enn/turbo/components/builder.py +22 -0
  29. enn/turbo/components/chebyshev_incumbent_selector.py +76 -0
  30. enn/turbo/components/enn_surrogate.py +115 -0
  31. enn/turbo/components/gp_surrogate.py +144 -0
  32. enn/turbo/components/hnr_acq_optimizer.py +83 -0
  33. enn/turbo/components/incumbent_selector.py +11 -0
  34. enn/turbo/components/incumbent_selector_protocol.py +16 -0
  35. enn/turbo/components/no_incumbent_selector.py +21 -0
  36. enn/turbo/components/no_surrogate.py +49 -0
  37. enn/turbo/components/pareto_acq_optimizer.py +49 -0
  38. enn/turbo/components/posterior_result.py +12 -0
  39. enn/turbo/components/protocols.py +13 -0
  40. enn/turbo/components/random_acq_optimizer.py +21 -0
  41. enn/turbo/components/scalar_incumbent_selector.py +39 -0
  42. enn/turbo/components/surrogate_protocol.py +32 -0
  43. enn/turbo/components/surrogate_result.py +12 -0
  44. enn/turbo/components/surrogates.py +5 -0
  45. enn/turbo/components/thompson_acq_optimizer.py +49 -0
  46. enn/turbo/components/trust_region_protocol.py +24 -0
  47. enn/turbo/components/ucb_acq_optimizer.py +49 -0
  48. enn/turbo/config/__init__.py +87 -0
  49. enn/turbo/config/acq_type.py +8 -0
  50. enn/turbo/config/acquisition.py +26 -0
  51. enn/turbo/config/base.py +4 -0
  52. enn/turbo/config/candidate_gen_config.py +49 -0
  53. enn/turbo/config/candidate_rv.py +7 -0
  54. enn/turbo/config/draw_acquisition_config.py +14 -0
  55. enn/turbo/config/enn_index_driver.py +6 -0
  56. enn/turbo/config/enn_surrogate_config.py +42 -0
  57. enn/turbo/config/enums.py +7 -0
  58. enn/turbo/config/factory.py +118 -0
  59. enn/turbo/config/gp_surrogate_config.py +14 -0
  60. enn/turbo/config/hnr_optimizer_config.py +7 -0
  61. enn/turbo/config/init_config.py +17 -0
  62. enn/turbo/config/init_strategies/__init__.py +9 -0
  63. enn/turbo/config/init_strategies/hybrid_init.py +23 -0
  64. enn/turbo/config/init_strategies/init_strategy.py +19 -0
  65. enn/turbo/config/init_strategies/lhd_only_init.py +24 -0
  66. enn/turbo/config/morbo_tr_config.py +82 -0
  67. enn/turbo/config/nds_optimizer_config.py +7 -0
  68. enn/turbo/config/no_surrogate_config.py +14 -0
  69. enn/turbo/config/no_tr_config.py +31 -0
  70. enn/turbo/config/optimizer_config.py +72 -0
  71. enn/turbo/config/pareto_acquisition_config.py +14 -0
  72. enn/turbo/config/raasp_driver.py +6 -0
  73. enn/turbo/config/raasp_optimizer_config.py +7 -0
  74. enn/turbo/config/random_acquisition_config.py +14 -0
  75. enn/turbo/config/rescalarize.py +7 -0
  76. enn/turbo/config/surrogate.py +12 -0
  77. enn/turbo/config/trust_region.py +34 -0
  78. enn/turbo/config/turbo_tr_config.py +71 -0
  79. enn/turbo/config/ucb_acquisition_config.py +14 -0
  80. enn/turbo/config/validation.py +45 -0
  81. enn/turbo/hypervolume.py +30 -0
  82. enn/turbo/impl_helpers.py +68 -0
  83. enn/turbo/morbo_trust_region.py +250 -0
  84. enn/turbo/no_trust_region.py +58 -0
  85. enn/turbo/optimizer.py +300 -0
  86. enn/turbo/optimizer_config.py +8 -0
  87. enn/turbo/proposal.py +46 -39
  88. enn/turbo/sampling.py +21 -0
  89. enn/turbo/strategies/__init__.py +9 -0
  90. enn/turbo/strategies/lhd_only_strategy.py +36 -0
  91. enn/turbo/strategies/optimization_strategy.py +19 -0
  92. enn/turbo/strategies/turbo_hybrid_strategy.py +124 -0
  93. enn/turbo/tr_helpers.py +202 -0
  94. enn/turbo/turbo_gp.py +9 -2
  95. enn/turbo/turbo_gp_base.py +0 -1
  96. enn/turbo/turbo_gp_fit.py +187 -0
  97. enn/turbo/turbo_gp_noisy.py +0 -1
  98. enn/turbo/turbo_optimizer_utils.py +98 -0
  99. enn/turbo/turbo_trust_region.py +129 -63
  100. enn/turbo/turbo_utils.py +144 -117
  101. enn/turbo/types/__init__.py +7 -0
  102. enn/turbo/types/appendable_array.py +85 -0
  103. enn/turbo/types/gp_data_prep.py +13 -0
  104. enn/turbo/types/gp_fit_result.py +11 -0
  105. enn/turbo/types/obs_lists.py +10 -0
  106. enn/turbo/types/prepare_ask_result.py +14 -0
  107. enn/turbo/types/tell_inputs.py +14 -0
  108. {ennbo-0.1.0.dist-info → ennbo-0.1.7.dist-info}/METADATA +22 -14
  109. ennbo-0.1.7.dist-info/RECORD +111 -0
  110. enn/enn/__init__.py +0 -4
  111. enn/turbo/__init__.py +0 -11
  112. enn/turbo/base_turbo_impl.py +0 -98
  113. enn/turbo/lhd_only_impl.py +0 -42
  114. enn/turbo/turbo_config.py +0 -28
  115. enn/turbo/turbo_enn_impl.py +0 -176
  116. enn/turbo/turbo_mode.py +0 -10
  117. enn/turbo/turbo_mode_impl.py +0 -67
  118. enn/turbo/turbo_one_impl.py +0 -163
  119. enn/turbo/turbo_optimizer.py +0 -337
  120. enn/turbo/turbo_zero_impl.py +0 -24
  121. ennbo-0.1.0.dist-info/RECORD +0 -27
  122. {ennbo-0.1.0.dist-info → ennbo-0.1.7.dist-info}/WHEEL +0 -0
  123. {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,13 @@
1
+ from __future__ import annotations
2
+ from dataclasses import dataclass
3
+ from typing import Any
4
+
5
+
6
+ @dataclass
7
+ class GPDataPrep:
8
+ train_x: Any
9
+ train_y: Any
10
+ is_multi: bool
11
+ y_mean: Any
12
+ y_std: Any
13
+ y_raw: Any
@@ -0,0 +1,11 @@
1
+ from __future__ import annotations
2
+ from dataclasses import dataclass
3
+ from typing import Any
4
+
5
+
6
+ @dataclass
7
+ class GPFitResult:
8
+ model: Any
9
+ likelihood: Any
10
+ y_mean: Any
11
+ y_std: Any
@@ -0,0 +1,10 @@
1
+ from __future__ import annotations
2
+ from dataclasses import dataclass
3
+
4
+
5
+ @dataclass
6
+ class ObsLists:
7
+ x_obs: list
8
+ y_obs: list
9
+ y_tr: list
10
+ yvar_obs: list
@@ -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.0
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==1.9.0
40
- Requires-Dist: gpytorch==1.13
41
- Requires-Dist: nds==0.4.3
42
- Requires-Dist: numpy==1.26.4
43
- Requires-Dist: scipy==1.15.3
44
- Requires-Dist: torch==2.5.1
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 model, [`EpistemicNearestNeighbors`](https://github.com/yubo-research/enn/blob/main/src/enn/enn/enn.py) [1]
54
- - TuRBO-ENN optimizer, class [`TurboOptimizer`](https://github.com/yubo-research/enn/blob/main/src/enn/turbo/turbo_optimizer.py) has four modes
55
- - `TURBO_ONE` - A clone of the TuRBO [2] reference [code](https://github.com/uber-research/TuRBO), reworked to have an `ask()`/`tell()` interface.
56
- - `TURBO_ENN` - Same as TURBO_ONE, except uses ENN instead of GP and Pareto(mu, se) instead of Thompson sampling.
57
- - `TURBO_ZERO` - Same as TURBO_ONE, except randomly-chosen RAASP [3] candidates are picked to be proposals. There is no surrogate.
58
- - `LHD_ONLY` - Just creates an LHD design for every `ask()`. Good for a baseline and for testing.
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
@@ -1,4 +0,0 @@
1
- from .enn import EpistemicNearestNeighbors
2
- from .enn_fit import enn_fit
3
-
4
- __all__: list[str] = ["EpistemicNearestNeighbors", "enn_fit"]
enn/turbo/__init__.py DELETED
@@ -1,11 +0,0 @@
1
- from .turbo_mode import TurboMode
2
- from .turbo_optimizer import Telemetry, TurboOptimizer
3
-
4
- Turbo = TurboOptimizer
5
-
6
- __all__ = [
7
- "TurboMode",
8
- "TurboOptimizer",
9
- "Turbo",
10
- "Telemetry",
11
- ]
@@ -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
@@ -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}")