mirror of
https://github.com/logos-blockchain/logos-blockchain-simulations.git
synced 2026-02-17 19:53:07 +00:00
wip: add mixnet-analysis
This commit is contained in:
parent
ed74e5fd18
commit
619c24cbb2
2
mixnet-analysis/.gitignore
vendored
Normal file
2
mixnet-analysis/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
.venv/
|
||||
*.csv
|
||||
42
mixnet-analysis/aggregate.py
Normal file
42
mixnet-analysis/aggregate.py
Normal file
@ -0,0 +1,42 @@
|
||||
import argparse
|
||||
import os
|
||||
|
||||
import pandas as pd
|
||||
|
||||
|
||||
def aggregate(path: str):
|
||||
dataframes = []
|
||||
for root, dirs, files in os.walk(path):
|
||||
# print(f"root: {root}, dirs: {dirs}, files: {files}")
|
||||
if "paramset.csv" in files:
|
||||
df = pd.read_csv(os.path.join(root, "paramset.csv"))
|
||||
|
||||
assert "data_msg_count_means.csv" in files
|
||||
mean_df = pd.read_csv(os.path.join(root, "data_msg_count_means.csv"))
|
||||
df["mean_data_msg_count"] = mean_df["mean"].values[0]
|
||||
|
||||
assert "latency_stats.csv" in files
|
||||
latency_df = pd.read_csv(os.path.join(root, "latency_stats.csv"))
|
||||
df["latency_min"] = latency_df["min"].values[0]
|
||||
df["latency_median"] = latency_df["median"].values[0]
|
||||
df["latency_mean"] = latency_df["mean"].values[0]
|
||||
df["latency_std"] = latency_df["std"].values[0]
|
||||
df["latency_max"] = latency_df["max"].values[0]
|
||||
|
||||
dataframes.append(df)
|
||||
print(f"Processed {root}")
|
||||
|
||||
if dataframes:
|
||||
df = pd.concat(dataframes).sort_values(by=["paramset", "queue_type"])
|
||||
outpath = os.path.join(path, "aggregated.csv")
|
||||
df.to_csv(outpath, index=False)
|
||||
print(f"Saved {outpath}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Aggregate the results of all paramsets of an experiment"
|
||||
)
|
||||
parser.add_argument("path", type=str, help="dir path")
|
||||
args = parser.parse_args()
|
||||
aggregate(args.path)
|
||||
59
mixnet-analysis/datamsgcount.py
Normal file
59
mixnet-analysis/datamsgcount.py
Normal file
@ -0,0 +1,59 @@
|
||||
import argparse
|
||||
import os
|
||||
|
||||
import pandas as pd
|
||||
|
||||
|
||||
def analyze(path: str) -> pd.DataFrame:
|
||||
medians = pd.read_csv(path).iloc[:, 1:].median(axis=1)
|
||||
return pd.DataFrame(
|
||||
{
|
||||
"min": medians.min(),
|
||||
"median": medians.median(),
|
||||
"mean": medians.mean(),
|
||||
"std": medians.std(),
|
||||
"max": medians.max(),
|
||||
},
|
||||
index=pd.Series([0]),
|
||||
)
|
||||
|
||||
|
||||
def save_means_stats(means: list, outpath: str):
|
||||
series = pd.Series(means)
|
||||
means_stat = pd.DataFrame(
|
||||
{"mean": series.mean(), "std": series.std()}, index=pd.Series([0])
|
||||
)
|
||||
means_stat.to_csv(outpath, index=False)
|
||||
print(f"Saved {outpath}")
|
||||
|
||||
|
||||
def analyze_all(path: str):
|
||||
means = []
|
||||
means_outpath = ""
|
||||
for root, dirs, files in os.walk(path):
|
||||
if os.path.basename(root).startswith("paramset_"):
|
||||
if len(means) > 0:
|
||||
assert means_outpath != ""
|
||||
save_means_stats(means, means_outpath)
|
||||
means = []
|
||||
means_outpath = os.path.join(root, "data_msg_count_means.csv")
|
||||
elif "data_msg_counts_stats.csv" in files:
|
||||
stats = pd.read_csv(os.path.join(root, "data_msg_counts_stats.csv"))
|
||||
means.append(stats["mean"].values[0])
|
||||
elif "data_msg_counts.csv" in files:
|
||||
stats = analyze(os.path.join(root, "data_msg_counts.csv"))
|
||||
means.append(stats["mean"].values[0])
|
||||
outpath = os.path.join(root, "data_msg_counts_stats.csv")
|
||||
stats.to_csv(outpath, index=False)
|
||||
print(f"Saved {outpath}")
|
||||
|
||||
if len(means) > 0:
|
||||
assert means_outpath != ""
|
||||
save_means_stats(means, means_outpath)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(description="Analyze message count data")
|
||||
parser.add_argument("path", type=str, help="dir path")
|
||||
args = parser.parse_args()
|
||||
analyze_all(args.path)
|
||||
46
mixnet-analysis/latency.py
Normal file
46
mixnet-analysis/latency.py
Normal file
@ -0,0 +1,46 @@
|
||||
import argparse
|
||||
import os
|
||||
|
||||
import pandas as pd
|
||||
|
||||
|
||||
def save_latency_stats(latencies: list, outpath: str):
|
||||
series = pd.Series(latencies)
|
||||
means_stat = pd.DataFrame(
|
||||
{
|
||||
"min": series.min(),
|
||||
"median": series.median(),
|
||||
"mean": series.mean(),
|
||||
"std": series.std(),
|
||||
"max": series.max(),
|
||||
},
|
||||
index=pd.Series([0]),
|
||||
)
|
||||
means_stat.to_csv(outpath, index=False)
|
||||
print(f"Saved {outpath}")
|
||||
|
||||
|
||||
def aggregate(path: str):
|
||||
latencies = []
|
||||
latencies_outpath = ""
|
||||
for root, dirs, files in os.walk(path):
|
||||
if os.path.basename(root).startswith("paramset_"):
|
||||
if len(latencies) > 0:
|
||||
assert latencies_outpath != ""
|
||||
save_latency_stats(latencies, latencies_outpath)
|
||||
latencies = []
|
||||
latencies_outpath = os.path.join(root, "latency_stats.csv")
|
||||
elif "latency.csv" in files:
|
||||
df = pd.read_csv(os.path.join(root, "latency.csv"))
|
||||
latencies.extend(df["latency"].to_list())
|
||||
|
||||
if len(latencies) > 0:
|
||||
assert latencies_outpath != ""
|
||||
save_latency_stats(latencies, latencies_outpath)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(description="Aggregate latencies")
|
||||
parser.add_argument("path", type=str, help="dir path")
|
||||
args = parser.parse_args()
|
||||
aggregate(args.path)
|
||||
7
mixnet-analysis/pyrightconfig.json
Normal file
7
mixnet-analysis/pyrightconfig.json
Normal file
@ -0,0 +1,7 @@
|
||||
{
|
||||
"venvPath": ".",
|
||||
"venv": ".venv",
|
||||
"typeCheckingMode": "basic",
|
||||
"reportMissingTypeStubs": "none",
|
||||
"ignore": ["reportMissingTypeStubs"]
|
||||
}
|
||||
1
mixnet-analysis/requirements.txt
Normal file
1
mixnet-analysis/requirements.txt
Normal file
@ -0,0 +1 @@
|
||||
pandas==2.2.2
|
||||
Loading…
x
Reference in New Issue
Block a user