Passed
Push — master ( 0f0b8d...36e873 )
by Simon
01:29
created

Initializer.move_random()   A

Complexity

Conditions 2

Size

Total Lines 7
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 6
nop 1
dl 0
loc 7
rs 10
c 0
b 0
f 0
1
# Author: Simon Blanke
2
# Email: [email protected]
3
# License: MIT License
4
5
import random
6
import numpy as np
7
8
from .utils import move_random
9
10
11
class Initializer:
12
    def __init__(self, conv):
13
        self.conv = conv
14
15
    def set_pos(self, initialize):
16
        init_positions_list = []
17
18
        if "random" in initialize:
19
            positions = self._init_random_search(initialize["random"])
20
            init_positions_list.append(positions)
21
        if "grid" in initialize:
22
            positions = self._init_grid_search(initialize["grid"])
23
            init_positions_list.append(positions)
24
        if "vertices" in initialize:
25
            positions = self._init_vertices(initialize["vertices"])
26
            init_positions_list.append(positions)
27
        if "warm_start" in initialize:
28
            positions = self._init_warm_start(initialize["warm_start"])
29
            init_positions_list.append(positions)
30
31
        return [item for sublist in init_positions_list for item in sublist]
32
33
    def _init_warm_start(self, value_list):
34
        positions = []
35
36
        for value_ in value_list:
37
            pos = self.conv.value2position(list(value_.values()))
38
            positions.append(pos)
39
40
        return positions
41
42
    def _init_random_search(self, n_pos):
43
        positions = []
44
45
        if n_pos == 0:
46
            return positions
47
48
        for nth_pos in range(n_pos):
49
            pos = move_random(self.conv.search_space_positions)
50
            positions.append(pos)
51
52
        return positions
53
54
    def _fill_rest_random(self, n_pos, positions):
55
        diff_pos = n_pos - len(positions)
56
        if diff_pos > 0:
57
            pos_rnd = self._init_random_search(n_pos=diff_pos)
58
59
            return positions + pos_rnd
60
        else:
61
            return positions
62
63
    def _init_grid_search(self, n_pos):
64
        positions = []
65
66
        if n_pos == 0:
67
            return positions
68
69
        n_dim = len(self.conv.max_positions)
70
        p_per_dim = int(np.power(n_pos, 1 / n_dim))
71
72
        for dim in self.conv.max_positions:
73
            dim_dist = int(dim / (p_per_dim + 1))
74
            n_points = [n * dim_dist for n in range(1, p_per_dim + 1)]
75
76
            positions.append(n_points)
77
78
        pos_mesh = np.array(np.meshgrid(*positions))
79
        positions = list(pos_mesh.T.reshape(-1, n_dim))
80
81
        positions = self._fill_rest_random(n_pos, positions)
82
83
        return positions
84
85
    def _init_vertices(self, n_pos):
86
        positions = []
87
88
        if n_pos == 0:
89
            return positions
90
91
        # zero_array = np.zeros(self.conv.max_positions.shape)
92
        sub_arrays = []
93
94
        for dim in self.conv.max_positions:
95
            sub_array = np.array([0, dim])
96
            sub_arrays.append(sub_array)
97
98
        n_dims = len(self.conv.max_positions)
99
        pos_comb_np = list(np.array(np.meshgrid(*sub_arrays)).T.reshape(-1, n_dims))
100
        k = min(len(pos_comb_np), n_pos)
101
102
        positions = random.sample(pos_comb_np, k)
103
104
        positions = self._fill_rest_random(n_pos, positions)
105
106
        return positions
107