import numpy as np import pandas as pd import time from collections import OrderedDict import argparse import os import re import pickle import subprocess def str2bool(v): if v.lower() in ('yes', 'true', 't', 'y', '1'): return True elif v.lower() in ('no', 'false', 'f', 'n', '0'): return False else: raise argparse.ArgumentTypeError('Boolean value expected.') class StopWatch(object): def __init__(self): self.timings = OrderedDict() self.starts = {} def start(self, name): self.starts[name] = time.time() def stop(self, name): if name not in self.timings: self.timings[name] = [] self.timings[name].append(time.time() - self.starts[name]) def get(self, name=None, reduce=np.sum): if name is not None: return reduce(self.timings[name]) else: ret = {} for k in self.timings: ret[k] = reduce(self.timings[k]) return ret def __repr__(self): return ', '.join(['%s: %f[s]' % (k, v) for k, v in self.get().items()]) def __str__(self): return ', '.join(['%s: %f[s]' % (k, v) for k, v in self.get().items()]) class ETA(object): def __init__(self, length): self.length = length self.start_time = time.time() self.current_idx = 0 self.current_time = time.time() def update(self, idx): self.current_idx = idx self.current_time = time.time() def get_elapsed_time(self): return self.current_time - self.start_time def get_item_time(self): return self.get_elapsed_time() / (self.current_idx + 1) def get_remaining_time(self): return self.get_item_time() * (self.length - self.current_idx + 1) def format_time(self, seconds): minutes, seconds = divmod(seconds, 60) hours, minutes = divmod(minutes, 60) hours = int(hours) minutes = int(minutes) return f'{hours:02d}:{minutes:02d}:{seconds:05.2f}' def get_elapsed_time_str(self): return self.format_time(self.get_elapsed_time()) def get_remaining_time_str(self): return self.format_time(self.get_remaining_time()) def git_hash(cwd=None): ret = subprocess.run(['git', 'describe', '--always'], cwd=cwd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) hash = ret.stdout if hash is not None and 'fatal' not in hash.decode(): return hash.decode().strip() else: return None