Passed
Push — master ( 91a232...6b9e1e )
by Simon
01:43 queued 13s
created

HyperGradientConv.conv_memory_warm_start()   A

Complexity

Conditions 4

Size

Total Lines 32
Code Lines 20

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 4
eloc 20
nop 2
dl 0
loc 32
rs 9.4
c 0
b 0
f 0
1
# Author: Simon Blanke
2
# Email: [email protected]
3
# License: MIT License
4
5
import numpy as np
6
import pandas as pd
7
8
9
class HyperGradientConv:
10
    def __init__(self, s_space):
11
        self.s_space = s_space
12
13
    def value2position(self, value: list) -> list:
14
        return [
15
            np.abs(v - np.array(space_dim)).argmin()
16
            for v, space_dim in zip(value, self.s_space.values_l)
17
        ]
18
19
    def value2para(self, value: list) -> dict:
20
        return {key: p for key, p in zip(self.s_space.dim_keys, value)}
21
22
    def para2value(self, para: dict) -> list:
23
        return [para[para_name] for para_name in self.s_space.dim_keys]
24
25
    def position2value(self, position):
26
        return [
27
            space_dim[pos]
28
            for pos, space_dim in zip(position, self.s_space.values_l)
29
        ]
30
31
    def para_func2str(self, para):
32
        return {
33
            dim_key: (
34
                para[dim_key].__name__
35
                if self.s_space.data_types[dim_key] != "number"
36
                else para[dim_key]
37
            )
38
            for dim_key in self.s_space.dim_keys
39
        }
40
41
    def value_func2str(self, value):
42
        try:
43
            return value.__name__
44
        except:
45
            return value
46
47
    def conv_para(self, para_hyper):
48
        para_gfo = {}
49
        for para in self.s_space.dim_keys:
50
            value_hyper = para_hyper[para]
51
            space_dim = list(self.s_space.func2str[para])
52
53
            if self.s_space.data_types[para] == "number":
54
                value_gfo = np.abs(value_hyper - np.array(space_dim)).argmin()
55
            else:
56
                value_hyper = self.value_func2str(value_hyper)
57
58
                if value_hyper in space_dim:
59
                    value_gfo = space_dim.index(value_hyper)
60
                else:
61
                    raise ValueError(
62
                        f"'{value_hyper}' was not found in '{para}'"
63
                    )
64
65
            para_gfo[para] = value_gfo
66
        return para_gfo
67
68
    def conv_initialize(self, initialize):
69
        if "warm_start" in initialize:
70
            warm_start_l = initialize["warm_start"]
71
            warm_start_gfo = [
72
                self.conv_para(warm_start) for warm_start in warm_start_l
73
            ]
74
            initialize["warm_start"] = warm_start_gfo
75
76
        return initialize
77
78
    def get_list_positions(self, list1_values, search_dim):
79
        return [search_dim.index(value2) for value2 in list1_values]
80
81
    def values2positions(self, values, search_dim):
82
        return np.array(search_dim).searchsorted(values)
83
84
    def positions2results(self, positions):
85
        results_dict = {}
86
87
        for para_name in self.s_space.dim_keys:
88
            values_list = self.s_space[para_name]
89
            pos_ = positions[para_name].values
90
            values_ = [values_list[idx] for idx in pos_]
91
            results_dict[para_name] = values_
92
93
        results = pd.DataFrame.from_dict(results_dict)
94
95
        diff_list = np.setdiff1d(positions.columns, results.columns)
96
        results[diff_list] = positions[diff_list]
97
98
        return results
99
100
    def conv_memory_warm_start(self, results):
101
        if results is None:
102
            return results
103
104
        results.reset_index(inplace=True, drop=True)
105
106
        df_positions_dict = {}
107
        for dim_key in self.s_space.dim_keys:
108
            result_dim_values = list(results[dim_key].values)
109
            search_dim = self.s_space.func2str[dim_key]
110
111
            if self.s_space.data_types[dim_key] == "object":
112
                result_dim_values = [
113
                    self.value_func2str(value) for value in result_dim_values
114
                ]
115
116
                list1_positions = self.get_list_positions(
117
                    result_dim_values, search_dim
118
                )
119
            else:
120
                list1_positions = self.values2positions(
121
                    result_dim_values, search_dim
122
                )
123
124
            df_positions_dict[dim_key] = list1_positions
125
126
        results_new = pd.DataFrame(df_positions_dict)
127
128
        results_new["score"] = results["score"]
129
        results_new.dropna(how="any", inplace=True)
130
131
        return results_new
132