Source code for pytwinnet.optimization.objective


from __future__ import annotations
from abc import ABC, abstractmethod
from ..core.digital_twin import DigitalTwin
from ..physics.link_budget import rx_power_dbm, noise_power_dbm, sinr_db, shannon_throughput_bps
from ..physics.propagation import PropagationModel
from ..physics.environment import Environment

[docs] class Objective(ABC):
[docs] @abstractmethod def evaluate(self, twin: DigitalTwin) -> float: ...
[docs] class MaximizeThroughput(Objective):
[docs] def evaluate(self, twin: DigitalTwin) -> float: total = 0.0 for node in twin.network: total += float(node.metadata.get("received_traffic_mbps", 0.0)) return total
[docs] class MinimizePowerConsumption(Objective):
[docs] def evaluate(self, twin: DigitalTwin) -> float: total_power = 0.0 for node in twin.network: total_power += float(node.transceiver_properties.transmit_power_dbm) return -total_power
[docs] class SumThroughputObjective(Objective): def __init__(self, tx_id: str, efficiency: float = 1.0): self.tx_id = tx_id self.efficiency = efficiency
[docs] def evaluate(self, twin: DigitalTwin) -> float: if twin.propagation_model is None or twin.environment is None: return 0.0 tx = twin.network.get_node_by_id(self.tx_id) if tx is None: return 0.0 pm: PropagationModel = twin.propagation_model env: Environment = twin.environment total = 0.0 for rx in twin.network: if rx.node_id == self.tx_id: continue pl_db = pm.calculate_path_loss(tx, rx, env) txp = tx.transceiver_properties.transmit_power_dbm gt = tx.transceiver_properties.antenna_gain_dbi gr = rx.transceiver_properties.antenna_gain_dbi prx_dbm = rx_power_dbm(txp, gt, gr, pl_db) bw = float(rx.transceiver_properties.additional.get("bandwidth_hz", 20e6)) nf = float(rx.transceiver_properties.additional.get("noise_figure_db", 7.0)) n_dbm = noise_power_dbm(290.0, bw, nf) snr_db_val = sinr_db(prx_dbm, interferers_dbm=None, noise_dbm=n_dbm) thr = shannon_throughput_bps(bw, snr_db_val, efficiency=self.efficiency) total += thr return total