From e2d9e35708ab1d87cf56726795771093a9379430 Mon Sep 17 00:00:00 2001 From: artistrea Date: Tue, 2 Sep 2025 11:05:21 -0300 Subject: [PATCH 1/2] update(station_factory): imt ue & bs antenna deduplication --- sharc/antenna/antenna_factory.py | 34 ++++++++++++++++++++++++++++++++ sharc/station_factory.py | 28 ++++++++++++++++---------- 2 files changed, 52 insertions(+), 10 deletions(-) diff --git a/sharc/antenna/antenna_factory.py b/sharc/antenna/antenna_factory.py index cf0ec2a3..d375f16e 100644 --- a/sharc/antenna/antenna_factory.py +++ b/sharc/antenna/antenna_factory.py @@ -1,6 +1,7 @@ """Antenna factory module for creating antenna instances based on parameters.""" from sharc.parameters.parameters_antenna import ParametersAntenna +from sharc.antenna.antenna import Antenna from sharc.antenna.antenna_mss_adjacent import AntennaMSSAdjacent from sharc.antenna.antenna_omni import AntennaOmni @@ -14,6 +15,7 @@ from sharc.antenna.antenna_s1528 import AntennaS1528, AntennaS1528Leo, AntennaS1528Taylor from sharc.antenna.antenna_beamforming_imt import AntennaBeamformingImt +import numpy as np class AntennaFactory(): """Factory class for creating antenna instances based on pattern parameters.""" @@ -61,3 +63,35 @@ def create_antenna( raise ValueError( f"Antenna factory does not support pattern { antenna_params.pattern}") + + @staticmethod + def create_n_antennas( + antenna_params: ParametersAntenna, + azimuth: np.ndarray | float, + elevation: np.ndarray | float, + n_stations: int, + ): + """ + Creates many antennas based on passed parameters. + If antenna does not require each object to have different state, + only a single antenna object will be created, and every position + in the array will point to it. + This is much more performant. + """ + antennas = np.empty((n_stations,), dtype=Antenna) + assert n_stations == len(azimuth) + assert n_stations == len(elevation) + + if antenna_params.pattern == "ARRAY": + for i in range(n_stations): + antennas[i] = AntennaFactory.create_antenna( + antenna_params, azimuth[i], elevation[i], + ) + else: + # some antennas don't need azimuth and elevation at all + # this makes it much faster + antennas[:] = AntennaFactory.create_antenna( + antenna_params, None, None, + ) + + return antennas diff --git a/sharc/station_factory.py b/sharc/station_factory.py index f5a392ea..9789f99d 100644 --- a/sharc/station_factory.py +++ b/sharc/station_factory.py @@ -155,11 +155,18 @@ def generate_imt_base_stations( num_bs, dtype=Antenna, ) - for i in range(num_bs): - imt_base_stations.antenna[i] = \ - AntennaFactory.create_antenna( - param.bs.antenna, imt_base_stations.azimuth[i], - imt_base_stations.elevation[i],) + # for i in range(num_bs): + # imt_base_stations.antenna[i] = \ + # AntennaFactory.create_antenna( + # param.bs.antenna, imt_base_stations.azimuth[i], + # imt_base_stations.elevation[i],) + + imt_base_stations.antenna = AntennaFactory.create_n_antennas( + param.bs.antenna, + imt_base_stations.azimuth, + imt_base_stations.elevation, + num_bs + ) # imt_base_stations.antenna = [AntennaOmni(0) for bs in range(num_bs)] imt_base_stations.bandwidth = param.bandwidth * np.ones(num_bs) @@ -458,11 +465,12 @@ def generate_imt_ue_outdoor( # TODO: this piece of code works only for uplink ue_param_ant.get_antenna_parameters() - for i in range(num_ue): - imt_ue.antenna[i] = AntennaFactory.create_antenna( - param.ue.antenna, imt_ue.azimuth[i], - imt_ue.elevation[i], - ) + imt_ue.antenna = AntennaFactory.create_n_antennas( + param.ue.antenna, + imt_ue.azimuth, + imt_ue.elevation, + num_ue, + ) # imt_ue.antenna = [AntennaOmni(0) for bs in range(num_ue)] imt_ue.bandwidth = param.bandwidth * np.ones(num_ue) From 1afde69e6323ff7338b29c1a184723be5eaca7eb Mon Sep 17 00:00:00 2001 From: artistrea Date: Wed, 3 Sep 2025 14:22:02 -0300 Subject: [PATCH 2/2] hotfix: antenna factory linting error --- sharc/antenna/antenna_factory.py | 1 + sharc/station_factory.py | 6 ------ 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/sharc/antenna/antenna_factory.py b/sharc/antenna/antenna_factory.py index d375f16e..051e1f33 100644 --- a/sharc/antenna/antenna_factory.py +++ b/sharc/antenna/antenna_factory.py @@ -17,6 +17,7 @@ import numpy as np + class AntennaFactory(): """Factory class for creating antenna instances based on pattern parameters.""" diff --git a/sharc/station_factory.py b/sharc/station_factory.py index 9789f99d..22c0bae1 100644 --- a/sharc/station_factory.py +++ b/sharc/station_factory.py @@ -155,12 +155,6 @@ def generate_imt_base_stations( num_bs, dtype=Antenna, ) - # for i in range(num_bs): - # imt_base_stations.antenna[i] = \ - # AntennaFactory.create_antenna( - # param.bs.antenna, imt_base_stations.azimuth[i], - # imt_base_stations.elevation[i],) - imt_base_stations.antenna = AntennaFactory.create_n_antennas( param.bs.antenna, imt_base_stations.azimuth,