|
import random |
|
import os |
|
import math |
|
import time |
|
import numpy as np |
|
import pickle |
|
import torch |
|
import logging |
|
|
|
|
|
def get_logger(filename: str): |
|
"""Creates and returns a logger that logs to both the console and a file.""" |
|
logger = logging.getLogger(__name__) |
|
logger.setLevel(logging.INFO) |
|
|
|
|
|
stream_handler = logging.StreamHandler() |
|
stream_handler.setFormatter(logging.Formatter("%(message)s")) |
|
logger.addHandler(stream_handler) |
|
|
|
|
|
file_handler = logging.FileHandler(f"{filename}.log") |
|
file_handler.setFormatter(logging.Formatter("%(message)s")) |
|
logger.addHandler(file_handler) |
|
|
|
return logger |
|
|
|
|
|
def seed_everything(seed: int): |
|
"""Sets random seed for reproducibility across various libraries.""" |
|
random.seed(seed) |
|
os.environ["PYTHONHASHSEED"] = str(seed) |
|
np.random.seed(seed) |
|
torch.manual_seed(seed) |
|
torch.cuda.manual_seed(seed) |
|
torch.backends.cudnn.deterministic = True |
|
torch.backends.cudnn.benchmark = False |
|
|
|
|
|
class AverageMeter: |
|
"""Tracks and stores the average and current values.""" |
|
|
|
def __init__(self): |
|
self.reset() |
|
|
|
def reset(self): |
|
self.val = 0 |
|
self.avg = 0 |
|
self.sum = 0 |
|
self.count = 0 |
|
|
|
def update(self, val, n=1): |
|
self.val = val |
|
self.sum += val * n |
|
self.count += n |
|
self.avg = self.sum / self.count |
|
|
|
|
|
def as_minutes(s: int) -> str: |
|
"""Converts seconds to a string in minutes and seconds.""" |
|
m = math.floor(s / 60) |
|
s -= m * 60 |
|
return "%dm %ds" % (m, s) |
|
|
|
|
|
def timeSince(since: float, percent: float) -> str: |
|
now = time.time() |
|
s = now - since |
|
es = s / (percent) |
|
rs = es - s |
|
return "%s (remain %s)" % (as_minutes(s), as_minutes(rs)) |
|
|
|
|
|
def convert_all_1d(array: list) -> list: |
|
"""Converts 0-dimensional arrays in a list to 1-dimensional arrays.""" |
|
return [np.array([item]) if item.ndim == 0 else item for item in array] |
|
|
|
|
|
def save_pickle(path: str, contents): |
|
"""Saves contents to a pickle file.""" |
|
with open(path, "wb") as f: |
|
pickle.dump(contents, f) |
|
|
|
|
|
def load_pickle(path: str): |
|
"""Loads contents from a pickle file.""" |
|
with open(path, "rb") as f: |
|
return pickle.load(f) |
|
|