arnaucube
arnaucube/sonobe-playgroundPublic Self-hosted repository
sonobe-playground/analysis.py
analysis.pyRaw
 1import json
 2
 3
 4# Function to convert time units to seconds
 5def convert_to_seconds(time_str):
 6    if time_str.endswith('µs'):
 7        return float(time_str[:-2]) * 1e-6
 8    elif time_str.endswith('ms'):
 9        return float(time_str[:-2]) * 1e-3
10    elif time_str.endswith('s'):
11        return float(time_str[:-1])
12    return 0
13
14
15def report(operation, time):
16    return f"{operation}: {time:.6f} seconds"
17
18
19scenarios = {}
20free_logs = []
21
22
23def process_logline(log):
24    fields = log.get("fields", {})
25    span = log.get("span", {})
26    scenario_name = None
27    time_seconds = convert_to_seconds(fields["time.busy"])
28
29    # A folding scheme scenario is one of our ancestors
30    for s in log.get("spans", []):
31        if s.get("name") == "scenario":
32            scenario_name = s.get("folding_scheme")
33
34    # Top level span
35    if not scenario_name:
36        folding_scheme = span.get("folding_scheme")
37        if folding_scheme is not None:
38            free_logs.append(report(f"{folding_scheme} total time", time_seconds))
39        else:
40            free_logs.append(report(span["name"], time_seconds))
41        return
42
43    # Within a folding scheme scenario
44    if scenario_name not in scenarios:
45        scenarios[scenario_name] = {
46            "Prepare folding": 0,
47            "Transform input": 0,
48            "Folding verification": 0,
49            "Proving": [],
50            "Input prep": [],
51        }
52
53    span_name = span.get("name")
54    if span_name == "Proving":
55        scenarios[scenario_name]["Proving"].append(time_seconds)
56    elif span_name == "Input prep":
57        scenarios[scenario_name]["Input prep"].append(time_seconds)
58    else:
59        scenarios[scenario_name][span_name] = time_seconds
60
61
62def process_logs(file_path):
63    with open(file_path, 'r') as f:
64        for line in f:
65            process_logline(json.loads(line))
66
67
68def print_results():
69    for log in free_logs:
70        print(log)
71    print()
72
73    for scenario_name, data in scenarios.items():
74        print("-" * 80)
75        print(f"Scenario: {scenario_name}")
76        print(report("  Prepare folding", data["Prepare folding"]))
77        print(report("  Transform input", data["Transform input"]))
78        print(report("  Folding verification", data["Folding verification"]))
79
80        print(f"  Folding Steps:")
81        input_trans = data["Input prep"]
82        print(report("    Input prep: Average", sum(input_trans) / len(input_trans)))
83        print(report("    Input prep: Min", min(input_trans)))
84        print(report("    Input prep: Max", max(input_trans)))
85        proving_steps = data["Proving"]
86        print(report("    Proving:              Average", sum(proving_steps) / len(proving_steps)))
87        print(report("    Proving:              Min", min(proving_steps)))
88        print(report("    Proving:              Max", max(proving_steps)))
89
90
91process_logs('out.log')
92print_results()