import collections def update_dict(orig_dict, new_dict): for key, val in new_dict.items(): if isinstance(val, collections.Mapping): tmp = update_dict(orig_dict.get(key, {}), val) orig_dict[key] = tmp else: orig_dict[key] = val return orig_dict class AverageMeter: """Computes and stores the average and current value""" def __init__(self, i=1, precision=3, names=None): self.meters = i self.precision = precision self.reset(self.meters) self.names = names if names is not None: assert self.meters == len(self.names) else: self.names = [""] * self.meters def reset(self, i): self.val = [0] * i self.avg = [0] * i self.sum = [0] * i self.count = [0] * i def update(self, val, n=1): if not isinstance(val, list): val = [val] if not isinstance(n, list): n = [n] * self.meters assert len(val) == self.meters and len(n) == self.meters for i in range(self.meters): self.count[i] += n[i] for i, v in enumerate(val): self.val[i] = v self.sum[i] += v * n[i] self.avg[i] = self.sum[i] / self.count[i] def __repr__(self): val = " ".join( [ "{} {:.{}f}".format(n, v, self.precision) for n, v in zip(self.names, self.val) ] ) avg = " ".join( [ "{} {:.{}f}".format(n, a, self.precision) for n, a in zip(self.names, self.avg) ] ) return "{} ({})".format(val, avg)