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