Passed
Push — master ( 9ff666...1a4396 )
by Simon
03:24
created

Candidate.eval_pos_Mem()   A

Complexity

Conditions 3

Size

Total Lines 13
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

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