Passed
Push — master ( 626f23...be3b1e )
by Simon
01:48
created

LocalBayesianOptimizer.iterate()   A

Complexity

Conditions 1

Size

Total Lines 6
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 5
nop 1
dl 0
loc 6
rs 10
c 0
b 0
f 0
1
# Author: Simon Blanke
2
# Email: [email protected]
3
# License: MIT License
4
5
import time
6
import random
7
import numpy as np
8
9
from ..base_optimizer import BaseOptimizer
10
from ...search import Search
11
from ._sub_search_spaces import SubSearchSpaces
12
from ..smb_opt import BayesianOptimizer
13
14
15
class LocalBayesianOptimizer(BaseOptimizer, Search):
16
    name = "Local Bayesian Optimizer"
17
18
    def __init__(
19
        self,
20
        *args,
21
        max_size=300000,
22
        n_positions=20,
23
        local_range=100,
24
        **kwargs,
25
    ):
26
        super().__init__(*args, **kwargs)
27
28
        self.max_size = max_size
29
        self.n_positions = n_positions
30
        self.local_range = local_range
31
32
        self.bayes_opt = BayesianOptimizer(self.conv.search_space)
33
34
    def create_local_smbo(self, current_position):
35
        local_ss = {}
36
37
        for idx, para in enumerate(self.conv.para_names):
38
39
            max_dim = max(0, current_position[idx] + self.local_range)
40
            min_dim = min(
41
                self.conv.dim_sizes[idx], current_position[idx] - self.local_range
42
            )
43
44
            dim_pos = np.array(self.conv.search_space_positions[idx])
45
46
            dim_pos_center = np.where(
47
                np.logical_and(dim_pos >= min_dim, dim_pos <= max_dim)
48
            )[0]
49
            local_ss[para] = dim_pos_center
50
51
        self.bayes_opt = BayesianOptimizer(local_ss)
52
53
    def finish_initialization(self):
54
        self.create_local_smbo(self.pos_current)
55
56
    @BaseOptimizer.track_nth_iter
57
    def iterate(self):
58
        pos_loc = self.bayes_opt.iterate()
59
        pos_new = self.bayes_opt.conv.position2value(pos_loc)
60
61
        return pos_new
62
63
    def evaluate(self, score_new):
64
        self.bayes_opt.evaluate(score_new)
65
66
        self.score_new = score_new
67
68
        self._evaluate_new2current(score_new)
69
        self._evaluate_current2best()
70
71
        modZero = self.nth_iter % self.n_positions == 0
72
73
        if modZero:
74
            self.create_local_smbo(self.pos_current)
75