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

hyperactive.search_process.meta_data_path()   A

Complexity

Conditions 1

Size

Total Lines 3
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 3
nop 0
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 os
6
import time
7
import numpy as np
8
9
from .candidate import Candidate
10
11
from hypermemory import Hypermemory
12
from importlib import import_module
13
14
15
def meta_data_path():
16
    current_path = os.path.realpath(__file__)
17
    return current_path.rsplit("/", 1)[0] + "/meta_data/"
18
19
20
optimizer_dict = {
21
    "HillClimbing": "HillClimbingOptimizer",
22
    "StochasticHillClimbing": "StochasticHillClimbingOptimizer",
23
    "TabuSearch": "TabuOptimizer",
24
    "RandomSearch": "RandomSearchOptimizer",
25
    "RandomRestartHillClimbing": "RandomRestartHillClimbingOptimizer",
26
    "RandomAnnealing": "RandomAnnealingOptimizer",
27
    "SimulatedAnnealing": "SimulatedAnnealingOptimizer",
28
    "StochasticTunneling": "StochasticTunnelingOptimizer",
29
    "ParallelTempering": "ParallelTemperingOptimizer",
30
    "ParticleSwarm": "ParticleSwarmOptimizer",
31
    "EvolutionStrategy": "EvolutionStrategyOptimizer",
32
    "Bayesian": "BayesianOptimizer",
33
    "TPE": "TreeStructuredParzenEstimators",
34
    "DecisionTree": "DecisionTreeOptimizer",
35
}
36
37
38
class ShortTermMemory:
39
    def __init__(self, _space_, _main_args_, _cand_):
40
        self._space_ = _space_
41
        self._main_args_ = _main_args_
42
43
        self.pos_best = None
44
        self.score_best = -np.inf
45
46
        self.memory_type = _main_args_.memory
47
        self.memory_dict = {}
48
        self.memory_dict_new = {}
49
50
        self.meta_data_found = False
51
52
        self.n_dims = None
53
54
55
class HypermemoryWrapper:
56
    def __init__(self):
57
        pass
58
59
    def load_memory(self, X, y):
60
        self.mem = Hypermemory(X, y, self.obj_func, self.search_space,)
61
        self.eval_pos = self.eval_pos_Mem
62
        self.memory_dict = self.mem.load()
63
64
65
class SearchProcess:
66
    def __init__(self, nth_process, pro_arg, verb):
67
        self.nth_process = nth_process
68
        self.pro_arg = pro_arg
69
        self.verb = verb
70
71
        kwargs = self.pro_arg.kwargs
72
        module = import_module("gradient_free_optimizers")
73
74
        self.opt_class = getattr(module, optimizer_dict[pro_arg.optimizer])
75
        self.obj_func = kwargs["objective_function"]
76
        self.func_para = kwargs["function_parameter"]
77
        self.search_space = kwargs["search_space"]
78
        self.n_iter = kwargs["n_iter"]
79
        self.n_jobs = kwargs["n_jobs"]
80
        self.memory = kwargs["memory"]
81
        self.init_para = kwargs["init_para"]
82
        self.distribution = kwargs["distribution"]
83
84
        self.cand = Candidate(
85
            self.obj_func,
86
            self.func_para,
87
            self.search_space,
88
            self.init_para,
89
            self.memory,
90
            verb,
91
        )
92
93
        # self.space = SearchSpace(kwargs["search_space"], verb)
94
        # self.model = Model(self.obj_func, self.func_para, verb)
95
        # self.init = InitSearchPosition(self.init_para, self.space, verb)
96
97
        self.start_time = time.time()
98
        self.i = 0
99
100
        self.memory_dict = {}
101
        self.memory_dict_new = {}
102
103
        self._score = -np.inf
104
        self._pos = None
105
106
        self.score_best = -np.inf
107
        self.pos_best = None
108
109
        self.score_list = []
110
        self.pos_list = []
111
112
        self.eval_time = []
113
        self.iter_times = []
114
115
        # self._memory_processor()
116
117
    def _memory_processor(self):
118
        if self.memory == "long":
119
            self.mem = Hypermemory(
120
                self.func_para["features"],
121
                self.func_para["target"],
122
                self.obj_func,
123
                self.search_space,
124
            )
125
            self.eval_pos = self.eval_pos_Mem
126
127
            self.memory_dict = self.mem.load()
128
129
        else:
130
            print("Warning: Memory not defined")
131
            self.mem = None
132
            self.eval_pos = self.eval_pos_noMem
133
134
        if self.mem:
135
            if self.mem.meta_data_found:
136
                self.pos_best = self.mem.pos_best
137
                self.score_best = self.mem.score_best
138
139
    def _get_warm_start(self):
140
        return self.space.pos2para(self.pos_best)
141
142
    def _process_results(self):
143
        self.total_time = time.time() - self.start_time
144
        start_point = self.verb.info.print_start_point(self)
145
146
        if self.memory == "long":
147
            self.mem.dump(self.memory_dict_new)
148
149
        return start_point
150
151
    def search(self, start_time, max_time, nth_process):
152
        self._initialize_search(nth_process)
153
154
        # loop to initialize N positions
155
        for nth_init in range(len(self.opt.init_positions)):
156
            pos_new = self.opt.init_pos(nth_init)
157
            score_new = self.cand.get_score(pos_new, 0)
158
            self.opt.evaluate(score_new)
159
160
        # loop to do the iterations
161
        for nth_iter in range(len(self.opt.init_positions), self.n_iter):
162
            pos_new = self.opt.iterate(nth_iter)
163
            score_new = self.cand.get_score(pos_new, nth_iter)
164
            self.opt.evaluate(score_new)
165
166
            if self._time_exceeded(start_time, max_time):
167
                break
168
169
        self.verb.p_bar.close_p_bar()
170
171
        return self.opt.p_list
172
173
    def _time_exceeded(self, start_time, max_time):
174
        run_time = time.time() - start_time
175
        return max_time and run_time > max_time
176
177
    def _initialize_search(self, nth_process):
178
        n_positions = self.pro_arg.n_positions
179
        init_positions = self.cand.init.set_start_pos(n_positions)
180
        self.opt = self.opt_class(init_positions, self.cand.space.dim, opt_para={})
181
182
        self.pro_arg.set_random_seed(nth_process)
183
        self.verb.p_bar.init_p_bar(nth_process, self.n_iter, self.obj_func)
184