def parse_new_log()

in pyhanabi/tools/parse_log.py [0:0]


def parse_new_log(filename, max_epoch):
    lines = open(filename, "r").readlines()
    times = []
    scores = []
    clone_scores = []
    perfects = []
    train_rate = []
    buffer_rate = []
    act_rate = []
    self_score = []
    aux = []
    aux1 = []
    aux2 = []
    xent_pred = []
    xent_v0 = []
    loss = []

    def get_val_from_line(l):
        a = float(l.split()[3][:-1])
        return a

    for i, l in enumerate(lines):
        if "Time spent =" in l:
            t = float(l.split()[-2])
            if len(times) == 0:
                times.append(t)
            else:
                times.append(times[-1] + t)
        if "Speed" in l:
            split = l.split()
            if "act" in l:
                train = float(split[2][:-1])
                act = float(split[4][:-1])
                buf = float(split[6][:-1])
            else:
                train = float(split[2][:-1])
                act = 0
                buf = float(split[4][:-1])
            train_rate.append(train)
            act_rate.append(act)
            buffer_rate.append(buf)
        if ("eval score:" in l or "eval_score:" in l) and "clone bot" not in l:
            split = l.split()
            score = float(split[4][:-1])
            scores.append(score)
        if "clone bot" in l:
            split = l.split()
            score = float(split[-1])
            clone_scores.append(float(score))
        if "eval score" in l:
            perfect = float(l.split()[6][:-1])
            perfects.append(perfect)
        if "eval: self," in l:
            score = float(l.split()[-3][:-1])
            self_score.append(score)
        if ":aux" in l and "avg" in l:
            aux.append(get_val_from_line(l))
        if ":aux1" in l and "avg" in l:
            aux1.append(get_val_from_line(l))
        if ":aux2" in l and "avg" in l:
            aux2.append(get_val_from_line(l))
        if ":xent_pred" in l and "avg" in l:
            a = float(l.split("avg:")[1].strip().split()[0][:-1])
            xent_pred.append(a)
        if ":xent_v0" in l and "avg" in l:
            a = float(l.split()[3][:-1])
            xent_v0.append(a)
        if ":loss" in l and "avg" in l:
            loss.append(get_val_from_line(l))

        if max_epoch > 0 and (len(scores) == max_epoch or len(xent_pred) == max_epoch):
            break

    if len(scores):
        epoch = len(scores)
    elif len(xent_pred):
        epoch = len(xent_pred)
    elif len(loss):
        epoch = len(loss)
    else:
        epoch = 0

    if len(act_rate):
        avg_act_rate = int(np.mean(act_rate[-10:]))
    else:
        avg_act_rate = 0
    if len(train_rate):
        avg_train_rate = int(np.mean(train_rate[-10:]))
    else:
        avg_train_rate = 0
    if len(buffer_rate):
        avg_buffer_rate = int(np.mean(buffer_rate[-10:]))
    else:
        avg_buffer_rate = 0
    times = [t / 60 / 60 for t in times]

    final_xent_pred = 0 if len(xent_pred) == 0 else np.mean(xent_pred[-10:])
    info = {
        "id": filename,
        "epoch": epoch,
        "act_rate": avg_act_rate,
        "train_rate": avg_train_rate,
        "buffer_rate": avg_buffer_rate,
        "final_score": np.mean(scores[-10:]),
        "scores": scores,
        "clone_scores": clone_scores,
        "final_perfect": np.mean(perfects[-10:]),
        "perfects": perfects,
        "aux": aux,
        "aux1": aux1,
        "aux2": aux2,
        "xent_pred": xent_pred,
        "xent_v0": xent_v0,
        "loss": loss,
        "final_xent_pred": final_xent_pred,
        "final_loss": np.mean(loss[-10:]),
        "times": times,
    }
    if len(self_score) > 0:
        info["selfplay"] = np.mean(self_score[-10:])

    return info