Source code for slotted_aloha_simulator.parallel
from joblib import Parallel, delayed
from slotted_aloha_simulator.slotted_aloha_simulator import Aloha
[docs]
def compute(parameters, computations=None):
"""
Simple wrapper for launching a single simulation
Parameters
----------
parameters: :class:`dict`
Parameters for the aloha simulation
computations: :class:`list` of :class:`str`, optional
Name of computing methods to call.
Returns
-------
:class:`dict`
The input parameters (for traceability) plus a 'results' key that contain the simulation measurements.
"""
aloha = Aloha(**parameters)
if computations is None:
aloha()
else:
for comp in computations:
getattr(aloha, comp)()
return {'results': aloha.res_, **parameters}
[docs]
def parallel_compute(parameters_list, computations=None, n_jobs=-1):
"""
Parameters
----------
parameters_list: :class:`list` of :class:`dict`
Simulation parameters.
computations: :class:`list` of :class:`str`, optional
Name of computing methods to call.
n_jobs: :class:`int`, default=-1
Number of workers to spawn, joblib style (-1 means all CPUs).
Returns
-------
:class:`list` of :class:`dict`
For each setting, input parameters with an extra 'results' key.
Examples
--------
>>> p_values = [1/8, 1/4, 1/2, 2/3]
>>> p_list = [{'p0': p, 'n': 4, 't_sim': 10, 'seed': 42} for p in p_values]
>>> data = parallel_compute(p_list, n_jobs=len(p_values))
>>> for dat in data:
... print(round(dat['p0'], 4))
... mf = dat['results']['mf']
... print([mf[k][3].round(4) for k in ['occupancy', 'goodput', 'efficiency']])
... sim = dat['results']['simulation']
... print([sim[k][3].round(4) for k in ['occupancy', 'goodput', 'efficiency']])
0.125
[0.3642, 0.3049, 0.712]
[0.3632, 0.3039, 0.7118]
0.25
[0.5215, 0.3873, 0.5753]
[0.5176, 0.3804, 0.5627]
0.5
[0.6501, 0.4202, 0.4549]
[0.6466, 0.423, 0.4637]
0.6667
[0.6929, 0.4217, 0.4125]
[0.702, 0.4377, 0.4302]
"""
return Parallel(n_jobs=n_jobs)(delayed(compute)(p, computations) for p in parameters_list)