mappings.py 2.07 KB
Newer Older
 Lukas Eller's avatar
Lukas Eller committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
from abc import ABC
import tensorflow as tf
import numpy as np

class Mapping(ABC):
    @tf.function
    def map(x):
        pass

class Active_UEs_from_Connected(Mapping):
    def __init__(self, demand = "medium"):
        #Linear mapping from monitoring data with different scaling factors depending on demand
        if demand == "high":
            self.k = 0.032709253358325543
        elif demand == "medium":
            self.k =  0.018575757575757582
        elif demand == "low":
            self.k =  0.007832927210246799

    @tf.function
    def map(self, x):
        return tf.cast(self.k * x, tf.float32)

class Cell_Load_from_Active_UEs(Mapping):
    def __init__(self):
        #Exponential fit from monitoring data
        self._w_0 = 0.92972595
        self._w_1 = 2.25275329

    @tf.function
    def map(self, x):
        return tf.cast(self._w_0 * (1 - tf.exp(-(x) / self._w_1)), tf.float32)

class Spectral_Efficiency_from_CQI(Mapping):
    def __init__(self, T=1/10):
        #Temperature for the sigmoid function to control smoothness
        self._T = T

    @tf.function
    def map(self, x):
        efficiency = np.array(
            [0.1523, 0.377 , 0.877 , 1.4766, 1.9141, 2.4063, 2.7305, 3.3223, 3.9023, 4.5234, 5.1152, 5.5547, 6.2266, 6.9141, 7.4063]
        )

        mapping_soft = 0
        current_sum = 0
        for ankerpoint in range(1, 16):
            spec_eff = efficiency[ankerpoint-1]
            delta = spec_eff - current_sum
            mapping_soft += delta * (tf.math.sigmoid((x - ((ankerpoint-1) + 0.5))/self._T))

            current_sum += delta

        return tf.cast(mapping_soft, tf.float32)

class CQI_from_SINR(Mapping):
    def __init__(self):
        #Linear fit with softplus squasing from MDT data
        self._w_0 = 0.41238472
        self._w_1 = 7.73600132

        lambda x: 15 -  tf.math.softplus(
            -(tf.math.softplus(0.41238472 * x + 7.73600132) - 15)
        )

    @tf.function
    def map(self, x):
        return  tf.cast(15 -  tf.math.softplus(
            -(tf.math.softplus(self._w_0 * x + self._w_1) - 15)
        ), tf.float32)