Skip to content

Commit

Permalink
Modified ue_tracks as per PR Requirements
Browse files Browse the repository at this point in the history
  • Loading branch information
tanzim10 committed Sep 20, 2024
1 parent 42d8bc5 commit c0f8526
Show file tree
Hide file tree
Showing 2 changed files with 106 additions and 102 deletions.
106 changes: 105 additions & 1 deletion radp/digital_twin/mobility/ue_tracks.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,15 @@
# LICENSE file in the root directory of this source tree.

from enum import Enum
from typing import Dict, Generator, List
from typing import Dict, Generator, List, Any
import itertools

import numpy as np
import pandas as pd

from radp.digital_twin.mobility.mobility import gauss_markov
from radp.common import constants
from radp.digital_twin.utils.gis_tools import GISTools


class MobilityClass(Enum):
Expand Down Expand Up @@ -156,3 +160,103 @@ def generate(
def close(self):
for k in self.gauss_markov_models.keys():
self.gauss_markov_models[k].close()

def generate_as_lon_lat_points(
self,
rng_seed: int,
lon_x_dims: int,
lon_y_dims: int,
num_ticks: int,
num_batches: int,
num_UEs: int,
alpha: int,
variance: int,
min_lat: float,
max_lat: float,
min_lon: float,
max_lon: float,
mobility_class_distribution: Dict[MobilityClass, float],
mobility_class_velocities: Dict[MobilityClass, float],
mobility_class_velocity_variances: Dict[MobilityClass, float],
) -> pd.DataFrame:
"""
The mobility data generation method takes in all the parameters required to generate UE tracks
for a specified number of batches
The UETracksGenerator uses the Gauss-Markov Mobility Model to yields batch of tracks for UEs,
corresponding to `num_ticks` number of simulation ticks, and the number of UEs
the user wants to simulate.
Using the UETracksGenerator, the UE tracks are returned in form of a dataframe
The Dataframe is arranged as follows:
+------------+------------+-----------+------+
| mock_ue_id | lon | lat | tick |
+============+============+===========+======+
| 0 | 102.219377 | 33.674572 | 0 |
| 1 | 102.415954 | 33.855534 | 0 |
| 2 | 102.545935 | 33.878075 | 0 |
| 0 | 102.297766 | 33.575942 | 1 |
| 1 | 102.362725 | 33.916477 | 1 |
| 2 | 102.080675 | 33.832793 | 1 |
+------------+------------+-----------+------+
"""

ue_tracks_generator = UETracksGenerator(
rng=np.random.default_rng(rng_seed),
lon_x_dims=lon_x_dims,
lon_y_dims=lon_y_dims,
num_ticks=num_ticks,
num_UEs=num_UEs,
alpha=alpha,
variance=variance,
min_lat=min_lat,
max_lat=max_lat,
min_lon=min_lon,
max_lon=max_lon,
mobility_class_distribution=mobility_class_distribution,
mobility_class_velocities=mobility_class_velocities,
mobility_class_velocity_variances=mobility_class_velocity_variances,
)

for _num_batches, xy_batches in enumerate(ue_tracks_generator.generate()):
ue_tracks_dataframe_dict: Dict[Any, Any] = {}

# Extract the xy (lon, lat) points from each batch to use it in the mobility dataframe
# mock_ue_id, tick, lat, lon
mock_ue_id = []
ticks = []
lon: List[float] = []
lat: List[float] = []

tick = 0
for xy_batch in xy_batches:
lon_lat_pairs = GISTools.converting_xy_points_into_lonlat_pairs(
xy_points=xy_batch,
x_dim=lon_x_dims,
y_dim=lon_y_dims,
min_longitude=min_lon,
max_longitude=max_lon,
min_latitude=min_lat,
max_latitude=max_lat,
)

# Build list for each column/row for the UE Tracks dataframe
lon.extend(xy_points[0] for xy_points in lon_lat_pairs)
lat.extend(xy_points[1] for xy_points in lon_lat_pairs)
mock_ue_id.extend([i for i in range(num_UEs)])
ticks.extend(list(itertools.repeat(tick, num_UEs)))
tick += 1

# Build dict for each column/row for the UE Tracks dataframe
ue_tracks_dataframe_dict[constants.MOCK_UE_ID] = mock_ue_id
ue_tracks_dataframe_dict[constants.LONGITUDE] = lon
ue_tracks_dataframe_dict[constants.LATITUDE] = lat
ue_tracks_dataframe_dict[constants.TICK] = ticks

# Yield each batch as a dataframe
yield pd.DataFrame(ue_tracks_dataframe_dict)

num_batches -= 1
if num_batches == 0:
break
102 changes: 1 addition & 101 deletions services/ue_tracks_generation/ue_tracks_generation_driver.py
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,7 @@ def handle_ue_tracks_generation_job(self, job_data=None):
simulation_id = UETracksGenerationHelper.get_simulation_id(job_data)

current_batch = 1
for ue_tracks_generation_current_batch_df in self._mobility_data_generation(
for ue_tracks_generation_current_batch_df in UETracksGenerator.generate_as_lon_lat_points(
rng_seed=rng_seed,
lon_x_dims=lon_x_dims,
lon_y_dims=lon_y_dims,
Expand Down Expand Up @@ -243,103 +243,3 @@ def handle_ue_tracks_generation_job(self, job_data=None):

# Increment the batch number for the next batch
current_batch += 1

def _mobility_data_generation(
self,
rng_seed: int,
lon_x_dims: int,
lon_y_dims: int,
num_ticks: int,
num_batches: int,
num_UEs: int,
alpha: int,
variance: int,
min_lat: float,
max_lat: float,
min_lon: float,
max_lon: float,
mobility_class_distribution: Dict[MobilityClass, float],
mobility_class_velocities: Dict[MobilityClass, float],
mobility_class_velocity_variances: Dict[MobilityClass, float],
) -> pd.DataFrame:
"""
The mobility data generation method takes in all the parameters required to generate UE tracks
for a specified number of batches
The UETracksGenerator uses the Gauss-Markov Mobility Model to yields batch of tracks for UEs,
corresponding to `num_ticks` number of simulation ticks, and the number of UEs
the user wants to simulate.
Using the UETracksGenerator, the UE tracks are returned in form of a dataframe
The Dataframe is arranged as follows:
+------------+------------+-----------+------+
| mock_ue_id | lon | lat | tick |
+============+============+===========+======+
| 0 | 102.219377 | 33.674572 | 0 |
| 1 | 102.415954 | 33.855534 | 0 |
| 2 | 102.545935 | 33.878075 | 0 |
| 0 | 102.297766 | 33.575942 | 1 |
| 1 | 102.362725 | 33.916477 | 1 |
| 2 | 102.080675 | 33.832793 | 1 |
+------------+------------+-----------+------+
"""

ue_tracks_generator = UETracksGenerator(
rng=np.random.default_rng(rng_seed),
lon_x_dims=lon_x_dims,
lon_y_dims=lon_y_dims,
num_ticks=num_ticks,
num_UEs=num_UEs,
alpha=alpha,
variance=variance,
min_lat=min_lat,
max_lat=max_lat,
min_lon=min_lon,
max_lon=max_lon,
mobility_class_distribution=mobility_class_distribution,
mobility_class_velocities=mobility_class_velocities,
mobility_class_velocity_variances=mobility_class_velocity_variances,
)

for _num_batches, xy_batches in enumerate(ue_tracks_generator.generate()):
ue_tracks_dataframe_dict: Dict[Any, Any] = {}

# Extract the xy (lon, lat) points from each batch to use it in the mobility dataframe
# mock_ue_id, tick, lat, lon
mock_ue_id = []
ticks = []
lon: List[float] = []
lat: List[float] = []

tick = 0
for xy_batch in xy_batches:
lon_lat_pairs = GISTools.converting_xy_points_into_lonlat_pairs(
xy_points=xy_batch,
x_dim=lon_x_dims,
y_dim=lon_y_dims,
min_longitude=min_lon,
max_longitude=max_lon,
min_latitude=min_lat,
max_latitude=max_lat,
)

# Build list for each column/row for the UE Tracks dataframe
lon.extend(xy_points[0] for xy_points in lon_lat_pairs)
lat.extend(xy_points[1] for xy_points in lon_lat_pairs)
mock_ue_id.extend([i for i in range(num_UEs)])
ticks.extend(list(itertools.repeat(tick, num_UEs)))
tick += 1

# Build dict for each column/row for the UE Tracks dataframe
ue_tracks_dataframe_dict[constants.MOCK_UE_ID] = mock_ue_id
ue_tracks_dataframe_dict[constants.LONGITUDE] = lon
ue_tracks_dataframe_dict[constants.LATITUDE] = lat
ue_tracks_dataframe_dict[constants.TICK] = ticks

# Yield each batch as a dataframe
yield pd.DataFrame(ue_tracks_dataframe_dict)

num_batches -= 1
if num_batches == 0:
break

0 comments on commit c0f8526

Please sign in to comment.