| @@ 22-134 (lines=113) @@ | ||
| 19 | return self.search_space.values() |
|
| 20 | ||
| 21 | ||
| 22 | class SearchSpace(DictClass): |
|
| 23 | def __init__(self, search_space): |
|
| 24 | super().__init__(search_space) |
|
| 25 | self.search_space = search_space |
|
| 26 | ||
| 27 | self.dim_keys = list(search_space.keys()) |
|
| 28 | self.values_l = list(self.search_space.values()) |
|
| 29 | ||
| 30 | positions = {} |
|
| 31 | for key in search_space.keys(): |
|
| 32 | positions[key] = np.array(range(len(search_space[key]))) |
|
| 33 | self.positions = positions |
|
| 34 | ||
| 35 | self.check_list() |
|
| 36 | self.check_non_num_values() |
|
| 37 | ||
| 38 | self.data_types = self.dim_types() |
|
| 39 | self.func2str = self._create_num_str_ss() |
|
| 40 | ||
| 41 | def __call__(self): |
|
| 42 | return self.search_space |
|
| 43 | ||
| 44 | def dim_types(self): |
|
| 45 | data_types = {} |
|
| 46 | for dim_key in self.dim_keys: |
|
| 47 | dim_values = np.array(list(self.search_space[dim_key])) |
|
| 48 | try: |
|
| 49 | np.subtract(dim_values, dim_values) |
|
| 50 | np.array(dim_values).searchsorted(dim_values) |
|
| 51 | except: |
|
| 52 | _type_ = "object" |
|
| 53 | else: |
|
| 54 | _type_ = "number" |
|
| 55 | ||
| 56 | data_types[dim_key] = _type_ |
|
| 57 | return data_types |
|
| 58 | ||
| 59 | def _create_num_str_ss(self): |
|
| 60 | func2str = {} |
|
| 61 | for dim_key in self.dim_keys: |
|
| 62 | if self.data_types[dim_key] == "number": |
|
| 63 | func2str[dim_key] = self.search_space[dim_key] |
|
| 64 | else: |
|
| 65 | func2str[dim_key] = [] |
|
| 66 | ||
| 67 | dim_values = self.search_space[dim_key] |
|
| 68 | for value in dim_values: |
|
| 69 | try: |
|
| 70 | func_name = value.__name__ |
|
| 71 | except: |
|
| 72 | func_name = value |
|
| 73 | ||
| 74 | func2str[dim_key].append(func_name) |
|
| 75 | return func2str |
|
| 76 | ||
| 77 | def check_list(self): |
|
| 78 | for dim_key in self.dim_keys: |
|
| 79 | search_dim = self.search_space[dim_key] |
|
| 80 | ||
| 81 | err_msg = "\n Value in '{}' of search space dictionary must be of type list \n".format( |
|
| 82 | dim_key |
|
| 83 | ) |
|
| 84 | if not isinstance(search_dim, list): |
|
| 85 | raise ValueError(err_msg) |
|
| 86 | ||
| 87 | @staticmethod |
|
| 88 | def is_function(value): |
|
| 89 | try: |
|
| 90 | value.__name__ |
|
| 91 | except: |
|
| 92 | return False |
|
| 93 | else: |
|
| 94 | return True |
|
| 95 | ||
| 96 | @staticmethod |
|
| 97 | def is_number(value): |
|
| 98 | try: |
|
| 99 | float(value) |
|
| 100 | value * 0.1 |
|
| 101 | value - 0.1 |
|
| 102 | value / 0.1 |
|
| 103 | except: |
|
| 104 | return False |
|
| 105 | else: |
|
| 106 | return True |
|
| 107 | ||
| 108 | def _string_or_object(self, dim_key, dim_values): |
|
| 109 | for dim_value in dim_values: |
|
| 110 | is_str = isinstance(dim_value, str) |
|
| 111 | is_func = self.is_function(dim_value) |
|
| 112 | is_number = self.is_number(dim_value) |
|
| 113 | ||
| 114 | if not is_str and not is_func and not is_number: |
|
| 115 | msg = "\n The value '{}' of type '{}' in the search space dimension '{}' must be number, string or function \n".format( |
|
| 116 | dim_value, type(dim_value), dim_key |
|
| 117 | ) |
|
| 118 | raise ValueError(msg) |
|
| 119 | ||
| 120 | def check_non_num_values(self): |
|
| 121 | for dim_key in self.dim_keys: |
|
| 122 | dim_values = np.array(list(self.search_space[dim_key])) |
|
| 123 | ||
| 124 | try: |
|
| 125 | np.subtract(dim_values, dim_values) |
|
| 126 | np.array(dim_values).searchsorted(dim_values) |
|
| 127 | except: |
|
| 128 | self._string_or_object(dim_key, dim_values) |
|
| 129 | else: |
|
| 130 | if dim_values.ndim != 1: |
|
| 131 | msg = "Array-like object in '{}' must be one dimensional".format( |
|
| 132 | dim_key |
|
| 133 | ) |
|
| 134 | raise ValueError(msg) |
|
| 135 | ||
| @@ 22-134 (lines=113) @@ | ||
| 19 | return self.search_space.values() |
|
| 20 | ||
| 21 | ||
| 22 | class SearchSpace(DictClass): |
|
| 23 | def __init__(self, search_space): |
|
| 24 | super().__init__(search_space) |
|
| 25 | self.search_space = search_space |
|
| 26 | ||
| 27 | self.dim_keys = list(search_space.keys()) |
|
| 28 | self.values_l = list(self.search_space.values()) |
|
| 29 | ||
| 30 | positions = {} |
|
| 31 | for key in search_space.keys(): |
|
| 32 | positions[key] = np.array(range(len(search_space[key]))) |
|
| 33 | self.positions = positions |
|
| 34 | ||
| 35 | self.check_list() |
|
| 36 | self.check_non_num_values() |
|
| 37 | ||
| 38 | self.data_types = self.dim_types() |
|
| 39 | self.func2str = self._create_num_str_ss() |
|
| 40 | ||
| 41 | def __call__(self): |
|
| 42 | return self.search_space |
|
| 43 | ||
| 44 | def dim_types(self): |
|
| 45 | data_types = {} |
|
| 46 | for dim_key in self.dim_keys: |
|
| 47 | dim_values = np.array(list(self.search_space[dim_key])) |
|
| 48 | try: |
|
| 49 | np.subtract(dim_values, dim_values) |
|
| 50 | np.array(dim_values).searchsorted(dim_values) |
|
| 51 | except: |
|
| 52 | _type_ = "object" |
|
| 53 | else: |
|
| 54 | _type_ = "number" |
|
| 55 | ||
| 56 | data_types[dim_key] = _type_ |
|
| 57 | return data_types |
|
| 58 | ||
| 59 | def _create_num_str_ss(self): |
|
| 60 | func2str = {} |
|
| 61 | for dim_key in self.dim_keys: |
|
| 62 | if self.data_types[dim_key] == "number": |
|
| 63 | func2str[dim_key] = self.search_space[dim_key] |
|
| 64 | else: |
|
| 65 | func2str[dim_key] = [] |
|
| 66 | ||
| 67 | dim_values = self.search_space[dim_key] |
|
| 68 | for value in dim_values: |
|
| 69 | try: |
|
| 70 | func_name = value.__name__ |
|
| 71 | except: |
|
| 72 | func_name = value |
|
| 73 | ||
| 74 | func2str[dim_key].append(func_name) |
|
| 75 | return func2str |
|
| 76 | ||
| 77 | def check_list(self): |
|
| 78 | for dim_key in self.dim_keys: |
|
| 79 | search_dim = self.search_space[dim_key] |
|
| 80 | ||
| 81 | err_msg = "\n Value in '{}' of search space dictionary must be of type list \n".format( |
|
| 82 | dim_key |
|
| 83 | ) |
|
| 84 | if not isinstance(search_dim, list): |
|
| 85 | raise ValueError(err_msg) |
|
| 86 | ||
| 87 | @staticmethod |
|
| 88 | def is_function(value): |
|
| 89 | try: |
|
| 90 | value.__name__ |
|
| 91 | except: |
|
| 92 | return False |
|
| 93 | else: |
|
| 94 | return True |
|
| 95 | ||
| 96 | @staticmethod |
|
| 97 | def is_number(value): |
|
| 98 | try: |
|
| 99 | float(value) |
|
| 100 | value * 0.1 |
|
| 101 | value - 0.1 |
|
| 102 | value / 0.1 |
|
| 103 | except: |
|
| 104 | return False |
|
| 105 | else: |
|
| 106 | return True |
|
| 107 | ||
| 108 | def _string_or_object(self, dim_key, dim_values): |
|
| 109 | for dim_value in dim_values: |
|
| 110 | is_str = isinstance(dim_value, str) |
|
| 111 | is_func = self.is_function(dim_value) |
|
| 112 | is_number = self.is_number(dim_value) |
|
| 113 | ||
| 114 | if not is_str and not is_func and not is_number: |
|
| 115 | msg = "\n The value '{}' of type '{}' in the search space dimension '{}' must be number, string or function \n".format( |
|
| 116 | dim_value, type(dim_value), dim_key |
|
| 117 | ) |
|
| 118 | raise ValueError(msg) |
|
| 119 | ||
| 120 | def check_non_num_values(self): |
|
| 121 | for dim_key in self.dim_keys: |
|
| 122 | dim_values = np.array(list(self.search_space[dim_key])) |
|
| 123 | ||
| 124 | try: |
|
| 125 | np.subtract(dim_values, dim_values) |
|
| 126 | np.array(dim_values).searchsorted(dim_values) |
|
| 127 | except: |
|
| 128 | self._string_or_object(dim_key, dim_values) |
|
| 129 | else: |
|
| 130 | if dim_values.ndim != 1: |
|
| 131 | msg = "Array-like object in '{}' must be one dimensional".format( |
|
| 132 | dim_key |
|
| 133 | ) |
|
| 134 | raise ValueError(msg) |
|
| 135 | ||