Passed
Push — master ( bf6a06...0a901a )
by Simon
01:26
created

hyperactive.extensions.memory.memory_load   A

Complexity

Total Complexity 16

Size/Duplication

Total Lines 117
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 77
dl 0
loc 117
rs 10
c 0
b 0
f 0
wmc 16

8 Methods

Rating   Name   Duplication   Size   Complexity  
A MemoryLoad._read_func_metadata() 0 24 3
A MemoryLoad.__init__() 0 10 1
A MemoryLoad._get_hash() 0 2 1
A MemoryLoad._get_func_data_names() 0 6 1
A MemoryLoad.para2pos() 0 12 2
A MemoryLoad.apply_index() 0 5 2
A MemoryLoad._load_data_into_memory() 0 19 2
A MemoryLoad._load_memory() 0 10 3

1 Function

Rating   Name   Duplication   Size   Complexity  
A apply_tobytes() 0 2 1
1
# Author: Simon Blanke
2
# Email: [email protected]
3
# License: MIT License
4
5
import glob
6
import hashlib
7
8
import numpy as np
9
import pandas as pd
10
11
from functools import partial
12
13
from .memory_io import MemoryIO
14
15
16
def apply_tobytes(df):
17
    return df.values.tobytes()
18
19
20
class MemoryLoad(MemoryIO):
21
    def __init__(self, _space_, _main_args_, _cand_, memory_dict):
22
        super().__init__(_space_, _main_args_, _cand_, memory_dict)
23
24
        self.pos_best = None
25
        self.score_best = -np.inf
26
27
        self.memory_type = _main_args_.memory
28
        self.memory_dict = memory_dict
29
30
        self.meta_data_found = False
31
32
    def _load_memory(self, _cand_, _verb_):
33
        para, score = self._read_func_metadata(_cand_.func_, _verb_)
34
        if para is None or score is None:
35
            return
36
37
        _verb_.load_samples(para)
38
        _cand_.eval_time = list(para["eval_time"])
39
40
        self._load_data_into_memory(para, score)
41
        self.n_dims = len(para.columns)
42
43
    def apply_index(self, pos_key, df):
44
        return (
45
            self._space_.search_space[pos_key].index(df)
46
            if df in self._space_.search_space[pos_key]
47
            else None
48
        )
49
50
    def _read_func_metadata(self, model_func, _verb_):
51
        paths = self._get_func_data_names()
52
53
        meta_data_list = []
54
        for path in paths:
55
            meta_data = pd.read_csv(path)
56
            meta_data_list.append(meta_data)
57
            self.meta_data_found = True
58
59
        if len(meta_data_list) > 0:
60
            meta_data = pd.concat(meta_data_list, ignore_index=True)
61
62
            column_names = meta_data.columns
63
            score_name = [name for name in column_names if self.score_col_name in name]
64
65
            para = meta_data.drop(score_name, axis=1)
66
            score = meta_data[score_name]
67
68
            _verb_.load_meta_data()
69
            return para, score
70
71
        else:
72
            _verb_.no_meta_data(model_func)
73
            return None, None
74
75
    def _get_func_data_names(self):
76
        paths = glob.glob(
77
            self.func_path + (self.feature_hash + "_" + self.label_hash + "_.csv")
78
        )
79
80
        return paths
81
82
    def _get_hash(self, object):
83
        return hashlib.sha1(object).hexdigest()
84
85
    def para2pos(self, paras):
86
        paras = paras[self._space_.para_names]
87
        pos = paras.copy()
88
89
        for pos_key in self._space_.search_space:
90
            apply_index = partial(self.apply_index, pos_key)
91
            pos[pos_key] = paras[pos_key].apply(apply_index)
92
93
        pos.dropna(how="any", inplace=True)
94
        pos = pos.astype("int64")
95
96
        return pos
97
98
    def _load_data_into_memory(self, paras, scores):
99
        paras = paras.replace(self.hash2obj)
100
        pos = self.para2pos(paras)
101
102
        if len(pos) == 0:
103
            return
104
105
        df_temp = pd.DataFrame()
106
        df_temp["pos_str"] = pos.apply(apply_tobytes, axis=1)
107
        df_temp["score"] = scores
108
109
        self.memory_dict = df_temp.set_index("pos_str").to_dict()["score"]
110
111
        scores = np.array(scores)
112
        paras = np.array(paras)
113
114
        idx = np.argmax(scores)
115
        self.score_best = scores[idx]
116
        self.pos_best = paras[idx]
117