Achievability bound is based on the expectation over codewords. This package consists of two modules:
- cwd_sample is responsible for single codewords set processing
- fbl is responsible for parallel optimization of t-error event probailities
- parallel implements a shared memory-based parallelism. Note that passing large matrices in parallel pool is time-consuming. Shared memory is based on multiprocessing.Array. This method requires serialization and deserialization routines to be implemented. Serialization converts conmple-valued matrices to 1D numpy array with real and imaginary parts stored separately.
- simulation is responsible for multiple test runnning, saving, and postprocessing
See main.py for more details. To start the simulation, please specify a dictionary with system parameters that must include:
- Blocklength n
- The number of information bits k
- The number of active users Ka
- The number of antennas at the receiver L
- The SNR range specified by
snr_db_min
,snr_db_max
, andsnr_db_step
For the projection-based bound, the function to be optimizaed is a log-determinant of some parametric comination of matrices. One can use the following formula to obtain gradients with respect to parameters to be optimized:
In practice, the matrix inversion in the gradient evaluation procedure becomes a bottleneck of the optimization. As a result, we use a gradient-free methods (Nelder-Mead).
scipy
optimization routines are multithread and there is no way to control the number of threads from python. The best way is to run multiple parallel simulations (specify n_workers
parameter in the parallel.py
) and to disable scipy
multithreading:
export MKL_NUM_THREADS=1
export NUMEXPR_NUM_THREADS=1
export OMP_NUM_THREADS=1
[1] Kirill Andreev, Daria Ustinova, Alexey Frolov, Unsourced Random Access with the MIMO Receiver: Projection Decoding Analysis