Passed
Push — master ( 1414af...3552eb )
by Simon
01:28
created

hyperactive.candidate.Candidate.eval_pos_longMem()   A

Complexity

Conditions 4

Size

Total Lines 15
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 4
eloc 11
nop 3
dl 0
loc 15
rs 9.85
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
        self.opt_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_shortMem
45
46
        elif self.memory == "long":
47
            self.mem = LongTermMemory(self._space_, _main_args_, self)
48
            self.eval_pos = self.eval_pos_longMem
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
        self.score_best = self.eval_pos(self.pos_best)
64
65
    def _get_warm_start(self):
66
        return self._space_.pos2para(self.pos_best)
67
68
    def _process_results(self, _opt_args_):
69
70
        self.total_time = time.time() - self.start_time
71
        start_point = self._info_.print_start_point(self)
72
73
        if self._main_args_.memory == "long":
74
            self.mem.save_memory(self._main_args_, _opt_args_, self)
75
76
        return start_point
77
78
    @property
79
    def score_best(self):
80
        return self._score_best
81
82
    @score_best.setter
83
    def score_best(self, value):
84
        self.model_best = self.model
85
        self._score_best = value
86
87
    def base_eval(self, pos):
88
        para = self._space_.pos2para(pos)
89
        para["iteration"] = self.i
90
        score, eval_time = self._model_.train_model(para)
91
        self.eval_time.append(eval_time)
92
93
        return score, eval_time
94
95
    def eval_pos_noMem(self, pos):
96
        score, eval_time = self.base_eval(pos)
97
        return score
98
99
    def eval_pos_shortMem(self, pos, force_eval=False):
100
        pos.astype(int)
101
        pos_str = pos.tostring()
102
103
        if pos_str in self.mem.memory_dict and not force_eval:
104
            return self.mem.memory_dict[pos_str][0]
105
        else:
106
            score, eval_time = self.base_eval(pos)
107
            self.mem.memory_dict[pos_str] = [score]
108
            return score
109
110
    def eval_pos_longMem(self, pos, force_eval=False):
111
        pos.astype(int)
112
        pos_str = pos.tostring()
113
114
        if pos_str in self.mem.memory_dict and not force_eval:
115
            return self.mem.memory_dict[pos_str][0]
116
        else:
117
            score, eval_time = self.base_eval(pos)
118
            if self._model_.rest:
119
                values = [score, eval_time] + self._model_.rest
120
            else:
121
                values = [score, eval_time]
122
123
            self.mem.memory_dict[pos_str] = values
124
            return score