Passed
Push — master ( 910140...3a068d )
by Simon
06:34 queued 35s
created

hyperactive.candidate.Candidate.pos()   A

Complexity

Conditions 1

Size

Total Lines 3
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 4
nop 2
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 numpy as np
6
7
from .search_space import SearchSpace
8
from .model import Model
9
from .init_position import InitSearchPosition
10
11
12
class Candidate:
13
    def __init__(self, obj_func, func_para, search_space, init_para, memory, verb):
14
        self.obj_func = obj_func
15
        self.func_para = func_para
16
        self.search_space = search_space
17
        self.memory = memory
18
        self.verb = verb
19
20
        self.space = SearchSpace(search_space, verb)
21
        self.model = Model(obj_func, func_para, verb)
22
        self.init = InitSearchPosition(init_para, self.space, verb)
23
24
        self.memory_dict = {}
25
        self.memory_dict_new = {}
26
27
        self._score = -np.inf
28
        self._pos = None
29
30
        self.score_best = -np.inf
31
        self.pos_best = None
32
33
        self.score_list = []
34
        self.pos_list = []
35
36
        self.eval_time = []
37
        self.iter_times = []
38
39
        if not memory:
40
            self.mem = None
41
            self.eval_pos = self.eval_pos_noMem
42
        else:
43
            self.mem = None
44
            self.eval_pos = self.eval_pos_Mem
45
46
    @property
47
    def score(self):
48
        return self._score
49
50
    @score.setter
51
    def score(self, value):
52
        self.score_list.append(value)
53
        self._score = value
54
55
    @property
56
    def pos(self):
57
        return self._score
58
59
    @pos.setter
60
    def pos(self, value):
61
        self.pos_list.append(value)
62
        self._pos = value
63
64
    def base_eval(self, pos, nth_iter):
65
        para = self.space.pos2para(pos)
66
        para["iteration"] = nth_iter
67
        results = self.model.eval(para)
68
69
        if results["score"] > self.score_best:
70
            self.score_best = results["score"]
71
            self.pos_best = pos
72
73
            self.verb.p_bar.best_since_iter = nth_iter
74
75
        return results
76
77
    def eval_pos_noMem(self, pos, nth_iter):
78
        results = self.base_eval(pos, nth_iter)
79
        return results["score"]
80
81
    def eval_pos_Mem(self, pos, nth_iter, force_eval=False):
82
        pos.astype(int)
83
        pos_tuple = tuple(pos)
84
85
        if pos_tuple in self.memory_dict and not force_eval:
86
            return self.memory_dict[pos_tuple]["score"]
87
        else:
88
            results = self.base_eval(pos, nth_iter)
89
            self.memory_dict[pos_tuple] = results
90
            self.memory_dict_new[pos_tuple] = results
91
92
            return results["score"]
93
94
    def get_score(self, pos_new, nth_iter):
95
        score_new = self.eval_pos(pos_new, nth_iter)
96
        self.verb.p_bar.update_p_bar(1, self.score_best)
97
98
        if score_new > self.score_best:
99
            self.score = score_new
100
            self.pos = pos_new
101
102
        return score_new
103