| 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 |  |  |  |