SATA / src /sata /utils /etc_utils.py
zzysteve
Initial commit
5221c8c
Raw
History Blame Contribute Delete
2.8 kB
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 # dict_i
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
# compute instance size
import sys
def get_tensor_size(tensor):
return tensor.element_size() * tensor.numel()
# dataclass
def get_dataclass_size(dc):
total_size = sys.getsizeof(dc) # Basic size of the dataclass instance
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):
# Estimate the size of the Data object
# # Example data
# from torch_geometric.data import Data
# x = torch.randn(10, 3) # 10 nodes with 3 features each
# edge_index = torch.randint(0, 10, (2, 30)) # 30 edges
# data = Data(x=x, edge_index=edge_index)
# Basic object overhead
data_size = sys.getsizeof(data)
# Adding up sizes of all attributes stored as tensors
for key, item in data:
if torch.is_tensor(item):
data_size += get_tensor_size(item) # Add the size of each tensor
return data_size