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()