def send_rateless_kRx(UN, N, channel_p, compound_plist_u, derate,
                      use_adjusted_Rate):
    #print "In send rateless..."
    #Reliability ordering
    #print "R_order"
    I_ord = pcon.getreliability_order(N)
    #print I_ord
    #compound channel
    compound_plist = list(compound_plist_u)  #best channel first
    compound_plist.sort()
    Ratelist = pl.getRatelist(compound_plist, derate)  #best rate first
    Glist = [int(N * r) for r in Ratelist]

    #print "Compund Channel"
    #print plist
    #print Glist
    #print "will be working with below to meet R R/2 R/3 R/4 constraint"
    Glist = adjustG(Glist)
    #print Glist

    #given Channel might not be an entry in compound but within bounds
    R = pl.getRatelist([channel_p],
                       derate)[0]  #calculates rate for given channel
    G = int(R * N)

    #print "Actual channel"
    #print channel_p
    #print G
    if use_adjusted_Rate:
        G = Glist[compound_plist.index(channel_p)]

#----------------------------------------------------Iterations start

    Iterhistory = {}  #contains indexes of UN sent in each iteration

    decoded = False
    # for first Tx
    Iter = 0
    Iter_UN = UN
    Iter_p = compound_plist[0]
    Iter_R = Ratelist[0]
    Iter_G = Glist[0]
    Iter_I = I_ord[:Iter_G]
    Iter_UN_ind = range(len(UN))
    #Iter_data={}
    #print float(len(Iter_I))/N

    #print "Forward decoding"
    while not decoded:

        #print "Iter"+str(Iter)

        Iter_UN = [UN[i] for i in Iter_UN_ind]

        Iter_D = np.zeros(N - Iter_G, dtype=int).tolist()  #frozen data
        Iter_XN = ec.polarencodeG(Iter_UN, N, Iter_I, list(Iter_D),
                                  False)  #data goes in as per R.I

        #--------------------Note channel_p used for flipping
        Iter_YN = pl.BSCN(channel_p, Iter_XN)

        #-----------------------decoding based on this tx only
        Iter_UN_hat = ec.polarSCdecodeG(Iter_YN, N, Iter_p, Iter_I,
                                        list(Iter_D), False)
        Iter_UN_decoded = ec.getUN(Iter_UN_hat, Iter_I, False)

        #storage needed for final decoding
        Iterhistory[Iter] = [Iter_UN_ind, Iter_UN_decoded, Iter_YN]

        #pprint(Iterhistory)

        #For simulation of Rx knows channel case
        #Assuming Rx knows the capacity of the channel
        #hence as long as the rate used is above
        #the capacity is declares Not decodable
        #the rate at which decoding is possible and the rate achieved is same
        #print Iterhistory

        if not is_decodable_kRx(G, Iter_G):

            # picking out all the channels that are suspected to be bad in past
            # iterations and putting them for next iteration.
            # Note first iteration Whole UN is sent
            # in next only suspected bad channels are sent
            prev_I = Iter_I
            Iter += 1

            #New channel params
            Iter_p = compound_plist[Iter]
            Iter_R = Ratelist[Iter]
            Iter_G = Glist[Iter]
            Iter_I = I_ord[:Iter_G]

            tosend_ind = []
            for i in range(Iter):
                #picking out the bad channels from prev iterations
                sent_ind = Iterhistory[i][0]
                sent_ind_last_iter = sent_ind[:Glist[Iter - 1]]

                bad_ind = sent_ind_last_iter[Iter_G:]
                #print bad_ind
                tosend_ind.extend(bad_ind)

            Iter_UN_ind = list(set(tosend_ind))

            Iter_UN_ind.sort()
            #print Iter_UN_ind

        else:
            #the final reliable good channels is that of last iteration
            final_Iter = Iter
            final_G = Iter_G
            #channel_p is already updated
            final_p = Iter_p
            final_I = I_ord[:final_G]
            decoded = True

    #pprint(Iterhistory)

    #final decoding
    #number retrodecoding needed = iter-1

    #print "Final Decoding..."
    #print final_p
    #print final_G
    #print Iter

    for Iter in range(final_Iter - 1, -1, -1):
        #print "Here"
        #print "Iter"+str(Iter)+"-"*10

        #print "Prev frozen"
        Prev_correct_ind = Iterhistory[Iter + 1][0]
        Prev_correct_data = Iterhistory[Iter + 1][1]
        #print Prev_correct_ind
        #print Prev_correct_data

        #print "Inc frozen needed"
        IncFreeze_ind_UN = [
            i for i in Prev_correct_ind if i in Iterhistory[Iter][0]
        ]
        #basically intersection with some order picking the indexes of the prev iter frozen data needed in this iter i.e, 12
        #print IncFreeze_ind_UN

        #picking the data i.e. u12
        IncFreeze_ind_ind = [
            Prev_correct_ind.index(j) for j in IncFreeze_ind_UN
        ]
        IncFreeze_data = [Prev_correct_data[k] for k in IncFreeze_ind_ind]

        #print IncFreeze_data

        #finding the channels where 12 went in this iter 16 15 14 "13"<--- here
        #i.e, removing the top channel_G channels (as they are good) from top Iter_i_G channels
        Iter_G = Glist[Iter]
        IncFreeze_ind = I_ord[:Iter_G][final_G:]
        #print "Inc Frozen Data going in"
        #print IncFreeze_ind

        #print "Frozen zeroes"
        Iter_D = np.zeros(N - Iter_G,
                          dtype=int).tolist()  #frozen data as per iteration
        #print len(Iter_D)

        Iter_YN = Iterhistory[Iter][2]
        Iter_UN_hat = ec.polarIncFrzSCdecodeG(Iter_YN, N, final_p, final_I,
                                              list(Iter_D), IncFreeze_ind,
                                              IncFreeze_data, False)
        Iter_UN_decoded = ec.getUN(Iter_UN_hat, final_I, False)

        #print Iter_UN_decoded

        #history update
        Iterhistory_ind_upd = list(Prev_correct_ind)
        Iterhistory_ind_upd.extend(
            Iterhistory[Iter][0][:final_G])  #ie adding 5,6,11 to 4,10,12
        Iterhistory_data_upd = np.hstack(
            (Prev_correct_data, Iter_UN_decoded))  #same as extend

        #print "Update"
        #print Iterhistory_ind_upd
        #print Iterhistory_data_upd

        #print "sorted"

        (Iterhistory[Iter][0],
         Iterhistory[Iter][1]) = ml.sortAextend(Iterhistory_ind_upd,
                                                Iterhistory_data_upd.tolist())
        #print Iterhistory[Iter][0]
        #print Iterhistory[Iter][1]

    #pprint(Iterhistory)
    final_decoded = Iterhistory[0][1]
    achieved_rate = float(len(UN)) / ((final_Iter + 1) * N)
    return (achieved_rate, np.array(final_decoded))
Example #2
0
def send_rateless_file_kRx(XN,N,channel_p,compound_plist_u,derate,use_adjusted_Rate): 

	I_ord=pcon.getreliability_order(N)
	compound_plist=list(compound_plist_u) #best channel first
	compound_plist.sort()
	Ratelist = pl.getRatelist(compound_plist,derate)       #best rate first
	Glist=[int(N*r) for r in Ratelist]
	
	#print "will be working with below to meet R R/2 R/3 R/4 constraint"
	Glist=adjustG(Glist)
	R=pl.getRatelist([channel_p],derate)[0]  #calculates rate for given channel
	G=int(R*N)

	if use_adjusted_Rate:
		G=Glist[compound_plist.index(channel_p)]	
	
    #----------------------------------------------------Iterations start
	
	Iterhistory={} #contains indexes of UN sent in each iteration
	decoded=False
	
	#------------------for filing Tx side
	# reverse arikan :: THIS IS OF SIZE N 
	UN_N=ec.polarencode(XN,N) 
		
	# for first Tx
	Iter=0
	Iter_p=compound_plist[0]
	Iter_R=Ratelist[0]
	Iter_G=Glist[0]
	Iter_I=I_ord[:Iter_G]
	UN=ec.getUN(UN_N,Iter_I,False)
	
	#print Iter_I
	#print UN
	Iter_UN=UN
	Iter_UN_ind=range(len(UN))  
	
	F=list(set(range(N))-set(Iter_I))
	FD=ec.getUN(UN_N,F,True)
	
	#-------------------------------------------Forward decoding	
    #in case of first iteration FD, XN is used
    #from next iteration more bits from reverse Arikan UN is used
	while not decoded:
		
		if Iter==0:
			Iter_XN=XN
			
		else:
			Iter_UN=[UN[i] for i in Iter_UN_ind]		 
			Iter_D=np.zeros(N-Iter_G,dtype=int).tolist()      #frozen data
			Iter_XN=ec.polarencodeG(Iter_UN,N,Iter_I,list(Iter_D),False)   #data goes in as per R.I
		
		#--------------------Note channel_p used for flipping
		Iter_YN=pl.BSCN(channel_p,Iter_XN)
		
		#-----------------------decoding based on this tx only
		if Iter==0:
			Iter_UN_hat=ec.polarSCdecodeG(Iter_YN,N,Iter_p,Iter_I,list(FD),False)
		else:	
			Iter_UN_hat=ec.polarSCdecodeG(Iter_YN,N,Iter_p,Iter_I,list(Iter_D),False)		
		
		Iter_UN_decoded=ec.getUN(Iter_UN_hat,Iter_I,False)
		
		#storage needed for final decoding
		Iterhistory[Iter]=[Iter_UN_ind,Iter_UN_decoded,Iter_YN]
				
		#For simulation of Rx knows channel case
		#Assuming Rx knows the capacity of the channel
		#hence as long as the rate used is above
		#the capacity is declares Not decodable	
		#the rate at which decoding is possible and the rate achieved is same

		
		
		if not is_decodable_kRx(G,Iter_G):
			#print "here"
			
			# picking out all the channels that are suspected to be bad in past
			# iterations and putting them for next iteration.
			# Note first iteration Whole UN is sent
			# in next only suspected bad channels are sent
			
			prev_I=Iter_I
			Iter+=1
			
			#New channel params
			Iter_p=compound_plist[Iter]
			Iter_R=Ratelist[Iter]
			Iter_G=Glist[Iter]
			Iter_I=I_ord[:Iter_G]
			
			tosend_ind=[]
			for i in range(Iter):
				#picking out the bad channels from prev iterations
				sent_ind=Iterhistory[i][0]
				sent_ind_last_iter=sent_ind[:Glist[Iter-1]]
				
					
				bad_ind=sent_ind_last_iter[Iter_G:]
				tosend_ind.extend(bad_ind)
			
			Iter_UN_ind=list(set(tosend_ind))
			
			Iter_UN_ind.sort()

			
		else:
			#the final reliable good channels is that of last iteration
			final_Iter=Iter
			final_G=Iter_G
			final_p=Iter_p
			final_I=I_ord[:final_G]
			
			#~ if Iter=0:
				#~ final_XN=ec.polarencode(Iter_UN_hat,N) #in case first iteration is last
			
			decoded= True
			
	#------------------------------------------------final decoding
	#number retrodecoding needed = iter-1
	#print Iter
	for Iter in range(final_Iter-1,-1,-1):
			#print "retro"+str(Iter)
			Prev_correct_ind=Iterhistory[Iter+1][0]
			Prev_correct_data=Iterhistory[Iter+1][1]
			IncFreeze_ind_UN=[i for i in Prev_correct_ind if i in Iterhistory[Iter][0]] 
			#basically intersection with some order picking the indexes of the prev iter frozen data needed in this iter i.e, 12
			#print IncFreeze_ind_UN
			
			#picking the data i.e. u12
			IncFreeze_ind_ind=[Prev_correct_ind.index(j) for j in IncFreeze_ind_UN]
			IncFreeze_data=[Prev_correct_data[k] for k in IncFreeze_ind_ind]
			
			#print IncFreeze_data
			
			#finding the channels where 12 went in this iter 16 15 14 "13"<--- here
			#i.e, removing the top channel_G channels (as they are good) from top Iter_i_G channels
			Iter_G=Glist[Iter]
			IncFreeze_ind=I_ord[:Iter_G][final_G:]
			if Iter==0:
				Iter_D=FD
			else:	
				Iter_D=np.zeros(N-Iter_G,dtype=int).tolist()      #frozen data as per iteration
	
			Iter_YN=Iterhistory[Iter][2]
			
			Iter_UN_hat=ec.polarIncFrzSCdecodeG(Iter_YN,N,final_p,final_I,list(Iter_D),IncFreeze_ind,IncFreeze_data,False)
			
			Iter_UN_decoded=ec.getUN(Iter_UN_hat,final_I,False)
				
			#history update
			Iterhistory_ind_upd=list(Prev_correct_ind)
			Iterhistory_ind_upd.extend(Iterhistory[Iter][0][:final_G]) #ie adding 5,6,11 to 4,10,12
			Iterhistory_data_upd=np.hstack((Prev_correct_data,Iter_UN_decoded)) #same as extend
			(Iterhistory[Iter][0],Iterhistory[Iter][1])=ml.sortAextend(Iterhistory_ind_upd,Iterhistory_data_upd.tolist())

	final_decoded= Iterhistory[0][1]
	final_XN=ec.polarencode(Iter_UN_hat,N)
	achieved_rate=float(len(UN))/((final_Iter+1)*N)
	return (achieved_rate,np.array(final_XN))