def __init__(self): self.PWPath = os.path.join(os.getcwd(), "reliable_sequence.txt") self.numAggregationLevel = 3 self.numCandidates = 44 self.numRNTIBits = 16 self.numCandidatePerAggregationLevel = np.array([6, 6, 10]) self.codewordLengthPerAggregationLevel = np.array([128, 256, 512]) self.maxInformationLength = 140 self.numInformationBits = np.array([16, 57]) self.numCRCBits = 24 self.crcPoly = [24, 23, 21, 20, 17, 15, 13, 12, 8, 4, 2, 1, 0] self.polarEncoders = [] self.codeConstructor = PolarCodeConstructor(QPath=self.PWPath) self.crcEncoder = CRCEnc(self.numCRCBits, self.crcPoly) self.initialize_encoders()
K, QPath=os.path.join( os.getcwd(), "../reliable_sequence.txt")) frozenbits, messagebits, frozenbits_indicator, messagebits_indicator = codeConstructor.PW( N, K) polarEncoder = PolarEnc(N, K, frozenbits, messagebits) nodeIdentifier = NodeIdentifier(N, K, frozenbits, messagebits) nodeType = nodeIdentifier.run() DMetricCalculator = EPFLDMetricCalculator(N, K, nodeType, frozenbits, messagebits) frozenbitsPesedo, messagebitsPesedo, _, _ = codeConstructor.PW(N, PesodoK) polarPesedoEncoder = PolarEnc(N, PesodoK, frozenbitsPesedo, messagebitsPesedo) crcEnc = CRCEnc(crc_n=numCRC, crc_polynominal=crcPoly) # Try Complete Noise / Random Codewords / Regular Polar Codes numSimulation = 2 * 10**4 DMetricsAnother = [] DMetricsRegular = [] pbar = tqdm(range(numSimulation)) for _ in pbar: choice = np.random.randint(low=0, high=2) if choice == 0: # two mode: pure random codeword / polar encoded but with different information bit length msg = np.random.randint(low=0, high=2, size=pesedoA) msg_crc = crcEnc.encode(msg) cword = polarPesedoEncoder.encode(msg) cword = cword.astype(np.int) bpsksymbols = 1 - 2 * cword
# initialize Trace instance to maintain simulation hyper-parameters and results and images if RUN_MDR == True: experiment_name = "MDR-L = {:d}".format(L) else: experiment_name = "FAR-L = {:d}".format(L) if os.path.isdir(os.path.join(os.getcwd(), "BD_Benchmark", experiment_name)): shutil.rmtree(os.path.join(os.getcwd(), "BD_Benchmark", experiment_name)) tracer = Tracer('BD_Benchmark').attach(experiment_name) configure = {"L": L, "SNRdBTest":SNRdBTest} tracer.store(Config(configure)) # Initialize PDCCH candidate generator and corresponding decoders PDCCHGenerator = CandidateGenerator() CRCEncoder = CRCEnc(PDCCHGenerator.numCRCBits, PDCCHGenerator.crcPoly) CASCLDecoders = [] for i in range(PDCCHGenerator.numAggregationLevel): N = PDCCHGenerator.codewordLengthPerAggregationLevel[i] for m in range(2): A = PDCCHGenerator.numInformationBits[m] K = A + PDCCHGenerator.numCRCBits frozenbits_indicator = PDCCHGenerator.frozenbits_indicator_set[i][m] messagebits_indicator = PDCCHGenerator.messagebits_indicator_set[i][m] SCLDec = CASCLDecoder(N=N, K=K, A=A, L=L, frozen_bits=frozenbits_indicator, message_bits=messagebits_indicator, crc_n=PDCCHGenerator.numCRCBits, crc_p=PDCCHGenerator.crcPoly) CASCLDecoders.append(SCLDec) if RUN_MDR: # Start Simulation MDR print("Simulation for MDR")
parser.add_argument("--L1", type=int, default=1) parser.add_argument("--L2", type=int, default=8) parser.add_argument("--Omega", type=int, default=11) parser.add_argument("--RUN_FAR", type=int, default=0) args = parser.parse_args() # Simulation Parameters Omega = args.Omega # No. candidate after stage 1 SC decoding L1 = args.L1 L2 = args.L2 RUN_FAR = args.RUN_FAR RUN_MDR = 1 - RUN_FAR # Initialize PDCCH candidate generator and corresponding decoders PDCCHGenerator = CandidateGenerator() CRCEncoder = CRCEnc(PDCCHGenerator.numCRCBits, PDCCHGenerator.crcPoly) SCLOneDecoders = [] CASCLDecoders = [] for i in range(PDCCHGenerator.numAggregationLevel): N = PDCCHGenerator.codewordLengthPerAggregationLevel[i] for m in range(2): A = PDCCHGenerator.numInformationBits[m] K = A + PDCCHGenerator.numCRCBits frozenbits_indicator = PDCCHGenerator.frozenbits_indicator_set[i][m] messagebits_indicator = PDCCHGenerator.messagebits_indicator_set[i][m] SCLOneDec = CASCLDecoder(N=N, K=K, A=A, L=L1, frozen_bits=frozenbits_indicator, message_bits=messagebits_indicator, crc_n=PDCCHGenerator.numCRCBits, crc_p=PDCCHGenerator.crcPoly) CASCLDec = CASCLDecoder(N=N, K=K, A=A, L=L2, frozen_bits=frozenbits_indicator, message_bits=messagebits_indicator, crc_n=PDCCHGenerator.numCRCBits, crc_p=PDCCHGenerator.crcPoly) SCLOneDecoders.append(SCLOneDec) CASCLDecoders.append(CASCLDec)
experiment_name = "CDF-N={:d}-K={:d}-SNR={:.1f}".format(N, K, SNR) if os.path.isdir(os.path.join(os.getcwd(), "BD_DMetric_EPFL", experiment_name)): shutil.rmtree(os.path.join(os.getcwd(), "BD_DMetric_EPFL", experiment_name)) tracer = Tracer('BD_DMetric_EPFL').attach(experiment_name) codeConstructor = PolarCodeConstructor(N, K, QPath=os.path.join(os.getcwd(), "reliable_sequence.txt")) frozenbits, messagebits, frozenbits_indicator, messagebits_indicator = codeConstructor.PW(N, K) polarEncoder = PolarEnc(N, K, frozenbits, messagebits) nodeIdentifier = NodeIdentifier(N, K, frozenbits, messagebits) nodeType = nodeIdentifier.run() DMetricCalculator = EPFLDMetricCalculator(N, K, nodeType, frozenbits, messagebits) frozenbitsPesedo, messagebitsPesedo, _, _ = codeConstructor.PW(N, PesodoK) polarPesedoEncoder = PolarEnc(N, PesodoK, frozenbitsPesedo, messagebitsPesedo) crcEnc = CRCEnc(crc_n=numCRC, crc_polynominal=[16, 15, 2, 0]) # Try Complete Noise / Random Codewords / Regular Polar Codes numSimulation = 3*10**4 DMetricsRandom = [] DMetricsRegular = [] DMetricsNoise = [] pbar = tqdm(range(numSimulation)) for _ in pbar: choice = np.random.randint(low=0, high=3) # choice = 2 if choice == 0: bpsksymbols = np.zeros(N, dtype=int) elif choice == 1: # two mode: pure random codeword / polar encoded but with different information bit length
class CandidateGenerator(): def __init__(self): self.PWPath = os.path.join(os.getcwd(), "reliable_sequence.txt") self.numAggregationLevel = 3 self.numCandidates = 44 self.numRNTIBits = 16 self.numCandidatePerAggregationLevel = np.array([6, 6, 10]) self.codewordLengthPerAggregationLevel = np.array([128, 256, 512]) self.maxInformationLength = 140 self.numInformationBits = np.array([16, 57]) self.numCRCBits = 24 self.crcPoly = [24, 23, 21, 20, 17, 15, 13, 12, 8, 4, 2, 1, 0] self.polarEncoders = [] self.codeConstructor = PolarCodeConstructor(QPath=self.PWPath) self.crcEncoder = CRCEnc(self.numCRCBits, self.crcPoly) self.initialize_encoders() def initialize_encoders(self): self.frozenbits_set = [] self.messagebits_set = [] self.frozenbits_indicator_set = [] self.messagebits_indicator_set = [] for i in range(self.numAggregationLevel): N = self.codewordLengthPerAggregationLevel[i] encoder = [] frozenbits_set = [] messagebits_set = [] frozenbits_indicator_set = [] messagebits_indicator_set = [] for A in self.numInformationBits: K = A + self.numCRCBits frozenbits, messagebits, frozenbits_indicator, messagebits_indicator = self.codeConstructor.PW( N, K) frozenbits_set.append(frozenbits) messagebits_set.append(messagebits) frozenbits_indicator_set.append(frozenbits_indicator) messagebits_indicator_set.append(messagebits_indicator) encoder.append(PolarEnc(N, K, frozenbits, messagebits)) self.polarEncoders.append(encoder) self.frozenbits_set.append(frozenbits_set) self.messagebits_set.append(messagebits_set) self.frozenbits_indicator_set.append(frozenbits_indicator_set) self.messagebits_indicator_set.append(messagebits_indicator_set) def generate_candidates(self, isRNTI): codewords = [] information_bits = [] if isRNTI: RNTIIndex = np.random.randint(low=0, high=self.numCandidates) else: RNTIIndex = -1 RNTI = np.random.randint(low=0, high=2, size=self.numRNTIBits, dtype=np.int) cnt = 0 for i in range(self.numAggregationLevel): for m in range(2): A = self.numInformationBits[m] for j in range(self.numCandidatePerAggregationLevel[i]): msg = np.random.randint(low=0, high=2, size=A) msg_crc = self.crcEncoder.encode(msg) if cnt == RNTIIndex: msg_crc[-self.numRNTIBits:] = np.mod( msg_crc[-self.numRNTIBits:] + RNTI, 2) codeword = self.polarEncoders[i][m].encode(msg_crc) codeword = codeword.astype(np.int) codewords.append(codeword) information_bits.append(msg) cnt += 1 return information_bits, codewords, RNTI, RNTIIndex