Source code for pytwinnet.physics.ris
from __future__ import annotations
from dataclasses import dataclass
from typing import Tuple
from ..core.node import WirelessNode
from .environment import Environment
from .propagation import PropagationModel
[docs]
@dataclass
class RISPanel:
position: Tuple[float, float, float]
gain_db: float = 10.0 # toy reflective gain
[docs]
class RISAugmentedModel(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
"""
def __init__(self, base: PropagationModel, ris: RISPanel, extra_loss_db: float = 3.0) -> None:
self.base = base
self.ris = ris
self.extra_loss_db = extra_loss_db
[docs]
def calculate_path_loss(self, tx: WirelessNode, rx: WirelessNode, environment: Environment) -> float:
direct = self.base.calculate_path_loss(tx, rx, environment)
tx2ris = WirelessNode("__tmp_tx2ris__", position=self.ris.position)
ris2rx = WirelessNode("__tmp_ris2rx__", position=self.ris.position)
pl1 = self.base.calculate_path_loss(tx, tx2ris, environment)
pl2 = self.base.calculate_path_loss(ris2rx, rx, environment)
via_ris = pl1 + pl2 - self.ris.gain_db + self.extra_loss_db
return min(direct, via_ris)