def update(self): """ """ # update the RBs used by each ue self._update_ue_rb() # --- total_rb_demand = sum(self._rb_map.values()) # IDEAL CASE: we have more RBs than the UEs demand # == all UEs are satified with their demand if total_rb_demand < Antenna.BW_RB_MAP[self._cur_ch_bw]: self._grid.logger.log("op:antenna_good_cap, antenna:" + str(self) + ", rb_demand:" + str(total_rb_demand) + ", avail_rb:" + str(Antenna.BW_RB_MAP[self._cur_ch_bw]) + ", per_used:" + str(total_rb_demand/Antenna.BW_RB_MAP[self._cur_ch_bw]) + ", nconnected_ues:" + str(len(self.connected_ues)) ) # -- for ue in self.connected_ues: ue.tx_rate = ue.demand # NOT IDEAL CASE: we have less RBs than the UEs demand # == available RBs split evenly among UEs else: # quantity of RBs available avail_rb = Antenna.BW_RB_MAP[self._cur_ch_bw] # bivide equaly among all UEs rb_per_ue = math.floor(avail_rb/len(self.connected_ues)) # set UE tx_rate based for ue in self.connected_ues: ue.tx_rate = rb_per_ue * util.snr_to_bit(util.snr(ue, self) ) self._grid.logger.log("op:antenna_bad_cap, antenna:" + str(self) + ", rb_demand:" + str(total_rb_demand) + ", avail_rb:" + str(Antenna.BW_RB_MAP[self._cur_ch_bw]) + ", per_used:" + str(1.0) + ", nconnected_ues:" + str(len(self.connected_ues)) ) if len(self.connected_ues) != self.prev_n_ues: if self.prev_n_ues == 0: self._grid.logger.log("op:antenna_wake_up") elif len(self.connected_ues) == 0: self._grid.logger.log("op:antenna_idle") self.prev_n_ues = len(self.connected_ues) # Notify BBU that this antenna requires more bandwidth self._ch_bw_required = self.rb_demand_to_ch_bw(total_rb_demand) if self._ch_bw_required != self._cur_ch_bw: self._bbu.event(controller.ANTENNA_BW_UPDATE, self)
def _update_ue_rb(self): """ Check the total RBs required to satisfy UEs demands """ self._rb_map = {} for ue in self.connected_ues: # calculate the total RBs for each UE # mult per 84 because: 84 ofdm symbons in a RB self._rb_map[ue] = ue.demand / (util.snr_to_bit(util.snr(ue, self, 0)) * 84.0)
def _update_ue_rb(self): """ Check the total RBs required to satisfy UEs demands """ self._rb_map = {} for ue in self._ues: # calculate the total RBs for each UE # mult per 84 because: 84 ofdm symbons in a RB self._rb_map[ue] = ue.demand / (util.snr_to_bit(util.snr(ue, self, 0)) * 84.0)
def can_fit_ue(self, ue): # BS always can fit an UE if self.type == Antenna.BS_ID: return True total_rb_demand = sum(self._rb_map.values()) ue_rb_demand = ue.demand / (util.snr_to_bit(util.snr(ue, self, 0)) * 84.0) if total_rb_demand + ue_rb_demand < Antenna.BW_RB_MAP[self._cur_ch_bw]: return True else: return False
def update(self): """ """ # update the RBs used by each ue self._update_ue_rb() # --- total_rb_demand = sum(self._rb_map.values()) # IDEAL CASE: we have more RBs than the UEs demand # == all UEs are satified with their demand if total_rb_demand < Antenna.BW_RB_MAP[self._cur_ch_bw]: self._grid.logger.log("op:antenna_good_cap, antenna:" + str(self) + ", rb_demand:" + str(total_rb_demand) + ", avail_rb:" + str(Antenna.BW_RB_MAP[self._cur_ch_bw]) + ", per_used:" + str(total_rb_demand/Antenna.BW_RB_MAP[self._cur_ch_bw]) + ", n_ues:" + str(len(self._ues)) ) # -- for ue in self._ues: ue.tx_rate = ue.demand # NOT IDEAL CASE: we have less RBs than the UEs demand # == available RBs split evenly among UEs else: # quantity of RBs available avail_rb = Antenna.BW_RB_MAP[self._cur_ch_bw] # bivide equaly among all UEs rb_per_ue = math.floor(avail_rb/len(self._ues)) # set UE tx_rate based for ue in self._ues: ue.tx_rate = rb_per_ue * util.snr_to_bit(util.snr(ue, self) ) self._grid.logger.log("op:antenna_bad_cap, antenna:" + str(self) + ", rb_demand:" + str(total_rb_demand) + ", avail_rb:" + str(Antenna.BW_RB_MAP[self._cur_ch_bw]) + ", per_used:" + str(1.0) + ", n_ues:" + str(len(self._ues)) ) # Notify BBU that this antenna requires more bandwidth self._ch_bw_required = self.rb_demand_to_ch_bw(total_rb_demand) if self._ch_bw_required != self._cur_ch_bw: self._bbu.event(controller.ANTENNA_BW_UPDATE, self)