Passed
Push — master ( 479869...faee70 )
by Simon
12:46 queued 11s
created

hyperactive.search_process.SearchProcess.pos()   A

Complexity

Conditions 1

Size

Total Lines 3
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 4
nop 2
dl 0
loc 3
rs 10
c 0
b 0
f 0
1
# Author: Simon Blanke
2
# Email: [email protected]
3
# License: MIT License
4
5
import os
6
import time
7
import numpy as np
8
9
from .search_space import SearchSpace
10
from .model import Model
11
from .init_position import InitSearchPosition
12
13
from hypermemory import Hypermemory
14
15
16
def meta_data_path():
17
    current_path = os.path.realpath(__file__)
18
    return current_path.rsplit("/", 1)[0] + "/meta_data/"
19
20
21
class ShortTermMemory:
22
    def __init__(self, _space_, _main_args_, _cand_):
23
        self._space_ = _space_
24
        self._main_args_ = _main_args_
25
26
        self.pos_best = None
27
        self.score_best = -np.inf
28
29
        self.memory_type = _main_args_.memory
30
        self.memory_dict = {}
31
        self.memory_dict_new = {}
32
33
        self.meta_data_found = False
34
35
        self.n_dims = None
36
37
38
class SearchProcess:
39
    def __init__(self, nth_process, _main_args_, _info_):
40
        self.start_time = time.time()
41
        self.i = 0
42
        self._main_args_ = _main_args_
43
        self.memory = _main_args_.memory
44
45
        self.memory_dict = {}
46
        self.memory_dict_new = {}
47
48
        self._info_ = _info_()
49
50
        self._score = -np.inf
51
        self._pos = None
52
53
        self.score_best = -np.inf
54
        self.pos_best = None
55
56
        self.score_list = []
57
        self.pos_list = []
58
59
        self.nth_process = nth_process
60
        model_nr = nth_process % _main_args_.n_models
61
        self.func_ = list(_main_args_.search_config.keys())[model_nr]
62
        self.search_space = _main_args_.search_config[self.func_]
63
64
        self._space_ = SearchSpace(_main_args_, model_nr)
65
        self.func_name = str(self.func_).split(" ")[1]
66
        self._model_ = Model(self.func_, nth_process, _main_args_)
67
        self._init_ = InitSearchPosition(self._space_, self._model_, _main_args_)
68
69
        self.eval_time = []
70
        self.iter_times = []
71
72
        if not self.memory:
73
            self.mem = None
74
            self.eval_pos = self.eval_pos_noMem
75
76
        elif self.memory == "short":
77
            self.mem = None
78
            self.eval_pos = self.eval_pos_Mem
79
80
        elif self.memory == "long":
81
            self.mem = Hypermemory(
82
                _main_args_.X,
83
                _main_args_.y,
84
                self.func_,
85
                self.search_space,
86
                path=meta_data_path(),
87
            )
88
            self.eval_pos = self.eval_pos_Mem
89
90
            self.memory_dict = self.mem.load()
91
92
        else:
93
            print("Warning: Memory not defined")
94
            self.mem = None
95
            self.eval_pos = self.eval_pos_noMem
96
97
        if self.mem:
98
            if self.mem.meta_data_found:
99
                self.pos_best = self.mem.pos_best
100
                self.score_best = self.mem.score_best
101
102
    def _init_eval(self):
103
        self.pos_best = self._init_._set_start_pos(self._info_)
104
        self.score_best = self.eval_pos(self.pos_best)
105
106
    def _get_warm_start(self):
107
        return self._space_.pos2para(self.pos_best)
108
109
    def _process_results(self):
110
        self.total_time = time.time() - self.start_time
111
        start_point = self._info_.print_start_point(self)
112
113
        if self._main_args_.memory == "long":
114
            self.mem.dump(self.memory_dict_new, main_args=self._main_args_)
115
116
        return start_point
117
118
    def init_pos(self, n_positions):
119
        init_pos_list = []
120
121
        for i in range(n_positions):
122
            init_pos = self._init_._set_start_pos(self._info_)
123
            init_pos_list.append(init_pos)
124
125
        return init_pos_list
126
127
    @property
128
    def score(self):
129
        return self._score
130
131
    @score.setter
132
    def score(self, value):
133
        self.score_list.append(value)
134
        self._score = value
135
136
    @property
137
    def pos(self):
138
        return self._score
139
140
    @pos.setter
141
    def pos(self, value):
142
        self.pos_list.append(value)
143
        self._pos = value
144
145
    def base_eval(self, pos, p_bar, nth_iter):
146
        para = self._space_.pos2para(pos)
147
        para["iteration"] = self.i
148
        results = self._model_.train_model(para)
149
150
        if results["score"] > self.score_best:
151
            self.score_best = results["score"]
152
            self.pos_best = pos
153
154
            p_bar.best_since_iter = nth_iter
155
156
        return results
157
158
    def eval_pos_noMem(self, pos, p_bar, nth_iter):
159
        results = self.base_eval(pos, p_bar, nth_iter)
160
        return results["score"]
161
162
    def eval_pos_Mem(self, pos, p_bar, nth_iter, force_eval=False):
163
        pos.astype(int)
164
        pos_str = pos.tostring()
165
166
        if pos_str in self.memory_dict and not force_eval:
167
            return self.memory_dict[pos_str]["score"]
168
        else:
169
            results = self.base_eval(pos, p_bar, nth_iter)
170
            self.memory_dict[pos_str] = results
171
            self.memory_dict_new[pos_str] = results
172
173
            return results["score"]
174