pytwinnet.physics

class pytwinnet.physics.Environment(dimensions_m=(100.0, 100.0, 30.0), obstacles=<factory>)[source]

Bases: object

Parameters:
dimensions_m: Tuple[float, float, float] = (100.0, 100.0, 30.0)
is_within_bounds(position)[source]
Return type:

bool

Parameters:

position (Tuple[float, float, float])

obstacles: List[object]
class pytwinnet.physics.FadedModel(base, kind='rayleigh', K_dB=6.0, seed=0, epoch=None)[source]

Bases: PropagationModel

Wraps a base model and adds small-scale fading (Rayleigh or Rician) as an extra dB term: PL_faded = PL + fading_loss_db where fading_loss_db = -10*log10(|h|^2). Fading is deterministic per (tx, rx, epoch). Change ‘epoch’ to re-sample.

Parameters:
K_dB: float = 6.0
base: PropagationModel
calculate_path_loss(tx, rx, environment)[source]
Return type:

float

Parameters:
epoch: Optional[int] = None
kind: str = 'rayleigh'
seed: int = 0
set_epoch(epoch)[source]
Return type:

None

Parameters:

epoch (int | None)

class pytwinnet.physics.FreeSpacePathLoss[source]

Bases: PropagationModel

calculate_path_loss(tx, rx, environment)[source]
Return type:

float

Parameters:
faded_shadowed_model(freq_ghz, tx_power_dbm, n=2.0, sigma=6.0)[source]

Log-distance with lognormal shadowing + Rayleigh fading; returns Rx power (dBm).

Return type:

float

Parameters:
class pytwinnet.physics.PropagationModel[source]

Bases: ABC

abstractmethod calculate_path_loss(tx, rx, environment)[source]
Return type:

float

Parameters:
class pytwinnet.physics.RISAugmentedModel(base, ris, extra_loss_db=3.0)[source]

Bases: PropagationModel

Wrap a base PropagationModel and return the min of: - direct path loss - two-hop path loss via RIS: PL(tx->RIS) + PL(RIS->rx) - RIS_gain + extra_loss

Parameters:
calculate_path_loss(tx, rx, environment)[source]
Return type:

float

Parameters:
class pytwinnet.physics.RISBeamModel(base, ris, extra_loss_db=3.0)[source]

Bases: PropagationModel

Wraps a base PropagationModel. For a configured target UE (by id), the RIS contributes mainlobe gain on the two-hop path; others see sidelobe gain. Effective path loss = min( direct, (tx->RIS + RIS->rx - gain + extra_loss_db) ).

Parameters:
calculate_path_loss(tx, rx, environment)[source]
Return type:

float

Parameters:
set_beam(rx_node_id)[source]

Point mainlobe toward rx_node_id (or None for no specific target).

Return type:

None

Parameters:

rx_node_id (str | None)

class pytwinnet.physics.RISPanel(position, gain_db=10.0)[source]

Bases: object

Parameters:
gain_db: float = 10.0
position: Tuple[float, float, float]
class pytwinnet.physics.ShadowedModel(base, sigma_db=6.0, seed=0, epoch=None)[source]

Bases: PropagationModel

Wraps a base propagation model and adds log-normal shadowing (Gaussian in dB). Shadowing is deterministic per (tx, rx, epoch) for reproducibility. Change ‘epoch’ (int) to refresh the samples (e.g., per-drop or per-time-slot).

Parameters:
base: PropagationModel
calculate_path_loss(tx, rx, environment)[source]
Return type:

float

Parameters:
epoch: Optional[int] = None
seed: int = 0
set_epoch(epoch)[source]
Return type:

None

Parameters:

epoch (int | None)

sigma_db: float = 6.0
class pytwinnet.physics.SmartRISPanel(position, element_count=64, mainlobe_gain_db=None, sidelobe_gain_db=None)[source]

Bases: object

Toy RIS with a steerable mainlobe. Approximates array gain:

mainlobe_gain_db ~= 20*log10(N) sidelobe_gain_db ~= mainlobe - 13 dB (typical)

Parameters:
element_count: int = 64
mainlobe_gain_db: Optional[float] = None
position: Tuple[float, float, float]
sidelobe_gain_db: Optional[float] = None
pytwinnet.physics.calculate_noise_power(bw_hz, noise_figure_db=7.0)[source]
Return type:

float

Parameters:
pytwinnet.physics.calculate_sinr_db(signal_dbm, interference_dbm_list, noise_dbm)[source]
Return type:

float

Parameters:
pytwinnet.physics.noise_power_dbm(temperature_k, bandwidth_hz, noise_figure_db=0.0)[source]
Return type:

float

Parameters:
pytwinnet.physics.rx_power_dbm(tx_power_dbm, tx_gain_dbi, rx_gain_dbi, path_loss_db)[source]
Return type:

float

Parameters:
pytwinnet.physics.shannon_capacity(sinr_db, bw_hz, efficiency=0.75)[source]
Return type:

float

Parameters:
pytwinnet.physics.shannon_throughput_bps(bandwidth_hz, sinr_db_value, efficiency=1.0)[source]
Return type:

float

Parameters:
pytwinnet.physics.sinr_db(signal_dbm, interferers_dbm=None, noise_dbm=-100.0)[source]
Return type:

float

Parameters:

Modules

batch

environment

fading

link_budget

propagation

ris

ris_beam

signal

Signal utilities for examples: noise power, SINR, Shannon capacity.