Passed
Push — master ( d39371...69bf6f )
by Simon
03:38
created

skip_refit_50()   A

Complexity

Conditions 2

Size

Total Lines 4
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 4
nop 1
dl 0
loc 4
rs 10
c 0
b 0
f 0
1
# Author: Simon Blanke
2
# Email: [email protected]
3
# License: MIT License
4
5
6
import numpy as np
7
8
9
from ..base_optimizer import BaseOptimizer
10
from ...search import Search
11
12
13
def _split_into_subcubes(data, split_per_dim=2):
14
    n_dim = data.shape[1]
15
    subcubes = []
16
17
    data_list = [data]
18
19
    for dim in range(n_dim):
20
        subdata_list = []
21
22
        if dim == 0:
23
            data_list = [data]
24
25
        for data in data_list:
26
            data_sorted = data[data[:, dim].argsort()]
27
28
            subdata = np.array_split(data_sorted, 2, axis=0)
29
            subdata_list = subdata_list + subdata
30
31
        data_list = subdata_list
32
33
    return subcubes
34
35
36
def skip_refit_75(i):
37
    if i <= 33:
38
        return 1
39
    return int((i - 33) ** 0.75)
40
41
42
def skip_refit_50(i):
43
    if i <= 33:
44
        return 1
45
    return int((i - 33) ** 0.5)
46
47
48
def skip_refit_25(i):
49
    if i <= 33:
50
        return 1
51
    return int((i - 33) ** 0.25)
52
53
54
def never_skip_refit(i):
55
    return 1
56
57
58
skip_retrain_ = {
59
    "many": skip_refit_75,
60
    "some": skip_refit_50,
61
    "few": skip_refit_25,
62
    "never": never_skip_refit,
63
}
64
65
66
class SBOM(BaseOptimizer, Search):
67
    def __init__(
68
        self,
69
        search_space,
70
        start_up_evals=10,
71
        max_sample_size=1000000,
72
        warm_start_smbo=None,
73
        skip_retrain="never",
74
    ):
75
        super().__init__(search_space)
76
77
        self.start_up_evals = start_up_evals
78
        self.max_sample_size = max_sample_size
79
        self.warm_start_smbo = warm_start_smbo
80
        self.skip_retrain = skip_retrain_[skip_retrain]
81
82
        self.X_sample = []
83
        self.Y_sample = []
84
85
    def get_random_sample(self):
86
        sample_size = self._sample_size()
87
        if sample_size > self.all_pos_comb.shape[0]:
88
            sample_size = self.all_pos_comb.shape[0]
89
90
        row_sample = np.random.choice(
91
            self.all_pos_comb.shape[0], size=(sample_size,), replace=False
92
        )
93
        return self.all_pos_comb[row_sample]
94
95
    def _sample_size(self):
96
        n = self.max_sample_size
97
        return int(n * np.tanh(self.all_pos_comb.size / n))
98
99
    def _all_possible_pos(self):
100
        pos_space = []
101
        for dim_ in self.space_dim:
102
            pos_space.append(np.arange(dim_ + 1))
103
104
        self.n_dim = len(pos_space)
105
        self.all_pos_comb = np.array(np.meshgrid(*pos_space)).T.reshape(-1, self.n_dim)
106
107
        # _split_into_subcubes(self.all_pos_comb)
108
109
    def init_pos(self, pos):
110
        super().init_pos(pos)
111
        self._all_possible_pos()
112
113
        if self.warm_start_smbo is not None:
114
            (self.X_sample, self.Y_sample) = self.warm_start_smbo
115
116
        self.X_sample.append(pos)
117
118
        return pos
119
120