Passed
Push — master ( 193da7...4bb259 )
by Simon
01:36 queued 11s
created

hyperactive.candidate.candidate_base   A

Complexity

Total Complexity 14

Size/Duplication

Total Lines 106
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 74
dl 0
loc 106
rs 10
c 0
b 0
f 0
wmc 14

7 Methods

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