Source code for spistats.collision
"""This module defines an interface to the probability law of the number of collisions per packet sent in a sequential pseudonyms scheme."""
import math
import numpy as np
[docs]
class Collision:
"""Probabaility law of the number of collisions in function of various network parameters.
"""
[docs]
def __init__(self,nbr_dev,nbr_adr,adr_per_dev):
"""
:param nbr_dev: Number of devices in the network.
:type nbr_dev: int
:param nbr_adr: Number of addresses to chose from. For instance an 8 bit scheme has 2**8 addresses.
:type nbr_adr: int
:param adr_per_dev: Number of pseudonymes maintained by each device.
:type adr_per_dev: int
"""
self.M = nbr_dev
self.p = 1/nbr_adr
self.q = 1-(1-self.p)**adr_per_dev
mass = []
for i in range(0,self.M-1):
mass += [math.comb(nbr_dev-1,i)*self.q**i*(1-self.q)**(self.M-1-i)]
self.mas = np.array(mass)
self.cd = np.cumsum(mass)
[docs]
def mean(self):
"""Expectation of the number of collisions for each packet sent.
:return: E(number of collisions)
:rtype: int
"""
return 1+(self.M-1)*self.q
[docs]
def mass(self, n):
"""Mass function of the number of collisions for each packet sent evaluated at n.
In other words: P(number of collision = n).
:param n: Number of collisions.
:type n: int
:return: P(number of collision = n)
:rtype: float in [0,1]
"""
if n==0:
return 0
elif n<=self.M:
return self.mas[n-1]
else:
return 0
[docs]
def cdf(self, n):
"""Cumulativ distribution function of the number of collision evaluated at n.
In other words: P(number of collision <= n):
:param n: Number of collisions.
:type n: int
:return: P(number of collision <= n)
:rtype: float in [0,1]
"""
if n==0:
return 0
elif n<=self.M:
return self.cd[n-1]
else:
return 1
[docs]
def cdfinv(self, p):
"""Inverse function of the cdf.
This function return n such that P(number of collision <= n) = p
:param p: Probability that the number of collisions is lesser or equal than n.
:type p: float in [0,1]
:return: n such that P(number of collision <= n) = p.
:rtype: int
"""
n = 1+np.argwhere(self.cd>=p)[0][0]
return n