arnaucube
arnaucube/sonobe-playgroundPublic Self-hosted repository
sonobe-playground/analysis.py
analysis.pyRaw
  1import json
  2import re
  3
  4import matplotlib.pyplot as plt
  5import numpy as np
  6
  7
  8# Function to convert time units to seconds
  9def convert_to_seconds(time_str):
 10    if time_str.endswith('µs'):
 11        return float(time_str[:-2]) * 1e-6
 12    elif time_str.endswith('ms'):
 13        return float(time_str[:-2]) * 1e-3
 14    elif time_str.endswith('s'):
 15        return float(time_str[:-1])
 16    return 0
 17
 18
 19def report(operation, time):
 20    return f"{operation}: {time:.6f} seconds"
 21
 22
 23scenarios = {}
 24free_logs = []
 25hypernova = [[None] * 7 for _ in range(7)]
 26
 27
 28def process_logline(log):
 29    fields = log.get("fields", {})
 30    span = log.get("span", {})
 31    scenario_name = None
 32    time_seconds = convert_to_seconds(fields["time.busy"])
 33
 34    # A folding scheme scenario is one of our ancestors
 35    for s in log.get("spans", []):
 36        if s.get("name") == "scenario":
 37            scenario_name = s.get("folding_scheme")
 38
 39    # Top level span
 40    if not scenario_name:
 41        folding_scheme = span.get("folding_scheme")
 42        if folding_scheme is not None:
 43            free_logs.append(report(f"{folding_scheme} total time", time_seconds))
 44
 45            hypernova_params = re.fullmatch(r"HyperNova<(\d),(\d)>", folding_scheme)
 46            if hypernova_params:
 47                hypernova[int(hypernova_params.groups()[0])][int(hypernova_params.groups()[1])] = time_seconds
 48        else:
 49            free_logs.append(report(span["name"], time_seconds))
 50        return
 51
 52    # Within a folding scheme scenario
 53    if scenario_name not in scenarios:
 54        scenarios[scenario_name] = {
 55            "Prepare folding": 0,
 56            "Transform input": 0,
 57            "Folding verification": 0,
 58            "Proving": [],
 59            "Input prep": [],
 60        }
 61
 62    span_name = span.get("name")
 63    if span_name == "Proving":
 64        scenarios[scenario_name]["Proving"].append(time_seconds)
 65    elif span_name == "Input prep":
 66        scenarios[scenario_name]["Input prep"].append(time_seconds)
 67    else:
 68        scenarios[scenario_name][span_name] = time_seconds
 69
 70
 71def process_logs(file_path):
 72    with open(file_path, 'r') as f:
 73        for line in f:
 74            process_logline(json.loads(line))
 75
 76
 77def print_results():
 78    for log in free_logs:
 79        print(log)
 80    print()
 81
 82    for scenario_name, data in scenarios.items():
 83        print("-" * 80)
 84        print(f"Scenario: {scenario_name}")
 85        print(report("  Prepare folding", data["Prepare folding"]))
 86        print(report("  Transform input", data["Transform input"]))
 87        print(report("  Folding verification", data["Folding verification"]))
 88
 89        print(f"  Folding Steps:")
 90        input_trans = data["Input prep"]
 91        print("    Input preparation")
 92        print(report("      Avg", sum(input_trans) / len(input_trans)))
 93        print(report("      Min", min(input_trans)))
 94        print(report("      Max", max(input_trans)))
 95        proving_steps = data["Proving"]
 96        print("    Proving")
 97        print(report("      Avg", sum(proving_steps) / len(proving_steps)))
 98        print(report("      Min", min(proving_steps)))
 99        print(report("      Max", max(proving_steps)))
100
101
102def draw_hn_plot():
103    data_np = np.array(hypernova, dtype=np.float64)
104    data_np = np.where(np.isnan(data_np), 0, data_np)  # Replace None with 0 for better visualization
105
106    cmap = plt.cm.viridis
107    cmap.set_under('white')  # Set background color for None
108
109    fig, ax = plt.subplots()
110    cax = ax.matshow(data_np, cmap=cmap, vmin=0.01)
111
112    fig.colorbar(cax)
113
114    for i in range(len(hypernova)):
115        for j in range(len(hypernova[i])):
116            if hypernova[i][j] is not None:
117                ax.text(j, i, f'{hypernova[i][j]:.2f}', va='center', ha='center', color='black')
118
119    # Set axis labels and title
120    ax.set_xlabel('ν (number of incoming CCCS instances)')
121    ax.set_ylabel('μ (number of running LCCCS instances)')
122
123    ax.set_xticks(np.arange(len(hypernova[0])))
124
125    ax.set_yticks(np.arange(len(hypernova)))
126    ax.set_xticklabels([f'{i}' for i in range(len(hypernova[0]))])
127    ax.set_yticklabels([f'{i}' for i in range(len(hypernova))])
128
129    plt.title("HyperNova multifold times")
130
131    # Show the plot
132    plt.show()
133
134
135process_logs('out.log')
136print_results()
137draw_hn_plot()