research/rln-delay-simulations/message_hops.py

54 lines
1.8 KiB
Python

from math import ceil
from numpy import log
from numpy import ceil
import matplotlib.pyplot as plt
import numpy as np
import scienceplots
L = 1 # latency in ms (msg prop + rln proof verif, etc)
N1 = 1000 # number of nodes in the network (1)
N2 = 10000 # number of nodes in the network (2)
N3 = 100000 # number of nodes in the network (3)
def delay_last_hop(n, d, l):
# multiply by l for latencies
numerator = log(((n - 1) * (d - 2) / d) + 1)
denominator = log(d - 1)
return ceil(numerator / denominator)
ds = np.arange(3,15)
ls = np.ones(len(ds))*L
# astype(int) is ok since ceil() returns integers
delays_1 = delay_last_hop(np.ones(len(ds))*N1, ds, ls).astype(int)
delays_2 = delay_last_hop(np.ones(len(ds))*N2, ds, ls).astype(int)
delays_3 = delay_last_hop(np.ones(len(ds))*N3, ds, ls).astype(int)
with plt.style.context(['science', 'ieee']):
fig, ax1 = plt.subplots()
ax2 = ax1.twinx()
ax1.plot(ds, delays_1, color='r', label=str(N1)+" nodes")
ax1.plot(ds, delays_2, color='g', label=str(N2)+" nodes")
ax1.plot(ds, delays_3, color='b', label=str(N3)+" nodes")
ax2.plot(ds, ds, color='y', label="Bandwidth\namplification")
ax1.autoscale(tight=True)
ax2.autoscale(tight=True)
ax1.legend(loc=(0.08, 0.7))
ax2.legend(loc=(0.5, 0.76))
ax1.set(title='$h_{max}$ and bandwidth amplification depending on node degree $D$\n')
ax1.set(**dict(xlabel='Node degree (D)', ylabel='Maximum number of hops ($h_{max}$)\n'))
ax2.set(**dict(ylabel='\nBandwidth amplification'))
# Set the limits of the x-axis and y-axis
ax1.set_xlim(3, 14)
ax1.set_ylim(3, ax1.get_ylim()[1]) # Ensure that the lower limit is 2
# Set the limits of the second y-axis to match the first y-axis
ax2.set_ylim(ax1.get_ylim())
fig.savefig('message_hops.svg', dpi=600)
plt.close()