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

Candidate.__init__()   A

Complexity

Conditions 2

Size

Total Lines 35
Code Lines 26

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 26
nop 8
dl 0
loc 35
rs 9.256
c 0
b 0
f 0

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

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