OuterLoopLinkAdaptation#
- class sionna.sys.OuterLoopLinkAdaptation(phy_abstraction: sionna.sys.phy_abstraction.PHYAbstraction, num_ut: int, bler_target: float = 0.1, delta_up: float = 1.0, batch_size: int | list | None = None, sinr_eff_init: float = 1.0, sinr_eff_init_fill: float = 1.0, offset_min: float = -20.0, offset_max: float = 20.0, precision: Literal['single', 'double'] | None = None, device: str | None = None)[source]#
Bases:
sionna.phy.block.BlockOuter-loop link adaptation (OLLA).
The modulation and coding scheme (MCS) index for a user is determined as the highest index whose corresponding transport block error rate (TBLER) remains below the specified
bler_target. The SINR value used for TBLER computation is given by the last effective SINR feedback, \(\text{SINR}_{\text{eff}}\) [dB], reduced by an offset value, \(\Delta_{\mathrm{offset}}\):\[\max \left\{ \text{MCS}: \ \text{TBLER}(\text{MCS}, \text{SINR}_{\text{eff}}-\Delta_{\text{offset}}) \le \text{BLER}_{\text{target}} \right\}\]The value of \(\Delta_{\text{offset}}\) is adjusted depending on the HARQ feedback [Pedersen05]:
\[\begin{split}\Delta_{\mathrm{offset}} = \left\{ \begin{array}{l} \Delta_{\mathrm{offset}} - \Delta_{\mathrm{down}} \quad \text{if HARQ=ACK} \\ \Delta_{\mathrm{offset}} + \Delta_{\mathrm{up}} \quad \text{if HARQ=NACK} \end{array} \right.\end{split}\]where the relationship between \(\Delta_{\mathrm{up}}\) and \(\Delta_{\mathrm{down}}\) is given by [Sampath97]:
\[\frac{\Delta_{\mathrm{up}}}{\Delta_{\mathrm{down}}} = \frac{1 - \mathrm{BLER}_{\mathrm{target}}}{\mathrm{BLER}_{\mathrm{target}}}.\]- Parameters:
phy_abstraction (sionna.sys.phy_abstraction.PHYAbstraction) – An instance of
PHYAbstractionnum_ut (int) – Number of user terminals
bler_target (float) – BLER target value, within 0 and 1. Defaults to 0.1.
delta_up (float) – Increment applied to the SINR offset [dB] when a NACK is received for a user. Defaults to 1.0.
batch_size (int | list | None) – Batch size or shape. It accounts for multiple users for which link adaptation is performed simultaneously. If None, the batch size is set to [].
sinr_eff_init (float) – Initial value of effective SINR for each user. Non-positive values are treated as missing and replaced by
sinr_eff_init_fill. If float, the same value is assigned to all users. Defaults to 1.0.sinr_eff_init_fill (float) – Value replacing non-positive
sinr_eff_initvalues. Defaults to 1.0.offset_min (float) – Minimum SINR [dB] offset value. Defaults to -20.0.
offset_max (float) – Maximum SINR [dB] offset value. Defaults to 20.0.
precision (Literal['single', 'double'] | None) – Precision used for internal calculations and outputs. If set to None,
precisionis used.device (str | None) – Device for computation. If None,
deviceis used.
- Inputs:
num_allocated_re – […, num_ut], torch.int32. Number of allocated resources in the upcoming slot, computed across OFDM symbols, subcarriers and streams, for each user.
harq_feedback – […, num_ut], -1 | 0 | 1. If 0 (1, resp.), then a NACK (ACK, resp.) is received. If -1, feedback is missing.
sinr_eff – […, num_ut], torch.float | None (default). Estimated effective SINR for each user. Non-positive values are treated as missing.
mcs_table_index – […, num_ut], torch.int32 | int (default: 1). MCS table index for each user. For further details, refer to the Note.
mcs_category – […, num_ut], torch.int32 | int (default: 0). MCS table category for each user. For further details, refer to the Note.
- Outputs:
mcs_index – […, num_ut]. Selected MCS index for each user.
Examples
import torch from sionna.sys import PHYAbstraction, OuterLoopLinkAdaptation num_ut = 4 bler_target = 0.1 # Initialize the PHY abstraction object phy_abs = PHYAbstraction() # Initialize the OLLA object olla = OuterLoopLinkAdaptation(phy_abs, num_ut=num_ut, bler_target=bler_target) # Number of allocated REs for each user num_allocated_re = torch.tensor([100, 200, 150, 50]) # HARQ feedback for each user (-1: N/A, 0: NACK, 1: ACK) harq_feedback = torch.tensor([1, 0, 1, -1]) # Effective SINR feedback for each user sinr_eff = torch.tensor([10.0, 5.0, 8.0, 0.0]) # Compute the MCS index for each user mcs_index = olla(num_allocated_re, harq_feedback, sinr_eff)
Methods
- reset(sinr_eff_init: float = 1.0, sinr_eff_init_fill: float = 0.1) None[source]#
Resets the values of
sinr_eff_db_lastandoffset.
Attributes
- property offset: torch.Tensor#
Effective SINR [dB] offset for each user (read-only).
- property sinr_eff_db_last: torch.Tensor#
Get/set the last observed effective SINR [dB] value for each user.