| import numpy as np |
| import torch |
|
|
|
|
| def argmin_nd(a): |
| return np.unravel_index(np.argmin(a, axis=None), a.shape) |
|
|
|
|
| def argmax_nd(a): |
| return np.unravel_index(np.argmax(a, axis=None), a.shape) |
|
|
|
|
| def argsort_nd(x): |
| return np.unravel_index(np.argsort(x, axis=None), x.shape) |
|
|
|
|
| """ recursive dict """ |
|
|
|
|
| def is_valid_rec_keys(recursive_dict, keys): |
| if recursive_dict is None: |
| return False |
|
|
| dict_i = recursive_dict |
| for key in keys: |
| if key in dict_i.keys(): |
| dict_i = dict_i[key] |
| else: |
| return False |
| return True |
|
|
|
|
| def get_recursive_keys_value(recursive_dict, keys): |
| dict_i = recursive_dict |
| try: |
| for key in keys: |
| dict_i = dict_i[key] |
| except: |
| assert False, f"Error in get_recursive_keys_value: {keys}" |
| return dict_i |
|
|
|
|
| def add_rec_key_value(recursive_dict, keys, value): |
| dict_i = recursive_dict |
| for key in keys[:-1]: |
| if key not in dict_i.keys(): |
| dict_i[key] = dict() |
| dict_i = dict_i[key] |
| dict_i[keys[-1]] = value |
|
|
|
|
| def recursive_print_dict(data, indent=0): |
| for k, v in data.items(): |
| if torch.is_tensor(v): |
| print(" " * (indent), k, "\t", v.shape, "\t", v.device) |
| elif isinstance(v, np.ndarray): |
| print(" " * (indent), k, "\t", v.shape) |
| elif isinstance(v, dict): |
| print( |
| " " * indent, |
| k, |
| "\t", |
| ) |
| recursive_print_dict(v, indent + 1) |
| else: |
| print(" " * (indent), k, "\t", v) |
|
|
|
|
| def set_default_if_absent(dict_i, key, default_value): |
| if key not in dict_i: |
| dict_i[key] = default_value |
|
|
|
|
| |
| import sys |
|
|
|
|
| def get_tensor_size(tensor): |
| return tensor.element_size() * tensor.numel() |
|
|
|
|
| |
| def get_dataclass_size(dc): |
| total_size = sys.getsizeof(dc) |
| for field in dc.__dataclass_fields__.values(): |
| attr = getattr(dc, field.name) |
| if isinstance(attr, torch.Tensor): |
| total_size += get_tensor_size(attr) |
| else: |
| total_size += sys.getsizeof(attr) |
| return total_size |
|
|
|
|
| def get_torch_geometric_data_size(data): |
| |
| |
| |
| |
| |
| |
|
|
| |
| data_size = sys.getsizeof(data) |
| |
| for key, item in data: |
| if torch.is_tensor(item): |
| data_size += get_tensor_size(item) |
| return data_size |
|
|