Passed
Push — master ( 010f66...f88179 )
by Simon
05:28
created

hyperactive.candidate.Candidate._init_eval()   A

Complexity

Conditions 1

Size

Total Lines 3
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 3
nop 1
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 Candidate:
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_best = -np.inf
51
        self.pos_best = None
52
        self.model = None
53
54
        self.nth_process = nth_process
55
        model_nr = nth_process % _main_args_.n_models
56
        self.func_ = list(_main_args_.search_config.keys())[model_nr]
57
        self.search_space = _main_args_.search_config[self.func_]
58
59
        self._space_ = SearchSpace(_main_args_, model_nr)
60
        self.func_name = str(self.func_).split(" ")[1]
61
        self._model_ = Model(self.func_, nth_process, _main_args_)
62
        self._init_ = InitSearchPosition(self._space_, self._model_, _main_args_)
63
64
        self.eval_time = []
65
        self.iter_times = []
66
67
        if not self.memory:
68
            self.mem = None
69
            self.eval_pos = self.eval_pos_noMem
70
71
            self._init_eval()
72
73
        elif self.memory == "short":
74
            self.mem = None
75
            self.eval_pos = self.eval_pos_Mem
76
77
            self._init_eval()
78
79
        elif self.memory == "long":
80
            self.mem = Hypermemory(
81
                _main_args_.X,
82
                _main_args_.y,
83
                self.func_,
84
                self.search_space,
85
                path=meta_data_path(),
86
            )
87
            self.eval_pos = self.eval_pos_Mem
88
89
            self.memory_dict = self.mem.load()
90
91
        else:
92
            print("Warning: Memory not defined")
93
            self.mem = None
94
            self.eval_pos = self.eval_pos_noMem
95
96
            self._init_eval()
97
98
        if self.mem:
99
            if self.mem.meta_data_found:
100
                self.pos_best = self.mem.pos_best
101
                self.score_best = self.mem.score_best
102
            else:
103
                self._init_eval()
104
105
    def _init_eval(self):
106
        self.pos_best = self._init_._set_start_pos(self._info_)
107
        self.score_best = self.eval_pos(self.pos_best)
108
109
    def _get_warm_start(self):
110
        return self._space_.pos2para(self.pos_best)
111
112
    def _process_results(self):
113
        self.total_time = time.time() - self.start_time
114
        start_point = self._info_.print_start_point(self)
115
116
        if self._main_args_.memory == "long":
117
            self.mem.dump(self.memory_dict_new, main_args=self._main_args_)
118
119
        return start_point
120
121
    @property
122
    def score_best(self):
123
        return self._score_best
124
125
    @score_best.setter
126
    def score_best(self, value):
127
        self.model_best = self.model
128
        self._score_best = value
129
130
    def base_eval(self, pos):
131
        para = self._space_.pos2para(pos)
132
        para["iteration"] = self.i
133
        results = self._model_.train_model(para)
134
        self.eval_time.append(results["eval_time"])
135
136
        return results
137
138
    def eval_pos_noMem(self, pos):
139
        results = self.base_eval(pos)
140
        return results["score"]
141
142
    def eval_pos_Mem(self, pos, force_eval=False):
143
        pos.astype(int)
144
        pos_str = pos.tostring()
145
146
        if pos_str in self.memory_dict and not force_eval:
147
            return self.memory_dict[pos_str]["score"]
148
        else:
149
            results = self.base_eval(pos)
150
            self.memory_dict[pos_str] = results
151
            self.memory_dict_new[pos_str] = results
152
153
            return results["score"]
154