Skip to content

Commit bf26abd

Browse files
committed
Merge branch 'master' into feature/add-constr-opt
2 parents f2de309 + a392e71 commit bf26abd

4 files changed

Lines changed: 210 additions & 5 deletions

File tree

README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -933,17 +933,17 @@ Each of the following optimizer classes can be initialized and passed to the "ad
933933
<details>
934934
<summary><b>v4.4.0</b> :heavy_check_mark: </summary>
935935

936-
- [ ] add Optimization-Strategies
937-
- [ ] redesign progress-bar
936+
- [x] add Optimization-Strategies
937+
- [x] redesign progress-bar
938938

939939
</details>
940940

941941
<details>
942942
<summary><b>v4.5.0</b> </summary>
943943

944-
- [ ] add early stopping feature to custom optimization strategies
945-
- [ ] display additional outputs from objective-function in results in command-line
946-
- [ ] add type hints to hyperactive-api
944+
- [x] add early stopping feature to custom optimization strategies
945+
- [x] display additional outputs from objective-function in results in command-line
946+
- [x] add type hints to hyperactive-api
947947

948948
</details>
949949

examples/opt_strat_early_stop.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import numpy as np
2+
3+
from hyperactive import Hyperactive
4+
5+
6+
from hyperactive.optimizers.strategies import CustomOptimizationStrategy
7+
from hyperactive.optimizers import (
8+
HillClimbingOptimizer,
9+
RandomSearchOptimizer,
10+
BayesianOptimizer,
11+
)
12+
13+
14+
opt_strat = CustomOptimizationStrategy()
15+
opt_strat.add_optimizer(
16+
RandomSearchOptimizer(), duration=0.5, early_stopping={"n_iter_no_change": 10}
17+
)
18+
opt_strat.add_optimizer(
19+
HillClimbingOptimizer(), duration=0.5, early_stopping={"n_iter_no_change": 10}
20+
)
21+
22+
23+
def objective_function(opt):
24+
score = -opt["x1"] * opt["x1"]
25+
return score, {"additional stuff": 1}
26+
27+
28+
search_space = {"x1": list(np.arange(-100, 101, 1))}
29+
n_iter = 100
30+
optimizer = opt_strat
31+
32+
hyper = Hyperactive()
33+
hyper.add_search(
34+
objective_function,
35+
search_space,
36+
n_iter=n_iter,
37+
n_jobs=1,
38+
optimizer=optimizer,
39+
)
40+
hyper.run()
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
from hyperactive.optimizers import (
2+
HillClimbingOptimizer,
3+
StochasticHillClimbingOptimizer,
4+
RepulsingHillClimbingOptimizer,
5+
SimulatedAnnealingOptimizer,
6+
DownhillSimplexOptimizer,
7+
RandomSearchOptimizer,
8+
GridSearchOptimizer,
9+
RandomRestartHillClimbingOptimizer,
10+
RandomAnnealingOptimizer,
11+
PowellsMethod,
12+
PatternSearch,
13+
ParallelTemperingOptimizer,
14+
ParticleSwarmOptimizer,
15+
SpiralOptimization,
16+
EvolutionStrategyOptimizer,
17+
BayesianOptimizer,
18+
LipschitzOptimizer,
19+
DirectAlgorithm,
20+
TreeStructuredParzenEstimators,
21+
ForestOptimizer,
22+
)
23+
24+
25+
optimizers = (
26+
"Optimizer",
27+
[
28+
(HillClimbingOptimizer),
29+
(StochasticHillClimbingOptimizer),
30+
(RepulsingHillClimbingOptimizer),
31+
(SimulatedAnnealingOptimizer),
32+
(DownhillSimplexOptimizer),
33+
(RandomSearchOptimizer),
34+
(GridSearchOptimizer),
35+
(RandomRestartHillClimbingOptimizer),
36+
(RandomAnnealingOptimizer),
37+
(PowellsMethod),
38+
(PatternSearch),
39+
(ParallelTemperingOptimizer),
40+
(ParticleSwarmOptimizer),
41+
(SpiralOptimization),
42+
(EvolutionStrategyOptimizer),
43+
(BayesianOptimizer),
44+
(LipschitzOptimizer),
45+
(DirectAlgorithm),
46+
(TreeStructuredParzenEstimators),
47+
(ForestOptimizer),
48+
],
49+
)
50+
51+
52+
optimizers_strat = (
53+
"Optimizer_strat",
54+
[
55+
(HillClimbingOptimizer),
56+
(StochasticHillClimbingOptimizer),
57+
(RepulsingHillClimbingOptimizer),
58+
(SimulatedAnnealingOptimizer),
59+
(DownhillSimplexOptimizer),
60+
(RandomSearchOptimizer),
61+
(GridSearchOptimizer),
62+
(RandomRestartHillClimbingOptimizer),
63+
(RandomAnnealingOptimizer),
64+
(PowellsMethod),
65+
(PatternSearch),
66+
(ParallelTemperingOptimizer),
67+
(ParticleSwarmOptimizer),
68+
(SpiralOptimization),
69+
(EvolutionStrategyOptimizer),
70+
(BayesianOptimizer),
71+
(LipschitzOptimizer),
72+
(DirectAlgorithm),
73+
(TreeStructuredParzenEstimators),
74+
(ForestOptimizer),
75+
],
76+
)
77+
78+
79+
optimizers_non_smbo = (
80+
"Optimizer_non_smbo",
81+
[
82+
(HillClimbingOptimizer),
83+
(StochasticHillClimbingOptimizer),
84+
(RepulsingHillClimbingOptimizer),
85+
(SimulatedAnnealingOptimizer),
86+
(DownhillSimplexOptimizer),
87+
(RandomSearchOptimizer),
88+
(GridSearchOptimizer),
89+
(RandomRestartHillClimbingOptimizer),
90+
(RandomAnnealingOptimizer),
91+
(PowellsMethod),
92+
(PatternSearch),
93+
(ParallelTemperingOptimizer),
94+
(ParticleSwarmOptimizer),
95+
(SpiralOptimization),
96+
(EvolutionStrategyOptimizer),
97+
],
98+
)
99+
100+
101+
optimizers_smbo = (
102+
"Optimizer_smbo",
103+
[
104+
(BayesianOptimizer),
105+
(LipschitzOptimizer),
106+
(DirectAlgorithm),
107+
(TreeStructuredParzenEstimators),
108+
(ForestOptimizer),
109+
],
110+
)
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import pytest
2+
import numpy as np
3+
4+
5+
from hyperactive import Hyperactive
6+
from hyperactive.optimizers.strategies import CustomOptimizationStrategy
7+
from hyperactive.optimizers import RandomSearchOptimizer
8+
9+
from ._parametrize import optimizers
10+
11+
12+
@pytest.mark.parametrize(*optimizers)
13+
def test_strategy_early_stopping_0(Optimizer):
14+
def objective_function(para):
15+
score = -para["x1"] * para["x1"]
16+
return score
17+
18+
search_space = {
19+
"x1": list(np.arange(0, 100, 0.1)),
20+
}
21+
22+
n_iter_no_change = 5
23+
early_stopping = {
24+
"n_iter_no_change": n_iter_no_change,
25+
}
26+
27+
optimizer1 = Optimizer()
28+
optimizer2 = RandomSearchOptimizer()
29+
30+
opt_strat = CustomOptimizationStrategy()
31+
opt_strat.add_optimizer(optimizer1, duration=0.5, early_stopping=early_stopping)
32+
opt_strat.add_optimizer(optimizer2, duration=0.5)
33+
34+
n_iter = 30
35+
36+
hyper = Hyperactive()
37+
hyper.add_search(
38+
objective_function,
39+
search_space,
40+
optimizer=opt_strat,
41+
n_iter=n_iter,
42+
initialize={"warm_start": [{"x1": 0}]},
43+
)
44+
hyper.run()
45+
46+
optimizer1 = hyper.opt_pros[0].optimizer_setup_l[0]["optimizer"]
47+
optimizer2 = hyper.opt_pros[0].optimizer_setup_l[1]["optimizer"]
48+
49+
search_data = optimizer1.search_data
50+
n_performed_iter = len(search_data)
51+
52+
print("\n n_performed_iter \n", n_performed_iter)
53+
print("\n n_iter_no_change \n", n_iter_no_change)
54+
55+
assert n_performed_iter == (n_iter_no_change + 1)

0 commit comments

Comments
 (0)