Passed
Push — master ( b478a2...16a37b )
by Simon
01:57 queued 10s
created

hyperactive.candidate.Candidate.__init__()   B

Complexity

Conditions 6

Size

Total Lines 48
Code Lines 36

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 6
eloc 36
nop 4
dl 0
loc 48
rs 8.0826
c 0
b 0
f 0
1
# Author: Simon Blanke
2
# Email: [email protected]
3
# License: MIT License
4
5
import time
6
import numpy as np
7
8
from .search_space import SearchSpace
9
from .model import Model
10
from .init_position import InitSearchPosition
11
from .extensions.memory import ShortTermMemory, LongTermMemory
12
13
14
class Candidate:
15
    def __init__(self, nth_process, _main_args_, _info_):
16
        self.start_time = time.time()
17
        self.i = 0
18
        self._main_args_ = _main_args_
19
        self.memory = _main_args_.memory
20
21
        self._info_ = _info_()
22
23
        self._score_best = -np.inf
24
        self.pos_best = None
25
        self.model = None
26
27
        self.nth_process = nth_process
28
        model_nr = nth_process % _main_args_.n_models
29
        self.func_ = list(_main_args_.search_config.keys())[model_nr]
30
        self._space_ = SearchSpace(_main_args_, model_nr)
31
        self.func_name = str(self.func_).split(" ")[1]
32
        self._model_ = Model(self.func_, nth_process, _main_args_)
33
        self._init_ = InitSearchPosition(self._space_, self._model_, _main_args_)
34
35
        self.eval_time = []
36
37
        if not self.memory:
38
            self.mem = None
39
            self.eval_pos = self.eval_pos_noMem
40
41
        elif self.memory == "short":
42
            self.mem = ShortTermMemory(self._space_, _main_args_, self)
43
            self.eval_pos = self.eval_pos_Mem
44
45
        elif self.memory == "long":
46
            self.mem = LongTermMemory(self._space_, _main_args_, self)
47
            self.eval_pos = self.eval_pos_Mem
48
49
            self.mem.load_memory(self, self._info_)
50
51
        else:
52
            print("Warning: Memory not defined")
53
            self.mem = None
54
            self.eval_pos = self.eval_pos_noMem
55
56
        if self.mem:
57
            if self.mem.meta_data_found:
58
                self.pos_best = self.mem.pos_best
59
                self.score_best = self.mem.score_best
60
61
        self.pos_best = self._init_._set_start_pos(self._info_)
62
        self.score_best = self.eval_pos(self.pos_best)
63
64
    def _get_warm_start(self):
65
        return self._space_.pos2para(self.pos_best)
66
67
    def _process_results(self, _opt_args_):
68
69
        self.total_time = time.time() - self.start_time
70
        start_point = self._info_.print_start_point(self)
71
72
        if self._main_args_.memory == "long":
73
            self.mem.save_memory(self._main_args_, _opt_args_, self)
74
75
        return start_point
76
77
    @property
78
    def score_best(self):
79
        return self._score_best
80
81
    @score_best.setter
82
    def score_best(self, value):
83
        self.model_best = self.model
84
        self._score_best = value
85
86
    def base_eval(self, pos):
87
        para = self._space_.pos2para(pos)
88
        para["iteration"] = self.i
89
        score, eval_time, self.model = self._model_.train_model(para)
90
        self.eval_time.append(eval_time)
91
92
        return score
93
94
    def eval_pos_noMem(self, pos):
95
        score = self.base_eval(pos)
96
        return score
97
98
    def eval_pos_Mem(self, pos, force_eval=False):
99
        pos.astype(int)
100
        pos_str = pos.tostring()
101
102
        if pos_str in self.mem.memory_dict and not force_eval:
103
            return self.mem.memory_dict[pos_str]
104
        else:
105
            score = self.base_eval(pos)
106
            self.mem.memory_dict[pos_str] = score
107
            return score
108