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.Block

Outer-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 PHYAbstraction

  • num_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_init values. 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, precision is used.

  • device (str | None) – Device for computation. If None, device is 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_last and offset.

Parameters:
  • sinr_eff_init (float) – Initial effective SINR value (linear scale).

  • sinr_eff_init_fill (float) – Fill value for N/A SINR entries (linear scale).

Attributes

property offset: torch.Tensor#

Effective SINR [dB] offset for each user (read-only).

property offset_max: float#

Get/set the maximum offset value.

property offset_min: float#

Get/set the minimum offset value.

property bler_target: float#

Get/set the BLER target for each user.

property sinr_eff_db_last: torch.Tensor#

Get/set the last observed effective SINR [dB] value for each user.

property delta_down: float#

Decrement applied to the SINR offset when an ACK is received (read-only).

Computed as delta_up * bler_target / (1 - bler_target).

property delta_up: float#

Get/set the increment applied to the SINR offset when a NACK is received.