Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
D
differentiable_throughput_model
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Lukas Eller
differentiable_throughput_model
Commits
47cd3d79
Commit
47cd3d79
authored
Nov 10, 2023
by
Lukas Eller
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Upload New File
parent
d0dfb103
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
92 additions
and
0 deletions
+92
-0
throughput_model.py
throughput_model.py
+92
-0
No files found.
throughput_model.py
0 → 100644
View file @
47cd3d79
import
numpy
as
np
import
tensorflow
as
tf
from
helpers
import
mappings
from
helpers.utils
import
logsumexp10
class
ThroughputModel
():
def
__init__
(
self
,
resource_blocks
=
100
,
resource_block_bw
=
180e3
,
noise_level
=-
120.0
,
demand
=
"medium"
):
self
.
_noise_level
=
noise_level
self
.
_resource_blocks
=
resource_blocks
self
.
_resource_block_bw
=
resource_block_bw
self
.
_act_ues_mapping
=
mappings
.
Active_UEs_from_Connected
(
demand
=
demand
)
self
.
_cell_load_mapping
=
mappings
.
Cell_Load_from_Active_UEs
()
self
.
_cqi_mapping
=
mappings
.
CQI_from_SINR
()
self
.
_spectral_efficiency_mapping
=
mappings
.
Spectral_Efficiency_from_CQI
()
@
tf
.
function
def
get_cell_assignment
(
self
,
R_matrix
,
softmax_temperature
=
3
):
R_sorted
=
tf
.
cast
(
tf
.
sort
(
R_matrix
,
axis
=
1
),
tf
.
float32
)
R_max
=
R_sorted
[:,
-
1
]
delta_R
=
tf
.
reshape
(
R_max
,
(
-
1
,
1
))
-
R_matrix
soft_assignment
=
tf
.
math
.
softmax
(
-
delta_R
/
softmax_temperature
)
return
soft_assignment
@
tf
.
function
def
get_act_ues
(
self
,
number_ues_soft
):
return
self
.
_act_ues_mapping
.
map
(
number_ues_soft
)
@
tf
.
function
def
get_cell_load
(
self
,
number_ues_soft
):
return
self
.
_cell_load_mapping
.
map
(
number_ues_soft
)
@
tf
.
function
def
get_SINR_matrix
(
self
,
R_matrix
,
cell_load_vector
):
I_matrix
=
[]
for
j
in
range
(
R_matrix
.
shape
[
1
]):
indices
=
list
(
range
(
R_matrix
.
shape
[
1
]))
indices
.
remove
(
j
)
relevant_interferers
=
tf
.
gather
(
R_matrix
,
indices
,
axis
=
1
)
relevant_cell_load
=
tf
.
gather
(
cell_load_vector
,
indices
)
noise_vector
=
tf
.
fill
((
relevant_interferers
.
shape
[
0
],
1
),
tf
.
cast
(
self
.
_noise_level
,
tf
.
float32
))
additive_terms
=
tf
.
concat
((
relevant_interferers
,
noise_vector
),
axis
=
1
)
scaling_factors
=
tf
.
concat
((
relevant_cell_load
,
tf
.
constant
([
1.
],
dtype
=
tf
.
float32
)),
axis
=
0
)
I_matrix
.
append
(
logsumexp10
(
additive_terms
,
alpha
=
scaling_factors
)
)
SINR_matrix
=
R_matrix
-
tf
.
cast
(
tf
.
stack
(
I_matrix
,
axis
=
1
),
tf
.
float32
)
return
SINR_matrix
@
tf
.
function
def
get_achievable_throughput
(
self
,
SINR_matrix
):
cqi_matrix
=
self
.
_cqi_mapping
.
map
(
tf
.
reshape
(
SINR_matrix
,
(
-
1
,)))
achievable_throughput_matrix
=
tf
.
cast
(
self
.
_resource_block_bw
*
self
.
_spectral_efficiency_mapping
.
map
(
cqi_matrix
),
tf
.
float32
)
achievable_throughput_matrix
=
tf
.
reshape
(
achievable_throughput_matrix
,
SINR_matrix
.
shape
)
return
achievable_throughput_matrix
@
tf
.
function
def
__call__
(
self
,
R_matrix
,
extended
=
False
):
soft_assignment_matrix
=
self
.
get_cell_assignment
(
R_matrix
)
connected_UEs_vector
=
tf
.
reduce_sum
(
soft_assignment_matrix
,
axis
=
0
)
#Compute the number of active UEs and the cell load
active_UEs_vector
=
self
.
get_act_ues
(
connected_UEs_vector
)
cell_load_vector
=
self
.
get_cell_load
(
active_UEs_vector
)
#Compute the SINR and subsequently the RATE
SINR_matrix
=
self
.
get_SINR_matrix
(
R_matrix
,
cell_load_vector
)
achievable_throughput_matrix
=
self
.
get_achievable_throughput
(
SINR_matrix
)
load_aware_throughput_vector
=
tf
.
reduce_sum
(
(
self
.
_resource_blocks
/
(
active_UEs_vector
+
1.0
))
*
soft_assignment_matrix
*
achievable_throughput_matrix
,
axis
=
1
)
#Compute the SINR and the theoretical empty cell rate per UE
SINR_vector
=
tf
.
reduce_sum
(
soft_assignment_matrix
*
SINR_matrix
,
axis
=
1
)
load_unaware_throughput_vector
=
tf
.
reduce_sum
(
(
self
.
_resource_blocks
/
(
1
+
self
.
get_act_ues
(
R_matrix
.
shape
[
0
]
/
R_matrix
.
shape
[
1
]))
)
*
soft_assignment_matrix
*
achievable_throughput_matrix
,
axis
=
1
)
if
extended
:
return
load_aware_throughput_vector
,
load_unaware_throughput_vector
,
SINR_vector
,
connected_UEs_vector
else
:
return
load_aware_throughput_vector
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment