# Analyzing the effect of Number of Candidates on Blocking Probability

• In this notebook, we simulate the blocking probability as a function of number of PDCCH candidates.

• In NR the number of PDCCH candidates can be configurable for each Aggregation Level (AL) among {1,2,3,4,5,6,8} in the USS.

• We seperately evaluate the impact of number of candidates for AL 1, AL 2, and AL 4 by changing the number of candidates for one of the ALs (from the set above), while setting the number of candidates for other ALs to 1.

• The AL distribution considered for simulation is [0.4, 0.3, 0.2, 0.05, 0.05] for ALs 1,2,4,8,16 respectively.

• The CORESET size Nccep is 54 CCEs for this simulation.

[1]:

import os
os.environ["CUDA_VISIBLE_DEVICES"] = "-1"
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'

# %matplotlib widget
import matplotlib.pyplot  as plt
import matplotlib.patches as mpatches
import matplotlib as mpl

import numpy      as np

[2]:

import sys
sys.path.append("../../")
from toolkit5G.Scheduler import PDCCHScheduler


## Simulation Parameters

The following parameters are used for this simulation: - coresetID denotes the coreset ID. - slotNumber denotes the slot-number carrying the PDCCH. - searchSpaceType denotes the search space type. UE specific search space (USS) or Common search space (CSS). - nci denotes the variable corresponding to carrier aggregation. Current simulation does not assume carrier aggregation.

[3]:

mu               = np.random.randint(4)    # numerlogy for sub-carrier spacing
numSlotsPerFrame = 2**mu * 10              # number of slots per radio frame
coresetID        = 1                       # coreset ID
slotNumber       = 0
searchSpaceType  = "USS"                   # search space type. UE specific search space
nci              = 0                       # variable corresponding to carrier aggregation
numIterations    = 5000
numUEs           = 20


## PDCCH Scheduling Parameters

Following parameters are crucial for PDCCH scheduling performance: - Nccep denotes coreset size or number of CCEs available for scheduling UEs. - strategy denotes the scheduling strategy. - numCandidates denotes number of PDCCH candidates per each Aggregation Level.

[4]:

aggLevelProbDistribution = np.array([0.4, 0.3, 0.2, 0.05, 0.05])
Nccep                    = 54
supportedNumCand         = np.array([1,2,3,4,5,6,7,8], dtype = int)
strategy                 = "Conservative"

pdcchSchedulerObj = PDCCHScheduler(mu, slotNumber, coresetID, nci)

[5]:

#########
# AL1
#########

probOfBlockingForAL1 = np.zeros((supportedNumCand.size,))
for n in range(supportedNumCand.size):
print("Simulating number of candidates : "+str(n)+", "+str(supportedNumCand[n]))
x = supportedNumCand[n]
numCandidates  = np.array([x,1,1,1,1], dtype=int)
prob = 0
for i in range(numIterations):
ueALdistribution  = np.random.multinomial(numUEs, aggLevelProbDistribution)
rnti              = np.random.choice( np.arange(1,65519+1), size = (numUEs,), replace=False)
count             = pdcchSchedulerObj(Nccep,searchSpaceType,ueALdistribution,numCandidates,rnti,strategy)[0]
numBlockedUEs     = np.sum(count)
prob              = prob + numBlockedUEs/numUEs
probOfBlockingForAL1[n] = prob/numIterations

Simulating number of candidates : 0, 1
Simulating number of candidates : 1, 2
Simulating number of candidates : 2, 3
Simulating number of candidates : 3, 4
Simulating number of candidates : 4, 5
Simulating number of candidates : 5, 6
Simulating number of candidates : 6, 7
Simulating number of candidates : 7, 8

[6]:

#########
# AL2
#########
probOfBlockingForAL2 = np.zeros((supportedNumCand.size,))
for n in range(supportedNumCand.size):
print("Simulating number of candidates : "+str(n)+", "+str(supportedNumCand[n]))
x = supportedNumCand[n]
numCandidates  = np.array([1,x,1,1,1], dtype=int)
prob = 0
for i in range(numIterations):
ueALdistribution  = np.random.multinomial(numUEs, aggLevelProbDistribution)
rnti              = np.random.choice( np.arange(1,65519+1), size = (numUEs,), replace=False)
count             = pdcchSchedulerObj(Nccep,searchSpaceType,ueALdistribution,numCandidates,rnti,strategy)[0]
numBlockedUEs     = np.sum(count)
prob              = prob + numBlockedUEs/numUEs
probOfBlockingForAL2[n] = prob/numIterations

Simulating number of candidates : 0, 1
Simulating number of candidates : 1, 2
Simulating number of candidates : 2, 3
Simulating number of candidates : 3, 4
Simulating number of candidates : 4, 5
Simulating number of candidates : 5, 6
Simulating number of candidates : 6, 7
Simulating number of candidates : 7, 8

[7]:

#########
# AL4
#########
probOfBlockingForAL4 = np.zeros((supportedNumCand.size,))
for n in range(supportedNumCand.size):
print("Simulating number of candidates : "+str(n)+", "+str(supportedNumCand[n]))
x = supportedNumCand[n]
numCandidates  = np.array([1,1,x,1,1], dtype=int)
prob = 0
for i in range(numIterations):
ueALdistribution  = np.random.multinomial(numUEs, aggLevelProbDistribution)
rnti              = np.random.choice( np.arange(1,65519+1), size = (numUEs,), replace=False)
count             = pdcchSchedulerObj(Nccep,searchSpaceType,ueALdistribution,numCandidates,rnti,strategy)[0]
numBlockedUEs     = np.sum(count)
prob              = prob + numBlockedUEs/numUEs
probOfBlockingForAL4[n] = prob/numIterations

Simulating number of candidates : 0, 1
Simulating number of candidates : 1, 2
Simulating number of candidates : 2, 3
Simulating number of candidates : 3, 4
Simulating number of candidates : 4, 5
Simulating number of candidates : 5, 6
Simulating number of candidates : 6, 7
Simulating number of candidates : 7, 8


## Plot the Variation in Blocking Probability with number of PDCCH candidates

• Its the recreation of Fig. 6: Blocking probability versus Number of PDCCH candidatesfrom the reference paper referenced below [1].

• From the figure we see that incresing the number of PDCCH candidates for each AL results in a lower Blocking Probability.

• With more PDCCH candidates, the Base Station has more flexibility to avoid overlapping between candidates of different UEs, thus reducing the blocking probability.

• The results in figure shows that a higher blocking probability reduction for AL 2, compared to ALs 1 and 4. This is because of the AL distribution considered. We see the overall impact of AL 2 on the blocking probability is more than that of ALs 1 and 4.

• Note that having more PDCCH candidates is beneficial for blocking probaility reduction, it increases the number of BDs and CCE monitoring which can increase the UE complexity and power consumption.

[8]:

fig, ax = plt.subplots()
ax.plot(supportedNumCand, probOfBlockingForAL1, marker  = "*",linestyle = "solid",ms = 12, c = 'b', label = "AL1")
ax.plot(supportedNumCand, probOfBlockingForAL2, marker  = "o",linestyle = "solid",ms = 12, c = 'm', label = "AL2")
ax.plot(supportedNumCand, probOfBlockingForAL4, marker  = "+",linestyle = "solid",ms = 12, c = 'k', label = "AL4")

ax.legend()
ax.set_xlabel('Number of PDCCH Candidates for an AL')
ax.set_ylabel('Blocking Probability')
ax.set_title('Blocking Probability vs Number of PDCCH Candidates', fontsize=12)
ax.set_xticks(supportedNumCand)
ax.grid()
plt.show()


## References

[1] Blocking Probability Analysis for 5G New Radio (NR) Physical Downlink Control Channel. Mohammad Mozaffari, Y.-P. Eric Wang, and Kittipong Kittichokechai

[ ]: