|
|
from collections.abc import Iterable |
|
|
|
|
|
import numpy as np |
|
|
import torch |
|
|
|
|
|
|
|
|
def recursive_fix_for_json_export(my_dict: dict): |
|
|
|
|
|
|
|
|
keys = list(my_dict.keys()) |
|
|
for k in keys: |
|
|
if isinstance(k, (np.int64, np.int32, np.int8, np.uint8)): |
|
|
tmp = my_dict[k] |
|
|
del my_dict[k] |
|
|
my_dict[int(k)] = tmp |
|
|
del tmp |
|
|
k = int(k) |
|
|
|
|
|
if isinstance(my_dict[k], dict): |
|
|
recursive_fix_for_json_export(my_dict[k]) |
|
|
elif isinstance(my_dict[k], np.ndarray): |
|
|
assert my_dict[k].ndim == 1, 'only 1d arrays are supported' |
|
|
my_dict[k] = fix_types_iterable(my_dict[k], output_type=list) |
|
|
elif isinstance(my_dict[k], (np.bool_,)): |
|
|
my_dict[k] = bool(my_dict[k]) |
|
|
elif isinstance(my_dict[k], (np.int64, np.int32, np.int8, np.uint8)): |
|
|
my_dict[k] = int(my_dict[k]) |
|
|
elif isinstance(my_dict[k], (np.float32, np.float64, np.float16)): |
|
|
my_dict[k] = float(my_dict[k]) |
|
|
elif isinstance(my_dict[k], list): |
|
|
my_dict[k] = fix_types_iterable(my_dict[k], output_type=type(my_dict[k])) |
|
|
elif isinstance(my_dict[k], tuple): |
|
|
my_dict[k] = fix_types_iterable(my_dict[k], output_type=tuple) |
|
|
elif isinstance(my_dict[k], torch.device): |
|
|
my_dict[k] = str(my_dict[k]) |
|
|
else: |
|
|
pass |
|
|
|
|
|
|
|
|
def fix_types_iterable(iterable, output_type): |
|
|
|
|
|
out = [] |
|
|
for i in iterable: |
|
|
if type(i) in (np.int64, np.int32, np.int8, np.uint8): |
|
|
out.append(int(i)) |
|
|
elif isinstance(i, dict): |
|
|
recursive_fix_for_json_export(i) |
|
|
out.append(i) |
|
|
elif type(i) in (np.float32, np.float64, np.float16): |
|
|
out.append(float(i)) |
|
|
elif type(i) in (np.bool_,): |
|
|
out.append(bool(i)) |
|
|
elif isinstance(i, str): |
|
|
out.append(i) |
|
|
elif isinstance(i, Iterable): |
|
|
|
|
|
out.append(fix_types_iterable(i, type(i))) |
|
|
else: |
|
|
out.append(i) |
|
|
return output_type(out) |
|
|
|