logos-blockchain-specs/mixnet/v2/sim/bulk_run_cover.py
2024-05-27 15:05:09 +09:00

83 lines
2.7 KiB
Python

import argparse
from datetime import datetime
import pandas as pd
from matplotlib import pyplot as plt
from config import P2PConfig, Config
from simulation import Simulation
def bulk_run_cover():
parser = argparse.ArgumentParser(description="Run simulation",
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument("--config", type=str, required=True, help="Configuration file path")
args = parser.parse_args()
config = Config.load(args.config)
results = []
config.simulation.running_time = 30
config.mixnet.num_nodes = 1000
config.mixnet.num_mix_layers = 4
config.mixnet.payload_size = 320
config.mixnet.message_interval = 1
config.mixnet.real_message_prob = 0.01
config.mixnet.real_message_prob_weights = []
config.mixnet.max_message_prep_time = 0
config.mixnet.max_mix_delay = 0
config.p2p.type = P2PConfig.TYPE_GOSSIP
config.p2p.connection_density = 6
config.p2p.max_network_latency = 0.20
config.measurement.sim_time_per_second = 1
base = config.mixnet.real_message_prob * 2
for cover_message_prob in [base, base * 2, base * 3, base * 4, base * 5]:
config.mixnet.cover_message_prob = cover_message_prob
sim = Simulation(config)
sim.run()
egress, ingress = sim.p2p.measurement.bandwidth()
results.append({
"num_nodes": config.mixnet.num_nodes,
"num_mix_layers": config.mixnet.num_mix_layers,
"p2p_type": config.p2p.type,
"real_message_prob": config.mixnet.real_message_prob,
"cover_message_prob": cover_message_prob,
"egress_mean": egress.mean(),
"egress_max": egress.max(),
"ingress_mean": ingress.mean(),
"ingress_max": ingress.max(),
})
df = pd.DataFrame(results)
df.to_csv(f"{datetime.now().replace(microsecond=0).isoformat()}.csv", index=False)
draw_plot(df)
def load_and_plot():
# with skipping the header
df = pd.read_csv("2024-05-27T14:14:58.csv")
print(df)
draw_plot(df)
def draw_plot(df: pd.DataFrame):
plt.plot(df["cover_message_prob"], df["egress_mean"], label="Egress Mean", marker="o")
plt.plot(df["cover_message_prob"], df["egress_max"], label="Egress Max", marker="x")
plt.plot(df["cover_message_prob"], df["ingress_mean"], label="Ingress Mean", marker="v")
plt.plot(df["cover_message_prob"], df["ingress_max"], label="Ingress Max", marker="^")
plt.xlabel("Cover Emission Rate")
plt.ylabel("Bandwidth (KiB/s)")
plt.title("Bandwidth vs Cover Emission Rate")
plt.legend()
plt.grid(True)
plt.show()
if __name__ == "__main__":
bulk_run_cover()
# load_and_plot()