| import datetime | |
| import os | |
| import shutil | |
| def save_useful_info(dest_path) -> None: | |
| dst = os.path.join(dest_path, "code") | |
| if not os.path.exists(dst): | |
| shutil.copytree( | |
| os.getcwd(), dst, | |
| ) | |
| def flatten_dict(dd, separator="_", prefix=""): | |
| return ( | |
| { | |
| prefix + separator + k if prefix else k: v | |
| for kk, vv in dd.items() | |
| for k, v in flatten_dict(vv, separator, kk).items() | |
| } | |
| if isinstance(dd, dict) | |
| else {prefix: dd} | |
| ) | |
| def split_by_ratio(length, ratio): | |
| assert sum(ratio) == 1.0 | |
| se = [0, 0] | |
| split = [] | |
| for r in ratio: | |
| l = r * length | |
| s = int(se[-1]) | |
| e = int(se[-1] + l) | |
| se = [s, e] | |
| split.append(se) | |
| split[-1][-1] = length | |
| return split | |
| def percent_bar(ratio=1.0, width=30, empty=' ', done='#', parts=' -=>'): | |
| if ratio == 1.0: | |
| return done * width | |
| else: | |
| return ( | |
| (done * width)[:int((100 * ratio) // (100 / width))] + | |
| (parts)[int(len(parts) * (((100 * ratio) / (100 / width)) % 1.0))] + | |
| (empty * width)[:max(width - int((100 * ratio) // (100 / width)) - 1, 0)]) | |
| def progress(ei, ii, bi, train_err, iter_num, start_time): | |
| percent = (float(bi) + 1) / (iter_num) | |
| curr_time = datetime.datetime.now() | |
| eta_time = start_time + (1.0 / (percent + 1e-10)) * (curr_time - start_time) | |
| return ("| %5i | %6i | [%s] %6.2f%% | % 8.4f | %s |" % | |
| (ei, ii, percent_bar(percent), 100 * percent, train_err, str(eta_time)[11:19])) | |