Passed
Push — master ( 8cb372...2b17b1 )
by Simon
01:35
created

hyperactive.candidate   A

Complexity

Total Complexity 17

Size/Duplication

Total Lines 112
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 79
dl 0
loc 112
rs 10
c 0
b 0
f 0
wmc 17

8 Methods

Rating   Name   Duplication   Size   Complexity  
B Candidate.__init__() 0 48 6
A Candidate._process_results() 0 9 2
A Candidate.score_best() 0 3 1
A Candidate._get_warm_start() 0 2 1
A Candidate.eval_pos_Mem() 0 11 3
A Candidate.init_eval() 0 2 1
A Candidate.eval_pos_noMem() 0 3 1
A Candidate.base_eval() 0 7 1
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 .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
        self.iter_times = []
37
38
        if not self.memory:
39
            self.mem = None
40
            self.eval_pos = self.eval_pos_noMem
41
42
        elif self.memory == "short":
43
            self.mem = ShortTermMemory(self._space_, _main_args_, self)
44
            self.eval_pos = self.eval_pos_Mem
45
46
        elif self.memory == "long":
47
            self.mem = LongTermMemory(self._space_, _main_args_, self)
48
            self.eval_pos = self.eval_pos_Mem
49
50
            self.mem.load_memory(self, self._info_)
51
52
        else:
53
            print("Warning: Memory not defined")
54
            self.mem = None
55
            self.eval_pos = self.eval_pos_noMem
56
57
        if self.mem:
58
            if self.mem.meta_data_found:
59
                self.pos_best = self.mem.pos_best
60
                self.score_best = self.mem.score_best
61
62
        self.pos_best = self._init_._set_start_pos(self._info_)
63
64
    def init_eval(self):
65
        self.score_best = self.eval_pos(self.pos_best)
66
67
    def _get_warm_start(self):
68
        return self._space_.pos2para(self.pos_best)
69
70
    def _process_results(self, _opt_args_):
71
72
        self.total_time = time.time() - self.start_time
73
        start_point = self._info_.print_start_point(self)
74
75
        if self._main_args_.memory == "long":
76
            self.mem.save_memory(self._main_args_, _opt_args_, self)
77
78
        return start_point
79
80
    @property
81
    def score_best(self):
82
        return self._score_best
83
84
    @score_best.setter
85
    def score_best(self, value):
86
        self.model_best = self.model
87
        self._score_best = value
88
89
    def base_eval(self, pos):
90
        para = self._space_.pos2para(pos)
91
        para["iteration"] = self.i
92
        score, eval_time = self._model_.train_model(para)
93
        self.eval_time.append(eval_time)
94
95
        return score
96
97
    def eval_pos_noMem(self, pos):
98
        score = self.base_eval(pos)
99
        return score
100
101
    def eval_pos_Mem(self, pos, force_eval=False):
102
        pos.astype(int)
103
        pos_str = pos.tostring()
104
105
        if pos_str in self.mem.memory_dict and not force_eval:
106
            return self.mem.memory_dict[pos_str]
107
        else:
108
            score = self.base_eval(pos)
109
            self.mem.memory_dict[pos_str] = score
110
            self.mem.memory_dict_new[pos_str] = score
111
            return score
112